diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..0495bad --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ip/pulpino_qsys"] + path = ip/pulpino_qsys + url = https://github.com/marqs85/pulpino_qsys.git diff --git a/README.md b/README.md index 4757b1a..79c7d51 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Requirements for building and debugging firmware * Software * [Altera Quartus II + Cyclone IV support](http://dl.altera.com/?edition=lite) (v 16.1 or higher - free Lite Edition suffices) + * [RISC-V GNU Compiler Toolchain](https://github.com/riscv/riscv-gnu-toolchain) * GCC (or another C compiler) for host architecture (for building a SD card image) * Make * [iconv](https://en.wikipedia.org/wiki/Iconv) (for building with JP lang menu) @@ -19,31 +20,51 @@ Requirements for building and debugging firmware Architecture ------------------------------ -* [Reference board schematics](https://www.niksula.hut.fi/~mhiienka/ossc/diy-v1.5/ossc_v1.5-diy_schematic.pdf) +* [Reference board schematics](https://github.com/marqs85/ossc_pcb/raw/v1.6/ossc_board.pdf) * [Reference PCB project](https://github.com/marqs85/ossc_pcb) +SW toolchain build procedure +-------------------------- +1. Download, configure, build and install RISC-V toolchain with Newlib + RV32EMC support: +~~~~ +git clone --recursive https://github.com/riscv/riscv-gnu-toolchain +cd riscv-gnu-toolchain +./configure --prefix=/opt/riscv --with-arch=rv32emc --with-abi=ilp32e +sudo make # sudo needed if installing under default /opt/riscv location +~~~~ +2. Compile custom binary to IHEX converter: +~~~~ +gcc tools/bin2hex.c -o tools/bin2hex +~~~~ + + +Building RTL (bitstream) +-------------------------- +1. Initialize pulpino submodules (once after cloning ossc project or when submoduled have been updated) +~~~~ +git submodule update --init --recursive ip/pulpino_qsys +~~~~ +2. Load the project (ossc.qpf) in Quartus +3. Generate QSYS output files (only needed before first compilation or when QSYS structure has been modified) + * Open Platform Designer (Tools -> Platform Designer) + * Load platform configuration (sys.qsys) + * Generate output (Generate -> Generate HDL, Generate) + * Close Platform Designer + * Run "touch software/sys_controller_bsp/bsp_timestamp" to acknowledge QSYS update +3. Generate the FPGA bitstream (Processing -> Start Compilation) +4. Ensure that there are no severe timing violations by looking into Timing Analyzer report + +NOTE: If the software image (software/sys_controller/mem_init/sys_onchip_memory2_0.hex) was not up to date at the time of compilation, bitstream can be quickly rebuilt with updated hex by running "Processing->Update Memory Initialization File" and "Processing->Start->Start Assembler" in Quartus. + + Building software image -------------------------- -1. Enter BSP directory: -~~~~ -cd software/sys_controller_bsp -~~~~ -2. (Optionally) edit BSP settings: -~~~~ -nios2-bsp-editor -~~~~ -3. Generate BSP: -~~~~ -nios2-bsp-generate-files --bsp-dir . --settings settings.bsp -~~~~ -NOTE: the previous step must be done every time after RTL/bitstream is built - -4. Enter software root directory: +1. Enter software root directory: ~~~~ cd software/sys_controller ~~~~ -5. Build SW for target configuration: +2. Build SW for target configuration: ~~~~ make [OPTIONS] [TARGET] ~~~~ @@ -52,24 +73,16 @@ OPTIONS may include following definitions: * ENABLE_AUDIO=y (Includes audio setup code for v1.6 PCB / DIY audio add-on board) TARGET is typically one of the following: -* all (Default target. Compiles an ELF for direct downloading to Nios2 during testing) -* generate_hex (Generates a memory initialization file required for bitstream) +* all (Default target. Compiles an ELF file) +* generate_hex (Generates a memory initialization file required for bitstream and direct download) * clean (cleans ELF and intermediate files. Should be invoked every time OPTIONS are changed between compilations, expect with generate_hex where it is done automatically) -6. Optionally test updated SW by downloading ELF to Nios2 CPU via JTAG (RTL-SW interface in active FW must be compatible new SW BSP configuration) +3. Optionally test updated SW by directly downloading memory image to block RAM via JTAG ~~~~ -nios2-download -g --accept-bad-sysid sys_controller.elf +make rv-reprogram ~~~~ -Building RTL / bitstream --------------------------- -1. Load the project (ossc.qpf) in Quartus -2. Generate the FPGA bitstream (Processing -> Start Compilation). NOTE: make sure software image (software/sys_controller/mem_init/sys_onchip_memory2_0.hex) is up to date before generating bitstream. -3. Ensure that there are no severe timing violations by looking into Timing Analyzer report - -If only software image is updated, bitstream can be quickly rebuilt by running "Processing->Update Memory Initialization File" and "Processing->Start->Start Assembler" in Quartus. - Installing firmware via JTAG -------------------------- The bitstream can be either directly programmed into FPGA (volatile method, suitable for quick testing), or into serial flash chip where it is automatically loaded every time FPGA is subsequently powered on (nonvolatile method, suitable for long-term use). @@ -101,12 +114,12 @@ Debugging -------------------------- 1. Rebuild the software in debug mode: ~~~~ -make clean && make APP_CFLAGS_DEBUG_LEVEL="-DDEBUG" +make clean && make APP_CFLAGS_DEBUG_LEVEL="-DDEBUG" generate_hex ~~~~ NOTE: Fw update functionality via SD card is disabled in debug builds due to code space limitations. If audio support is enabled on debug build, other functionality needs to be disabled as well. -2. Program Nios2 CPU via JTAG and open terminal for UART +2. Download memory image via JTAG and open terminal for UART ~~~~ -nios2-download -g --accept-bad-sysid sys_controller.elf && nios2-terminal +make rv-reprogram && nios2-terminal ~~~~ Remember to close nios2-terminal after debug session, otherwise any JTAG transactions will hang/fail. diff --git a/ip/altera_epcq_controller_mod/HAL/src/altera_epcq_controller_mod.c b/ip/altera_epcq_controller_mod/HAL/src/altera_epcq_controller_mod.c index 5147a95..35c7c10 100644 --- a/ip/altera_epcq_controller_mod/HAL/src/altera_epcq_controller_mod.c +++ b/ip/altera_epcq_controller_mod/HAL/src/altera_epcq_controller_mod.c @@ -43,6 +43,7 @@ ALT_INLINE alt_32 static alt_epcq_validate_read_write_arguments(alt_epcq_controller_dev *flash_info,alt_u32 offset, alt_u32 length); alt_32 static alt_epcq_poll_for_write_in_progress(alt_epcq_controller_dev* epcq_flash_info); +ALT_INLINE unsigned char static bitswap8(unsigned char v); /* * Public API @@ -334,6 +335,10 @@ int alt_epcq_controller_write_block /* prepare the word to be written */ memcpy((((void*)&word_to_write)) + padding, ((void*)data) + buffer_offset, bytes_to_copy); + // Bit-reverse bytes for flash + for (int i=0; idata_base + offset, length); + + // Bit-reverse bytes read from flash + for (int i=0; i> 16; +} + diff --git a/ip/altera_nios_custom_instr_endianconverter_qsys/endianconverter_qsys.v b/ip/altera_nios_custom_instr_endianconverter_qsys/endianconverter_qsys.v deleted file mode 100644 index 16d875e..0000000 --- a/ip/altera_nios_custom_instr_endianconverter_qsys/endianconverter_qsys.v +++ /dev/null @@ -1,56 +0,0 @@ -// (C) 2001-2015 Altera Corporation. All rights reserved. -// Your use of Altera Corporation's design tools, logic functions and other -// software and tools, and its AMPP partner logic functions, and any output -// files any of the foregoing (including device programming or simulation -// files), and any associated documentation or information are expressly subject -// to the terms and conditions of the Altera Program License Subscription -// Agreement, Altera MegaCore Function License Agreement, or other applicable -// license agreement, including, without limitation, that your use is for the -// sole purpose of programming logic devices manufactured by Altera and sold by -// Altera or its authorized distributors. Please refer to the applicable -// agreement for further details. - - -//Legal Notice: (C)2010 Altera Corporation. All rights reserved. Your -//use of Altera Corporation's design tools, logic functions and other -//software and tools, and its AMPP partner logic functions, and any -//output files any of the foregoing (including device programming or -//simulation files), and any associated documentation or information are -//expressly subject to the terms and conditions of the Altera Program -//License Subscription Agreement or other applicable license agreement, -//including, without limitation, that your use is for the sole purpose -//of programming logic devices manufactured by Altera and sold by Altera -//or its authorized distributors. Please refer to the applicable -//agreement for further details. - -// synthesis translate_off -`timescale 1ns / 1ps -// synthesis translate_on - -// turn off superfluous verilog processor warnings -// altera message_level Level1 -// altera message_off 10034 10035 10036 10037 10230 10240 10030 - -module endianconverter_qsys ( - // inputs: - dataa, - datab, - - // outputs: - result - ) -; - - output [ 31: 0] result; - input [ 31: 0] dataa; - input [ 31: 0] datab; - - wire [ 31: 0] result; - //s1, which is an e_custom_instruction_slave - assign result[7 : 0] = dataa[31 : 24]; - assign result[15 : 8] = dataa[23 : 16]; - assign result[23 : 16] = dataa[15 : 8]; - assign result[31 : 24] = dataa[7 : 0]; - -endmodule - diff --git a/ip/altera_nios_custom_instr_endianconverter_qsys/endianconverter_qsys_hw.tcl b/ip/altera_nios_custom_instr_endianconverter_qsys/endianconverter_qsys_hw.tcl deleted file mode 100644 index 32a5e05..0000000 --- a/ip/altera_nios_custom_instr_endianconverter_qsys/endianconverter_qsys_hw.tcl +++ /dev/null @@ -1,84 +0,0 @@ -# (C) 2001-2015 Altera Corporation. All rights reserved. -# Your use of Altera Corporation's design tools, logic functions and other -# software and tools, and its AMPP partner logic functions, and any output -# files any of the foregoing (including device programming or simulation -# files), and any associated documentation or information are expressly subject -# to the terms and conditions of the Altera Program License Subscription -# Agreement, Altera MegaCore Function License Agreement, or other applicable -# license agreement, including, without limitation, that your use is for the -# sole purpose of programming logic devices manufactured by Altera and sold by -# Altera or its authorized distributors. Please refer to the applicable -# agreement for further details. - - -# TCL File Generated by Component Editor 10.1 -# Tue Aug 17 15:04:48 MYT 2010 -# DO NOT MODIFY - - -# +----------------------------------- -# | -# | -# | ./converter_0.v syn, sim -# | -# +----------------------------------- - -# +----------------------------------- -# | request TCL package from ACDS 10.1 -# | -package require -exact sopc 10.1 -# | -# +----------------------------------- - -# +----------------------------------- -# | module altera_nios_custom_instr_endian_converter -# | -set_module_property NAME altera_nios_custom_instr_endianconverter -set_module_property VERSION 17.1 -set_module_property INTERNAL false -set_module_property GROUP "Custom Instruction Modules" -set_module_property AUTHOR "Altera Corporation" -set_module_property DISPLAY_NAME "Endian Converter" -set_module_property HIDE_FROM_SOPC true -set_module_property TOP_LEVEL_HDL_FILE endianconverter_qsys.v -set_module_property TOP_LEVEL_HDL_MODULE endianconverter_qsys -set_module_property INSTANTIATE_IN_SYSTEM_MODULE true -set_module_property SIMULATION_MODEL_IN_VHDL true -set_module_property EDITABLE false -set_module_property ANALYZE_HDL FALSE -# | -# +----------------------------------- - -# +----------------------------------- -# | files -# | -add_file endianconverter_qsys.v {SYNTHESIS SIMULATION} -# | -# +----------------------------------- - -# +----------------------------------- -# | parameters -# | -# | -# +----------------------------------- - -# +----------------------------------- -# | display items -# | -# | -# +----------------------------------- - -# +----------------------------------- -# | connection point s1 -# | -add_interface s1 nios_custom_instruction end -set_interface_property s1 clockCycle 1 -set_interface_property s1 operands 1 - -set_interface_property s1 ENABLED true - -add_interface_port s1 dataa dataa Input 32 -add_interface_port s1 datab datab Input 32 -add_interface_port s1 result result Output 32 -# | -# +----------------------------------- diff --git a/ip/nios2_hw_crc/hdl/CRC_Component.v b/ip/hw_crc32_qsys/CRC_Component.v similarity index 100% rename from ip/nios2_hw_crc/hdl/CRC_Component.v rename to ip/hw_crc32_qsys/CRC_Component.v diff --git a/ip/hw_crc32_qsys/hw_crc32_hw.tcl b/ip/hw_crc32_qsys/hw_crc32_hw.tcl new file mode 100644 index 0000000..558a1e0 --- /dev/null +++ b/ip/hw_crc32_qsys/hw_crc32_hw.tcl @@ -0,0 +1,105 @@ +# +# request TCL package from ACDS 16.1 +# +package require -exact qsys 16.1 + + +# +# module pulpino +# +set_module_property DESCRIPTION "HW CRC32" +set_module_property NAME hw_crc32 +#set_module_property VERSION 1.0 +set_module_property INTERNAL false +set_module_property OPAQUE_ADDRESS_MAP true +set_module_property GROUP "DSP" +set_module_property AUTHOR "" +set_module_property DISPLAY_NAME hw_crc32 +set_module_property INSTANTIATE_IN_SYSTEM_MODULE true +set_module_property EDITABLE true +set_module_property REPORT_TO_TALKBACK false +set_module_property ALLOW_GREYBOX_GENERATION false +set_module_property REPORT_HIERARCHY false + + +set adv_dbg_if false + +# +# file sets +# +add_fileset QUARTUS_SYNTH QUARTUS_SYNTH "" "" +set_fileset_property QUARTUS_SYNTH TOP_LEVEL CRC_Component +set_fileset_property QUARTUS_SYNTH ENABLE_RELATIVE_INCLUDE_PATHS false +set_fileset_property QUARTUS_SYNTH ENABLE_FILE_OVERWRITE_MODE false +add_fileset_file CRC_Component.v SYSTEM_VERILOG PATH CRC_Component.v TOP_LEVEL_FILE + + +add_fileset sim_verilog SIM_VERILOG "" "Verilog Simulation" +set_fileset_property SIM_VERILOG ENABLE_RELATIVE_INCLUDE_PATHS false +set_fileset_property SIM_VERILOG ENABLE_FILE_OVERWRITE_MODE false +set_fileset_property SIM_VERILOG TOP_LEVEL CRC_Component +add_fileset_file CRC_Component.v SYSTEM_VERILOG PATH CRC_Component.v TOP_LEVEL_FILE + + + +# +# connection point clk_sink +# +add_interface clk_sink clock end +set_interface_property clk_sink ENABLED true +set_interface_property clk_sink EXPORT_OF "" +set_interface_property clk_sink PORT_NAME_MAP "" +set_interface_property clk_sink CMSIS_SVD_VARIABLES "" +set_interface_property clk_sink SVD_ADDRESS_GROUP "" + +add_interface_port clk_sink clk clk Input 1 + + + +# +# connection point reset_sink +# +add_interface reset_sink reset end +set_interface_property reset_sink associatedClock clk_sink +set_interface_property reset_sink synchronousEdges DEASSERT +set_interface_property reset_sink ENABLED true +set_interface_property reset_sink EXPORT_OF "" +set_interface_property reset_sink PORT_NAME_MAP "" +set_interface_property reset_sink CMSIS_SVD_VARIABLES "" +set_interface_property reset_sink SVD_ADDRESS_GROUP "" + +add_interface_port reset_sink reset reset Input 1 + + + +# +# connection point avalon_slave +# +add_interface avalon_slave avalon end +set_interface_property avalon_slave addressUnits WORDS +set_interface_property avalon_slave associatedClock clk_sink +set_interface_property avalon_slave associatedReset reset_sink +set_interface_property avalon_slave bitsPerSymbol 8 +set_interface_property avalon_slave burstOnBurstBoundariesOnly false +set_interface_property avalon_slave burstcountUnits WORDS +set_interface_property avalon_slave explicitAddressSpan 0 +set_interface_property avalon_slave holdTime 0 +set_interface_property avalon_slave linewrapBursts false +set_interface_property avalon_slave maximumPendingReadTransactions 0 +set_interface_property avalon_slave readLatency 1 +set_interface_property avalon_slave readWaitTime 1 +set_interface_property avalon_slave setupTime 0 +set_interface_property avalon_slave timingUnits Cycles +set_interface_property avalon_slave writeWaitTime 0 +set_interface_property avalon_slave ENABLED true +set_interface_property avalon_slave EXPORT_OF "" +set_interface_property avalon_slave PORT_NAME_MAP "" +set_interface_property avalon_slave CMSIS_SVD_VARIABLES "" +set_interface_property avalon_slave SVD_ADDRESS_GROUP "" +add_interface_port avalon_slave address address Input 3 +add_interface_port avalon_slave readdata readdata Output 32 +add_interface_port avalon_slave read read Input 1 +add_interface_port avalon_slave chipselect chipselect Input 1 +add_interface_port avalon_slave byteenable byteenable Input 4 +add_interface_port avalon_slave write write Input 1 +add_interface_port avalon_slave writedata writedata Input 32 diff --git a/ip/i2c_opencores/HAL/src/i2c_opencores.c b/ip/i2c_opencores/HAL/src/i2c_opencores.c index aa8e81b..49b2a9e 100644 --- a/ip/i2c_opencores/HAL/src/i2c_opencores.c +++ b/ip/i2c_opencores/HAL/src/i2c_opencores.c @@ -69,7 +69,7 @@ int I2C_start(alt_u32 base, alt_u32 add, alt_u32 read) IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_STA_MSK | I2C_OPENCORES_CR_WR_MSK ); /* wait for the trnasaction to be over.*/ - while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); + while (IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK) {} /* now check to see if the address was acknowledged */ if(IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_RXNACK_MSK) @@ -119,7 +119,7 @@ alt_u32 I2C_read(alt_u32 base,alt_u32 last) IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_RD_MSK ); } /* wait for the trnasaction to be over.*/ - while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); + while (IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK) {} /* now read the data */ return (IORD_I2C_OPENCORES_RXR(base)); @@ -162,7 +162,7 @@ alt_u32 I2C_write(alt_u32 base,alt_u8 data, alt_u32 last) IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_WR_MSK ); } /* wait for the trnasaction to be over.*/ - while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); + while (IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK) {} /* now check to see if the address was acknowledged */ if(IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_RXNACK_MSK) diff --git a/ip/nios2_hw_crc/HAL/doc/crc_main.c b/ip/nios2_hw_crc/HAL/doc/crc_main.c deleted file mode 100644 index d16548c..0000000 --- a/ip/nios2_hw_crc/HAL/doc/crc_main.c +++ /dev/null @@ -1,224 +0,0 @@ -/****************************************************************************** -* * -* License Agreement * -* * -* Copyright (c) 2008 Altera Corporation, San Jose, California, USA. * -* All rights reserved. * -* * -* Permission is hereby granted, free of charge, to any person obtaining a * -* copy of this software and associated documentation files (the "Software"), * -* to deal in the Software without restriction, including without limitation * -* the rights to use, copy, modify, merge, publish, distribute, sublicense, * -* and/or sell copies of the Software, and to permit persons to whom the * -* Software is furnished to do so, subject to the following conditions: * -* * -* The above copyright notice and this permission notice shall be included in * -* all copies or substantial portions of the Software. * -* * -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * -* DEALINGS IN THE SOFTWARE. * -* * -* This agreement shall be governed in all respects by the laws of the State * -* of California and by the laws of the United States of America. * -* Altera does not recommend, suggest or require that this reference design * -* file be used in conjunction or combination with any other product. * -******************************************************************************/ - - -/****************************************************************************** -* Author - JCJB * -* * -* This design uses the following CRC-32 implementations: * -* * -* --> Software - Uses modulo 2 division to perform the remainder calculation. * -* --> Optimized Software - Uses a lookup table of all possible division * -* values. The calculation operates on 8 bit data. * -* --> Custom Instruction - Uses a parallel hardware CRC circuit to calculate * -* the remainder. The calculation operates on 8, * -* 16, 24, or 32 bit data. * -* * -* The software implementations can be changed to CRC-16 or CRC-CCITT however * -* the custom instruction must be modified as well to support the same * -* standard. Simply use the values defined in crc.h to change the standard * -* used (using the same values in the hardware parameterization) or define * -* your own standard. * -*******************************************************************************/ - -#include "system.h" -#include "stdio.h" -#include "crc.h" -#include "ci_crc.h" -#include "sys/alt_timestamp.h" -#include "stdlib.h" - - -/* Modify these values to adjust the test being performed */ -#define NUMBER_OF_BUFFERS 32 -#define BUFFER_SIZE 256 /* in bytes */ - -/* Change the name of memory device according to what you are using - * e.g.: DDR_SDRAM_0 ##_SPAN - * SSRAM_0 ##_SPAN - */ -#define MEMORY_DEVICE_SIZE 32768 - - -/* Make sure there is room left for Nios II text, rodata, rwdata, stack, - * and heap. This software and the buffer space must fit within the - * size of memory device. A total of 1.5 MBytes is reserved. If BUFFER_SIZE - * is a multiple of four then exactly 256kB will be left, otherwise is - * amount will be less since the column dimension needs some padding to - * stay 32 bit aligned - */ -#if ((BUFFER_SIZE * NUMBER_OF_BUFFERS) >= MEMORY_DEVICE_SIZE - 10000) - #error Your buffer space has exceeded the maximum allowable space. Please\ - reduce the buffer space so that there is enough room to hold Nios II\ - code. -#endif - - -/* This will line up the data onto a 32 bit (or greater) boundary. A 2d array - * is being used here for simplicity. The first dimension represents a byte - * of data and the second dimension represents an individual buffer - */ -#if ((BUFFER_SIZE & 0x3) == 0) - unsigned char data_buffer_region[NUMBER_OF_BUFFERS][BUFFER_SIZE] __attribute__ ((aligned(4))); -#else /* need to allocate extra bytes so that all buffers start on a 32 bit - boundaries by rounding up the column dimension to the next power of 4 - */ - unsigned char data_buffer_region[NUMBER_OF_BUFFERS][BUFFER_SIZE + 4 - (BUFFER_SIZE&0x3)] __attribute__ ((aligned(4))); -#endif - - - - - -int main() -{ - unsigned long buffer_counter, data_counter; - unsigned long sw_slow_results[NUMBER_OF_BUFFERS]; - unsigned long sw_fast_results[NUMBER_OF_BUFFERS]; - unsigned long ci_results[NUMBER_OF_BUFFERS]; - unsigned char random_data = 0x5A; - //unsigned long sw_slow_timeA, sw_slow_timeB; - // unsigned long sw_fast_timeA, sw_fast_timeB; - // unsigned long ci_timeA, ci_timeB; - - alt_u32 sw_slow_timeA, sw_slow_timeB; - alt_u32 sw_fast_timeA, sw_fast_timeB; - alt_u32 ci_timeA, ci_timeB; - - - printf("+-----------------------------------------------------------+\n"); - printf("| Comparison between software and custom instruction CRC32 |\n"); - printf("+-----------------------------------------------------------+\n\n\n"); - - printf("System specification\n"); - printf("--------------------\n"); - - printf("System clock speed = %lu MHz\n", (unsigned long)ALT_CPU_FREQ /(unsigned long)1000000); - printf("Number of buffer locations = %d\n", NUMBER_OF_BUFFERS); - printf("Size of each buffer = %d bytes\n\n\n", BUFFER_SIZE); - - - /* Initializing the data buffers */ - printf("Initializing all of the buffers with pseudo-random data\n"); - printf("-------------------------------------------------------\n"); - for(buffer_counter = 0; buffer_counter < NUMBER_OF_BUFFERS; buffer_counter++) - { - for(data_counter = 0; data_counter < BUFFER_SIZE; data_counter++) - { - data_buffer_region[buffer_counter][data_counter] = random_data; - random_data = (random_data >> 4) + (random_data << 4) + (data_counter & 0xFF); - } - } - printf("Initialization completed\n\n\n"); - - - if(alt_timestamp_start() < 0) // starts the timestamp timer - { - printf("Please add the high resolution timer to the timestamp timer setting in the syslib properties page.\n"); - exit(1); - } - - - /* Slow software CRC based on a modulo 2 division implementation */ - printf("Running the software CRC\n"); - printf("------------------------\n"); - sw_slow_timeA = alt_timestamp(); - - for(buffer_counter = 0; buffer_counter < NUMBER_OF_BUFFERS; buffer_counter++) - { - sw_slow_results[buffer_counter] = crcSlow(data_buffer_region[buffer_counter], BUFFER_SIZE); - } - sw_slow_timeB = alt_timestamp(); - - printf("Completed\n\n\n"); - - - /* Fast software CRC based on a lookup table implementation */ - crcInit(); - printf("Running the optimized software CRC\n"); - printf("----------------------------------\n"); - sw_fast_timeA = alt_timestamp(); - for(buffer_counter = 0; buffer_counter < NUMBER_OF_BUFFERS; buffer_counter++) - { - sw_fast_results[buffer_counter] = crcFast(data_buffer_region[buffer_counter], BUFFER_SIZE); - } - sw_fast_timeB = alt_timestamp(); - printf("Completed\n\n\n"); - - - /* Custom instruction CRC */ - printf("Running the custom instruction CRC\n"); - printf("----------------------------------\n"); - ci_timeA = alt_timestamp(); - for(buffer_counter = 0; buffer_counter < NUMBER_OF_BUFFERS; buffer_counter++) - { - ci_results[buffer_counter] = crcCI(data_buffer_region[buffer_counter], BUFFER_SIZE); - } - ci_timeB = alt_timestamp(); - printf("Completed\n\n\n"); - - /* Validation of results */ - printf("Validating the CRC results from all implementations\n"); - printf("----------------------------------------------------\n"); - for(buffer_counter = 0; buffer_counter < NUMBER_OF_BUFFERS; buffer_counter++) - { - /* Test every combination of results to make sure they are consistant */ - if((sw_slow_results[buffer_counter] != ci_results[buffer_counter]) | - (sw_fast_results[buffer_counter] != ci_results[buffer_counter])) - { - printf("FAILURE! Software CRC = 0x%lx, Optimized Software CRC = 0x%lx, Custom Instruction CRC = 0x%lx,\n", - sw_slow_results[buffer_counter], sw_fast_results[buffer_counter], ci_results[buffer_counter]); - exit(1); - } - } - printf("All CRC implementations produced the same results\n\n\n"); - - - // Report processing times - printf("Processing time for each implementation\n"); - printf("---------------------------------------\n"); - printf("Software CRC = %.2lu ms\n", 1000*((unsigned long)(sw_slow_timeB-sw_slow_timeA))/((unsigned long)alt_timestamp_freq())); - printf("Optimized software CRC = %.2lu ms\n", 1000*((unsigned long)(sw_fast_timeB-sw_fast_timeA))/((unsigned long)alt_timestamp_freq())); - printf("Custom instruction CRC = %.2lu ms\n\n\n", 1000*((unsigned long)(ci_timeB-ci_timeA))/((unsigned long)alt_timestamp_freq())); - - printf("Processing throughput for each implementation\n"); // throughput = total bits / (time(s) * 1000000) - printf("---------------------------------------------\n"); - printf("Software CRC = %.2lu Mbps\n", (8 * NUMBER_OF_BUFFERS * BUFFER_SIZE)/(1000000*(unsigned long)(sw_slow_timeB-sw_slow_timeA)/((unsigned long)alt_timestamp_freq()))); - printf("Optimized software CRC = %.2lu Mbps\n", (8 * NUMBER_OF_BUFFERS * BUFFER_SIZE)/(1000000*(unsigned long)(sw_fast_timeB-sw_fast_timeA)/((unsigned long)alt_timestamp_freq()))); - printf("Custom instruction CRC = %.2lu Mbps\n\n\n", (8 * NUMBER_OF_BUFFERS * BUFFER_SIZE)/(1000000*(unsigned long)(ci_timeB-ci_timeA)/((unsigned long)alt_timestamp_freq()))); - - printf("Speedup ratio\n"); - printf("-------------\n"); - printf("Custom instruction CRC vs software CRC = %lu\n", ((unsigned long)(sw_slow_timeB-sw_slow_timeA))/((unsigned long)(ci_timeB-ci_timeA))); - printf("Custom instruction CRC vs optimized software CRC = %lu\n", ((unsigned long)(sw_fast_timeB-sw_fast_timeA))/((unsigned long)(ci_timeB-ci_timeA))); - printf("Optimized software CRC vs software CRC= %lu\n", ((unsigned long)(sw_slow_timeB-sw_slow_timeA))/((unsigned long)(sw_fast_timeB-sw_fast_timeA))); - return 0; -} diff --git a/ip/nios2_hw_crc/HAL/inc/crc.h b/ip/nios2_hw_crc/HAL/inc/crc.h deleted file mode 100644 index 4db516e..0000000 --- a/ip/nios2_hw_crc/HAL/inc/crc.h +++ /dev/null @@ -1,109 +0,0 @@ -/****************************************************************************** -* * -* License Agreement * -* * -* Copyright (c) 2008 Altera Corporation, San Jose, California, USA. * -* All rights reserved. * -* * -* Permission is hereby granted, free of charge, to any person obtaining a * -* copy of this software and associated documentation files (the "Software"), * -* to deal in the Software without restriction, including without limitation * -* the rights to use, copy, modify, merge, publish, distribute, sublicense, * -* and/or sell copies of the Software, and to permit persons to whom the * -* Software is furnished to do so, subject to the following conditions: * -* * -* The above copyright notice and this permission notice shall be included in * -* all copies or substantial portions of the Software. * -* * -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * -* DEALINGS IN THE SOFTWARE. * -* * -* This agreement shall be governed in all respects by the laws of the State * -* of California and by the laws of the United States of America. * -* Altera does not recommend, suggest or require that this reference design * -* file be used in conjunction or combination with any other product. * -******************************************************************************/ - - -/********************************************************************** - * - * Filename: crc.h - * - * Description: A header file describing the various CRC standards. - * - * Notes: - * - * - * Copyright (c) 2000 by Michael Barr. This software is placed into - * the public domain and may be used for any purpose. However, this - * notice must not be changed or removed and no warranty is either - * expressed or implied by its publication or distribution. - **********************************************************************/ - -#ifndef _crc_h -#define _crc_h - - -#define FALSE 0 -#define TRUE !FALSE - -/* - * Select the CRC standard from the list that follows. - */ -#define CRC32 - - -#if defined(CRC_CCITT) - -typedef unsigned short crc; - -#define CRC_NAME "CRC-CCITT" -#define POLYNOMIAL 0x1021 -#define INITIAL_REMAINDER 0xFFFF -#define FINAL_XOR_VALUE 0x0000 -#define REFLECT_DATA FALSE -#define REFLECT_REMAINDER FALSE -#define CHECK_VALUE 0x29B1 - -#elif defined(CRC16) - -typedef unsigned short crc; - -#define CRC_NAME "CRC-16" -#define POLYNOMIAL 0x8005 -#define INITIAL_REMAINDER 0x0000 -#define FINAL_XOR_VALUE 0x0000 -#define REFLECT_DATA TRUE -#define REFLECT_REMAINDER TRUE -#define CHECK_VALUE 0xBB3D - -#elif defined(CRC32) - -typedef unsigned long crc; - -#define CRC_NAME "CRC-32" -#define POLYNOMIAL 0x04C11DB7 -#define INITIAL_REMAINDER 0xFFFFFFFF -#define FINAL_XOR_VALUE 0xFFFFFFFF -#define REFLECT_DATA TRUE -#define REFLECT_REMAINDER TRUE -#define CHECK_VALUE 0xCBF43926 - -#else - -#error "One of CRC_CCITT, CRC16, or CRC32 must be #define'd." - -#endif - - -void crcInit(void); -crc crcSlow(unsigned char const message[], int nBytes); -crc crcFast(unsigned char const message[], int nBytes); - - -#endif /* _crc_h */ diff --git a/ip/nios2_hw_crc/HAL/src/ci_crc.c b/ip/nios2_hw_crc/HAL/src/ci_crc.c deleted file mode 100644 index 7f9b0f0..0000000 --- a/ip/nios2_hw_crc/HAL/src/ci_crc.c +++ /dev/null @@ -1,97 +0,0 @@ -/****************************************************************************** -* * -* License Agreement * -* * -* Copyright (c) 2008 Altera Corporation, San Jose, California, USA. * -* All rights reserved. * -* * -* Permission is hereby granted, free of charge, to any person obtaining a * -* copy of this software and associated documentation files (the "Software"), * -* to deal in the Software without restriction, including without limitation * -* the rights to use, copy, modify, merge, publish, distribute, sublicense, * -* and/or sell copies of the Software, and to permit persons to whom the * -* Software is furnished to do so, subject to the following conditions: * -* * -* The above copyright notice and this permission notice shall be included in * -* all copies or substantial portions of the Software. * -* * -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * -* DEALINGS IN THE SOFTWARE. * -* * -* This agreement shall be governed in all respects by the laws of the State * -* of California and by the laws of the United States of America. * -* Altera does not recommend, suggest or require that this reference design * -* file be used in conjunction or combination with any other product. * -******************************************************************************/ - - -/********************************************************************** - * - * Filename: ci_crc.c - * - * Description: Custom instruction implementations of the CRC. - * - * Notes: A macro is defined that is used to access the CRC custom - * instruction. - *********************************************************************/ - -#include "system.h" - -/*The n values and their corresponding operation are as follow: - * n = 0, Initialize the custom instruction to the initial remainder value - * n = 1, Write 8 bits data to custom instruction - * n = 2, Write 16 bits data to custom instruction - * n = 3, Write 32 bits data to custom instruction - * n = 4, Read 32 bits data from the custom instruction - * n = 5, Read 64 bits data from the custom instruction - * n = 6, Read 96 bits data from the custom instruction - * n = 7, Read 128 bits data from the custom instruction*/ -#define CRC_CI_MACRO(n, A) __builtin_custom_ini(ALT_CI_NIOS2_HW_CRC32_0_N + (n & 0x7), (A)) - -unsigned long crcCI(unsigned char * input_data, unsigned long input_data_length, int do_initialize) -{ - unsigned long index; - /* copy of the data buffer pointer so that it can advance by different widths */ - void * input_data_copy = (void *)input_data; - - /* The custom instruction CRC will initialize to the inital remainder value */ - if (do_initialize) - CRC_CI_MACRO(0,0); - - /* Write 32 bit data to the custom instruction. If the buffer does not end - * on a 32 bit boundary then the remaining data will be sent to the custom - * instruction in the 'if' statement below. - */ - for(index = 0; index < (input_data_length & 0xFFFFFFFC); index+=4) - { - CRC_CI_MACRO(3, *(unsigned long *)input_data_copy); - input_data_copy += 4; /* void pointer, must move by 4 for each word */ - } - - /* Write the remainder of the buffer if it does not end on a word boundary */ - if((input_data_length & 0x3) == 0x3) /* 3 bytes left */ - { - CRC_CI_MACRO(2, *(unsigned short *)input_data_copy); - input_data_copy += 2; - CRC_CI_MACRO(1, *(unsigned char *)input_data_copy); - } - else if((input_data_length & 0x3) == 0x2) /* 2 bytes left */ - { - CRC_CI_MACRO(2, *(unsigned short *)input_data_copy); - } - else if((input_data_length & 0x3) == 0x1) /* 1 byte left */ - { - CRC_CI_MACRO(1, *(unsigned char *)input_data_copy); - } - - /* There are 4 registers in the CRC custom instruction. Since - * this example uses CRC-32 only the first register must be read - * in order to receive the full result. - */ - return CRC_CI_MACRO(4, 0); -} diff --git a/ip/nios2_hw_crc/HAL/src/crc.c b/ip/nios2_hw_crc/HAL/src/crc.c deleted file mode 100644 index f00568d..0000000 --- a/ip/nios2_hw_crc/HAL/src/crc.c +++ /dev/null @@ -1,265 +0,0 @@ -/****************************************************************************** -* * -* License Agreement * -* * -* Copyright (c) 2008 Altera Corporation, San Jose, California, USA. * -* All rights reserved. * -* * -* Permission is hereby granted, free of charge, to any person obtaining a * -* copy of this software and associated documentation files (the "Software"), * -* to deal in the Software without restriction, including without limitation * -* the rights to use, copy, modify, merge, publish, distribute, sublicense, * -* and/or sell copies of the Software, and to permit persons to whom the * -* Software is furnished to do so, subject to the following conditions: * -* * -* The above copyright notice and this permission notice shall be included in * -* all copies or substantial portions of the Software. * -* * -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * -* DEALINGS IN THE SOFTWARE. * -* * -* This agreement shall be governed in all respects by the laws of the State * -* of California and by the laws of the United States of America. * -* Altera does not recommend, suggest or require that this reference design * -* file be used in conjunction or combination with any other product. * -******************************************************************************/ - - -/********************************************************************** - * - * Filename: crc.c - * - * Description: Slow and fast implementations of the CRC standards. - * - * Notes: The parameters for each supported CRC standard are - * defined in the header file crc.h. The implementations - * here should stand up to further additions to that list. - * - * - * Copyright (c) 2000 by Michael Barr. This software is placed into - * the public domain and may be used for any purpose. However, this - * notice must not be changed or removed and no warranty is either - * expressed or implied by its publication or distribution. - **********************************************************************/ - -#include "crc.h" - - -/* - * Derive parameters from the standard-specific parameters in crc.h. - */ -#define WIDTH (8 * sizeof(crc)) -#define TOPBIT (1 << (WIDTH - 1)) - -#if (REFLECT_DATA == TRUE) -#undef REFLECT_DATA -#define REFLECT_DATA(X) ((unsigned char) reflect((X), 8)) -#else -#undef REFLECT_DATA -#define REFLECT_DATA(X) (X) -#endif - -#if (REFLECT_REMAINDER == TRUE) -#undef REFLECT_REMAINDER -#define REFLECT_REMAINDER(X) ((crc) reflect((X), WIDTH)) -#else -#undef REFLECT_REMAINDER -#define REFLECT_REMAINDER(X) (X) -#endif - - -/********************************************************************* - * - * Function: reflect() - * - * Description: Reorder the bits of a binary sequence, by reflecting - * them about the middle position. - * - * Notes: No checking is done that nBits <= 32. - * - * Returns: The reflection of the original data. - * - *********************************************************************/ -static unsigned long -reflect(unsigned long data, unsigned char nBits) -{ - unsigned long reflection = 0x00000000; - unsigned char bit; - - /* - * Reflect the data about the center bit. - */ - for (bit = 0; bit < nBits; ++bit) - { - /* - * If the LSB bit is set, set the reflection of it. - */ - if (data & 0x01) - { - reflection |= (1 << ((nBits - 1) - bit)); - } - - data = (data >> 1); - } - - return (reflection); - -} /* reflect() */ - - -/********************************************************************* - * - * Function: crcSlow() - * - * Description: Compute the CRC of a given message. - * - * Notes: - * - * Returns: The CRC of the message. - * - *********************************************************************/ -crc -crcSlow(unsigned char const message[], int nBytes) -{ - crc remainder = INITIAL_REMAINDER; - int byte; - unsigned char bit; - - - /* - * Perform modulo-2 division, a byte at a time. - */ - for (byte = 0; byte < nBytes; ++byte) - { - /* - * Bring the next byte into the remainder. - */ - remainder ^= (REFLECT_DATA(message[byte]) << (WIDTH - 8)); - - /* - * Perform modulo-2 division, a bit at a time. - */ - for (bit = 8; bit > 0; --bit) - { - /* - * Try to divide the current data bit. - */ - if (remainder & TOPBIT) - { - remainder = (remainder << 1) ^ POLYNOMIAL; - } - else - { - remainder = (remainder << 1); - } - } - } - - /* - * The final remainder is the CRC result. - */ - return (REFLECT_REMAINDER(remainder) ^ FINAL_XOR_VALUE); - -} /* crcSlow() */ - - -crc crcTable[256]; - - -/********************************************************************* - * - * Function: crcInit() - * - * Description: Populate the partial CRC lookup table. - * - * Notes: This function must be rerun any time the CRC standard - * is changed. If desired, it can be run "offline" and - * the table results stored in an embedded system's ROM. - * - * Returns: None defined. - * - *********************************************************************/ -void -crcInit(void) -{ - crc remainder; - int dividend; - unsigned char bit; - - - /* - * Compute the remainder of each possible dividend. - */ - for (dividend = 0; dividend < 256; ++dividend) - { - /* - * Start with the dividend followed by zeros. - */ - remainder = dividend << (WIDTH - 8); - - /* - * Perform modulo-2 division, a bit at a time. - */ - for (bit = 8; bit > 0; --bit) - { - /* - * Try to divide the current data bit. - */ - if (remainder & TOPBIT) - { - remainder = (remainder << 1) ^ POLYNOMIAL; - } - else - { - remainder = (remainder << 1); - } - } - - /* - * Store the result into the table. - */ - crcTable[dividend] = remainder; - } - -} /* crcInit() */ - - -/********************************************************************* - * - * Function: crcFast() - * - * Description: Compute the CRC of a given message. - * - * Notes: crcInit() must be called first. - * - * Returns: The CRC of the message. - * - *********************************************************************/ -crc -crcFast(unsigned char const message[], int nBytes) -{ - crc remainder = INITIAL_REMAINDER; - unsigned char data; - int byte; - - - /* - * Divide the message by the polynomial, a byte at a time. - */ - for (byte = 0; byte < nBytes; ++byte) - { - data = REFLECT_DATA(message[byte]) ^ (remainder >> (WIDTH - 8)); - remainder = crcTable[data] ^ (remainder << 8); - } - - /* - * The final remainder is the CRC. - */ - return (REFLECT_REMAINDER(remainder) ^ FINAL_XOR_VALUE); - -} /* crcFast() */ diff --git a/ip/nios2_hw_crc/hdl/CRC_Custom_Instruction.v b/ip/nios2_hw_crc/hdl/CRC_Custom_Instruction.v deleted file mode 100644 index f24f7bb..0000000 --- a/ip/nios2_hw_crc/hdl/CRC_Custom_Instruction.v +++ /dev/null @@ -1,101 +0,0 @@ -/* - Legal Notice: (C)2006 Altera Corporation. All rights reserved. Your - use of Altera Corporation's design tools, logic functions and other - software and tools, and its AMPP partner logic functions, and any - output files any of the foregoing (including device programming or - simulation files), and any associated documentation or information are - expressly subject to the terms and conditions of the Altera Program - License Subscription Agreement or other applicable license agreement, - including, without limitation, that your use is for the sole purpose - of programming logic devices manufactured by Altera and sold by Altera - or its authorized distributors. Please refer to the applicable - agreement for further details. -*/ - -/* - This thin wrapper re-uses the CRC Avalon component as a Nios II - custom instruction. The n port of custom instruction is used as - control to the CRC Avalon component. Below are the values of n and - the corresponding operations perform by the custom instruction: - n = 0, Initialize the custom instruction to the initial remainder value - n = 1, Write 8 bits data to custom instruction - n = 2, Write 16 bits data to custom instruction - n = 3, Write 32 bits data to custom instruction - n = 4, Read 32 bits data from the custom instruction - n = 5, Read 64 bits data from the custom instruction - n = 6, Read 96 bits data from the custom instruction - n = 7, Read 128 bits data from the custom instruction -*/ - - - -module CRC_Custom_Instruction(clk, - reset, - dataa, - n, - clk_en, - start, - done, - result); - /* - See the Avalon CRC component for details on the meaning of each - parameter listed below. - */ - parameter crc_width = 32; - parameter polynomial_inital = 32'hFFFFFFFF; - parameter polynomial = 32'h04C11DB7; - parameter reflected_input = 1; - parameter reflected_output = 1; - parameter xor_output = 32'hFFFFFFFF; - - input clk; - input reset; - input [31:0] dataa; - input [2:0] n; - input clk_en; - input start; - output done; - output [31:0] result; - - wire [2:0] address; - wire [3:0] byteenable; - wire write; - wire read; - reg done_delay; - - assign write = (n<4); - assign read = (n>3); - assign byteenable = (n==1)?4'b0001 : (n==2)?4'b0011 : (n==3)?4'b1111 : 4'b0000; - assign address = (n==0)?3'b000 : ((n==1)|(n==2)|(n==3))?3'b001 : (n==4)?3'b100 : (n==5)?3'b101 : (n==6)?3'b110 : 3'b111; - assign done = (n>3)? done_delay : start; - - always @ (posedge clk or posedge reset) - begin - if (reset) - done_delay <= 0; - else - done_delay <= start; - end - - /* - Instantiating the Avalon CRC component and wiring it to be - custom instruction compilant - */ - CRC_Component wrapper_wiring(.clk(clk), - .reset(reset), - .address(address), - .writedata(dataa), - .byteenable(byteenable), - .write(write & start), - .read(read), - .chipselect(clk_en), - .readdata(result)); - - defparam wrapper_wiring.crc_width = crc_width; - defparam wrapper_wiring.polynomial_inital = polynomial_inital; - defparam wrapper_wiring.polynomial = polynomial; - defparam wrapper_wiring.reflected_input = reflected_input; - defparam wrapper_wiring.reflected_output = reflected_output; - defparam wrapper_wiring.xor_output = xor_output; - -endmodule diff --git a/ip/nios2_hw_crc/nios2_hw_crc32_hw.tcl b/ip/nios2_hw_crc/nios2_hw_crc32_hw.tcl deleted file mode 100644 index aa5ecdd..0000000 --- a/ip/nios2_hw_crc/nios2_hw_crc32_hw.tcl +++ /dev/null @@ -1,116 +0,0 @@ -# TCL File Generated by Component Editor 15.1 -# Tue Dec 22 18:46:40 EET 2015 -# DO NOT MODIFY - - -# -# nios2_hw_crc32 "nios2_hw_crc32" v1.0 -# 2015.12.22.18:46:40 -# -# - -# -# request TCL package from ACDS 15.1 -# -package require -exact qsys 15.1 - - -# -# module nios2_hw_crc32 -# -set_module_property DESCRIPTION "" -set_module_property NAME nios2_hw_crc32 -set_module_property VERSION 17.1 -set_module_property INTERNAL false -set_module_property OPAQUE_ADDRESS_MAP true -set_module_property GROUP "Custom Instruction Modules" -set_module_property AUTHOR "" -set_module_property DISPLAY_NAME nios2_hw_crc32 -set_module_property INSTANTIATE_IN_SYSTEM_MODULE true -set_module_property EDITABLE true -set_module_property REPORT_TO_TALKBACK false -set_module_property ALLOW_GREYBOX_GENERATION false -set_module_property REPORT_HIERARCHY false - - -# -# file sets -# -add_fileset QUARTUS_SYNTH QUARTUS_SYNTH "" "" -set_fileset_property QUARTUS_SYNTH TOP_LEVEL CRC_Custom_Instruction -set_fileset_property QUARTUS_SYNTH ENABLE_RELATIVE_INCLUDE_PATHS false -set_fileset_property QUARTUS_SYNTH ENABLE_FILE_OVERWRITE_MODE false -add_fileset_file CRC_Component.v VERILOG PATH hdl/CRC_Component.v -add_fileset_file CRC_Custom_Instruction.v VERILOG PATH hdl/CRC_Custom_Instruction.v TOP_LEVEL_FILE - - -# -# parameters -# -add_parameter crc_width INTEGER 32 -set_parameter_property crc_width DEFAULT_VALUE 32 -set_parameter_property crc_width DISPLAY_NAME crc_width -set_parameter_property crc_width TYPE INTEGER -set_parameter_property crc_width UNITS None -set_parameter_property crc_width HDL_PARAMETER true -add_parameter polynomial_inital STD_LOGIC_VECTOR 4294967295 -set_parameter_property polynomial_inital DEFAULT_VALUE 4294967295 -set_parameter_property polynomial_inital DISPLAY_NAME polynomial_inital -set_parameter_property polynomial_inital TYPE STD_LOGIC_VECTOR -set_parameter_property polynomial_inital UNITS None -set_parameter_property polynomial_inital ALLOWED_RANGES 0:17179869183 -set_parameter_property polynomial_inital HDL_PARAMETER true -add_parameter polynomial STD_LOGIC_VECTOR 79764919 -set_parameter_property polynomial DEFAULT_VALUE 79764919 -set_parameter_property polynomial DISPLAY_NAME polynomial -set_parameter_property polynomial TYPE STD_LOGIC_VECTOR -set_parameter_property polynomial UNITS None -set_parameter_property polynomial ALLOWED_RANGES 0:17179869183 -set_parameter_property polynomial HDL_PARAMETER true -add_parameter reflected_input INTEGER 1 -set_parameter_property reflected_input DEFAULT_VALUE 1 -set_parameter_property reflected_input DISPLAY_NAME reflected_input -set_parameter_property reflected_input TYPE INTEGER -set_parameter_property reflected_input UNITS None -set_parameter_property reflected_input HDL_PARAMETER true -add_parameter reflected_output INTEGER 1 -set_parameter_property reflected_output DEFAULT_VALUE 1 -set_parameter_property reflected_output DISPLAY_NAME reflected_output -set_parameter_property reflected_output TYPE INTEGER -set_parameter_property reflected_output UNITS None -set_parameter_property reflected_output HDL_PARAMETER true -add_parameter xor_output STD_LOGIC_VECTOR 4294967295 -set_parameter_property xor_output DEFAULT_VALUE 4294967295 -set_parameter_property xor_output DISPLAY_NAME xor_output -set_parameter_property xor_output TYPE STD_LOGIC_VECTOR -set_parameter_property xor_output UNITS None -set_parameter_property xor_output ALLOWED_RANGES 0:17179869183 -set_parameter_property xor_output HDL_PARAMETER true - - -# -# display items -# - - -# -# connection point nios_custom_instruction_slave -# -add_interface nios_custom_instruction_slave nios_custom_instruction end -set_interface_property nios_custom_instruction_slave clockCycle 0 -set_interface_property nios_custom_instruction_slave operands 1 -set_interface_property nios_custom_instruction_slave ENABLED true -set_interface_property nios_custom_instruction_slave EXPORT_OF "" -set_interface_property nios_custom_instruction_slave PORT_NAME_MAP "" -set_interface_property nios_custom_instruction_slave CMSIS_SVD_VARIABLES "" -set_interface_property nios_custom_instruction_slave SVD_ADDRESS_GROUP "" - -add_interface_port nios_custom_instruction_slave clk clk Input 1 -add_interface_port nios_custom_instruction_slave clk_en clk_en Input 1 -add_interface_port nios_custom_instruction_slave dataa dataa Input 32 -add_interface_port nios_custom_instruction_slave done done Output 1 -add_interface_port nios_custom_instruction_slave n n Input 3 -add_interface_port nios_custom_instruction_slave reset reset Input 1 -add_interface_port nios_custom_instruction_slave result result Output 32 -add_interface_port nios_custom_instruction_slave start start Input 1 - diff --git a/ip/nios2_hw_crc/nios2_hw_crc32_sw.tcl b/ip/nios2_hw_crc/nios2_hw_crc32_sw.tcl deleted file mode 100644 index ce0d0e4..0000000 --- a/ip/nios2_hw_crc/nios2_hw_crc32_sw.tcl +++ /dev/null @@ -1,58 +0,0 @@ -# (C) 2001-2015 Altera Corporation. All rights reserved. -# Your use of Altera Corporation's design tools, logic functions and other -# software and tools, and its AMPP partner logic functions, and any output -# files any of the foregoing (including device programming or simulation -# files), and any associated documentation or information are expressly subject -# to the terms and conditions of the Altera Program License Subscription -# Agreement, Altera MegaCore Function License Agreement, or other applicable -# license agreement, including, without limitation, that your use is for the -# sole purpose of programming logic devices manufactured by Altera and sold by -# Altera or its authorized distributors. Please refer to the applicable -# agreement for further details. - - -# TCL File Generated by Altera University Program -# DO NOT MODIFY - -set aup_version 15.1 - -# Create a new driver - this name must be different than the -# hardware component name -create_driver nios2_hw_crc32_driver - -# Associate it with some hardware -set_sw_property hw_class_name nios2_hw_crc32 - -# The version of this driver -set_sw_property version $aup_version - -# This driver is proclaimed to be compatible with 'component' -# as old as version "1.0". The component hardware version is set in the -# _hw.tcl file - If the hardware component version number is not equal -# or greater than the min_compatable_hw_version number, the driver -# source files will not be copied over to the BSP driver directory -set_sw_property min_compatible_hw_version 1.0 - -# Initialize the driver in alt_sys_init() -set_sw_property auto_initialize false - -# Location in generated BSP that sources will be copied into -set_sw_property bsp_subdirectory drivers - -# -# Source file listings... -# - -# C/C++ source files -add_sw_property c_source HAL/src/ci_crc.c -add_sw_property c_source HAL/src/crc.c - -# Include files -add_sw_property include_source HAL/inc/ci_crc.h -add_sw_property include_source HAL/inc/crc.h - -# This driver supports HAL type -add_sw_property supported_bsp_type HAL - -# End of file - diff --git a/ip/pulpino_qsys b/ip/pulpino_qsys new file mode 160000 index 0000000..b11dd77 --- /dev/null +++ b/ip/pulpino_qsys @@ -0,0 +1 @@ +Subproject commit b11dd7718e6d367cbaef8a362ce206510fd87ed0 diff --git a/ossc.qsf b/ossc.qsf index 9b5e5b3..bdb144a 100644 --- a/ossc.qsf +++ b/ossc.qsf @@ -57,7 +57,7 @@ set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" set_location_assignment PIN_25 -to clk27 -set_location_assignment PIN_99 -to reset_n +set_location_assignment PIN_99 -to hw_reset_n set_location_assignment PIN_23 -to ir_rx #============================================================ @@ -224,17 +224,18 @@ set_global_assignment -name ENABLE_SIGNALTAP OFF set_global_assignment -name USE_SIGNALTAP_FILE output_files/ossc_la.stp set_global_assignment -name FITTER_EFFORT "AUTO FIT" -set_global_assignment -name SEED 3 +set_global_assignment -name SEED 12 + + set_global_assignment -name VERILOG_FILE rtl/videogen.v -set_global_assignment -name QIP_FILE software/sys_controller/mem_init/meminit.qip set_global_assignment -name VERILOG_FILE rtl/ir_rcv.v -set_global_assignment -name SDC_FILE ossc.sdc -set_global_assignment -name QSYS_FILE sys.qsys set_global_assignment -name VERILOG_FILE rtl/ossc.v set_global_assignment -name VERILOG_FILE rtl/scanconverter.v set_global_assignment -name VERILOG_FILE rtl/lat_tester.v +set_global_assignment -name QIP_FILE sys/synthesis/sys.qip +set_global_assignment -name QIP_FILE software/sys_controller/mem_init/meminit.qip set_global_assignment -name QIP_FILE rtl/linebuf.qip set_global_assignment -name QIP_FILE rtl/pll_2x.qip set_global_assignment -name QIP_FILE rtl/pll_3x.qip @@ -242,7 +243,7 @@ set_global_assignment -name QIP_FILE rtl/lpm_mult_4_hybr_ref_pre.qip set_global_assignment -name QIP_FILE rtl/lpm_mult_4_hybr_ref.qip set_global_assignment -name QIP_FILE rtl/lpm_mult_4_sl.qip set_global_assignment -name QIP_FILE rtl/mux5.qip +set_global_assignment -name SDC_FILE ossc.sdc set_global_assignment -name CDF_FILE output_files/Chain1.cdf set_global_assignment -name SIGNALTAP_FILE output_files/ossc_la.stp - set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/ossc_sw_bsp.project b/ossc_sw_bsp.project index 8916c24..157fd75 100644 --- a/ossc_sw_bsp.project +++ b/ossc_sw_bsp.project @@ -1,5 +1,5 @@ - + @@ -280,10 +280,9 @@ - nios2-bsp-editor make clean - nios2-bsp-generate-files --bsp-dir . --settings settings.bsp + make @@ -320,10 +319,9 @@ - nios2-bsp-editor make clean - nios2-bsp-generate-files --bsp-dir ./ --settings settings.bsp + make diff --git a/rtl/ossc.v b/rtl/ossc.v index 3980c89..3d5e61a 100644 --- a/rtl/ossc.v +++ b/rtl/ossc.v @@ -19,7 +19,7 @@ //`define DEBUG `define VIDEOGEN -`define CPU_RESET_WIDTH 27 //1us +`define PO_RESET_WIDTH 27 //1us module ossc ( input clk27, @@ -43,7 +43,7 @@ module ossc ( output HDMI_TX_PCLK, input HDMI_TX_INT_N, input HDMI_TX_MODE, - output reset_n, + output hw_reset_n, output LED_G, output LED_R, output LCD_RS, @@ -81,8 +81,10 @@ wire PCLK_out_videogen; wire DE_out_videogen; -reg [7:0] cpu_reset_ctr = 0; -reg cpu_reset_n = 1'b0; +reg [7:0] po_reset_ctr = 0; +reg po_reset_n = 1'b0; +wire jtagm_reset_req; +wire sys_reset_n = (po_reset_n & ~jtagm_reset_req); reg [7:0] R_in_L, G_in_L, B_in_L; reg HSYNC_in_L, VSYNC_in_L, FID_in_L; @@ -105,9 +107,9 @@ wire lcd_bl_timeout; // Latch inputs from TVP7002 (synchronized to PCLK_in) -always @(posedge PCLK_in or negedge reset_n) +always @(posedge PCLK_in or negedge hw_reset_n) begin - if (!reset_n) begin + if (!hw_reset_n) begin R_in_L <= 8'h00; G_in_L <= 8'h00; B_in_L <= 8'h00; @@ -125,9 +127,9 @@ begin end // Insert synchronizers to async inputs (synchronize to CPU clock) -always @(posedge clk27 or negedge cpu_reset_n) +always @(posedge clk27 or negedge po_reset_n) begin - if (!cpu_reset_n) begin + if (!po_reset_n) begin btn_L <= 2'b00; btn_LL <= 2'b00; ir_rx_L <= 1'b0; @@ -148,16 +150,16 @@ begin end end -// CPU reset pulse generation (is this really necessary?) +// Power-on reset pulse generation (not strictly necessary) always @(posedge clk27) begin - if (cpu_reset_ctr == `CPU_RESET_WIDTH) - cpu_reset_n <= 1'b1; + if (po_reset_ctr == `PO_RESET_WIDTH) + po_reset_n <= 1'b1; else - cpu_reset_ctr <= cpu_reset_ctr + 1'b1; + po_reset_ctr <= po_reset_ctr + 1'b1; end -assign reset_n = sys_ctrl[0]; //HDMI_TX_RST_N in v1.2 PCB +assign hw_reset_n = sys_ctrl[0]; //HDMI_TX_RST_N in v1.2 PCB `ifdef DEBUG @@ -171,7 +173,7 @@ assign LED_G = (ir_code == 0); assign SD_DAT[3] = sys_ctrl[7]; //SD_SPI_SS_N assign LCD_CS_N = sys_ctrl[6]; assign LCD_RS = sys_ctrl[5]; -wire lcd_bl_on = sys_ctrl[4]; //reset_n in v1.2 PCB +wire lcd_bl_on = sys_ctrl[4]; //hw_reset_n in v1.2 PCB wire [1:0] lcd_bl_time = sys_ctrl[3:2]; assign LCD_BL = lcd_bl_on ? (~lcd_bl_timeout | lt_active) : 1'b0; @@ -226,7 +228,12 @@ end sys sys_inst( .clk_clk (clk27), - .reset_reset_n (cpu_reset_n), + .reset_reset_n (sys_reset_n), + .pulpino_0_config_testmode_i (1'b0), + .pulpino_0_config_fetch_enable_i (1'b1), + .pulpino_0_config_clock_gating_i (1'b0), + .pulpino_0_config_boot_addr_i (32'h00010000), + .master_0_master_reset_reset (jtagm_reset_req), .i2c_opencores_0_export_scl_pad_io (scl), .i2c_opencores_0_export_sda_pad_io (sda), .i2c_opencores_0_export_spi_miso_pad_i (1'b0), @@ -245,7 +252,7 @@ sys sys_inst( ); scanconverter scanconverter_inst ( - .reset_n (reset_n), + .reset_n (hw_reset_n), .PCLK_in (PCLK_in), .clk27 (clk27), .HSYNC_in (HSYNC_in_L), @@ -279,7 +286,7 @@ scanconverter scanconverter_inst ( ir_rcv ir0 ( .clk27 (clk27), - .reset_n (cpu_reset_n), + .reset_n (po_reset_n), .ir_rx (ir_rx_LL), .ir_code (ir_code), .ir_code_ack (), @@ -304,7 +311,7 @@ lat_tester lt0 ( `ifdef VIDEOGEN videogen vg0 ( .clk27 (clk27), - .reset_n (cpu_reset_n & videogen_sel), + .reset_n (po_reset_n & videogen_sel), .lt_active (lt_active), .lt_mode (lt_mode_synced), .R_out (R_out_videogen), diff --git a/rtl/scanconverter.v b/rtl/scanconverter.v index 7e67d7c..b6f4e59 100644 --- a/rtl/scanconverter.v +++ b/rtl/scanconverter.v @@ -42,6 +42,7 @@ `define H_MULTMODE_FULLWIDTH 2'h0 `define H_MULTMODE_ASPECTFIX 2'h1 `define H_MULTMODE_OPTIMIZED 2'h2 +`define H_MULTMODE_OPTIMIZED_1X 2'h3 `define SCANLINES_OFF 2'h0 `define SCANLINES_H 2'h1 @@ -187,6 +188,8 @@ reg [2:0] H_OPT_SCALE; reg [2:0] H_OPT_SAMPLE_MULT; reg [2:0] H_OPT_SAMPLE_SEL; reg [9:0] H_L5BORDER; +reg [9:0] H_L3BORDER; +reg [6:0] H_L3_OPT_SAMPLE_COMP; reg [3:0] X_MASK_BR; reg X_SCANLINE_METHOD; reg [4:0] X_SCANLINE_HYBRSTR; @@ -375,12 +378,18 @@ case (V_MULTMODE) col_id_act = {2'b00, hcnt_2x[0]}; rlpf_trigger_act = 1'b1; end - `H_MULTMODE_OPTIMIZED: begin + `H_MULTMODE_OPTIMIZED_1X: begin pclk_mux_sel = `PCLK_MUX_1X; //special case: pclk bypass to enable 2x native sampling linebuf_hoffset = hcnt_2x_opt; col_id_act = {2'b00, hcnt_2x[1]}; rlpf_trigger_act = (hcnt_2x_opt_ctr == 0); end + `H_MULTMODE_OPTIMIZED: begin + pclk_mux_sel = `PCLK_MUX_2X; + linebuf_hoffset = hcnt_2x_opt; + col_id_act = hcnt_2x_opt_ctr; + rlpf_trigger_act = (hcnt_2x_opt_ctr == 0); + end endcase end `V_MULTMODE_3X: begin @@ -870,6 +879,10 @@ begin // H_L5BORDER <= h_info[29] ? (11'd1920-h_info[10:0])/2 : (11'd1600-h_info[10:0])/2; H_L5BORDER <= h_info[29] ? H_L5BORDER_1920_tmp[10:1] : H_L5BORDER_1600_tmp[10:1]; + // For Line3x 240x360 + H_L3BORDER <= h_info[28] ? H_L5BORDER_1920_tmp[10:1] : 10'd0; + + H_L3_OPT_SAMPLE_COMP <= h_info[28] ? 7'd90 : 7'd0; H_OPT_SCALE <= h_info2[18:16]; H_OPT_SAMPLE_SEL <= h_info2[15:13]; @@ -990,7 +1003,7 @@ begin if ((pclk_3x_cnt == 0) & (line_change | frame_change)) begin //aligned with posedge of pclk_1x if (!(frame_change & (FID_cur == `FID_ODD))) begin hcnt_3x <= 0; - hcnt_3x_opt <= H_OPT_SAMPLE_SEL; + hcnt_3x_opt <= H_OPT_SAMPLE_SEL + H_L3_OPT_SAMPLE_COMP; hcnt_3x_opt_ctr <= 0; line_out_idx_3x <= 0; end @@ -1001,7 +1014,7 @@ begin end else if (hcnt_3x == hmax[~line_idx]) begin hcnt_3x <= 0; line_out_idx_3x <= line_out_idx_3x + 1'b1; - hcnt_3x_opt <= H_OPT_SAMPLE_SEL; + hcnt_3x_opt <= H_OPT_SAMPLE_SEL + H_L3_OPT_SAMPLE_COMP; hcnt_3x_opt_ctr <= 0; end else begin hcnt_3x <= hcnt_3x + 1'b1; @@ -1032,7 +1045,7 @@ begin VSYNC_3x <= ~`VSYNC_POL; end - DE_3x <= ((hcnt_3x >= H_AVIDSTART) & (hcnt_3x < H_AVIDSTOP)) & ((vcnt_3x >= V_AVIDSTART) & (vcnt_3x < V_AVIDSTOP)); + DE_3x <= ((hcnt_3x >= H_AVIDSTART-H_L3BORDER) & (hcnt_3x < H_AVIDSTOP+H_L3BORDER)) & ((vcnt_3x >= V_AVIDSTART) & (vcnt_3x < V_AVIDSTOP)); end end diff --git a/scripts/rv-reprogram.tcl b/scripts/rv-reprogram.tcl new file mode 100644 index 0000000..80be390 --- /dev/null +++ b/scripts/rv-reprogram.tcl @@ -0,0 +1,25 @@ +#Select the master service type and check for available service paths. +set service_paths [get_service_paths master] + +#Set the master service path. +set master_service_path [lindex $service_paths 0] + +#Open the master service. +set claim_path [claim_service master $master_service_path mylib] + +puts "Halting CPU" +master_write_32 $claim_path 0x0 0x1 + +puts "Writing block RAM" +master_write_from_file $claim_path mem_init/sys_onchip_memory2_0.bin 0x10000 + +close_service master $claim_path + + +set jtag_debug_list [get_service_paths jtag_debug] +set jd [ lindex $jtag_debug_list 0 ] +open_service jtag_debug $jd +puts "Resetting system" +jtag_debug_reset_system $jd +close_service jtag_debug $jd +puts "Done" diff --git a/software/ossc_sw.project b/software/ossc_sw.project index e30f872..8837972 100644 --- a/software/ossc_sw.project +++ b/software/ossc_sw.project @@ -121,7 +121,7 @@ - + @@ -134,7 +134,9 @@ - make ENABLE_AUDIO=y APP_CFLAGS_DEBUG_LEVEL="-DDEBUG" + make APP_CFLAGS_DEBUG_LEVEL="-DDEBUG" generate_hex + make ENABLE_AUDIO=y APP_CFLAGS_DEBUG_LEVEL="-DDEBUG" generate_hex + cd ../sys_controller_bsp && touch bsp_timestamp make clean make APP_CFLAGS_DEBUG_LEVEL="-DDEBUG" @@ -161,7 +163,7 @@ - + @@ -180,6 +182,7 @@ make generate_hex make OSDLANG=JP make ENABLE_AUDIO=y + cd ../sys_controller_bsp && touch bsp_timestamp make clean make diff --git a/software/sys_controller/Makefile b/software/sys_controller/Makefile index 2865ed4..8e83516 100644 --- a/software/sys_controller/Makefile +++ b/software/sys_controller/Makefile @@ -17,7 +17,7 @@ ALT_LIBRARY_NAMES := # List of library names for -msys-lib linker option (-msys-lib added when used). # These are libraries that might be located in the BSP and depend on the BSP # library, or vice versa -ALT_BSP_DEP_LIBRARY_NAMES := +ALT_BSP_DEP_LIBRARY_NAMES := libhal_bsp.a # List of dependencies for the linker. This is usually the full pathname # of each library (*.a) file. @@ -165,10 +165,11 @@ else C_SRCS += ossc/menu.c endif C_SRCS += ossc/userdata.c +C_SRCS += ossc/utils.c C_SRCS += ulibSD/sd_io.c C_SRCS += ulibSD/spi_io.c CXX_SRCS := -ASM_SRCS := +ASM_SRCS := crt0.boot_E.S # Path to root of object file tree. @@ -344,12 +345,12 @@ ifneq ($(AVOID_NIOS2_GCC3_OPTIONS),) # Detect if small newlib C library is requested. # If yes, remove the -msmallc option because it is # now handled by other means. -ifneq ($(filter -msmallc,$(ALT_LDFLAGS)),) - ALT_LDFLAGS := $(filter-out -msmallc,$(ALT_LDFLAGS)) - ALT_C_LIBRARY := smallc -else - ALT_C_LIBRARY := c -endif +#ifneq ($(filter -msmallc,$(ALT_LDFLAGS)),) + #ALT_LDFLAGS := $(filter-out -msmallc,$(ALT_LDFLAGS)) + #ALT_C_LIBRARY := smallc +#else + #ALT_C_LIBRARY := c +#endif # Put each BSP dependent library in a group to avoid circular dependencies. APP_BSP_DEP_LIBS := $(foreach l,$(ALT_BSP_DEP_LIBRARY_NAMES),-Wl,--start-group -l$(ALT_C_LIBRARY) -lgcc -l$(l) -Wl,--end-group) @@ -359,7 +360,8 @@ else # !AVOID_NIOS2_GCC3_OPTIONS # # Use Nios II GCC 3.X options. # -APP_BSP_DEP_LIBS := $(addprefix -msys-lib=, $(ALT_BSP_DEP_LIBRARY_NAMES)) +#APP_BSP_DEP_LIBS := $(addprefix -msys-lib=, $(ALT_BSP_DEP_LIBRARY_NAMES)) +APP_BSP_DEP_LIBS := $(addprefix -l:, $(ALT_BSP_DEP_LIBRARY_NAMES)) endif # !AVOID_NIOS2_GCC3_OPTIONS @@ -389,7 +391,7 @@ APP_ASFLAGS := $(APP_ASM_INC_DIRS) \ $(ASFLAGS) # Arguments only for the linker. -APP_LDFLAGS := $(APP_LDFLAGS_USER) +APP_LDFLAGS := $(APP_LDFLAGS_USER) --specs=nano.specs -nostartfiles ifneq ($(LINKER_SCRIPT),) APP_LDFLAGS += -T'$(LINKER_SCRIPT)' @@ -410,17 +412,16 @@ else # !AVOID_NIOS2_GCC3_OPTIONS # Use Nios II GCC 3.x options. ifneq ($(CRT0),) -APP_LDFLAGS += -msys-crt0='$(CRT0)' +#APP_LDFLAGS += -msys-crt0='$(CRT0)' endif ifneq ($(SYS_LIB),) -APP_LDFLAGS += -msys-lib=$(SYS_LIB) +#APP_LDFLAGS += -msys-lib=$(SYS_LIB) endif endif # !AVOID_NIOS2_GCC3_OPTIONS APP_LDFLAGS += \ $(APP_LIB_DIRS) \ - $(ALT_LDFLAGS) \ $(LDFLAGS) LINKER_MAP_NAME := $(APP_NAME).map @@ -651,23 +652,24 @@ build_post_process : # included makefile fragment. # ifeq ($(DEFAULT_CROSS_COMPILE),) -DEFAULT_CROSS_COMPILE := nios2-elf- +DEFAULT_CROSS_COMPILE := riscv32-unknown-elf- endif ifeq ($(DEFAULT_STACKREPORT),) -DEFAULT_STACKREPORT := nios2-stackreport +DEFAULT_STACKREPORT := riscv32-unknown-elf-size endif ifeq ($(DEFAULT_DOWNLOAD),) -DEFAULT_DOWNLOAD := nios2-download +DEFAULT_DOWNLOAD := anios2-download endif ifeq ($(DEFAULT_FLASHPROG),) -DEFAULT_FLASHPROG := nios2-flash-programmer +DEFAULT_FLASHPROG := anios2-flash-programmer endif +DISABLE_ELFPATCH := 1 ifeq ($(DEFAULT_ELFPATCH),) -DEFAULT_ELFPATCH := nios2-elf-insert +DEFAULT_ELFPATCH := anios2-elf-insert endif ifeq ($(DEFAULT_RM),) @@ -732,7 +734,7 @@ OBJCOPY := $(CROSS_COMPILE)objcopy endif ifeq ($(STACKREPORT),) -STACKREPORT := $(DEFAULT_STACKREPORT) --prefix $(CROSS_COMPILE) +STACKREPORT := $(DEFAULT_STACKREPORT) else DISABLE_STACKREPORT := 1 endif @@ -753,6 +755,8 @@ ifeq ($(MKDIR),) MKDIR := $(DEFAULT_MKDIR) endif +RV_OBJCOPY = riscv32-unknown-elf-objcopy + #------------------------------------------------------------------------------ # PATTERN RULES TO BUILD OBJECTS #------------------------------------------------------------------------------ @@ -1126,5 +1130,16 @@ print-elf-name: ossc/menu_sjis.c: ossc/menu.c iconv -f UTF-8 -t SHIFT-JIS ossc/menu.c > ossc/menu_sjis.c +mem_init/sys_onchip_memory2_0.hex: sys_controller.elf + $(RV_OBJCOPY) --change-addresses -0x10000 -O binary --gap-fill 0 $< mem_init/sys_onchip_memory2_0.bin + ../../tools/bin2hex mem_init/sys_onchip_memory2_0.bin mem_init/sys_onchip_memory2_0.hex + +.PHONY: mem_init_generate_new +mem_init_generate_new: mem_init/sys_onchip_memory2_0.hex + .PHONY: generate_hex -generate_hex: clean mem_init_generate +generate_hex: clean mem_init_generate_new + +.PHONY: rv-reprogram +rv-reprogram: mem_init_generate_new + system-console -cli --script ../../scripts/rv-reprogram.tcl diff --git a/software/sys_controller/crt0.boot.S b/software/sys_controller/crt0.boot.S new file mode 100644 index 0000000..863deb9 --- /dev/null +++ b/software/sys_controller/crt0.boot.S @@ -0,0 +1,103 @@ +// Copyright 2017 ETH Zurich and University of Bologna. +// Copyright and related rights are licensed under the Solderpad Hardware +// License, Version 0.51 (the “License”); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law +// or agreed to in writing, software, hardware and materials distributed under +// this License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "pulpino.h" + +#define EXCEPTION_STACK_SIZE 72 + + +/* ========================================================= [ entry ] === */ + .section .text + +default_exc_handler: + jal x0, default_exc_handler + +reset_handler: + /* set all registers to zero */ + mv x1, x0 + mv x2, x1 + mv x3, x1 + mv x4, x1 + mv x5, x1 + mv x6, x1 + mv x7, x1 + mv x8, x1 + mv x9, x1 + mv x10, x1 + mv x11, x1 + mv x12, x1 + mv x13, x1 + mv x14, x1 + mv x15, x1 + mv x16, x1 + mv x17, x1 + mv x18, x1 + mv x19, x1 + mv x20, x1 + mv x21, x1 + mv x22, x1 + mv x23, x1 + mv x24, x1 + mv x25, x1 + mv x26, x1 + mv x27, x1 + mv x28, x1 + mv x29, x1 + mv x30, x1 + mv x31, x1 + + /* stack initilization */ + la x2, _stack_start + +_start: + .global _start + + /* clear BSS */ + la x26, _bss_start + la x27, _bss_end + + bge x26, x27, zero_loop_end + +zero_loop: + sw x0, 0(x26) + addi x26, x26, 4 + ble x26, x27, zero_loop +zero_loop_end: + + +main_entry: + /* jump to alt_main program entry point */ + jal alt_main + +/* =================================================== [ exceptions ] === */ +/* This section has to be down here, since we have to disable rvc for it */ + + .section .vectors, "ax" + .option norvc; + + // external interrupts are handled by the same callback + // until compiler supports IRQ routines + .org 0x00 + .rept 31 + nop + .endr + jal x0, default_exc_handler + + // reset vector + .org 0x80 + jal x0, reset_handler + + // illegal instruction exception + .org 0x84 + jal x0, default_exc_handler + + // ecall handler + .org 0x88 + jal x0, default_exc_handler diff --git a/software/sys_controller/crt0.boot_E.S b/software/sys_controller/crt0.boot_E.S new file mode 100644 index 0000000..eaf071d --- /dev/null +++ b/software/sys_controller/crt0.boot_E.S @@ -0,0 +1,87 @@ +// Copyright 2017 ETH Zurich and University of Bologna. +// Copyright and related rights are licensed under the Solderpad Hardware +// License, Version 0.51 (the “License”); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law +// or agreed to in writing, software, hardware and materials distributed under +// this License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "pulpino.h" + +#define EXCEPTION_STACK_SIZE 72 + + +/* ========================================================= [ entry ] === */ + .section .text + +default_exc_handler: + jal x0, default_exc_handler + +reset_handler: + /* set all registers to zero */ + mv x1, x0 + mv x2, x1 + mv x3, x1 + mv x4, x1 + mv x5, x1 + mv x6, x1 + mv x7, x1 + mv x8, x1 + mv x9, x1 + mv x10, x1 + mv x11, x1 + mv x12, x1 + mv x13, x1 + mv x14, x1 + mv x15, x1 + + /* stack initilization */ + la x2, _stack_start + +_start: + .global _start + + /* clear BSS */ + la x14, _bss_start + la x15, _bss_end + + bge x14, x15, zero_loop_end + +zero_loop: + sw x0, 0(x14) + addi x14, x14, 4 + ble x14, x15, zero_loop +zero_loop_end: + + +main_entry: + /* jump to alt_main program entry point */ + jal alt_main + +/* =================================================== [ exceptions ] === */ +/* This section has to be down here, since we have to disable rvc for it */ + + .section .vectors, "ax" + .option norvc; + + // external interrupts are handled by the same callback + // until compiler supports IRQ routines + .org 0x00 + .rept 31 + nop + .endr + jal x0, default_exc_handler + + // reset vector + .org 0x80 + jal x0, reset_handler + + // illegal instruction exception + .org 0x84 + jal x0, default_exc_handler + + // ecall handler + .org 0x88 + jal x0, default_exc_handler diff --git a/software/sys_controller/it6613/hdmitx.h b/software/sys_controller/it6613/hdmitx.h index fe5d011..857a7ab 100644 --- a/software/sys_controller/it6613/hdmitx.h +++ b/software/sys_controller/it6613/hdmitx.h @@ -52,7 +52,7 @@ //#define NULL 0 //typedef unsigned char bool; -#include "Altera_UP_SD_Card_Avalon_Interface_mod.h" +typedef unsigned char bool; #include "sysconfig.h" // Hardwired to CPU reset diff --git a/software/sys_controller/link.common.ld b/software/sys_controller/link.common.ld new file mode 100644 index 0000000..d302ada --- /dev/null +++ b/software/sys_controller/link.common.ld @@ -0,0 +1,135 @@ +SEARCH_DIR(.) +__DYNAMIC = 0; + +MEMORY +{ + dataram : ORIGIN = 0x00010000, LENGTH = 0x9000 +} + +/* Stack information variables */ +_min_stack = 0x400; /* 1K - minimum stack space to reserve */ +_stack_start = ORIGIN(dataram) + LENGTH(dataram); + +/* We have to align each sector to word boundaries as our current s19->slm + * conversion scripts are not able to handle non-word aligned sections. */ + +SECTIONS +{ + .vectors : + { + . = ALIGN(4); + KEEP(*(.vectors)) + } > dataram + + .text : { + . = ALIGN(4); + _stext = .; + *(.text) + *(.text.*) + _etext = .; + __CTOR_LIST__ = .; + LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) + *(.ctors) + LONG(0) + __CTOR_END__ = .; + __DTOR_LIST__ = .; + LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) + *(.dtors) + LONG(0) + __DTOR_END__ = .; + *(.lit) + *(.shdata) + _endtext = .; + } > dataram + + /*--------------------------------------------------------------------*/ + /* Global constructor/destructor segement */ + /*--------------------------------------------------------------------*/ + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > dataram + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array )) + PROVIDE_HIDDEN (__init_array_end = .); + } > dataram + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array )) + PROVIDE_HIDDEN (__fini_array_end = .); + } > dataram + + .rodata : { + . = ALIGN(4); + *(.rodata); + *(.rodata.*) + } > dataram + + .shbss : + { + . = ALIGN(4); + *(.shbss) + } > dataram + + .data : { + . = ALIGN(4); + sdata = .; + _sdata = .; + *(.data); + *(.data.*) + *(.sdata); + *(.sdata.*) + *(.sdata2); + *(.sdata2.*) + edata = .; + _edata = .; + } > dataram + + .bss : + { + . = ALIGN(4); + _bss_start = .; + *(.bss) + *(.bss.*) + *(.sbss) + *(.sbss.*) + *(COMMON) + _bss_end = .; + } > dataram + + /* ensure there is enough room for stack */ + .stack (NOLOAD): { + . = ALIGN(4); + . = . + _min_stack ; + . = ALIGN(4); + stack = . ; + _stack = . ; + } > dataram + + .stab 0 (NOLOAD) : + { + [ .stab ] + } + + .stabstr 0 (NOLOAD) : + { + [ .stabstr ] + } + + .bss : + { + . = ALIGN(4); + _end = .; + } > dataram +} + diff --git a/software/sys_controller/link.riscv.ld b/software/sys_controller/link.riscv.ld new file mode 100644 index 0000000..24f8fb0 --- /dev/null +++ b/software/sys_controller/link.riscv.ld @@ -0,0 +1,7 @@ +/* not needed, but we need separate linker scripts anyway */ +OUTPUT_ARCH(riscv) + +/* required to correctly link newlib */ +GROUP( -lc -lgloss -lgcc -lsupc++ ) + +INCLUDE link.common.ld diff --git a/software/sys_controller/mem_init/sys_onchip_memory2_0.hex b/software/sys_controller/mem_init/sys_onchip_memory2_0.hex index ad0f69a..6d19bf9 100644 --- a/software/sys_controller/mem_init/sys_onchip_memory2_0.hex +++ b/software/sys_controller/mem_init/sys_onchip_memory2_0.hex @@ -1,1282 +1,7458 @@ -:020000020000FC -:2000000000402074084008140800683A0000000000000000000000000000000000000000FE -:2000080006C02074DEE80014068020B4D68387140080207410A6051400C0207418E72014EC -:2000100010C00326100000151080010410FFFD360816BC400816CA40003FFF06DEFFFB0479 -:2000180000BFE084D880000500800084D880004500800344D880008500800484DFC0041543 -:20002000D88000C531803FCCD8C005173000022600BFE004000001060080100439C03FCC99 -:20002800380E91FAD900018518C000CC39C0021410800214D80B883A01000044D8800105E7 -:20003000D9C00145D8C001C5D8000205D8000245D8000285D80002C5D8000305D800034577 -:20003800D8000385D80003C5081073C0DFC00417DEC00504F800283ADEFFFB040080010441 -:20004000D880000500800044D880004500800284D8800085D88000C3DFC0041521003FCC00 -:200048001080020C1080005410800414D88000C5D8800103108000D4D88001052000021EF3 -:200050000080014400000106008000C4D9000103108001CC1085883A00FFF8C420C6703AA4 -:200058001085883A1884B03AD8800105D88001C3D80B883A01000044108001CCD80001858C -:20006000D88001C508108680DFC00417DEC00504F800283ADEFFFC04DC000015040020B4E3 -:2000680084041804DC80021504801304DC400115900B883A2023883A000D883A8009883A18 -:20007000DFC003150817410089403FCC8009883A000D883A0817474004400044900B883AE0 -:200078008009883A880D883A08174100880B883A8009883ADFC00317DC800217DC40011764 -:20008000DC000017DEC0040408174481DEFFFC04DC000015040020B484041804DC80021526 -:20008800DC4001152025883A2823883A8009883A000D883A01401304DFC003150817410089 -:2000900091403FCC8009883A000D883A081747400180004489403FCC8009883ADFC0031717 -:20009800DC800217DC400117DC000017DEC0040408174741DEFFFF0421003FCCDFC000159F -:2000A00008101940DFC00017DEC00104F800283ADEFFFF0429403FCC21003FCCDFC00015E8 -:2000A800081020C00005883ADFC00017DEC00104F800283ADEFFFB04DCC00315DC800215C3 -:2000B000DC400115DC000015DFC004152825883A3027883A2023883A2821883A8485C83A12 -:2000B80014C0060E8140000389003FCC84000044081020C08C400044003FF8060005883A14 -:2000C000DFC00417DCC00317DC800217DC400117DC000017DEC00504F800283ADEFFFF0433 -:2000C8000140FA04DFC0001508162F801009883ADFC00017DEC001040816CD01DEFFFF0458 -:2000D000000B883A010003C4DFC0001508102900000B883A01001844DFC00017DEC0010403 -:2000D80008102901DEFFFD04DC000015040020B484261C048140008301000144DFC0021515 -:2000E000DC40011508102900808000838100030300FFFEC41004D1FA20C6703A044001040A -:2000E8001085883A1085883A1884B03A01400F448809883A8080030508102900010000444F -:2000F000081031C08809883A014007440810290001400C04010018440810290001402C84E7 -:2000F800010002440810290001403E04010002840810290001400DC4010002C408102900FB -:20010000000B883A010003C408102900000B883A0100324408102900000B883A0100328400 -:2001080008102900000B883A010032C408102900000B883A0100330408102900000B883A7E -:200110000100334408102900000B883A0100338408102900000B883A010033C4081029004A -:20011800000B883A01003404081029008140010301003844DFC00217DC400117DC0000175F -:20012000DEC0030408102901DEFFF904DCC003152827883A0140FA04DD400515DD000415CD -:20012800DC400115DC000015DFC00615DC800215202B883A3023883A9CC03FCC081623C0DD -:20013000050000441021883A9D00021E0486000400000106048C000401400044010003C440 -:2001380008102900000B883A01000CC408102900900AD23A01000D04048020B40810290036 -:20014000000B883A01000D440810290081403FCC01000C0408102900800AD23A01000C443A -:2001480094A61C0429403FCC08102900800AD43A01000C8408102900000B883A010003C489 -:2001500008102900000B883A0100314408102900954002159D000226040002840000010688 -:200158000400008400800044940001C5908001058C403FCC050000448D0002260005883A2F -:2001600000000106008003C401003804908001450140300408102900047FFF040100164407 -:200168009D00051E081027408884703A1140005429403FCC00000306081027408884703A2B -:2001700011403FCC0100164408102900010001040810274011403ACC010001040810290054 -:2001780091400103010038440810290001403904010038840810290091400143010038C446 -:20018000294003CC0810290001403A04010039040810290001400044010003C4081029005A -:20018800000B883A0100244408102900000B883A010024840810290001400044010024C4BB -:2001900008102900000B883A0100250408102900017FF004814AB03A29403FCC010026040E -:2001980008102900040A303A29403FCC280A913A01002644294002D429403FCC08102900BE -:2001A000000B883A010003C40810290001403044010038040810290000BFF04490800185AD -:2001A80000800044DFC00617DD400517DD000417DCC00317DC800217DC400117DC00001734 -:2001B000DEC00704F800283ADEFFFE04DC000015040001048009883ADFC0011508102740D4 -:2001B800108002148009883A11403FCC0810290001400C0401001844DFC00117DC00001741 -:2001C000DEC0020408102901DEFFFE04DC000015040001048009883ADFC0011508102740E1 -:2001C8001404B03A11403FCC8009883ADFC00117DC000017DEC0020408102901DEFFFE04FF -:2001D000DFC00115DC00001521003FCC2000021E000B883A00003B062821883A28003D2659 -:2001D80001400044010003C408102900814000C30100160408102900814001030100164479 -:2001E0000810290081400143010016840810290081400183010016C408102900814001C3F7 -:2001E800010017040810290081400203010017840810290081400243010017C408102900D4 -:2001F000814002830100180408102900814002C301001844081029008140030301001884C3 -:2001F8000810290081400343010018C408102900814003830100190408102900814003C354 -:200200000100194408102900808000C4000B883A8400040410C000031080004428CBC83A86 -:20020800143FFC1E29401BC429403FCC0100174408102900000B883A010003C4081029003A -:20021000014000C4010033440810290000800044000001060005883ADFC00117DC000017D4 -:20021800DEC00204F800283ADEFFFE04DFC00115DC00001521003FCC2000021E000B883A0A -:20022000000020062821883A2800222601400044010003C408102900814000C301001A04EC -:20022800081029008140010301001A44081029008140018301001AC408102900814001C326 -:2002300001001B0408102900808000C4000B883A8400020410C000031080004428CBC83A96 -:20023800143FFC1E29401C4429403FCC01001B4408102900000B883A010003C40810290085 -:20024000014000C4010033840810290000800044000001060005883ADFC00117DC00001764 -:20024800DEC00204F800283ADEFFFD04DC000015000B883A2021883A010003C4DFC002157B -:20025000DC40011508102900044030448809883A0810274084003FCC800AC03A10803F8C23 -:200258008809883A114AB03A08102900014000C401003184DFC00217DC400117DC00001713 -:20026000DEC0030408102901DEFFF904DCC00315DC800215DC4001152025883A2823883A50 -:20026800010001040140074404C020B49CE61C04DD000415DC000015DFC006153821883AEE -:20027000DD4005153029883A0810290098C0030381C0004C00BFFF441884703A39CF883ADE -:2002780011CEB03A99C00305988003171080008C10000226010000440810928001001C0426 -:200280009C0000C308102740108000CC8D4000CC00C00044100B883AA8C0052600C00084D3 -:20028800A8C0041E017FE004114AB03A00000106114010148080020C1000012629400814DD -:200290008080004C10000126294004148080008C10000126294002148400010C80000126D0 -:200298002940011429403FCC01001C0408102900A800131EA50000CC00800044A080082696 -:2002A00000800084A0800E1E88803FCC1080201C10BFE004100050160029883A00004F06A6 -:2002A80088803FCC1080201C10BFE0048D00100C10004A0E00BFE8041528B03A0000470674 -:2002B0000029883A0021883A01001C84081027401080070CA420B03A140AB03A29403FCC73 -:2002B80001001C8408102900988003171080008C100002260140004400000106000B883A65 -:2002C0000100300408102900014005440100010408102900014004040100184408102900F0 -:2002C80094803FCC008000849080081E01402204010018840810290001400404010018C452 -:2002D00008102900014021040000070601400604010018840810290001400404010018C40B -:2002D8000810290001400304010019040810290001000044081031C001000104081027404B -:2002E0001140074C010001040810290001001904081031C001000104081027401140054CC5 -:2002E80001000104081029000400190401000384081027401080040C1000321E0100004442 -:2002F000081031C080BFFFC41021883A10BFFFCC103FF61E00002B06053FE8048C400C0CAE -:2002F800008008048880081E018000C4D16000C401001CC408102B40014020B40180048470 -:20030000296170840000090600800C0488800B1E018000C4D16000C401001CC408102B40F1 -:20030800014020B4018004842961678401001D8408102B4004000084003FA3060080040425 -:200310008880081E018000C4D160000401001CC408102B40014020B40180048429616304B2 -:20031800003FF206018000C4D160000401001CC408102B40014020B40180048429616C0498 -:20032000003FEA06000B883A01000304081029000140100401000344081029000140004415 -:200328000100038408102900000B883A0100038408102900081033C000800044DFC00617CB -:20033000DD400517DD000417DCC00317DC800217DC400117DC000017DEC00704F800283A27 -:20033800DEFFFD04DC400115DC0000152823883A2021883A000B883A010003C4DFC0021549 -:200340000810290001001644081027408C403FCC10800BCC8800051E81403FCC280A91BA50 -:2003480029400414114AB03A00000106100B883A29403FCC01001644DFC00217DC40011730 -:20035000DC000017DEC0030408102901008020B410A3500410C03217D0A27F1518000526F6 -:2003580010C03517008040041880021E0005883AF800283A00BFCE04F800283ADEFFFD0403 -:20036000DC400115280F883A2823883A200B883AD1227F17DC000015DFC002153021883A15 -:20036800081716C010000B1E800D883A8463883A34400626308000031005C2721005D63A8E -:200370003180004430BFFFC5003FF9060005883A0000010600BFCDC4DFC00217DC4001177D -:20037800DC000017DEC00304F800283ADEFFFB04DC800315DC400215DC000115DFC0041546 -:2003800030803FCC2023883A2825883A3021883A100003268805883A8C89883A0000060610 -:20038800300A923AD1227F170816E600103FF92600BFCD84000010061100062610C000031E -:200390001807C2721807D63A1080004410FFFFC5003FF906800AD23A800C923AD1227F176F -:20039800280A943ADC800015880F883A0816EF401000012600BFCD44DFC00417DC800317F7 -:2003A000DC400217DC000117DEC00504F800283ADEFFF904DD400515DD000415DCC0031558 -:2003A800DC800215DC000015DFC00615DC4001152825883A3029883A3827883A0021883AB7 -:2003B0000005883A0540400484800E2E9423C83AAC40012E04404004980D883A880B883A85 -:2003B8008009883A0810D7C010000A1E800D003A880B883A9809883A0817328084004004DB -:2003C000003FF1061500021E0005883A0000010600BFCD04DFC00617DD400517DD00041767 -:2003C800DCC00317DC800217DC400117DC000017DEC00704F800283ADEFFFD04DC000115F0 -:2003D0002021883A010020B421262004DFC002150815CE8010803FCC1000091E00808004D3 -:2003D800010020B4D8800015000F883A000D883A800B883A212620040815F04010803FCC83 -:2003E000DFC00217DC000117DEC00304F800283A014020B4010020B429662E042126230439 -:2003E80008147381014020B4010020B4296645042126274408147381DEFFFB04DFC00415CD -:2003F000DC000015DCC003152021883ADC800215DC40011508107080000B883A0009883A00 -:2003F80084003FCC0810868080002B1E040020B4842633048140011701006734213F3004AD -:20040000081623C081000287014006841023883A08162F8000C020B418E6668410C5883A31 -:200408001140000B8809883A044020B408162F80814004031009883A8C66494408162F8051 -:20041000814003031009883A2940004408162F80810003838CC009C38C800983100B883A1C -:200418002100004408162F80980D883A900B883A1009883A0810488089000983DFC0041744 -:20042000DCC00317DC800217DC400117DC000017DEC0050408100F81DFC00417DCC00317AB -:20042800DC800217DC400117DC000017DEC00504F800283ADEFFFB04DC0001152021883A46 -:2004300001000044DFC00415DC800315DC4002150810928008106C80000B883A0009883A42 -:20043800081073C084003FCC800F003A000D883A000B883A010000440810988080000D1E45 -:20044000044020B48C663304048020B4888003C394A6494491C00583D8800015000D883A59 -:20044800000B883A0009883A081005C09080058388800B458009883A0810FB800009883A86 -:20045000DFC00417DC800317DC400217DC000117DEC0050408109281DEFFFD04DFC00215CD -:20045800DC400115DC00001521003FCC2000271ED0A2824300C0020410C01D2600C00404F8 -:2004600010C0062600C0010410C01C1E0009883A081507400100004400002E06040020B431 -:20046800842633048140011701006734213F3004081623C081000287014006841023883ABF -:2004700008162F8000C020B418E6668410C5883A1140000B8809883A08162F8000C072B42A -:2004780018F0DFC418800236010003C4000001060009883A08150740000015060009883A05 -:20048000081507400009883A00001206008020B410A6494410C00803044000841021883AE8 -:200488001C4002260009883A00000106010003C4081507408100080320803FCC8880042E61 -:20049000008001441109C83A21003FCC00000106010000C4DFC00217DC400117DC00001794 -:20049800DEC003040814A281DEFFF50400C020B4DFC00A15DF000915DDC00815DD80071508 -:2004A000DD400615DD000515DCC00415DC800315DC400215DC0001150089C40418C4380456 -:2004A80019800037054020B4AD4438043000020E10BFFFC4103FFA1E29403FCC21003FCC45 -:2004B000040020B40815500084263304102D883A808002C310000426AC4000378823D43A2C -:2004B8008C4000CC000001060023883A01000DC40814B10001000E041027883A0814B10028 -:2004C0001025883A108003CC1004923A01000E4414E6B03A9004D1BA1080004C808002456D -:2004C8000814B10001000E841029883A0814B100A8C00037010000848C403FCC89000E2634 -:2004D000010020B421263304210002C32000021E010063C424C0082E010000448900041E61 -:2004D8001827D4BA9CC1FFCC9927883A000005069480080C9000032698C032280540004466 -:2004E0000000020698C06428002B883A814002C3048020B4B1003FCC94A649442800131E69 -:2004E8002000212618002026D0E280030140008419003FCC2100201C213FE0042900070E32 -:2004F00000C020B40100004418E63304D0228005190002C5044001040000160618C0004406 -:2004F800D0E280050023883A000012062000012618000D1ED1228003017FFF0421803FCC81 -:200500003180201C31BFE0043140040ED0228005800002C50440010400000506213FFFC462 -:20050800D122800500000106D02280050023883A18008726108003CC1004923A80C000179D -:200510001528B03A19000044008020B410A6330424C007369900004420C0053610C0011705 -:20051800A0C0031E10C00203A8803FCC18800226D022864500000C06D0E28643008000446C -:2005200019003FCC208008261887883AD0E2864518C03FCC1880041E88803FCC00C00084F7 -:2005280010C0012E1823883A91400303808008C3010020B400C020B42126494418E63304A3 -:200530002880281E21400343188009032880251E21400383188009432880221E214003C3AD -:200538001880098328801F1E21400403188009C328801C1E214001C3188007832880191EC6 -:2005400021400203188007C32880161E21400243188008032880131E21400283188008430C -:200548002880101E210002C31880088320800D1E9140064381000C0300C020B4008020B457 -:2005500018E6494410A633042900061E1940068311000C432900031E18C0090310800EC3F5 -:200558001880042688803FCC00C0008410C0012E1823883A90C005C380800B8318800F26FB -:20056000008020B410A63304110002870140068408162F8000C020B418E6670410C5883A74 -:2005680010C0000B008083441880041E88803FCC00C0008410C0012E1823883AD0A2874308 -:200570001000202685C0028701400684058020B4B809883A08162F80B5A663048700040383 -:20057800B085883A1140038BE009883A08162F80173FFFCC80800C03A0FFFFCC10000A263B -:2005800001400684B809883AD8C0001508162F80B085883A1180060BD8C00017300CD07AC5 -:200588003180004C00000106000D883A180B883AE009883A0814DA8088803FCC1000011E38 -:200590000440004484C00015850001158540020591400003810005C300C020B4008020B4FE -:2005980018E6494410A6330429001E1E194000431100060329001B1E194000831100064318 -:2005A0002900181E194000C3110006832900151E19400103110006C32900121E194001439D -:2005A8001100070329000F1E1940048311000A4329000C1E194004C311000A832900091E23 -:2005B0001940050311000AC32900061E18C0044310800A031880031E90C0094380800F037C -:2005B8001880032688803FCC1000011E044000449100060380800BC304C020B49CE63304DF -:2005C0002080062699400403081518C09880044588803FCC1000011E0440004491000703B4 -:2005C80080800CC320800126081520C09100074380800D03208001260814D0409100078387 -:2005D00080800D43208001260814D1009100084380800E032080071E008020B410A64944BE -:2005D80010C00883008020B410A6330410800E4318800226914008830814CD00910006C327 -:2005E00080800C83208006260140060408162F80010020B4212090042089883A0814F5C0A2 -:2005E8009100080380800DC32080012608111580910007C380800D832080012608150BC078 -:2005F000014020B4010020B4018001C429664304212653840816320010000326010020B469 -:2005F800212653840814D1C090C0098380800F431880071E008020B410A6494410C009C3FA -:20060000008020B410A6330410800F8318800226910005430810FB80D0A287831000092690 -:2006080091000A0380800FC320C03FCC18800526213FFD0421003FCC2100201C213FE00486 -:2006100008145600014020B4010020B401800C4429664944212638C4081635008805883A9C -:20061800D0228745DFC00A17DF000917DDC00817DD800717DD400617DD000517DCC0041724 -:20062000DC800317DC400217DC000117DEC00B04F800283ADEFFF004DC000615040020B474 -:2006280084263304DF000E158700028701400684DDC00D15E009883ADD800C15DD400B15CF -:20063000DCC00915DFC00F15DD000A15DC800815DC40071508162F80058020B480C005C352 -:20063800B5A66304B085883A0100008485C00403114005031540030B14C004C31900031E87 -:20064000848006039480004400000E060100004419000B1E10C0060B1906703A8100030369 -:200648001800032620000626048000C40000050620000326148005C39480011800000106D9 -:200650000025883A80C0050B008020B40102000410A6330419001B2620C00D360100080481 -:2006580019001A2620C003360080040418801526000031060100400419001926010080045C -:2006600019002D1E10800A030440010400001606010800041900162620C00536010400048E -:200668001900251E10800A030440014400000E0601100004190013260120001419001626EB -:2006700000001D060440010400001E0614400A03008000C41463C83A8C63883A00001906EC -:20067800044000C40000170688A3C83A00001506108008831000101EAD7FFA049CC003040F -:2006800000000D061080088310000D1EAD7FFA049CC0030400000A0610C00A03108008835C -:200688000440018488E3C83A1000061EAD7FFA049CC0030400000306B823883A00000106AE -:2006900004400144D0E28243008002041880011E294B883A80C0048328BFFFCC193FFFCC3B -:200698002080022E28C7C83A0000010600C0004489803FCCBDC03FCCB985C83AE009883AEF -:2006A00001400684D9800515D8C00415D880001508162F80B085883A1240028BD90000174B -:2006A800480B883ADA40021508162F801028D7FA81000A4389403FCCA085883A1029D07A0A -:2006B00008162F80D8C00417A08F883AE009883A014006841C7FFFCCD9C0031508162F805F -:2006B800B085883A12800483D94000178A89883ADA80011508162F8087000343A087883A1A -:2006C000DA800117E02897BA87000883500B883AB809883AE20000584010977AD8C0041551 -:2006C800DA00011508162F80DA400217B809883A10807FCC480B883A103892FA08162F800E -:2006D0001081FFCC1504B03A880B883AB809883AE0B8B03A08162F8010803FCC1004953A06 -:2006D800DA000117E0B8B03A008020B4E238B03A108434041700003580800443D980051762 -:2006E000D9C003171008937A80800403300C943A380E94FA100492BAD8C004172084B03A9C -:2006E800118CB03A31CCB03A1D3FFFCC008020B4350CB03A108430041180003580C003030A -:2006F00080800703810002871806977A100496BA014006841886B03A80800A831004953A80 -:2006F80018A2B03A08162F80B085883A108005431004947A8886B03A900496FA18A4B03ABE -:20070000A8BFFFCC90A4B03A98BFFFCC100492FA90A4B03A008020B410842C0414800035C8 -:2007080080800F03100693BA80800AC3100492BA1884B03A80C006C310C4B03A80C0068319 -:200710001806927A10C6B03A808006431004913A1884B03A00C020B418C4280418800035C8 -:20071800DFC00F17DF000E17DDC00D17DD800C17DD400B17DD000A17DCC00917DC80081743 -:20072000DC400717DC000617DEC01004F800283ADEFFF404DC000315040020B484263304F8 -:20072800DC4004158440011700800044DFC00B15DDC00A15DD800915DD400815DD000715B3 -:20073000DCC00615DC800515D0A286458800162684C000179800142601006734880B883A5D -:20073800213F3004081623C01025883A8080020301283BF4980B883A212EC0041000042606 -:20074000081623C0880B883A1009883A00000306081623C0880B883A1089883A081623C0AD -:200748001023883A000002060445DC04048F550401000EC40814B10001000F041027883AD2 -:200750000814B1008080058300C0207418DDD2041085883A1085883A1885883A11C0001720 -:200758008080020380C000171000021E00801A440000010600801C0401802074010020B486 -:20076000D8C00015319D8A040140044421262744D880011508163780014019048809883A41 -:20076800081623C00140FA049009883A1029883A081623C0014019048809883A102B883A2C -:2007700008162A000140FA049009883AD8800215DD00011508162A00014002841009883A3B -:20077800081623C001802074010020B4D8800015A80F883A319D8C04014004442126450419 -:2007800008163780D0A28D831000011E0810FA4081000017D1E2870381400203A00D883A77 -:20078800044020B40815570011003FCC2100201C213FE00400FFFFC48C66330420C0011E1E -:2007900000800104888002858480028301400684054020B4D4A2810594803FCC9480201C5D -:2007980094BFE0049009883A08162F80AD666304A885883AD0E28703144005838580040355 -:2007A0008500011788E2703AD462824515C0038BB1403FCC9CC03FCCB93FFFCC08162F8035 -:2007A8009809883A100B883A08162F80A00B883A1009883A081623C0B1003FCCB80B883A9A -:2007B0001027883A08162F8015BFFFCC80800C038C403FCCA53FFFCC100008260140068426 -:2007B8009009883A08162F80A885883A11C0060B380ED07A39C0004C00000106000F883A7B -:2007C0009CC03FCCA00D883AB00B883A8809883ADCC0001508152D4081000DC30811158039 -:2007C80081000BC381400403081518C0808004450811894080800B03810003831000051E92 -:2007D000008020B410A63304114003C3290B003A00000106000B883A0810CE0080C00E83B8 -:2007D800008020B410A6330481000B0318000B26DFC00B17DDC00A17DD800917DD400817B0 -:2007E000DD000717DCC00617DC800517DC400417DC000317DEC00C0408110B412000061E49 -:2007E80011C00B43108003C3000D883A000B883AD8800015081005C0DFC00B17DDC00A1717 -:2007F000DD800917DD400817DD000717DCC00617DC800517DC400417DC000317DEC00C0429 -:2007F800F800283AD12281C3DEFFFE04DC000015DFC0011508141F001021883A1000141E5B -:20080000008020B410A64944D0E281C310800C0301000284D0E2858511403FCC29000126BD -:20080800D0A28205D0A285C310000226D0A28203000001060005883A010020B421262B8455 -:200810002085883A010003C410C00005081402808005883ADFC00117DC000017DEC0020491 -:20081800F800283AD12281C3DEFFFE04DC000015DFC00115081402801021883A10000F1EDC -:20082000D0E281C3D0A285C3D0E2858510000426008020B410A633041080058300000106B2 -:200828000005883A010020B421262B842085883A010003C410C00005081402808005883A35 -:20083000DFC00117DC000017DEC00204F800283ADEFFFD04DC000015D4228103DC40011585 -:2008380001400684D422860584003FCC8009883A044020B4DFC002158C66630408162F8086 -:200840008885883A10C0038B014006848009883AD0E2850D10C00503D0E2880D10C004839B -:20084800D0E2808D10C0028BD0E2840D10C00543D0E2828D108004C3D0A2868D08162F80AF -:200850008885883A1080030BD0A2838DDFC00217DC400117DC000017DEC00304F800283ABB -:20085800DEFFFA04008020B4DD000415DCC00315DC800215DC400115DC000015DFC0051558 -:2008600010A6330410C002C3040020B42029883AD462860384266304D4E2808BD4A2868BFB -:20086800180021261080028714401F1E8809883A0140068408162F808085883A1100038B16 -:20087000D0E2850B20C0161E11000503D0E2880B20C0131E1100048398C03FCC20C0101E9A -:200878001100028BD0E2840B20C00D1E11000543D0E2828B20C00A1E10C004C390803FCCA4 -:200880001880071E014006848809883A08162F808085883A10C0030BD0A2838B18800226CB -:2008880000800044D0A287458809883A0140068408162F80D0E2850B8085883A8809883A07 -:2008900010C0038DD0E2880B14C004850140068410C00505D0E2840B10C0028DD0E2828B42 -:20089800148004C510C0054508162F80D0E2838B01802074010020B48085883AA1FFFFCC20 -:2008A000319EC1040140044421262E0410C0030DDFC00517DD000417DCC00317DC800217E4 -:2008A800DC400117DC000017DEC0060408163781DEFFFE04DC000015040020B4DFC001152E -:2008B00084044004008004448080003580000035008020B41084340410000035008020B4F1 -:2008B80010842C04100000350109C4040816CD0000807444D0A2830D0080744480800035B3 -:2008C000010000F4210350040816CD00018001B401406734010020B43186A004297F3004A2 -:2008C80021041804081739C00814650008149B0010002C260009883A0814B10000C03FC4C2 -:2008D00010C02A2608151080010000840810274010803FCC00C004C410C0261E0810364072 -:2008D800081459801000022600800044D0A287850810D4C01021883A1000201E0812B28058 -:2008E00001402074010020B401800C44295DDD04212638C40816350001402074010020B4D6 -:2008E80001800D84295E41842126558408163500010003C408141F00D122858308141F00E6 -:2008F000008020B410843C0410800037108000AC1000011E0812B7800009883A08110B400E -:2008F80000000706043FFF8400000506043FFF4400000306043FFF0400000106043FFFC420 -:200900008005883ADFC00117DC000017DEC00204F800283AD0A2814300E00004DEFFF104FC -:200908001080004410803FCC1008933AD0A2830BDC000515040020B410C4B03A2084B03A61 -:20091000D0A2830DDFC00E15DF000D15DDC00C15DD800B15DD400A15DD000915DCC00815D7 -:20091800DC800715DC400615D900030D10BFFFCC840440048080003501802074010020B4A2 -:20092000319D92040140044421262E04081637800810F900054020B404C020B4058020B461 -:2009280005C020B400800044AD443C049CE65584B5A62E04BDC42404AC4000378C7FFFCC97 -:200930001000611E8800602698C0058BD0A2830B88C0551E00F3FFC41884703AD0A2830D69 -:2009380010BFFFCC80800035B00000050810F900010001B42106A0040816CD00D0A2830B9E -:20094000D8C0030B1090001410C4B03AD0A2830D10BFFFCC808000350100FA0408160E0083 -:2009480007000044081611C01700021EBC800037903FFC0E081613C090BFFFC410BFFFCC35 -:2009500000FFFF541880072E01802074010020B4319D95040140044421262E040816378040 -:2009580000002F069038D43A953FFFCC0083FFC4E703FFCC01401904A009883AE0800F1E84 -:20096000081623C0A009883A01401904173FFFCC08162A0010BFFFCC01802074010020B4C0 -:20096800D8800015E00F883A319D97040140044421262E040816378000001906081623C0F1 -:2009700011FFFFCC01401904E009883AD9C0041508162A0010BFFFCC01401904E009883AE6 -:20097800D8800215081623C010BFFFCC01401904A009883AD880011508162A00D9C0041722 -:2009800010BFFFCC01802074010020B4D8800015319D9A040140044421262E040816378023 -:200988000810F9000000020698C0060B88C00A26D0E2830B00AFFFC41884703AD0A2830D5B -:2009900010BFFFCC808000350109C4040816CD008805883A003F98061083FFCCD0A2830D2F -:20099800808000350005883ADFC00E17DF000D17DDC00C17DD800B17DD400A17DD00091702 -:2009A000DCC00817DC800717DC400617DC000517DEC00F04F800283ADEFFFF04DFC0001532 -:2009A8000811C9000814C840008020B410A6494411000543DFC00017DEC0010408110B417B -:2009B000DEFFF404DFC00B15DF000A15DDC00915DD800815DD400715DD000615DCC0051579 -:2009B800DC800415DC400315DC00021508122B0010001E160080144401802074010020B438 -:2009C000000F883A319D9F040140044421262744D88000150816378001402074010020B4AE -:2009C80001800444295DAB0421264504081635000810FA400100023421284804054020B4F7 -:2009D000040020B40500207404C020B40816CD000025883A0023883AAD443C048426330435 -:2009D800A51DD2049CE6494400003C0601802074010020B4100F883A319DA404014004444C -:2009E000212627440816378001402074010020B401800444295ED0042126450408164900AB -:2009E8000810FA40003FFF06113FFF8421003FCC014000C42900322ED1228A0311003026E5 -:2009F000D0A28A05D0A28917D0E2891510000126D0228C150812D200102F883AD0A28D834B -:2009F800100002260009883A0813B680D0A2820381000583058020B410C03FCCB5A63304C5 -:200A000020C0211E98C00543B0800B0318800B26000F883A000D883A000B883A0009883AD8 -:200A0800D8000015081005C09900054308110B40988005438000011580800B05008020B465 -:200A100010A649441080054310007826B08005831000821E01004B040816CD00A8800037FB -:200A180010FFFFCCD0E28B150086303A1004D63A18C000ECD0E28C15D0A28D05103FCA1E2C -:200A2000D0228B15003FCE06010003C4D1228705070000C4E0C0062E0100014420C0062ED1 -:200A28000440008407000044880B883A00000506014000440000020607000084000B883A56 -:200A30000023883A10BFFFC410803FCC0100020420801836100490BA01002074210A3B0442 -:200A38001105883A108000171000683A00812930008129100081291800812918008129109B -:200A4000008129200081293000812910008129180480008400000706048000C4000005060E -:200A480000800404D0A2870504800044000001060025883AD0A285C310000B26008020B403 -:200A500010A62B8410C7883A18800003D0E2858311003FCC20C00426D9400115D0A2858562 -:200A580008141F00D9400117D0A2820329003FCCB1400DC3B0800585B00002C528803FCC42 -:200A600000C000441880042E00800144114BC83A29403FCC00000106014000C40814A94000 -:200A68000814BF8008107080D0A2878310000226E1003FCC0814520091403FCC89003FCC8D -:200A700008153C00B0800583010020B4018004441085883A1085883AA085883A11400017BA -:200A780021262744B00001150816490001402074010020B401800444295DA804212645044A -:200A800008164900D0A28D831000011E0810FA40D0E281830080028418BF7A1EB83F79262B -:200A8800010003C408140280003F760699C00583B0800B4338BF8526808003C3000D883A97 -:200A9000000B883AD88000150009883A081005C09880058380800B45003F7C0691403FCCD7 -:200A980089003FCC0811268010803FCC00C0008410C0252600C0010410C0032600C000442F -:200AA00010FF741E00002406808002C310000926D0A2830B00C020B418C44004108000948F -:200AA800D0A2830D10BFFFCC1880003508126980003F6806800001150814BF80808005839C -:200AB000010020B4018004441085883A1085883AA085883A11400017212627440816490072 -:200AB80001402074010020B401800444295DA8042126450408164900D0A28D83103F551E3E -:200AC0000810FA40003F5306808002C3103F51260811C900003F4F06808002C3103F4D26A4 -:200AC80008118940003F4B0601402074010020B4DEFFFF0401800C44295DDD042126494406 -:200AD000DFC0001508163500014020B4010020B40180BC8429609C0421266304081635002A -:200AD80000800044D0A287450005883ADFC00017DEC00104F800283ADEFFF804DD000415B3 -:200AE000DCC00315DC80021505002074048020B404C020B4DD800615DC000015DFC0071522 -:200AE800DD400515DC400115002D883A0021883AA51E4F0494843C049CE655840140207415 -:200AF000010020B401800444295DEA0421262304081649008405883A1085883AA085883A76 -:200AF80011400017010020B40180044421262E04081649000810F9000023883A0540008439 -:200B00009080003710BFFFCCD0A28B1590C0003700C6303A18C000ECD0E28C1510001A26C4 -:200B0800B08019268407883A98C7883A88000A1E01402074010020B401800444295DEC0457 -:200B1000212623041880000D081649000810F9000440004400000C0618C0000B10C00926BE -:200B180001402074010020B401800444295DEE0421262304081649000810F9000023883A07 -:200B20000000010604400084D0A2891710000F1ED0E28C170080007418800C1E8000091EE5 -:200B280001402074010020B401800D84295E4184212655840816350004400084040006C49C -:200B300000000206843FFF8404400084D0A28C17D5A28B17D0A289158D4003260109C40489 -:200B38000816CD00003FC6068400004400800684143FB20E010003C4DFC00717DD800617C3 -:200B4000DD400517DD000417DCC00317DC800217DC400117DC000017DEC0080408140281C9 -:200B4800DEFFED04D8800BC4D8800315008020B410A64C4410C00044D8C0051501402074F3 -:200B500010C00084D8800415D8C00615018001C410C000C4295E3FC410800104D9000A042D -:200B5800DFC01215DD401115DD001015DCC00F15DC800E15DC400D15DC000C15D8000BC550 -:200B6000D8C00715D8C00815D880091508163500D1228B17014020B40005883A296655846A -:200B6800018006841087883A1947883A18C0000B044020B48C6655841900032611812926FE -:200B700010800044003FF70600C0068418812036100490BA00C0207418CB7A0410C5883A72 -:200B7800108000171000683A0081324800812E6400812E7400812E5400812E6C00812E7C8A -:200B800000812E5C0081325000812E8400812E8C00812E940081325000813250008132508D -:200B880000813250008132500081325000812EC000812F9000812FA000812FCC0081301800 -:200B900000812FF800813044008131DC0081320400813154008000840000FE06008000C411 -:200B98000000FC06008001040000FA06008001440000F806008001840000F606008001C4AD -:200BA0000000F406008002040000F206008002440000F006D0A28D831007003AD0E28D856A -:200BA800D0E28583D0E281C51000031E010000440813B6800000E6060810FA400000E4068C -:200BB000008020B41084380414000037D4A28583044020B48C66330489000287014006841A -:200BB80008162F8000C020B418E663041885883A01802074010020B4D8800015900F883A40 -:200BC000319DF204014004442126230408163780888002C310001C2680C2000C8081FFCC4C -:200BC800180EC03A1080004411C4983A11CF883A1800022600801A440000010600801C040B -:200BD0008020D43A840000CC8000021E00C008040000010600C00A84010020B42104200428 -:200BD8002100003701802074D9000215010020B4D8C00115D8800015319DF5040140044460 -:200BE00021262E04081637800810F9000000B006D0A2830B1080041CD0A2830D0000AC067C -:200BE80000C020B418E64944188000030140004411003FCC290002361145883A0000010612 -:200BF0000005883A188000050000A10600C020B418E64944188000430140004411003FCC3F -:200BF800290002361145883A000001060005883A1880004500009606008020B410A6494486 -:200C000010C0010319003FCC2000012618FFFFC410C0010500008E0600C020B418E6494432 -:200C0800188001030140038411003FCC290002361080004400000106008003C4188001052B -:200C10000000830601402074010020B401800444295DF9042126230408164900014020749B -:200C1800010020B401800444295DFD0421262E0408164900048020B4050020B4054020B46D -:200C20000810F90094843C0404C006C4A5266304AD663304908000370021883A10BFFFCC7D -:200C28008407883A1C47883A18C0000B10C002268400004484FFFA1EA900028701400684FF -:200C300008162F80A085883A108005C300C0014418803F3600C001041C001916D9000A048F -:200C38002087883A18C000031C07D83A18C0004C180007261085883A1085883AD8C003046D -:200C40001885883A10800017140000050000300601802074010020B481C00044319E0004FD -:200C48000140044421262E04081637800810F90001000234212848040816CD0000002406C3 -:200C500000800304808022260109C4040816CD00003FD00601402074010020B40180044470 -:200C5800295E0404212623040816490001402074010020B401800444295E080421262E0499 -:200C600008164900040020B40810F90084043C04048006C404C002440500030480800037C1 -:200C68000009883A10BFFFCC2107883A1C47883A18C0000B10C01D1E99001F160140028475 -:200C70002100004408161C80D0A281C50811FE400810FA40D0228D8500001D0600C020B429 -:200C780018E64944188006030140078411003FCC290002361080004400000A060005883A3C -:200C80000000080600C020B418E649441880060311003FCC2000022610BFFFC40000010689 -:200C8800008007C418800605000009062100004424BFDD1E00000106253FE5260109C404C4 -:200C90000816CD00003FD506008000440000010600800284D0E2830B18C0401CD0E2830DB8 -:200C98000000010600800284D0E28C171900006C20000926008020B410A6330410800583AD -:200CA0000100024411403FCC2900022610800044000001060080004418C000AC18000A26D5 -:200CA800010020B42126494420C000030180004419403FCC314002361987883A0000010665 -:200CB0000007883A20C0000510C03FCC0100028419000326D0A2820500800044000001060E -:200CB8000005883AD122830B00FFFCC420C8703AD0E28D83D122830D1800051ED0E284834A -:200CC00018C7883A18C7883A20C6B03AD0E2830DD122830B00C020B418C44004190000353D -:200CC800DFC01217DD401117DD001017DCC00F17DC800E17DC400D17DC000C17DEC01304C4 -:200CD000F800283ADEFF6B04D9000304DC008C15DFC09415DDC09315DD809215DD409115AD -:200CD800DD009015DCC08F15DC808E15DC408D150810F3801021883A081608808000641E57 -:200CE00001800104D9400304D9008304081649000140207401800104295E9704D9008304AA -:200CE8000816430010002D1ED8800403DCC08484D9400484D8808405D88004430180020485 -:200CF0009809883AD880844508164900D880068BD8008645D8808B0DD880070BD8808B8DA3 -:200CF800D9408B17280BC232D880078BD9408715D8808B0DD880080BD8808B8DD8808B1796 -:200D00001005C232D8808815D880088BD8808B0DD880090BD8808B8DD8808B171005C2321B -:200D0800D8808915D8808217D8808B151005C232D8808A1500C0788428BFF98418800936F5 -:200D100001800044D900030408173280D8C08A1710C006260400198400002D060400190423 -:200D180000002B06040019440000290601802074010020B4319E99040140044421262304AD -:200D200008163780D9C0881701802074010020B4319E9D040140044421262E040816378075 -:200D28000810F900DD008817DD8089170023883A0005883A05C080048D00132EA465C83A53 -:200D3000BC80012E048080048D408004A80CD27A010020B4DC800015000F883AD9400304A8 -:200D3800212620040815F04014003FCC8000081E880D003A900B883AD90003040817328041 -:200D4000A823883A003FEC06B080761E00000206048000C400004906D8808487D9C08403EF -:200D4800D8C084431000C82600802074109E330401802074010020B4D8C00015319EA0042B -:200D50000140044421262304DCC00215D88001150816378001402074010020B40180044423 -:200D5800295EB60421262E0408163500044020B4040020B40810F9008C443C0484265584DA -:200D60008880003780C0000B10BFFFCC10C0B11E0814BF80D0A2830B00C020B418C44004A1 -:200D680010800094D0A2830D10BFFFCC188000350109C4040816CD0001402074010020B477 -:200D700001800444295EA3042126230408164900048000C401402074010020B401800444DC -:200D7800295EA60421262E04081649000810F9000027883A0580800405004004DC40881743 -:200D80009C406E2E8CE3C83AB440012E044080049D408004A80DD27A010020B4DC40001517 -:200D8800000F883AD9400304212620040815F04010803FCC10004E2600A1C83A081608803A -:200D9000008000448080362614000F1600BFCD4480802D261400051600BFCD0480802D1EBD -:200D980001402074295E900400002F0600BFCD848080222600BFCDC48080261E0140207455 -:200DA000295E8404000028060080198480801226140007160080190480800C2600801944C4 -:200DA80080801C1E01402074295E720400001E06008019C480800D2600801A048080151E9A -:200DB00001402074295E7F040000170601402074295E6E040000140601402074295E760469 -:200DB8000000110608160880048000C401402074040019C4295E7A0400000B060140207475 -:200DC000295E88040000080601402074295E8C040000050601402074295E950400000206FE -:200DC80001402074295E6A04010020B421262E0401800444081649000810F900010003F4BA -:200DD000211090040816CD0080004A0E9000492601802074010020B4319EB2040140044484 -:200DD800212623040816378094BFFFC4003F99069827D23A880B883AA440012E014040040C -:200DE000980D883AD90003040810DEC01021883A103FAA1EA4400236A827883A003F970663 -:200DE80099800044897FC004D90043040810DEC01021883A103FF826003FA00601402074D2 -:200DF000010020B401800444295EAA04212623040816490001402074010020B401800444C8 -:200DF800295EA60421262E04081649000810F900D9808917D9408817D9C003040009883A9D -:200E00000810E9001021883A103F8C1E0816088001402074010020B401800444295EBB0486 -:200E0800212623040816350001402074010020B401800444295EAE0421262E04081649007D -:200E10000810F900003FFF0600802074109ED004003F370680C0008B10C003260109C404C5 -:200E18000816CD00003F4606048000C404001A04003F720600BFFFC4DFC09417DDC0931710 -:200E2000DD809217DD409117DD009017DCC08F17DC808E17DC408D17DC008C17DEC09504AA -:200E2800F800283A21C03FCC01802074010020B4319EC0040140044421262E04081637810F -:200E3000DEFFFF040141194421003FCCDFC0001508162F80014019041009883A08161440CB -:200E380001802074010020B4100F883A319EC2040140044421262E04DFC00017DEC00104DF -:200E40000816378121C03FCC01802074010020B4319EC4040140044421262E040816378177 -:200E4800014003F4DEFFFC042950900421003FCCDFC00315DC400215DC00011508162F8093 -:200E5000014018F4294BA8041009883A1021883A081623C08009883A014659041023883A62 -:200E5800081623C00140FA041009883A08162A00014002841009883A081623C0018020745F -:200E6000010020B4D8800015880F883A319EC7040140044421262E0408163780DFC00317AD -:200E6800DC400217DC000117DEC00404F800283ADEFFFF04014119C421003FCCDFC0001562 -:200E700008162F80014019041009883A0816144001802074010020B4100F883A319ECA0482 -:200E78000140044421262E04DFC00017DEC001040816378121C03FCC01802074010020B453 -:200E8000319ECC040140044421262E0408163781DEFFFF0401409C4421003FCCDFC00015FA -:200E880008162F80014019041009883A0816144001802074010020B4100F883A319ECF0465 -:200E90000140044421262E04DFC00017DEC001040816378121003FCCDEFFFF0401409C44E4 -:200E980021000044DFC0001508162F80014019041009883A0816144001802074010020B4BF -:200EA000100F883A319ECF040140044421262E04DFC00017DEC001040816378121003FCC52 -:200EA8002100201C213FE00421FFFD0401802074010020B4319ED1040140044421262E04D8 -:200EB00008163781DEFFFF040140068421003FCCDFC0001508162F80014020B429666304E9 -:200EB800010020B401800444288B883A21262E04DFC00017DEC001040816490121003FCCA1 -:200EC0002109883A008020B410A088042109883A1109883A21400017010020B401800444B8 -:200EC80021262E040816490121003FCC00800284208007262109883A008020B42109883AFE -:200ED00010A30D041109883A214000170000020601402074295ED304010020B40180044411 -:200ED80021262E0408164901D0A28B17DEFFF70401C020B4DFC00815DDC00715DD800615AB -:200EE000DD400515DD000415DCC00315DC800215DC400115DC00001500C002C439E65584FD -:200EE8000180044418CB883A29CB883A2940000B2880041E21003FCC1827883A2000051E18 -:200EF0000000030618C0004419BFF61E0001080610010A26D5228D43040020B484217504C4 -:200EF800A5C03FCCB82290FA014005048445883A148001031580001795403FCCA809883A9A -:200F000008162F80B0C00117993FFD0421003FCC1885883A00C00104180B883A19002836F7 -:200F0800200890BA00C0207418CF0E0420C9883A20C000171800683A00813C8000813C4C68 -:200F100000813C6400813D6400813D64A800011EB480000394BFFFC48461883A8480010597 -:200F180000008A06B14000038461883AA90000448400010408161C808080000500008306D0 -:200F2000B8000326A53FFFC4D5228D4500007F06D0228D85DFC00817DDC00717DD800617E4 -:200F2800DD400517DD000417DCC00317DC800217DC400117DC000017DEC009040810FA4128 -:200F300011000103014000C42140062620C06F1E1080021704000044103EE83A1023883A37 -:200F380000006C061080041710000126103EE83AD4E28D43014005049C403FCC8C800044CE -:200F4000882290FA902490FA8445883A154000171100010384AD883AAD00011708162F808E -:200F4800B0C00017A085883A1080021718800126B000010584A5883A8461883A81000103E6 -:200F5000AC4001170140050408162F808885883A108002179CC00044D4E28D4590800015A1 -:200F580000004A0610C0010328C04836180690BA01002074210F61041907883A18C000178C -:200F60001800683A00813D9800813D9800813E0000813E4000813E4011C0021798C03FCC01 -:200F6800020003C4114003031100034339800003108003831A00081E20C03FCC32003FCCB8 -:200F70001A00022E30BFFFC400000B0629403FCC2800091E0000070610C03FCC32003FCC6C -:200F780040C0022E308000440000030629403FCC280001262005883A38800005000023069C -:200F8000110002179CC03FCC014003C420C0000B9940051E1080030B197FFFCC1140062E4B -:200F880018FFFFC4000004061080038B197FFFCC2880012E18C0004420C0000D00001306EB -:200F900011400317290000172800102698C03FCC018003C4208000031980041E10C03FCC54 -:200F98001800092610BFFFC40000070628C0010311803FCC19403FCC3140022E10800044F2 -:200FA000000001061805883A208000050023883A0021883AD0A28D4300C020B418E1750496 -:200FA800100490FA014005041885883A1100010314C0001708162F801025883A98800117EE -:200FB000010020B4212623041485883A1140001701800444081649009880011701000104B5 -:200FB8001485883A10C0010320C03636180690BA01002074210FC1041907883A18C00017DB -:200FC0001800683A00813F1800813F4800813F5400813F9C00813F6410C0021711000417CE -:200FC8000180044418C0000318C5883A1085883A2085883A11400017010020B421262E0452 -:200FD0000816490000001F0610C002171080041700001A0610C00217108004171900000B09 -:200FD8000000170680000D268800032601C0207439DED7040000020601C0207439DED504E4 -:200FE00001802074010020B4319ED9040140044421262E040816378000000A0610800317CA -:200FE8001000041E008020B410A62E04100000050000040610C000171080021719000003B0 -:200FF000103EE83ADFC00817DDC00717DD800617DD400517DD000417DCC00317DC80021722 -:200FF800DC400117DC000017DEC009040810F90121003FCC203FA51E103FA41EDFC00817D8 -:20100000DDC00717DD800617DD400517DD000417DCC00317DC800217DC400117DC00001718 -:20100800DEC00904F800283A21003FCC008003C411006336009114B4DEFFB8041094D544F7 -:20101000D88000150080107410951044DC404115D8800115244002B000801444DCC0431594 -:20101800DC400285DFC04715DD804615DD404515DD004415DC804215DC004015D8000205F2 -:20102000D88002458C403FCC24C0040488001C1E014020B4008011040180028429662B849D -:20102800D9000344D88002C5D800030508163500D0A28203014020B401800D84D8800605B5 -:20103000D0A2818329665584D90006C4D8800645D0A285C3D88005C5D0A28483D880068544 -:2010380008163500980C923A01401444D809883A0810DEC01004C03A0085C83A0000320616 -:2010400000BFFC84014020B401800C44D88003452966494400800084D90003C4D98002C5EB -:20104800D8000305D880038508163500014020B49826923A0180300429666304D90010043E -:2010500008163500980D883A01404004D809883A04004004054020B40810DEC004803004CF -:2010580005008C84AD666304802D883A917FFFCC800D883AA94B883AD809883A08163500A4 -:2010600089803FCC800B883A84A5883AA421C83A34CD883AD809883A8029883A843FFFCCFE -:201068000810DEC08C40004480000326B43FEF2E04004004003FED060005883A00000206A0 -:2010700000BFFFC4F800283ADFC04717DD804617DD404517DD004417DCC04317DC80421771 -:20107800DC404117DC004017DEC04804F800283ADEFFB704DFC04815DDC04715DD80461528 -:20108000DD404515DD004415DCC04315DC804215DC404115DC00401521003FCC008003C4E6 -:201088001100022E047FFFC400007906240004048008943AD80D883A014040040810D7C0E5 -:20109000103FF81E014020B40180020429608B04D809883A081643001023883A1000691E97 -:20109800D88002031000691ED8C00243008014441880661ED88002831000032600C0004459 -:2010A00010C02C2600006206D8800303D8C002C31004923A10C4B03A00C0110410C05C1E2E -:2010A80001C020B4D8C003440005883A0180024439E62B84014002841900000322003FCC48 -:2010B0003200023611D1883A410000051080004418C00044117FF81ED880064300C002448F -:2010B800D0A2818511003FCC1900032ED880060311003FCC19000136D0A28205D88005C354 -:2010C000010020B401800D84D0A285C5008020B410A62B8410800003D94006C4212655841E -:2010C800D0A28585D8800683D0A284850816350000003706D8800317D8C002C311803FCC35 -:2010D000300C923A30CCB03A00C00C4430C0301E1004D23A00C0BC841025883A10BFFFCC13 -:2010D80010C02B1E010020B48020923AD94003C42126494405C020B4081635000027883A15 -:2010E000002D883A0540100405004004BDE66304A97FFFCCA14DC83A90BFFFCCB13FFFCC9D -:2010E800D94B883A11800F16B909883A08163500990000442027883A21003FCC2409883A74 -:2010F0002008923AA56BC83AD80D883A01404004ADAD883A94BFC0040810D7C0002B883ADF -:2010F800003FEB06100D883A008020B410A663041109883A0816350000800044D0A2874527 -:20110000000003060440004400000106044000848805883ADFC04817DDC04717DD8046176D -:20110800DD404517DD004417DCC04317DC804217DC404117DC004017DEC04904F800283A7F -:20111000DEFFFC04DC000015040020B484041804DC80021504801284DC400115900B883A59 -:201118002023883A000D883A8009883ADFC003150817410089403FCC8009883A000D883A93 -:201120000817474004400044900B883A8009883A880D883A08174100880B883A8009883A82 -:20112800DFC00317DC800217DC400117DC000017DEC0040408174481DEFFFC04DC000015FA -:20113000040020B484041804DC800215DC4001152025883A2823883A8009883A000D883A50 -:2011380001401284DFC003150817410091403FCC8009883A000D883A081747400180004448 -:2011400089403FCC8009883ADFC00317DC800217DC400117DC000017DEC0040408174741CE -:20114800DEFFFE040080004421003FCCDC0000151120983A01000184DFC0011584003FCCFA -:20115000800B883A08144B80800B883A010001C4DFC00117DC000017DEC0020408144B8102 -:20115800DEFFFE042109883ADC00001524003FCC800B883A01000044DFC0011508144B805E -:20116000800B883A01000084DFC00117DC000017DEC0020408144B81DEFFFF040100014441 -:20116800DFC000150814440000C0218410C0141E014024040100080408144B80000B883AC2 -:201170000100084408144B80000B883A0100088408144B80014000C4010008C408144B8031 -:20117800000B883A01000A0408144B8001400C0401001C4408144B80008000440000010630 -:201180000005883ADFC00017DEC00104F800283ADEFFFD04D9000005010020B4DC00011552 -:20118800018000442821883A21041804D80B883ADFC0021508174F00813FFFCC0816CD00F7 -:20119000DFC00217DC000117DEC00304F800283AD0E2830BDEFFFC0400BFE7C41884703AC7 -:20119800DC400115044020B4D0A2830DDFC00315DC800215DC00001510BFFFCC8C44400422 -:2011A00088800035040005048009883A0816CD00800B883A01000E0408146100800B883A85 -:2011A80001000E4408146100800B883A8009883A08146100800B883A01001C440814610017 -:2011B000800B883A0100178408146100800B883A01001B4408146100800B883A010003043A -:2011B800081461000480C804900B883A0100004408146100800B883A0100018408146100DB -:2011C000900B883A0100008408146100D0A2830B10801014D0A2830D10BFFFCC8880003523 -:2011C800DFC00317DC800217DC400117DC000017DEC00404F800283AD0E2830BDEFFFA0497 -:2011D00000BFE7C41884703ADC000015040020B4DC800215DC400115D0A2830DDFC0051526 -:2011D800DD000415DCC003152025883A2823883A10BFFFCC84044004808000350140C80491 -:2011E0000100004408146100D0A2830B10800814D0A2830D10BFFFCC808000350140040467 -:2011E8009009883A08164E401029883A10803FCC1000091E014020B49009883A01800444DA -:2011F00029608D0408164900910000030140050408146100000009060027883AA5003FCC5B -:2011F80094C5883A11000003014005049CC000440814610098803FCC153FF936D0E2830B5B -:2012000000BFF7C41884703AD0A2830D10BFFFCC8080003501400504010030040814610041 -:20120800D0A2830B10800814D0A2830D10BFFFCC80800035014004048809883A08164E4001 -:201210001027883A10803FCC1000091E014020B48809883A0180044429608D040816490041 -:20121800890000030140050408146100000009060025883A9CC03FCC8C85883A110000031F -:2012200001400504948000440814610090803FCC14FFF936D0A2830B10801014D0A2830D7C -:2012280010BFFFCC80800035DFC00517DD000417DCC00317DC800217DC400117DC000017D2 -:20123000DEC00604F800283ADEFFFB04DC000015040020B484041804DC80021504800B044D -:20123800DCC00315900B883A2027883A000D883A8009883ADFC00415DC4001150817410018 -:2012400004400044880D883A99403FCC8009883A08174740900B883A8009883A880D883ADB -:2012480008174100880B883A8009883ADFC00417DCC00317DC800217DC400117DC0000177A -:20125000DEC0050408174481DEFFFC04DC000015040020B484041804DC800215DC40011504 -:201258002025883A2823883A8009883A000D883A01400B04DFC003150817410091403FCC05 -:201260008009883A000D883A081747400180004489403FCC8009883ADFC00317DC8002179C -:20126800DC400117DC000017DEC0040408174741010020B4DEFFFD04000D883A000B883AA3 -:2012700021041804DFC00215DC400115DC00001508174740010002840816CD00040006041E -:2012780004400044800B883A8809883A08149480800B883A0100008408149480800B883AAF -:20128000010000C4081494808809883A08148C801405003ADFC00217DC400117DC000017AC -:20128800DEC00304F800283ADEFFFD04DC400115DC000015044000442021883A84003FCC2C -:201290008809883ADFC00215802090FA08148C8000FFF9C410C4703A80A0B03A84003FCC10 -:20129800800B883A8809883A08149480800B883A0100008408149480800B883A010000C452 -:2012A000DFC00217DC400117DC000017DEC0030408149481DEFFFD04DC4001152023883A64 -:2012A80001000044DC000015DFC00215043FF60408148C801420703A89003FCC008000845F -:2012B0002080021E84000054000003062008917A2080011480A0B03A84003FCC800B883AAF -:2012B8000100004408149480800B883A0100008408149480800B883A010000C4DFC00217D5 -:2012C000DC400117DC000017DEC0030408149481DEFFFB04DC000015040020B484041804C8 -:2012C800DC80021504801704DCC00315900B883A2027883A000D883A8009883ADFC0041508 -:2012D000DC4001150817410004400044880D883A99403FCC8009883A08174740900B883A5B -:2012D8008009883A880D883A08174100880B883A8009883ADFC00417DCC00317DC8002176F -:2012E000DC400117DC000017DEC0050408174481DEFFFC04DC000015040020B484041804F2 -:2012E800DC800215DC4001152025883A2823883A8009883A000D883A01401704DFC0031500 -:2012F0000817410091403FCC8009883A000D883A081747400180004489403FCC8009883AFE -:2012F800DFC00317DC800217DC400117DC000017DEC0040408174741DEFFFC04DC00001566 -:20130000040008848009883ADFC00315DC800215DC4001150814B100014004C40100058436 -:201308001023883A0489C4040814B9009009883A0816CD00014000C4010005C40814B900BC -:201310009009883A0816CD00017FE004894AB03A29403FCC8009883A0814B9000100FA04C3 -:201318000816CD0089401FCC8009883ADFC00317DC800217DC400117DC000017DEC00404D0 -:201320000814B901DEFFFE04DC0000150409C4048009883ADFC001150816CD0001400444BE -:20132800010005840814B9008009883A0816CD0001400084010005C40814B9008009883A61 -:20133000DFC00117DC000017DEC002040816CD01DEFFFE04DC0000152821883A21403FCC1C -:2013380001000484DFC001150814B90081403FCC010004C4DFC00117DC000017DEC002049F -:201340000814B90121403FCC01000F440814B90121403FCC010004440814B901DEFFFE04B7 -:20134800DFC00115DC000015208001832021883A010006C411403FCC280A913A288AB03AF8 -:2013500029403FCC0814B90081400183010007040814B900814000C3010002840814B9002E -:2013580081400103010002440814B90081400143010002040814B9008140000301000344A7 -:201360000814B90081400043010003040814B90081400083010002C4DFC00117DC00001702 -:20136800DEC002040814B901DEFFFB04DC400115DC0000152023883A2021883A01000104DE -:20137000DCC00315DC8002153027883A2825883ADFC004150814B100017FFE049CC03FCCA0 -:201378001144703A9800092680FFFFCC0101FFC420C006361140005429403FCC0100010445 -:201380000814B9008423883A0000030611403FCC010001040814B9008C7FFFCC880AD13A5C -:201388000100004429403FCC0814B900880A913A0100008429403C0C0814B90001006734B3 -:20139000917FFFCC213F3004081623C0880B883A1009883A08162F800140FA041009883AB6 -:20139800081623C000E327D41880092E00C0007418C45BC41880082E00C000B418C3D5C4A2 -:2013A0001885403A00C000C41885C83A000003060005883A000001060080004414003FCC39 -:2013A800D0A028041405883A1100000301400A0408162F808808D07A880B883A1109883A73 -:2013B00008161440100B883A00C001C410803FCC1880012E180B883A29403FCC800491BABF -:2013B800280A90FA010000C4288AB03A29403FCCDFC00417DCC00317DC800217DC4001176B -:2013C000DC000017DEC005040814B901DEFFFE04DC0000152021883A01000684DFC001158A -:2013C8000814B100017FFE8484003FCC00C000441144703A80C0021E108000940000010619 -:2013D0001080029411403FCC01000684DFC00117DC000017DEC002040814B9012140028BDE -:2013D800DEFFFE04DC000015280AD23A2021883A010012C4DFC001150814B900814002833D -:2013E000010012840814B9008140030B01001344280AD23A0814B900814003030100130468 -:2013E8000814B9008140038B010013C4280AD23A0814B90081400383010013840814B90022 -:2013F0008140010B01001444280AD23A0814B90081400103010014040814B9008140018BA4 -:2013F800010014C4280AD23A0814B90081400183010014840814B9008140020B010015440E -:20140000280AD23A0814B90081400203010015040814B9008140040B010015C4280AD23A1C -:201408000814B90081400403010015840814B9008140048B01001644280AD23A0814B900FA -:2014100081400483010016040814B9008140050B010016C4280AD23A0814B90081400503FC -:2014180001001684DFC00117DC000017DEC002040814B901DEFFFD04DC00001504000FC44F -:20142000DC4001152023883A8009883ADFC002150814B10000FFFC0410C4703A888AB03A2E -:2014280029403FCC8009883ADFC00217DC400117DC000017DEC003040814B901DEFFFD04AD -:20143000DC0000152021883ADC40011584003FCC044006848809883A802091BADFC0021525 -:201438000814B10010800FCC808AB03A29403FCC8809883ADFC00217DC400117DC000017C2 -:20144000DEC003040814B901DEFFFC04014020B4018001C429608D84D809883ADFC00315E5 -:20144800DC000215081635000814BF800009883A0814F0C004000044800B883A01000D4465 -:201450000814B900010020B4212090040814F5C00009883A08150BC0010001840814D040C7 -:20145800010011040814D100000B883A8009883A0814CD00D809883A0814D1C0DFC0031767 -:20146000DC000217DEC00404F800283ADEFFFB04DCC0031504C00104DC4001152023883AE7 -:201468009809883ADFC00415DC800215DC0000152825883A0814B100900B883A8809883A59 -:201470001021883A08162F80108007CC100A90FA840001CC9809883A2C0AB03A0814B900EC -:2014780091403FCC89003FCC08162F801004D17ADFC00417DCC00317DC800217DC4001179F -:20148000DC000017DEC00504F800283ADEFFFD04DC0000152021883ADC40011584003FCCC5 -:20148800044004048809883A802090FADFC002150814B100108001CC808AB03A29403FCC33 -:201490008809883ADFC00217DC400117DC000017DEC003040814B90121003FCC20001A2603 -:20149800DEFFFD04DC400115010009842823883A01402004DC000015DFC002153021883A6A -:2014A0000814B90089403FCC0080004428800426008002042880041E814016840000030639 -:2014A80081400244000001068140060429403FCC01000C44DFC00217DC400117DC000017A7 -:2014B000DEC0030400000206000B883A010009840814B901DEFFFA04DC4001152823883A24 -:2014B800D9400617DD000415DCC00315DC800215DC000015DFC0051524003FCC0080004424 -:2014C0003025883A3827883A2D003FCC808008260080020480800D1E29400C8429403FCC50 -:2014C800010001440814B9000140080400000C062940008429403FCC010001440814B9000E -:2014D000014001842809883A000006062940018429403FCC010001440814B9000140040471 -:2014D800010001840814B900A00D883A800B883A0100004408152580008004048080021E2E -:2014E000014003040000010601400204010008840814B90099803FCC917FFFCC893FFFCC62 -:2014E800DFC00517DD000417DCC00317DC800217DC400117DC000017DEC006040814DA81C0 -:2014F000DEFFFD0429BFFF84DC400115DC000015DFC0021531803FCC0080004424403FCCCB -:2014F8002C003FCC11800436008000848880071E8805883A000008068800061E8005003AD9 -:2015000000C000841885C83A000003060005883A0000010600800084880A913A8C47883A1B -:2015080010803FCC18C7883A100491BA28CAB03A214AB03A288AB03A29403FCC010006449C -:201510000814B900010004040814B10000FFFE0410C4703A00C000C4100B883A80C0011ED1 -:201518001140015429403FCC010004040814B9000080008488800D1E0080004414000B366B -:201520008080021E0140148400000106014014C4010003840814B9000100FA040816CD004B -:20152800010005040814B10000000B06014016C4010003840814B9000100FA040816CD0059 -:20153000010005040814B100008000C48080021E0140040400000106000B883A0100060438 -:201538000814B900000B883A01000D84DFC00217DC400117DC000017DEC003040814B90105 -:20154000DEFFFD04DC4001152023883A01000504DC000015DFC002152821883A0814B100ED -:201548008C403FCC00C0008488C00A1E81403FCC00C0004428C0031E1080240C108024208B -:20155000000006062800031E1080220C10802220000002061004D07A1080004CDFC002179C -:20155800DC400117DC000017DEC00304F800283ADEFFEC04DC400B15044020B48C66330403 -:2015600000800104D880060D8880078302400204020010044884983A0181000402880004D9 -:201568001244B03AD880068D888007C300C020B4DFC013154084983ADDC01115DD80101530 -:20157000D880070D88800803DD400F15DD000E153084983ADF001215DCC00D15D880078D65 -:2015780088800843DC800C15DC000A155084983AD800088518E66704D880080DD8800884C3 -:20158000D8800015888008C4D880011588800904D880021588800944D880031588800984BE -:20158800D8800415888009C4D880051588800B830029883A02C04004D88009050304000493 -:201590000382000403C080040340040407C02004054008040580010405C083441CC001C32E -:2015980001800144A021883A9C803FCC188001833480EC36900C90BA028020745295A30447 -:2015A000328D883A318000173000683A008156FC008156FC008156FC008156A4008156B88D -:2015A800008156FC01801004D980070D01810004D980078D000011061980000B35C00F1EFE -:2015B0001F3FFB43028000C4D9800903E280051E3000021E01BFFBC4000004060280008470 -:2015B800000005063000031E01BFFEC43084703A00000206028000443280CA2611C4703AE8 -:2015C00010803FCC1000C7269485883A1085883AD885883A108000171980020B1080000342 -:2015C8001085883AD885883A1280060B5194703A50BFFFCC1000BB263180004C2F003FCC59 -:2015D0003180005CE180B71E1980000B318007843100B43607000044018020B4880003850D -:2015D800880003C58F000405880004858A80050D31A6330412C0772658800E3613405E266E -:2015E000688003361580212612402F260000A50612005D2617C06A261540A21E00800044C7 -:2015E80088800305008000848880034500800184000073061300832660800936028100049F -:2015F000128071261380692613C0961E008000848880030588800345008001440000680672 -:2015F8000710000417007D2601A00014118084260288000412808B1E0080010488800305B0 -:201600008800034500801E040000840630000305300003459CC03F4C008000449880871EB6 -:2016080089000C4300C020B418E6330420000326010000841900040500000106188003850A -:20161000888003C500007D06008000448880030588800EC3054020B4AD6633041000101E19 -:2016180001400684A009883A08162F8000C020B418E6668410C5883A1080000B00C15DC41F -:20162000188007369CFFFFC49CC03FCC0080008414C00336A8800345A88004050000010657 -:20162800880003450080008490800D260080010490800B26008001449080601E01400684A7 -:20163000A009883A08162F8000C020B418E6668410C5883A1080000B00C12BC418805736DF -:2016380088C00C43008020B410A63304180032261000034500002D06008000443080030543 -:20164000008000840000150600800084308003053000034500C000C490C0481E89000C4325 -:2016480000C020B418E63304200002261880040500004206008000441880038500003F065F -:201650000080008488800305008000448880034500003A060080008430800305308003455E -:20165800008001043080040500003406008000C488800305008000848880034500800104CD -:201660008880040500002D06008000C43080030530000345008000C49080281E88C00C4381 -:20166800008020B410A633041800032600C0008410C004050000210600C0004410C0038540 -:2016700000001E06008000C430800305008000843080034500800144003FE20600800104CD -:201678003080030500800084308003450080014430800405008006043080048500000F0648 -:20168000008001048880030500800084888003450080018488800405008005048880048531 -:2016880000000606A50000440080074418C00684A0BF0A1E00BFFFC4000001068005883AC9 -:20169000DFC01317DF001217DDC01117DD801017DD400F17DD000E17DCC00D17DC800C179C -:20169800DC400B17DC000A17DEC01404F800283A20803FCCDEFFF9041080201CDC40041561 -:2016A000DFC00615DC800515DC00031510BFE0042823883A10000A0E2025883A000B883A4A -:2016A80001001DC40815A700D880028510C03FCC0100004420C02E3694001FCC00000106B3 -:2016B0002021883A08160880014001040009883A081604C0081606408804D63ADC0000059D -:2016B800DC400105D88000458804D43A84003FCCD88000858804D23AD88000C50080100404 -:2016C00080800426008012048080041E00BFE1C40000030600BFE544000001060080004408 -:2016C80001400184D809883AD8800145081603800100014408160E001021883A044000446D -:2016D00001400044D9000284081604C0D8800287100003168000051E081613C0000003068D -:2016D800081611C0147FF626003FFA06D8800283DFC00617DC800517DC400417DC000317D7 -:2016E000DEC00704F800283ADEFFF604DC000515000B883A2021883A01001244DFC0091536 -:2016E800DCC00815DC800715DC4006150815A70010803FCC100002260005883A00004306D3 -:2016F0000100014408160E001023883A0480004404C03FC401400044D9000484081604C01C -:2016F800D880048314C003268800051E081613C000000306081611C014BFF626003FFA0634 -:20170000D8C0048300803F8418BFEB1E01400484D809883A081604C08080010310C0008CD9 -:2017080018001326D8800183D8C001C3D9400143108000CC1004923A294003CC10C8B03AA5 -:20171000D88002031006D1BA2105883A1085883AD900028310C4B03AD8C002432008D1FA90 -:2017180018C000CC18C7883A20C8B03A000010061080010C10000B26D88001C3D9000203AC -:20172000000B883A10800FCC1004923A1104B03A1006923AD8800243010004441884B03A44 -:2017280000000306000B883A0009883A0005883A10BFFFCC10C0004421003FCC28803FCCAC -:201730002085883A10BFFE441884983ADFC00917DCC00817DC800717DC400617DC0005178E -:20173800DEC00A04F800283ADEFFF604014020B4DCC00715018002842027883A2961588471 -:20174000D809883ADD000815DC400515DFC00915DC800615DC000415050000C40816350071 -:2017480004400044081601C00816088008160C4001400284D809883A08160380000B883A32 -:2017500098000015010010040815A70010803FCC1440511E01406A84010012040815A7008B -:2017580010803FCC1440271E01400104D9000284081604C0D88003031440471ED8C00343C1 -:2017600000802A841880441E0100FA0408160E00081611C014400326081611C014400C1E3D -:20176800000006060150003401003A440815A70010803FCC103FF61E003FF706000B883A86 -:2017700001001E840815A70010803FCC100002260021883A0000090601400104D900028488 -:20177800081604C0D88002831080100C1000021E040001040000010604000304081613C0AA -:2017800000002606000B883A01003A440815A70010803FCC8880032E040000440480104419 -:20178800000002060400008404BFFA4401003E8408160E0094803FCC081611C01440042635 -:20179000081611C01000081E0021883A00000606000B883A9009883A0815A70010803FCC9E -:20179800103FF51E003FF606081613C0000B883A01001EC40815A70010803FCC100001265D -:2017A0000021883A01408004010014040815A70010803FCC100001260021883AA0BFFFC4CD -:2017A8001029883A10803FCC84803FCC10000A26903F9C26008000449C0001059880001518 -:2017B0009809883A0815B88010BFFFC49880021508160A8000000106903FF61E08160600EA -:2017B8009005003ADFC00917DD000817DCC00717DC800617DC400517DC000417DEC00A0479 -:2017C000F800283A20800217DEFFF804DC000115DFC00715DD400615DD000515DCC004158C -:2017C800DC800315DC400215DC0008171180313684BFFFCC90002F26208001032827883ABF -:2017D0003823883A1080020C300B883A1000011E300A927A010014440815A70010803FCC14 -:2017D800100002260400008400001F060100190408160E000500004405403FC401400044AC -:2017E000D809883A081604C0D880000315400526081613C0D8C0000300803F8418BFF11ED4 -:2017E80000000306081611C0153FF426003FF806008080841445C83A897FFFCC1421C83A55 -:2017F000280002260009883A081604C0900B883A9809883A081604C0817FFFCC0009883AA4 -:2017F800081604C00021883A081606008005883A00000106008000C4DFC00717DD4006175F -:20180000DD000517DCC00417DC800317DC400217DC000117DEC00804F800283A018001B43F -:2018080001406734010020B43186A004297F300421041004081739C1280D883A200B883AA2 -:20181000010020B42104100408174F01280D883A200B883A010020B42104100408174B01DE -:20181800F800283AD0E2830B00BFDFC41884703A00C020B4D0A2830D18C4400410BFFFCC1E -:2018200018800035F800283AD0A2830B00C020B418C4400410802014D0A2830D10BFFFCC6D -:2018280018800035F800283A01800A7401406734010020B4318CB804297F3004210410043B -:20183000081739C1018001B401406734010020B43186A004297F300421041004081739C10F -:20183800D0A28E1710000B1EDEFFFF04015A5E04213FFFCCDFC0001508162F80D0A28E15E2 -:201840000816D1800005883ADFC00017DEC00104F800283A00800044F800283ADEFFFF04A1 -:20184800DFC000150816D540D0E28E1710C5803ADFC00017DEC00104F800283AD0228E156B -:20185000F800283A20001B16000F883A28001616200D883A29001A2E0080080400C00044B8 -:201858000000010610000D26294B883A10BFFFC418C7883A293FFB360005883A1800072618 -:201860000005883A31400236314DC83A10C4B03A1806D07A280AD07A183FFA1E3800012608 -:201868000085C83AF800283A014BC83A39C0005C003FE7060109C83A01C00044003FE30677 -:2018700000C00044003FEE0620001716000F883A2005883A280012162900162E01800804D2 -:2018780000C000440000010630000A26294B883A31BFFFC418C7883A293FFB36180005267F -:201880001806D07A114001361145C83A280AD07A183FFB1E380001260085C83AF800283AD4 -:20188800014BC83A003FEC060109C83A01C00044003FE70600C00044003FF106200D883A5B -:201890002900152E280014160080080400C000440000020610000E2628000516294B883A25 -:2018980010BFFFC418C7883A293FFA36180008260005883A31400236314DC83A10C4B03A71 -:2018A0001806D07A280AD07A183FFA1EF800283A0005883AF800283A00C00044003FF4061D -:2018A8002005883A2900122E280011160180080400C000440000020630000C262800051643 -:2018B000294B883A31BFFFC418C7883A293FFA36180006261806D07A114001361145C83A6A -:2018B800280AD07A183FFB1EF800283AF800283A00C00044003FF7060005883A200007261C -:2018C00020C0004C2008D07A180001261145883A294B883A203FFA1EF800283AF800283AB2 -:2018C800218D883A218008262080000328C0000310C0022610C5C83AF800283A21000044A5 -:2018D00029400044003FF7060005883AF800283A2005883A2007883A218D883A19800526EA -:2018D8002900000318C0004429400044193FFFC5003FFA06F800283ADEFFF504DFC00915B3 -:2018E000DC400815DC000715D9C00A15008020B410A3B004144000172800040E008022C439 -:2018E8008880001500BFFFC400001C0600C08204D8C0000DD9000415D90002152800022602 -:2018F00028FFFFC4000001060007883AD8C00515D8C003151100001700FFFFC4D8C0008DAD -:2018F80000C0207418DAA8042821883AD9C00A04D80B883AD8C00115D80006150816574031 -:2019000000FFFFC410C0020E00C022C488C0001580000226D8C0041718000005DFC00917EB -:20190800DC400817DC000717DEC00B04F800283A3000152631BFFFC4218D883A2080000352 -:2019100028C0000311C03FCC1A003FCC39C0201C4200201C39FFE004423FE0043A00061E39 -:2019180021800426380003262100004429400044003FF2061007883A18C03FCC10803FCCE3 -:2019200010C5C83AF800283A0005883AF800283A2005883A200F883A30000C262A000003EE -:2019280038C0004431BFFFC43A00000542003FCC4200201C423FE00429400044180F883AAB -:20193000403FF51E198D883A00000106F800283A30C003261800000518C00044003FFC06A9 -:20193800F800283A214B883A2005883A1140021E1105C83AF800283A10C00007183FFC26ED -:2019400010800044003FF906DEFFFB04DC800315DC400215DC000115DFC004152025883A41 -:201948002823883AD98000053821883A04000A0E8880011701C00044D80D883A880B883ABC -:201950009009883A103EE83A843FFFC4103FF72600BFFFC4000001060005883ADFC00417B0 -:20195800DC800317DC400217DC000117DEC00504F800283ADEFFE504D8C00804DDC018159B -:20196000DD801715DD401615DD001515DCC01415DC801315DC401215DC001115DFC01A1533 -:20196800DF0019152029883A2823883A382D883AD9800F150021883AD8000E15D8000A15C1 -:20197000002B883A0027883A0025883AD8000C15D8000B15002F883AD8C00915D8C00F1744 -:201978001900000320803FCC1080201C10BFE00410011E2600C00044B8C014261DC0021609 -:20198000B80006260001150601400084B9401D26014000C4B9402B26000110060140094452 -:201988001140FC2688800117D900000501C00044D80D883A880B883AA009883A103EE83AF2 -:201990001000D81E840000440001040601400C041140FA260140094411400A1ED880000538 -:2019980088800117B80F883AD80D883A880B883AA009883A103EE83A1000CA1E84000044EF -:2019A0000000F50625FFF404BDC03FCC00C002441DC0093600BFFFC49080042601400284E3 -:2019A8009009883A08162F80000001060005883AB8A5883A0000E20601400B841140E426F7 -:2019B00005C00084213FF40427003FCC00C002441F00093600BFFFC4988004260140028455 -:2019B8009809883A08162F80000001060005883AE0A7883A0000D90600C01B0410C0D22642 -:2019C000013FFFC499000226D8000B150000010604C0004401001A441100162620800916D1 -:2019C800010018C4110088260100190411001126010016041100C81E00C00044D8C00E152C -:2019D0000000150601001CC4110098262080041601001BC41100C01E0540020400000F0643 -:2019D80001001D4411000D2601001E0411000A260000B906D8C00A17B7000104180007266C -:2019E000DF000D15B5C00017B800080E05EFC83A024000440000060605400404B0C0010442 -:2019E800D8C00D15B5C00017D8000A150013883AD839883AB8001726A80B883AB809883A0D -:2019F000DA401015081623C0A80B883A1009883A102D883A08162F80B885C83A00C0024436 -:2019F800DA4010171880021610800C0400000506D8C00E171800022610800DC400000106CE -:201A0000108015C4E0800005B02F883AE7000044003FE806E6EFC83A9DC5C83A0080090E2D -:201A0800E085883A01400C04D8C00917E009883AE0C0032EE700004421400005E0BFFA1ECA -:201A1000E6EFC83AD8C00B174DD1883A922DC83A1800162648000A2600800B44D880080584 -:201A18008880011701C00044D9800804880B883AA009883A103EE83A10004A1E84000044B4 -:201A20000580070EB00F883A01800C04880B883AA009883A081650801000421E85A1883AF4 -:201A2800E02D883ABF2FC83A000020060580090EB00F883A01800804880B883AA009883A4F -:201A3000DA40101508165080DA4010171000351E85A1883A483FF22600800B44D88008050A -:201A38008880011701C00044D9800804880B883AA009883A103EE83A10002A1E84000044B4 -:201A4000003FE706B5BFFFC4B080000301C00044D9800804D880080588800117880B883AAC -:201A4800A009883A103EE83A10001E1E8585C83AB5C9883AE085883A013FF2161021883AA9 -:201A5000DD800D1700004406008000441480080E95FFFFC4B80F883A01800804880B883A7B -:201A5800A009883A0816508010000E1E85E1883AB080001701C00044D80D883AD880000561 -:201A600088800117880B883AA009883AB5C00104103EE83A1000031E84000044B82D883AFC -:201A680000002D0600BFFFC400003106B5C00017B7000104B809883A0816BA809091C83A2C -:201A7000102D883A0200090E400F883A01800804880B883AA009883ADA00101508165080F3 -:201A7800DA001017103FEF1E8221883A88800117B00F883AB80D883A880B883AA009883AA4 -:201A8000103EE83A103FE71E85A1883AE02D883A0000110600C0004404FFFFC4D8000E15EF -:201A8800D8C00A15054002849825883AD8000C15D8000B15182F883A00000806DDC00B1578 -:201A900005C000840000050600C00044D8C00C1505C000C400000106002F883AD8C00F17E6 -:201A980018C00044D8C00F15003EDC068005883ADFC01A17DF001917DDC01817DD801717B9 -:201AA000DD401617DD001517DCC01417DC801317DC401217DC001117DEC01B04F800283A26 -:201AA8002880000B10C0020C1800202628C0008FDEFFFD04DC000015DFC00215DC40011501 -:201AB0002821883A1800150E10C0800C180013262C40051789C0030E10C0200C1800032604 -:201AB80000000E063C40010E3823883A81000417300B883A880D883A0816B48080800517F4 -:201AC0001445C83A80800515808004171463883A844004150005883A0000060610801014D9 -:201AC8008080000D00BFFFC40000020600BFFFC4F800283ADFC00217DC400117DC000017AC -:201AD000DEC00304F800283A2005883A218F883A290002361007883A00000C062987883AE0 -:201AD80020FFFC2E380B883A30CDC83A1989883A2000052618FFFFC419000003297FFFC491 -:201AE00029000005003FF906F800283A19C005262900000318C0004429400044193FFFC50B -:201AE800003FFA06F800283A2005883A10C000071800022610800044003FFC061105C83A1A -:201AF000F800283ADEFFFF04010020B4014020B4DFC00015212163042963B4042140061E8C -:201AF800010020740140207421000804294008042140121E00000B0600C020B418E3B404D9 -:201B00001907C83A0005883A10FFF526114F883A39C00017110D883A1080010431C0001505 -:201B0800003FF9060100207401402074211D8A04295D8A042140101E00000B0600C0207441 -:201B100018C008041907C83A0005883A10FFF526114F883A39C00017110D883A1080010417 -:201B180031C00015003FF90608175AC0DFC00017DEC00104081761C100C020B418E16304A2 -:201B20001907C83A0005883A18BFF726114F883A39C00017110D883A1080010431C000151B -:201B2800003FF906DEFFFF040009883ADFC000150816CD400816CF40D1A28F17D1629017B5 -:201B3000D1229117DFC00017DEC0010408126C01081752C1DEFFFF04DFC0001508176200D3 -:201B3800008000441001703ADFC00017DEC00104F800283A008020B410840004D0A2931555 -:201B4000010020B40080673410BF300421235004D0A2921508171BC1D0E29217D0A293176F -:201B480018000A2610C001040100020419000035013FFFD4110002351100033500800104E2 -:201B5000188000350005883AF800283A00BFFFC4F800283AD0A2921710000926D0E29317F5 -:201B580018800404100000351080003718C005371806943A10BFFFCC1884303AF800283AC7 -:201B600000BFFFC4F800283AD0A29217F800283A20001D262804923A20C03017DEFFFD04B4 -:201B6800DC400115DC000015DFC002152823883A2021883A108000D41880033580C03017B9 -:201B7000188000371080004C1000032601000044081752C0003FF906198000373007D0BA2C -:201B78003009D0FA18C001CC2100020C1908B03A3007D07A18C0040C1906B03A88C0042687 -:201B800000BFF4840000020600BFFA84F800283ADFC00217DC400117DC000017DEC00304EB -:201B8800F800283A20000A26280009263000082620800C173080001520800C171000062657 -:201B900021000D04290000150005883AF800283A00BFFA84F800283A00BFFEC4F800283A32 -:201B98002005883A20001D262809883A28001B1610C0311728C0192E1140341728FFFFC4CA -:201BA0001906703A1800151EDEFFFE04DC000015DFC001151021883A081623C01004923AB8 -:201BA80000C0403418FFC00410C4703A80C03017108000941880033580C0301718C00404AE -:201BB000188000371080004C10000626008000441880003500BFFEC40000020600BFFA84D7 -:201BB800F800283ADFC00117DC000017DEC00204F800283ADEFFF504DC000115DFC00A1585 -:201BC000DF000915DDC00815DD800715DD400615DD000515DCC00415DC800315DC4002154A -:201BC800DC000B1728003A163023883A300038162027883A20003626382B883A38003426B8 -:201BD000208031173080322E2880312E208034173147C83A10C7C83A1C002D3680002C1677 -:201BD80010BFFFC4114A703A2800291E0029883A05BFFFC405C000C4070001048000222618 -:201BE000DD800015890000CC20000626E105C83A8025883A1400012E1025883A8923C83A9B -:201BE80000000406BC0002368025883A0000010604800104AD0B883A900D883AD909883A6B -:201BF0000816350098802E17D8C00017A4A9883A84A1C83A8885883A10C00035988030170D -:201BF8001080040410C0003718C0008C1800042600C0008410C0003500BFFEC400000506B3 -:201C00008C400104003FDD060005883A0000010600BFFA84DFC00A17DF000917DDC008174B -:201C0800DD800717DD400617DD000517DCC00417DC800317DC400217DC000117DEC00B040B -:201C1000F800283A20001626DEFFF604DD000515DFC00915DDC00815DD800715DD40061508 -:201C1800DCC00415DC800315DC400215DC0001153029883A30000C262021883A20802E17F9 -:201C200080C02F172823883A2885883A382B883A3889883A10C0042E20C0053600000206D5 -:201C280000BFFA84F800283A00BFFA8400002406814034178809883A002D883A081623C04F -:201C3000102F883A80803317B8801C2EA8001B2684C0341704E7C83A9C66703A8CC0022642 -:201C38008CE5C83A000001060025883A980B883A8009883A0816E6001000111E80803417ED -:201C400014A5C83AAC80012EA825883ADC800015A58F883A880D883A980B883A8009883A71 -:201C48000816EF401000061EACABC83AB4AD883A8CA3883ABDC00044003FE2060005883ADF -:201C5000DFC00917DDC00817DD800717DD400617DD000517DCC00417DC800317DC400217E9 -:201C5800DC000117DEC00A04F800283A200008263007883A3000062620802E17288B883A75 -:201C600020802F17394D883A2880012E3080023600BFFA84F800283ADEFFFF04380D883AF9 -:201C68001809883ADFC00015081635000005883ADFC00017DEC00104F800283A20004E2664 -:201C70002080301710004E2620C03217DEFFFB04DFC00415DCC00315DC800215DC400115D3 -:201C7800DC00001518001E1E1480023700C0030494803FCC90BFFAC418804336100490BAD8 -:201C800000C0207418DC850410C5883A108000171000683A00817280008172900081729802 -:201C880000817288008172480081730800817308008173080081730800817308008173089E -:201C90000081725000817258044080040000130604410004000011060442000400000F0606 -:201C9800148001370080058494803FCC90800A260080060490800426008005049080221E5B -:201CA0000440080400000506044040040000030604401004000001060440200424C0341742 -:201CA8002021883A8809883A980B883A08162F8080C0311710C0021E80C0331788C0022622 -:201CB00080000C150000100600C000448480361580C00C1580000D1580800E1584400F15FC -:201CB80084C01015D1602B048009883A08175B000005883A0000050600BFFA84F800283A15 -:201CC00000BFFB44F800283A00BFFB44DFC00417DCC00317DC800217DC400117DC000017A2 -:201CC800DEC00504F800283A300001260005C03200FFFF042005883A28C6703A110DC83A0C -:201CD00030C0042E11800017300DC0F210800104003FFA06294000CC00C000C428C0041EA4 -:201CD80010C0000B1807C0B2108000830000080600C0008428C0031E1080000B1005C0B2F0 -:201CE0000000040600C0004428C0021E108000031005C0720005C132F800283ADEFFFD04C4 -:201CE800DC400115DC0000152823883A2021883A014001443009883ADFC0021508162F80A5 -:201CF000100B883A8809883A081623C010BFFFC480C002041800003501000044810004357F -:201CF80011003FCC810000351004D23A10803FCC808001350080200418800035DFC00217E0 -:201D0000DC400117DC000017DEC00304F800283A3180004C294B883A298B883A214003355B -:201D0800210004040080240420800035208000371080008C103FFD1E208000371004D1FA02 -:201D10001080004CF800283A20C004042800022600801A0400000106008008041880003547 -:201D1800188000371080008C103FFD1E20800337F800283A29403FCC2140033521000404EC -:201D20003000022600801404000001060080040420800035208000371080008C103FFD1EF2 -:201D2800208000371004D1FA1080004CF800283A21C004042805883A02000B04210003049E -:201D30001147C83A1980090E3A00003538C0003718C0008C183FFD1E2800022620C00037AE -:201D380010C0000510800044003FF506F800283A21C003042805883A210004040200070441 -:201D40001147C83A1980080E10C0000338C000352200003520C0003718C0008C183FFD1E36 -:201D480010800044003FF606F800283A014AAAF4DEFFFE04296AAA84DC000015DFC00115E3 -:201D50002021883A081623C010000F2601600034013555740007883A297FFFC42115558453 -:201D5800297FFFC4283FFE1E18C000448121883A18BFFB168405883A1421883A843FFFC44D -:201D6000803FFE1E000004068405883A1421883A843FFFC4043FFE160005883ADFC00117E1 -:201D6800DC000017DEC00204F800283AF800283A20000226208002171000101ED0A02A1720 -:201D700010000926DEFFFF04DFC00015103EE83A00C0058410C0001500BFFA84DFC00017EF -:201D7800DEC00104F800283AD0A2940400C0058410C0001500BFFA84F800283A28800017C0 -:201D800021400115208000152880001711000115290000150005883AF800283AF800283A78 -:201D8800000170FAF800283A2520732500632575252E75256B75322E25207A482E252E7572 -:201D90007A4875320000000074204B4F6E69206F00007469656D69540074756F252E752585 -:201D98006D75322E00000073252E75256D75322E75252F73322E252E00736D754353534FCB -:201DA000776620207525202E322E252E0000617574696E49727265202020726F00006425EE -:201DA8002020202053204F4E00434E59343130323130322D6D20203873717261000000007E -:201DB00074736554746170206E726574000000003A31564142475220000000533A31564103 -:201DB80073475220000000423A31564162505920000072503A3256416250592000007250BE -:201DC0003A32564173475220000000423A33564142475220000056483A33564142475220F6 -:201DC800000000533A33564173475220000000423A33564162505920000072507473614CB1 -:201DD0006573752000000064008176C0008176D0008176DC008176E8008176F4008177000F -:201DD8000081770C0081771800817724008177300081773C0000000000000000000000015E -:201DE000000101010000000100000000000001100044060B00000100000100008080800CEB -:201DE800081A1A1A0000000A7365725000000073666E6F43006D72696D73694D686374616A -:201DF0006572202C00797274666F72502075252E00733925756C34256325632575252020DD -:201DF80000000000656E694C746C756D646F6D2000003A65736572702D31207300000035A2 -:201E00002078752575736E75726F707000646574666F725020656C6964616F6C0000003AFC -:201E0800736572702D302073000000390000003100000032000000330000003400000036D7 -:201E10000000003700000038554E454D0000000000004B4F4B4341420000000000005055BE -:201E18004E574F44000000005446454C0000000048474952000000544F464E49000000009D -:201E20005F44434C4B4341424847494C000000544E414353454E494C444F4D5F0000004516 -:201E28004E414353454E494C5059545F000000454E414353454E494C544E495F0000002BEA -:201E30004E414353454E494C544E495F0000002D454E494C544C554D444F4D5F00000045E0 -:201E38005341485000002B455341485000002D45464F52505F454C494B544F48010059450B -:201E4000030F031F3E2903033E693EA93E193EE93E593E993E393ED93E4D3EC93EED3E1DC1 -:201E48003ECD3E2D3E6D3EAD3E013E651C181C481CD01C505E581CC83EB95ED80081782CB0 -:201E5000008178300081783400817838008177FC0081783C0081784000817844008178282B -:201E5800008181140081784800817850008178540081785C00817860008178680081787005 -:201E6000008178780081788000817890008178A0008178B0008178C0008178D0008178E052 -:201E6800008178E8008178F053206F4E6163204464206472002E746561766E492064696CF0 -:201E700067616D690000006561766E492064696C646165680000726561766E492064696C18 -:201E7800207264680043524361766E492064696C6174616443524320000000006164705511 -:201E80006320657465636E6164656C6C0000000073616C466572206865206461000072729B -:201E880073616C4672652068206573610072726573616C4672772068206574690072726511 -:201E900073616C4665762068206669726C696166000000006F727245000000724353534F0A -:201E980000000000696C6156697461646420676E006174616220752573657479000000008C -:201EA000252E75252575322E0073257361647055676E69740057462061656C707720657326 -:201EA8002E74696100002E2E697265566E6979666C6620670068736161656C707220657365 -:201EB000617473650000747272746552676E6979647075200065746161647055203F6574C6 -:201EB8002C593D314E3D3220000000006D72694665726177647075206465746100000000F6 -:201EC000202020200000752564206425000067656C20752573656E6900000000252E75254D -:201EC8002075322E000073756D20642500000056702075256C65786900000073252575257E -:201ED0000000000064206425000000426C206F4E006B6E69656E6F44000000006C69614616 -:201ED8000000646500007325656469566E69206F6F7270203E20206300000000706D6153B8 -:201EE000676E696C74706F203E20202E00000000636E795374706F202020202E3E202020DD -:201EE800000000007074754F6F207475202E74703E2020200000000074736F506F72702DC6 -:201EF00020202E633E20202000000000706D6F436269746174696C693E202079000000008B -:201EF80069647541706F206F6E6F69743E202073000000007474655373676E6974706F206A -:201F00003E20202000000000616F4C3C727020646C69666F003E20657661533C727020652B -:201F08006C69666F003E20657365523C73207465697474653E73676E000000006B6E694CB0 -:201F10006F727020693E2D667475706E000000006B6E694C706E69203E2D7475666F72703F -:201F18000000000074696E49206C616975706E69000000742044434C74204C426F656D69D0 -:201F2000000074752E77463C64707520206574613E202020000000006E776F446D61732D2A -:201F28006E696C70000000677061775366656C2069722F74007468672D6572502043444190 -:201F30006E696167000000006C6C75462058542075746573000000702033564165746E69A8 -:201F380063616C7278696665000000006E616353656E696C000000736E616353656E696C6E -:201F4000727473200000002E202E6C537262796873206469002E72746E616353656E696C77 -:201F480074656D2000646F686E616353656E696C70797420000000656E616353656E696C9C -:201F5000696C61202E6D6E670000000069726F48746E6F7A6D206C61006B73617472655614 -:201F58006C61636973616D200000006B6B73614D697262206E74686700737365657665528D -:201F6000206573720046504C5949443C74616C206574202E003E7473703034323838322F6F -:201F6800727020700000636F703438336F72702000000063693038343637352F72702069F1 -:201F70000000636F703038343637352F727020700000636F693036393830312F7020693065 -:201F780000636F72656E694C6D2078320065646F656E694C6D2078330065646F656E694C8E -:201F80006D2078340065646F656E694C6D2078350065646F656E694C66207835616D726F6C -:201F880000000074783635322030343265707361000074636D2058540065646F494D4448E7 -:201F900043544920000000006C616E417320676F20636E790046504C6C616E417320676F1B -:201F980020636E79006874566E7973486F7420636172656C0065636E6E797356687420639C -:201FA0006873657200646C6F4C502D487250204C6F432D65007473614C502D486F50204C29 -:201FA800432D74737473616F00000000706D6153676E696C61687020000065737030383493 -:201FB000206E6920706D61730072656C6F6C6C41565420775048205078324C4C00000000F3 -:201FB8006F6C6C4170752077706D61737832656C000000007664413C6974202E676E696DAC -:201FC0003E2020200000000065646956504C206F00000046506250596E6920726C6F432068 -:201FC8000061705372502F5266666F200074657320592F477366666F0000746562502F4252 -:201FD00066666F200074657372502F52696167200000006E20592F476E69616700000000BA -:201FD80062502F42696167200000006E2D657250204344416E6961470000000073202E4843 -:201FE0006C706D61746172650000006573202E486C636E7900006E6562202E48706B6361FD -:201FE8006863726F0000000061202E48766974630000006573202E566C636E7900006E657B -:201FF00062202E56706B63616863726F0000000061202E5676697463000000650066664F45 -:201FF8000000733300733031007330332D706F547466656C00000000746E6543000072650D -:2020000074746F42722D6D6F74686769000000002066664F207366283639203D297A486B82 -:202008000000000020207832207366283834203D297A486B0000000000706F5474746F42C2 -:2020100000006D6F69726F48746E6F7A00006C61747265566C6163690000000065746C41EA -:2020180074616E7200676E69746C754D696C70696974616300006E6F74627553746361729F -:20202000006E6F696F74754100000000756E614D00006C61494D444800000000004956445E -:2020280000373A38737361507572687400000000656E694C2820783229626F6200000000BF -:20203000656E694C00007832656E694C282078336563616C00002964656E694C2820783445 -:2020380029626F6200000000656E694C00007833656E694C00007834656E694C0000783590 -:2020400030323931383031780000003030303631303231780000003030323931303231789A -:2020480000000030656E65472063697200333A3478303233203034326974706F00002E6DB0 -:2020500078363532203034326974706F00002E6D656E654720636972393A36310000000097 -:202058004D352E3228207A482978616D00000000484D30316D28207A00296465484D3333FB -:202060006D28207A00296E692056544470303834000000004153455630343620303834781A -:20206800003036402E63655231303620000000002E6365523930372000000000484D3539A8 -:202070004828207A2056544400294949484D35334828207A2056544400002949484D3631FA -:202078004528207A29565444000000007A484D39445328200029565400006E4F0081982139 -:202080000000000200813AFC0081982300000009008138A4008198200000001C00813AC411 -:2020880000817FEC00817FF8008180004452535500415441808000201A1A1A800000000849 -:20209000008181A40000200020002CE5E926F4FD38BC200000000000008181B00000200053 -:202098002000323EF113FA043B6120000000000036333531303432780600000007FE00F002 -:2020A0000FEA01060112039632312002327830380000303400F005000106061803480FAA5B -:2020A80004420112783036390030343203C00000049200F00F800106011203363233008200 -:2020B000343278300000003000F00140010601AA031F0E3149100112783635320030343277 -:2020B80001000000015500F00E2701060112031934329220000070300000000000F002D0DC -:2020C0000106035A033E0F39000E011236333531303432780600004C07FE00F029EA013882 -:2020C80001120396323120023278303800003838012005000138061803480FAA044201126B -:2020D000783036390038383203C00000049201200F800138011203363233008234327830B4 -:2020D80000424C3000F00140013801AA031F293149100112783635324C30343201000042F3 -:2020E000015500F02927013801120319383292200000703800000000012002D0013803608F -:2020E800033F1345000E0112703438330000000001F00000028001801D3201A70204033EDC -:2020F0003436000E30347830000000300190028001C1032002602430000C0210783034363E -:2020F8000034383302800000032001803F3001EC021002603834000E000069300000000020 -:2021000000F002D0020D035A033E0F39044F0312703038340000000002D00000035A01E084 -:202108001E3C020D0414063E3436000C383478300000003001E00280020D032002602130F0 -:20211000000C0414783034360032313502800000032002001C300238041402603735000CC2 -:202118000000693600000000012002D002710360033F1345044F031270363735000000002B -:2021200002D000000360024027440271040405403038000C303678300000003002580320CE -:20212800027404200480175800040010703032370000000005000000067202D014DC02EEBE -:2021300000180528303100043778343200003836030004000326054006881DA0000400108E -:202138003038323132303178050000340698040026F8042A00100370343600043639783082 -:202140000000693001E00280041A032002602130000D0514303830310000006907800000B0 -:202148000898021C109404650518052C3031000D007030380000000004380780046508984C -:20215000052C249400040018303036313032317806400030087004B02EFF04E2001003F1DF -:20215800FFFF0004FFFFFFFFFFFFFFFF7665642F6370652F6F635F716F72746E72656C6C84 -:20216000615F305F6D5F6C7600006D65000000000000000000000000000000000000000090 -:20216800000000000000000000000000000000000000000000000000000000000000000057 -:2021700000000000000000000000000000000000000000000000000000000000000000004F -:20217800000000000000000000000000000000000000000000000000000000000000000047 -:2021800000000000000000000000000000000000000000000000000000000000000000003F -:20218800000000000000000000000000000000000000000000000000000000000000000037 -:2021900000000000000000000000000000000000000000000000000000000000000000002F -:20219800000000000000000000000000000000000000000000000000000000000000000027 -:2021A00000000000000000000000000000000000000000000000000000000000000000001F -:2021A800000000000000000000000000000000000000000000000000000000000000000017 -:2021B00000000000000000000000000000000000000000000000000000000000000000000F -:2021B800000000000000000000000000000000000000000000000000000000000000000007 -:2021C0000000000000000000000000000000000000000000000000000000000000000000FF -:2021C8000000000000000000000000000000000000000000000000000000000000000000F7 -:2021D0000000000000000000000000000000000000000000000000000000000000000000EF -:2021D8000000000000000000000000000000000000000000000000000000000000000000E7 -:2021E0000000000000000000000000000000000000000000000000000000000000000000DF -:2021E8000000000000000000000000000000000000000000000000000000000000000000D7 -:2021F0000000000000000000000000000000000000000000000000000000000000000000CF -:2021F8000000000000000000000000000000000000000000000000000000000000000000C7 -:202200000000000000000000000000000000000000000000000000000000000000000000BE -:202208000000000000000000000000000000000000000000000000000000000000000000B6 -:202210000000000000000000000000000000000000000000000000000000000000000000AE -:202218000000000000000000000000000000000000000000000000000000000000000000A6 -:2022200000000000000000000000000000000000000000000000000000000000000000009E -:20222800000000000000000000000000000000000000000000000000000000000000000096 -:2022300000000000000000000000000000000000000000000000000000000000000000008E -:20223800000000000000000000000000000000000000000000000000000000000000000086 -:2022400000000000000000000000000000000000000000000000000000000000000000007E -:20224800000000000000000000000000000000000000000000000000000000000000000076 -:2022500000000000000000000000000000000000000000000000000000000000000000006E -:20225800000000000000000000000000000000000000000000000000000000000000000066 -:2022600000000000000000000000000000000000000000000000000000000000000000005E -:20226800000000000000000000000000000000000000000000000000000000000000000056 -:2022700000000000000000000000000000000000000000000000000000000000000000004E -:20227800000000000000000000000000000000000000000000000000000000000000000046 -:2022800000000000000000000000000000000000000000000000000000000000000000003E -:20228800000000000000000000000000000000000000000000000000000000000000000036 -:2022900000000000000000000000000000000000000000000000000000000000000000002E -:20229800000000000000000000000000000000000000000000000000000000000000000026 -:2022A00000000000000000000000000000000000000000000000000000000000000000001E -:2022A800000000000000000000000000000000000000000000000000000000000000000016 -:2022B00000000000000000000000000000000000000000000000000000000000000000000E -:2022B800000000000000000000000000000000000000000000000000000000000000000006 -:2022C0000000000000000000000000000000000000000000000000000000000000000000FE -:2022C8000000000000000000000000000000000000000000000000000000000000000000F6 -:2022D0000000000000000000000000000000000000000000000000000000000000000000EE -:2022D8000000000000000000000000000000000000000000000000000000000000000000E6 -:2022E0000000000000000000000000000000000000000000000000000000000000000000DE -:2022E8000000000000000000000000000000000000000000000000000000000000000000D6 -:2022F0000000000000000000000000000000000000000000000000000000000000000000CE -:2022F8000000000000000000000000000000000000000000000000000000000000000000C6 -:202300000000000000000000000000000000000000000000000000000000000000000000BD -:202308000000000000000000000000000000000000000000000000000000000000000000B5 -:202310000000000000000000000000000000000000000000000000000000000000000000AD -:202318000000000000000000000000000000000000000000000000000000000000000000A5 -:2023200000000000000000000000000000000000000000000000000000000000000000009D -:20232800000000000000000000000000000000000000000000000000000000000000000095 -:2023300000000000000000000000000000000000000000000000000000000000000000008D -:20233800000000000000000000000000000000000000000000000000000000000000000085 -:2023400000000000000000000000000000000000000000000000000000000000000000007D -:20234800000000000000000000000000000000000000000000000000000000000000000075 -:2023500000000000000000000000000000000000000000000000000000000000000000006D -:20235800000000000000000000000000000000000000000000000000000000000000000065 -:2023600000000000000000000000000000000000000000000000000000000000000000005D -:20236800000000000000000000000000000000000000000000000000000000000000000055 -:2023700000000000000000000000000000000000000000000000000000000000000000004D -:20237800000000000000000000000000000000000000000000000000000000000000000045 -:2023800000000000000000000000000000000000000000000000000000000000000000003D -:20238800000000000000000000000000000000000000000000000000000000000000000035 -:2023900000000000000000000000000000000000000000000000000000000000000000002D -:20239800000000000000000000000000000000000000000000000000000000000000000025 -:2023A00000000000000000000000000000000000000000000000000000000000000000001D -:2023A800000000000000000000000000000000000000000000000000000000000000000015 -:2023B00000000000000000000000000000000000017804E53CCE00813FAE03833F333D49B5 -:2023B80005B80383009301B404163C493CD93F9F04163F10020E04093D0E00C83F6E03831C -:2023C0003ED03DAC04B2038300E9026404163C933D493F5604163E9F00818E24000000004D -:2023C8000000000000000000000000000000000000817B680000000300818E64000000001B -:2023D0000000000000817B7C0000000300818E5C000000000000000000817B900000000378 -:2023D80000818E54000000000000000000817BA40000000300818E4C000000000000000084 -:2023E00000817BB80000000300818E44000000000000000000817BCC0000000300818E3CBD -:2023E800000000000000000000817BE00000000300818E34000000000000000000817BF4C3 -:2023F0000000000300818E2C000000000000000000817C080000000400811FE400818208F7 -:2023F8000000000000817C180000000400812064008182080000000000817C280000000473 -:2024000000812B28000000000000000000817C3C0000000100819955000A010100813B284F -:2024080000817C5000000000008198330001000100818EB400817C640000000000819822BA -:20241000000A000100818C3400817C74000000000081982E0003000100818B8C00817C848B -:202418000000000400813344000000000000000000817C98000000000081994B00010001AC -:2024200000818E7400817CA8000000000081994C0001000100818EB400817CB80000000193 -:202428000081994D0018000000813A9C00817CC800000000008199480001000100818EB4D2 -:2024300000817CD800000000008199490001000100818EB400817CEC000000000081992567 -:202438000002000100818BA800817CF80000000100819929000F000000813A5400817D0870 -:202440000000000100819927001C000000813A1000817D18000000000081992800010001F9 -:2024480000818E8400817D2800000000008199260002000100818B9C00817D38000000009A -:202450000081992A0001000100818E7C00817D4C000000010081993700FF0000008139F452 -:2024580000817D5C0000000100819938003F0000008139F400817D6C00000001008199390C -:20246000000F0000008138A400817D7C000000010081994A001F0000008138A400817D880F -:202468000000000400812414008181FC0000000000817D98000000000081993100040001B3 -:2024700000818BC400817DA800000000008199320001000100818EA400817DB40000000023 -:20247800008199330003000100818BB400817DC400000000008199340001000100818EA46E -:2024800000817DD400000000008199350001000100818E9C00817DE4000000000081992C46 -:202488000002000100818BE400817DF0000000000081992D0003000100818BF000817DFC12 -:20249000000000000081992E0002000100818BE400817E08000000000081992F000200019E -:2024980000818BE400817E1400000000008199300002000100818BD800817E2400000000CD -:2024A000008199360001000100818E9400817E34000000000081993A0001000100818E8C03 -:2024A80000817E3C000000000081993B0001000100818EB400817E4800000000008199441A -:2024B0000003000100818C0000817E580000000100819941001F0000008139B000817E6858 -:2024B800000000010081994200FF00000081392000817E78000000010081994300C80A0027 -:2024C0000081392000817E880000000100819946000500000081390400817E9800000001DF -:2024C80000819947000500000081390400817EAC000000010081993D001F0001008138C034 -:2024D00000817EBC000000000081993C0002000100818C1000817ECC000000000081993E98 -:2024D8000001000100818EB400817EE0000000000081993F0001000100818EB400817EF42F -:2024E0000000000300818E6C00818214008120D000817F0800000000008199450005000169 -:2024E80000818C1C00817F1400000000008199400001000100818EAC00817F24000000015B -:2024F0000081994E00FF0000008138A400817F30000000010081994F00FF0000008138A412 -:2024F80000817F3C000000010081995000FF0000008138A400817F4800000001008199510D -:2025000000FF0000008138A400817F54000000010081995200FF0000008138A400817F60E2 -:20250800000000010081995300FF0000008138A400817F6C0000000100819954000F0000FF -:20251000008138A400817F7C000000020081983008FC012C0081216000817F8C00000002C6 -:202518000081983C00FF000A0081216000817F98000000020081981E00FF00010081216070 -:2025200000817FA8000000020081982C078000C80081216000817FB4000000020081982666 -:20252800000700010081216000817FC00000000200819836003F00010081216000817FD066 -:20253000000000020081982A04B000C80081216000817FDC00817FE000817FE400817FE840 -:2025380000818044008180500081805C00817FDC008180840081808C008180A4008180B04C -:20254000008180C8008180D8008180A4008180C0008180E8008180F0008180F8008181009E -:202548000081810C0081811800818124008181300081814000818150008181240081813007 -:202550000081814000818160008181700081817C00817FDC00818084008181880081819456 -:202558000081808400817FDC008181BC008181CC008181DC008181EC008176C0008176D02C -:20256000008176DC008176E8008176F4008177000081770C0081771800817724008177306E -:202568000081773C0000000000818D2000818D2800818D300000000000000000000000007D -:2025700000000000000000000000000000000000000000000000000000000000000000004B -:20257800000000000000000000000000000000000000000000000000000000000000000043 -:2025800000000000000000000000000000000000000000000000000000000000000000003B -:20258800000000000000000000000000000000000000000000000000000000000000000033 -:2025900000000000000000000000000000000000000000000000000000000000000000002B -:202598000000000000000004000000000001000A000000000002000A000000000000000008 -:2025A0000000000000000000000000000081856C0000000000000000008170440081716C16 -:2025A80000816E2400816E6000816EF400000000008000000000000000000000000000004E -:2025B00000000000000000000000000000000000000000000000000000000000000000000B -:2025B800000000000000000000000000000000000000000000000000000000000000000003 -:2025C0000000000000000000000000000000000000000000000000000000000000000000FB -:2025C80000000000000000000000000000000000000000000000000000816D900000000075 -:2025D0000080000000821020008000000000000100000080000100000000010000000000B6 -:2025D800001080100000008000000008008185EC000000080081868C000000030081872CF7 -:2025E00000000002008187680000000B008187900000000D0081886C0000000600818970C4 -:2025E80000000005008189E80000000900818A4C0000000700818B00008180100081802433 -:2025F000008180380081803C0081806800818078008180940081809C0081812C008180A072 -:2025F800008180A4008180B0008180A4008180C0008181A4008181B000817FDC008181F8D9 -:20260000C896554B00818C600000000000818EC800818EC8000000000000000000000000A1 -:202608000000000000000000000000000000000000000000000000000000000000000000B2 -:202610000000000000000000000000000000000000000000000000000000000000000000AA -:202618000000000000000000000000000000000000000000000000000000000000000000A2 -:2026200000000000000000000000000000000000000000000000000000000000000000009A -:20262800000000000000000000000000000000000000000000000000000000000000000092 -:2026300000000000000000000000000000000000000000000000000000000000000000008A -:20263800000000000000000000000000000000000000000000000000000000000000000082 -:2026400000000000000000000000000000000000000000000000000000000000000000007A -:20264800000000000000000000000000000000000000000000000000000000000000000072 -:2026500000000000000000000000000000000000000000000000000000000000000000006A -:20265800000000000000000000000000000000000000000000000000000000000000000062 -:2026600000000000000000000000000000000000000000000000000000000000000000005A -:20266800000000000000000000000000000000000000000000000000000000000000000052 -:2026700000000000000000000000000000000000000000000000000000000000000000004A -:20267800000000000000000000000000000000000000000000000000000000000000000042 -:2026800000000000000000000000000000000000000000000000000000000000000000003A -:20268800000000000000000000000000000000000000000000000000000000000000000032 -:2026900000000000000000000000000000000000000000000000000000000000000000002A -:20269800000000000000000000000000000000000000000000000000000000000000000022 -:2026A00000000000000000000000000000000000000000000000000000000000000000001A -:2026A800000000000000000000000000000000000000000000000000000000000000000012 -:2026B00000000000000000000000000000000000000000000000000000000000000000000A -:2026B800000000000000000000000000000000000000000000000000000000000000000002 -:2026C0000000000000000000000000000000000000000000000000000000000000000000FA -:2026C8000000000000000000000000000000000000000000000000000000000000000000F2 -:2026D0000000000000000000000000000000000000000000000000000000000000000000EA -:2026D8000000000000000000000000000000000000000000000000000000000000000000E2 -:2026E0000000000000000000000000000000000000000000000000000000000000000000DA -:2026E8000000000000000000000000000000000000000000000000000000000000000000D2 -:2026F0000000000000000000000000000000000000000000000000000000000000000000CA -:2026F8000000000000000000000000000000000000000000000000000000000000000000C2 -:202700000000000000000000000000000000000000000000000000000000000000000000B9 -:202708000000000000000000000000000000000000000000000000000000000000000000B1 -:202710000000000000000000000000000000000000000000000000000000000000000000A9 -:202718000000000000000000000000000000000000000000000000000000000000000000A1 -:20272000000000000000000000000000000000000000000000000000000000000000000099 -:20272800000000000000000000000000000000000000000000000000000000000000000091 -:20273000000000000000000000000000000000000000000000000000000000000000000089 -:20273800000000000000000000000000000000000000000000000000000000000000000081 -:20274000000000000000000000000000000000000000000000000000000000000000000079 -:20274800000000000000000000000000000000000000000000000000000000000000000071 -:20275000000000000000000000000000000000000000000000000000000000000000000069 -:20275800000000000000000000000000000000000000000000000000000000000000000061 -:20276000000000000000000000000000000000000000000000000000000000000000000059 -:20276800000000000000000000000000000000000000000000000000000000000000000051 -:20277000000000000000000000000000000000000000000000000000000000000000000049 -:20277800000000000000000000000000000000000000000000000000000000000000000041 -:20278000000000000000000000000000000000000000000000000000000000000000000039 -:20278800000000000000000000000000000000000000000000000000000000000000000031 -:20279000000000000000000000000000000000000000000000000000000000000000000029 -:20279800000000000000000000000000000000000000000000000000000000000000000021 -:2027A000000000000000000000000000000000000000000000000000000000000000000019 -:2027A800000000000000000000000000000000000000000000000000000000000000000011 -:2027B000000000000000000000000000000000000000000000000000000000000000000009 -:2027B800000000000000000000000000000000000000000000000000000000000000000001 -:2027C0000000000000000000000000000000000000000000000000000000000000000000F9 -:2027C8000000000000000000000000000000000000000000000000000000000000000000F1 -:2027D0000000000000000000000000000000000000000000000000000000000000000000E9 -:2027D8000000000000000000000000000000000000000000000000000000000000000000E1 -:2027E0000000000000000000000000000000000000000000000000000000000000000000D9 -:2027E8000000000000000000000000000000000000000000000000000000000000000000D1 -:2027F0000000000000000000000000000000000000000000000000000000000000000000C9 -:2027F8000000000000000000000000000000000000000000000000000000000000000000C1 +:0400000000000013E9 +:0400010000000013E8 +:0400020000000013E7 +:0400030000000013E6 +:0400040000000013E5 +:0400050000000013E4 +:0400060000000013E3 +:0400070000000013E2 +:0400080000000013E1 +:0400090000000013E0 +:04000A0000000013DF +:04000B0000000013DE +:04000C0000000013DD +:04000D0000000013DC +:04000E0000000013DB +:04000F0000000013DA +:0400100000000013D9 +:0400110000000013D8 +:0400120000000013D7 +:0400130000000013D6 +:0400140000000013D5 +:0400150000000013D4 +:0400160000000013D3 +:0400170000000013D2 +:0400180000000013D1 +:0400190000000013D0 +:04001A0000000013CF +:04001B0000000013CE +:04001C0000000013CD +:04001D0000000013CC +:04001E0000000013CB +:04001F000100006F6D +:040020000100006F6C +:040021000080006FEC +:040022000040006F2B +:040023000000006F6A +:040024000000009345 +:040025008186810649 +:040026008286820646 +:040027008386830643 +:040028008486840640 +:04002900858685063D +:04002A00868686063A +:04002B008786870637 +:04002C000000911728 +:04002D00F5010113C5 +:04002E000000771740 +:04002F003CC70713B0 +:0400300000008797AE +:0400310090478793DA +:0400320000F7576319 +:04003300000720237F +:04003400DDE30711F0 +:0400350000EFFEE7F3 +:040036001151004024 +:04003700C4064501B5 +:04003800200520057A +:04003900A60367DDD6 +:04003A0067DD4847EF +:04003B004887A583CA +:04003C0040A267DD9A +:04003D0048C7A50308 +:04003E00206F0131FD +:04003F00A3A10B402E +:0400400067DD808276 +:04004100000207377B +:0400420048E7AA23BE +:0400430007B7655D39 +:04004400675D019C57 +:04004500CC078793CA +:04004600B285051367 +:0400470048F728232B +:04004800675DAE49F9 +:040049004907270339 +:04004A00A78367DD44 +:04004B00557D49474F +:04004C004721CB116C +:04004D006741C3D86C +:04004E00C798177DBB +:04004F004711C7D8B6 +:040050004501C3D8CB +:0400510067DD808265 +:040052004907A78330 +:04005300CF91557D77 +:04005400A70367DDBA +:0400550028234947CC +:040056004B1C000738 +:0400570007C24B4849 +:0400580083C1054219 +:0400590045138D5D61 +:04005A008082FFF5AC +:04005B00A50367DDB5 +:04005C00808249074E +:04005D002703C93973 +:04005E0011510C052B +:04005F0000859793EE +:04006000C026C222D2 +:04006100E793C40657 +:0400620084AE003731 +:04006300C75C842AC8 +:040064000C0427035E +:040065008B85431C28 +:04006600431CE795BB +:04006700D713450165 +:04006800D6934027C4 +:040069008B1D403774 +:04006A0087858AA15B +:04006B008BC18F5561 +:04006C0084638FD941 +:04006D00051300F483 +:04006E0040A2FD208F +:04006F004482441271 +:040070008082013158 +:0400710021414505DF +:040072005529B7E174 +:0400730057A9808287 +:04007400C991C9194C +:040075005918CA0943 +:04007600C21857ED68 +:040077000513C7099D +:04007800C1880345F3 +:04007900853E4781F8 +:04007A0057A9808280 +:04007B00C263C13962 +:04007C00270304054D +:04007D00FE630C45CD +:04007E00268302E5EE +:04007F0087130D05D1 +:040080008F6DFFF68B +:04008100D5B3E71DEF +:0400820007B702D5E5 +:04008300879301005E +:0400840005A2F007DA +:0400850027838DFD43 +:04008600E5930C05ED +:04008700C7CC0025BD +:040088000C052683BA +:040089004A984781C9 +:04008A00C7018B051A +:04008B00CA9C47853F +:04008C00853E57ED69 +:04008D00C163808249 +:04008E00717912056D +:04008F00D606D4229B +:04009000832AD226C7 +:040091005529843237 +:0400920002064863B7 +:0400930002030663FB +:040094002783C68573 +:0400950071630C4344 +:04009600FF6302F60C +:04009700278300F5C6 +:040098008E0D0D03B9 +:0400990040C78633A3 +:04009A0000E66863B1 +:04009B0000074663B1 +:04009C008DFD17FDC2 +:04009D00CDF14281DE +:04009E00542250B2E6 +:04009F0061455492D1 +:0400A00057FD808206 +:0400A1007513D03EC5 +:0400A200CD09003450 +:0400A3008F89479169 +:0400A400F36384BAC4 +:0400A50084BE00E72E +:0400A60077938C09B7 +:0400A700CB810034D5 +:0400A800BFD955293E +:0400A9004491478DAA +:0400AA0000E7E36325 +:0400AB00101C84BAE7 +:0400AC00005685B3C2 +:0400AD00953E8626D0 +:0400AE00CC3ACE1A60 +:0400AF00C836CA166F +:0400B0001B3040EFD2 +:0400B10007B3101071 +:0400B200C03E0096B6 +:0400B3008793678543 +:0400B400C23E8027A1 +:0400B500000227B767 +:0400B6001107879314 +:0400B70046C2C43E3B +:0400B80042D267A128 +:0400B90043724762E5 +:0400BA00020787931F +:0400BB008537C63E81 +:0400BC00478200086F +:0400BD0002F61463D0 +:0400BE000B83278306 +:0400BF0092A65602AD +:0400C000C39097A2B0 +:0400C1000C03278382 +:0400C20086138F050D +:0400C3004B9C01074A +:0400C400CF9D8B89B8 +:0400C500C21C478989 +:0400C600BFB9556DFC +:0400C7000006478365 +:0400C80043A2459278 +:0400C90085B30605F0 +:0400CA00F5B302B7D1 +:0400CB0043B20075C7 +:0400CC00027787B37D +:0400CD004405039350 +:0400CE000077F7B30D +:0400CF008DDD63C19F +:0400D00010138393F3 +:0400D100027585B37C +:0400D2000FA381C136 +:0400D300B755FEB669 +:0400D400FB05041113 +:0400D500B70D45011D +:0400D60080825529A6 +:0400D700FDC1011353 +:0400D800CE22D0065E +:0400D900C232CC263D +:0400DA00842AC15D56 +:0400DB00C24D552994 +:0400DC000B84270367 +:0400DD0087AE83B6B1 +:0400DE008633972EA0 +:0400DF00268300E68E +:0400E00077630BC473 +:0400E100756308D764 +:0400E200270308D612 +:0400E300C0020D0446 +:0400E40002E5D4B3AA +:0400E5000CC427031D +:0400E60000E4E463EB +:0400E700A88D45019A +:0400E800FE038EE3A2 +:0400E9000D0422835D +:0400EA0002B3470115 +:0400EB00F2B34050DC +:0400EC00846300F237 +:0400ED0087330057FE +:0400EE00859640575C +:0400EF00CA3A852262 +:0400F000C63EC81E22 +:0400F1003515C416E7 +:0400F2002303E521DE +:0400F30047520D045F +:0400F40042A243C21F +:0400F50040E30333AE +:0400F600F36347B2B7 +:0400F700831E006301 +:0400F80046924602E4 +:0400F9008596871A47 +:0400FA00852296B213 +:0400FB00C81E863E57 +:0400FC00C43EC61A1E +:0400FD00ED0935894B +:0400FE0047824332C0 +:0400FF00048543C26F +:04010000C03E979ACC +:0401010083B347A2DB +:04010200979A406325 +:040103005529B76162 +:04010400447250826F +:04010500011344E2BC +:0401060080820241B0 +:04010700C94157A9EA +:040108002783C6592A +:0401090027030B8538 +:04010A0095BE0BC5CE +:04010B0000B6833384 +:04010C00FE6357A98E +:04010D007C6306E524 +:04010E00873206E34B +:04010F0086361151CE +:04011000C222853A48 +:040111008436C40666 +:0401120040EFC026D4 +:04011300872A0290A5 +:0401140025B76605A0 +:04011500652100025E +:040116000613468105 +:040117008593802626 +:0401180005131105B5 +:0401190082B70205A2 +:04011A00C9630008AD +:04011B0040A2008678 +:04011C0047814412C1 +:04011D00853E448255 +:04011E0080820131A9 +:04011F0000D70333CF +:040120000003438312 +:04012100440284937D +:0401220087B3068514 +:0401230083B302C3DD +:040124008FED02A3B6 +:040125000093F3B39D +:040126000077E7B3C4 +:04012700839363C19A +:0401280087B3101376 +:0401290083C1027715 +:04012A0000F30023BB +:04012B00853EBF7DD1 +:04012C00CD4D8082B3 +:04012D000C05270393 +:04012E00CB5557B5A1 +:04012F000C85278391 +:040130004718EBA9D8 +:04013100771346B149 +:0401320007930FF729 +:04013300E963FEB7C7 +:0401340066D902F690 +:040135008693078A1C +:0401360097B68AC628 +:040137008782439CDC +:040138002000079309 +:040139000D05268307 +:04013A000C45260347 +:04013B0002F685B390 +:04013C0000B6166390 +:04013D000CC5258345 +:04013E0004F58663DB +:04013F00020528236A +:04014000A0B557B55A +:0401410040000793E0 +:040142006785BFF11D +:040143008007879317 +:040144004358BFD18C +:04014500771347D90C +:040146000F630FF73D +:0401470047E100F795 +:0401480000F70F634A +:0401490057B546D18F +:04014A0004D7136360 +:04014B000200079314 +:04014C000793BF5501 +:04014D00B77D040076 +:04014E00080007930B +:04014F000793B765F6 +:04015000B74D100097 +:04015100C40611517E +:040152000CE52C2369 +:04015300470565DD1A +:04015400D918DD5C7D +:0401550002052A2352 +:04015600C134DD10C3 +:040157003CC585938B +:0401580040A222019E +:04015900853E478117 +:04015A00808201316D +:04015B00853E57A9DD +:04015C0047958082C1 +:04015D0002F606336D +:04015E000005242351 +:04015F00C91C4785EB +:0401600002C5D5B34C +:04016100F79315FDFE +:0401620081A10FF573 +:04016300F593C11C33 +:04016400C14C0FF586 +:0401650008000793F4 +:040166008082C51CB2 +:040167008A0505867A +:04016800C54C95B23B +:0401690009000793EF +:04016A000105071371 +:04016B00431CC91C4C +:04016C00FFF58B8987 +:04016D00811D49089F +:04016E0080828905FD +:04016F00010507136C +:04017000068007936B +:040171000793E19976 +:04017200C91C0200A2 +:040173008B89431C15 +:040174004548FFF506 +:04017500C54C808273 +:040176000105071365 +:0401770005000793E5 +:0401780047C1E21188 +:04017900431CC91C3E +:04017A00FFF58B8979 +:04017B00811D490891 +:04017C0080828905EF +:04017D00069347811D +:04017E00C36302C095 +:04017F00808200C7B3 +:04018000010503135F +:040181002703C91473 +:040182008B090003E2 +:04018300C599FF6DAE +:0401840000C523038C +:0401850000F58733C7 +:0401860000670023EB +:04018700BFF1078538 +:0401880046F1478174 +:0401890000C7C36385 +:04018A0087338082B5 +:04018B00470300F531 +:04018C000313000752 +:04018D00C55801054B +:04018E002703C91466 +:04018F008B090003D5 +:040190000785FF6D73 +:0401910047EDB7C5BA +:0401920002F505333A +:040193005533479DFC +:04019400E46302F529 +:04019500450100A779 +:040196000001808262 +:04019700BFD5078544 +:04019800451CC11928 +:0401990067DDEF919E +:04019A003C87A78374 +:04019B001151C395A6 +:04019C009782C4067C +:04019D0047D940A25C +:04019E005529C11C02 +:04019F008082013128 +:0401A000C14C419C71 +:0401A100419CC11CA0 +:0401A200C188C3C885 +:0401A3008082450110 +:0401A4000513656179 +:0401A50047D99C0595 +:0401A6005529C11CFA +:0401A70067338082B8 +:0401A80053FD00B54E +:0401A900E7798B0D5A +:0401AA007F7F87B715 +:0401AB00F7F7879348 +:0401AC004194411029 +:0401AD0000F672B333 +:0401AE0000F66333C1 +:0401AF00E2B392BE67 +:0401B00097630062EF +:0401B10018630C7251 +:0401B200415006D6DC +:0401B30072B341D40E +:0401B400633300F6BB +:0401B50092BE00F600 +:0401B6000062E2B34E +:0401B7000A729863CD +:0401B80004D61B63EB +:0401B9004594451014 +:0401BA0000F672B326 +:0401BB0000F66333B4 +:0401BC00E2B392BE5A +:0401BD0091630062E8 +:0401BE001E630A7240 +:0401BF00455002D6CF +:0401C00072B345D4FD +:0401C100633300F6AE +:0401C20092BE00F6F3 +:0401C3000062E2B341 +:0401C40008729A63C0 +:0401C50002D61163EA +:0401C60049944910FF +:0401C70000F672B319 +:0401C80000F66333A7 +:0401C900E2B392BE4D +:0401CA0093630062D9 +:0401CB000551087260 +:0401CC000FE305D167 +:0401CD001713F6D638 +:0401CE0097930106FC +:0401CF001C630106A6 +:0401D000571300F7CA +:0401D100D7930106B9 +:0401D20005330106EA +:0401D300759340F7E9 +:0401D400E9910FF5A9 +:0401D5008341808260 +:0401D600053383C1A9 +:0401D700759340F7E5 +:0401D800E1910FF5AD +:0401D9007713808296 +:0401DA00F7930FF791 +:0401DB0005330FF7E2 +:0401DC00808240F7E6 +:0401DD0000054603D0 +:0401DE000005C683CF +:0401DF000585050588 +:0401E00000D61363CF +:0401E1000533FA6583 +:0401E200808240D601 +:0401E300059105116C +:0401E400FED612E34E +:0401E50080824501CE +:0401E60005A1052149 +:0401E700FCD61CE343 +:0401E80080824501CB +:0401E90005B1053126 +:0401EA00FCD616E346 +:0401EB0080824501C8 +:0401EC0005C1054103 +:0401ED00FCD610E349 +:0401EE0080824501C5 +:0401EF00120D07B72F +:0401F00087931111CF +:0401F100C03E2827BD +:0401F2000793CC069D +:0401F300E219F80015 +:0401F4000400079369 +:0401F5000323069E3C +:0401F600E79300A1EA +:0401F700E693008704 +:0401F8008B0D0086E5 +:0401F9004505858AA9 +:0401FA0000F10223EB +:0401FB0000D102A38A +:0401FC0000E103A378 +:0401FD00C602C40270 +:0401FE0040E226C1F4 +:0401FF008082017188 +:04020000470211118F +:04020100080007B733 +:040202008FF9CC069E +:04020300110A07379E +:040204001047071385 +:04020500C03E8FD98F +:0402060000414783E9 +:040207000037E79342 +:0402080000F10223DC +:04020900C111479543 +:04020A009713478D72 +:04020B0047830027FE +:04020C00858A00419E +:04020D009B8D45057B +:04020E0002238FD95F +:04020F00578300F120 +:04021000F7930061FF +:04021100132370073C +:04021200219900F13D +:04021300017140E253 +:040214001151808282 +:040215001437C222B6 +:04021600C0260002FC +:0402170084AA46016E +:0402180004C0059386 +:0402190004040513C1 +:04021A003B0DC406CE +:04021B000FF4F59354 +:04021C00051346017F +:04021D00338504041D +:04021E0004C0059380 +:04021F0004040513BB +:040220003B2946052B +:0402210004040513B9 +:0402220040A24412A0 +:040223004585448247 +:04022400B32D0131C4 +:04022500C42211419D +:040226000002143787 +:04022700C02AC22601 +:04022800460184AE59 +:0402290004C0059375 +:04022A0004040513B0 +:04022B0031FDC606D5 +:04022C0046014782BE +:04022D0004040513AD +:04022E000FF7F5933E +:04022F0005133B294F +:04023000442204045C +:0402310085A640B2AC +:0402320046054492A7 +:04023300B3210141B1 +:04023400C40611519A +:0402350040A23FBDE7 +:040236000FF5751338 +:04023700808201318F +:04023800C406115196 +:0402390040A23F455B +:04023A000131450148 +:04023B00113180827B +:04023C00C426C622EC +:04023D0084AAC806C1 +:04023E00440187AE42 +:04023F0000C448634C +:04024000443240C242 +:04024100450144A28D +:040242008082015164 +:040243000087873376 +:0402440000074583E7 +:040245000084853379 +:040246000FF5751328 +:04024700C03EC232C1 +:0402480004053F95D5 +:040249004782461290 +:04024A000793BFD186 +:04024B0005333E80B9 +:04024C00F06F02F558 +:04024D001151FCCF80 +:04024E00453D458164 +:04024F00374DC4065D +:04025000458140A202 +:04025100061005137B +:04025200BF5901315E +:04025300C222115161 +:040254000413645DCE +:0402550045834A840F +:040256004515002426 +:040257003749C40659 +:0402580000244783B4 +:0402590003D0059336 +:04025A00839D45112A +:04025B0000279713CE +:04025C0000C4478310 +:04025D008FD99BEDAD +:04025E0000F406237F +:04025F004505379585 +:0402600045F5376DBC +:040261003FA945115B +:0402620003000593FD +:040263000610051369 +:0402640005933F813E +:0402650045250B2000 +:04026600059337A124 +:0402670045290F8096 +:040268000593378142 +:04026900452D0370AC +:04026A0045813F2566 +:04026B003F0D453DC1 +:04026C0005134581B0 +:04026D00372D0C908D +:04026E0005134581AE +:04026F00370D0CA09B +:0402700005134581AC +:040271003F290CB065 +:0402720005134581AA +:040273003F090CC073 +:0402740005134581A8 +:0402750037290CD049 +:0402760005134581A6 +:0402770037090CE057 +:0402780005134581A4 +:040279003DED0CF05B +:04027A0005134581A2 +:04027B003DCD0D0068 +:04027C000044458372 +:04027D0040A2441245 +:04027E000E10051346 +:04027F00B5CD0131C7 +:04028000C82211215E +:040281000413C62676 +:04028200CA063E80EA +:04028300872A4685FB +:04028400543387AEBA +:04028500648D0285FD +:0402860000D59563A7 +:04028700849364896F +:040288004585800424 +:04028900C432453DF9 +:04028A00C03AC23E76 +:04028B0045813D5517 +:04028C000330051323 +:04028D00D59335755B +:04028E0005130084D0 +:04028F00354D0340A6 +:04029000051345818C +:040291003D69035070 +:040292000FF475935D +:04029300030005134C +:0402940055933D4100 +:04029500F593008459 +:0402960005130FF548 +:0402970035490310D2 +:040298000104559375 +:040299000FF5F593D5 +:04029A000320051325 +:04029B0045813D95C7 +:04029C0035BD453DEA +:04029D00051345817F +:04029E00359D0C502E +:04029F0064DD4702D1 +:0402A0008693479268 +:0402A100C6984A842D +:0402A20084934705F5 +:0402A30044094A843C +:0402A4008363462208 +:0402A500442900E701 +:0402A6008223470563 +:0402A70083A300E449 +:0402A8004685008403 +:0402A9000363473D67 +:0402AA00470100D632 +:0402AB0000E482A346 +:0402AC000C000593AA +:0402AD000E00051327 +:0402AE00351DC03EFC +:0402AF004705478236 +:0402B000059005139D +:0402B1000AE799635C +:0402B20075933521EA +:0402B300E5930FC5FB +:0402B4000513001519 +:0402B5003529059052 +:0402B6003BDD4511D6 +:0402B7000EB5759378 +:0402B8003BFD4511B4 +:0402B9000044C583B5 +:0402BA000E1005130A +:0402BB0005933BD597 +:0402BC0005130E40D8 +:0402BD0033ED0E20EF +:0402BE000054C583A0 +:0402BF000E300513E5 +:0402C0003BF989BDC0 +:0402C1000E80059313 +:0402C2000E400513D2 +:0402C30045853BD161 +:0402C40033F9453D88 +:0402C5000513458157 +:0402C60033D909100F +:0402C7000513458155 +:0402C8003B7D092051 +:0402C900051345854F +:0402CA003B5D09305F +:0402CB000513458151 +:0402CC00337D094035 +:0402CD000C04659325 +:0402CE00098005138B +:0402CF0045933355CB +:0402D00005920FF490 +:0402D10000B5E593FC +:0402D2000FB5F593DC +:0402D3000990051376 +:0402D40045813B41E4 +:0402D5003369453D07 +:0402D6000C10059370 +:0402D7000E000513FD +:0402D8000793334114 +:0402D9008323FC106F +:0402DA0040D200F41A +:0402DB0044B24442A3 +:0402DC000161450572 +:0402DD003BA9808237 +:0402DE000FC5759340 +:0402DF001151BF9961 +:0402E000C4064511FA +:0402E100659333B13D +:0402E200F59300850B +:0402E30045110FF5BD +:0402E40040A23B8178 +:0402E500030005937A +:0402E60006100513E6 +:0402E700B3890131A5 +:0402E800451111515A +:0402E900332DC406E7 +:0402EA00659340A236 +:0402EB00F593004542 +:0402EC0045110FF5B4 +:0402ED00B32D0131FB +:0402EE00C4061151E0 +:0402EF00E911C2222D +:0402F000051345812C +:0402F1003B290CD0C9 +:0402F20040A24505DC +:0402F300013144127F +:0402F400842E808252 +:0402F500D9F54501F1 +:0402F600453D4585B8 +:0402F70045833311F7 +:0402F80005130034B6 +:0402F90039ED058056 +:0402FA0000444583F4 +:0402FB000590051352 +:0402FC00458339C538 +:0402FD000513005491 +:0402FE0031DD05A049 +:0402FF0000644583CF +:0403000005B005132C +:04030100458339F106 +:04030200051300746B +:0403030039C905C02F +:0403040000844583A9 +:0403050005E00513F7 +:04030600458331E119 +:040307000513009446 +:04030800397D05F046 +:0403090000A4458384 +:04030A0006000513D1 +:04030B004583395598 +:04030C00051300B421 +:04030D00316D061038 +:04030E0000C445835F +:04030F0006200513AC +:0403100045833145AB +:04031100051300D4FC +:04031200395906301F +:0403130000E445833A +:040314000640051387 +:04031500458331717A +:04031600051300F4D7 +:040317003149065012 +:040318000034079313 +:0403190004414581D5 +:04031A000007C7030E +:04031B008D9907852C +:04031C000FF5F59351 +:04031D00FEF41AE3ED +:04031E0006F58593C8 +:04031F000FF5F5934E +:0403200005D00513EC +:04032100458139B128 +:040322003999453D83 +:04032300BF15458D30 +:04032400C4061151A9 +:04032500E911C222F6 +:0403260005134581F5 +:0403270031890CE02C +:0403280040A24505A5 +:040329000131441248 +:04032A00842E80821B +:04032B00D9F54501BA +:04032C00453D458581 +:04032D00458331359E +:04032E00051300347F +:04032F00310D068006 +:0403300000444583BD +:04033100069005131A +:0403320045833921A5 +:04033300051300644A +:04033400313906B0A5 +:040335000074458388 +:0403360006C00513E5 +:0403370045833111B8 +:0403380047830034C3 +:040339000513004464 +:04033A0097AE06D0A4 +:04033B00071005930F +:04033C0047838D9DC9 +:04033D008D9D00543E +:04033E00006447838D +:04033F0047838D9DC6 +:040340008D9D00741B +:040341000FF5F5932C +:0403420045813EE1D2 +:040343003EC9453D2D +:04034400B761458DCB +:04034500C22211516E +:04034600842A45813F +:04034700C406453D66 +:04034800051336C1A2 +:04034900366D0C10F1 +:04034A0000803433C8 +:04034B000FE57593B2 +:04034C0005138DC147 +:04034D00366D0C10ED +:04034E0040A2441273 +:04034F000513458DC0 +:0403500001310C600B +:040351001121BE7147 +:04035200C22AC626CF +:04035300451184AE1E +:04035400C82245F581 +:040355008432C036F8 +:040356003659CA0644 +:04035700675D468216 +:040358004A870613B7 +:0403590097938A8567 +:04035A0046830016C0 +:04035B009AF500C649 +:04035C0007938EDD98 +:04035D0006234A87A2 +:04035E00C03E00D6C7 +:04035F00C2998A892C +:040360003F494505C7 +:0403610005134782B7 +:04036200C783070046 +:04036300C43E00375D +:04036400F7133681D4 +:040365004685003495 +:040366000035759356 +:04036700076347A23F +:04036800468908D7E3 +:0403690008D7076347 +:04036A000087F6937F +:04036B00E593C299BB +:04036C00F6930205FD +:04036D00C29900171A +:04036E000105E5930D +:04036F000027F693DA +:04037000E593C299B6 +:040371008B910085E7 +:04037200E593C399B3 +:040373000513004529 +:04037400C43A070080 +:0403750047223631B4 +:040376001A071963E6 +:040377004785880D21 +:0403780004F40C631A +:04037900126347893B +:04037A0097931AF447 +:04037B0087E1018491 +:04037C00D463440101 +:04037D00041300075E +:04037E00F4930A00EA +:04037F0007930304D9 +:040380008B63020089 +:04038100079314F4D6 +:04038200836303008E +:0403830047C104F476 +:04038400906365DD40 +:04038500460D16F417 +:040386003D458593D9 +:040387000730051323 +:0403880065DD34F902 +:0403890085934649C9 +:04038A00A83DC2C503 +:04038B000405E593ED +:04038C00E593BFA591 +:04038D00BF8D080513 +:04038E0001849793BC +:04038F00F41387E1FB +:04039000DCE30404A2 +:040391006413FA07F0 +:040392007413FA04E2 +:04039300B7750FF437 +:04039400460D65DDD0 +:040395003D8585938A +:040396000730051314 +:04039700A93FF0EF9B +:04039800464965DD90 +:04039900C40585937F +:04039A0007600513E0 +:04039B00A83FF0EF98 +:04039C000513448978 +:04039D00F0EF072056 +:04039E007593A5BFEF +:04039F008C4501C5C3 +:0403A00005138DC1F3 +:0403A100F0EF072052 +:0403A2004782A5BF2A +:0403A300C783458542 +:0403A4008B8900C77A +:0403A5004581E3911A +:0403A6000C0005132F +:0403A700A45FF0EF70 +:0403A800451145D5E1 +:0403A900A3DFF0EFEF +:0403AA00051345C131 +:0403AB00F0EF061059 +:0403AC004712A33F12 +:0403AD001D634789FC +:0403AE0005930CF7B0 +:0403AF0005130880AA +:0403B000F0EF062044 +:0403B10045C1A1FFA2 +:0403B20006300513F9 +:0403B300A15FF0EF67 +:0403B4000840059365 +:0403B50006400513E6 +:0403B600A09FF0EF25 +:0403B700F0EF450519 +:0403B8004511A4DF68 +:0403B9009EDFF0EFE4 +:0403BA0001D5759361 +:0403BB00F0EF451109 +:0403BC0005139F3F47 +:0403BD00F0EF064017 +:0403BE004511A35FE3 +:0403BF009D5FF0EF5F +:0403C00001557593DB +:0403C100F0EF451103 +:0403C20004139DBFC4 +:0403C3004539064072 +:0403C4009C1FF0EF9B +:0403C500E901894180 +:0403C6000442147D5C +:0403C7008041450527 +:0403C800A0BFF0EFF3 +:0403C9004581F46D09 +:0403CA00F0EF4531DA +:0403CB0005939B7F7C +:0403CC0045350400AF +:0403CD009ADFF0EFD4 +:0403CE0045394585E3 +:0403CF009A5FF0EF52 +:0403D00045394581E5 +:0403D10099DFF0EFD1 +:0403D2009EFFF0EFAB +:0403D300444240D28E +:0403D400450544B2E5 +:0403D50080820161C0 +:0403D600460D65DD8E +:0403D7003D85859348 +:0403D80007300513D2 +:0403D90098BFF0EFEA +:0403DA00464965DD4E +:0403DB00C1858593C0 +:0403DC00460DBDE528 +:0403DD003D45859382 +:0403DE0007300513CC +:0403DF00973FF0EF65 +:0403E000464965DD48 +:0403E100C0458593FB +:0403E2004401B5C558 +:0403E300B5D54481C7 +:0403E400051345E1D7 +:0403E500F0EF06200F +:0403E60045C194BFBA +:0403E70006300513C4 +:0403E800941FF0EF7F +:0403E900B73D45B126 +:0403EA00C2221151C9 +:0403EB00842AC0267A +:0403EC00453D84AE59 +:0403ED00C40645817C +:0403EE00929FF0EFFB +:0403EF00059005135D +:0403F000911FF0EF7A +:0403F10002F5759309 +:0403F200041AE4996C +:0403F300F5938DC130 +:0403F400E5930FF589 +:0403F50044120105A8 +:0403F600448240A25B +:0403F7000590051355 +:0403F800F06F013170 +:0403F90067DD8FFF2E +:0403FA00B2878793AC +:0403FB002C23675DEB +:0403FC00A7034AF712 +:0403FD0005130C8751 +:0403FE00CB01F380BC +:0403FF000D47A703FC +:04040000100007934E +:0404010000F713638A +:0404020080824501AE +:0404030086AE67DD7D +:04040400A50385AA1D +:0404050011514B87BF +:04040600F0EFC40649 +:04040700C119C02F28 +:04040800F370051375 +:04040900013140A2DB +:04040A0011218082BA +:04040B008432C8224D +:04040C00CA06C62630 +:04040D000FF47793DE +:04040E00872E86AA05 +:04040F0064DD062280 +:04041000A503C385F8 +:0404110075934B8410 +:0404120005A2F0044B +:040413009EAFF0EFB9 +:040414000513C119F2 +:0404150040D2F3508E +:0404160044B2444266 +:04041700808201617D +:04041800A503C22A4C +:04041900C42E4B841E +:04041A00C03285B2B5 +:04041B0097EFF0EF78 +:04041C0046924602BC +:04041D00D57147222C +:04041E00F36005136F +:04041F001131BFE9EF +:04042000C806C62222 +:0404210087AAC426BC +:040422008732842E6B +:040423004501E41992 +:04042400443240C25C +:04042500015144A29B +:040426000693808237 +:0404270084A210009B +:040428000086F463F3 +:040429001000049328 +:04042A0085A6863AE3 +:04042B00C23A853E0E +:04042C003FA5C03EEA +:04042D004782FD7194 +:04042E008C054712E0 +:04042F00070597A680 +:040430001121B7F1EE +:04043100C626C822F1 +:04043200842ECA0644 +:040433004481C0320E +:04043400ED6347012C +:040435004782008476 +:040436000463450115 +:04043700051300F7B2 +:0404380040D2F3407B +:0404390044B2444243 +:04043A00808201615A +:04043B0040940733AF +:04043C001000061393 +:04043D0000E67463FE +:04043E001000071390 +:04043F0085BA8636BE +:04044000C436852613 +:040441003719C23A6B +:040442004712FD69F7 +:04044300B61346A204 +:0404440085BA001461 +:04044500C236853600 +:04044600007020EF33 +:040447008493872AE9 +:0404480046921004C4 +:040449001141B77D29 +:04044A00645DC42207 +:04044B000513C02AAB +:04044C00C6064BC4D1 +:04044D00061030EF76 +:04044E00E9094582F1 +:04044F00200007136F +:04045000460146819A +:040451004BC4051380 +:04045200195030EF1E +:04045300442240B24D +:040454008082014160 +:04045500C822112187 +:04045600CA06C626E6 +:0404570083AE842AC2 +:04045800C03684B274 +:040459004501E099E0 +:04045A000713A815C7 +:04045B0083262000D4 +:04045C00009774632E +:04045D002000031365 +:04045E0017134582A9 +:04045F0067DD010351 +:04046000468183410D +:040461008513862257 +:04046200C41E4BC7A2 +:0404630030EFC21A9A +:04046400431214F03B +:04046500C90143A2E4 +:0404660040A005337A +:04046700444240D2F9 +:04046800016144B238 +:040469004502808246 +:04046A00859A861ECB +:04046B00C21AC41ECF +:04046C00F56D35F9FC +:04046D0043A2431251 +:04046E005713040517 +:04046F0093BA0083B9 +:04047000406484B3AD +:0404710065DDB74549 +:040472008593655DAC +:040473000513510517 +:04047400206F4D05A3 +:0404750065DD1B70B6 +:040476008593655DA8 +:0404770005135745CD +:04047800206F4E455E +:0404790011511A7093 +:04047A00C406C222D0 +:04047B00F0EF842AF0 +:04047C0045819B3FDC +:04047D00F0EF450156 +:04047E00E435A9BFF9 +:04047F000713675D9B +:040480004348524754 +:04048100019C07B71C +:04048200CC07879389 +:0404830002A7D7B342 +:0404840000A70603C4 +:04048500450345F1F5 +:0404860066DD010727 +:0404870062068693F0 +:040488000413645D98 +:0404890006335904D9 +:04048A00458302B6EE +:04048B0087B30264CD +:04048C0096B202A77B +:04048D0000E6D503AD +:04048E0002744603AB +:04048F0002A787B386 +:0404900000C7450359 +:0404910087B3050523 +:04049200450302A775 +:04049300050500E774 +:0404940002F5053335 +:04049500FACFF0EFBB +:0404960002644503B4 +:0404970040A2441229 +:04049800F06F0131CF +:0404990040A2D9EFB5 +:04049A0001314412D6 +:04049B0011518082F9 +:04049C0084AAC02648 +:04049D00C406450547 +:04049E00F0EFC22297 +:04049F00F0EFA9BF12 +:0404A0004581901FE3 +:0404A100F0EF450132 +:0404A200B693933F3B +:0404A30046010014FA +:0404A4004505458144 +:0404A500AB3FF0EF8A +:0404A600645DE49D10 +:0404A700879367DDF3 +:0404A80004135907D9 +:0404A900C683524470 +:0404AA00470301679C +:0404AB00460100F412 +:0404AC004501458140 +:0404AD00D08FF0EF0D +:0404AE00879367DDEC +:0404AF00C78359079F +:0404B00007A3016736 +:0404B100852602F4A6 +:0404B20044123F3978 +:0404B300448240A29D +:0404B40001314501CC +:0404B500A41FF06F21 +:0404B600C406115116 +:0404B700ED2DC22243 +:0404B800C78367DDB2 +:0404B90047214F5731 +:0404BA0004E78C6364 +:0404BB0089634741C9 +:0404BC00471100E7FD +:0404BD0004E79E634F +:0404BE006AB020EF11 +:0404BF00A0A14505AE +:0404C0000713675D5A +:0404C100435052470B +:0404C200019C07B7DB +:0404C300CC07879348 +:0404C40002C7D7B3E1 +:0404C50000A7060383 +:0404C600675D45F138 +:0404C70062070713AE +:0404C800063386AAC7 +:0404C900973202B6AE +:0404CA0000E75703ED +:0404CB0002E787B30A +:0404CC0001C9C73764 +:0404CD0037F70713E3 +:0404CE0000F763636D +:0404CF00853646BD6B +:0404D000663020EF83 +:0404D1004412450D7F +:0404D200013140A212 +:0404D30021F0206F85 +:0404D400653020EF80 +:0404D500BFC5450159 +:0404D600871367DD44 +:0404D70046835907F8 +:0404D80047090207C7 +:0404D9005907841328 +:0404DA008363453DB6 +:0404DB00450100E6F1 +:0404DC00633020EF7A +:0404DD00020447834B +:0404DE00450D470978 +:0404DF00FCF775E3CE +:0404E0008D1D451514 +:0404E1000FF575138B +:0404E2001111BF7DB8 +:0404E300CC06678953 +:0404E400C826CA223A +:0404E5007107879381 +:0404E60000021737C2 +:0404E7000C07268355 +:0404E8000006D463D3 +:0404E900FBFD17FD03 +:0404EA0009E030EF06 +:0404EB00879362DDB4 +:0404EC00C78352422E +:0404ED00842A00B7A6 +:0404EE00524284935F +:0404EF001737C7995B +:0404F000278300025C +:0404F10083C10C07B0 +:0404F20005138B8DD6 +:0404F300C63E03708E +:0404F400219020EF44 +:0404F5000513C02A01 +:0404F60020EF038070 +:0404F700458220F02A +:0404F80016936605EC +:0404F9000613008561 +:0404FA008EF1F00689 +:0404FB00006556132F +:0404FC008A058ECD12 +:0404FD000513C22AF7 +:0404FE00C43603906D +:0404FF0000C484A30E +:040500001E9020EF3A +:040501000513C02AF4 +:0405020020EF03A043 +:0405030016371DF09A +:0405040047B20002F8 +:040505000C062603B7 +:04050600438245895E +:0405070062DD46A2C9 +:0405080002B78B6348 +:0405090000B4C583F2 +:04050A00E589471226 +:04050B0018F005934C +:04050C0002D5F363BE +:04050D009D63458520 +:04050E00569300B749 +:04050F00F693012638 +:0405100006857FF6E7 +:040511001906B5937F +:040512000015C59378 +:04051300A80947816B +:040514000207771350 +:04051500B593DB655A +:04051600C5930C86F7 +:0405170047850015FF +:0405180000B4C30365 +:04051900675D665D57 +:04051A0049860613F5 +:04051B005907071362 +:04051C001A031A6341 +:04051D003C04026335 +:04051E003C058063B5 +:04051F00000605834A +:040520005C634309CC +:04052100002318B3E8 +:040522004605000684 +:0405230000C485A3E8 +:04052400A6034411D5 +:040525001313524218 +:0405260065050085E2 +:04052700F0050513C3 +:0405280000A3733386 +:0405290000160513A0 +:04052A0000736333C4 +:04052B006D6365DDBA +:04052C00851300D55E +:04052D0069630016E8 +:04052E0040D000C5F4 +:04052F0000661663E9 +:040530000084C6037A +:0405310036F60D632A +:04053200560588A33F +:0405330000C7458335 +:040534000254C603A4 +:0405350008C59A63F8 +:0405360000D7458322 +:040537000264C60391 +:0405380008C59463FB +:0405390000E745830F +:04053A000274C6037E +:04053B0006C59E63F0 +:04053C0000F74583FC +:04053D000284C6036B +:04053E0006C59863F3 +:04053F0001074583E8 +:040540000294C60358 +:0405410006C59263F6 +:040542000077458376 +:040543000204C603E5 +:0405440004C59C63EB +:040545000087458363 +:040546000214C603D2 +:0405470004C59663EE +:040548000097458350 +:040549000224C603BF +:04054A0004C59063F1 +:04054B0000A745833D +:04054C000234C603AC +:04054D0002C59A63E6 +:04054E0000B745832A +:04054F000244C60399 +:0405500002C59463E9 +:040551000197458346 +:040552000324C603B5 +:0405530000C59E63DE +:0405540001A7458333 +:040555000334C603A2 +:0405560000C59863E1 +:04055700024745838F +:0405580003D4C603FF +:0405590000C58963ED +:04055A008622458927 +:04055B0000B4736312 +:04055C0074134609C5 +:04055D0045830FF6CD +:04055E00C603017758 +:04055F0088630304A6 +:04056000860302C547 +:0405610045F100A4BC +:0405620002B60633A4 +:04056300859365DD3A +:04056400962E620568 +:0405650001065583B3 +:0405660020D0061388 +:0405670000C59963CF +:040568008622458919 +:0405690000B4736304 +:04056A0074134609B7 +:04056B00665D0FF6C4 +:04056C005896460354 +:04056D008603CE2112 +:04056E0045F100A4AF +:04056F00063363DD0F +:04057000839302B6B9 +:04057100C503620359 +:04057200C08301043D +:0405730015930324B5 +:0405740081C101033D +:04057500D60393B264 +:04057600053300E366 +:04057700460102C572 +:040578008141054276 +:040579000000866395 +:04057A000183A60350 +:04057B008A05820566 +:04057C00C21AC43E9D +:04057D0020EFC03675 +:04057E00675D1AB0EB +:04057F00431246825B +:0405800062DD47A24F +:0405810059070713FC +:040582004405E0113B +:0405830052D2A2238B +:040584000064A2234A +:0405850000F48423D7 +:040586000585A02D1A +:0405870000B6002397 +:04058800BD854401E8 +:040589009963C01999 +:04058A000303200542 +:04058B0050F1000625 +:04058C001E135F6378 +:04058D000006002341 +:04058E00000485A33D +:04058F009AE3441196 +:0405900067DDE4053A +:040591005907C6033D +:040592000194C68387 +:0405930006D61E6307 +:040594000017460303 +:0405950001A4C68374 +:0405960006D618630A +:0405970000274603F0 +:0405980001B4C68361 +:0405990006D612630D +:04059A0000374603DD +:04059B0001C4C6834E +:04059C0004D61C6302 +:04059D0000474603CA +:04059E0001D4C6833B +:04059F0004D6166305 +:0405A00000574603B7 +:0405A10001E4C68328 +:0405A20004D6106308 +:0405A30001274603E3 +:0405A40002B4C68354 +:0405A50002D61A63FD +:0405A60001374603D0 +:0405A70002C4C68341 +:0405A80002D6146300 +:0405A90001474603BD +:0405AA0002D4C6832E +:0405AB0000D61E63F5 +:0405AC0001174603EA +:0405AD0002A4C6835B +:0405AE0000D61863F8 +:0405AF0002574603A6 +:0405B00003E4C68317 +:0405B10000D6046309 +:0405B2004405E0110B +:0405B3000187450374 +:0405B4000314C683E3 +:0405B50000A68D63AC +:0405B6000104C583F4 +:0405B70036B020EF4B +:0405B80088A367DDD0 +:0405B900871300A400 +:0405BA00E0115907EC +:0405BB0045034405AB +:0405BC00C68301C72A +:0405BD0087630354F9 +:0405BE0020EF00A684 +:0405BF0067DD38506C +:0405C000590787133D +:0405C10001D7450316 +:0405C2000364C68385 +:0405C30000A68763A4 +:0405C400017020EFB3 +:0405C500871367DD54 +:0405C6004503590789 +:0405C700C68301E7FF +:0405C80087630374CE +:0405C90020EF00A679 +:0405CA0067DD00B039 +:0405CB005907871332 +:0405CC0002174503CA +:0405CD0003A4C6833A +:0405CE000227458338 +:0405CF0000A6966389 +:0405D00003B4C68327 +:0405D10000B6876386 +:0405D2007C0020EF9A +:0405D300871367DD46 +:0405D400450359077B +:0405D500C68301B721 +:0405D6008E630344E9 +:0405D70046E100A653 +:0405D80002D5053310 +:0405D900869366D9C6 +:0405DA0095366E06DE +:0405DB0013F020EF0A +:0405DC00871367DD3D +:0405DD004503590772 +:0405DE00C6830207C7 +:0405DF008763039497 +:0405E000F0EF00A692 +:0405E10067DDB57F9E +:0405E200590787131B +:0405E30001F74503D4 +:0405E4000384C68343 +:0405E50000A6846385 +:0405E60022F020EFF0 +:0405E70065DD66DD8B +:0405E8005B96851386 +:0405E9008593461D93 +:0405EA0030EF566533 +:0405EB0067DD4A205E +:0405EC00871366DD2E +:0405ED00C9015907E0 +:0405EE005B96851380 +:0405EF0077C020EFC2 +:0405F000871367DD29 +:0405F100460359075D +:0405F200C683026753 +:0405F300186303F492 +:0405F400460300D6E4 +:0405F500C683027740 +:0405F600096304048D +:0405F700450300D6E2 +:0405F800F0EF0157C8 +:0405F90067DDA05FBB +:0405FA005907871303 +:0405FB00C68366DD70 +:0405FC00CE8158A6AE +:0405FD000287450329 +:0405FE000414C70317 +:0405FF0000A70763E7 +:040600000562155129 +:0406010020EF856100 +:0406020067DD23602D +:04060300590785937B +:0406040001948513C5 +:0406050003100613C5 +:0406060045A030EFEC +:0406070040E2852226 +:0406080067DD445214 +:04060900580784A367 +:04060A00017144C274 +:04060B00137D808259 +:04060C000066002361 +:04060D00B5214401CE +:04060E0000060023BF +:04060F00C603BFE57A +:040610004505571530 +:04061100C8A604E390 +:040612007613060550 +:0406130088A30FF6B3 +:040614001DE356C5C7 +:040615004589C6A6A7 +:040616007363862262 +:04061700460900B4DC +:040618000FF6741352 +:040619001101B1A575 +:04061A00CE22675D28 +:04061B000693CC2650 +:04061C0085035247B9 +:04061D0047F100A6FB +:04061E0007B3635D5E +:04061F00061302F5C7 +:04062000041362035A +:04062100C583620328 +:0406220007130106B3 +:0406230097B25247F1 +:0406240000C7D60332 +:040625000147C28344 +:04062600C603C03215 +:04062700C6220137AF +:04062800C603C23211 +:040629004689019667 +:04062A0004D615637A +:04062B0001A746835A +:04062C00F6930685B6 +:04062D004B500FF629 +:04062E000C6367856D +:04062F00ED6322F65F +:04063000079304C761 +:040631000D63040051 +:04063200031320F698 +:04063300F06302006E +:04063400031306C7DF +:0406350047910800E1 +:0406360004660E63E5 +:040637008006031323 +:040638000963478D7E +:04063900033704037C +:04063A0087AE000483 +:04063B001C6677635F +:04063C004305A09141 +:04063D0010E34681FF +:04063E004F90FC6677 +:04063F0000C7468327 +:04064000C6018A0560 +:04064100468DDACD3B +:04064200D6D5B77DD5 +:040643000177C683F2 +:0406440036B316F1C2 +:04064500B74500D0E5 +:04064600000207B7F0 +:040647001EF6016337 +:0406480016C7EE6380 +:040649004799630961 +:04064A0000660663DD +:04064B00479163412F +:04064C00FA661BE34C +:04064D004383635D23 +:04064E0043214F53A2 +:04064F00006396634B +:0406500002C202865A +:040651000102D2933D +:0406520001274383B6 +:04065300F763430501 +:040654008333005399 +:0406550003424072AA +:040656000103531336 +:04065700053342F134 +:0406580044320255D1 +:0406590040F583B332 +:04065A00024744838C +:04065B00540395228D +:04065C0082B300A5C0 +:04065D00C42202832E +:04065E00C2B34409D6 +:04065F0044030282CC +:04066000843302B726 +:0406610002C2028748 +:040662000102D2932C +:0406630004429416A3 +:04066400C8228041E7 +:040665000125450323 +:0406660000A30433B6 +:04066700027403B363 +:0406680094139396BE +:0406690042830103C4 +:04066A00804100D7F4 +:04066B004385CA22D7 +:04066C00043702FA53 +:04066D009363200073 +:04066E0044010074CF +:04066F0003B76489E0 +:040670000363100010 +:04067100438100962B +:0406720002A5853325 +:040673000010063736 +:0406740080060613E3 +:0406750006EE07C2C4 +:04067600052E44E227 +:0406770046228D7119 +:0406780002C58633FE +:04067900026585B3DE +:04067A007FF676137E +:04067B00005666338C +:04067C0005378E4967 +:04067D0013370FF030 +:04067E0005D200029F +:04067F008E4D8DE926 +:0406800063B38C5183 +:0406810028230074B6 +:0406820043830A7331 +:040683004603011712 +:0406840045F1010734 +:04068500062A03B688 +:0406860000C3E3B317 +:04068700E7B346424D +:04068800447200F3C5 +:040689000136139390 +:04068A000077E3B35F +:04068B00E3B347D2BC +:04068C00202300F334 +:04068D0047830A7322 +:04068E00460300C758 +:04068F0007F601E782 +:040690008FD1066A96 +:0406910002C7460353 +:040692008FD10652AC +:0406930000A70603B3 +:0406940002B6063371 +:04069500962E45B2A6 +:0406960001564603C0 +:040697008FD10646B3 +:0406980047828EDD2A +:0406990047928EDD19 +:04069A008EDD07AE3C +:04069B0008D3282335 +:04069C0003E74783A6 +:04069D0002D74683B7 +:04069E0006AA07BAE7 +:04069F0046838FD52A +:0406A0008FD501D71A +:0406A10001C74683C4 +:0406A20001B7470352 +:0406A3008FD506A643 +:0406A4008FD90712D1 +:0406A50008F3202313 +:0406A60080826105E8 +:0406A700001007B781 +:0406A80006F60363EC +:0406A900002007B76F +:0406AA00E2F61FE372 +:0406AB0002A743035C +:0406AC0087B3479930 +:0406AD00F793406718 +:0406AE0043030FF7FC +:0406AF001BE3024700 +:0406B0004402E60317 +:0406B100FE840313AD +:0406B2000103141319 +:0406B300C0228041A0 +:0406B40003134412D6 +:0406B500141300C456 +:0406B600804101037B +:0406B700BD99C22205 +:0406B80002A743034F +:0406B90087B3478D2F +:0406BA000786406708 +:0406BB000FF7F793AB +:0406BC004303B591AE +:0406BD00479102A7B8 +:0406BE00406787B357 +:0406BF004303BFC56D +:0406C000479502A7B1 +:0406C1004795BFD5C5 +:0406C2001111BF4D06 +:0406C300CA2267DD03 +:0406C400645D470525 +:0406C50056E788A3C9 +:0406C6005244079300 +:0406C7000047A283C3 +:0406C800CC06C8266E +:0406C9005244049300 +:0406CA001A0282632B +:0406CB00524427036B +:0406CC0018070E639A +:0406CD00A0EEC7B71D +:0406CE00B007879357 +:0406CF0002E7D7B3B4 +:0406D0000084C703D8 +:0406D100019C03B7CE +:0406D200CC0383933F +:0406D3000253D3B348 +:0406D40016070C6396 +:0406D5000257D2B343 +:0406D60003B0051355 +:0406D700C21EC61663 +:0406D800288020EF67 +:0406D9000513C42A17 +:0406DA0020EF03C04A +:0406DB00C78327E0CA +:0406DC00C6030184CC +:0406DD0043920084C0 +:0406DE000027971347 +:0406DF00879367D9BD +:0406E00097BA9287AC +:0406E1002703439414 +:0406E20007935244E4 +:0406E30042B2070018 +:0406E4000793E2197D +:0406E50066370690DE +:0406E600655D00014D +:0406E7009DC6061393 +:0406E800051345C5EC +:0406E900C2164E45A2 +:0406EA0030EFC61E09 +:0406EB0042921A001D +:0406EC00079343B27B +:0406ED00069306402A +:0406EE00655D3E8088 +:0406EF0002F2D73309 +:0406F000051345C5E4 +:0406F100F633574540 +:0406F200C23A02D333 +:0406F30002F2F2B36A +:0406F400472987BA51 +:0406F50002E657338F +:0406F6000001663762 +:0406F7000613C01610 +:0406F800D6B39E4691 +:0406F90030EF02D309 +:0406FA0067DD164062 +:0406FB0060D7C7837A +:0406FC00F0EFE3999F +:0406FD0067DDDE4F88 +:0406FE005887C683D0 +:0406FF00C583461257 +:040700002503008449 +:0407010020EF52444F +:0407020067DD08B0F7 +:0407030086BE577DDA +:040704000CE5056398 +:0407050000A48523A4 +:0407060000A48703C1 +:04070700467167DDF3 +:040708004CE7852312 +:0407090002C70733E9 +:04070A00879367DD8D +:04070B00C5036207B9 +:04070C00C6835886C2 +:04070D0040D00104D3 +:04070E000324C2837B +:04070F00C70397BACB +:040710008D79016777 +:040711000AA3675D73 +:04071200D5834EA796 +:04071300472200E792 +:0407140002D585B3D2 +:040715000FF7771350 +:0407160007334681DE +:0407170005C202B75E +:04071800573381C111 +:04071900064202C7CB +:04071A008563824130 +:04071B004F940002F5 +:04071C008A858285C3 +:04071D000FF7771348 +:04071E0067A020EFC1 +:04071F000394C50377 +:04072000E58FF0EF82 +:040721000104C58387 +:040722000314C503F4 +:040723005BA020EFC8 +:0407240000A488A302 +:04072500BD3FF0EFF5 +:0407260002E4C7839F +:0407270000E4C50322 +:04072800E79145818F +:0407290000F4C58390 +:04072A00B5938D896D +:04072B00F0EF0015D6 +:04072C00C783AFAF21 +:04072D00C50303C439 +:04072E00C78502E495 +:04072F0040E244520E +:04073000017144C24D +:04073100DAAFF06FDC +:04073200B569078618 +:0407330063916285E7 +:040734007702829333 +:04073500D543839392 +:040736004791B541F1 +:0407370000F4852322 +:04073800ED09BF25E3 +:04073900C70344525C +:04073A00C68300F47E +:04073B0040E202F4A2 +:04073C00460144C26C +:04073D000171458180 +:04073E00AC5FE06F5D +:04073F00445240E2FE +:04074000017144C23D +:040741001151808250 +:0407420064DDC0268C +:040743004CD4C503CA +:04074400C222458107 +:0407450010EFC406E7 +:04074600842A07F00A +:04074700C683E12163 +:0407480067DD4CD449 +:0407490080A3472919 +:04074A0067DD52D73E +:04074B005C07C783FD +:04074C0000E78563DA +:04074D0007A3675D3A +:04074E0067DD4CF720 +:04074F005227C70363 +:04075000C701478115 +:04075100C78367DD16 +:04075200675D4CF79C +:040753005007071331 +:04075400453D97BACE +:0407550000D7802326 +:040756006D6010EFD3 +:0407570040A2852215 +:040758004482441281 +:040759008082013168 +:04075A00C026115153 +:04075B00C50364DD91 +:04075C00C2224CD495 +:04075D0010EFC406CF +:04075E00842A6B80FE +:04075F00C683E51D4B +:0407600067DD4CD431 +:0407610052D780A348 +:04076200C70367DD85 +:040763004781522751 +:0407640067DDC70185 +:0407650053C7C7832C +:040766000713675DB1 +:0407670097BA5007E6 +:040768008023453D68 +:0407690010EF00D7B6 +:04076A0085226880FC +:04076B00441240A252 +:04076C000131448291 +:04076D0067DD808242 +:04076E004CA7C703CA +:04076F0067DD46F10B +:0407700056E788239D +:0407710002D7073371 +:04077200879367DD25 +:0407730097BA6207C8 +:0407740000E7D68341 +:040775001623675D83 +:04077600C68350D70F +:04077700675D014772 +:0407780058D7162315 +:040779000127C6830B +:04077A001423675D80 +:04077B00D6834CD7FE +:04077C00675D00A70E +:04077D004ED71F2311 +:04077E000157C683D6 +:04077F001B23675D74 +:04078000C6834ED707 +:04078100675D013778 +:0407820058D713230E +:0407830000C7D703D1 +:040784009D2367DD6D +:0407850080824EE739 +:04078600115167DDC9 +:040787005707C60347 +:04078800C22667DD41 +:0407890050C7D483FE +:04078A00C42267DD41 +:04078B0058C7D40374 +:04078C00C38367DDDF +:04078D0067DD4C8751 +:04078E004FE7D283DC +:04078F00D30367DD4C +:0407900067DD4F676B +:040791005867C5835D +:0407920067DD675D5B +:040793004FA7D78312 +:0407940052470713AE +:04079500450386AAE8 +:04079600C03E00B7AA +:04079700879367DD00 +:04079800C9316207FA +:0407990000A70703AB +:04079A0004C7176316 +:04079B000733477168 +:04079C00973E02E69C +:04079D0000E7550319 +:04079E0002951B6342 +:04079F0001474503C6 +:0407A0000285176354 +:0407A10001274503E4 +:0407A2000275136366 +:0407A30000A7550353 +:0407A40000551F637A +:0407A50001574503B0 +:0407A60000651B636C +:0407A70001374503CE +:0407A80000B517631E +:0407A90000C757032B +:0407AA00066345029B +:0407AB00675D00A7DF +:0407AC0004A3450558 +:0407AD00477158A791 +:0407AE0002E6063326 +:0407AF000513655D6C +:0407B00097B25105A6 +:0407B10000B789A361 +:0407B20000878A230F +:0407B300007789231F +:0407B40000678AA3AD +:0407B5004422470291 +:0407B60000979723EE +:0407B70095234492B0 +:0407B800962300572D +:0407B900663700E7B8 +:0407BA000613000121 +:0407BB0045C5694681 +:0407BC00206F013178 +:0407BD0011516590E1 +:0407BE00C222C40689 +:0407BF00143747C5DF +:0407C00020230002F0 +:0407C10020230EF4EF +:0407C20028230E04D6 +:0407C30065090A04B6 +:0407C40008042823DA +:0407C50071050513A2 +:0407C6009E6FE0EF53 +:0407C7001D100713E7 +:0407C8009C2367DD2A +:0407C90015374EE7AB +:0407CA00079300038E +:0407CB0020231D10BA +:0407CC0005130EF40F +:0407CD00E0EFD40580 +:0407CE0026379C8F9F +:0407CF0005B7000664 +:0407D0000513019C70 +:0407D1000613040403 +:0407D2008593A8065D +:0407D300E0EFCC0582 +:0407D40010EFE24FF1 +:0407D50010EF397078 +:0407D60054795D10E5 +:0407D7004501C951BE +:0407D800689010EF26 +:0407D9000FF0079383 +:0407DA0003635475EC +:0407DB0020EF08F50E +:0407DC0045092800A3 +:0407DD0095DFE0EFD5 +:0407DE00547147CD3E +:0407DF0006F51A639E +:0407E0009CDFE0EFCB +:0407E1002DB010EF38 +:0407E20067DDC50901 +:0407E300852347051E +:0407E400F0EF58E7F3 +:0407E500842A854F8E +:0407E6002DADE12D27 +:0407E700655D65D90E +:0407E80003100613E1 +:0407E900A845859307 +:0407EA0053D50513CB +:0407EB004C7020EF3F +:0407EC00655D65D909 +:0407ED00036006138C +:0407EE00BF458593EB +:0407EF005C4505134D +:0407F0004B3020EF7B +:0407F100453D4581BC +:0407F2005CC010EFE8 +:0407F300C50367DDF6 +:0407F40045815217D2 +:0407F5005C0010EFA5 +:0407F600000217B72F +:0407F7000D07A783C0 +:0407F80000E797136C +:0407F900000743634F +:0407FA00450125A5EB +:0407FB00A82FF0EF44 +:0407FC0040A2852270 +:0407FD000131441270 +:0407FE00547D808224 +:0407FF0067DDBFD51E +:040800004CB7C783A7 +:04080100CC221101F3 +:04080200F7930785DC +:0408030007B20FF732 +:0408040083C107C2E3 +:04080500645DC63E2A +:040806004F84578341 +:04080700CE064732A0 +:040808008FD9CA2694 +:040809008FD96721FB +:04080A004EF41C2369 +:04080B000002173799 +:04080C00000166374A +:04080D00202364DD63 +:04080E0006130EF7C8 +:04080F0045C5954600 +:0408100051048513F7 +:04081100507020EF14 +:0408120097EFF0EF7D +:04081300177D6741A5 +:04081400C83A478512 +:04081500000217378F +:040816000D07268321 +:040817008EF14642D6 +:04081800E3DDC23624 +:0408190066DDC2D501 +:04081A005C4686931F +:04081B000166D60399 +:04081C005783459227 +:04081D001E634F8483 +:04081E0076F50EB6A7 +:04081F008FF516FD3E +:040820004EF41C2353 +:040821000EF720238B +:0408220050048823D3 +:0408230093AFF0EFB0 +:04082400000625376E +:04082500A80505130A +:04082600866FE0EF0A +:040827004F84578320 +:04082800669147325C +:040829003E800513F5 +:04082A008FD58FD9FE +:04082B004EF41C2348 +:04082C000002173778 +:04082D000EF720237F +:04082E0034B020EFD3 +:04082F00371020EF6F +:04083000186347857D +:0408310017B700F500 +:040832005BBC0002A9 +:04083300D7E3C43E05 +:0408340020EFFE07AC +:0408350057033730FE +:04083600EF15008139 +:04083700000166371F +:040838009606061307 +:04083900851345C519 +:04083A0020EF510456 +:04083B00F0EF461084 +:04083C0057038D8F42 +:04083D0077F14F847C +:04083E008FF917FD1A +:04083F004EF41C2334 +:040840000002173764 +:040841000EF720236B +:04084200051365092C +:04084300D0EF71057C +:040844004792FF1FB9 +:0408450047C2B7816E +:0408460000F717633D +:04084700000166370F +:0408480097060613F6 +:0408490047A2B7C14A +:04084A0015FD6585AE +:04084B00061383C14C +:04084C008FED0640E6 +:04084D0002C756B3D5 +:04084E0002C7773333 +:04084F0000B79C63EF +:040850000001663706 +:04085100978606136D +:04085200851345C500 +:0408530020EF51043D +:04085400BF713FD061 +:0408550002C7F5B32E +:0408560051048513B1 +:0408570002C7D7B34A +:0408580000016637FE +:040859000613C02E94 +:04085A0045C59846B2 +:04085B003DF020EF5D +:04085C00D683BFBDC3 +:04085D0046120186B8 +:04085E00F6C69DE35A +:04085F0083D107D268 +:040860004EF41C2313 +:04086100446240F2BB +:040862000EF720234A +:04086300450144D235 +:040864008082610528 +:04086500C406115163 +:04086600973FF0EFD9 +:04086700537010EFCB +:0408680040A267DD66 +:040869005A57C50312 +:04086A00F06F0131F9 +:04086B0001138C4F9A +:04086C00D406FD4170 +:04086D00D026D2229D +:04086E00FB5FD0EF6D +:04086F00F0EF842AF8 +:0408700086AAD39FE2 +:04087100655D64DD80 +:040872001206C66341 +:0408730000016637E3 +:040874000520071341 +:04087500061346819F +:0408760045C5998655 +:040877004E450513D2 +:0408780036B020EF87 +:04087900000165B75E +:04087A0085934645D7 +:04087B0085139C85C0 +:04087C0020EF5744CE +:04087D00E0EF281070 +:04087E00A537FE1F7D +:04087F000513000756 +:04088000D0EF12059E +:04088100D0EFEFDFE6 +:040882005513F1DF3A +:04088300079300A433 +:0408840007B312C0E4 +:04088500645D02F5B7 +:04088600C402C602E0 +:04088700C202C002E7 +:0408880052440413BF +:040889004799CC3E81 +:04088A0017B7C83E96 +:04088B00A78300023D +:04088C00665D0D0791 +:04088D009713655DFB +:04088E00834101079A +:04088F00FFF7C69316 +:0408900060E62223D9 +:04089100073783E1C1 +:040892008F7500035B +:040893000FF7F593D3 +:04089400A42366DD56 +:04089500062360E6F0 +:04089600853260B592 +:0408970066DD86365E +:040898008793CF81F2 +:04089900F793FFE5ED +:04089A00430D0FF704 +:04089B0000F376638D +:04089C006006C783A8 +:04089D0000B79463A9 +:04089E0060052223AC +:04089F00802367DD6E +:0408A000A68360B615 +:0408A100AE235FC75C +:0408A200EAD15EE752 +:0408A300C78366DDC4 +:0408A40064DD58B601 +:0408A5004783C3F1D1 +:0408A600CFDD01841D +:0408A7004783675DBF +:0408A800460300B44F +:0408A9008FD160D7B4 +:0408AA00D0EFEBC5DB +:0408AB0047E2E9DF58 +:0408AC000AF5646382 +:0408AD000793473234 +:0408AE00EF630630BE +:0408AF0066DD08E713 +:0408B00058B6C683ED +:0408B100460547852C +:0408B20000F6876362 +:0408B300861347C29F +:0408B4003633FFA731 +:0408B500478300C0B5 +:0408B60046A10184D2 +:0408B700F79317FD9F +:0408B800E9630FF7EA +:0408B90066D904F602 +:0408BA008693078A90 +:0408BB0097B68E0658 +:0408BC008782439C50 +:0408BD000001663799 +:0408BE009AC60613BD +:0408BF00051345C513 +:0408C00020EF4E4592 +:0408C10065B7249063 +:0408C20046450001A6 +:0408C300F3C5859361 +:0408C40057448513FD +:0408C5002D1020EFE3 +:0408C600EBFFE0EF75 +:0408C7002423A00145 +:0408C800B7AD600662 +:0408C900C78367DD9D +:0408CA0037B34FC72A +:0408CB00078900F0A9 +:0408CC004CF487A3BE +:0408CD00474247B2A5 +:0408CE00F793078510 +:0408CF00C63E0FF71B +:0408D00007634799DA +:0408D100079300F792 +:0408D200F793001781 +:0408D300C83E0FF715 +:0408D400DD3FD0EF45 +:0408D500C43E478551 +:0408D60067DD291D94 +:0408D70060D7C7839C +:0408D800C781CA2AE0 +:0408D90000EF4501E6 +:0408DA00C78361B0BF +:0408DB0046834CF410 +:0408DC0084630184AC +:0408DD00475200F688 +:0408DE004722E711B5 +:0408DF004683CB156C +:0408E000C69D00B4FD +:0408E100C70366DD06 +:0408E200C43A52269C +:0408E30066DDC315F6 +:0408E40050068693A1 +:0408E500C50397B6FA +:0408E60067DD0007C3 +:0408E7005217C6835B +:0408E8008763C4025C +:0408E900458100A69F +:0408EA0052A780A3EE +:0408EB001E8010EF6C +:0408EC004CF4C603FF +:0408ED0001844783B8 +:0408EE0012C7836347 +:0408EF00473D67DD3D +:0408F00058E784231E +:0408F10085BE470D6C +:0408F20006C773635F +:0408F300F4634795CE +:0408F400478906C763 +:0408F5004509470565 +:0408F6000793C23E64 +:0408F700F793FFF67E +:0408F80046A10FF70F +:0408F90004F6ED63B1 +:0408FA00078A66D92A +:0408FB00904686930A +:0408FC00439C97B6CC +:0408FD004785878222 +:0408FE0067DDFE05AF +:0408FF003DB7C783B7 +:040900000017B79392 +:04090100B72D079176 +:04090200D21D479922 +:040903004CF4C78366 +:04090400479DB7054F +:0409050067DDBF31BA +:040906004CE7C78370 +:0409070000F037B312 +:04090800B73907A153 +:0409090015E3479912 +:04090A004785F00627 +:04090B00470DB711CC +:04090C00C2024505D9 +:04090D004709B75D82 +:04090E00BFE54501FB +:04090F004783C00258 +:040910000C2303941D +:0409110005A300C476 +:040912004685000412 +:04091300F663458DB5 +:04091400459500F60F +:04091500F5938D9D2C +:04091600CE3A0FF5D1 +:04091700145010EF79 +:04091800215010EF6B +:04091900F3CFE0EF49 +:04091A00C78367DD4B +:04091B00477258A720 +:04091C00853AC781D0 +:04091D005A2010EF5D +:04091E0045124582B7 +:04091F006FF010EF76 +:040920000184478384 +:040921004645655D85 +:040922000027971300 +:04092300879367D976 +:0409240097BA928765 +:040925000513438CE7 +:0409260022234E45F5 +:0409270020EF0004B9 +:0409280065B714702B +:04092900655D000107 +:04092A008593464526 +:04092B0005139BC550 +:04092C0020EF57451C +:04092D0067DD13303F +:04092E0060D7C78344 +:04092F00E0EFE39979 +:0409300047D2D19F3A +:0409310067DDCF8926 +:040932004CC7C703E4 +:04093300156347A958 +:04093400453D00F746 +:0409350075B000EFAA +:04093600C4BFD0EF7B +:0409370067DDC602B0 +:0409380059078713C1 +:040939000157468399 +:04093A0002E4470389 +:04093B00590787933E +:04093C0002E68863E4 +:04093D0046814701A7 +:04093E0045814601A8 +:04093F00E0EF45019F +:0409400064DDABEFD8 +:04094100590487933B +:040942000157C50391 +:04094300D63FE0EFCC +:040944005904879338 +:040945000157C7038C +:040946000004222364 +:0409470002E407239C +:040948000157C70389 +:04094900C683E70D6D +:04094A0047030167F7 +:04094B00006302F44F +:04094C00470302D784 +:04094D00460100F46B +:04094E004501458199 +:04094F00A80FE0EF1E +:04095000879367DD45 +:04095100C7835907F8 +:0409520007A301678F +:04095300478302F4E0 +:04095400CFB101849A +:040955004512458280 +:04095600E33FE0EFAC +:040957000563478964 +:0409580047910AF5C4 +:0409590002F505633B +:04095A001263478558 +:04095B00478304F5D5 +:04095C00CF9500B47F +:04095D00AF2FF0EFD9 +:04095E004789A81D00 +:04095F00B5C1C03E20 +:04096000BFED478D13 +:04096100842347C1E3 +:04096200478558F578 +:040963004783BFC542 +:04096400C39D00B47B +:040965005783675DF0 +:04096600E7934F873D +:040967001C23002726 +:0409680017374EF7F8 +:040969002023000245 +:04096A00F0EF0EF7A5 +:04096B000513BEBFF3 +:04096C00D0EF12C0F6 +:04096D00B995B4DFA5 +:04096E00000422233C +:04096F000B9010EFEA +:040970000184478334 +:040971004645655D35 +:0409720000279713B0 +:04097300879367D926 +:0409740097BA928715 +:040975000513438C97 +:0409760020EF4E45DB +:0409770065B700B0B0 +:04097800655D0001B8 +:0409790085934645D7 +:04097A0005139BC501 +:04097B0020EF5745CD +:04097C0067DD7F6054 +:04097D0060D7C783F5 +:04097E00E0EFE3992A +:04097F00D0EFBDDF19 +:04098000C802B25F98 +:04098100B765C6028E +:0409820000B44783F3 +:04098300F0EFD3CDF1 +:04098400BF71CFCFA1 +:04098500655D65D96E +:0409860006131151F2 +:040987008593031041 +:040988000513A84566 +:04098900C406590542 +:04098A0064A020EF56 +:04098B00655D65D968 +:04098C0039C0061355 +:04098D007285859357 +:04098E0062050513E6 +:04098F00636020EF92 +:0409900067DD40A23D +:0409910084A34705EF +:04099200450158E7DC +:04099300808201312C +:04099400111167597D +:04099500B887079385 +:04099600CC06C8269D +:04099700C002CA22AE +:04099800C43E448194 +:0409990065B7645D7D +:04099A0046450001CD +:04099B00C2C58593B9 +:04099C004D040513EE +:04099D00770020EFD0 +:04099E00971347A2C2 +:04099F00655D00246E +:0409A000430C973E2F +:0409A10005134645AF +:0409A20020EF5105EC +:0409A300E0EF75A06C +:0409A4004681B39F36 +:0409A5001737C2221C +:0409A60025830002A3 +:0409A70067C10D0710 +:0409A800F63317FD0E +:0409A900645D00F594 +:0409AA0060C42223E0 +:0409AB000D0727030A +:0409AC000003053708 +:0409AD00471367DDA8 +:0409AE008F69FFF757 +:0409AF0060E7A42336 +:0409B000CA15C63E60 +:0409B100086347820E +:0409B200675D02F685 +:0409B3000014951384 +:0409B4005C47071382 +:0409B500EABD972AD6 +:0409B6001023479231 +:0409B70065B700B769 +:0409B80046450001AF +:0409B900C34585931A +:0409BA004D0785134D +:0409BB006F8020EF3A +:0409BC00AD7FE0EF3C +:0409BD00675D4685A7 +:0409BE00260347B213 +:0409BF00A3035FC768 +:0409C00087BA60870B +:0409C1006741E6059F +:0409C20002E31263D7 +:0409C30065D9E0BD55 +:0409C4000613655D54 +:0409C50085930360B3 +:0409C6000513BF4511 +:0409C700C01A5C45B1 +:0409C800552020EFA7 +:0409C9004689430216 +:0409CA0067DD44EDB4 +:0409CB00604427035A +:0409CC005E67AE2391 +:0409CD00C03AC63630 +:0409CE008F634709E3 +:0409CF00650902E6CE +:0409D0007105051395 +:0409D1009BBFD0EF09 +:0409D200B7B146B2C1 +:0409D30000075703BF +:0409D40002E346896B +:0409D5004792FAE665 +:0409D600000165B700 +:0409D7008593464579 +:0409D8008513C3C5FB +:0409D90020EF4D07B7 +:0409DA00E0EF67E003 +:0409DB004681A5DFCD +:0409DC0014F9B759FA +:0409DD00BF5D46892B +:0409DE0047690485DC +:0409DF00EE9754E358 +:0409E00040E244525B +:0409E100453D44C28A +:0409E200006F017130 +:0409E30001134A5062 +:0409E4000793FC4138 +:0409E500CA3E00B155 +:0409E600879367DDAF +:0409E700CC3E59C7E2 +:0409E800879367DDAD +:0409E900CE3E59D7CE +:0409EA00879367DDAB +:0409EB00D03E59E7BA +:0409EC00879367DDA9 +:0409ED00D23E59F7A6 +:0409EE0067DDD43EAF +:0409EF005A07879389 +:0409F00027B7D63E11 +:0409F10087930F03D6 +:0409F200C63EF017F6 +:0409F3003030079306 +:0409F4001823DA22C8 +:0409F500645D00F14C +:0409F6000923478DFD +:0409F700079300F171 +:0409F800C78352441B +:0409F900D826018774 +:0409FA0005A3DC066F +:0409FB00472500018B +:0409FC00524404134A +:0409FD008663448544 +:0409FE00849300E7F7 +:0409FF00F493001756 +:040A000067DD0FF4AB +:040A0100A603675D84 +:040A0200071360472F +:040A030047815C4784 +:040A0400568345E9E7 +:040A05001C63000767 +:040A0600476900D666 +:040A07000EF766631D +:040A0800078A675999 +:040A0900AB8707139D +:040A0A00439C97BAB8 +:040A0B0007098782CE +:040A0C0038B78E6306 +:040A0D00BFF10785A9 +:040A0E0066DD4785D5 +:040A0F004F86D70334 +:040A10001007471371 +:040A11004EE69C23EE +:040A12002703675DF2 +:040A1300169360874F +:040A1400D36300F7B1 +:040A150087A60006AA +:040A160000E716934C +:040A17000006DE6394 +:040A18004683675D4D +:040A190045855907AF +:040A1A00E563460149 +:040A1B00068500D577 +:040A1C000FF6F613C8 +:040A1D0058C708238B +:040A1E00450147291E +:040A1F0000E7866303 +:040A200007A3675D64 +:040A210045054CF744 +:040A2200D70367DDB2 +:040A230066DD4F87B6 +:040A240060D6C6834F +:040A250007429B4D9C +:040A26009C23834149 +:040A2700EA814EE72B +:040A2800C68366DD3E +:040A2900068A50A643 +:040A2A009C238F5525 +:040A2B00D7034EE7B8 +:040A2C0050E24F87BE +:040A2D0017B7545251 +:040A2E00A0230002FF +:040A2F0054C20EE7B8 +:040A300003C10113EA +:040A310047898082EF +:040A3200478DBF8DA0 +:040A33004791B7BD73 +:040A34004795B7AD7E +:040A35004799B79D89 +:040A3600479DB78D94 +:040A370047A1BFB95B +:040A380047A5BFA966 +:040A3900675DBF999D +:040A3A0060D74783B7 +:040A3B000017B69357 +:040A3C0060D706A3D6 +:040A3D004683675D28 +:040A3E00675D521787 +:040A3F004CD706A3E7 +:040A40004505E791F0 +:040A410007D000EFEB +:040A4200BF0547A9FC +:040A43008CBFE0EF95 +:040A44000683BFE581 +:040A4500477100A451 +:040A4600000217B7DC +:040A470002E686B38A +:040A48000713675DCC +:040A4900A783620716 +:040A4A0066370C07F8 +:040A4B00655D0001E4 +:040A4C00B246061395 +:040A4D00051345C583 +:040A4E00C23E4D0552 +:040A4F0066DD973693 +:040A50005216C683F1 +:040A5100406020EFF2 +:040A520000B44703A2 +:040A53004792CB29D2 +:040A5400061366051A +:040A55008E7D80060C +:040A56007FF7F6939D +:040A570000C0373371 +:040A580096B30685C6 +:040A590096BA00E663 +:040A5A000700071377 +:040A5B000713C219A2 +:040A5C0083C10690BC +:040A5D000037F61355 +:040A5E0002A0079358 +:040A5F000793E219FE +:040A60001637020043 +:040A6100523000020D +:040A620045C5655DC4 +:040A63006637C03200 +:040A64000613000174 +:040A65000513B306BC +:040A660020EF510527 +:040A6700E0EF3B0081 +:040A6800B79D829F15 +:040A69005783675DEB +:040A6A00C7934F8758 +:040A6B001C23010740 +:040A6C00BF994EF7E9 +:040A6D00C70367DD77 +:040A6E0046055907D9 +:040A6F0065634681F4 +:040A7000070500E690 +:040A71000FF7769372 +:040A720058D78823A6 +:040A730067DDBF3547 +:040A74005907871384 +:040A7500001747031C +:040A76008793460517 +:040A77004681590754 +:040A780000E66563CC +:040A79007693070564 +:040A7A0080A30FF74F +:040A7B00BF2900D7B8 +:040A7C000793675D18 +:040A7D00C7835907CB +:040A7E000713004713 +:040A7F00C7815907CB +:040A8000F79317FDD4 +:040A810002230FF746 +:040A8200BDFD00F7BF +:040A83000713675D91 +:040A84004783590744 +:040A850046B9004727 +:040A860000F6F36320 +:040A8700078547B9DF +:040A880065B7B7DDBA +:040A8900655D0001A6 +:040A8A0085934645C5 +:040A8B000513B40596 +:040A8C0020EF4D0505 +:040A8D00635D3B204A +:040A8E00000165B747 +:040A8F0051030513F7 +:040A900085934645BF +:040A910020EFB50598 +:040A9200E0EF39E078 +:040A9300675DF7CFD5 +:040A94000713635D84 +:040A950017B7620726 +:040A9600A6030002B1 +:040A970067DD0D0703 +:040A98005C4787939D +:040A9900824106424E +:040A9A0045ED46815F +:040A9B000007D50378 +:040A9C0000C5066328 +:040A9D00078906853A +:040A9E00FEB69AE323 +:040A9F0000A4078325 +:040AA00087B3467161 +:040AA100461502C72D +:040AA200C78397BAB5 +:040AA3006463017710 +:040AA400461102F6FF +:040AA50004D64A63C6 +:040AA600973E181847 +:040AA700FDC747033D +:040AA80040D75733A9 +:040AA900CF118B05D9 +:040AAA001818078A87 +:040AAB00A78397BACC +:040AAC008023FE475E +:040AAD00E0EF00D79F +:040AAE0067DDF20FFF +:040AAF00600786A3B3 +:040AB0006637B5A14F +:040AB10006850001B5 +:040AB200B5C60613AC +:040AB300051345C51D +:040AB40020EF5103DB +:040AB500E0EF2780C7 +:040AB600A537EF0F62 +:040AB700051300071C +:040AB800D0EF120564 +:040AB900BFC1E1CF09 +:040ABA0086E347B1D7 +:040ABB006509FCF6D7 +:040ABC0071050513A8 +:040ABD00E0AFD0EFE7 +:040ABE00871367DD56 +:040ABF00635D62070A +:040AC00067DDBF9996 +:040AC1005907871337 +:040AC200018747035E +:040AC3008793467956 +:040AC4004681590707 +:040AC50000E665637F +:040AC6007693070517 +:040AC7008C230FF776 +:040AC800B3DD00D7C3 +:040AC900871367DD4B +:040ACA00470359077E +:040ACB008793018785 +:040ACC0046FD590783 +:040ACD00177DD76D4D +:040ACE0065B7B7CD84 +:040ACF00655D000160 +:040AD000859346457F +:040AD1000513B6C58E +:040AD20020EF4D05BF +:040AD30065B729A03A +:040AD400655D00015B +:040AD500859346457A +:040AD6000513B7C588 +:040AD70020EF5105B6 +:040AD80064412860ED +:040AD900E62FE0EF35 +:040ADA0017B7147DB9 +:040ADB00A6830002EC +:040ADC0067DD0D07BE +:040ADD005C478713D8 +:040ADE0047818EE1DD +:040ADF005583466D88 +:040AE0008C6300071C +:040AE100078500D5B0 +:040AE2009AE3070983 +:040AE3006509FEC7DC +:040AE4007105051380 +:040AE500D6AFD0EFC9 +:040AE6004725BFC918 +:040AE70000F74C6365 +:040AE800078547290E +:040AE90002E7E7B386 +:040AEA0006A3675D9B +:040AEB00F0EF4CF7E5 +:040AEC00B711958F1A +:040AED009CE347310E +:040AEE00BDF5FCE76F +:040AEF00C70367DDF5 +:040AF00047A960D7DB +:040AF100C6071BE336 +:040AF200B98587A695 +:040AF300B9AD47A9A9 +:040AF400DBC101134E +:040AF500202318287A +:040AF6002E23241176 +:040AF7002C23228109 +:040AF800E0EF229178 +:040AF900C22AD44FEA +:040AFA007E3010EF4B +:040AFB00440D4792CD +:040AFC004611EBC5EF +:040AFD000828182C81 +:040AFE001EC020EF07 +:040AFF00000165B7D6 +:040B00008593461182 +:040B01000828DD459E +:040B02001B0020EFC5 +:040B0300064007930E +:040B04005783E941E9 +:040B0500059303C190 +:040B0600462103E1A0 +:040B070001E10513F0 +:040B080000F11E23B7 +:040B09001C0020EFBD +:040B0A0004615783A8 +:040B0B00020102A33E +:040B0C0000F11A23B7 +:040B0D000481578385 +:040B0E0000F11B23B4 +:040B0F0000EF45525C +:040B100057834BD0EC +:040B1100D42A04A13D +:040B120000F11A23B1 +:040B130004C157833F +:040B140000F11B23AE +:040B150000EF455256 +:040B160057834A5067 +:040B1700D62A04E1F5 +:040B180000F11A23AB +:040B190005015783F8 +:040B1A0000F11B23A8 +:040B1B0000EF455250 +:040B1C00D82A48D0BB +:040B1D002341250348 +:040B1E0000EFCA2AF0 +:040B1F0055A2481083 +:040B20000793DA2A33 +:040B210087131E20F8 +:040B2200E063FE6529 +:040B2300460514E788 +:040B240000EF18289E +:040B250057D248D08B +:040B260006F50B6362 +:040B270006600793CA +:040B280010EFC23ECA +:040B290047927290ED +:040B2A00896347058F +:040B2B0047632AE70B +:040B2C00071326F78E +:040B2D008863F35096 +:040B2E0044632AE70B +:040B2F00071324F78D +:040B30008763F340A4 +:040B310065B72AE793 +:040B320085930001A6 +:040B3300C23ED205E7 +:040B3400851367DDE1 +:040B350046455107D9 +:040B360010C020EFDC +:040B3700CEAFE0EF6E +:040B3800000F45372E +:040B39002405051377 +:040B3A00C16FD0EFC8 +:040B3B00DA634792A0 +:040B3C0058632A07C9 +:040B3D0066372A806D +:040B3E00655D0001F0 +:040B3F00E4060613AF +:040B4000051345C58F +:040B410020EF4D054F +:040B4200147D0440DA +:040B4300645DA2B992 +:040B4400000166370F +:040B4500DDC60613F0 +:040B4600051345C589 +:040B470020EF4D044A +:040B480056B202C0DF +:040B4900663767DDC7 +:040B4A00851300010E +:040B4B000613510735 +:040B4C0045C5DEC6F7 +:040B4D00016020EF34 +:040B4E00C8EFE0EF1D +:040B4F0054B257C283 +:040B5000C23E43015D +:040B5100C422450174 +:040B5200089364633D +:040B530092634792D0 +:040B540047831AA712 +:040B5500468301E1F1 +:040B5600470301C18F +:040B5700CFD501D124 +:040B5800000167B77A +:040B5900CEC78793E9 +:040B5A000613452217 +:040B5B00C03201E1C2 +:040B5C0000016637F7 +:040B5D00DF86061316 +:040B5E00051345C571 +:040B5F0010EF4D0541 +:040B600067DD7CD001 +:040B6100000165B773 +:040B620085934645EC +:040B63008513E5050C +:040B640010EF510736 +:040B650064416E1069 +:040B6600C2EFE0EF0B +:040B670014B7147D2E +:040B6800A78300025D +:040B6900675D0D04B3 +:040B6A005C4756830B +:040B6B008B638FE128 +:040B6C00071306F66F +:040B6D0057035C4787 +:040B6E0000630027F9 +:040B6F00650914F709 +:040B700071050513F3 +:040B7100B3AFD0EF5F +:040B72000793BFD94D +:040B7300BDC90650A2 +:040B7400406482B3A4 +:040B750020000793C2 +:040B76000057F463CD +:040B770020000293C5 +:040B7800041367DD1E +:040B790097132003AB +:040B7A0085130102DC +:040B7B0083414BC7A0 +:040B7C005613468145 +:040B7D00182C00949C +:040B7E00C616C81AB5 +:040B7F004E1010EF15 +:040B8000166387AAC7 +:040B810043420E05D8 +:040B8200182842B23B +:040B83000013361312 +:040B840000EF859663 +:040B8500832230D0C7 +:040B860067B7BF0589 +:040B8700879300014F +:040B8800B799F3C75F +:040B8900050010EF64 +:040B8A005783675DC9 +:040B8B0065094F8722 +:040B8C0071050513D7 +:040B8D000027E793C3 +:040B8E004EF71C23DF +:040B8F000EF4A0239D +:040B9000ABEFD0EF08 +:040B9100000165B743 +:040B92004645655D12 +:040B9300E045859321 +:040B94004D050513F3 +:040B9500791010EFD4 +:040B960067DD440DC6 +:040B9700000164B73E +:040B98005107851369 +:040B990085934645B5 +:040B9A0010EFE10473 +:040B9B00E0EF77B060 +:040B9C005632B58F89 +:040B9D004581183442 +:040B9E00E0EF45053A +:040B9F0087AAADAFC5 +:040BA000E20510E377 +:040BA10065B7675D70 +:040BA2000513000136 +:040BA30046454D076F +:040BA400E20585934E +:040BA500751010EFC8 +:040BA600E10485934E +:040BA700464564DD7E +:040BA800510485135C +:040BA900741010EFC5 +:040BAA00B1EFE0EFD8 +:040BAB0055B25642A7 +:040BAC0045011834B3 +:040BAD00A0EFE0EFE6 +:040BAE0013E387AA1C +:040BAF0010EFDE0560 +:040BB000675D50D05D +:040BB100000165B723 +:040BB200859346459C +:040BB3000513E645FB +:040BB40010EF4D07EA +:040BB50065B75A10B6 +:040BB60046450001AF +:040BB700E30585933A +:040BB800510485134C +:040BB900701010EFB9 +:040BBA00ADEFE0EFCC +:040BBB00440DA00144 +:040BBC00440DBB45E4 +:040BBD000670079324 +:040BBE00440DB365CA +:040BBF000680079312 +:040BC0000713B3451F +:040BC1008A63F360F0 +:040BC200071306E728 +:040BC3009CE3F3704C +:040BC40065B7DAE750 +:040BC5008593000113 +:040BC600BB55D8053E +:040BC70006600713AA +:040BC80006E7826357 +:040BC90000F74F637F +:040BCA0006400713C7 +:040BCB0006E7816355 +:040BCC0006500713B5 +:040BCD00D8E799E3E9 +:040BCE00000165B706 +:040BCF00D3858593B2 +:040BD0000713B379DB +:040BD10089630670BE +:040BD200071304E71A +:040BD3009CE3068019 +:040BD40065B7D6E744 +:040BD5008593000103 +:040BD600BB95D6C530 +:040BD700000165B7FD +:040BD800D2858593AA +:040BD90065B7B3AD9C +:040BDA0085930001FE +:040BDB00B385DA05FF +:040BDC00000165B7F8 +:040BDD00DB0585931C +:040BDE0065B7BB99A3 +:040BDF0085930001F9 +:040BE000B3B1D905CF +:040BE100000165B7F3 +:040BE200D48585939E +:040BE30065B7B389B6 +:040BE40085930001F4 +:040BE500BB25DC450B +:040BE600000165B7EE +:040BE700D585859398 +:040BE8002083B33D76 +:040BE90024032401BC +:040BEA00248323C17C +:040BEB00557D238190 +:040BEC00244101138C +:040BED0086AA8082D2 +:040BEE000001663765 +:040BEF000613655D27 +:040BF00045C5690688 +:040BF1005105051392 +:040BF2005830106FF8 +:040BF30046500693CF +:040BF40002D506B36D +:040BF500064007931C +:040BF600000166375D +:040BF7000613655D1F +:040BF80045C5F306F6 +:040BF900510505138A +:040BFA0002F6C6B386 +:040BFB0055F0106F32 +:040BFC00663786AA28 +:040BFD00655D000131 +:040BFE00EDC6061327 +:040BFF00051345C5D0 +:040C0000106F51051B +:040C010046B754900E +:040C02008693000FC6 +:040C0300053324068B +:040C0400678902D525 +:040C050096478793F4 +:040C06003E80071312 +:040C0700006336B799 +:040C0800EA068693DF +:040C09000001663749 +:040C0A00ED060613DA +:040C0B0057B345C5D1 +:040C0C00F7B302F543 +:040C0D00472902E78A +:040C0E0002D556B302 +:040C0F000513655D07 +:040C1000D733510580 +:040C1100106F02E777 +:040C120006935050A5 +:040C130006B346706E +:040C1400079302D56B +:040C150066370640F8 +:040C1600655D000117 +:040C170068860613D2 +:040C1800051345C5B6 +:040C1900C6B3510508 +:040C1A00106F02F65F +:040C1B0086AA4E1047 +:040C1C000001663736 +:040C1D000613655DF8 +:040C1E0045C5F08652 +:040C1F005105051363 +:040C20004CB0106F55 +:040C210027100693FF +:040C220002D506B33E +:040C230006400793ED +:040C2400000166372E +:040C25000613655DF0 +:040C260045C5F38647 +:040C2700510505135B +:040C280002F6C6B357 +:040C29004A70106F8E +:040C2A0027100693F6 +:040C2B000533050583 +:040C2C00069302D554 +:040C2D0066370640E0 +:040C2E0006130001A8 +:040C2F0045C5F3863E +:040C300002D546B3F0 +:040C31000513655DE5 +:040C3200106F5105E9 +:040C330016934810BC +:040C340086E10185CF +:040C3500000166371D +:040C360016D1655D11 +:040C3700EB8606132F +:040C3800051345C596 +:040C3900106F5105E2 +:040C3A0045F14650EA +:040C3B0002B50533C6 +:040C3C00859365DD5A +:040C3D0046456205C1 +:040C3E00655D95AAB1 +:040C3F005105051343 +:040C40004E50106F93 +:040C410000251793E0 +:040C420005136559D8 +:040C4300953EEFC526 +:040C4400655D410C9D +:040C45000513464508 +:040C4600106F5105D5 +:040C470047A94CB0BD +:040C480000F50F6341 +:040C490000251793D8 +:040C4A000513655DCC +:040C4B00953EC60507 +:040C4C00655D410C95 +:040C4D000513464500 +:040C4E00106F5105CD +:040C4F0065B74AB08B +:040C50008593000187 +:040C5100B7F5EE8580 +:040C52004585114182 +:040C5300C02AC606E7 +:040C5400675D219126 +:040C55006107478369 +:040C560007134682B8 +:040C5700E7896107C1 +:040C580000016737F9 +:040C5900F207071384 +:040C5A00663740B207 +:040C5B00655D0001D2 +:040C5C00F286061303 +:040C5D00051345C571 +:040C5E0001415105FA +:040C5F003CF0106FE6 +:040C6000A70367DDA2 +:040C610067DD6047A4 +:040C62005C478793D1 +:040C6300464546AD0F +:040C64000167D583CC +:040C650006E59263AB +:040C66000FF6F693FC +:040C67000763E11925 +:040C68001131280717 +:040C690064DDC4265C +:040C6A004994C28364 +:040C6B00645DC622DC +:040C6C002D040793B9 +:040C6D000032959329 +:040C6E00C80697AE6F +:040C6F000007A303D4 +:040C70000047C783EF +:040C71008513465150 +:040C72008733FF566F +:040C7300260302C78B +:040C740075130043B1 +:040C750043950FF59F +:040C76004994849386 +:040C77002D04041331 +:040C78004703963A5E +:040C7900E8630046E6 +:040C7A0063D902A395 +:040C7B008393050A50 +:040C7C00951EE78357 +:040C7D0085024108A3 +:040C7E000789068557 +:040C7F00F8C69AE336 +:040C8000BF69468181 +:040C81004783E39929 +:040C820017FD000357 +:040C83000FF7F793DD +:040C8400822395A290 +:040C8500470100F52E +:040C8600A091468172 +:040C8700000347031C +:040C880095A20785A5 +:040C890002E7E7B3E4 +:040C8A008763B7EDD8 +:040C8B008793000249 +:040C8C008023FFF2D0 +:040C8D00B7C500F4F3 +:040C8E0040C24432EA +:040C8F0067DD44A237 +:040C9000600786A3D0 +:040C9100D06F0151CE +:040C9200478DF91F72 +:040C930004F70E63F1 +:040C940012E347918F +:040C9500461CFCF706 +:040C9600872A978290 +:040C9700C783468544 +:040C9800655D000492 +:040C9900078E464537 +:040C9A004783943EBA +:040C9B0040040044CD +:040C9C008433445108 +:040C9D0040DC0287AE +:040C9E004D050513E8 +:040C9F00C036C23A5F +:040CA000438C97A248 +:040CA100361010EF0A +:040CA200459140DC5C +:040CA300C60397A24B +:040CA400EC630047B6 +:040CA50065D912C536 +:040CA6008593060A22 +:040CA700962EE90597 +:040CA800468242102E +:040CA9008602471266 +:040CAA00C3914A1C8C +:040CAB00C7839782E2 +:040CAC0043510004AC +:040CAD000017859314 +:040CAE000733078E73 +:040CAF00431400F4F6 +:040CB00000474703AF +:040CB100073342D0F3 +:040CB20096930267AC +:040CB30005330035D0 +:040CB400230300D442 +:040CB500973200056D +:040CB6000463471874 +:040CB700022300E331 +:040CB80097A20005FA +:040CB9000047C783A6 +:040CBA0096A2475166 +:040CBB0002E787B312 +:040CBC0000B48023DD +:040CBD00479C97B207 +:040CBE00BF31C29CE4 +:040CBF00ECE347918A +:040CC00067D9F0E719 +:040CC100EA478793E4 +:040CC200973E070A48 +:040CC3008782431CC5 +:040CC400433D460C5A +:040CC50000C645031D +:040CC60000D647030A +:040CC7000005C783DA +:040CC80000E64603F9 +:040CC90000669D63C1 +:040CCA0000F7786354 +:040CCB00F61317FD08 +:040CCC0080230FF77B +:040CCD00B5C500C5E4 +:040CCE00863AFD6DF8 +:040CCF00F863BFDD2A +:040CD000078500C7CD +:040CD1000FF7F7130F +:040CD20000E5802396 +:040CD300FD6DB5E915 +:040CD400BFDD8732C7 +:040CD50045BD4618BB +:040CD6000007578339 +:040CD70000B69C6364 +:040CD80000C6568379 +:040CD90000F6F563C9 +:040CDA0007C217FD39 +:040CDB00102383C19E +:040CDC00B55500F713 +:040CDD0000E6568354 +:040CDE00FED7FBE35F +:040CDF00B7F50785D9 +:040CE00045BD465078 +:040CE10047834218EB +:040CE200996300070B +:040CE300C78100B60F +:040CE400F79317FD6E +:040CE50000230FF7E2 +:040CE600BDB500F7A1 +:040CE70000464683FA +:040CE80000D7F563D9 +:040CE900F6930785F2 +:040CEA0000230FF7DD +:040CEB00B5A500D7D4 +:040CEC004B9C47983E +:040CED004703655DF7 +:040CEE004645000770 +:040CEF005105051393 +:040CF00097BA070A9E +:040CF10010EF438C31 +:040CF200443221F077 +:040CF30044A240C215 +:040CF400D06F01516B +:040CF5004798DF5FDE +:040CF60045034B9CCB +:040CF70097820007D9 +:040CF8004798B7ED75 +:040CF90055034B9CB8 +:040CFA0097820007D6 +:040CFB0067DDBFF9F9 +:040CFC0050078823F2 +:040CFD00C695BFD900 +:040CFE0066B7C3050D +:040CFF0086930001D7 +:040D00006637EC86E0 +:040D0100655D00012B +:040D0200F2C606131C +:040D0300051345C5CA +:040D040010EF510596 +:040D0500BF55139033 +:040D0600000166B7CB +:040D0700EC068693DD +:040D080047DCB7CD40 +:040D09004398D7E94B +:040D0A00BF45479CFE +:040D0B0047BD8082DE +:040D0C0016A7E063E3 +:040D0D00445257B73E +:040D0E00EF4101139D +:040D0F00355787933A +:040D100057B7C03ED3 +:040D11008793004183 +:040D1200C23E441782 +:040D130087936795C6 +:040D1400142320077D +:040D1500379300F11F +:040D1600222300F59F +:040D1700052310811F +:040D1800041300F1CF +:040D19002423010589 +:040D1A002023101171 +:040D1B0047B9109133 +:040D1C00F463042256 +:040D1D0065DD0AA7DF +:040D1E0004800793B3 +:040D1F008593462949 +:040D20000513500562 +:040D210005A300D155 +:040D2200062300F1B3 +:040D230010EF0001CC +:040D240067DD7E40C9 +:040D25004CF7C7833D +:040D2600061365DD6E +:040D27000C23036036 +:040D280067DD00F192 +:040D29004CC7C78369 +:040D2A005C4585930C +:040D2B0001F10513BA +:040D2C0000F10CA323 +:040D2D00C78367DD34 +:040D2E000BA352279A +:040D2F0067DD00F18B +:040D300050A7C7837E +:040D310000F10D239D +:040D3200C78367DD2F +:040D33000DA358B7FD +:040D340067DD00F186 +:040D35004FC7C7835A +:040D360000F10E2397 +:040D3700C78367DD2A +:040D38000EA33DB712 +:040D390067DD00F181 +:040D3A004CE7C78338 +:040D3B0000F10F2391 +:040D3C00782010EF1C +:040D3D000593862272 +:040D3E00850A0550CD +:040D3F00B2FFD0EF40 +:040D400000A03533A7 +:040D410040A0053396 +:040D42001081208379 +:040D43001041240334 +:040D440010012483F3 +:040D450010C10113C5 +:040D460007B78082E9 +:040D47008793039CEF +:040D480064DD03174C +:040D4900C783CC3E52 +:040D4A00EB916104C4 +:040D4B000001663706 +:040D4C006D86061397 +:040D4D00851345B510 +:040D4E0010EF61043D +:040D4F004635011014 +:040D50006104859322 +:040D510000B10513D5 +:040D520009D010EFC5 +:040D5300061365DD41 +:040D54008593031070 +:040D550008685905CC +:040D560071A010EF89 +:040D5700061365DD3D +:040D580085930B3044 +:040D59000513620517 +:040D5A0010EF04D1C1 +:040D5B0086227080FC +:040D5C0010000593EB +:040D5D00D0EF850A44 +:040D5E00655DAB5FC5 +:040D5F000014061363 +:040D60002E90059339 +:040D61006D350513D4 +:040D6200AF7FD0EFA0 +:040D6300BFAD4501DA +:040D64008082557DB7 +:040D6500EE81011307 +:040D6600109126239F +:040D67002A2364DDFA +:040D6800282310111B +:040D6900882310814A +:040D6A0047BD60041D +:040D6B0000A7FD637D +:040D6C00208357FD8C +:040D6D002403114109 +:040D6E0024831101C8 +:040D6F00853E10C1EC +:040D700011810113D9 +:040D71000541808236 +:040D720001051793CD +:040D73000070C22E1C +:040D740010000593D3 +:040D7500C03E853EB9 +:040D7600A35FD0EFB8 +:040D770065B7F971F2 +:040D7800859300015E +:040D790000686D059C +:040D7A008B6FD0EFBC +:040D7B001A6387AAC6 +:040D7C00470318050C +:040D7D0018630141B5 +:040D7E004683180789 +:040D7F000713015104 +:040D80009263052055 +:040D8100470318E626 +:040D8200C7450161FF +:040D830012E34685AC +:040D84005683FAD7C1 +:040D8500071302410D +:040D86009CE30310D7 +:040D87005403F8E633 +:040D880007130261EA +:040D890016E339C074 +:040D8A00C42AF8E49B +:040D8B000593463551 +:040D8C008513017159 +:040D8D0010EF6104FE +:040D8E0047127AE0AE +:040D8F00FB3547A247 +:040D90000613655D84 +:040D9100102C03100F +:040D920059050513E7 +:040D9300626010EF9B +:040D9400470147824A +:040D950004D00493EF +:040D9600869366DDFD +:040D970087936206D6 +:040D98000613100727 +:040D9900053310000E +:040D9A00C23A00D782 +:040D9B000078C03EDE +:040D9C0009C0031374 +:040D9D0005B38E0507 +:040D9E000B6300974C +:040D9F0010EF0E64DF +:040DA00047125F4057 +:040DA100041347826E +:040DA20004B3F004A2 +:040DA300849340975E +:040DA400971310048D +:040DA5008341010481 +:040DA6000070853E16 +:040DA70010000593A0 +:040DA8000442C23A05 +:040DA900969FD0EF52 +:040DAA0044818041BF +:040DAB004712478222 +:040DAC004703B765DD +:040DAD0046830181F7 +:040DAE0007220171A6 +:040DAF0006938F55C3 +:040DB00018E30480C0 +:040DB1004712EED720 +:040DB200EE0715E350 +:040DB300007866DD81 +:040DB40045394781F5 +:040DB50050068693CB +:040DB600460345A902 +:040DB700666300D798 +:040DB800833300C5BC +:040DB900002300D73C +:040DBA00078500C3E6 +:040DBB0096E30705AF +:040DBC004783FEB7B4 +:040DBD00675D02511B +:040DBE004CF70623C5 +:040DBF0066634725FB +:040DC000675D00F774 +:040DC1004CF707A341 +:040DC2004783A0299A +:040DC3007AE302418C +:040DC4004703FEF7EC +:040DC50067DD027173 +:040DC60085A3655D3F +:040DC700470358E79F +:040DC80067DD028160 +:040DC90003600613AA +:040DCA004EE78E233F +:040DCB000291470347 +:040DCC00059367DD47 +:040DCD008DA302B13F +:040DCE0047033CE7B4 +:040DCF0067DD02A139 +:040DD0005C45051366 +:040DD1004CE7872341 +:040DD20002314703A0 +:040DD300812367DD34 +:040DD40067DD52E79E +:040DD5005007C703F9 +:040DD60080A367DDB2 +:040DD700470352E795 +:040DD80067DD026170 +:040DD90050E7852337 +:040DDA0050A010EF26 +:040DDB00B591478106 +:040DDC0009C0061331 +:040DDD004FE010EFE4 +:040DDE00470567DD81 +:040DDF0058E784A3AA +:040DE0004785B7F597 +:040DE1004789B53D4C +:040DE2000113B52D17 +:040DE3000868DD813E +:040DE4002211222393 +:040DE5002281202324 +:040DE60020912E2307 +:040DE70098BFD0EFF2 +:040DE80010EFC02A1E +:040DE900478242807B +:040DEA0014079463F3 +:040DEB0065B7645D27 +:040DEC004645000177 +:040DED006BC58593BA +:040DEE004D04051398 +:040DEF0010EF64DDC0 +:040DF00088234B40C9 +:040DF100D0EF5004EB +:040DF200C626A01F52 +:040DF300C42264C1F1 +:040DF40017B714FD1C +:040DF500A7830002CE +:040DF600675D0D0721 +:040DF7005C4756837C +:040DF8008E638FE592 +:040DF900071300F6E6 +:040DFA0057035C47F8 +:040DFB000163002769 +:040DFC00650910F77E +:040DFD007105051364 +:040DFE00907FC0EF33 +:040DFF004481BFD993 +:040E0000171344017F +:040E010007130104CE +:040E020057932007DB +:040E0300C23E409714 +:040E040067DD863EE2 +:040E05004681472DAE +:040E06008513080C3C +:040E070010EF4BC7D6 +:040E0800E5792BE07D +:040E0900000165B7C8 +:040E0A006D0585935A +:040E0B00C0EF080824 +:040E0C00ED1DE71FD2 +:040E0D000181470315 +:040E0E004683EF0523 +:040E0F000713019133 +:040E100097630520BF +:040E1100468302E62C +:040E1200470501A1EE +:040E130002D762633D +:040E140015936605C7 +:040E150095B200840E +:040E16003E900613F1 +:040E170000E684630A +:040E18000550061368 +:040E19000874451202 +:040E1A008EDFD0EFA8 +:040E1B000485E15118 +:040E1C004741040541 +:040E1D00F8E417E3FB +:040E1E00352010EF7C +:040E1F00453D458187 +:040E2000D15FF0EFBF +:040E2100C78367DD3F +:040E2200675D4CF7C5 +:040E2300500707135A +:040E2400C50397BAB1 +:040E250045810007FC +:040E260080A367DD61 +:040E2700F0EF52A7EF +:040E280047A2CF7F8F +:040E29000001663727 +:040E2A00061386A67F +:040E2B0045C56A4609 +:040E2C004D078513D6 +:040E2D00496010EF19 +:040E2E0065B747B2AB +:040E2F004645000133 +:040E30006B05859336 +:040E310051078513CD +:040E320051C010EFAC +:040E33008FBFD0EFAE +:040E3400000F45372F +:040E35002405051378 +:040E3600827FC0EF08 +:040E370022412083B1 +:040E3800220124036C +:040E390024834502C7 +:040E3A00011321C1BE +:040E3B00808222810E +:040E3C002DA010EFE6 +:040E3D00C03E57FD5F +:040E3E005713B7D5BA +:040E3F00179301857F +:040E40008FD90185C0 +:040E410000FF06B7F1 +:040E420000851713FD +:040E43008FD98F753F +:040E440007136741E8 +:040E45008121F00710 +:040E46008D5D8D79B8 +:040E4700C6098082D6 +:040E4800000217B7D6 +:040E49000007A023DB +:040E4A00F6934701D3 +:040E4B001637FFC592 +:040E4C0007B30002E6 +:040E4D00646300E5F5 +:040E4E00898D02D7B1 +:040E4F009463470D54 +:040E5000D68302E55E +:040E51001737000748 +:040E52001223000265 +:040E5300C78300D77A +:040E5400022300274E +:040E550017B700F7D4 +:040E56004B880002C3 +:040E5700439C8082B6 +:040E5800C25C071160 +:040E59004709B7F995 +:040E5A0000E59963B3 +:040E5B000007D703B2 +:040E5C00000217B7C2 +:040E5D0000E79223F5 +:040E5E004705BFF98C +:040E5F00FCE59DE32E +:040E60000007C703BD +:040E6100000217B7BD +:040E620000E7822300 +:040E63001151B7E989 +:040E64001437C2225B +:040E6500C0260002A1 +:040E660084AA460113 +:040E670004A005934B +:040E68000404051366 +:040E6900C0EFC4060C +:040E6A0085A6BF7F1B +:040E6B000513460124 +:040E6C00C0EF0404CB +:040E6D000593C25FC8 +:040E6E00051304A0C4 +:040E6F00460504042C +:040E7000BDDFC0EF33 +:040E7100040405135D +:040E720040A2441244 +:040E730045854482EB +:040E7400C06F013119 +:040E75001141BEBFAA +:040E76001437C42247 +:040E7700C22600028D +:040E780084AEC02A5A +:040E79000593460196 +:040E7A00051304A0B8 +:040E7B00C60604049F +:040E7C00BADFC0EF2A +:040E7D004601478261 +:040E7E000404051350 +:040E7F00C0EF85BE7D +:040E80000513BD9FFA +:040E810044220404FF +:040E820085A640B24F +:040E8300460544924A +:040E8400C06F0141F9 +:040E85001151BC5FEC +:040E86004405C2223B +:040E870000A414337C +:040E88000FF47413DC +:040E8900451985A2E0 +:040E8A00F0EFC406BB +:040E8B0085A2FADF63 +:040E8C0040A244122A +:040E8D000131451DCD +:040E8E00F9FFF06F09 +:040E8F0005061151F2 +:040E90007413C222F3 +:040E910085A20FF532 +:040E9200C406450548 +:040E9300F8BFF0EFC5 +:040E9400441285A2DD +:040E9500450940A229 +:040E9600F06F0131C7 +:040E97001151F7DF1F +:040E9800C406451532 +:040E9900F2BFF0EFC5 +:040E9A0008600713D2 +:040E9B001363478115 +:040E9C00059304E5D1 +:040E9D000513090030 +:040E9E00F0EF02006F +:040E9F004581F5DFB5 +:040EA0000210051324 +:040EA100F53FF0EF3A +:040EA200051345816E +:040EA300F0EF02204A +:040EA400458DF49FE5 +:040EA50002300513FF +:040EA600F3FFF0EF77 +:040EA7000513458169 +:040EA800F0EF0280E5 +:040EA9000593F35F5B +:040EAA000513030029 +:040EAB00F0EF07104D +:040EAC004785F29FE5 +:040EAD00853E40A29C +:040EAE00808201310C +:040EAF0001A3114149 +:040EB000153700A151 +:040EB100C422000255 +:040EB200842E46053F +:040EB300040505131A +:040EB4000031059371 +:040EB500C0EFC606BE +:040EB6008522B4BF1E +:040EB700E22FC0EF77 +:040EB800442240B2DE +:040EB90080820141F1 +:040EBA00C2221151EE +:040EBB005783645D98 +:040EBC00C4064F8495 +:040EBD00F793C026C1 +:040EBE0007C2F9F777 +:040EBF001C2383C1AC +:040EC00014B74EF421 +:040EC100A023000268 +:040EC20045510EF494 +:040EC300DF2FC0EF6E +:040EC400051345D1FC +:040EC500F0EF0380C7 +:040EC60045D1FA7F99 +:040EC700039005137C +:040EC800F9DFF0EF6F +:040EC900455145D179 +:040ECA00F95FF0EFED +:040ECB00051345D1F5 +:040ECC00F0EF07102C +:040ECD0045D1F8BF54 +:040ECE0005E0051323 +:040ECF00F81FF0EF29 +:040ED000051345D1F0 +:040ED100F0EF06D068 +:040ED20045D1F77F90 +:040ED300F0EF4531C6 +:040ED4000593F6FF8D +:040ED500450532009D +:040ED600F65FF0EFE4 +:040ED700451945D1A3 +:040ED800F5DFF0EF63 +:040ED900320005934B +:040EDA00F0EF4509E7 +:040EDB005783F53F05 +:040EDC0040A24F845D +:040EDD000407E7938C +:040EDE004EF41C238F +:040EDF00A0234412F6 +:040EE00044820EF446 +:040EE10080820131D9 +:040EE200C8221121F0 +:040EE3005783645D70 +:040EE400CA064F8467 +:040EE500F793C62693 +:040EE60007C2F9F74F +:040EE700C02E83C1D5 +:040EE8004EF41C2385 +:040EE90000021737B5 +:040EEA000EF72023BC +:040EEB00059384AA3D +:040EEC004505320086 +:040EED00F09FF0EF93 +:040EEE004F84578353 +:040EEF0000021737AF +:040EF000E79345C17E +:040EF1001C230207B5 +:040EF20020234EF477 +:040EF30085260EF74B +:040EF400238010EF58 +:040EF5000FF577136B +:040EF60075B7EB11D0 +:040EF700464500016B +:040EF800AE858593AB +:040EF90010EF85264B +:040EFA0047051FE0A9 +:040EFB0086B34781F2 +:040EFC00C50300F436 +:040EFD0045D10006D5 +:040EFE00C23EC43AF2 +:040EFF00EC1FF0EF05 +:040F000047224792AB +:040F0100F6930785D7 +:040F0200E2E30FF720 +:040F03005783FEE62C +:040F040014B74F844B +:040F050045D10002D0 +:040F0600FDF7F79369 +:040F070083C107C2D9 +:040F08004EF41C2364 +:040F09000EF4A0231F +:040F0A000C000513BF +:040F0B00E91FF0EFFB +:040F0C004F84578334 +:040F0D0045C1450293 +:040F0E000207E7935C +:040F0F004EF41C235D +:040F10000EF4A02318 +:040F11001C4010EF81 +:040F12000FF57793CD +:040F13004502EB9117 +:040F1400000175B7AC +:040F15008593464535 +:040F160010EFAE85A5 +:040F1700478518A052 +:040F1800C23E448110 +:040F190045D14782F5 +:040F1A000097873382 +:040F1B000007450383 +:040F1C00F0EF048569 +:040F1D004792E4BF54 +:040F1E000FF4F713C2 +:040F1F00FEF763E393 +:040F20004F84578320 +:040F2100173740D26C +:040F2200E79300024F +:040F23001C23040780 +:040F240044424EF401 +:040F25000EF7202380 +:040F2600016144B26F +:040F27001151808262 +:040F28001437C22296 +:040F2900C0260002DC +:040F2A0084AA46014E +:040F2B0002C0059368 +:040F2C0004040513A1 +:040F2D00C0EFC40647 +:040F2E0085A68E7F87 +:040F2F00051346055B +:040F3000C0EF040406 +:040F31000593915F34 +:040F3200051302C0E1 +:040F33004605040467 +:040F34008CDFC0EF9F +:040F35000404051398 +:040F360040A244127F +:040F37004585448226 +:040F3800C06F013154 +:040F390011418DBF16 +:040F3A001437C42282 +:040F3B00C2260002C8 +:040F3C0084AEC02A95 +:040F3D0005934601D1 +:040F3E00051302C0D5 +:040F3F00C6060404DA +:040F400089DFC0EF96 +:040F4100460147829C +:040F4200040405138B +:040F4300C0EF85BEB8 +:040F440005138C9F66 +:040F4500442204043A +:040F460085A640B28A +:040F47004605449285 +:040F4800C06F014134 +:040F490015378B5F6E +:040F4A00115100023F +:040F4B004581460195 +:040F4C000405051380 +:040F4D00C0EFC40627 +:040F4E0045298A1F88 +:040F4F00BC2FC0EF04 +:040F5000450545E12D +:040F5100FA3FF0EF84 +:040F5200450945E127 +:040F5300F9BFF0EF03 +:040F5400450D45E121 +:040F5500F93FF0EF81 +:040F5600F0EF45056E +:040F570040A2F45F61 +:040F58003513152117 +:040F5900013100154D +:040F5A00115180822F +:040F5B00842AC22200 +:040F5C00C40645057D +:040F5D00F2BFF0EF00 +:040F5E00040E991DC7 +:040F5F0074138C4932 +:040F600085A20FF463 +:040F6100F0EF450563 +:040F620085A2F61F4F +:040F6300F0EF45095D +:040F640085A2F59FCE +:040F650040A2441250 +:040F66000131450D03 +:040F6700F4BFF06F74 +:040F6800C22211513F +:040F69004505842A8C +:040F6A00F0EFC406DA +:040F6B004789EF5F64 +:040F6C000D85751367 +:040F6D0002F4136314 +:040F6E0000156413F3 +:040F6F00450585A20D +:040F7000F27FF0EF2D +:040F7100450985A207 +:040F7200F1FFF0EFAC +:040F7300441285A2FD +:040F7400450D40A245 +:040F7500F06F0131E7 +:040F76000416F11F4D +:040F770074138C491A +:040F780064130FF4FB +:040F7900BFD9004498 +:040F7A00C22211512D +:040F7B000002143725 +:040F7C004601C02644 +:040F7D00059384AAAA +:040F7E00051305C092 +:040F7F00C40604049C +:040F8000F9CFC0EFF6 +:040F81000FF4F593E1 +:040F82000513460508 +:040F8300C0EF0404B3 +:040F84000593FC8F46 +:040F8500051305C08B +:040F86004605040414 +:040F8700F80FC0EFB0 +:040F88000404051345 +:040F890040A244122C +:040F8A0045854482D3 +:040F8B00C06F013101 +:040F8C001141F8EF28 +:040F8D001437C4222F +:040F8E00C226000275 +:040F8F0084AEC02A42 +:040F9000059346017E +:040F9100051305C07F +:040F9200C606040487 +:040F9300F50FC0EFA7 +:040F94004601478249 +:040F95000404051338 +:040F96000FF7F593C9 +:040F9700F7AFC0EF01 +:040F98000404051335 +:040F990040B24422FC +:040F9A00449285A652 +:040F9B0001414605C5 +:040F9C00F66FC06FBD +:040F9D0005131151D6 +:040F9E00C406022063 +:040F9F00C026C22284 +:040FA000F69FF0EFD9 +:040FA1000FF57413C1 +:040FA200455945CD9B +:040FA300FA7FF0EFF2 +:040FA40085136489C4 +:040FA500C0EF710424 +:040FA600458DA68F40 +:040FA700F0EF455DC5 +:040FA8008513F95F55 +:040FA900C0EF710420 +:040FAA006593A58F17 +:040FAB00051308041E +:040FAC00F0EF022040 +:040FAD000513F81F11 +:040FAE00C0EF3E80D2 +:040FAF007593A44F43 +:040FB000441207F4EC +:040FB100448240A294 +:040FB2000220051301 +:040FB300F06F0131A9 +:040FB4001151F65F82 +:040FB5006409C222E7 +:040FB60071040513AA +:040FB700C0EFC406BD +:040FB80045C5A20F7A +:040FB900F0EF4559B7 +:040FBA000513F4DF48 +:040FBB00C0EF71040E +:040FBC00455DA10FDF +:040FBD00F0EF458983 +:040FBE000513F3DF45 +:040FBF004412710463 +:040FC000013140A219 +:040FC1009FAFC06FAF +:040FC200C2221151E5 +:040FC30085AA842E49 +:040FC400C4064549D1 +:040FC500F1FFF0EF59 +:040FC600441285A2AA +:040FC700454D40A2B2 +:040FC800F06F013194 +:040FC90085AAF11FE5 +:040FCA0003D0051338 +:040FCB00F07FF06F54 +:040FCC00454585AA68 +:040FCD00EFFFF06FD3 +:040FCE00C4061151F3 +:040FCF004783C22270 +:040FD000842A00650A +:040FD1009593456D42 +:040FD2008DDD00476A +:040FD3000FF5F5938E +:040FD400EE3FF0EF0D +:040FD50000644583EC +:040FD600F0EF457182 +:040FD7004583ED9FC2 +:040FD8004529003473 +:040FD900ECFFF0EF4A +:040FDA000044458307 +:040FDB00F0EF4525C9 +:040FDC004583EC5FFE +:040FDD004521005456 +:040FDE00EBBFF0EF86 +:040FDF000004458342 +:040FE000F0EF4535B4 +:040FE1004583EB1F3A +:040FE2004531001481 +:040FE300EA7FF0EFC2 +:040FE400002445831D +:040FE50040A24412D0 +:040FE6000131452D63 +:040FE700E97FF06F3F +:040FE800C4221141CD +:040FE9004511842A00 +:040FEA00C032C22629 +:040FEB00C60684AE04 +:040FEC00E39FF0EFA0 +:040FED0075934602B0 +:040FEE00CE4D0F8550 +:040FEF007FF00793F5 +:040FF0000A87EA631F +:040FF100E59345112E +:040FF200F0EF001507 +:040FF3001513E69F4D +:040FF40014130014BE +:040FF5008041010531 +:040FF60000445593CB +:040FF7000FF5F5936A +:040FF800F0EF4505CC +:040FF9001593E51F48 +:040FFA00F593004427 +:040FFB0045090F0590 +:040FFC00E43FF0EFEF +:040FFD00019C073715 +:040FFE00CC07071302 +:040FFF0002975733CB +:04100000022556B7B8 +:041001000FF68693CD +:0410020007334781E8 +:04100300F06302870D +:0410040026B702E623 +:041005008693042C9E +:041006004785D7F64D +:0410070000E6F963A3 +:04100800080BF7B723 +:04100900FBF78793D7 +:04100A0000E7B7B391 +:04100B00675D07898D +:04100C004807071377 +:04100D004503973EC2 +:04100E0007130007BD +:04100F000533028023 +:04101000571302E58B +:04101100953A0014F8 +:0410120002854533DB +:041013007513471DED +:0410140075930FF5CC +:0410150073630FF5FD +:04101600459D00A74D +:0410170040B244227D +:04101800058E44926B +:041019008DDD079AC8 +:04101A000F85F593B6 +:04101B000141450D3D +:04101C00DC3FF06F56 +:04101D00F0EF45119A +:04101E00BFB9DBDF9C +:04101F00C222115187 +:041020004569842A70 +:04102100F0EFC40622 +:041022004785D63FE9 +:041023000FA575930D +:0410240000F41A6357 +:041025000025E5932A +:0410260040A244128E +:0410270001314569E5 +:04102800D93FF06F4D +:0410290000A5E593A6 +:04102A005583BFC566 +:04102B00115100A5BA +:04102C0081A1C222BA +:04102D000513842AF9 +:04102E00C40604B040 +:04102F00D77FF0EF88 +:0410300000A4458350 +:0410310004A00513FF +:04103200D6BFF0EF46 +:0410330000C455831D +:0410340004D00513CC +:04103500F0EF81A1B6 +:041036004583D5DF3A +:04103700051300C4D9 +:04103800F0EF04C011 +:041039005583D51FE7 +:04103A00051300E4B6 +:04103B0081A104F09B +:04103C00D43FF0EFBE +:04103D0000E4458303 +:04103E0004E00513B2 +:04103F00D37FF0EF7C +:041040000044558390 +:04104100051005137E +:04104200F0EF81A1A9 +:041043004583D29F70 +:04104400051300444C +:04104500F0EF0500C3 +:041046005583D1DF1E +:041047000513006429 +:0410480081A105304D +:04104900D0FFF0EFF5 +:04104A000064458376 +:04104B000520051364 +:04104C00D03FF0EFB2 +:04104D000084558343 +:04104E000550051331 +:04104F00F0EF81A19C +:041050004583CF5FA6 +:0410510005130084FF +:04105200F0EF054076 +:041053005583CE9F54 +:04105400051301047B +:0410550081A1057000 +:04105600CDBFF0EF2B +:0410570001044583C8 +:041058000560051317 +:04105900CCFFF0EFE9 +:04105A000124558395 +:04105B0005900513E4 +:04105C00F0EF81A18F +:04105D004583CC1FDC +:04105E000513012451 +:04105F00F0EF058029 +:041060005583CB5F8A +:04106100051301442E +:0410620081A105B0B3 +:04106300CA7FF0EF61 +:04106400014445837B +:0410650040A244124F +:0410660005A00513C9 +:04106700F06F0131F4 +:041068001151C95FFA +:04106900842AC222F1 +:04106A0003F0051377 +:04106B00F0EFC406D8 +:04106C007593C3BFF6 +:04106D008DC10F051D +:04106E0040A2441246 +:04106F0003F0051372 +:04107000F06F0131EB +:041071001151C71F33 +:04107200842AC222E8 +:04107300C406456901 +:04107400C19FF0EF39 +:04107500006415936B +:041076007513441298 +:0410770040A203F59B +:04107800F5938DC996 +:0410790045690FF5C1 +:04107A00F06F0131E1 +:04107B001131C49FCC +:04107C00461D65DDCB +:04107D00B2058593A0 +:04107E00C806850A11 +:04107F00277000EFE7 +:04108000C75FF0EF67 +:04108100F0EF450146 +:041082004585E77F3A +:0410830003500513FE +:04108400C23FF0EF88 +:041085000513655991 +:04108600F0EF6E0514 +:041087004501E91F17 +:04108800FA7FF0EF0C +:04108900F0EF451926 +:04108A000513D01F5B +:04108B00F0EF04403E +:04108C004581D03F8B +:04108D00F0EF450536 +:04108E00850ACD3FC3 +:04108F00CFDFF0EFD0 +:04109000015140C208 +:041091001141808207 +:04109200842AC422C6 +:04109300C606451137 +:04109400F0EFC02E8B +:041095004582B97F58 +:0410960002B4043369 +:0410970000757593D8 +:0410980077934511F4 +:04109900078E01F4C9 +:04109A00F0EF8DDD09 +:04109B005513BC9F8E +:04109C0040B24054CA +:04109D007513442261 +:04109E0001410FF508 +:04109F0011518082E9 +:0410A000842AC222BA +:0410A100C4064541FB +:0410A200B61FF0EF96 +:0410A300003415936D +:0410A400891D44124C +:0410A5008DC940A20F +:0410A6000FF5F593BA +:0410A700013145418D +:0410A800B93FF06FED +:0410A9001151C139E7 +:0410AA000513C02644 +:0410AB0084AE0260AD +:0410AC0008000593A0 +:0410AD00C406C22291 +:0410AE00F0EF8432A9 +:0410AF004785B79F1B +:0410B0000094059310 +:0410B10000F489635B +:0410B200059347A1BA +:0410B300846305A4A9 +:0410B400059300F4AC +:0410B500441201845C +:0410B600448240A28E +:0410B7000FF5F593A9 +:0410B8000310051309 +:0410B900F06F0131A2 +:0410BA004581B4DFD9 +:0410BB0002600513B7 +:0410BC001121BFDD62 +:0410BD00C626C82259 +:0410BE00C02ECA0670 +:0410BF00C436C2323F +:0410C000842A4785B2 +:0410C1000E6384BA7C +:0410C20047A100F54D +:0410C30004F50D63C0 +:0410C4000067059329 +:0410C5000FF5F5939B +:0410C600F0EF4515ED +:0410C70045C1B19FCF +:0410C8000593A809DB +:0410C900F593002774 +:0410CA0045150FF5C4 +:0410CB00B07FF0EF13 +:0410CC0045194599E4 +:0410CD00AFFFF0EF92 +:0410CE00862685A24B +:0410CF00F0EF4505F4 +:0410D00047C1F67F9F +:0410D100036345B1BF +:0410D20045A100F440 +:0410D30002200513DF +:0410D400AE3FF0EF4C +:0410D5004622444229 +:0410D60045024592F8 +:0410D70044B240D20D +:0410D800F06F016153 +:0410D9000593C3FFB9 +:0410DA00F593032760 +:0410DB0045150FF5B3 +:0410DC00AC3FF0EF46 +:0410DD000200059375 +:0410DE001151BF6D80 +:0410DF00FFE587930F +:0410E000C026C22242 +:0410E100F793C406B7 +:0410E20047050FF7B8 +:0410E300842E84AA29 +:0410E40006F769633F +:0410E50047814709EF +:0410E60000E51363AB +:0410E700971347898B +:0410E80095930024B8 +:0410E9008DD9004459 +:0410EA008DC5079A0F +:0410EB00F5938DDD0F +:0410EC0045650FF552 +:0410ED00A7FFF0EF7A +:0410EE00F0EF454199 +:0410EF00478DA2FF88 +:0410F0000F85759360 +:0410F10000F4146390 +:0410F2000055E5932D +:0410F300F0EF454194 +:0410F4004789A65F23 +:0410F50002F49D6301 +:0410F600EA634785DD +:0410F70005930287D4 +:0410F8000463052068 +:0410F900059300F467 +:0410FA00453905303F +:0410FB00A47FF0EFEF +:0410FC003E8005131A +:0410FD00D0BFB0EFC1 +:0410FE00F0EF455179 +:0410FF0045819EFF8A +:041100004789A03D3E +:0411010037B3FD49BA +:04110200078500B0AD +:041103000593BF4948 +:04110400453905B0B4 +:04110500A1FFF0EF67 +:041106003E8005130F +:04110700CE3FB0EF38 +:04110800F0EF45516E +:04110900478D9C7FF3 +:04110A001AE345C1DE +:04110B004561FCF44A +:04110C00A03FF0EF21 +:04110D0040A24412A6 +:04110E004581448251 +:04110F000360051361 +:04111000F06F01314A +:0411110011419F1FCA +:04111200842AC42245 +:04111300C02E455154 +:04111400F0EFC6062C +:041115004709997F6E +:041116000FF57793C7 +:041117001563458295 +:04111800470502E4A1 +:0411190000E59C63EE +:04111A00090575133B +:04111B00F7050513BC +:04111C000015351372 +:04111D00442240B276 +:04111E008082014189 +:04111F007513E591CE +:041120000513088526 +:04112100B7EDF785AA +:041122000017D513CA +:04112300B7DD8905A6 +:04112400FB81011337 +:04112500CA3E4791E6 +:04112600871367DDE7 +:04112700C2A25247C7 +:04112800C42EC0A66B +:0411290002074583F1 +:04112A004283462195 +:04112B00163303076D +:04112C00458300B641 +:04112D00661302172C +:04112E00CC32008639 +:04112F001000061393 +:0411300000B61633BC +:0411310002274583C9 +:041132006611CE3242 +:0411330000B61633B9 +:0411340002374583B6 +:041135000637D03277 +:041136001633000468 +:04113700D23200B6FA +:041138000131061368 +:04113900665DD432E9 +:04113A0054960613AE +:04113B00665DD632E5 +:04113C0054A606139C +:04113D00665DD832E1 +:04113E0054B606138A +:04113F00665DDA32DD +:0411400054C6061378 +:04114100665DDC32D9 +:0411420054D6061366 +:04114300DE32675DD4 +:041144006207061325 +:041145006207071323 +:041146006759C03AEB +:041147007107071312 +:0411480009A3C22A0B +:04114900430100015D +:04114A0052478793EE +:04114B001513C63A78 +:04114C000713018301 +:04114D0085610210A6 +:04114E0000E3146343 +:04114F00A0C9557D61 +:0411500001764703DA +:041151004583441579 +:041152006863016667 +:0411530044320EE430 +:0411540000271393CA +:041155004000941EA4 +:0411560004138402F8 +:04115700CE2208009C +:04115800D022640934 +:04115900C9F18DF556 +:04115A0093A20080DC +:04115B00FE83A383E9 +:04115C00C3834E0CEF +:04115D00038A0003FE +:04115E00A38393A232 +:04115F00F3B3FD43A6 +:041160008C63007527 +:0411610044220A0317 +:04116200FFF5C5933D +:041163009663898581 +:0411640055830A8520 +:041165004412010629 +:04116600E06305F944 +:0411670045850A852B +:0411680000B7882321 +:0411690000079723C1 +:04116A0000078923CE +:04116B000077AA233C +:04116C0080038593E4 +:04116D002205826372 +:04116E00859365857B +:04116F00E0638005B4 +:0411700005930E7560 +:041171008263040091 +:04117200EF631EB356 +:0411730045A1087515 +:0411740014B38863C5 +:041175000675ED63AB +:0411760090634591AC +:04117700962306B302 +:0411780077130007E2 +:0411790046850FD7C1 +:04117A0000D71C631B +:04117B000337C683ED +:04117C00120685636F +:04117D008823470973 +:04117E00470500E73A +:04117F0000E787A35B +:041180004486441647 +:0411810004810113D1 +:041182000413808250 +:04118300CE22100068 +:04118400BF816411B2 +:041185000106548388 +:0411860020D004135E +:04118700F48494E375 +:04118800FFB64483E7 +:041189009D63440D11 +:04118A0095630084E5 +:04118B00F5930002D6 +:04118C00BF0D0EF590 +:04118D0097E3440997 +:04118E000305F282E1 +:04118F00BDC5067163 +:041190000002956361 +:041191000FB5F5930E +:041192004405BF3120 +:041193004741B7ED2C +:0411940014E3886375 +:04119500020007133A +:04119600FEE391E300 +:0411970030100713FA +:0411980000E79623B3 +:04119900A2B947119F +:04119A0010000593A9 +:04119B0014B387639F +:04119C000075EC638B +:04119D00080007132C +:04119E00FCE391E3FA +:04119F002010071302 +:0411A00000E79623AB +:0411A100A23D47150F +:0411A200200007130F +:0411A30014E381636D +:0411A40040000713ED +:0411A500FAE393E3F3 +:0411A60020200713EB +:0411A70065C1A2215B +:0411A80014B38C638D +:0411A9000275E66382 +:0411AA008A63658966 +:0411AB00E86312B330 +:0411AC00670500755E +:0411AD00F8E393E3ED +:0411AE0020200713E3 +:0411AF006591B7D1BE +:0411B00012B38A6389 +:0411B1009AE3672135 +:0411B2000713F6E346 +:0411B300A8D9203067 +:0411B40000080737F1 +:0411B50012E3886356 +:0411B60002776063F9 +:0411B70000020737F4 +:0411B80010E38F634E +:0411B90000040737F0 +:0411BA00F4E399E3DE +:0411BB00962347111F +:0411BC00071300E72E +:0411BD00A8E507801A +:0411BE0000100737DF +:0411BF0010E38E6348 +:0411C00000200737CD +:0411C100F2E39BE3D7 +:0411C20020400713AF +:0411C30000E7962388 +:0411C400882347191C +:0411C500475100E7A7 +:0411C6008723A8D9FA +:0411C700BDF100E78F +:0411C80086234685AF +:0411C900C68300D702 +:0411CA00E2A903D7BC +:0411CB0006B346F130 +:0411CC00460202D302 +:0411CD00D60396B2FD +:0411CE00069300E69E +:0411CF00E76357700B +:0411D000061302C63A +:0411D1007613FFF79B +:0411D20046890FF645 +:0411D30002C6E0630D +:0411D40086A3460D9B +:0411D500882300C7A4 +:0411D60013E300D748 +:0411D700C703EAD789 +:0411D800EB1D0337D1 +:0411D900872347051C +:0411DA00BD5900E714 +:0411DB00FFE7069391 +:0411DC00000786A3DF +:0411DD000FD6F693A0 +:0411DE004695D2FD63 +:0411DF00E8D712E358 +:0411E000033347711D +:0411E100470202E3DC +:0411E2005683933A63 +:0411E300071300E30B +:0411E40076E34AF074 +:0411E500B5ADFCD7D1 +:0411E600000786A3D5 +:0411E700A8194709F3 +:0411E80020100713B9 +:0411E90000E7962362 +:0411EA000713BFD553 +:0411EB009623301007 +:0411EC00471900E7B8 +:0411ED0000E788236C +:0411EE004689B5A1D8 +:0411EF0000D796236C +:0411F0001FE3468D26 +:0411F100C703E2D777 +:0411F200DF49033797 +:0411F3000713BFC15E +:0411F400962310200E +:0411F500B52D00E72D +:0411F600202007139B +:0411F7000713B551D4 +:0411F80096232020FA +:0411F900471D00E7A7 +:0411FA0000E788235F +:0411FB0089234735C8 +:0411FC00B53900E71A +:0411FD00B7D9468D8B +:0411FE002030071383 +:0411FF000713B59588 +:04120000BDBD203020 +:04120100204007136F +:0412020000E7962348 +:041203008823470DE8 +:04120400071300E7E5 +:04120500BFE10280C3 +:04120600204007136A +:0412070000E7962343 +:0412080088234715DB +:04120900476100E752 +:04120A001111B7D92E +:04120B0001851793AF +:04120C00C826CA2204 +:04120D0087E1CC06A3 +:04120E0084AE842AFC +:04120F000007DD6394 +:0412100005134581FC +:0412110037D5077056 +:0412120000A101A393 +:04121300EE634785BA +:04121400741306A7A2 +:041215002E9507F417 +:0412160045014591B8 +:041217002E8126817D +:041218000184D793E3 +:0412190000F102A33B +:04121A000104D79361 +:04121B0000F10323B8 +:04121C000084D793E0 +:04121D0000F103A336 +:04121E000081022326 +:04121F000091042313 +:0412200004000713AC +:0412210009500793D6 +:0412220000E4096378 +:041223000480071329 +:041224001463478583 +:04122500079300E447 +:04122600459908706E +:0412270004A30048D4 +:0412280024ED00F1C0 +:041229002EB1451588 +:04122A004585842A48 +:04122B000031051376 +:04122C00078324F51B +:04122D00D663003153 +:04122E002E8D0007FA +:04122F0006E3478506 +:04123000E011FEF5D6 +:04123100450326410A +:0412320040E2003165 +:0412330044C244521B +:041234008082017142 +:04123500FD81011323 +:041236004581C02A04 +:041237000490051307 +:04123800D022D206E8 +:04123900F0EFCE26DE +:04123A00C901F45F93 +:04123B005092450187 +:04123C0044F2540222 +:04123D000281011316 +:04123E00842A8082FC +:04123F00261145151A +:04124000458584AAB2 +:041241000071051320 +:0412420047032C51E1 +:04124300079300719C +:0412440016630FF02E +:041245002E1900F767 +:0412460004E34785F1 +:04124700E091FEF53F +:04124800470326151D +:041249000793007196 +:04124A0011E30FE0BD +:04124B0045C9FCF79E +:04124C0024AD0028A5 +:04124D00C78347828A +:04124E00F71300474B +:04124F00CF15002790 +:0412500000E1450371 +:0412510000F14783DE +:04125200012147032C +:041253000522890DDA +:0412540047838D5DE2 +:04125500050A010184 +:0412560000D144037C +:041257008D5D83998D +:0412580001114783B6 +:04125900883D831D2C +:04125A008B990786DF +:04125B00943E8FD955 +:04125C00146505050B +:04125D0000851533C0 +:04125E008B91BF9D14 +:04125F004503CB89EF +:0412600047830101BE +:041261000522011150 +:0412620047C58D5D92 +:041263004781B7CD3B +:04126400BFF1450190 +:04126500FDC10113B3 +:04126600CC2665D954 +:0412670084AA4629E6 +:041268008A058593DB +:04126900D006006843 +:04126A0024E1CE228B +:04126B00C03E478DAD +:04126C002C2122C14E +:04126D0045A924A9C2 +:04126E002AC9006821 +:04126F00A0234581F2 +:04127000051300045E +:04127100F0EF040096 +:041272004785E65F67 +:041273001B63842A4B +:0412740005930EF5DB +:0412750005131AA0A3 +:04127600F0EF048011 +:04127700C22AE51F83 +:04127800088517636B +:041279000028459173 +:04127A0047032A55A7 +:04127B00479200A1F5 +:04127C000CF71A63EE +:04127D0000B1470372 +:04127E000AA0079328 +:04127F000CF71463F1 +:041280003E80051394 +:04128100241D2AFD01 +:041282001963478520 +:0412830005B700F5B6 +:04128400051340000E +:04128500F0EF0E90E8 +:04128600F575E15FBA +:0412870047852C016A +:0412880002F5066302 +:041289002C394401B7 +:04128A0017FD478283 +:04128B000FF7F793CF +:04128C00CBD9C03EBC +:04128D004785DC3580 +:04128E000084822333 +:04128F008526C09C54 +:04129000E95FF0EF33 +:04129100C488157D7B +:04129200A0412A69E4 +:041293000513458179 +:04129400F0EF07A0D0 +:04129500F579DD9F6B +:041296000028459156 +:0412970047832281E6 +:04129800443100815C +:041299000407F793BC +:04129A004411FFDD1F +:04129B004581BF6D5D +:04129C000E90051398 +:04129D00DB7FF0EF14 +:04129E00041007939E +:04129F0000A46563DF +:0412A0000793440963 +:0412A10005130E9093 +:0412A200C23E0FA099 +:0412A3002A792A9DDD +:0412A4001763478500 +:0412A500451200F5F9 +:0412A600F0EF45819F +:0412A700F965D91FED +:0412A800E1112271BD +:0412A9002A79440159 +:0412AA000513458162 +:0412AB00F0EF07B0A9 +:0412AC00C111D7DFB6 +:0412AD000593440160 +:0412AE000513200004 +:0412AF00F0EF050057 +:0412B000D13DD6DF77 +:0412B100B78D4401B0 +:0412B20020CDF43D1A +:0412B30000143513DB +:0412B40044725082AE +:0412B500011344E2FB +:0412B60080820241EF +:0412B7001121451CA0 +:0412B800CA06C82278 +:0412B900C22EC62655 +:0412BA00440DC03AE5 +:0412BB0002C7E16322 +:0412BC004783CF197C +:0412BD0084B60045AE +:0412BE00E3918BA18C +:0412BF0085B20626C8 +:0412C00005100513FD +:0412C100D27FF0EFF9 +:0412C2004409C90909 +:0412C300852220451B +:0412C400444240D28E +:0412C500016144B2CD +:0412C600051380820A +:0412C70020D50640E8 +:0412C8000513458540 +:0412C900289D00B1AB +:0412CA0000B1470325 +:0412CB000FF0079386 +:0412CC0000F71663AE +:0412CD00478528E544 +:0412CE00FEF504E342 +:0412CF00470322218E +:0412D000079300B1CF +:0412D10012E30FE035 +:0412D2004782FCF75C +:0412D30020200413C0 +:0412D4008C1D8C05DC +:0412D500804104420E +:0412D60085A6C481A4 +:0412D700283D450168 +:0412D80045124582F4 +:0412D90085A228259D +:0412DA00280D450195 +:0412DB00BF79440192 +:0412DC0000062637AB +:0412DD00019C05B7B4 +:0412DE0000021537BE +:0412DF00A806061344 +:0412E000CC05859321 +:0412E10002050513EA +:0412E2009EBFB06F8C +:0412E30085AA862E24 +:0412E40000021537B8 +:0412E50002050513E6 +:0412E600A89FB06F9E +:0412E70085AA862E20 +:0412E80000021537B4 +:0412E90002050513E2 +:0412EA00A4DFB06F5E +:0412EB00675D808239 +:0412EC004F8757834E +:0412ED00F7F7F79385 +:0412EE0083C107C2EF +:0412EF004EF71C2377 +:0412F00000021737AA +:0412F1000EF72023B1 +:0412F200675D808232 +:0412F3004F87578347 +:0412F4000807E7936D +:0412F5004EF71C2371 +:0412F60000021737A4 +:0412F7000EF72023AB +:0412F8003637808283 +:0412F90005B700290C +:0412FA001537019C07 +:0412FB0006130002D4 +:0412FC0085932E06A2 +:0412FD000513CC0504 +:0412FE00B06F0205C6 +:0412FF00F06F979F56 +:041300006761F73FEB +:041301009BC72783DC +:04130200679DE3857B +:0413030097878793AE +:0413040002F50533B6 +:04130500C4061151B8 +:041306009AA72E2351 +:04130700D06FB0EF04 +:04130800450140A2B9 +:0413090080820131AC +:04130A008082450593 +:04130B00C4061151B2 +:04130C00D16FB0EFFE +:04130D00A78367E16A +:04130E0040A29BC797 +:04130F0000F535337D +:0413100080820131A5 +:04131100AE2367E1BF +:0413120080829A0734 +:041313001463470117 +:04131400450100E6A9 +:0413150007B3808218 +:04131600070500E5E2 +:0413170000E586B3B4 +:041318000007C78380 +:04131900FFF6C68392 +:04131A00FED783E394 +:04131B0040D78533FF +:04131C00C7B3808251 +:04131D008B8D00A50F +:04131E0000C50733CC +:04131F00478DE7818E +:0413200002C7E963B4 +:04132100716387AAC3 +:04132200C6830CE58D +:041323000785000535 +:041324008FA3058509 +:04132500EAE3FED722 +:041326008082FEE7DC +:041327000005C68374 +:0413280005850785AB +:04132900FED78FA3B9 +:04132A00FEE7EAE30D +:04132B000111440266 +:04132C0076938082B2 +:04132D0087AA003556 +:04132E00C683CA9117 +:04132F000785000529 +:041330008FA30585FD +:04133100F693FED75A +:04133200B7FD0037CC +:04133300FFC77693E7 +:04133400FE06861318 +:0413350006C7F5638F +:04133600C02211714F +:04133700A30349C003 +:04133800A383000586 +:04133900CBC00085A0 +:04133A00A0234D801F +:04133B00A3030067A1 +:04133C00CF80004519 +:04133D00A2234DC0DA +:04133E00A28300671F +:04133F00A30300C53F +:04134000859301058B +:04134100CFC00245D2 +:04134200FFC5A4033C +:041343000077A42368 +:041344000057A62385 +:041345000067A82372 +:041346000247879340 +:04134700FE87AE234C +:04134800FAC7EEE30F +:04134900F8D7F2E3FC +:04134A000791419036 +:04134B00AE23059137 +:04134C00BFCDFEC74C +:04134D000791419033 +:04134E00AE23059134 +:04134F00EBE3FEC707 +:04135000E4E3FED7FD +:041351008082F4E7BB +:041352000113808281 +:04135300D6A6F7C162 +:04135400DA86C13E36 +:04135500D8A267DDD6 +:04135600DEBADCB669 +:0413570042C7A48362 +:041358000005DC634D +:0413590008B007933E +:04135A00557DC09C61 +:04135B00544650D6CE +:04135C00011354B66F +:04135D008082084141 +:04135E002080079351 +:04135F0000F118235E +:04136000CA2AC22AA9 +:04136100C199478166 +:04136200FFF5879379 +:04136300CC3EC63E78 +:0413640057FD18B465 +:041365008526842E27 +:041366001923004CFB +:04136700C03600F19B +:0413680057FD260106 +:0413690000F55563D3 +:04136A0008B007932D +:04136B00DC5DC09CE9 +:04136C008023479201 +:04136D00BF5D000759 +:04136E00167DC6051D +:04136F0007B3470178 +:0413700086B300E55B +:04137100C78300E549 +:04137200C683000727 +:041373009663000677 +:04137400046300D737 +:04137500070500C7A1 +:041376008533F3FDCB +:04137700808240D759 +:041378008082450129 +:04137900CA0987AA6C +:04137A00C70305851B +:04137B000785FFF5EE +:04137C008FA3167DA8 +:04137D00FB65FEE727 +:04137E009363963EA1 +:04137F00808200C7A1 +:041380008FA30785AB +:04138100BFD5FE07CF +:0413820087AA95AAF7 +:0413830000B78563C7 +:041384000007C70394 +:041385008533E701C4 +:04138600808240A77A +:04138700B7FD078522 +:04138800A783C5D59D +:041389001151FFC53A +:04138A00C406C222B1 +:04138B008413C026E1 +:04138C00D363FFC563 +:04138D00943E000783 +:04138E0000EF84AA3E +:04138F00675D15F091 +:0413900049C727839F +:04139100EF81863A28 +:04139200000422230E +:0413930048872E2336 +:0413940040A244121D +:0413950044828526E3 +:04139600006F0131B2 +:04139700706314105B +:04139800401402F407 +:0413990000D4073342 +:04139A0000E796636F +:04139B0043DC439854 +:04139C00C0189736A8 +:04139D002E23C05CDF +:04139E00BFD94886E5 +:04139F0043D887BAEE +:0413A0007DE3C3190D +:0413A1004394FEE48F +:0413A20000D78633B7 +:0413A30000861F633E +:0413A40096B24010AD +:0413A5008633C39434 +:0413A6001BE300D76E +:0413A7004310FAC72E +:0413A80096B243585E +:0413A900C3D8C3944E +:0413AA007563B7654B +:0413AB0047B100C482 +:0413AC00BF79C09CA9 +:0413AD0006B3401033 +:0413AE00166300C4FE +:0413AF00431400D70C +:0413B00096B2435856 +:0413B100C058C0144C +:0413B200B759C3C0A4 +:0413B30011418082E2 +:0413B4008493C22636 +:0413B50098F1003576 +:0413B600C422C60681 +:0413B70047B104A195 +:0413B80004F4FB63DB +:0413B900EA6344B1EE +:0413BA00C02A04B48D +:0413BB000AD000EF65 +:0413BC002683675DC0 +:0413BD00478249C753 +:0413BE0049C7061302 +:0413BF00E43184365B +:0413C0000413645D51 +:0413C10040184A0482 +:0413C200853EEB0178 +:0413C300C03E458162 +:0413C4007F8000EF37 +:0413C500C008478293 +:0413C60085A6853E35 +:0413C70000EFC03E35 +:0413C800577D7EA02F +:0413C90015634782DF +:0413CA00473106E5BC +:0413CB00853EC39800 +:0413CC0006B000EF78 +:0413CD00D8E3A02998 +:0413CE0047B1FA0425 +:0413CF004501C11CF7 +:0413D000442240B2C1 +:0413D1000141449200 +:0413D20040188082BD +:0413D3004E638F05D1 +:0413D40045AD02071A +:0413D50000E5F663D6 +:0413D600943AC0186D +:0413D700A029C00485 +:0413D8009263405884 +:0413D900C2180286AE +:0413DA0000EF853E5D +:0413DB0005130310E3 +:0413DC00071300B43F +:0413DD0099610044CE +:0413DE0040E507B32C +:0413DF00943ED3F174 +:0413E000C0188F0999 +:0413E100C2D8BF753A +:0413E20086A2B7C563 +:0413E300BF85404042 +:0413E40000350413B9 +:0413E50003E3987115 +:0413E60005B3FC85CA +:0413E700853E40A45B +:0413E800279DC03E3F +:0413E9004782577D63 +:0413EA00FAE51AE323 +:0413EB00A303BFBDDC +:0413EC001111008556 +:0413ED00CC06C8263C +:0413EE00C232CA221B +:0413EF00E36384AE82 +:0413F000D6030866B2 +:0413F100771300C5A9 +:0413F200CB3D4806A1 +:0413F30048C882AABA +:0413F4004080470DE1 +:0413F50002A7073311 +:0413F6004509498CD0 +:0413F70040B407B344 +:0413F8004433C03E7C +:0413F900851302A7AF +:0413FA00953E001606 +:0413FB0000A4736374 +:0413FC007613842AB6 +:0413FD00C6364006AA +:0413FE008516C63D4D +:0413FF00C41685A2E9 +:04140000ECFFF0EF1E +:0414010046B242A20B +:04140200CD2D473174 +:04140300488C4602C9 +:04140400C42AC636FA +:04140500C5FFF0EF40 +:0414060000C4D60345 +:0414070046B2432284 +:04140800B7F67613AA +:041409000806661358 +:04140A0000C4962361 +:04140B00A823478249 +:04140C00C8C00064F0 +:04140D008C1D933E61 +:04140E000064A023B3 +:04140F008336C480DC +:041410000066F3631C +:041411004592833647 +:04141200861A40886E +:041413002701C01AD3 +:0414140043024498B3 +:041415000733450153 +:04141600C4984067CF +:04141700933A40982C +:041418000064A023A9 +:041419008516A80D7F +:04141A00C41686224C +:04141B00832A2F05EC +:04141C0046B242A2F0 +:04141D00488CFD45B5 +:04141E00C016851659 +:04141F00DA5FF0EFB1 +:04142000473142828C +:0414210000E2A02322 +:0414220000C4D70328 +:041423006713557D79 +:041424009623040700 +:0414250040E200E4BD +:0414260044C2445226 +:04142700808201714D +:0414280000C5D70321 +:04142900F781011333 +:04142A00DEA6C12257 +:04142B0001F1079331 +:04142C00C22AC30607 +:04142D007713C02E43 +:04142E0084B2080775 +:04142F00FF87F4132C +:041430004998CB1DEF +:041431000593EB0D27 +:04143200C6360400B6 +:04143300E03FF0EFB7 +:0414340046B24782F3 +:04143500CB88C38815 +:041436004712E91957 +:04143700557D47B1E7 +:04143800409AC31CF7 +:0414390054F6440A17 +:04143A000881011311 +:04143B0047828082E2 +:04143C00040007138E +:04143D000713CBD8EE +:04143E000CA30200F9 +:04143F00071300E4AB +:041440002A23030058 +:041441000D23000473 +:04144200CA3600E4C2 +:0414430006138726DF +:041444004683025089 +:04144500C299000741 +:041446000AC69863D7 +:041447004097033394 +:041448000203026336 +:041449004512458281 +:04144A008626869AD2 +:04144B00C61AC83ABB +:04144C00E7FFF0EFD7 +:04144D00026356FDE3 +:04144E0048541CD50D +:04144F00474243329B +:04145000C854969A4C +:0414510000074683C7 +:041452001A0689638A +:0414530000170493E7 +:041454002023577D7D +:041455002623000446 +:04145600C058000476 +:041457000004242346 +:04145800040401A3E4 +:0414590004042C2338 +:04145A000004C58342 +:04145B00000177B75E +:04145C008513461599 +:04145D002B7DAE47EE +:04145E0000148713DC +:04145F00E539401417 +:041460000106F61378 +:041461000613C6099F +:0414620001A30200E0 +:04146300F61304C4B4 +:04146400C60900862F +:0414650002B00613B8 +:0414660004C401A316 +:041467000004C58335 +:0414680002A00613C5 +:0414690004C58163D2 +:04146A008726445439 +:04146B00452545814D +:04146C00460342A948 +:04146D00031300075E +:04146E00061300174A +:04146F007963FD069A +:04147000C99506C54F +:04147100A805C454B2 +:04147200B7A1070512 +:04147300000177B746 +:04147400AE478613E6 +:0414750040C5063335 +:0414760015334505E0 +:041477008EC900C555 +:0414780084BAC0145E +:041479004652B751CF +:04147A000046059390 +:04147B00CA2E421023 +:04147C0002064963B8 +:04147D004603C4500E +:04147E0006930007CA +:04147F00116302E013 +:04148000460306D643 +:0414810006930017B7 +:041482001B6302A046 +:0414830046D202D675 +:0414840086130709BB +:041485004294004647 +:04148600C163CA3242 +:04148700C054020645 +:041488000633A08106 +:04148900E69340C0E6 +:04148A00C450002624 +:04148B00B7E1C014F1 +:04148C00025686B3CB +:04148D00871A4585F0 +:04148E00BFA596B2AE +:04148F00B7C556FD8A +:041490002223070507 +:04149100458100048D +:041492004525468125 +:04149300460342A921 +:041494000313000737 +:041495000613001723 +:041496007763FD0675 +:04149700F1E106C5B4 +:041498000007458381 +:04149900000174B723 +:04149A008513460D63 +:04149B00C63AAEC4DB +:04149C00473221D1E1 +:04149D008493CD0166 +:04149E008D05AEC446 +:04149F0004000693AC +:0414A00000A696B359 +:0414A10007054008F3 +:0414A200C0088D559C +:0414A3000007458376 +:0414A4000001753797 +:0414A50005134619CC +:0414A6000493AF05F7 +:0414A7000C230017FB +:0414A800294900B41A +:0414A9000737C52D0F +:0414AA000713000024 +:0414AB00E70D000742 +:0414AC00475240144F +:0414AD001006F6939C +:0414AE000711CE91C3 +:0414AF004858CA3A95 +:0414B000973E47A27A +:0414B100B599C858C9 +:0414B200025686B3A5 +:0414B300871A4585CA +:0414B400BFB596B278 +:0414B500B7DD072177 +:0414B6004512460293 +:0414B700000156B723 +:0414B80086930858B7 +:0414B90085A2FAE628 +:0414BA000000009797 +:0414BB00000000E746 +:0414BC0047A2C42A55 +:0414BD0094E3577DE0 +:0414BE004782FCE77E +:0414BF00D703557D7D +:0414C000771300C7D7 +:0414C1001EE304071B +:0414C2004848DC07B3 +:0414C3004602BBD949 +:0414C40056B74512C0 +:0414C50008580001C2 +:0414C600FAE6869329 +:0414C7002A0585A2CB +:0414C8001101BFC18E +:0414C9008332CA267A +:0414CA00459084B60F +:0414CB00CC22499452 +:0414CC00842ACE069A +:0414CD00D36387AEB0 +:0414CE0086B200C61C +:0414CF0000D3202303 +:0414D0000437C60314 +:0414D1000685C601C5 +:0414D20000D3202300 +:0414D300F6934394B5 +:0414D400C6910206B5 +:0414D5000003268367 +:0414D6002023068940 +:0414D700A28300D319 +:0414D80083930007F3 +:0414D900F2930197F2 +:0414DA0083630062C6 +:0414DB004390060232 +:0414DC000437C68388 +:0414DD00020676137A +:0414DE0000D036B351 +:0414DF008613EA4145 +:0414E00085A60437A2 +:0414E100C41A852282 +:0414E200C03AC23E0C +:0414E30056FD970219 +:0414E40006D50863BE +:0414E50043224792C5 +:0414E60043944511D5 +:0414E70000032603D5 +:0414E8008A9947CCCA +:0414E9004702430172 +:0414EA0000A697635E +:0414EB0040C5833342 +:0414EC000003536343 +:0414ED0047944301DC +:0414EE0054634B9068 +:0414EF008E9100D604 +:0414F000428193366C +:0414F100126307E992 +:0414F2004501065357 +:0414F3000285A81DA9 +:0414F400260347D4B0 +:0414F5008E910003D1 +:0414F600F8D2DBE36A +:0414F700861E468582 +:0414F800852285A61E +:0414F900C63EC81A09 +:0414FA00C21EC41634 +:0414FB009702C03A5A +:0414FC00470256FD50 +:0414FD0042A2439232 +:0414FE00434247B26C +:0414FF00FCD519E31C +:0415000040F2557DE3 +:0415010044D244622A +:04150200808261057D +:0415030000D785B3D5 +:0415040003000513C8 +:0415050004A581A315 +:041506000457C5833E +:041507000016861331 +:041508000689963E7C +:0415090004B601A380 +:04150A004685BF99BA +:04150B0085A6863EED +:04150C00C616852258 +:04150D00C23EC41AFC +:04150E009702C03A46 +:04150F0001E356FDA1 +:0415100042B2FCD512 +:041511004792432298 +:041512004702028505 +:041513001101BFAD56 +:04151400842ECC2233 +:041515004603C23295 +:04151600CA2601845C +:0415170084B6CE06C2 +:041518000693C02A4C +:04151900859306E0D0 +:04151A000863043529 +:04151B00E4631ED691 +:04151C00069306C666 +:04151D00046306302D +:04151E00ED630AD699 +:04151F00046300C69B +:041520000693200608 +:041521000C630580D2 +:04152200031316D6C3 +:041523000123042478 +:04152400A87904C4DA +:0415250006400693E3 +:0415260000D6066382 +:041527000690069391 +:04152800FED615E3F3 +:041529002303401444 +:04152A00F6130007AD +:04152B000513080696 +:04152C00C24900436D +:04152D00000326830E +:04152E007637C30841 +:04152F00D86300017C +:041530000713000697 +:0415310006B302D02B +:0415320001A340D001 +:04153300061304E4B3 +:041534004729AF860E +:041535000693A07DFC +:041536000A6307300D +:04153700EF631AD66E +:04153800069300C650 +:04153900006306F055 +:04153A00069306D638 +:04153B001EE30700A4 +:04153C004014F8D689 +:04153D000206E69329 +:04153E00A809C01424 +:04153F0007500693B8 +:0415400004D6036367 +:041541000780069386 +:04154200F8D611E3E3 +:041543000780069384 +:0415440000017637F5 +:0415450004D402A325 +:04154600B0C6061312 +:041547004314A0FDAC +:041548000424031361 +:0415490000468613BF +:04154A004298C310F0 +:04154B0004E4012390 +:04154C00AABD4705E8 +:04154D000406F61387 +:04154E0000032683ED +:04154F00DE35C308BA +:0415500086C106C288 +:041551004008BF9DF2 +:041552007293431439 +:0415530083130805F1 +:041554008663004664 +:04155500202300024D +:041556004294006754 +:041557007513A8015F +:041558002023040543 +:04155900D9750067D9 +:04155A000006D6832E +:04155B0006F005137E +:04155C0000017737DC +:04155D000CA60D6368 +:04155E00AF8706133A +:04155F0001A3472974 +:0415600040480404F7 +:041561004863C4080F +:04156200230300055A +:0415630073130004FA +:041564002023FFB38E +:04156500E2990064A3 +:04156600CD11832EF2 +:04156700F533832EA7 +:04156800137D02E607 +:04156900450395326F +:04156A000023000555 +:04156B00D53300A3D1 +:04156C00F26302E63E +:04156D0046A10AE6A3 +:04156E0000D71E6321 +:04156F008B05401890 +:041570004054CB1107 +:04157100476348186C +:04157200071300D784 +:041573000FA30300BF +:04157400137DFEE302 +:04157500406585B395 +:041576004692C80CC5 +:04157700872645027C +:0415780085A2081030 +:04157900F0EFC41AB1 +:04157A00577DD3DFE7 +:04157B00156343228F +:04157C00557D0CE5A8 +:04157D00446240F292 +:04157E00610544D2ED +:04157F0002A38082C1 +:04158000763704C4F2 +:04158100061300014C +:041582004008AF86E8 +:041583000007230337 +:041584000805729351 +:0415850000032683B6 +:041586008163031169 +:041587002023020219 +:04158800771300676E +:04158900C701001581 +:04158A0002056513DE +:04158B004741C0080C +:04158C004008F6B964 +:04158D00FDF57513E0 +:04158E00B791C00849 +:04158F00040572934A +:0415900000672023AD +:04159100FC028FE3E6 +:0415920082C106C24A +:041593000613BFD9A3 +:041594004721AF87B5 +:0415950086AAB72D3E +:041596004010B799B1 +:041597004848431469 +:04159800080672933C +:041599000046831372 +:04159A000002876361 +:04159B0000672023A2 +:04159C00C3084298A6 +:04159D002023A80956 +:04159E007613006759 +:04159F004298040664 +:0415A0001023DA6DCD +:0415A100282300A754 +:0415A200832E000490 +:0415A3004314B7B97D +:0415A40086134581E4 +:0415A500C310004629 +:0415A6000006A30395 +:0415A700851A405011 +:0415A8002849C41AF0 +:0415A900C501432213 +:0415AA004065053360 +:0415AB004058C0489C +:0415AC0001A3C818B7 +:0415AD00B715040466 +:0415AE004592481406 +:0415AF00861A450251 +:0415B000577D94824D +:0415B100F2E507E375 +:0415B2008B09401849 +:0415B3004742EB15AB +:0415B40051E3444873 +:0415B500853AF2E59C +:0415B6004592BF316A +:0415B700468545021E +:0415B800C63A861A8F +:0415B9009482C41A3A +:0415BA0004E356FDF3 +:0415BB004732F0D5EE +:0415BC0007054322BA +:0415BD00464244540A +:0415BE0040E38E91E7 +:0415BF00BFC1FED7D3 +:0415C00003134701C9 +:0415C100B7FD0194DD +:0415C200C2221151DF +:0415C3006461C02679 +:0415C400852E84AA42 +:0415C5002023C40615 +:0415C60020FD9C0464 +:0415C700166357FD53 +:0415C800278300F580 +:0415C900C3919C042A +:0415CA0040A2C09CDF +:0415CB004482441200 +:0415CC0080820131E7 +:0415CD000FF5F5938E +:0415CE001463962AE2 +:0415CF00450100C50D +:0415D000478380824B +:0415D1008DE30005A1 +:0415D2000505FEB756 +:0415D300F363B7FD0A +:0415D40086B304A531 +:0415D5007F6300C56B +:0415D600459302D562 +:0415D7004781FFF653 +:0415D800936317FD05 +:0415D900808200F517 +:0415DA0000F687335D +:0415DB0000074303BF +:0415DC0000C787338A +:0415DD000023972A26 +:0415DE00B7DD00670E +:0415DF0000F5873359 +:0415E0000007468337 +:0415E10000F50733D7 +:0415E2000023078556 +:0415E30017E300D733 +:0415E4008082FEF60D +:0415E500BFE5478196 +:0415E60080828082FD +:0415E70085B2E58163 +:0415E800F2EFF06FBF +:0415E900C8061131EE +:0415EA00C426C6222B +:0415EB00F0EFEA1122 +:0415EC004781E72F1D +:0415ED00443240C282 +:0415EE00853E44A250 +:0415EF0080820151A4 +:0415F000C032842E53 +:0415F100203D84AA6B +:0415F20087A2460284 +:0415F300FEC574E3DA +:0415F400852685B211 +:0415F500F0EFC2321F +:0415F60087AAEF8F42 +:0415F7004612DD615A +:0415F800C02A85A2DE +:0415F900C8EFF0EF58 +:0415FA00852685A21B +:0415FB00E34FF0EFDB +:0415FC00B7C94782A2 +:0415FD00FFC5A783FC +:0415FE00FFC785138B +:0415FF000007D563A9 +:04160000419C95AACA +:041601008082953E10 +:04160200C4221141AC +:041603002783645D78 +:04160400C6064A4488 +:04160500832AC2264C +:041606004A4404133B +:041607004501EB8529 +:0416080046014581D1 +:0416090047014681CE +:04160A000D600293DA +:04160B000000007368 +:04160C005C6384AAED +:04160D00288100052B +:04160E00409004B351 +:04160F00557DC10440 +:04161000442240B27E +:0416110001414492BD +:04161200C00880820A +:0416130045814008C5 +:04161400951A4601DC +:0416150047014681C2 +:041616000293478173 +:0416170000730D60EF +:0416180084AA0000A0 +:04161900000559630C +:04161A002831C01A99 +:04161B0004B34302CF +:04161C00C104409035 +:04161D00401C54FD1C +:04161E00933E557D25 +:04161F00FC6492E3F2 +:04162000853EC0043F +:0416210067DDBF754D +:0416220042C7A50313 +:0416230000008082C1 +:0416240000000000C2 +:0416250000000000C1 +:0416260000000000C0 +:0416270000000000BF +:04162800FFFFFFFFC2 +:04162900FFFFFFFFC1 +:04162A000000FFFFBE +:04162B000001052C89 +:04162C000001053282 +:04162D00000105387B +:04162E000001053E74 +:04162F00000104E0D2 +:0416300000010500B0 +:0416310000010500AF +:0416320000010500AE +:0416330000010500AD +:0416340000010500AC +:0416350000010500AB +:0416360000010504A6 +:041637000001050A9F +:041638000001232466 +:04163900000123F693 +:04163A00000123F692 +:04163B00000124087E +:04163C00000124087D +:04163D000001241272 +:04163E00000124166D +:04163F00000124245E +:04164000000124245D +:041641000001243C44 +:041642000001257A04 +:0416430000012580FD +:0416440000012580FC +:041645000001257A01 +:0416460000012584F6 +:041647000001243C3E +:041648000001257AFE +:0416490000012580F7 +:04164A00000159FC46 +:04164B0000015A0C34 +:04164C0000015A1827 +:04164D0000015A241A +:04164E0000015A300D +:04164F0000015A3C00 +:0416500000015A48F3 +:0416510000015A54E6 +:0416520000015A60D9 +:0416530000015A6CCC +:0416540000015A78BF +:0416550074204B4F63 +:041656006E69206F2A +:0416570000007469B2 +:04165800736C614608 +:041659007274206522 +:04165A0065676769F0 +:04165B000000007219 +:04165C00656D6954FB +:04165D000074756F31 +:04165E00252E75259B +:04165F006D75322E45 +:041660000000007313 +:04166100252E752598 +:041662006D75322E42 +:0416630075252F7347 +:04166400322E252ECF +:0416650000736D752C +:041666004353534F48 +:041667007766202062 +:041668007525202E96 +:04166900322E252ECA +:04166A0000006175A6 +:04166B0074696E49E7 +:04166C007272652011 +:04166D002020726F58 +:04166E0000006425EF +:04166F0020202020F7 +:0416700053204F4E66 +:0416710000434E598B +:0416720034313032AD +:041673003130322DB3 +:041674006D2020388D +:0416750073717261BA +:041676000000000070 +:041677002520732592 +:041678000063257571 +:04167900252E752580 +:04167A006B75322E2C +:04167B0025207A4864 +:04167C002E252E7574 +:04167D007A48753200 +:04167E000000000068 +:04167F0074736554C7 +:041680007461702001 +:041681006E726574AC +:041682000000000064 +:041683003A31564161 +:041684004247522067 +:04168500000000530E +:041686003A3156415E +:041687007347522033 +:04168800000000421C +:041689003A3156415B +:04168A006250592031 +:04168B000000725099 +:04168C003A32564157 +:04168D00625059202E +:04168E000000725096 +:04168F003A32564154 +:04169000734752202A +:041691000000004213 +:041692003A33564150 +:041693004247522058 +:0416940000005648B4 +:041695003A3356414D +:041696004247522055 +:0416970000000053FC +:041698003A3356414A +:041699007347522021 +:04169A00000000420A +:04169B003A33564147 +:04169C00625059201F +:04169D000000725087 +:04169E007473614CB4 +:04169F0065737520DA +:0416A00000000064E2 +:0416A1000000000045 +:0416A2000000000044 +:0416A3000000000142 +:0416A400000101013F +:0416A5000000000140 +:0416A6000000000040 +:0416A700000001102E +:0416A8000044060BE9 +:0416A900000001003C +:0416AA00000100003B +:0416AB008080800CAF +:0416AC00081A1A1AE4 +:0416AD000000000A2F +:0416AE0000012838D7 +:0416AF00000128CE40 +:0416B000000128D637 +:0416B100000128C646 +:0416B200000128D239 +:0416B300000128DA30 +:0416B400000128CA3F +:0416B50000012908FF +:0416B600000128DE29 +:0416B700000128E224 +:0416B800000128E61F +:0416B90000012908FB +:0416BA0000012908FA +:0416BB0000012908F9 +:0416BC0000012908F8 +:0416BD0000012908F7 +:0416BE0000012BBC40 +:0416BF0000012912EB +:0416C000000129A458 +:0416C100000129B447 +:0416C200000129CE2C +:0416C30000012A0CEC +:0416C400000129F008 +:0416C50000012A22D4 +:0416C60000012B02F2 +:0416C70000012B24CF +:0416C80000012B3AB8 +:0416C900666F725086 +:0416CA002075252E34 +:0416CB00007339254A +:0416CC00756C3425E0 +:0416CD006325632509 +:0416CE006C25202047 +:0416CF0000000075A2 +:0416D000656E694C8E +:0416D100746C756D53 +:0416D200646F6D20B4 +:0416D30000003A6574 +:0416D4007365727058 +:0416D5002D31207320 +:0416D60000000035DB +:0416D70020787525DD +:0416D80075736E7543 +:0416D900726F70704C +:0416DA0000646574CF +:0416DB00666F725074 +:0416DC0020656C69B0 +:0416DD0064616F6C69 +:0416DE000000003ACE +:0416DF00736572704D +:0416E0002D30207316 +:0416E10000000039CC +:0416E20000015C4C5B +:0416E30000015C5056 +:0416E40000015C5451 +:0416E50000015C584C +:0416E60000015B584C +:0416E70000015C5C46 +:0416E80000015C6041 +:0416E90000015C643C +:0416EA0000015B841C +:0416EB000001659005 +:0416EC0000015C6835 +:0416ED0000015C702C +:0416EE0000015C7427 +:0416EF0000015C7C1E +:0416F00000015C8019 +:0416F10000015C8810 +:0416F20000015C9007 +:0416F30000015C98FE +:0416F40000015CA0F5 +:0416F50000015CB0E4 +:0416F60000015CC0D3 +:0416F70000015CD0C2 +:0416F80000015CE0B1 +:0416F90000015CF0A0 +:0416FA0000015D008E +:0416FB0000015D0885 +:0416FC0000015D107C +:0416FD003EA93E299B +:0416FE003EE93E691A +:0416FF003E993E19B9 +:041700003ED93E5937 +:041701003EC93E3966 +:041702003E1D3E4DFD +:041703003E2D3EED4C +:041704003EAD3ECDEB +:041705003E653E6D92 +:041706001C483E013C +:041707001C501C183E +:041708001CC81CD00D +:041709005ED85E58F0 +:04170A0000003EB9E4 +:04170B007365725040 +:04170C000000007366 +:04170D00666E6F4352 +:04170E00006D72698F +:04170F006D73694D40 +:041710006863746135 +:041711006572202CB1 +:041712000079727474 +:0417130000000031A1 +:04171400000000329F +:04171500000000339D +:04171600000000349B +:041717000000003698 +:041718000000003796 +:041719000000003894 +:04171A00554E454D96 +:04171B0000000000CA +:04171C0000004B4F2F +:04171D004B434142B7 +:04171E0000000000C7 +:04171F000000505521 +:041720004E574F448D +:0417210000000000C4 +:041722005446454C98 +:0417230000000000C2 +:041724004847495297 +:04172500000000546C +:041726004F464E4993 +:0417270000000000BE +:041728005F44434C8B +:041729004B434142AB +:04172A004847494C97 +:04172B000000005466 +:04172C004E41435394 +:04172D00454E494C90 +:04172E00444F4D5F78 +:04172F000000004571 +:041730004E41435390 +:04173100454E494C8C +:041732005059545F57 +:04173300000000456D +:041734004E4143538C +:04173500454E494C88 +:04173600544E495F65 +:041737000000002B83 +:041738004E41435388 +:04173900454E494C84 +:04173A00544E495F61 +:04173B000000002D7D +:04173C00454E494C81 +:04173D00544C554D66 +:04173E00444F4D5F68 +:04173F000000004561 +:041740005341485079 +:0417410000002B4534 +:041742005341485077 +:0417430000002D4530 +:04174400464F52506A +:041745005F454C4967 +:041746004B544F4869 +:041747000000594500 +:041748006F72724505 +:04174900000000722A +:04174A0053206F4E6B +:04174B006163204472 +:04174C00642064723F +:04174D00002E746591 +:04174E0061766E4909 +:04174F002064696C3D +:041750006461656803 +:0417510000007265BD +:0417520061766E4905 +:041753002064696C39 +:041754002072646833 +:0417550000435243B8 +:0417560061766E4901 +:041757002064696C35 +:0417580061746164F3 +:041759004352432094 +:04175A00000000008B +:04175B006164705500 +:04175C00632065742D +:04175D0065636E61F1 +:04175E0064656C6CE6 +:04175F000000000086 +:0417600073616C46FF +:041761006572206825 +:041762006520646139 +:04176300000072729E +:0417640073616C46FB +:041765007265206821 +:041766002065736126 +:041767000072726535 +:0417680073616C46F7 +:04176900727720680B +:04176A002065746919 +:04176B000072726531 +:04176C0073616C46F3 +:04176D006576206815 +:04176E002066697216 +:04176F006C696166DA +:041770000000000075 +:0417710061766E49E6 +:041772002064696C1A +:0417730067616D69D4 +:04177400000000650C +:041775004353534F38 +:04177600000000006F +:04177700696C6156E2 +:0417780069746164CB +:041779006420676E13 +:04177A000061746135 +:04177B00622075254E +:04177C0073657479A4 +:04177D000000000068 +:04177E00252E75257A +:04177F002575322E6C +:04178000007325735A +:0417810061647055DA +:04178200676E6974B1 +:0417830000574620A5 +:0417840061656C70BF +:0417850077206573F1 +:041786002E746961F3 +:0417870000002E2E02 +:0417880069726556C7 +:041789006E697966A6 +:04178A006C66206702 +:04178B00006873611E +:04178C0061656C70B7 +:04178D0072206573EE +:04178E0061747365AA +:04178F000000747270 +:0417900072746552B8 +:04179100676E69799D +:0417920064707520EA +:041793000065746118 +:0417940061647055C7 +:04179500203F657418 +:041796002C593D315C +:041797004E3D322071 +:04179800000000004D +:041799006D726946BE +:04179A00657261779C +:04179B0064707520E1 +:04179C0064657461AB +:04179D000000000048 +:04179E000001324ACA +:04179F000001322AE9 +:0417A000000132040E +:0417A1000001321CF5 +:0417A200000132FC14 +:0417A300000132FC13 +:0417A400000133B05D +:0417A500000133D636 +:0417A600000133E229 +:0417A70000013422E7 +:0417A800000133F613 +:0417A90000013310F8 +:0417AA0000013310F7 +:0417AB0000013354B2 +:0417AC000001338085 +:0417AD000001338084 +:0417AE00642064252A +:0417AF0000000042F4 +:0417B000656E6F44AF +:0417B1000000000034 +:0417B2006C696146B7 +:0417B3000000646569 +:0417B400252E752544 +:0417B5002075322E3B +:0417B6000000737547 +:0417B7006C20752508 +:0417B80073656E697E +:0417B900000000002C +:0417BA006C206F4EE2 +:0417BB00006B6E69E8 +:0417BC00000174CBE9 +:0417BD000000000226 +:0417BE0000013104F1 +:0417BF000001644879 +:0417C000000164546C +:0417C1000001645C63 +:0417C20070207525F9 +:0417C3006C65786970 +:0417C40000000073AE +:0417C500000174CDDE +:0417C6000000000E11 +:0417C70000013148A4 +:0417C800706D653C9F +:0417C900003E7974F1 +:0417CA00203A752527 +:0417CB000000732582 +:0417CC00642064250C +:0417CD00000067654C +:0417CE002525752533 +:0417CF000000000016 +:0417D000656469568D +:0417D1006E69206FAE +:0417D2006F727020A2 +:0417D3003E20206331 +:0417D4000000000011 +:0417D500706D61537F +:0417D600676E696C65 +:0417D70074706F209B +:0417D8003E20202E61 +:0417D900000000000C +:0417DA00636E79536E +:0417DB0074706F2097 +:0417DC002020202E7B +:0417DD003E2020206A +:0417DE000000000007 +:0417DF007074754F5E +:0417E0006F2074758D +:0417E100202E7470D2 +:0417E2003E20202065 +:0417E3000000000002 +:0417E40074736F505B +:0417E5006F72702D82 +:0417E60020202E632E +:0417E7003E20202060 +:0417E80000000000FD +:0417E900706D6F436D +:0417EA00626974615B +:0417EB0074696C6948 +:0417EC003E20207902 +:0417ED0000000000F8 +:0417EE006964754174 +:0417EF00706F206F88 +:0417F0006E6F69743B +:0417F1003E20207303 +:0417F20000000000F3 +:0417F3007474655352 +:0417F40073676E6940 +:0417F50074706F207D +:0417F6003E20202051 +:0417F70000000000EE +:0417F800616F4C3C95 +:0417F9007270206486 +:0417FA006C69666F41 +:0417FB00003E206527 +:0417FC007661533C83 +:0417FD007270206581 +:0417FE006C69666F3D +:0417FF00003E206523 +:041800007365523C7E +:041801007320746577 +:04180200697474652C +:041803003E73676E5B +:0418040000000000E0 +:041805006B6E694C51 +:041806006F7270206D +:04180700693E2D66A3 +:041808007475706E15 +:0418090000000000DB +:04180A006B6E694C4C +:04180B00706E692072 +:04180C003E2D747584 +:04180D00666F727020 +:04180E0000000000D6 +:04180F0074696E4941 +:04181000206C61697E +:0418110075706E6917 +:04181200000000745E +:041813006F74754138 +:04181400657465642E +:04181500692074636F +:041816007475706E07 +:0418170000000000CD +:041818006F74754133 +:0418190031564120E3 +:04181A00472F5920DB +:04181B000000007356 +:04181C006F7475412F +:04181D0032564120DE +:04181E00472F5920D7 +:04181F000000007352 +:041820006F7475412B +:0418210033564120D9 +:04182200472F5920D3 +:04182300000000734E +:041824002044434CCD +:0418250074204C429D +:041826006F656D6914 +:0418270000007475D4 +:04182800706D493C5A +:041829002074726F46 +:04182A0074746573FA +:04182B003E20202E0D +:04182C0000000000B8 +:04182D002E77463C90 +:04182E00647075204D +:04182F00206574615B +:041830003E20202016 +:0418310000000000B3 +:041832006E776F441A +:041833006D61732D43 +:041834006E696C70FD +:041835000000006748 +:041836007061775313 +:0418370066656C2056 +:0418380069722F742E +:041839000074686768 +:04183A002D65725056 +:04183B0020434441C1 +:04183C006E69616709 +:04183D0000000000A7 +:04183E006C6C754613 +:04183F0020585420B9 +:0418400075746573E3 +:041841000000007033 +:0418420020335641B8 +:0418430065746E69F1 +:0418440063616C72FE +:0418450078696665F3 +:04184600000000009E +:041847006E61635318 +:04184800656E696CF4 +:041849000000007328 +:04184A006E61635315 +:04184B00656E696CF1 +:04184C00727473201F +:04184D000000002E69 +:04184E00202E6C5389 +:04184F0072627968E0 +:041850007320646934 +:04185100002E72747F +:041852006E6163530D +:04185300656E696CE9 +:0418540074656D202A +:0418550000646F6854 +:041856006E61635309 +:04185700656E696CE5 +:04185800707974200F +:041859000000006526 +:04185A006E61635305 +:04185B00656E696CE1 +:04185C00696C612032 +:04185D002E6D6E6717 +:04185E000000000086 +:04185F0069726F48F3 +:04186000746E6F7AB9 +:041861006D206C6129 +:04186200006B736143 +:0418630074726556E0 +:041864006C616369E7 +:0418650073616D201E +:041866000000006B13 +:041867006B73614DF1 +:04186800697262201F +:041869006E746867CA +:04186A00007373652F +:04186B0065766552E7 +:04186C00206573720E +:04186D000046504C95 +:04186E005949443C54 +:04186F0074616C2014 +:041870006574202E4D +:04187100003E74734E +:04187200703034326C +:041873003838322FA0 +:0418740072702070FE +:041875000000636F9D +:04187600703438335F +:041877006F727020FC +:041878000000006309 +:041879006930383466 +:04187A003637352F99 +:04187B0072702069FE +:04187C000000636F96 +:04187D00703038345B +:04187E003637352F95 +:04187F0072702070F3 +:041880000000636F92 +:04188100693036395B +:041882003830312F9A +:041883007020693038 +:0418840000636F721C +:04188500656E694CD7 +:041886006D20783227 +:041887000065646F25 +:04188800656E694CD4 +:041889006D20783323 +:04188A000065646F22 +:04188B00656E694CD1 +:04188C006D2078341F +:04188D000065646F1F +:04188E00656E694CCE +:04188F006D2078351B +:041890000065646F1C +:04189100656E694CCB +:04189200662078351F +:04189300616D726FA2 +:0418940000000074DC +:04189500783635323A +:041896002030343298 +:0418970065707361A4 +:041898000000746375 +:041899006D20585412 +:04189A000065646F12 +:04189B00494D444827 +:04189C004354492048 +:04189D000000000047 +:04189E006C616E41CA +:04189F007320676FDC +:0418A00020636E79DA +:0418A1000046504C61 +:0418A2006C616E41C6 +:0418A3007320676FD8 +:0418A40020636E79D6 +:0418A500006874560D +:0418A6006E7973489C +:0418A7006F742063D7 +:0418A8006172656C98 +:0418A9000065636E05 +:0418AA006E7973568A +:0418AB0068742063DA +:0418AC006873657286 +:0418AD0000646C6FF8 +:0418AE004C502D4825 +:0418AF007250204C07 +:0418B0006F432D65F0 +:0418B10000747361EB +:0418B2004C502D4821 +:0418B3006F50204C06 +:0418B400432D7473D9 +:0418B5007473616F78 +:0418B600000000002E +:0418B700706D61539C +:0418B800676E696C82 +:0418B90061687020D2 +:0418BA000000657352 +:0418BB00703038341D +:0418BC00206E692011 +:0418BD00706D617376 +:0418BE000072656CE3 +:0418BF006F6C6C419D +:0418C00056542077E3 +:0418C100504820501B +:0418C20078324C4CE0 +:0418C3000000000021 +:0418C4006F6C6C4198 +:0418C50070752077A3 +:0418C600706D61736D +:0418C7007832656CA2 +:0418C800000000001C +:0418C9007664413CC4 +:0418CA006974202EEF +:0418CB00676E696D6E +:0418CC003E2020207A +:0418CD000000000017 +:0418CE00656469568E +:0418CF00504C206FEA +:0418D00000000046CE +:0418D10050625059B8 +:0418D2006E692072A9 +:0418D3006C6F4320D3 +:0418D40000617053EC +:0418D50072502F52CC +:0418D60066666F20B3 +:0418D70000746573C1 +:0418D80020592F471D +:0418D9007366666F5D +:0418DA000000746531 +:0418DB0062502F42E6 +:0418DC0066666F20AD +:0418DD0000746573BB +:0418DE0072502F52C3 +:0418DF0069616720B4 +:0418E0000000006E96 +:0418E10020592F4714 +:0418E2006E69616763 +:0418E3000000000001 +:0418E40062502F42DD +:0418E50069616720AE +:0418E6000000006E90 +:0418E7002D657250A9 +:0418E8002043444114 +:0418E9006E6961477C +:0418EA0000000000FA +:0418EB0073202E48F0 +:0418EC006C706D614E +:0418ED00746172654B +:0418EE000000006591 +:0418EF0073202E48EC +:0418F0006C636E793E +:0418F10000006E6520 +:0418F20062202E48FA +:0418F300706B636152 +:0418F4006863726F44 +:0418F50000000000EF +:0418F60061202E48F7 +:0418F7007669746337 +:0418F8000000006587 +:0418F90073202E56D4 +:0418FA006C636E7934 +:0418FB0000006E6516 +:0418FC0062202E56E2 +:0418FD00706B636148 +:0418FE006863726F3A +:0418FF0000000000E5 +:0419000061202E56DE +:04190100766974632C +:04190200000000657C +:041903000066664FC5 +:041904007272754343 +:0419050020746E6577 +:0419060075706E6921 +:041907000000007468 +:04190800206C6C41A2 +:0419090075706E691E +:04190A0000007374F2 +:04190B00427347528A +:04190C0000000000D7 +:04190D00506250597B +:04190E000000007263 +:04190F00000073332E +:0419100000733031FF +:0419110000733033FC +:041912002D706F5471 +:041913007466656C25 +:0419140000000000CF +:04191500746E654344 +:0419160000007265F6 +:0419170074746F4233 +:04191800722D6D6F50 +:04191900746867691E +:04191A0000000000C9 +:04191B002066664F8D +:04191C0020736628A6 +:04191D003639203DFA +:04191E00297A486B6F +:04191F0000000000C4 +:0419200020207832D9 +:0419210020736628A1 +:041922003834203DF8 +:04192300297A486B6A +:0419240000000000BF +:0419250000706F548B +:0419260074746F4224 +:0419270000006D6FE0 +:0419280069726F4829 +:04192900746E6F7AEF +:04192A0000006C61EC +:04192B007472655617 +:04192C006C6163691E +:04192D0000000000B6 +:04192E0065746C412F +:04192F0074616E72FF +:0419300000676E6975 +:04193100746C754D10 +:04193200696C706903 +:04193300697461630F +:0419340000006E6FD2 +:041935007462755310 +:041936007463617203 +:04193700006E6F6966 +:041938006F74754112 +:0419390000000000AA +:04193A00756E614D18 +:04193B0000006C61DB +:04193C00494D444885 +:04193D0000000000A6 +:04193E0000495644C2 +:04193F0000373A38FB +:04194000737361500C +:0419410075726874DF +:0419420000000000A1 +:04194300656E694C18 +:0419440028207832AD +:0419450029626F6242 +:04194600000000009D +:04194700656E694C14 +:0419480000007832F1 +:04194900656E694C12 +:04194A00322078329D +:04194B003378303489 +:04194C000000303631 +:04194D00656E694C0E +:04194E003220783398 +:04194F003378303485 +:04195000000030362D +:04195100656E694C0A +:04195200282078339E +:041953006563616CFB +:041954000000296402 +:04195500656E694C06 +:041956002820783499 +:0419570029626F6230 +:04195800000000008B +:04195900656E694C02 +:04195A0000007833DE +:04195B00656E694C00 +:04195C0000007834DB +:04195D00656E694CFE +:04195E0000007835D8 +:04195F0030323931B8 +:041960003830317872 +:041961000000003052 +:0419620030303631BA +:041963003032317875 +:04196400000000304F +:0419650030323931B2 +:041966003032317872 +:04196700000000304C +:04196800656E6547FC +:04196900206369721C +:04196A0000333A34D8 +:04196B007832313568 +:04196C0020303432C1 +:04196D006974706FBA +:04196E0000002E6DDA +:04196F007830323367 +:0419700020303432BD +:041971006974706FB6 +:0419720000002E6DD6 +:04197300783635325B +:0419740020303432B9 +:041975006974706FB2 +:0419760000002E6DD2 +:04197700656E6547ED +:04197800206369720D +:04197900393A363190 +:04197A000000000069 +:04197B004D352E3286 +:04197C0028207A485D +:04197D002978616DF7 +:04197E000000000065 +:04197F00484D30316E +:041980006D28207A34 +:041981000029646570 +:04198200484D333366 +:041983006D28207A31 +:0419840000296E695F +:041985002056544450 +:041986007030383451 +:04198700000000005C +:04198800415345562C +:0419890030343620A0 +:04198A003038347845 +:04198B0000303640B2 +:04198C002E6365520F +:04198D00313036209F +:04198E000000000055 +:04198F002E6365520C +:041990003930372093 +:041991000000000052 +:04199200484D35394E +:041993004828207A46 +:041994002056544441 +:041995000029494993 +:04199600484D353350 +:041997004828207A42 +:04199800205654443D +:0419990000002949D8 +:04199A00484D36314D +:04199B004528207A41 +:04199C002956544430 +:04199D000000000046 +:04199E007A484D39FD +:04199F004453282065 +:0419A0000029565470 +:0419A10000006E4F85 +:0419A2006D2064252B +:0419A30000000056EA +:0419A40020202020BF +:0419A50000007525A4 +:0419A600000174CAFE +:0419A700000000201C +:0419A800000130EA20 +:0419A900652064252C +:0419AA006972746E7C +:0419AB000000736560 +:0419AC006F706D6982 +:0419AD006465747287 +:0419AE000000000035 +:0419AF006F706D499F +:0419B000203F7472EE +:0419B1002C593D313F +:0419B2004E3D322054 +:0419B3000000000030 +:0419B40044525355F1 +:0419B5000041544158 +:0419B6006573753CA4 +:0419B70000003E648A +:0419B8000001663094 +:0419B900000020000A +:0419BA0020002CE5F8 +:0419BB00E926F4FD28 +:0419BC0038BC200013 +:0419BD000000000026 +:0419BE000001663C82 +:0419BF000000200004 +:0419C0002000323E93 +:0419C100F113FA0420 +:0419C2003B61200065 +:0419C3000000000020 +:0419C4000001456475 +:0419C5000001456474 +:0419C6000001455A7D +:0419C7000001460ACB +:0419C80000014614C0 +:0419C9000001456470 +:0419CA003030363152 +:0419CB00303432780A +:0419CC0006400000D1 +:0419CD0007FE00F021 +:0419CE000FCA010635 +:0419CF000112039668 +:0419D000000400020D +:0419D1003038323147 +:0419D2003034327803 +:0419D300050000000B +:0419D400061800F001 +:0419D5000FAA01064E +:0419D60001120348AF +:0419D70000004102C9 +:0419D80078303639F4 +:0419D9000030343274 +:0419DA0003C0000046 +:0419DB00049200F082 +:0419DC000F80010671 +:0419DD0001120336BA +:0419DE000000020201 +:0419DF0078323135F4 +:0419E000003034326D +:0419E1000200000000 +:0419E20002AA00F065 +:0419E3000E4D01069E +:0419E40001120332B7 +:0419E5000008841062 +:0419E60078303233F0 +:0419E7000030343266 +:0419E80001400000BA +:0419E90001AA00F05F +:0419EA000E310106B3 +:0419EB000112031FC3 +:0419EC0000110820BE +:0419ED0078363532E1 +:0419EE00003034325F +:0419EF0001000000F3 +:0419F000015500F0AD +:0419F1000E270106B6 +:0419F20001120319C2 +:0419F300002210407E +:0419F40070303432E9 +:0419F50000000000EE +:0419F60002D000001B +:0419F700035A00F09F +:0419F8000F3901069C +:0419F9000112033E96 +:0419FA000000000EDB +:0419FB003030363121 +:0419FC0030343278D9 +:0419FD000640004C54 +:0419FE0007FE00F0F0 +:0419FF0029CA0138B8 +:041A00000112039636 +:041A010000040002DB +:041A02003038323115 +:041A030038383278C5 +:041A040005000000D9 +:041A0500061801209E +:041A06000FAA0138EA +:041A0700011203487D +:041A08000000410297 +:041A090078303639C2 +:041A0A000038383236 +:041A0B0003C0000014 +:041A0C00049201201F +:041A0D000F8001380D +:041A0E000112033688 +:041A0F0000000202CF +:041A100078323135C2 +:041A11004C303432EF +:041A1200020000428C +:041A130002AA00F033 +:041A1400294D01381F +:041A15000112033285 +:041A16000008841030 +:041A170078303233BE +:041A18004C303432E8 +:041A19000140004246 +:041A1A0001AA00F02D +:041A1B002931013834 +:041A1C000112031F91 +:041A1D00001108208C +:041A1E0078363532AF +:041A1F004C303432E1 +:041A2000010000427F +:041A2100015500F07B +:041A22002927013837 +:041A23000112031990 +:041A2400002210404C +:041A250070383832AB +:041A260000000000BC +:041A270002D00000E9 +:041A28000360012036 +:041A29001345013828 +:041A2A000112033F63 +:041A2B000000000EA9 +:041A2C0078303834A2 +:041A2D00003036331C +:041A2E0001E00000D3 +:041A2F0002580168F0 +:041A30000A3F0177F1 +:041A31000204032682 +:041A32000000000EA2 +:041A330078303432A1 +:041A34000030363315 +:041A350001000000AC +:041A3600012C016816 +:041A37000A18017711 +:041A3800020403128F +:041A39000000208009 +:041A3A007034383399 +:041A3B0000000000A7 +:041A3C0001F00000B5 +:041A3D0002800180A2 +:041A3E001D3201A7AD +:041A3F000204033E5C +:041A40000000000E94 +:041A4100783034368F +:041A4200003030340C +:041A4300028000001D +:041A440003200190EA +:041A4500243001C187 +:041A46000210026028 +:041A47000000000C8F +:041A48007830343688 +:041A490000343833FA +:041A4A000280000016 +:041A4B0003200180F3 +:041A4C003F3001EC3A +:041A4D000210026021 +:041A4E000000000E86 +:041A4F00693038348E +:041A50000000000092 +:041A510002D00000BF +:041A5200035A00F043 +:041A53000F39020D38 +:041A54000312033E38 +:041A55000000410F3D +:041A56007030383480 +:041A5700000000008B +:041A580002D00000B8 +:041A5900035A01E04B +:041A5A001E3C020D1F +:041A5B000414063E2B +:041A5C000000000C7A +:041A5D007830343673 +:041A5E0000303834E8 +:041A5F000280000001 +:041A6000032001E07E +:041A61002130020D21 +:041A62000414026006 +:041A63000000000C73 +:041A6400783034366C +:041A650000323135E5 +:041A660002800000FA +:041A67000320020056 +:041A68001C300238F4 +:041A690004140260FF +:041A6A000000000C6C +:041A6B00693637356C +:041A6C000000000076 +:041A6D0002D00000A3 +:041A6E0003600120F0 +:041A6F0013450271A8 +:041A70000312033F1B +:041A71000000410F21 +:041A7200703637355E +:041A7300000000006F +:041A740002D000009C +:041A750003600240C8 +:041A7600274402718E +:041A7700040405401E +:041A78000000000C5E +:041A79007830303859 +:041A7A0000303036D2 +:041A7B000320000044 +:041A7C0004200258E8 +:041A7D001758027480 +:041A7E0000100480D0 +:041A7F00000000045F +:041A80007030323759 +:041A81000000000061 +:041A8200050000005B +:041A8300067202D015 +:041A840014DC02EE7E +:041A85000018052818 +:041A86000000000458 +:041A87003432303194 +:041A8800383637783D +:041A89000400000055 +:041A8A000540030010 +:041A8B001DA0032671 +:041A8C0000100688B8 +:041A8D000000000451 +:041A8E003038323189 +:041A8F003230317848 +:041A90000500003419 +:041A910006980400AF +:041A920026F8042A04 +:041A930000100370CC +:041A9400000000044A +:041A9500783034363B +:041A96006930363944 +:041A970002800000C9 +:041A9800032001E046 +:041A99002130041ADA +:041A9A0005140260CD +:041A9B000000000D3A +:041A9C00303830317D +:041A9D0000000069DC +:041A9E0007800000BD +:041A9F000898021C85 +:041AA0001094046535 +:041AA1000518052CF3 +:041AA2000000000D33 +:041AA3003038303176 +:041AA40000000070CE +:041AA50007800000B6 +:041AA6000898043860 +:041AA700249404651A +:041AA8000018052CF1 +:041AA9000000000435 +:041AAA003030363171 +:041AAB00303231782C +:041AAC0006400030C0 +:041AAD00087004B009 +:041AAE002EFF04E221 +:041AAF00001003F12F +:041AB000000000042E +:041AB1007665642FC3 +:041AB2006370652FC9 +:041AB3006F635F718D +:041AB4006F72746E6B +:041AB50072656C6C7E +:041AB600615F305FDD +:041AB7006D5F6C767D +:041AB80000006D6558 +:041AB9002B302D237E +:041ABA000000002008 +:041ABB00004C6C6807 +:041ABC0045676665AF +:041ABD000000474698 +:041ABE00333231305E +:041ABF00373635344D +:041AC000424139382E +:041AC100464544430F +:041AC2000000000020 +:041AC3003332313059 +:041AC4003736353448 +:041AC50062613938E9 +:041AC600666564638A +:041AC700000000001B +:041AC8001A80808080 +:041AC90000081A1ADD +:041ACA000000000018 +:041ACB000000000017 +:041ACC0000016AC4E7 +:041ACD000000000015 +:041ACE000000000014 +:041ACF000001035CB3 +:041AD0000001041CF1 +:041AD100000101CE41 +:041AD200000101EA24 +:041AD30000010236D6 +:041AD400008000008E +:041AD500008000008D +:041AD600000000000C +:041AD700000000000B +:041AD800000000000A +:041AD9000000000009 +:041ADA000000000008 +:041ADB000000000007 +:041ADC000000000006 +:041ADD000000000005 +:041ADE000000000004 +:041ADF000000000003 +:041AE0000000000002 +:041AE1000000000001 +:041AE2000000000000 +:041AE30000000000FF +:041AE40000000000FE +:041AE50000000000FD +:041AE60000000000FC +:041AE70000000000FB +:041AE80000000000FA +:041AE90000000000F9 +:041AEA0000000000F8 +:041AEB0000000000F7 +:041AEC0000000000F6 +:041AED0000000000F5 +:041AEE0000000000F4 +:041AEF0000000000F3 +:041AF00000000000F2 +:041AF10000000000F1 +:041AF20000000000F0 +:041AF30000000000EF +:041AF40000000000EE +:041AF50000000000ED +:041AF60000000000EC +:041AF7000001017475 +:041AF800008000006A +:041AF90001000000E8 +:041AFA0000020100E5 +:041AFB000080000067 +:041AFC0000000001E5 +:041AFD000000008065 +:041AFE0000010000E3 +:041AFF0000000100E2 +:041B000000000000E1 +:041B0100020E0409C3 +:041B02003D0E00C8CC +:041B03003F6E0383AB +:041B04003ED03DACE6 +:041B05000000038356 +:041B0600026404B2BF +:041B07003C9300E922 +:041B08003F5604162A +:041B09003E9F3D4975 +:041B0A0000000416BD +:041B0B00017804E574 +:041B0C003CCE00814A +:041B0D003FAE038361 +:041B0E003F333D49DB +:041B0F00000003834C +:041B100001B405B85F +:041B11003C490093B8 +:041B12003F9F0416D7 +:041B13003F103CD96A +:041B140000000416B3 +:041B15000001640C5B +:041B16000001641056 +:041B17000001642045 +:041B1800000159FC73 +:041B190000015A0C61 +:041B1A0000015A1854 +:041B1B0000015A2447 +:041B1C0000015A303A +:041B1D0000015A3C2D +:041B1E0000015A4820 +:041B1F0000015A5413 +:041B200000015A6006 +:041B210000015A6CF9 +:041B220000015A78EC +:041B2300000165A0B8 +:041B2400000165ACAB +:041B2500000165BC9A +:041B2600000165CC89 +:041B2700000165DC78 +:041B2800000165A0B3 +:041B2900000165ACA6 +:041B2A00000165BC95 +:041B2B00000165CC84 +:041B2C000001657CD3 +:041B2D0000016588C6 +:041B2E0000016594B9 +:041B2F000001640C41 +:041B30000001643C10 +:041B3100000164400B +:041B32000001644406 +:041B3300000163AC9E +:041B340000000002AB +:041B35000001750C2A +:041B36000AF0012C84 +:041B370000011E1873 +:041B3800000163BC89 +:041B390000000002A6 +:041B3A000001758CA5 +:041B3B0000FF000A9D +:041B3C0000011E186E +:041B3D00000163C878 +:041B3E0000000002A1 +:041B3F00000174C865 +:041B400000FF0001A1 +:041B410000011E1869 +:041B4200000163D863 +:041B4300000000029C +:041B4400000174FE2A +:041B4500078000C84D +:041B460000011E1864 +:041B4700000163E452 +:041B48000000000297 +:041B4900000174F62D +:041B4A00000700018F +:041B4B0000011E185F +:041B4C00000163F041 +:041B4D000000000292 +:041B4E000001758697 +:041B4F00003F000152 +:041B500000011E185A +:041B5100000164002B +:041B5200000000028D +:041B5300000174FA1F +:041B540004B000A039 +:041B550000011E1855 +:041B5600000160C862 +:041B5700000000008A +:041B5800000175B65D +:041B59000001000186 +:041B5A00000173E42F +:041B5B00000160D84D +:041B5C000000000085 +:041B5D00000175B757 +:041B5E000001000181 +:041B5F00000173EC22 +:041B6000000160E838 +:041B6100000000017F +:041B6200000175B851 +:041B63000018000066 +:041B6400000130CE7E +:041B6500000160F823 +:041B6600000000007B +:041B6700000175B351 +:041B68000001000177 +:041B6900000173EC18 +:041B6A00000161080D +:041B6B000000000076 +:041B6C00000175B44B +:041B6D000001000172 +:041B6E00000173EC13 +:041B6F0000015F40D2 +:041B7000000000036E +:041B71000001747883 +:041B7200000000006F +:041B7300000000006E +:041B740000015F54B9 +:041B75000000000369 +:041B76000001746096 +:041B7700000000006A +:041B78000000000069 +:041B790000015F68A0 +:041B7A000000000364 +:041B7B000001747081 +:041B7C000000000065 +:041B7D000000000064 +:041B7E0000015F7C87 +:041B7F00000000035F +:041B8000000174509C +:041B81000000000060 +:041B8200000000005F +:041B830000015F906E +:041B8400000000035A +:041B8500000174588F +:041B8600000000005B +:041B8700000000005A +:041B880000015FA455 +:041B89000000000355 +:041B8A0000017440A2 +:041B8B000000000056 +:041B8C000000000055 +:041B8D0000015FB83C +:041B8E000000000350 +:041B8F0000017438A5 +:041B90000000000051 +:041B91000000000050 +:041B920000015FCC23 +:041B9300000000034B +:041B94000001746870 +:041B9500000000004C +:041B9600000000004B +:041B9700000161C820 +:041B98000000000049 +:041B99000001759C36 +:041B9A000004000142 +:041B9B00000172E8EB +:041B9C00000161D80B +:041B9D000000000044 +:041B9E000001759D30 +:041B9F00000300013E +:041BA000000172FCD2 +:041BA100000161E4FA +:041BA200000000003F +:041BA3000001759E2A +:041BA4000003000139 +:041BA5000001730CBC +:041BA600000161F4E5 +:041BA700000000003A +:041BA8000001759F24 +:041BA9000001000136 +:041BAA00000173FCC7 +:041BAB0000016204CF +:041BAC000000000035 +:041BAD00000175A01E +:041BAE000001000131 +:041BAF00000173F4CA +:041BB00000016214BA +:041BB1000000000030 +:041BB2000001759722 +:041BB300000300012A +:041BB40000016C8C34 +:041BB50000016220A9 +:041BB600000000002B +:041BB700000175981C +:041BB8000004000124 +:041BB90000016C9C1F +:041BBA000001622C98 +:041BBB000000000026 +:041BBC000001759916 +:041BBD000003000120 +:041BBE0000016C8C2A +:041BBF000001623887 +:041BC0000000000021 +:041BC1000001759A10 +:041BC200000300011B +:041BC30000016C8C25 +:041BC4000001624476 +:041BC500000000001C +:041BC6000001759B0A +:041BC7000002000117 +:041BC80000016CB0FC +:041BC9000001625461 +:041BCA000000000017 +:041BCB00000175A1FF +:041BCC000001000113 +:041BCD00000173DCC4 +:041BCE00000162644C +:041BCF000000000012 +:041BD000000175A5F6 +:041BD100000100010E +:041BD2000001741C7E +:041BD3000001626C3F +:041BD400000000000D +:041BD500000175A6F0 +:041BD6000001000109 +:041BD700000173ECAA +:041BD8000001611C8B +:041BD9000000000008 +:041BDA000001759001 +:041BDB000002000103 +:041BDC000001732869 +:041BDD00000161287A +:041BDE000000000102 +:041BDF0000017594F8 +:041BE000000F0000F2 +:041BE100000130A827 +:041BE2000001613865 +:041BE30000000001FD +:041BE40000017592F5 +:041BE500001C0000E0 +:041BE6000001308446 +:041BE7000001614850 +:041BE80000000000F9 +:041BE90000017593EF +:041BEA0000010001F5 +:041BEB00000174146D +:041BEC00000161583B +:041BED0000000000F4 +:041BEE0000017591EC +:041BEF0000020001EF +:041BF0000001733449 +:041BF1000001616826 +:041BF20000000000EF +:041BF30000017595E3 +:041BF40000010001EB +:041BF5000001740C6B +:041BF6000001617C0D +:041BF70000000001E9 +:041BF800000175A2D1 +:041BF90000FF0000E9 +:041BFA000001306E48 +:041BFB000001618CF8 +:041BFC0000000001E4 +:041BFD00000175A3CB +:041BFE00003F0000A4 +:041BFF000001306E43 +:041C00000001619CE2 +:041C010000000001DE +:041C0200000175A4C4 +:041C0300000F0000CE +:041C040000012FB6F6 +:041C0500000161ACCD +:041C060000000001D9 +:041C0700000175B5AE +:041C0800001F0000B9 +:041C090000012FB6F1 +:041C0A00000161B8BC +:041C0B0000000004D1 +:041C0C0000011FFEB6 +:041C0D0000015EF084 +:041C0E0000000000D2 +:041C0F00000162DC92 +:041C100000000001CF +:041C1100000175A8B1 +:041C1200001F0001AE +:041C130000012FCCD1 +:041C1400000162EC7D +:041C150000000000CB +:041C1600000175A7AD +:041C170000020001C6 +:041C18000001731C38 +:041C1900000162FC68 +:041C1A0000000000C6 +:041C1B00000175A9A6 +:041C1C0000010001C2 +:041C1D00000173EC63 +:041C1E00000163104E +:041C1F0000000000C1 +:041C2000000175AAA0 +:041C210000010001BD +:041C2200000173EC5E +:041C23000001632435 +:041C240000000003B9 +:041C25000001743016 +:041C260000016698BB +:041C270000011DB6E5 +:041C280000015FE078 +:041C290000000004B3 +:041C2A0000011D0692 +:041C2B0000015F1441 +:041C2C0000000000B4 +:041C2D0000015FF063 +:041C2E0000000004AE +:041C2F0000011D682B +:041C300000015F143C +:041C310000000000AF +:041C3200000160004D +:041C330000000004A9 +:041C34000001261471 +:041C350000000000AB +:041C360000000000AA +:041C37000001601434 +:041C380000000001A7 +:041C3900000175C071 +:041C3A00000A01019A +:041C3B000001311E55 +:041C3C00000160281B +:041C3D0000000000A3 +:041C3E00000175220A +:041C3F00000100019F +:041C4000000173EC40 +:041C41000001603C02 +:041C4200000000009E +:041C4300000174CC5C +:041C4400000A000191 +:041C450000016C60CE +:041C46000001604CED +:041C47000000000099 +:041C48000001758B97 +:041C49000002000194 +:041C4A0000016C54D5 +:041C4B0000016060D4 +:041C4C000000000094 +:041C4D00000174FC22 +:041C4E000001000190 +:041C4F000001740418 +:041C500000016070BF +:041C5100000000008F +:041C5200000173DB3F +:041C5300000100018B +:041C54000001740413 +:041C550000016080AA +:041C5600000000008A +:041C5700000174CE46 +:041C58000001000186 +:041C5900000174040E +:041C5A000001609095 +:041C5B000000000085 +:041C5C000001750A04 +:041C5D00000300017F +:041C5E0000016CBC59 +:041C5F00000160A080 +:041C6000000000047C +:041C61000001378ABD +:041C6200000000007E +:041C6300000000007D +:041C6400000160B467 +:041C65000000000477 +:041C660000012BD07E +:041C67000000000079 +:041C68000000000078 +:041C6900000162789C +:041C6A000000000076 +:041C6B00000175AF50 +:041C6C000003000170 +:041C6D0000017340BF +:041C6E000001628887 +:041C6F000000000170 +:041C7000000175AC4E +:041C7100001F000050 +:041C72000001304AF3 +:041C73000001629872 +:041C7400000000016B +:041C7500000175AD48 +:041C760000FF00006B +:041C77000001300632 +:041C7800000162A85D +:041C79000000000166 +:041C7A00000175AE42 +:041C7B0000C80A0093 +:041C7C00000130062D +:041C7D00000162B848 +:041C7E000000000161 +:041C7F00000175B13A +:041C8000000500005B +:041C810000012FF03F +:041C8200000162C833 +:041C8300000000015C +:041C8400000175B234 +:041C85000005000056 +:041C860000012FF03A +:041C870000016338BD +:041C88000000000058 +:041C8900000175B031 +:041C8A000005000150 +:041C8B000001735091 +:041C8C0000016344AC +:041C8D000000000053 +:041C8E00000175AB31 +:041C8F00000100014F +:041C900000017424B7 +:041C91000001635497 +:041C9200000000014D +:041C9300000175B91E +:041C940000FF00004D +:041C950000012FB665 +:041C96000001636086 +:041C97000000000148 +:041C9800000175BA18 +:041C990000FF000048 +:041C9A0000012FB660 +:041C9B000001636C75 +:041C9C000000000143 +:041C9D00000175BB12 +:041C9E0000FF000043 +:041C9F0000012FB65B +:041CA0000001637864 +:041CA100000000013E +:041CA200000175BC0C +:041CA30000FF00003E +:041CA40000012FB656 +:041CA5000001638453 +:041CA6000000000139 +:041CA700000175BD06 +:041CA80000FF000039 +:041CA90000012FB651 +:041CAA000001639042 +:041CAB000000000134 +:041CAC00000175BE00 +:041CAD0000FF000034 +:041CAE0000012FB64C +:041CAF000001639C31 +:041CB000000000012F +:041CB100000175BFFA +:041CB200000F00001F +:041CB30000012FB647 +:041CB400000174486F +:041CB500000000002B +:041CB600000000002A +:041CB7000000000029 +:041CB8000000000028 +:041CB9000000000027 +:041CBA0000016500C0 +:041CBB000001651CA3 +:041CBC00000165645A +:041CBD000001656C51 +:041CBE000001657448 +:041CBF0000016500BB +:041CC0000001651C9E +:041CC1000001652495 +:041CC2000001653484 +:041CC30000016500B7 +:041CC4000001650CAA +:041CC5000001654471 +:041CC6000001655460 +:041CC700000164E0D4 +:041CC800000166149D +:041CC9000001662090 +:041CCA000001640CA5 +:041CCB00000164E0D0 +:041CCC00000164E8C7 +:041CCD00000164A00E +:041CCE00000164AC01 +:041CCF00000164B8F4 +:041CD000000165ECBE +:041CD100000165FCAD +:041CD200000166089F +:041CD3000001640C9C +:041CD400000164E0C7 +:041CD5000001640C9A +:041CD600000166485B +:041CD700000166584A +:041CD8000001666839 +:041CD9000001667828 +:041CDA000000000006 +:041CDB000000000005 +:041CDC000000000004 +:041CDD000000000003 +:041CDE000000000002 +:041CDF000000000001 +:041CE0000000000000 +:041CE10000000000FF +:041CE20000000000FE +:041CE30000000000FD +:041CE40000000000FC +:041CE50000000000FB +:041CE60000000000FA +:041CE70000000000F9 +:041CE80000000000F8 +:041CE90000000000F7 +:041CEA0000000000F6 +:041CEB0000000000F5 +:041CEC0000000000F4 +:041CED0000000000F3 +:041CEE0000000000F2 +:041CEF0000000000F1 +:041CF00000000000F0 +:041CF10000000000EF +:041CF200000158860F +:041CF300000173CCAD +:041CF400000173CCAC +:041CF500001080104B +:041CF6000100800069 +:041CF700000165A8DB +:041CF800000164FC87 +:041CF9000001646C16 +:041CFA000001648001 +:041CFB000001640C74 +:041CFC0000016684F9 +:041CFD00000165007D +:041CFE000001650C70 +:041CFF00000165007B +:041D00000001651C5D +:041D01000001642C4D +:041D02000001643444 +:041D030000016494E3 +:041D040000016498DE +:041D0500000164C4B1 +:041D0600000164D4A0 +:041D0700000164F083 +:041D0800000164F87A +:041D0900000166303F +:041D0A000001663C32 +:041D0B0000017368F8 +:041D0C0000000007CC +:041D0D0000016CCC99 +:041D0E0000000003CE +:041D0F0000016D580A +:041D100000000002CD +:041D110000016D94CC +:041D120000000008C5 +:041D130000016DBCA2 +:041D14000000000DBE +:041D150000016E5CFF +:041D16000000000BBE +:041D170000016F60F8 +:041D180000000005C2 +:041D19000001703C19 +:041D1A000000000DB8 +:041D1B00000170A0B3 +:041D1C0000000006BD +:041D1D00000171A4AC +:041D1E0000000009B8 +:041D1F000001721C31 +:041D2000C896554BC1 :00000001FF diff --git a/software/sys_controller/memory/flash.c b/software/sys_controller/memory/flash.c index 455ecf7..b47e45b 100644 --- a/software/sys_controller/memory/flash.c +++ b/software/sys_controller/memory/flash.c @@ -21,7 +21,7 @@ #include #include "system.h" #include "flash.h" -#include "ci_crc.h" +#include "utils.h" extern alt_epcq_controller_dev epcq_controller_0; @@ -49,9 +49,6 @@ int read_flash(alt_u32 offset, alt_u32 length, alt_u8 *dstbuf) if (retval != 0) return -FLASH_READ_ERROR; - for (i=0; i> 24; - return 0; } @@ -69,10 +66,6 @@ int write_flash_page(alt_u8 *pagedata, alt_u32 length, alt_u32 pagenum) } } - // Bit-reverse bytes for flash - for (i=0; i> 24; - retval = alt_epcq_controller_write_block(&epcq_controller_dev->dev, (pagenum/PAGES_PER_SECTOR)*PAGES_PER_SECTOR*PAGESIZE, pagenum*PAGESIZE, pagedata, length); if (retval != 0) { @@ -83,6 +76,26 @@ int write_flash_page(alt_u8 *pagedata, alt_u32 length, alt_u32 pagenum) return 0; } +int write_flash(alt_u8 *buf, alt_u32 length, alt_u32 pagenum) +{ + int retval; + alt_u32 bytes_to_w; + + while (length > 0) { + bytes_to_w = (length > PAGESIZE) ? PAGESIZE : length; + + retval = write_flash_page(buf, bytes_to_w, pagenum); + if (retval != 0) + return retval; + + buf += bytes_to_w; + length -= bytes_to_w; + ++pagenum; + } + + return 0; +} + int verify_flash(alt_u32 offset, alt_u32 length, alt_u32 golden_crc, alt_u8 *tmpbuf) { alt_u32 crcval=0, i, bytes_to_read; @@ -95,7 +108,7 @@ int verify_flash(alt_u32 offset, alt_u32 length, alt_u32 golden_crc, alt_u8 *tmp if (retval != 0) return retval; - crcval = crcCI(tmpbuf, bytes_to_read, (i==0)); + crcval = crc32(tmpbuf, bytes_to_read, (i==0)); } if (crcval != golden_crc) diff --git a/software/sys_controller/memory/flash.h b/software/sys_controller/memory/flash.h index f049726..6c8485e 100644 --- a/software/sys_controller/memory/flash.h +++ b/software/sys_controller/memory/flash.h @@ -44,6 +44,8 @@ int read_flash(alt_u32 offset, alt_u32 length, alt_u8 *dstbuf); int write_flash_page(alt_u8 *pagedata, alt_u32 length, alt_u32 pagenum); +int write_flash(alt_u8 *buf, alt_u32 length, alt_u32 pagenum); + int verify_flash(alt_u32 offset, alt_u32 length, alt_u32 golden_crc, alt_u8 *tmpbuf); #endif /* FLASH_H_ */ diff --git a/software/sys_controller/memory/sdcard.c b/software/sys_controller/memory/sdcard.c index 092bbbf..d8ab183 100644 --- a/software/sys_controller/memory/sdcard.c +++ b/software/sys_controller/memory/sdcard.c @@ -19,6 +19,7 @@ #include #include "sdcard.h" +#include "flash.h" #include "lcd.h" extern char menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1]; @@ -36,3 +37,28 @@ int check_sdcard(alt_u8 *databuf) return SD_Read(&sdcard_dev, databuf, 0, 0, 512); } + +int copy_sd_to_flash(alt_u32 sd_blknum, alt_u32 flash_pagenum, alt_u32 length, alt_u8 *tmpbuf) +{ + int retval; + alt_u32 bytes_to_rw; + + while (length > 0) { + bytes_to_rw = (length < SD_BLK_SIZE) ? length : SD_BLK_SIZE; + retval = SD_Read(&sdcard_dev, tmpbuf, sd_blknum, 0, bytes_to_rw); + if (retval != 0) { + printf("Failed to read SD card\n"); + return -retval; + } + + retval = write_flash(tmpbuf, bytes_to_rw, flash_pagenum); + if (retval != 0) + return retval; + + ++sd_blknum; + flash_pagenum += bytes_to_rw/PAGESIZE; + length -= bytes_to_rw; + } + + return 0; +} diff --git a/software/sys_controller/memory/sdcard.h b/software/sys_controller/memory/sdcard.h index 5f4a78e..046df77 100644 --- a/software/sys_controller/memory/sdcard.h +++ b/software/sys_controller/memory/sdcard.h @@ -25,5 +25,6 @@ #include "sd_io.h" int check_sdcard(alt_u8 *databuf); +int copy_sd_to_flash(alt_u32 sd_blknum, alt_u32 flash_pagenum, alt_u32 length, alt_u8 *tmpbuf); #endif /* SDCARD_H_ */ diff --git a/software/sys_controller/ossc/av_controller.c b/software/sys_controller/ossc/av_controller.c index 911d5ce..496ac21 100644 --- a/software/sys_controller/ossc/av_controller.c +++ b/software/sys_controller/ossc/av_controller.c @@ -41,6 +41,7 @@ #include "HDMI_TX.h" #include "hdmitx.h" #include "sd_io.h" +#include "sys/alt_timestamp.h" #define STABLE_THOLD 1 #define MIN_LINES_PROGRESSIVE 200 @@ -69,6 +70,7 @@ alt_u8 stable_frames; alt_u8 update_cur_vm; alt_u8 vm_sel, vm_edit, profile_sel, profile_sel_menu, input_profiles[AV_LAST], lt_sel, def_input, profile_link, lcd_bl_timeout; +alt_u8 auto_input, auto_av1_ypbpr, auto_av2_ypbpr = 1, auto_av3_ypbpr; alt_u16 tc_h_samplerate, tc_h_synclen, tc_h_bporch, tc_h_active, tc_v_synclen, tc_v_bporch, tc_v_active; char row1[LCD_ROW_LEN+1], row2[LCD_ROW_LEN+1], menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1]; @@ -78,6 +80,7 @@ avinput_t target_input; alt_u8 pcm1862_active; +alt_u32 read_it2(alt_u32 regaddr); inline void lcd_write_menu() { @@ -361,8 +364,8 @@ status_t get_status(tvp_input_t input, video_format format) return status; } -// h_info: [31:30] [29] [28] [27:20] [19:11] [10:0] -// | H_MULTMODE[1:0] | H_L5FMT | | H_SYNCLEN[7:0] | H_BACKPORCH[8:0] | H_ACTIVE[10:0] | +// h_info: [31:30] [29] [28] [27:20] [19:11] [10:0] +// | H_MULTMODE[1:0] | H_L5FMT | H_L3_240x360 | H_SYNCLEN[7:0] | H_BACKPORCH[8:0] | H_ACTIVE[10:0] | // // h_info2: [31:30] [29:19] [18:16] [15:13] [12:10] [9:0] // | | H_MASK[10:0] | H_OPT_SCALE[2:0] | H_OPT_SAMPLE_SEL[2:0] | H_OPT_SAMPLE_MULT[2:0] | H_OPT_STARTOFF[9:0] | @@ -398,6 +401,7 @@ void set_videoinfo() switch (cm.target_lm) { case MODE_L2_320_COL: + case MODE_L2_240x360: h_opt_scale = 4; break; case MODE_L2_256_COL: @@ -409,36 +413,30 @@ void set_videoinfo() case MODE_L3_256_COL: h_opt_scale = 4-cm.cc.ar_256col; break; + case MODE_L3_240x360: + h_opt_scale = 6; + break; case MODE_L4_320_COL: h_opt_scale = 4; break; case MODE_L4_256_COL: h_opt_scale = 5-cm.cc.ar_256col; break; - case MODE_L5_GEN_4_3: - if (cm.cc.l5_fmt == L5FMT_1920x1080) { - v_active -= 24; - v_backporch += 12; - } - break; case MODE_L5_320_COL: h_opt_scale = 5; - if (cm.cc.l5_fmt == L5FMT_1920x1080) { - v_active -= 24; - v_backporch += 12; - } break; case MODE_L5_256_COL: h_opt_scale = 6-cm.cc.ar_256col; - if (cm.cc.l5_fmt == L5FMT_1920x1080) { - v_active -= 24; - v_backporch += 12; - } break; default: break; } + if (cm.target_lm >= MODE_L5_GEN_4_3 && cm.cc.l5_fmt == L5FMT_1920x1080) { + v_active -= 24; + v_backporch += 12; + } + // CEA-770.3 HDTV modes use tri-level syncs which have twice the width of bi-level syncs of corresponding CEA-861 modes if (target_type == VIDEO_HDTV) h_synclen *= 2; @@ -456,6 +454,7 @@ void set_videoinfo() IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, (cm.fpga_hmultmode<<30) | ((cm.cc.l5_fmt!=L5FMT_1600x1200)<<29) | + ((cm.target_lm==MODE_L3_240x360)<<28) | (((cm.sample_mult*h_synclen)&0xff)<<20) | (((cm.sample_mult*(alt_u16)video_modes[cm.id].h_backporch)&0x1ff)<<11) | ((cm.sample_mult*video_modes[cm.id].h_active)&0x7ff)); @@ -549,7 +548,7 @@ void program_mode() int load_profile() { int retval; - retval = read_userdata(profile_sel_menu); + retval = read_userdata(profile_sel_menu, 0); if (retval == 0) { profile_sel = profile_sel_menu; @@ -682,8 +681,8 @@ int init_hw() memcpy(rc_keymap, rc_keymap_default, sizeof(rc_keymap)); // Load initconfig and profile - read_userdata(INIT_CONFIG_SLOT); - read_userdata(profile_sel); + read_userdata(INIT_CONFIG_SLOT, 0); + read_userdata(profile_sel, 0); // Setup remote keymap if (!(IORD_ALTERA_AVALON_PIO_DATA(PIO_1_BASE) & PB1_BIT)) @@ -695,15 +694,6 @@ int init_hw() return 0; } -#ifdef DEBUG -int latency_test() -{ - sniprintf(menu_row2, LCD_ROW_LEN+1, "Unavailable"); - lcd_write_menu(); - usleep(1000000); - return -1; -} -#else int latency_test() { alt_u32 lt_status, btn_vec, btn_vec_prev=1; alt_u16 latency_ms_x100, stb_ms_x100; @@ -736,7 +726,9 @@ int latency_test() { SPI_Timer_Off(); latency_ms_x100 = lt_status & 0xffff; stb_ms_x100 = (lt_status >> 16) & 0xfff; - if ((latency_ms_x100 == 0) || (latency_ms_x100 == 0xffff)) + if (latency_ms_x100 == 0) + sniprintf(menu_row2, LCD_ROW_LEN+1, "False trigger"); + else if (latency_ms_x100 == 0xffff) sniprintf(menu_row2, LCD_ROW_LEN+1, "Timeout"); else if (stb_ms_x100 == 0xfff) sniprintf(menu_row2, LCD_ROW_LEN+1, "%u.%.2ums", latency_ms_x100/100, latency_ms_x100%100); @@ -760,7 +752,6 @@ int latency_test() { return 0; } -#endif // Enable chip outputs void enable_outputs() @@ -785,6 +776,12 @@ int main() alt_u32 input_vec; + alt_u32 auto_input_timestamp = 300 * (alt_timestamp_freq() >> 10); + alt_u8 auto_input_changed = 0; + alt_u8 auto_input_ctr = 0; + alt_u8 auto_input_current_ctr = AUTO_CURRENT_MAX_COUNT; + alt_u8 auto_input_keep_current = 0; + int init_stat, man_input_change; init_stat = init_hw(); @@ -806,6 +803,9 @@ int main() while (1) {} } + // start timer for auto input + alt_timestamp_start(); + // Mainloop while(1) { // Read remote control and PCB button status @@ -826,11 +826,68 @@ int main() btn_code = 0; } + // Auto input switching + if (auto_input != AUTO_OFF && cm.avinput != AV_TESTPAT && !cm.sync_active && !menu_active + && alt_timestamp() >= auto_input_timestamp && auto_input_ctr < AUTO_MAX_COUNT) { + + // Keep switching on the same physical input when set to Current input or a short time after losing sync. + auto_input_keep_current = (auto_input == AUTO_CURRENT_INPUT || auto_input_current_ctr < AUTO_CURRENT_MAX_COUNT); + + switch(cm.avinput) { + case AV1_RGBs: + target_input = auto_av1_ypbpr ? AV1_YPBPR : AV1_RGsB; + break; + case AV1_RGsB: + case AV1_YPBPR: + target_input = auto_input_keep_current ? AV1_RGBs : (auto_av2_ypbpr ? AV2_YPBPR : AV2_RGsB); + break; + case AV2_YPBPR: + case AV2_RGsB: + target_input = auto_input_keep_current ? target_input : AV3_RGBHV; + break; + case AV3_RGBHV: + target_input = AV3_RGBs; + break; + case AV3_RGBs: + target_input = auto_av3_ypbpr ? AV3_YPBPR : AV3_RGsB; + break; + case AV3_RGsB: + case AV3_YPBPR: + target_input = auto_input_keep_current ? AV3_RGBHV : AV1_RGBs; + break; + default: + break; + } + + auto_input_ctr++; + + if (auto_input_current_ctr < AUTO_CURRENT_MAX_COUNT) + auto_input_current_ctr++; + + // For input linked profile loading below + auto_input_changed = 1; + + // reset timer + alt_timestamp_start(); + } + man_input_change = parse_control(); if (menu_active) display_menu(0); + // Only auto load profile when input is manually changed or when sync is active after automatic switch. + if ((target_input != cm.avinput && man_input_change) || (auto_input_changed && cm.sync_active)) { + // The input changed, so load the appropriate profile if + // input->profile link is enabled + if (profile_link && (profile_sel != input_profiles[target_input])) { + profile_sel = input_profiles[target_input]; + read_userdata(profile_sel, 0); + } + + auto_input_changed = 0; + } + if (target_input != cm.avinput) { target_tvp = TVP_INPUT1; @@ -873,13 +930,6 @@ int main() printf("### SWITCH MODE TO %s ###\n", avinput_str[target_input]); - // The input changed, so load the appropriate profile if - // input->profile link is enabled - if (profile_link && (profile_sel != input_profiles[target_input])) { - profile_sel = input_profiles[target_input]; - read_userdata(profile_sel); - } - cm.avinput = target_input; cm.sync_active = 0; ths_source_sel(target_ths, (cm.cc.video_lpf > 1) ? (VIDEO_LPF_MAX-cm.cc.video_lpf) : THS_LPF_BYPASS); @@ -895,9 +945,14 @@ int main() strncpy(row2, " NO SYNC", LCD_ROW_LEN+1); if (!menu_active) lcd_write_status(); - // record last input if it was selected manually - if ((def_input == AV_LAST) && man_input_change) - write_userdata(INIT_CONFIG_SLOT); + if (man_input_change) { + // record last input if it was selected manually + if (def_input == AV_LAST) + write_userdata(INIT_CONFIG_SLOT); + // Reset auto input timer when input is manually changed + auto_input_ctr = 0; + alt_timestamp_start(); + } } // Check here to enable regardless of input @@ -933,6 +988,9 @@ int main() strncpy(row2, " NO SYNC", LCD_ROW_LEN+1); if (!menu_active) lcd_write_status(); + alt_timestamp_start();// reset auto input timer + auto_input_ctr = 0; + auto_input_current_ctr = 0; } break; case MODE_CHANGE: diff --git a/software/sys_controller/ossc/av_controller.h b/software/sys_controller/ossc/av_controller.h index bb02520..d4813a5 100644 --- a/software/sys_controller/ossc/av_controller.h +++ b/software/sys_controller/ossc/av_controller.h @@ -55,12 +55,18 @@ #define FPGA_H_MULTMODE_FULLWIDTH 0 #define FPGA_H_MULTMODE_ASPECTFIX 1 #define FPGA_H_MULTMODE_OPTIMIZED 2 +#define FPGA_H_MULTMODE_OPTIMIZED_1X 3 #define FPGA_SCANLINEMODE_OFF 0 #define FPGA_SCANLINEMODE_H 1 #define FPGA_SCANLINEMODE_V 2 #define FPGA_SCANLINEMODE_ALT 3 +#define AUTO_OFF 0 +#define AUTO_CURRENT_INPUT 1 +#define AUTO_MAX_COUNT 100 +#define AUTO_CURRENT_MAX_COUNT 6 + // In reverse order of importance typedef enum { NO_CHANGE = 0, diff --git a/software/sys_controller/ossc/avconfig.h b/software/sys_controller/ossc/avconfig.h index d5296ef..2fd5afc 100644 --- a/software/sys_controller/ossc/avconfig.h +++ b/software/sys_controller/ossc/avconfig.h @@ -105,11 +105,9 @@ typedef struct { alt_u8 full_tx_setup; alt_u8 vga_ilace_fix; alt_u8 reverse_lpf; -#ifdef ENABLE_AUDIO alt_u8 audio_dw_sampl; alt_u8 audio_swap_lr; alt_u8 audio_gain; -#endif color_setup_t col; avinput_t link_av; } __attribute__((packed)) avconfig_t; diff --git a/software/sys_controller/ossc/controls.c b/software/sys_controller/ossc/controls.c index 35b49df..00e062f 100644 --- a/software/sys_controller/ossc/controls.c +++ b/software/sys_controller/ossc/controls.c @@ -119,6 +119,8 @@ int parse_control() alt_u8* pmcfg_ptr[] = { &pt_only, &tc.pm_240p, &tc.pm_384p, &tc.pm_480i, &tc.pm_480p, &tc.pm_480p, &tc.pm_1080i }; alt_u8 valid_pm[] = { 0x1, 0x1f, 0x3, 0xf, 0x3, 0x3, 0x3 }; + avinput_t next_input = (cm.avinput == AV3_YPBPR) ? AV1_RGBs : (cm.avinput+1); + if (remote_code) printf("RCODE: 0x%.4lx, %d\n", remote_code, remote_rpt); @@ -163,7 +165,7 @@ int parse_control() ((fpga_status >> 16) & 0x3) ? '*' : ' ', fpga_v_hz_x100/100, fpga_v_hz_x100%100);*/ - sniprintf(menu_row2, LCD_ROW_LEN+1, "%4lu%c%c %u", (((fpga_status & 0x7ff)+1)<> 16) & 0x3) ? '*' : ' ', IORD_ALTERA_AVALON_PIO_DATA(PIO_8_BASE)); @@ -239,6 +241,10 @@ int parse_control() lcd_write_status(); menu_active = 0; break; + case RC_RIGHT: + if (!menu_active) + man_target_input = next_input; + break; default: break; } @@ -246,7 +252,7 @@ int parse_control() Button_Check: if (btn_code & PB0_BIT) - man_target_input = (cm.avinput == AV3_YPBPR) ? AV1_RGBs : (cm.avinput+1); + man_target_input = next_input; if (btn_code & PB1_BIT) tc.sl_mode = tc.sl_mode < SL_MODE_MAX ? tc.sl_mode + 1 : 0; diff --git a/software/sys_controller/ossc/firmware.c b/software/sys_controller/ossc/firmware.c index 569522a..950bbb6 100644 --- a/software/sys_controller/ossc/firmware.c +++ b/software/sys_controller/ossc/firmware.c @@ -26,7 +26,7 @@ #include "tvp7002.h" #include "av_controller.h" #include "lcd.h" -#include "ci_crc.h" +#include "utils.h" #include "altera_avalon_pio_regs.h" extern char menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1]; @@ -48,19 +48,19 @@ static int check_fw_header(alt_u8 *databuf, fw_hdr *hdr) hdr->version_suffix[7] = 0; memcpy(&tmp, databuf+14, 4); - hdr->hdr_len = ALT_CI_NIOS_CUSTOM_INSTR_ENDIANCONVERTER_0(tmp); + hdr->hdr_len = bswap32(tmp); memcpy(&tmp, databuf+18, 4); - hdr->data_len = ALT_CI_NIOS_CUSTOM_INSTR_ENDIANCONVERTER_0(tmp); + hdr->data_len = bswap32(tmp); memcpy(&tmp, databuf+22, 4); - hdr->data_crc = ALT_CI_NIOS_CUSTOM_INSTR_ENDIANCONVERTER_0(tmp); + hdr->data_crc = bswap32(tmp); // Always at bytes [508-511] memcpy(&tmp, databuf+508, 4); - hdr->hdr_crc = ALT_CI_NIOS_CUSTOM_INSTR_ENDIANCONVERTER_0(tmp); + hdr->hdr_crc = bswap32(tmp); if (hdr->hdr_len < 26 || hdr->hdr_len > 508) return FW_HDR_ERROR; - crcval = crcCI(databuf, hdr->hdr_len, 1); + crcval = crc32(databuf, hdr->hdr_len, 1); if (crcval != hdr->hdr_crc) return FW_HDR_CRC_ERROR; @@ -81,7 +81,7 @@ static int check_fw_image(alt_u32 offset, alt_u32 size, alt_u32 golden_crc, alt_ if (retval != SD_OK) return retval; - crcval = crcCI(tmpbuf, bytes_to_read, (i==0)); + crcval = crc32(tmpbuf, bytes_to_read, (i==0)); } if (crcval != golden_crc) @@ -90,15 +90,6 @@ static int check_fw_image(alt_u32 offset, alt_u32 size, alt_u32 golden_crc, alt_ return 0; } -#ifdef DEBUG -int fw_update() -{ - sniprintf(menu_row2, LCD_ROW_LEN+1, "Unavailable"); - lcd_write_menu(); - usleep(1000000); - return -1; -} -#else int fw_update() { int retval, i; @@ -163,24 +154,9 @@ update_init: strncpy(menu_row2, "please wait...", LCD_ROW_LEN+1); lcd_write_menu(); - for (i=0; i PAGESIZE) { - retval = write_flash_page(databuf+PAGESIZE, (bytes_to_rw-PAGESIZE), (i/PAGESIZE)+1); - if (retval != 0) - goto failure; - } - } + retval = copy_sd_to_flash(512/SD_BLK_SIZE, 0, fw_header.data_len, databuf); + if (retval != 0) + goto failure; strncpy(menu_row1, "Verifying flash", LCD_ROW_LEN+1); strncpy(menu_row2, "please wait...", LCD_ROW_LEN+1); @@ -249,4 +225,3 @@ failure: return -1; } -#endif diff --git a/software/sys_controller/ossc/firmware.h b/software/sys_controller/ossc/firmware.h index d3307af..a7e2e76 100644 --- a/software/sys_controller/ossc/firmware.h +++ b/software/sys_controller/ossc/firmware.h @@ -24,7 +24,7 @@ #include "sysconfig.h" #define FW_VER_MAJOR 0 -#define FW_VER_MINOR 81 +#define FW_VER_MINOR 82 #ifdef ENABLE_AUDIO #define FW_SUFFIX1 "a" diff --git a/software/sys_controller/ossc/menu.c b/software/sys_controller/ossc/menu.c index a5cc849..4ae250c 100644 --- a/software/sys_controller/ossc/menu.c +++ b/software/sys_controller/ossc/menu.c @@ -42,6 +42,8 @@ extern alt_u16 tc_h_samplerate, tc_h_synclen, tc_h_bporch, tc_h_active, tc_v_syn extern alt_u32 remote_code; extern alt_u16 rc_keymap[REMOTE_MAX_KEYS]; extern alt_u8 vm_sel, profile_sel_menu, lt_sel, def_input, profile_link, lcd_bl_timeout; +extern alt_u8 auto_input, auto_av1_ypbpr, auto_av2_ypbpr, auto_av3_ypbpr; +extern char target_profile_name[PROFILE_NAME_LEN+1]; alt_u8 menu_active; @@ -50,12 +52,13 @@ static const char *video_lpf_desc[] = { LNG("Auto","オート"), LNG("Off","オ static const char *ypbpr_cs_desc[] = { "Rec. 601", "Rec. 709" }; static const char *s480p_mode_desc[] = { LNG("Auto","オート"), "DTV 480p", "VESA 640x480@60" }; static const char *sync_lpf_desc[] = { LNG("2.5MHz (max)","2.5MHz (サイダイ)"), LNG("10MHz (med)","10MHz (チュウイ)"), LNG("33MHz (min)","33MHz (サイショウ)"), LNG("Off","オフ") }; -static const char *l3_mode_desc[] = { LNG("Generic 16:9","ジェネリック 16:9"), LNG("Generic 4:3","ジェネリック 4:3"), LNG("320x240 optim.","320x240 サイテキカ."), LNG("256x240 optim.","256x240 サイテキカ.") }; -static const char *l2l4l5_mode_desc[] = { LNG("Generic 4:3","ジェネリック 4:3"), LNG("320x240 optim.","320x240 サイテキカ."), LNG("256x240 optim.","256x240 サイテキカ.") }; +static const char *l3_mode_desc[] = { LNG("Generic 16:9","ジェネリック 16:9"), LNG("Generic 4:3","ジェネリック 4:3"), LNG("512x240 optim.","512x240 サイテキカ."), LNG("320x240 optim.","320x240 サイテキカ."), LNG("256x240 optim.","256x240 サイテキカ.") }; +static const char *l2l4l5_mode_desc[] = { LNG("Generic 4:3","ジェネリック 4:3"), LNG("512x240 optim.","512x240 サイテキカ."), LNG("320x240 optim.","320x240 サイテキカ."), LNG("256x240 optim.","256x240 サイテキカ.") }; static const char *l5_fmt_desc[] = { "1920x1080", "1600x1200", "1920x1200" }; static const char *pm_240p_desc[] = { LNG("Passthru","パススルー"), "Line2x", "Line3x", "Line4x", "Line5x" }; static const char *pm_480i_desc[] = { LNG("Passthru","パススルー"), "Line2x (bob)", "Line3x (laced)", "Line4x (bob)" }; -static const char *pm_384p_480p_desc[] = { LNG("Passthru","パススルー"), "Line2x" }; +static const char *pm_384p_desc[] = { LNG("Passthru","パススルー"), "Line2x", "Line2x 240x360", "Line3x 240x360" }; +static const char *pm_480p_desc[] = { LNG("Passthru","パススルー"), "Line2x" }; static const char *pm_1080i_desc[] = { LNG("Passthru","パススルー"), "Line2x (bob)" }; static const char *ar_256col_desc[] = { "4:3", "8:7" }; static const char *tx_mode_desc[] = { "HDMI", "DVI" }; @@ -66,6 +69,8 @@ static const char *sl_id_desc[] = { LNG("Top","ウエ"), LNG("Bottom","シタ") static const char *audio_dw_sampl_desc[] = { LNG("Off (fs = 96kHz)","オフ (fs = 96kHz)"), "2x (fs = 48kHz)" }; static const char *lt_desc[] = { "Top-left", "Center", "Bottom-right" }; static const char *lcd_bl_timeout_desc[] = { "Off", "3s", "10s", "30s" }; +static const char *rgsb_ypbpr_desc[] = { "RGsB", "YPbPr" }; +static const char *auto_input_desc[] = { "Off", "Current input", "All inputs" }; static void sampler_phase_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, LNG("%d deg","%d ド"), (v*1125)/100); } static void sync_vth_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%d mV", (v*1127)/100); } @@ -80,10 +85,11 @@ static void lt_disp(alt_u8 v) { strncpy(menu_row2, lt_desc[v], LCD_ROW_LEN+1); } static void aud_db_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%d dB", ((alt_8)v-AUDIO_GAIN_0DB)); } static void vm_display_name (alt_u8 v) { strncpy(menu_row2, video_modes[v].name, LCD_ROW_LEN+1); } static void link_av_desc (avinput_t v) { strncpy(menu_row2, v == AV_LAST ? "No link" : avinput_str[v], LCD_ROW_LEN+1); } +static void profile_disp(alt_u8 v) { read_userdata(v, 1); sniprintf(menu_row2, LCD_ROW_LEN+1, "%u: %s", v, (target_profile_name[0] == 0) ? "" : target_profile_name); } //static void coarse_gain_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u.%u", ((v*10)+50)/100, (((v*10)+50)%100)/10); } static const arg_info_t vm_arg_info = {&vm_sel, VIDEO_MODES_CNT-1, vm_display_name}; -static const arg_info_t profile_arg_info = {&profile_sel_menu, MAX_PROFILE, value_disp}; +static const arg_info_t profile_arg_info = {&profile_sel_menu, MAX_PROFILE, profile_disp}; static const arg_info_t lt_arg_info = {<_sel, (sizeof(lt_desc)/sizeof(char*))-1, lt_disp}; @@ -129,9 +135,9 @@ MENU(menu_sync, P99_PROTECT({ \ MENU(menu_output, P99_PROTECT({ \ { LNG("240p/288p proc","240p/288pショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_240p, OPT_WRAP, SETTING_ITEM(pm_240p_desc) } } }, - { LNG("384p proc","384pショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_384p, OPT_WRAP, SETTING_ITEM(pm_384p_480p_desc) } } }, + { LNG("384p proc","384pショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_384p, OPT_WRAP, SETTING_ITEM(pm_384p_desc) } } }, { LNG("480i/576i proc","480i/576iショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_480i, OPT_WRAP, SETTING_ITEM(pm_480i_desc) } } }, - { LNG("480p/576p proc","480p/576pショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_480p, OPT_WRAP, SETTING_ITEM(pm_384p_480p_desc) } } }, + { LNG("480p/576p proc","480p/576pショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_480p, OPT_WRAP, SETTING_ITEM(pm_480p_desc) } } }, { LNG("960i/1080i proc","960i/1080iショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_1080i, OPT_WRAP, SETTING_ITEM(pm_1080i_desc) } } }, { LNG("Line2x mode","Line2xモード"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.l2_mode, OPT_WRAP, SETTING_ITEM(l2l4l5_mode_desc) } } }, { LNG("Line3x mode","Line3xモード"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.l3_mode, OPT_WRAP, SETTING_ITEM(l3_mode_desc) } } }, @@ -180,8 +186,15 @@ MENU(menu_settings, P99_PROTECT({ \ { LNG("Link prof->input","Link prof->input"), OPT_AVCONFIG_NUMVALUE, { .num = { &tc.link_av, OPT_WRAP, AV1_RGBs, AV_LAST, link_av_desc } } }, { LNG("Link input->prof","Link input->prof"), OPT_AVCONFIG_SELECTION, { .sel = { &profile_link, OPT_WRAP, SETTING_ITEM(off_on_desc) } } }, { LNG("Initial input","ショキニュウリョク"), OPT_AVCONFIG_SELECTION, { .sel = { &def_input, OPT_WRAP, SETTING_ITEM(avinput_str) } } }, + { "Autodetect input", OPT_AVCONFIG_SELECTION, { .sel = { &auto_input, OPT_WRAP, SETTING_ITEM(auto_input_desc) } } }, + { "Auto AV1 Y/Gs", OPT_AVCONFIG_SELECTION, { .sel = { &auto_av1_ypbpr, OPT_WRAP, SETTING_ITEM(rgsb_ypbpr_desc) } } }, + { "Auto AV2 Y/Gs", OPT_AVCONFIG_SELECTION, { .sel = { &auto_av2_ypbpr, OPT_WRAP, SETTING_ITEM(rgsb_ypbpr_desc) } } }, + { "Auto AV3 Y/Gs", OPT_AVCONFIG_SELECTION, { .sel = { &auto_av3_ypbpr, OPT_WRAP, SETTING_ITEM(rgsb_ypbpr_desc) } } }, { "LCD BL timeout", OPT_AVCONFIG_SELECTION, { .sel = { &lcd_bl_timeout, OPT_WRAP, SETTING_ITEM(lcd_bl_timeout_desc) } } }, +#ifndef DEBUG + { "", OPT_FUNC_CALL, { .fun = { import_userdata, NULL } } }, { LNG("","<ファームウェアアップデート>"), OPT_FUNC_CALL, { .fun = { fw_update, NULL } } }, +#endif })) diff --git a/software/sys_controller/ossc/sysconfig.h b/software/sys_controller/ossc/sysconfig.h index 9195574..bf68b60 100644 --- a/software/sys_controller/ossc/sysconfig.h +++ b/software/sys_controller/ossc/sysconfig.h @@ -30,10 +30,12 @@ #define printf(...) #else #include +#include "utils.h" #define OS_PRINTF printf #define ErrorF printf // use reduced printf //#define printf alt_printf +#define printf dd_printf #endif #define WAITLOOP_SLEEP_US 10000 diff --git a/software/sys_controller/ossc/userdata.c b/software/sys_controller/ossc/userdata.c index 3059584..929a8e3 100644 --- a/software/sys_controller/ossc/userdata.c +++ b/software/sys_controller/ossc/userdata.c @@ -18,11 +18,15 @@ // #include +#include #include "userdata.h" #include "flash.h" +#include "sdcard.h" #include "firmware.h" +#include "lcd.h" #include "controls.h" #include "av_controller.h" +#include "altera_avalon_pio_regs.h" extern alt_u16 rc_keymap[REMOTE_MAX_KEYS]; extern avmode_t cm; @@ -34,6 +38,11 @@ extern alt_u8 input_profiles[AV_LAST]; extern alt_u8 profile_sel; extern alt_u8 def_input, profile_link; extern alt_u8 lcd_bl_timeout; +extern alt_u8 auto_input, auto_av1_ypbpr, auto_av2_ypbpr, auto_av3_ypbpr; +extern SD_DEV sdcard_dev; +extern char menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1]; + +char target_profile_name[PROFILE_NAME_LEN+1]; int write_userdata(alt_u8 entry) { @@ -62,6 +71,10 @@ int write_userdata(alt_u8 entry) ((ude_initcfg*)databuf)->def_input = def_input; ((ude_initcfg*)databuf)->profile_link = profile_link; ((ude_initcfg*)databuf)->lcd_bl_timeout = lcd_bl_timeout; + ((ude_initcfg*)databuf)->auto_input = auto_input; + ((ude_initcfg*)databuf)->auto_av1_ypbpr = auto_av1_ypbpr; + ((ude_initcfg*)databuf)->auto_av2_ypbpr = auto_av2_ypbpr; + ((ude_initcfg*)databuf)->auto_av3_ypbpr = auto_av3_ypbpr; memcpy(((ude_initcfg*)databuf)->keys, rc_keymap, sizeof(rc_keymap)); retval = write_flash_page(databuf, sizeof(ude_initcfg), (USERDATA_OFFSET+entry*SECTORSIZE)/PAGESIZE); if (retval != 0) @@ -74,6 +87,11 @@ int write_userdata(alt_u8 entry) ((ude_profile*)databuf)->avc_data_len = sizeof(avconfig_t); ((ude_profile*)databuf)->vm_data_len = vm_to_write; + if (target_profile_name[0] == 0) + sniprintf(target_profile_name, PROFILE_NAME_LEN+1, ""); + + strncpy(((ude_profile*)databuf)->name, target_profile_name, PROFILE_NAME_LEN+1); + pageoffset = offsetof(ude_profile, avc); // assume that sizeof(avconfig_t) << PAGESIZE @@ -87,15 +105,8 @@ int write_userdata(alt_u8 entry) write_flash_page(databuf, PAGESIZE, ((USERDATA_OFFSET+entry*SECTORSIZE)/PAGESIZE)); // then write the rest - pageno = 1; - while (vm_to_write > 0) { - bytes_to_w = (vm_to_write > PAGESIZE) ? PAGESIZE : vm_to_write; - memcpy(databuf, (char*)video_modes+srcoffset, bytes_to_w); - write_flash_page(databuf, bytes_to_w, ((USERDATA_OFFSET+entry*SECTORSIZE)/PAGESIZE) + pageno); - srcoffset += bytes_to_w; - vm_to_write -= bytes_to_w; - ++pageno; - } + if (vm_to_write > 0) + write_flash((alt_u8*)video_modes+srcoffset, vm_to_write, ((USERDATA_OFFSET+entry*SECTORSIZE)/PAGESIZE) + 1); printf("Profile %u data written (%u bytes)\n", entry, sizeof(avconfig_t)+VIDEO_MODES_SIZE); break; @@ -106,7 +117,7 @@ int write_userdata(alt_u8 entry) return 0; } -int read_userdata(alt_u8 entry) +int read_userdata(alt_u8 entry, int dry_run) { int retval, i; alt_u8 databuf[PAGESIZE]; @@ -114,6 +125,8 @@ int read_userdata(alt_u8 entry) alt_u16 pageoffset, dstoffset; alt_u8 pageno; + target_profile_name[0] = 0; + if (entry > MAX_USERDATA_ENTRY) { printf("invalid entry\n"); return -1; @@ -138,6 +151,9 @@ int read_userdata(alt_u8 entry) switch (((ude_hdr*)databuf)->type) { case UDE_INITCFG: if (((ude_initcfg*)databuf)->data_len == sizeof(ude_initcfg) - offsetof(ude_initcfg, last_profile)) { + if (dry_run) + return 0; + for (i = 0; i < sizeof(input_profiles)/sizeof(*input_profiles); ++i) if (((ude_initcfg*)databuf)->last_profile[i] <= MAX_PROFILE) input_profiles[i] = ((ude_initcfg*)databuf)->last_profile[i]; @@ -146,6 +162,10 @@ int read_userdata(alt_u8 entry) target_input = def_input; else if (((ude_initcfg*)databuf)->last_input < AV_LAST) target_input = ((ude_initcfg*)databuf)->last_input; + auto_input = ((ude_initcfg*)databuf)->auto_input; + auto_av1_ypbpr = ((ude_initcfg*)databuf)->auto_av1_ypbpr; + auto_av2_ypbpr = ((ude_initcfg*)databuf)->auto_av2_ypbpr; + auto_av3_ypbpr = ((ude_initcfg*)databuf)->auto_av3_ypbpr; profile_link = ((ude_initcfg*)databuf)->profile_link; profile_sel = input_profiles[AV_TESTPAT]; // Global profile lcd_bl_timeout = ((ude_initcfg*)databuf)->lcd_bl_timeout; @@ -155,6 +175,10 @@ int read_userdata(alt_u8 entry) break; case UDE_PROFILE: if ((((ude_profile*)databuf)->avc_data_len == sizeof(avconfig_t)) && (((ude_profile*)databuf)->vm_data_len == VIDEO_MODES_SIZE)) { + strncpy(target_profile_name, ((ude_profile*)databuf)->name, PROFILE_NAME_LEN+1); + if (dry_run) + return 0; + vm_to_read = ((ude_profile*)databuf)->vm_data_len; pageno = 0; @@ -192,3 +216,92 @@ int read_userdata(alt_u8 entry) return 0; } + +int import_userdata() +{ + int retval; + int n, entries_imported=0; + char *errmsg; + alt_u8 databuf[SD_BLK_SIZE]; + ude_hdr header; + alt_u32 btn_vec; + + retval = check_sdcard(databuf); + SPI_CS_High(); + if (retval != 0) + goto failure; + + strncpy(menu_row1, "Import? 1=Y, 2=N", LCD_ROW_LEN+1); + *menu_row2 = '\0'; + lcd_write_menu(); + + while (1) { + btn_vec = IORD_ALTERA_AVALON_PIO_DATA(PIO_1_BASE) & RC_MASK; + + if (btn_vec == rc_keymap[RC_BTN1]) { + break; + } else if (btn_vec == rc_keymap[RC_BTN2]) { + retval = UDATA_IMPT_CANCELLED; + goto failure; + } + + usleep(WAITLOOP_SLEEP_US); + } + + strncpy(menu_row1, "Loading settings", LCD_ROW_LEN+1); + strncpy(menu_row2, "please wait...", LCD_ROW_LEN+1); + lcd_write_menu(); + + // Import the userdata + for (n=0; n<=MAX_USERDATA_ENTRY; ++n) { + retval = SD_Read(&sdcard_dev, &header, (512+n*SECTORSIZE)/SD_BLK_SIZE, 0, sizeof(header)); + if (retval != 0) { + printf("Failed to read SD card\n"); + retval = -retval; + goto failure; + } + + if (strncmp(header.userdata_key, "USRDATA", 8)) { + printf("Not an userdata entry at 0x%x\n", 512+n*SECTORSIZE); + continue; + } + + if ((header.version_major != FW_VER_MAJOR) || (header.version_minor != FW_VER_MINOR)) { + printf("Data version %u.%u does not match fw\n", header.version_major, header.version_minor); + continue; + } + + if (header.type > UDE_PROFILE) { + printf("Unknown userdata entry type %u\n", header.type); + continue; + } + + // Just blindly write the entry to flash + retval = copy_sd_to_flash((512+n*SECTORSIZE)/SD_BLK_SIZE, (n*PAGES_PER_SECTOR)+(USERDATA_OFFSET/PAGESIZE), + (header.type == UDE_PROFILE) ? sizeof(ude_profile) : sizeof(ude_initcfg), databuf); + if (retval != 0) { + printf("Copy from SD to flash failed (error %d)\n", retval); + goto failure; + } + + entries_imported++; + } + + SPI_CS_High(); + + read_userdata(INIT_CONFIG_SLOT, 0); + profile_sel = input_profiles[target_input]; + read_userdata(profile_sel, 0); + + sniprintf(menu_row1, LCD_ROW_LEN+1, "%d entries", entries_imported); + strncpy(menu_row2, "imported", LCD_ROW_LEN+1); + lcd_write_menu(); + usleep(1000000); + + return 0; + +failure: + SPI_CS_High(); + + return -1; +} diff --git a/software/sys_controller/ossc/userdata.h b/software/sys_controller/ossc/userdata.h index 93b539e..ede1a44 100644 --- a/software/sys_controller/ossc/userdata.h +++ b/software/sys_controller/ossc/userdata.h @@ -28,9 +28,13 @@ #include "video_modes.h" #include "flash.h" -#define MAX_PROFILE 9 +#define PROFILE_NAME_LEN 12 + +#define MAX_PROFILE (MAX_USERDATA_ENTRY-1) #define INIT_CONFIG_SLOT MAX_USERDATA_ENTRY +#define UDATA_IMPT_CANCELLED 104 + typedef enum { UDE_INITCFG = 0, UDE_PROFILE, @@ -51,11 +55,16 @@ typedef struct { avinput_t last_input; avinput_t def_input; alt_u8 lcd_bl_timeout; + alt_u8 auto_input; + alt_u8 auto_av1_ypbpr; + alt_u8 auto_av2_ypbpr; + alt_u8 auto_av3_ypbpr; alt_u16 keys[REMOTE_MAX_KEYS]; } __attribute__((packed, __may_alias__)) ude_initcfg; typedef struct { ude_hdr hdr; + char name[PROFILE_NAME_LEN+1]; alt_u16 avc_data_len; alt_u16 vm_data_len; avconfig_t avc; @@ -63,6 +72,7 @@ typedef struct { } __attribute__((packed, __may_alias__)) ude_profile; int write_userdata(alt_u8 entry); -int read_userdata(alt_u8 entry); +int read_userdata(alt_u8 entry, int dry_run); +int import_userdata(); #endif diff --git a/software/sys_controller/ossc/utils.c b/software/sys_controller/ossc/utils.c new file mode 100644 index 0000000..dda9eef --- /dev/null +++ b/software/sys_controller/ossc/utils.c @@ -0,0 +1,93 @@ +// +// Copyright (C) 2018 Markus Hiienkari +// +// This file is part of Open Source Scan Converter 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 3 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, see . +// + +#include +#include +#include "sys/alt_stdio.h" +#include "utils.h" +#include "system.h" +#include "sysconfig.h" +#include "io.h" + +alt_u32 bswap32(alt_u32 w) +{ + return (((w << 24) & 0xff000000) | + ((w << 8) & 0x00ff0000) | + ((w >> 8) & 0x0000ff00) | + ((w >> 24) & 0x000000ff)); +} + +unsigned long crc32(unsigned char *input_data, unsigned long input_data_length, int do_initialize) +{ + unsigned long index; + + /* copy of the data buffer pointer so that it can advance by different widths */ + void * input_data_copy = (void *)input_data; + + /* The custom instruction CRC will initialize to the inital remainder value */ + if (do_initialize) + IOWR_32DIRECT(HW_CRC32_0_BASE, 0x0, 0x0); + + /* Write 32 bit data to the custom instruction. If the buffer does not end + * on a 32 bit boundary then the remaining data will be sent to the custom + * instruction in the 'if' statement below. + */ + for(index = 0; index < (input_data_length & 0xFFFFFFFC); index+=4) + { + IOWR_32DIRECT(HW_CRC32_0_BASE, 0x4, *(unsigned long *)input_data_copy); + input_data_copy += 4; /* void pointer, must move by 4 for each word */ + } + + /* Write the remainder of the buffer if it does not end on a word boundary */ + if((input_data_length & 0x3) == 0x3) /* 3 bytes left */ + { + IOWR_16DIRECT(HW_CRC32_0_BASE, 0x4, *(unsigned short *)input_data_copy); + input_data_copy += 2; + IOWR_8DIRECT(HW_CRC32_0_BASE, 0x4, *(unsigned char *)input_data_copy); + } + else if((input_data_length & 0x3) == 0x2) /* 2 bytes left */ + { + IOWR_16DIRECT(HW_CRC32_0_BASE, 0x4, *(unsigned short *)input_data_copy); + } + else if((input_data_length & 0x3) == 0x1) /* 1 byte left */ + { + IOWR_8DIRECT(HW_CRC32_0_BASE, 0x4, *(unsigned char *)input_data_copy); + } + + /* There are 4 registers in the CRC custom instruction. Since + * this example uses CRC-32 only the first register must be read + * in order to receive the full result. + */ + return IORD_32DIRECT(HW_CRC32_0_BASE, 0x10); +} + +/* printf for direct driver interface */ +int dd_printf(const char *__restrict fmt, ...) { + int ret; + va_list ap; + char buf[PRINTF_BUFSIZE]; + + va_start(ap, fmt); + ret = vsnprintf(buf, PRINTF_BUFSIZE, fmt, ap); + va_end(ap); + if (ret > 0) + alt_putstr(buf); + + return 0; +} diff --git a/software/sys_controller/ossc/utils.h b/software/sys_controller/ossc/utils.h new file mode 100644 index 0000000..cb45f0b --- /dev/null +++ b/software/sys_controller/ossc/utils.h @@ -0,0 +1,35 @@ +// +// Copyright (C) 2018 Markus Hiienkari +// +// This file is part of Open Source Scan Converter 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 3 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, see . +// + +#ifndef UTILS_H_ +#define UTILS_H_ + +#include + +#define PRINTF_BUFSIZE 512 + +unsigned char bitswap8(unsigned char v); + +alt_u32 bswap32(alt_u32 w); + +unsigned long crc32(unsigned char *input_data, unsigned long input_data_length, int do_initialize); + +int dd_printf(const char *__restrict fmt, ...); + +#endif diff --git a/software/sys_controller/pulpino.h b/software/sys_controller/pulpino.h new file mode 100644 index 0000000..7ca19ef --- /dev/null +++ b/software/sys_controller/pulpino.h @@ -0,0 +1,91 @@ +// Copyright 2017 ETH Zurich and University of Bologna. +// Copyright and related rights are licensed under the Solderpad Hardware +// License, Version 0.51 (the “License”); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law +// or agreed to in writing, software, hardware and materials distributed under +// this License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +/** + * @file + * @brief Register mapping for PULPino peripherals. + * + * Contains event register mappings for the PULPino SOC as + * well as some general definitions for the overall system. + * + * @author Florian Zaruba + * + * @version 1.0 + * + * @date 2/10/2015 + * + */ +#ifndef PULPINO_H +#define PULPINO_H + +#define PULPINO_BASE_ADDR 0x10000000 + +/** SOC PERIPHERALS */ +#define SOC_PERIPHERALS_BASE_ADDR ( PULPINO_BASE_ADDR + 0xA100000 ) + +#define UART_BASE_ADDR ( SOC_PERIPHERALS_BASE_ADDR + 0x0000 ) +#define GPIO_BASE_ADDR ( SOC_PERIPHERALS_BASE_ADDR + 0x1000 ) +#define SPI_BASE_ADDR ( SOC_PERIPHERALS_BASE_ADDR + 0x2000 ) +#define TIMER_BASE_ADDR ( SOC_PERIPHERALS_BASE_ADDR + 0x3000 ) +#define EVENT_UNIT_BASE_ADDR ( SOC_PERIPHERALS_BASE_ADDR + 0x4000 ) +#define I2C_BASE_ADDR ( SOC_PERIPHERALS_BASE_ADDR + 0x5000 ) +#define FLL_BASE_ADDR ( SOC_PERIPHERALS_BASE_ADDR + 0x6000 ) +#define SOC_CTRL_BASE_ADDR ( SOC_PERIPHERALS_BASE_ADDR + 0x7000 ) + +/** STDOUT */ +#define STDOUT_BASE_ADDR ( SOC_PERIPHERALS_BASE_ADDR + 0x10000 ) +#define FPUTCHAR_BASE_ADDR ( STDOUT_BASE_ADDR + 0x1000 ) +#define FILE_CMD_BASE_ADDR ( STDOUT_BASE_ADDR + 0x2000 ) +#define STREAM_BASE_ADDR ( STDOUT_BASE_ADDR + 0x3000 ) + +/** Instruction RAM */ +#define INSTR_RAM_BASE_ADDR ( 0x00 ) +#define INSTR_RAM_START_ADDR ( 0x80 ) + +/** ROM */ +#define ROM_BASE_ADDR ( 0x10000 ) + +/** Data RAM */ +#define DATA_RAM_BASE_ADDR ( 0x00100000 ) + +/** Registers and pointers */ +#define REGP(x) ((volatile unsigned int*)(x)) +#define REG(x) (*((volatile unsigned int*)(x))) +#define REGP_8(x) (((volatile uint8_t*)(x))) + +/* pointer to mem of apb pulpino unit - PointerSocCtrl */ +#define __PSC__(a) *(unsigned volatile int*) (SOC_CTRL_BASE_ADDR + a) + +/** Peripheral Clock gating */ +#define CGREG __PSC__(0x04) + +/** Clock gate SPI */ +#define CGSPI 0x00 +/** Clock gate UART */ +#define CGUART 0x01 +/** Clock gate GPIO */ +#define CGGPIO 0x02 +/** Clock gate SPI Master */ +#define CGGSPIM 0x03 +/** Clock gate Timer */ +#define CGTIM 0x04 +/** Clock gate Event Unit */ +#define CGEVENT 0x05 +/** Clock gate I2C */ +#define CGGI2C 0x06 +/** Clock gate FLL */ +#define CGFLL 0x07 + +/** Boot address register */ +#define BOOTREG __PSC__(0x08) + +#define RES_STATUS __PSC__(0x14) + +#endif diff --git a/software/sys_controller/tvp7002/video_modes.c b/software/sys_controller/tvp7002/video_modes.c index 120c670..ed3d999 100644 --- a/software/sys_controller/tvp7002/video_modes.c +++ b/software/sys_controller/tvp7002/video_modes.c @@ -49,7 +49,11 @@ alt_8 get_mode_id(alt_u32 totlines, alt_u8 progressive, alt_u32 hz, video_type t switch (video_modes[i].group) { case GROUP_NONE: case GROUP_240P: + break; case GROUP_384P: + //fixed Line2x/3x mode for 240x360p + valid_lm[2] = MODE_L2_240x360; + valid_lm[3] = MODE_L3_240x360; break; case GROUP_480I: //fixed Line3x/4x mode for 480i @@ -107,7 +111,7 @@ alt_8 get_mode_id(alt_u32 totlines, alt_u8 progressive, alt_u32 hz, video_type t cm.fpga_vmultmode = FPGA_V_MULTMODE_2X; // Use native 2x sampling with low-res modes when possible to minimize jitter and generate min. 25MHz input pclk for FPGA PLL if ((!cm.cc.vga_ilace_fix) && (video_modes[i].h_total < 1400) && ((video_modes[i].group == GROUP_240P) || (video_modes[i].group == GROUP_384P) || (video_modes[i].group == GROUP_480I))) { - cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; + cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED_1X; cm.sample_mult = 2; } else { cm.fpga_hmultmode = FPGA_H_MULTMODE_FULLWIDTH; @@ -122,16 +126,26 @@ alt_8 get_mode_id(alt_u32 totlines, alt_u8 progressive, alt_u32 hz, video_type t } } break; - case MODE_L2_256_COL: + case MODE_L2_512_COL: cm.fpga_vmultmode = FPGA_V_MULTMODE_2X; cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; + cm.sample_mult = 2; + break; + case MODE_L2_256_COL: + cm.fpga_vmultmode = FPGA_V_MULTMODE_2X; + cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED_1X; cm.sample_mult = 6; break; case MODE_L2_320_COL: cm.fpga_vmultmode = FPGA_V_MULTMODE_2X; - cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; + cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED_1X; cm.sample_mult = 4; break; + case MODE_L2_240x360: + cm.fpga_vmultmode = FPGA_V_MULTMODE_2X; + cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; + cm.sample_mult = 5; + break; case MODE_L3_GEN_16_9: cm.fpga_vmultmode = FPGA_V_MULTMODE_3X; cm.fpga_hmultmode = FPGA_H_MULTMODE_FULLWIDTH; @@ -147,6 +161,11 @@ alt_8 get_mode_id(alt_u32 totlines, alt_u8 progressive, alt_u32 hz, video_type t cm.fpga_vmultmode = FPGA_V_MULTMODE_3X; cm.fpga_hmultmode = FPGA_H_MULTMODE_ASPECTFIX; break; + case MODE_L3_512_COL: + cm.fpga_vmultmode = FPGA_V_MULTMODE_3X; + cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; + cm.sample_mult = 2; + break; case MODE_L3_320_COL: cm.fpga_vmultmode = FPGA_V_MULTMODE_3X; cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; @@ -157,6 +176,12 @@ alt_8 get_mode_id(alt_u32 totlines, alt_u8 progressive, alt_u32 hz, video_type t cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; cm.sample_mult = 5; break; + case MODE_L3_240x360: + cm.fpga_vmultmode = FPGA_V_MULTMODE_3X; + cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; + cm.sample_mult = 7; + cm.hsync_cut = 13; + break; case MODE_L4_GEN_4_3: cm.fpga_vmultmode = FPGA_V_MULTMODE_4X; cm.fpga_hmultmode = FPGA_H_MULTMODE_FULLWIDTH; @@ -168,6 +193,11 @@ alt_8 get_mode_id(alt_u32 totlines, alt_u8 progressive, alt_u32 hz, video_type t cm.tx_pixelrep = TX_PIXELREP_2X; } break; + case MODE_L4_512_COL: + cm.fpga_vmultmode = FPGA_V_MULTMODE_4X; + cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; + cm.sample_mult = 2; + break; case MODE_L4_320_COL: cm.fpga_vmultmode = FPGA_V_MULTMODE_4X; cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; @@ -183,6 +213,12 @@ alt_8 get_mode_id(alt_u32 totlines, alt_u8 progressive, alt_u32 hz, video_type t cm.fpga_hmultmode = FPGA_H_MULTMODE_FULLWIDTH; cm.hsync_cut = 120; break; + case MODE_L5_512_COL: + cm.fpga_vmultmode = FPGA_V_MULTMODE_5X; + cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; + cm.sample_mult = 3; + cm.hsync_cut = 40; + break; case MODE_L5_320_COL: cm.fpga_vmultmode = FPGA_V_MULTMODE_5X; cm.fpga_hmultmode = FPGA_H_MULTMODE_OPTIMIZED; diff --git a/software/sys_controller/tvp7002/video_modes.h b/software/sys_controller/tvp7002/video_modes.h index 3fd4102..487bb11 100644 --- a/software/sys_controller/tvp7002/video_modes.h +++ b/software/sys_controller/tvp7002/video_modes.h @@ -1,5 +1,5 @@ // -// Copyright (C) 2015-2017 Markus Hiienkari +// Copyright (C) 2015-2018 Markus Hiienkari // // This file is part of Open Source Scan Converter project. // @@ -24,7 +24,7 @@ #include "sysconfig.h" #define H_TOTAL_MIN 300 -#define H_TOTAL_MAX 2300 +#define H_TOTAL_MAX 2800 #define H_SYNCLEN_MIN 10 #define H_SYNCLEN_MAX 255 #define H_BPORCH_MIN 1 @@ -35,7 +35,7 @@ #define V_SYNCLEN_MAX 7 #define V_BPORCH_MIN 1 #define V_BPORCH_MAX 63 -#define V_ACTIVE_MIN 200 +#define V_ACTIVE_MIN 160 #define V_ACTIVE_MAX 1200 typedef enum { @@ -68,18 +68,24 @@ typedef enum { //at least one of the flags below must be set for each mode MODE_PT = (1<<2), MODE_L2 = (1<<3), - MODE_L2_320_COL = (1<<4), - MODE_L2_256_COL = (1<<5), - MODE_L3_GEN_16_9 = (1<<6), - MODE_L3_GEN_4_3 = (1<<7), - MODE_L3_320_COL = (1<<8), - MODE_L3_256_COL = (1<<9), - MODE_L4_GEN_4_3 = (1<<10), - MODE_L4_320_COL = (1<<11), - MODE_L4_256_COL = (1<<12), - MODE_L5_GEN_4_3 = (1<<13), - MODE_L5_320_COL = (1<<14), - MODE_L5_256_COL = (1<<15), + MODE_L2_512_COL = (1<<4), + MODE_L2_320_COL = (1<<5), + MODE_L2_256_COL = (1<<6), + MODE_L2_240x360 = (1<<7), + MODE_L3_GEN_16_9 = (1<<8), + MODE_L3_GEN_4_3 = (1<<9), + MODE_L3_512_COL = (1<<10), + MODE_L3_320_COL = (1<<11), + MODE_L3_256_COL = (1<<12), + MODE_L3_240x360 = (1<<13), + MODE_L4_GEN_4_3 = (1<<14), + MODE_L4_512_COL = (1<<15), + MODE_L4_320_COL = (1<<16), + MODE_L4_256_COL = (1<<17), + MODE_L5_GEN_4_3 = (1<<18), + MODE_L5_512_COL = (1<<19), + MODE_L5_320_COL = (1<<20), + MODE_L5_256_COL = (1<<21), } mode_flags; typedef struct { @@ -100,19 +106,24 @@ typedef struct { #define VIDEO_MODES_DEF { \ /* 240p modes */ \ - { "1536x240", 1536, 240, 2046, 262, 234, 15, 150, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L5_GEN_4_3 | MODE_PLLDIVBY2) }, \ + { "1600x240", 1600, 240, 2046, 262, 202, 15, 150, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L5_GEN_4_3 | MODE_PLLDIVBY2) }, \ { "1280x240", 1280, 240, 1560, 262, 170, 15, 72, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2) }, \ { "960x240", 960, 240, 1170, 262, 128, 15, 54, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_4_3 | MODE_PLLDIVBY2) }, \ + { "512x240", 512, 240, 682, 262, 77, 14, 50, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_512_COL | MODE_L3_512_COL | MODE_L4_512_COL | MODE_L5_512_COL) }, \ { "320x240", 320, 240, 426, 262, 49, 14, 31, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_320_COL | MODE_L3_320_COL | MODE_L4_320_COL | MODE_L5_320_COL) }, \ { "256x240", 256, 240, 341, 262, 39, 14, 25, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_256_COL | MODE_L3_256_COL | MODE_L4_256_COL | MODE_L5_256_COL) }, \ { "240p", 720, 240, 858, 262, 57, 15, 62, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \ /* 288p modes */ \ - { "1536x240L", 1536, 240, 2046, 312, 234, 41, 150, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L5_GEN_4_3 | MODE_PLLDIVBY2) }, \ + { "1600x240L", 1600, 240, 2046, 312, 202, 41, 150, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L5_GEN_4_3 | MODE_PLLDIVBY2) }, \ { "1280x288", 1280, 288, 1560, 312, 170, 15, 72, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2) }, \ { "960x288", 960, 288, 1170, 312, 128, 15, 54, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_4_3 | MODE_PLLDIVBY2) }, \ + { "512x240LB", 512, 240, 682, 312, 77, 41, 50, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_512_COL | MODE_L3_512_COL | MODE_L4_512_COL | MODE_L5_512_COL) }, \ { "320x240LB", 320, 240, 426, 312, 49, 41, 31, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_320_COL | MODE_L3_320_COL | MODE_L4_320_COL | MODE_L5_320_COL) }, \ { "256x240LB", 256, 240, 341, 312, 39, 41, 25, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_256_COL | MODE_L3_256_COL | MODE_L4_256_COL | MODE_L5_256_COL) }, \ { "288p", 720, 288, 864, 312, 69, 19, 63, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \ + /* 360p: GBI */ \ + { "480x360", 480, 360, 600, 375, 63, 10, 38, 3, (VIDEO_EDTV), GROUP_384P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \ + { "240x360", 256, 360, 300, 375, 24, 10, 18, 3, (VIDEO_EDTV), GROUP_384P, (MODE_L2_240x360 | MODE_L3_240x360) }, \ /* 384p: Sega Model 2 */ \ { "384p", 496, 384, 640, 423, 50, 29, 62, 3, (VIDEO_EDTV), GROUP_384P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \ /* 640x400, VGA Mode 13h */ \ diff --git a/software/sys_controller_bsp/HAL/inc/io.h b/software/sys_controller_bsp/HAL/inc/io.h index 912b286..8053c41 100644 --- a/software/sys_controller_bsp/HAL/inc/io.h +++ b/software/sys_controller_bsp/HAL/inc/io.h @@ -51,18 +51,18 @@ extern "C" ((void *)(((alt_u8*)BASE) + (OFFSET))) #define IORD_32DIRECT(BASE, OFFSET) \ - __builtin_ldwio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET))) + (*(volatile alt_u32*)(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))) #define IORD_16DIRECT(BASE, OFFSET) \ - __builtin_ldhuio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET))) + (*(volatile alt_u16*)(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))) #define IORD_8DIRECT(BASE, OFFSET) \ - __builtin_ldbuio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET))) + (*(volatile alt_u8*)(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))) #define IOWR_32DIRECT(BASE, OFFSET, DATA) \ - __builtin_stwio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA)) + (*(volatile alt_u32*)(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET))) = (DATA)) #define IOWR_16DIRECT(BASE, OFFSET, DATA) \ - __builtin_sthio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA)) + (*(volatile alt_u16*)(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET))) = (DATA)) #define IOWR_8DIRECT(BASE, OFFSET, DATA) \ - __builtin_stbio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA)) + (*(volatile alt_u8*)(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET))) = (DATA)) /* Native bus access functions */ @@ -70,9 +70,9 @@ extern "C" ((void *)(((alt_u8*)BASE) + ((REGNUM) * (SYSTEM_BUS_WIDTH/8)))) #define IORD(BASE, REGNUM) \ - __builtin_ldwio (__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM))) + (*(volatile alt_u32*)(__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM)))) #define IOWR(BASE, REGNUM, DATA) \ - __builtin_stwio (__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM)), (DATA)) + (*(volatile alt_u32*)(__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM))) = (DATA)) #ifdef __cplusplus } diff --git a/software/sys_controller_bsp/HAL/src/alt_busy_sleep.c b/software/sys_controller_bsp/HAL/src/alt_busy_sleep.c index 561c0be..4efd28e 100644 --- a/software/sys_controller_bsp/HAL/src/alt_busy_sleep.c +++ b/software/sys_controller_bsp/HAL/src/alt_busy_sleep.c @@ -57,77 +57,13 @@ unsigned int alt_busy_sleep (unsigned int us) * skipped to speed up simulation. */ #ifndef ALT_SIM_OPTIMIZE - int i; - int big_loops; - alt_u32 cycles_per_loop; - - if (!strcmp(NIOS2_CPU_IMPLEMENTATION,"tiny")) - { - cycles_per_loop = 9; - } - else - { - cycles_per_loop = 3; - } - + unsigned long i, loops; - big_loops = us / (INT_MAX/ - (ALT_CPU_FREQ/(cycles_per_loop * 1000000))); + // 1 loop >= 7 cyc + loops = ((ALT_CPU_FREQ/1000000)*us)/7; - if (big_loops) - { - for(i=0;i= ALT_PUTBUF_SIZE) + alt_putbufflush(); + return c; +} + +/* + * ALT putbufflush + * used only for smehosting + * Not thread safe! + * Dumps all the chars in the buffer to STDOUT + */ +int +alt_putbufflush() +{ + int results; + results = write(STDOUT_FILENO,buf,fill_index); + fill_index = 0; + return results; +} +#endif diff --git a/software/sys_controller_bsp/Makefile b/software/sys_controller_bsp/Makefile index aa3ece7..e13195f 100644 --- a/software/sys_controller_bsp/Makefile +++ b/software/sys_controller_bsp/Makefile @@ -112,10 +112,10 @@ SOPC_FILE := ../../sys.sopcinfo #------------------------------------------------------------------------------- # Archiver command. Creates library files. -AR = nios2-elf-ar +AR = riscv32-unknown-elf-ar # Assembler command. Note that CC is used for .S files. -AS = nios2-elf-gcc +AS = riscv32-unknown-elf-gcc # Custom flags only passed to the archiver. This content of this variable is # directly passed to the archiver rather than the more standard "ARFLAGS". The @@ -139,10 +139,10 @@ BSP_CFLAGS_OPTIMIZATION = -Os BSP_CFLAGS_WARNINGS = -Wall # C compiler command. -CC = nios2-elf-gcc -xc +CC = riscv32-unknown-elf-gcc -xc # C++ compiler command. -CXX = nios2-elf-gcc -xc++ +CXX = riscv32-unknown-elf-gcc -xc++ # Command used to remove files during 'clean' target. RM = rm -f @@ -222,7 +222,6 @@ altera_avalon_timer_driver_SRCS_ROOT := drivers # altera_avalon_timer_driver sources altera_avalon_timer_driver_C_LIB_SRCS := \ - $(altera_avalon_timer_driver_SRCS_ROOT)/src/altera_avalon_timer_sc.c \ $(altera_avalon_timer_driver_SRCS_ROOT)/src/altera_avalon_timer_ts.c \ $(altera_avalon_timer_driver_SRCS_ROOT)/src/altera_avalon_timer_vars.c @@ -238,96 +237,29 @@ altera_nios2_gen2_hal_driver_SRCS_ROOT := HAL # altera_nios2_gen2_hal_driver sources altera_nios2_gen2_hal_driver_C_LIB_SRCS := \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/altera_nios2_gen2_irq.c \ $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_usleep.c \ + $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_printf.c \ + $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_putchar.c \ + $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_putstr.c \ $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_busy_sleep.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_irq_vars.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_icache_flush.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_icache_flush_all.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_dcache_flush.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_dcache_flush_all.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_dcache_flush_no_writeback.c \ $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_ecc_fatal_exception.c \ $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_instruction_exception_entry.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_irq_register.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_iic.c \ $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_remap_cached.c \ $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_remap_uncached.c \ $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_uncached_free.c \ $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_uncached_malloc.c \ $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_do_ctors.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_do_dtors.c \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_gmon.c - -altera_nios2_gen2_hal_driver_ASM_LIB_SRCS := \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_ecc_fatal_entry.S \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_exception_entry.S \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_exception_trap.S \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_exception_muldiv.S \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_irq_entry.S \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_software_exception.S \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_mcount.S \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_log_macro.S \ - $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/crt0.S + $(altera_nios2_gen2_hal_driver_SRCS_ROOT)/src/alt_do_dtors.c # hal sources root hal_SRCS_ROOT := HAL # hal sources hal_C_LIB_SRCS := \ - $(hal_SRCS_ROOT)/src/alt_alarm_start.c \ - $(hal_SRCS_ROOT)/src/alt_close.c \ - $(hal_SRCS_ROOT)/src/alt_dev.c \ $(hal_SRCS_ROOT)/src/alt_dev_llist_insert.c \ - $(hal_SRCS_ROOT)/src/alt_dma_rxchan_open.c \ - $(hal_SRCS_ROOT)/src/alt_dma_txchan_open.c \ - $(hal_SRCS_ROOT)/src/alt_environ.c \ - $(hal_SRCS_ROOT)/src/alt_env_lock.c \ $(hal_SRCS_ROOT)/src/alt_errno.c \ - $(hal_SRCS_ROOT)/src/alt_execve.c \ - $(hal_SRCS_ROOT)/src/alt_exit.c \ - $(hal_SRCS_ROOT)/src/alt_fcntl.c \ - $(hal_SRCS_ROOT)/src/alt_fd_lock.c \ - $(hal_SRCS_ROOT)/src/alt_fd_unlock.c \ - $(hal_SRCS_ROOT)/src/alt_find_dev.c \ - $(hal_SRCS_ROOT)/src/alt_find_file.c \ $(hal_SRCS_ROOT)/src/alt_flash_dev.c \ - $(hal_SRCS_ROOT)/src/alt_fork.c \ - $(hal_SRCS_ROOT)/src/alt_fs_reg.c \ - $(hal_SRCS_ROOT)/src/alt_fstat.c \ - $(hal_SRCS_ROOT)/src/alt_get_fd.c \ - $(hal_SRCS_ROOT)/src/alt_getchar.c \ - $(hal_SRCS_ROOT)/src/alt_getpid.c \ - $(hal_SRCS_ROOT)/src/alt_gettod.c \ - $(hal_SRCS_ROOT)/src/alt_iic_isr_register.c \ - $(hal_SRCS_ROOT)/src/alt_instruction_exception_register.c \ - $(hal_SRCS_ROOT)/src/alt_ioctl.c \ - $(hal_SRCS_ROOT)/src/alt_io_redirect.c \ - $(hal_SRCS_ROOT)/src/alt_irq_handler.c \ - $(hal_SRCS_ROOT)/src/alt_isatty.c \ - $(hal_SRCS_ROOT)/src/alt_kill.c \ - $(hal_SRCS_ROOT)/src/alt_link.c \ - $(hal_SRCS_ROOT)/src/alt_load.c \ - $(hal_SRCS_ROOT)/src/alt_log_printf.c \ - $(hal_SRCS_ROOT)/src/alt_lseek.c \ - $(hal_SRCS_ROOT)/src/alt_main.c \ - $(hal_SRCS_ROOT)/src/alt_malloc_lock.c \ - $(hal_SRCS_ROOT)/src/alt_open.c \ - $(hal_SRCS_ROOT)/src/alt_printf.c \ - $(hal_SRCS_ROOT)/src/alt_putchar.c \ - $(hal_SRCS_ROOT)/src/alt_putcharbuf.c \ - $(hal_SRCS_ROOT)/src/alt_putstr.c \ - $(hal_SRCS_ROOT)/src/alt_read.c \ - $(hal_SRCS_ROOT)/src/alt_release_fd.c \ - $(hal_SRCS_ROOT)/src/alt_rename.c \ - $(hal_SRCS_ROOT)/src/alt_sbrk.c \ - $(hal_SRCS_ROOT)/src/alt_settod.c \ - $(hal_SRCS_ROOT)/src/alt_stat.c \ - $(hal_SRCS_ROOT)/src/alt_tick.c \ - $(hal_SRCS_ROOT)/src/alt_times.c \ - $(hal_SRCS_ROOT)/src/alt_unlink.c \ - $(hal_SRCS_ROOT)/src/alt_wait.c \ - $(hal_SRCS_ROOT)/src/alt_write.c + $(hal_SRCS_ROOT)/src/alt_main.c # i2c_opencores_driver sources root i2c_opencores_driver_SRCS_ROOT := drivers @@ -339,11 +271,6 @@ i2c_opencores_driver_C_LIB_SRCS := \ # nios2_hw_crc32_driver sources root nios2_hw_crc32_driver_SRCS_ROOT := drivers -# nios2_hw_crc32_driver sources -nios2_hw_crc32_driver_C_LIB_SRCS := \ - $(nios2_hw_crc32_driver_SRCS_ROOT)/src/ci_crc.c \ - $(nios2_hw_crc32_driver_SRCS_ROOT)/src/crc.c - # Assemble all component C source files COMPONENT_C_LIB_SRCS += \ @@ -444,8 +371,7 @@ GENERATED_H_FILES := $(ABS_BSP_ROOT)/system.h GENERATED_LINKER_SCRIPT := $(ABS_BSP_ROOT)/linker.x -GENERATED_FILES += $(GENERATED_H_FILES) \ - $(GENERATED_LINKER_SCRIPT) +GENERATED_FILES += $(GENERATED_H_FILES) #------------------------------------------------------------------------------ @@ -503,7 +429,7 @@ $(OBJS): $(wildcard $(FORCE_REBUILD_DEP)) $(wildcard $(FORCE_REBUILD_ALL_DEP)) .PHONY: all all: build_pre_process -all: Makefile $(GENERATED_FILES) $(BSP_LIB) $(NEWLIB_DIR) +all: Makefile bsp_timestamp $(GENERATED_FILES) $(BSP_LIB) $(NEWLIB_DIR) all: build_post_process @@ -516,7 +442,6 @@ ifneq ($(wildcard $(NEWLIB_DIR)),) endif @$(ECHO) [BSP clean complete] - #------------------------------------------------------------------------------ # BUILD PRE/POST PROCESS #------------------------------------------------------------------------------ @@ -543,37 +468,39 @@ ifneq ($(wildcard $(SETTINGS_FILE)),$(SETTINGS_FILE)) $(warning Warning: BSP Settings File $(SETTINGS_FILE) could not be found.) endif -Makefile: $(wildcard $(SETTINGS_FILE)) - @$(ECHO) Makefile not up to date. - @$(ECHO) $(SETTINGS_FILE) has been modified since the BSP Makefile was generated. - @$(ECHO) - @$(ECHO) Generate the BSP to update the Makefile, and then build again. - @$(ECHO) - @$(ECHO) To generate from Eclipse: - @$(ECHO) " 1. Right-click the BSP project." - @$(ECHO) " 2. In the Nios II Menu, click Generate BSP." - @$(ECHO) - @$(ECHO) To generate from the command line: - @$(ECHO) " nios2-bsp-generate-files --settings= --bsp-dir=" - @$(ECHO) - @exit 1 +#Makefile: $(wildcard $(SETTINGS_FILE)) +# @$(ECHO) Makefile not up to date. +# @$(ECHO) $(SETTINGS_FILE) has been modified since the BSP Makefile was generated. +# @$(ECHO) +# @$(ECHO) Update system.h etc. BSP files manually, then run \"touch public.mk Makefile\" on BSP dir. +# @$(ECHO) +# @exit 1 ifneq ($(wildcard $(SOPC_FILE)),$(SOPC_FILE)) $(warning Warning: SOPC File $(SOPC_FILE) could not be found.) endif -public.mk: $(wildcard $(SOPC_FILE)) - @$(ECHO) Makefile not up to date. - @$(ECHO) $(SOPC_FILE) has been modified since the BSP was generated. +#public.mk: $(wildcard $(SOPC_FILE)) +# @$(ECHO) Makefile not up to date. +# @$(ECHO) $(SOPC_FILE) has been modified since the BSP was generated. +# @$(ECHO) +# @$(ECHO) Update system.h etc. BSP files manually, then run \"touch public.mk Makefile\" on BSP dir. +# @$(ECHO) +# @exit 1 + +bsp_timestamp: $(wildcard $(SOPC_FILE)) + @$(ECHO) BSP not up to date. + @$(ECHO) $(SOPC_FILE) has been modified since the BSP was last updated. @$(ECHO) - @$(ECHO) Generate the BSP to update the Makefile, and then build again. + @$(ECHO) "If you have not customized QSYS platform:" + @$(ECHO) " 1. Open sys.qsys in Quartus Platform Designer, generate platform" + @$(ECHO) " files (Generate -> Generate HDL, Generate) and run compilation" + @$(ECHO) " 2. Run \"touch bsp_timestamp\" in BSP dir" @$(ECHO) - @$(ECHO) To generate from Eclipse: - @$(ECHO) " 1. Right-click the BSP project." - @$(ECHO) " 2. In the Nios II Menu, click Generate BSP." - @$(ECHO) - @$(ECHO) To generate from the command line: - @$(ECHO) " nios2-bsp-generate-files --settings= --bsp-dir=" + @$(ECHO) "If you have customized and regenerated QSYS platform:" + @$(ECHO) " 1. Update system.h, public.mk, Makefile etc. BSP files manually" + @$(ECHO) " to match your updates" + @$(ECHO) " 2. Run \"touch bsp_timestamp\" in BSP dir" @$(ECHO) @exit 1 diff --git a/software/sys_controller_bsp/alt_sys_init.c b/software/sys_controller_bsp/alt_sys_init.c index 562b9ae..a500582 100644 --- a/software/sys_controller_bsp/alt_sys_init.c +++ b/software/sys_controller_bsp/alt_sys_init.c @@ -49,7 +49,7 @@ */ #include "system.h" -#include "sys/alt_irq.h" +//#include "sys/alt_irq.h" #include "sys/alt_sys_init.h" #include @@ -58,7 +58,7 @@ * Device headers */ -#include "altera_nios2_gen2_irq.h" +//#include "altera_nios2_gen2_irq.h" #include "altera_avalon_jtag_uart.h" #include "altera_avalon_timer.h" #include "altera_epcq_controller_mod.h" @@ -68,7 +68,7 @@ * Allocate the device storage */ -ALTERA_NIOS2_GEN2_IRQ_INSTANCE ( NIOS2_QSYS_0, nios2_qsys_0); +//ALTERA_NIOS2_GEN2_IRQ_INSTANCE ( NIOS2_QSYS_0, nios2_qsys_0); ALTERA_AVALON_JTAG_UART_INSTANCE ( JTAG_UART_0, jtag_uart_0); ALTERA_AVALON_TIMER_INSTANCE ( TIMER_0, timer_0); ALTERA_EPCQ_CONTROLLER_MOD_AVL_MEM_AVL_CSR_INSTANCE ( EPCQ_CONTROLLER_0, EPCQ_CONTROLLER_0_AVL_MEM, EPCQ_CONTROLLER_0_AVL_CSR, epcq_controller_0); @@ -85,8 +85,8 @@ I2C_OPENCORES_INSTANCE ( I2C_OPENCORES_1, i2c_opencores_1); void alt_irq_init ( const void* base ) { - ALTERA_NIOS2_GEN2_IRQ_INIT ( NIOS2_QSYS_0, nios2_qsys_0); - alt_irq_cpu_enable_interrupts(); + /*ALTERA_NIOS2_GEN2_IRQ_INIT ( NIOS2_QSYS_0, nios2_qsys_0); + alt_irq_cpu_enable_interrupts();*/ } /* diff --git a/software/sys_controller_bsp/drivers/inc/Altera_UP_SD_Card_Avalon_Interface_mod.h b/software/sys_controller_bsp/drivers/inc/Altera_UP_SD_Card_Avalon_Interface_mod.h deleted file mode 100644 index 4e1dbef..0000000 --- a/software/sys_controller_bsp/drivers/inc/Altera_UP_SD_Card_Avalon_Interface_mod.h +++ /dev/null @@ -1,166 +0,0 @@ -#ifndef __ALTERA_UP_SD_CARD_AVALON_INTERFACE_H__ -#define __ALTERA_UP_SD_CARD_AVALON_INTERFACE_H__ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define SD_RAW_IFACE - -/* - * Device structure definition. Each instance of the driver uses one - * of these structures to hold its associated state. - */ -typedef struct alt_up_sd_card_dev { - /// @brief character mode device structure - /// @sa Developing Device Drivers for the HAL in Nios II Software Developer's Handbook - alt_dev dev; - /// @brief the base address of the device - unsigned int base; - -} alt_up_sd_card_dev; - -#ifndef bool - typedef enum e_bool { false = 0, true = 1 } bool; -#endif - -////////////////////////////////////////////////////////////////////////// -// HAL system functions - -alt_up_sd_card_dev* alt_up_sd_card_open_dev(const char *name); -/* Open an SD Card Interface if it is connected to the system. */ - - -bool alt_up_sd_card_is_Present(void); -/* Check if there is an SD Card insterted into the SD Card socket. - */ - -#ifndef SD_RAW_IFACE -bool alt_up_sd_card_is_FAT16(void); -/* This function reads the SD card data in an effort to determine if the card is formated as a FAT16 - * volume. Please note that FAT12 has a similar format, but will not be supported by this driver. - */ - - -short int alt_up_sd_card_fopen(char *name, bool create); -/* This function reads the SD card data in an effort to determine if the card is formated as a FAT16 - * volume. Please note that FAT12 has a similar format, but will not be supported by this driver. - * - * Inputs: - * name - a file name including a directory, relative to the root directory - * create - a flag set to true to create a file if it does not already exist - * Output: - * An index to the file record assigned to the specified file. -1 is returned if the file could not be opened. - */ - - -short int alt_up_sd_card_find_first(char *directory_to_search_through, char *file_name); -/* This function sets up a search algorithm to go through a given directory looking for files. - * If the search directory is valid, then the function searches for the first file it finds. - * Inputs: - * directory_to_search_through - name of the directory to search through - * file_name - an array to store a name of the file found. Must be 13 bytes long (12 bytes for file name and 1 byte of NULL termination). - * Outputs: - * 0 - success - * 1 - invalid directory - * 2 - No card or incorrect card format. - * - * To specify a directory give the name in a format consistent with the following regular expression: - * [{[valid_chars]+}/]*. - * - * In other words, give a path name starting at the root directory, where each directory name is followed by a '/'. - * Then, append a '.' to the directory name. Examples: - * "." - look through the root directory - * "first/." - look through a directory named "first" that is located in the root directory. - * "first/sub/." - look through a directory named "sub", that is located within the subdirectory named "first". "first" is located in the root directory. - * Invalid examples include: - * "/.", "/////." - this is not the root directory. - * "/first/." - the first character may not be a '/'. - */ - - - -short int alt_up_sd_card_find_next(char *file_name); -/* This function searches for the next file in a given directory, as specified by the find_first function. - * Inputs: - * file_name - an array to store a name of the file found. Must be 13 bytes long (12 bytes for file name and 1 byte of NULL termination). - * Outputs: - * -1 - end of directory. - * 0 - success - * 2 - No card or incorrect card format. - * 4 - find_first has not been called successfully. - */ - -void alt_up_sd_card_set_attributes(short int file_handle, short int attributes); -/* Set file attributes as needed. - */ - -short int alt_up_sd_card_get_attributes(short int file_handle); -/* Return file attributes, or -1 if the file_handle is invalid. - */ - - -short int alt_up_sd_card_read(short int file_handle); -/* Read a single character from the given file. Return -1 if at the end of a file. Any other negative number - * means that the file could not be read. A number between 0 and 255 is an ASCII character read from the SD Card. */ - - -bool alt_up_sd_card_write(short int file_handle, char byte_of_data); -/* Write a single character to a given file. Return true if successful, and false otherwise. */ - - -bool alt_up_sd_card_fclose(short int file_handle); -// This function closes an opened file and saves data to SD Card if necessary. - -#else -bool Write_Sector_Data(int sector_index, int partition_offset); -bool Save_Modified_Sector(); -bool Read_Sector_Data(int sector_index, int partition_offset); -#endif //SD_RAW_IFACE - -////////////////////////////////////////////////////////////////////////// -// file-like operation functions - -////////////////////////////////////////////////////////////////////////// -// direct operation functions - - -/* - * Macros used by alt_sys_init - */ -#define ALTERA_UP_SD_CARD_AVALON_INTERFACE_MOD_INSTANCE(name, device) \ - static alt_up_sd_card_dev device = \ - { \ - { \ - ALT_LLIST_ENTRY, \ - name##_NAME, \ - NULL , /* open */ \ - NULL , /* close */ \ - NULL, /* read */ \ - NULL, /* write */ \ - NULL , /* lseek */ \ - NULL , /* fstat */ \ - NULL , /* ioctl */ \ - }, \ - name##_BASE, \ - } - -#define ALTERA_UP_SD_CARD_AVALON_INTERFACE_MOD_INIT(name, device) \ -{ \ - alt_dev_reg(&device.dev); \ -} - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __ALTERA_UP_SD_CARD_AVALON_INTERFACE_H__ */ - - diff --git a/software/sys_controller_bsp/drivers/inc/altera_avalon_timer.h b/software/sys_controller_bsp/drivers/inc/altera_avalon_timer.h new file mode 100644 index 0000000..dae4193 --- /dev/null +++ b/software/sys_controller_bsp/drivers/inc/altera_avalon_timer.h @@ -0,0 +1,193 @@ +#ifndef __ALT_AVALON_TIMER_H__ +#define __ALT_AVALON_TIMER_H__ + +/****************************************************************************** +* * +* License Agreement * +* * +* Copyright (c) 2003 Altera Corporation, San Jose, California, USA. * +* All rights reserved. * +* * +* Permission is hereby granted, free of charge, to any person obtaining a * +* copy of this software and associated documentation files (the "Software"), * +* to deal in the Software without restriction, including without limitation * +* the rights to use, copy, modify, merge, publish, distribute, sublicense, * +* and/or sell copies of the Software, and to permit persons to whom the * +* Software is furnished to do so, subject to the following conditions: * +* * +* The above copyright notice and this permission notice shall be included in * +* all copies or substantial portions of the Software. * +* * +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * +* DEALINGS IN THE SOFTWARE. * +* * +* This agreement shall be governed in all respects by the laws of the State * +* of California and by the laws of the United States of America. * +* * +* Altera does not recommend, suggest or require that this reference design * +* file be used in conjunction or combination with any other product. * +******************************************************************************/ + +#include + +#include "alt_types.h" +#include "sys/alt_dev.h" +#include "sys/alt_warning.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +#define __ALT_COUNTER_SIZE(name) name##_COUNTER_SIZE +#define _ALT_COUNTER_SIZE(name) __ALT_COUNTER_SIZE(name) + +#define ALT_SYS_CLK_COUNTER_SIZE _ALT_COUNTER_SIZE(ALT_SYS_CLK) +#define ALT_TIMESTAMP_COUNTER_SIZE _ALT_COUNTER_SIZE(ALT_TIMESTAMP_CLK) + +#if (ALT_SYS_CLK_COUNTER_SIZE == 64) +#define alt_sysclk_type alt_u64 +#else +#define alt_sysclk_type alt_u32 +#endif + +#if (ALT_TIMESTAMP_COUNTER_SIZE == 64) +#define alt_timestamp_type alt_u64 +#else +#define alt_timestamp_type alt_u32 +#endif + +/* + * The function alt_avalon_timer_sc_init() is the initialisation function for + * the system clock. It registers the timers interrupt handler, and then calls + * the system clock regestration function, alt_sysclk_init(). + */ + +extern void alt_avalon_timer_sc_init (void* base, alt_u32 irq_controller_id, + alt_u32 irq, alt_u32 freq); + +/* + * Variables used to store the timestamp parameters, when the device is to be + * accessed using the high resolution timestamp driver. + */ + +extern void* altera_avalon_timer_ts_base; +extern alt_u32 altera_avalon_timer_ts_freq; + +/* + * ALTERA_AVALON_TIMER_INSTANCE is the macro used by alt_sys_init() to + * allocate any per device memory that may be required. In this case no + * allocation is necessary. + */ + +#define ALTERA_AVALON_TIMER_INSTANCE(name, dev) extern int alt_no_storage + +/* + * Macro used to calculate the timer interrupt frequency. Although this is + * somewhat fearsome, when compiled with -O2 it will be resolved at compile + * time to a constant value. + */ + +#define ALTERA_AVALON_TIMER_FREQ(freq, period, units) \ + strcmp (units, "us") ? \ + (strcmp (units, "ms") ? \ + (strcmp (units, "s") ? \ + ((freq + (period - 1))/period) \ + : 1) \ + : (1000 + (period - 1))/period) \ + : ((1000000 + (period - 1))/period) + +/* + * Construct macros which contain the base address of the system clock and the + * timestamp device. These are used below to determine which driver to use for + * a given timer. + */ + +#define __ALT_CLK_BASE(name) name##_BASE +#define _ALT_CLK_BASE(name) __ALT_CLK_BASE(name) + +#define ALT_SYS_CLK_BASE _ALT_CLK_BASE(ALT_SYS_CLK) +#define ALT_TIMESTAMP_CLK_BASE _ALT_CLK_BASE(ALT_TIMESTAMP_CLK) + +/* + * If there is no system clock, then the above macro will result in + * ALT_SYS_CLK_BASE being set to none_BASE. We therefore need to provide an + * invalid value for this, so that no timer is wrongly identified as the system + * clock. + */ + +#define none_BASE 0xffffffff + +/* + * ALTERA_AVALON_TIMER_INIT is the macro used by alt_sys_init() to provide + * the run time initialisation of the device. In this case this translates to + * a call to alt_avalon_timer_sc_init() if the device is the system clock, i.e. + * if it has the name "sysclk". + * + * If the device is not the system clock, then it is used to provide the + * timestamp facility. + * + * To ensure as much as possible is evaluated at compile time, rather than + * compare the name of the device to "/dev/sysclk" using strcmp(), the base + * address of the device is compared to SYSCLK_BASE to determine whether it's + * the system clock. Since the base address of a device must be unique, these + * two aproaches are equivalent. + * + * This macro performs a sanity check to ensure that the interrupt has been + * connected for this device. If not, then an apropriate error message is + * generated at build time. + */ + + +#define ALTERA_AVALON_TIMER_INIT(name, dev) \ + if (name##_BASE == ALT_SYS_CLK_BASE) \ + { \ + if (name##_IRQ == ALT_IRQ_NOT_CONNECTED) \ + { \ + ALT_LINK_ERROR ("Error: Interrupt not connected for " #dev ". " \ + "The system clock driver requires an interrupt to be " \ + "connected. Please select an IRQ for this device in " \ + "SOPC builder."); \ + } \ + else \ + { \ + alt_avalon_timer_sc_init((void*) name##_BASE, \ + name##_IRQ_INTERRUPT_CONTROLLER_ID, \ + name##_IRQ, \ + ALTERA_AVALON_TIMER_FREQ(name##_FREQ, \ + name##_PERIOD, \ + name##_PERIOD_UNITS));\ + } \ + } \ + else if (name##_BASE == ALT_TIMESTAMP_CLK_BASE) \ + { \ + if (name##_SNAPSHOT) \ + { \ + altera_avalon_timer_ts_base = (void*) name##_BASE; \ + altera_avalon_timer_ts_freq = name##_FREQ; \ + } \ + else \ + { \ + ALT_LINK_ERROR ("Error: Snapshot register not available for " \ + #dev ". " \ + "The timestamp driver requires the snapshot register " \ + "to be readable. Please enable this register for this " \ + "device in SOPC builder."); \ + } \ + } + +/* + * + */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __ALT_AVALON_TIMER_H__ */ diff --git a/software/sys_controller_bsp/drivers/inc/altera_avalon_timer_regs.h b/software/sys_controller_bsp/drivers/inc/altera_avalon_timer_regs.h new file mode 100644 index 0000000..37bb44d --- /dev/null +++ b/software/sys_controller_bsp/drivers/inc/altera_avalon_timer_regs.h @@ -0,0 +1,202 @@ +/****************************************************************************** +* * +* License Agreement * +* * +* Copyright (c) 2003 Altera Corporation, San Jose, California, USA. * +* All rights reserved. * +* * +* Permission is hereby granted, free of charge, to any person obtaining a * +* copy of this software and associated documentation files (the "Software"), * +* to deal in the Software without restriction, including without limitation * +* the rights to use, copy, modify, merge, publish, distribute, sublicense, * +* and/or sell copies of the Software, and to permit persons to whom the * +* Software is furnished to do so, subject to the following conditions: * +* * +* The above copyright notice and this permission notice shall be included in * +* all copies or substantial portions of the Software. * +* * +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * +* DEALINGS IN THE SOFTWARE. * +* * +* This agreement shall be governed in all respects by the laws of the State * +* of California and by the laws of the United States of America. * +* * +******************************************************************************/ + +#ifndef __ALTERA_AVALON_TIMER_REGS_H__ +#define __ALTERA_AVALON_TIMER_REGS_H__ + +#include + +/* STATUS register */ +#define ALTERA_AVALON_TIMER_STATUS_REG 0 +#define IOADDR_ALTERA_AVALON_TIMER_STATUS(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_STATUS_REG) +#define IORD_ALTERA_AVALON_TIMER_STATUS(base) \ + IORD(base, ALTERA_AVALON_TIMER_STATUS_REG) +#define IOWR_ALTERA_AVALON_TIMER_STATUS(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_STATUS_REG, data) +#define ALTERA_AVALON_TIMER_STATUS_TO_MSK (0x1) +#define ALTERA_AVALON_TIMER_STATUS_TO_OFST (0) +#define ALTERA_AVALON_TIMER_STATUS_RUN_MSK (0x2) +#define ALTERA_AVALON_TIMER_STATUS_RUN_OFST (1) + +/* CONTROL register */ +#define ALTERA_AVALON_TIMER_CONTROL_REG 1 +#define IOADDR_ALTERA_AVALON_TIMER_CONTROL(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_CONTROL_REG) +#define IORD_ALTERA_AVALON_TIMER_CONTROL(base) \ + IORD(base, ALTERA_AVALON_TIMER_CONTROL_REG) +#define IOWR_ALTERA_AVALON_TIMER_CONTROL(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_CONTROL_REG, data) +#define ALTERA_AVALON_TIMER_CONTROL_ITO_MSK (0x1) +#define ALTERA_AVALON_TIMER_CONTROL_ITO_OFST (0) +#define ALTERA_AVALON_TIMER_CONTROL_CONT_MSK (0x2) +#define ALTERA_AVALON_TIMER_CONTROL_CONT_OFST (1) +#define ALTERA_AVALON_TIMER_CONTROL_START_MSK (0x4) +#define ALTERA_AVALON_TIMER_CONTROL_START_OFST (2) +#define ALTERA_AVALON_TIMER_CONTROL_STOP_MSK (0x8) +#define ALTERA_AVALON_TIMER_CONTROL_STOP_OFST (3) + +/* Period and SnapShot Register for COUNTER_SIZE = 32 */ +/*----------------------------------------------------*/ +/* PERIODL register */ +#define ALTERA_AVALON_TIMER_PERIODL_REG 2 +#define IOADDR_ALTERA_AVALON_TIMER_PERIODL(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_PERIODL_REG) +#define IORD_ALTERA_AVALON_TIMER_PERIODL(base) \ + IORD(base, ALTERA_AVALON_TIMER_PERIODL_REG) +#define IOWR_ALTERA_AVALON_TIMER_PERIODL(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_PERIODL_REG, data) +#define ALTERA_AVALON_TIMER_PERIODL_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_PERIODL_OFST (0) + +/* PERIODH register */ +#define ALTERA_AVALON_TIMER_PERIODH_REG 3 +#define IOADDR_ALTERA_AVALON_TIMER_PERIODH(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_PERIODH_REG) +#define IORD_ALTERA_AVALON_TIMER_PERIODH(base) \ + IORD(base, ALTERA_AVALON_TIMER_PERIODH_REG) +#define IOWR_ALTERA_AVALON_TIMER_PERIODH(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_PERIODH_REG, data) +#define ALTERA_AVALON_TIMER_PERIODH_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_PERIODH_OFST (0) + +/* SNAPL register */ +#define ALTERA_AVALON_TIMER_SNAPL_REG 4 +#define IOADDR_ALTERA_AVALON_TIMER_SNAPL(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_SNAPL_REG) +#define IORD_ALTERA_AVALON_TIMER_SNAPL(base) \ + IORD(base, ALTERA_AVALON_TIMER_SNAPL_REG) +#define IOWR_ALTERA_AVALON_TIMER_SNAPL(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_SNAPL_REG, data) +#define ALTERA_AVALON_TIMER_SNAPL_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_SNAPL_OFST (0) + +/* SNAPH register */ +#define ALTERA_AVALON_TIMER_SNAPH_REG 5 +#define IOADDR_ALTERA_AVALON_TIMER_SNAPH(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_SNAPH_REG) +#define IORD_ALTERA_AVALON_TIMER_SNAPH(base) \ + IORD(base, ALTERA_AVALON_TIMER_SNAPH_REG) +#define IOWR_ALTERA_AVALON_TIMER_SNAPH(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_SNAPH_REG, data) +#define ALTERA_AVALON_TIMER_SNAPH_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_SNAPH_OFST (0) + +/* Period and SnapShot Register for COUNTER_SIZE = 64 */ +/*----------------------------------------------------*/ +/* PERIOD_0 register */ +#define ALTERA_AVALON_TIMER_PERIOD_0_REG 2 +#define IOADDR_ALTERA_AVALON_TIMER_PERIOD_0(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_PERIOD_0_REG) +#define IORD_ALTERA_AVALON_TIMER_PERIOD_0(base) \ + IORD(base, ALTERA_AVALON_TIMER_PERIOD_0_REG) +#define IOWR_ALTERA_AVALON_TIMER_PERIOD_0(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_PERIOD_0_REG, data) +#define ALTERA_AVALON_TIMER_PERIOD_0_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_PERIOD_0_OFST (0) + +/* PERIOD_1 register */ +#define ALTERA_AVALON_TIMER_PERIOD_1_REG 3 +#define IOADDR_ALTERA_AVALON_TIMER_PERIOD_1(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_PERIOD_1_REG) +#define IORD_ALTERA_AVALON_TIMER_PERIOD_1(base) \ + IORD(base, ALTERA_AVALON_TIMER_PERIOD_1_REG) +#define IOWR_ALTERA_AVALON_TIMER_PERIOD_1(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_PERIOD_1_REG, data) +#define ALTERA_AVALON_TIMER_PERIOD_1_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_PERIOD_1_OFST (0) + +/* PERIOD_2 register */ +#define ALTERA_AVALON_TIMER_PERIOD_2_REG 4 +#define IOADDR_ALTERA_AVALON_TIMER_PERIOD_2(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_PERIOD_2_REG) +#define IORD_ALTERA_AVALON_TIMER_PERIOD_2(base) \ + IORD(base, ALTERA_AVALON_TIMER_PERIOD_2_REG) +#define IOWR_ALTERA_AVALON_TIMER_PERIOD_2(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_PERIOD_2_REG, data) +#define ALTERA_AVALON_TIMER_PERIOD_2_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_PERIOD_2_OFST (0) + +/* PERIOD_3 register */ +#define ALTERA_AVALON_TIMER_PERIOD_3_REG 5 +#define IOADDR_ALTERA_AVALON_TIMER_PERIOD_3(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_PERIOD_3_REG) +#define IORD_ALTERA_AVALON_TIMER_PERIOD_3(base) \ + IORD(base, ALTERA_AVALON_TIMER_PERIOD_3_REG) +#define IOWR_ALTERA_AVALON_TIMER_PERIOD_3(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_PERIOD_3_REG, data) +#define ALTERA_AVALON_TIMER_PERIOD_3_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_PERIOD_3_OFST (0) + +/* SNAP_0 register */ +#define ALTERA_AVALON_TIMER_SNAP_0_REG 6 +#define IOADDR_ALTERA_AVALON_TIMER_SNAP_0(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_SNAP_0_REG) +#define IORD_ALTERA_AVALON_TIMER_SNAP_0(base) \ + IORD(base, ALTERA_AVALON_TIMER_SNAP_0_REG) +#define IOWR_ALTERA_AVALON_TIMER_SNAP_0(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_SNAP_0_REG, data) +#define ALTERA_AVALON_TIMER_SNAP_0_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_SNAP_0_OFST (0) + +/* SNAP_1 register */ +#define ALTERA_AVALON_TIMER_SNAP_1_REG 7 +#define IOADDR_ALTERA_AVALON_TIMER_SNAP_1(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_SNAP_1_REG) +#define IORD_ALTERA_AVALON_TIMER_SNAP_1(base) \ + IORD(base, ALTERA_AVALON_TIMER_SNAP_1_REG) +#define IOWR_ALTERA_AVALON_TIMER_SNAP_1(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_SNAP_1_REG, data) +#define ALTERA_AVALON_TIMER_SNAP_1_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_SNAP_1_OFST (0) + +/* SNAP_2 register */ +#define ALTERA_AVALON_TIMER_SNAP_2_REG 8 +#define IOADDR_ALTERA_AVALON_TIMER_SNAP_2(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_SNAP_2_REG) +#define IORD_ALTERA_AVALON_TIMER_SNAP_2(base) \ + IORD(base, ALTERA_AVALON_TIMER_SNAP_2_REG) +#define IOWR_ALTERA_AVALON_TIMER_SNAP_2(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_SNAP_2_REG, data) +#define ALTERA_AVALON_TIMER_SNAP_2_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_SNAP_2_OFST (0) + +/* SNAP_3 register */ +#define ALTERA_AVALON_TIMER_SNAP_3_REG 9 +#define IOADDR_ALTERA_AVALON_TIMER_SNAP_3(base) \ + __IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_SNAP_3_REG) +#define IORD_ALTERA_AVALON_TIMER_SNAP_3(base) \ + IORD(base, ALTERA_AVALON_TIMER_SNAP_3_REG) +#define IOWR_ALTERA_AVALON_TIMER_SNAP_3(base, data) \ + IOWR(base, ALTERA_AVALON_TIMER_SNAP_3_REG, data) +#define ALTERA_AVALON_TIMER_SNAP_3_MSK (0xFFFF) +#define ALTERA_AVALON_TIMER_SNAP_3_OFST (0) + +#endif /* __ALTERA_AVALON_TIMER_REGS_H__ */ diff --git a/software/sys_controller_bsp/drivers/inc/crc.h b/software/sys_controller_bsp/drivers/inc/crc.h deleted file mode 100644 index 4db516e..0000000 --- a/software/sys_controller_bsp/drivers/inc/crc.h +++ /dev/null @@ -1,109 +0,0 @@ -/****************************************************************************** -* * -* License Agreement * -* * -* Copyright (c) 2008 Altera Corporation, San Jose, California, USA. * -* All rights reserved. * -* * -* Permission is hereby granted, free of charge, to any person obtaining a * -* copy of this software and associated documentation files (the "Software"), * -* to deal in the Software without restriction, including without limitation * -* the rights to use, copy, modify, merge, publish, distribute, sublicense, * -* and/or sell copies of the Software, and to permit persons to whom the * -* Software is furnished to do so, subject to the following conditions: * -* * -* The above copyright notice and this permission notice shall be included in * -* all copies or substantial portions of the Software. * -* * -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * -* DEALINGS IN THE SOFTWARE. * -* * -* This agreement shall be governed in all respects by the laws of the State * -* of California and by the laws of the United States of America. * -* Altera does not recommend, suggest or require that this reference design * -* file be used in conjunction or combination with any other product. * -******************************************************************************/ - - -/********************************************************************** - * - * Filename: crc.h - * - * Description: A header file describing the various CRC standards. - * - * Notes: - * - * - * Copyright (c) 2000 by Michael Barr. This software is placed into - * the public domain and may be used for any purpose. However, this - * notice must not be changed or removed and no warranty is either - * expressed or implied by its publication or distribution. - **********************************************************************/ - -#ifndef _crc_h -#define _crc_h - - -#define FALSE 0 -#define TRUE !FALSE - -/* - * Select the CRC standard from the list that follows. - */ -#define CRC32 - - -#if defined(CRC_CCITT) - -typedef unsigned short crc; - -#define CRC_NAME "CRC-CCITT" -#define POLYNOMIAL 0x1021 -#define INITIAL_REMAINDER 0xFFFF -#define FINAL_XOR_VALUE 0x0000 -#define REFLECT_DATA FALSE -#define REFLECT_REMAINDER FALSE -#define CHECK_VALUE 0x29B1 - -#elif defined(CRC16) - -typedef unsigned short crc; - -#define CRC_NAME "CRC-16" -#define POLYNOMIAL 0x8005 -#define INITIAL_REMAINDER 0x0000 -#define FINAL_XOR_VALUE 0x0000 -#define REFLECT_DATA TRUE -#define REFLECT_REMAINDER TRUE -#define CHECK_VALUE 0xBB3D - -#elif defined(CRC32) - -typedef unsigned long crc; - -#define CRC_NAME "CRC-32" -#define POLYNOMIAL 0x04C11DB7 -#define INITIAL_REMAINDER 0xFFFFFFFF -#define FINAL_XOR_VALUE 0xFFFFFFFF -#define REFLECT_DATA TRUE -#define REFLECT_REMAINDER TRUE -#define CHECK_VALUE 0xCBF43926 - -#else - -#error "One of CRC_CCITT, CRC16, or CRC32 must be #define'd." - -#endif - - -void crcInit(void); -crc crcSlow(unsigned char const message[], int nBytes); -crc crcFast(unsigned char const message[], int nBytes); - - -#endif /* _crc_h */ diff --git a/software/sys_controller_bsp/drivers/src/Altera_UP_SD_Card_Avalon_Interface_mod.c b/software/sys_controller_bsp/drivers/src/Altera_UP_SD_Card_Avalon_Interface_mod.c deleted file mode 100644 index b98e077..0000000 --- a/software/sys_controller_bsp/drivers/src/Altera_UP_SD_Card_Avalon_Interface_mod.c +++ /dev/null @@ -1,1908 +0,0 @@ -/****************************************************************************** -* * -* License Agreement * -* * -* Copyright (c) 2006 Altera Corporation, San Jose, California, USA. * -* All rights reserved. * -* * -* Permission is hereby granted, free of charge, to any person obtaining a * -* copy of this software and associated documentation files (the "Software"), * -* to deal in the Software without restriction, including without limitation * -* the rights to use, copy, modify, merge, publish, distribute, sublicense, * -* and/or sell copies of the Software, and to permit persons to whom the * -* Software is furnished to do so, subject to the following conditions: * -* * -* The above copyright notice and this permission notice shall be included in * -* all copies or substantial portions of the Software. * -* * -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * -* DEALINGS IN THE SOFTWARE. * -* * -* This agreement shall be governed in all respects by the laws of the State * -* of California and by the laws of the United States of America. * -* * -******************************************************************************/ - -#include -#include -#include -#include -#include -#include "Altera_UP_SD_Card_Avalon_Interface_mod.h" - -/////////////////////////////////////////////////////////////////////////// -// Local Define Statements -/////////////////////////////////////////////////////////////////////////// - -#define CHAR_TO_UPPER(ch) ((char) (((ch >= 'a') && (ch <= 'z')) ? ((ch-'a')+'A'): ch)) - -// Data Buffer Address -#define SD_CARD_BUFFER(base, x) (base + x) -// 128-bit Card Identification Number -#define SD_CARD_CID(base, x) (base + 0x0200 + x) -// 128-bit Card Specific Data Register -#define SD_CARD_CSD(base, x) (base + 0x0210 + x) -// 32-bit Operating Conditions Register -#define SD_CARD_OCR(base) (base + 0x0220) -// 32-bit Card Status Register -#define SD_CARD_STATUS(base) (base + 0x0224) -// 16-bit Relative Card Address Register -#define SD_CARD_RCA(base) (base + 0x0228) -// 32-bit Card Argument Register -#define SD_CARD_ARGUMENT(base) (base + 0x022C) -// 16-bit Card Command Register -#define SD_CARD_COMMAND(base) (base + 0x0230) -// 16-bit Card Auxiliary Status Register -#define SD_CARD_AUX_STATUS(base) (base + 0x0234) -// 32-bit R1 Response Register -#define SD_CARD_R1_RESPONSE(base) (base + 0x0238) - -#define CMD_READ_BLOCK 17 -#define CMD_WRITE_BLOCK 24 - -// FAT 12/16 related stuff -//#define BOOT_SECTOR_DATA_SIZE 0x005A -#define MAX_FILES_OPENED 2 - -/******************************************************************************/ -/****** LOCAL DATA STRUCTURES ***********************************************/ -/******************************************************************************/ - - -typedef struct s_FAT_12_16_boot_sector { - unsigned char jump_instruction[3]; - char OEM_name[8]; - unsigned short int sector_size_in_bytes; - unsigned char sectors_per_cluster; - unsigned short int reserved_sectors; - unsigned char number_of_FATs; - unsigned short int max_number_of_dir_entires; - unsigned short int number_of_sectors_in_partition; - unsigned char media_descriptor; - unsigned short int number_of_sectors_per_table; - unsigned short int number_of_sectors_per_track; - unsigned short int number_of_heads; - unsigned int number_of_hidden_sectors; - unsigned int total_sector_count_if_above_32MB; - unsigned char drive_number; - unsigned char current_head; - unsigned char boot_signature; - unsigned char volume_id[4]; - char volume_label[11]; - unsigned char file_system_type[8]; - unsigned char bits_for_cluster_index; - unsigned int first_fat_sector_offset; - unsigned int second_fat_sector_offset; - unsigned int root_directory_sector_offset; - unsigned int data_sector_offset; -} t_FAT_12_16_boot_sector; - - -typedef struct s_file_record { - unsigned char name[8]; - unsigned char extension[3]; - unsigned char attributes; - unsigned short int create_time; - unsigned short int create_date; - unsigned short int last_access_date; - unsigned short int last_modified_time; - unsigned short int last_modified_date; - unsigned short int start_cluster_index; - unsigned int file_size_in_bytes; - /* The following fields are only used when a file has been created or opened. */ - unsigned int current_cluster_index; - unsigned int current_sector_in_cluster; - unsigned int current_byte_position; - // Absolute location of the file record on the SD Card. - unsigned int file_record_cluster; - unsigned int file_record_sector_in_cluster; - short int file_record_offset; - // Is this record in use and has the file been modified. - unsigned int home_directory_cluster; - bool modified; - bool in_use; -} t_file_record; - - -typedef struct s_find_data { - unsigned int directory_root_cluster; // 0 means root directory. - unsigned int current_cluster_index; - unsigned int current_sector_in_cluster; - short int file_index_in_sector; - bool valid; -} t_find_data; - - -/////////////////////////////////////////////////////////////////////////// -// Local Variables -/////////////////////////////////////////////////////////////////////////// - - -bool initialized = false; -bool is_sd_card_formated_as_FAT16 = false; -volatile short int *aux_status_register = NULL; -volatile int *status_register = NULL; -volatile short int *CSD_register_w0 = NULL; -volatile short int *command_register = NULL; -volatile int *command_argument_register = NULL; -volatile char *buffer_memory = NULL; -int fat_partition_offset_in_512_byte_sectors = 0; -int fat_partition_size_in_512_byte_sectors = 0; - -#ifndef SD_RAW_IFACE -t_FAT_12_16_boot_sector boot_sector_data; -#endif - -alt_up_sd_card_dev *device_pointer = NULL; - -#ifndef SD_RAW_IFACE -// Pointers to currently opened files. -t_file_record active_files[MAX_FILES_OPENED]; -#endif -bool current_sector_modified = false; -unsigned int current_sector_index = 0; - -#ifndef SD_RAW_IFACE -t_find_data search_data; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// Local Functions -/////////////////////////////////////////////////////////////////////////// - -#ifndef SD_RAW_IFACE -static bool Write_Sector_Data(int sector_index, int partition_offset) -#else -bool Write_Sector_Data(int sector_index, int partition_offset) -#endif -// This function writes a sector at the specified address on the SD Card. -{ - bool result = false; - - if (alt_up_sd_card_is_Present()) - { - short int reg_state = 0xff; - - /* Multiply sector offset by sector size to get the address. Sector size is 512. Also, - * the SD card reads data in 512 byte chunks, so the address must be a multiple of 512. */ - IOWR_32DIRECT(command_argument_register, 0, (sector_index + partition_offset)*512); - IOWR_16DIRECT(command_register, 0, CMD_WRITE_BLOCK); - do { - reg_state = (short int) IORD_16DIRECT(aux_status_register,0); - } while ((reg_state & 0x04)!=0); - // Make sure the request did not time out. - if ((reg_state & 0x10) == 0) - { - result = true; - current_sector_modified = false; - current_sector_index = sector_index+partition_offset; - } - } - return result; -} - -#ifndef SD_RAW_IFACE -static bool Save_Modified_Sector() -#else -bool Save_Modified_Sector() -#endif -// If the sector has been modified, then save it to the SD Card. -{ - bool result = true; - if (current_sector_modified) - { - result = Write_Sector_Data(current_sector_index, 0); - } - return result; -} - -#ifndef SD_RAW_IFACE -static bool Read_Sector_Data(int sector_index, int partition_offset) -#else -bool Read_Sector_Data(int sector_index, int partition_offset) -#endif -// This function reads a sector at the specified address on the SD Card. -{ - bool result = false; - - if (alt_up_sd_card_is_Present()) - { - short int reg_state = 0xff; - - /* Write data to the SD card if the current buffer is out of date. */ - if (current_sector_modified) - { - if (Write_Sector_Data(current_sector_index, 0) == false) - { - return false; - } - } - /* Multiply sector offset by sector size to get the address. Sector size is 512. Also, - * the SD card reads data in 512 byte chunks, so the address must be a multiple of 512. */ - IOWR_32DIRECT(command_argument_register, 0, (sector_index + partition_offset)*512); - IOWR_16DIRECT(command_register, 0, CMD_READ_BLOCK); - do { - reg_state = (short int) IORD_16DIRECT(aux_status_register,0); - } while ((reg_state & 0x04)!=0); - // Make sure the request did not time out. - if ((reg_state & 0x10) == 0) - { - result = true; - current_sector_modified = false; - current_sector_index = sector_index+partition_offset; - } - } - return result; -} - -#ifndef SD_RAW_IFACE -static bool get_cluster_flag(unsigned int cluster_index, unsigned short int *flag) -// Read a cluster flag. -{ - unsigned int sector_index = (cluster_index / 256) + fat_partition_offset_in_512_byte_sectors; - - sector_index = sector_index + boot_sector_data.first_fat_sector_offset; - - if (sector_index != current_sector_index) - { - if (Read_Sector_Data(sector_index, 0) == false) - { - return false; - } - } - *flag = (unsigned short int) IORD_16DIRECT(device_pointer->base, 2*(cluster_index % 256)); - return true; -} - - -static bool mark_cluster(unsigned int cluster_index, short int flag, bool first_fat) -// Place a marker on the specified cluster in a given FAT. -{ - unsigned int sector_index = (cluster_index / 256) + fat_partition_offset_in_512_byte_sectors; - - if (first_fat) - { - sector_index = sector_index + boot_sector_data.first_fat_sector_offset; - } - else - { - sector_index = sector_index + boot_sector_data.second_fat_sector_offset; - } - - if (sector_index != current_sector_index) - { - if (Read_Sector_Data(sector_index, 0) == false) - { - return false; - } - } - IOWR_16DIRECT(device_pointer->base, 2*(cluster_index % 256), flag); - current_sector_modified = true; - return true; -} - - -static bool Check_for_Master_Boot_Record(void) -// This function reads the first 512 bytes on the SD Card. This data should -// contain the Master Boot Record. If it does, then print -// relevant information and return true. Otherwise, return false. -{ - bool result = false; - int index; - int end, offset, partition_size; - - /* Load the first 512 bytes of data from SD card. */ - if (Read_Sector_Data(0, 0)) - { - end = (short int) IORD_16DIRECT(device_pointer->base,0x1fe); - - // Check if the end of the sector contains an end string 0xaa55. - if ((end & 0x0000ffff) == 0x0000aa55) - { - // Check four partition entries and see if any are valid - for (index = 0; index < 4; index++) - { - int partition_data_offset = (index * 16) + 0x01be; - char type; - - // Read Partition type - type = (unsigned char) IORD_8DIRECT(device_pointer->base,partition_data_offset + 0x04); - - // Check if this is an FAT parition - if ((type == 1) || (type == 4) || (type == 6) || (type == 14)) - { - // Get partition offset and size. - offset = (((unsigned short int) IORD_16DIRECT(device_pointer->base,partition_data_offset + 0x0A)) << 16) | ((unsigned short int) IORD_16DIRECT(device_pointer->base,partition_data_offset + 0x08)); - partition_size = (((unsigned short int) IORD_16DIRECT(device_pointer->base,partition_data_offset + 0x0E)) << 16) | ((unsigned short int) IORD_16DIRECT(device_pointer->base,partition_data_offset + 0x0C)); - - // Check if the partition is valid - if (partition_size > 0) - { - result = true; - fat_partition_size_in_512_byte_sectors = partition_size; - fat_partition_offset_in_512_byte_sectors = offset; - break; - } - } - } - } - } - - return result; -} - - -static bool Read_File_Record_At_Offset(int offset, t_file_record *record, unsigned int cluster_index, unsigned int sector_in_cluster) -// This function reads a file record -{ - bool result = false; - if (((offset & 0x01f) == 0) && (alt_up_sd_card_is_Present()) && (is_sd_card_formated_as_FAT16)) - { - int counter; - - for (counter = 0; counter < 8; counter++) - { - record->name[counter] = (char) IORD_8DIRECT(device_pointer->base, offset+counter); - } - for (counter = 0; counter < 3; counter++) - { - record->extension[counter] = (char) IORD_8DIRECT(device_pointer->base, offset+counter+8); - } - record->attributes = (char) IORD_8DIRECT(device_pointer->base, offset+11); - /* Ignore reserved bytes at locations 12 and 13. */ - record->create_time = (unsigned short int) IORD_16DIRECT(device_pointer->base, offset+14); - record->create_date = (unsigned short int) IORD_16DIRECT(device_pointer->base, offset+16); - record->last_access_date = (unsigned short int) IORD_16DIRECT(device_pointer->base, offset+18); - /* Ignore reserved bytes at locations 20 and 21. */ - record->last_modified_time = (unsigned short int) IORD_16DIRECT(device_pointer->base, offset+22); - record->last_modified_date = (unsigned short int) IORD_16DIRECT(device_pointer->base, offset+24); - record->start_cluster_index = (unsigned short int) IORD_16DIRECT(device_pointer->base, offset+26); - record->file_size_in_bytes = (unsigned int) IORD_32DIRECT(device_pointer->base, offset+28); - record->file_record_cluster = cluster_index; - record->file_record_sector_in_cluster = sector_in_cluster; - record->file_record_offset = offset; - result = true; - } - return result; -} - - -static bool Write_File_Record_At_Offset(int offset, t_file_record *record) -// This function writes a file record at a given offset. The offset is given in bytes. -{ - bool result = false; - if (((offset & 0x01f) == 0) && (alt_up_sd_card_is_Present()) && (is_sd_card_formated_as_FAT16)) - { - int counter; - - for (counter = 0; counter < 8; counter=counter+2) - { - short int two_chars = (short int) record->name[counter+1]; - two_chars = two_chars << 8; - two_chars = two_chars | record->name[counter]; - IOWR_16DIRECT(device_pointer->base, offset+counter, two_chars); - } - for (counter = 0; counter < 3; counter++) - { - IOWR_8DIRECT(device_pointer->base, offset+counter+8, record->extension[counter]); - } - IOWR_8DIRECT(device_pointer->base, offset+11, record->attributes); - /* Ignore reserved bytes at locations 12 and 13. */ - IOWR_16DIRECT(device_pointer->base, offset+14, record->create_time); - IOWR_16DIRECT(device_pointer->base, offset+16, record->create_date); - IOWR_16DIRECT(device_pointer->base, offset+18, record->last_access_date); - /* Ignore reserved bytes at locations 20 and 21. */ - IOWR_16DIRECT(device_pointer->base, offset+22, record->last_modified_time); - IOWR_16DIRECT(device_pointer->base, offset+24, record->last_modified_date); - IOWR_16DIRECT(device_pointer->base, offset+26, record->start_cluster_index); - IOWR_32DIRECT(device_pointer->base, offset+28, record->file_size_in_bytes); - current_sector_modified = true; - result = true; - } - return result; -} - - -static bool Check_for_DOS_FAT(int FAT_partition_start_sector) -// This function reads the boot sector for the FAT file system on the SD Card. -// The offset_address should point to the sector on the card where the boot sector is located. -// The sector number is specified either in the master Boot Record, or is 0 by default for a purely FAT -// based file system. If the specified sector contains a FAT boot sector, then this function prints the -// relevant information and returns 1. Otherwise, it returns 0. -{ - bool result = false; - int counter = 0; - short int end; - - result = Read_Sector_Data(0, FAT_partition_start_sector); - end = (short int) IORD_16DIRECT(device_pointer->base, 0x1fe); - if (((end & 0x0000ffff) == 0x0000aa55) && (result)) - { - int num_clusters = 0; - - boot_sector_data.jump_instruction[0] = (char) IORD_8DIRECT(device_pointer->base, 0); - boot_sector_data.jump_instruction[1] = (char) IORD_8DIRECT(device_pointer->base, 1); - boot_sector_data.jump_instruction[2] = (char) IORD_8DIRECT(device_pointer->base, 2); - for (counter = 0; counter < 8; counter++) - { - boot_sector_data.OEM_name[counter] = (char) IORD_8DIRECT(device_pointer->base, 3+counter); - } - boot_sector_data.sector_size_in_bytes = (((unsigned char) IORD_8DIRECT(device_pointer->base, 12)) << 8 ) | ((char) IORD_8DIRECT(device_pointer->base, 11)); - boot_sector_data.sectors_per_cluster = ((unsigned char) IORD_8DIRECT(device_pointer->base, 13)); - boot_sector_data.reserved_sectors = ((unsigned short int) IORD_16DIRECT(device_pointer->base, 14)); - boot_sector_data.number_of_FATs = ((unsigned char) IORD_8DIRECT(device_pointer->base, 16)); - boot_sector_data.max_number_of_dir_entires = (((unsigned short int)(((unsigned char) IORD_8DIRECT(device_pointer->base, 18)))) << 8 ) | ((unsigned char) IORD_8DIRECT(device_pointer->base, 17)); - boot_sector_data.number_of_sectors_in_partition = (((unsigned short int)(((unsigned char) IORD_8DIRECT(device_pointer->base, 20)))) << 8 ) | ((unsigned char) IORD_8DIRECT(device_pointer->base, 19)); - boot_sector_data.media_descriptor = ((unsigned char) IORD_8DIRECT(device_pointer->base, 21)); - boot_sector_data.number_of_sectors_per_table = ((unsigned short int) IORD_16DIRECT(device_pointer->base, 22)); - boot_sector_data.number_of_sectors_per_track = ((unsigned short int) IORD_16DIRECT(device_pointer->base, 24)); - boot_sector_data.number_of_heads = ((unsigned short int) IORD_16DIRECT(device_pointer->base, 26)); - boot_sector_data.number_of_hidden_sectors = ((unsigned int) IORD_32DIRECT(device_pointer->base, 28)); - boot_sector_data.total_sector_count_if_above_32MB = ((unsigned int) IORD_32DIRECT(device_pointer->base, 32)); - boot_sector_data.drive_number = ((unsigned char) IORD_8DIRECT(device_pointer->base, 36)); - boot_sector_data.current_head = ((unsigned char) IORD_8DIRECT(device_pointer->base, 37)); - boot_sector_data.boot_signature = ((unsigned char) IORD_8DIRECT(device_pointer->base, 38)); - boot_sector_data.first_fat_sector_offset = boot_sector_data.reserved_sectors; - boot_sector_data.second_fat_sector_offset = boot_sector_data.first_fat_sector_offset + boot_sector_data.number_of_sectors_per_table; - boot_sector_data.root_directory_sector_offset = boot_sector_data.second_fat_sector_offset + boot_sector_data.number_of_sectors_per_table; - boot_sector_data.data_sector_offset = boot_sector_data.root_directory_sector_offset + (32*boot_sector_data.max_number_of_dir_entires / boot_sector_data.sector_size_in_bytes); - - if (boot_sector_data.number_of_sectors_in_partition > 0) - { - num_clusters = (boot_sector_data.number_of_sectors_in_partition / boot_sector_data.sectors_per_cluster); - } - else - { - num_clusters = (boot_sector_data.total_sector_count_if_above_32MB / boot_sector_data.sectors_per_cluster); - } - if (num_clusters < 4087) - { - boot_sector_data.bits_for_cluster_index = 12; - } - else if (num_clusters <= 65517) - { - boot_sector_data.bits_for_cluster_index = 16; - } - else - { - boot_sector_data.bits_for_cluster_index = 32; - } - - for (counter = 0; counter < 4; counter++) - { - boot_sector_data.volume_id[counter] = ((char) IORD_8DIRECT(device_pointer->base, 39+counter)); - } - for (counter = 0; counter < 11; counter++) - { - boot_sector_data.volume_label[counter] = ((char) IORD_8DIRECT(device_pointer->base, 43+counter)); - } - for (counter = 0; counter < 8; counter++) - { - boot_sector_data.file_system_type[counter] = ((char) IORD_8DIRECT(device_pointer->base, 54+counter)); - } - // Clear file records - for (counter = 0; counter < MAX_FILES_OPENED; counter++) - { - active_files[counter].in_use = false; - } - result = true; - } - else - { - result = false; - } - return result; -} - - -static bool Look_for_FAT16(void) -// Read the SD card to determine if it contains a FAT16 partition. -{ - bool result = false; - - if (alt_up_sd_card_is_Present()) - { - short int csd_file_format = *CSD_register_w0; - - fat_partition_offset_in_512_byte_sectors = 0; - fat_partition_size_in_512_byte_sectors = 0; - - if (((csd_file_format & 0x8000) == 0) && ((csd_file_format & 0x0c00) != 0x0c00)) - { - if ((csd_file_format & 0x0c00) == 0x0400) - { - /* SD Card contains files stored in a DOS FAT (floppy like) file format, without a partition table */ - result = Check_for_DOS_FAT(0); - } - if ((csd_file_format & 0x0c00) == 0x0000) - { - /* SD Card contains files stored in a Hard disk-like file format that contains a partition table */ - if (Check_for_Master_Boot_Record()) - { - result = Check_for_DOS_FAT(fat_partition_offset_in_512_byte_sectors); - } - } - if (result == true) - { - // Accept only FAT16, not FAT12. - if (boot_sector_data.bits_for_cluster_index != 16) - { - result = false; - } - else - { - fat_partition_size_in_512_byte_sectors = boot_sector_data.number_of_sectors_in_partition; - } - } - } - } - return result; -} - - -static void filename_to_upper_case(char *file_name) -// Change file name to upper case. -{ - int index; - int length = strlen(file_name); - - for (index = 0; index < length; index++) - { - if ((file_name[index] >= 'a') && (file_name[index] <= 'z')) - { - file_name[index] = (file_name[index] - 'a') + 'A'; - } - } -} - - -static bool check_file_name_for_FAT16_compliance(char *file_name) -// Check if the file complies with FAT16 naming convention. -{ - int length = strlen(file_name); - int index; - int last_dir_break_position = -1; - int last_period = -1; - bool result = true; - - for(index = 0; index < length; index++) - { - if ((file_name[index] == ' ') || - ((last_dir_break_position == (index - 1)) && ((file_name[index] == '\\') || (file_name[index] == '/'))) || - ((index - last_period == 9) && (file_name[index] != '.')) || - ((last_dir_break_position != last_period) && (index - last_period > 3) && - (file_name[index] != '\\') && (file_name[index] != '/')) - ) - { - result = false; - break; - } - if ((file_name[index] == '\\') || (file_name[index] == '/')) - { - last_period = index; - last_dir_break_position = index; - } - if (file_name[index] == '.') - { - last_period = index; - } - } - if ((file_name[length-1] == '\\') || (file_name[length-1] == '/')) - { - result = false; - } - return result; -} - - -static int get_dir_divider_location(char *name) -// Find a directory divider location. -{ - int index = 0; - int length = strlen(name); - - for(index = 0; index < length; index++) - { - if ((name[index] == '\\') || (name[index] == '/')) - { - break; - } - } - - if (index == length) - { - index = -1; - } - - return index; -} - - -static bool match_file_record_to_name_ext(t_file_record *file_record, char *name, char *extension) -/* See if the given name and extension match the file record. Return true if this is so, false otherwise. */ -{ - bool match = true; - int index; - - for (index = 0; index < 8; index++) - { - if (CHAR_TO_UPPER(file_record->name[index]) != CHAR_TO_UPPER(name[index])) - { - match = false; - break; - } - } - for (index = 0; index < 3; index++) - { - if (CHAR_TO_UPPER(file_record->extension[index]) != CHAR_TO_UPPER(extension[index])) - { - match = false; - break; - } - } - return match; -} - - -static bool get_home_directory_cluster_for_file(char *file_name, int *home_directory_cluster, t_file_record *file_record) -// Scan the directories in given in the file name and find the root directory for the file. -{ - bool result = false; - int home_dir_cluster = 0; - int location, index; - int start_location = 0; - - /* Get Next Directory. */ - location = get_dir_divider_location( file_name ); - while (location > 0) - { - char name[8] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }; - char extension[3] = { ' ', ' ', ' ' }; - int ext_index = -1; - int new_cluster = home_dir_cluster; - - // Get the name of the directory in name/extension format. - for (index = 0; index < location; index++) - { - if (file_name[index+start_location] == '.') - { - ext_index = index; - } - else if (ext_index < 0) - { - name[index] = file_name[index+start_location]; - } - else - { - extension[index-ext_index] = file_name[index+start_location]; - } - } - - if (home_dir_cluster == 0) - { - /* We are in the root directory. Scan the directory (of predefined size) and see if you can find the specified file. */ - int max_root_dir_sectors = ((32*boot_sector_data.max_number_of_dir_entires) / boot_sector_data.sector_size_in_bytes); - int sector_index; - - for (sector_index = 0; sector_index < max_root_dir_sectors; sector_index++) - { - if (Read_Sector_Data(sector_index+boot_sector_data.root_directory_sector_offset, fat_partition_offset_in_512_byte_sectors)) - { - int file_counter; - - for (file_counter = 0; file_counter < 16; file_counter++) - { - - // Read file record. - Read_File_Record_At_Offset(file_counter*32, file_record, 0, sector_index); - if ((file_record->name[0] != 0xe5) && (file_record->name[0] != 0x00)) - { - bool match = match_file_record_to_name_ext(file_record, name, extension); - if (match) - { - new_cluster = file_record->start_cluster_index; - file_record->file_record_cluster = 1; // Home directory is a subdirectory in the root directory. - break; - } - } - } - } - else - { - break; - } - if (new_cluster != home_dir_cluster) - { - break; - } - } - if (new_cluster != home_dir_cluster) - { - // A valid directory is found, so go to it. - home_dir_cluster = new_cluster; - start_location = start_location+location+1; - } - else - { - // Directory path is invalid. - return false; - } - } else { - // This is a subdirectory that can have any number of elements. So scan through it as though it was a file - // and see if you can find the directory of interest. - int cluster = home_dir_cluster; - - do { - int start_sector = ( cluster - 2 ) * ( boot_sector_data.sectors_per_cluster ) + boot_sector_data.data_sector_offset; - int sector_index; - - for (sector_index = 0; sector_index < boot_sector_data.sectors_per_cluster; sector_index++) - { - if (Read_Sector_Data(sector_index + start_sector, fat_partition_offset_in_512_byte_sectors)) - { - int file_counter; - - for (file_counter = 0; file_counter < 16; file_counter++) - { - // Read file record. - Read_File_Record_At_Offset(file_counter*32, file_record, cluster, sector_index); - if ((file_record->name[0] != 0xe5) && (file_record->name[0] != 0x00)) - { - bool match = match_file_record_to_name_ext(file_record, name, extension); - if (match) - { - new_cluster = file_record->start_cluster_index; - break; - } - } - } - } - else - { - break; - } - if (new_cluster != home_dir_cluster) - { - break; - } - } - // If this is the end of the cluster and the directory has not been found, then see if there is another cluster - // that holds data for the current directory. - if (new_cluster == home_dir_cluster) - { - unsigned short int next_cluster; - - if (get_cluster_flag(new_cluster, &next_cluster)) - { - // The directory needs to be expanded to store more files. - if ((next_cluster & 0x0000fff8) == 0x0000fff8) - { - return false; - } - new_cluster = (next_cluster & 0x0000fff8); - } - else - { - // Directory path is invalid. - return false; - } - } - } while ((cluster < 0x0000fff8) && (new_cluster == home_dir_cluster)); - if (new_cluster != home_dir_cluster) - { - // A valid directory is found, so go to it. - home_dir_cluster = new_cluster; - start_location = start_location+location+1; - } - else - { - // Directory path is invalid. - return false; - } - } - location = get_dir_divider_location(&(file_name[start_location])); - if (location < 0) - { - // Directory has been located. - result = true; - } - } - - *home_directory_cluster = home_dir_cluster; - if (home_dir_cluster == 0) - { - file_record->file_record_cluster = 0; // Home directory is the root directory. - result = true; - } - return result; -} - - -static bool find_file_in_directory(int directory_start_cluster, char *file_name, t_file_record *file_record) -// Given a cluster and a file name, check if the file already exists. Return the file record if the file is found. -{ - int location = get_dir_divider_location( file_name ); - int last_dir_separator = 0; - char name[8] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }; - char extension[3] = { ' ', ' ', ' ' }; - int ext_index = -1; - int cluster = directory_start_cluster; - int index; - int length = strlen(file_name); - bool result = false; - - // Skip through all directory separators. - while (location > 0) - { - last_dir_separator = last_dir_separator+location+1; - location = get_dir_divider_location( &(file_name[last_dir_separator]) ); - } - - // Get the name of the file in name/extension format. - for (index = last_dir_separator; index < length; index++) - { - if (file_name[index] == '.') - { - ext_index = index; - } - else if (ext_index < 0) - { - name[index-last_dir_separator] = file_name[index]; - } - else - { - extension[index-ext_index-1] = file_name[index]; - } - } - - // Look for the file. - if (directory_start_cluster == 0) - { - /* We are in the root directory. Scan the directory (of predefined size) and see if you can find the specified file. */ - int max_root_dir_sectors = ((32*boot_sector_data.max_number_of_dir_entires) / boot_sector_data.sector_size_in_bytes); - int sector_index; - - for (sector_index = 0; sector_index < max_root_dir_sectors; sector_index++) - { - if (Read_Sector_Data( sector_index + boot_sector_data.root_directory_sector_offset, - fat_partition_offset_in_512_byte_sectors)) - { - int file_counter; - - for (file_counter = 0; file_counter < 16; file_counter++) - { - // Read file record. - Read_File_Record_At_Offset(file_counter*32, file_record, 0, sector_index); - if ((file_record->name[0] != 0xe5) && (file_record->name[0] != 0x00)) - { - bool match = match_file_record_to_name_ext(file_record, name, extension); - - if (match) - { - result = true; - break; - } - } - } - } - else - { - break; - } - if (result) - { - break; - } - } - } - else - { - do { - int start_sector = ( cluster - 2 ) * ( boot_sector_data.sectors_per_cluster ) + boot_sector_data.data_sector_offset; - int sector_index; - - for (sector_index = 0; sector_index < boot_sector_data.sectors_per_cluster; sector_index++) - { - if (Read_Sector_Data(sector_index + start_sector, fat_partition_offset_in_512_byte_sectors)) - { - int file_counter; - - for (file_counter = 0; file_counter < 16; file_counter++) - { - // Read file record. - Read_File_Record_At_Offset(file_counter*32, file_record, cluster, sector_index); - if ((file_record->name[0] != 0xe5) && (file_record->name[0] != 0x00)) - { - bool match = match_file_record_to_name_ext(file_record, name, extension); - - if (match) - { - result = true; - break; - } - } - } - } - else - { - break; - } - if (result) - { - break; - } - } - // If this is the end of the cluster and the file has not been found, then see if there is another cluster - // that holds data for the current directory. - if (result == false) - { - unsigned short int new_cluster; - - if (get_cluster_flag(cluster, &new_cluster)) - { - // The directory needs to be expanded to store more files. - if ((new_cluster & 0x0000fff8) == 0x0000fff8) - { - return false; - } - cluster = (new_cluster & 0x0000fff8); - } - else - { - // Directory path is invalid. - return false; - } - } - } while ((cluster < 0x0000fff8) && (result == false)); - } - - return result; -} - - -static bool find_first_empty_cluster(unsigned int *cluster_number) -// Find the first empty cluster. It will be marked by a 0 entry in the File Allocation Table. -{ - unsigned int sector = boot_sector_data.first_fat_sector_offset; - unsigned int cluster_index = 2; - short int cluster = -1; - bool result = false; - unsigned max_cluster_index = 0; - unsigned int non_data_sectors = boot_sector_data.data_sector_offset; - unsigned int less_than_32 = boot_sector_data.number_of_sectors_in_partition; - unsigned int greater_than_32 = boot_sector_data.total_sector_count_if_above_32MB; - - if (less_than_32 > greater_than_32) - { - max_cluster_index = ((less_than_32 - non_data_sectors) / boot_sector_data.sectors_per_cluster) + 1; - } - else - { - max_cluster_index = ((greater_than_32 - non_data_sectors) / boot_sector_data.sectors_per_cluster) + 1; - } - // Find an empty cluster for the file. - while (sector != boot_sector_data.second_fat_sector_offset) - { - if (Read_Sector_Data( sector, fat_partition_offset_in_512_byte_sectors)) - { - do { - cluster = ((unsigned short int) IORD_16DIRECT(device_pointer->base, 2*(cluster_index % 256))); - if (cluster == 0) - { - // Free cluster found. - break; - } - else - { - cluster_index++; - } - } while ((cluster_index % 256) != 0); - } - if (cluster == 0) - { - break; - } - sector++; - } - if ((cluster == 0) && (cluster <= max_cluster_index)) - { - *cluster_number = cluster_index; - result = true; - } - return result; -} - - -static int find_first_empty_record_in_a_subdirectory(int start_cluster_index) -// Search for a free spot in a subdirectory. Return an encoded location for the file record. -{ - int result = -1; - int cluster = start_cluster_index; - do { - int start_sector = ( cluster - 2 ) * ( boot_sector_data.sectors_per_cluster ) + boot_sector_data.data_sector_offset; - int sector_index; - - for (sector_index = 0; sector_index < boot_sector_data.sectors_per_cluster; sector_index++) - { - if (Read_Sector_Data(sector_index + start_sector, fat_partition_offset_in_512_byte_sectors)) - { - int file_counter; - - for (file_counter = 0; file_counter < 16; file_counter++) - { - unsigned short int leading_char; - - // Read file record. - leading_char = ((unsigned char) IORD_8DIRECT(device_pointer->base, file_counter*32)); - if ((leading_char == 0x00e5) || (leading_char == 0)) - { - result = (cluster) | ((sector_index*16 + file_counter) << 16); - return result; - } - } - } - else - { - break; - } - } - // If this is the end of the cluster and the file has not been found, then see if there is another cluster - // that holds data for the current directory. - if (result < 0) - { - unsigned short int new_cluster; - if (get_cluster_flag(cluster, &new_cluster)) - { - // The directory needs to be expanded to store more files. - if ((new_cluster & 0x0000fff8) == 0x0000fff8) - { - unsigned int new_dir_cluster; - if (find_first_empty_cluster(&new_dir_cluster)) - { - // Add the new cluster to the linked list of the given directory. - if (mark_cluster(cluster, ((short int) (new_dir_cluster)), true) && - mark_cluster(new_dir_cluster, ((short int) (0xffff)), true) && - mark_cluster(cluster, ((short int) (new_dir_cluster)), false) && - mark_cluster(new_dir_cluster, ((short int) (0xffff)), false)) - { - Save_Modified_Sector(); - // The new file will begin at the first entry of the directory. - result = new_dir_cluster; - } - } - cluster = (new_cluster & 0x0000fff8); - } - } - else - { - // Error encountered. - result = -1; - } - } - } while ((cluster < 0x0000fff8) && (result == -1)); - return result; -} - - -static int find_first_empty_record_in_root_directory() -// Find a first unused record location to use. Return -1 if none is found. -{ - int max_root_dir_sectors = ((32*boot_sector_data.max_number_of_dir_entires) / boot_sector_data.sector_size_in_bytes); - int sector_index; - int result = -1; - - for (sector_index = 0; sector_index < max_root_dir_sectors; sector_index++) - { - if (Read_Sector_Data( sector_index + boot_sector_data.root_directory_sector_offset, - fat_partition_offset_in_512_byte_sectors)) - { - int file_counter; - - for (file_counter = 0; file_counter < 16; file_counter++) - { - unsigned short int leading_char; - - // Read first character of the file record. - leading_char = ((unsigned char) IORD_8DIRECT(device_pointer->base, file_counter*32)); - if ((leading_char == 0x00e5) || (leading_char == 0)) - { - result = (sector_index*16 + file_counter) << 16; - return result; - } - } - } - else - { - break; - } - } - return result; -} - -static void convert_filename_to_name_extension(char *filename, char *name, char *extension) -// This function converts the file name into a name . extension format. -{ - int counter; - int local = 0; - - for(counter = 0; counter < 8; counter++) - { - if (filename[local] != '.') - { - name[counter] = filename[local]; - if (filename[local] != 0) local++; - } - else - { - name[counter] = ' '; - } - } - if (filename[local] == '.') local++; - for(counter = 0; counter < 3; counter++) - { - if (filename[local] != 0) - { - extension[counter] = filename[local]; - local++; - } - else - { - extension[counter] = ' '; - } - } - -} - -static bool create_file(char *name, t_file_record *file_record, t_file_record *home_dir) -// Create a file in a given directory. Expand the directory if needed. -{ - unsigned int cluster_number; - bool result = false; - - if (find_first_empty_cluster(&cluster_number)) - { - int record_index; - - if (home_dir->file_record_cluster == 0) - { - // Put a file in the root directory. - record_index = find_first_empty_record_in_root_directory(); - } - else - { - // Put a file in a subdirectory. - record_index = find_first_empty_record_in_a_subdirectory(home_dir->start_cluster_index); - } - if (record_index >= 0) - { - unsigned int file_record_sector; - int location = get_dir_divider_location( name ); - int last_dir_separator = 0; - - // Skip through all directory separators. - while (location > 0) - { - last_dir_separator = last_dir_separator+location+1; - location = get_dir_divider_location( &(name[last_dir_separator]) ); - } - - convert_filename_to_name_extension(&(name[last_dir_separator]), (char *)file_record->name, (char *)file_record->extension); - - file_record->attributes = 0; - file_record->create_time = 0; - file_record->create_date = 0; - file_record->last_access_date = 0; - file_record->last_modified_time = 0; - file_record->last_modified_date = 0; - file_record->start_cluster_index = cluster_number; - file_record->file_size_in_bytes = 0; - file_record->current_cluster_index = cluster_number; - file_record->current_sector_in_cluster = 0; - file_record->current_byte_position = 0; - file_record->file_record_cluster = record_index & 0x0000ffff; - file_record->file_record_sector_in_cluster = ((record_index >> 16) & 0x0000ffff) / 16; - file_record->file_record_offset = (((record_index >> 16) & 0x0000ffff) % 16)*32; - file_record->home_directory_cluster = home_dir->start_cluster_index; - file_record->in_use = true; - file_record->modified = true; - // Now write the record at the specified location. - file_record_sector = (file_record->file_record_cluster == 0) ? - (boot_sector_data.root_directory_sector_offset + file_record->file_record_sector_in_cluster): - (boot_sector_data.data_sector_offset + (file_record->file_record_cluster-2)*boot_sector_data.sectors_per_cluster + - file_record->file_record_sector_in_cluster); - - if (Read_Sector_Data(file_record_sector, fat_partition_offset_in_512_byte_sectors)) - { - if (Write_File_Record_At_Offset(file_record->file_record_offset, file_record)) - { - Save_Modified_Sector(); - // Mark the first cluster of the file as the last cluster at first. - mark_cluster(cluster_number, ((short int) (0xffff)), true); - if (mark_cluster(cluster_number, ((short int) (0xffff)), false)) - { - result = true; - } - } - } - } - - } - return result; -} - - -static void copy_file_record_name_to_string(t_file_record *file_record, char *file_name) -/* Copy a file name from the file record to a given string */ -{ - int index; - int flength = 0; - - /* Copy file name.*/ - for (index = 0; index < 8; index++) - { - if (file_record->name[index] != ' ') - { - file_name[flength] = file_record->name[index]; - flength = flength + 1; - } - } - if (file_record->extension[0] != ' ') - { - file_name[flength] = '.'; - flength = flength + 1; - for (index = 0; index < 3; index++) - { - if (file_record->extension[index] != ' ') - { - file_name[flength] = file_record->extension[index]; - flength = flength + 1; - } - } - } - file_name[flength] = 0; -} -#endif //SD_RAW_IFACE - -/////////////////////////////////////////////////////////////////////////// -// Direct functions -/////////////////////////////////////////////////////////////////////////// - - -alt_up_sd_card_dev* alt_up_sd_card_open_dev(const char* name) -{ - // find the device from the device list - // (see altera_hal/HAL/inc/priv/alt_file.h - // and altera_hal/HAL/src/alt_find_dev.c - // for details) - alt_up_sd_card_dev *dev = (alt_up_sd_card_dev *) alt_find_dev(name, &alt_dev_list); - - if (dev != NULL) - { - aux_status_register = ((short int *) SD_CARD_AUX_STATUS(dev->base)); - status_register = ((int *) SD_CARD_STATUS(dev->base)); - CSD_register_w0 = ((short int *) SD_CARD_CSD(dev->base, 0)); - command_register = ((short int *) SD_CARD_COMMAND(dev->base)); - command_argument_register = ((int *) SD_CARD_ARGUMENT(dev->base)); - buffer_memory = (char *) SD_CARD_BUFFER(dev->base, 0); - device_pointer = dev; - initialized = false; -#ifndef SD_RAW_IFACE - is_sd_card_formated_as_FAT16 = false; - search_data.valid = false; -#endif - } - return dev; -} - - -bool alt_up_sd_card_is_Present(void) -// Check if there is an SD Card insterted into the SD Card socket. -{ - bool result = false; - - if ((device_pointer != NULL) && ((IORD_16DIRECT(aux_status_register,0) & 0x02) != 0)) - { - result = true; - } - else if (initialized == true) - { - int index; - - initialized = false; -#ifndef SD_RAW_IFACE - search_data.valid = false; - is_sd_card_formated_as_FAT16 = false; - - for(index = 0; index < MAX_FILES_OPENED; index++) - { - active_files[index].in_use = false; - active_files[index].modified = false; - } -#endif - } - return result; -} - -#ifndef SD_RAW_IFACE -bool alt_up_sd_card_is_FAT16(void) -/* This function reads the SD card data in an effort to determine if the card is formated as a FAT16 - * volume. Please note that FAT12 has a similar format, but will not be supported by this driver. - * If the card contains a FAT16 volume, the local data structures will be initialized to allow reading and writing - * to the SD card as though it was a hard drive. - */ -{ - bool result = false; - - if (alt_up_sd_card_is_Present()) - { - // Check if an SD Card is in the SD Card slot. - if (initialized == false) - { - // Now determine if the card is formatted as FAT 16. - is_sd_card_formated_as_FAT16 = Look_for_FAT16(); - initialized = is_sd_card_formated_as_FAT16; - search_data.valid = false; - } - result = is_sd_card_formated_as_FAT16; - } - else - { - // If not then you may as well not open the device. - initialized = false; - is_sd_card_formated_as_FAT16 = false; - } - - return result; -} - - -short int alt_up_sd_card_find_first(char *directory_to_search_through, char *file_name) -/* This function sets up a search algorithm to go through a given directory looking for files. - * If the search directory is valid, then the function searches for the first file it finds. - * Inputs: - * directory_to_search_through - name of the directory to search through - * file_name - an array to store a name of the file found. Must be 13 bytes long (12 bytes for file name and 1 byte of NULL termination). - * Outputs: - * 0 - success - * 1 - invalid directory - * 2 - No card or incorrect card format. - * - * To specify a directory give the name in a format consistent with the following regular expression: - * [{[valid_chars]+}/]*. - * - * In other words, give a path name starting at the root directory, where each directory name is followed by a '/'. - * Then, append a '.' to the directory name. Examples: - * "." - look through the root directory - * "first/." - look through a directory named "first" that is located in the root directory. - * "first/sub/." - look through a directory named "sub", that is located within the subdirectory named "first". "first" is located in the root directory. - * Invalid examples include: - * "/.", "/////." - this is not the root directory. - * "/first/." - the first character may not be a '/'. - */ -{ - short int result = 2; - if ((alt_up_sd_card_is_Present()) && (is_sd_card_formated_as_FAT16)) - { - int home_directory_cluster; - t_file_record file_record; - - if (get_home_directory_cluster_for_file(directory_to_search_through, &home_directory_cluster, &file_record)) - { - search_data.directory_root_cluster = home_directory_cluster; - search_data.current_cluster_index = home_directory_cluster; - search_data.current_sector_in_cluster = 0; - search_data.file_index_in_sector = -1; - search_data.valid = true; - result = alt_up_sd_card_find_next(file_name); - } - else - { - result = 1; - } - } - return result; -} - - -short int alt_up_sd_card_find_next(char *file_name) -/* This function searches for the next file in a given directory, as specified by the find_first function. - * Inputs: - * file_name - an array to store a name of the file found. Must be 13 bytes long (12 bytes for file name and 1 byte of NULL termination). - * Outputs: - * -1 - end of directory. - * 0 - success - * 2 - No card or incorrect card format. - * 3 - find_first has not been called successfully. - */ -{ - short int result = 2; - if ((alt_up_sd_card_is_Present()) && (is_sd_card_formated_as_FAT16)) - { - if (search_data.valid) - { - t_file_record file_record; - int cluster = search_data.current_cluster_index; - - if (cluster == 0) - { - // Searching through the root directory - int max_root_dir_sectors = ((32*boot_sector_data.max_number_of_dir_entires) / boot_sector_data.sector_size_in_bytes); - int sector_index = search_data.current_sector_in_cluster; - int file_counter = search_data.file_index_in_sector+1; - - for (; sector_index < max_root_dir_sectors; sector_index++) - { - if (Read_Sector_Data( sector_index + boot_sector_data.root_directory_sector_offset, - fat_partition_offset_in_512_byte_sectors)) - { - for (; file_counter < 16; file_counter++) - { - if (Read_File_Record_At_Offset(file_counter*32, &file_record, 0, sector_index)) - { - if ((file_record.name[0] != 0) && (file_record.name[0] != 0xe5)) - { - /* Update search structure. */ - search_data.file_index_in_sector = file_counter; - search_data.current_sector_in_cluster = sector_index; - - /* Copy file name.*/ - copy_file_record_name_to_string(&file_record, file_name); - return 0; - } - } - } - file_counter = 0; - } - else - { - break; - } - } - result = -1; - } - else - { - int file_counter = search_data.file_index_in_sector+1; - do - { - int start_sector = ( cluster - 2 ) * ( boot_sector_data.sectors_per_cluster ) + boot_sector_data.data_sector_offset; - int sector_index = search_data.current_sector_in_cluster; - - for (; sector_index < boot_sector_data.sectors_per_cluster; sector_index++) - { - if (Read_Sector_Data(sector_index + start_sector, fat_partition_offset_in_512_byte_sectors)) - { - for (; file_counter < 16; file_counter++) - { - if (Read_File_Record_At_Offset(file_counter*32, &file_record, cluster, sector_index)) - { - if ((file_record.name[0] != 0) && (file_record.name[0] != 0xe5)) - { - /* Update search structure. */ - search_data.current_cluster_index = cluster; - search_data.file_index_in_sector = file_counter; - search_data.current_sector_in_cluster = sector_index; - - /* Copy file name.*/ - copy_file_record_name_to_string(&file_record, file_name); - return 0; - } - } - } - file_counter = 0; - } - else - { - break; - } - } - // If this is the end of the cluster and the file has not been found, then see if there is another cluster - // that holds data for the current directory. - if (sector_index >= boot_sector_data.sectors_per_cluster) - { - unsigned short int new_cluster; - - if (get_cluster_flag(cluster, &new_cluster)) - { - if ((new_cluster & 0x0000fff8) == 0x0000fff8) - { - result = -1; - search_data.valid = false; - } - cluster = ((new_cluster) & 0x0000fff8); - } - else - { - // Error encountered. - result = -1; - } - } - } while (cluster < 0x0000fff8); - } - } - else - { - // Call Find_First first. - result = 3; - } - } - return result; -} - - -short int alt_up_sd_card_fopen(char *name, bool create) -/* This function reads the SD card data in an effort to determine if the card is formated as a FAT16 - * volume. Please note that FAT12 has a similar format, but will not be supported by this driver. - * - * Inputs: - * name - a file name including a directory, relative to the root directory - * create - a flag set to true to create a file if it does not already exist - * Output: - * An index to the file record assigned to the specified file. -1 is returned if the file could not be opened. - * Return -2 if the specified file has already been opened previously. - */ -{ - short int file_record_index = -1; - - if ((alt_up_sd_card_is_Present()) && (is_sd_card_formated_as_FAT16)) - { - unsigned int home_directory_cluster = 0; - t_file_record home_dir; - - /* First check the file name format. It should not be longer than 12 characters, including a period and the extension. - * Rules: - * - no spaces - * - at most 12 chatacters per name, with a period in 9th position. - * - a / or a \ every at most 12 characters. - */ - filename_to_upper_case(name); - if (check_file_name_for_FAT16_compliance(name)) - { - int index; - - /* Get home directory cluster location for the specified file. 0 means root directory. */ - if (!get_home_directory_cluster_for_file(name, (int *) &home_directory_cluster, &home_dir)) - { - return file_record_index; - } - - /* Find a free file slot to store file specs in. */ - for (index = 0; index < MAX_FILES_OPENED; index++) - { - if (active_files[index].in_use == false) - { - file_record_index = index; - break; - } - } - if (file_record_index >= 0) - { - /* If file record is found, then look for the specified file. If the create flag is set to true - * and the file is not found, then it should be created in the current directory. - */ - - if (find_file_in_directory(home_directory_cluster, name, &(active_files[file_record_index]))) - { - if (create) - { - /* Do not allow overwriting existing files for now. */ - return -1; - } - active_files[file_record_index].current_cluster_index = active_files[file_record_index].start_cluster_index; - active_files[file_record_index].current_sector_in_cluster = 0; - active_files[file_record_index].current_byte_position = 0; - active_files[file_record_index].in_use = true; - active_files[file_record_index].modified = false; - - /* Check if the file has already been opened. */ - for (index = 0; index < MAX_FILES_OPENED; index++) - { - if ((file_record_index != index) && (active_files[index].in_use == true)) - { - if ((active_files[file_record_index].file_record_cluster == active_files[index].file_record_cluster) && - (active_files[file_record_index].file_record_sector_in_cluster == active_files[index].file_record_sector_in_cluster) && - (active_files[file_record_index].file_record_offset == active_files[index].file_record_offset)) - { - // file already in use. - file_record_index = -2; - break; - } - } - } - - } - else if (create) - { - /* Create file if needed. */ - if (create_file(name, &(active_files[file_record_index]), &home_dir)) - { - active_files[file_record_index].in_use = true; - active_files[file_record_index].modified = true; - } - else - { - /* If file creation fails then return an invalid file handle. */ - file_record_index = -1; - } - } - else - { - /* Otherwise the file could not be opened.*/ - file_record_index = -1; - } - } - } - } - - return file_record_index; -} - - -void alt_up_sd_card_set_attributes(short int file_handle, short int attributes) -/* Return file attributes, or -1 if the file_handle is invalid. - */ -{ - if ((file_handle >= 0) && (file_handle < MAX_FILES_OPENED)) - { - if (active_files[file_handle].in_use) - { - active_files[file_handle].attributes = ((char)(attributes & 0x00ff)); - } - } -} - - -short int alt_up_sd_card_get_attributes(short int file_handle) -/* Return file attributes, or -1 if the file_handle is invalid. - */ -{ - short int result = -1; - if ((file_handle >= 0) && (file_handle < MAX_FILES_OPENED)) - { - if (active_files[file_handle].in_use) - { - result = ((active_files[file_handle].attributes) & 0x00ff); - } - } - return result; -} - -short int alt_up_sd_card_read(short int file_handle) -/* Read a single character from a given file. Return -1 if at the end of a file. Any other negative number - * means that the file could not be read. A number between 0 and 255 is an ASCII character read from the SD Card. */ -{ - short int ch = -1; - - if ((file_handle >= 0) && (file_handle < MAX_FILES_OPENED)) - { - if (active_files[file_handle].in_use) - { - if (active_files[file_handle].current_byte_position < active_files[file_handle].file_size_in_bytes) - { - int data_sector = boot_sector_data.data_sector_offset + (active_files[file_handle].current_cluster_index - 2)*boot_sector_data.sectors_per_cluster + - active_files[file_handle].current_sector_in_cluster; - - if ((active_files[file_handle].current_byte_position > 0) && ((active_files[file_handle].current_byte_position % 512) == 0)) - { - // Read in a new sector of data. - if (active_files[file_handle].current_sector_in_cluster == boot_sector_data.sectors_per_cluster - 1) - { - // Go to the next cluster. - unsigned short int next_cluster; - if (get_cluster_flag(active_files[file_handle].current_cluster_index, &next_cluster)) - { - if ((next_cluster & 0x0000fff8) == 0x0000fff8) - { - /* End of file */ - return -1; - } - else - { - active_files[file_handle].current_cluster_index = next_cluster; - active_files[file_handle].current_sector_in_cluster = 0; - data_sector = boot_sector_data.data_sector_offset + (active_files[file_handle].current_cluster_index - 2)*boot_sector_data.sectors_per_cluster + - active_files[file_handle].current_sector_in_cluster; - } - } - else - { - return -2; - } - } - else - { - active_files[file_handle].current_sector_in_cluster = active_files[file_handle].current_sector_in_cluster + 1; - data_sector = data_sector + 1; - } - } - // Reading te first byte of the file. - if (current_sector_index != (data_sector + fat_partition_offset_in_512_byte_sectors)) - { - if (!Read_Sector_Data(data_sector, fat_partition_offset_in_512_byte_sectors)) - { - return -2; - } - } - - ch = (unsigned char) IORD_8DIRECT(buffer_memory, (active_files[file_handle].current_byte_position % 512)); - active_files[file_handle].current_byte_position = active_files[file_handle].current_byte_position + 1; - } - } - } - - return ch; -} - - -bool alt_up_sd_card_write(short int file_handle, char byte_of_data) -/* Write a single character to a given file. Return true if successful, and false otherwise. */ -{ - bool result = false; - - if ((file_handle >= 0) && (file_handle < MAX_FILES_OPENED)) - { - if (active_files[file_handle].in_use) - { - int data_sector = boot_sector_data.data_sector_offset + (active_files[file_handle].current_cluster_index - 2)*boot_sector_data.sectors_per_cluster + - active_files[file_handle].current_sector_in_cluster; - short int buffer_offset = active_files[file_handle].current_byte_position % boot_sector_data.sector_size_in_bytes; - - if (active_files[file_handle].current_byte_position < active_files[file_handle].file_size_in_bytes) - { - if ((active_files[file_handle].current_byte_position > 0) && (buffer_offset == 0)) - { - // Read in a new sector of data. - if (active_files[file_handle].current_sector_in_cluster == boot_sector_data.sectors_per_cluster - 1) - { - // Go to the next cluster. - unsigned short int next_cluster; - if (get_cluster_flag(active_files[file_handle].current_cluster_index, &next_cluster)) - { - if (next_cluster < 0x0000fff8) - { - active_files[file_handle].current_cluster_index = next_cluster; - active_files[file_handle].current_sector_in_cluster = 0; - data_sector = boot_sector_data.data_sector_offset + (active_files[file_handle].current_cluster_index - 2)*boot_sector_data.sectors_per_cluster + - active_files[file_handle].current_sector_in_cluster; - } - } - else - { - return false; - } - } - else - { - active_files[file_handle].current_sector_in_cluster = active_files[file_handle].current_sector_in_cluster + 1; - data_sector = data_sector + 1; - } - } - } - else - { - /* You are adding data to the end of the file, so increment its size and look for an additional data cluster if needed. */ - if ((active_files[file_handle].current_byte_position > 0) && (buffer_offset == 0)) - { - if (active_files[file_handle].current_sector_in_cluster == boot_sector_data.sectors_per_cluster - 1) - { - /* Find a new cluster if possible. */ - unsigned int cluster_number; - - if (find_first_empty_cluster(&cluster_number)) - { - // mark clusters in both File Allocation Tables. - mark_cluster(active_files[file_handle].current_cluster_index, ((unsigned short int) (cluster_number & 0x0000ffff)), true); - mark_cluster(cluster_number, 0xffff, true); - mark_cluster(active_files[file_handle].current_cluster_index, ((unsigned short int) (cluster_number & 0x0000ffff)), false); - mark_cluster(cluster_number, 0xffff, false); - // Change cluster index and sector index to compute a new data sector. - active_files[file_handle].current_cluster_index = cluster_number; - active_files[file_handle].current_sector_in_cluster = 0; - } - else - { - return false; - } - } - else - { - /* Read the next sector in the cluster and modify it. We only need to change the data_sector value. The actual read happens a few lines below. */ - active_files[file_handle].current_sector_in_cluster = active_files[file_handle].current_byte_position / boot_sector_data.sector_size_in_bytes; - } - data_sector = boot_sector_data.data_sector_offset + (active_files[file_handle].current_cluster_index - 2)*boot_sector_data.sectors_per_cluster + - active_files[file_handle].current_sector_in_cluster; - } - } - // Reading a data sector into the buffer. Note that changes to the most recently modified sector will be saved before - // a new sector is read from the SD Card. - if (current_sector_index != data_sector + fat_partition_offset_in_512_byte_sectors) - { - if (!Read_Sector_Data(data_sector, fat_partition_offset_in_512_byte_sectors)) - { - return false; - } - } - // Write a byte of data to the buffer. - IOWR_8DIRECT(buffer_memory, buffer_offset, byte_of_data); - active_files[file_handle].current_byte_position = active_files[file_handle].current_byte_position + 1; - - // Modify the file record only when necessary. - if (active_files[file_handle].current_byte_position >= active_files[file_handle].file_size_in_bytes) - { - active_files[file_handle].file_size_in_bytes = active_files[file_handle].file_size_in_bytes + 1; - active_files[file_handle].modified = true; - } - // Invaldiate the buffer to ensure that the buffer contents are written to the SD card whe nthe file is closed. - current_sector_modified = true; - result = true; - } - } - - return result; -} - - -bool alt_up_sd_card_fclose(short int file_handle) -// This function closes an opened file and saves data to SD Card if necessary. -{ - bool result = false; - if ((alt_up_sd_card_is_Present()) && (is_sd_card_formated_as_FAT16)) - { - if (active_files[file_handle].in_use) - { - if (active_files[file_handle].modified) - { - unsigned int record_sector = active_files[file_handle].file_record_sector_in_cluster; - if (active_files[file_handle].file_record_cluster == 0) - { - record_sector = record_sector + boot_sector_data.root_directory_sector_offset; - } - else - { - record_sector = record_sector + boot_sector_data.data_sector_offset + - (active_files[file_handle].file_record_cluster - 2)*boot_sector_data.sectors_per_cluster; - } - if (Read_Sector_Data(record_sector, fat_partition_offset_in_512_byte_sectors)) - { - if (Write_File_Record_At_Offset(active_files[file_handle].file_record_offset, &(active_files[file_handle]))) - { - // Make sure that the Data has been saved to the SD Card. - result = Save_Modified_Sector(); - } - } - } - active_files[file_handle].in_use = false; - result = true; - } - } - - return result; -} - -#endif //SD_RAW_IFACE diff --git a/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_init.c b/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_init.c index 7317bec..b08f1f7 100644 --- a/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_init.c +++ b/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_init.c @@ -35,7 +35,7 @@ #include -#include "sys/alt_irq.h" +//#include "sys/alt_irq.h" #include "sys/alt_alarm.h" #include "sys/ioctl.h" #include "alt_types.h" diff --git a/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_read.c b/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_read.c index 5657adb..bf4a916 100644 --- a/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_read.c +++ b/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_read.c @@ -35,7 +35,7 @@ #include -#include "sys/alt_irq.h" +//#include "sys/alt_irq.h" #include "sys/alt_alarm.h" #include "sys/ioctl.h" #include "alt_types.h" diff --git a/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_write.c b/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_write.c index cf41ba8..2cfc417 100644 --- a/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_write.c +++ b/software/sys_controller_bsp/drivers/src/altera_avalon_jtag_uart_write.c @@ -35,7 +35,7 @@ #include -#include "sys/alt_irq.h" +//#include "sys/alt_irq.h" #include "sys/alt_alarm.h" #include "sys/ioctl.h" #include "alt_types.h" diff --git a/software/sys_controller_bsp/drivers/src/altera_avalon_timer_sc.c b/software/sys_controller_bsp/drivers/src/altera_avalon_timer_sc.c new file mode 100644 index 0000000..d9a7b85 --- /dev/null +++ b/software/sys_controller_bsp/drivers/src/altera_avalon_timer_sc.c @@ -0,0 +1,110 @@ +/****************************************************************************** +* * +* License Agreement * +* * +* Copyright (c) 2003 Altera Corporation, San Jose, California, USA. * +* All rights reserved. * +* * +* Permission is hereby granted, free of charge, to any person obtaining a * +* copy of this software and associated documentation files (the "Software"), * +* to deal in the Software without restriction, including without limitation * +* the rights to use, copy, modify, merge, publish, distribute, sublicense, * +* and/or sell copies of the Software, and to permit persons to whom the * +* Software is furnished to do so, subject to the following conditions: * +* * +* The above copyright notice and this permission notice shall be included in * +* all copies or substantial portions of the Software. * +* * +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * +* DEALINGS IN THE SOFTWARE. * +* * +* This agreement shall be governed in all respects by the laws of the State * +* of California and by the laws of the United States of America. * +* * +* Altera does not recommend, suggest or require that this reference design * +* file be used in conjunction or combination with any other product. * +******************************************************************************/ + +#include + +#include "sys/alt_alarm.h" +#include "sys/alt_irq.h" + +#include "altera_avalon_timer.h" +#include "altera_avalon_timer_regs.h" + +#include "alt_types.h" +#include "sys/alt_log_printf.h" + +/* + * alt_avalon_timer_sc_irq() is the interrupt handler used for the system + * clock. This is called periodically when a timer interrupt occurs. The + * function first clears the interrupt condition, and then calls the + * alt_tick() function to notify the system that a timer tick has occurred. + * + * alt_tick() increments the system tick count, and updates any registered + * alarms, see alt_tick.c for further details. + */ +#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT +static void alt_avalon_timer_sc_irq (void* base) +#else +static void alt_avalon_timer_sc_irq (void* base, alt_u32 id) +#endif +{ + alt_irq_context cpu_sr; + + /* clear the interrupt */ + IOWR_ALTERA_AVALON_TIMER_STATUS (base, 0); + + /* + * Dummy read to ensure IRQ is negated before the ISR returns. + * The control register is read because reading the status + * register has side-effects per the register map documentation. + */ + IORD_ALTERA_AVALON_TIMER_CONTROL (base); + + /* ALT_LOG - see altera_hal/HAL/inc/sys/alt_log_printf.h */ + ALT_LOG_SYS_CLK_HEARTBEAT(); + + /* + * Notify the system of a clock tick. disable interrupts + * during this time to safely support ISR preemption + */ + cpu_sr = alt_irq_disable_all(); + alt_tick (); + alt_irq_enable_all(cpu_sr); +} + +/* + * alt_avalon_timer_sc_init() is called to initialise the timer that will be + * used to provide the periodic system clock. This is called from the + * auto-generated alt_sys_init() function. + */ + +void alt_avalon_timer_sc_init (void* base, alt_u32 irq_controller_id, + alt_u32 irq, alt_u32 freq) +{ + /* set the system clock frequency */ + + alt_sysclk_init (freq); + + /* set to free running mode */ + + IOWR_ALTERA_AVALON_TIMER_CONTROL (base, + ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | + ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | + ALTERA_AVALON_TIMER_CONTROL_START_MSK); + + /* register the interrupt handler, and enable the interrupt */ +#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT + alt_ic_isr_register(irq_controller_id, irq, alt_avalon_timer_sc_irq, + base, NULL); +#else + alt_irq_register (irq, base, alt_avalon_timer_sc_irq); +#endif +} diff --git a/software/sys_controller_bsp/drivers/src/altera_avalon_timer_ts.c b/software/sys_controller_bsp/drivers/src/altera_avalon_timer_ts.c new file mode 100644 index 0000000..53988f6 --- /dev/null +++ b/software/sys_controller_bsp/drivers/src/altera_avalon_timer_ts.c @@ -0,0 +1,143 @@ +/****************************************************************************** +* * +* License Agreement * +* * +* Copyright (c) 2003 Altera Corporation, San Jose, California, USA. * +* All rights reserved. * +* * +* Permission is hereby granted, free of charge, to any person obtaining a * +* copy of this software and associated documentation files (the "Software"), * +* to deal in the Software without restriction, including without limitation * +* the rights to use, copy, modify, merge, publish, distribute, sublicense, * +* and/or sell copies of the Software, and to permit persons to whom the * +* Software is furnished to do so, subject to the following conditions: * +* * +* The above copyright notice and this permission notice shall be included in * +* all copies or substantial portions of the Software. * +* * +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * +* DEALINGS IN THE SOFTWARE. * +* * +* This agreement shall be governed in all respects by the laws of the State * +* of California and by the laws of the United States of America. * +* * +* Altera does not recommend, suggest or require that this reference design * +* file be used in conjunction or combination with any other product. * +******************************************************************************/ + +#include + +#include "system.h" +#include "sys/alt_timestamp.h" + +#include "altera_avalon_timer.h" +#include "altera_avalon_timer_regs.h" + +#include "alt_types.h" + +/* + * These functions are only available if a timestamp device has been selected + * for this system. + */ + +#if (ALT_TIMESTAMP_CLK_BASE != none_BASE) + +/* + * The function alt_timestamp_start() can be called at application level to + * initialise the timestamp facility. In this case the period register is + * set to full scale, i.e. 0xffffffff, and then started running. Note that + * the period register may not be writable, depending on the hardware + * configuration, in which case this function does not reset the period. + * + * The timer is not run in continuous mode, so that the user can detect timer + * roll-over, i.e. alt_timestamp() returns 0. + * + * The return value of this function is 0 upon sucess and -1 if in timestamp + * device has not been registered. + */ + +int alt_timestamp_start(void) +{ + void* base = altera_avalon_timer_ts_base; + + if (!altera_avalon_timer_ts_freq) + { + return -1; + } + else + { + if(ALT_TIMESTAMP_COUNTER_SIZE == 64) { + IOWR_ALTERA_AVALON_TIMER_CONTROL (base,ALTERA_AVALON_TIMER_CONTROL_STOP_MSK); + IOWR_ALTERA_AVALON_TIMER_PERIOD_0 (base, 0xFFFF); + IOWR_ALTERA_AVALON_TIMER_PERIOD_1 (base, 0xFFFF);; + IOWR_ALTERA_AVALON_TIMER_PERIOD_2 (base, 0xFFFF); + IOWR_ALTERA_AVALON_TIMER_PERIOD_3 (base, 0xFFFF); + IOWR_ALTERA_AVALON_TIMER_CONTROL (base, ALTERA_AVALON_TIMER_CONTROL_START_MSK); + } else { + IOWR_ALTERA_AVALON_TIMER_CONTROL (base,ALTERA_AVALON_TIMER_CONTROL_STOP_MSK); + IOWR_ALTERA_AVALON_TIMER_PERIODL (base, 0xFFFF); + IOWR_ALTERA_AVALON_TIMER_PERIODH (base, 0xFFFF); + IOWR_ALTERA_AVALON_TIMER_CONTROL (base, ALTERA_AVALON_TIMER_CONTROL_START_MSK); + } + } + return 0; +} + +/* + * alt_timestamp() returns the current timestamp count. In the event that + * the timer has run full period, or there is no timestamp available, this + * function return -1. + * + * The returned timestamp counts up from the last time the period register + * was reset. + */ + +alt_timestamp_type alt_timestamp(void) +{ + + void* base = altera_avalon_timer_ts_base; + + if (!altera_avalon_timer_ts_freq) + { +#if (ALT_TIMESTAMP_COUNTER_SIZE == 64) + return 0xFFFFFFFFFFFFFFFFULL; +#else + return 0xFFFFFFFF; +#endif + } + else + { +#if (ALT_TIMESTAMP_COUNTER_SIZE == 64) + IOWR_ALTERA_AVALON_TIMER_SNAP_0 (base, 0); + alt_timestamp_type snap_0 = IORD_ALTERA_AVALON_TIMER_SNAP_0(base) & ALTERA_AVALON_TIMER_SNAP_0_MSK; + alt_timestamp_type snap_1 = IORD_ALTERA_AVALON_TIMER_SNAP_1(base) & ALTERA_AVALON_TIMER_SNAP_1_MSK; + alt_timestamp_type snap_2 = IORD_ALTERA_AVALON_TIMER_SNAP_2(base) & ALTERA_AVALON_TIMER_SNAP_2_MSK; + alt_timestamp_type snap_3 = IORD_ALTERA_AVALON_TIMER_SNAP_3(base) & ALTERA_AVALON_TIMER_SNAP_3_MSK; + + return (0xFFFFFFFFFFFFFFFFULL - ( (snap_3 << 48) | (snap_2 << 32) | (snap_1 << 16) | (snap_0) )); +#else + IOWR_ALTERA_AVALON_TIMER_SNAPL (base, 0); + alt_timestamp_type lower = IORD_ALTERA_AVALON_TIMER_SNAPL(base) & ALTERA_AVALON_TIMER_SNAPL_MSK; + alt_timestamp_type upper = IORD_ALTERA_AVALON_TIMER_SNAPH(base) & ALTERA_AVALON_TIMER_SNAPH_MSK; + + return (0xFFFFFFFF - ((upper << 16) | lower)); +#endif + } +} + +/* + * Return the number of timestamp ticks per second. This will be 0 if no + * timestamp device has been registered. + */ + +alt_u32 alt_timestamp_freq(void) +{ + return altera_avalon_timer_ts_freq; +} + +#endif /* timestamp available */ diff --git a/software/sys_controller_bsp/drivers/inc/ci_crc.h b/software/sys_controller_bsp/drivers/src/altera_avalon_timer_vars.c similarity index 82% rename from software/sys_controller_bsp/drivers/inc/ci_crc.h rename to software/sys_controller_bsp/drivers/src/altera_avalon_timer_vars.c index ba4d983..cb8b197 100644 --- a/software/sys_controller_bsp/drivers/inc/ci_crc.h +++ b/software/sys_controller_bsp/drivers/src/altera_avalon_timer_vars.c @@ -1,38 +1,45 @@ -/****************************************************************************** -* * -* License Agreement * -* * -* Copyright (c) 2008 Altera Corporation, San Jose, California, USA. * -* All rights reserved. * -* * -* Permission is hereby granted, free of charge, to any person obtaining a * -* copy of this software and associated documentation files (the "Software"), * -* to deal in the Software without restriction, including without limitation * -* the rights to use, copy, modify, merge, publish, distribute, sublicense, * -* and/or sell copies of the Software, and to permit persons to whom the * -* Software is furnished to do so, subject to the following conditions: * -* * -* The above copyright notice and this permission notice shall be included in * -* all copies or substantial portions of the Software. * -* * -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * -* DEALINGS IN THE SOFTWARE. * -* * -* This agreement shall be governed in all respects by the laws of the State * -* of California and by the laws of the United States of America. * -* Altera does not recommend, suggest or require that this reference design * -* file be used in conjunction or combination with any other product. * -******************************************************************************/ - - -#ifndef _CRCCI_H_ -#define _CRCCI_H_ - -unsigned long crcCI(unsigned char * input_data, unsigned long input_data_length, int do_initialize); - -#endif //_CRCCI_H_ +/****************************************************************************** +* * +* License Agreement * +* * +* Copyright (c) 2003 Altera Corporation, San Jose, California, USA. * +* All rights reserved. * +* * +* Permission is hereby granted, free of charge, to any person obtaining a * +* copy of this software and associated documentation files (the "Software"), * +* to deal in the Software without restriction, including without limitation * +* the rights to use, copy, modify, merge, publish, distribute, sublicense, * +* and/or sell copies of the Software, and to permit persons to whom the * +* Software is furnished to do so, subject to the following conditions: * +* * +* The above copyright notice and this permission notice shall be included in * +* all copies or substantial portions of the Software. * +* * +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * +* DEALINGS IN THE SOFTWARE. * +* * +* This agreement shall be governed in all respects by the laws of the State * +* of California and by the laws of the United States of America. * +* * +* Altera does not recommend, suggest or require that this reference design * +* file be used in conjunction or combination with any other product. * +******************************************************************************/ + +#include + +#include "altera_avalon_timer.h" +#include "alt_types.h" + +/* + * Variables used to store the timestamp parameters. These are initialised + * from alt_sys_init() using the ALTERA_AVALON_TIMER_INIT macro + * defined in altera_avalon_timer.h. + */ + +void* altera_avalon_timer_ts_base = (void*) 0; +alt_u32 altera_avalon_timer_ts_freq = 0; diff --git a/software/sys_controller_bsp/drivers/src/altera_epcq_controller_mod.c b/software/sys_controller_bsp/drivers/src/altera_epcq_controller_mod.c index 5147a95..35c7c10 100644 --- a/software/sys_controller_bsp/drivers/src/altera_epcq_controller_mod.c +++ b/software/sys_controller_bsp/drivers/src/altera_epcq_controller_mod.c @@ -43,6 +43,7 @@ ALT_INLINE alt_32 static alt_epcq_validate_read_write_arguments(alt_epcq_controller_dev *flash_info,alt_u32 offset, alt_u32 length); alt_32 static alt_epcq_poll_for_write_in_progress(alt_epcq_controller_dev* epcq_flash_info); +ALT_INLINE unsigned char static bitswap8(unsigned char v); /* * Public API @@ -334,6 +335,10 @@ int alt_epcq_controller_write_block /* prepare the word to be written */ memcpy((((void*)&word_to_write)) + padding, ((void*)data) + buffer_offset, bytes_to_copy); + // Bit-reverse bytes for flash + for (int i=0; idata_base + offset, length); + + // Bit-reverse bytes read from flash + for (int i=0; i> 16; +} + diff --git a/software/sys_controller_bsp/drivers/src/ci_crc.c b/software/sys_controller_bsp/drivers/src/ci_crc.c deleted file mode 100644 index 7f9b0f0..0000000 --- a/software/sys_controller_bsp/drivers/src/ci_crc.c +++ /dev/null @@ -1,97 +0,0 @@ -/****************************************************************************** -* * -* License Agreement * -* * -* Copyright (c) 2008 Altera Corporation, San Jose, California, USA. * -* All rights reserved. * -* * -* Permission is hereby granted, free of charge, to any person obtaining a * -* copy of this software and associated documentation files (the "Software"), * -* to deal in the Software without restriction, including without limitation * -* the rights to use, copy, modify, merge, publish, distribute, sublicense, * -* and/or sell copies of the Software, and to permit persons to whom the * -* Software is furnished to do so, subject to the following conditions: * -* * -* The above copyright notice and this permission notice shall be included in * -* all copies or substantial portions of the Software. * -* * -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * -* DEALINGS IN THE SOFTWARE. * -* * -* This agreement shall be governed in all respects by the laws of the State * -* of California and by the laws of the United States of America. * -* Altera does not recommend, suggest or require that this reference design * -* file be used in conjunction or combination with any other product. * -******************************************************************************/ - - -/********************************************************************** - * - * Filename: ci_crc.c - * - * Description: Custom instruction implementations of the CRC. - * - * Notes: A macro is defined that is used to access the CRC custom - * instruction. - *********************************************************************/ - -#include "system.h" - -/*The n values and their corresponding operation are as follow: - * n = 0, Initialize the custom instruction to the initial remainder value - * n = 1, Write 8 bits data to custom instruction - * n = 2, Write 16 bits data to custom instruction - * n = 3, Write 32 bits data to custom instruction - * n = 4, Read 32 bits data from the custom instruction - * n = 5, Read 64 bits data from the custom instruction - * n = 6, Read 96 bits data from the custom instruction - * n = 7, Read 128 bits data from the custom instruction*/ -#define CRC_CI_MACRO(n, A) __builtin_custom_ini(ALT_CI_NIOS2_HW_CRC32_0_N + (n & 0x7), (A)) - -unsigned long crcCI(unsigned char * input_data, unsigned long input_data_length, int do_initialize) -{ - unsigned long index; - /* copy of the data buffer pointer so that it can advance by different widths */ - void * input_data_copy = (void *)input_data; - - /* The custom instruction CRC will initialize to the inital remainder value */ - if (do_initialize) - CRC_CI_MACRO(0,0); - - /* Write 32 bit data to the custom instruction. If the buffer does not end - * on a 32 bit boundary then the remaining data will be sent to the custom - * instruction in the 'if' statement below. - */ - for(index = 0; index < (input_data_length & 0xFFFFFFFC); index+=4) - { - CRC_CI_MACRO(3, *(unsigned long *)input_data_copy); - input_data_copy += 4; /* void pointer, must move by 4 for each word */ - } - - /* Write the remainder of the buffer if it does not end on a word boundary */ - if((input_data_length & 0x3) == 0x3) /* 3 bytes left */ - { - CRC_CI_MACRO(2, *(unsigned short *)input_data_copy); - input_data_copy += 2; - CRC_CI_MACRO(1, *(unsigned char *)input_data_copy); - } - else if((input_data_length & 0x3) == 0x2) /* 2 bytes left */ - { - CRC_CI_MACRO(2, *(unsigned short *)input_data_copy); - } - else if((input_data_length & 0x3) == 0x1) /* 1 byte left */ - { - CRC_CI_MACRO(1, *(unsigned char *)input_data_copy); - } - - /* There are 4 registers in the CRC custom instruction. Since - * this example uses CRC-32 only the first register must be read - * in order to receive the full result. - */ - return CRC_CI_MACRO(4, 0); -} diff --git a/software/sys_controller_bsp/drivers/src/crc.c b/software/sys_controller_bsp/drivers/src/crc.c deleted file mode 100644 index f00568d..0000000 --- a/software/sys_controller_bsp/drivers/src/crc.c +++ /dev/null @@ -1,265 +0,0 @@ -/****************************************************************************** -* * -* License Agreement * -* * -* Copyright (c) 2008 Altera Corporation, San Jose, California, USA. * -* All rights reserved. * -* * -* Permission is hereby granted, free of charge, to any person obtaining a * -* copy of this software and associated documentation files (the "Software"), * -* to deal in the Software without restriction, including without limitation * -* the rights to use, copy, modify, merge, publish, distribute, sublicense, * -* and/or sell copies of the Software, and to permit persons to whom the * -* Software is furnished to do so, subject to the following conditions: * -* * -* The above copyright notice and this permission notice shall be included in * -* all copies or substantial portions of the Software. * -* * -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * -* DEALINGS IN THE SOFTWARE. * -* * -* This agreement shall be governed in all respects by the laws of the State * -* of California and by the laws of the United States of America. * -* Altera does not recommend, suggest or require that this reference design * -* file be used in conjunction or combination with any other product. * -******************************************************************************/ - - -/********************************************************************** - * - * Filename: crc.c - * - * Description: Slow and fast implementations of the CRC standards. - * - * Notes: The parameters for each supported CRC standard are - * defined in the header file crc.h. The implementations - * here should stand up to further additions to that list. - * - * - * Copyright (c) 2000 by Michael Barr. This software is placed into - * the public domain and may be used for any purpose. However, this - * notice must not be changed or removed and no warranty is either - * expressed or implied by its publication or distribution. - **********************************************************************/ - -#include "crc.h" - - -/* - * Derive parameters from the standard-specific parameters in crc.h. - */ -#define WIDTH (8 * sizeof(crc)) -#define TOPBIT (1 << (WIDTH - 1)) - -#if (REFLECT_DATA == TRUE) -#undef REFLECT_DATA -#define REFLECT_DATA(X) ((unsigned char) reflect((X), 8)) -#else -#undef REFLECT_DATA -#define REFLECT_DATA(X) (X) -#endif - -#if (REFLECT_REMAINDER == TRUE) -#undef REFLECT_REMAINDER -#define REFLECT_REMAINDER(X) ((crc) reflect((X), WIDTH)) -#else -#undef REFLECT_REMAINDER -#define REFLECT_REMAINDER(X) (X) -#endif - - -/********************************************************************* - * - * Function: reflect() - * - * Description: Reorder the bits of a binary sequence, by reflecting - * them about the middle position. - * - * Notes: No checking is done that nBits <= 32. - * - * Returns: The reflection of the original data. - * - *********************************************************************/ -static unsigned long -reflect(unsigned long data, unsigned char nBits) -{ - unsigned long reflection = 0x00000000; - unsigned char bit; - - /* - * Reflect the data about the center bit. - */ - for (bit = 0; bit < nBits; ++bit) - { - /* - * If the LSB bit is set, set the reflection of it. - */ - if (data & 0x01) - { - reflection |= (1 << ((nBits - 1) - bit)); - } - - data = (data >> 1); - } - - return (reflection); - -} /* reflect() */ - - -/********************************************************************* - * - * Function: crcSlow() - * - * Description: Compute the CRC of a given message. - * - * Notes: - * - * Returns: The CRC of the message. - * - *********************************************************************/ -crc -crcSlow(unsigned char const message[], int nBytes) -{ - crc remainder = INITIAL_REMAINDER; - int byte; - unsigned char bit; - - - /* - * Perform modulo-2 division, a byte at a time. - */ - for (byte = 0; byte < nBytes; ++byte) - { - /* - * Bring the next byte into the remainder. - */ - remainder ^= (REFLECT_DATA(message[byte]) << (WIDTH - 8)); - - /* - * Perform modulo-2 division, a bit at a time. - */ - for (bit = 8; bit > 0; --bit) - { - /* - * Try to divide the current data bit. - */ - if (remainder & TOPBIT) - { - remainder = (remainder << 1) ^ POLYNOMIAL; - } - else - { - remainder = (remainder << 1); - } - } - } - - /* - * The final remainder is the CRC result. - */ - return (REFLECT_REMAINDER(remainder) ^ FINAL_XOR_VALUE); - -} /* crcSlow() */ - - -crc crcTable[256]; - - -/********************************************************************* - * - * Function: crcInit() - * - * Description: Populate the partial CRC lookup table. - * - * Notes: This function must be rerun any time the CRC standard - * is changed. If desired, it can be run "offline" and - * the table results stored in an embedded system's ROM. - * - * Returns: None defined. - * - *********************************************************************/ -void -crcInit(void) -{ - crc remainder; - int dividend; - unsigned char bit; - - - /* - * Compute the remainder of each possible dividend. - */ - for (dividend = 0; dividend < 256; ++dividend) - { - /* - * Start with the dividend followed by zeros. - */ - remainder = dividend << (WIDTH - 8); - - /* - * Perform modulo-2 division, a bit at a time. - */ - for (bit = 8; bit > 0; --bit) - { - /* - * Try to divide the current data bit. - */ - if (remainder & TOPBIT) - { - remainder = (remainder << 1) ^ POLYNOMIAL; - } - else - { - remainder = (remainder << 1); - } - } - - /* - * Store the result into the table. - */ - crcTable[dividend] = remainder; - } - -} /* crcInit() */ - - -/********************************************************************* - * - * Function: crcFast() - * - * Description: Compute the CRC of a given message. - * - * Notes: crcInit() must be called first. - * - * Returns: The CRC of the message. - * - *********************************************************************/ -crc -crcFast(unsigned char const message[], int nBytes) -{ - crc remainder = INITIAL_REMAINDER; - unsigned char data; - int byte; - - - /* - * Divide the message by the polynomial, a byte at a time. - */ - for (byte = 0; byte < nBytes; ++byte) - { - data = REFLECT_DATA(message[byte]) ^ (remainder >> (WIDTH - 8)); - remainder = crcTable[data] ^ (remainder << 8); - } - - /* - * The final remainder is the CRC. - */ - return (REFLECT_REMAINDER(remainder) ^ FINAL_XOR_VALUE); - -} /* crcFast() */ diff --git a/software/sys_controller_bsp/drivers/src/i2c_opencores.c b/software/sys_controller_bsp/drivers/src/i2c_opencores.c index aa8e81b..49b2a9e 100644 --- a/software/sys_controller_bsp/drivers/src/i2c_opencores.c +++ b/software/sys_controller_bsp/drivers/src/i2c_opencores.c @@ -69,7 +69,7 @@ int I2C_start(alt_u32 base, alt_u32 add, alt_u32 read) IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_STA_MSK | I2C_OPENCORES_CR_WR_MSK ); /* wait for the trnasaction to be over.*/ - while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); + while (IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK) {} /* now check to see if the address was acknowledged */ if(IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_RXNACK_MSK) @@ -119,7 +119,7 @@ alt_u32 I2C_read(alt_u32 base,alt_u32 last) IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_RD_MSK ); } /* wait for the trnasaction to be over.*/ - while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); + while (IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK) {} /* now read the data */ return (IORD_I2C_OPENCORES_RXR(base)); @@ -162,7 +162,7 @@ alt_u32 I2C_write(alt_u32 base,alt_u8 data, alt_u32 last) IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_WR_MSK ); } /* wait for the trnasaction to be over.*/ - while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); + while (IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK) {} /* now check to see if the address was acknowledged */ if(IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_RXNACK_MSK) diff --git a/software/sys_controller_bsp/libhal_bsp.a b/software/sys_controller_bsp/libhal_bsp.a index 39829dd..9f11e3b 100644 Binary files a/software/sys_controller_bsp/libhal_bsp.a and b/software/sys_controller_bsp/libhal_bsp.a differ diff --git a/software/sys_controller_bsp/linker.h b/software/sys_controller_bsp/linker.h index c045a5f..ca0486b 100644 --- a/software/sys_controller_bsp/linker.h +++ b/software/sys_controller_bsp/linker.h @@ -4,7 +4,7 @@ * Machine generated for CPU 'nios2_qsys_0' in SOPC Builder design 'sys' * SOPC Builder design path: ../../sys.sopcinfo * - * Generated: Sun Oct 16 12:18:06 EEST 2016 + * Generated: Fri Oct 05 19:59:02 EEST 2018 */ /* @@ -65,11 +65,11 @@ * */ -#define EPCQ_CONTROLLER_0_AVL_MEM_REGION_BASE 0x0 +#define EPCQ_CONTROLLER_0_AVL_MEM_REGION_BASE 0x800000 #define EPCQ_CONTROLLER_0_AVL_MEM_REGION_SPAN 8388608 -#define ONCHIP_MEMORY2_0_REGION_BASE 0x810020 -#define ONCHIP_MEMORY2_0_REGION_SPAN 40928 -#define RESET_REGION_BASE 0x810000 +#define ONCHIP_MEMORY2_0_REGION_BASE 0x10020 +#define ONCHIP_MEMORY2_0_REGION_SPAN 36832 +#define RESET_REGION_BASE 0x10000 #define RESET_REGION_SPAN 32 diff --git a/software/sys_controller_bsp/linker.x b/software/sys_controller_bsp/linker.x index bb7d4db..7e01d5e 100644 --- a/software/sys_controller_bsp/linker.x +++ b/software/sys_controller_bsp/linker.x @@ -4,7 +4,7 @@ * Machine generated for CPU 'nios2_qsys_0' in SOPC Builder design 'sys' * SOPC Builder design path: ../../sys.sopcinfo * - * Generated: Sun Oct 16 12:18:06 EEST 2016 + * Generated: Fri Oct 05 19:59:02 EEST 2018 */ /* @@ -50,14 +50,14 @@ MEMORY { - epcq_controller_0_avl_mem : ORIGIN = 0x0, LENGTH = 8388608 - reset : ORIGIN = 0x810000, LENGTH = 32 - onchip_memory2_0 : ORIGIN = 0x810020, LENGTH = 40928 + reset : ORIGIN = 0x10000, LENGTH = 32 + onchip_memory2_0 : ORIGIN = 0x10020, LENGTH = 36832 + epcq_controller_0_avl_mem : ORIGIN = 0x800000, LENGTH = 8388608 } /* Define symbols for each memory base-address */ -__alt_mem_epcq_controller_0_avl_mem = 0x0; -__alt_mem_onchip_memory2_0 = 0x810000; +__alt_mem_onchip_memory2_0 = 0x10000; +__alt_mem_epcq_controller_0_avl_mem = 0x800000; OUTPUT_FORMAT( "elf32-littlenios2", "elf32-littlenios2", @@ -309,24 +309,7 @@ SECTIONS * */ - .epcq_controller_0_avl_mem : AT ( LOADADDR (.bss) + SIZEOF (.bss) ) - { - PROVIDE (_alt_partition_epcq_controller_0_avl_mem_start = ABSOLUTE(.)); - *(.epcq_controller_0_avl_mem .epcq_controller_0_avl_mem. epcq_controller_0_avl_mem.*) - . = ALIGN(4); - PROVIDE (_alt_partition_epcq_controller_0_avl_mem_end = ABSOLUTE(.)); - } > epcq_controller_0_avl_mem - - PROVIDE (_alt_partition_epcq_controller_0_avl_mem_load_addr = LOADADDR(.epcq_controller_0_avl_mem)); - - /* - * - * This section's LMA is set to the .text region. - * crt0 will copy to this section's specified mapped region virtual memory address (VMA) - * - */ - - .onchip_memory2_0 LOADADDR (.epcq_controller_0_avl_mem) + SIZEOF (.epcq_controller_0_avl_mem) : AT ( LOADADDR (.epcq_controller_0_avl_mem) + SIZEOF (.epcq_controller_0_avl_mem) ) + .onchip_memory2_0 LOADADDR (.bss) + SIZEOF (.bss) : AT ( LOADADDR (.bss) + SIZEOF (.bss) ) { PROVIDE (_alt_partition_onchip_memory2_0_start = ABSOLUTE(.)); *(.onchip_memory2_0 .onchip_memory2_0. onchip_memory2_0.*) @@ -339,6 +322,23 @@ SECTIONS PROVIDE (_alt_partition_onchip_memory2_0_load_addr = LOADADDR(.onchip_memory2_0)); + /* + * + * This section's LMA is set to the .text region. + * crt0 will copy to this section's specified mapped region virtual memory address (VMA) + * + */ + + .epcq_controller_0_avl_mem : AT ( LOADADDR (.onchip_memory2_0) + SIZEOF (.onchip_memory2_0) ) + { + PROVIDE (_alt_partition_epcq_controller_0_avl_mem_start = ABSOLUTE(.)); + *(.epcq_controller_0_avl_mem .epcq_controller_0_avl_mem. epcq_controller_0_avl_mem.*) + . = ALIGN(4); + PROVIDE (_alt_partition_epcq_controller_0_avl_mem_end = ABSOLUTE(.)); + } > epcq_controller_0_avl_mem + + PROVIDE (_alt_partition_epcq_controller_0_avl_mem_load_addr = LOADADDR(.epcq_controller_0_avl_mem)); + /* * Stabs debugging sections. * @@ -386,7 +386,7 @@ SECTIONS /* * Don't override this, override the __alt_stack_* symbols instead. */ -__alt_data_end = 0x81a000; +__alt_data_end = 0x19000; /* * The next two symbols define the location of the default stack. You can @@ -402,4 +402,4 @@ PROVIDE( __alt_stack_limit = __alt_stack_base ); * Override this symbol to put the heap in a different memory. */ PROVIDE( __alt_heap_start = end ); -PROVIDE( __alt_heap_limit = 0x81a000 ); +PROVIDE( __alt_heap_limit = 0x19000 ); diff --git a/software/sys_controller_bsp/mem_init.mk b/software/sys_controller_bsp/mem_init.mk index dbb339c..014f1e9 100644 --- a/software/sys_controller_bsp/mem_init.mk +++ b/software/sys_controller_bsp/mem_init.mk @@ -161,7 +161,7 @@ ACDS_VERSION := 17.1 SIM_OPTIMIZE ?= 0 # The CPU reset address as needed by elf2flash -RESET_ADDRESS ?= 0x00810000 +RESET_ADDRESS ?= 0x00010000 # The specific Nios II ELF file format to use. NIOS2_ELF_FORMAT ?= elf32-littlenios2 @@ -175,8 +175,8 @@ MEM_0 := epcq_controller_0 $(MEM_0)_NAME := epcq_controller_0 HEX_FILES += $(MEM_INIT_DIR)/$(MEM_0).hex MEM_INIT_INSTALL_FILES += $(MEM_INIT_INSTALL_DIR)/$(MEM_0).hex -$(MEM_0)_START := 0x00000000 -$(MEM_0)_END := 0x007fffff +$(MEM_0)_START := 0x00800000 +$(MEM_0)_END := 0x00ffffff $(MEM_0)_SPAN := 0x00800000 $(MEM_0)_HIERARCHICAL_PATH := epcq_controller_0 $(MEM_0)_WIDTH := 32 @@ -198,9 +198,9 @@ DAT_FILES += $(HDL_SIM_DIR)/$(MEM_1).dat HDL_SIM_INSTALL_FILES += $(HDL_SIM_INSTALL_DIR)/$(MEM_1).dat SYM_FILES += $(HDL_SIM_DIR)/$(MEM_1).sym HDL_SIM_INSTALL_FILES += $(HDL_SIM_INSTALL_DIR)/$(MEM_1).sym -$(MEM_1)_START := 0x00810000 -$(MEM_1)_END := 0x00819fff -$(MEM_1)_SPAN := 0x0000a000 +$(MEM_1)_START := 0x00010000 +$(MEM_1)_END := 0x00018fff +$(MEM_1)_SPAN := 0x00009000 $(MEM_1)_HIERARCHICAL_PATH := onchip_memory2_0 $(MEM_1)_WIDTH := 32 $(MEM_1)_HEX_DATA_WIDTH := 32 @@ -304,10 +304,10 @@ ELF_TO_HEX_CMD = $(strip $(if $(flash_mem_boot_loader_flag), \ $(ELF_TO_HEX_CMD_NO_BOOTLOADER) \ )) -$(HEX_FILES): %.hex: $(ELF) - $(post-process-info) - @$(MKDIR) $(@D) - $(ELF_TO_HEX_CMD) +#$(HEX_FILES): %.hex: $(ELF) +# $(post-process-info) +# @$(MKDIR) $(@D) +# $(ELF_TO_HEX_CMD) $(SYM_FILES): %.sym: $(ELF) $(post-process-info) diff --git a/software/sys_controller_bsp/memory.gdb b/software/sys_controller_bsp/memory.gdb index 41fd763..5197bae 100644 --- a/software/sys_controller_bsp/memory.gdb +++ b/software/sys_controller_bsp/memory.gdb @@ -3,7 +3,7 @@ # Machine generated for CPU 'nios2_qsys_0' in SOPC Builder design 'sys' # SOPC Builder design path: ../../sys.sopcinfo # -# Generated: Sun Oct 16 12:18:06 EEST 2016 +# Generated: Fri Oct 05 19:59:02 EEST 2018 # DO NOT MODIFY THIS FILE # @@ -46,8 +46,8 @@ # The cache attribute is specified which improves GDB performance # by allowing GDB to cache memory contents on the host. -# epcq_controller_0_avl_mem -memory 0x0 0x800000 cache - # onchip_memory2_0 -memory 0x810000 0x81a000 cache +memory 0x10000 0x19000 cache + +# epcq_controller_0_avl_mem +memory 0x800000 0x1000000 cache diff --git a/software/sys_controller_bsp/public.mk b/software/sys_controller_bsp/public.mk index cff38a9..b57a1a2 100644 --- a/software/sys_controller_bsp/public.mk +++ b/software/sys_controller_bsp/public.mk @@ -19,7 +19,7 @@ # Path to the provided linker script. -BSP_LINKER_SCRIPT := $(ALT_LIBRARY_ROOT_DIR)/linker.x +BSP_LINKER_SCRIPT := link.riscv.ld # Include paths: # The path to root of all header files that a library wishes to make @@ -119,15 +119,15 @@ ELF_PATCH_FLAG += --cpu_name $(CPU_NAME) # Hardware Divider present. # setting HARDWARE_DIVIDE is false -ALT_CFLAGS += -mno-hw-div +#ALT_CFLAGS += -mno-hw-div # Hardware Multiplier present. # setting HARDWARE_MULTIPLY is false -ALT_CFLAGS += -mno-hw-mul +#ALT_CFLAGS += -mno-hw-mul # Hardware Mulx present. # setting HARDWARE_MULX is false -ALT_CFLAGS += -mno-hw-mulx +#ALT_CFLAGS += -mno-hw-mulx # Debug Core present. # setting HAS_DEBUG_CORE is true @@ -258,7 +258,8 @@ ALT_CPPFLAGS += -DSMALL_C_LIB # generate GP-relative accesses for small data objects that are external, weak, # or common. none # setting hal.make.cflags_mgpopt is -mgpopt=global -ALT_CFLAGS += -mgpopt=global +#ALT_CFLAGS += -mgpopt=global +ALT_CFLAGS += -march=rv32emc -mabi=ilp32e # Enable BSP generation to query if SOPC system is big endian. If true ignores # export of 'ALT_CFLAGS += -meb' to public.mk if big endian system. none diff --git a/software/sys_controller_bsp/settings.bsp b/software/sys_controller_bsp/settings.bsp index 9476c51..5b765a8 100644 --- a/software/sys_controller_bsp/settings.bsp +++ b/software/sys_controller_bsp/settings.bsp @@ -2,8 +2,8 @@ hal default - Apr 18, 2018 10:30:05 PM - 1524079805195 + Oct 5, 2018 8:21:01 PM + 1538758741996 ./ settings.bsp ../../sys.sopcinfo @@ -898,101 +898,101 @@ false - - epcq_controller_0_avl_mem - 0x00000000 - 0x007FFFFF - 8388608 - flash, memory, non-volatile - onchip_memory2_0 - 0x00810000 - 0x00819FFF + 0x00010000 - 0x00019FFF 40960 memory timer_0 - 0x00821000 - 0x0082101F + 0x00020000 - 0x0002001F 32 timer + + jtag_uart_0 + 0x00020020 - 0x00020027 + 8 + printable + epcq_controller_0_avl_csr - 0x00821020 - 0x0082103F + 0x00020100 - 0x0002011F 32 i2c_opencores_1 - 0x00821040 - 0x0082105F + 0x00021020 - 0x0002103F 32 i2c_opencores_0 - 0x00821060 - 0x0082107F + 0x00021040 - 0x0002105F 32 pio_8 - 0x00821080 - 0x0082108F + 0x00021060 - 0x0002106F 16 pio_7 - 0x00821090 - 0x0082109F + 0x00021070 - 0x0002107F 16 pio_6 - 0x008210A0 - 0x008210AF + 0x00021080 - 0x0002108F 16 pio_5 - 0x008210B0 - 0x008210BF + 0x00021090 - 0x0002109F 16 pio_4 - 0x008210C0 - 0x008210CF + 0x000210A0 - 0x000210AF 16 pio_3 - 0x008210D0 - 0x008210DF + 0x000210B0 - 0x000210BF 16 pio_2 - 0x008210E0 - 0x008210EF + 0x000210C0 - 0x000210CF 16 pio_1 - 0x008210F0 - 0x008210FF + 0x000210D0 - 0x000210DF 16 pio_0 - 0x00821100 - 0x0082110F + 0x000210E0 - 0x000210EF 16 - jtag_uart_0 - 0x00821110 - 0x00821117 - 8 - printable + epcq_controller_0_avl_mem + 0x00800000 - 0x00FFFFFF + 8388608 + flash, memory, non-volatile .text @@ -1018,4 +1018,4 @@ .stack onchip_memory2_0 - \ No newline at end of file + diff --git a/software/sys_controller_bsp/system.h b/software/sys_controller_bsp/system.h index 3b8af96..b0d4636 100644 --- a/software/sys_controller_bsp/system.h +++ b/software/sys_controller_bsp/system.h @@ -4,7 +4,7 @@ * Machine generated for CPU 'nios2_qsys_0' in SOPC Builder design 'sys' * SOPC Builder design path: ../../sys.sopcinfo * - * Generated: Sun Mar 25 16:51:03 EEST 2018 + * Generated: Fri Oct 05 19:59:02 EEST 2018 */ /* @@ -62,7 +62,7 @@ #define ALT_CPU_ARCHITECTURE "altera_nios2_gen2" #define ALT_CPU_BIG_ENDIAN 0 -#define ALT_CPU_BREAK_ADDR 0x00820820 +#define ALT_CPU_BREAK_ADDR 0x00000820 #define ALT_CPU_CPU_ARCH_NIOS2_R1 #define ALT_CPU_CPU_FREQ 27000000u #define ALT_CPU_CPU_ID_SIZE 1 @@ -72,7 +72,7 @@ #define ALT_CPU_DCACHE_LINE_SIZE 0 #define ALT_CPU_DCACHE_LINE_SIZE_LOG2 0 #define ALT_CPU_DCACHE_SIZE 0 -#define ALT_CPU_EXCEPTION_ADDR 0x00810020 +#define ALT_CPU_EXCEPTION_ADDR 0x00010020 #define ALT_CPU_FLASH_ACCELERATOR_LINES 0 #define ALT_CPU_FLASH_ACCELERATOR_LINE_SIZE 0 #define ALT_CPU_FLUSHDA_SUPPORTED @@ -87,10 +87,10 @@ #define ALT_CPU_ICACHE_LINE_SIZE 0 #define ALT_CPU_ICACHE_LINE_SIZE_LOG2 0 #define ALT_CPU_ICACHE_SIZE 0 -#define ALT_CPU_INST_ADDR_WIDTH 0x18 +#define ALT_CPU_INST_ADDR_WIDTH 0x11 #define ALT_CPU_NAME "nios2_qsys_0" #define ALT_CPU_OCI_VERSION 1 -#define ALT_CPU_RESET_ADDR 0x00810000 +#define ALT_CPU_RESET_ADDR 0x00010000 /* @@ -99,7 +99,7 @@ */ #define NIOS2_BIG_ENDIAN 0 -#define NIOS2_BREAK_ADDR 0x00820820 +#define NIOS2_BREAK_ADDR 0x00000820 #define NIOS2_CPU_ARCH_NIOS2_R1 #define NIOS2_CPU_FREQ 27000000u #define NIOS2_CPU_ID_SIZE 1 @@ -109,7 +109,7 @@ #define NIOS2_DCACHE_LINE_SIZE 0 #define NIOS2_DCACHE_LINE_SIZE_LOG2 0 #define NIOS2_DCACHE_SIZE 0 -#define NIOS2_EXCEPTION_ADDR 0x00810020 +#define NIOS2_EXCEPTION_ADDR 0x00010020 #define NIOS2_FLASH_ACCELERATOR_LINES 0 #define NIOS2_FLASH_ACCELERATOR_LINE_SIZE 0 #define NIOS2_FLUSHDA_SUPPORTED @@ -123,9 +123,9 @@ #define NIOS2_ICACHE_LINE_SIZE 0 #define NIOS2_ICACHE_LINE_SIZE_LOG2 0 #define NIOS2_ICACHE_SIZE 0 -#define NIOS2_INST_ADDR_WIDTH 0x18 +#define NIOS2_INST_ADDR_WIDTH 0x11 #define NIOS2_OCI_VERSION 1 -#define NIOS2_RESET_ADDR 0x00810000 +#define NIOS2_RESET_ADDR 0x00010000 /* @@ -133,13 +133,13 @@ * */ -#define ALT_CI_NIOS2_HW_CRC32_0(n,A) __builtin_custom_ini(ALT_CI_NIOS2_HW_CRC32_0_N+(n&ALT_CI_NIOS2_HW_CRC32_0_N_MASK),(A)) +/*#define ALT_CI_NIOS2_HW_CRC32_0(n,A) __builtin_custom_ini(ALT_CI_NIOS2_HW_CRC32_0_N+(n&ALT_CI_NIOS2_HW_CRC32_0_N_MASK),(A)) #define ALT_CI_NIOS2_HW_CRC32_0_N 0x0 #define ALT_CI_NIOS2_HW_CRC32_0_N_MASK ((1<<3)-1) #define ALT_CI_NIOS_CUSTOM_INSTR_BITSWAP_0(A) __builtin_custom_ini(ALT_CI_NIOS_CUSTOM_INSTR_BITSWAP_0_N,(A)) #define ALT_CI_NIOS_CUSTOM_INSTR_BITSWAP_0_N 0x9 #define ALT_CI_NIOS_CUSTOM_INSTR_ENDIANCONVERTER_0(A) __builtin_custom_ini(ALT_CI_NIOS_CUSTOM_INSTR_ENDIANCONVERTER_0_N,(A)) -#define ALT_CI_NIOS_CUSTOM_INSTR_ENDIANCONVERTER_0_N 0x8 +#define ALT_CI_NIOS_CUSTOM_INSTR_ENDIANCONVERTER_0_N 0x8*/ /* @@ -175,19 +175,19 @@ #define ALT_NUM_INTERNAL_INTERRUPT_CONTROLLERS 1 #define ALT_NUM_INTERRUPT_CONTROLLERS 1 #define ALT_STDERR "/dev/jtag_uart_0" -#define ALT_STDERR_BASE 0x821110 +#define ALT_STDERR_BASE 0x20020 #define ALT_STDERR_DEV jtag_uart_0 #define ALT_STDERR_IS_JTAG_UART #define ALT_STDERR_PRESENT #define ALT_STDERR_TYPE "altera_avalon_jtag_uart" #define ALT_STDIN "/dev/jtag_uart_0" -#define ALT_STDIN_BASE 0x821110 +#define ALT_STDIN_BASE 0x20020 #define ALT_STDIN_DEV jtag_uart_0 #define ALT_STDIN_IS_JTAG_UART #define ALT_STDIN_PRESENT #define ALT_STDIN_TYPE "altera_avalon_jtag_uart" #define ALT_STDOUT "/dev/jtag_uart_0" -#define ALT_STDOUT_BASE 0x821110 +#define ALT_STDOUT_BASE 0x20020 #define ALT_STDOUT_DEV jtag_uart_0 #define ALT_STDOUT_IS_JTAG_UART #define ALT_STDOUT_PRESENT @@ -201,7 +201,7 @@ */ #define ALT_MODULE_CLASS_epcq_controller_0_avl_csr altera_epcq_controller_mod -#define EPCQ_CONTROLLER_0_AVL_CSR_BASE 0x821020 +#define EPCQ_CONTROLLER_0_AVL_CSR_BASE 0x20100 #define EPCQ_CONTROLLER_0_AVL_CSR_FLASH_TYPE "EPCS64" #define EPCQ_CONTROLLER_0_AVL_CSR_IRQ 2 #define EPCQ_CONTROLLER_0_AVL_CSR_IRQ_INTERRUPT_CONTROLLER_ID 0 @@ -221,7 +221,7 @@ */ #define ALT_MODULE_CLASS_epcq_controller_0_avl_mem altera_epcq_controller_mod -#define EPCQ_CONTROLLER_0_AVL_MEM_BASE 0x0 +#define EPCQ_CONTROLLER_0_AVL_MEM_BASE 0x800000 #define EPCQ_CONTROLLER_0_AVL_MEM_FLASH_TYPE "EPCS64" #define EPCQ_CONTROLLER_0_AVL_MEM_IRQ -1 #define EPCQ_CONTROLLER_0_AVL_MEM_IRQ_INTERRUPT_CONTROLLER_ID -1 @@ -251,7 +251,7 @@ */ #define ALT_MODULE_CLASS_i2c_opencores_0 i2c_opencores -#define I2C_OPENCORES_0_BASE 0x821060 +#define I2C_OPENCORES_0_BASE 0x21040 #define I2C_OPENCORES_0_IRQ 3 #define I2C_OPENCORES_0_IRQ_INTERRUPT_CONTROLLER_ID 0 #define I2C_OPENCORES_0_NAME "/dev/i2c_opencores_0" @@ -265,7 +265,7 @@ */ #define ALT_MODULE_CLASS_i2c_opencores_1 i2c_opencores -#define I2C_OPENCORES_1_BASE 0x821040 +#define I2C_OPENCORES_1_BASE 0x21020 #define I2C_OPENCORES_1_IRQ 4 #define I2C_OPENCORES_1_IRQ_INTERRUPT_CONTROLLER_ID 0 #define I2C_OPENCORES_1_NAME "/dev/i2c_opencores_1" @@ -279,7 +279,7 @@ */ #define ALT_MODULE_CLASS_jtag_uart_0 altera_avalon_jtag_uart -#define JTAG_UART_0_BASE 0x821110 +#define JTAG_UART_0_BASE 0x20020 #define JTAG_UART_0_IRQ 1 #define JTAG_UART_0_IRQ_INTERRUPT_CONTROLLER_ID 0 #define JTAG_UART_0_NAME "/dev/jtag_uart_0" @@ -299,7 +299,7 @@ #define ALT_MODULE_CLASS_onchip_memory2_0 altera_avalon_onchip_memory2 #define ONCHIP_MEMORY2_0_ALLOW_IN_SYSTEM_MEMORY_CONTENT_EDITOR 0 #define ONCHIP_MEMORY2_0_ALLOW_MRAM_SIM_CONTENTS_ONLY_FILE 0 -#define ONCHIP_MEMORY2_0_BASE 0x810000 +#define ONCHIP_MEMORY2_0_BASE 0x10000 #define ONCHIP_MEMORY2_0_CONTENTS_INFO "" #define ONCHIP_MEMORY2_0_DUAL_PORT 0 #define ONCHIP_MEMORY2_0_GUI_RAM_BLOCK_TYPE "AUTO" @@ -319,6 +319,13 @@ #define ONCHIP_MEMORY2_0_TYPE "altera_avalon_onchip_memory2" #define ONCHIP_MEMORY2_0_WRITABLE 1 +/* + * hw_crc32_0 configuration + * + */ +#define ALT_MODULE_CLASS_hw_crc32_0 hw_crc32 +#define HW_CRC32_0_BASE 0x21000 + /* * pio_0 configuration @@ -326,7 +333,7 @@ */ #define ALT_MODULE_CLASS_pio_0 altera_avalon_pio -#define PIO_0_BASE 0x821100 +#define PIO_0_BASE 0x210e0 #define PIO_0_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_0_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_0_CAPTURE 0 @@ -353,7 +360,7 @@ */ #define ALT_MODULE_CLASS_pio_1 altera_avalon_pio -#define PIO_1_BASE 0x8210f0 +#define PIO_1_BASE 0x210d0 #define PIO_1_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_1_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_1_CAPTURE 0 @@ -380,7 +387,7 @@ */ #define ALT_MODULE_CLASS_pio_2 altera_avalon_pio -#define PIO_2_BASE 0x8210e0 +#define PIO_2_BASE 0x210c0 #define PIO_2_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_2_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_2_CAPTURE 0 @@ -407,7 +414,7 @@ */ #define ALT_MODULE_CLASS_pio_3 altera_avalon_pio -#define PIO_3_BASE 0x8210d0 +#define PIO_3_BASE 0x210b0 #define PIO_3_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_3_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_3_CAPTURE 0 @@ -434,7 +441,7 @@ */ #define ALT_MODULE_CLASS_pio_4 altera_avalon_pio -#define PIO_4_BASE 0x8210c0 +#define PIO_4_BASE 0x210a0 #define PIO_4_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_4_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_4_CAPTURE 0 @@ -461,7 +468,7 @@ */ #define ALT_MODULE_CLASS_pio_5 altera_avalon_pio -#define PIO_5_BASE 0x8210b0 +#define PIO_5_BASE 0x21090 #define PIO_5_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_5_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_5_CAPTURE 0 @@ -488,7 +495,7 @@ */ #define ALT_MODULE_CLASS_pio_6 altera_avalon_pio -#define PIO_6_BASE 0x8210a0 +#define PIO_6_BASE 0x21080 #define PIO_6_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_6_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_6_CAPTURE 0 @@ -515,7 +522,7 @@ */ #define ALT_MODULE_CLASS_pio_7 altera_avalon_pio -#define PIO_7_BASE 0x821090 +#define PIO_7_BASE 0x21070 #define PIO_7_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_7_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_7_CAPTURE 0 @@ -542,7 +549,7 @@ */ #define ALT_MODULE_CLASS_pio_8 altera_avalon_pio -#define PIO_8_BASE 0x821080 +#define PIO_8_BASE 0x21060 #define PIO_8_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_8_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_8_CAPTURE 0 @@ -570,7 +577,7 @@ #define ALT_MODULE_CLASS_timer_0 altera_avalon_timer #define TIMER_0_ALWAYS_RUN 0 -#define TIMER_0_BASE 0x821000 +#define TIMER_0_BASE 0x20000 #define TIMER_0_COUNTER_SIZE 32 #define TIMER_0_FIXED_PERIOD 0 #define TIMER_0_FREQ 27000000 diff --git a/sys.qsys b/sys.qsys index c109206..c4dcdce 100644 --- a/sys.qsys +++ b/sys.qsys @@ -21,59 +21,37 @@ { datum _sortIndex { - value = "8"; + value = "6"; type = "int"; } } element epcq_controller_0.avl_csr { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8523808"; + value = "131328"; type = "String"; } } element epcq_controller_0.avl_mem { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "0"; + value = "8388608"; type = "String"; } } - element i2c_opencores_0 - { - datum _sortIndex - { - value = "9"; - type = "int"; - } - } - element i2c_opencores_0.avalon_slave_0 - { - datum baseAddress - { - value = "8523872"; - type = "String"; - } - } - element i2c_opencores_1 - { - datum _sortIndex - { - value = "10"; - type = "int"; - } - } - element i2c_opencores_1.avalon_slave_0 - { - datum baseAddress - { - value = "8523840"; - type = "String"; - } - } - element jtag_uart_0 + element hw_crc32_0 { datum _sortIndex { @@ -81,47 +59,83 @@ type = "int"; } } - element jtag_uart_0.avalon_jtag_slave + element hw_crc32_0.avalon_slave { - datum baseAddress - { - value = "8524048"; - type = "String"; - } - } - element nios2_hw_crc32_0 - { - datum _sortIndex - { - value = "2"; - type = "int"; - } - } - element nios2_qsys_0 - { - datum _sortIndex + datum _lockedAddress { value = "1"; - type = "int"; + type = "boolean"; } - } - element nios2_qsys_0.debug_mem_slave - { datum baseAddress { - value = "8521728"; + value = "135168"; type = "String"; } } - element nios_custom_instr_bitswap_0 + element i2c_opencores_0 { datum _sortIndex { - value = "4"; + value = "8"; type = "int"; } } - element nios_custom_instr_endianconverter_0 + element i2c_opencores_0.avalon_slave_0 + { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } + datum baseAddress + { + value = "135232"; + type = "String"; + } + } + element i2c_opencores_1 + { + datum _sortIndex + { + value = "9"; + type = "int"; + } + } + element i2c_opencores_1.avalon_slave_0 + { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } + datum baseAddress + { + value = "135200"; + type = "String"; + } + } + element jtag_uart_0 + { + datum _sortIndex + { + value = "5"; + type = "int"; + } + } + element jtag_uart_0.avalon_jtag_slave + { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } + datum baseAddress + { + value = "131104"; + type = "String"; + } + } + element master_0 { datum _sortIndex { @@ -133,15 +147,33 @@ { datum _sortIndex { - value = "5"; + value = "2"; type = "int"; } } element onchip_memory2_0.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8454144"; + value = "65536"; + type = "String"; + } + } + element onchip_memory2_0.s2 + { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } + datum baseAddress + { + value = "65536"; type = "String"; } } @@ -149,15 +181,20 @@ { datum _sortIndex { - value = "11"; + value = "10"; type = "int"; } } element pio_0.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8524032"; + value = "135392"; type = "String"; } } @@ -165,15 +202,20 @@ { datum _sortIndex { - value = "12"; + value = "11"; type = "int"; } } element pio_1.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8524016"; + value = "135376"; type = "String"; } } @@ -181,15 +223,20 @@ { datum _sortIndex { - value = "13"; + value = "12"; type = "int"; } } element pio_2.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8524000"; + value = "135360"; type = "String"; } } @@ -197,15 +244,20 @@ { datum _sortIndex { - value = "14"; + value = "13"; type = "int"; } } element pio_3.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8523984"; + value = "135344"; type = "String"; } } @@ -213,15 +265,20 @@ { datum _sortIndex { - value = "15"; + value = "14"; type = "int"; } } element pio_4.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8523968"; + value = "135328"; type = "String"; } } @@ -229,15 +286,20 @@ { datum _sortIndex { - value = "16"; + value = "15"; type = "int"; } } element pio_5.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8523952"; + value = "135312"; type = "String"; } } @@ -245,15 +307,20 @@ { datum _sortIndex { - value = "17"; + value = "16"; type = "int"; } } element pio_6.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8523936"; + value = "135296"; type = "String"; } } @@ -261,15 +328,20 @@ { datum _sortIndex { - value = "18"; + value = "17"; type = "int"; } } element pio_7.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8523920"; + value = "135280"; type = "String"; } } @@ -277,31 +349,57 @@ { datum _sortIndex { - value = "19"; + value = "18"; type = "int"; } } element pio_8.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8523904"; + value = "135264"; type = "String"; } } + element pulpino_0 + { + datum _sortIndex + { + value = "1"; + type = "int"; + } + } + element pulpino_0.avalon_slave_debug + { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } + } element timer_0 { datum _sortIndex { - value = "6"; + value = "4"; type = "int"; } } element timer_0.s1 { + datum _lockedAddress + { + value = "1"; + type = "boolean"; + } datum baseAddress { - value = "8523776"; + value = "131072"; type = "String"; } } @@ -337,6 +435,11 @@ internal="i2c_opencores_1.export" type="conduit" dir="end" /> + + @@ -402,6 +510,7 @@ ADDRESS_STALL 1 ADVANCED_INFO 0 ALLOWS_COMPILING_OTHER_FAMILY_IP 1 ANY_QFP 0 CELL_LEVEL_BACK_ANNOTATION_DISABLED 0 COMPILER_SUPPORT 1 DSP 0 DSP_SHIFTER_BLOCK 0 DUMP_ASM_LAB_BITS_FOR_POWER 1 EMUL 1 ENABLE_ADVANCED_IO_ANALYSIS_GUI_FEATURES 1 ENABLE_PIN_PLANNER 0 ENGINEERING_SAMPLE 0 EPCS 1 ESB 0 FAKE1 0 FAKE2 0 FAKE3 0 FAMILY_LEVEL_INSTALLATION_ONLY 1 FASTEST 0 FINAL_TIMING_MODEL 0 FITTER_USE_FALLING_EDGE_DELAY 0 FPP_COMPLETELY_PLACES_AND_ROUTES_PERIPHERY 0 GENERATE_DC_ON_CURRENT_WARNING_FOR_INTERNAL_CLAMPING_DIODE 0 HARDCOPY 0 HAS_18_BIT_MULTS 0 HAS_ACE_SUPPORT 1 HAS_ACTIVE_PARALLEL_FLASH_SUPPORT 0 HAS_ADJUSTABLE_OUTPUT_IO_TIMING_MEAS_POINT 0 HAS_ADVANCED_IO_INVERTED_CORNER 0 HAS_ADVANCED_IO_POWER_SUPPORT 1 HAS_ADVANCED_IO_TIMING_SUPPORT 1 HAS_ALM_SUPPORT 0 HAS_ATOM_AND_ROUTING_POWER_MODELED_TOGETHER 0 HAS_AUTO_DERIVE_CLOCK_UNCERTAINTY_SUPPORT 0 HAS_AUTO_FIT_SUPPORT 1 HAS_BALANCED_OPT_TECHNIQUE_SUPPORT 1 HAS_BENEFICIAL_SKEW_SUPPORT 1 HAS_BITLEVEL_DRIVE_STRENGTH_CONTROL 1 HAS_BSDL_FILE_GENERATION 1 HAS_CDB_RE_NETWORK_PRESERVATION_SUPPORT 0 HAS_CGA_SUPPORT 1 HAS_CHECK_NETLIST_SUPPORT 0 HAS_CLOCK_REGION_CHECKER_ENABLED 1 HAS_CORE_JUNCTION_TEMP_DERATING 0 HAS_CROSSTALK_SUPPORT 0 HAS_CUSTOM_REGION_SUPPORT 1 HAS_DAP_JTAG_FROM_HPS 0 HAS_DATA_DRIVEN_ACVQ_HSSI_SUPPORT 0 HAS_DDB_FDI_SUPPORT 0 HAS_DESIGN_ANALYZER_SUPPORT 1 HAS_DETAILED_IO_RAIL_POWER_MODEL 1 HAS_DETAILED_LEIM_STATIC_POWER_MODEL 1 HAS_DETAILED_LE_POWER_MODEL 1 HAS_DETAILED_ROUTING_MUX_STATIC_POWER_MODEL 1 HAS_DETAILED_THERMAL_CIRCUIT_PARAMETER_SUPPORT 1 HAS_DEVICE_MIGRATION_SUPPORT 1 HAS_DIAGONAL_MIGRATION_SUPPORT 0 HAS_EMIF_TOOLKIT_SUPPORT 0 HAS_ERROR_DETECTION_SUPPORT 0 HAS_FAMILY_VARIANT_MIGRATION_SUPPORT 0 HAS_FANOUT_FREE_NODE_SUPPORT 1 HAS_FAST_FIT_SUPPORT 1 HAS_FITTER_ECO_SUPPORT 1 HAS_FIT_NETLIST_OPT_RETIME_SUPPORT 1 HAS_FIT_NETLIST_OPT_SUPPORT 1 HAS_FORMAL_VERIFICATION_SUPPORT 1 HAS_FPGA_XCHANGE_SUPPORT 1 HAS_FSAC_LUTRAM_REGISTER_PACKING_SUPPORT 0 HAS_FULL_DAT_MIN_TIMING_SUPPORT 1 HAS_FULL_INCREMENTAL_DESIGN_SUPPORT 1 HAS_FUNCTIONAL_SIMULATION_SUPPORT 1 HAS_FUNCTIONAL_VERILOG_SIMULATION_SUPPORT 0 HAS_FUNCTIONAL_VHDL_SIMULATION_SUPPORT 0 HAS_GLITCH_FILTERING_SUPPORT 1 HAS_HARDCOPYII_SUPPORT 0 HAS_HC_READY_SUPPORT 0 HAS_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_HOLD_TIME_AVOIDANCE_ACROSS_CLOCK_SPINE_SUPPORT 1 HAS_HSPICE_WRITER_SUPPORT 1 HAS_HSSI_POWER_CALCULATOR 0 HAS_IBISO_WRITER_SUPPORT 0 HAS_ICD_DATA_IP 0 HAS_IDB_SUPPORT 1 HAS_INCREMENTAL_DAT_SUPPORT 1 HAS_INCREMENTAL_SYNTHESIS_SUPPORT 1 HAS_IO_ASSIGNMENT_ANALYSIS_SUPPORT 1 HAS_IO_DECODER 0 HAS_IO_PLACEMENT_OPTIMIZATION_SUPPORT 1 HAS_IO_PLACEMENT_USING_GEOMETRY_RULE 0 HAS_IO_PLACEMENT_USING_PHYSIC_RULE 0 HAS_IO_SMART_RECOMPILE_SUPPORT 0 HAS_JITTER_SUPPORT 1 HAS_JTAG_SLD_HUB_SUPPORT 1 HAS_LOGIC_LOCK_SUPPORT 1 HAS_MICROPROCESSOR 0 HAS_MIF_SMART_COMPILE_SUPPORT 1 HAS_MINMAX_TIMING_MODELING_SUPPORT 1 HAS_MIN_TIMING_ANALYSIS_SUPPORT 1 HAS_MUX_RESTRUCTURE_SUPPORT 1 HAS_NADDER_STYLE_CLOCKING 0 HAS_NADDER_STYLE_FF 0 HAS_NADDER_STYLE_LCELL_COMB 0 HAS_NEW_CDB_NAME_FOR_M20K_SCLR 0 HAS_NEW_HC_FLOW_SUPPORT 0 HAS_NEW_SERDES_MAX_RESOURCE_COUNT_REPORTING_SUPPORT 1 HAS_NEW_VPR_SUPPORT 1 HAS_NONSOCKET_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_NO_HARDBLOCK_PARTITION_SUPPORT 0 HAS_NO_JTAG_USERCODE_SUPPORT 0 HAS_OPERATING_SETTINGS_AND_CONDITIONS_REPORTING_SUPPORT 1 HAS_PAD_LOCATION_ASSIGNMENT_SUPPORT 0 HAS_PARTIAL_RECONFIG_SUPPORT 0 HAS_PASSIVE_PARALLEL_SUPPORT 0 HAS_PDN_MODEL_STATUS 0 HAS_PHYSICAL_DESIGN_PLANNER_SUPPORT 0 HAS_PHYSICAL_NETLIST_OUTPUT 0 HAS_PHYSICAL_ROUTING_SUPPORT 0 HAS_PIN_SPECIFIC_VOLTAGE_SUPPORT 1 HAS_PLDM_REF_SUPPORT 1 HAS_POWER_BINNING_LIMITS_DATA 0 HAS_POWER_ESTIMATION_SUPPORT 1 HAS_PRELIMINARY_CLOCK_UNCERTAINTY_NUMBERS 0 HAS_PRE_FITTER_FPP_SUPPORT 0 HAS_PRE_FITTER_LUTRAM_NETLIST_CHECKER_ENABLED 0 HAS_PVA_SUPPORT 1 HAS_QUARTUS_HIERARCHICAL_DESIGN_SUPPORT 0 HAS_RAPID_RECOMPILE_SUPPORT 0 HAS_RCF_SUPPORT 1 HAS_RCF_SUPPORT_FOR_DEBUGGING 0 HAS_RED_BLACK_SEPARATION_SUPPORT 0 HAS_RE_LEVEL_TIMING_GRAPH_SUPPORT 1 HAS_RISEFALL_DELAY_SUPPORT 1 HAS_SIGNAL_PROBE_SUPPORT 1 HAS_SIGNAL_TAP_SUPPORT 1 HAS_SIMULATOR_SUPPORT 0 HAS_SPLIT_IO_SUPPORT 1 HAS_SPLIT_LC_SUPPORT 1 HAS_STRICT_PRESERVATION_SUPPORT 1 HAS_SYNTHESIS_ON_ATOMS 0 HAS_SYNTH_FSYN_NETLIST_OPT_SUPPORT 1 HAS_SYNTH_NETLIST_OPT_RETIME_SUPPORT 1 HAS_SYNTH_NETLIST_OPT_SUPPORT 1 HAS_TCL_FITTER_SUPPORT 0 HAS_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_TEMPLATED_REGISTER_PACKING_SUPPORT 1 HAS_TIME_BORROWING_SUPPORT 0 HAS_TIMING_DRIVEN_SYNTHESIS_SUPPORT 1 HAS_TIMING_INFO_SUPPORT 1 HAS_TIMING_OPERATING_CONDITIONS 1 HAS_TIMING_SIMULATION_SUPPORT 1 HAS_TITAN_BASED_MAC_REGISTER_PACKER_SUPPORT 0 HAS_U2B2_SUPPORT 0 HAS_USER_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_USE_FITTER_INFO_SUPPORT 1 HAS_VCCPD_POWER_RAIL 0 HAS_VERTICAL_MIGRATION_SUPPORT 1 HAS_VIEWDRAW_SYMBOL_SUPPORT 0 HAS_VIO_SUPPORT 1 HAS_VIRTUAL_DEVICES 0 HAS_WYSIWYG_DFFEAS_SUPPORT 1 HAS_XIBISO2_WRITER_SUPPORT 0 HAS_XIBISO_WRITER_SUPPORT 1 IFP_USE_LEGACY_IO_CHECKER 0 INCREMENTAL_DESIGN_SUPPORTS_COMPATIBLE_CONSTRAINTS 1 INSTALLED 0 INTERNAL_POF_SUPPORT_ENABLED 0 INTERNAL_USE_ONLY 0 ISSUE_MILITARY_TEMPERATURE_WARNING 0 IS_BARE_DIE 0 IS_CONFIG_ROM 0 IS_DEFAULT_FAMILY 0 IS_FOR_INTERNAL_TESTING_ONLY 0 IS_HARDCOPY_FAMILY 0 IS_HBGA_PACKAGE 0 IS_HIGH_CURRENT_PART 0 IS_LOW_POWER_PART 0 IS_REVE_SILICON 0 IS_SDM_ONLY_PACKAGE 0 IS_SMI_PART 0 LOAD_BLK_TYPE_DATA_FROM_ATOM_WYS_INFO 0 LVDS_IO 1 M10K_MEMORY 0 M144K_MEMORY 0 M20K_MEMORY 0 M4K_MEMORY 0 M512_MEMORY 0 M9K_MEMORY 1 MLAB_MEMORY 0 MRAM_MEMORY 0 NOT_LISTED 0 NOT_MIGRATABLE 0 NO_FITTER_DELAY_CACHE_GENERATED 0 NO_PIN_OUT 0 NO_POF 0 NO_RPE_SUPPORT 0 NO_SUPPORT_FOR_LOGICLOCK_CONTENT_BACK_ANNOTATION 1 NO_SUPPORT_FOR_STA_CLOCK_UNCERTAINTY_CHECK 0 NO_TDC_SUPPORT 0 POSTFIT_BAK_DATABASE_EXPORT_ENABLED 1 POSTMAP_BAK_DATABASE_EXPORT_ENABLED 1 PROGRAMMER_ONLY 0 PROGRAMMER_SUPPORT 1 PVA_SUPPORTS_ONLY_SUBSET_OF_ATOMS 0 QFIT_IN_DEVELOPMENT 0 QMAP_IN_DEVELOPMENT 0 RAM_LOGICAL_NAME_CHECKING_IN_CUT_ENABLED 1 REPORTS_METASTABILITY_MTBF 1 REQUIRES_INSTALLATION_PATCH 0 REQUIRES_LIST_OF_TEMPERATURE_AND_VOLTAGE_OPERATING_CONDITIONS 1 REQUIRE_QUARTUS_HIERARCHICAL_DESIGN 0 REQUIRE_SPECIAL_HANDLING_FOR_LOCAL_LABLINE 1 RESERVES_SIGNAL_PROBE_PINS 0 RESOLVE_MAX_FANOUT_EARLY 1 RESOLVE_MAX_FANOUT_LATE 0 RESPECTS_FIXED_SIZED_LOCKED_LOCATION_LOGICLOCK 1 RESTRICTED_USER_SELECTION 0 RESTRICT_PARTIAL_RECONFIG 0 RISEFALL_SUPPORT_IS_HIDDEN 0 SHOW_HIDDEN_FAMILY_IN_PROGRAMMER 0 STRICT_TIMING_DB_CHECKS 0 SUPPORTS_ADDITIONAL_OPTIONS_FOR_UNUSED_IO 0 SUPPORTS_CRC 1 SUPPORTS_DIFFERENTIAL_AIOT_BOARD_TRACE_MODEL 1 SUPPORTS_DSP_BALANCING_BACK_ANNOTATION 0 SUPPORTS_GENERATION_OF_EARLY_POWER_ESTIMATOR_FILE 1 SUPPORTS_GLOBAL_SIGNAL_BACK_ANNOTATION 0 SUPPORTS_HIPI_RETIMING 0 SUPPORTS_LICENSE_FREE_PARTIAL_RECONFIG 0 SUPPORTS_MAC_CHAIN_OUT_ADDER 0 SUPPORTS_RAM_PACKING_BACK_ANNOTATION 0 SUPPORTS_REG_PACKING_BACK_ANNOTATION 0 SUPPORTS_SIGNALPROBE_REGISTER_PIPELINING 1 SUPPORTS_SINGLE_ENDED_AIOT_BOARD_TRACE_MODEL 1 SUPPORTS_USER_MANUAL_LOGIC_DUPLICATION 1 SUPPORTS_VID 0 SUPPORT_HIGH_SPEED_HPS 0 TMV_RUN_CUSTOMIZABLE_VIEWER 1 TMV_RUN_INTERNAL_DETAILS 1 TMV_RUN_INTERNAL_DETAILS_ON_IO 0 TMV_RUN_INTERNAL_DETAILS_ON_IOBUF 1 TMV_RUN_INTERNAL_DETAILS_ON_LCELL 0 TMV_RUN_INTERNAL_DETAILS_ON_LRAM 0 TRANSCEIVER_3G_BLOCK 0 TRANSCEIVER_6G_BLOCK 0 USES_ACV_FOR_FLED 1 USES_ADB_FOR_BACK_ANNOTATION 1 USES_ALTERA_LNSIM 0 USES_ASIC_ROUTING_POWER_CALCULATOR 0 USES_DATA_DRIVEN_PLL_COMPUTATION_UTIL 1 USES_DEV 1 USES_ICP_FOR_ECO_FITTER 0 USES_LIBERTY_TIMING 0 USES_NETWORK_ROUTING_POWER_CALCULATOR 0 USES_PART_INFO_FOR_DISPLAYING_CORE_VOLTAGE_VALUE 0 USES_POWER_SIGNAL_ACTIVITIES 1 USES_PVAFAM2 0 USES_SECOND_GENERATION_PART_INFO 0 USES_SECOND_GENERATION_POWER_ANALYZER 0 USES_THIRD_GENERATION_TIMING_MODELS_TIS 1 USES_U2B2_TIMING_MODELS 0 USES_XML_FORMAT_FOR_EMIF_PIN_MAP_FILE 0 USE_ADVANCED_IO_POWER_BY_DEFAULT 1 USE_ADVANCED_IO_TIMING_BY_DEFAULT 1 USE_BASE_FAMILY_DDB_PATH 0 USE_OCT_AUTO_CALIBRATION 1 USE_RELAX_IO_ASSIGNMENT_RULES 0 USE_RISEFALL_ONLY 1 USE_SEPARATE_LIST_FOR_TECH_MIGRATION 0 USE_SINGLE_COMPILER_PASS_PLL_MIF_FILE_WRITER 1 USE_TITAN_IO_BASED_IO_REGISTER_PACKER_UTIL 0 USING_28NM_OR_OLDER_TIMING_METHODOLOGY 1 WYSIWYG_BUS_WIDTH_CHECKING_IN_CUT_ENABLED 1 + - - - - - - - - - - - - - - nios2_qsys_0.jtag_debug_module - - - - - - ]]> - - - - - - - ]]> - - - - - - - - - - - - - - - - - - - - - - ADDRESS_STALL 1 ADVANCED_INFO 0 ALLOWS_COMPILING_OTHER_FAMILY_IP 1 ANY_QFP 0 CELL_LEVEL_BACK_ANNOTATION_DISABLED 0 COMPILER_SUPPORT 1 DSP 0 DSP_SHIFTER_BLOCK 0 DUMP_ASM_LAB_BITS_FOR_POWER 1 EMUL 1 ENABLE_ADVANCED_IO_ANALYSIS_GUI_FEATURES 1 ENABLE_PIN_PLANNER 0 ENGINEERING_SAMPLE 0 EPCS 1 ESB 0 FAKE1 0 FAKE2 0 FAKE3 0 FAMILY_LEVEL_INSTALLATION_ONLY 1 FASTEST 0 FINAL_TIMING_MODEL 0 FITTER_USE_FALLING_EDGE_DELAY 0 FPP_COMPLETELY_PLACES_AND_ROUTES_PERIPHERY 0 GENERATE_DC_ON_CURRENT_WARNING_FOR_INTERNAL_CLAMPING_DIODE 0 HARDCOPY 0 HAS_18_BIT_MULTS 0 HAS_ACE_SUPPORT 1 HAS_ACTIVE_PARALLEL_FLASH_SUPPORT 0 HAS_ADJUSTABLE_OUTPUT_IO_TIMING_MEAS_POINT 0 HAS_ADVANCED_IO_INVERTED_CORNER 0 HAS_ADVANCED_IO_POWER_SUPPORT 1 HAS_ADVANCED_IO_TIMING_SUPPORT 1 HAS_ALM_SUPPORT 0 HAS_ATOM_AND_ROUTING_POWER_MODELED_TOGETHER 0 HAS_AUTO_DERIVE_CLOCK_UNCERTAINTY_SUPPORT 0 HAS_AUTO_FIT_SUPPORT 1 HAS_BALANCED_OPT_TECHNIQUE_SUPPORT 1 HAS_BENEFICIAL_SKEW_SUPPORT 1 HAS_BITLEVEL_DRIVE_STRENGTH_CONTROL 1 HAS_BSDL_FILE_GENERATION 1 HAS_CDB_RE_NETWORK_PRESERVATION_SUPPORT 0 HAS_CGA_SUPPORT 1 HAS_CHECK_NETLIST_SUPPORT 0 HAS_CLOCK_REGION_CHECKER_ENABLED 1 HAS_CORE_JUNCTION_TEMP_DERATING 0 HAS_CROSSTALK_SUPPORT 0 HAS_CUSTOM_REGION_SUPPORT 1 HAS_DAP_JTAG_FROM_HPS 0 HAS_DATA_DRIVEN_ACVQ_HSSI_SUPPORT 0 HAS_DDB_FDI_SUPPORT 0 HAS_DESIGN_ANALYZER_SUPPORT 1 HAS_DETAILED_IO_RAIL_POWER_MODEL 1 HAS_DETAILED_LEIM_STATIC_POWER_MODEL 1 HAS_DETAILED_LE_POWER_MODEL 1 HAS_DETAILED_ROUTING_MUX_STATIC_POWER_MODEL 1 HAS_DETAILED_THERMAL_CIRCUIT_PARAMETER_SUPPORT 1 HAS_DEVICE_MIGRATION_SUPPORT 1 HAS_DIAGONAL_MIGRATION_SUPPORT 0 HAS_EMIF_TOOLKIT_SUPPORT 0 HAS_ERROR_DETECTION_SUPPORT 0 HAS_FAMILY_VARIANT_MIGRATION_SUPPORT 0 HAS_FANOUT_FREE_NODE_SUPPORT 1 HAS_FAST_FIT_SUPPORT 1 HAS_FITTER_ECO_SUPPORT 1 HAS_FIT_NETLIST_OPT_RETIME_SUPPORT 1 HAS_FIT_NETLIST_OPT_SUPPORT 1 HAS_FORMAL_VERIFICATION_SUPPORT 1 HAS_FPGA_XCHANGE_SUPPORT 1 HAS_FSAC_LUTRAM_REGISTER_PACKING_SUPPORT 0 HAS_FULL_DAT_MIN_TIMING_SUPPORT 1 HAS_FULL_INCREMENTAL_DESIGN_SUPPORT 1 HAS_FUNCTIONAL_SIMULATION_SUPPORT 1 HAS_FUNCTIONAL_VERILOG_SIMULATION_SUPPORT 0 HAS_FUNCTIONAL_VHDL_SIMULATION_SUPPORT 0 HAS_GLITCH_FILTERING_SUPPORT 1 HAS_HARDCOPYII_SUPPORT 0 HAS_HC_READY_SUPPORT 0 HAS_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_HOLD_TIME_AVOIDANCE_ACROSS_CLOCK_SPINE_SUPPORT 1 HAS_HSPICE_WRITER_SUPPORT 1 HAS_HSSI_POWER_CALCULATOR 0 HAS_IBISO_WRITER_SUPPORT 0 HAS_ICD_DATA_IP 0 HAS_IDB_SUPPORT 1 HAS_INCREMENTAL_DAT_SUPPORT 1 HAS_INCREMENTAL_SYNTHESIS_SUPPORT 1 HAS_IO_ASSIGNMENT_ANALYSIS_SUPPORT 1 HAS_IO_DECODER 0 HAS_IO_PLACEMENT_OPTIMIZATION_SUPPORT 1 HAS_IO_PLACEMENT_USING_GEOMETRY_RULE 0 HAS_IO_PLACEMENT_USING_PHYSIC_RULE 0 HAS_IO_SMART_RECOMPILE_SUPPORT 0 HAS_JITTER_SUPPORT 1 HAS_JTAG_SLD_HUB_SUPPORT 1 HAS_LOGIC_LOCK_SUPPORT 1 HAS_MICROPROCESSOR 0 HAS_MIF_SMART_COMPILE_SUPPORT 1 HAS_MINMAX_TIMING_MODELING_SUPPORT 1 HAS_MIN_TIMING_ANALYSIS_SUPPORT 1 HAS_MUX_RESTRUCTURE_SUPPORT 1 HAS_NADDER_STYLE_CLOCKING 0 HAS_NADDER_STYLE_FF 0 HAS_NADDER_STYLE_LCELL_COMB 0 HAS_NEW_CDB_NAME_FOR_M20K_SCLR 0 HAS_NEW_HC_FLOW_SUPPORT 0 HAS_NEW_SERDES_MAX_RESOURCE_COUNT_REPORTING_SUPPORT 1 HAS_NEW_VPR_SUPPORT 1 HAS_NONSOCKET_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_NO_HARDBLOCK_PARTITION_SUPPORT 0 HAS_NO_JTAG_USERCODE_SUPPORT 0 HAS_OPERATING_SETTINGS_AND_CONDITIONS_REPORTING_SUPPORT 1 HAS_PAD_LOCATION_ASSIGNMENT_SUPPORT 0 HAS_PARTIAL_RECONFIG_SUPPORT 0 HAS_PASSIVE_PARALLEL_SUPPORT 0 HAS_PDN_MODEL_STATUS 0 HAS_PHYSICAL_DESIGN_PLANNER_SUPPORT 0 HAS_PHYSICAL_NETLIST_OUTPUT 0 HAS_PHYSICAL_ROUTING_SUPPORT 0 HAS_PIN_SPECIFIC_VOLTAGE_SUPPORT 1 HAS_PLDM_REF_SUPPORT 1 HAS_POWER_BINNING_LIMITS_DATA 0 HAS_POWER_ESTIMATION_SUPPORT 1 HAS_PRELIMINARY_CLOCK_UNCERTAINTY_NUMBERS 0 HAS_PRE_FITTER_FPP_SUPPORT 0 HAS_PRE_FITTER_LUTRAM_NETLIST_CHECKER_ENABLED 0 HAS_PVA_SUPPORT 1 HAS_QUARTUS_HIERARCHICAL_DESIGN_SUPPORT 0 HAS_RAPID_RECOMPILE_SUPPORT 0 HAS_RCF_SUPPORT 1 HAS_RCF_SUPPORT_FOR_DEBUGGING 0 HAS_RED_BLACK_SEPARATION_SUPPORT 0 HAS_RE_LEVEL_TIMING_GRAPH_SUPPORT 1 HAS_RISEFALL_DELAY_SUPPORT 1 HAS_SIGNAL_PROBE_SUPPORT 1 HAS_SIGNAL_TAP_SUPPORT 1 HAS_SIMULATOR_SUPPORT 0 HAS_SPLIT_IO_SUPPORT 1 HAS_SPLIT_LC_SUPPORT 1 HAS_STRICT_PRESERVATION_SUPPORT 1 HAS_SYNTHESIS_ON_ATOMS 0 HAS_SYNTH_FSYN_NETLIST_OPT_SUPPORT 1 HAS_SYNTH_NETLIST_OPT_RETIME_SUPPORT 1 HAS_SYNTH_NETLIST_OPT_SUPPORT 1 HAS_TCL_FITTER_SUPPORT 0 HAS_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_TEMPLATED_REGISTER_PACKING_SUPPORT 1 HAS_TIME_BORROWING_SUPPORT 0 HAS_TIMING_DRIVEN_SYNTHESIS_SUPPORT 1 HAS_TIMING_INFO_SUPPORT 1 HAS_TIMING_OPERATING_CONDITIONS 1 HAS_TIMING_SIMULATION_SUPPORT 1 HAS_TITAN_BASED_MAC_REGISTER_PACKER_SUPPORT 0 HAS_U2B2_SUPPORT 0 HAS_USER_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_USE_FITTER_INFO_SUPPORT 1 HAS_VCCPD_POWER_RAIL 0 HAS_VERTICAL_MIGRATION_SUPPORT 1 HAS_VIEWDRAW_SYMBOL_SUPPORT 0 HAS_VIO_SUPPORT 1 HAS_VIRTUAL_DEVICES 0 HAS_WYSIWYG_DFFEAS_SUPPORT 1 HAS_XIBISO2_WRITER_SUPPORT 0 HAS_XIBISO_WRITER_SUPPORT 1 IFP_USE_LEGACY_IO_CHECKER 0 INCREMENTAL_DESIGN_SUPPORTS_COMPATIBLE_CONSTRAINTS 1 INSTALLED 0 INTERNAL_POF_SUPPORT_ENABLED 0 INTERNAL_USE_ONLY 0 ISSUE_MILITARY_TEMPERATURE_WARNING 0 IS_BARE_DIE 0 IS_CONFIG_ROM 0 IS_DEFAULT_FAMILY 0 IS_FOR_INTERNAL_TESTING_ONLY 0 IS_HARDCOPY_FAMILY 0 IS_HBGA_PACKAGE 0 IS_HIGH_CURRENT_PART 0 IS_LOW_POWER_PART 0 IS_REVE_SILICON 0 IS_SDM_ONLY_PACKAGE 0 IS_SMI_PART 0 LOAD_BLK_TYPE_DATA_FROM_ATOM_WYS_INFO 0 LVDS_IO 1 M10K_MEMORY 0 M144K_MEMORY 0 M20K_MEMORY 0 M4K_MEMORY 0 M512_MEMORY 0 M9K_MEMORY 1 MLAB_MEMORY 0 MRAM_MEMORY 0 NOT_LISTED 0 NOT_MIGRATABLE 0 NO_FITTER_DELAY_CACHE_GENERATED 0 NO_PIN_OUT 0 NO_POF 0 NO_RPE_SUPPORT 0 NO_SUPPORT_FOR_LOGICLOCK_CONTENT_BACK_ANNOTATION 1 NO_SUPPORT_FOR_STA_CLOCK_UNCERTAINTY_CHECK 0 NO_TDC_SUPPORT 0 POSTFIT_BAK_DATABASE_EXPORT_ENABLED 1 POSTMAP_BAK_DATABASE_EXPORT_ENABLED 1 PROGRAMMER_ONLY 0 PROGRAMMER_SUPPORT 1 PVA_SUPPORTS_ONLY_SUBSET_OF_ATOMS 0 QFIT_IN_DEVELOPMENT 0 QMAP_IN_DEVELOPMENT 0 RAM_LOGICAL_NAME_CHECKING_IN_CUT_ENABLED 1 REPORTS_METASTABILITY_MTBF 1 REQUIRES_INSTALLATION_PATCH 0 REQUIRES_LIST_OF_TEMPERATURE_AND_VOLTAGE_OPERATING_CONDITIONS 1 REQUIRE_QUARTUS_HIERARCHICAL_DESIGN 0 REQUIRE_SPECIAL_HANDLING_FOR_LOCAL_LABLINE 1 RESERVES_SIGNAL_PROBE_PINS 0 RESOLVE_MAX_FANOUT_EARLY 1 RESOLVE_MAX_FANOUT_LATE 0 RESPECTS_FIXED_SIZED_LOCKED_LOCATION_LOGICLOCK 1 RESTRICTED_USER_SELECTION 0 RESTRICT_PARTIAL_RECONFIG 0 RISEFALL_SUPPORT_IS_HIDDEN 0 SHOW_HIDDEN_FAMILY_IN_PROGRAMMER 0 STRICT_TIMING_DB_CHECKS 0 SUPPORTS_ADDITIONAL_OPTIONS_FOR_UNUSED_IO 0 SUPPORTS_CRC 1 SUPPORTS_DIFFERENTIAL_AIOT_BOARD_TRACE_MODEL 1 SUPPORTS_DSP_BALANCING_BACK_ANNOTATION 0 SUPPORTS_GENERATION_OF_EARLY_POWER_ESTIMATOR_FILE 1 SUPPORTS_GLOBAL_SIGNAL_BACK_ANNOTATION 0 SUPPORTS_HIPI_RETIMING 0 SUPPORTS_LICENSE_FREE_PARTIAL_RECONFIG 0 SUPPORTS_MAC_CHAIN_OUT_ADDER 0 SUPPORTS_RAM_PACKING_BACK_ANNOTATION 0 SUPPORTS_REG_PACKING_BACK_ANNOTATION 0 SUPPORTS_SIGNALPROBE_REGISTER_PIPELINING 1 SUPPORTS_SINGLE_ENDED_AIOT_BOARD_TRACE_MODEL 1 SUPPORTS_USER_MANUAL_LOGIC_DUPLICATION 1 SUPPORTS_VID 0 SUPPORT_HIGH_SPEED_HPS 0 TMV_RUN_CUSTOMIZABLE_VIEWER 1 TMV_RUN_INTERNAL_DETAILS 1 TMV_RUN_INTERNAL_DETAILS_ON_IO 0 TMV_RUN_INTERNAL_DETAILS_ON_IOBUF 1 TMV_RUN_INTERNAL_DETAILS_ON_LCELL 0 TMV_RUN_INTERNAL_DETAILS_ON_LRAM 0 TRANSCEIVER_3G_BLOCK 0 TRANSCEIVER_6G_BLOCK 0 USES_ACV_FOR_FLED 1 USES_ADB_FOR_BACK_ANNOTATION 1 USES_ALTERA_LNSIM 0 USES_ASIC_ROUTING_POWER_CALCULATOR 0 USES_DATA_DRIVEN_PLL_COMPUTATION_UTIL 1 USES_DEV 1 USES_ICP_FOR_ECO_FITTER 0 USES_LIBERTY_TIMING 0 USES_NETWORK_ROUTING_POWER_CALCULATOR 0 USES_PART_INFO_FOR_DISPLAYING_CORE_VOLTAGE_VALUE 0 USES_POWER_SIGNAL_ACTIVITIES 1 USES_PVAFAM2 0 USES_SECOND_GENERATION_PART_INFO 0 USES_SECOND_GENERATION_POWER_ANALYZER 0 USES_THIRD_GENERATION_TIMING_MODELS_TIS 1 USES_U2B2_TIMING_MODELS 0 USES_XML_FORMAT_FOR_EMIF_PIN_MAP_FILE 0 USE_ADVANCED_IO_POWER_BY_DEFAULT 1 USE_ADVANCED_IO_TIMING_BY_DEFAULT 1 USE_BASE_FAMILY_DDB_PATH 0 USE_OCT_AUTO_CALIBRATION 1 USE_RELAX_IO_ASSIGNMENT_RULES 0 USE_RISEFALL_ONLY 1 USE_SEPARATE_LIST_FOR_TECH_MIGRATION 0 USE_SINGLE_COMPILER_PASS_PLL_MIF_FILE_WRITER 1 USE_TITAN_IO_BASED_IO_REGISTER_PACKER_UTIL 0 USING_28NM_OR_OLDER_TIMING_METHODOLOGY 1 WYSIWYG_BUS_WIDTH_CHECKING_IN_CUT_ENABLED 1 - - - - - - - - - - - - - - - - - ]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + ADDRESS_STALL 1 ADVANCED_INFO 0 ALLOWS_COMPILING_OTHER_FAMILY_IP 1 ANY_QFP 0 CELL_LEVEL_BACK_ANNOTATION_DISABLED 0 COMPILER_SUPPORT 1 DSP 0 DSP_SHIFTER_BLOCK 0 DUMP_ASM_LAB_BITS_FOR_POWER 1 EMUL 1 ENABLE_ADVANCED_IO_ANALYSIS_GUI_FEATURES 1 ENABLE_PIN_PLANNER 0 ENGINEERING_SAMPLE 0 EPCS 1 ESB 0 FAKE1 0 FAKE2 0 FAKE3 0 FAMILY_LEVEL_INSTALLATION_ONLY 1 FASTEST 0 FINAL_TIMING_MODEL 0 FITTER_USE_FALLING_EDGE_DELAY 0 FPP_COMPLETELY_PLACES_AND_ROUTES_PERIPHERY 0 GENERATE_DC_ON_CURRENT_WARNING_FOR_INTERNAL_CLAMPING_DIODE 0 HARDCOPY 0 HAS_18_BIT_MULTS 0 HAS_ACE_SUPPORT 1 HAS_ACTIVE_PARALLEL_FLASH_SUPPORT 0 HAS_ADJUSTABLE_OUTPUT_IO_TIMING_MEAS_POINT 0 HAS_ADVANCED_IO_INVERTED_CORNER 0 HAS_ADVANCED_IO_POWER_SUPPORT 1 HAS_ADVANCED_IO_TIMING_SUPPORT 1 HAS_ALM_SUPPORT 0 HAS_ATOM_AND_ROUTING_POWER_MODELED_TOGETHER 0 HAS_AUTO_DERIVE_CLOCK_UNCERTAINTY_SUPPORT 0 HAS_AUTO_FIT_SUPPORT 1 HAS_BALANCED_OPT_TECHNIQUE_SUPPORT 1 HAS_BENEFICIAL_SKEW_SUPPORT 1 HAS_BITLEVEL_DRIVE_STRENGTH_CONTROL 1 HAS_BSDL_FILE_GENERATION 1 HAS_CDB_RE_NETWORK_PRESERVATION_SUPPORT 0 HAS_CGA_SUPPORT 1 HAS_CHECK_NETLIST_SUPPORT 0 HAS_CLOCK_REGION_CHECKER_ENABLED 1 HAS_CORE_JUNCTION_TEMP_DERATING 0 HAS_CROSSTALK_SUPPORT 0 HAS_CUSTOM_REGION_SUPPORT 1 HAS_DAP_JTAG_FROM_HPS 0 HAS_DATA_DRIVEN_ACVQ_HSSI_SUPPORT 0 HAS_DDB_FDI_SUPPORT 0 HAS_DESIGN_ANALYZER_SUPPORT 1 HAS_DETAILED_IO_RAIL_POWER_MODEL 1 HAS_DETAILED_LEIM_STATIC_POWER_MODEL 1 HAS_DETAILED_LE_POWER_MODEL 1 HAS_DETAILED_ROUTING_MUX_STATIC_POWER_MODEL 1 HAS_DETAILED_THERMAL_CIRCUIT_PARAMETER_SUPPORT 1 HAS_DEVICE_MIGRATION_SUPPORT 1 HAS_DIAGONAL_MIGRATION_SUPPORT 0 HAS_EMIF_TOOLKIT_SUPPORT 0 HAS_ERROR_DETECTION_SUPPORT 0 HAS_FAMILY_VARIANT_MIGRATION_SUPPORT 0 HAS_FANOUT_FREE_NODE_SUPPORT 1 HAS_FAST_FIT_SUPPORT 1 HAS_FITTER_ECO_SUPPORT 1 HAS_FIT_NETLIST_OPT_RETIME_SUPPORT 1 HAS_FIT_NETLIST_OPT_SUPPORT 1 HAS_FORMAL_VERIFICATION_SUPPORT 1 HAS_FPGA_XCHANGE_SUPPORT 1 HAS_FSAC_LUTRAM_REGISTER_PACKING_SUPPORT 0 HAS_FULL_DAT_MIN_TIMING_SUPPORT 1 HAS_FULL_INCREMENTAL_DESIGN_SUPPORT 1 HAS_FUNCTIONAL_SIMULATION_SUPPORT 1 HAS_FUNCTIONAL_VERILOG_SIMULATION_SUPPORT 0 HAS_FUNCTIONAL_VHDL_SIMULATION_SUPPORT 0 HAS_GLITCH_FILTERING_SUPPORT 1 HAS_HARDCOPYII_SUPPORT 0 HAS_HC_READY_SUPPORT 0 HAS_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_HOLD_TIME_AVOIDANCE_ACROSS_CLOCK_SPINE_SUPPORT 1 HAS_HSPICE_WRITER_SUPPORT 1 HAS_HSSI_POWER_CALCULATOR 0 HAS_IBISO_WRITER_SUPPORT 0 HAS_ICD_DATA_IP 0 HAS_IDB_SUPPORT 1 HAS_INCREMENTAL_DAT_SUPPORT 1 HAS_INCREMENTAL_SYNTHESIS_SUPPORT 1 HAS_IO_ASSIGNMENT_ANALYSIS_SUPPORT 1 HAS_IO_DECODER 0 HAS_IO_PLACEMENT_OPTIMIZATION_SUPPORT 1 HAS_IO_PLACEMENT_USING_GEOMETRY_RULE 0 HAS_IO_PLACEMENT_USING_PHYSIC_RULE 0 HAS_IO_SMART_RECOMPILE_SUPPORT 0 HAS_JITTER_SUPPORT 1 HAS_JTAG_SLD_HUB_SUPPORT 1 HAS_LOGIC_LOCK_SUPPORT 1 HAS_MICROPROCESSOR 0 HAS_MIF_SMART_COMPILE_SUPPORT 1 HAS_MINMAX_TIMING_MODELING_SUPPORT 1 HAS_MIN_TIMING_ANALYSIS_SUPPORT 1 HAS_MUX_RESTRUCTURE_SUPPORT 1 HAS_NADDER_STYLE_CLOCKING 0 HAS_NADDER_STYLE_FF 0 HAS_NADDER_STYLE_LCELL_COMB 0 HAS_NEW_CDB_NAME_FOR_M20K_SCLR 0 HAS_NEW_HC_FLOW_SUPPORT 0 HAS_NEW_SERDES_MAX_RESOURCE_COUNT_REPORTING_SUPPORT 1 HAS_NEW_VPR_SUPPORT 1 HAS_NONSOCKET_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_NO_HARDBLOCK_PARTITION_SUPPORT 0 HAS_NO_JTAG_USERCODE_SUPPORT 0 HAS_OPERATING_SETTINGS_AND_CONDITIONS_REPORTING_SUPPORT 1 HAS_PAD_LOCATION_ASSIGNMENT_SUPPORT 0 HAS_PARTIAL_RECONFIG_SUPPORT 0 HAS_PASSIVE_PARALLEL_SUPPORT 0 HAS_PDN_MODEL_STATUS 0 HAS_PHYSICAL_DESIGN_PLANNER_SUPPORT 0 HAS_PHYSICAL_NETLIST_OUTPUT 0 HAS_PHYSICAL_ROUTING_SUPPORT 0 HAS_PIN_SPECIFIC_VOLTAGE_SUPPORT 1 HAS_PLDM_REF_SUPPORT 1 HAS_POWER_BINNING_LIMITS_DATA 0 HAS_POWER_ESTIMATION_SUPPORT 1 HAS_PRELIMINARY_CLOCK_UNCERTAINTY_NUMBERS 0 HAS_PRE_FITTER_FPP_SUPPORT 0 HAS_PRE_FITTER_LUTRAM_NETLIST_CHECKER_ENABLED 0 HAS_PVA_SUPPORT 1 HAS_QUARTUS_HIERARCHICAL_DESIGN_SUPPORT 0 HAS_RAPID_RECOMPILE_SUPPORT 0 HAS_RCF_SUPPORT 1 HAS_RCF_SUPPORT_FOR_DEBUGGING 0 HAS_RED_BLACK_SEPARATION_SUPPORT 0 HAS_RE_LEVEL_TIMING_GRAPH_SUPPORT 1 HAS_RISEFALL_DELAY_SUPPORT 1 HAS_SIGNAL_PROBE_SUPPORT 1 HAS_SIGNAL_TAP_SUPPORT 1 HAS_SIMULATOR_SUPPORT 0 HAS_SPLIT_IO_SUPPORT 1 HAS_SPLIT_LC_SUPPORT 1 HAS_STRICT_PRESERVATION_SUPPORT 1 HAS_SYNTHESIS_ON_ATOMS 0 HAS_SYNTH_FSYN_NETLIST_OPT_SUPPORT 1 HAS_SYNTH_NETLIST_OPT_RETIME_SUPPORT 1 HAS_SYNTH_NETLIST_OPT_SUPPORT 1 HAS_TCL_FITTER_SUPPORT 0 HAS_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_TEMPLATED_REGISTER_PACKING_SUPPORT 1 HAS_TIME_BORROWING_SUPPORT 0 HAS_TIMING_DRIVEN_SYNTHESIS_SUPPORT 1 HAS_TIMING_INFO_SUPPORT 1 HAS_TIMING_OPERATING_CONDITIONS 1 HAS_TIMING_SIMULATION_SUPPORT 1 HAS_TITAN_BASED_MAC_REGISTER_PACKER_SUPPORT 0 HAS_U2B2_SUPPORT 0 HAS_USER_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_USE_FITTER_INFO_SUPPORT 1 HAS_VCCPD_POWER_RAIL 0 HAS_VERTICAL_MIGRATION_SUPPORT 1 HAS_VIEWDRAW_SYMBOL_SUPPORT 0 HAS_VIO_SUPPORT 1 HAS_VIRTUAL_DEVICES 0 HAS_WYSIWYG_DFFEAS_SUPPORT 1 HAS_XIBISO2_WRITER_SUPPORT 0 HAS_XIBISO_WRITER_SUPPORT 1 IFP_USE_LEGACY_IO_CHECKER 0 INCREMENTAL_DESIGN_SUPPORTS_COMPATIBLE_CONSTRAINTS 1 INSTALLED 0 INTERNAL_POF_SUPPORT_ENABLED 0 INTERNAL_USE_ONLY 0 ISSUE_MILITARY_TEMPERATURE_WARNING 0 IS_BARE_DIE 0 IS_CONFIG_ROM 0 IS_DEFAULT_FAMILY 0 IS_FOR_INTERNAL_TESTING_ONLY 0 IS_HARDCOPY_FAMILY 0 IS_HBGA_PACKAGE 0 IS_HIGH_CURRENT_PART 0 IS_LOW_POWER_PART 0 IS_REVE_SILICON 0 IS_SDM_ONLY_PACKAGE 0 IS_SMI_PART 0 LOAD_BLK_TYPE_DATA_FROM_ATOM_WYS_INFO 0 LVDS_IO 1 M10K_MEMORY 0 M144K_MEMORY 0 M20K_MEMORY 0 M4K_MEMORY 0 M512_MEMORY 0 M9K_MEMORY 1 MLAB_MEMORY 0 MRAM_MEMORY 0 NOT_LISTED 0 NOT_MIGRATABLE 0 NO_FITTER_DELAY_CACHE_GENERATED 0 NO_PIN_OUT 0 NO_POF 0 NO_RPE_SUPPORT 0 NO_SUPPORT_FOR_LOGICLOCK_CONTENT_BACK_ANNOTATION 1 NO_SUPPORT_FOR_STA_CLOCK_UNCERTAINTY_CHECK 0 NO_TDC_SUPPORT 0 POSTFIT_BAK_DATABASE_EXPORT_ENABLED 1 POSTMAP_BAK_DATABASE_EXPORT_ENABLED 1 PROGRAMMER_ONLY 0 PROGRAMMER_SUPPORT 1 PVA_SUPPORTS_ONLY_SUBSET_OF_ATOMS 0 QFIT_IN_DEVELOPMENT 0 QMAP_IN_DEVELOPMENT 0 RAM_LOGICAL_NAME_CHECKING_IN_CUT_ENABLED 1 REPORTS_METASTABILITY_MTBF 1 REQUIRES_INSTALLATION_PATCH 0 REQUIRES_LIST_OF_TEMPERATURE_AND_VOLTAGE_OPERATING_CONDITIONS 1 REQUIRE_QUARTUS_HIERARCHICAL_DESIGN 0 REQUIRE_SPECIAL_HANDLING_FOR_LOCAL_LABLINE 1 RESERVES_SIGNAL_PROBE_PINS 0 RESOLVE_MAX_FANOUT_EARLY 1 RESOLVE_MAX_FANOUT_LATE 0 RESPECTS_FIXED_SIZED_LOCKED_LOCATION_LOGICLOCK 1 RESTRICTED_USER_SELECTION 0 RESTRICT_PARTIAL_RECONFIG 0 RISEFALL_SUPPORT_IS_HIDDEN 0 SHOW_HIDDEN_FAMILY_IN_PROGRAMMER 0 STRICT_TIMING_DB_CHECKS 0 SUPPORTS_ADDITIONAL_OPTIONS_FOR_UNUSED_IO 0 SUPPORTS_CRC 1 SUPPORTS_DIFFERENTIAL_AIOT_BOARD_TRACE_MODEL 1 SUPPORTS_DSP_BALANCING_BACK_ANNOTATION 0 SUPPORTS_GENERATION_OF_EARLY_POWER_ESTIMATOR_FILE 1 SUPPORTS_GLOBAL_SIGNAL_BACK_ANNOTATION 0 SUPPORTS_HIPI_RETIMING 0 SUPPORTS_LICENSE_FREE_PARTIAL_RECONFIG 0 SUPPORTS_MAC_CHAIN_OUT_ADDER 0 SUPPORTS_RAM_PACKING_BACK_ANNOTATION 0 SUPPORTS_REG_PACKING_BACK_ANNOTATION 0 SUPPORTS_SIGNALPROBE_REGISTER_PIPELINING 1 SUPPORTS_SINGLE_ENDED_AIOT_BOARD_TRACE_MODEL 1 SUPPORTS_USER_MANUAL_LOGIC_DUPLICATION 1 SUPPORTS_VID 0 SUPPORT_HIGH_SPEED_HPS 0 TMV_RUN_CUSTOMIZABLE_VIEWER 1 TMV_RUN_INTERNAL_DETAILS 1 TMV_RUN_INTERNAL_DETAILS_ON_IO 0 TMV_RUN_INTERNAL_DETAILS_ON_IOBUF 1 TMV_RUN_INTERNAL_DETAILS_ON_LCELL 0 TMV_RUN_INTERNAL_DETAILS_ON_LRAM 0 TRANSCEIVER_3G_BLOCK 0 TRANSCEIVER_6G_BLOCK 0 USES_ACV_FOR_FLED 1 USES_ADB_FOR_BACK_ANNOTATION 1 USES_ALTERA_LNSIM 0 USES_ASIC_ROUTING_POWER_CALCULATOR 0 USES_DATA_DRIVEN_PLL_COMPUTATION_UTIL 1 USES_DEV 1 USES_ICP_FOR_ECO_FITTER 0 USES_LIBERTY_TIMING 0 USES_NETWORK_ROUTING_POWER_CALCULATOR 0 USES_PART_INFO_FOR_DISPLAYING_CORE_VOLTAGE_VALUE 0 USES_POWER_SIGNAL_ACTIVITIES 1 USES_PVAFAM2 0 USES_SECOND_GENERATION_PART_INFO 0 USES_SECOND_GENERATION_POWER_ANALYZER 0 USES_THIRD_GENERATION_TIMING_MODELS_TIS 1 USES_U2B2_TIMING_MODELS 0 USES_XML_FORMAT_FOR_EMIF_PIN_MAP_FILE 0 USE_ADVANCED_IO_POWER_BY_DEFAULT 1 USE_ADVANCED_IO_TIMING_BY_DEFAULT 1 USE_BASE_FAMILY_DDB_PATH 0 USE_OCT_AUTO_CALIBRATION 1 USE_RELAX_IO_ASSIGNMENT_RULES 0 USE_RISEFALL_ONLY 1 USE_SEPARATE_LIST_FOR_TECH_MIGRATION 0 USE_SINGLE_COMPILER_PASS_PLL_MIF_FILE_WRITER 1 USE_TITAN_IO_BASED_IO_REGISTER_PACKER_UTIL 0 USING_28NM_OR_OLDER_TIMING_METHODOLOGY 1 WYSIWYG_BUS_WIDTH_CHECKING_IN_CUT_ENABLED 1 - + @@ -666,7 +583,7 @@ - + @@ -799,6 +716,18 @@ + + + + + + + + + + + + @@ -814,175 +743,183 @@ + + + + + - + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + start="master_0.master" + end="onchip_memory2_0.s2"> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -994,11 +931,22 @@ + + + - - - + + + - - - - - - + start="pulpino_0.interrupt_receiver" + end="jtag_uart_0.irq"> + - nios_custom_instr_endianconverter_0 - - - - - nios_custom_instr_bitswap_0 - - - + start="clk_27.clk_reset" + end="master_0.clk_reset" /> - + + diff --git a/sys.sopcinfo b/sys.sopcinfo index 9194afe..a219d82 100644 --- a/sys.sopcinfo +++ b/sys.sopcinfo @@ -1,11 +1,11 @@ - + java.lang.Integer - 1524077647 + 1540839221 false true false @@ -330,12 +330,6 @@ parameters are a RESULT of the module parameters. --> 1 clk - - false - nios2_qsys_0 - clk - nios2_qsys_0.clk - false jtag_uart_0 @@ -402,12 +396,30 @@ parameters are a RESULT of the module parameters. --> clk pio_8.clk + + false + master_0 + clk + master_0.clk + false onchip_memory2_0 clk1 onchip_memory2_0.clk1 + + false + pulpino_0 + clk_sink + pulpino_0.clk_sink + + + false + hw_crc32_0 + clk_sink + hw_crc32_0.clk_sink + false i2c_opencores_0 @@ -1630,6 +1642,493 @@ parameters are a RESULT of the module parameters. --> + + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + + + + boolean + false + false + true + false + true + + + java.lang.String + + false + true + false + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + clock + false + + clk + Input + 1 + clk + + + + + + java.lang.String + clk_sink + false + true + true + true + + + com.altera.sopcmodel.reset.Reset$Edges + DEASSERT + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + reset + false + + reset + Input + 1 + reset + + + + + + embeddedsw.configuration.isFlash + 0 + + + embeddedsw.configuration.isMemoryDevice + 0 + + + embeddedsw.configuration.isNonVolatileStorage + 0 + + + embeddedsw.configuration.isPrintableDevice + 0 + + + com.altera.sopcmodel.avalon.AvalonConnectionPoint$AddressAlignment + DYNAMIC + false + true + false + true + + + int + 0 + false + true + false + true + + + java.math.BigInteger + 32 + true + true + false + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + WORDS + false + true + true + true + + + boolean + false + false + true + false + true + + + java.lang.String + clk_sink + false + true + true + true + + + java.lang.String + reset_sink + false + true + true + true + + + int + 8 + false + true + true + true + + + java.math.BigInteger + + false + true + false + true + + + com.altera.entityinterfaces.IConnectionPoint + + false + true + false + true + + + boolean + false + false + true + true + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + WORDS + false + true + true + true + + + boolean + false + false + true + false + true + + + java.math.BigInteger + 0 + false + true + true + true + + + int + 0 + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + true + true + + + int + 0 + false + false + true + true + + + int + 0 + false + false + true + true + + + int + 1 + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 1 + false + true + true + true + + + int + 1 + false + true + false + true + + + int + 1 + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 0 + false + true + true + true + + + com.altera.sopcmodel.avalon.TimingUnits + Cycles + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 0 + false + true + false + true + + + int + 0 + false + true + false + true + + + int + 0 + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + avalon + false + + address + Input + 3 + address + + + readdata + Output + 32 + readdata + + + read + Input + 1 + read + + + chipselect + Input + 1 + chipselect + + + byteenable + Input + 4 + byteenable + + + write + Input + 1 + write + + + writedata + Input + 32 + writedata + + + - - - int - 32 - false - true - true - true - - - java.math.BigInteger - 4294967295 - false - true - true - true - - - java.math.BigInteger - 79764919 - false - true - true - true - - - int - 1 - false - true - true - true - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 4294967295 - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - - - - java.lang.String - - true - true - false - true - - - int - 3 - true - true - false - true - - - int - 0 - false - false - true - true - - - com.altera.sopcmodel.custominstruction.CustomInstruction$ClockCycleType - VARIABLE - true - true - true - true - - - int - 0 - true - true - false - true - - - boolean - false - false - true - false - true - - - int - 0 - false - true - false - true - - - int - 1 - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios_custom_instruction - false - - clk - Input - 1 - clk - - - clk_en - Input - 1 - clk_en - - - dataa - Input - 32 - dataa - - - done - Output - 1 - done - - - n - Input - 3 - n - - - reset - Input - 1 - reset - - - result - Output - 32 - result - - - start - Input - 1 - start - - - - + path="master_0"> debug.hostConnection - type jtag id 70:34|110:135 + type jtag id 110:132 - - embeddedsw.CMacro.BIG_ENDIAN + + int 0 - - - embeddedsw.CMacro.BREAK_ADDR - 0x00820820 - - - embeddedsw.CMacro.CPU_ARCH_NIOS2_R1 - - - - embeddedsw.CMacro.CPU_FREQ - 27000000u - - - embeddedsw.CMacro.CPU_ID_SIZE - 1 - - - embeddedsw.CMacro.CPU_ID_VALUE - 0x00000000 - - - embeddedsw.CMacro.CPU_IMPLEMENTATION - "tiny" - - - embeddedsw.CMacro.DATA_ADDR_WIDTH - 24 - - - embeddedsw.CMacro.DCACHE_LINE_SIZE - 0 - - - embeddedsw.CMacro.DCACHE_LINE_SIZE_LOG2 - 0 - - - embeddedsw.CMacro.DCACHE_SIZE - 0 - - - embeddedsw.CMacro.EXCEPTION_ADDR - 0x00810020 - - - embeddedsw.CMacro.FLASH_ACCELERATOR_LINES - 0 - - - embeddedsw.CMacro.FLASH_ACCELERATOR_LINE_SIZE - 0 - - - embeddedsw.CMacro.FLUSHDA_SUPPORTED - - - - embeddedsw.CMacro.HARDWARE_DIVIDE_PRESENT - 0 - - - embeddedsw.CMacro.HARDWARE_MULTIPLY_PRESENT - 0 - - - embeddedsw.CMacro.HARDWARE_MULX_PRESENT - 0 - - - embeddedsw.CMacro.HAS_DEBUG_CORE - 1 - - - embeddedsw.CMacro.HAS_DEBUG_STUB - - - - embeddedsw.CMacro.HAS_ILLEGAL_INSTRUCTION_EXCEPTION - - - - embeddedsw.CMacro.HAS_JMPI_INSTRUCTION - - - - embeddedsw.CMacro.ICACHE_LINE_SIZE - 0 - - - embeddedsw.CMacro.ICACHE_LINE_SIZE_LOG2 - 0 - - - embeddedsw.CMacro.ICACHE_SIZE - 0 - - - embeddedsw.CMacro.INST_ADDR_WIDTH - 24 - - - embeddedsw.CMacro.OCI_VERSION - 1 - - - embeddedsw.CMacro.RESET_ADDR - 0x00810000 - - - embeddedsw.configuration.DataCacheVictimBufImpl - ram - - - embeddedsw.configuration.HDLSimCachesCleared - 1 - - - embeddedsw.configuration.breakOffset - 32 - - - embeddedsw.configuration.breakSlave - nios2_qsys_0.debug_mem_slave - - - embeddedsw.configuration.cpuArchitecture - Nios II - - - embeddedsw.configuration.exceptionOffset - 32 - - - embeddedsw.configuration.exceptionSlave - onchip_memory2_0.s1 - - - embeddedsw.configuration.resetOffset - 0 - - - embeddedsw.configuration.resetSlave - onchip_memory2_0.s1 - - - embeddedsw.dts.compatible - altr,nios2-1.1 - - - embeddedsw.dts.group - cpu - - - embeddedsw.dts.name - nios2 - - - embeddedsw.dts.params.altr,exception-addr - 0x00810020 - - - embeddedsw.dts.params.altr,implementation - "tiny" - - - embeddedsw.dts.params.altr,reset-addr - 0x00810000 - - - embeddedsw.dts.params.clock-frequency - 27000000u - - - embeddedsw.dts.params.dcache-line-size - 0 - - - embeddedsw.dts.params.dcache-size - 0 - - - embeddedsw.dts.params.icache-line-size - 0 - - - embeddedsw.dts.params.icache-size - 0 - - - embeddedsw.dts.vendor - altr - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false false true true true - - boolean - false - false - true - true - true - - - boolean - false + + int + 50000 false false true true - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - true - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - int - 1 - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - true - false - true - false - true - - + int 0 false - false - true - true - - - int - 0 - false - false - true - true - - - boolean - true - false - false - true - true - - - boolean - true - false - true - true - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - true - false - true - false - true - - - boolean - true - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - false - true - true - - - boolean - false - false - false - true - true - - - boolean - false - false - false - true - true - - - boolean - true - false - false - true - true - - - boolean - false - false - true - true - true - - - boolean - true - false - true - true - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - int - 0 - false - false - true - true - - - int - 8 - false - false - true - true - - - int - 8 - false - false - true - true - - - int - 0 - false - false - true - true - - - int - 0 - false - true - true - true - - - int - 32 - false - true - true - true - - - int - 0 - false - true - true - true - - - int - 32 - false - true - false - true - - - java.lang.String - - false - true - false - true - - - java.lang.String - - false - true - false - true - - - java.lang.String - onchip_memory2_0.s1 - false - true - true - true - - - java.lang.String - None - false - false - true - true - - - java.lang.String - onchip_memory2_0.s1 - false - true - true - true - - - java.lang.String - nios2_qsys_0.jtag_debug_module - false - true - false - true - - - java.lang.String - Internal - false - false - true - true - - - java.lang.String - Dynamic - false - false - true - true - - - int - 8 - false - false - true - true - - - int - 1 - false - true - false - true - - - boolean - false - true - true - false - true - - - java.lang.String - medium_le_shift - true - true - false - true - - - java.lang.String - no_mul - true - true - false - true - - - int - 0 - false - false - true - true - - - int - 2 - false - false - true - true - - - int - 0 - false - false - true - true - - - int - 1 - false - false - true - true - - - java.lang.String - no_div - false - false - true - true - - - int - 12 - false - false - true - true - - - int - 12 - false - false - true - true - - - int - 4 - false - false - true - true - - - int - 6 - false - false - true - true - - - int - 7 - false - false - true - true - - - int - 16 - false - false - true - true - - - int - 8 - false - false - true - true - - - java.lang.String - Tiny - false - true - true - true - - - int - 0 - false - false - true - true - - - int - 2 - false - false - true - true - - - int - 0 - false - false - true - true - - - java.lang.String - Automatic - false - true - false - true - - - java.lang.String - Automatic - false - true - false - true - - - int - 0 - false - false - true - true - - - java.lang.String - None - false - false - true - true - - - java.lang.String - false - false - false - true - true - - - java.lang.String - ram - false - false - true - true - - - int - 0 - false - false - true - true - - - java.lang.String - Automatic - false - true - false - true - - - java.lang.String - Automatic - false - true - false - true - - - int - 0 - false - false - true - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - true - true - - - boolean - true - false - true - false - true - - - boolean - true - false - true - false - true - - - boolean - true - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - java.lang.String - Automatic - false - true - false - true - - - java.lang.String - Automatic - false - true - false - true - - - boolean - false - false - true - false - true - - - java.lang.String - Automatic - false - true - false - true - - - java.lang.String - Automatic - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - true - false - true - true - true - - - boolean - true - false - true - false - true - - - boolean - false - false - false - true - true - - - boolean - false - false - true - false - true - - - int - 0 - false - true - false - true - - - java.lang.String - _128 - false - false - true - true - - - int - 0 - false - false - true - true - - - int - 0 - false - false - true - true - - - java.lang.String - none - false - false - true - true - - - java.lang.String - onchip_trace - false - false - true - true - - - boolean - false - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - long - 0 - false - true - false - true - - - int - 8454144 - true - true - true - true - - - int - 8454176 - true - true - true - true - - - int - 8521760 - true - true - false - true - - - int - 0 - true - true - true - true - - - java.lang.String - false - true - true - false - true - - - int - 0 - true - true - false - true - - - java.lang.String - nios2_qsys_0.debug_mem_slave - true - true - false - true - - - int - 32 - true - true - false - true - - - boolean - false - true - true - false - true - - - boolean - false - true - true - false - true - - - java.lang.String - "synthesis translate_on" - true - true - false - true - - - java.lang.String - "synthesis translate_off" - true - true - false - true - - - boolean - false - true - true - false - true - - - boolean - false - true - true - false - true - - - boolean - false - true - true - false - true - - - boolean - false - true - true - false - true - - - int - 24 - false - true - false - true - ADDRESS_WIDTH - instruction_master - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - flash_instruction_master - - - int - 24 - false - true - false - true - ADDRESS_WIDTH - data_master - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - tightly_coupled_data_master_0 - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - tightly_coupled_data_master_1 - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - tightly_coupled_data_master_2 - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - tightly_coupled_data_master_3 - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - tightly_coupled_instruction_master_0 - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - tightly_coupled_instruction_master_1 - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - tightly_coupled_instruction_master_2 - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - tightly_coupled_instruction_master_3 - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - data_master_high_performance - - - int - 1 - false - true - false - true - ADDRESS_WIDTH - instruction_master_high_performance - - - java.lang.String - ]]> - false - true - false - true - ADDRESS_MAP - instruction_master - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - flash_instruction_master - - - java.lang.String - ]]> - false - true - false - true - ADDRESS_MAP - data_master - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - tightly_coupled_data_master_0 - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - tightly_coupled_data_master_1 - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - tightly_coupled_data_master_2 - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - tightly_coupled_data_master_3 - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - tightly_coupled_instruction_master_0 - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - tightly_coupled_instruction_master_1 - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - tightly_coupled_instruction_master_2 - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - tightly_coupled_instruction_master_3 - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - data_master_high_performance - - - java.lang.String - - false - true - false - true - ADDRESS_MAP - instruction_master_high_performance - - - long - 27000000 - false true false true CLOCK_RATE - clk + clock - + + int + 0 + false + true + true + true + + + int + 2 + false + false + true + true + + java.lang.String CYCLONEIVE false @@ -5583,65 +4192,6 @@ the requested settings for a module instance. --> true DEVICE_FAMILY - - long - 31 - false - true - false - true - INTERRUPTS_USED - irq - - - java.lang.String - ]]> - false - true - false - true - CUSTOM_INSTRUCTION_SLAVES - custom_instruction_master - - - java.lang.String - ]]> - false - true - false - true - CUSTOM_INSTRUCTION_SLAVES - custom_instruction_master_a - - - java.lang.String - ]]> - false - true - false - true - CUSTOM_INSTRUCTION_SLAVES - custom_instruction_master_b - - - java.lang.String - ]]> - false - true - false - true - CUSTOM_INSTRUCTION_SLAVES - custom_instruction_master_c - - - java.lang.String - ADDRESS_STALL 1 ADVANCED_INFO 0 ALLOWS_COMPILING_OTHER_FAMILY_IP 1 ANY_QFP 0 CELL_LEVEL_BACK_ANNOTATION_DISABLED 0 COMPILER_SUPPORT 1 DSP 0 DSP_SHIFTER_BLOCK 0 DUMP_ASM_LAB_BITS_FOR_POWER 1 EMUL 1 ENABLE_ADVANCED_IO_ANALYSIS_GUI_FEATURES 1 ENABLE_PIN_PLANNER 0 ENGINEERING_SAMPLE 0 EPCS 1 ESB 0 FAKE1 0 FAKE2 0 FAKE3 0 FAMILY_LEVEL_INSTALLATION_ONLY 1 FASTEST 0 FINAL_TIMING_MODEL 0 FITTER_USE_FALLING_EDGE_DELAY 0 FPP_COMPLETELY_PLACES_AND_ROUTES_PERIPHERY 0 GENERATE_DC_ON_CURRENT_WARNING_FOR_INTERNAL_CLAMPING_DIODE 0 HARDCOPY 0 HAS_18_BIT_MULTS 0 HAS_ACE_SUPPORT 1 HAS_ACTIVE_PARALLEL_FLASH_SUPPORT 0 HAS_ADJUSTABLE_OUTPUT_IO_TIMING_MEAS_POINT 0 HAS_ADVANCED_IO_INVERTED_CORNER 0 HAS_ADVANCED_IO_POWER_SUPPORT 1 HAS_ADVANCED_IO_TIMING_SUPPORT 1 HAS_ALM_SUPPORT 0 HAS_ATOM_AND_ROUTING_POWER_MODELED_TOGETHER 0 HAS_AUTO_DERIVE_CLOCK_UNCERTAINTY_SUPPORT 0 HAS_AUTO_FIT_SUPPORT 1 HAS_BALANCED_OPT_TECHNIQUE_SUPPORT 1 HAS_BENEFICIAL_SKEW_SUPPORT 1 HAS_BITLEVEL_DRIVE_STRENGTH_CONTROL 1 HAS_BSDL_FILE_GENERATION 1 HAS_CDB_RE_NETWORK_PRESERVATION_SUPPORT 0 HAS_CGA_SUPPORT 1 HAS_CHECK_NETLIST_SUPPORT 0 HAS_CLOCK_REGION_CHECKER_ENABLED 1 HAS_CORE_JUNCTION_TEMP_DERATING 0 HAS_CROSSTALK_SUPPORT 0 HAS_CUSTOM_REGION_SUPPORT 1 HAS_DAP_JTAG_FROM_HPS 0 HAS_DATA_DRIVEN_ACVQ_HSSI_SUPPORT 0 HAS_DDB_FDI_SUPPORT 0 HAS_DESIGN_ANALYZER_SUPPORT 1 HAS_DETAILED_IO_RAIL_POWER_MODEL 1 HAS_DETAILED_LEIM_STATIC_POWER_MODEL 1 HAS_DETAILED_LE_POWER_MODEL 1 HAS_DETAILED_ROUTING_MUX_STATIC_POWER_MODEL 1 HAS_DETAILED_THERMAL_CIRCUIT_PARAMETER_SUPPORT 1 HAS_DEVICE_MIGRATION_SUPPORT 1 HAS_DIAGONAL_MIGRATION_SUPPORT 0 HAS_EMIF_TOOLKIT_SUPPORT 0 HAS_ERROR_DETECTION_SUPPORT 0 HAS_FAMILY_VARIANT_MIGRATION_SUPPORT 0 HAS_FANOUT_FREE_NODE_SUPPORT 1 HAS_FAST_FIT_SUPPORT 1 HAS_FITTER_ECO_SUPPORT 1 HAS_FIT_NETLIST_OPT_RETIME_SUPPORT 1 HAS_FIT_NETLIST_OPT_SUPPORT 1 HAS_FORMAL_VERIFICATION_SUPPORT 1 HAS_FPGA_XCHANGE_SUPPORT 1 HAS_FSAC_LUTRAM_REGISTER_PACKING_SUPPORT 0 HAS_FULL_DAT_MIN_TIMING_SUPPORT 1 HAS_FULL_INCREMENTAL_DESIGN_SUPPORT 1 HAS_FUNCTIONAL_SIMULATION_SUPPORT 1 HAS_FUNCTIONAL_VERILOG_SIMULATION_SUPPORT 0 HAS_FUNCTIONAL_VHDL_SIMULATION_SUPPORT 0 HAS_GLITCH_FILTERING_SUPPORT 1 HAS_HARDCOPYII_SUPPORT 0 HAS_HC_READY_SUPPORT 0 HAS_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_HOLD_TIME_AVOIDANCE_ACROSS_CLOCK_SPINE_SUPPORT 1 HAS_HSPICE_WRITER_SUPPORT 1 HAS_HSSI_POWER_CALCULATOR 0 HAS_IBISO_WRITER_SUPPORT 0 HAS_ICD_DATA_IP 0 HAS_IDB_SUPPORT 1 HAS_INCREMENTAL_DAT_SUPPORT 1 HAS_INCREMENTAL_SYNTHESIS_SUPPORT 1 HAS_IO_ASSIGNMENT_ANALYSIS_SUPPORT 1 HAS_IO_DECODER 0 HAS_IO_PLACEMENT_OPTIMIZATION_SUPPORT 1 HAS_IO_PLACEMENT_USING_GEOMETRY_RULE 0 HAS_IO_PLACEMENT_USING_PHYSIC_RULE 0 HAS_IO_SMART_RECOMPILE_SUPPORT 0 HAS_JITTER_SUPPORT 1 HAS_JTAG_SLD_HUB_SUPPORT 1 HAS_LOGIC_LOCK_SUPPORT 1 HAS_MICROPROCESSOR 0 HAS_MIF_SMART_COMPILE_SUPPORT 1 HAS_MINMAX_TIMING_MODELING_SUPPORT 1 HAS_MIN_TIMING_ANALYSIS_SUPPORT 1 HAS_MUX_RESTRUCTURE_SUPPORT 1 HAS_NADDER_STYLE_CLOCKING 0 HAS_NADDER_STYLE_FF 0 HAS_NADDER_STYLE_LCELL_COMB 0 HAS_NEW_CDB_NAME_FOR_M20K_SCLR 0 HAS_NEW_HC_FLOW_SUPPORT 0 HAS_NEW_SERDES_MAX_RESOURCE_COUNT_REPORTING_SUPPORT 1 HAS_NEW_VPR_SUPPORT 1 HAS_NONSOCKET_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_NO_HARDBLOCK_PARTITION_SUPPORT 0 HAS_NO_JTAG_USERCODE_SUPPORT 0 HAS_OPERATING_SETTINGS_AND_CONDITIONS_REPORTING_SUPPORT 1 HAS_PAD_LOCATION_ASSIGNMENT_SUPPORT 0 HAS_PARTIAL_RECONFIG_SUPPORT 0 HAS_PASSIVE_PARALLEL_SUPPORT 0 HAS_PDN_MODEL_STATUS 0 HAS_PHYSICAL_DESIGN_PLANNER_SUPPORT 0 HAS_PHYSICAL_NETLIST_OUTPUT 0 HAS_PHYSICAL_ROUTING_SUPPORT 0 HAS_PIN_SPECIFIC_VOLTAGE_SUPPORT 1 HAS_PLDM_REF_SUPPORT 1 HAS_POWER_BINNING_LIMITS_DATA 0 HAS_POWER_ESTIMATION_SUPPORT 1 HAS_PRELIMINARY_CLOCK_UNCERTAINTY_NUMBERS 0 HAS_PRE_FITTER_FPP_SUPPORT 0 HAS_PRE_FITTER_LUTRAM_NETLIST_CHECKER_ENABLED 0 HAS_PVA_SUPPORT 1 HAS_QUARTUS_HIERARCHICAL_DESIGN_SUPPORT 0 HAS_RAPID_RECOMPILE_SUPPORT 0 HAS_RCF_SUPPORT 1 HAS_RCF_SUPPORT_FOR_DEBUGGING 0 HAS_RED_BLACK_SEPARATION_SUPPORT 0 HAS_RE_LEVEL_TIMING_GRAPH_SUPPORT 1 HAS_RISEFALL_DELAY_SUPPORT 1 HAS_SIGNAL_PROBE_SUPPORT 1 HAS_SIGNAL_TAP_SUPPORT 1 HAS_SIMULATOR_SUPPORT 0 HAS_SPLIT_IO_SUPPORT 1 HAS_SPLIT_LC_SUPPORT 1 HAS_STRICT_PRESERVATION_SUPPORT 1 HAS_SYNTHESIS_ON_ATOMS 0 HAS_SYNTH_FSYN_NETLIST_OPT_SUPPORT 1 HAS_SYNTH_NETLIST_OPT_RETIME_SUPPORT 1 HAS_SYNTH_NETLIST_OPT_SUPPORT 1 HAS_TCL_FITTER_SUPPORT 0 HAS_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_TEMPLATED_REGISTER_PACKING_SUPPORT 1 HAS_TIME_BORROWING_SUPPORT 0 HAS_TIMING_DRIVEN_SYNTHESIS_SUPPORT 1 HAS_TIMING_INFO_SUPPORT 1 HAS_TIMING_OPERATING_CONDITIONS 1 HAS_TIMING_SIMULATION_SUPPORT 1 HAS_TITAN_BASED_MAC_REGISTER_PACKER_SUPPORT 0 HAS_U2B2_SUPPORT 0 HAS_USER_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_USE_FITTER_INFO_SUPPORT 1 HAS_VCCPD_POWER_RAIL 0 HAS_VERTICAL_MIGRATION_SUPPORT 1 HAS_VIEWDRAW_SYMBOL_SUPPORT 0 HAS_VIO_SUPPORT 1 HAS_VIRTUAL_DEVICES 0 HAS_WYSIWYG_DFFEAS_SUPPORT 1 HAS_XIBISO2_WRITER_SUPPORT 0 HAS_XIBISO_WRITER_SUPPORT 1 IFP_USE_LEGACY_IO_CHECKER 0 INCREMENTAL_DESIGN_SUPPORTS_COMPATIBLE_CONSTRAINTS 1 INSTALLED 0 INTERNAL_POF_SUPPORT_ENABLED 0 INTERNAL_USE_ONLY 0 ISSUE_MILITARY_TEMPERATURE_WARNING 0 IS_BARE_DIE 0 IS_CONFIG_ROM 0 IS_DEFAULT_FAMILY 0 IS_FOR_INTERNAL_TESTING_ONLY 0 IS_HARDCOPY_FAMILY 0 IS_HBGA_PACKAGE 0 IS_HIGH_CURRENT_PART 0 IS_LOW_POWER_PART 0 IS_REVE_SILICON 0 IS_SDM_ONLY_PACKAGE 0 IS_SMI_PART 0 LOAD_BLK_TYPE_DATA_FROM_ATOM_WYS_INFO 0 LVDS_IO 1 M10K_MEMORY 0 M144K_MEMORY 0 M20K_MEMORY 0 M4K_MEMORY 0 M512_MEMORY 0 M9K_MEMORY 1 MLAB_MEMORY 0 MRAM_MEMORY 0 NOT_LISTED 0 NOT_MIGRATABLE 0 NO_FITTER_DELAY_CACHE_GENERATED 0 NO_PIN_OUT 0 NO_POF 0 NO_RPE_SUPPORT 0 NO_SUPPORT_FOR_LOGICLOCK_CONTENT_BACK_ANNOTATION 1 NO_SUPPORT_FOR_STA_CLOCK_UNCERTAINTY_CHECK 0 NO_TDC_SUPPORT 0 POSTFIT_BAK_DATABASE_EXPORT_ENABLED 1 POSTMAP_BAK_DATABASE_EXPORT_ENABLED 1 PROGRAMMER_ONLY 0 PROGRAMMER_SUPPORT 1 PVA_SUPPORTS_ONLY_SUBSET_OF_ATOMS 0 QFIT_IN_DEVELOPMENT 0 QMAP_IN_DEVELOPMENT 0 RAM_LOGICAL_NAME_CHECKING_IN_CUT_ENABLED 1 REPORTS_METASTABILITY_MTBF 1 REQUIRES_INSTALLATION_PATCH 0 REQUIRES_LIST_OF_TEMPERATURE_AND_VOLTAGE_OPERATING_CONDITIONS 1 REQUIRE_QUARTUS_HIERARCHICAL_DESIGN 0 REQUIRE_SPECIAL_HANDLING_FOR_LOCAL_LABLINE 1 RESERVES_SIGNAL_PROBE_PINS 0 RESOLVE_MAX_FANOUT_EARLY 1 RESOLVE_MAX_FANOUT_LATE 0 RESPECTS_FIXED_SIZED_LOCKED_LOCATION_LOGICLOCK 1 RESTRICTED_USER_SELECTION 0 RESTRICT_PARTIAL_RECONFIG 0 RISEFALL_SUPPORT_IS_HIDDEN 0 SHOW_HIDDEN_FAMILY_IN_PROGRAMMER 0 STRICT_TIMING_DB_CHECKS 0 SUPPORTS_ADDITIONAL_OPTIONS_FOR_UNUSED_IO 0 SUPPORTS_CRC 1 SUPPORTS_DIFFERENTIAL_AIOT_BOARD_TRACE_MODEL 1 SUPPORTS_DSP_BALANCING_BACK_ANNOTATION 0 SUPPORTS_GENERATION_OF_EARLY_POWER_ESTIMATOR_FILE 1 SUPPORTS_GLOBAL_SIGNAL_BACK_ANNOTATION 0 SUPPORTS_HIPI_RETIMING 0 SUPPORTS_LICENSE_FREE_PARTIAL_RECONFIG 0 SUPPORTS_MAC_CHAIN_OUT_ADDER 0 SUPPORTS_RAM_PACKING_BACK_ANNOTATION 0 SUPPORTS_REG_PACKING_BACK_ANNOTATION 0 SUPPORTS_SIGNALPROBE_REGISTER_PIPELINING 1 SUPPORTS_SINGLE_ENDED_AIOT_BOARD_TRACE_MODEL 1 SUPPORTS_USER_MANUAL_LOGIC_DUPLICATION 1 SUPPORTS_VID 0 SUPPORT_HIGH_SPEED_HPS 0 TMV_RUN_CUSTOMIZABLE_VIEWER 1 TMV_RUN_INTERNAL_DETAILS 1 TMV_RUN_INTERNAL_DETAILS_ON_IO 0 TMV_RUN_INTERNAL_DETAILS_ON_IOBUF 1 TMV_RUN_INTERNAL_DETAILS_ON_LCELL 0 TMV_RUN_INTERNAL_DETAILS_ON_LRAM 0 TRANSCEIVER_3G_BLOCK 0 TRANSCEIVER_6G_BLOCK 0 USES_ACV_FOR_FLED 1 USES_ADB_FOR_BACK_ANNOTATION 1 USES_ALTERA_LNSIM 0 USES_ASIC_ROUTING_POWER_CALCULATOR 0 USES_DATA_DRIVEN_PLL_COMPUTATION_UTIL 1 USES_DEV 1 USES_ICP_FOR_ECO_FITTER 0 USES_LIBERTY_TIMING 0 USES_NETWORK_ROUTING_POWER_CALCULATOR 0 USES_PART_INFO_FOR_DISPLAYING_CORE_VOLTAGE_VALUE 0 USES_POWER_SIGNAL_ACTIVITIES 1 USES_PVAFAM2 0 USES_SECOND_GENERATION_PART_INFO 0 USES_SECOND_GENERATION_POWER_ANALYZER 0 USES_THIRD_GENERATION_TIMING_MODELS_TIS 1 USES_U2B2_TIMING_MODELS 0 USES_XML_FORMAT_FOR_EMIF_PIN_MAP_FILE 0 USE_ADVANCED_IO_POWER_BY_DEFAULT 1 USE_ADVANCED_IO_TIMING_BY_DEFAULT 1 USE_BASE_FAMILY_DDB_PATH 0 USE_OCT_AUTO_CALIBRATION 1 USE_RELAX_IO_ASSIGNMENT_RULES 0 USE_RISEFALL_ONLY 1 USE_SEPARATE_LIST_FOR_TECH_MIGRATION 0 USE_SINGLE_COMPILER_PASS_PLL_MIF_FILE_WRITER 1 USE_TITAN_IO_BASED_IO_REGISTER_PACKER_UTIL 0 USING_28NM_OR_OLDER_TIMING_METHODOLOGY 1 WYSIWYG_BUS_WIDTH_CHECKING_IN_CUT_ENABLED 1 - false - true - false - true - DEVICE_FEATURES - java.lang.String EP4CE15E22C8 @@ -5660,33 +4210,14 @@ the requested settings for a module instance. --> true DEVICE_SPEEDGRADE - - java.lang.Integer - 1 - false - true - false - true - CLOCK_DOMAIN - clk - - - java.lang.Integer - 1 - false - true - false - true - RESET_DOMAIN - clk - java.lang.String - UNKNOWN + Cyclone IV E false true - true + false true + DEVICE_FAMILY boolean @@ -5732,38 +4263,22 @@ parameters are a RESULT of the module parameters. --> true true - - java.lang.Boolean - true - true - true - false - true - - - java.lang.Long - 27000000 - true - true - false - true - clock false - clk + clk_clk Input 1 clk - + java.lang.String - clk + false true true @@ -5771,7 +4286,7 @@ parameters are a RESULT of the module parameters. --> com.altera.sopcmodel.reset.Reset$Edges - DEASSERT + NONE false true true @@ -5796,19 +4311,13 @@ parameters are a RESULT of the module parameters. --> reset false - reset_n + clk_reset_reset Input 1 - reset_n - - - reset_req - Input - 1 - reset_req + reset - + @@ -5816,6 +4325,10 @@ parameters are a RESULT of the module parameters. --> debug.providesServices master + + debug.visible + true + com.altera.entityinterfaces.IConnectionPoint @@ -5826,7 +4339,7 @@ parameters are a RESULT of the module parameters. --> int - 1 + 0 false true false @@ -5858,7 +4371,7 @@ parameters are a RESULT of the module parameters. --> java.lang.String - reset + clk_reset false true true @@ -5874,7 +4387,7 @@ parameters are a RESULT of the module parameters. --> boolean - true + false false true true @@ -6018,7 +4531,7 @@ parameters are a RESULT of the module parameters. --> boolean - true + false false true false @@ -6075,606 +4588,79 @@ parameters are a RESULT of the module parameters. --> avalon true - d_address + master_address Output - 24 + 32 address - d_byteenable - Output - 4 - byteenable - - - d_read - Output - 1 - read - - - d_readdata + master_readdata Input 32 readdata - d_waitrequest - Input + master_read + Output 1 - waitrequest + read - d_write + master_write Output 1 write - d_writedata + master_writedata Output 32 writedata - debug_mem_slave_debugaccess_to_roms - Output - 1 - debugaccess - - - false - jtag_uart_0 - avalon_jtag_slave - jtag_uart_0.avalon_jtag_slave - 8524048 - 8 - - - false - i2c_opencores_0 - avalon_slave_0 - i2c_opencores_0.avalon_slave_0 - 8523872 - 32 - - - false - i2c_opencores_1 - avalon_slave_0 - i2c_opencores_1.avalon_slave_0 - 8523840 - 32 - - - false - epcq_controller_0 - avl_csr - epcq_controller_0.avl_csr - 8523808 - 32 - - - false - epcq_controller_0 - avl_mem - epcq_controller_0.avl_mem - 0 - 8388608 - - - false - nios2_qsys_0 - debug_mem_slave - nios2_qsys_0.debug_mem_slave - 8521728 - 2048 - - - false - onchip_memory2_0 - s1 - onchip_memory2_0.s1 - 8454144 - 40960 - - - false - pio_0 - s1 - pio_0.s1 - 8524032 - 16 - - - false - pio_1 - s1 - pio_1.s1 - 8524016 - 16 - - - false - pio_2 - s1 - pio_2.s1 - 8524000 - 16 - - - false - pio_3 - s1 - pio_3.s1 - 8523984 - 16 - - - false - pio_4 - s1 - pio_4.s1 - 8523968 - 16 - - - false - timer_0 - s1 - timer_0.s1 - 8523776 - 32 - - - false - pio_5 - s1 - pio_5.s1 - 8523952 - 16 - - - false - pio_6 - s1 - pio_6.s1 - 8523936 - 16 - - - false - pio_7 - s1 - pio_7.s1 - 8523920 - 16 - - - false - pio_8 - s1 - pio_8.s1 - 8523904 - 16 - - - - - - com.altera.entityinterfaces.IConnectionPoint - - false - true - false - true - - - int - 1 - false - true - false - true - - - com.altera.sopcmodel.avalon.EAddrBurstUnits - SYMBOLS - false - true - true - true - - - boolean - true - false - true - false - true - - - java.lang.String - clk - false - true - true - true - - - java.lang.String - reset - false - true - true - true - - - int - 8 - false - true - true - true - - - boolean - false - false - true - true - true - - - com.altera.sopcmodel.avalon.EAddrBurstUnits - WORDS - false - true - true - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - true - true - - - boolean - false - false - true - true - true - - - int - 0 - false - true - true - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - true - false - true - true - true - - - int - 32 - false - true - false - true - - - int - 0 - false - true - true - true - - - int - 0 - false - true - true - true - - - int - 0 - false - true - true - true - - - int - 1 - false - true - true - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - int - 0 - false - true - true - true - - - com.altera.sopcmodel.avalon.TimingUnits - Cycles - false - true - true - true - - - int - 0 - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - avalon - true - - i_address - Output - 24 - address - - - i_read - Output - 1 - read - - - i_readdata - Input - 32 - readdata - - - i_waitrequest + master_waitrequest Input 1 waitrequest + + master_readdatavalid + Input + 1 + readdatavalid + + + master_byteenable + Output + 4 + byteenable + false - nios2_qsys_0 - debug_mem_slave - nios2_qsys_0.debug_mem_slave - 8521728 - 2048 + pulpino_0 + avalon_slave_debug + pulpino_0.avalon_slave_debug + 0 + 8192 false onchip_memory2_0 - s1 - onchip_memory2_0.s1 - 8454144 + s2 + onchip_memory2_0.s2 + 65536 40960 - + - - com.altera.entityinterfaces.IConnectionPoint - nios2_qsys_0.data_master - false - true - true - true - - java.lang.String - clk - false - true - false - true - - - java.lang.String - reset - false - true - false - true - - java.lang.String false true - false - true - - - com.altera.sopcmodel.interrupt.InterruptConnectionPoint$EIrqScheme - INDIVIDUAL_REQUESTS - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - interrupt - true - - irq - Input - 32 - irq - - - false - i2c_opencores_0 - interrupt_sender - i2c_opencores_0.interrupt_sender - 3 - - - false - epcq_controller_0 - interrupt_sender - epcq_controller_0.interrupt_sender - 2 - - - false - i2c_opencores_1 - interrupt_sender - i2c_opencores_1.interrupt_sender - 4 - - - false - jtag_uart_0 - irq - jtag_uart_0.irq - 1 - - - false - timer_0 - irq - timer_0.irq - 0 - - - - - - java.lang.String - clk - false - true true true @@ -6696,7 +4682,7 @@ parameters are a RESULT of the module parameters. --> com.altera.sopcmodel.reset.Reset$Edges - DEASSERT + NONE false true true @@ -6721,869 +4707,12 @@ parameters are a RESULT of the module parameters. --> reset true - debug_reset_request + master_reset_reset Output 1 reset - - - - embeddedsw.configuration.hideDevice - 1 - - - qsys.ui.connect - instruction_master,data_master - - - com.altera.sopcmodel.avalon.AvalonConnectionPoint$AddressAlignment - DYNAMIC - false - true - false - true - - - int - 0 - false - true - false - true - - - java.math.BigInteger - 2048 - true - true - false - true - - - com.altera.sopcmodel.avalon.EAddrBurstUnits - WORDS - false - true - true - true - - - boolean - false - false - true - false - true - - - java.lang.String - clk - false - true - true - true - - - java.lang.String - reset - false - true - true - true - - - int - 8 - false - true - true - true - - - java.math.BigInteger - 0 - false - true - false - true - - - com.altera.entityinterfaces.IConnectionPoint - - false - true - false - true - - - boolean - false - false - true - true - true - - - com.altera.sopcmodel.avalon.EAddrBurstUnits - WORDS - false - true - true - true - - - boolean - false - false - true - false - true - - - java.math.BigInteger - 0 - false - true - true - true - - - int - 0 - false - false - true - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - true - true - - - int - 0 - false - false - true - true - - - int - 0 - false - false - true - true - - - int - 1 - false - true - false - true - - - boolean - false - false - true - false - true - - - int - 0 - false - true - true - true - - - int - 1 - false - true - false - true - - - int - 1 - false - false - true - true - - - boolean - true - false - true - false - true - - - boolean - false - false - true - false - true - - - int - 0 - false - false - true - true - - - com.altera.sopcmodel.avalon.TimingUnits - Cycles - false - false - true - true - - - boolean - false - false - true - false - true - - - boolean - false - false - true - false - true - - - int - 0 - false - true - false - true - - - int - 0 - false - true - false - true - - - int - 0 - false - false - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - avalon - false - - debug_mem_slave_address - Input - 9 - address - - - debug_mem_slave_byteenable - Input - 4 - byteenable - - - debug_mem_slave_debugaccess - Input - 1 - debugaccess - - - debug_mem_slave_read - Input - 1 - read - - - debug_mem_slave_readdata - Output - 32 - readdata - - - debug_mem_slave_waitrequest - Output - 1 - waitrequest - - - debug_mem_slave_write - Input - 1 - write - - - debug_mem_slave_writedata - Input - 32 - writedata - - - - - - java.lang.String - - true - true - false - true - - - int - 8 - false - true - false - true - - - int - 0 - false - false - true - true - - - boolean - false - false - true - false - true - - - int - 8 - false - true - false - true - - - int - 0 - true - true - false - true - - - boolean - true - false - true - false - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios_custom_instruction - true - - E_ci_multi_done - Input - 1 - done - - - E_ci_multi_clk_en - Output - 1 - clk_en - - - E_ci_multi_start - Output - 1 - start - - - E_ci_result - Input - 32 - result - - - D_ci_a - Output - 5 - a - - - D_ci_b - Output - 5 - b - - - D_ci_c - Output - 5 - c - - - D_ci_n - Output - 8 - n - - - D_ci_readra - Output - 1 - readra - - - D_ci_readrb - Output - 1 - readrb - - - D_ci_writerc - Output - 1 - writerc - - - E_ci_dataa - Output - 32 - dataa - - - E_ci_datab - Output - 32 - datab - - - E_ci_multi_clock - Output - 1 - clk - - - E_ci_multi_reset - Output - 1 - reset - - - E_ci_multi_reset_req - Output - 1 - reset_req - - - W_ci_estatus - Output - 1 - estatus - - - W_ci_ipending - Output - 32 - ipending - - - false - nios2_hw_crc32_0 - nios_custom_instruction_slave - nios2_hw_crc32_0.nios_custom_instruction_slave - 0 - nios2_hw_crc32_0 - - - false - nios_custom_instr_endianconverter_0 - s1 - nios_custom_instr_endianconverter_0.s1 - 8 - nios_custom_instr_endianconverter_0 - - - false - nios_custom_instr_bitswap_0 - s1 - nios_custom_instr_bitswap_0.s1 - 9 - nios_custom_instr_bitswap_0 - - - - - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - - - - java.lang.String - - true - true - false - true - - - int - 0 - true - true - false - true - - - int - 1 - false - false - true - true - - - com.altera.sopcmodel.custominstruction.CustomInstruction$ClockCycleType - COMBINATORIAL - true - true - true - true - - - int - 0 - true - true - false - true - - - boolean - false - false - true - false - true - - - int - 0 - false - true - false - true - - - int - 1 - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios_custom_instruction - false - - dataa - Input - 32 - dataa - - - datab - Input - 32 - datab - - - result - Output - 32 - result - - - - - - - java.lang.String - CYCLONEIVE - false - true - false - true - DEVICE_FAMILY - - - java.lang.String - Cyclone IV E - false - true - false - true - DEVICE_FAMILY - - - boolean - false - false - true - true - true - - - - - java.lang.String - - true - true - false - true - - - int - 0 - true - true - false - true - - - int - 1 - false - false - true - true - - - com.altera.sopcmodel.custominstruction.CustomInstruction$ClockCycleType - COMBINATORIAL - true - true - true - true - - - int - 0 - true - true - false - true - - - boolean - false - false - true - false - true - - - int - 0 - false - true - false - true - - - int - 1 - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios_custom_instruction - false - - dataa - Input - 32 - dataa - - - datab - Input - 32 - datab - - - result - Output - 32 - result - - embeddedsw.CMacro.DUAL_PORT - 0 + 1 embeddedsw.CMacro.GUI_RAM_BLOCK_TYPE @@ -7638,7 +4767,7 @@ the requested settings for a module instance. --> embeddedsw.CMacro.SINGLE_CLOCK_OP - 0 + 1 embeddedsw.CMacro.SIZE_MULTIPLE @@ -7722,7 +4851,7 @@ the requested settings for a module instance. --> boolean - false + true false true true @@ -7732,7 +4861,7 @@ the requested settings for a module instance. --> boolean false false - false + true true true @@ -7788,7 +4917,7 @@ the requested settings for a module instance. --> java.lang.String DONT_CARE false - false + true true true @@ -7810,15 +4939,15 @@ the requested settings for a module instance. --> boolean - false + true false - false + true true true boolean - false + true true true false @@ -7836,7 +4965,7 @@ the requested settings for a module instance. --> int 1 false - false + true true true @@ -7979,51 +5108,6 @@ the requested settings for a module instance. --> true true - - - - boolean - false - false - true - false - true - - - java.lang.String - - false - true - false - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - clock - false - - clk - Input - 1 - clk - - int - 0 + 1 false true false @@ -8401,6 +5485,428 @@ parameters are a RESULT of the module parameters. --> byteenable + + + + embeddedsw.configuration.isFlash + 0 + + + embeddedsw.configuration.isMemoryDevice + 1 + + + embeddedsw.configuration.isNonVolatileStorage + 0 + + + embeddedsw.configuration.isPrintableDevice + 0 + + + com.altera.sopcmodel.avalon.AvalonConnectionPoint$AddressAlignment + DYNAMIC + false + true + false + true + + + int + 1 + false + true + false + true + + + java.math.BigInteger + 40960 + true + true + false + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + WORDS + false + true + true + true + + + boolean + false + false + true + false + true + + + java.lang.String + clk1 + false + true + true + true + + + java.lang.String + reset1 + false + true + true + true + + + int + 8 + false + true + true + true + + + java.math.BigInteger + + false + true + false + true + + + com.altera.entityinterfaces.IConnectionPoint + + false + true + false + true + + + boolean + false + false + true + true + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + WORDS + false + true + true + true + + + boolean + false + false + true + false + true + + + java.math.BigInteger + 40960 + false + true + true + true + + + int + 0 + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + true + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + true + true + + + int + 0 + false + false + true + true + + + int + 0 + false + false + true + true + + + int + 1 + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 1 + false + true + true + true + + + int + 0 + false + true + false + true + + + int + 0 + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 0 + false + true + true + true + + + com.altera.sopcmodel.avalon.TimingUnits + Cycles + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 0 + false + true + false + true + + + int + 0 + false + true + false + true + + + int + 0 + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + avalon + false + + address2 + Input + 14 + address + + + chipselect2 + Input + 1 + chipselect + + + clken2 + Input + 1 + clken + + + write2 + Input + 1 + write + + + readdata2 + Output + 32 + readdata + + + writedata2 + Input + 32 + writedata + + + byteenable2 + Input + 4 + byteenable + + + + + + boolean + false + false + true + false + true + + + java.lang.String + + false + true + false + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + clock + false + + clk + Input + 1 + clk + + + + + + int + 32 + false + true + true + true + + + int + 32 + false + true + true + true + + + int + 10 + false + true + true + true + + + int + 10 + false + true + true + true + + + int + 0 + false + true + true + true + + + boolean + true + false + true + true + true + + + boolean + false + false + true + true + true + + + boolean + true + false + true + true + true + + + boolean + true + false + true + true + true + + + java.math.BigInteger + 31 + false + true + false + true + INTERRUPTS_USED + interrupt_receiver + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + + + + java.lang.String + clk_sink + false + true + true + true + + + com.altera.sopcmodel.reset.Reset$Edges + DEASSERT + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + reset + false + + rst_n + Input + 1 + reset_n + + + + + + java.lang.String + clk_sink + false + true + true + true + + + java.lang.String + + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + conduit + false + + testmode_i + Input + 1 + testmode_i + + + fetch_enable_i + Input + 1 + fetch_enable_i + + + clock_gating_i + Input + 1 + clock_gating_i + + + boot_addr_i + Input + 32 + boot_addr_i + + + + + + boolean + false + false + true + false + true + + + java.lang.String + + false + true + false + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + clock + false + + clk + Input + 1 + clk + + + + + + com.altera.entityinterfaces.IConnectionPoint + + false + true + true + true + + + java.lang.String + clk_sink + false + true + false + true + + + java.lang.String + reset_sink + false + true + false + true + + + java.lang.String + + false + true + false + true + + + com.altera.sopcmodel.interrupt.InterruptConnectionPoint$EIrqScheme + INDIVIDUAL_REQUESTS + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + interrupt + true + + irq_i + Input + 32 + irq + + + false + epcq_controller_0 + interrupt_sender + epcq_controller_0.interrupt_sender + 2 + + + false + i2c_opencores_0 + interrupt_sender + i2c_opencores_0.interrupt_sender + 3 + + + false + i2c_opencores_1 + interrupt_sender + i2c_opencores_1.interrupt_sender + 4 + + + false + timer_0 + irq + timer_0.irq + 0 + + + false + jtag_uart_0 + irq + jtag_uart_0.irq + 1 + + + + + + com.altera.entityinterfaces.IConnectionPoint + + false + true + false + true + + + int + 0 + false + true + false + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + SYMBOLS + false + true + true + true + + + boolean + false + false + true + false + true + + + java.lang.String + clk_sink + false + true + true + true + + + java.lang.String + reset_sink + false + true + true + true + + + int + 8 + false + true + true + true + + + boolean + false + false + true + true + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + WORDS + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + true + true + + + boolean + false + false + true + true + true + + + int + 0 + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + true + true + + + int + 32 + false + true + false + true + + + int + 0 + false + true + true + true + + + int + 0 + false + true + true + true + + + int + 0 + false + true + true + true + + + int + 1 + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 0 + false + true + true + true + + + com.altera.sopcmodel.avalon.TimingUnits + Cycles + false + true + true + true + + + int + 0 + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + avalon + true + + instr_addr + Output + 32 + address + + + instr_rdata + Input + 32 + readdata + + + instr_read + Output + 1 + read + + + instr_rvalid + Input + 1 + readdatavalid + + + instr_busy + Input + 1 + waitrequest + + + false + onchip_memory2_0 + s1 + onchip_memory2_0.s1 + 65536 + 40960 + + + + + + com.altera.entityinterfaces.IConnectionPoint + + false + true + false + true + + + int + 0 + false + true + false + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + SYMBOLS + false + true + true + true + + + boolean + false + false + true + false + true + + + java.lang.String + clk_sink + false + true + true + true + + + java.lang.String + reset_sink + false + true + true + true + + + int + 8 + false + true + true + true + + + boolean + false + false + true + true + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + WORDS + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + true + true + + + boolean + false + false + true + true + true + + + int + 0 + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + true + true + + + int + 32 + false + true + false + true + + + int + 0 + false + true + true + true + + + int + 0 + false + true + true + true + + + int + 0 + false + true + true + true + + + int + 1 + false + true + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 0 + false + true + true + true + + + com.altera.sopcmodel.avalon.TimingUnits + Cycles + false + true + true + true + + + int + 0 + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + avalon + true + + lsu_addr + Output + 32 + address + + + lsu_rdata + Input + 32 + readdata + + + lsu_read + Output + 1 + read + + + lsu_rvalid + Input + 1 + readdatavalid + + + lsu_busy + Input + 1 + waitrequest + + + lsu_write + Output + 1 + write + + + lsu_be + Output + 4 + byteenable + + + lsu_wdata + Output + 32 + writedata + + + lsu_resp + Input + 2 + response + + + lsu_wrespvalid + Input + 1 + writeresponsevalid + + + false + jtag_uart_0 + avalon_jtag_slave + jtag_uart_0.avalon_jtag_slave + 131104 + 8 + + + false + hw_crc32_0 + avalon_slave + hw_crc32_0.avalon_slave + 135168 + 32 + + + false + i2c_opencores_0 + avalon_slave_0 + i2c_opencores_0.avalon_slave_0 + 135232 + 32 + + + false + i2c_opencores_1 + avalon_slave_0 + i2c_opencores_1.avalon_slave_0 + 135200 + 32 + + + false + epcq_controller_0 + avl_csr + epcq_controller_0.avl_csr + 131328 + 32 + + + false + epcq_controller_0 + avl_mem + epcq_controller_0.avl_mem + 8388608 + 8388608 + + + false + timer_0 + s1 + timer_0.s1 + 131072 + 32 + + + false + pio_0 + s1 + pio_0.s1 + 135392 + 16 + + + false + pio_1 + s1 + pio_1.s1 + 135376 + 16 + + + false + pio_2 + s1 + pio_2.s1 + 135360 + 16 + + + false + pio_3 + s1 + pio_3.s1 + 135344 + 16 + + + false + pio_4 + s1 + pio_4.s1 + 135328 + 16 + + + false + pio_5 + s1 + pio_5.s1 + 135312 + 16 + + + false + pio_6 + s1 + pio_6.s1 + 135296 + 16 + + + false + pio_7 + s1 + pio_7.s1 + 135280 + 16 + + + false + pio_8 + s1 + pio_8.s1 + 135264 + 16 + + + false + onchip_memory2_0 + s2 + onchip_memory2_0.s2 + 65536 + 40960 + + + + + + embeddedsw.configuration.isFlash + 0 + + + embeddedsw.configuration.isMemoryDevice + 0 + + + embeddedsw.configuration.isNonVolatileStorage + 0 + + + embeddedsw.configuration.isPrintableDevice + 0 + + + com.altera.sopcmodel.avalon.AvalonConnectionPoint$AddressAlignment + DYNAMIC + false + true + false + true + + + int + 0 + false + true + false + true + + + java.math.BigInteger + 8192 + true + true + false + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + SYMBOLS + false + true + true + true + + + boolean + false + false + true + false + true + + + java.lang.String + clk_sink + false + true + true + true + + + java.lang.String + reset_sink + false + true + true + true + + + int + 8 + false + true + true + true + + + java.math.BigInteger + + false + true + false + true + + + com.altera.entityinterfaces.IConnectionPoint + + false + true + false + true + + + boolean + false + false + true + true + true + + + com.altera.sopcmodel.avalon.EAddrBurstUnits + WORDS + false + true + true + true + + + boolean + false + false + true + false + true + + + java.math.BigInteger + 8192 + false + true + true + true + + + int + 0 + false + false + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + true + true + + + int + 1 + false + true + true + true + + + int + 0 + false + false + true + true + + + int + 1 + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 0 + false + false + true + true + + + int + 1 + false + true + false + true + + + int + 1 + false + false + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 0 + false + false + true + true + + + com.altera.sopcmodel.avalon.TimingUnits + Cycles + false + false + true + true + + + boolean + false + false + true + false + true + + + boolean + false + false + true + false + true + + + int + 0 + false + true + false + true + + + int + 0 + false + true + false + true + + + int + 0 + false + false + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + avalon + false + + debug_addr + Input + 15 + address + + + debug_rdata + Output + 32 + readdata + + + debug_read + Input + 1 + read + + + debug_rvalid + Output + 1 + readdatavalid + + + debug_busy + Output + 1 + waitrequest + + + debug_write + Input + 1 + write + + + debug_wdata + Input + 32 + writedata + + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x00010000 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_instr + onchip_memory2_0 + s1 + + int @@ -16145,7 +15198,7 @@ parameters are a RESULT of the module parameters. --> java.math.BigInteger - 0x00821110 + 0x00020020 false true true @@ -16175,16 +15228,67 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - data_master + pulpino_0 + avalon_master_lsu jtag_uart_0 avalon_jtag_slave + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x00021000 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + hw_crc32_0 + avalon_slave + + int @@ -16196,7 +15300,7 @@ parameters are a RESULT of the module parameters. --> java.math.BigInteger - 0x00821060 + 0x00021040 false true true @@ -16226,16 +15330,16 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - data_master + pulpino_0 + avalon_master_lsu i2c_opencores_0 avalon_slave_0 int @@ -16247,7 +15351,7 @@ parameters are a RESULT of the module parameters. --> java.math.BigInteger - 0x00821040 + 0x00021020 false true true @@ -16277,16 +15381,16 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - data_master + pulpino_0 + avalon_master_lsu i2c_opencores_1 avalon_slave_0 int @@ -16298,7 +15402,7 @@ parameters are a RESULT of the module parameters. --> java.math.BigInteger - 0x00821020 + 0x00020100 false true true @@ -16328,16 +15432,16 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - data_master + pulpino_0 + avalon_master_lsu epcq_controller_0 avl_csr int @@ -16347,6 +15451,618 @@ parameters are a RESULT of the module parameters. --> true true + + java.math.BigInteger + 0x00800000 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + epcq_controller_0 + avl_mem + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x00020000 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + timer_0 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x000210e0 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + pio_0 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x000210d0 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + pio_1 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x000210c0 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + pio_2 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x000210b0 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + pio_3 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x000210a0 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + pio_4 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x00021090 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + pio_5 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x00021080 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + pio_6 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x00021070 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + pio_7 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x00021060 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + pio_8 + s1 + + + + int + 1 + false + true + true + true + + + java.math.BigInteger + 0x00010000 + false + true + true + true + + + boolean + false + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + avalon_master_lsu + onchip_memory2_0 + s2 + + + + int + 1 + false + true + true + true + java.math.BigInteger 0x0000 @@ -16379,17 +16095,17 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - data_master - epcq_controller_0 - avl_mem + master_0 + master + pulpino_0 + avalon_slave_debug + start="master_0.master" + end="onchip_memory2_0.s2"> int 1 @@ -16400,7 +16116,7 @@ parameters are a RESULT of the module parameters. --> java.math.BigInteger - 0x00820800 + 0x00010000 false true true @@ -16430,700 +16146,10 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - data_master - nios2_qsys_0 - debug_mem_slave - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x00810000 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master + master_0 + master onchip_memory2_0 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x00821100 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - pio_0 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x008210f0 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - pio_1 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x008210e0 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - pio_2 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x008210d0 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - pio_3 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x008210c0 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - pio_4 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x00821000 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - timer_0 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x008210b0 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - pio_5 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x008210a0 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - pio_6 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x00821090 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - pio_7 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x00821080 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - data_master - pio_8 - s1 - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x00820800 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - instruction_master - nios2_qsys_0 - debug_mem_slave - - - - int - 1 - false - true - true - true - - - java.math.BigInteger - 0x00810000 - false - true - true - true - - - boolean - false - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - instruction_master - onchip_memory2_0 - s1 - - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - clk_27 - clk - nios2_qsys_0 - clk + s2 pio_8 clk + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + clk_27 + clk + master_0 + clk + onchip_memory2_0 clk1 + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + clk_27 + clk + pulpino_0 + clk_sink + + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + clk_27 + clk + hw_crc32_0 + clk_sink + clock_sink - - int - 3 - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - irq - i2c_opencores_0 - interrupt_sender - - int @@ -17595,16 +16667,51 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - irq + pulpino_0 + interrupt_receiver epcq_controller_0 interrupt_sender + + int + 3 + false + true + true + true + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + pulpino_0 + interrupt_receiver + i2c_opencores_0 + interrupt_sender + + int @@ -17630,51 +16737,16 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - irq + pulpino_0 + interrupt_receiver i2c_opencores_1 interrupt_sender - - int - 1 - false - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - irq - jtag_uart_0 - irq - - int @@ -17700,54 +16772,22 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - irq + pulpino_0 + interrupt_receiver timer_0 irq - - java.lang.String - nios2_hw_crc32_0 - false - true - true - true - - - java.lang.String - - true - true - true - true - - + start="pulpino_0.interrupt_receiver" + end="jtag_uart_0.irq"> + int 1 false true - false - true - - - long - 0 - false - true - true - true - - - int - -1 - true - true true true @@ -17767,57 +16807,17 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - custom_instruction_master - nios2_hw_crc32_0 - nios_custom_instruction_slave + pulpino_0 + interrupt_receiver + jtag_uart_0 + irq - - java.lang.String - nios_custom_instr_endianconverter_0 - false - true - true - true - - - java.lang.String - - true - true - true - true - - - int - 1 - false - true - false - true - - - long - 8 - false - true - true - true - - - int - -1 - true - true - true - true - + start="clk_27.clk_reset" + end="master_0.clk_reset"> java.lang.String UNKNOWN @@ -17834,77 +16834,10 @@ parameters are a RESULT of the module parameters. --> true true - nios2_qsys_0 - custom_instruction_master - nios_custom_instr_endianconverter_0 - s1 - - - - java.lang.String - nios_custom_instr_bitswap_0 - false - true - true - true - - - java.lang.String - - true - true - true - true - - - int - 1 - false - true - false - true - - - long - 9 - false - true - true - true - - - int - -1 - true - true - true - true - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - nios2_qsys_0 - custom_instruction_master - nios_custom_instr_bitswap_0 - s1 + clk_27 + clk_reset + master_0 + clk_reset i2c_opencores_1 clock_reset - - - java.lang.String - UNKNOWN - false - true - true - true - - - boolean - false - false - true - true - true - - clk_27 - clk_reset - nios2_qsys_0 - reset - onchip_memory2_0 reset1 + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + clk_27 + clk_reset + pulpino_0 + reset_sink + + + + java.lang.String + UNKNOWN + false + true + true + true + + + boolean + false + false + true + true + true + + clk_27 + clk_reset + hw_crc32_0 + reset_sink + 1 clock_source @@ -18387,7 +17347,7 @@ parameters are a RESULT of the module parameters. --> 17.1 - 16 + 18 clock_sink com.altera.entityinterfaces.IElementClass com.altera.entityinterfaces.IMutableConnectionPoint @@ -18395,7 +17355,7 @@ parameters are a RESULT of the module parameters. --> 17.1 - 16 + 18 reset_sink com.altera.entityinterfaces.IElementClass com.altera.entityinterfaces.IMutableConnectionPoint @@ -18403,7 +17363,7 @@ parameters are a RESULT of the module parameters. --> 17.1 - 17 + 19 avalon_slave com.altera.entityinterfaces.IElementClass com.altera.entityinterfaces.IMutableConnectionPoint @@ -18418,6 +17378,14 @@ parameters are a RESULT of the module parameters. --> Interrupt Sender 17.1 + + 1 + hw_crc32 + com.altera.entityinterfaces.IElementClass + com.altera.entityinterfaces.IModule + hw_crc32 + 1.0 + 2 i2c_opencores @@ -18427,7 +17395,7 @@ parameters are a RESULT of the module parameters. --> 17.1 - 11 + 12 conduit_end com.altera.entityinterfaces.IElementClass com.altera.entityinterfaces.IMutableConnectionPoint @@ -18444,44 +17412,20 @@ parameters are a RESULT of the module parameters. --> 1 - nios2_hw_crc32 + altera_jtag_avalon_master com.altera.entityinterfaces.IElementClass com.altera.entityinterfaces.IModule - nios2_hw_crc32 + JTAG to Avalon Master Bridge 17.1 3 - nios_custom_instruction_slave - com.altera.entityinterfaces.IElementClass - com.altera.entityinterfaces.IMutableConnectionPoint - Custom Instruction Slave - 17.1 - - - 1 - altera_nios2_gen2 - com.altera.entityinterfaces.IElementClass - com.altera.entityinterfaces.IModule - Nios II Processor - 17.1 - - - 2 avalon_master com.altera.entityinterfaces.IElementClass com.altera.entityinterfaces.IMutableConnectionPoint Avalon Memory Mapped Master 17.1 - - 1 - interrupt_receiver - com.altera.entityinterfaces.IElementClass - com.altera.entityinterfaces.IMutableConnectionPoint - Interrupt Receiver - 17.1 - 1 reset_source @@ -18490,30 +17434,6 @@ parameters are a RESULT of the module parameters. --> Reset Output 17.1 - - 1 - nios_custom_instruction_master - com.altera.entityinterfaces.IElementClass - com.altera.entityinterfaces.IMutableConnectionPoint - Custom Instruction Master - 17.1 - - - 1 - altera_nios_custom_instr_bitswap - com.altera.entityinterfaces.IElementClass - com.altera.entityinterfaces.IModule - Bitswap - 17.1 - - - 1 - altera_nios_custom_instr_endianconverter - com.altera.entityinterfaces.IElementClass - com.altera.entityinterfaces.IModule - Endian Converter - 17.1 - 1 altera_avalon_onchip_memory2 @@ -18530,6 +17450,22 @@ parameters are a RESULT of the module parameters. --> PIO (Parallel I/O) 17.1 + + 1 + pulpino + com.altera.entityinterfaces.IElementClass + com.altera.entityinterfaces.IModule + pulpino + 1.0 + + + 1 + interrupt_receiver + com.altera.entityinterfaces.IElementClass + com.altera.entityinterfaces.IMutableConnectionPoint + Interrupt Receiver + 17.1 + 1 altera_avalon_timer @@ -18539,7 +17475,7 @@ parameters are a RESULT of the module parameters. --> 17.1 - 19 + 20 avalon com.altera.entityinterfaces.IElementClass com.altera.entityinterfaces.IConnection @@ -18547,7 +17483,7 @@ parameters are a RESULT of the module parameters. --> 17.1 - 16 + 18 clock com.altera.entityinterfaces.IElementClass com.altera.entityinterfaces.IConnection @@ -18563,15 +17499,7 @@ parameters are a RESULT of the module parameters. --> 17.1 - 3 - nios_custom_instruction - com.altera.entityinterfaces.IElementClass - com.altera.entityinterfaces.IConnection - Nios II Custom Instruction Connection - 17.1 - - - 16 + 18 reset com.altera.entityinterfaces.IElementClass com.altera.entityinterfaces.IConnection diff --git a/tools/bin2hex.c b/tools/bin2hex.c new file mode 100644 index 0000000..df206fb --- /dev/null +++ b/tools/bin2hex.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include +#include + +#define MEMBLK 1024 + +int main(int argc, char **argv) +{ + unsigned char block[4]; + unsigned int csum; + + int fd_i; + FILE *fd_o; + struct stat fileinfo; + + unsigned int i; + + if (argc != 3) { + printf("usage: %s binfile hexfile\n", argv[0]); + return -1; + } + + if ((fd_i = open(argv[1], O_RDONLY)) == -1 || fstat(fd_i, &fileinfo) == -1) { + printf("Couldn't open file\n"); + return -1; + } + + printf("size: %u bytes\n", fileinfo.st_size); + + if ((fd_o = fopen(argv[2], "w")) == NULL) { + printf("invalid outfile\n"); + return -1; + } + + for (i=0; i>8)+((i/4)&0xff)+block[3]+block[2]+block[1]+block[0]; + csum &= 0xff; + csum = (~csum+1)&0xff; + fprintf(fd_o, ":04%.4X00%.2X%.2X%.2X%.2X%.2X\n", i/4, block[3],block[2],block[1],block[0],csum); + } + + fprintf(fd_o, ":00000001FF\n"); + + fclose(fd_o); + close(fd_i); + + return 0; +}