diff --git a/.github/workflows/verible.yml b/.github/workflows/verible.yml index 87496bc03a..b9632a8284 100644 --- a/.github/workflows/verible.yml +++ b/.github/workflows/verible.yml @@ -20,4 +20,5 @@ jobs: - uses: chipsalliance/verible-formatter-action@main with: github_token: ${{ secrets.GITHUB_TOKEN }} - files: '$(find core -regex ".*\.\(v\|sv\)$" | grep -v "^core/include/.*_config_pkg.sv$")' + files: '$(find core -regex ".*\.\(v\|sv\)$" | grep -v "^core/include/.*_config_pkg\.sv$")' + fail_on_formatting_suggestions: true diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6e5367d9a2..95b777c79e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -227,6 +227,21 @@ smoke-hwconfig: - when: manual allow_failure: true +it-test: + extends: + - .synthesis_test + variables: + DASHBOARD_JOB_TITLE: "Instruction Trace test" + DASHBOARD_JOB_DESCRIPTION: "Test to Challenge the Hardware flow of the Instruction Tracer" + DASHBOARD_SORT_INDEX: 0 + DASHBOARD_JOB_CATEGORY: "Basic" + DV_SIMULATORS: "vcs-testharness" + script: + - python3 .gitlab-ci/scripts/report_fail.py + - bash verif/regress/Instr_tracing_test.sh ../tests/custom/ITI/test_iti_asm.o + - python3 .gitlab-ci/scripts/report_pass.py + - cp -r verif/sim/Instr_tracing_artifact artifacts/ + spyglass: extends: - .synthesis_test diff --git a/Makefile b/Makefile index 25b206a169..11d2337775 100644 --- a/Makefile +++ b/Makefile @@ -160,7 +160,8 @@ src := $(if $(spike-tandem),verif/tb/core/uvma_core_cntrl_pkg.sv) $(if $(spike-tandem),verif/tb/core/uvmc_rvfi_reference_model_pkg.sv) \ $(if $(spike-tandem),verif/tb/core/uvmc_rvfi_scoreboard_pkg.sv) \ $(if $(spike-tandem),corev_apu/tb/common/spike.sv) \ - corev_apu/src/ariane.sv \ + core/cva6_rvfi.sv \ + corev_apu/src/ariane.sv \ $(wildcard corev_apu/bootrom/*.sv) \ $(wildcard corev_apu/clint/*.sv) \ $(wildcard corev_apu/fpga/src/axi2apb/src/*.sv) \ @@ -168,7 +169,7 @@ src := $(if $(spike-tandem),verif/tb/core/uvma_core_cntrl_pkg.sv) $(wildcard corev_apu/fpga/src/axi_slice/src/*.sv) \ $(wildcard corev_apu/src/axi_riscv_atomics/src/*.sv) \ $(wildcard corev_apu/axi_mem_if/src/*.sv) \ - $(wildcard corev_apu/riscv-dbg/src/*.sv) \ + $(wildcard corev_apu/riscv-dbg/src/*.sv) \ corev_apu/rv_plic/rtl/rv_plic_target.sv \ corev_apu/rv_plic/rtl/rv_plic_gateway.sv \ corev_apu/rv_plic/rtl/plic_regmap.sv \ @@ -200,13 +201,34 @@ src := $(if $(spike-tandem),verif/tb/core/uvma_core_cntrl_pkg.sv) vendor/pulp-platform/tech_cells_generic/src/deprecated/cluster_clk_cells.sv \ vendor/pulp-platform/tech_cells_generic/src/deprecated/pulp_clk_cells.sv \ vendor/pulp-platform/tech_cells_generic/src/rtl/tc_clk.sv \ + corev_apu/instr_tracing/ITI/include/iti_pkg.sv \ + corev_apu/instr_tracing/rv_tracer-main/include/te_pkg.sv \ + corev_apu/instr_tracing/rv_encapsulator-main/src/include/encap_pkg.sv \ corev_apu/tb/ariane_testharness.sv \ corev_apu/tb/ariane_peripherals.sv \ corev_apu/tb/rvfi_tracer.sv \ corev_apu/tb/common/uart.sv \ corev_apu/tb/common/SimDTM.sv \ - corev_apu/tb/common/SimJTAG.sv - + corev_apu/tb/common/SimJTAG.sv \ + corev_apu/instr_tracing/ITI/cva6_iti/iti.sv \ + corev_apu/instr_tracing/ITI/cva6_iti/block_retirement.sv \ + corev_apu/instr_tracing/ITI/cva6_iti/single_retirement.sv \ + corev_apu/instr_tracing/ITI/cva6_iti/itype_detector.sv \ + vendor/pulp-platform/common_cells/src/counter.sv \ + vendor/pulp-platform/common_cells/src/sync.sv \ + vendor/pulp-platform/common_cells/src/sync_wedge.sv \ + vendor/pulp-platform/common_cells/src/edge_detect.sv \ + corev_apu/instr_tracing/rv_tracer-main/rtl/lzc.sv \ + corev_apu/instr_tracing/rv_tracer-main/rtl/te_branch_map.sv \ + corev_apu/instr_tracing/rv_tracer-main/rtl/te_filter.sv \ + corev_apu/instr_tracing/rv_tracer-main/rtl/te_packet_emitter.sv \ + corev_apu/instr_tracing/rv_tracer-main/rtl/te_priority.sv \ + corev_apu/instr_tracing/rv_tracer-main/rtl/te_reg.sv \ + corev_apu/instr_tracing/rv_tracer-main/rtl/te_resync_counter.sv \ + corev_apu/instr_tracing/rv_tracer-main/rtl/rv_tracer.sv \ + vendor/pulp-platform/common_cells/src/fifo_v3.sv \ + corev_apu/instr_tracing/DPTI/slicer_DPTI.sv \ + corev_apu/instr_tracing/rv_encapsulator-main/src/rtl/encapsulator.sv src := $(addprefix $(root-dir), $(src)) copro_src := core/cvxif_example/include/cvxif_instr_pkg.sv \ @@ -216,6 +238,9 @@ copro_src := $(addprefix $(root-dir), $(copro_src)) uart_src := $(wildcard corev_apu/fpga/src/apb_uart/src/vhdl_orig/*.vhd) uart_src := $(addprefix $(root-dir), $(uart_src)) +dpti_src := $(wildcard corev_apu/instr_tracing/DPTI/*.vhd) +dpti_src := $(addprefix $(root-dir), $(dpti_src)) + uart_src_sv:= corev_apu/fpga/src/apb_uart/src/slib_clock_div.sv \ corev_apu/fpga/src/apb_uart/src/slib_counter.sv \ corev_apu/fpga/src/apb_uart/src/slib_edge_detect.sv \ @@ -311,6 +336,7 @@ incdir := $(CVA6_REPO_DIR)/vendor/pulp-platform/common_cells/include/ $(CVA6_REP $(CVA6_REPO_DIR)/verif/core-v-verif/lib/uvm_agents/uvma_core_cntrl/ \ $(CVA6_REPO_DIR)/verif/tb/core/ \ $(CVA6_REPO_DIR)/core/include/ \ + $(CVA6_REPO_DIR)/corev_apu/instr_tracing/ITI/include \ $(SPIKE_INSTALL_DIR)/include/disasm/ # Compile and sim flags @@ -784,9 +810,10 @@ fpga_filter += $(addprefix $(root-dir), core/cache_subsystem/hpdcache/rtl/src/co src/bootrom/bootrom_$(XLEN).sv: $(MAKE) -C corev_apu/fpga/src/bootrom BOARD=$(BOARD) XLEN=$(XLEN) PLATFORM=$(PLATFORM) bootrom_$(XLEN).sv -fpga: $(ariane_pkg) $(src) $(fpga_src) $(uart_src) $(src_flist) +fpga: $(ariane_pkg) $(src) $(fpga_src) $(uart_src) $(dpti_src) $(src_flist) @echo "[FPGA] Generate sources" @echo read_vhdl {$(uart_src)} > corev_apu/fpga/scripts/add_sources.tcl + @echo read_vhdl {$(dpti_src)} >> corev_apu/fpga/scripts/add_sources.tcl @echo read_verilog -sv {$(ariane_pkg)} >> corev_apu/fpga/scripts/add_sources.tcl @echo read_verilog -sv {$(filter-out $(fpga_filter), $(src_flist))} >> corev_apu/fpga/scripts/add_sources.tcl @echo read_verilog -sv {$(filter-out $(fpga_filter), $(src))} >> corev_apu/fpga/scripts/add_sources.tcl diff --git a/README.md b/README.md index 57b3069b49..b824135f4f 100644 --- a/README.md +++ b/README.md @@ -60,55 +60,10 @@ bash verif/regress/smoke-tests.sh Simulating the CVA6 is done by using `verif/sim/cva6.py`. -The environment variable `DV_SIMULATORS` allows you to specify which simulator to use. - -Four simulation types are supported: -- **veri-testharness**: verilator with corev_apu/testharness testbench -- **vcs-testharness**: vcs with corev_apu/testharness testbench -- **vcs-uvm**: vcs with UVM testbench -- **Spike** ISS - -You can set several simulators, such as : - -```sh -export DV_SIMULATORS=veri-testharness,vcs-testharness,vcs_uvm -``` - -If exactly 2 simulators are given, their trace is compared ([see the Regression tests section](#running-regression-tests-simulations)). - -Here is how you can run the hello world C program with the Verilator model: - -```sh -# Make sure to source this script from the root directory -# to correctly set the environment variables related to the tools -source verif/sim/setup-env.sh - -# Set the NUM_JOBS variable to increase the number of parallel make jobs -# export NUM_JOBS= - -export DV_SIMULATORS=veri-testharness - -cd ./verif/sim - -python3 cva6.py --target cv32a60x --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml \ ---c_tests ../tests/custom/hello_world/hello_world.c \ ---linker=../../config/gen_from_riscv_config/linker/link.ld \ ---gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib \ --nostartfiles -g ../tests/custom/common/syscalls.c \ -../tests/custom/common/crt.S -lgcc \ --I../tests/custom/env -I../tests/custom/common" -``` - -You can run either assembly programs (check `verif/test/custom/hello_world/custom_test_template.S`) or C programs. Run `python3 cva6.py --help` to have more informations on the available parameters. - -## Simulating with VCS and Verdi - -You can set the environment variable `VERDI` as such if you want to launch Verdi while simulating with VCS: - -```sh -export VERDI=1 -``` - +* **[Running Simulations](tutorials/running_sim.md)** +* **[ASIC Implementation](tutorials/asic.md)** +* **[FPGA Implementation and running an OS](tutorials/fpga.md)** +* **[Instruction Tracing](corev_apu/instr_tracing/README.md)** # Running regression tests simulations diff --git a/common/local/util/instr_trace_item.svh b/common/local/util/instr_trace_item.svh index c1ea36e297..fd7d325e83 100644 --- a/common/local/util/instr_trace_item.svh +++ b/common/local/util/instr_trace_item.svh @@ -41,6 +41,8 @@ class instr_trace_item #( logic result_fpr [$]; logic [63:0] imm; logic [63:0] result; + logic dest_we_valid; + logic dest_is_fp; logic [CVA6Cfg.PLEN-1:0] paddr; string priv_lvl; bp_resolve_t bp; @@ -49,7 +51,7 @@ class instr_trace_item #( // constructor creating a new instruction trace item, e.g.: a single instruction with all relevant information function new (time simtime, longint unsigned cycle, scoreboard_entry_t sbe, logic [31:0] instr, logic [63:0] gp_reg_file [32], - logic [63:0] fp_reg_file [32], logic [63:0] result, logic [CVA6Cfg.PLEN-1:0] paddr, riscv::priv_lvl_t priv_lvl, logic debug_mode, bp_resolve_t bp); + logic [63:0] fp_reg_file [32], logic [63:0] result, logic dest_we_valid, logic dest_is_fp, logic [CVA6Cfg.PLEN-1:0] paddr, riscv::priv_lvl_t priv_lvl, logic debug_mode, bp_resolve_t bp); this.simtime = simtime; this.cycle = cycle; this.pc = sbe.pc; @@ -57,6 +59,8 @@ class instr_trace_item #( this.gp_reg_file = gp_reg_file; this.fp_reg_file = fp_reg_file; this.result = result; + this.dest_we_valid = dest_we_valid; + this.dest_is_fp = dest_is_fp; this.paddr = paddr; this.bp = bp; this.priv_lvl = (debug_mode) ? "D" : getPrivLevel(priv_lvl); @@ -195,6 +199,68 @@ class instr_trace_item #( endcase endfunction + function logic scoreboardDestIsFp(); + if (sbe.fu inside {ariane_pkg::FPU, ariane_pkg::FPU_VEC}) begin + return ariane_pkg::fd_changes_rd_state(sbe.op); + end + return ariane_pkg::is_rd_fpr(sbe.op); + endfunction + + function logic rawDestIsFp(); + if (dest_we_valid) begin + return dest_is_fp; + end + return scoreboardDestIsFp(); + endfunction + + function logic fpInstrForcesGprDest(); + logic [6:0] opcode = instr[6:0]; + logic [4:0] funct5 = instr[31:27]; + logic [2:0] rm = instr[14:12]; + + if (opcode == riscv::OpcodeOpFp) begin + if (funct5 == 5'b11000) begin + // fcvt.*.* instructions that target an integer register + return 1'b1; + end + + if (funct5 == 5'b10100) begin + // fle.*, flt.*, feq.* comparisons produce integer results. + return 1'b1; + end + + if (funct5 == 5'b11100) begin + // fmv.x.* (rm == 000) and fclass (rm == 001) always write GPRs. + if ((rm == 3'b000) || (rm == 3'b001)) begin + return 1'b1; + end + // Alternate encodings when FP16ALT is enabled mirror rm encodings. + if (CVA6Cfg.XF16ALT && ((rm == 3'b100) || (rm == 3'b101))) begin + return 1'b1; + end + end + end + + return 1'b0; + endfunction + + function logic effectiveDestIsFp(); + logic dest_is_fp_raw = rawDestIsFp(); + + if (fpInstrForcesGprDest()) begin + return 1'b0; + end + + return dest_is_fp_raw; + endfunction + + function void adjustResultRegKinds(); + logic final_dest_is_fp = effectiveDestIsFp(); + foreach (result_fpr[i]) begin + result_fpr[i] = final_dest_is_fp; + end + endfunction + function string printInstr(); string s; @@ -379,6 +445,8 @@ class instr_trace_item #( // instr, // s); + adjustResultRegKinds(); + foreach (result_regs[i]) begin if (result_fpr[i]) s = $sformatf("%s %-4s:%16x", s, fpRegAddrToStr(result_regs[i]), this.result); @@ -466,45 +534,48 @@ class instr_trace_item #( function string printRFBCInstr(input string mnemonic, input bit use_rnd); + logic dest_fp = effectiveDestIsFp(); result_regs.push_back(rd); - result_fpr.push_back(ariane_pkg::is_rd_fpr(sbe.op)); + result_fpr.push_back(dest_fp); read_regs.push_back(rs2); read_fpr.push_back(ariane_pkg::is_rs2_fpr(sbe.op)); read_regs.push_back(sbe.result[4:0]); read_fpr.push_back(ariane_pkg::is_imm_fpr(sbe.op)); if (use_rnd && instr[14:12]!=3'b111) - return $sformatf("%-12s %4s, %s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), ariane_pkg::is_rd_fpr(sbe.op)?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs2_fpr(sbe.op)?fpRegAddrToStr(rs2):regAddrToStr(rs2), ariane_pkg::is_imm_fpr(sbe.op)?fpRegAddrToStr(sbe.result[4:0]):regAddrToStr(sbe.result[4:0]), fpRmToStr(instr[14:12])); + return $sformatf("%-12s %4s, %s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), dest_fp?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs2_fpr(sbe.op)?fpRegAddrToStr(rs2):regAddrToStr(rs2), ariane_pkg::is_imm_fpr(sbe.op)?fpRegAddrToStr(sbe.result[4:0]):regAddrToStr(sbe.result[4:0]), fpRmToStr(instr[14:12])); else - return $sformatf("%-12s %4s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), ariane_pkg::is_rd_fpr(sbe.op)?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs2_fpr(sbe.op)?fpRegAddrToStr(rs2):regAddrToStr(rs2), ariane_pkg::is_imm_fpr(sbe.op)?fpRegAddrToStr(sbe.result[4:0]):regAddrToStr(sbe.result[4:0])); + return $sformatf("%-12s %4s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), dest_fp?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs2_fpr(sbe.op)?fpRegAddrToStr(rs2):regAddrToStr(rs2), ariane_pkg::is_imm_fpr(sbe.op)?fpRegAddrToStr(sbe.result[4:0]):regAddrToStr(sbe.result[4:0])); endfunction // printRFInstr function string printRFInstr(input string mnemonic, input bit use_rnd); + logic dest_fp = effectiveDestIsFp(); result_regs.push_back(rd); - result_fpr.push_back(ariane_pkg::is_rd_fpr(sbe.op)); + result_fpr.push_back(dest_fp); read_regs.push_back(rs1); read_fpr.push_back(ariane_pkg::is_rs1_fpr(sbe.op)); read_regs.push_back(rs2); read_fpr.push_back(ariane_pkg::is_rs2_fpr(sbe.op)); if (use_rnd && instr[14:12]!=3'b111) - return $sformatf("%-12s %4s, %s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), ariane_pkg::is_rd_fpr(sbe.op)?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs1_fpr(sbe.op)?fpRegAddrToStr(rs1):regAddrToStr(rs1), ariane_pkg::is_rs2_fpr(sbe.op)?fpRegAddrToStr(rs2):regAddrToStr(rs2), fpRmToStr(instr[14:12])); + return $sformatf("%-12s %4s, %s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), dest_fp?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs1_fpr(sbe.op)?fpRegAddrToStr(rs1):regAddrToStr(rs1), ariane_pkg::is_rs2_fpr(sbe.op)?fpRegAddrToStr(rs2):regAddrToStr(rs2), fpRmToStr(instr[14:12])); else - return $sformatf("%-12s %4s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), ariane_pkg::is_rd_fpr(sbe.op)?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs1_fpr(sbe.op)?fpRegAddrToStr(rs1):regAddrToStr(rs1), ariane_pkg::is_rs2_fpr(sbe.op)?fpRegAddrToStr(rs2):regAddrToStr(rs2)); + return $sformatf("%-12s %4s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), dest_fp?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs1_fpr(sbe.op)?fpRegAddrToStr(rs1):regAddrToStr(rs1), ariane_pkg::is_rs2_fpr(sbe.op)?fpRegAddrToStr(rs2):regAddrToStr(rs2)); endfunction // printRFInstr function string printRFInstr1Op(input string mnemonic, input bit use_rnd); + logic dest_fp = effectiveDestIsFp(); result_regs.push_back(rd); - result_fpr.push_back(ariane_pkg::is_rd_fpr(sbe.op)); + result_fpr.push_back(dest_fp); read_regs.push_back(rs1); read_fpr.push_back(ariane_pkg::is_rs1_fpr(sbe.op)); if (use_rnd && instr[14:12]!=3'b111) - return $sformatf("%-12s %4s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), ariane_pkg::is_rd_fpr(sbe.op)?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs1_fpr(sbe.op)?fpRegAddrToStr(rs1):regAddrToStr(rs1), fpRmToStr(instr[14:12])); + return $sformatf("%-12s %4s, %s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), dest_fp?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs1_fpr(sbe.op)?fpRegAddrToStr(rs1):regAddrToStr(rs1), fpRmToStr(instr[14:12])); else - return $sformatf("%-12s %4s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), ariane_pkg::is_rd_fpr(sbe.op)?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs1_fpr(sbe.op)?fpRegAddrToStr(rs1):regAddrToStr(rs1)); + return $sformatf("%-12s %4s, %s", $sformatf("%s.%s",mnemonic, fpFmtToStr(instr[26:25])), dest_fp?fpRegAddrToStr(rd):regAddrToStr(rd), ariane_pkg::is_rs1_fpr(sbe.op)?fpRegAddrToStr(rs1):regAddrToStr(rs1)); endfunction // printRFInstr1Op function string printR4Instr(input string mnemonic); @@ -523,8 +594,9 @@ class instr_trace_item #( function string printFpSpecialInstr(); + logic dest_fp = effectiveDestIsFp(); result_regs.push_back(rd); - result_fpr.push_back(ariane_pkg::is_rd_fpr(sbe.op)); + result_fpr.push_back(dest_fp); read_regs.push_back(rs1); read_fpr.push_back(ariane_pkg::is_rs1_fpr(sbe.op)); @@ -634,8 +706,9 @@ class instr_trace_item #( endfunction // printCSRInstr function string printLoadInstr(input string mnemonic); + logic dest_fp = effectiveDestIsFp(); result_regs.push_back(rd); - result_fpr.push_back(ariane_pkg::is_rd_fpr(sbe.op)); + result_fpr.push_back(dest_fp); read_regs.push_back(rs1); read_fpr.push_back(1'b0); // save the immediate for calculating the virtual address @@ -723,4 +796,4 @@ class instr_trace_item #( return this.printRInstr(s); endfunction endclass -`endif +`endif \ No newline at end of file diff --git a/common/local/util/instr_tracer.sv b/common/local/util/instr_tracer.sv index 9083664069..62071ed479 100644 --- a/common/local/util/instr_tracer.sv +++ b/common/local/util/instr_tracer.sv @@ -25,32 +25,33 @@ module instr_tracer #( parameter type exception_t = logic, parameter interrupts_t INTERRUPTS = '0 )( - input logic pck, - input logic rstn, - input logic flush_unissued, - input logic flush_all, - input logic [31:0] instruction, - input logic fetch_valid, - input logic fetch_ack, - input logic issue_ack, // issue acknowledged - input scoreboard_entry_t issue_sbe, // issue scoreboard entry - input logic [1:0][4:0] waddr, // WB stage - input logic [1:0][63:0] wdata, - input logic [1:0] we_gpr, - input logic [1:0] we_fpr, - input scoreboard_entry_t [1:0] commit_instr, // commit instruction - input logic [1:0] commit_ack, - input logic st_valid, // stores - address translation - input logic [CVA6Cfg.PLEN-1:0] st_paddr, - input logic ld_valid, // loads - input logic ld_kill, - input logic [CVA6Cfg.PLEN-1:0] ld_paddr, - input bp_resolve_t resolve_branch, // misprediction - input exception_t commit_exception, - input riscv::priv_lvl_t priv_lvl, // current privilege level - input logic debug_mode, + input logic pck, + input logic rstn, + input logic flush_unissued, + input logic flush_all, + input logic [31:0] instruction [CVA6Cfg.NrIssuePorts-1:0], + input logic [CVA6Cfg.NrIssuePorts-1:0] fetch_valid, + input logic [CVA6Cfg.NrIssuePorts-1:0] fetch_ack, + input logic [CVA6Cfg.NrIssuePorts-1:0] issue_ack, // issue acknowledged + input scoreboard_entry_t [CVA6Cfg.NrIssuePorts-1:0] issue_sbe, // issue scoreboard entry + input logic [CVA6Cfg.NrCommitPorts-1:0][4:0] waddr, // WB stage + input logic [CVA6Cfg.NrCommitPorts-1:0][63:0] wdata, + input logic [CVA6Cfg.NrCommitPorts-1:0] we_gpr, + input logic [CVA6Cfg.NrCommitPorts-1:0] we_fpr, + input scoreboard_entry_t [CVA6Cfg.NrCommitPorts-1:0] commit_instr, // commit instruction + input logic [CVA6Cfg.NrCommitPorts-1:0] commit_ack, + input logic [CVA6Cfg.NrCommitPorts-1:0] commit_drop, + input logic st_valid, // stores - address translation + input logic [CVA6Cfg.PLEN-1:0] st_paddr, + input logic ld_valid, // loads + input logic ld_kill, + input logic [CVA6Cfg.PLEN-1:0] ld_paddr, + input bp_resolve_t resolve_branch, // misprediction + input exception_t commit_exception, + input riscv::priv_lvl_t priv_lvl, // current privilege level + input logic debug_mode, - input logic[CVA6Cfg.XLEN-1:0] hart_id_i + input logic[CVA6Cfg.XLEN-1:0] hart_id_i ); // keep the decoded instructions in a queue @@ -59,7 +60,6 @@ module instr_tracer #( logic [31:0] issue_queue [$]; // issue scoreboard entries scoreboard_entry_t issue_sbe_queue [$]; - scoreboard_entry_t issue_sbe_item; // store resolved branches, get (mis-)predictions bp_resolve_t bp [$]; // shadow copy of the register files @@ -87,6 +87,7 @@ module instr_tracer #( task trace(); automatic logic [31:0] decode_instruction, issue_instruction, issue_commit_instruction; automatic scoreboard_entry_t commit_instruction; + automatic scoreboard_entry_t issue_sbe_item; // initialize register 0 gp_reg_file = '{default:0}; fp_reg_file = '{default:0}; @@ -94,7 +95,7 @@ module instr_tracer #( forever begin automatic bp_resolve_t bp_instruction = '0; // new cycle, we are only interested if reset is de-asserted - @(pck) if (rstn !== 1'b1) begin + @(posedge pck) if (rstn !== 1'b1) begin flush(); continue; end @@ -106,20 +107,24 @@ module instr_tracer #( // Instruction Decode // ------------------- // we are decoding an instruction - if (fetch_valid && fetch_ack) begin - decode_instruction = instruction; - decode_queue.push_back(decode_instruction); + for (int unsigned i = 0; i < CVA6Cfg.NrIssuePorts; ++i) begin + if (fetch_valid[i] && fetch_ack[i]) begin + decode_instruction = instruction[i]; + decode_queue.push_back(decode_instruction); + end end // ------------------- // Instruction Issue // ------------------- // we got a new issue ack, so put the element from the decode queue to // the issue queue - if (issue_ack && !flush_unissued) begin - issue_instruction = decode_queue.pop_front(); - issue_queue.push_back(issue_instruction); - // also save the scoreboard entry to a separate issue queue - issue_sbe_queue.push_back(scoreboard_entry_t'(issue_sbe)); + for (int unsigned i = 0; i < CVA6Cfg.NrIssuePorts; ++i) begin + if (issue_ack[i] && !flush_unissued) begin + issue_instruction = decode_queue.pop_front(); + issue_queue.push_back(issue_instruction); + // also save the scoreboard entry to a separate issue queue + issue_sbe_queue.push_back(scoreboard_entry_t'(issue_sbe[i])); + end end // -------------------- @@ -138,11 +143,11 @@ module instr_tracer #( if (resolve_branch.valid) begin bp.push_back(resolve_branch); end - // -------------- - // Commit - // -------------- - // we are committing an instruction - for (int i = 0; i < 2; i++) begin + for (int i = 0; i < CVA6Cfg.NrCommitPorts; i++) begin + // -------------- + // Commit + // -------------- + // we are committing an instruction if (commit_ack[i]) begin commit_instruction = scoreboard_entry_t'(commit_instr[i]); issue_commit_instruction = issue_queue.pop_front(); @@ -155,30 +160,62 @@ module instr_tracer #( if (commit_instr[i].fu == ariane_pkg::CTRL_FLOW) bp_instruction = bp.pop_front(); + + // all the queues have been popped + // if the commit is to be dropped, we can do it now + if (commit_drop[i]) continue; // the scoreboards issue entry still contains the immediate value as a result // check if the write back is valid, if not we need to source the result from the register file // as the most recent version of this register will be there. if (we_gpr[i] || we_fpr[i]) begin - printInstr(issue_sbe_item, issue_commit_instruction, wdata[i], address_mapping, priv_lvl, debug_mode, bp_instruction); + printInstr( + issue_sbe_item, + issue_commit_instruction, + wdata[i], + we_gpr[i] || we_fpr[i], + we_fpr[i], + address_mapping, + priv_lvl, + debug_mode, + bp_instruction + ); end else if (ariane_pkg::is_rd_fpr(commit_instruction.op)) begin - printInstr(issue_sbe_item, issue_commit_instruction, fp_reg_file[commit_instruction.rd], address_mapping, priv_lvl, debug_mode, bp_instruction); + printInstr( + issue_sbe_item, + issue_commit_instruction, + fp_reg_file[commit_instruction.rd], + 1'b0, + 1'b1, + address_mapping, + priv_lvl, + debug_mode, + bp_instruction + ); end else begin - printInstr(issue_sbe_item, issue_commit_instruction, gp_reg_file[commit_instruction.rd], address_mapping, priv_lvl, debug_mode, bp_instruction); + printInstr( + issue_sbe_item, + issue_commit_instruction, + gp_reg_file[commit_instruction.rd], + 1'b0, + 1'b0, + address_mapping, + priv_lvl, + debug_mode, + bp_instruction + ); end end - end - // -------------- - // Exceptions - // -------------- - if (commit_exception.valid && !(debug_mode && commit_exception.cause == riscv::BREAKPOINT)) begin - // print exception - printException(commit_instr[0].pc, commit_exception.cause, commit_exception.tval); - end - // ---------------------- - // Commit Registers - // ---------------------- - // update shadow reg files here - for (int i = 0; i < 2; i++) begin + // -------------- + // Exceptions + // -------------- + if (i == 0 && commit_exception.valid && !(debug_mode && commit_exception.cause == riscv::BREAKPOINT)) begin + // print exception + printException(commit_instr[0].pc, commit_exception.cause, commit_exception.tval); + end + // ---------------------- + // Commit Registers + // ---------------------- + // update shadow reg files here if (we_gpr[i] && waddr[i] != 5'b0) begin gp_reg_file[waddr[i]] = wdata[i]; end else if (we_fpr[i]) begin @@ -217,16 +254,31 @@ module instr_tracer #( bp = {}; endfunction - function void printInstr(scoreboard_entry_t sbe, logic [31:0] instr, logic [63:0] result, logic [CVA6Cfg.PLEN-1:0] paddr, riscv::priv_lvl_t priv_lvl, logic debug_mode, bp_resolve_t bp); + function void printInstr(scoreboard_entry_t sbe, logic [31:0] instr, logic [63:0] result, logic dest_we_valid, logic dest_is_fp, logic [CVA6Cfg.PLEN-1:0] paddr, riscv::priv_lvl_t priv_lvl, logic debug_mode, bp_resolve_t bp); automatic instr_trace_item #( .CVA6Cfg(CVA6Cfg), .bp_resolve_t(bp_resolve_t), .scoreboard_entry_t(scoreboard_entry_t) - ) iti = new ($time, clk_ticks, sbe, instr, gp_reg_file, fp_reg_file, result, paddr, priv_lvl, debug_mode, bp); + ) iti = new ( + $time, + clk_ticks, + sbe, + instr, + gp_reg_file, + fp_reg_file, + result, + dest_we_valid, + dest_is_fp, + paddr, + priv_lvl, + debug_mode, + bp + ); // print instruction to console automatic string print_instr = iti.printInstr(); + automatic logic commit_is_fp = dest_we_valid ? dest_is_fp : ariane_pkg::is_rd_fpr(sbe.op); if (ariane_pkg::ENABLE_SPIKE_COMMIT_LOG && !debug_mode) begin - $fwrite(commit_log, riscv::spikeCommitLog(sbe.pc, priv_lvl, instr, sbe.rd, result, ariane_pkg::is_rd_fpr(sbe.op))); + $fwrite(commit_log, riscv::spikeCommitLog(sbe.pc, priv_lvl, instr, sbe.rd, result, commit_is_fp)); end $fwrite(f, {print_instr, "\n"}); endfunction @@ -259,4 +311,4 @@ module instr_tracer #( endmodule : instr_tracer //pragma translate_on -`endif +`endif \ No newline at end of file diff --git a/config/gen_from_riscv_config/cv32a60x/spike/spike.yaml b/config/gen_from_riscv_config/cv32a60x/spike/spike.yaml index fa51fff2f2..f2d1de47f5 100644 --- a/config/gen_from_riscv_config/cv32a60x/spike/spike.yaml +++ b/config/gen_from_riscv_config/cv32a60x/spike/spike.yaml @@ -24,7 +24,7 @@ spike_param_tree: pmpaddr0: 0 pmpcfg0: 0 pmpregions_max: 64 - pmpregions_writable: 0 + pmpregions_writable: 8 priv: M status_fs_field_we: false status_fs_field_we_enable: false diff --git a/config/gen_from_riscv_config/cv32a60x_axi/spike/spike.yaml b/config/gen_from_riscv_config/cv32a60x_axi/spike/spike.yaml index fa51fff2f2..f2d1de47f5 100644 --- a/config/gen_from_riscv_config/cv32a60x_axi/spike/spike.yaml +++ b/config/gen_from_riscv_config/cv32a60x_axi/spike/spike.yaml @@ -24,7 +24,7 @@ spike_param_tree: pmpaddr0: 0 pmpcfg0: 0 pmpregions_max: 64 - pmpregions_writable: 0 + pmpregions_writable: 8 priv: M status_fs_field_we: false status_fs_field_we_enable: false diff --git a/config/gen_from_riscv_config/cv32a65x/spike/spike.yaml b/config/gen_from_riscv_config/cv32a65x/spike/spike.yaml index fa51fff2f2..f2d1de47f5 100644 --- a/config/gen_from_riscv_config/cv32a65x/spike/spike.yaml +++ b/config/gen_from_riscv_config/cv32a65x/spike/spike.yaml @@ -24,7 +24,7 @@ spike_param_tree: pmpaddr0: 0 pmpcfg0: 0 pmpregions_max: 64 - pmpregions_writable: 0 + pmpregions_writable: 8 priv: M status_fs_field_we: false status_fs_field_we_enable: false diff --git a/config/gen_from_riscv_config/cv32a65x_axi/spike/spike.yaml b/config/gen_from_riscv_config/cv32a65x_axi/spike/spike.yaml index fa51fff2f2..f2d1de47f5 100644 --- a/config/gen_from_riscv_config/cv32a65x_axi/spike/spike.yaml +++ b/config/gen_from_riscv_config/cv32a65x_axi/spike/spike.yaml @@ -24,7 +24,7 @@ spike_param_tree: pmpaddr0: 0 pmpcfg0: 0 pmpregions_max: 64 - pmpregions_writable: 0 + pmpregions_writable: 8 priv: M status_fs_field_we: false status_fs_field_we_enable: false diff --git a/core/amo_buffer.sv b/core/amo_buffer.sv index aa0ca948e9..ddfe621411 100644 --- a/core/amo_buffer.sv +++ b/core/amo_buffer.sv @@ -77,9 +77,9 @@ module amo_buffer #( assign ypb_amo_req_o.rready = amo_valid_commit_i; - // only flush if we are currently not committing the AMO + // only flush if we are currently not committing the AMO, unless respons rvalid just arrived, in that case we do need to flush // e.g.: it is not speculative anymore - assign flush_amo_buffer = flush_i & !amo_valid_commit_i; + assign flush_amo_buffer = flush_i & (!amo_valid_commit_i || ypb_amo_rsp_i.rvalid); cva6_fifo_v3 #( .DEPTH (1), diff --git a/core/cache_subsystem/cva6_hpdcache_if_adapter.sv b/core/cache_subsystem/cva6_hpdcache_if_adapter.sv index 13822e436f..2dfdd8a136 100644 --- a/core/cache_subsystem/cva6_hpdcache_if_adapter.sv +++ b/core/cache_subsystem/cva6_hpdcache_if_adapter.sv @@ -184,7 +184,7 @@ module cva6_hpdcache_if_adapter // Response forwarding ypb channel R - assign ypb_load_rsp_o.rvalid = hpdcache_rsp_valid_i; + assign ypb_load_rsp_o.rvalid = hpdcache_rsp_valid_i && !hpdcache_rsp_i.aborted; assign ypb_load_rsp_o.rid = hpdcache_rsp_i.tid; assign ypb_load_rsp_o.err = '0; assign ypb_load_rsp_o.rdata = hpdcache_rsp_i.rdata; @@ -233,6 +233,7 @@ module cva6_hpdcache_if_adapter assign ypb_mmu_ptw_rsp_o.rdata = hpdcache_rsp_i.rdata; assign ypb_mmu_ptw_rsp_o.rid = hpdcache_rsp_i.tid; assign ypb_mmu_ptw_rsp_o.vgnt = hpdcache_req_ready_i; + assign ypb_mmu_ptw_rsp_o.pgnt = hpdcache_req_ready_i; // Assertions // {{{ @@ -276,6 +277,7 @@ else if (IsZcmtPort == 1'b1) begin : zcmt_port_gen assign ypb_zcmt_rsp_o.rdata = hpdcache_rsp_i.rdata; assign ypb_zcmt_rsp_o.rid = hpdcache_rsp_i.tid; assign ypb_zcmt_rsp_o.vgnt = hpdcache_req_ready_i; + assign ypb_zcmt_rsp_o.pgnt = hpdcache_req_ready_i; // Assertions // {{{ @@ -370,6 +372,7 @@ else if (IsZcmtPort == 1'b1) begin : zcmt_port_gen // Request forwarding // {{{ + assign amo_data_size = ypb_amo_req_i.size; assign amo_is_word = (amo_data_size == 2'b10); assign amo_is_word_hi = ypb_amo_req_i.paddr[2]; if (CVA6Cfg.XLEN == 64) begin : amo_data_64_gen @@ -406,7 +409,7 @@ else if (IsZcmtPort == 1'b1) begin : zcmt_port_gen size: ypb_store_req_i.size, sid: hpdcache_req_sid_i, tid: '0, - need_rsp: 1'b0, + need_rsp: 1'b1, phys_indexed: 1'b1, addr_tag: get_paddr_tag(ypb_store_req_i.paddr), pma: '{ @@ -471,7 +474,7 @@ else if (IsZcmtPort == 1'b1) begin : zcmt_port_gen assign ypb_amo_valid = hpdcache_rsp_valid_i && (hpdcache_rsp_i.tid == '1); //ypb - assign ypb_store_rsp_o.pgnt = hpdcache_req_ready_i & ypb_store_req_i.preq; + assign ypb_store_rsp_o.pgnt = ypb_store_req_i.preq & hpdcache_req_ready_i; assign ypb_store_rsp_o.rvalid = ypb_store_valid; assign ypb_store_rsp_o.rid = '0; assign ypb_store_rsp_o.err = '0; diff --git a/core/cache_subsystem/cva6_hpdcache_subsystem.sv b/core/cache_subsystem/cva6_hpdcache_subsystem.sv index 5a2d15558a..3c0caf4fe1 100644 --- a/core/cache_subsystem/cva6_hpdcache_subsystem.sv +++ b/core/cache_subsystem/cva6_hpdcache_subsystem.sv @@ -197,7 +197,7 @@ module cva6_hpdcache_subsystem userCfg.memDataWidth = CVA6Cfg.AxiDataWidth; userCfg.wtEn = 1'b0; userCfg.wbEn = 1'b0; - userCfg.lowLatency = 1'b0; + //userCfg.lowLatency = 1'b0; return userCfg; endfunction @@ -296,10 +296,10 @@ module cva6_hpdcache_subsystem localparam int NUM_SNOOP_PORTS = HPDCACHE_ENABLE_CMO ? 3 : 2; localparam int MMU_PTW_INDEX = 0; - localparam int ZCMT_INDEX = (CVA6Cfg.RVZCMT ? 1 : 0); - localparam int LOAD_INDEX = (CVA6Cfg.MmuPresent ? ZCMT_INDEX + 1 : ZCMT_INDEX); - localparam int STORE_AMO_INDEX = LOAD_INDEX + 1; - localparam int CMO_INDEX = STORE_AMO_INDEX + 1; + localparam int ZCMT_INDEX = (CVA6Cfg.MmuPresent ? 1 : 0); + localparam int STORE_AMO_INDEX = (CVA6Cfg.RVZCMT ? ZCMT_INDEX + 1 : ZCMT_INDEX); + localparam int LOAD_INDEX = STORE_AMO_INDEX + 1; + localparam int CMO_INDEX = LOAD_INDEX + 1; localparam int HWPF_INDEX = (HPDCACHE_ENABLE_CMO ? CMO_INDEX + 1 : CMO_INDEX); function automatic hpdcache_pkg::hpdcache_user_cfg_t hpdcacheSetConfig(); @@ -344,7 +344,7 @@ module cva6_hpdcache_subsystem userCfg.wbEn = (CVA6Cfg.DCacheType == config_pkg::HPDCACHE_WB) || (CVA6Cfg.DCacheType == config_pkg::HPDCACHE_WT_WB); - userCfg.lowLatency = 1'b0; + //userCfg.lowLatency = 1'b0; return userCfg; endfunction @@ -495,6 +495,7 @@ module cva6_hpdcache_subsystem .hpdcache_mem_req_w_t (hpdcache_mem_req_w_t), .hpdcache_mem_resp_r_t(hpdcache_mem_resp_r_t), .hpdcache_mem_resp_w_t(hpdcache_mem_resp_w_t), + .hpdcache_mem_be_t (hpdcache_mem_be_t), .AxiAddrWidth (CVA6Cfg.AxiAddrWidth), .AxiDataWidth (CVA6Cfg.AxiDataWidth), diff --git a/core/cache_subsystem/cva6_hpdcache_subsystem_axi_arbiter.sv b/core/cache_subsystem/cva6_hpdcache_subsystem_axi_arbiter.sv index d14274f4c9..46a4521d84 100644 --- a/core/cache_subsystem/cva6_hpdcache_subsystem_axi_arbiter.sv +++ b/core/cache_subsystem/cva6_hpdcache_subsystem_axi_arbiter.sv @@ -25,6 +25,7 @@ module cva6_hpdcache_subsystem_axi_arbiter parameter type hpdcache_mem_req_w_t = logic, parameter type hpdcache_mem_resp_r_t = logic, parameter type hpdcache_mem_resp_w_t = logic, + parameter type hpdcache_mem_be_t = logic, parameter int unsigned AxiAddrWidth = 1, parameter int unsigned AxiDataWidth = 1, @@ -101,6 +102,10 @@ module cva6_hpdcache_subsystem_axi_arbiter `HPDCACHE_TYPEDEF_MEM_RESP_R_T(hpdcache_mem_resp_r_idext_t, hpdcache_mem_idext_t, hpdcache_mem_data_t); + `HPDCACHE_TYPEDEF_MEM_RESP_W_T(hpdcache_mem_resp_w_idext_t, hpdcache_mem_idext_t); + + `HPDCACHE_TYPEDEF_MEM_REQ_W_T(hpdcache_mem_req_w_idext_t, hpdcache_mem_data_t, hpdcache_mem_be_t); + localparam int MEM_RESP_RT_DEPTH = (1 << CVA6Cfg.AxiIdWidth); typedef hpdcache_mem_idext_t [MEM_RESP_RT_DEPTH-1:0] mem_resp_rt_t; @@ -138,14 +143,13 @@ module cva6_hpdcache_subsystem_axi_arbiter .mem_req_read_ready_i(mem_req_read_ready_arb), .mem_req_read_valid_o(mem_req_read_valid_arb), - .mem_req_read_o (mem_req_read_arb), - - .gnt_index_o(mem_req_read_index) + .mem_req_read_o (mem_req_read_arb) ); // Suffix the transaction identifier with the index of the initiator (0:icache, 1:dcache) hpdcache_mem_req_idext_t mem_req_read_idext_arb; + assign mem_req_read_index = (mem_req_read_arb == mem_req_read[0]) ? 1'b0 : 1'b1; assign mem_req_read_idext_arb.mem_req_id = {mem_req_read_index, mem_req_read_arb.mem_req_id}; assign mem_req_read_idext_arb.mem_req_addr = mem_req_read_arb.mem_req_addr; assign mem_req_read_idext_arb.mem_req_len = mem_req_read_arb.mem_req_len; @@ -155,6 +159,15 @@ module cva6_hpdcache_subsystem_axi_arbiter assign mem_req_read_idext_arb.mem_req_cacheable = mem_req_read_arb.mem_req_cacheable; // }}} + //Add prefix to write requests index from data cache (only data writes, so all...) + hpdcache_mem_req_idext_t dcache_write_idx; + assign dcache_write_idx.mem_req_id = {1'b1, dcache_write_i.mem_req_id[CVA6Cfg.AxiIdWidth-2:0]}; + assign dcache_write_idx.mem_req_addr = dcache_write_i.mem_req_addr; + assign dcache_write_idx.mem_req_len = dcache_write_i.mem_req_len; + assign dcache_write_idx.mem_req_size = dcache_write_i.mem_req_size; + assign dcache_write_idx.mem_req_command = dcache_write_i.mem_req_command; + assign dcache_write_idx.mem_req_atomic = dcache_write_i.mem_req_atomic; + assign dcache_write_idx.mem_req_cacheable = dcache_write_i.mem_req_cacheable; // Read response demultiplexor // {{{ // @@ -172,7 +185,7 @@ module cva6_hpdcache_subsystem_axi_arbiter always_comb begin : build_resp_read_rt_comb for (int i = 0; i < MEM_RESP_RT_DEPTH; i++) begin - mem_resp_read_rt[i] = (i < 8) ? 0 : 1; + mem_resp_read_rt[i] = (i < (2 ** (CVA6Cfg.AxiIdWidth - 1))) ? 0 : 1; end end @@ -222,17 +235,23 @@ module cva6_hpdcache_subsystem_axi_arbiter // AXI adapters // {{{ + hpdcache_mem_resp_w_idext_t dcache_write_resp_idx; + assign dcache_write_resp_o.mem_resp_w_is_atomic = dcache_write_resp_idx.mem_resp_w_is_atomic; + assign dcache_write_resp_o.mem_resp_w_error = dcache_write_resp_idx.mem_resp_w_error; + assign dcache_write_resp_o.mem_resp_w_id=dcache_write_resp_idx.mem_resp_w_id[0+:(CVA6Cfg.AxiIdWidth-1)]; + + hpdcache_mem_to_axi_write #( - .hpdcache_mem_req_t (hpdcache_mem_req_t), - .hpdcache_mem_req_w_t (hpdcache_mem_req_w_t), - .hpdcache_mem_resp_w_t(hpdcache_mem_resp_w_t), + .hpdcache_mem_req_t (hpdcache_mem_req_idext_t), + .hpdcache_mem_req_w_t (hpdcache_mem_req_w_idext_t), + .hpdcache_mem_resp_w_t(hpdcache_mem_resp_w_idext_t), .aw_chan_t (axi_aw_chan_t), .w_chan_t (axi_w_chan_t), .b_chan_t (axi_b_chan_t) ) i_hpdcache_mem_to_axi_write ( .req_ready_o(dcache_write_ready_o), .req_valid_i(dcache_write_valid_i), - .req_i (dcache_write_i), + .req_i (dcache_write_idx), .req_data_ready_o(dcache_write_data_ready_o), .req_data_valid_i(dcache_write_data_valid_i), @@ -240,7 +259,7 @@ module cva6_hpdcache_subsystem_axi_arbiter .resp_ready_i(dcache_write_resp_ready_i), .resp_valid_o(dcache_write_resp_valid_o), - .resp_o (dcache_write_resp_o), + .resp_o (dcache_write_resp_idx), .axi_aw_valid_o(axi_req_o.aw_valid), .axi_aw_o (axi_req_o.aw), diff --git a/core/cache_subsystem/cva6_hpdcache_wrapper.sv b/core/cache_subsystem/cva6_hpdcache_wrapper.sv index 6fb07bcce3..dc16174550 100644 --- a/core/cache_subsystem/cva6_hpdcache_wrapper.sv +++ b/core/cache_subsystem/cva6_hpdcache_wrapper.sv @@ -265,15 +265,15 @@ module cva6_hpdcache_wrapper .cva6_dcache_flush_i ('0), .cva6_dcache_flush_ack_o( /* unused */), - .hpdcache_req_valid_o(dcache_req_valid[MMU_PTW_INDEX]), - .hpdcache_req_ready_i(dcache_req_ready[MMU_PTW_INDEX]), - .hpdcache_req_o (dcache_req[MMU_PTW_INDEX]), - .hpdcache_req_abort_o(dcache_req_abort[MMU_PTW_INDEX]), - .hpdcache_req_tag_o (dcache_req_tag[MMU_PTW_INDEX]), - .hpdcache_req_pma_o (dcache_req_pma[MMU_PTW_INDEX]), - - .hpdcache_rsp_valid_i(dcache_rsp_valid[MMU_PTW_INDEX]), - .hpdcache_rsp_i (dcache_rsp[MMU_PTW_INDEX]) + .hpdcache_req_valid_o(dcache_req_valid[ZCMT_INDEX]), + .hpdcache_req_ready_i(dcache_req_ready[ZCMT_INDEX]), + .hpdcache_req_o (dcache_req[ZCMT_INDEX]), + .hpdcache_req_abort_o(dcache_req_abort[ZCMT_INDEX]), + .hpdcache_req_tag_o (dcache_req_tag[ZCMT_INDEX]), + .hpdcache_req_pma_o (dcache_req_pma[ZCMT_INDEX]), + + .hpdcache_rsp_valid_i(dcache_rsp_valid[ZCMT_INDEX]), + .hpdcache_rsp_i (dcache_rsp[ZCMT_INDEX]) ); end diff --git a/core/cache_subsystem/cva6_hpicache_if_adapter.sv b/core/cache_subsystem/cva6_hpicache_if_adapter.sv index ddd02367b5..344a8a1af1 100644 --- a/core/cache_subsystem/cva6_hpicache_if_adapter.sv +++ b/core/cache_subsystem/cva6_hpicache_if_adapter.sv @@ -118,7 +118,7 @@ module cva6_hpicache_if_adapter end FLUSH_PEND: begin if (hpicache_rsp_valid_i) begin - if (hpicache_rsp_i.tid == '0) begin + if (hpicache_rsp_i.tid == '1) begin cva6_icache_flush_ack_o = 1'b1; flush_fsm_d = FLUSH_IDLE; end @@ -160,7 +160,7 @@ module cva6_hpicache_if_adapter be: '0, size: '0, sid: '0, - tid: '0, + tid: '1, need_rsp: 1'b1, phys_indexed: 1'b0, pma: '{ @@ -171,7 +171,7 @@ module cva6_hpicache_if_adapter }; assign hpicache_req_valid_o = forward_fetch | forward_flush; - assign hpicache_req = forward_fetch ? hpicache_req_fetch : hpicache_req_flush; + assign hpicache_req = forward_flush ? hpicache_req_flush : hpicache_req_fetch; //flush has higher priority assign hpicache_req_abort_o = 1'b0; // unused on physically indexed requests assign hpicache_req_tag_o = '0; // unused on physically indexed requests assign hpicache_req_pma_o.uncacheable = 1'b0; @@ -184,9 +184,9 @@ module cva6_hpicache_if_adapter // {{{ logic ypb_fetch_valid; assign ypb_fetch_valid = hpicache_rsp_valid_i && (hpicache_rsp_i.tid != '1); - assign ypb_fetch_rsp_o.pgnt = hpicache_req_ready_i & ypb_fetch_req_i.preq; - assign ypb_fetch_rsp_o.vgnt = hpicache_req_ready_i & ypb_fetch_req_i.vreq; - assign ypb_fetch_rsp_o.rvalid = hpicache_rsp_valid_i; + assign ypb_fetch_rsp_o.pgnt = hpicache_req_ready_i & ypb_fetch_req_i.preq & !cva6_icache_flush_i; + assign ypb_fetch_rsp_o.vgnt = ypb_fetch_req_i.vreq; + assign ypb_fetch_rsp_o.rvalid = ypb_fetch_valid; assign ypb_fetch_rsp_o.rid = hpicache_rsp_i.tid; assign ypb_fetch_rsp_o.err = '0; assign ypb_fetch_rsp_o.rdata = hpicache_rsp_i.rdata; diff --git a/core/cache_subsystem/cva6_obi_adapter_subsystem.sv b/core/cache_subsystem/cva6_obi_adapter_subsystem.sv index 2308ab9cca..3638ef7135 100644 --- a/core/cache_subsystem/cva6_obi_adapter_subsystem.sv +++ b/core/cache_subsystem/cva6_obi_adapter_subsystem.sv @@ -164,8 +164,8 @@ module cva6_obi_adapter_subsystem assign noc_req_o.obi_store_req = obi_store_req; assign noc_req_o.obi_amo_req = obi_amo_req; assign noc_req_o.obi_load_req = obi_load_req; - assign noc_req_o.obi_mmu_ptw_req = '0; //obi_mmu_ptw_req; TODO - assign noc_req_o.obi_zcmt_req = '0; //obi_zcmt_req; TODO + assign noc_req_o.obi_mmu_ptw_req = obi_mmu_ptw_req; + assign noc_req_o.obi_zcmt_req = obi_zcmt_req; assign obi_fetch_req.req = ypb_fetch_req_i.preq; assign obi_fetch_req.reqpar = !ypb_fetch_req_i.preq; diff --git a/core/cache_subsystem/hpdcache b/core/cache_subsystem/hpdcache index 2d3787d6bf..04de808969 160000 --- a/core/cache_subsystem/hpdcache +++ b/core/cache_subsystem/hpdcache @@ -1 +1 @@ -Subproject commit 2d3787d6bf20d025f35d23fa55b56de2fdb682e0 +Subproject commit 04de80896981527c34fbbd35d7b1ef787a082d7c diff --git a/core/csr_regfile.sv b/core/csr_regfile.sv index fdcfb6b52c..352d22413c 100644 --- a/core/csr_regfile.sv +++ b/core/csr_regfile.sv @@ -2536,7 +2536,7 @@ module csr_regfile // in debug mode we execute with privilege level M assign priv_lvl_o = debug_mode ? riscv::PRIV_LVL_M : priv_lvl_q; assign v_o = CVA6Cfg.RVH ? v_q : 1'b0; - assign virtualization_off = CVA6Cfg.RVH ? !v_q : 1'b0; + assign virtualization_off = CVA6Cfg.RVH ? !v_q : 1'b1; // FPU outputs assign fflags_o = fcsr_q.fflags; assign frm_o = fcsr_q.frm; diff --git a/core/cva6_mmu/cva6_mmu.sv b/core/cva6_mmu/cva6_mmu.sv index 1ae9f9a2e7..ef567fc6ca 100644 --- a/core/cva6_mmu/cva6_mmu.sv +++ b/core/cva6_mmu/cva6_mmu.sv @@ -145,6 +145,9 @@ module cva6_mmu tlb_update_cva6_t update_itlb, update_dtlb, update_shared_tlb; + logic [CVA6Cfg.VLEN-1:0] shared_tlb_vaddr_prev, fetch_vaddr_prev; + logic new_fetch_req, new_ptw_req; + logic itlb_lu_access; pte_cva6_t itlb_content; pte_cva6_t itlb_g_content; @@ -163,14 +166,17 @@ module cva6_mmu logic shared_tlb_access, shared_tlb_miss; logic shared_tlb_hit, itlb_req; + logic aborted_ptw_req; // Assignments assign itlb_lu_access = fetch_areq_i.fetch_req; assign dtlb_lu_access = lsu_req_i; - assign itlb_lu_asid = v_i ? vs_asid_i : asid_i; - assign dtlb_lu_asid = (ld_st_v_i || flush_tlb_vvma_i) ? vs_asid_i : asid_i; + assign itlb_lu_asid = v_i ? vs_asid_i : asid_i; + assign dtlb_lu_asid = (ld_st_v_i || flush_tlb_vvma_i) ? vs_asid_i : asid_i; + assign new_fetch_req = fetch_areq_i.fetch_vaddr == fetch_vaddr_prev ? '0 : '1; + assign new_ptw_req = shared_tlb_vaddr == shared_tlb_vaddr_prev ? '0 : shared_tlb_access && !shared_tlb_hit; cva6_tlb #( .CVA6Cfg (CVA6Cfg), @@ -293,10 +299,10 @@ module cva6_mmu .ypb_mmu_ptw_rsp_t(ypb_mmu_ptw_rsp_t), .HYP_EXT (HYP_EXT) ) i_ptw ( - .clk_i (clk_i), - .rst_ni(rst_ni), + .clk_i (clk_i), + .rst_ni (rst_ni), .flush_i, - + .new_req_i (new_ptw_req), .ptw_active_o (ptw_active), .walking_instr_o (walking_instr), .ptw_error_o (ptw_error), @@ -346,7 +352,8 @@ module cva6_mmu .pmpcfg_i (pmpcfg_i), .pmpaddr_i (pmpaddr_i), .bad_paddr_o(ptw_bad_paddr), - .bad_gpaddr_o(ptw_bad_gpaddr) + .bad_gpaddr_o(ptw_bad_gpaddr), + .aborted_req_o(aborted_ptw_req) ); //----------------------- @@ -437,7 +444,7 @@ module cva6_mmu fetch_arsp_o.fetch_exception.gva = v_i; end end - end else if (ptw_active && walking_instr) begin + end else if (ptw_active && walking_instr && !new_fetch_req && !aborted_ptw_req) begin // ---------// // ITLB Miss // ---------// @@ -734,12 +741,14 @@ module cva6_mmu lsu_tinst_q <= '0; hs_ld_st_inst_q <= '0; end else begin - lsu_vaddr_q <= lsu_vaddr_n; - lsu_req_q <= lsu_req_n; - dtlb_pte_q <= dtlb_pte_n; - dtlb_hit_q <= dtlb_hit_n; - lsu_is_store_q <= lsu_is_store_n; - dtlb_is_page_q <= dtlb_is_page_n; + lsu_vaddr_q <= lsu_vaddr_n; + lsu_req_q <= lsu_req_n; + dtlb_pte_q <= dtlb_pte_n; + dtlb_hit_q <= dtlb_hit_n; + lsu_is_store_q <= lsu_is_store_n; + dtlb_is_page_q <= dtlb_is_page_n; + shared_tlb_vaddr_prev <= shared_tlb_vaddr; + fetch_vaddr_prev <= fetch_areq_i.fetch_vaddr; if (CVA6Cfg.RVH) begin lsu_tinst_q <= lsu_tinst_n; diff --git a/core/cva6_mmu/cva6_ptw.sv b/core/cva6_mmu/cva6_ptw.sv index 5ed7bf55d7..3cf9438059 100644 --- a/core/cva6_mmu/cva6_ptw.sv +++ b/core/cva6_mmu/cva6_ptw.sv @@ -35,6 +35,7 @@ module cva6_ptw input logic flush_i, // flush everything, we need to do this because // actually everything we do is speculative at this stage // e.g.: there could be a CSR instruction that changes everything + input new_req_i, //set when the request from shared tlb has changed output logic ptw_active_o, output logic walking_instr_o, // set when walking for TLB output logic ptw_error_o, // set when an error occurred @@ -86,7 +87,8 @@ module cva6_ptw input riscv::pmpcfg_t [(CVA6Cfg.NrPMPEntries > 0 ? CVA6Cfg.NrPMPEntries-1 : 0):0] pmpcfg_i, input logic [(CVA6Cfg.NrPMPEntries > 0 ? CVA6Cfg.NrPMPEntries-1 : 0):0][CVA6Cfg.PLEN-3:0] pmpaddr_i, output logic [CVA6Cfg.PLEN-1:0] bad_paddr_o, - output logic [CVA6Cfg.GPLEN-1:0] bad_gpaddr_o + output logic [CVA6Cfg.GPLEN-1:0] bad_gpaddr_o, + output logic aborted_req_o ); // input registers @@ -128,6 +130,7 @@ module cva6_ptw logic global_mapping_q, global_mapping_n; // latched tag signal logic tag_valid_n, tag_valid_q; + logic grant_q; // register the ASID logic [CVA6Cfg.ASID_WIDTH-1:0] tlb_update_asid_q, tlb_update_asid_n; // register the VMID @@ -159,6 +162,9 @@ module cva6_ptw assign ypb_mmu_ptw_req_o.cacheable = config_pkg::is_inside_cacheable_regions( CVA6Cfg, {{64 - CVA6Cfg.PLEN{1'b0}}, ypb_mmu_ptw_req_o.paddr} //TO DO CHECK GRANULARITY ); + assign ypb_mmu_ptw_req_o.rready = '1; + assign ypb_mmu_ptw_req_o.access_type = 1'b1; //1 = data + assign ypb_mmu_ptw_req_o.atop = ariane_pkg::AMO_NONE; // ----------- // TLB Update // ----------- @@ -225,7 +231,7 @@ module cva6_ptw bad_gpaddr_o[CVA6Cfg.GPLEN-1:0] = ptw_error_at_g_st_o ? ((ptw_stage_q == G_INTERMED_STAGE) ? gptw_pptr_q[CVA6Cfg.GPLEN-1:0] : gpaddr_q) : 'b0; end - assign ypb_mmu_ptw_req_o.preq = tag_valid_q; + assign ypb_mmu_ptw_req_o.preq = ypb_mmu_ptw_req_o.vreq; logic allow_access; @@ -317,6 +323,7 @@ module cva6_ptw ptw_lvl_n = '0; global_mapping_n = 1'b0; is_instr_ptw_n = 1'b0; + aborted_req_o = 1'b0; if (CVA6Cfg.RVH) begin @@ -383,10 +390,8 @@ module cva6_ptw // send a request out ypb_mmu_ptw_req_o.vreq = 1'b1; // wait for the WAIT_GRANT - if (ypb_mmu_ptw_rsp_i.vgnt) begin - // send the tag valid signal one cycle later - tag_valid_n = 1'b1; - state_d = PTE_LOOKUP; + if (ypb_mmu_ptw_rsp_i.pgnt) begin + state_d = PTE_LOOKUP; end end @@ -584,6 +589,7 @@ module cva6_ptw end // wait for the rvalid before going back to IDLE WAIT_RVALID: begin + ypb_mmu_ptw_req_o.vreq = grant_q ? '0 : tag_valid_q; //keep request if it was set, unless grant just came in if (data_rvalid_q) state_d = IDLE; end LATENCY: begin @@ -598,12 +604,13 @@ module cva6_ptw // Flush // ------- // should we have flushed before we got an rvalid, wait for it until going back to IDLE - if (flush_i) begin + if (flush_i || (new_req_i && state_q != IDLE && state_q != LATENCY)) begin // on a flush check whether we are // 1. in the PTE Lookup check whether we still need to wait for an rvalid // 2. waiting for a grant, if so: wait for it // if not, go back to idle - if (((state_q inside {PTE_LOOKUP, WAIT_RVALID}) && !data_rvalid_q) || ((state_q == WAIT_GRANT) && ypb_mmu_ptw_rsp_i.rvalid)) + aborted_req_o = 1'b1; + if (((state_q inside {PTE_LOOKUP, WAIT_RVALID}) && !data_rvalid_q) || ((state_q == WAIT_GRANT))) state_d = WAIT_RVALID; else state_d = LATENCY; end @@ -623,6 +630,7 @@ module cva6_ptw global_mapping_q <= 1'b0; data_rdata_q <= '0; data_rvalid_q <= 1'b0; + grant_q <= 1'b0; if (CVA6Cfg.RVH) begin gpaddr_q <= '0; gptw_pptr_q <= '0; @@ -634,12 +642,13 @@ module cva6_ptw ptw_pptr_q <= ptw_pptr_n; is_instr_ptw_q <= is_instr_ptw_n; ptw_lvl_q <= ptw_lvl_n; - tag_valid_q <= tag_valid_n; + tag_valid_q <= ypb_mmu_ptw_req_o.vreq; tlb_update_asid_q <= tlb_update_asid_n; vaddr_q <= vaddr_n; global_mapping_q <= global_mapping_n; data_rdata_q <= ypb_mmu_ptw_rsp_i.rdata; data_rvalid_q <= ypb_mmu_ptw_rsp_i.rvalid; + grant_q <= ypb_mmu_ptw_rsp_i.pgnt; if (CVA6Cfg.RVH) begin gpaddr_q <= gpaddr_n; diff --git a/core/cva6_pipeline.sv b/core/cva6_pipeline.sv index a5e8145c2c..ef11ce9661 100644 --- a/core/cva6_pipeline.sv +++ b/core/cva6_pipeline.sv @@ -602,37 +602,37 @@ module cva6_pipeline .fetch_entry_valid_i(fetch_valid_if_id), .fetch_entry_ready_o(fetch_ready_id_if), - .issue_entry_o (issue_entry_id_issue), - .issue_entry_o_prev (issue_entry_id_issue_prev), - .orig_instr_o (orig_instr_id_issue), - .was_compressed_o (was_compressed), - .issue_entry_valid_o(issue_entry_valid_id_issue), - .is_ctrl_flow_o (is_ctrl_fow_id_issue), - .issue_instr_ack_i (issue_instr_issue_id), - - .priv_lvl_i (priv_lvl), - .v_i (v), - .fs_i (fs), - .vfs_i (vfs), - .frm_i (frm_csr_id_issue_ex), - .vs_i (vs), - .irq_i (irq_i), - .irq_ctrl_i (irq_ctrl_csr_id), - .debug_mode_i (debug_mode), - .tvm_i (tvm_csr_id), - .tw_i (tw_csr_id), - .vtw_i (vtw_csr_id), - .tsr_i (tsr_csr_id), - .hu_i (hu), - .hart_id_i (hart_id_i), - .jvt_i (jvt), - .compressed_ready_i(x_compressed_ready), - .compressed_resp_i (x_compressed_resp), - .compressed_valid_o(x_compressed_valid), - .compressed_req_o (x_compressed_req), + .issue_entry_o (issue_entry_id_issue), + .issue_entry_o_prev (issue_entry_id_issue_prev), + .orig_instr_o (orig_instr_id_issue), + .was_compressed_o (was_compressed), + .issue_entry_valid_o (issue_entry_valid_id_issue), + .is_ctrl_flow_o (is_ctrl_fow_id_issue), + .issue_instr_ack_i (issue_instr_issue_id), + .rvfi_is_compressed_o(rvfi_is_compressed), + .priv_lvl_i (priv_lvl), + .v_i (v), + .fs_i (fs), + .vfs_i (vfs), + .frm_i (frm_csr_id_issue_ex), + .vs_i (vs), + .irq_i (irq_i), + .irq_ctrl_i (irq_ctrl_csr_id), + .debug_mode_i (debug_mode), + .tvm_i (tvm_csr_id), + .tw_i (tw_csr_id), + .vtw_i (vtw_csr_id), + .tsr_i (tsr_csr_id), + .hu_i (hu), + .hart_id_i (hart_id_i), + .jvt_i (jvt), + .compressed_ready_i (x_compressed_ready), + .compressed_resp_i (x_compressed_resp), + .compressed_valid_o (x_compressed_valid), + .compressed_req_o (x_compressed_req), // ZCMT interfaces - .ypb_zcmt_req_o (ypb_zcmt_req_o), - .ypb_zcmt_rsp_i (ypb_zcmt_rsp_i) + .ypb_zcmt_req_o (ypb_zcmt_req_o), + .ypb_zcmt_rsp_i (ypb_zcmt_rsp_i) ); @@ -1246,6 +1246,13 @@ module cva6_pipeline `endif // PITON_ARIANE `ifndef VERILATOR + + logic [31:0] fetch_instructions[CVA6Cfg.NrIssuePorts-1:0]; + + for (genvar i = 0; i < CVA6Cfg.NrIssuePorts; ++i) begin + assign fetch_instructions[i] = fetch_entry_if_id[i].instruction; + end + instr_tracer #( .CVA6Cfg(CVA6Cfg), .bp_resolve_t(bp_resolve_t), @@ -1259,9 +1266,9 @@ module cva6_pipeline .rstn(rst_ni), .flush_unissued(flush_unissued_instr_ctrl_id), .flush_all(flush_ctrl_ex), - .instruction(id_stage_i.fetch_entry_i[0].instruction), - .fetch_valid(id_stage_i.fetch_entry_valid_i[0]), - .fetch_ack(id_stage_i.fetch_entry_ready_o[0]), + .instruction(fetch_instructions), + .fetch_valid(id_stage_i.fetch_entry_valid_i), + .fetch_ack(id_stage_i.fetch_entry_ready_o), .issue_ack(issue_stage_i.i_scoreboard.issue_ack_i), .issue_sbe(issue_stage_i.i_scoreboard.issue_instr_o), .waddr(waddr_commit_id), @@ -1274,7 +1281,7 @@ module cva6_pipeline .st_paddr(ex_stage_i.lsu_i.i_store_unit.store_buffer_i.paddr_i), .ld_valid(ex_stage_i.lsu_i.i_load_unit.ypb_load_req_o.preq), .ld_kill(ex_stage_i.lsu_i.i_load_unit.ypb_load_req_o.kill_req), - .ld_paddr(ex_stage_i.lsu_i.i_load_unit.ypb_load_req_o.paddr), + .ld_paddr(ex_stage_i.lsu_i.i_load_unit.paddr_i), .resolve_branch(resolved_branch), .commit_exception(commit_stage_i.exception_o), .priv_lvl(priv_lvl), @@ -1342,10 +1349,8 @@ module cva6_pipeline //RVFI INSTR logic [CVA6Cfg.NrIssuePorts-1:0][31:0] rvfi_fetch_instr; - fu_t [CVA6Cfg.NrIssuePorts-1:0] rvfi_decoded_fu; for (genvar i = 0; i < CVA6Cfg.NrIssuePorts; i++) begin - assign rvfi_fetch_instr[i] = orig_instr_id_issue[i]; - assign rvfi_decoded_fu[i] = issue_entry_id_issue[i].fu; + assign rvfi_fetch_instr[i] = fetch_entry_if_id[i].instruction; end cva6_rvfi_probes #( @@ -1353,16 +1358,17 @@ module cva6_pipeline .exception_t (exception_t), .scoreboard_entry_t (scoreboard_entry_t), .lsu_ctrl_t (lsu_ctrl_t), + .bp_resolve_t (bp_resolve_t), .rvfi_probes_instr_t(rvfi_probes_instr_t), .rvfi_probes_csr_t (rvfi_probes_csr_t), .rvfi_probes_t (rvfi_probes_t) ) i_cva6_rvfi_probes ( - .flush_i (flush_ctrl_if), - .issue_instr_ack_i(issue_instr_issue_id), - .instruction_i (orig_instr_id_issue), - .decoded_fu_i (rvfi_decoded_fu), - .was_compressed_i (was_compressed), + .flush_i (flush_ctrl_if), + .issue_instr_ack_i (issue_instr_issue_id), + .fetch_entry_valid_i(fetch_valid_if_id), + .instruction_i (rvfi_fetch_instr), + .is_compressed_i (rvfi_is_compressed), .issue_pointer_i (rvfi_issue_pointer), .commit_pointer_i(rvfi_commit_pointer), @@ -1388,9 +1394,17 @@ module cva6_pipeline .csr_i(rvfi_csr), .irq_i(irq_i), - + .resolved_branch_i(resolved_branch), + .flu_trans_id_ex_id_i(flu_trans_id_ex_id), .rvfi_probes_o(rvfi_probes_o) ); + //pragma translate_off + initial begin + assert (!(CVA6Cfg.SuperscalarEn && CVA6Cfg.EnableAccelerator)) + else $fatal(1, "Accelerator is not supported by superscalar pipeline"); + end + //pragma translate_on + endmodule // ariane diff --git a/core/cva6_rvfi.sv b/core/cva6_rvfi.sv index 18f4038c99..9c5301ea0c 100644 --- a/core/cva6_rvfi.sv +++ b/core/cva6_rvfi.sv @@ -15,7 +15,11 @@ module cva6_rvfi parameter config_pkg::cva6_cfg_t CVA6Cfg = config_pkg::cva6_cfg_empty, parameter type rvfi_instr_t = logic, parameter type rvfi_csr_t = logic, - parameter type rvfi_probes_t = logic + parameter type rvfi_probes_instr_t = logic, + parameter type rvfi_probes_csr_t = logic, + parameter type rvfi_probes_t = logic, + parameter type rvfi_to_iti_t = logic + ) ( input logic clk_i, @@ -23,13 +27,10 @@ module cva6_rvfi input rvfi_probes_t rvfi_probes_i, output rvfi_instr_t [CVA6Cfg.NrCommitPorts-1:0] rvfi_instr_o, + output rvfi_to_iti_t rvfi_to_iti_o, output rvfi_csr_t rvfi_csr_o - ); - localparam type rvfi_probes_instr_t = `RVFI_PROBES_INSTR_T(CVA6Cfg); - localparam type rvfi_probes_csr_t = `RVFI_PROBES_CSR_T(CVA6Cfg); - localparam logic [CVA6Cfg.XLEN-1:0] IsaCode = (CVA6Cfg.XLEN'(CVA6Cfg.RVA) << 0) // A - Atomic Instructions extension | (CVA6Cfg.XLEN'(CVA6Cfg.RVB) << 1) // C - Bitmanip extension @@ -48,13 +49,191 @@ module cva6_rvfi localparam logic [CVA6Cfg.XLEN-1:0] hart_id_i = '0; + // Function to compute AMO write value for RVFI logging + // This mirrors the AMO ALU behaviour so the tracer sees the value actually written + // back to memory. This is post-alignment data (lower bytes contain the payload) so + // the tracer can rotate it using the write mask and address offset. + function automatic logic [CVA6Cfg.XLEN-1:0] compute_amo_wdata( + input fu_op amo_op, input logic [CVA6Cfg.XLEN-1:0] mem_old_val, + input logic [CVA6Cfg.XLEN-1:0] reg_val); + ariane_pkg::amo_t amo_kind; + logic is_word_op; + logic [63:0] operand_a_sext, operand_b_sext; + logic [63:0] operand_a_zext, operand_b_zext; + logic [63:0] result64; + logic [64:0] adder_operand_a, adder_operand_b, adder_sum; + + // Decode functional unit opcode into AMO class and width information + amo_kind = AMO_NONE; + is_word_op = 1'b0; + unique case (amo_op) + AMO_LRW: begin + amo_kind = AMO_LR; + is_word_op = 1'b1; + end + AMO_LRD: begin + amo_kind = AMO_LR; + is_word_op = 1'b0; + end + AMO_SCW: begin + amo_kind = AMO_SC; + is_word_op = 1'b1; + end + AMO_SCD: begin + amo_kind = AMO_SC; + is_word_op = 1'b0; + end + AMO_SWAPW: begin + amo_kind = AMO_SWAP; + is_word_op = 1'b1; + end + AMO_SWAPD: begin + amo_kind = AMO_SWAP; + is_word_op = 1'b0; + end + AMO_ADDW: begin + amo_kind = AMO_ADD; + is_word_op = 1'b1; + end + AMO_ADDD: begin + amo_kind = AMO_ADD; + is_word_op = 1'b0; + end + AMO_ANDW: begin + amo_kind = AMO_AND; + is_word_op = 1'b1; + end + AMO_ANDD: begin + amo_kind = AMO_AND; + is_word_op = 1'b0; + end + AMO_ORW: begin + amo_kind = AMO_OR; + is_word_op = 1'b1; + end + AMO_ORD: begin + amo_kind = AMO_OR; + is_word_op = 1'b0; + end + AMO_XORW: begin + amo_kind = AMO_XOR; + is_word_op = 1'b1; + end + AMO_XORD: begin + amo_kind = AMO_XOR; + is_word_op = 1'b0; + end + AMO_MAXW: begin + amo_kind = AMO_MAX; + is_word_op = 1'b1; + end + AMO_MAXD: begin + amo_kind = AMO_MAX; + is_word_op = 1'b0; + end + AMO_MAXWU: begin + amo_kind = AMO_MAXU; + is_word_op = 1'b1; + end + AMO_MAXDU: begin + amo_kind = AMO_MAXU; + is_word_op = 1'b0; + end + AMO_MINW: begin + amo_kind = AMO_MIN; + is_word_op = 1'b1; + end + AMO_MIND: begin + amo_kind = AMO_MIN; + is_word_op = 1'b0; + end + AMO_MINWU: begin + amo_kind = AMO_MINU; + is_word_op = 1'b1; + end + AMO_MINDU: begin + amo_kind = AMO_MINU; + is_word_op = 1'b0; + end + default: begin + amo_kind = AMO_NONE; + is_word_op = 1'b0; + end + endcase + + // Create signed and unsigned 64-bit views of the operands (word ops use 32-bit payloads) + if (is_word_op) begin + operand_a_sext = {{32{mem_old_val[31]}}, mem_old_val[31:0]}; + operand_b_sext = {{32{reg_val[31]}}, reg_val[31:0]}; + operand_a_zext = {32'b0, mem_old_val[31:0]}; + operand_b_zext = {32'b0, reg_val[31:0]}; + end else begin + operand_a_sext = $signed(mem_old_val); + operand_b_sext = $signed(reg_val); + operand_a_zext = $unsigned(mem_old_val); + operand_b_zext = $unsigned(reg_val); + end + + // Default to returning the register operand (SWAP/SC path) + result64 = operand_b_zext; + adder_operand_a = {operand_a_sext[63], operand_a_sext}; + adder_operand_b = {operand_b_sext[63], operand_b_sext}; + adder_sum = '0; + + unique case (amo_kind) + AMO_SC, AMO_SWAP: begin + result64 = operand_b_zext; + end + AMO_ADD: begin + adder_sum = adder_operand_a + adder_operand_b; + result64 = adder_sum[63:0]; + end + AMO_AND: result64 = operand_a_zext & operand_b_zext; + AMO_OR: result64 = operand_a_zext | operand_b_zext; + AMO_XOR: result64 = operand_a_zext ^ operand_b_zext; + AMO_MAX: begin + adder_operand_b = -{operand_b_sext[63], operand_b_sext}; + adder_sum = adder_operand_a + adder_operand_b; + result64 = adder_sum[64] ? operand_b_zext : operand_a_zext; + end + AMO_MIN: begin + adder_operand_b = -{operand_b_sext[63], operand_b_sext}; + adder_sum = adder_operand_a + adder_operand_b; + result64 = adder_sum[64] ? operand_a_zext : operand_b_zext; + end + AMO_MAXU: begin + adder_operand_a = {1'b0, operand_a_zext}; + adder_operand_b = -{1'b0, operand_b_zext}; + adder_sum = adder_operand_a + adder_operand_b; + result64 = adder_sum[64] ? operand_b_zext : operand_a_zext; + end + AMO_MINU: begin + adder_operand_a = {1'b0, operand_a_zext}; + adder_operand_b = -{1'b0, operand_b_zext}; + adder_sum = adder_operand_a + adder_operand_b; + result64 = adder_sum[64] ? operand_a_zext : operand_b_zext; + end + default: begin + result64 = operand_b_zext; + end + endcase + + if (is_word_op) begin + return {{CVA6Cfg.XLEN - 32{1'b0}}, result64[31:0]}; + end else begin + return result64[CVA6Cfg.XLEN-1:0]; + end + endfunction + localparam logic [63:0] SMODE_STATUS_READ_MASK = ariane_pkg::smode_status_read_mask(CVA6Cfg); logic flush; logic [CVA6Cfg.NrIssuePorts-1:0] issue_instr_ack; - logic [CVA6Cfg.NrIssuePorts-1:0][31:0] instruction, instruction_safe; - fu_t [CVA6Cfg.NrIssuePorts-1:0] decoded_fu; - logic [CVA6Cfg.NrIssuePorts-1:0] was_compressed; + logic [CVA6Cfg.NrIssuePorts-1:0] fetch_entry_valid; + logic [CVA6Cfg.NrIssuePorts-1:0][31:0] instruction; + logic [CVA6Cfg.NrIssuePorts-1:0] is_compressed; + logic [CVA6Cfg.NrIssuePorts-1:0][31:0] truncated; + logic [CVA6Cfg.NrIssuePorts-1:0][CVA6Cfg.TRANS_ID_BITS-1:0] issue_pointer; logic [CVA6Cfg.NrCommitPorts-1:0][CVA6Cfg.TRANS_ID_BITS-1:0] commit_pointer; @@ -79,6 +258,14 @@ module cva6_rvfi logic [CVA6Cfg.XLEN-1:0] ex_commit_cause; logic ex_commit_valid; + logic [CVA6Cfg.NrCommitPorts-1:0] valid_iti; + logic [CVA6Cfg.NrCommitPorts-1:0][CVA6Cfg.VLEN-1:0] pc_iti; + ariane_pkg::fu_op [CVA6Cfg.NrCommitPorts-1:0] op_iti; + logic branch_valid_iti; + logic is_taken_iti; + logic [CVA6Cfg.XLEN-1:0] tval_iti; + logic [63:0] time_iti; + riscv::priv_lvl_t priv_lvl; logic [CVA6Cfg.VLEN-1:0] lsu_ctrl_vaddr; @@ -97,6 +284,8 @@ module cva6_rvfi logic [(CVA6Cfg.XLEN/8)-1:0] lsu_wmask; logic [CVA6Cfg.TRANS_ID_BITS-1:0] lsu_addr_trans_id; + logic [CVA6Cfg.TRANS_ID_BITS-1:0] branch_trans_id; + riscv::pmpcfg_t [15:0] pmpcfg_q, pmpcfg_d; rvfi_probes_csr_t csr; @@ -119,9 +308,9 @@ module cva6_rvfi assign flush = instr.flush; assign issue_instr_ack = instr.issue_instr_ack; + assign fetch_entry_valid = instr.fetch_entry_valid; assign instruction = instr.instruction; - assign decoded_fu = instr.decoded_fu; - assign was_compressed = instr.was_compressed; + assign is_compressed = instr.is_compressed; assign issue_pointer = instr.issue_pointer; assign commit_pointer = instr.commit_pointer; @@ -145,6 +334,14 @@ module cva6_rvfi assign ex_commit_cause = instr.ex_commit_cause; assign ex_commit_valid = instr.ex_commit_valid; + assign valid_iti = instr.commit_ack; + assign pc_iti = instr.commit_instr_pc; + assign op_iti = instr.commit_instr_op; + assign branch_valid_iti = instr.branch_valid; + assign is_taken_iti = instr.is_taken; + assign tval_iti = instr.tval; + assign time_iti = csr.cycle_q; + assign priv_lvl = instr.priv_lvl; assign wbdata = instr.wbdata; @@ -157,34 +354,71 @@ module cva6_rvfi assign lsu_rmask = instr.lsu_ctrl_fu == LOAD ? instr.lsu_ctrl_be : '0; assign lsu_wmask = instr.lsu_ctrl_fu == STORE ? instr.lsu_ctrl_be : '0; assign lsu_addr_trans_id = instr.lsu_ctrl_trans_id; + assign branch_trans_id = instr.branch_trans_id; - function automatic logic [31:0] compress_instr_copro_example(logic [31:0] instruction, fu_t fu, - logic was_compressed); - if (fu != ariane_pkg::CVXIF) begin - return instruction; - end else begin - logic is_nop, is_add; - // Only cus_nop and cus_add map to compressed instruction - is_nop = (instruction & {32'b11111_11_00000_00000_1_11_00000_1111111}) == {32'b00000_00_00000_00000_0_00_00000_1111011} ? 1'b1 : 1'b0; - is_add = (instruction & {32'b11111_11_00000_00000_1_11_00000_1111111}) == {32'b00000_00_00000_00000_0_01_00000_1111011} ? 1'b1 : 1'b0; - if (was_compressed) begin - if (is_nop) begin // CUS_NOP - return {{16'b0}, {4'b111_0}, instruction[19:15], instruction[24:20], {2'b00}}; - end else if (is_add) begin - return {{16'b0}, {4'b111_1}, instruction[19:15], instruction[24:20], {2'b00}}; - end else return instruction; + + + //ID STAGE + + for (genvar i = 0; i < CVA6Cfg.NrIssuePorts; i++) begin + assign truncated[i] = (is_compressed[i]) ? {16'b0, instruction[i][15:0]} : instruction[i]; + end + + typedef struct packed { + logic valid; + logic [31:0] instr; + logic is_compressed; + } issue_struct_t; + issue_struct_t [CVA6Cfg.NrIssuePorts-1:0] issue_n, issue_q; + logic took0; + + always_comb begin + issue_n = issue_q; + took0 = 1'b0; + + for (int unsigned i = 0; i < CVA6Cfg.NrIssuePorts; i++) begin + if (issue_instr_ack[i]) begin + issue_n[i].valid = 1'b0; + end + end + + if (!issue_n[CVA6Cfg.NrIssuePorts-1].valid) begin + issue_n[CVA6Cfg.NrIssuePorts-1].valid = fetch_entry_valid[0]; + issue_n[CVA6Cfg.NrIssuePorts-1].instr = truncated[0]; + issue_n[CVA6Cfg.NrIssuePorts-1].is_compressed = is_compressed[0]; + took0 = 1'b1; + end + + if (!issue_n[0].valid) begin + issue_n[0] = issue_n[CVA6Cfg.NrIssuePorts-1]; + issue_n[CVA6Cfg.NrIssuePorts-1].valid = 1'b0; + end + + if (!issue_n[CVA6Cfg.NrIssuePorts-1].valid) begin + if (took0) begin + issue_n[CVA6Cfg.NrIssuePorts-1].valid = fetch_entry_valid[CVA6Cfg.NrIssuePorts-1]; + issue_n[CVA6Cfg.NrIssuePorts-1].instr = truncated[CVA6Cfg.NrIssuePorts-1]; + issue_n[CVA6Cfg.NrIssuePorts-1].is_compressed = is_compressed[CVA6Cfg.NrIssuePorts-1]; end else begin - return instruction; + issue_n[CVA6Cfg.NrIssuePorts-1].valid = fetch_entry_valid[0]; + issue_n[CVA6Cfg.NrIssuePorts-1].instr = truncated[0]; + issue_n[CVA6Cfg.NrIssuePorts-1].is_compressed = is_compressed[0]; end end - endfunction - //ID STAGE - for (genvar i = 0; i < CVA6Cfg.NrIssuePorts; i++) begin - if (CVA6Cfg.CoproType == config_pkg::COPRO_EXAMPLE) begin - assign instruction_safe[i] = compress_instr_copro_example( - instruction[i], decoded_fu[i], was_compressed[i] - ); - end else assign instruction_safe[i] = instruction[i]; + + if (flush) begin + for (int unsigned i = 0; i < CVA6Cfg.NrIssuePorts; i++) begin + issue_n[i].valid = 1'b0; + end + end + end + + always_ff @(posedge clk_i or negedge rst_ni) begin + if (~rst_ni) begin + issue_q <= '0; + end else begin + issue_q <= issue_n; + end end //ISSUE STAGE @@ -198,6 +432,9 @@ module cva6_rvfi logic [(CVA6Cfg.XLEN/8)-1:0] lsu_wmask; logic [CVA6Cfg.XLEN-1:0] lsu_wdata; logic [31:0] instr; + logic branch_valid; + logic is_taken; + logic is_compressed; } sb_mem_t; sb_mem_t [CVA6Cfg.NR_SB_ENTRIES-1:0] mem_q, mem_n; @@ -213,11 +450,17 @@ module cva6_rvfi lsu_rmask: '0, lsu_wmask: '0, lsu_wdata: '0, - instr: instruction_safe[i] + instr: issue_q[i].instr, + branch_valid: 1'b0, + is_taken: 1'b0, + is_compressed: issue_q[i].is_compressed }; end end - + if (branch_valid_iti) begin + mem_n[branch_trans_id].branch_valid = branch_valid_iti; + mem_n[branch_trans_id].is_taken = is_taken_iti; + end if (lsu_rmask != 0) begin mem_n[lsu_addr_trans_id].lsu_addr = lsu_addr; mem_n[lsu_addr_trans_id].lsu_rmask = lsu_rmask; @@ -279,126 +522,146 @@ module cva6_rvfi // So far, only write paddr is reported. TODO: read paddr rvfi_instr_o[i].mem_paddr <= mem_paddr; rvfi_instr_o[i].mem_wmask <= mem_q[commit_pointer[i]].lsu_wmask; - rvfi_instr_o[i].mem_wdata <= mem_q[commit_pointer[i]].lsu_wdata; + + // For AMO operations, compute the actual write value + // Note: AMO operations write a computed value to memory, not the original register value + if (is_amo(commit_instr_op[i])) begin + rvfi_instr_o[i].mem_wdata <= compute_amo_wdata( + commit_instr_op[i], // AMO operation type + wdata[i], // Old memory value (the value returned to rd) + mem_q[commit_pointer[i]].rs2_rdata // Register operand (rs2) + ); + end else begin + rvfi_instr_o[i].mem_wdata <= mem_q[commit_pointer[i]].lsu_wdata; + end + rvfi_instr_o[i].mem_rmask <= mem_q[commit_pointer[i]].lsu_rmask; rvfi_instr_o[i].mem_rdata <= commit_instr_result[i]; rvfi_instr_o[i].rs1_rdata <= mem_q[commit_pointer[i]].rs1_rdata; rvfi_instr_o[i].rs2_rdata <= mem_q[commit_pointer[i]].rs2_rdata; + rvfi_to_iti_o.branch_valid[i] <= mem_q[commit_pointer[i]].branch_valid; + rvfi_to_iti_o.is_taken[i] <= mem_q[commit_pointer[i]].is_taken; + rvfi_to_iti_o.is_compressed[i] <= mem_q[commit_pointer[i]].is_compressed; + rvfi_to_iti_o.valid[i] <= valid_iti[i]; + rvfi_to_iti_o.pc[i] <= pc_iti[i]; + rvfi_to_iti_o.op[i] <= op_iti[i]; end + rvfi_to_iti_o.ex_valid <= ex_commit_valid; + rvfi_to_iti_o.cycles <= time_iti; + rvfi_to_iti_o.cause <= ex_commit_cause; + rvfi_to_iti_o.tval <= tval_iti; + rvfi_to_iti_o.priv_lvl <= priv_lvl; end //---------------------------------------------------------------------------------------------------------- // CSR //---------------------------------------------------------------------------------------------------------- - - `define CONNECT_RVFI_FULL(CSR_ENABLE_COND, CSR_NAME, - CSR_SOURCE_NAME) \ - always_ff @(posedge clk_i) begin \ - if (CSR_ENABLE_COND) begin \ - rvfi_csr_o.``CSR_NAME``.rdata <= {{CVA6Cfg.XLEN - $bits(CSR_SOURCE_NAME)}, CSR_SOURCE_NAME}; \ - end \ - end \ - assign rvfi_csr_o.``CSR_NAME``.wdata = CSR_ENABLE_COND ? { {{CVA6Cfg.XLEN-$bits(CSR_SOURCE_NAME)}, CSR_SOURCE_NAME} } : 0; \ - assign rvfi_csr_o.``CSR_NAME``.rmask = CSR_ENABLE_COND ? 1 : 0; \ - assign rvfi_csr_o.``CSR_NAME``.wmask = (rvfi_csr_o.``CSR_NAME``.rdata != {{CVA6Cfg.XLEN - $bits(CSR_SOURCE_NAME)}, CSR_SOURCE_NAME}) && CSR_ENABLE_COND; - - `define COMMA , + // Changing verible formating to fix vivado synthesis errors and warnings + // verilog_format: off + `define CONNECT_RVFI_FULL(CSR_ENABLE_COND, CSR_NAME, CSR_SOURCE_NAME) \ + always_ff @(posedge clk_i) begin \ + if (CSR_ENABLE_COND) begin \ + rvfi_csr_o.``CSR_NAME``.rdata <= {{CVA6Cfg.XLEN - $bits(CSR_SOURCE_NAME)}, CSR_SOURCE_NAME}; \ + end \ + end \ + assign rvfi_csr_o.``CSR_NAME``.wdata = CSR_ENABLE_COND ? { {{CVA6Cfg.XLEN-$bits(CSR_SOURCE_NAME)}, CSR_SOURCE_NAME} } : 0; \ + assign rvfi_csr_o.``CSR_NAME``.rmask = CSR_ENABLE_COND ? 1 : 0; \ + assign rvfi_csr_o.``CSR_NAME``.wmask = (rvfi_csr_o.``CSR_NAME``.rdata != {{CVA6Cfg.XLEN - $bits(CSR_SOURCE_NAME)}, CSR_SOURCE_NAME}) && CSR_ENABLE_COND; `define CONNECT_RVFI_SAME(CSR_ENABLE_COND, CSR_NAME) \ - `CONNECT_RVFI_FULL(CSR_ENABLE_COND, CSR_NAME, csr.``CSR_NAME``_q) + `CONNECT_RVFI_FULL(CSR_ENABLE_COND, CSR_NAME, csr.``CSR_NAME``_q) - `CONNECT_RVFI_FULL(CVA6Cfg.FpPresent, fflags, csr.fcsr_q.fflags) - `CONNECT_RVFI_FULL(CVA6Cfg.FpPresent, frm, csr.fcsr_q.frm) - `CONNECT_RVFI_FULL(CVA6Cfg.FpPresent, fcsr, { csr.fcsr_q.frm `COMMA csr.fcsr_q.fflags}) + if ($bits(rvfi_csr_o) != 1) begin + `CONNECT_RVFI_FULL(CVA6Cfg.FpPresent, fflags, csr.fcsr_q.fflags) + `CONNECT_RVFI_FULL(CVA6Cfg.FpPresent, frm, csr.fcsr_q.frm) + `CONNECT_RVFI_FULL(CVA6Cfg.FpPresent, fcsr, {csr.fcsr_q.frm, csr.fcsr_q.fflags}) - `CONNECT_RVFI_FULL(CVA6Cfg.FpPresent, ftran, csr.fcsr_q.fprec) - `CONNECT_RVFI_SAME(CVA6Cfg.FpPresent, dcsr) + `CONNECT_RVFI_FULL(CVA6Cfg.FpPresent, ftran, csr.fcsr_q.fprec) + `CONNECT_RVFI_SAME(CVA6Cfg.FpPresent, dcsr) - `CONNECT_RVFI_SAME(CVA6Cfg.DebugEn, dpc) + `CONNECT_RVFI_SAME(CVA6Cfg.DebugEn, dpc) - `CONNECT_RVFI_SAME(CVA6Cfg.DebugEn, dscratch0) - `CONNECT_RVFI_SAME(CVA6Cfg.DebugEn, dscratch1) + `CONNECT_RVFI_SAME(CVA6Cfg.DebugEn, dscratch0) + `CONNECT_RVFI_SAME(CVA6Cfg.DebugEn, dscratch1) - `CONNECT_RVFI_FULL(CVA6Cfg.RVS, sstatus, - csr.mstatus_extended & SMODE_STATUS_READ_MASK[CVA6Cfg.XLEN-1:0]) + `CONNECT_RVFI_FULL(CVA6Cfg.RVS, sstatus, csr.mstatus_extended & SMODE_STATUS_READ_MASK[CVA6Cfg.XLEN-1:0]) - `CONNECT_RVFI_FULL(CVA6Cfg.RVS, sie, csr.mie_q & csr.mideleg_q) - `CONNECT_RVFI_FULL(CVA6Cfg.RVS, sip, csr.mip_q & csr.mideleg_q) + `CONNECT_RVFI_FULL(CVA6Cfg.RVS, sie, csr.mie_q & csr.mideleg_q) + `CONNECT_RVFI_FULL(CVA6Cfg.RVS, sip, csr.mip_q & csr.mideleg_q) - `CONNECT_RVFI_SAME(CVA6Cfg.RVS, stvec) + `CONNECT_RVFI_SAME(CVA6Cfg.RVS, stvec) - `CONNECT_RVFI_SAME(CVA6Cfg.RVS, scounteren) + `CONNECT_RVFI_SAME(CVA6Cfg.RVS, scounteren) - `CONNECT_RVFI_SAME(CVA6Cfg.RVS, sscratch) - `CONNECT_RVFI_SAME(CVA6Cfg.RVS, sepc) + `CONNECT_RVFI_SAME(CVA6Cfg.RVS, sscratch) + `CONNECT_RVFI_SAME(CVA6Cfg.RVS, sepc) - `CONNECT_RVFI_SAME(CVA6Cfg.RVS, scause) + `CONNECT_RVFI_SAME(CVA6Cfg.RVS, scause) - `CONNECT_RVFI_SAME(CVA6Cfg.RVS, stval) - `CONNECT_RVFI_SAME(CVA6Cfg.RVS, satp) + `CONNECT_RVFI_SAME(CVA6Cfg.RVS, stval) + `CONNECT_RVFI_SAME(CVA6Cfg.RVS, satp) - `CONNECT_RVFI_FULL(1'b1, mstatus, csr.mstatus_extended) + `CONNECT_RVFI_FULL(1'b1, mstatus, csr.mstatus_extended) - bit [31:0] mstatush_q; - `CONNECT_RVFI_FULL(1'b1, mstatush, mstatush_q) + bit [31:0] mstatush_q; + `CONNECT_RVFI_FULL(1'b1, mstatush, mstatush_q) - `CONNECT_RVFI_FULL(1'b1, misa, IsaCode) + `CONNECT_RVFI_FULL(1'b1, misa, IsaCode) - `CONNECT_RVFI_SAME(CVA6Cfg.RVS, medeleg) - `CONNECT_RVFI_SAME(CVA6Cfg.RVS, mideleg) + `CONNECT_RVFI_SAME(CVA6Cfg.RVS, medeleg) + `CONNECT_RVFI_SAME(CVA6Cfg.RVS, mideleg) - `CONNECT_RVFI_SAME(1'b1, mie) - `CONNECT_RVFI_SAME(1'b1, mtvec) - `CONNECT_RVFI_SAME(1'b1, mcounteren) + `CONNECT_RVFI_SAME(1'b1, mie) + `CONNECT_RVFI_SAME(1'b1, mtvec) + `CONNECT_RVFI_SAME(1'b1, mcounteren) - `CONNECT_RVFI_SAME(1'b1, mscratch) + `CONNECT_RVFI_SAME(1'b1, mscratch) - `CONNECT_RVFI_SAME(1'b1, mepc) - `CONNECT_RVFI_SAME(1'b1, mcause) - `CONNECT_RVFI_SAME(1'b1, mtval) - `CONNECT_RVFI_SAME(1'b1, mip) + `CONNECT_RVFI_SAME(1'b1, mepc) + `CONNECT_RVFI_SAME(1'b1, mcause) + `CONNECT_RVFI_SAME(1'b1, mtval) + `CONNECT_RVFI_SAME(1'b1, mip) - `CONNECT_RVFI_FULL(1'b1, menvcfg, csr.fiom_q) + `CONNECT_RVFI_FULL(1'b1, menvcfg, csr.fiom_q) - `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, menvcfgh, 32'h0) + `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, menvcfgh, 32'h0) - `CONNECT_RVFI_FULL(1'b1, mvendorid, OPENHWGROUP_MVENDORID) - `CONNECT_RVFI_FULL(1'b1, marchid, ARIANE_MARCHID) - `CONNECT_RVFI_FULL(1'b1, mhartid, hart_id_i) + `CONNECT_RVFI_FULL(1'b1, mvendorid, OPENHWGROUP_MVENDORID) + `CONNECT_RVFI_FULL(1'b1, marchid, ARIANE_MARCHID) + `CONNECT_RVFI_FULL(1'b1, mhartid, hart_id_i) - `CONNECT_RVFI_SAME(1'b1, mcountinhibit) + `CONNECT_RVFI_SAME(1'b1, mcountinhibit) - `CONNECT_RVFI_FULL(1'b1, mcycle, csr.cycle_q[CVA6Cfg.XLEN-1:0]) - `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, mcycleh, csr.cycle_q[63:32]) + `CONNECT_RVFI_FULL(1'b1, mcycle, csr.cycle_q[CVA6Cfg.XLEN-1:0]) + `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, mcycleh, csr.cycle_q[63:32]) - `CONNECT_RVFI_FULL(1'b1, minstret, csr.instret_q[CVA6Cfg.XLEN-1:0]) - `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, minstreth, csr.instret_q[63:32]) + `CONNECT_RVFI_FULL(1'b1, minstret, csr.instret_q[CVA6Cfg.XLEN-1:0]) + `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, minstreth, csr.instret_q[63:32]) - `CONNECT_RVFI_FULL(1'b1, cycle, csr.cycle_q[CVA6Cfg.XLEN-1:0]) - `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, cycleh, csr.cycle_q[63:32]) + `CONNECT_RVFI_FULL(1'b1, cycle, csr.cycle_q[CVA6Cfg.XLEN-1:0]) + `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, cycleh, csr.cycle_q[63:32]) - `CONNECT_RVFI_FULL(1'b1, instret, csr.instret_q[CVA6Cfg.XLEN-1:0]) - `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, instreth, csr.instret_q[63:32]) + `CONNECT_RVFI_FULL(1'b1, instret, csr.instret_q[CVA6Cfg.XLEN-1:0]) + `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, instreth, csr.instret_q[63:32]) - `CONNECT_RVFI_SAME(1'b1, dcache) - `CONNECT_RVFI_SAME(1'b1, icache) + `CONNECT_RVFI_SAME(1'b1, dcache) + `CONNECT_RVFI_SAME(1'b1, icache) - `CONNECT_RVFI_SAME(CVA6Cfg.EnableAccelerator, acc_cons) - `CONNECT_RVFI_SAME(CVA6Cfg.RVZCMT, jvt) - `CONNECT_RVFI_FULL(1'b1, pmpcfg0, csr.pmpcfg_q[CVA6Cfg.XLEN/8-1:0]) - `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, pmpcfg1, csr.pmpcfg_q[7:4]) + `CONNECT_RVFI_SAME(CVA6Cfg.EnableAccelerator, acc_cons) + `CONNECT_RVFI_SAME(CVA6Cfg.RVZCMT, jvt) + `CONNECT_RVFI_FULL(1'b1, pmpcfg0, csr.pmpcfg_q[CVA6Cfg.XLEN/8-1:0]) + `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, pmpcfg1, csr.pmpcfg_q[7:4]) - `CONNECT_RVFI_FULL(1'b1, pmpcfg2, csr.pmpcfg_q[8+:CVA6Cfg.XLEN/8]) - `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, pmpcfg3, csr.pmpcfg_q[15:12]) + `CONNECT_RVFI_FULL(1'b1, pmpcfg2, csr.pmpcfg_q[8+:CVA6Cfg.XLEN/8]) + `CONNECT_RVFI_FULL(CVA6Cfg.XLEN == 32, pmpcfg3, csr.pmpcfg_q[15:12]) - bit [CVA6Cfg.XLEN-1:0] pmpaddr_q; - genvar i; - generate + bit [CVA6Cfg.XLEN-1:0] pmpaddr_q; + genvar i; for (i = 0; i < 16; i++) begin - `CONNECT_RVFI_FULL(1'b1, pmpaddr[i], csr.pmpaddr_q[i][CVA6Cfg.PLEN-3:0]) + `CONNECT_RVFI_FULL(1'b1, pmpaddr[i], {csr.pmpaddr_q[i][CVA6Cfg.PLEN-3:1], pmpcfg_q[i].addr_mode[1]}) end - endgenerate - ; - + ; + end + // verilog_format: on endmodule diff --git a/core/cva6_rvfi_probes.sv b/core/cva6_rvfi_probes.sv index d4cc1a2d55..e13d2d984f 100644 --- a/core/cva6_rvfi_probes.sv +++ b/core/cva6_rvfi_probes.sv @@ -16,6 +16,7 @@ module cva6_rvfi_probes parameter type exception_t = logic, parameter type scoreboard_entry_t = logic, parameter type lsu_ctrl_t = logic, + parameter type bp_resolve_t = logic, parameter type rvfi_probes_instr_t = logic, parameter type rvfi_probes_csr_t = logic, parameter type rvfi_probes_t = logic @@ -24,9 +25,9 @@ module cva6_rvfi_probes input logic flush_i, input logic [CVA6Cfg.NrIssuePorts-1:0] issue_instr_ack_i, + input logic [CVA6Cfg.NrIssuePorts-1:0] fetch_entry_valid_i, input logic [CVA6Cfg.NrIssuePorts-1:0][31:0] instruction_i, - input fu_t [CVA6Cfg.NrIssuePorts-1:0] decoded_fu_i, - input logic [CVA6Cfg.NrIssuePorts-1:0] was_compressed_i, + input logic [CVA6Cfg.NrIssuePorts-1:0] is_compressed_i, input logic [CVA6Cfg.NrIssuePorts-1 : 0][CVA6Cfg.TRANS_ID_BITS-1:0] issue_pointer_i, input logic [ CVA6Cfg.NrCommitPorts-1:0][CVA6Cfg.TRANS_ID_BITS-1:0] commit_pointer_i, @@ -52,6 +53,8 @@ module cva6_rvfi_probes input rvfi_probes_csr_t csr_i, input logic [1:0] irq_i, + input bp_resolve_t resolved_branch_i, + input [CVA6Cfg.TRANS_ID_BITS-1:0] flu_trans_id_ex_id_i, output rvfi_probes_t rvfi_probes_o ); @@ -66,9 +69,9 @@ module cva6_rvfi_probes instr.flush = flush_i; instr.issue_instr_ack = issue_instr_ack_i; + instr.fetch_entry_valid = fetch_entry_valid_i; instr.instruction = instruction_i; - instr.decoded_fu = decoded_fu_i; - instr.was_compressed = was_compressed_i; + instr.is_compressed = is_compressed_i; instr.issue_pointer = issue_pointer_i; @@ -81,6 +84,11 @@ module cva6_rvfi_probes instr.ex_commit_cause = ex_commit_i.cause; instr.ex_commit_valid = ex_commit_i.valid; + if (CVA6Cfg.TvalEn) begin + instr.tval = ex_commit_i.tval; + end else begin + instr.tval = '0; + end instr.priv_lvl = priv_lvl_i; @@ -109,6 +117,10 @@ module cva6_rvfi_probes instr.commit_ack = commit_ack_i; instr.wdata = wdata_i; + instr.branch_valid = resolved_branch_i.valid; + instr.is_taken = resolved_branch_i.is_taken; + instr.branch_trans_id = flu_trans_id_ex_id_i; + csr = csr_i; csr.mip_q = csr_i.mip_q | ({{CVA6Cfg.XLEN - 1{1'b0}}, CVA6Cfg.RVS && irq_i[1]} << riscv::IRQ_S_EXT); @@ -130,4 +142,3 @@ module cva6_rvfi_probes endmodule - diff --git a/core/cvfpu b/core/cvfpu index 3116391bf6..2c7947726a 160000 --- a/core/cvfpu +++ b/core/cvfpu @@ -1 +1 @@ -Subproject commit 3116391bf66660f806b45e212b9949c528b4e270 +Subproject commit 2c7947726a0859c08cc27cbbd45662424dedb41e diff --git a/core/frontend/frontend.sv b/core/frontend/frontend.sv index 08a9e211b8..a018d9982c 100644 --- a/core/frontend/frontend.sv +++ b/core/frontend/frontend.sv @@ -156,7 +156,7 @@ module frontend logic [ CVA6Cfg.VLEN-1:0] vpc_bht; // branch-predict update - logic is_mispredict; + logic is_mispredict, was_mispredicted; logic ras_push, ras_pop; logic [ CVA6Cfg.VLEN-1:0] ras_update; @@ -415,7 +415,7 @@ module frontend fetchbuf_valid_d[fetchbuf_rindex] = 1'b0; end // Flush on bp_valid - if (bp_valid) begin + if (kill_s2) begin fetchbuf_flushed_d[fetchbuf_last_id_q] = 1'b1; end // Free on exception @@ -459,7 +459,7 @@ module frontend assign stall_ni = spec_req_non_idempot; assign stall_ypb = (ypb_a_state_q == REGISTRED); //&& !ypb_load_rsp_i.pgnt; - assign stall_translation = CVA6Cfg.MmuPresent ? areq_o.fetch_req && (!arsp_i.fetch_valid) : 1'b0; + assign stall_translation = CVA6Cfg.MmuPresent ? areq_o.fetch_req && (!arsp_i.fetch_valid || (arsp_i.fetch_valid && arsp_i.fetch_exception.valid)) : 1'b0; assign stall_instr_queue = !instr_queue_ready; assign ex_s1 = (CVA6Cfg.MmuPresent && arsp_i.fetch_exception.valid); @@ -482,7 +482,7 @@ module frontend assign ypb_fetch_req_o.vaddr = npc_fetch_address; assign paddr = CVA6Cfg.MmuPresent ? arsp_i.fetch_paddr : npc_fetch_address; - assign data_req = (CVA6Cfg.MmuPresent ? fetchbuf_w_q && !ex_s1 && !bp_valid : fetchbuf_w); + assign data_req = (CVA6Cfg.MmuPresent ? fetchbuf_w_q && !ex_s1 && arsp_i.fetch_valid: fetchbuf_w); always_comb begin : p_fsm_common // default assignmen @@ -499,11 +499,11 @@ module frontend areq_o.fetch_req = 1'b1; ypb_fetch_req_o.vreq = 1'b1; if (!CVA6Cfg.MmuPresent || ypb_fetch_rsp_i.vgnt) begin - if (stall_ni || stall_ypb || stall_instr_queue || fetchbuf_full) begin + if (stall_ni || stall_ypb || stall_instr_queue || stall_translation || fetchbuf_full) begin kill_req_d = CVA6Cfg.MmuPresent ? 1'b1 : 1'b0; // MmuPresent only : next cycle is s2 but we need to kill because not ready to sent tag end else begin fetchbuf_w = !kill_s1 && !flush_i; // record request into outstanding fetch fifo and trigger YPB physical request - pop_fetch = 1'b1; // release lsu_bypass fifo + pop_fetch = arsp_i.fetch_valid; // release lsu_bypass fifo end end //end @@ -515,10 +515,10 @@ module frontend ex_rvalid = 1'b0; // RETIRE EXCEPTION (low priority) end else if (CVA6Cfg.MmuPresent && ex_s1) begin - vaddr_rvalid = CVA6Cfg.MmuPresent ? fetchbuf_q[fetchbuf_windex_q].vaddr : npc_fetch_address; - rvalid = !bp_valid && !flush_i; - ex_rvalid = 1'b1; - pop_fetch = 1'b1; // release lsu_bypass fifo + vaddr_rvalid = vaddr_q; + rvalid = arsp_i.fetch_valid && !bp_valid && !flush_i && !was_mispredicted; + ex_rvalid = arsp_i.fetch_valid; //1'b1; + pop_fetch = arsp_i.fetch_valid; // release lsu_bypass fifo end end @@ -544,7 +544,7 @@ module frontend assign ypb_fetch_req_o.wdata = '0; assign ypb_fetch_req_o.aid = (!CVA6Cfg.MmuPresent && (ypb_a_state_q == TRANSPARENT)) ? fetchbuf_windex : fetchbuf_windex_q; assign ypb_fetch_req_o.atop = ariane_pkg::AMO_NONE; - assign ypb_fetch_req_o.cacheable = (!CVA6Cfg.MmuPresent && (ypb_a_state_q == TRANSPARENT)) ? paddr_is_cacheable : paddr_is_cacheable_q; + assign ypb_fetch_req_o.cacheable = paddr_is_cacheable; assign ypb_fetch_req_o.access_type = '0; // 0 = fetch assign ypb_fetch_req_o.rready = '1; //always ready TODO maybe manage instr_queue_ready & replay with this signal @@ -596,10 +596,10 @@ module frontend end ypb_a_state_q <= ypb_a_state_d; kill_req_q <= kill_req_d; - //if (!ex_s1) begin - fetchbuf_windex_q <= fetchbuf_windex; - fetchbuf_w_q <= fetchbuf_w; - //end + if (!ex_s1) begin + fetchbuf_windex_q <= fetchbuf_windex; + fetchbuf_w_q <= (CVA6Cfg.MmuPresent && arsp_i.fetch_valid) ? fetchbuf_w : fetchbuf_w_q; + end vaddr_q <= vaddr_d; end end @@ -658,7 +658,7 @@ module frontend npc_d = predict_address; end // 1. Default assignment - if (pop_fetch) begin + if (pop_fetch && (!was_mispredicted || !stall_translation)) begin npc_d = { fetch_address[CVA6Cfg.VLEN-1:CVA6Cfg.FETCH_ALIGN_BITS] + 1, {CVA6Cfg.FETCH_ALIGN_BITS{1'b0}} }; @@ -670,14 +670,17 @@ module frontend // 3. Control flow change request if (is_mispredict) begin npc_d = resolved_branch_i.target_address; + fetch_address = resolved_branch_i.target_address; end // 4. Return from environment call if (eret_i) begin npc_d = epc_i; + fetch_address = epc_i; end // 5. Exception/Interrupt if (ex_valid_i) begin npc_d = trap_vector_base_i; + fetch_address = trap_vector_base_i; end // 6. Pipeline Flush because of CSR side effects // On a pipeline flush start fetching from the next address @@ -690,6 +693,7 @@ module frontend // IMPROVEMENT: This adder can at least be merged with the one in the csr_regfile stage if (set_pc_commit_i) begin npc_d = pc_commit_i + (halt_i ? '0 : {{CVA6Cfg.VLEN - 3{1'b0}}, 3'b100}); + fetch_address = pc_commit_i + (halt_i ? '0 : {{CVA6Cfg.VLEN - 3{1'b0}}, 3'b100}); end // 7. Debug // enter debug on a hard-coded base-address @@ -720,6 +724,7 @@ module frontend fetch_ex_valid_q <= ariane_pkg::FE_NONE; btb_q <= '0; bht_q <= '0; + was_mispredicted <= '0; end else begin npc_rst_load_q <= 1'b0; npc_q <= npc_d; @@ -752,6 +757,11 @@ module frontend btb_q <= btb_prediction[CVA6Cfg.INSTR_PER_FETCH-1]; bht_q <= bht_prediction[CVA6Cfg.INSTR_PER_FETCH-1]; end + + if (is_mispredict & !arsp_i.fetch_valid) // translation request for misprediction ongoing + was_mispredicted <= '1; + if (arsp_i.fetch_valid) // translation finished, can clear flag + was_mispredicted <= '0; end end diff --git a/core/id_stage.sv b/core/id_stage.sv index 50c182bcac..6abcde3a50 100644 --- a/core/id_stage.sv +++ b/core/id_stage.sv @@ -55,6 +55,7 @@ module id_stage #( output logic [CVA6Cfg.NrIssuePorts-1:0] is_ctrl_flow_o, // Handshake's acknowlege between decode and issue - ISSUE input logic [CVA6Cfg.NrIssuePorts-1:0] issue_instr_ack_i, + output logic rvfi_is_compressed_o, // Current privilege level - CSR_REGFILE input riscv::priv_lvl_t priv_lvl_i, // Current virtualization mode - CSR_REGFILE @@ -270,6 +271,8 @@ module id_stage #( end else begin assign stall_instr_fetch[0] = stall_macro_deco; end + end else begin + assign stall_instr_fetch[0] = '0; end // --------------------------------------------------------- @@ -277,10 +280,14 @@ module id_stage #( // --------------------------------------------------------- always_comb begin - // No CVXIF, No ZCMP, No ZCMT => Connect directly compressed decoder to decoder - is_illegal_deco = is_illegal_rvc; - instruction_deco = instruction_rvc; - is_compressed_deco = is_compressed_rvc; + // No CVXIF, No ZCMP, No ZCMT => Connect directly compressed decoder to decoder if C extension enabled, otherwise to fetch entry + is_illegal_deco = CVA6Cfg.RVC ? is_illegal_rvc : '0; + instruction_deco[0] = CVA6Cfg.RVC ? instruction_rvc[0] : fetch_entry_i[0].instruction; + is_compressed_deco = CVA6Cfg.RVC ? is_compressed_rvc : '0; + if (CVA6Cfg.SuperscalarEn) begin + instruction_deco[1] = CVA6Cfg.RVC ? instruction_rvc[1] : fetch_entry_i[1].instruction; + end + if (CVA6Cfg.CvxifEn) begin is_illegal_deco[0] = is_illegal_cvxif_o; instruction_deco[0] = instruction_cvxif_o; @@ -292,6 +299,7 @@ module id_stage #( end end + assign rvfi_is_compressed_o = is_compressed_rvc; for (genvar i = 0; i < CVA6Cfg.NrIssuePorts; i++) begin decoder #( diff --git a/core/include/ariane_pkg.sv b/core/include/ariane_pkg.sv index 0210c1834b..bc88b6321a 100644 --- a/core/include/ariane_pkg.sv +++ b/core/include/ariane_pkg.sv @@ -574,6 +574,17 @@ package ariane_pkg; endcase endfunction + function automatic logic fd_changes_rd_state(input fu_op op); + unique case (op) inside + FSD, FSW, FSH, FSB, // stores + FCVT_F2I, // conversion to int + FMV_F2X, // move as-is to int + FCLASS: // classification (writes output to integer register) + return 1'b0; // floating-point registers are only read + default: return 1'b1; // other ops - floating-point registers are written as well + endcase + endfunction + function automatic logic is_amo(fu_op op); case (op) inside [AMO_LRW : AMO_MINDU]: begin @@ -627,6 +638,23 @@ package ariane_pkg; FE_INSTR_GUEST_PAGE_FAULT } frontend_exception_t; + // AMO request going to cache. this request is unconditionally valid as soon + // as request goes high. + // Furthermore, those signals are kept stable until the response indicates + // completion by asserting ack. + typedef struct packed { + logic req; // this request is valid + amo_t amo_op; // atomic memory operation to perform + logic [1:0] size; // 2'b10 --> word operation, 2'b11 --> double word operation + logic [63:0] operand_a; // address + logic [63:0] operand_b; // data as layouted in the register + } amo_req_t; + + // AMO response coming from cache. + typedef struct packed { + logic ack; // response is valid + logic [63:0] result; // sign-extended, result + } amo_resp_t; localparam RVFI = cva6_config_pkg::CVA6ConfigRvfiTrace; diff --git a/core/include/build_config_pkg.sv b/core/include/build_config_pkg.sv index be36059d4c..165cf8ef99 100644 --- a/core/include/build_config_pkg.sv +++ b/core/include/build_config_pkg.sv @@ -57,7 +57,7 @@ package build_config_pkg; cfg.AxiIdWidth = CVA6Cfg.AxiIdWidth; cfg.AxiUserWidth = CVA6Cfg.AxiUserWidth; cfg.NrLoadBufEntries = cfg.ObiVersion == config_pkg::OBI_NOT_COMPLIANT ? CVA6Cfg.NrLoadBufEntries : 1; //FIXME: To fix in order response - cfg.NrFetchBufEntries = 1; //cfg.ObiVersion == 0 ? CVA6Cfg.NrFetchBufEntries : 1; + cfg.NrFetchBufEntries = 1; cfg.RVF = CVA6Cfg.RVF; cfg.RVD = CVA6Cfg.RVD; cfg.XF16 = CVA6Cfg.XF16; diff --git a/core/include/config_pkg.sv b/core/include/config_pkg.sv index 5f69341068..5e264dd1df 100644 --- a/core/include/config_pkg.sv +++ b/core/include/config_pkg.sv @@ -267,6 +267,7 @@ package config_pkg; int unsigned AxiIdWidth; int unsigned AxiUserWidth; int unsigned NrFetchBufEntries; + int unsigned MEM_TID_WIDTH; int unsigned NrLoadBufEntries; bit RVF; bit RVD; @@ -441,7 +442,7 @@ package config_pkg; else `ASSERT_FATAL(""); assert (!(Cfg.RVH && !Cfg.SoftwareInterruptEn)) else `ASSERT_FATAL(""); - assert ((Cfg.RVZCMT && ~Cfg.MmuPresent)) + assert (!(Cfg.RVZCMT && Cfg.MmuPresent)) else `ASSERT_FATAL(""); // pragma translate_on endfunction diff --git a/core/include/cv32a60x_config_pkg.sv b/core/include/cv32a60x_config_pkg.sv index eb48b15f52..da394fb0af 100644 --- a/core/include/cv32a60x_config_pkg.sv +++ b/core/include/cv32a60x_config_pkg.sv @@ -50,7 +50,7 @@ package cva6_config_pkg; CoproType: config_pkg::COPRO_EXAMPLE, RVZiCond: bit'(0), RVZicntr: bit'(0), - RVZifencei: bit'(0), + RVZifencei: bit'(1), RVZihpm: bit'(0), NrScoreboardEntries: unsigned'(4), PerfCounterEn: bit'(0), diff --git a/core/include/cv32a60x_no_zcmt_axi_config_pkg.sv b/core/include/cv32a60x_no_zcmt_axi_config_pkg.sv new file mode 100644 index 0000000000..013dae884b --- /dev/null +++ b/core/include/cv32a60x_no_zcmt_axi_config_pkg.sv @@ -0,0 +1,111 @@ +// Copyright 2022 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; // axi_pkg.sv + localparam CVA6ConfigAxiAddrWidth = 64; // axi_pkg.sv + localparam CVA6ConfigAxiDataWidth = 64; // axi_pkg.sv + localparam CVA6ConfigDataUserWidth = 32; // axi_pkg.sv + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), + FpgaAlteraEn: bit'(0), + TechnoCut: bit'(1), + SuperscalarEn: bit'(0), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(0), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(0), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(4), + PerfCounterEn: bit'(0), + MmuPresent: bit'(0), + RVS: bit'(0), + RVU: bit'(0), + SoftwareInterruptEn: bit'(0), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(0), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(0), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(0), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(0), + NonIdempotentAddrBase: 1024'({64'b0, 64'b0}), + NonIdempotentLength: 1024'({64'b0, 64'b0}), + NrExecuteRegionRules: unsigned'(0), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(0) + }; + +endpackage diff --git a/core/include/cv32a60x_no_zcmt_config_pkg.sv b/core/include/cv32a60x_no_zcmt_config_pkg.sv new file mode 100644 index 0000000000..c5e4a48c47 --- /dev/null +++ b/core/include/cv32a60x_no_zcmt_config_pkg.sv @@ -0,0 +1,111 @@ +// Copyright 2022 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; // axi_pkg.sv + localparam CVA6ConfigAxiAddrWidth = 64; // axi_pkg.sv + localparam CVA6ConfigAxiDataWidth = 64; // axi_pkg.sv + localparam CVA6ConfigDataUserWidth = 32; // axi_pkg.sv + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), + FpgaAlteraEn: bit'(0), + TechnoCut: bit'(1), + SuperscalarEn: bit'(0), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(0), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(0), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(4), + PerfCounterEn: bit'(0), + MmuPresent: bit'(0), + RVS: bit'(0), + RVU: bit'(0), + SoftwareInterruptEn: bit'(0), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(0), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(0), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(0), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(0), + NonIdempotentAddrBase: 1024'({64'b0, 64'b0}), + NonIdempotentLength: 1024'({64'b0, 64'b0}), + NrExecuteRegionRules: unsigned'(0), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(1) + }; + +endpackage diff --git a/core/include/cv32a60x_zcmt_pmp_axi_config_pkg.sv b/core/include/cv32a60x_zcmt_pmp_axi_config_pkg.sv new file mode 100644 index 0000000000..846fbf7718 --- /dev/null +++ b/core/include/cv32a60x_zcmt_pmp_axi_config_pkg.sv @@ -0,0 +1,111 @@ +// Copyright 2022 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; // axi_pkg.sv + localparam CVA6ConfigAxiAddrWidth = 64; // axi_pkg.sv + localparam CVA6ConfigAxiDataWidth = 64; // axi_pkg.sv + localparam CVA6ConfigDataUserWidth = 32; // axi_pkg.sv + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), + FpgaAlteraEn: bit'(0), + TechnoCut: bit'(1), + SuperscalarEn: bit'(0), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(1), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(1), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(4), + PerfCounterEn: bit'(0), + MmuPresent: bit'(0), + RVS: bit'(0), + RVU: bit'(0), + SoftwareInterruptEn: bit'(0), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(0), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(8), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(0), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(0), + NonIdempotentAddrBase: 1024'({64'b0, 64'b0}), + NonIdempotentLength: 1024'({64'b0, 64'b0}), + NrExecuteRegionRules: unsigned'(0), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(0) + }; + +endpackage diff --git a/core/include/cv32a60x_zcmt_pmp_config_pkg.sv b/core/include/cv32a60x_zcmt_pmp_config_pkg.sv new file mode 100644 index 0000000000..3efdfafab4 --- /dev/null +++ b/core/include/cv32a60x_zcmt_pmp_config_pkg.sv @@ -0,0 +1,111 @@ +// Copyright 2022 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; // axi_pkg.sv + localparam CVA6ConfigAxiAddrWidth = 64; // axi_pkg.sv + localparam CVA6ConfigAxiDataWidth = 64; // axi_pkg.sv + localparam CVA6ConfigDataUserWidth = 32; // axi_pkg.sv + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), + FpgaAlteraEn: bit'(0), + TechnoCut: bit'(1), + SuperscalarEn: bit'(0), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(1), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(1), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(4), + PerfCounterEn: bit'(0), + MmuPresent: bit'(0), + RVS: bit'(0), + RVU: bit'(0), + SoftwareInterruptEn: bit'(0), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(0), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(8), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(0), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(0), + NonIdempotentAddrBase: 1024'({64'b0, 64'b0}), + NonIdempotentLength: 1024'({64'b0, 64'b0}), + NrExecuteRegionRules: unsigned'(0), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(1) + }; + +endpackage diff --git a/core/include/cv32a65x_axi_config_pkg.sv b/core/include/cv32a65x_axi_config_pkg.sv index 08a619dede..a882bbd4ed 100644 --- a/core/include/cv32a65x_axi_config_pkg.sv +++ b/core/include/cv32a65x_axi_config_pkg.sv @@ -50,7 +50,7 @@ package cva6_config_pkg; CoproType: config_pkg::COPRO_EXAMPLE, RVZiCond: bit'(0), RVZicntr: bit'(0), - RVZifencei: bit'(0), + RVZifencei: bit'(1), RVZihpm: bit'(0), NrScoreboardEntries: unsigned'(8), PerfCounterEn: bit'(0), @@ -103,7 +103,7 @@ package cva6_config_pkg; SharedTlbDepth: int'(64), NrLoadPipeRegs: int'(0), NrStorePipeRegs: int'(0), - DcacheIdWidth: int'(1), + DcacheIdWidth: int'(3), ObiVersion: int'(config_pkg::OBI_V1_6), PipelineOnly: bit'(0) }; diff --git a/core/include/cv32a65x_config_pkg.sv b/core/include/cv32a65x_config_pkg.sv index c087717afa..6c6b93e2eb 100644 --- a/core/include/cv32a65x_config_pkg.sv +++ b/core/include/cv32a65x_config_pkg.sv @@ -50,7 +50,7 @@ package cva6_config_pkg; CoproType: config_pkg::COPRO_EXAMPLE, RVZiCond: bit'(0), RVZicntr: bit'(0), - RVZifencei: bit'(0), + RVZifencei: bit'(1), RVZihpm: bit'(0), NrScoreboardEntries: unsigned'(8), PerfCounterEn: bit'(0), diff --git a/core/include/cv32a65x_noPMP_axi_config_pkg.sv b/core/include/cv32a65x_noPMP_axi_config_pkg.sv new file mode 100644 index 0000000000..94c10537f9 --- /dev/null +++ b/core/include/cv32a65x_noPMP_axi_config_pkg.sv @@ -0,0 +1,111 @@ +// Copyright 2022 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; // axi_pkg.sv + localparam CVA6ConfigAxiAddrWidth = 64; // axi_pkg.sv + localparam CVA6ConfigAxiDataWidth = 64; // axi_pkg.sv + localparam CVA6ConfigDataUserWidth = 32; // axi_pkg.sv + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), + FpgaAlteraEn: bit'(0), + TechnoCut: bit'(1), + SuperscalarEn: bit'(1), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(1), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(1), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(8), + PerfCounterEn: bit'(0), + MmuPresent: bit'(0), + RVS: bit'(0), + RVU: bit'(0), + SoftwareInterruptEn: bit'(0), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(0), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(0), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(0), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(0), + NonIdempotentAddrBase: 1024'({64'b0, 64'b0}), + NonIdempotentLength: 1024'({64'b0, 64'b0}), + NrExecuteRegionRules: unsigned'(0), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(0) + }; + +endpackage diff --git a/core/include/cv32a65x_noPMP_config_pkg.sv b/core/include/cv32a65x_noPMP_config_pkg.sv new file mode 100644 index 0000000000..abc2f3e8e2 --- /dev/null +++ b/core/include/cv32a65x_noPMP_config_pkg.sv @@ -0,0 +1,111 @@ +// Copyright 2022 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; // axi_pkg.sv + localparam CVA6ConfigAxiAddrWidth = 64; // axi_pkg.sv + localparam CVA6ConfigAxiDataWidth = 64; // axi_pkg.sv + localparam CVA6ConfigDataUserWidth = 32; // axi_pkg.sv + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), + FpgaAlteraEn: bit'(0), + TechnoCut: bit'(1), + SuperscalarEn: bit'(1), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(1), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(1), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(8), + PerfCounterEn: bit'(0), + MmuPresent: bit'(0), + RVS: bit'(0), + RVU: bit'(0), + SoftwareInterruptEn: bit'(0), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(0), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(0), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(0), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(0), + NonIdempotentAddrBase: 1024'({64'b0, 64'b0}), + NonIdempotentLength: 1024'({64'b0, 64'b0}), + NrExecuteRegionRules: unsigned'(0), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(1), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(1) + }; + +endpackage diff --git a/core/include/cv32a65x_noPMP_noSuperScalar_axi_config_pkg.sv b/core/include/cv32a65x_noPMP_noSuperScalar_axi_config_pkg.sv new file mode 100644 index 0000000000..d32b96e5e1 --- /dev/null +++ b/core/include/cv32a65x_noPMP_noSuperScalar_axi_config_pkg.sv @@ -0,0 +1,111 @@ +// Copyright 2022 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; // axi_pkg.sv + localparam CVA6ConfigAxiAddrWidth = 64; // axi_pkg.sv + localparam CVA6ConfigAxiDataWidth = 64; // axi_pkg.sv + localparam CVA6ConfigDataUserWidth = 32; // axi_pkg.sv + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), + FpgaAlteraEn: bit'(0), + TechnoCut: bit'(1), + SuperscalarEn: bit'(0), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(1), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(1), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(8), + PerfCounterEn: bit'(0), + MmuPresent: bit'(0), + RVS: bit'(0), + RVU: bit'(0), + SoftwareInterruptEn: bit'(0), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(0), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(0), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(0), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(0), + NonIdempotentAddrBase: 1024'({64'b0, 64'b0}), + NonIdempotentLength: 1024'({64'b0, 64'b0}), + NrExecuteRegionRules: unsigned'(0), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(0) + }; + +endpackage diff --git a/core/include/cv32a65x_noPMP_noSuperScalar_config_pkg.sv b/core/include/cv32a65x_noPMP_noSuperScalar_config_pkg.sv new file mode 100644 index 0000000000..31bc54880d --- /dev/null +++ b/core/include/cv32a65x_noPMP_noSuperScalar_config_pkg.sv @@ -0,0 +1,111 @@ +// Copyright 2022 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; // axi_pkg.sv + localparam CVA6ConfigAxiAddrWidth = 64; // axi_pkg.sv + localparam CVA6ConfigAxiDataWidth = 64; // axi_pkg.sv + localparam CVA6ConfigDataUserWidth = 32; // axi_pkg.sv + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), + FpgaAlteraEn: bit'(0), + TechnoCut: bit'(1), + SuperscalarEn: bit'(0), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(1), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(1), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(8), + PerfCounterEn: bit'(0), + MmuPresent: bit'(0), + RVS: bit'(0), + RVU: bit'(0), + SoftwareInterruptEn: bit'(0), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(0), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(0), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(0), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(0), + NonIdempotentAddrBase: 1024'({64'b0, 64'b0}), + NonIdempotentLength: 1024'({64'b0, 64'b0}), + NrExecuteRegionRules: unsigned'(0), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(1), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(1) + }; + +endpackage diff --git a/core/include/cv32a65x_sv32_axi_config_pkg.sv b/core/include/cv32a65x_sv32_axi_config_pkg.sv new file mode 100644 index 0000000000..d7704acf60 --- /dev/null +++ b/core/include/cv32a65x_sv32_axi_config_pkg.sv @@ -0,0 +1,112 @@ +// Copyright 2021 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; + localparam CVA6ConfigAxiAddrWidth = 64; + localparam CVA6ConfigAxiDataWidth = 64; + localparam CVA6ConfigDataUserWidth = CVA6ConfigXlen; + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), // for Xilinx and Altera + FpgaAlteraEn: bit'(0), // for Altera (only) + TechnoCut: bit'(1), + SuperscalarEn: bit'(1), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(0), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(1), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(8), + PerfCounterEn: bit'(1), + MmuPresent: bit'(1), + RVS: bit'(1), + RVU: bit'(1), + SoftwareInterruptEn: bit'(1), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(1), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(8), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(1), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(1), + NonIdempotentAddrBase: 1024'({64'b0}), + NonIdempotentLength: 1024'({64'h8000_0000}), + NrExecuteRegionRules: unsigned'(3), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(0) + }; + +endpackage diff --git a/core/include/cv32a65x_sv32_config_pkg.sv b/core/include/cv32a65x_sv32_config_pkg.sv new file mode 100644 index 0000000000..d51cc203ac --- /dev/null +++ b/core/include/cv32a65x_sv32_config_pkg.sv @@ -0,0 +1,112 @@ +// Copyright 2021 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; + localparam CVA6ConfigAxiAddrWidth = 64; + localparam CVA6ConfigAxiDataWidth = 64; + localparam CVA6ConfigDataUserWidth = CVA6ConfigXlen; + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), // for Xilinx and Altera + FpgaAlteraEn: bit'(0), // for Altera (only) + TechnoCut: bit'(1), + SuperscalarEn: bit'(1), + NrCommitPorts: unsigned'(1), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(0), + RVB: bit'(1), + ZKN: bit'(0), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(0), + RVZCB: bit'(1), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(1), + CoproType: config_pkg::COPRO_EXAMPLE, + RVZiCond: bit'(0), + RVZicntr: bit'(0), + RVZifencei: bit'(1), + RVZihpm: bit'(0), + NrScoreboardEntries: unsigned'(8), + PerfCounterEn: bit'(1), + MmuPresent: bit'(1), + RVS: bit'(1), + RVU: bit'(1), + SoftwareInterruptEn: bit'(1), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(0), + BHTEntries: unsigned'(32), + DmBaseAddress: 64'h0, + TvalEn: bit'(1), + DirectVecOnly: bit'(1), + NrPMPEntries: unsigned'(8), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(1), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(1), + NonIdempotentAddrBase: 1024'({64'b0}), + NonIdempotentLength: 1024'({64'h8000_0000}), + NrExecuteRegionRules: unsigned'(3), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(0), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(2048), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(2048), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(1), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(1), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(0), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(1) + }; + +endpackage diff --git a/core/include/cv32a6_ima_sv32_fpga_config_pkg.sv b/core/include/cv32a6_ima_sv32_fpga_config_pkg.sv index f31258b614..632d3fa215 100644 --- a/core/include/cv32a6_ima_sv32_fpga_config_pkg.sv +++ b/core/include/cv32a6_ima_sv32_fpga_config_pkg.sv @@ -12,63 +12,13 @@ package cva6_config_pkg; localparam CVA6ConfigXlen = 32; - localparam CVA6ConfigRVF = 0; - localparam CVA6ConfigF16En = 0; - localparam CVA6ConfigF16AltEn = 0; - localparam CVA6ConfigF8En = 0; - localparam CVA6ConfigFVecEn = 0; - - localparam CVA6ConfigCvxifEn = 0; - localparam CVA6ConfigCExtEn = 0; - localparam CVA6ConfigZcbExtEn = 0; - localparam CVA6ConfigZcmpExtEn = 0; - localparam CVA6ConfigAExtEn = 1; - localparam CVA6ConfigHExtEn = 0; // always disabled - localparam CVA6ConfigBExtEn = 0; - localparam CVA6ConfigVExtEn = 0; - localparam CVA6ConfigRVZiCond = 0; + localparam CVA6ConfigRvfiTrace = 1; - localparam CVA6ConfigAxiIdWidth = 4; + localparam CVA6ConfigAxiIdWidth = 5; localparam CVA6ConfigAxiAddrWidth = 64; localparam CVA6ConfigAxiDataWidth = 64; - localparam CVA6ConfigFetchUserEn = 0; - localparam CVA6ConfigFetchUserWidth = CVA6ConfigXlen; - localparam CVA6ConfigDataUserEn = 0; localparam CVA6ConfigDataUserWidth = CVA6ConfigXlen; - localparam CVA6ConfigIcacheByteSize = 8192; - localparam CVA6ConfigIcacheSetAssoc = 2; - localparam CVA6ConfigIcacheLineWidth = 128; - localparam CVA6ConfigDcacheByteSize = 8192; - localparam CVA6ConfigDcacheSetAssoc = 2; - localparam CVA6ConfigDcacheLineWidth = 128; - - localparam CVA6ConfigDcacheIdWidth = 1; - - localparam CVA6ConfigWtDcacheWbufDepth = 2; - - localparam CVA6ConfigNrScoreboardEntries = 4; - - localparam CVA6ConfigNrLoadPipeRegs = 1; - localparam CVA6ConfigNrStorePipeRegs = 0; - localparam CVA6ConfigNrLoadBufEntries = 2; - - localparam CVA6ConfigRASDepth = 2; - localparam CVA6ConfigBTBEntries = 32; - localparam CVA6ConfigBHTEntries = 128; - - localparam CVA6ConfigTvalEn = 1; - - localparam CVA6ConfigNrPMPEntries = 0; - - localparam CVA6ConfigPerfCounterEn = 0; - - localparam config_pkg::cache_type_t CVA6ConfigDcacheType = config_pkg::WT; - - localparam CVA6ConfigMmuPresent = 1; - - localparam CVA6ConfigRvfiTrace = 1; - localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ XLEN: unsigned'(CVA6ConfigXlen), VLEN: unsigned'(32), @@ -81,43 +31,43 @@ package cva6_config_pkg; AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), - NrLoadBufEntries: unsigned'(CVA6ConfigNrLoadBufEntries), - RVF: bit'(CVA6ConfigRVF), - RVD: bit'(CVA6ConfigRVF), - XF16: bit'(CVA6ConfigF16En), - XF16ALT: bit'(CVA6ConfigF16AltEn), - XF8: bit'(CVA6ConfigF8En), - RVA: bit'(CVA6ConfigAExtEn), - RVB: bit'(CVA6ConfigBExtEn), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(1), + RVB: bit'(0), ZKN: bit'(0), - RVV: bit'(CVA6ConfigVExtEn), - RVC: bit'(CVA6ConfigCExtEn), - RVH: bit'(CVA6ConfigHExtEn), - RVZCB: bit'(CVA6ConfigZcbExtEn), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), RVZCMT: bit'(0), - RVZCMP: bit'(CVA6ConfigZcmpExtEn), - XFVec: bit'(CVA6ConfigFVecEn), - CvxifEn: bit'(CVA6ConfigCvxifEn), + RVZCB: bit'(0), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(0), CoproType: config_pkg::COPRO_NONE, - RVZiCond: bit'(CVA6ConfigRVZiCond), + RVZiCond: bit'(0), RVZicntr: bit'(1), RVZifencei: bit'(1), RVZihpm: bit'(1), - NrScoreboardEntries: unsigned'(CVA6ConfigNrScoreboardEntries), - PerfCounterEn: bit'(CVA6ConfigPerfCounterEn), - MmuPresent: bit'(CVA6ConfigMmuPresent), + NrScoreboardEntries: unsigned'(4), + PerfCounterEn: bit'(0), + MmuPresent: bit'(1), RVS: bit'(1), RVU: bit'(1), SoftwareInterruptEn: bit'(1), HaltAddress: 64'h800, ExceptionAddress: 64'h808, - RASDepth: unsigned'(CVA6ConfigRASDepth), - BTBEntries: unsigned'(CVA6ConfigBTBEntries), - BHTEntries: unsigned'(CVA6ConfigBHTEntries), + RASDepth: unsigned'(2), + BTBEntries: unsigned'(32), + BHTEntries: unsigned'(128), DmBaseAddress: 64'h0, - TvalEn: unsigned'(CVA6ConfigTvalEn), + TvalEn: bit'(1), DirectVecOnly: bit'(0), - NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + NrPMPEntries: unsigned'(0), PMPCfgRstVal: {64{64'h0}}, PMPAddrRstVal: {64{64'h0}}, PMPEntryReadOnly: 64'd0, @@ -135,26 +85,26 @@ package cva6_config_pkg; MaxOutstandingStores: unsigned'(7), DebugEn: bit'(1), AxiBurstWriteEn: bit'(0), - IcacheByteSize: unsigned'(CVA6ConfigIcacheByteSize), - IcacheSetAssoc: unsigned'(CVA6ConfigIcacheSetAssoc), - IcacheLineWidth: unsigned'(CVA6ConfigIcacheLineWidth), - DCacheType: CVA6ConfigDcacheType, - DcacheByteSize: unsigned'(CVA6ConfigDcacheByteSize), - DcacheSetAssoc: unsigned'(CVA6ConfigDcacheSetAssoc), - DcacheLineWidth: unsigned'(CVA6ConfigDcacheLineWidth), + IcacheByteSize: unsigned'(8192), + IcacheSetAssoc: unsigned'(2), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(8192), + DcacheSetAssoc: unsigned'(2), + DcacheLineWidth: unsigned'(128), DcacheFlushOnFence: bit'(0), DcacheInvalidateOnFlush: bit'(0), - DataUserEn: bit'(CVA6ConfigDataUserEn), - WtDcacheWbufDepth: int'(CVA6ConfigWtDcacheWbufDepth), - FetchUserWidth: unsigned'(CVA6ConfigFetchUserWidth), - FetchUserEn: bit'(CVA6ConfigFetchUserEn), + DataUserEn: bit'(0), + WtDcacheWbufDepth: int'(2), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(0), InstrTlbEntries: int'(2), DataTlbEntries: int'(2), UseSharedTlb: bit'(1), SharedTlbDepth: int'(64), - NrLoadPipeRegs: int'(CVA6ConfigNrLoadPipeRegs), - NrStorePipeRegs: int'(CVA6ConfigNrStorePipeRegs), - DcacheIdWidth: int'(CVA6ConfigDcacheIdWidth), + NrLoadPipeRegs: int'(1), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), ObiVersion: int'(config_pkg::OBI_V1_6), PipelineOnly: bit'(0) }; diff --git a/core/include/cv32a6_imac_sv32_config_pkg.sv b/core/include/cv32a6_imac_sv32_config_pkg.sv index 1d14ff67fd..d2c05e6fff 100644 --- a/core/include/cv32a6_imac_sv32_config_pkg.sv +++ b/core/include/cv32a6_imac_sv32_config_pkg.sv @@ -12,62 +12,13 @@ package cva6_config_pkg; localparam CVA6ConfigXlen = 32; - localparam CVA6ConfigRVF = 0; - localparam CVA6ConfigF16En = 0; - localparam CVA6ConfigF16AltEn = 0; - localparam CVA6ConfigF8En = 0; - localparam CVA6ConfigFVecEn = 0; - - localparam CVA6ConfigCvxifEn = 0; - localparam CVA6ConfigCExtEn = 1; - localparam CVA6ConfigZcbExtEn = 0; - localparam CVA6ConfigZcmpExtEn = 0; - localparam CVA6ConfigAExtEn = 1; - localparam CVA6ConfigHExtEn = 0; // always disabled - localparam CVA6ConfigVExtEn = 0; - localparam CVA6ConfigRVZiCond = 0; + localparam CVA6ConfigRvfiTrace = 1; - localparam CVA6ConfigAxiIdWidth = 4; + localparam CVA6ConfigAxiIdWidth = 5; localparam CVA6ConfigAxiAddrWidth = 64; localparam CVA6ConfigAxiDataWidth = 64; - localparam CVA6ConfigFetchUserEn = 0; - localparam CVA6ConfigFetchUserWidth = CVA6ConfigXlen; - localparam CVA6ConfigDataUserEn = 0; localparam CVA6ConfigDataUserWidth = CVA6ConfigXlen; - localparam CVA6ConfigIcacheByteSize = 16384; - localparam CVA6ConfigIcacheSetAssoc = 4; - localparam CVA6ConfigIcacheLineWidth = 128; - localparam CVA6ConfigDcacheByteSize = 32768; - localparam CVA6ConfigDcacheSetAssoc = 8; - localparam CVA6ConfigDcacheLineWidth = 128; - - localparam CVA6ConfigDcacheIdWidth = 3; - - localparam CVA6ConfigWtDcacheWbufDepth = 8; - - localparam CVA6ConfigNrScoreboardEntries = 8; - - localparam CVA6ConfigNrLoadPipeRegs = 1; - localparam CVA6ConfigNrStorePipeRegs = 0; - localparam CVA6ConfigNrLoadBufEntries = 2; - - localparam CVA6ConfigRASDepth = 2; - localparam CVA6ConfigBTBEntries = 32; - localparam CVA6ConfigBHTEntries = 128; - - localparam CVA6ConfigTvalEn = 1; - - localparam CVA6ConfigNrPMPEntries = 8; - - localparam CVA6ConfigPerfCounterEn = 1; - - localparam config_pkg::cache_type_t CVA6ConfigDcacheType = config_pkg::HPDCACHE_WT; - - localparam CVA6ConfigMmuPresent = 1; - - localparam CVA6ConfigRvfiTrace = 1; - localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ XLEN: unsigned'(CVA6ConfigXlen), VLEN: unsigned'(32), @@ -80,43 +31,43 @@ package cva6_config_pkg; AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), - NrLoadBufEntries: unsigned'(CVA6ConfigNrLoadBufEntries), - RVF: bit'(CVA6ConfigRVF), - RVD: bit'(CVA6ConfigRVF), - XF16: bit'(CVA6ConfigF16En), - XF16ALT: bit'(CVA6ConfigF16AltEn), - XF8: bit'(CVA6ConfigF8En), - RVA: bit'(CVA6ConfigAExtEn), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(1), RVB: bit'(1), ZKN: bit'(1), - RVV: bit'(CVA6ConfigVExtEn), - RVC: bit'(CVA6ConfigCExtEn), - RVH: bit'(CVA6ConfigHExtEn), - RVZCB: bit'(CVA6ConfigZcbExtEn), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), RVZCMT: bit'(0), - RVZCMP: bit'(CVA6ConfigZcmpExtEn), - XFVec: bit'(CVA6ConfigFVecEn), - CvxifEn: bit'(CVA6ConfigCvxifEn), + RVZCB: bit'(0), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(0), CoproType: config_pkg::COPRO_NONE, - RVZiCond: bit'(CVA6ConfigRVZiCond), + RVZiCond: bit'(0), RVZicntr: bit'(1), RVZifencei: bit'(1), RVZihpm: bit'(1), - NrScoreboardEntries: unsigned'(CVA6ConfigNrScoreboardEntries), - PerfCounterEn: bit'(CVA6ConfigPerfCounterEn), - MmuPresent: bit'(CVA6ConfigMmuPresent), + NrScoreboardEntries: unsigned'(8), + PerfCounterEn: bit'(1), + MmuPresent: bit'(1), RVS: bit'(1), RVU: bit'(1), SoftwareInterruptEn: bit'(1), HaltAddress: 64'h800, ExceptionAddress: 64'h808, - RASDepth: unsigned'(CVA6ConfigRASDepth), - BTBEntries: unsigned'(CVA6ConfigBTBEntries), - BHTEntries: unsigned'(CVA6ConfigBHTEntries), + RASDepth: unsigned'(2), + BTBEntries: unsigned'(32), + BHTEntries: unsigned'(128), DmBaseAddress: 64'h0, - TvalEn: bit'(CVA6ConfigTvalEn), + TvalEn: bit'(1), DirectVecOnly: bit'(0), - NrPMPEntries: unsigned'(CVA6ConfigNrPMPEntries), + NrPMPEntries: unsigned'(8), PMPCfgRstVal: {64{64'h0}}, PMPAddrRstVal: {64{64'h0}}, PMPEntryReadOnly: 64'd0, @@ -134,26 +85,26 @@ package cva6_config_pkg; MaxOutstandingStores: unsigned'(7), DebugEn: bit'(1), AxiBurstWriteEn: bit'(0), - IcacheByteSize: unsigned'(CVA6ConfigIcacheByteSize), - IcacheSetAssoc: unsigned'(CVA6ConfigIcacheSetAssoc), - IcacheLineWidth: unsigned'(CVA6ConfigIcacheLineWidth), - DCacheType: CVA6ConfigDcacheType, - DcacheByteSize: unsigned'(CVA6ConfigDcacheByteSize), - DcacheSetAssoc: unsigned'(CVA6ConfigDcacheSetAssoc), - DcacheLineWidth: unsigned'(CVA6ConfigDcacheLineWidth), + IcacheByteSize: unsigned'(16384), + IcacheSetAssoc: unsigned'(4), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(32768), + DcacheSetAssoc: unsigned'(8), + DcacheLineWidth: unsigned'(128), DcacheFlushOnFence: bit'(0), DcacheInvalidateOnFlush: bit'(0), - DataUserEn: bit'(CVA6ConfigDataUserEn), - WtDcacheWbufDepth: int'(CVA6ConfigWtDcacheWbufDepth), - FetchUserWidth: unsigned'(CVA6ConfigFetchUserWidth), - FetchUserEn: bit'(CVA6ConfigFetchUserEn), + DataUserEn: bit'(0), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(0), InstrTlbEntries: int'(2), DataTlbEntries: int'(2), UseSharedTlb: bit'(1), SharedTlbDepth: int'(64), - NrLoadPipeRegs: int'(CVA6ConfigNrLoadPipeRegs), - NrStorePipeRegs: int'(CVA6ConfigNrStorePipeRegs), - DcacheIdWidth: int'(CVA6ConfigDcacheIdWidth), + NrLoadPipeRegs: int'(1), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), ObiVersion: int'(config_pkg::OBI_V1_6), PipelineOnly: bit'(0) }; diff --git a/core/include/cv32a6_imac_sv32_obi_config_pkg.sv b/core/include/cv32a6_imac_sv32_obi_config_pkg.sv new file mode 100644 index 0000000000..e8d88ccd32 --- /dev/null +++ b/core/include/cv32a6_imac_sv32_obi_config_pkg.sv @@ -0,0 +1,112 @@ +// Copyright 2021 Thales DIS design services SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Jean-Roch COULON - Thales + + +package cva6_config_pkg; + + localparam CVA6ConfigXlen = 32; + + localparam CVA6ConfigRvfiTrace = 1; + + localparam CVA6ConfigAxiIdWidth = 5; + localparam CVA6ConfigAxiAddrWidth = 64; + localparam CVA6ConfigAxiDataWidth = 64; + localparam CVA6ConfigDataUserWidth = CVA6ConfigXlen; + + localparam config_pkg::cva6_user_cfg_t cva6_cfg = '{ + XLEN: unsigned'(CVA6ConfigXlen), + VLEN: unsigned'(32), + FpgaEn: bit'(0), // for Xilinx and Altera + FpgaAlteraEn: bit'(0), // for Altera (only) + TechnoCut: bit'(0), + SuperscalarEn: bit'(0), + NrCommitPorts: unsigned'(2), + AxiAddrWidth: unsigned'(CVA6ConfigAxiAddrWidth), + AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), + AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), + AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + NrLoadBufEntries: unsigned'(2), + RVF: bit'(0), + RVD: bit'(0), + XF16: bit'(0), + XF16ALT: bit'(0), + XF8: bit'(0), + RVA: bit'(1), + RVB: bit'(1), + ZKN: bit'(1), + RVV: bit'(0), + RVC: bit'(1), + RVH: bit'(0), + RVZCMT: bit'(0), + RVZCB: bit'(0), + RVZCMP: bit'(0), + XFVec: bit'(0), + CvxifEn: bit'(0), + CoproType: config_pkg::COPRO_NONE, + RVZiCond: bit'(0), + RVZicntr: bit'(1), + RVZifencei: bit'(1), + RVZihpm: bit'(1), + NrScoreboardEntries: unsigned'(8), + PerfCounterEn: bit'(1), + MmuPresent: bit'(1), + RVS: bit'(1), + RVU: bit'(1), + SoftwareInterruptEn: bit'(1), + HaltAddress: 64'h800, + ExceptionAddress: 64'h808, + RASDepth: unsigned'(2), + BTBEntries: unsigned'(32), + BHTEntries: unsigned'(128), + DmBaseAddress: 64'h0, + TvalEn: bit'(1), + DirectVecOnly: bit'(0), + NrPMPEntries: unsigned'(8), + PMPCfgRstVal: {64{64'h0}}, + PMPAddrRstVal: {64{64'h0}}, + PMPEntryReadOnly: 64'd0, + PMPNapotEn: bit'(1), + NOCType: config_pkg::NOC_TYPE_AXI4_ATOP, + NrNonIdempotentRules: unsigned'(1), + NonIdempotentAddrBase: 1024'({64'b0}), + NonIdempotentLength: 1024'({64'h8000_0000}), + NrExecuteRegionRules: unsigned'(3), + ExecuteRegionAddrBase: 1024'({64'h8000_0000, 64'h1_0000, 64'h0}), + ExecuteRegionLength: 1024'({64'h40000000, 64'h10000, 64'h1000}), + NrCachedRegionRules: unsigned'(1), + CachedRegionAddrBase: 1024'({64'h8000_0000}), + CachedRegionLength: 1024'({64'h40000000}), + MaxOutstandingStores: unsigned'(7), + DebugEn: bit'(1), + AxiBurstWriteEn: bit'(0), + IcacheByteSize: unsigned'(16384), + IcacheSetAssoc: unsigned'(4), + IcacheLineWidth: unsigned'(128), + DCacheType: config_pkg::HPDCACHE_WT, + DcacheByteSize: unsigned'(32768), + DcacheSetAssoc: unsigned'(8), + DcacheLineWidth: unsigned'(128), + DcacheFlushOnFence: bit'(0), + DcacheInvalidateOnFlush: bit'(0), + DataUserEn: bit'(0), + WtDcacheWbufDepth: int'(8), + FetchUserWidth: unsigned'(32), + FetchUserEn: bit'(0), + InstrTlbEntries: int'(2), + DataTlbEntries: int'(2), + UseSharedTlb: bit'(1), + SharedTlbDepth: int'(64), + NrLoadPipeRegs: int'(1), + NrStorePipeRegs: int'(0), + DcacheIdWidth: int'(3), + ObiVersion: int'(config_pkg::OBI_V1_6), + PipelineOnly: bit'(1) + }; + +endpackage diff --git a/core/include/rvfi_types.svh b/core/include/rvfi_types.svh index 8a2b50eca7..bd8caa1b71 100644 --- a/core/include/rvfi_types.svh +++ b/core/include/rvfi_types.svh @@ -101,9 +101,9 @@ logic [Cfg.NrIssuePorts-1:0] decoded_instr_ack; \ logic flush; \ logic [Cfg.NrIssuePorts-1:0] issue_instr_ack; \ + logic [Cfg.NrIssuePorts-1:0] fetch_entry_valid; \ logic [Cfg.NrIssuePorts-1:0][31:0] instruction; \ - ariane_pkg::fu_t [Cfg.NrIssuePorts-1:0] decoded_fu; \ - logic [Cfg.NrIssuePorts-1:0] was_compressed; \ + logic [Cfg.NrIssuePorts-1:0] is_compressed; \ logic [Cfg.NrIssuePorts-1:0][Cfg.XLEN-1:0] rs1; \ logic [Cfg.NrIssuePorts-1:0][Cfg.XLEN-1:0] rs2; \ logic [Cfg.NrCommitPorts-1:0][Cfg.VLEN-1:0] commit_instr_pc; \ @@ -126,6 +126,10 @@ logic [Cfg.PLEN-1:0] mem_paddr; \ logic debug_mode; \ logic [Cfg.NrCommitPorts-1:0][Cfg.XLEN-1:0] wdata; \ + logic branch_valid; \ + logic is_taken; \ + logic [Cfg.XLEN-1:0] tval; \ + logic [Cfg.TRANS_ID_BITS-1:0] branch_trans_id; \ } `define RVFI_PROBES_CSR_T(Cfg) struct packed { \ @@ -164,4 +168,18 @@ logic [63:0][Cfg.PLEN-3:0] pmpaddr_q; \ } -`endif // RVFI_TYPES_SVH +`define RVFI_TO_ITI_T(Cfg) struct packed { \ + logic [Cfg.NrCommitPorts-1:0] valid; \ + logic [Cfg.NrCommitPorts-1:0][Cfg.VLEN-1:0] pc; \ + ariane_pkg::fu_op [Cfg.NrCommitPorts-1:0] op; \ + logic [Cfg.NrCommitPorts-1:0] is_compressed; \ + logic [Cfg.NrCommitPorts-1:0] branch_valid; \ + logic [Cfg.NrCommitPorts-1:0] is_taken; \ + logic ex_valid; \ + logic [Cfg.XLEN-1:0] tval; \ + logic [Cfg.XLEN-1:0] cause; \ + riscv::priv_lvl_t priv_lvl; \ + logic [63:0] cycles; \ +} + +`endif // RVFI_TYPES_SVH \ No newline at end of file diff --git a/core/load_unit.sv b/core/load_unit.sv index 552950ce0a..0b8181b6d6 100644 --- a/core/load_unit.sv +++ b/core/load_unit.sv @@ -278,7 +278,7 @@ module load_unit if (valid_i) begin translation_req_o = 1'b1; if (!page_offset_matches_i) begin - ypb_load_req_o.vreq = 1'b1; + ypb_load_req_o.vreq = !stall_translation; if (!CVA6Cfg.MmuPresent || ypb_load_rsp_i.vgnt) begin if (stall_translation || stall_ni || stall_ypb || ldbuf_full || flush_i) begin kill_req_d = 1'b1; // MmuPresent only: next cycle is s2 but we need to kill because not ready to send tag @@ -288,6 +288,8 @@ module load_unit end end end + end else begin + kill_req_d = ldbuf_flushed_q; //if there was a flush, a request might have started s0 end // RETIRE LOAD // we got an rvalid and it's corresponding request was not flushed @@ -300,13 +302,13 @@ module load_unit trans_id_o = CVA6Cfg.MmuPresent ? ldbuf_q[ldbuf_windex_q].trans_id : lsu_ctrl_i.trans_id; valid_o = 1'b1; ex_o.valid = 1'b1; - pop_ld_o = 1'b1; // release lsu_bypass fifo + pop_ld_o = !stall_translation;//1'b1; // release lsu_bypass fifo // RETIRE EXCEPTION (low priority) end else if (CVA6Cfg.MmuPresent && ex_s0) begin trans_id_o = lsu_ctrl_i.trans_id; valid_o = 1'b1; ex_o.valid = 1'b1; - pop_ld_o = 1'b1; // release lsu_bypass fifo + pop_ld_o = !stall_translation;//1'b1; // release lsu_bypass fifo end end @@ -372,8 +374,8 @@ module load_unit end else begin if (ypb_a_state_q == TRANSPARENT) begin paddr_q <= paddr; - be_q <= lsu_ctrl_i.be; - paddr_is_cacheable_q <= paddr_is_cacheable; + if (lsu_ctrl_i.valid) be_q <= lsu_ctrl_i.be; + if (lsu_ctrl_i.valid) paddr_is_cacheable_q <= paddr_is_cacheable; end ypb_a_state_q <= ypb_a_state_d; kill_req_q <= kill_req_d; diff --git a/core/store_buffer.sv b/core/store_buffer.sv index aab68fc850..75101ad31b 100644 --- a/core/store_buffer.sv +++ b/core/store_buffer.sv @@ -79,6 +79,8 @@ module store_buffer logic [$clog2(DEPTH_COMMIT)-1:0] commit_read_pointer_n, commit_read_pointer_q; logic [$clog2(DEPTH_COMMIT)-1:0] commit_write_pointer_n, commit_write_pointer_q; + logic pending_rvalid_n, pending_rvalid_q; + assign store_buffer_empty_o = (speculative_status_cnt_q == 0) & !valid_i & no_st_pending_o; // ---------------------------------------- // Speculative Queue - Core Interface @@ -177,11 +179,16 @@ module store_buffer direct_req_from_speculative = 1'b0; + pending_rvalid_n = pending_rvalid_q; + // there should be no commit when we are flushing // if the entry in the commit queue is valid and not speculative anymore we can issue this instruction if (commit_queue_q[commit_read_pointer_q].valid && !stall_st_pending_i) begin - ypb_store_req_o.preq = 1'b1; - if (ypb_store_rsp_i.pgnt) begin + ypb_store_req_o.preq = pending_rvalid_q ? 1'b0 : 1'b1; + if (ypb_store_rsp_i.pgnt) pending_rvalid_n = 1'b1; + + if (ypb_store_rsp_i.rvalid) begin + pending_rvalid_n = 1'b0; // we can evict it from the commit buffer commit_queue_n[commit_read_pointer_q].valid = 1'b0; // advance the read_pointer @@ -190,15 +197,13 @@ module store_buffer end end else if (speculative_queue_q[speculative_read_pointer_q].valid) begin if (commit_i && (commit_write_pointer_q == speculative_read_pointer_q) && !stall_st_pending_i) begin - ypb_store_req_o.preq = 1'b1; + ypb_store_req_o.preq = pending_rvalid_q ? '0 : 1'b1; direct_req_from_speculative = 1'b1; end end - // we ignore the rvalid signal for now as we assume that the store - // happened if we got a grant // shift the store request from the speculative buffer to the non-speculative - if (commit_i && !(ypb_store_rsp_i.pgnt && direct_req_from_speculative)) begin + if (commit_i && !(ypb_store_rsp_i.rvalid && direct_req_from_speculative)) begin commit_queue_n[commit_write_pointer_q] = speculative_queue_q[speculative_read_pointer_q]; commit_write_pointer_n = commit_write_pointer_n + 1'b1; commit_status_cnt++; @@ -255,11 +260,13 @@ module store_buffer speculative_read_pointer_q <= '0; speculative_write_pointer_q <= '0; speculative_status_cnt_q <= '0; + pending_rvalid_q <= 1'b0; end else begin speculative_queue_q <= speculative_queue_n; speculative_read_pointer_q <= speculative_read_pointer_n; speculative_write_pointer_q <= speculative_write_pointer_n; speculative_status_cnt_q <= speculative_status_cnt_n; + pending_rvalid_q <= pending_rvalid_n; end end diff --git a/core/store_unit.sv b/core/store_unit.sv index 355ebb51d8..f68d87665d 100644 --- a/core/store_unit.sv +++ b/core/store_unit.sv @@ -205,12 +205,11 @@ module store_unit trans_id_o = trans_id_q; valid_o = 1'b1; ex_o.valid = ex_s1; - end - if (ex_s0) begin + end else if (ex_s0) begin trans_id_o = lsu_ctrl_i.trans_id; valid_o = 1'b1; ex_o.valid = 1'b1; - pop_st_o = 1'b1; + pop_st_o = dtlb_hit_i; end end end diff --git a/core/zcmt_decoder.sv b/core/zcmt_decoder.sv index 06e31f8608..f524547cd5 100644 --- a/core/zcmt_decoder.sv +++ b/core/zcmt_decoder.sv @@ -81,7 +81,7 @@ module zcmt_decoder #( ypb_zcmt_req_o.size = 2'b10; ypb_zcmt_req_o.wdata = '0; ypb_zcmt_req_o.rready = '1; - ypb_zcmt_req_o.aid = 1'b1; + ypb_zcmt_req_o.aid = 1'b0; ypb_zcmt_req_o.kill_req = 1'b0; ypb_zcmt_req_o.vreq = 1'b0; ypb_zcmt_req_o.atop = ariane_pkg::AMO_NONE; @@ -91,13 +91,15 @@ module zcmt_decoder #( ypb_zcmt_req_o.preq = 1'b0; if (is_zcmt_instr_i) begin if (CVA6Cfg.XLEN == 32) begin - req_addr_d = {jvt_i.base, 6'b000000} + {24'h0, instr_i[7:2], 2'b00}; + req_addr_d = {jvt_i.base, 6'b000000} + {24'h0, instr_i[9:2], 2'b00}; ypb_zcmt_req_o.paddr = req_addr_d; ypb_zcmt_req_o.preq = 1'b1; // Always assert req fetch_stall_o = 1'b1; end else illegal_instr_o = 1'b1; if (!ypb_zcmt_rsp_i.pgnt) begin state_d = TABLE_WAIT_GNT; + end else begin + state_d = TABLE_WAIT_RVALID; end end else begin illegal_instr_o = illegal_instr_i; diff --git a/corev_apu/altera/Makefile b/corev_apu/altera/Makefile index f3f8983f75..e118135c75 100644 --- a/corev_apu/altera/Makefile +++ b/corev_apu/altera/Makefile @@ -52,7 +52,8 @@ all: create_project \ write_source_files \ write_timing_constraints \ generate_ips \ - sta + sta \ + rbf clean: $(RM) -rf *.rpt *.chg smart.log *.htm *.eqn *.pin *.sof *.pof db incremental_db *.summary *.smsg *.jdi $(ASSIGNMENT_FILES) @@ -72,9 +73,13 @@ create_project: @touch "$(PROJECT).qsf" $(QSYS_PATH)qsys-script --script=ip/interconnect.tcl $(QSYS_PATH)qsys-generate interconnect.qsys --quartus_project=ip/interconnect --synthesis + $(QSYS_PATH)qsys-script --script=ip/hps_cva6_altera.tcl + $(QSYS_PATH)qsys-generate system.qsys --quartus_project=ip/hps_cva6_altera --synthesis rm -f interconnect/*.v rm -f interconnect/*.vhd rm -f interconnect/synth/*.v + rm -f system/*.v + rm -f system/*.vhd write_settings: @echo "Reading from settings.csv and writing to $(PROJECT).qsf with modifications" @@ -108,6 +113,7 @@ write_search_paths: write_source_files: @find ./interconnect -type f -name "*.v" -o -name "*.sv" -o -name "*.svh" >> $(SOURCES_FILE) + @find ./system -type f -name "*.v" -o -name "*.sv" -o -name "*.svh" >> $(SOURCES_FILE) @echo $(var) @echo >> $(SOURCES_FILE) @echo "Reading from $(SOURCES_FILE) and writing to $(PROJECT).qsf with modifications" @@ -159,12 +165,16 @@ sta: asm @echo "Running Quartus Timing Analysis" $(QUARTUS_PATH)quartus_sta $(PROJECT) --do_report_timing +rbf: sta + @echo "Running Quartus Prime Programming File Generator" + $(QUARTUS_PATH)/quartus_pfg -c output_files/*.sof output_files/cva6-hps.rbf -o hps_path=u-boot-spl-dtb.hex + + clean: @echo "Cleaning project files" rm -f $(PROJECT).qsf $(PROJECT).qpf $(PROJECT).map.rpt $(PROJECT).fit.rpt $(PROJECT).asm.rpt $(PROJECT).sta.rpt rm -f interconnect.qsys* rm -f *.backup - rm -f *.hex rm -f *.txt rm -f *.ip rm -f ip/board.info @@ -191,6 +201,7 @@ clean: rm -rf interconnect rm -rf io_pll rm -rf iobuf + rm -rf system $(QUARTUS_PATH)quartus_ipgenerate --clean $(PROJECT) diff --git a/corev_apu/altera/io_standard_constraints.csv b/corev_apu/altera/io_standard_constraints.csv index e4fbc9e30e..9ac64b8fcc 100644 --- a/corev_apu/altera/io_standard_constraints.csv +++ b/corev_apu/altera/io_standard_constraints.csv @@ -5,3 +5,71 @@ IO_STANDARD "1.2 V" -to led[3] -entity cva6_altera IO_STANDARD "1.2 V" -to led[2] -entity cva6_altera IO_STANDARD "1.2 V" -to led[1] -entity cva6_altera IO_STANDARD "1.2 V" -to led[0] -entity cva6_altera +IO_STANDARD "1.8-V" -to hps_emac0_MDC -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_MDIO -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_RXD0 -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_RXD1 -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_RXD2 -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_RXD3 -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_RX_CLK -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_RX_CTL -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_TXD0 -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_TXD1 -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_TXD2 -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_TXD3 -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_TX_CLK -entity ghrd +IO_STANDARD "1.8-V" -to hps_emac0_TX_CTL -entity ghrd +IO_STANDARD "1.8-V" -to hps_i2c1_SCL -entity ghrd +IO_STANDARD "1.8-V" -to hps_i2c1_SDA -entity ghrd +IO_STANDARD "1.8-V" -to hps_jtag_tck -entity ghrd +IO_STANDARD "1.8-V" -to hps_jtag_tdo -entity ghrd +IO_STANDARD "1.8-V" -to hps_ref_clk -entity ghrd +IO_STANDARD "1.8 V" -to hps_sdmmc_CMD -entity ghrd +IO_STANDARD "1.8 V" -to hps_sdmmc_CCLK -entity ghrd +IO_STANDARD "1.8 V" -to hps_sdmmc_D0 -entity ghrd +IO_STANDARD "1.8 V" -to hps_sdmmc_D1 -entity ghrd +IO_STANDARD "1.8 V" -to hps_sdmmc_D2 -entity ghrd +IO_STANDARD "1.8 V" -to hps_sdmmc_D3 -entity ghrd +IO_STANDARD "1.8 V" -to hps_uart0_TX -entity ghrd +IO_STANDARD "1.8 V" -to hps_uart0_RX -entity ghrd +IO_STANDARD "TRUE DIFFERENTIAL SIGNALING" -to fpga_clk_100 -entity ghrd +CURRENT_STRENGTH_NEW 4MA -to hps_emac0_MDC -entity ghrd +CURRENT_STRENGTH_NEW 4MA -to hps_emac0_MDIO -entity ghrd +AUTO_OPEN_DRAIN_PINS ON -to hps_emac0_MDIO -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_emac0_MDIO -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_emac0_RXD0 -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_emac0_RXD1 -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_emac0_RXD2 -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_emac0_RXD3 -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_emac0_RX_CLK -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_emac0_RX_CTL -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_emac0_TXD0 -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_emac0_TXD1 -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_emac0_TXD2 -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_emac0_TXD3 -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_emac0_TX_CLK -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_emac0_TX_CTL -entity ghrd +CURRENT_STRENGTH_NEW 4MA -to hps_i2c1_SCL -entity ghrd +AUTO_OPEN_DRAIN_PINS ON -to hps_i2c1_SCL -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_i2c1_SCL -entity ghrd +CURRENT_STRENGTH_NEW 4MA -to hps_i2c1_SDA -entity ghrd +AUTO_OPEN_DRAIN_PINS ON -to hps_i2c1_SDA -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_i2c1_SDA -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_jtag_tck -entity ghrd +IO_STANDARD "1.8-V" -to hps_jtag_tdi -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_jtag_tdi -entity ghrd +CURRENT_STRENGTH_NEW 4MA -to hps_jtag_tdo -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_jtag_tms -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_sdmmc_CMD -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_sdmmc_CCLK -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_sdmmc_CMD -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_sdmmc_D0 -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_sdmmc_D0 -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_sdmmc_D1 -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_sdmmc_D1 -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_sdmmc_D2 -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_sdmmc_D2 -entity ghrd +CURRENT_STRENGTH_NEW 8MA -to hps_sdmmc_D3 -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_sdmmc_D3 -entity ghrd +CURRENT_STRENGTH_NEW 4MA -to hps_uart0_TX -entity ghrd +WEAK_PULL_UP_RESISTOR ON -to hps_uart0_RX -entity ghrd \ No newline at end of file diff --git a/corev_apu/altera/ip/emif_cal.tcl b/corev_apu/altera/ip/emif_cal.tcl index 97f7a6f426..055eb91939 100644 --- a/corev_apu/altera/ip/emif_cal.tcl +++ b/corev_apu/altera/ip/emif_cal.tcl @@ -24,7 +24,7 @@ proc do_create_emif_cal {} { set_instance_parameter_value emif_cal_0 {DIAG_SIM_VERBOSE} {0} set_instance_parameter_value emif_cal_0 {DIAG_SYNTH_FOR_SIM} {0} set_instance_parameter_value emif_cal_0 {ENABLE_DDRT} {0} - set_instance_parameter_value emif_cal_0 {NUM_CALBUS_INTERFACE} {1} + set_instance_parameter_value emif_cal_0 {NUM_CALBUS_INTERFACE} {2} set_instance_parameter_value emif_cal_0 {PHY_DDRT_EXPORT_CLK_STP_IF} {0} set_instance_parameter_value emif_cal_0 {SHORT_QSYS_INTERFACE_NAMES} {1} set_instance_property emif_cal_0 AUTO_EXPORT true diff --git a/corev_apu/altera/ip/hps_cva6_altera.tcl b/corev_apu/altera/ip/hps_cva6_altera.tcl new file mode 100644 index 0000000000..7e667be364 --- /dev/null +++ b/corev_apu/altera/ip/hps_cva6_altera.tcl @@ -0,0 +1,2542 @@ +package require -exact qsys 24.1 + +# create the system "system" +proc do_create_system {} { + # create the system + create_system system + set_project_property BOARD {default} + set_project_property DEVICE {AGFB014R24B2E2V} + set_project_property DEVICE_FAMILY {Agilex 7} + set_project_property HIDE_FROM_IP_CATALOG {false} + set_use_testbench_naming_pattern 0 {} + + # add HDL parameters + + # add the components + add_component hps ip/system/hps.ip intel_agilex_hps hps 24.0.0 + load_component hps + set_component_parameter_value CLK_MAIN_PLL_SOURCE2 {0} + set_component_parameter_value CLK_PERI_PLL_SOURCE2 {0} + set_component_parameter_value CM_Mode {N/A} + set_component_parameter_value CM_PinMuxing {Unused} + set_component_parameter_value CONFIG_HPS_DIV_GPIO {1} + set_component_parameter_value CTI_Enable {0} + set_component_parameter_value CUSTOM_MPU_CLK {800.0} + set_component_parameter_value DDR_ATB_Enable {0} + set_component_parameter_value DEBUG_APB_Enable {0} + set_component_parameter_value DISABLE_PERI_PLL {0} + set_component_parameter_value DMA_Enable {No No No No No No No No} + set_component_parameter_value EMAC0_CLK {250} + set_component_parameter_value EMAC0_Mode {RGMII_with_MDIO} + set_component_parameter_value EMAC0_PTP {0} + set_component_parameter_value EMAC0_PinMuxing {IO} + set_component_parameter_value EMAC0_SWITCH_Enable {0} + set_component_parameter_value EMAC1_CLK {250} + set_component_parameter_value EMAC1_Mode {N/A} + set_component_parameter_value EMAC1_PTP {0} + set_component_parameter_value EMAC1_PinMuxing {Unused} + set_component_parameter_value EMAC1_SWITCH_Enable {0} + set_component_parameter_value EMAC2_CLK {250} + set_component_parameter_value EMAC2_Mode {N/A} + set_component_parameter_value EMAC2_PTP {0} + set_component_parameter_value EMAC2_PinMuxing {Unused} + set_component_parameter_value EMAC2_SWITCH_Enable {0} + set_component_parameter_value EMAC_PTP_REF_CLK {100} + set_component_parameter_value EMIF_CONDUIT_Enable {1} + set_component_parameter_value EMIF_DDR_WIDTH {64} + set_component_parameter_value F2H_FREE_CLK_Enable {0} + set_component_parameter_value F2H_FREE_CLK_FREQ {200} + set_component_parameter_value F2SINTERRUPT_Enable {0} + set_component_parameter_value F2S_ADDRESS_WIDTH {32} + set_component_parameter_value F2S_Route_config {2} + set_component_parameter_value F2S_Width {3} + set_component_parameter_value F2S_mode {1} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_EMAC0_GTX_CLK {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_EMAC0_MD_CLK {2.5} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_EMAC1_GTX_CLK {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_EMAC1_MD_CLK {2.5} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_EMAC2_GTX_CLK {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_EMAC2_MD_CLK {2.5} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_I2C0_CLK {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_I2C1_CLK {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_I2CEMAC0_CLK {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_I2CEMAC1_CLK {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_I2CEMAC2_CLK {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_SDMMC_CCLK {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_SPIM0_SCLK_OUT {125} + set_component_parameter_value FPGA_PERIPHERAL_OUTPUT_CLOCK_FREQ_SPIM1_SCLK_OUT {125} + set_component_parameter_value FP_EMIF_CONDUIT_Enable {1} + set_component_parameter_value FP_F2S_Width {0} + set_component_parameter_value GP_Enable {0} + set_component_parameter_value H2F_COLD_RST_Enable {0} + set_component_parameter_value H2F_PENDING_RST_Enable {0} + set_component_parameter_value H2F_USER0_CLK_Enable {0} + set_component_parameter_value H2F_USER0_CLK_FREQ {500} + set_component_parameter_value H2F_USER1_CLK_Enable {0} + set_component_parameter_value H2F_USER1_CLK_FREQ {500} + set_component_parameter_value HNOC_Interface_Mode {0} + set_component_parameter_value HPS_DIV_GPIO_FREQ2 {100} + set_component_parameter_value HPS_IOA_10_open_drain_en {0} + set_component_parameter_value HPS_IOA_11_open_drain_en {0} + set_component_parameter_value HPS_IOA_12_open_drain_en {0} + set_component_parameter_value HPS_IOA_13_open_drain_en {0} + set_component_parameter_value HPS_IOA_14_open_drain_en {0} + set_component_parameter_value HPS_IOA_15_open_drain_en {0} + set_component_parameter_value HPS_IOA_16_open_drain_en {0} + set_component_parameter_value HPS_IOA_17_open_drain_en {0} + set_component_parameter_value HPS_IOA_18_open_drain_en {0} + set_component_parameter_value HPS_IOA_19_open_drain_en {0} + set_component_parameter_value HPS_IOA_1_open_drain_en {0} + set_component_parameter_value HPS_IOA_20_open_drain_en {0} + set_component_parameter_value HPS_IOA_21_open_drain_en {0} + set_component_parameter_value HPS_IOA_22_open_drain_en {0} + set_component_parameter_value HPS_IOA_23_open_drain_en {0} + set_component_parameter_value HPS_IOA_24_open_drain_en {0} + set_component_parameter_value HPS_IOA_2_open_drain_en {0} + set_component_parameter_value HPS_IOA_3_open_drain_en {0} + set_component_parameter_value HPS_IOA_4_open_drain_en {0} + set_component_parameter_value HPS_IOA_5_open_drain_en {0} + set_component_parameter_value HPS_IOA_6_open_drain_en {0} + set_component_parameter_value HPS_IOA_7_open_drain_en {0} + set_component_parameter_value HPS_IOA_8_open_drain_en {0} + set_component_parameter_value HPS_IOA_9_open_drain_en {0} + set_component_parameter_value HPS_IOB_10_open_drain_en {0} + set_component_parameter_value HPS_IOB_11_open_drain_en {0} + set_component_parameter_value HPS_IOB_12_open_drain_en {0} + set_component_parameter_value HPS_IOB_13_open_drain_en {0} + set_component_parameter_value HPS_IOB_14_open_drain_en {0} + set_component_parameter_value HPS_IOB_15_open_drain_en {0} + set_component_parameter_value HPS_IOB_16_open_drain_en {0} + set_component_parameter_value HPS_IOB_17_open_drain_en {0} + set_component_parameter_value HPS_IOB_18_open_drain_en {0} + set_component_parameter_value HPS_IOB_19_open_drain_en {0} + set_component_parameter_value HPS_IOB_1_open_drain_en {0} + set_component_parameter_value HPS_IOB_20_open_drain_en {0} + set_component_parameter_value HPS_IOB_21_open_drain_en {0} + set_component_parameter_value HPS_IOB_22_open_drain_en {0} + set_component_parameter_value HPS_IOB_23_open_drain_en {0} + set_component_parameter_value HPS_IOB_24_open_drain_en {0} + set_component_parameter_value HPS_IOB_2_open_drain_en {0} + set_component_parameter_value HPS_IOB_3_open_drain_en {0} + set_component_parameter_value HPS_IOB_4_open_drain_en {0} + set_component_parameter_value HPS_IOB_5_open_drain_en {0} + set_component_parameter_value HPS_IOB_6_open_drain_en {0} + set_component_parameter_value HPS_IOB_7_open_drain_en {0} + set_component_parameter_value HPS_IOB_8_open_drain_en {0} + set_component_parameter_value HPS_IOB_9_open_drain_en {0} + set_component_parameter_value HPS_IO_Enable {NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE EMAC0:TX_CLK EMAC0:TX_CTL EMAC0:RX_CLK EMAC0:RX_CTL EMAC0:TXD0 EMAC0:TXD1 EMAC0:RXD0 EMAC0:RXD1 EMAC0:TXD2 EMAC0:TXD3 EMAC0:RXD2 EMAC0:RXD3 GPIO NONE UART0:TX UART0:RX NONE NONE I2C1:SDA I2C1:SCL JTAG:TCK JTAG:TMS JTAG:TDO JTAG:TDI SDMMC:D0 SDMMC:CMD SDMMC:CCLK SDMMC:D1 SDMMC:D2 SDMMC:D3 HPS_OSC_CLK NONE NONE NONE MDIO0:MDIO MDIO0:MDC} + set_component_parameter_value I2C0_Mode {N/A} + set_component_parameter_value I2C0_PinMuxing {Unused} + set_component_parameter_value I2C1_Mode {default} + set_component_parameter_value I2C1_PinMuxing {IO} + set_component_parameter_value I2CEMAC0_Mode {N/A} + set_component_parameter_value I2CEMAC0_PinMuxing {Unused} + set_component_parameter_value I2CEMAC1_Mode {N/A} + set_component_parameter_value I2CEMAC1_PinMuxing {Unused} + set_component_parameter_value I2CEMAC2_Mode {N/A} + set_component_parameter_value I2CEMAC2_PinMuxing {Unused} + set_component_parameter_value INTERNAL_OSCILLATOR_ENABLE {60} + set_component_parameter_value IO_INPUT_DELAY0 {0} + set_component_parameter_value IO_INPUT_DELAY1 {0} + set_component_parameter_value IO_INPUT_DELAY10 {0} + set_component_parameter_value IO_INPUT_DELAY11 {0} + set_component_parameter_value IO_INPUT_DELAY12 {0} + set_component_parameter_value IO_INPUT_DELAY13 {0} + set_component_parameter_value IO_INPUT_DELAY14 {0} + set_component_parameter_value IO_INPUT_DELAY15 {0} + set_component_parameter_value IO_INPUT_DELAY16 {0} + set_component_parameter_value IO_INPUT_DELAY17 {0} + set_component_parameter_value IO_INPUT_DELAY18 {0} + set_component_parameter_value IO_INPUT_DELAY19 {0} + set_component_parameter_value IO_INPUT_DELAY2 {0} + set_component_parameter_value IO_INPUT_DELAY20 {0} + set_component_parameter_value IO_INPUT_DELAY21 {0} + set_component_parameter_value IO_INPUT_DELAY22 {0} + set_component_parameter_value IO_INPUT_DELAY23 {0} + set_component_parameter_value IO_INPUT_DELAY24 {0} + set_component_parameter_value IO_INPUT_DELAY25 {0} + set_component_parameter_value IO_INPUT_DELAY26 {0} + set_component_parameter_value IO_INPUT_DELAY27 {0} + set_component_parameter_value IO_INPUT_DELAY28 {0} + set_component_parameter_value IO_INPUT_DELAY29 {0} + set_component_parameter_value IO_INPUT_DELAY3 {0} + set_component_parameter_value IO_INPUT_DELAY30 {0} + set_component_parameter_value IO_INPUT_DELAY31 {0} + set_component_parameter_value IO_INPUT_DELAY32 {0} + set_component_parameter_value IO_INPUT_DELAY33 {0} + set_component_parameter_value IO_INPUT_DELAY34 {0} + set_component_parameter_value IO_INPUT_DELAY35 {0} + set_component_parameter_value IO_INPUT_DELAY36 {0} + set_component_parameter_value IO_INPUT_DELAY37 {0} + set_component_parameter_value IO_INPUT_DELAY38 {0} + set_component_parameter_value IO_INPUT_DELAY39 {0} + set_component_parameter_value IO_INPUT_DELAY4 {0} + set_component_parameter_value IO_INPUT_DELAY40 {0} + set_component_parameter_value IO_INPUT_DELAY41 {0} + set_component_parameter_value IO_INPUT_DELAY42 {0} + set_component_parameter_value IO_INPUT_DELAY43 {0} + set_component_parameter_value IO_INPUT_DELAY44 {0} + set_component_parameter_value IO_INPUT_DELAY45 {0} + set_component_parameter_value IO_INPUT_DELAY46 {0} + set_component_parameter_value IO_INPUT_DELAY47 {0} + set_component_parameter_value IO_INPUT_DELAY5 {0} + set_component_parameter_value IO_INPUT_DELAY6 {0} + set_component_parameter_value IO_INPUT_DELAY7 {0} + set_component_parameter_value IO_INPUT_DELAY8 {0} + set_component_parameter_value IO_INPUT_DELAY9 {0} + set_component_parameter_value IO_OUTPUT_DELAY0 {0} + set_component_parameter_value IO_OUTPUT_DELAY1 {0} + set_component_parameter_value IO_OUTPUT_DELAY10 {0} + set_component_parameter_value IO_OUTPUT_DELAY11 {0} + set_component_parameter_value IO_OUTPUT_DELAY12 {0} + set_component_parameter_value IO_OUTPUT_DELAY13 {0} + set_component_parameter_value IO_OUTPUT_DELAY14 {0} + set_component_parameter_value IO_OUTPUT_DELAY15 {0} + set_component_parameter_value IO_OUTPUT_DELAY16 {0} + set_component_parameter_value IO_OUTPUT_DELAY17 {0} + set_component_parameter_value IO_OUTPUT_DELAY18 {0} + set_component_parameter_value IO_OUTPUT_DELAY19 {0} + set_component_parameter_value IO_OUTPUT_DELAY2 {0} + set_component_parameter_value IO_OUTPUT_DELAY20 {0} + set_component_parameter_value IO_OUTPUT_DELAY21 {0} + set_component_parameter_value IO_OUTPUT_DELAY22 {0} + set_component_parameter_value IO_OUTPUT_DELAY23 {0} + set_component_parameter_value IO_OUTPUT_DELAY24 {0} + set_component_parameter_value IO_OUTPUT_DELAY25 {0} + set_component_parameter_value IO_OUTPUT_DELAY26 {0} + set_component_parameter_value IO_OUTPUT_DELAY27 {0} + set_component_parameter_value IO_OUTPUT_DELAY28 {0} + set_component_parameter_value IO_OUTPUT_DELAY29 {0} + set_component_parameter_value IO_OUTPUT_DELAY3 {0} + set_component_parameter_value IO_OUTPUT_DELAY30 {0} + set_component_parameter_value IO_OUTPUT_DELAY31 {0} + set_component_parameter_value IO_OUTPUT_DELAY32 {0} + set_component_parameter_value IO_OUTPUT_DELAY33 {0} + set_component_parameter_value IO_OUTPUT_DELAY34 {0} + set_component_parameter_value IO_OUTPUT_DELAY35 {0} + set_component_parameter_value IO_OUTPUT_DELAY36 {0} + set_component_parameter_value IO_OUTPUT_DELAY37 {0} + set_component_parameter_value IO_OUTPUT_DELAY38 {0} + set_component_parameter_value IO_OUTPUT_DELAY39 {0} + set_component_parameter_value IO_OUTPUT_DELAY4 {0} + set_component_parameter_value IO_OUTPUT_DELAY40 {0} + set_component_parameter_value IO_OUTPUT_DELAY41 {0} + set_component_parameter_value IO_OUTPUT_DELAY42 {0} + set_component_parameter_value IO_OUTPUT_DELAY43 {0} + set_component_parameter_value IO_OUTPUT_DELAY44 {0} + set_component_parameter_value IO_OUTPUT_DELAY45 {0} + set_component_parameter_value IO_OUTPUT_DELAY46 {0} + set_component_parameter_value IO_OUTPUT_DELAY47 {0} + set_component_parameter_value IO_OUTPUT_DELAY5 {0} + set_component_parameter_value IO_OUTPUT_DELAY6 {0} + set_component_parameter_value IO_OUTPUT_DELAY7 {0} + set_component_parameter_value IO_OUTPUT_DELAY8 {0} + set_component_parameter_value IO_OUTPUT_DELAY9 {0} + set_component_parameter_value IPXACT_Enable {0} + set_component_parameter_value L3_MAIN_FREE_CLK {400} + set_component_parameter_value L4_SYS_FREE_CLK {2} + set_component_parameter_value LWH2F_ADDRESS_WIDTH {21} + set_component_parameter_value LWH2F_Enable {1} + set_component_parameter_value MAINPLL_FDIV_EN {0} + set_component_parameter_value MANUAL_CLK_EMACA_SOURCE {0} + set_component_parameter_value MANUAL_CLK_EMACB_SOURCE {1} + set_component_parameter_value MANUAL_CLK_EMAC_PTP_SOURCE {1} + set_component_parameter_value MANUAL_CLK_GPIO_SOURCE {1} + set_component_parameter_value MANUAL_CLK_MPU_SOURCE {0} + set_component_parameter_value MANUAL_CLK_NOC_SOURCE {1} + set_component_parameter_value MANUAL_CLK_PSI_SOURCE {0} + set_component_parameter_value MANUAL_CLK_S2F_USER0_SOURCE {0} + set_component_parameter_value MANUAL_CLK_S2F_USER1_SOURCE {0} + set_component_parameter_value MANUAL_CLK_SDMMC_SOURCE {1} + set_component_parameter_value MANUAL_CLK_SRC_EN {0} + set_component_parameter_value MANUAL_MAINPLL_C0 {1000.0} + set_component_parameter_value MANUAL_MAINPLL_C2 {500.0} + set_component_parameter_value MANUAL_MAINPLL_C3 {200.0} + set_component_parameter_value MANUAL_MAINPLL_CFREQ_EN {0} + set_component_parameter_value MANUAL_PERPLL_C0 {1200.0} + set_component_parameter_value MANUAL_PERPLL_C2 {480.0} + set_component_parameter_value MANUAL_PERPLL_C3 {200.0} + set_component_parameter_value MANUAL_PERPLL_CFREQ_EN {0} + set_component_parameter_value MPU_EVENTS_Enable {1} + set_component_parameter_value Mem_Interleave_Enable {0} + set_component_parameter_value NAND_Mode {N/A} + set_component_parameter_value NAND_PinMuxing {Unused} + set_component_parameter_value NOCDIV_CS_ATCLK {0} + set_component_parameter_value NOCDIV_CS_PDBGCLK {2} + set_component_parameter_value NOCDIV_CS_TRACECLK {0} + set_component_parameter_value NOCDIV_L4MAINCLK {0} + set_component_parameter_value NOCDIV_L4MPCLK {1} + set_component_parameter_value NOCDIV_L4SPCLK {2} + set_component_parameter_value OVERIDE_PERI_PLL {0} + set_component_parameter_value PERI_PLL_MANUAL_VCO_FREQ {2000} + set_component_parameter_value PERPLL_FDIV_EN {0} + set_component_parameter_value PLL_CLK0 {Unused} + set_component_parameter_value PLL_CLK1 {Unused} + set_component_parameter_value PLL_CLK2 {Unused} + set_component_parameter_value PLL_CLK3 {Unused} + set_component_parameter_value PLL_CLK4 {Unused} + set_component_parameter_value PSI_CLK_FREQ {500} + set_component_parameter_value RUN_INTERNAL_BUILD_CHECKS {0} + set_component_parameter_value S2FINTERRUPT_CLOCKPERIPHERAL_Enable {0} + set_component_parameter_value S2FINTERRUPT_DMA_Enable {0} + set_component_parameter_value S2FINTERRUPT_EMAC0_Enable {0} + set_component_parameter_value S2FINTERRUPT_EMAC1_Enable {0} + set_component_parameter_value S2FINTERRUPT_EMAC2_Enable {0} + set_component_parameter_value S2FINTERRUPT_GPIO_Enable {0} + set_component_parameter_value S2FINTERRUPT_I2C0_Enable {0} + set_component_parameter_value S2FINTERRUPT_I2C1_Enable {0} + set_component_parameter_value S2FINTERRUPT_I2CEMAC0_Enable {0} + set_component_parameter_value S2FINTERRUPT_I2CEMAC1_Enable {0} + set_component_parameter_value S2FINTERRUPT_I2CEMAC2_Enable {0} + set_component_parameter_value S2FINTERRUPT_L4TIMER_Enable {0} + set_component_parameter_value S2FINTERRUPT_NAND_Enable {0} + set_component_parameter_value S2FINTERRUPT_SDMMC_Enable {1} + set_component_parameter_value S2FINTERRUPT_SPIM0_Enable {0} + set_component_parameter_value S2FINTERRUPT_SPIM1_Enable {0} + set_component_parameter_value S2FINTERRUPT_SPIS0_Enable {0} + set_component_parameter_value S2FINTERRUPT_SPIS1_Enable {0} + set_component_parameter_value S2FINTERRUPT_SYSTEMMANAGER_Enable {0} + set_component_parameter_value S2FINTERRUPT_SYSTIMER_Enable {0} + set_component_parameter_value S2FINTERRUPT_UART0_Enable {0} + set_component_parameter_value S2FINTERRUPT_UART1_Enable {0} + set_component_parameter_value S2FINTERRUPT_USB0_Enable {0} + set_component_parameter_value S2FINTERRUPT_USB1_Enable {0} + set_component_parameter_value S2FINTERRUPT_WATCHDOG_Enable {0} + set_component_parameter_value S2F_ADDRESS_WIDTH {32} + set_component_parameter_value S2F_Width {2} + set_component_parameter_value SDMMC_Mode {4-bit} + set_component_parameter_value SDMMC_PinMuxing {IO} + set_component_parameter_value SDMMC_REF_CLK {200} + set_component_parameter_value SMMU_rsb_sid_const {0} + set_component_parameter_value SMMU_rsb_ssd_const {0} + set_component_parameter_value SMMU_sid_config {0} + set_component_parameter_value SMMU_ssd_config {0} + set_component_parameter_value SMMU_wsb_sid_const {0} + set_component_parameter_value SMMU_wsb_ssd_const {0} + set_component_parameter_value SPIM0_Mode {N/A} + set_component_parameter_value SPIM0_PinMuxing {Unused} + set_component_parameter_value SPIM1_Mode {N/A} + set_component_parameter_value SPIM1_PinMuxing {Unused} + set_component_parameter_value SPIS0_Mode {N/A} + set_component_parameter_value SPIS0_PinMuxing {Unused} + set_component_parameter_value SPIS1_Mode {N/A} + set_component_parameter_value SPIS1_PinMuxing {Unused} + set_component_parameter_value STM_Enable {0} + set_component_parameter_value TESTIOCTRL_DEBUGCLKSEL {16} + set_component_parameter_value TESTIOCTRL_MAINCLKSEL {8} + set_component_parameter_value TESTIOCTRL_PERICLKSEL {8} + set_component_parameter_value TEST_Enable {0} + set_component_parameter_value TPIU_Select {HPS Clock Manager} + set_component_parameter_value TRACE_Mode {N/A} + set_component_parameter_value TRACE_PinMuxing {Unused} + set_component_parameter_value UART0_Mode {No_flow_control} + set_component_parameter_value UART0_PinMuxing {IO} + set_component_parameter_value UART1_Mode {N/A} + set_component_parameter_value UART1_PinMuxing {Unused} + set_component_parameter_value USB0_Mode {N/A} + set_component_parameter_value USB0_PinMuxing {Unused} + set_component_parameter_value USB1_Mode {N/A} + set_component_parameter_value USB1_PinMuxing {Unused} + set_component_parameter_value USE_DEFAULT_MPU_CLK {0} + set_component_parameter_value W_RESET_ACTION {0} + set_component_parameter_value eosc1_clk_mhz {25.0} + set_component_parameter_value watchdog_reset {0} + set_component_project_property HIDE_FROM_IP_CATALOG {false} + save_component + load_instantiation hps + remove_instantiation_interfaces_and_ports + add_instantiation_interface h2f_mpu_events conduit INPUT + set_instantiation_interface_parameter_value h2f_mpu_events associatedClock {} + set_instantiation_interface_parameter_value h2f_mpu_events associatedReset {} + set_instantiation_interface_parameter_value h2f_mpu_events prSafe {false} + add_instantiation_interface_port h2f_mpu_events h2f_mpu_fpga_eventi fpga_eventi 1 STD_LOGIC Input + add_instantiation_interface_port h2f_mpu_events h2f_mpu_fpga_evento fpga_evento 1 STD_LOGIC Output + add_instantiation_interface_port h2f_mpu_events h2f_mpu_fpga_standbywfe fpga_standbywfe 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_mpu_events h2f_mpu_fpga_standbywfi fpga_standbywfi 4 STD_LOGIC_VECTOR Output + add_instantiation_interface hps_emif conduit INPUT + set_instantiation_interface_parameter_value hps_emif associatedClock {} + set_instantiation_interface_parameter_value hps_emif associatedReset {} + set_instantiation_interface_parameter_value hps_emif prSafe {false} + add_instantiation_interface_port hps_emif hps_emif_emif_to_hps emif_to_hps 4096 STD_LOGIC_VECTOR Input + add_instantiation_interface_port hps_emif hps_emif_hps_to_emif hps_to_emif 4096 STD_LOGIC_VECTOR Output + add_instantiation_interface_port hps_emif hps_emif_emif_to_gp emif_to_gp 1 STD_LOGIC Input + add_instantiation_interface_port hps_emif hps_emif_gp_to_emif gp_to_emif 2 STD_LOGIC_VECTOR Output + add_instantiation_interface h2f_sdmmc_interrupt interrupt INPUT + set_instantiation_interface_parameter_value h2f_sdmmc_interrupt associatedAddressablePoint {} + set_instantiation_interface_parameter_value h2f_sdmmc_interrupt associatedClock {} + set_instantiation_interface_parameter_value h2f_sdmmc_interrupt associatedReset {} + set_instantiation_interface_parameter_value h2f_sdmmc_interrupt bridgedReceiverOffset {0} + set_instantiation_interface_parameter_value h2f_sdmmc_interrupt bridgesToReceiver {} + set_instantiation_interface_parameter_value h2f_sdmmc_interrupt irqScheme {NONE} + add_instantiation_interface_port h2f_sdmmc_interrupt s2f_sdmmc_irq irq 1 STD_LOGIC Output + add_instantiation_interface hps_io conduit INPUT + set_instantiation_interface_parameter_value hps_io associatedClock {} + set_instantiation_interface_parameter_value hps_io associatedReset {} + set_instantiation_interface_parameter_value hps_io prSafe {false} + add_instantiation_interface_port hps_io EMAC0_TX_CLK EMAC0_TX_CLK 1 STD_LOGIC Output + add_instantiation_interface_port hps_io EMAC0_TXD0 EMAC0_TXD0 1 STD_LOGIC Output + add_instantiation_interface_port hps_io EMAC0_TXD1 EMAC0_TXD1 1 STD_LOGIC Output + add_instantiation_interface_port hps_io EMAC0_TXD2 EMAC0_TXD2 1 STD_LOGIC Output + add_instantiation_interface_port hps_io EMAC0_TXD3 EMAC0_TXD3 1 STD_LOGIC Output + add_instantiation_interface_port hps_io EMAC0_RX_CTL EMAC0_RX_CTL 1 STD_LOGIC Input + add_instantiation_interface_port hps_io EMAC0_TX_CTL EMAC0_TX_CTL 1 STD_LOGIC Output + add_instantiation_interface_port hps_io EMAC0_RX_CLK EMAC0_RX_CLK 1 STD_LOGIC Input + add_instantiation_interface_port hps_io EMAC0_RXD0 EMAC0_RXD0 1 STD_LOGIC Input + add_instantiation_interface_port hps_io EMAC0_RXD1 EMAC0_RXD1 1 STD_LOGIC Input + add_instantiation_interface_port hps_io EMAC0_RXD2 EMAC0_RXD2 1 STD_LOGIC Input + add_instantiation_interface_port hps_io EMAC0_RXD3 EMAC0_RXD3 1 STD_LOGIC Input + add_instantiation_interface_port hps_io EMAC0_MDIO EMAC0_MDIO 1 STD_LOGIC Bidir + add_instantiation_interface_port hps_io EMAC0_MDC EMAC0_MDC 1 STD_LOGIC Output + add_instantiation_interface_port hps_io SDMMC_CMD SDMMC_CMD 1 STD_LOGIC Bidir + add_instantiation_interface_port hps_io SDMMC_D0 SDMMC_D0 1 STD_LOGIC Bidir + add_instantiation_interface_port hps_io SDMMC_D1 SDMMC_D1 1 STD_LOGIC Bidir + add_instantiation_interface_port hps_io SDMMC_D2 SDMMC_D2 1 STD_LOGIC Bidir + add_instantiation_interface_port hps_io SDMMC_D3 SDMMC_D3 1 STD_LOGIC Bidir + add_instantiation_interface_port hps_io SDMMC_CCLK SDMMC_CCLK 1 STD_LOGIC Output + add_instantiation_interface_port hps_io UART0_RX UART0_RX 1 STD_LOGIC Input + add_instantiation_interface_port hps_io UART0_TX UART0_TX 1 STD_LOGIC Output + add_instantiation_interface_port hps_io I2C1_SDA I2C1_SDA 1 STD_LOGIC Bidir + add_instantiation_interface_port hps_io I2C1_SCL I2C1_SCL 1 STD_LOGIC Bidir + add_instantiation_interface_port hps_io gpio1_io0 gpio1_io0 1 STD_LOGIC Bidir + add_instantiation_interface_port hps_io jtag_tck jtag_tck 1 STD_LOGIC Input + add_instantiation_interface_port hps_io jtag_tms jtag_tms 1 STD_LOGIC Input + add_instantiation_interface_port hps_io jtag_tdo jtag_tdo 1 STD_LOGIC Output + add_instantiation_interface_port hps_io jtag_tdi jtag_tdi 1 STD_LOGIC Input + add_instantiation_interface_port hps_io hps_osc_clk hps_osc_clk 1 STD_LOGIC Input + add_instantiation_interface h2f_reset reset OUTPUT + set_instantiation_interface_parameter_value h2f_reset associatedClock {} + set_instantiation_interface_parameter_value h2f_reset associatedDirectReset {} + set_instantiation_interface_parameter_value h2f_reset associatedResetSinks {none} + set_instantiation_interface_parameter_value h2f_reset synchronousEdges {NONE} + add_instantiation_interface_port h2f_reset h2f_rst reset 1 STD_LOGIC Output + add_instantiation_interface h2f_axi_clock clock INPUT + set_instantiation_interface_parameter_value h2f_axi_clock clockRate {0} + set_instantiation_interface_parameter_value h2f_axi_clock externallyDriven {false} + set_instantiation_interface_parameter_value h2f_axi_clock ptfSchematicName {} + add_instantiation_interface_port h2f_axi_clock h2f_axi_clk clk 1 STD_LOGIC Input + add_instantiation_interface h2f_axi_reset reset INPUT + set_instantiation_interface_parameter_value h2f_axi_reset associatedClock {h2f_axi_clock} + set_instantiation_interface_parameter_value h2f_axi_reset synchronousEdges {DEASSERT} + add_instantiation_interface_port h2f_axi_reset h2f_axi_rst_n reset_n 1 STD_LOGIC Input + add_instantiation_interface h2f_axi_master axi4 OUTPUT + set_instantiation_interface_parameter_value h2f_axi_master associatedClock {h2f_axi_clock} + set_instantiation_interface_parameter_value h2f_axi_master associatedReset {h2f_axi_reset} + set_instantiation_interface_parameter_value h2f_axi_master combinedIssuingCapability {16} + set_instantiation_interface_parameter_value h2f_axi_master issuesFIXEDBursts {true} + set_instantiation_interface_parameter_value h2f_axi_master issuesINCRBursts {true} + set_instantiation_interface_parameter_value h2f_axi_master issuesWRAPBursts {true} + set_instantiation_interface_parameter_value h2f_axi_master maximumOutstandingReads {1} + set_instantiation_interface_parameter_value h2f_axi_master maximumOutstandingTransactions {1} + set_instantiation_interface_parameter_value h2f_axi_master maximumOutstandingWrites {1} + set_instantiation_interface_parameter_value h2f_axi_master poison {false} + set_instantiation_interface_parameter_value h2f_axi_master readIssuingCapability {16} + set_instantiation_interface_parameter_value h2f_axi_master traceSignals {false} + set_instantiation_interface_parameter_value h2f_axi_master trustzoneAware {true} + set_instantiation_interface_parameter_value h2f_axi_master uniqueIdSupport {false} + set_instantiation_interface_parameter_value h2f_axi_master wakeupSignals {false} + set_instantiation_interface_parameter_value h2f_axi_master writeIssuingCapability {16} + add_instantiation_interface_port h2f_axi_master h2f_AWID awid 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_AWADDR awaddr 32 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_AWLEN awlen 8 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_AWSIZE awsize 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_AWBURST awburst 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_AWLOCK awlock 1 STD_LOGIC Output + add_instantiation_interface_port h2f_axi_master h2f_AWCACHE awcache 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_AWPROT awprot 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_AWVALID awvalid 1 STD_LOGIC Output + add_instantiation_interface_port h2f_axi_master h2f_AWREADY awready 1 STD_LOGIC Input + add_instantiation_interface_port h2f_axi_master h2f_WDATA wdata 64 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_WSTRB wstrb 8 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_WLAST wlast 1 STD_LOGIC Output + add_instantiation_interface_port h2f_axi_master h2f_WVALID wvalid 1 STD_LOGIC Output + add_instantiation_interface_port h2f_axi_master h2f_WREADY wready 1 STD_LOGIC Input + add_instantiation_interface_port h2f_axi_master h2f_BID bid 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_axi_master h2f_BRESP bresp 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_axi_master h2f_BVALID bvalid 1 STD_LOGIC Input + add_instantiation_interface_port h2f_axi_master h2f_BREADY bready 1 STD_LOGIC Output + add_instantiation_interface_port h2f_axi_master h2f_ARID arid 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_ARADDR araddr 32 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_ARLEN arlen 8 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_ARSIZE arsize 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_ARBURST arburst 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_ARLOCK arlock 1 STD_LOGIC Output + add_instantiation_interface_port h2f_axi_master h2f_ARCACHE arcache 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_ARPROT arprot 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_axi_master h2f_ARVALID arvalid 1 STD_LOGIC Output + add_instantiation_interface_port h2f_axi_master h2f_ARREADY arready 1 STD_LOGIC Input + add_instantiation_interface_port h2f_axi_master h2f_RID rid 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_axi_master h2f_RDATA rdata 64 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_axi_master h2f_RRESP rresp 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_axi_master h2f_RLAST rlast 1 STD_LOGIC Input + add_instantiation_interface_port h2f_axi_master h2f_RVALID rvalid 1 STD_LOGIC Input + add_instantiation_interface_port h2f_axi_master h2f_RREADY rready 1 STD_LOGIC Output + add_instantiation_interface h2f_lw_axi_clock clock INPUT + set_instantiation_interface_parameter_value h2f_lw_axi_clock clockRate {0} + set_instantiation_interface_parameter_value h2f_lw_axi_clock externallyDriven {false} + set_instantiation_interface_parameter_value h2f_lw_axi_clock ptfSchematicName {} + add_instantiation_interface_port h2f_lw_axi_clock h2f_lw_axi_clk clk 1 STD_LOGIC Input + add_instantiation_interface h2f_lw_axi_reset reset INPUT + set_instantiation_interface_parameter_value h2f_lw_axi_reset associatedClock {h2f_lw_axi_clock} + set_instantiation_interface_parameter_value h2f_lw_axi_reset synchronousEdges {DEASSERT} + add_instantiation_interface_port h2f_lw_axi_reset h2f_lw_axi_rst_n reset_n 1 STD_LOGIC Input + add_instantiation_interface h2f_lw_axi_master axi4 OUTPUT + set_instantiation_interface_parameter_value h2f_lw_axi_master associatedClock {h2f_lw_axi_clock} + set_instantiation_interface_parameter_value h2f_lw_axi_master associatedReset {h2f_lw_axi_reset} + set_instantiation_interface_parameter_value h2f_lw_axi_master combinedIssuingCapability {16} + set_instantiation_interface_parameter_value h2f_lw_axi_master issuesFIXEDBursts {true} + set_instantiation_interface_parameter_value h2f_lw_axi_master issuesINCRBursts {true} + set_instantiation_interface_parameter_value h2f_lw_axi_master issuesWRAPBursts {true} + set_instantiation_interface_parameter_value h2f_lw_axi_master maximumOutstandingReads {1} + set_instantiation_interface_parameter_value h2f_lw_axi_master maximumOutstandingTransactions {1} + set_instantiation_interface_parameter_value h2f_lw_axi_master maximumOutstandingWrites {1} + set_instantiation_interface_parameter_value h2f_lw_axi_master poison {false} + set_instantiation_interface_parameter_value h2f_lw_axi_master readIssuingCapability {16} + set_instantiation_interface_parameter_value h2f_lw_axi_master traceSignals {false} + set_instantiation_interface_parameter_value h2f_lw_axi_master trustzoneAware {true} + set_instantiation_interface_parameter_value h2f_lw_axi_master uniqueIdSupport {false} + set_instantiation_interface_parameter_value h2f_lw_axi_master wakeupSignals {false} + set_instantiation_interface_parameter_value h2f_lw_axi_master writeIssuingCapability {16} + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWID awid 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWADDR awaddr 21 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWLEN awlen 8 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWSIZE awsize 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWBURST awburst 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWLOCK awlock 1 STD_LOGIC Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWCACHE awcache 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWPROT awprot 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWVALID awvalid 1 STD_LOGIC Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_AWREADY awready 1 STD_LOGIC Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_WDATA wdata 32 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_WSTRB wstrb 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_WLAST wlast 1 STD_LOGIC Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_WVALID wvalid 1 STD_LOGIC Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_WREADY wready 1 STD_LOGIC Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_BID bid 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_BRESP bresp 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_BVALID bvalid 1 STD_LOGIC Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_BREADY bready 1 STD_LOGIC Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARID arid 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARADDR araddr 21 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARLEN arlen 8 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARSIZE arsize 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARBURST arburst 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARLOCK arlock 1 STD_LOGIC Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARCACHE arcache 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARPROT arprot 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARVALID arvalid 1 STD_LOGIC Output + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_ARREADY arready 1 STD_LOGIC Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_RID rid 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_RDATA rdata 32 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_RRESP rresp 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_RLAST rlast 1 STD_LOGIC Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_RVALID rvalid 1 STD_LOGIC Input + add_instantiation_interface_port h2f_lw_axi_master h2f_lw_RREADY rready 1 STD_LOGIC Output + add_instantiation_interface f2h_axi_clock clock INPUT + set_instantiation_interface_parameter_value f2h_axi_clock clockRate {0} + set_instantiation_interface_parameter_value f2h_axi_clock externallyDriven {false} + set_instantiation_interface_parameter_value f2h_axi_clock ptfSchematicName {} + add_instantiation_interface_port f2h_axi_clock f2h_axi_clk clk 1 STD_LOGIC Input + add_instantiation_interface f2h_axi_reset reset INPUT + set_instantiation_interface_parameter_value f2h_axi_reset associatedClock {f2h_axi_clock} + set_instantiation_interface_parameter_value f2h_axi_reset synchronousEdges {DEASSERT} + add_instantiation_interface_port f2h_axi_reset f2h_axi_rst_n reset_n 1 STD_LOGIC Input + add_instantiation_interface f2h_axi_slave acelite INPUT + set_instantiation_interface_parameter_value f2h_axi_slave associatedClock {f2h_axi_clock} + set_instantiation_interface_parameter_value f2h_axi_slave associatedReset {f2h_axi_reset} + set_instantiation_interface_parameter_value f2h_axi_slave bridgesToMaster {} + set_instantiation_interface_parameter_value f2h_axi_slave combinedAcceptanceCapability {16} + set_instantiation_interface_parameter_value f2h_axi_slave dfhFeatureGuid {0} + set_instantiation_interface_parameter_value f2h_axi_slave dfhFeatureId {35} + set_instantiation_interface_parameter_value f2h_axi_slave dfhFeatureMajorVersion {0} + set_instantiation_interface_parameter_value f2h_axi_slave dfhFeatureMinorVersion {0} + set_instantiation_interface_parameter_value f2h_axi_slave dfhFeatureType {3} + set_instantiation_interface_parameter_value f2h_axi_slave dfhGroupId {0} + set_instantiation_interface_parameter_value f2h_axi_slave dfhParameterData {} + set_instantiation_interface_parameter_value f2h_axi_slave dfhParameterDataLength {} + set_instantiation_interface_parameter_value f2h_axi_slave dfhParameterId {} + set_instantiation_interface_parameter_value f2h_axi_slave dfhParameterName {} + set_instantiation_interface_parameter_value f2h_axi_slave dfhParameterVersion {} + set_instantiation_interface_parameter_value f2h_axi_slave maximumOutstandingReads {1} + set_instantiation_interface_parameter_value f2h_axi_slave maximumOutstandingTransactions {1} + set_instantiation_interface_parameter_value f2h_axi_slave maximumOutstandingWrites {1} + set_instantiation_interface_parameter_value f2h_axi_slave poison {false} + set_instantiation_interface_parameter_value f2h_axi_slave readAcceptanceCapability {16} + set_instantiation_interface_parameter_value f2h_axi_slave readDataReorderingDepth {8} + set_instantiation_interface_parameter_value f2h_axi_slave traceSignals {false} + set_instantiation_interface_parameter_value f2h_axi_slave trustzoneAware {true} + set_instantiation_interface_parameter_value f2h_axi_slave uniqueIdSupport {false} + set_instantiation_interface_parameter_value f2h_axi_slave wakeupSignals {false} + set_instantiation_interface_parameter_value f2h_axi_slave writeAcceptanceCapability {16} + add_instantiation_interface_port f2h_axi_slave f2h_AWID awid 5 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWADDR awaddr 32 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWLEN awlen 8 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWSIZE awsize 3 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWBURST awburst 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWLOCK awlock 1 STD_LOGIC Input + add_instantiation_interface_port f2h_axi_slave f2h_AWCACHE awcache 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWPROT awprot 3 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWVALID awvalid 1 STD_LOGIC Input + add_instantiation_interface_port f2h_axi_slave f2h_AWREADY awready 1 STD_LOGIC Output + add_instantiation_interface_port f2h_axi_slave f2h_AWQOS awqos 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_WDATA wdata 128 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_WSTRB wstrb 16 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_WLAST wlast 1 STD_LOGIC Input + add_instantiation_interface_port f2h_axi_slave f2h_WVALID wvalid 1 STD_LOGIC Input + add_instantiation_interface_port f2h_axi_slave f2h_WREADY wready 1 STD_LOGIC Output + add_instantiation_interface_port f2h_axi_slave f2h_BID bid 5 STD_LOGIC_VECTOR Output + add_instantiation_interface_port f2h_axi_slave f2h_BRESP bresp 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port f2h_axi_slave f2h_BVALID bvalid 1 STD_LOGIC Output + add_instantiation_interface_port f2h_axi_slave f2h_BREADY bready 1 STD_LOGIC Input + add_instantiation_interface_port f2h_axi_slave f2h_ARID arid 5 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARADDR araddr 32 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARLEN arlen 8 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARSIZE arsize 3 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARBURST arburst 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARLOCK arlock 1 STD_LOGIC Input + add_instantiation_interface_port f2h_axi_slave f2h_ARCACHE arcache 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARPROT arprot 3 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARVALID arvalid 1 STD_LOGIC Input + add_instantiation_interface_port f2h_axi_slave f2h_ARREADY arready 1 STD_LOGIC Output + add_instantiation_interface_port f2h_axi_slave f2h_ARQOS arqos 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_RID rid 5 STD_LOGIC_VECTOR Output + add_instantiation_interface_port f2h_axi_slave f2h_RDATA rdata 128 STD_LOGIC_VECTOR Output + add_instantiation_interface_port f2h_axi_slave f2h_RRESP rresp 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port f2h_axi_slave f2h_RLAST rlast 1 STD_LOGIC Output + add_instantiation_interface_port f2h_axi_slave f2h_RVALID rvalid 1 STD_LOGIC Output + add_instantiation_interface_port f2h_axi_slave f2h_RREADY rready 1 STD_LOGIC Input + add_instantiation_interface_port f2h_axi_slave f2h_AWDOMAIN awdomain 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWBAR awbar 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARDOMAIN ardomain 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARBAR arbar 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARSNOOP arsnoop 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWSNOOP awsnoop 3 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_ARUSER aruser 23 STD_LOGIC_VECTOR Input + add_instantiation_interface_port f2h_axi_slave f2h_AWUSER awuser 23 STD_LOGIC_VECTOR Input + save_instantiation + add_component hps_emif ip/system/hps_emif.ip altera_emif_fm_hps hps_emif 2.7.4 + load_component hps_emif + set_component_parameter_value BOARD_DDR3_AC_TO_CK_SKEW_NS {0.0} + set_component_parameter_value BOARD_DDR3_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_DDR3_BRD_SKEW_WITHIN_DQS_NS {0.02} + set_component_parameter_value BOARD_DDR3_DQS_TO_CK_SKEW_NS {0.02} + set_component_parameter_value BOARD_DDR3_IS_SKEW_WITHIN_AC_DESKEWED {1} + set_component_parameter_value BOARD_DDR3_IS_SKEW_WITHIN_DQS_DESKEWED {0} + set_component_parameter_value BOARD_DDR3_MAX_CK_DELAY_NS {0.6} + set_component_parameter_value BOARD_DDR3_MAX_DQS_DELAY_NS {0.6} + set_component_parameter_value BOARD_DDR3_PKG_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_DDR3_PKG_BRD_SKEW_WITHIN_DQS_NS {0.02} + set_component_parameter_value BOARD_DDR3_SKEW_BETWEEN_DIMMS_NS {0.05} + set_component_parameter_value BOARD_DDR3_SKEW_BETWEEN_DQS_NS {0.02} + set_component_parameter_value BOARD_DDR3_USER_AC_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR3_USER_AC_SLEW_RATE {2.0} + set_component_parameter_value BOARD_DDR3_USER_CK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_DDR3_USER_RCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR3_USER_RCLK_SLEW_RATE {5.0} + set_component_parameter_value BOARD_DDR3_USER_RDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR3_USER_RDATA_SLEW_RATE {2.5} + set_component_parameter_value BOARD_DDR3_USER_WCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR3_USER_WCLK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_DDR3_USER_WDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR3_USER_WDATA_SLEW_RATE {2.0} + set_component_parameter_value BOARD_DDR3_USE_DEFAULT_ISI_VALUES {1} + set_component_parameter_value BOARD_DDR3_USE_DEFAULT_SLEW_RATES {1} + set_component_parameter_value BOARD_DDR4_AC_TO_CK_SKEW_NS {0.0} + set_component_parameter_value BOARD_DDR4_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_DDR4_BRD_SKEW_WITHIN_DQS_NS {0.02} + set_component_parameter_value BOARD_DDR4_DQS_TO_CK_SKEW_NS {0.02} + set_component_parameter_value BOARD_DDR4_IS_SKEW_WITHIN_AC_DESKEWED {0} + set_component_parameter_value BOARD_DDR4_IS_SKEW_WITHIN_DQS_DESKEWED {0} + set_component_parameter_value BOARD_DDR4_MAX_CK_DELAY_NS {0.6} + set_component_parameter_value BOARD_DDR4_MAX_DQS_DELAY_NS {0.6} + set_component_parameter_value BOARD_DDR4_PKG_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_DDR4_PKG_BRD_SKEW_WITHIN_DQS_NS {0.02} + set_component_parameter_value BOARD_DDR4_SKEW_BETWEEN_DIMMS_NS {0.05} + set_component_parameter_value BOARD_DDR4_SKEW_BETWEEN_DQS_NS {0.02} + set_component_parameter_value BOARD_DDR4_USER_AC_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR4_USER_AC_SLEW_RATE {2.0} + set_component_parameter_value BOARD_DDR4_USER_CK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_DDR4_USER_RCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR4_USER_RCLK_SLEW_RATE {8.0} + set_component_parameter_value BOARD_DDR4_USER_RDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR4_USER_RDATA_SLEW_RATE {4.0} + set_component_parameter_value BOARD_DDR4_USER_WCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR4_USER_WCLK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_DDR4_USER_WDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_DDR4_USER_WDATA_SLEW_RATE {2.0} + set_component_parameter_value BOARD_DDR4_USE_DEFAULT_ISI_VALUES {1} + set_component_parameter_value BOARD_DDR4_USE_DEFAULT_SLEW_RATES {1} + set_component_parameter_value BOARD_DDRT_AC_TO_CK_SKEW_NS {0.0} + set_component_parameter_value BOARD_DDRT_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_DDRT_BRD_SKEW_WITHIN_DQS_NS {0.02} + set_component_parameter_value BOARD_DDRT_DQS_TO_CK_SKEW_NS {0.02} + set_component_parameter_value BOARD_DDRT_IS_SKEW_WITHIN_AC_DESKEWED {0} + set_component_parameter_value BOARD_DDRT_IS_SKEW_WITHIN_DQS_DESKEWED {1} + set_component_parameter_value BOARD_DDRT_MAX_CK_DELAY_NS {0.6} + set_component_parameter_value BOARD_DDRT_MAX_DQS_DELAY_NS {0.6} + set_component_parameter_value BOARD_DDRT_PKG_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_DDRT_PKG_BRD_SKEW_WITHIN_DQS_NS {0.02} + set_component_parameter_value BOARD_DDRT_SKEW_BETWEEN_DIMMS_NS {0.05} + set_component_parameter_value BOARD_DDRT_SKEW_BETWEEN_DQS_NS {0.02} + set_component_parameter_value BOARD_DDRT_USER_AC_ISI_NS {0.0} + set_component_parameter_value BOARD_DDRT_USER_AC_SLEW_RATE {2.0} + set_component_parameter_value BOARD_DDRT_USER_CK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_DDRT_USER_RCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_DDRT_USER_RCLK_SLEW_RATE {8.0} + set_component_parameter_value BOARD_DDRT_USER_RDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_DDRT_USER_RDATA_SLEW_RATE {4.0} + set_component_parameter_value BOARD_DDRT_USER_WCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_DDRT_USER_WCLK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_DDRT_USER_WDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_DDRT_USER_WDATA_SLEW_RATE {2.0} + set_component_parameter_value BOARD_DDRT_USE_DEFAULT_ISI_VALUES {1} + set_component_parameter_value BOARD_DDRT_USE_DEFAULT_SLEW_RATES {1} + set_component_parameter_value BOARD_LPDDR3_AC_TO_CK_SKEW_NS {0.0} + set_component_parameter_value BOARD_LPDDR3_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_LPDDR3_BRD_SKEW_WITHIN_DQS_NS {0.02} + set_component_parameter_value BOARD_LPDDR3_DQS_TO_CK_SKEW_NS {0.02} + set_component_parameter_value BOARD_LPDDR3_IS_SKEW_WITHIN_AC_DESKEWED {1} + set_component_parameter_value BOARD_LPDDR3_IS_SKEW_WITHIN_DQS_DESKEWED {0} + set_component_parameter_value BOARD_LPDDR3_MAX_CK_DELAY_NS {0.6} + set_component_parameter_value BOARD_LPDDR3_MAX_DQS_DELAY_NS {0.6} + set_component_parameter_value BOARD_LPDDR3_PKG_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_LPDDR3_PKG_BRD_SKEW_WITHIN_DQS_NS {0.02} + set_component_parameter_value BOARD_LPDDR3_SKEW_BETWEEN_DIMMS_NS {0.05} + set_component_parameter_value BOARD_LPDDR3_SKEW_BETWEEN_DQS_NS {0.02} + set_component_parameter_value BOARD_LPDDR3_USER_AC_ISI_NS {0.0} + set_component_parameter_value BOARD_LPDDR3_USER_AC_SLEW_RATE {2.0} + set_component_parameter_value BOARD_LPDDR3_USER_CK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_LPDDR3_USER_RCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_LPDDR3_USER_RCLK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_LPDDR3_USER_RDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_LPDDR3_USER_RDATA_SLEW_RATE {2.0} + set_component_parameter_value BOARD_LPDDR3_USER_WCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_LPDDR3_USER_WCLK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_LPDDR3_USER_WDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_LPDDR3_USER_WDATA_SLEW_RATE {2.0} + set_component_parameter_value BOARD_LPDDR3_USE_DEFAULT_ISI_VALUES {1} + set_component_parameter_value BOARD_LPDDR3_USE_DEFAULT_SLEW_RATES {1} + set_component_parameter_value BOARD_QDR2_AC_TO_K_SKEW_NS {0.0} + set_component_parameter_value BOARD_QDR2_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_QDR2_BRD_SKEW_WITHIN_D_NS {0.02} + set_component_parameter_value BOARD_QDR2_BRD_SKEW_WITHIN_Q_NS {0.02} + set_component_parameter_value BOARD_QDR2_IS_SKEW_WITHIN_AC_DESKEWED {1} + set_component_parameter_value BOARD_QDR2_IS_SKEW_WITHIN_D_DESKEWED {0} + set_component_parameter_value BOARD_QDR2_IS_SKEW_WITHIN_Q_DESKEWED {0} + set_component_parameter_value BOARD_QDR2_MAX_K_DELAY_NS {0.6} + set_component_parameter_value BOARD_QDR2_PKG_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_QDR2_PKG_BRD_SKEW_WITHIN_D_NS {0.02} + set_component_parameter_value BOARD_QDR2_PKG_BRD_SKEW_WITHIN_Q_NS {0.02} + set_component_parameter_value BOARD_QDR2_USER_AC_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR2_USER_AC_SLEW_RATE {2.0} + set_component_parameter_value BOARD_QDR2_USER_K_SLEW_RATE {4.0} + set_component_parameter_value BOARD_QDR2_USER_RCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR2_USER_RCLK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_QDR2_USER_RDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR2_USER_RDATA_SLEW_RATE {2.0} + set_component_parameter_value BOARD_QDR2_USER_WCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR2_USER_WDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR2_USER_WDATA_SLEW_RATE {2.0} + set_component_parameter_value BOARD_QDR2_USE_DEFAULT_ISI_VALUES {1} + set_component_parameter_value BOARD_QDR2_USE_DEFAULT_SLEW_RATES {1} + set_component_parameter_value BOARD_QDR4_AC_TO_CK_SKEW_NS {0.0} + set_component_parameter_value BOARD_QDR4_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_QDR4_BRD_SKEW_WITHIN_QK_NS {0.02} + set_component_parameter_value BOARD_QDR4_DK_TO_CK_SKEW_NS {-0.02} + set_component_parameter_value BOARD_QDR4_IS_SKEW_WITHIN_AC_DESKEWED {1} + set_component_parameter_value BOARD_QDR4_IS_SKEW_WITHIN_QK_DESKEWED {1} + set_component_parameter_value BOARD_QDR4_MAX_CK_DELAY_NS {0.6} + set_component_parameter_value BOARD_QDR4_MAX_DK_DELAY_NS {0.6} + set_component_parameter_value BOARD_QDR4_PKG_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_QDR4_PKG_BRD_SKEW_WITHIN_QK_NS {0.02} + set_component_parameter_value BOARD_QDR4_SKEW_BETWEEN_DIMMS_NS {0.05} + set_component_parameter_value BOARD_QDR4_SKEW_BETWEEN_DK_NS {0.02} + set_component_parameter_value BOARD_QDR4_USER_AC_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR4_USER_AC_SLEW_RATE {2.0} + set_component_parameter_value BOARD_QDR4_USER_CK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_QDR4_USER_RCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR4_USER_RCLK_SLEW_RATE {5.0} + set_component_parameter_value BOARD_QDR4_USER_RDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR4_USER_RDATA_SLEW_RATE {2.5} + set_component_parameter_value BOARD_QDR4_USER_WCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR4_USER_WCLK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_QDR4_USER_WDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_QDR4_USER_WDATA_SLEW_RATE {2.0} + set_component_parameter_value BOARD_QDR4_USE_DEFAULT_ISI_VALUES {1} + set_component_parameter_value BOARD_QDR4_USE_DEFAULT_SLEW_RATES {1} + set_component_parameter_value BOARD_RLD3_AC_TO_CK_SKEW_NS {0.0} + set_component_parameter_value BOARD_RLD3_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_RLD3_BRD_SKEW_WITHIN_QK_NS {0.02} + set_component_parameter_value BOARD_RLD3_DK_TO_CK_SKEW_NS {-0.02} + set_component_parameter_value BOARD_RLD3_IS_SKEW_WITHIN_AC_DESKEWED {1} + set_component_parameter_value BOARD_RLD3_IS_SKEW_WITHIN_QK_DESKEWED {0} + set_component_parameter_value BOARD_RLD3_MAX_CK_DELAY_NS {0.6} + set_component_parameter_value BOARD_RLD3_MAX_DK_DELAY_NS {0.6} + set_component_parameter_value BOARD_RLD3_PKG_BRD_SKEW_WITHIN_AC_NS {0.02} + set_component_parameter_value BOARD_RLD3_PKG_BRD_SKEW_WITHIN_QK_NS {0.02} + set_component_parameter_value BOARD_RLD3_SKEW_BETWEEN_DIMMS_NS {0.05} + set_component_parameter_value BOARD_RLD3_SKEW_BETWEEN_DK_NS {0.02} + set_component_parameter_value BOARD_RLD3_USER_AC_ISI_NS {0.0} + set_component_parameter_value BOARD_RLD3_USER_AC_SLEW_RATE {2.0} + set_component_parameter_value BOARD_RLD3_USER_CK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_RLD3_USER_RCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_RLD3_USER_RCLK_SLEW_RATE {7.0} + set_component_parameter_value BOARD_RLD3_USER_RDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_RLD3_USER_RDATA_SLEW_RATE {3.5} + set_component_parameter_value BOARD_RLD3_USER_WCLK_ISI_NS {0.0} + set_component_parameter_value BOARD_RLD3_USER_WCLK_SLEW_RATE {4.0} + set_component_parameter_value BOARD_RLD3_USER_WDATA_ISI_NS {0.0} + set_component_parameter_value BOARD_RLD3_USER_WDATA_SLEW_RATE {2.0} + set_component_parameter_value BOARD_RLD3_USE_DEFAULT_ISI_VALUES {1} + set_component_parameter_value BOARD_RLD3_USE_DEFAULT_SLEW_RATES {1} + set_component_parameter_value CTRL_DDR3_ADDR_ORDER_ENUM {DDR3_CTRL_ADDR_ORDER_CS_R_B_C} + set_component_parameter_value CTRL_DDR3_AUTO_POWER_DOWN_CYCS {32} + set_component_parameter_value CTRL_DDR3_AUTO_POWER_DOWN_EN {0} + set_component_parameter_value CTRL_DDR3_AUTO_PRECHARGE_EN {0} + set_component_parameter_value CTRL_DDR3_AVL_PROTOCOL_ENUM {CTRL_AVL_PROTOCOL_MM} + set_component_parameter_value CTRL_DDR3_ECC_AUTO_CORRECTION_EN {0} + set_component_parameter_value CTRL_DDR3_ECC_EN {0} + set_component_parameter_value CTRL_DDR3_ECC_READDATAERROR_EN {1} + set_component_parameter_value CTRL_DDR3_ECC_STATUS_EN {0} + set_component_parameter_value CTRL_DDR3_MMR_EN {0} + set_component_parameter_value CTRL_DDR3_RD_TO_RD_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR3_RD_TO_WR_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR3_RD_TO_WR_SAME_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR3_REORDER_EN {1} + set_component_parameter_value CTRL_DDR3_SELF_REFRESH_EN {0} + set_component_parameter_value CTRL_DDR3_STARVE_LIMIT {10} + set_component_parameter_value CTRL_DDR3_USER_PRIORITY_EN {0} + set_component_parameter_value CTRL_DDR3_USER_REFRESH_EN {0} + set_component_parameter_value CTRL_DDR3_WR_TO_RD_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR3_WR_TO_RD_SAME_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR3_WR_TO_WR_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR4_ADDR_ORDER_ENUM {DDR4_CTRL_ADDR_ORDER_CS_R_B_C_BG} + set_component_parameter_value CTRL_DDR4_AUTO_POWER_DOWN_CYCS {32} + set_component_parameter_value CTRL_DDR4_AUTO_POWER_DOWN_EN {0} + set_component_parameter_value CTRL_DDR4_AUTO_PRECHARGE_EN {0} + set_component_parameter_value CTRL_DDR4_AVL_PROTOCOL_ENUM {CTRL_AVL_PROTOCOL_ST} + set_component_parameter_value CTRL_DDR4_ECC_AUTO_CORRECTION_EN {1} + set_component_parameter_value CTRL_DDR4_ECC_EN {0} + set_component_parameter_value CTRL_DDR4_ECC_READDATAERROR_EN {0} + set_component_parameter_value CTRL_DDR4_ECC_STATUS_EN {0} + set_component_parameter_value CTRL_DDR4_MAJOR_MODE_EN {0} + set_component_parameter_value CTRL_DDR4_MMR_EN {0} + set_component_parameter_value CTRL_DDR4_POST_REFRESH_EN {0} + set_component_parameter_value CTRL_DDR4_POST_REFRESH_LOWER_LIMIT {0} + set_component_parameter_value CTRL_DDR4_POST_REFRESH_UPPER_LIMIT {2} + set_component_parameter_value CTRL_DDR4_PRE_REFRESH_EN {0} + set_component_parameter_value CTRL_DDR4_PRE_REFRESH_UPPER_LIMIT {1} + set_component_parameter_value CTRL_DDR4_RD_TO_RD_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR4_RD_TO_WR_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR4_RD_TO_WR_SAME_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR4_REORDER_EN {1} + set_component_parameter_value CTRL_DDR4_SELF_REFRESH_EN {0} + set_component_parameter_value CTRL_DDR4_STARVE_LIMIT {10} + set_component_parameter_value CTRL_DDR4_USER_PRIORITY_EN {0} + set_component_parameter_value CTRL_DDR4_USER_REFRESH_EN {0} + set_component_parameter_value CTRL_DDR4_WR_TO_RD_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR4_WR_TO_RD_SAME_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDR4_WR_TO_WR_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_ADDR_INTERLEAVING {COARSE} + set_component_parameter_value CTRL_DDRT_ADDR_ORDER_ENUM {DDRT_CTRL_ADDR_ORDER_CS_R_B_C_BG} + set_component_parameter_value CTRL_DDRT_AUTO_POWER_DOWN_CYCS {32} + set_component_parameter_value CTRL_DDRT_AUTO_POWER_DOWN_EN {0} + set_component_parameter_value CTRL_DDRT_AUTO_PRECHARGE_EN {0} + set_component_parameter_value CTRL_DDRT_AVL_PROTOCOL_ENUM {CTRL_AVL_PROTOCOL_MM} + set_component_parameter_value CTRL_DDRT_DIMM_DENSITY {128} + set_component_parameter_value CTRL_DDRT_DIMM_VIRAL_FLOW_EN {0} + set_component_parameter_value CTRL_DDRT_ECC_AUTO_CORRECTION_EN {0} + set_component_parameter_value CTRL_DDRT_ECC_EN {0} + set_component_parameter_value CTRL_DDRT_ECC_READDATAERROR_EN {1} + set_component_parameter_value CTRL_DDRT_ECC_STATUS_EN {1} + set_component_parameter_value CTRL_DDRT_ERR_INJECT_EN {0} + set_component_parameter_value CTRL_DDRT_ERR_REPLAY_EN {0} + set_component_parameter_value CTRL_DDRT_EXT_ERR_INJECT_EN {0} + set_component_parameter_value CTRL_DDRT_GNT_TO_GNT_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_GNT_TO_WR_DIFF_CHIP_DELTA_CYCS {1} + set_component_parameter_value CTRL_DDRT_GNT_TO_WR_SAME_CHIP_DELTA_CYCS {1} + set_component_parameter_value CTRL_DDRT_HOST_VIRAL_FLOW_EN {0} + set_component_parameter_value CTRL_DDRT_MMR_EN {0} + set_component_parameter_value CTRL_DDRT_NUM_OF_AXIS_ID {1} + set_component_parameter_value CTRL_DDRT_PARITY_CMD_EN {0} + set_component_parameter_value CTRL_DDRT_PMM_ADR_FLOW_EN {0} + set_component_parameter_value CTRL_DDRT_PMM_WPQ_FLUSH_EN {0} + set_component_parameter_value CTRL_DDRT_POISON_DETECTION_EN {0} + set_component_parameter_value CTRL_DDRT_PORT_AFI_C_WIDTH {2} + set_component_parameter_value CTRL_DDRT_RD_TO_RD_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_RD_TO_WR_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_RD_TO_WR_SAME_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_REORDER_EN {1} + set_component_parameter_value CTRL_DDRT_SELF_REFRESH_EN {0} + set_component_parameter_value CTRL_DDRT_STARVE_LIMIT {10} + set_component_parameter_value CTRL_DDRT_UPI_EN {0} + set_component_parameter_value CTRL_DDRT_UPI_ID_WIDTH {8} + set_component_parameter_value CTRL_DDRT_USER_PRIORITY_EN {0} + set_component_parameter_value CTRL_DDRT_USER_REFRESH_EN {0} + set_component_parameter_value CTRL_DDRT_WR_ACK_POLICY {POSTED} + set_component_parameter_value CTRL_DDRT_WR_TO_GNT_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_WR_TO_GNT_SAME_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_WR_TO_RD_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_WR_TO_RD_SAME_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_WR_TO_WR_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_DDRT_ZQ_INTERVAL_MS {3} + set_component_parameter_value CTRL_LPDDR3_ADDR_ORDER_ENUM {LPDDR3_CTRL_ADDR_ORDER_CS_R_B_C} + set_component_parameter_value CTRL_LPDDR3_AUTO_POWER_DOWN_CYCS {32} + set_component_parameter_value CTRL_LPDDR3_AUTO_POWER_DOWN_EN {0} + set_component_parameter_value CTRL_LPDDR3_AUTO_PRECHARGE_EN {0} + set_component_parameter_value CTRL_LPDDR3_AVL_PROTOCOL_ENUM {CTRL_AVL_PROTOCOL_MM} + set_component_parameter_value CTRL_LPDDR3_MMR_EN {0} + set_component_parameter_value CTRL_LPDDR3_RD_TO_RD_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_LPDDR3_RD_TO_WR_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_LPDDR3_RD_TO_WR_SAME_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_LPDDR3_REORDER_EN {1} + set_component_parameter_value CTRL_LPDDR3_SELF_REFRESH_EN {0} + set_component_parameter_value CTRL_LPDDR3_STARVE_LIMIT {10} + set_component_parameter_value CTRL_LPDDR3_USER_PRIORITY_EN {0} + set_component_parameter_value CTRL_LPDDR3_USER_REFRESH_EN {0} + set_component_parameter_value CTRL_LPDDR3_WR_TO_RD_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_LPDDR3_WR_TO_RD_SAME_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_LPDDR3_WR_TO_WR_DIFF_CHIP_DELTA_CYCS {0} + set_component_parameter_value CTRL_QDR2_AVL_ENABLE_POWER_OF_TWO_BUS {0} + set_component_parameter_value CTRL_QDR2_AVL_MAX_BURST_COUNT {4} + set_component_parameter_value CTRL_QDR2_AVL_PROTOCOL_ENUM {CTRL_AVL_PROTOCOL_MM} + set_component_parameter_value CTRL_QDR4_ADD_RAW_TURNAROUND_DELAY_CYC {0} + set_component_parameter_value CTRL_QDR4_ADD_WAR_TURNAROUND_DELAY_CYC {0} + set_component_parameter_value CTRL_QDR4_AVL_ENABLE_POWER_OF_TWO_BUS {0} + set_component_parameter_value CTRL_QDR4_AVL_MAX_BURST_COUNT {4} + set_component_parameter_value CTRL_QDR4_AVL_PROTOCOL_ENUM {CTRL_AVL_PROTOCOL_MM} + set_component_parameter_value CTRL_QDR4_DEF_RAW_TURNAROUND_DELAY_CYC {4} + set_component_parameter_value CTRL_RLD2_AVL_PROTOCOL_ENUM {CTRL_AVL_PROTOCOL_MM} + set_component_parameter_value CTRL_RLD3_ADDR_ORDER_ENUM {RLD3_CTRL_ADDR_ORDER_CS_R_B_C} + set_component_parameter_value CTRL_RLD3_AVL_PROTOCOL_ENUM {CTRL_AVL_PROTOCOL_MM} + set_component_parameter_value DIAG_ADD_READY_PIPELINE {1} + set_component_parameter_value DIAG_BOARD_DELAY_CONFIG_STR {} + set_component_parameter_value DIAG_DB_RESET_AUTO_RELEASE {avl_release} + set_component_parameter_value DIAG_DDR3_ABSTRACT_PHY {0} + set_component_parameter_value DIAG_DDR3_AC_PARITY_ERR {0} + set_component_parameter_value DIAG_DDR3_CAL_ADDR0 {0} + set_component_parameter_value DIAG_DDR3_CAL_ADDR1 {8} + set_component_parameter_value DIAG_DDR3_CAL_ENABLE_MICRON_AP {0} + set_component_parameter_value DIAG_DDR3_CAL_ENABLE_NON_DES {0} + set_component_parameter_value DIAG_DDR3_CAL_FULL_CAL_ON_RESET {1} + set_component_parameter_value DIAG_DDR3_CA_DESKEW_EN {1} + set_component_parameter_value DIAG_DDR3_CA_LEVEL_EN {1} + set_component_parameter_value DIAG_DDR3_DISABLE_AFI_P2C_REGISTERS {0} + set_component_parameter_value DIAG_DDR3_EFFICIENCY_MONITOR {EFFMON_MODE_DISABLED} + set_component_parameter_value DIAG_DDR3_ENABLE_DEFAULT_MODE {0} + set_component_parameter_value DIAG_DDR3_ENABLE_USER_MODE {1} + set_component_parameter_value DIAG_DDR3_EXPORT_SEQ_AVALON_HEAD_OF_CHAIN {1} + set_component_parameter_value DIAG_DDR3_EXPORT_SEQ_AVALON_MASTER {0} + set_component_parameter_value DIAG_DDR3_EXPORT_SEQ_AVALON_SLAVE {CAL_DEBUG_EXPORT_MODE_DISABLED} + set_component_parameter_value DIAG_DDR3_EXPORT_TG_CFG_AVALON_SLAVE {TG_CFG_AMM_EXPORT_MODE_JTAG} + set_component_parameter_value DIAG_DDR3_EX_DESIGN_ISSP_EN {0} + set_component_parameter_value DIAG_DDR3_EX_DESIGN_NUM_OF_SLAVES {1} + set_component_parameter_value DIAG_DDR3_EX_DESIGN_SEPARATE_RZQS {1} + set_component_parameter_value DIAG_DDR3_INTERFACE_ID {0} + set_component_parameter_value DIAG_DDR3_SEPARATE_READ_WRITE_ITFS {0} + set_component_parameter_value DIAG_DDR3_SIM_CAL_MODE_ENUM {SIM_CAL_MODE_SKIP} + set_component_parameter_value DIAG_DDR3_SIM_VERBOSE {1} + set_component_parameter_value DIAG_DDR3_TG2_TEST_DURATION {SHORT} + set_component_parameter_value DIAG_DDR3_USER_SIM_MEMORY_PRELOAD {0} + set_component_parameter_value DIAG_DDR3_USER_SIM_MEMORY_PRELOAD_PRI_EMIF_FILE {EMIF_PRI_PRELOAD.txt} + set_component_parameter_value DIAG_DDR3_USER_SIM_MEMORY_PRELOAD_SEC_EMIF_FILE {EMIF_SEC_PRELOAD.txt} + set_component_parameter_value DIAG_DDR3_USER_USE_SIM_MEMORY_VALIDATION_TG {1} + set_component_parameter_value DIAG_DDR3_USE_NEW_EFFMON_S10 {0} + set_component_parameter_value DIAG_DDR3_USE_TG_AVL_2 {0} + set_component_parameter_value DIAG_DDR3_USE_TG_HBM {0} + set_component_parameter_value DIAG_DDR4_ABSTRACT_PHY {0} + set_component_parameter_value DIAG_DDR4_AC_PARITY_ERR {0} + set_component_parameter_value DIAG_DDR4_CAL_ADDR0 {0} + set_component_parameter_value DIAG_DDR4_CAL_ADDR1 {8} + set_component_parameter_value DIAG_DDR4_CAL_ENABLE_NON_DES {0} + set_component_parameter_value DIAG_DDR4_CAL_FULL_CAL_ON_RESET {1} + set_component_parameter_value DIAG_DDR4_DISABLE_AFI_P2C_REGISTERS {0} + set_component_parameter_value DIAG_DDR4_EFFICIENCY_MONITOR {EFFMON_MODE_DISABLED} + set_component_parameter_value DIAG_DDR4_ENABLE_DEFAULT_MODE {0} + set_component_parameter_value DIAG_DDR4_ENABLE_USER_MODE {1} + set_component_parameter_value DIAG_DDR4_EXPORT_SEQ_AVALON_HEAD_OF_CHAIN {1} + set_component_parameter_value DIAG_DDR4_EXPORT_SEQ_AVALON_MASTER {0} + set_component_parameter_value DIAG_DDR4_EXPORT_SEQ_AVALON_SLAVE {CAL_DEBUG_EXPORT_MODE_DISABLED} + set_component_parameter_value DIAG_DDR4_EXPORT_TG_CFG_AVALON_SLAVE {TG_CFG_AMM_EXPORT_MODE_JTAG} + set_component_parameter_value DIAG_DDR4_EX_DESIGN_ISSP_EN {0} + set_component_parameter_value DIAG_DDR4_EX_DESIGN_NUM_OF_SLAVES {1} + set_component_parameter_value DIAG_DDR4_EX_DESIGN_SEPARATE_RZQS {1} + set_component_parameter_value DIAG_DDR4_INTERFACE_ID {0} + set_component_parameter_value DIAG_DDR4_SEPARATE_READ_WRITE_ITFS {0} + set_component_parameter_value DIAG_DDR4_SIM_CAL_MODE_ENUM {SIM_CAL_MODE_SKIP} + set_component_parameter_value DIAG_DDR4_SIM_VERBOSE {1} + set_component_parameter_value DIAG_DDR4_SKIP_AC_PARITY_CHECK {0} + set_component_parameter_value DIAG_DDR4_SKIP_CA_DESKEW {0} + set_component_parameter_value DIAG_DDR4_SKIP_CA_LEVEL {0} + set_component_parameter_value DIAG_DDR4_SKIP_VREF_CAL {0} + set_component_parameter_value DIAG_DDR4_TG2_TEST_DURATION {SHORT} + set_component_parameter_value DIAG_DDR4_USER_SIM_MEMORY_PRELOAD {0} + set_component_parameter_value DIAG_DDR4_USER_SIM_MEMORY_PRELOAD_PRI_EMIF_FILE {EMIF_PRI_PRELOAD.txt} + set_component_parameter_value DIAG_DDR4_USER_SIM_MEMORY_PRELOAD_SEC_EMIF_FILE {EMIF_SEC_PRELOAD.txt} + set_component_parameter_value DIAG_DDR4_USER_USE_SIM_MEMORY_VALIDATION_TG {1} + set_component_parameter_value DIAG_DDR4_USE_NEW_EFFMON_S10 {0} + set_component_parameter_value DIAG_DDR4_USE_TG_AVL_2 {0} + set_component_parameter_value DIAG_DDR4_USE_TG_HBM {0} + set_component_parameter_value DIAG_DDRT_ABSTRACT_PHY {0} + set_component_parameter_value DIAG_DDRT_AC_PARITY_ERR {0} + set_component_parameter_value DIAG_DDRT_CAL_ADDR0 {0} + set_component_parameter_value DIAG_DDRT_CAL_ADDR1 {8} + set_component_parameter_value DIAG_DDRT_CAL_ENABLE_NON_DES {0} + set_component_parameter_value DIAG_DDRT_CAL_FULL_CAL_ON_RESET {1} + set_component_parameter_value DIAG_DDRT_DISABLE_AFI_P2C_REGISTERS {0} + set_component_parameter_value DIAG_DDRT_EFFICIENCY_MONITOR {EFFMON_MODE_DISABLED} + set_component_parameter_value DIAG_DDRT_EFF_TEST {0} + set_component_parameter_value DIAG_DDRT_ENABLE_DEFAULT_MODE {1} + set_component_parameter_value DIAG_DDRT_ENABLE_DRIVER_MARGINING {0} + set_component_parameter_value DIAG_DDRT_ENABLE_ENHANCED_TESTING {0} + set_component_parameter_value DIAG_DDRT_ENABLE_USER_MODE {0} + set_component_parameter_value DIAG_DDRT_EXPORT_SEQ_AVALON_HEAD_OF_CHAIN {1} + set_component_parameter_value DIAG_DDRT_EXPORT_SEQ_AVALON_MASTER {0} + set_component_parameter_value DIAG_DDRT_EXPORT_SEQ_AVALON_SLAVE {CAL_DEBUG_EXPORT_MODE_DISABLED} + set_component_parameter_value DIAG_DDRT_EXPORT_TG_CFG_AVALON_SLAVE {TG_CFG_AMM_EXPORT_MODE_JTAG} + set_component_parameter_value DIAG_DDRT_EX_DESIGN_ISSP_EN {1} + set_component_parameter_value DIAG_DDRT_EX_DESIGN_NUM_OF_SLAVES {1} + set_component_parameter_value DIAG_DDRT_EX_DESIGN_SEPARATE_RZQS {1} + set_component_parameter_value DIAG_DDRT_INTERFACE_ID {0} + set_component_parameter_value DIAG_DDRT_SEPARATE_READ_WRITE_ITFS {0} + set_component_parameter_value DIAG_DDRT_SIM_CAL_MODE_ENUM {SIM_CAL_MODE_SKIP} + set_component_parameter_value DIAG_DDRT_SIM_VERBOSE {1} + set_component_parameter_value DIAG_DDRT_SKIP_CA_DESKEW {0} + set_component_parameter_value DIAG_DDRT_SKIP_CA_LEVEL {0} + set_component_parameter_value DIAG_DDRT_SKIP_VREF_CAL {0} + set_component_parameter_value DIAG_DDRT_TG2_TEST_DURATION {SHORT} + set_component_parameter_value DIAG_DDRT_USER_SIM_MEMORY_PRELOAD {0} + set_component_parameter_value DIAG_DDRT_USER_SIM_MEMORY_PRELOAD_PRI_EMIF_FILE {EMIF_PRI_PRELOAD.txt} + set_component_parameter_value DIAG_DDRT_USER_SIM_MEMORY_PRELOAD_SEC_EMIF_FILE {EMIF_SEC_PRELOAD.txt} + set_component_parameter_value DIAG_DDRT_USER_USE_SIM_MEMORY_VALIDATION_TG {1} + set_component_parameter_value DIAG_DDRT_USE_NEW_EFFMON_S10 {0} + set_component_parameter_value DIAG_DDRT_USE_TG_AVL_2 {1} + set_component_parameter_value DIAG_DDRT_USE_TG_HBM {0} + set_component_parameter_value DIAG_ECLIPSE_DEBUG {0} + set_component_parameter_value DIAG_ENABLE_HPS_EMIF_DEBUG {0} + set_component_parameter_value DIAG_ENABLE_JTAG_UART {0} + set_component_parameter_value DIAG_ENABLE_JTAG_UART_HEX {0} + set_component_parameter_value DIAG_EXPORT_PLL_LOCKED {0} + set_component_parameter_value DIAG_EXPORT_PLL_REF_CLK_OUT {0} + set_component_parameter_value DIAG_EXPORT_VJI {0} + set_component_parameter_value DIAG_EXPOSE_DFT_SIGNALS {0} + set_component_parameter_value DIAG_EXPOSE_EARLY_READY {0} + set_component_parameter_value DIAG_EXPOSE_RD_TYPE {0} + set_component_parameter_value DIAG_EXTRA_CONFIGS {} + set_component_parameter_value DIAG_EXT_DOCS {0} + set_component_parameter_value DIAG_EX_DESIGN_ADD_TEST_EMIFS {} + set_component_parameter_value DIAG_EX_DESIGN_SEPARATE_RESETS {0} + set_component_parameter_value DIAG_FAST_SIM_OVERRIDE {FAST_SIM_OVERRIDE_DEFAULT} + set_component_parameter_value DIAG_HMC_HRC {auto} + set_component_parameter_value DIAG_LPDDR3_ABSTRACT_PHY {0} + set_component_parameter_value DIAG_LPDDR3_AC_PARITY_ERR {0} + set_component_parameter_value DIAG_LPDDR3_DISABLE_AFI_P2C_REGISTERS {0} + set_component_parameter_value DIAG_LPDDR3_EFFICIENCY_MONITOR {EFFMON_MODE_DISABLED} + set_component_parameter_value DIAG_LPDDR3_ENABLE_DEFAULT_MODE {0} + set_component_parameter_value DIAG_LPDDR3_ENABLE_USER_MODE {1} + set_component_parameter_value DIAG_LPDDR3_EXPORT_SEQ_AVALON_HEAD_OF_CHAIN {1} + set_component_parameter_value DIAG_LPDDR3_EXPORT_SEQ_AVALON_MASTER {0} + set_component_parameter_value DIAG_LPDDR3_EXPORT_SEQ_AVALON_SLAVE {CAL_DEBUG_EXPORT_MODE_DISABLED} + set_component_parameter_value DIAG_LPDDR3_EXPORT_TG_CFG_AVALON_SLAVE {TG_CFG_AMM_EXPORT_MODE_JTAG} + set_component_parameter_value DIAG_LPDDR3_EX_DESIGN_ISSP_EN {1} + set_component_parameter_value DIAG_LPDDR3_EX_DESIGN_NUM_OF_SLAVES {1} + set_component_parameter_value DIAG_LPDDR3_EX_DESIGN_SEPARATE_RZQS {1} + set_component_parameter_value DIAG_LPDDR3_INTERFACE_ID {0} + set_component_parameter_value DIAG_LPDDR3_SEPARATE_READ_WRITE_ITFS {0} + set_component_parameter_value DIAG_LPDDR3_SIM_CAL_MODE_ENUM {SIM_CAL_MODE_SKIP} + set_component_parameter_value DIAG_LPDDR3_SIM_VERBOSE {1} + set_component_parameter_value DIAG_LPDDR3_SKIP_CA_DESKEW {0} + set_component_parameter_value DIAG_LPDDR3_SKIP_CA_LEVEL {0} + set_component_parameter_value DIAG_LPDDR3_TG2_TEST_DURATION {SHORT} + set_component_parameter_value DIAG_LPDDR3_USER_SIM_MEMORY_PRELOAD {0} + set_component_parameter_value DIAG_LPDDR3_USER_SIM_MEMORY_PRELOAD_PRI_EMIF_FILE {EMIF_PRI_PRELOAD.txt} + set_component_parameter_value DIAG_LPDDR3_USER_SIM_MEMORY_PRELOAD_SEC_EMIF_FILE {EMIF_SEC_PRELOAD.txt} + set_component_parameter_value DIAG_LPDDR3_USER_USE_SIM_MEMORY_VALIDATION_TG {1} + set_component_parameter_value DIAG_LPDDR3_USE_NEW_EFFMON_S10 {0} + set_component_parameter_value DIAG_LPDDR3_USE_TG_AVL_2 {0} + set_component_parameter_value DIAG_LPDDR3_USE_TG_HBM {0} + set_component_parameter_value DIAG_QDR2_ABSTRACT_PHY {0} + set_component_parameter_value DIAG_QDR2_AC_PARITY_ERR {0} + set_component_parameter_value DIAG_QDR2_DISABLE_AFI_P2C_REGISTERS {0} + set_component_parameter_value DIAG_QDR2_EFFICIENCY_MONITOR {EFFMON_MODE_DISABLED} + set_component_parameter_value DIAG_QDR2_ENABLE_DEFAULT_MODE {0} + set_component_parameter_value DIAG_QDR2_ENABLE_USER_MODE {1} + set_component_parameter_value DIAG_QDR2_EXPORT_SEQ_AVALON_HEAD_OF_CHAIN {1} + set_component_parameter_value DIAG_QDR2_EXPORT_SEQ_AVALON_MASTER {0} + set_component_parameter_value DIAG_QDR2_EXPORT_SEQ_AVALON_SLAVE {CAL_DEBUG_EXPORT_MODE_DISABLED} + set_component_parameter_value DIAG_QDR2_EXPORT_TG_CFG_AVALON_SLAVE {TG_CFG_AMM_EXPORT_MODE_JTAG} + set_component_parameter_value DIAG_QDR2_EX_DESIGN_ISSP_EN {1} + set_component_parameter_value DIAG_QDR2_EX_DESIGN_NUM_OF_SLAVES {1} + set_component_parameter_value DIAG_QDR2_EX_DESIGN_SEPARATE_RZQS {1} + set_component_parameter_value DIAG_QDR2_INTERFACE_ID {0} + set_component_parameter_value DIAG_QDR2_SEPARATE_READ_WRITE_ITFS {0} + set_component_parameter_value DIAG_QDR2_SIM_CAL_MODE_ENUM {SIM_CAL_MODE_SKIP} + set_component_parameter_value DIAG_QDR2_SIM_VERBOSE {1} + set_component_parameter_value DIAG_QDR2_TG2_TEST_DURATION {SHORT} + set_component_parameter_value DIAG_QDR2_USER_SIM_MEMORY_PRELOAD {0} + set_component_parameter_value DIAG_QDR2_USER_SIM_MEMORY_PRELOAD_PRI_EMIF_FILE {EMIF_PRI_PRELOAD.txt} + set_component_parameter_value DIAG_QDR2_USER_SIM_MEMORY_PRELOAD_SEC_EMIF_FILE {EMIF_SEC_PRELOAD.txt} + set_component_parameter_value DIAG_QDR2_USER_USE_SIM_MEMORY_VALIDATION_TG {1} + set_component_parameter_value DIAG_QDR2_USE_NEW_EFFMON_S10 {0} + set_component_parameter_value DIAG_QDR2_USE_TG_AVL_2 {0} + set_component_parameter_value DIAG_QDR2_USE_TG_HBM {0} + set_component_parameter_value DIAG_QDR4_ABSTRACT_PHY {0} + set_component_parameter_value DIAG_QDR4_AC_PARITY_ERR {0} + set_component_parameter_value DIAG_QDR4_DISABLE_AFI_P2C_REGISTERS {0} + set_component_parameter_value DIAG_QDR4_EFFICIENCY_MONITOR {EFFMON_MODE_DISABLED} + set_component_parameter_value DIAG_QDR4_ENABLE_DEFAULT_MODE {0} + set_component_parameter_value DIAG_QDR4_ENABLE_USER_MODE {1} + set_component_parameter_value DIAG_QDR4_EXPORT_SEQ_AVALON_HEAD_OF_CHAIN {1} + set_component_parameter_value DIAG_QDR4_EXPORT_SEQ_AVALON_MASTER {0} + set_component_parameter_value DIAG_QDR4_EXPORT_SEQ_AVALON_SLAVE {CAL_DEBUG_EXPORT_MODE_DISABLED} + set_component_parameter_value DIAG_QDR4_EXPORT_TG_CFG_AVALON_SLAVE {TG_CFG_AMM_EXPORT_MODE_JTAG} + set_component_parameter_value DIAG_QDR4_EX_DESIGN_ISSP_EN {1} + set_component_parameter_value DIAG_QDR4_EX_DESIGN_NUM_OF_SLAVES {1} + set_component_parameter_value DIAG_QDR4_EX_DESIGN_SEPARATE_RZQS {1} + set_component_parameter_value DIAG_QDR4_INTERFACE_ID {0} + set_component_parameter_value DIAG_QDR4_SEPARATE_READ_WRITE_ITFS {0} + set_component_parameter_value DIAG_QDR4_SIM_CAL_MODE_ENUM {SIM_CAL_MODE_SKIP} + set_component_parameter_value DIAG_QDR4_SIM_VERBOSE {1} + set_component_parameter_value DIAG_QDR4_SKIP_VREF_CAL {0} + set_component_parameter_value DIAG_QDR4_TG2_TEST_DURATION {SHORT} + set_component_parameter_value DIAG_QDR4_USER_SIM_MEMORY_PRELOAD {0} + set_component_parameter_value DIAG_QDR4_USER_SIM_MEMORY_PRELOAD_PRI_EMIF_FILE {EMIF_PRI_PRELOAD.txt} + set_component_parameter_value DIAG_QDR4_USER_SIM_MEMORY_PRELOAD_SEC_EMIF_FILE {EMIF_SEC_PRELOAD.txt} + set_component_parameter_value DIAG_QDR4_USER_USE_SIM_MEMORY_VALIDATION_TG {1} + set_component_parameter_value DIAG_QDR4_USE_NEW_EFFMON_S10 {0} + set_component_parameter_value DIAG_QDR4_USE_TG_AVL_2 {0} + set_component_parameter_value DIAG_QDR4_USE_TG_HBM {0} + set_component_parameter_value DIAG_RLD2_ABSTRACT_PHY {0} + set_component_parameter_value DIAG_RLD2_AC_PARITY_ERR {0} + set_component_parameter_value DIAG_RLD2_DISABLE_AFI_P2C_REGISTERS {0} + set_component_parameter_value DIAG_RLD2_EFFICIENCY_MONITOR {EFFMON_MODE_DISABLED} + set_component_parameter_value DIAG_RLD2_ENABLE_DEFAULT_MODE {0} + set_component_parameter_value DIAG_RLD2_ENABLE_USER_MODE {1} + set_component_parameter_value DIAG_RLD2_EXPORT_SEQ_AVALON_HEAD_OF_CHAIN {1} + set_component_parameter_value DIAG_RLD2_EXPORT_SEQ_AVALON_MASTER {0} + set_component_parameter_value DIAG_RLD2_EXPORT_SEQ_AVALON_SLAVE {CAL_DEBUG_EXPORT_MODE_DISABLED} + set_component_parameter_value DIAG_RLD2_EXPORT_TG_CFG_AVALON_SLAVE {TG_CFG_AMM_EXPORT_MODE_JTAG} + set_component_parameter_value DIAG_RLD2_EX_DESIGN_ISSP_EN {1} + set_component_parameter_value DIAG_RLD2_EX_DESIGN_NUM_OF_SLAVES {1} + set_component_parameter_value DIAG_RLD2_EX_DESIGN_SEPARATE_RZQS {1} + set_component_parameter_value DIAG_RLD2_INTERFACE_ID {0} + set_component_parameter_value DIAG_RLD2_SEPARATE_READ_WRITE_ITFS {0} + set_component_parameter_value DIAG_RLD2_SIM_CAL_MODE_ENUM {SIM_CAL_MODE_SKIP} + set_component_parameter_value DIAG_RLD2_SIM_VERBOSE {1} + set_component_parameter_value DIAG_RLD2_TG2_TEST_DURATION {SHORT} + set_component_parameter_value DIAG_RLD2_USER_SIM_MEMORY_PRELOAD {0} + set_component_parameter_value DIAG_RLD2_USER_SIM_MEMORY_PRELOAD_PRI_EMIF_FILE {EMIF_PRI_PRELOAD.txt} + set_component_parameter_value DIAG_RLD2_USER_SIM_MEMORY_PRELOAD_SEC_EMIF_FILE {EMIF_SEC_PRELOAD.txt} + set_component_parameter_value DIAG_RLD2_USER_USE_SIM_MEMORY_VALIDATION_TG {1} + set_component_parameter_value DIAG_RLD2_USE_NEW_EFFMON_S10 {0} + set_component_parameter_value DIAG_RLD2_USE_TG_AVL_2 {0} + set_component_parameter_value DIAG_RLD2_USE_TG_HBM {0} + set_component_parameter_value DIAG_RLD3_ABSTRACT_PHY {0} + set_component_parameter_value DIAG_RLD3_AC_PARITY_ERR {0} + set_component_parameter_value DIAG_RLD3_CA_DESKEW_EN {1} + set_component_parameter_value DIAG_RLD3_CA_LEVEL_EN {1} + set_component_parameter_value DIAG_RLD3_DISABLE_AFI_P2C_REGISTERS {0} + set_component_parameter_value DIAG_RLD3_EFFICIENCY_MONITOR {EFFMON_MODE_DISABLED} + set_component_parameter_value DIAG_RLD3_ENABLE_DEFAULT_MODE {0} + set_component_parameter_value DIAG_RLD3_ENABLE_USER_MODE {1} + set_component_parameter_value DIAG_RLD3_EXPORT_SEQ_AVALON_HEAD_OF_CHAIN {1} + set_component_parameter_value DIAG_RLD3_EXPORT_SEQ_AVALON_MASTER {0} + set_component_parameter_value DIAG_RLD3_EXPORT_SEQ_AVALON_SLAVE {CAL_DEBUG_EXPORT_MODE_DISABLED} + set_component_parameter_value DIAG_RLD3_EXPORT_TG_CFG_AVALON_SLAVE {TG_CFG_AMM_EXPORT_MODE_JTAG} + set_component_parameter_value DIAG_RLD3_EX_DESIGN_ISSP_EN {1} + set_component_parameter_value DIAG_RLD3_EX_DESIGN_NUM_OF_SLAVES {1} + set_component_parameter_value DIAG_RLD3_EX_DESIGN_SEPARATE_RZQS {1} + set_component_parameter_value DIAG_RLD3_INTERFACE_ID {0} + set_component_parameter_value DIAG_RLD3_SEPARATE_READ_WRITE_ITFS {0} + set_component_parameter_value DIAG_RLD3_SIM_CAL_MODE_ENUM {SIM_CAL_MODE_SKIP} + set_component_parameter_value DIAG_RLD3_SIM_VERBOSE {1} + set_component_parameter_value DIAG_RLD3_TG2_TEST_DURATION {SHORT} + set_component_parameter_value DIAG_RLD3_USER_SIM_MEMORY_PRELOAD {0} + set_component_parameter_value DIAG_RLD3_USER_SIM_MEMORY_PRELOAD_PRI_EMIF_FILE {EMIF_PRI_PRELOAD.txt} + set_component_parameter_value DIAG_RLD3_USER_SIM_MEMORY_PRELOAD_SEC_EMIF_FILE {EMIF_SEC_PRELOAD.txt} + set_component_parameter_value DIAG_RLD3_USER_USE_SIM_MEMORY_VALIDATION_TG {1} + set_component_parameter_value DIAG_RLD3_USE_NEW_EFFMON_S10 {0} + set_component_parameter_value DIAG_RLD3_USE_TG_AVL_2 {0} + set_component_parameter_value DIAG_RLD3_USE_TG_HBM {0} + set_component_parameter_value DIAG_RS232_UART_BAUDRATE {57600} + set_component_parameter_value DIAG_SEQ_RESET_AUTO_RELEASE {avl} + set_component_parameter_value DIAG_SIM_REGTEST_MODE {0} + set_component_parameter_value DIAG_SOFT_NIOS_CLOCK_FREQUENCY {100} + set_component_parameter_value DIAG_SOFT_NIOS_MODE {SOFT_NIOS_MODE_DISABLED} + set_component_parameter_value DIAG_SYNTH_FOR_SIM {0} + set_component_parameter_value DIAG_TG_AVL_2_NUM_CFG_INTERFACES {0} + set_component_parameter_value DIAG_TIMING_REGTEST_MODE {0} + set_component_parameter_value DIAG_USE_BOARD_DELAY_MODEL {0} + set_component_parameter_value DIAG_USE_RS232_UART {0} + set_component_parameter_value DIAG_VERBOSE_IOAUX {0} + set_component_parameter_value EMIF_0_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_0_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_0_STORED_PARAM {} + set_component_parameter_value EMIF_10_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_10_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_10_STORED_PARAM {} + set_component_parameter_value EMIF_11_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_11_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_11_STORED_PARAM {} + set_component_parameter_value EMIF_12_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_12_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_12_STORED_PARAM {} + set_component_parameter_value EMIF_13_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_13_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_13_STORED_PARAM {} + set_component_parameter_value EMIF_14_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_14_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_14_STORED_PARAM {} + set_component_parameter_value EMIF_15_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_15_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_15_STORED_PARAM {} + set_component_parameter_value EMIF_1_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_1_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_1_STORED_PARAM {} + set_component_parameter_value EMIF_2_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_2_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_2_STORED_PARAM {} + set_component_parameter_value EMIF_3_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_3_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_3_STORED_PARAM {} + set_component_parameter_value EMIF_4_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_4_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_4_STORED_PARAM {} + set_component_parameter_value EMIF_5_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_5_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_5_STORED_PARAM {} + set_component_parameter_value EMIF_6_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_6_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_6_STORED_PARAM {} + set_component_parameter_value EMIF_7_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_7_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_7_STORED_PARAM {} + set_component_parameter_value EMIF_8_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_8_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_8_STORED_PARAM {} + set_component_parameter_value EMIF_9_CONN_TO_CALIP {CALIP_0} + set_component_parameter_value EMIF_9_REF_CLK_SHARING {EXPORTED} + set_component_parameter_value EMIF_9_STORED_PARAM {} + set_component_parameter_value EX_DESIGN_GUI_DDR3_GEN_BSI {0} + set_component_parameter_value EX_DESIGN_GUI_DDR3_GEN_CDC {0} + set_component_parameter_value EX_DESIGN_GUI_DDR3_GEN_SIM {1} + set_component_parameter_value EX_DESIGN_GUI_DDR3_GEN_SYNTH {1} + set_component_parameter_value EX_DESIGN_GUI_DDR3_HDL_FORMAT {HDL_FORMAT_VERILOG} + set_component_parameter_value EX_DESIGN_GUI_DDR3_PREV_PRESET {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_DDR3_SEL_DESIGN {AVAIL_EX_DESIGNS_GEN_DESIGN} + set_component_parameter_value EX_DESIGN_GUI_DDR3_TARGET_DEV_KIT {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_DDR4_GEN_BSI {0} + set_component_parameter_value EX_DESIGN_GUI_DDR4_GEN_CDC {0} + set_component_parameter_value EX_DESIGN_GUI_DDR4_GEN_SIM {1} + set_component_parameter_value EX_DESIGN_GUI_DDR4_GEN_SYNTH {1} + set_component_parameter_value EX_DESIGN_GUI_DDR4_HDL_FORMAT {HDL_FORMAT_VERILOG} + set_component_parameter_value EX_DESIGN_GUI_DDR4_PREV_PRESET {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_DDR4_SEL_DESIGN {AVAIL_EX_DESIGNS_GEN_DESIGN} + set_component_parameter_value EX_DESIGN_GUI_DDR4_TARGET_DEV_KIT {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_DDRT_GEN_BSI {0} + set_component_parameter_value EX_DESIGN_GUI_DDRT_GEN_CDC {0} + set_component_parameter_value EX_DESIGN_GUI_DDRT_GEN_SIM {1} + set_component_parameter_value EX_DESIGN_GUI_DDRT_GEN_SYNTH {1} + set_component_parameter_value EX_DESIGN_GUI_DDRT_HDL_FORMAT {HDL_FORMAT_VERILOG} + set_component_parameter_value EX_DESIGN_GUI_DDRT_PREV_PRESET {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_DDRT_SEL_DESIGN {AVAIL_EX_DESIGNS_GEN_DESIGN} + set_component_parameter_value EX_DESIGN_GUI_DDRT_TARGET_DEV_KIT {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_LPDDR3_GEN_BSI {0} + set_component_parameter_value EX_DESIGN_GUI_LPDDR3_GEN_CDC {0} + set_component_parameter_value EX_DESIGN_GUI_LPDDR3_GEN_SIM {1} + set_component_parameter_value EX_DESIGN_GUI_LPDDR3_GEN_SYNTH {1} + set_component_parameter_value EX_DESIGN_GUI_LPDDR3_HDL_FORMAT {HDL_FORMAT_VERILOG} + set_component_parameter_value EX_DESIGN_GUI_LPDDR3_PREV_PRESET {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_LPDDR3_SEL_DESIGN {AVAIL_EX_DESIGNS_GEN_DESIGN} + set_component_parameter_value EX_DESIGN_GUI_LPDDR3_TARGET_DEV_KIT {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_QDR2_GEN_BSI {0} + set_component_parameter_value EX_DESIGN_GUI_QDR2_GEN_CDC {0} + set_component_parameter_value EX_DESIGN_GUI_QDR2_GEN_SIM {1} + set_component_parameter_value EX_DESIGN_GUI_QDR2_GEN_SYNTH {1} + set_component_parameter_value EX_DESIGN_GUI_QDR2_HDL_FORMAT {HDL_FORMAT_VERILOG} + set_component_parameter_value EX_DESIGN_GUI_QDR2_PREV_PRESET {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_QDR2_SEL_DESIGN {AVAIL_EX_DESIGNS_GEN_DESIGN} + set_component_parameter_value EX_DESIGN_GUI_QDR2_TARGET_DEV_KIT {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_QDR4_GEN_BSI {0} + set_component_parameter_value EX_DESIGN_GUI_QDR4_GEN_CDC {0} + set_component_parameter_value EX_DESIGN_GUI_QDR4_GEN_SIM {1} + set_component_parameter_value EX_DESIGN_GUI_QDR4_GEN_SYNTH {1} + set_component_parameter_value EX_DESIGN_GUI_QDR4_HDL_FORMAT {HDL_FORMAT_VERILOG} + set_component_parameter_value EX_DESIGN_GUI_QDR4_PREV_PRESET {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_QDR4_SEL_DESIGN {AVAIL_EX_DESIGNS_GEN_DESIGN} + set_component_parameter_value EX_DESIGN_GUI_QDR4_TARGET_DEV_KIT {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_RLD2_GEN_BSI {0} + set_component_parameter_value EX_DESIGN_GUI_RLD2_GEN_CDC {0} + set_component_parameter_value EX_DESIGN_GUI_RLD2_GEN_SIM {1} + set_component_parameter_value EX_DESIGN_GUI_RLD2_GEN_SYNTH {1} + set_component_parameter_value EX_DESIGN_GUI_RLD2_HDL_FORMAT {HDL_FORMAT_VERILOG} + set_component_parameter_value EX_DESIGN_GUI_RLD2_PREV_PRESET {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_RLD2_SEL_DESIGN {AVAIL_EX_DESIGNS_GEN_DESIGN} + set_component_parameter_value EX_DESIGN_GUI_RLD2_TARGET_DEV_KIT {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_RLD3_GEN_BSI {0} + set_component_parameter_value EX_DESIGN_GUI_RLD3_GEN_CDC {0} + set_component_parameter_value EX_DESIGN_GUI_RLD3_GEN_SIM {1} + set_component_parameter_value EX_DESIGN_GUI_RLD3_GEN_SYNTH {1} + set_component_parameter_value EX_DESIGN_GUI_RLD3_HDL_FORMAT {HDL_FORMAT_VERILOG} + set_component_parameter_value EX_DESIGN_GUI_RLD3_PREV_PRESET {TARGET_DEV_KIT_NONE} + set_component_parameter_value EX_DESIGN_GUI_RLD3_SEL_DESIGN {AVAIL_EX_DESIGNS_GEN_DESIGN} + set_component_parameter_value EX_DESIGN_GUI_RLD3_TARGET_DEV_KIT {TARGET_DEV_KIT_NONE} + set_component_parameter_value INTERNAL_TESTING_MODE {0} + set_component_parameter_value IS_ED_SLAVE {0} + set_component_parameter_value MEM_DDR3_ALERT_N_DQS_GROUP {0} + set_component_parameter_value MEM_DDR3_ALERT_N_PLACEMENT_ENUM {DDR3_ALERT_N_PLACEMENT_AC_LANES} + set_component_parameter_value MEM_DDR3_ASR_ENUM {DDR3_ASR_MANUAL} + set_component_parameter_value MEM_DDR3_ATCL_ENUM {DDR3_ATCL_DISABLED} + set_component_parameter_value MEM_DDR3_BANK_ADDR_WIDTH {3} + set_component_parameter_value MEM_DDR3_BL_ENUM {DDR3_BL_BL8} + set_component_parameter_value MEM_DDR3_BT_ENUM {DDR3_BT_SEQUENTIAL} + set_component_parameter_value MEM_DDR3_CFG_GEN_DBE {0} + set_component_parameter_value MEM_DDR3_CFG_GEN_SBE {0} + set_component_parameter_value MEM_DDR3_CKE_PER_DIMM {1} + set_component_parameter_value MEM_DDR3_CK_WIDTH {1} + set_component_parameter_value MEM_DDR3_COL_ADDR_WIDTH {10} + set_component_parameter_value MEM_DDR3_DISCRETE_CS_WIDTH {1} + set_component_parameter_value MEM_DDR3_DISCRETE_MIRROR_ADDRESSING_EN {0} + set_component_parameter_value MEM_DDR3_DLL_EN {1} + set_component_parameter_value MEM_DDR3_DM_EN {1} + set_component_parameter_value MEM_DDR3_DQ_PER_DQS {8} + set_component_parameter_value MEM_DDR3_DQ_WIDTH {72} + set_component_parameter_value MEM_DDR3_DRV_STR_ENUM {DDR3_DRV_STR_RZQ_7} + set_component_parameter_value MEM_DDR3_FORMAT_ENUM {MEM_FORMAT_UDIMM} + set_component_parameter_value MEM_DDR3_HIDE_ADV_MR_SETTINGS {1} + set_component_parameter_value MEM_DDR3_LRDIMM_EXTENDED_CONFIG {000000000000000000} + set_component_parameter_value MEM_DDR3_MIRROR_ADDRESSING_EN {1} + set_component_parameter_value MEM_DDR3_NUM_OF_DIMMS {1} + set_component_parameter_value MEM_DDR3_PD_ENUM {DDR3_PD_OFF} + set_component_parameter_value MEM_DDR3_RANKS_PER_DIMM {1} + set_component_parameter_value MEM_DDR3_RDIMM_CONFIG {0000000000000000} + set_component_parameter_value MEM_DDR3_ROW_ADDR_WIDTH {15} + set_component_parameter_value MEM_DDR3_RTT_NOM_ENUM {DDR3_RTT_NOM_ODT_DISABLED} + set_component_parameter_value MEM_DDR3_RTT_WR_ENUM {DDR3_RTT_WR_RZQ_4} + set_component_parameter_value MEM_DDR3_R_ODT0_1X1 {off} + set_component_parameter_value MEM_DDR3_R_ODT0_2X2 {off off} + set_component_parameter_value MEM_DDR3_R_ODT0_4X2 {off off on on} + set_component_parameter_value MEM_DDR3_R_ODT0_4X4 {off off on off} + set_component_parameter_value MEM_DDR3_R_ODT1_2X2 {off off} + set_component_parameter_value MEM_DDR3_R_ODT1_4X2 {on on off off} + set_component_parameter_value MEM_DDR3_R_ODT1_4X4 {off off off on} + set_component_parameter_value MEM_DDR3_R_ODT2_4X4 {on off off off} + set_component_parameter_value MEM_DDR3_R_ODT3_4X4 {off on off off} + set_component_parameter_value MEM_DDR3_R_ODTN_1X1 {Rank\ 0} + set_component_parameter_value MEM_DDR3_R_ODTN_2X2 {Rank\ 0 Rank\ 1} + set_component_parameter_value MEM_DDR3_R_ODTN_4X2 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDR3_R_ODTN_4X4 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDR3_SPEEDBIN_ENUM {DDR3_SPEEDBIN_2133} + set_component_parameter_value MEM_DDR3_SRT_ENUM {DDR3_SRT_NORMAL} + set_component_parameter_value MEM_DDR3_TCL {14} + set_component_parameter_value MEM_DDR3_TDH_DC_MV {100} + set_component_parameter_value MEM_DDR3_TDH_PS {55} + set_component_parameter_value MEM_DDR3_TDQSCK_PS {180} + set_component_parameter_value MEM_DDR3_TDQSQ_PS {75} + set_component_parameter_value MEM_DDR3_TDQSS_CYC {0.27} + set_component_parameter_value MEM_DDR3_TDSH_CYC {0.18} + set_component_parameter_value MEM_DDR3_TDSS_CYC {0.18} + set_component_parameter_value MEM_DDR3_TDS_AC_MV {135} + set_component_parameter_value MEM_DDR3_TDS_PS {53} + set_component_parameter_value MEM_DDR3_TFAW_NS {25.0} + set_component_parameter_value MEM_DDR3_TIH_DC_MV {100} + set_component_parameter_value MEM_DDR3_TIH_PS {95} + set_component_parameter_value MEM_DDR3_TINIT_US {500} + set_component_parameter_value MEM_DDR3_TIS_AC_MV {135} + set_component_parameter_value MEM_DDR3_TIS_PS {60} + set_component_parameter_value MEM_DDR3_TMRD_CK_CYC {4} + set_component_parameter_value MEM_DDR3_TQH_CYC {0.38} + set_component_parameter_value MEM_DDR3_TQSH_CYC {0.4} + set_component_parameter_value MEM_DDR3_TRAS_NS {33.0} + set_component_parameter_value MEM_DDR3_TRCD_NS {13.09} + set_component_parameter_value MEM_DDR3_TREFI_US {7.8} + set_component_parameter_value MEM_DDR3_TRFC_NS {160.0} + set_component_parameter_value MEM_DDR3_TRP_NS {13.09} + set_component_parameter_value MEM_DDR3_TRRD_CYC {6} + set_component_parameter_value MEM_DDR3_TRTP_CYC {8} + set_component_parameter_value MEM_DDR3_TWLH_PS {125.0} + set_component_parameter_value MEM_DDR3_TWLS_PS {125.0} + set_component_parameter_value MEM_DDR3_TWR_NS {15.0} + set_component_parameter_value MEM_DDR3_TWTR_CYC {8} + set_component_parameter_value MEM_DDR3_USE_DEFAULT_ODT {1} + set_component_parameter_value MEM_DDR3_WTCL {10} + set_component_parameter_value MEM_DDR3_W_ODT0_1X1 {on} + set_component_parameter_value MEM_DDR3_W_ODT0_2X2 {on off} + set_component_parameter_value MEM_DDR3_W_ODT0_4X2 {off off on on} + set_component_parameter_value MEM_DDR3_W_ODT0_4X4 {on off on off} + set_component_parameter_value MEM_DDR3_W_ODT1_2X2 {off on} + set_component_parameter_value MEM_DDR3_W_ODT1_4X2 {on on off off} + set_component_parameter_value MEM_DDR3_W_ODT1_4X4 {off on off on} + set_component_parameter_value MEM_DDR3_W_ODT2_4X4 {on off on off} + set_component_parameter_value MEM_DDR3_W_ODT3_4X4 {off on off on} + set_component_parameter_value MEM_DDR3_W_ODTN_1X1 {Rank\ 0} + set_component_parameter_value MEM_DDR3_W_ODTN_2X2 {Rank\ 0 Rank\ 1} + set_component_parameter_value MEM_DDR3_W_ODTN_4X2 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDR3_W_ODTN_4X4 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDR4_AC_PARITY_LATENCY {DDR4_AC_PARITY_LATENCY_DISABLE} + set_component_parameter_value MEM_DDR4_AC_PERSISTENT_ERROR {0} + set_component_parameter_value MEM_DDR4_ALERT_N_AC_LANE {0} + set_component_parameter_value MEM_DDR4_ALERT_N_AC_PIN {0} + set_component_parameter_value MEM_DDR4_ALERT_N_DQS_GROUP {0} + set_component_parameter_value MEM_DDR4_ALERT_N_PLACEMENT_ENUM {DDR4_ALERT_N_PLACEMENT_AUTO} + set_component_parameter_value MEM_DDR4_ALERT_PAR_EN {1} + set_component_parameter_value MEM_DDR4_ASR_ENUM {DDR4_ASR_MANUAL_NORMAL} + set_component_parameter_value MEM_DDR4_ATCL_ENUM {DDR4_ATCL_DISABLED} + set_component_parameter_value MEM_DDR4_BANK_ADDR_WIDTH {2} + set_component_parameter_value MEM_DDR4_BANK_GROUP_WIDTH {2} + set_component_parameter_value MEM_DDR4_BL_ENUM {DDR4_BL_BL8} + set_component_parameter_value MEM_DDR4_BT_ENUM {DDR4_BT_SEQUENTIAL} + set_component_parameter_value MEM_DDR4_CAL_MODE {0} + set_component_parameter_value MEM_DDR4_CFG_GEN_DBE {0} + set_component_parameter_value MEM_DDR4_CFG_GEN_SBE {0} + set_component_parameter_value MEM_DDR4_CHIP_ID_WIDTH {0} + set_component_parameter_value MEM_DDR4_CKE_PER_DIMM {1} + set_component_parameter_value MEM_DDR4_CK_WIDTH {1} + set_component_parameter_value MEM_DDR4_COL_ADDR_WIDTH {10} + set_component_parameter_value MEM_DDR4_DB_DQ_DRV_ENUM {DDR4_DB_DRV_STR_RZQ_7} + set_component_parameter_value MEM_DDR4_DB_RTT_NOM_ENUM {DDR4_DB_RTT_NOM_ODT_DISABLED} + set_component_parameter_value MEM_DDR4_DB_RTT_PARK_ENUM {DDR4_DB_RTT_PARK_ODT_DISABLED} + set_component_parameter_value MEM_DDR4_DB_RTT_WR_ENUM {DDR4_DB_RTT_WR_RZQ_3} + set_component_parameter_value MEM_DDR4_DEFAULT_VREFOUT {1} + set_component_parameter_value MEM_DDR4_DISCRETE_CS_WIDTH {1} + set_component_parameter_value MEM_DDR4_DISCRETE_MIRROR_ADDRESSING_EN {0} + set_component_parameter_value MEM_DDR4_DLL_EN {1} + set_component_parameter_value MEM_DDR4_DM_EN {1} + set_component_parameter_value MEM_DDR4_DQ_PER_DQS {8} + set_component_parameter_value MEM_DDR4_DQ_WIDTH {64} + set_component_parameter_value MEM_DDR4_DRV_STR_ENUM {DDR4_DRV_STR_RZQ_7} + set_component_parameter_value MEM_DDR4_FINE_GRANULARITY_REFRESH {DDR4_FINE_REFRESH_FIXED_1X} + set_component_parameter_value MEM_DDR4_FORMAT_ENUM {MEM_FORMAT_RDIMM} + set_component_parameter_value MEM_DDR4_GEARDOWN {DDR4_GEARDOWN_HR} + set_component_parameter_value MEM_DDR4_HIDE_ADV_MR_SETTINGS {1} + set_component_parameter_value MEM_DDR4_INTEL_DEFAULT_TERM {1} + set_component_parameter_value MEM_DDR4_INTERNAL_VREFDQ_MONITOR {0} + set_component_parameter_value MEM_DDR4_LRDIMM_ODT_LESS_BS {0} + set_component_parameter_value MEM_DDR4_LRDIMM_ODT_LESS_BS_PARK_OHM {240} + set_component_parameter_value MEM_DDR4_LRDIMM_VREFDQ_VALUE {} + set_component_parameter_value MEM_DDR4_MAX_POWERDOWN {0} + set_component_parameter_value MEM_DDR4_MIRROR_ADDRESSING_EN {1} + set_component_parameter_value MEM_DDR4_MPR_READ_FORMAT {DDR4_MPR_READ_FORMAT_SERIAL} + set_component_parameter_value MEM_DDR4_NUM_OF_DIMMS {1} + set_component_parameter_value MEM_DDR4_ODT_IN_POWERDOWN {1} + set_component_parameter_value MEM_DDR4_PER_DRAM_ADDR {0} + set_component_parameter_value MEM_DDR4_RANKS_PER_DIMM {1} + set_component_parameter_value MEM_DDR4_RCD_CA_IBT_ENUM {DDR4_RCD_CA_IBT_100} + set_component_parameter_value MEM_DDR4_RCD_CKE_IBT_ENUM {DDR4_RCD_CKE_IBT_100} + set_component_parameter_value MEM_DDR4_RCD_CS_IBT_ENUM {DDR4_RCD_CS_IBT_100} + set_component_parameter_value MEM_DDR4_RCD_ODT_IBT_ENUM {DDR4_RCD_ODT_IBT_100} + set_component_parameter_value MEM_DDR4_READ_DBI {1} + set_component_parameter_value MEM_DDR4_READ_PREAMBLE {2} + set_component_parameter_value MEM_DDR4_READ_PREAMBLE_TRAINING {0} + set_component_parameter_value MEM_DDR4_ROW_ADDR_WIDTH {16} + set_component_parameter_value MEM_DDR4_RTT_NOM_ENUM {DDR4_RTT_NOM_RZQ_4} + set_component_parameter_value MEM_DDR4_RTT_PARK {DDR4_RTT_PARK_ODT_DISABLED} + set_component_parameter_value MEM_DDR4_RTT_WR_ENUM {DDR4_RTT_WR_ODT_DISABLED} + set_component_parameter_value MEM_DDR4_R_ODT0_1X1 {off} + set_component_parameter_value MEM_DDR4_R_ODT0_2X2 {off off} + set_component_parameter_value MEM_DDR4_R_ODT0_4X2 {off off on on} + set_component_parameter_value MEM_DDR4_R_ODT0_4X4 {off off on off} + set_component_parameter_value MEM_DDR4_R_ODT1_2X2 {off off} + set_component_parameter_value MEM_DDR4_R_ODT1_4X2 {on on off off} + set_component_parameter_value MEM_DDR4_R_ODT1_4X4 {off off off on} + set_component_parameter_value MEM_DDR4_R_ODT2_4X4 {on off off off} + set_component_parameter_value MEM_DDR4_R_ODT3_4X4 {off on off off} + set_component_parameter_value MEM_DDR4_R_ODTN_1X1 {Rank\ 0} + set_component_parameter_value MEM_DDR4_R_ODTN_2X2 {Rank\ 0 Rank\ 1} + set_component_parameter_value MEM_DDR4_R_ODTN_4X2 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDR4_R_ODTN_4X4 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDR4_SELF_RFSH_ABORT {0} + set_component_parameter_value MEM_DDR4_SPD_133_RCD_DB_VENDOR_LSB {0} + set_component_parameter_value MEM_DDR4_SPD_134_RCD_DB_VENDOR_MSB {0} + set_component_parameter_value MEM_DDR4_SPD_135_RCD_REV {0} + set_component_parameter_value MEM_DDR4_SPD_137_RCD_CA_DRV {101} + set_component_parameter_value MEM_DDR4_SPD_138_RCD_CK_DRV {5} + set_component_parameter_value MEM_DDR4_SPD_139_DB_REV {0} + set_component_parameter_value MEM_DDR4_SPD_140_DRAM_VREFDQ_R0 {29} + set_component_parameter_value MEM_DDR4_SPD_141_DRAM_VREFDQ_R1 {29} + set_component_parameter_value MEM_DDR4_SPD_142_DRAM_VREFDQ_R2 {29} + set_component_parameter_value MEM_DDR4_SPD_143_DRAM_VREFDQ_R3 {29} + set_component_parameter_value MEM_DDR4_SPD_144_DB_VREFDQ {37} + set_component_parameter_value MEM_DDR4_SPD_145_DB_MDQ_DRV {21} + set_component_parameter_value MEM_DDR4_SPD_148_DRAM_DRV {0} + set_component_parameter_value MEM_DDR4_SPD_149_DRAM_RTT_WR_NOM {20} + set_component_parameter_value MEM_DDR4_SPD_152_DRAM_RTT_PARK {39} + set_component_parameter_value MEM_DDR4_SPD_155_DB_VREFDQ_RANGE {0} + set_component_parameter_value MEM_DDR4_SPEEDBIN_ENUM {DDR4_SPEEDBIN_2666} + set_component_parameter_value MEM_DDR4_TCCD_L_CYC {6} + set_component_parameter_value MEM_DDR4_TCCD_S_CYC {4} + set_component_parameter_value MEM_DDR4_TCL {23} + set_component_parameter_value MEM_DDR4_TDIVW_DJ_CYC {0.1} + set_component_parameter_value MEM_DDR4_TDIVW_TOTAL_UI {0.2} + set_component_parameter_value MEM_DDR4_TDQSCK_PS {175} + set_component_parameter_value MEM_DDR4_TDQSQ_PS {66} + set_component_parameter_value MEM_DDR4_TDQSQ_UI {0.14} + set_component_parameter_value MEM_DDR4_TDQSS_CYC {0.27} + set_component_parameter_value MEM_DDR4_TDSH_CYC {0.18} + set_component_parameter_value MEM_DDR4_TDSS_CYC {0.18} + set_component_parameter_value MEM_DDR4_TDVWP_UI {0.72} + set_component_parameter_value MEM_DDR4_TEMP_CONTROLLED_RFSH_ENA {0} + set_component_parameter_value MEM_DDR4_TEMP_CONTROLLED_RFSH_RANGE {DDR4_TEMP_CONTROLLED_RFSH_NORMAL} + set_component_parameter_value MEM_DDR4_TEMP_SENSOR_READOUT {0} + set_component_parameter_value MEM_DDR4_TFAW_DLR_CYC {16} + set_component_parameter_value MEM_DDR4_TFAW_NS {21.0} + set_component_parameter_value MEM_DDR4_TIH_DC_MV {75} + set_component_parameter_value MEM_DDR4_TIH_PS {87} + set_component_parameter_value MEM_DDR4_TINIT_US {500} + set_component_parameter_value MEM_DDR4_TIS_AC_MV {100} + set_component_parameter_value MEM_DDR4_TIS_PS {62} + set_component_parameter_value MEM_DDR4_TMRD_CK_CYC {8} + set_component_parameter_value MEM_DDR4_TQH_CYC {0.38} + set_component_parameter_value MEM_DDR4_TQH_UI {0.74} + set_component_parameter_value MEM_DDR4_TQSH_CYC {0.4} + set_component_parameter_value MEM_DDR4_TRAS_NS {32.0} + set_component_parameter_value MEM_DDR4_TRCD_NS {14.16} + set_component_parameter_value MEM_DDR4_TREFI_US {7.8} + set_component_parameter_value MEM_DDR4_TRFC_DLR_NS {90.0} + set_component_parameter_value MEM_DDR4_TRFC_NS {350.0} + set_component_parameter_value MEM_DDR4_TRP_NS {14.16} + set_component_parameter_value MEM_DDR4_TRRD_DLR_CYC {4} + set_component_parameter_value MEM_DDR4_TRRD_L_CYC {6} + set_component_parameter_value MEM_DDR4_TRRD_S_CYC {4} + set_component_parameter_value MEM_DDR4_TWLH_CYC {0.13} + set_component_parameter_value MEM_DDR4_TWLH_PS {0.0} + set_component_parameter_value MEM_DDR4_TWLS_CYC {0.13} + set_component_parameter_value MEM_DDR4_TWLS_PS {0.0} + set_component_parameter_value MEM_DDR4_TWR_NS {15.0} + set_component_parameter_value MEM_DDR4_TWTR_L_CYC {9} + set_component_parameter_value MEM_DDR4_TWTR_S_CYC {3} + set_component_parameter_value MEM_DDR4_USER_VREFDQ_TRAINING_RANGE {DDR4_VREFDQ_TRAINING_RANGE_1} + set_component_parameter_value MEM_DDR4_USER_VREFDQ_TRAINING_VALUE {56.0} + set_component_parameter_value MEM_DDR4_USE_DEFAULT_ODT {1} + set_component_parameter_value MEM_DDR4_VDIVW_TOTAL {130} + set_component_parameter_value MEM_DDR4_WRITE_CRC {0} + set_component_parameter_value MEM_DDR4_WRITE_DBI {0} + set_component_parameter_value MEM_DDR4_WRITE_PREAMBLE {1} + set_component_parameter_value MEM_DDR4_WTCL {18} + set_component_parameter_value MEM_DDR4_W_ODT0_1X1 {on} + set_component_parameter_value MEM_DDR4_W_ODT0_2X2 {on off} + set_component_parameter_value MEM_DDR4_W_ODT0_4X2 {off off on on} + set_component_parameter_value MEM_DDR4_W_ODT0_4X4 {on off on off} + set_component_parameter_value MEM_DDR4_W_ODT1_2X2 {off on} + set_component_parameter_value MEM_DDR4_W_ODT1_4X2 {on on off off} + set_component_parameter_value MEM_DDR4_W_ODT1_4X4 {off on off on} + set_component_parameter_value MEM_DDR4_W_ODT2_4X4 {on off on off} + set_component_parameter_value MEM_DDR4_W_ODT3_4X4 {off on off on} + set_component_parameter_value MEM_DDR4_W_ODTN_1X1 {Rank\ 0} + set_component_parameter_value MEM_DDR4_W_ODTN_2X2 {Rank\ 0 Rank\ 1} + set_component_parameter_value MEM_DDR4_W_ODTN_4X2 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDR4_W_ODTN_4X4 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDRT_AC_PARITY_LATENCY {DDRT_AC_PARITY_LATENCY_DISABLE} + set_component_parameter_value MEM_DDRT_AC_PERSISTENT_ERROR {0} + set_component_parameter_value MEM_DDRT_ALERT_N_AC_LANE {0} + set_component_parameter_value MEM_DDRT_ALERT_N_AC_PIN {0} + set_component_parameter_value MEM_DDRT_ALERT_N_DQS_GROUP {0} + set_component_parameter_value MEM_DDRT_ALERT_N_PLACEMENT_ENUM {DDRT_ALERT_N_PLACEMENT_AUTO} + set_component_parameter_value MEM_DDRT_ALERT_PAR_EN {1} + set_component_parameter_value MEM_DDRT_ASR_ENUM {DDRT_ASR_MANUAL_NORMAL} + set_component_parameter_value MEM_DDRT_ATCL_ENUM {DDRT_ATCL_DISABLED} + set_component_parameter_value MEM_DDRT_BANK_ADDR_WIDTH {2} + set_component_parameter_value MEM_DDRT_BANK_GROUP_WIDTH {2} + set_component_parameter_value MEM_DDRT_BL_ENUM {DDRT_BL_BL8} + set_component_parameter_value MEM_DDRT_BT_ENUM {DDRT_BT_SEQUENTIAL} + set_component_parameter_value MEM_DDRT_CAL_MODE {0} + set_component_parameter_value MEM_DDRT_CFG_GEN_DBE {0} + set_component_parameter_value MEM_DDRT_CFG_GEN_SBE {0} + set_component_parameter_value MEM_DDRT_CKE_PER_DIMM {1} + set_component_parameter_value MEM_DDRT_COL_ADDR_WIDTH {10} + set_component_parameter_value MEM_DDRT_DB_DQ_DRV_ENUM {DDRT_DB_DRV_STR_RZQ_7} + set_component_parameter_value MEM_DDRT_DB_RTT_NOM_ENUM {DDRT_DB_RTT_NOM_ODT_DISABLED} + set_component_parameter_value MEM_DDRT_DB_RTT_PARK_ENUM {DDRT_DB_RTT_PARK_ODT_DISABLED} + set_component_parameter_value MEM_DDRT_DB_RTT_WR_ENUM {DDRT_DB_RTT_WR_RZQ_4} + set_component_parameter_value MEM_DDRT_DEFAULT_ADDED_LATENCY {1} + set_component_parameter_value MEM_DDRT_DEFAULT_PREAMBLE {1} + set_component_parameter_value MEM_DDRT_DEFAULT_VREFOUT {1} + set_component_parameter_value MEM_DDRT_DISCRETE_CS_WIDTH {1} + set_component_parameter_value MEM_DDRT_DISCRETE_MIRROR_ADDRESSING_EN {0} + set_component_parameter_value MEM_DDRT_DLL_EN {1} + set_component_parameter_value MEM_DDRT_DM_EN {0} + set_component_parameter_value MEM_DDRT_DQ_PER_DQS {4} + set_component_parameter_value MEM_DDRT_DQ_WIDTH {72} + set_component_parameter_value MEM_DDRT_DRV_STR_ENUM {DDRT_DRV_STR_RZQ_7} + set_component_parameter_value MEM_DDRT_FINE_GRANULARITY_REFRESH {DDRT_FINE_REFRESH_FIXED_1X} + set_component_parameter_value MEM_DDRT_FORMAT_ENUM {MEM_FORMAT_LRDIMM} + set_component_parameter_value MEM_DDRT_GEARDOWN {DDRT_GEARDOWN_HR} + set_component_parameter_value MEM_DDRT_HIDE_ADV_MR_SETTINGS {1} + set_component_parameter_value MEM_DDRT_HIDE_LATENCY_SETTINGS {1} + set_component_parameter_value MEM_DDRT_I2C_DIMM_0_SA {0} + set_component_parameter_value MEM_DDRT_I2C_DIMM_1_SA {1} + set_component_parameter_value MEM_DDRT_I2C_DIMM_2_SA {2} + set_component_parameter_value MEM_DDRT_I2C_DIMM_3_SA {3} + set_component_parameter_value MEM_DDRT_INTERNAL_VREFDQ_MONITOR {0} + set_component_parameter_value MEM_DDRT_LRDIMM_ODT_LESS_BS {0} + set_component_parameter_value MEM_DDRT_LRDIMM_ODT_LESS_BS_PARK_OHM {240} + set_component_parameter_value MEM_DDRT_LRDIMM_VREFDQ_VALUE {} + set_component_parameter_value MEM_DDRT_MAX_POWERDOWN {0} + set_component_parameter_value MEM_DDRT_MIRROR_ADDRESSING_EN {1} + set_component_parameter_value MEM_DDRT_MPR_READ_FORMAT {DDRT_MPR_READ_FORMAT_SERIAL} + set_component_parameter_value MEM_DDRT_NUM_OF_DIMMS {1} + set_component_parameter_value MEM_DDRT_ODT_IN_POWERDOWN {1} + set_component_parameter_value MEM_DDRT_PARTIAL_WRITES {0} + set_component_parameter_value MEM_DDRT_PERSISTENT_MODE {1} + set_component_parameter_value MEM_DDRT_PER_DRAM_ADDR {0} + set_component_parameter_value MEM_DDRT_PWR_MODE {DDRT_PWR_MODE_12W} + set_component_parameter_value MEM_DDRT_RANKS_PER_DIMM {1} + set_component_parameter_value MEM_DDRT_RCD_CA_IBT_ENUM {DDRT_RCD_CA_IBT_100} + set_component_parameter_value MEM_DDRT_RCD_CKE_IBT_ENUM {DDRT_RCD_CKE_IBT_100} + set_component_parameter_value MEM_DDRT_RCD_CS_IBT_ENUM {DDRT_RCD_CS_IBT_100} + set_component_parameter_value MEM_DDRT_RCD_ODT_IBT_ENUM {DDRT_RCD_ODT_IBT_100} + set_component_parameter_value MEM_DDRT_READ_DBI {0} + set_component_parameter_value MEM_DDRT_READ_PREAMBLE_TRAINING {0} + set_component_parameter_value MEM_DDRT_ROW_ADDR_WIDTH {18} + set_component_parameter_value MEM_DDRT_RTT_NOM_ENUM {DDRT_RTT_NOM_RZQ_4} + set_component_parameter_value MEM_DDRT_RTT_PARK {DDRT_RTT_PARK_ODT_DISABLED} + set_component_parameter_value MEM_DDRT_RTT_WR_ENUM {DDRT_RTT_WR_ODT_DISABLED} + set_component_parameter_value MEM_DDRT_R_ODT0_1X1 {off} + set_component_parameter_value MEM_DDRT_R_ODT0_2X2 {off off} + set_component_parameter_value MEM_DDRT_R_ODT0_4X2 {off off on on} + set_component_parameter_value MEM_DDRT_R_ODT0_4X4 {off off off off} + set_component_parameter_value MEM_DDRT_R_ODT1_2X2 {off off} + set_component_parameter_value MEM_DDRT_R_ODT1_4X2 {on on off off} + set_component_parameter_value MEM_DDRT_R_ODT1_4X4 {off off on on} + set_component_parameter_value MEM_DDRT_R_ODT2_4X4 {off off off off} + set_component_parameter_value MEM_DDRT_R_ODT3_4X4 {on on off off} + set_component_parameter_value MEM_DDRT_R_ODTN_1X1 {Rank\ 0} + set_component_parameter_value MEM_DDRT_R_ODTN_2X2 {Rank\ 0 Rank\ 1} + set_component_parameter_value MEM_DDRT_R_ODTN_4X2 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDRT_R_ODTN_4X4 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDRT_SELF_RFSH_ABORT {0} + set_component_parameter_value MEM_DDRT_SPD_133_RCD_DB_VENDOR_LSB {0} + set_component_parameter_value MEM_DDRT_SPD_134_RCD_DB_VENDOR_MSB {0} + set_component_parameter_value MEM_DDRT_SPD_135_RCD_REV {0} + set_component_parameter_value MEM_DDRT_SPD_137_RCD_CA_DRV {85} + set_component_parameter_value MEM_DDRT_SPD_138_RCD_CK_DRV {5} + set_component_parameter_value MEM_DDRT_SPD_139_DB_REV {0} + set_component_parameter_value MEM_DDRT_SPD_140_DRAM_VREFDQ_R0 {29} + set_component_parameter_value MEM_DDRT_SPD_141_DRAM_VREFDQ_R1 {29} + set_component_parameter_value MEM_DDRT_SPD_142_DRAM_VREFDQ_R2 {29} + set_component_parameter_value MEM_DDRT_SPD_143_DRAM_VREFDQ_R3 {29} + set_component_parameter_value MEM_DDRT_SPD_144_DB_VREFDQ {25} + set_component_parameter_value MEM_DDRT_SPD_145_DB_MDQ_DRV {21} + set_component_parameter_value MEM_DDRT_SPD_148_DRAM_DRV {0} + set_component_parameter_value MEM_DDRT_SPD_149_DRAM_RTT_WR_NOM {20} + set_component_parameter_value MEM_DDRT_SPD_152_DRAM_RTT_PARK {39} + set_component_parameter_value MEM_DDRT_SPEEDBIN_ENUM {DDRT_SPEEDBIN_2400} + set_component_parameter_value MEM_DDRT_TCCD_L_CYC {6} + set_component_parameter_value MEM_DDRT_TCCD_S_CYC {4} + set_component_parameter_value MEM_DDRT_TCL {15} + set_component_parameter_value MEM_DDRT_TDIVW_DJ_CYC {0.1} + set_component_parameter_value MEM_DDRT_TDIVW_TOTAL_UI {0.2} + set_component_parameter_value MEM_DDRT_TDQSCK_PS {165} + set_component_parameter_value MEM_DDRT_TDQSQ_PS {66} + set_component_parameter_value MEM_DDRT_TDQSQ_UI {0.16} + set_component_parameter_value MEM_DDRT_TDQSS_CYC {0.27} + set_component_parameter_value MEM_DDRT_TDSH_CYC {0.18} + set_component_parameter_value MEM_DDRT_TDSS_CYC {0.18} + set_component_parameter_value MEM_DDRT_TDVWP_UI {0.72} + set_component_parameter_value MEM_DDRT_TEMP_CONTROLLED_RFSH_ENA {0} + set_component_parameter_value MEM_DDRT_TEMP_CONTROLLED_RFSH_RANGE {DDRT_TEMP_CONTROLLED_RFSH_NORMAL} + set_component_parameter_value MEM_DDRT_TEMP_SENSOR_READOUT {0} + set_component_parameter_value MEM_DDRT_TFAW_DLR_CYC {16} + set_component_parameter_value MEM_DDRT_TFAW_NS {21.0} + set_component_parameter_value MEM_DDRT_TIH_DC_MV {75} + set_component_parameter_value MEM_DDRT_TIH_PS {95} + set_component_parameter_value MEM_DDRT_TINIT_US {500} + set_component_parameter_value MEM_DDRT_TIS_AC_MV {100} + set_component_parameter_value MEM_DDRT_TIS_PS {60} + set_component_parameter_value MEM_DDRT_TMRD_CK_CYC {8} + set_component_parameter_value MEM_DDRT_TQH_CYC {0.38} + set_component_parameter_value MEM_DDRT_TQH_UI {0.76} + set_component_parameter_value MEM_DDRT_TQSH_CYC {0.38} + set_component_parameter_value MEM_DDRT_TRAS_NS {32.0} + set_component_parameter_value MEM_DDRT_TRCD_NS {15.0} + set_component_parameter_value MEM_DDRT_TREFI_US {7.8} + set_component_parameter_value MEM_DDRT_TRFC_DLR_NS {90.0} + set_component_parameter_value MEM_DDRT_TRFC_NS {260.0} + set_component_parameter_value MEM_DDRT_TRP_NS {15.0} + set_component_parameter_value MEM_DDRT_TRRD_DLR_CYC {4} + set_component_parameter_value MEM_DDRT_TRRD_L_CYC {6} + set_component_parameter_value MEM_DDRT_TRRD_S_CYC {4} + set_component_parameter_value MEM_DDRT_TWLH_CYC {0.13} + set_component_parameter_value MEM_DDRT_TWLH_PS {0.0} + set_component_parameter_value MEM_DDRT_TWLS_CYC {0.13} + set_component_parameter_value MEM_DDRT_TWLS_PS {0.0} + set_component_parameter_value MEM_DDRT_TWR_NS {15.0} + set_component_parameter_value MEM_DDRT_TWTR_L_CYC {9} + set_component_parameter_value MEM_DDRT_TWTR_S_CYC {3} + set_component_parameter_value MEM_DDRT_USER_READ_PREAMBLE {1} + set_component_parameter_value MEM_DDRT_USER_TCL_ADDED {0} + set_component_parameter_value MEM_DDRT_USER_VREFDQ_TRAINING_RANGE {DDRT_VREFDQ_TRAINING_RANGE_1} + set_component_parameter_value MEM_DDRT_USER_VREFDQ_TRAINING_VALUE {56.0} + set_component_parameter_value MEM_DDRT_USER_WRITE_PREAMBLE {1} + set_component_parameter_value MEM_DDRT_USER_WTCL_ADDED {6} + set_component_parameter_value MEM_DDRT_USE_DEFAULT_ODT {1} + set_component_parameter_value MEM_DDRT_VDIVW_TOTAL {136} + set_component_parameter_value MEM_DDRT_WRITE_CRC {0} + set_component_parameter_value MEM_DDRT_WRITE_DBI {0} + set_component_parameter_value MEM_DDRT_WTCL {18} + set_component_parameter_value MEM_DDRT_W_ODT0_1X1 {on} + set_component_parameter_value MEM_DDRT_W_ODT0_2X2 {on off} + set_component_parameter_value MEM_DDRT_W_ODT0_4X2 {off off on on} + set_component_parameter_value MEM_DDRT_W_ODT0_4X4 {on on off off} + set_component_parameter_value MEM_DDRT_W_ODT1_2X2 {off on} + set_component_parameter_value MEM_DDRT_W_ODT1_4X2 {on on off off} + set_component_parameter_value MEM_DDRT_W_ODT1_4X4 {off off on on} + set_component_parameter_value MEM_DDRT_W_ODT2_4X4 {off off on on} + set_component_parameter_value MEM_DDRT_W_ODT3_4X4 {on on off off} + set_component_parameter_value MEM_DDRT_W_ODTN_1X1 {Rank\ 0} + set_component_parameter_value MEM_DDRT_W_ODTN_2X2 {Rank\ 0 Rank\ 1} + set_component_parameter_value MEM_DDRT_W_ODTN_4X2 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_DDRT_W_ODTN_4X4 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_LPDDR3_BANK_ADDR_WIDTH {3} + set_component_parameter_value MEM_LPDDR3_BL {LPDDR3_BL_BL8} + set_component_parameter_value MEM_LPDDR3_CK_WIDTH {1} + set_component_parameter_value MEM_LPDDR3_COL_ADDR_WIDTH {10} + set_component_parameter_value MEM_LPDDR3_DATA_LATENCY {LPDDR3_DL_RL12_WL6} + set_component_parameter_value MEM_LPDDR3_DISCRETE_CS_WIDTH {1} + set_component_parameter_value MEM_LPDDR3_DM_EN {1} + set_component_parameter_value MEM_LPDDR3_DQODT {LPDDR3_DQODT_DISABLE} + set_component_parameter_value MEM_LPDDR3_DQ_WIDTH {32} + set_component_parameter_value MEM_LPDDR3_DRV_STR {LPDDR3_DRV_STR_40D_40U} + set_component_parameter_value MEM_LPDDR3_PDODT {LPDDR3_PDODT_DISABLED} + set_component_parameter_value MEM_LPDDR3_ROW_ADDR_WIDTH {15} + set_component_parameter_value MEM_LPDDR3_R_ODT0_1X1 {off} + set_component_parameter_value MEM_LPDDR3_R_ODT0_2X2 {off off} + set_component_parameter_value MEM_LPDDR3_R_ODT0_4X4 {off off off off} + set_component_parameter_value MEM_LPDDR3_R_ODT1_2X2 {off off} + set_component_parameter_value MEM_LPDDR3_R_ODT1_4X4 {off off off off} + set_component_parameter_value MEM_LPDDR3_R_ODT2_4X4 {off off off off} + set_component_parameter_value MEM_LPDDR3_R_ODT3_4X4 {off off off off} + set_component_parameter_value MEM_LPDDR3_R_ODTN_1X1 {Rank\ 0} + set_component_parameter_value MEM_LPDDR3_R_ODTN_2X2 {Rank\ 0 Rank\ 1} + set_component_parameter_value MEM_LPDDR3_R_ODTN_4X4 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_LPDDR3_SPEEDBIN_ENUM {LPDDR3_SPEEDBIN_1600} + set_component_parameter_value MEM_LPDDR3_TDH_DC_MV {100} + set_component_parameter_value MEM_LPDDR3_TDH_PS {100} + set_component_parameter_value MEM_LPDDR3_TDQSCKDL {614} + set_component_parameter_value MEM_LPDDR3_TDQSQ_PS {135} + set_component_parameter_value MEM_LPDDR3_TDQSS_CYC {1.25} + set_component_parameter_value MEM_LPDDR3_TDSH_CYC {0.2} + set_component_parameter_value MEM_LPDDR3_TDSS_CYC {0.2} + set_component_parameter_value MEM_LPDDR3_TDS_AC_MV {150} + set_component_parameter_value MEM_LPDDR3_TDS_PS {75} + set_component_parameter_value MEM_LPDDR3_TFAW_NS {50.0} + set_component_parameter_value MEM_LPDDR3_TIH_DC_MV {100} + set_component_parameter_value MEM_LPDDR3_TIH_PS {100} + set_component_parameter_value MEM_LPDDR3_TINIT_US {500} + set_component_parameter_value MEM_LPDDR3_TIS_AC_MV {150} + set_component_parameter_value MEM_LPDDR3_TIS_PS {75} + set_component_parameter_value MEM_LPDDR3_TMRR_CK_CYC {4} + set_component_parameter_value MEM_LPDDR3_TMRW_CK_CYC {10} + set_component_parameter_value MEM_LPDDR3_TQH_CYC {0.38} + set_component_parameter_value MEM_LPDDR3_TQSH_CYC {0.38} + set_component_parameter_value MEM_LPDDR3_TRAS_NS {42.5} + set_component_parameter_value MEM_LPDDR3_TRCD_NS {18.0} + set_component_parameter_value MEM_LPDDR3_TREFI_US {3.9} + set_component_parameter_value MEM_LPDDR3_TRFC_NS {210.0} + set_component_parameter_value MEM_LPDDR3_TRP_NS {18.0} + set_component_parameter_value MEM_LPDDR3_TRRD_CYC {8} + set_component_parameter_value MEM_LPDDR3_TRTP_CYC {6} + set_component_parameter_value MEM_LPDDR3_TWLH_PS {175.0} + set_component_parameter_value MEM_LPDDR3_TWLS_PS {175.0} + set_component_parameter_value MEM_LPDDR3_TWR_NS {15.0} + set_component_parameter_value MEM_LPDDR3_TWTR_CYC {6} + set_component_parameter_value MEM_LPDDR3_USE_DEFAULT_ODT {1} + set_component_parameter_value MEM_LPDDR3_W_ODT0_1X1 {on} + set_component_parameter_value MEM_LPDDR3_W_ODT0_2X2 {on on} + set_component_parameter_value MEM_LPDDR3_W_ODT0_4X4 {on on on on} + set_component_parameter_value MEM_LPDDR3_W_ODT1_2X2 {off off} + set_component_parameter_value MEM_LPDDR3_W_ODT1_4X4 {off off off off} + set_component_parameter_value MEM_LPDDR3_W_ODT2_4X4 {off off off off} + set_component_parameter_value MEM_LPDDR3_W_ODT3_4X4 {off off off off} + set_component_parameter_value MEM_LPDDR3_W_ODTN_1X1 {Rank\ 0} + set_component_parameter_value MEM_LPDDR3_W_ODTN_2X2 {Rank\ 0 Rank\ 1} + set_component_parameter_value MEM_LPDDR3_W_ODTN_4X4 {Rank\ 0 Rank\ 1 Rank\ 2 Rank\ 3} + set_component_parameter_value MEM_QDR2_ADDR_WIDTH {19} + set_component_parameter_value MEM_QDR2_BL {4} + set_component_parameter_value MEM_QDR2_BWS_EN {1} + set_component_parameter_value MEM_QDR2_DATA_PER_DEVICE {36} + set_component_parameter_value MEM_QDR2_INTERNAL_JITTER_NS {0.08} + set_component_parameter_value MEM_QDR2_SPEEDBIN_ENUM {QDR2_SPEEDBIN_633} + set_component_parameter_value MEM_QDR2_TCCQO_NS {0.45} + set_component_parameter_value MEM_QDR2_TCQDOH_NS {-0.09} + set_component_parameter_value MEM_QDR2_TCQD_NS {0.09} + set_component_parameter_value MEM_QDR2_TCQH_NS {0.71} + set_component_parameter_value MEM_QDR2_THA_NS {0.18} + set_component_parameter_value MEM_QDR2_THD_NS {0.18} + set_component_parameter_value MEM_QDR2_TRL_CYC {2.5} + set_component_parameter_value MEM_QDR2_TSA_NS {0.23} + set_component_parameter_value MEM_QDR2_TSD_NS {0.23} + set_component_parameter_value MEM_QDR2_WIDTH_EXPANDED {0} + set_component_parameter_value MEM_QDR4_AC_ODT_MODE_ENUM {QDR4_ODT_25_PCT} + set_component_parameter_value MEM_QDR4_ADDR_INV_ENA {0} + set_component_parameter_value MEM_QDR4_ADDR_WIDTH {21} + set_component_parameter_value MEM_QDR4_CK_ODT_MODE_ENUM {QDR4_ODT_25_PCT} + set_component_parameter_value MEM_QDR4_DATA_INV_ENA {1} + set_component_parameter_value MEM_QDR4_DATA_ODT_MODE_ENUM {QDR4_ODT_25_PCT} + set_component_parameter_value MEM_QDR4_DQ_PER_PORT_PER_DEVICE {36} + set_component_parameter_value MEM_QDR4_MEM_TYPE_ENUM {MEM_XP} + set_component_parameter_value MEM_QDR4_PD_OUTPUT_DRIVE_MODE_ENUM {QDR4_OUTPUT_DRIVE_25_PCT} + set_component_parameter_value MEM_QDR4_PU_OUTPUT_DRIVE_MODE_ENUM {QDR4_OUTPUT_DRIVE_25_PCT} + set_component_parameter_value MEM_QDR4_SKIP_ODT_SWEEPING {1} + set_component_parameter_value MEM_QDR4_SPEEDBIN_ENUM {QDR4_SPEEDBIN_2133} + set_component_parameter_value MEM_QDR4_TASH_PS {170} + set_component_parameter_value MEM_QDR4_TCKDK_MAX_PS {150} + set_component_parameter_value MEM_QDR4_TCKDK_MIN_PS {-150} + set_component_parameter_value MEM_QDR4_TCKQK_MAX_PS {225} + set_component_parameter_value MEM_QDR4_TCSH_PS {170} + set_component_parameter_value MEM_QDR4_TISH_PS {150} + set_component_parameter_value MEM_QDR4_TQH_CYC {0.4} + set_component_parameter_value MEM_QDR4_TQKQ_MAX_PS {75} + set_component_parameter_value MEM_QDR4_USE_ADDR_PARITY {0} + set_component_parameter_value MEM_QDR4_WIDTH_EXPANDED {0} + set_component_parameter_value MEM_RLD2_ADDR_WIDTH {21} + set_component_parameter_value MEM_RLD2_BANK_ADDR_WIDTH {3} + set_component_parameter_value MEM_RLD2_BL {4} + set_component_parameter_value MEM_RLD2_CONFIG_ENUM {RLD2_CONFIG_TRC_8_TRL_8_TWL_9} + set_component_parameter_value MEM_RLD2_DM_EN {1} + set_component_parameter_value MEM_RLD2_DQ_PER_DEVICE {9} + set_component_parameter_value MEM_RLD2_DRIVE_IMPEDENCE_ENUM {RLD2_DRIVE_IMPEDENCE_INTERNAL_50} + set_component_parameter_value MEM_RLD2_ODT_MODE_ENUM {RLD2_ODT_ON} + set_component_parameter_value MEM_RLD2_REFRESH_INTERVAL_US {0.24} + set_component_parameter_value MEM_RLD2_SPEEDBIN_ENUM {RLD2_SPEEDBIN_18} + set_component_parameter_value MEM_RLD2_TAH_NS {0.3} + set_component_parameter_value MEM_RLD2_TAS_NS {0.3} + set_component_parameter_value MEM_RLD2_TCKDK_MAX_NS {0.3} + set_component_parameter_value MEM_RLD2_TCKDK_MIN_NS {-0.3} + set_component_parameter_value MEM_RLD2_TCKH_CYC {0.45} + set_component_parameter_value MEM_RLD2_TCKQK_MAX_NS {0.2} + set_component_parameter_value MEM_RLD2_TDH_NS {0.17} + set_component_parameter_value MEM_RLD2_TDS_NS {0.17} + set_component_parameter_value MEM_RLD2_TQKH_HCYC {0.9} + set_component_parameter_value MEM_RLD2_TQKQ_MAX_NS {0.12} + set_component_parameter_value MEM_RLD2_TQKQ_MIN_NS {-0.12} + set_component_parameter_value MEM_RLD2_WIDTH_EXPANDED {0} + set_component_parameter_value MEM_RLD3_ADDR_WIDTH {20} + set_component_parameter_value MEM_RLD3_AREF_PROTOCOL_ENUM {RLD3_AREF_BAC} + set_component_parameter_value MEM_RLD3_BANK_ADDR_WIDTH {4} + set_component_parameter_value MEM_RLD3_BL {2} + set_component_parameter_value MEM_RLD3_DATA_LATENCY_MODE_ENUM {RLD3_DL_RL16_WL17} + set_component_parameter_value MEM_RLD3_DEPTH_EXPANDED {0} + set_component_parameter_value MEM_RLD3_DM_EN {1} + set_component_parameter_value MEM_RLD3_DQ_PER_DEVICE {36} + set_component_parameter_value MEM_RLD3_ODT_MODE_ENUM {RLD3_ODT_40} + set_component_parameter_value MEM_RLD3_OUTPUT_DRIVE_MODE_ENUM {RLD3_OUTPUT_DRIVE_40} + set_component_parameter_value MEM_RLD3_SPEEDBIN_ENUM {RLD3_SPEEDBIN_093E} + set_component_parameter_value MEM_RLD3_TCKDK_MAX_CYC {0.27} + set_component_parameter_value MEM_RLD3_TCKDK_MIN_CYC {-0.27} + set_component_parameter_value MEM_RLD3_TCKQK_MAX_PS {135} + set_component_parameter_value MEM_RLD3_TDH_DC_MV {100} + set_component_parameter_value MEM_RLD3_TDH_PS {5} + set_component_parameter_value MEM_RLD3_TDS_AC_MV {150} + set_component_parameter_value MEM_RLD3_TDS_PS {-30} + set_component_parameter_value MEM_RLD3_TIH_DC_MV {100} + set_component_parameter_value MEM_RLD3_TIH_PS {65} + set_component_parameter_value MEM_RLD3_TIS_AC_MV {150} + set_component_parameter_value MEM_RLD3_TIS_PS {85} + set_component_parameter_value MEM_RLD3_TQH_CYC {0.38} + set_component_parameter_value MEM_RLD3_TQKQ_MAX_PS {75} + set_component_parameter_value MEM_RLD3_T_RC_MODE_ENUM {RLD3_TRC_9} + set_component_parameter_value MEM_RLD3_WIDTH_EXPANDED {0} + set_component_parameter_value MEM_RLD3_WRITE_PROTOCOL_ENUM {RLD3_WRITE_1BANK} + set_component_parameter_value NUM_IPS {1} + set_component_parameter_value PHY_DDR3_CAL_ADDR0 {0} + set_component_parameter_value PHY_DDR3_CAL_ADDR1 {8} + set_component_parameter_value PHY_DDR3_CAL_ENABLE_NON_DES {0} + set_component_parameter_value PHY_DDR3_CONFIG_ENUM {CONFIG_PHY_AND_HARD_CTRL} + set_component_parameter_value PHY_DDR3_CORE_CLKS_SHARING_ENUM {CORE_CLKS_SHARING_DISABLED} + set_component_parameter_value PHY_DDR3_CORE_CLKS_SHARING_EXPOSE_SLAVE_OUT {0} + set_component_parameter_value PHY_DDR3_DEFAULT_IO {1} + set_component_parameter_value PHY_DDR3_DEFAULT_REF_CLK_FREQ {1} + set_component_parameter_value PHY_DDR3_HPS_ENABLE_EARLY_RELEASE {0} + set_component_parameter_value PHY_DDR3_IO_VOLTAGE {1.5} + set_component_parameter_value PHY_DDR3_MEM_CLK_FREQ_MHZ {1066.667} + set_component_parameter_value PHY_DDR3_MIMIC_HPS_EMIF {0} + set_component_parameter_value PHY_DDR3_RATE_ENUM {RATE_QUARTER} + set_component_parameter_value PHY_DDR3_REF_CLK_JITTER_PS {10.0} + set_component_parameter_value PHY_DDR3_USER_AC_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_AC_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_AC_MODE_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_AC_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_AUTO_STARTING_VREFIN_EN {1} + set_component_parameter_value PHY_DDR3_USER_CK_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_CK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_CK_MODE_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_CK_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_DATA_IN_MODE_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_DATA_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_DATA_OUT_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_DATA_OUT_MODE_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_DATA_OUT_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_DLL_CORE_UPDN_EN {1} + set_component_parameter_value PHY_DDR3_USER_PERIODIC_OCT_RECAL_ENUM {PERIODIC_OCT_RECAL_AUTO} + set_component_parameter_value PHY_DDR3_USER_PING_PONG_EN {0} + set_component_parameter_value PHY_DDR3_USER_PLL_REF_CLK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_REF_CLK_FREQ_MHZ {-1.0} + set_component_parameter_value PHY_DDR3_USER_RZQ_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDR3_USER_STARTING_VREFIN {70.0} + set_component_parameter_value PHY_DDR4_ALLOW_72_DQ_WIDTH {0} + set_component_parameter_value PHY_DDR4_CONFIG_ENUM {CONFIG_PHY_AND_HARD_CTRL} + set_component_parameter_value PHY_DDR4_CORE_CLKS_SHARING_ENUM {CORE_CLKS_SHARING_DISABLED} + set_component_parameter_value PHY_DDR4_CORE_CLKS_SHARING_EXPOSE_SLAVE_OUT {0} + set_component_parameter_value PHY_DDR4_DEFAULT_IO {0} + set_component_parameter_value PHY_DDR4_DEFAULT_REF_CLK_FREQ {0} + set_component_parameter_value PHY_DDR4_HPS_ENABLE_EARLY_RELEASE {0} + set_component_parameter_value PHY_DDR4_IO_VOLTAGE {1.2} + set_component_parameter_value PHY_DDR4_MEM_CLK_FREQ_MHZ {1200.0} + set_component_parameter_value PHY_DDR4_MIMIC_HPS_EMIF {0} + set_component_parameter_value PHY_DDR4_RATE_ENUM {RATE_QUARTER} + set_component_parameter_value PHY_DDR4_REF_CLK_JITTER_PS {10.0} + set_component_parameter_value PHY_DDR4_USER_AC_DEEMPHASIS_ENUM {DEEMPHASIS_MODE_OFF} + set_component_parameter_value PHY_DDR4_USER_AC_IO_STD_ENUM {IO_STD_SSTL_12} + set_component_parameter_value PHY_DDR4_USER_AC_MODE_ENUM {OUT_OCT_40_CAL} + set_component_parameter_value PHY_DDR4_USER_AC_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_DDR4_USER_AUTO_STARTING_VREFIN_EN {1} + set_component_parameter_value PHY_DDR4_USER_CK_DEEMPHASIS_ENUM {DEEMPHASIS_MODE_OFF} + set_component_parameter_value PHY_DDR4_USER_CK_IO_STD_ENUM {IO_STD_SSTL_12} + set_component_parameter_value PHY_DDR4_USER_CK_MODE_ENUM {OUT_OCT_40_CAL} + set_component_parameter_value PHY_DDR4_USER_CK_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_DDR4_USER_CLAMSHELL_EN {0} + set_component_parameter_value PHY_DDR4_USER_DATA_IN_MODE_ENUM {IN_OCT_60_CAL} + set_component_parameter_value PHY_DDR4_USER_DATA_IO_STD_ENUM {IO_STD_POD_12} + set_component_parameter_value PHY_DDR4_USER_DATA_OUT_DEEMPHASIS_ENUM {DEEMPHASIS_MODE_HIGH} + set_component_parameter_value PHY_DDR4_USER_DATA_OUT_MODE_ENUM {OUT_OCT_40_CAL} + set_component_parameter_value PHY_DDR4_USER_DATA_OUT_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_DDR4_USER_DLL_CORE_UPDN_EN {1} + set_component_parameter_value PHY_DDR4_USER_PERIODIC_OCT_RECAL_ENUM {PERIODIC_OCT_RECAL_AUTO} + set_component_parameter_value PHY_DDR4_USER_PING_PONG_EN {0} + set_component_parameter_value PHY_DDR4_USER_PLL_REF_CLK_IO_STD_ENUM {IO_STD_TRUE_DIFF_SIGNALING} + set_component_parameter_value PHY_DDR4_USER_REF_CLK_FREQ_MHZ {33.333} + set_component_parameter_value PHY_DDR4_USER_RZQ_IO_STD_ENUM {IO_STD_CMOS_12} + set_component_parameter_value PHY_DDR4_USER_STARTING_VREFIN {70.0} + set_component_parameter_value PHY_DDRT_2CH_EN {0} + set_component_parameter_value PHY_DDRT_CONFIG_ENUM {CONFIG_PHY_AND_SOFT_CTRL} + set_component_parameter_value PHY_DDRT_CORE_CLKS_SHARING_ENUM {CORE_CLKS_SHARING_DISABLED} + set_component_parameter_value PHY_DDRT_CORE_CLKS_SHARING_EXPOSE_SLAVE_OUT {0} + set_component_parameter_value PHY_DDRT_DEFAULT_IO {1} + set_component_parameter_value PHY_DDRT_DEFAULT_REF_CLK_FREQ {1} + set_component_parameter_value PHY_DDRT_EXPORT_CLK_STP_IF {0} + set_component_parameter_value PHY_DDRT_HPS_ENABLE_EARLY_RELEASE {0} + set_component_parameter_value PHY_DDRT_I2C_USE_SMC {0} + set_component_parameter_value PHY_DDRT_IC_EN {1} + set_component_parameter_value PHY_DDRT_IO_VOLTAGE {1.2} + set_component_parameter_value PHY_DDRT_MEM_CLK_FREQ_MHZ {1200.0} + set_component_parameter_value PHY_DDRT_MIMIC_HPS_EMIF {0} + set_component_parameter_value PHY_DDRT_RATE_ENUM {RATE_QUARTER} + set_component_parameter_value PHY_DDRT_REF_CLK_JITTER_PS {10.0} + set_component_parameter_value PHY_DDRT_USER_AC_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_AC_IN_MODE_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_AC_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_AC_MODE_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_AC_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_AUTO_STARTING_VREFIN_EN {1} + set_component_parameter_value PHY_DDRT_USER_CK_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_CK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_CK_MODE_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_CK_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_DATA_IN_MODE_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_DATA_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_DATA_OUT_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_DATA_OUT_MODE_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_DATA_OUT_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_DLL_CORE_UPDN_EN {0} + set_component_parameter_value PHY_DDRT_USER_PERIODIC_OCT_RECAL_ENUM {PERIODIC_OCT_RECAL_AUTO} + set_component_parameter_value PHY_DDRT_USER_PING_PONG_EN {0} + set_component_parameter_value PHY_DDRT_USER_PLL_REF_CLK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_REF_CLK_FREQ_MHZ {-1.0} + set_component_parameter_value PHY_DDRT_USER_RZQ_IO_STD_ENUM {unset} + set_component_parameter_value PHY_DDRT_USER_STARTING_VREFIN {70.0} + set_component_parameter_value PHY_DDRT_USE_OLD_SMBUS_MULTICOL {0} + set_component_parameter_value PHY_LPDDR3_CONFIG_ENUM {CONFIG_PHY_AND_HARD_CTRL} + set_component_parameter_value PHY_LPDDR3_CORE_CLKS_SHARING_ENUM {CORE_CLKS_SHARING_DISABLED} + set_component_parameter_value PHY_LPDDR3_CORE_CLKS_SHARING_EXPOSE_SLAVE_OUT {0} + set_component_parameter_value PHY_LPDDR3_DEFAULT_IO {1} + set_component_parameter_value PHY_LPDDR3_DEFAULT_REF_CLK_FREQ {1} + set_component_parameter_value PHY_LPDDR3_HPS_ENABLE_EARLY_RELEASE {0} + set_component_parameter_value PHY_LPDDR3_IO_VOLTAGE {1.2} + set_component_parameter_value PHY_LPDDR3_MEM_CLK_FREQ_MHZ {800.0} + set_component_parameter_value PHY_LPDDR3_MIMIC_HPS_EMIF {0} + set_component_parameter_value PHY_LPDDR3_RATE_ENUM {RATE_QUARTER} + set_component_parameter_value PHY_LPDDR3_REF_CLK_JITTER_PS {10.0} + set_component_parameter_value PHY_LPDDR3_USER_AC_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_AC_IO_STD_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_AC_MODE_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_AC_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_AUTO_STARTING_VREFIN_EN {1} + set_component_parameter_value PHY_LPDDR3_USER_CK_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_CK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_CK_MODE_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_CK_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_DATA_IN_MODE_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_DATA_IO_STD_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_DATA_OUT_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_DATA_OUT_MODE_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_DATA_OUT_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_DLL_CORE_UPDN_EN {1} + set_component_parameter_value PHY_LPDDR3_USER_PERIODIC_OCT_RECAL_ENUM {PERIODIC_OCT_RECAL_AUTO} + set_component_parameter_value PHY_LPDDR3_USER_PING_PONG_EN {0} + set_component_parameter_value PHY_LPDDR3_USER_PLL_REF_CLK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_REF_CLK_FREQ_MHZ {-1.0} + set_component_parameter_value PHY_LPDDR3_USER_RZQ_IO_STD_ENUM {unset} + set_component_parameter_value PHY_LPDDR3_USER_STARTING_VREFIN {70.0} + set_component_parameter_value PHY_QDR2_CONFIG_ENUM {CONFIG_PHY_AND_SOFT_CTRL} + set_component_parameter_value PHY_QDR2_CORE_CLKS_SHARING_ENUM {CORE_CLKS_SHARING_DISABLED} + set_component_parameter_value PHY_QDR2_CORE_CLKS_SHARING_EXPOSE_SLAVE_OUT {0} + set_component_parameter_value PHY_QDR2_DEFAULT_IO {1} + set_component_parameter_value PHY_QDR2_DEFAULT_REF_CLK_FREQ {1} + set_component_parameter_value PHY_QDR2_HPS_ENABLE_EARLY_RELEASE {0} + set_component_parameter_value PHY_QDR2_IO_VOLTAGE {1.5} + set_component_parameter_value PHY_QDR2_MEM_CLK_FREQ_MHZ {633.333} + set_component_parameter_value PHY_QDR2_MIMIC_HPS_EMIF {0} + set_component_parameter_value PHY_QDR2_RATE_ENUM {RATE_HALF} + set_component_parameter_value PHY_QDR2_REF_CLK_JITTER_PS {10.0} + set_component_parameter_value PHY_QDR2_USER_AC_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_AC_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_AC_MODE_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_AC_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_AUTO_STARTING_VREFIN_EN {1} + set_component_parameter_value PHY_QDR2_USER_CK_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_CK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_CK_MODE_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_CK_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_DATA_IN_MODE_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_DATA_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_DATA_OUT_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_DATA_OUT_MODE_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_DATA_OUT_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_DLL_CORE_UPDN_EN {1} + set_component_parameter_value PHY_QDR2_USER_PERIODIC_OCT_RECAL_ENUM {PERIODIC_OCT_RECAL_AUTO} + set_component_parameter_value PHY_QDR2_USER_PING_PONG_EN {0} + set_component_parameter_value PHY_QDR2_USER_PLL_REF_CLK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_REF_CLK_FREQ_MHZ {-1.0} + set_component_parameter_value PHY_QDR2_USER_RZQ_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR2_USER_STARTING_VREFIN {70.0} + set_component_parameter_value PHY_QDR4_CONFIG_ENUM {CONFIG_PHY_AND_SOFT_CTRL} + set_component_parameter_value PHY_QDR4_CORE_CLKS_SHARING_ENUM {CORE_CLKS_SHARING_DISABLED} + set_component_parameter_value PHY_QDR4_CORE_CLKS_SHARING_EXPOSE_SLAVE_OUT {0} + set_component_parameter_value PHY_QDR4_DEFAULT_IO {1} + set_component_parameter_value PHY_QDR4_DEFAULT_REF_CLK_FREQ {1} + set_component_parameter_value PHY_QDR4_HPS_ENABLE_EARLY_RELEASE {0} + set_component_parameter_value PHY_QDR4_IO_VOLTAGE {1.2} + set_component_parameter_value PHY_QDR4_MEM_CLK_FREQ_MHZ {1066.667} + set_component_parameter_value PHY_QDR4_MIMIC_HPS_EMIF {0} + set_component_parameter_value PHY_QDR4_RATE_ENUM {RATE_QUARTER} + set_component_parameter_value PHY_QDR4_REF_CLK_JITTER_PS {10.0} + set_component_parameter_value PHY_QDR4_USER_AC_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_AC_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_AC_MODE_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_AC_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_AUTO_STARTING_VREFIN_EN {1} + set_component_parameter_value PHY_QDR4_USER_CK_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_CK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_CK_MODE_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_CK_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_DATA_IN_MODE_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_DATA_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_DATA_OUT_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_DATA_OUT_MODE_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_DATA_OUT_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_DLL_CORE_UPDN_EN {1} + set_component_parameter_value PHY_QDR4_USER_PERIODIC_OCT_RECAL_ENUM {PERIODIC_OCT_RECAL_AUTO} + set_component_parameter_value PHY_QDR4_USER_PING_PONG_EN {0} + set_component_parameter_value PHY_QDR4_USER_PLL_REF_CLK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_REF_CLK_FREQ_MHZ {-1.0} + set_component_parameter_value PHY_QDR4_USER_RZQ_IO_STD_ENUM {unset} + set_component_parameter_value PHY_QDR4_USER_STARTING_VREFIN {70.0} + set_component_parameter_value PHY_RLD2_CONFIG_ENUM {CONFIG_PHY_AND_SOFT_CTRL} + set_component_parameter_value PHY_RLD2_CORE_CLKS_SHARING_ENUM {CORE_CLKS_SHARING_DISABLED} + set_component_parameter_value PHY_RLD2_CORE_CLKS_SHARING_EXPOSE_SLAVE_OUT {0} + set_component_parameter_value PHY_RLD2_DEFAULT_IO {1} + set_component_parameter_value PHY_RLD2_DEFAULT_REF_CLK_FREQ {1} + set_component_parameter_value PHY_RLD2_HPS_ENABLE_EARLY_RELEASE {0} + set_component_parameter_value PHY_RLD2_IO_VOLTAGE {1.8} + set_component_parameter_value PHY_RLD2_MEM_CLK_FREQ_MHZ {533.333} + set_component_parameter_value PHY_RLD2_MIMIC_HPS_EMIF {0} + set_component_parameter_value PHY_RLD2_RATE_ENUM {RATE_HALF} + set_component_parameter_value PHY_RLD2_REF_CLK_JITTER_PS {10.0} + set_component_parameter_value PHY_RLD2_USER_AC_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_AC_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_AC_MODE_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_AC_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_AUTO_STARTING_VREFIN_EN {1} + set_component_parameter_value PHY_RLD2_USER_CK_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_CK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_CK_MODE_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_CK_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_DATA_IN_MODE_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_DATA_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_DATA_OUT_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_DATA_OUT_MODE_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_DATA_OUT_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_DLL_CORE_UPDN_EN {1} + set_component_parameter_value PHY_RLD2_USER_PERIODIC_OCT_RECAL_ENUM {PERIODIC_OCT_RECAL_AUTO} + set_component_parameter_value PHY_RLD2_USER_PING_PONG_EN {0} + set_component_parameter_value PHY_RLD2_USER_PLL_REF_CLK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_REF_CLK_FREQ_MHZ {-1.0} + set_component_parameter_value PHY_RLD2_USER_RZQ_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD2_USER_STARTING_VREFIN {70.0} + set_component_parameter_value PHY_RLD3_CONFIG_ENUM {CONFIG_PHY_ONLY} + set_component_parameter_value PHY_RLD3_CORE_CLKS_SHARING_ENUM {CORE_CLKS_SHARING_DISABLED} + set_component_parameter_value PHY_RLD3_CORE_CLKS_SHARING_EXPOSE_SLAVE_OUT {0} + set_component_parameter_value PHY_RLD3_DEFAULT_IO {1} + set_component_parameter_value PHY_RLD3_DEFAULT_REF_CLK_FREQ {1} + set_component_parameter_value PHY_RLD3_HPS_ENABLE_EARLY_RELEASE {0} + set_component_parameter_value PHY_RLD3_IO_VOLTAGE {1.2} + set_component_parameter_value PHY_RLD3_MEM_CLK_FREQ_MHZ {1066.667} + set_component_parameter_value PHY_RLD3_MIMIC_HPS_EMIF {0} + set_component_parameter_value PHY_RLD3_RATE_ENUM {RATE_QUARTER} + set_component_parameter_value PHY_RLD3_REF_CLK_JITTER_PS {10.0} + set_component_parameter_value PHY_RLD3_USER_AC_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_AC_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_AC_MODE_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_AC_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_AUTO_STARTING_VREFIN_EN {1} + set_component_parameter_value PHY_RLD3_USER_CK_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_CK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_CK_MODE_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_CK_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_DATA_IN_MODE_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_DATA_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_DATA_OUT_DEEMPHASIS_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_DATA_OUT_MODE_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_DATA_OUT_SLEW_RATE_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_DLL_CORE_UPDN_EN {1} + set_component_parameter_value PHY_RLD3_USER_PERIODIC_OCT_RECAL_ENUM {PERIODIC_OCT_RECAL_AUTO} + set_component_parameter_value PHY_RLD3_USER_PING_PONG_EN {0} + set_component_parameter_value PHY_RLD3_USER_PLL_REF_CLK_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_REF_CLK_FREQ_MHZ {-1.0} + set_component_parameter_value PHY_RLD3_USER_RZQ_IO_STD_ENUM {unset} + set_component_parameter_value PHY_RLD3_USER_STARTING_VREFIN {70.0} + set_component_parameter_value PLL_ADD_EXTRA_CLKS {0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_0 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_1 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_2 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_3 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_4 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_5 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_6 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_7 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_8 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_GUI_0 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_GUI_1 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_GUI_2 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_GUI_3 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_GUI_4 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_GUI_5 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_GUI_6 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_GUI_7 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_DUTY_CYCLE_GUI_8 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_FREQ_MHZ_GUI_0 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_FREQ_MHZ_GUI_1 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_FREQ_MHZ_GUI_2 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_FREQ_MHZ_GUI_3 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_FREQ_MHZ_GUI_4 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_FREQ_MHZ_GUI_5 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_FREQ_MHZ_GUI_6 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_FREQ_MHZ_GUI_7 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_FREQ_MHZ_GUI_8 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_DEG_GUI_0 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_DEG_GUI_1 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_DEG_GUI_2 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_DEG_GUI_3 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_DEG_GUI_4 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_DEG_GUI_5 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_DEG_GUI_6 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_DEG_GUI_7 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_DEG_GUI_8 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_PS_GUI_0 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_PS_GUI_1 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_PS_GUI_2 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_PS_GUI_3 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_PS_GUI_4 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_PS_GUI_5 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_PS_GUI_6 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_PS_GUI_7 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_ACTUAL_PHASE_PS_GUI_8 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_DUTY_CYCLE_GUI_0 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_DUTY_CYCLE_GUI_1 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_DUTY_CYCLE_GUI_2 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_DUTY_CYCLE_GUI_3 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_DUTY_CYCLE_GUI_4 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_DUTY_CYCLE_GUI_5 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_DUTY_CYCLE_GUI_6 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_DUTY_CYCLE_GUI_7 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_DUTY_CYCLE_GUI_8 {50.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_FREQ_MHZ_GUI_0 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_FREQ_MHZ_GUI_1 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_FREQ_MHZ_GUI_2 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_FREQ_MHZ_GUI_3 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_FREQ_MHZ_GUI_4 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_FREQ_MHZ_GUI_5 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_FREQ_MHZ_GUI_6 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_FREQ_MHZ_GUI_7 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_FREQ_MHZ_GUI_8 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_PHASE_GUI_0 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_PHASE_GUI_1 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_PHASE_GUI_2 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_PHASE_GUI_3 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_PHASE_GUI_4 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_PHASE_GUI_5 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_PHASE_GUI_6 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_PHASE_GUI_7 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_DESIRED_PHASE_GUI_8 {0.0} + set_component_parameter_value PLL_EXTRA_CLK_PHASE_SHIFT_UNIT_GUI_0 {ps} + set_component_parameter_value PLL_EXTRA_CLK_PHASE_SHIFT_UNIT_GUI_1 {ps} + set_component_parameter_value PLL_EXTRA_CLK_PHASE_SHIFT_UNIT_GUI_2 {ps} + set_component_parameter_value PLL_EXTRA_CLK_PHASE_SHIFT_UNIT_GUI_3 {ps} + set_component_parameter_value PLL_EXTRA_CLK_PHASE_SHIFT_UNIT_GUI_4 {ps} + set_component_parameter_value PLL_EXTRA_CLK_PHASE_SHIFT_UNIT_GUI_5 {ps} + set_component_parameter_value PLL_EXTRA_CLK_PHASE_SHIFT_UNIT_GUI_6 {ps} + set_component_parameter_value PLL_EXTRA_CLK_PHASE_SHIFT_UNIT_GUI_7 {ps} + set_component_parameter_value PLL_EXTRA_CLK_PHASE_SHIFT_UNIT_GUI_8 {ps} + set_component_parameter_value PLL_USER_NUM_OF_EXTRA_CLKS {0} + set_component_parameter_value PROTOCOL_ENUM {PROTOCOL_DDR4} + set_component_parameter_value SHORT_QSYS_INTERFACE_NAMES {1} + set_component_project_property HIDE_FROM_IP_CATALOG {false} + save_component + load_instantiation hps_emif + remove_instantiation_interfaces_and_ports + add_instantiation_interface pll_ref_clk clock INPUT + set_instantiation_interface_parameter_value pll_ref_clk clockRate {0} + set_instantiation_interface_parameter_value pll_ref_clk externallyDriven {false} + set_instantiation_interface_parameter_value pll_ref_clk ptfSchematicName {} + add_instantiation_interface_port pll_ref_clk pll_ref_clk clk 1 STD_LOGIC Input + add_instantiation_interface oct conduit INPUT + set_instantiation_interface_parameter_value oct associatedClock {} + set_instantiation_interface_parameter_value oct associatedReset {} + set_instantiation_interface_parameter_value oct prSafe {false} + add_instantiation_interface_port oct oct_rzqin oct_rzqin 1 STD_LOGIC Input + add_instantiation_interface mem conduit INPUT + set_instantiation_interface_parameter_value mem associatedClock {} + set_instantiation_interface_parameter_value mem associatedReset {} + set_instantiation_interface_parameter_value mem prSafe {false} + add_instantiation_interface_port mem mem_ck mem_ck 1 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_ck_n mem_ck_n 1 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_a mem_a 17 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_act_n mem_act_n 1 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_ba mem_ba 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_bg mem_bg 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_cke mem_cke 1 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_cs_n mem_cs_n 1 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_odt mem_odt 1 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_reset_n mem_reset_n 1 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_par mem_par 1 STD_LOGIC_VECTOR Output + add_instantiation_interface_port mem mem_alert_n mem_alert_n 1 STD_LOGIC_VECTOR Input + add_instantiation_interface_port mem mem_dqs mem_dqs 8 STD_LOGIC_VECTOR Bidir + add_instantiation_interface_port mem mem_dqs_n mem_dqs_n 8 STD_LOGIC_VECTOR Bidir + add_instantiation_interface_port mem mem_dq mem_dq 64 STD_LOGIC_VECTOR Bidir + add_instantiation_interface_port mem mem_dbi_n mem_dbi_n 8 STD_LOGIC_VECTOR Bidir + add_instantiation_interface hps_emif conduit INPUT + set_instantiation_interface_parameter_value hps_emif associatedClock {} + set_instantiation_interface_parameter_value hps_emif associatedReset {} + set_instantiation_interface_parameter_value hps_emif prSafe {false} + add_instantiation_interface_port hps_emif hps_to_emif hps_to_emif 4096 STD_LOGIC_VECTOR Input + add_instantiation_interface_port hps_emif emif_to_hps emif_to_hps 4096 STD_LOGIC_VECTOR Output + add_instantiation_interface_port hps_emif hps_to_emif_gp gp_to_emif 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port hps_emif emif_to_hps_gp emif_to_gp 1 STD_LOGIC_VECTOR Output + add_instantiation_interface emif_calbus conduit INPUT + set_instantiation_interface_parameter_value emif_calbus associatedClock {emif_calbus_clk} + set_instantiation_interface_parameter_value emif_calbus associatedReset {} + set_instantiation_interface_parameter_value emif_calbus prSafe {false} + add_instantiation_interface_port emif_calbus calbus_read calbus_read 1 STD_LOGIC Input + add_instantiation_interface_port emif_calbus calbus_write calbus_write 1 STD_LOGIC Input + add_instantiation_interface_port emif_calbus calbus_address calbus_address 20 STD_LOGIC_VECTOR Input + add_instantiation_interface_port emif_calbus calbus_wdata calbus_wdata 32 STD_LOGIC_VECTOR Input + add_instantiation_interface_port emif_calbus calbus_rdata calbus_rdata 32 STD_LOGIC_VECTOR Output + add_instantiation_interface_port emif_calbus calbus_seq_param_tbl calbus_seq_param_tbl 4096 STD_LOGIC_VECTOR Output + add_instantiation_interface emif_calbus_clk clock INPUT + set_instantiation_interface_parameter_value emif_calbus_clk clockRate {0} + set_instantiation_interface_parameter_value emif_calbus_clk externallyDriven {false} + set_instantiation_interface_parameter_value emif_calbus_clk ptfSchematicName {} + add_instantiation_interface_port emif_calbus_clk calbus_clk clk 1 STD_LOGIC Input + save_instantiation + add_component init_done ip/system/init_done.ip altera_s10_user_rst_clkgate init_done 19.4.7 + load_component init_done + set_component_parameter_value outputType {Conduit Interface} + set_component_project_property HIDE_FROM_IP_CATALOG {false} + save_component + load_instantiation init_done + remove_instantiation_interfaces_and_ports + add_instantiation_interface ninit_done conduit INPUT + set_instantiation_interface_parameter_value ninit_done associatedClock {} + set_instantiation_interface_parameter_value ninit_done associatedReset {} + set_instantiation_interface_parameter_value ninit_done prSafe {false} + add_instantiation_interface_port ninit_done ninit_done ninit_done 1 STD_LOGIC Output + save_instantiation + add_component system_intel_cache_coherency_translator ip/system/system_intel_cache_coherency_translator.ip intel_cache_coherency_translator system_intel_cache_coherency_translator 1.0.3 + load_component system_intel_cache_coherency_translator + set_component_parameter_value ADDR_WIDTH {32} + set_component_parameter_value ARBAR_OVERRIDE {0} + set_component_parameter_value ARCACHE_OVERRIDE {0} + set_component_parameter_value ARCACHE_OVERRIDE_EN {1} + set_component_parameter_value ARDOMAIN_OVERRIDE {1} + set_component_parameter_value ARSNOOP_OVERRIDE {0} + set_component_parameter_value AWBAR_OVERRIDE {0} + set_component_parameter_value AWCACHE_OVERRIDE {0} + set_component_parameter_value AWCACHE_OVERRIDE_EN {1} + set_component_parameter_value AWDOMAIN_OVERRIDE {1} + set_component_parameter_value AWSNOOP_OVERRIDE {0} + set_component_parameter_value AXM_ID_WIDTH {5} + set_component_parameter_value AXS_ID_WIDTH {5} + set_component_parameter_value AxPROT_OVERRIDE {3} + set_component_parameter_value AxPROT_OVERRIDE_EN {1} + set_component_parameter_value AxUSER_SELECTION {0} + set_component_parameter_value CONTROL_INTERFACE {0} + set_component_parameter_value CombinedIssuingCapability {16} + set_component_parameter_value DATA_WIDTH {128} + set_component_parameter_value ReadIssuingCapability {8} + set_component_parameter_value WriteIssuingCapability {8} + set_component_project_property HIDE_FROM_IP_CATALOG {false} + save_component + load_instantiation system_intel_cache_coherency_translator + remove_instantiation_interfaces_and_ports + add_instantiation_interface clock clock INPUT + set_instantiation_interface_parameter_value clock clockRate {0} + set_instantiation_interface_parameter_value clock externallyDriven {false} + set_instantiation_interface_parameter_value clock ptfSchematicName {} + add_instantiation_interface_port clock clk clk 1 STD_LOGIC Input + add_instantiation_interface reset reset INPUT + set_instantiation_interface_parameter_value reset associatedClock {clock} + set_instantiation_interface_parameter_value reset synchronousEdges {DEASSERT} + add_instantiation_interface_port reset reset reset 1 STD_LOGIC Input + add_instantiation_interface m0 acelite OUTPUT + set_instantiation_interface_parameter_value m0 associatedClock {clock} + set_instantiation_interface_parameter_value m0 associatedReset {reset} + set_instantiation_interface_parameter_value m0 combinedIssuingCapability {1} + set_instantiation_interface_parameter_value m0 issuesFIXEDBursts {true} + set_instantiation_interface_parameter_value m0 issuesINCRBursts {true} + set_instantiation_interface_parameter_value m0 issuesWRAPBursts {true} + set_instantiation_interface_parameter_value m0 maximumOutstandingReads {1} + set_instantiation_interface_parameter_value m0 maximumOutstandingTransactions {1} + set_instantiation_interface_parameter_value m0 maximumOutstandingWrites {1} + set_instantiation_interface_parameter_value m0 poison {false} + set_instantiation_interface_parameter_value m0 readIssuingCapability {1} + set_instantiation_interface_parameter_value m0 traceSignals {false} + set_instantiation_interface_parameter_value m0 trustzoneAware {true} + set_instantiation_interface_parameter_value m0 uniqueIdSupport {false} + set_instantiation_interface_parameter_value m0 wakeupSignals {false} + set_instantiation_interface_parameter_value m0 writeIssuingCapability {1} + add_instantiation_interface_port m0 axm_m0_araddr araddr 32 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_arburst arburst 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_arcache arcache 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_arid arid 5 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_arlen arlen 8 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_arlock arlock 1 STD_LOGIC Output + add_instantiation_interface_port m0 axm_m0_arprot arprot 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_arqos arqos 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_arready arready 1 STD_LOGIC Input + add_instantiation_interface_port m0 axm_m0_arsize arsize 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_arvalid arvalid 1 STD_LOGIC Output + add_instantiation_interface_port m0 axm_m0_arsnoop arsnoop 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_ardomain ardomain 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_arbar arbar 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_aruser aruser 23 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awaddr awaddr 32 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awburst awburst 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awcache awcache 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awid awid 5 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awlen awlen 8 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awlock awlock 1 STD_LOGIC Output + add_instantiation_interface_port m0 axm_m0_awprot awprot 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awready awready 1 STD_LOGIC Input + add_instantiation_interface_port m0 axm_m0_awsize awsize 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awvalid awvalid 1 STD_LOGIC Output + add_instantiation_interface_port m0 axm_m0_awqos awqos 4 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awuser awuser 23 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_bid bid 5 STD_LOGIC_VECTOR Input + add_instantiation_interface_port m0 axm_m0_bready bready 1 STD_LOGIC Output + add_instantiation_interface_port m0 axm_m0_bresp bresp 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port m0 axm_m0_bvalid bvalid 1 STD_LOGIC Input + add_instantiation_interface_port m0 axm_m0_rdata rdata 128 STD_LOGIC_VECTOR Input + add_instantiation_interface_port m0 axm_m0_rid rid 5 STD_LOGIC_VECTOR Input + add_instantiation_interface_port m0 axm_m0_rlast rlast 1 STD_LOGIC Input + add_instantiation_interface_port m0 axm_m0_rready rready 1 STD_LOGIC Output + add_instantiation_interface_port m0 axm_m0_rresp rresp 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port m0 axm_m0_rvalid rvalid 1 STD_LOGIC Input + add_instantiation_interface_port m0 axm_m0_wdata wdata 128 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_wlast wlast 1 STD_LOGIC Output + add_instantiation_interface_port m0 axm_m0_wready wready 1 STD_LOGIC Input + add_instantiation_interface_port m0 axm_m0_wstrb wstrb 16 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_wvalid wvalid 1 STD_LOGIC Output + add_instantiation_interface_port m0 axm_m0_awsnoop awsnoop 3 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awdomain awdomain 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port m0 axm_m0_awbar awbar 2 STD_LOGIC_VECTOR Output + add_instantiation_interface s0 axi4 INPUT + set_instantiation_interface_parameter_value s0 associatedClock {clock} + set_instantiation_interface_parameter_value s0 associatedReset {reset} + set_instantiation_interface_parameter_value s0 bridgesToMaster {m0} + set_instantiation_interface_parameter_value s0 combinedAcceptanceCapability {1} + set_instantiation_interface_parameter_value s0 dfhFeatureGuid {0} + set_instantiation_interface_parameter_value s0 dfhFeatureId {35} + set_instantiation_interface_parameter_value s0 dfhFeatureMajorVersion {0} + set_instantiation_interface_parameter_value s0 dfhFeatureMinorVersion {0} + set_instantiation_interface_parameter_value s0 dfhFeatureType {3} + set_instantiation_interface_parameter_value s0 dfhGroupId {0} + set_instantiation_interface_parameter_value s0 dfhParameterData {} + set_instantiation_interface_parameter_value s0 dfhParameterDataLength {} + set_instantiation_interface_parameter_value s0 dfhParameterId {} + set_instantiation_interface_parameter_value s0 dfhParameterName {} + set_instantiation_interface_parameter_value s0 dfhParameterVersion {} + set_instantiation_interface_parameter_value s0 maximumOutstandingReads {1} + set_instantiation_interface_parameter_value s0 maximumOutstandingTransactions {1} + set_instantiation_interface_parameter_value s0 maximumOutstandingWrites {1} + set_instantiation_interface_parameter_value s0 poison {false} + set_instantiation_interface_parameter_value s0 readAcceptanceCapability {1} + set_instantiation_interface_parameter_value s0 readDataReorderingDepth {8} + set_instantiation_interface_parameter_value s0 traceSignals {false} + set_instantiation_interface_parameter_value s0 trustzoneAware {true} + set_instantiation_interface_parameter_value s0 uniqueIdSupport {false} + set_instantiation_interface_parameter_value s0 wakeupSignals {false} + set_instantiation_interface_parameter_value s0 writeAcceptanceCapability {1} + set_instantiation_interface_sysinfo_parameter_value s0 address_map {} + set_instantiation_interface_sysinfo_parameter_value s0 address_width {} + set_instantiation_interface_sysinfo_parameter_value s0 max_slave_data_width {} + add_instantiation_interface_port s0 axs_s0_araddr araddr 32 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_arburst arburst 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_arcache arcache 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_arid arid 5 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_arlen arlen 8 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_arlock arlock 1 STD_LOGIC Input + add_instantiation_interface_port s0 axs_s0_arprot arprot 3 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_arready arready 1 STD_LOGIC Output + add_instantiation_interface_port s0 axs_s0_arsize arsize 3 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_arvalid arvalid 1 STD_LOGIC Input + add_instantiation_interface_port s0 axs_s0_awaddr awaddr 32 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_awburst awburst 2 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_awcache awcache 4 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_awid awid 5 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_awlen awlen 8 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_awlock awlock 1 STD_LOGIC Input + add_instantiation_interface_port s0 axs_s0_awprot awprot 3 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_awready awready 1 STD_LOGIC Output + add_instantiation_interface_port s0 axs_s0_awsize awsize 3 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_awvalid awvalid 1 STD_LOGIC Input + add_instantiation_interface_port s0 axs_s0_bid bid 5 STD_LOGIC_VECTOR Output + add_instantiation_interface_port s0 axs_s0_bready bready 1 STD_LOGIC Input + add_instantiation_interface_port s0 axs_s0_bresp bresp 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port s0 axs_s0_bvalid bvalid 1 STD_LOGIC Output + add_instantiation_interface_port s0 axs_s0_rdata rdata 128 STD_LOGIC_VECTOR Output + add_instantiation_interface_port s0 axs_s0_rid rid 5 STD_LOGIC_VECTOR Output + add_instantiation_interface_port s0 axs_s0_rlast rlast 1 STD_LOGIC Output + add_instantiation_interface_port s0 axs_s0_rready rready 1 STD_LOGIC Input + add_instantiation_interface_port s0 axs_s0_rresp rresp 2 STD_LOGIC_VECTOR Output + add_instantiation_interface_port s0 axs_s0_rvalid rvalid 1 STD_LOGIC Output + add_instantiation_interface_port s0 axs_s0_wdata wdata 128 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_wlast wlast 1 STD_LOGIC Input + add_instantiation_interface_port s0 axs_s0_wready wready 1 STD_LOGIC Output + add_instantiation_interface_port s0 axs_s0_wstrb wstrb 16 STD_LOGIC_VECTOR Input + add_instantiation_interface_port s0 axs_s0_wvalid wvalid 1 STD_LOGIC Input + save_instantiation + + # add wirelevel expressions + + # preserve ports for debug + + # add the connections + add_connection hps_emif.hps_emif/hps.hps_emif + set_connection_parameter_value hps_emif.hps_emif/hps.hps_emif endPort {} + set_connection_parameter_value hps_emif.hps_emif/hps.hps_emif endPortLSB {0} + set_connection_parameter_value hps_emif.hps_emif/hps.hps_emif startPort {} + set_connection_parameter_value hps_emif.hps_emif/hps.hps_emif startPortLSB {0} + set_connection_parameter_value hps_emif.hps_emif/hps.hps_emif width {0} + add_connection system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave addressMapSysInfo {} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave addressWidthSysInfo {} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave arbitrationPriority {1} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave baseAddress {0x0000} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave defaultConnection {0} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave domainAlias {} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.burstAdapterImplementation {GENERIC_CONVERTER} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.clockCrossingAdapter {HANDSHAKE} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.enableAllPipelines {FALSE} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.enableEccProtection {FALSE} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.enableInstrumentation {FALSE} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.enableOutOfOrderSupport {FALSE} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.insertDefaultSlave {FALSE} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.interconnectResetSource {DEFAULT} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.interconnectType {STANDARD} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.maxAdditionalLatency {1} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.optimizeRdFifoSize {FALSE} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.piplineType {PIPELINE_STAGE} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.responseFifoType {REGISTER_BASED} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.syncResets {TRUE} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave qsys_mm.widthAdapterImplementation {GENERIC_CONVERTER} + set_connection_parameter_value system_intel_cache_coherency_translator.m0/hps.f2h_axi_slave slaveDataWidthSysInfo {-1} + + # add the exports + set_interface_property hps_h2f_sdmmc_interrupt EXPORT_OF hps.h2f_sdmmc_interrupt + set_interface_property hps_hps_io EXPORT_OF hps.hps_io + set_interface_property h2f_reset EXPORT_OF hps.h2f_reset + set_interface_property hps_h2f_axi_clock EXPORT_OF hps.h2f_axi_clock + set_interface_property hps_h2f_axi_reset EXPORT_OF hps.h2f_axi_reset + set_interface_property hps_h2f_axi_master EXPORT_OF hps.h2f_axi_master + set_interface_property hps_h2f_lw_axi_clock EXPORT_OF hps.h2f_lw_axi_clock + set_interface_property hps_h2f_lw_axi_reset EXPORT_OF hps.h2f_lw_axi_reset + set_interface_property hps_h2f_lw_axi_master EXPORT_OF hps.h2f_lw_axi_master + set_interface_property hps_f2h_axi_clock EXPORT_OF hps.f2h_axi_clock + set_interface_property hps_f2h_axi_reset EXPORT_OF hps.f2h_axi_reset + set_interface_property hps_emif_pll_ref_clk EXPORT_OF hps_emif.pll_ref_clk + set_interface_property hps_emif_oct EXPORT_OF hps_emif.oct + set_interface_property hps_emif_mem EXPORT_OF hps_emif.mem + set_interface_property hps_emif_emif_calbus EXPORT_OF hps_emif.emif_calbus + set_interface_property hps_emif_emif_calbus_clk EXPORT_OF hps_emif.emif_calbus_clk + set_interface_property ninit_done EXPORT_OF init_done.ninit_done + set_interface_property system_intel_cache_coherency_translator_clock EXPORT_OF system_intel_cache_coherency_translator.clock + set_interface_property system_intel_cache_coherency_translator_reset EXPORT_OF system_intel_cache_coherency_translator.reset + set_interface_property system_intel_cache_coherency_translator_s0 EXPORT_OF system_intel_cache_coherency_translator.s0 + + # set values for exposed HDL parameters + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.burstAdapterImplementation GENERIC_CONVERTER + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.clockCrossingAdapter HANDSHAKE + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.enableAllPipelines FALSE + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.enableEccProtection FALSE + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.enableInstrumentation FALSE + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.enableOutOfOrderSupport FALSE + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.insertDefaultSlave FALSE + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.interconnectResetSource DEFAULT + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.interconnectType STANDARD + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.maxAdditionalLatency 1 + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.optimizeRdFifoSize FALSE + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.piplineType PIPELINE_STAGE + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.responseFifoType REGISTER_BASED + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.syncResets TRUE + set_domain_assignment system_intel_cache_coherency_translator.m0 qsys_mm.widthAdapterImplementation GENERIC_CONVERTER + + # set the the module properties + set_module_property BONUS_DATA { + + + + + + + + + + + + + + + + + + + + +} + set_module_property FILE {system.qsys} + set_module_property GENERATION_ID {0x00000000} + set_module_property NAME {system} + + # save the system + sync_sysinfo_parameters + save_system system +} + +proc do_set_exported_interface_sysinfo_parameters {} { +} + +# create all the systems, from bottom up +do_create_system + +# set system info parameters on exported interface, from bottom up +do_set_exported_interface_sysinfo_parameters diff --git a/corev_apu/altera/ip/io_pll.tcl b/corev_apu/altera/ip/io_pll.tcl index ea1e4b2986..c67e16ae36 100644 --- a/corev_apu/altera/ip/io_pll.tcl +++ b/corev_apu/altera/ip/io_pll.tcl @@ -143,7 +143,7 @@ proc do_create_io_pll {} { set_instance_parameter_value iopll_0 {gui_new_mif_file_path} {~/pll.mif} set_instance_parameter_value iopll_0 {gui_number_of_clocks} {5} set_instance_parameter_value iopll_0 {gui_operation_mode} {direct} - set_instance_parameter_value iopll_0 {gui_output_clock_frequency0} {200.0} + set_instance_parameter_value iopll_0 {gui_output_clock_frequency0} {100.0} set_instance_parameter_value iopll_0 {gui_output_clock_frequency1} {125.0} set_instance_parameter_value iopll_0 {gui_output_clock_frequency10} {100.0} set_instance_parameter_value iopll_0 {gui_output_clock_frequency11} {100.0} @@ -161,7 +161,7 @@ proc do_create_io_pll {} { set_instance_parameter_value iopll_0 {gui_output_clock_frequency7} {100.0} set_instance_parameter_value iopll_0 {gui_output_clock_frequency8} {100.0} set_instance_parameter_value iopll_0 {gui_output_clock_frequency9} {100.0} - set_instance_parameter_value iopll_0 {gui_output_clock_frequency_ps0} {5000.0} + set_instance_parameter_value iopll_0 {gui_output_clock_frequency_ps0} {10000.0} set_instance_parameter_value iopll_0 {gui_output_clock_frequency_ps1} {8000.0} set_instance_parameter_value iopll_0 {gui_output_clock_frequency_ps10} {10000.0} set_instance_parameter_value iopll_0 {gui_output_clock_frequency_ps11} {10000.0} diff --git a/corev_apu/altera/ip_files.csv b/corev_apu/altera/ip_files.csv index 9bdb7ff77e..4b5063b274 100644 --- a/corev_apu/altera/ip_files.csv +++ b/corev_apu/altera/ip_files.csv @@ -7,3 +7,7 @@ ./emif_cal.ip ./vJTAG.ip ./cva6_intel_jtag_uart_0.ip +./ip/system/hps.ip +./ip/system/hps_emif.ip +./ip/system/init_done.ip +./ip/system/system_intel_cache_coherency_translator.ip diff --git a/corev_apu/altera/loc_constraints.csv b/corev_apu/altera/loc_constraints.csv index 0ac21bf1c0..72b60fe972 100644 --- a/corev_apu/altera/loc_constraints.csv +++ b/corev_apu/altera/loc_constraints.csv @@ -137,3 +137,134 @@ PIN_N34 -to ddr4_act_n PIN_P33 -to ddr4_reset_n PIN_AA6 -to tx PIN_F1 -to rx +PIN_L10 -to emif_hps_pll_ref_clk_p +PIN_M9 -to emif_hps_oct_oct_rzqin +PIN_T17 -to emif_hps_mem_mem_a[0] +PIN_V17 -to emif_hps_mem_mem_a[1] +PIN_U16 -to emif_hps_mem_mem_a[2] +PIN_W16 -to emif_hps_mem_mem_a[3] +PIN_T15 -to emif_hps_mem_mem_a[4] +PIN_V15 -to emif_hps_mem_mem_a[5] +PIN_U14 -to emif_hps_mem_mem_a[6] +PIN_W14 -to emif_hps_mem_mem_a[7] +PIN_T13 -to emif_hps_mem_mem_a[8] +PIN_V13 -to emif_hps_mem_mem_a[9] +PIN_U12 -to emif_hps_mem_mem_a[10] +PIN_W12 -to emif_hps_mem_mem_a[11] +PIN_P9 -to emif_hps_mem_mem_a[12] +PIN_L8 -to emif_hps_mem_mem_a[13] +PIN_N8 -to emif_hps_mem_mem_a[14] +PIN_M7 -to emif_hps_mem_mem_a[15] +PIN_P7 -to emif_hps_mem_mem_a[16] +PIN_N6 -to emif_hps_mem_mem_ba[0] +PIN_M5 -to emif_hps_mem_mem_ba[1] +PIN_P5 -to emif_hps_mem_mem_bg[0] +PIN_N16 -to emif_hps_mem_mem_act_n +PIN_L6 -to emif_hps_mem_mem_alert_n +PIN_M13 -to emif_hps_mem_mem_ck[0] +PIN_P13 -to emif_hps_mem_mem_ck_n[0] +PIN_L14 -to emif_hps_mem_mem_cke[0] +PIN_L16 -to emif_hps_mem_mem_cs_n[0] +PIN_M15 -to emif_hps_mem_mem_odt[0] +PIN_N12 -to emif_hps_mem_mem_par +PIN_P17 -to emif_hps_mem_mem_reset_n +PIN_A8 -to emif_hps_mem_mem_dqs[0] +PIN_G8 -to emif_hps_mem_mem_dqs[1] +PIN_F15 -to emif_hps_mem_mem_dqs[2] +PIN_B15 -to emif_hps_mem_mem_dqs[3] +PIN_U22 -to emif_hps_mem_mem_dqs[4] +PIN_L22 -to emif_hps_mem_mem_dqs[5] +PIN_M29 -to emif_hps_mem_mem_dqs[6] +PIN_T29 -to emif_hps_mem_mem_dqs[7] +PIN_U8 -to emif_hps_mem_mem_dqs[8] +PIN_C8 -to emif_hps_mem_mem_dqs_n[0] +PIN_J8 -to emif_hps_mem_mem_dqs_n[1] +PIN_H15 -to emif_hps_mem_mem_dqs_n[2] +PIN_D15 -to emif_hps_mem_mem_dqs_n[3] +PIN_W22 -to emif_hps_mem_mem_dqs_n[4] +PIN_N22 -to emif_hps_mem_mem_dqs_n[5] +PIN_P29 -to emif_hps_mem_mem_dqs_n[6] +PIN_V29 -to emif_hps_mem_mem_dqs_n[7] +PIN_W8 -to emif_hps_mem_mem_dqs_n[8] +PIN_B7 -to emif_hps_mem_mem_dbi_n[0] +PIN_F7 -to emif_hps_mem_mem_dbi_n[1] +PIN_G14 -to emif_hps_mem_mem_dbi_n[2] +PIN_A14 -to emif_hps_mem_mem_dbi_n[3] +PIN_T21 -to emif_hps_mem_mem_dbi_n[4] +PIN_M21 -to emif_hps_mem_mem_dbi_n[5] +PIN_L28 -to emif_hps_mem_mem_dbi_n[6] +PIN_U28 -to emif_hps_mem_mem_dbi_n[7] +PIN_T7 -to emif_hps_mem_mem_dbi_n[8] +PIN_A10 -to emif_hps_mem_mem_dq[0] +PIN_C10 -to emif_hps_mem_mem_dq[1] +PIN_B9 -to emif_hps_mem_mem_dq[2] +PIN_D9 -to emif_hps_mem_mem_dq[3] +PIN_A6 -to emif_hps_mem_mem_dq[4] +PIN_B5 -to emif_hps_mem_mem_dq[5] +PIN_C6 -to emif_hps_mem_mem_dq[6] +PIN_D5 -to emif_hps_mem_mem_dq[7] +PIN_G10 -to emif_hps_mem_mem_dq[8] +PIN_J10 -to emif_hps_mem_mem_dq[9] +PIN_F9 -to emif_hps_mem_mem_dq[10] +PIN_H9 -to emif_hps_mem_mem_dq[11] +PIN_G6 -to emif_hps_mem_mem_dq[12] +PIN_J6 -to emif_hps_mem_mem_dq[13] +PIN_F5 -to emif_hps_mem_mem_dq[14] +PIN_H5 -to emif_hps_mem_mem_dq[15] +PIN_F17 -to emif_hps_mem_mem_dq[16] +PIN_H17 -to emif_hps_mem_mem_dq[17] +PIN_G16 -to emif_hps_mem_mem_dq[18] +PIN_J16 -to emif_hps_mem_mem_dq[19] +PIN_F13 -to emif_hps_mem_mem_dq[20] +PIN_J12 -to emif_hps_mem_mem_dq[21] +PIN_H13 -to emif_hps_mem_mem_dq[22] +PIN_G12 -to emif_hps_mem_mem_dq[23] +PIN_B17 -to emif_hps_mem_mem_dq[24] +PIN_D17 -to emif_hps_mem_mem_dq[25] +PIN_A16 -to emif_hps_mem_mem_dq[26] +PIN_C16 -to emif_hps_mem_mem_dq[27] +PIN_B13 -to emif_hps_mem_mem_dq[28] +PIN_D13 -to emif_hps_mem_mem_dq[29] +PIN_A12 -to emif_hps_mem_mem_dq[30] +PIN_C12 -to emif_hps_mem_mem_dq[31] +PIN_U24 -to emif_hps_mem_mem_dq[32] +PIN_W24 -to emif_hps_mem_mem_dq[33] +PIN_T23 -to emif_hps_mem_mem_dq[34] +PIN_V23 -to emif_hps_mem_mem_dq[35] +PIN_U20 -to emif_hps_mem_mem_dq[36] +PIN_W20 -to emif_hps_mem_mem_dq[37] +PIN_T19 -to emif_hps_mem_mem_dq[38] +PIN_V19 -to emif_hps_mem_mem_dq[39] +PIN_L24 -to emif_hps_mem_mem_dq[40] +PIN_N24 -to emif_hps_mem_mem_dq[41] +PIN_M23 -to emif_hps_mem_mem_dq[42] +PIN_P23 -to emif_hps_mem_mem_dq[43] +PIN_L20 -to emif_hps_mem_mem_dq[44] +PIN_P19 -to emif_hps_mem_mem_dq[45] +PIN_N20 -to emif_hps_mem_mem_dq[46] +PIN_M19 -to emif_hps_mem_mem_dq[47] +PIN_M31 -to emif_hps_mem_mem_dq[48] +PIN_P31 -to emif_hps_mem_mem_dq[49] +PIN_L30 -to emif_hps_mem_mem_dq[50] +PIN_N30 -to emif_hps_mem_mem_dq[51] +PIN_M27 -to emif_hps_mem_mem_dq[52] +PIN_P27 -to emif_hps_mem_mem_dq[53] +PIN_L26 -to emif_hps_mem_mem_dq[54] +PIN_N26 -to emif_hps_mem_mem_dq[55] +PIN_T31 -to emif_hps_mem_mem_dq[56] +PIN_V31 -to emif_hps_mem_mem_dq[57] +PIN_U30 -to emif_hps_mem_mem_dq[58] +PIN_W30 -to emif_hps_mem_mem_dq[59] +PIN_T27 -to emif_hps_mem_mem_dq[60] +PIN_W26 -to emif_hps_mem_mem_dq[61] +PIN_V27 -to emif_hps_mem_mem_dq[62] +PIN_U26 -to emif_hps_mem_mem_dq[63] +PIN_U10 -to emif_hps_mem_mem_dq[64] +PIN_W10 -to emif_hps_mem_mem_dq[65] +PIN_T9 -to emif_hps_mem_mem_dq[66] +PIN_V9 -to emif_hps_mem_mem_dq[67] +PIN_U6 -to emif_hps_mem_mem_dq[68] +PIN_W6 -to emif_hps_mem_mem_dq[69] +PIN_T5 -to emif_hps_mem_mem_dq[70] +PIN_V5 -to emif_hps_mem_mem_dq[71] +PIN_M17 -to emif_hps_mem_mem_bg[1] -comment IOBANK_3D diff --git a/corev_apu/altera/search_paths.csv b/corev_apu/altera/search_paths.csv index 1d88707ec8..7d60259e34 100644 --- a/corev_apu/altera/search_paths.csv +++ b/corev_apu/altera/search_paths.csv @@ -3,6 +3,7 @@ "../fpga/" "../../vendor/pulp-platform/common_cells/include" "../../vendor/pulp-platform/axi/include" +"../../vendor/pulp-platform/obi/include" "../../core/cache_subsystem/hpdcache/rtl/include" "../../core/include" "../register_interface/include" diff --git a/corev_apu/altera/settings.csv b/corev_apu/altera/settings.csv index b069925db4..a18fe16db9 100644 --- a/corev_apu/altera/settings.csv +++ b/corev_apu/altera/settings.csv @@ -43,3 +43,24 @@ FITTER_AGGRESSIVE_ROUTABILITY_OPTIMIZATION ALWAYS GLOBAL_PLACEMENT_EFFORT "MAXIMUM EFFORT" QII_AUTO_PACKED_REGISTERS SPARSE OPTIMIZATION_TECHNIQUE SPEED +AUTO_RESTART_CONFIGURATION OFF +USE_PWRMGT_SCL SDM_IO14 +USE_PWRMGT_SDA SDM_IO11 +USE_CONF_DONE SDM_IO16 +USE_INIT_DONE SDM_IO0 +USE_CVP_CONFDONE SDM_IO10 +POWER_APPLY_THERMAL_MARGIN ADDITIONAL +PWRMGT_BUS_SPEED_MODE "100 KHZ" +PWRMGT_SLAVE_DEVICE_TYPE ED8401 +PWRMGT_SLAVE_DEVICE0_ADDRESS 47 +PWRMGT_SLAVE_DEVICE1_ADDRESS 00 +PWRMGT_SLAVE_DEVICE2_ADDRESS 00 +PWRMGT_SLAVE_DEVICE3_ADDRESS 00 +PWRMGT_SLAVE_DEVICE4_ADDRESS 00 +PWRMGT_SLAVE_DEVICE5_ADDRESS 00 +PWRMGT_SLAVE_DEVICE6_ADDRESS 00 +PWRMGT_SLAVE_DEVICE7_ADDRESS 00 +PWRMGT_TRANSLATED_VOLTAGE_VALUE_UNIT VOLTS +PWRMGT_PAGE_COMMAND_ENABLE OFF +PWRMGT_VOLTAGE_OUTPUT_FORMAT "LINEAR FORMAT" +PWRMGT_LINEAR_FORMAT_N "-13" diff --git a/corev_apu/altera/src/cva6_altera.sv b/corev_apu/altera/src/cva6_altera.sv index f047c33067..d122f07c41 100644 --- a/corev_apu/altera/src/cva6_altera.sv +++ b/corev_apu/altera/src/cva6_altera.sv @@ -44,7 +44,57 @@ module cva6_altera ( input logic [ 0:0] ddr4_alert_n, input logic oct_rzqin , - output logic [ 3:0] led + output logic [ 3:0] led , + //HPS +// HPS EMIF +output wire [0:0] emif_hps_mem_mem_ck, +output wire [0:0] emif_hps_mem_mem_ck_n, +output wire [16:0] emif_hps_mem_mem_a, +output wire [0:0] emif_hps_mem_mem_act_n, +output wire [1:0] emif_hps_mem_mem_ba, +output wire [1:0] emif_hps_mem_mem_bg, +output wire [0:0] emif_hps_mem_mem_cke, +output wire [0:0] emif_hps_mem_mem_cs_n, +output wire [0:0] emif_hps_mem_mem_odt, +output wire [0:0] emif_hps_mem_mem_reset_n, +output wire [0:0] emif_hps_mem_mem_par, +input wire [0:0] emif_hps_mem_mem_alert_n, +input wire emif_hps_oct_oct_rzqin, +input wire emif_hps_pll_ref_clk_p, +inout wire [8-1:0] emif_hps_mem_mem_dbi_n, +inout wire [64-1:0] emif_hps_mem_mem_dq, +inout wire [8-1:0] emif_hps_mem_mem_dqs, +inout wire [8-1:0] emif_hps_mem_mem_dqs_n, +input wire hps_jtag_tck, +input wire hps_jtag_tms, +output wire hps_jtag_tdo, +input wire hps_jtag_tdi, +output wire hps_sdmmc_CCLK, +inout wire hps_sdmmc_CMD, +inout wire hps_sdmmc_D0, +inout wire hps_sdmmc_D1, +inout wire hps_sdmmc_D2, +inout wire hps_sdmmc_D3, +output wire hps_emac0_TX_CLK, +input wire hps_emac0_RX_CLK, +output wire hps_emac0_TX_CTL, +input wire hps_emac0_RX_CTL, +output wire hps_emac0_TXD0, +output wire hps_emac0_TXD1, +input wire hps_emac0_RXD0, +input wire hps_emac0_RXD1, +output wire hps_emac0_TXD2, +output wire hps_emac0_TXD3, +input wire hps_emac0_RXD2, +input wire hps_emac0_RXD3, +inout wire hps_emac0_MDIO, +output wire hps_emac0_MDC, +input wire hps_uart0_RX, +output wire hps_uart0_TX, +inout wire hps_i2c1_SDA, +inout wire hps_i2c1_SCL, +inout wire hps_gpio1_io0, +input wire hps_ref_clk ); // CVA6 Intel configuration @@ -72,7 +122,7 @@ localparam type rvfi_probes_t = struct packed { localparam NBSlave = 2; // debug, ariane localparam AxiAddrWidth = 64; localparam AxiDataWidth = 64; -localparam AxiIdWidthMaster = 4; +localparam AxiIdWidthMaster = 5; localparam AxiIdWidthSlaves = AxiIdWidthMaster + $clog2(NBSlave); // 5 localparam AxiUserWidth = CVA6Cfg.AxiUserWidth; @@ -99,7 +149,7 @@ AXI_BUS #( .AXI_DATA_WIDTH ( AxiDataWidth ), .AXI_ID_WIDTH ( AxiIdWidthSlaves ), .AXI_USER_WIDTH ( AxiUserWidth ) -) master[ariane_soc::NB_PERIPHERALS-1:0](); +) master[ariane_soc::NB_PERIPHERALS:0](); AXI_BUS #( .AXI_ADDR_WIDTH ( CVA6Cfg.XLEN ), @@ -170,7 +220,7 @@ assign rst = ~ddr_sync_reset; // AXI Xbar // --------------- -axi_pkg::xbar_rule_64_t [ariane_soc::NB_PERIPHERALS-1:0] addr_map; +axi_pkg::xbar_rule_64_t [ariane_soc::NB_PERIPHERALS:0] addr_map; assign addr_map = '{ '{ idx: ariane_soc::Debug, start_addr: ariane_soc::DebugBase, end_addr: ariane_soc::DebugBase + ariane_soc::DebugLength }, @@ -182,12 +232,13 @@ assign addr_map = '{ '{ idx: ariane_soc::SPI, start_addr: ariane_soc::SPIBase, end_addr: ariane_soc::SPIBase + ariane_soc::SPILength }, '{ idx: ariane_soc::Ethernet, start_addr: ariane_soc::EthernetBase, end_addr: ariane_soc::EthernetBase + ariane_soc::EthernetLength }, '{ idx: ariane_soc::GPIO, start_addr: ariane_soc::GPIOBase, end_addr: ariane_soc::GPIOBase + ariane_soc::GPIOLength }, - '{ idx: ariane_soc::DRAM, start_addr: ariane_soc::DRAMBase, end_addr: ariane_soc::DRAMBase + ariane_soc::DRAMLength } + '{ idx: ariane_soc::DRAM, start_addr: ariane_soc::DRAMBase, end_addr: ariane_soc::DRAMBase + ariane_soc::DRAMLength }, + '{ idx: ariane_soc::HPS, start_addr: ariane_soc::HPSBase, end_addr: ariane_soc::HPSBase + ariane_soc::HPSLength } }; localparam axi_pkg::xbar_cfg_t AXI_XBAR_CFG = '{ NoSlvPorts: ariane_soc::NrSlaves, - NoMstPorts: ariane_soc::NB_PERIPHERALS, + NoMstPorts: ariane_soc::NB_PERIPHERALS+1, MaxMstTrans: 1, // Probably requires update MaxSlvTrans: 1, // Probably requires update FallThrough: 1'b0, @@ -197,7 +248,7 @@ localparam axi_pkg::xbar_cfg_t AXI_XBAR_CFG = '{ UniqueIds: 1'b0, AxiAddrWidth: AxiAddrWidth, AxiDataWidth: AxiDataWidth, - NoAddrRules: ariane_soc::NB_PERIPHERALS + NoAddrRules: ariane_soc::NB_PERIPHERALS+1 }; axi_xbar_intf #( @@ -437,60 +488,60 @@ if (CVA6Cfg.XLEN==32 ) begin end else begin - assign master[ariane_soc::Debug].aw_id = master_to_dm[0].aw_id; - assign master[ariane_soc::Debug].aw_addr = master_to_dm[0].aw_addr; - assign master[ariane_soc::Debug].aw_len = master_to_dm[0].aw_len; - assign master[ariane_soc::Debug].aw_size = master_to_dm[0].aw_size; - assign master[ariane_soc::Debug].aw_burst = master_to_dm[0].aw_burst; - assign master[ariane_soc::Debug].aw_lock = master_to_dm[0].aw_lock; - assign master[ariane_soc::Debug].aw_cache = master_to_dm[0].aw_cache; - assign master[ariane_soc::Debug].aw_prot = master_to_dm[0].aw_prot; - assign master[ariane_soc::Debug].aw_qos = master_to_dm[0].aw_qos; - assign master[ariane_soc::Debug].aw_atop = master_to_dm[0].aw_atop; - assign master[ariane_soc::Debug].aw_region = master_to_dm[0].aw_region; - assign master[ariane_soc::Debug].aw_user = master_to_dm[0].aw_user; - assign master[ariane_soc::Debug].aw_valid = master_to_dm[0].aw_valid; - - assign master_to_dm[0].aw_ready =master[ariane_soc::Debug].aw_ready; - - assign master[ariane_soc::Debug].w_data = master_to_dm[0].w_data; - assign master[ariane_soc::Debug].w_strb = master_to_dm[0].w_strb; - assign master[ariane_soc::Debug].w_last = master_to_dm[0].w_last; - assign master[ariane_soc::Debug].w_user = master_to_dm[0].w_user; - assign master[ariane_soc::Debug].w_valid = master_to_dm[0].w_valid; - - assign master_to_dm[0].w_ready =master[ariane_soc::Debug].w_ready; - - assign master_to_dm[0].b_id =master[ariane_soc::Debug].b_id; - assign master_to_dm[0].b_resp =master[ariane_soc::Debug].b_resp; - assign master_to_dm[0].b_user =master[ariane_soc::Debug].b_user; - assign master_to_dm[0].b_valid =master[ariane_soc::Debug].b_valid; - - assign master[ariane_soc::Debug].b_ready = master_to_dm[0].b_ready; - - assign master[ariane_soc::Debug].ar_id = master_to_dm[0].ar_id; - assign master[ariane_soc::Debug].ar_addr = master_to_dm[0].ar_addr; - assign master[ariane_soc::Debug].ar_len = master_to_dm[0].ar_len; - assign master[ariane_soc::Debug].ar_size = master_to_dm[0].ar_size; - assign master[ariane_soc::Debug].ar_burst = master_to_dm[0].ar_burst; - assign master[ariane_soc::Debug].ar_lock = master_to_dm[0].ar_lock; - assign master[ariane_soc::Debug].ar_cache = master_to_dm[0].ar_cache; - assign master[ariane_soc::Debug].ar_prot = master_to_dm[0].ar_prot; - assign master[ariane_soc::Debug].ar_qos = master_to_dm[0].ar_qos; - assign master[ariane_soc::Debug].ar_region = master_to_dm[0].ar_region; - assign master[ariane_soc::Debug].ar_user = master_to_dm[0].ar_user; - assign master[ariane_soc::Debug].ar_valid = master_to_dm[0].ar_valid; - - assign master_to_dm[0].ar_ready =master[ariane_soc::Debug].ar_ready; - - assign master_to_dm[0].r_id =master[ariane_soc::Debug].r_id; - assign master_to_dm[0].r_data =master[ariane_soc::Debug].r_data; - assign master_to_dm[0].r_resp =master[ariane_soc::Debug].r_resp; - assign master_to_dm[0].r_last =master[ariane_soc::Debug].r_last; - assign master_to_dm[0].r_user =master[ariane_soc::Debug].r_user; - assign master_to_dm[0].r_valid =master[ariane_soc::Debug].r_valid; - - assign master[ariane_soc::Debug].r_ready = master_to_dm[0].r_ready; + assign master_to_dm[0].aw_id = master[ariane_soc::Debug].aw_id; + assign master_to_dm[0].aw_addr = master[ariane_soc::Debug].aw_addr; + assign master_to_dm[0].aw_len = master[ariane_soc::Debug].aw_len; + assign master_to_dm[0].aw_size = master[ariane_soc::Debug].aw_size; + assign master_to_dm[0].aw_burst= master[ariane_soc::Debug].aw_burst; + assign master_to_dm[0].aw_lock = master[ariane_soc::Debug].aw_lock; + assign master_to_dm[0].aw_cache= master[ariane_soc::Debug].aw_cache; + assign master_to_dm[0].aw_prot = master[ariane_soc::Debug].aw_prot; + assign master_to_dm[0].aw_qos = master[ariane_soc::Debug].aw_qos; + assign master_to_dm[0].aw_atop = master[ariane_soc::Debug].aw_atop; + assign master_to_dm[0].aw_region = master[ariane_soc::Debug].aw_region; + assign master_to_dm[0].aw_user = master[ariane_soc::Debug].aw_user; + assign master_to_dm[0].aw_valid= master[ariane_soc::Debug].aw_valid; + + assign master[ariane_soc::Debug].aw_ready = master_to_dm[0].aw_ready; + + assign master_to_dm[0].w_data = master[ariane_soc::Debug].w_data; + assign master_to_dm[0].w_strb = master[ariane_soc::Debug].w_strb; + assign master_to_dm[0].w_last = master[ariane_soc::Debug].w_last; + assign master_to_dm[0].w_user = master[ariane_soc::Debug].w_user; + assign master_to_dm[0].w_valid= master[ariane_soc::Debug].w_valid; + + assign master[ariane_soc::Debug].w_ready = master_to_dm[0].w_ready; + + assign master[ariane_soc::Debug].b_id = master_to_dm[0].b_id; + assign master[ariane_soc::Debug].b_resp = master_to_dm[0].b_resp; + assign master[ariane_soc::Debug].b_user = master_to_dm[0].b_user; + assign master[ariane_soc::Debug].b_valid= master_to_dm[0].b_valid; + + assign master_to_dm[0].b_ready = master[ariane_soc::Debug].b_ready; + + assign master_to_dm[0].ar_id = master[ariane_soc::Debug].ar_id; + assign master_to_dm[0].ar_addr = master[ariane_soc::Debug].ar_addr; + assign master_to_dm[0].ar_len = master[ariane_soc::Debug].ar_len; + assign master_to_dm[0].ar_size = master[ariane_soc::Debug].ar_size; + assign master_to_dm[0].ar_burst = master[ariane_soc::Debug].ar_burst; + assign master_to_dm[0].ar_lock = master[ariane_soc::Debug].ar_lock; + assign master_to_dm[0].ar_cache = master[ariane_soc::Debug].ar_cache; + assign master_to_dm[0].ar_prot = master[ariane_soc::Debug].ar_prot; + assign master_to_dm[0].ar_qos = master[ariane_soc::Debug].ar_qos; + assign master_to_dm[0].ar_region = master[ariane_soc::Debug].ar_region; + assign master_to_dm[0].ar_user = master[ariane_soc::Debug].ar_user; + assign master_to_dm[0].ar_valid = master[ariane_soc::Debug].ar_valid; + + assign master[ariane_soc::Debug].ar_ready = master_to_dm[0].ar_ready; + + assign master[ariane_soc::Debug].r_id = master_to_dm[0].r_id; + assign master[ariane_soc::Debug].r_data = master_to_dm[0].r_data; + assign master[ariane_soc::Debug].r_resp = master_to_dm[0].r_resp; + assign master[ariane_soc::Debug].r_last = master_to_dm[0].r_last; + assign master[ariane_soc::Debug].r_user = master_to_dm[0].r_user; + assign master[ariane_soc::Debug].r_valid = master_to_dm[0].r_valid; + + assign master_to_dm[0].r_ready = master[ariane_soc::Debug].r_ready; end @@ -643,8 +694,6 @@ ariane_axi::resp_t axi_ariane_resp; ariane #( .CVA6Cfg ( CVA6Cfg ), - .rvfi_probes_instr_t ( rvfi_probes_instr_t ), - .rvfi_probes_csr_t ( rvfi_probes_csr_t ), .rvfi_probes_t ( rvfi_probes_t ) ) i_ariane ( .clk_i ( clk ), @@ -744,19 +793,13 @@ end logic clk_200MHz_ref; -AXI_BUS #( - .AXI_ADDR_WIDTH ( AxiAddrWidth ), - .AXI_DATA_WIDTH ( AxiDataWidth ), - .AXI_ID_WIDTH ( AxiIdWidthSlaves ), - .AXI_USER_WIDTH ( AxiUserWidth ) -) uart_bus(); cva6_peripherals #( .AxiAddrWidth ( AxiAddrWidth ), .AxiDataWidth ( AxiDataWidth ), .AxiIdWidth ( AxiIdWidthSlaves ), .AxiUserWidth ( AxiUserWidth ), - .InclUART ( 1'b0 ), + .InclUART ( 1'b1 ), .InclGPIO ( 1'b1 ), .InclSPI ( 1'b0 ), .InclEthernet ( 1'b0 ) @@ -765,8 +808,7 @@ cva6_peripherals #( .clk_200MHz_i ( clk_200MHz_ref ), .rst_ni ( ndmreset_n ), .plic ( master[ariane_soc::PLIC] ), - // .uart ( master[ariane_soc::UART] ), - .uart ( uart_bus ), + .uart ( master[ariane_soc::UART] ), .spi ( master[ariane_soc::SPI] ), .gpio ( master[ariane_soc::GPIO] ), .eth_clk_i ( eth_clk ), @@ -785,7 +827,7 @@ cva6_peripherals #( // .eth_mdio, // .eth_mdc, .phy_tx_clk_i ( phy_tx_clk ), - .sd_clk_i ( sd_clk_sys ), + .sd_irq ( sd_irq ), // .spi_clk_o ( spi_clk_o ), // .spi_mosi ( spi_mosi ), // .spi_miso ( spi_miso ), @@ -797,84 +839,6 @@ cva6_peripherals #( -// UART Through JTAG// - -logic uart_amm_ready; -logic uart_amm_read; -logic uart_amm_write; -logic uart_amm_read_n; -logic uart_amm_write_n; -logic uart_amm_chipselect; -logic uart_amm_irq; -logic [0:0] uart_amm_address; -logic [31:0] uart_amm_rdata; -logic [31:0] uart_amm_wdata; - - -assign uart_amm_read_n = ~uart_amm_read; -assign uart_amm_write_n = ~uart_amm_write; - -cva6_intel_jtag_uart_0 uart_i ( - .clk (clk), // input, width = 1, clk.clk - .rst_n (ndmreset_n), // input, width = 1, reset.reset_n - .av_chipselect (uart_amm_chipselect), // input, width = 1, avalon_jtag_slave.chipselect - .av_address (uart_amm_address), // input, width = 1, .address - .av_read_n (uart_amm_read_n), // input, width = 1, .read_n - .av_readdata (uart_amm_rdata), // output, width = 32, .readdata - .av_write_n (uart_amm_write_n), // input, width = 1, .write_n - .av_writedata (uart_amm_wdata), // input, width = 32, .writedata - .av_waitrequest (uart_amm_ready), // output, width = 1, .waitrequest - .av_irq (uart_amm_irq) // output, width = 1, irq.irq -); - -//axi4 to avalon converter -interconnect_altera_mm_interconnect_1920_v5r556a axi_to_avalon_uart ( - .axi_bridge_1_m0_awid (master[ariane_soc::UART].aw_id), // input, width = 8, axi_bridge_1_m0.awid - .axi_bridge_1_m0_awaddr (master[ariane_soc::UART].aw_addr), // input, width = 64, .awaddr - .axi_bridge_1_m0_awlen (master[ariane_soc::UART].aw_len), // input, width = 8, .awlen - .axi_bridge_1_m0_awsize (master[ariane_soc::UART].aw_size), // input, width = 3, .awsize - .axi_bridge_1_m0_awburst (master[ariane_soc::UART].aw_burst), // input, width = 2, .awburst - .axi_bridge_1_m0_awlock (master[ariane_soc::UART].aw_lock), // input, width = 1, .awlock - .axi_bridge_1_m0_awcache (master[ariane_soc::UART].aw_cache), // input, width = 4, .awcache - .axi_bridge_1_m0_awprot (master[ariane_soc::UART].aw_prot), // input, width = 3, .awprot - .axi_bridge_1_m0_awvalid (master[ariane_soc::UART].aw_valid), // input, width = 1, .awvalid - .axi_bridge_1_m0_awready (master[ariane_soc::UART].aw_ready), // output, width = 1, .awready - .axi_bridge_1_m0_wdata (master[ariane_soc::UART].w_data), // input, width = 64, .wdata - .axi_bridge_1_m0_wstrb (master[ariane_soc::UART].w_strb), // input, width = 8, .wstrb - .axi_bridge_1_m0_wlast (master[ariane_soc::UART].w_last), // input, width = 1, .wlast - .axi_bridge_1_m0_wvalid (master[ariane_soc::UART].w_valid), // input, width = 1, .wvalid - .axi_bridge_1_m0_wready (master[ariane_soc::UART].w_ready), // output, width = 1, .wready - .axi_bridge_1_m0_bid (master[ariane_soc::UART].b_id), // output, width = 8, .bid - .axi_bridge_1_m0_bresp (master[ariane_soc::UART].b_resp), // output, width = 2, .bresp - .axi_bridge_1_m0_bvalid (master[ariane_soc::UART].b_valid), // output, width = 1, .bvalid - .axi_bridge_1_m0_bready (master[ariane_soc::UART].b_ready), // input, width = 1, .bready - .axi_bridge_1_m0_arid (master[ariane_soc::UART].ar_id), // input, width = 8, .arid - .axi_bridge_1_m0_araddr (master[ariane_soc::UART].ar_addr), // input, width = 64, .araddr - .axi_bridge_1_m0_arlen (master[ariane_soc::UART].ar_len), // input, width = 8, .arlen - .axi_bridge_1_m0_arsize (master[ariane_soc::UART].ar_size), // input, width = 3, .arsize - .axi_bridge_1_m0_arburst (master[ariane_soc::UART].ar_burst), // input, width = 2, .arburst - .axi_bridge_1_m0_arlock (master[ariane_soc::UART].ar_lock), // input, width = 1, .arlock - .axi_bridge_1_m0_arcache (master[ariane_soc::UART].ar_cache), // input, width = 4, .arcache - .axi_bridge_1_m0_arprot (master[ariane_soc::UART].ar_prot), // input, width = 3, .arprot - .axi_bridge_1_m0_arvalid (master[ariane_soc::UART].ar_valid), // input, width = 1, .arvalid - .axi_bridge_1_m0_arready (master[ariane_soc::UART].ar_ready), // output, width = 1, .arready - .axi_bridge_1_m0_rid (master[ariane_soc::UART].r_id), // output, width = 8, .rid - .axi_bridge_1_m0_rdata (master[ariane_soc::UART].r_data), // output, width = 64, .rdata - .axi_bridge_1_m0_rresp (master[ariane_soc::UART].r_resp), // output, width = 2, .rresp - .axi_bridge_1_m0_rlast (master[ariane_soc::UART].r_last), // output, width = 1, .rlast - .axi_bridge_1_m0_rvalid (master[ariane_soc::UART].r_valid), // output, width = 1, .rvalid - .axi_bridge_1_m0_rready (master[ariane_soc::UART].r_ready), // input, width = 1, .rready - .jtag_uart_0_avalon_jtag_slave_address (uart_amm_address), // output, width = 1, jtag_uart_0_avalon_jtag_slave.address - .jtag_uart_0_avalon_jtag_slave_write (uart_amm_write), // output, width = 1, .write - .jtag_uart_0_avalon_jtag_slave_read (uart_amm_read), // output, width = 1, .read - .jtag_uart_0_avalon_jtag_slave_readdata (uart_amm_rdata), // input, width = 32, .readdata - .jtag_uart_0_avalon_jtag_slave_writedata (uart_amm_wdata), // output, width = 32, .writedata - .jtag_uart_0_avalon_jtag_slave_waitrequest (uart_amm_ready), // input, width = 1, .waitrequest - .jtag_uart_0_avalon_jtag_slave_chipselect (uart_amm_chipselect), // output, width = 1, .chipselect - .axi_bridge_1_clk_reset_reset_bridge_in_reset_reset (~ndmreset_n), // input, width = 1, axi_bridge_1_clk_reset_reset_bridge_in_reset.reset - .axi_bridge_1_m0_translator_clk_reset_reset_bridge_in_reset_reset (~ndmreset_n), // input, width = 1, axi_bridge_1_m0_translator_clk_reset_reset_bridge_in_reset.reset - .emif_fm_0_emif_usr_clk_clk (clk) // input, width = 1, emif_fm_0_emif_usr_clk.clk - ); // --------------------- // Board peripherals @@ -903,13 +867,14 @@ logic [6:0] ddr_sc_amm_burstcount; logic [63:0] ddr_sc_amm_byteenable; logic ddr_sc_amm_readdatavalid; -logic calbus_read, calbus_write, calbus_clk, ddr_pll_locked, ddr_rst_req, ddr_rst_done; -logic [19:0] calbus_addr; -logic [31:0] calbus_wdata; -logic [31:0] calbus_rdata; -logic [4095:0] calbus_seq_param_tbl; +logic calbus_read, calbus_write, calbus_clk, calbus_read1, calbus_write1, calbus_clk1, ddr_pll_locked, ddr_rst_req, ddr_rst_done; +logic [19:0] calbus_addr,calbus_addr1; +logic [31:0] calbus_wdata, calbus_wdata1; +logic [31:0] calbus_rdata, calbus_rdata1; +logic [4095:0] calbus_seq_param_tbl, calbus_seq_param_tbl1; logic cal_success; logic ddr_amm_wait_request; +logic sd_irq; assign ddr_amm_wait_request = ~ddr_amm_ready; @@ -1125,9 +1090,215 @@ emif_cal ddr_calibration ( .calbus_wdata_0 (calbus_wdata), // output, width = 32, .calbus_wdata .calbus_rdata_0 (calbus_rdata), // input, width = 32, .calbus_rdata .calbus_seq_param_tbl_0 (calbus_seq_param_tbl), // input, width = 4096, .calbus_seq_param_tbl - .calbus_clk (calbus_clk) // output, width = 1, emif_calbus_clk.clk -); + + .calbus_read_1 (calbus_read1), // output, width = 1, emif_calbus_1.calbus_read + .calbus_write_1 (calbus_write1), // output, width = 1, .calbus_write + .calbus_address_1 (calbus_addr1), // output, width = 20, .calbus_address + .calbus_wdata_1 (calbus_wdata1), // output, width = 32, .calbus_wdata + .calbus_rdata_1 (calbus_rdata1), // input, width = 32, .calbus_rdata + .calbus_seq_param_tbl_1 (calbus_seq_param_tbl1), // input, width = 4096, .calbus_seq_param_tbl + .calbus_clk (calbus_clk) // output, width = 1, emif_calbus_clk.clk + ); +wire h2f_reset; +wire ninit_done; + +assign system_reset_n = ~h2f_reset & ~ninit_done; + +AXI_BUS #( + .AXI_ADDR_WIDTH ( CVA6Cfg.XLEN ), + .AXI_DATA_WIDTH ( 128 ), + .AXI_ID_WIDTH ( AxiIdWidthSlaves ), + .AXI_USER_WIDTH ( AxiUserWidth ) +) master_to_hps[0:0](); + +axi_dw_adapter #( + .ADDR_WIDTH (CVA6Cfg.XLEN), + .S_DATA_WIDTH (AxiAddrWidth), + .M_DATA_WIDTH (128), + .ID_WIDTH (AxiIdWidthSlaves) +)i_axi_dwidth_converter_hps( + .clk(clk), + .rst(~ndmreset_n), + .s_axi_awid(master[ariane_soc::HPS].aw_id), + .s_axi_awaddr(master[ariane_soc::HPS].aw_addr[31:0]), + .s_axi_awlen(master[ariane_soc::HPS].aw_len), + .s_axi_awsize(master[ariane_soc::HPS].aw_size), + .s_axi_awburst(master[ariane_soc::HPS].aw_burst), + .s_axi_awlock(master[ariane_soc::HPS].aw_lock), + .s_axi_awcache(master[ariane_soc::HPS].aw_cache), + .s_axi_awprot(master[ariane_soc::HPS].aw_prot), + .s_axi_awregion(master[ariane_soc::HPS].aw_region), + .s_axi_awqos(master[ariane_soc::HPS].aw_qos), + .s_axi_awvalid(master[ariane_soc::HPS].aw_valid), + .s_axi_awready(master[ariane_soc::HPS].aw_ready), + .s_axi_wdata(master[ariane_soc::HPS].w_data), + .s_axi_wstrb(master[ariane_soc::HPS].w_strb), + .s_axi_wlast(master[ariane_soc::HPS].w_last), + .s_axi_wvalid(master[ariane_soc::HPS].w_valid), + .s_axi_wready(master[ariane_soc::HPS].w_ready), + .s_axi_bid(master[ariane_soc::HPS].b_id), + .s_axi_bresp(master[ariane_soc::HPS].b_resp), + .s_axi_bvalid(master[ariane_soc::HPS].b_valid), + .s_axi_bready(master[ariane_soc::HPS].b_ready), + .s_axi_arid(master[ariane_soc::HPS].ar_id), + .s_axi_araddr(master[ariane_soc::HPS].ar_addr[31:0]), + .s_axi_arlen(master[ariane_soc::HPS].ar_len), + .s_axi_arsize(master[ariane_soc::HPS].ar_size), + .s_axi_arburst(master[ariane_soc::HPS].ar_burst), + .s_axi_arlock(master[ariane_soc::HPS].ar_lock), + .s_axi_arcache(master[ariane_soc::HPS].ar_cache), + .s_axi_arprot(master[ariane_soc::HPS].ar_prot), + .s_axi_arregion(master[ariane_soc::HPS].ar_region), + .s_axi_arqos(master[ariane_soc::HPS].ar_qos), + .s_axi_arvalid(master[ariane_soc::HPS].ar_valid), + .s_axi_arready(master[ariane_soc::HPS].ar_ready), + .s_axi_rid(master[ariane_soc::HPS].r_id), + .s_axi_rdata(master[ariane_soc::HPS].r_data), + .s_axi_rresp(master[ariane_soc::HPS].r_resp), + .s_axi_rlast(master[ariane_soc::HPS].r_last), + .s_axi_rvalid(master[ariane_soc::HPS].r_valid), + .s_axi_rready(master[ariane_soc::HPS].r_ready), + .m_axi_awaddr(master_to_hps[0].aw_addr), + .m_axi_awlen(master_to_hps[0].aw_len), + .m_axi_awsize(master_to_hps[0].aw_size), + .m_axi_awburst(master_to_hps[0].aw_burst), + .m_axi_awlock(master_to_hps[0].aw_lock), + .m_axi_awcache(master_to_hps[0].aw_cache), + .m_axi_awprot(master_to_hps[0].aw_prot), + .m_axi_awregion(master_to_hps[0].aw_region), + .m_axi_awqos(master_to_hps[0].aw_qos), + .m_axi_awvalid(master_to_hps[0].aw_valid), + .m_axi_awready(master_to_hps[0].aw_ready), + .m_axi_wdata(master_to_hps[0].w_data ), + .m_axi_wstrb(master_to_hps[0].w_strb), + .m_axi_wlast(master_to_hps[0].w_last), + .m_axi_wvalid(master_to_hps[0].w_valid), + .m_axi_wready(master_to_hps[0].w_ready), + .m_axi_bresp(master_to_hps[0].b_resp), + .m_axi_bvalid(master_to_hps[0].b_valid), + .m_axi_bready(master_to_hps[0].b_ready), + .m_axi_araddr(master_to_hps[0].ar_addr), + .m_axi_arlen(master_to_hps[0].ar_len), + .m_axi_arsize(master_to_hps[0].ar_size), + .m_axi_arburst(master_to_hps[0].ar_burst), + .m_axi_arlock(master_to_hps[0].ar_lock), + .m_axi_arcache(master_to_hps[0].ar_cache), + .m_axi_arprot(master_to_hps[0].ar_prot), + .m_axi_arregion(master_to_hps[0].ar_region), + .m_axi_arqos(master_to_hps[0].ar_qos), + .m_axi_arvalid(master_to_hps[0].ar_valid), + .m_axi_arready(master_to_hps[0].ar_ready), + .m_axi_rdata(master_to_hps[0].r_data), + .m_axi_rresp(master_to_hps[0].r_resp), + .m_axi_rlast(master_to_hps[0].r_last), + .m_axi_rvalid(master_to_hps[0].r_valid), + .m_axi_rready(master_to_hps[0].r_ready) + ); + +system hps_minimal ( + .hps_h2f_sdmmc_interrupt_irq(sd_irq), // output, width = 1 + .hps_hps_io_EMAC0_TX_CLK (hps_emac0_TX_CLK), // output, width = 1, hps_hps_io.EMAC0_TX_CLK + .hps_hps_io_EMAC0_TXD0 (hps_emac0_TXD0), // output, width = 1, .EMAC0_TXD0 + .hps_hps_io_EMAC0_TXD1 (hps_emac0_TXD1), // output, width = 1, .EMAC0_TXD1 + .hps_hps_io_EMAC0_TXD2 (hps_emac0_TXD2), // output, width = 1, .EMAC0_TXD2 + .hps_hps_io_EMAC0_TXD3 (hps_emac0_TXD3), // output, width = 1, .EMAC0_TXD3 + .hps_hps_io_EMAC0_RX_CTL (hps_emac0_RX_CTL), // input, width = 1, .EMAC0_RX_CTL + .hps_hps_io_EMAC0_TX_CTL (hps_emac0_TX_CTL), // output, width = 1, .EMAC0_TX_CTL + .hps_hps_io_EMAC0_RX_CLK (hps_emac0_RX_CLK), // input, width = 1, .EMAC0_RX_CLK + .hps_hps_io_EMAC0_RXD0 (hps_emac0_RXD0), // input, width = 1, .EMAC0_RXD0 + .hps_hps_io_EMAC0_RXD1 (hps_emac0_RXD1), // input, width = 1, .EMAC0_RXD1 + .hps_hps_io_EMAC0_RXD2 (hps_emac0_RXD2), // input, width = 1, .EMAC0_RXD2 + .hps_hps_io_EMAC0_RXD3 (hps_emac0_RXD3), // input, width = 1, .EMAC0_RXD3 + .hps_hps_io_EMAC0_MDIO (hps_emac0_MDIO), // inout, width = 1, .EMAC0_MDIO + .hps_hps_io_EMAC0_MDC (hps_emac0_MDC), // output, width = 1, .EMAC0_MDC + .hps_hps_io_SDMMC_CMD (hps_sdmmc_CMD), // inout, width = 1, .SDMMC_CMD + .hps_hps_io_SDMMC_D0 (hps_sdmmc_D0), // inout, width = 1, .SDMMC_D0 + .hps_hps_io_SDMMC_D1 (hps_sdmmc_D1), // inout, width = 1, .SDMMC_D1 + .hps_hps_io_SDMMC_D2 (hps_sdmmc_D2), // inout, width = 1, .SDMMC_D2 + .hps_hps_io_SDMMC_D3 (hps_sdmmc_D3), // inout, width = 1, .SDMMC_D3 + .hps_hps_io_SDMMC_CCLK (hps_sdmmc_CCLK), // output, width = 1, .SDMMC_CCLK + .hps_hps_io_UART0_RX (hps_uart0_RX), // input, width = 1, .UART0_RX + .hps_hps_io_UART0_TX (hps_uart0_TX), // output, width = 1, .UART0_TX + .hps_hps_io_I2C1_SDA (hps_i2c1_SDA), // inout, width = 1, .I2C1_SDA + .hps_hps_io_I2C1_SCL (hps_i2c1_SCL), // inout, width = 1, .I2C1_SCL + .hps_hps_io_gpio1_io0 (hps_gpio1_io0), // inout, width = 1, .gpio1_io0 + .hps_hps_io_jtag_tck (hps_jtag_tck), // input, width = 1, .jtag_tck + .hps_hps_io_jtag_tms (hps_jtag_tms), // input, width = 1, .jtag_tms + .hps_hps_io_jtag_tdo (hps_jtag_tdo), // output, width = 1, .jtag_tdo + .hps_hps_io_jtag_tdi (hps_jtag_tdi), // input, width = 1, .jtag_tdi + .hps_hps_io_hps_osc_clk (hps_ref_clk), // input, width = 1, .hps_osc_clk + .h2f_reset_reset (h2f_reset), // output, width = 1, h2f_reset.reset + + .hps_f2h_axi_clock_clk (clk), // input, width = 1, hps_f2h_axi_clock.clk + .hps_f2h_axi_reset_reset_n(ndmreset_n), // input, width = 1, hps_f2h_axi_reset.reset_n + .hps_emif_pll_ref_clk_clk (emif_hps_pll_ref_clk_p), // input, width = 1, hps_emif_pll_ref_clk.clk + .hps_emif_oct_oct_rzqin (emif_hps_oct_oct_rzqin), // input, width = 1, hps_emif_oct.oct_rzqin + .hps_emif_mem_mem_ck (emif_hps_mem_mem_ck), // output, width = 1, hps_emif_mem.mem_ck + .hps_emif_mem_mem_ck_n (emif_hps_mem_mem_ck_n), // output, width = 1, .mem_ck_n + .hps_emif_mem_mem_a (emif_hps_mem_mem_a), // output, width = 17, .mem_a + .hps_emif_mem_mem_act_n (emif_hps_mem_mem_act_n), // output, width = 1, .mem_act_n + .hps_emif_mem_mem_ba (emif_hps_mem_mem_ba), // output, width = 2, .mem_ba + .hps_emif_mem_mem_bg (emif_hps_mem_mem_bg), // output, width = 2, .mem_bg + .hps_emif_mem_mem_cke (emif_hps_mem_mem_cke), // output, width = 1, .mem_cke + .hps_emif_mem_mem_cs_n (emif_hps_mem_mem_cs_n), // output, width = 1, .mem_cs_n + .hps_emif_mem_mem_odt (emif_hps_mem_mem_odt), // output, width = 1, .mem_odt + .hps_emif_mem_mem_reset_n (emif_hps_mem_mem_reset_n), // output, width = 1, .mem_reset_n + .hps_emif_mem_mem_par (emif_hps_mem_mem_par), // output, width = 1, .mem_par + .hps_emif_mem_mem_alert_n (emif_hps_mem_mem_alert_n), // input, width = 1, .mem_alert_n + .hps_emif_mem_mem_dqs (emif_hps_mem_mem_dqs), // inout, width = 8, .mem_dqs + .hps_emif_mem_mem_dqs_n (emif_hps_mem_mem_dqs_n), // inout, width = 8, .mem_dqs_n + .hps_emif_mem_mem_dq (emif_hps_mem_mem_dq), // inout, width = 64, .mem_dq + .hps_emif_mem_mem_dbi_n (emif_hps_mem_mem_dbi_n), // inout, width = 8, .mem_dbi_n + + .hps_emif_emif_calbus_calbus_read (calbus_read1), // input, width = 1, hps_emif_emif_calbus.calbus_read + .hps_emif_emif_calbus_calbus_write (calbus_write1), // input, width = 1, .calbus_write + .hps_emif_emif_calbus_calbus_address (calbus_address1), // input, width = 20, .calbus_address + .hps_emif_emif_calbus_calbus_wdata (calbus_wdata1), // input, width = 32, .calbus_wdata + .hps_emif_emif_calbus_calbus_rdata (calbus_rdata1), // output, width = 32, .calbus_rdata + .hps_emif_emif_calbus_calbus_seq_param_tbl (calbus_seq_param_tbl1), // output, width = 4096, .calbus_seq_param_tbl + .hps_emif_emif_calbus_clk_clk (calbus_clk), // input, width = 1, hps_emif_emif_calbus_clk.clk + + .ninit_done_ninit_done (ninit_done), // output, width = 1, ninit_done.ninit_done + + .system_intel_cache_coherency_translator_clock_clk (clk), // input, width = 1, system_intel_cache_coherency_translator_clock.clk + .system_intel_cache_coherency_translator_reset_reset (~ndmreset_n), // input, width = 1, system_intel_cache_coherency_translator_reset.reset + .system_intel_cache_coherency_translator_s0_araddr (master_to_hps[0].ar_addr), // input, width = 32, system_intel_cache_coherency_translator_s0.araddr + .system_intel_cache_coherency_translator_s0_arburst (master_to_hps[0].ar_burst), // input, width = 2, .arburst + .system_intel_cache_coherency_translator_s0_arcache (master_to_hps[0].ar_cache), // input, width = 4, .arcache + .system_intel_cache_coherency_translator_s0_arid (master_to_hps[0].ar_id), // input, width = 5, .arid + .system_intel_cache_coherency_translator_s0_arlen (master_to_hps[0].ar_len), // input, width = 8, .arlen + .system_intel_cache_coherency_translator_s0_arlock (master_to_hps[0].ar_lock), // input, width = 1, .arlock + .system_intel_cache_coherency_translator_s0_arprot (master_to_hps[0].ar_prot), // input, width = 3, .arprot + .system_intel_cache_coherency_translator_s0_arready (master_to_hps[0].ar_ready), // output, width = 1, .arready + .system_intel_cache_coherency_translator_s0_arsize (master_to_hps[0].ar_size), // input, width = 3, .arsize + .system_intel_cache_coherency_translator_s0_arvalid (master_to_hps[0].ar_valid), // input, width = 1, .arvalid + .system_intel_cache_coherency_translator_s0_awaddr (master_to_hps[0].aw_addr), // input, width = 32, .awaddr + .system_intel_cache_coherency_translator_s0_awburst (master_to_hps[0].aw_burst), // input, width = 2, .awburst + .system_intel_cache_coherency_translator_s0_awcache (master_to_hps[0].aw_cache), // input, width = 4, .awcache + .system_intel_cache_coherency_translator_s0_awid (master_to_hps[0].aw_id), // input, width = 5, .awid + .system_intel_cache_coherency_translator_s0_awlen (master_to_hps[0].aw_len), // input, width = 8, .awlen + .system_intel_cache_coherency_translator_s0_awlock (master_to_hps[0].aw_lock), // input, width = 1, .awlock + .system_intel_cache_coherency_translator_s0_awprot (master_to_hps[0].aw_prot), // input, width = 3, .awprot + .system_intel_cache_coherency_translator_s0_awready (master_to_hps[0].aw_ready), // output, width = 1, .awready + .system_intel_cache_coherency_translator_s0_awsize (master_to_hps[0].aw_size), // input, width = 3, .awsize + .system_intel_cache_coherency_translator_s0_awvalid (master_to_hps[0].aw_valid), // input, width = 1, .awvalid + .system_intel_cache_coherency_translator_s0_bid (master_to_hps[0].b_id), // output, width = 5, .bid + .system_intel_cache_coherency_translator_s0_bready (master_to_hps[0].b_ready), // input, width = 1, .bready + .system_intel_cache_coherency_translator_s0_bresp (master_to_hps[0].b_resp), // output, width = 2, .bresp + .system_intel_cache_coherency_translator_s0_bvalid (master_to_hps[0].b_valid), // output, width = 1, .bvalid + .system_intel_cache_coherency_translator_s0_rdata (master_to_hps[0].r_data), // output, width = 128, .rdata + .system_intel_cache_coherency_translator_s0_rid (master_to_hps[0].r_id), // output, width = 5, .rid + .system_intel_cache_coherency_translator_s0_rlast (master_to_hps[0].r_last), // output, width = 1, .rlast + .system_intel_cache_coherency_translator_s0_rready (master_to_hps[0].r_ready), // input, width = 1, .rready + .system_intel_cache_coherency_translator_s0_rresp (master_to_hps[0].r_resp), // output, width = 2, .rresp + .system_intel_cache_coherency_translator_s0_rvalid (master_to_hps[0].r_valid), // output, width = 1, .rvalid + .system_intel_cache_coherency_translator_s0_wdata (master_to_hps[0].w_data), // input, width = 128, .wdata + .system_intel_cache_coherency_translator_s0_wlast (master_to_hps[0].w_last), // input, width = 1, .wlast + .system_intel_cache_coherency_translator_s0_wready (master_to_hps[0].w_ready), // output, width = 1, .wready + .system_intel_cache_coherency_translator_s0_wstrb (master_to_hps[0].w_strb), // input, width = 16, .wstrb + .system_intel_cache_coherency_translator_s0_wvalid (master_to_hps[0].w_valid) // input, width = 1, .wvalid + ); // //clocks diff --git a/corev_apu/altera/src/cva6_altera_peripherals.sv b/corev_apu/altera/src/cva6_altera_peripherals.sv index dbab741d68..1a6e09d015 100644 --- a/corev_apu/altera/src/cva6_altera_peripherals.sv +++ b/corev_apu/altera/src/cva6_altera_peripherals.sv @@ -57,7 +57,7 @@ module cva6_peripherals #( input logic spi_miso , output logic spi_ss , // SD Card - input logic sd_clk_i , + input logic sd_irq , output logic [7:0] leds_o , input logic [7:0] dip_switches_i ); @@ -68,7 +68,8 @@ module cva6_peripherals #( logic [ariane_soc::NumSources-1:0] irq_sources; // Unused interrupt sources - assign irq_sources[ariane_soc::NumSources-1:7] = '0; + assign irq_sources[ariane_soc::NumSources-1:8] = '0; + assign irq_sources[7] = sd_irq; REG_BUS #( .ADDR_WIDTH ( 32 ), @@ -192,123 +193,85 @@ module cva6_peripherals #( // --------------- // 2. UART // --------------- - logic uart_penable; - logic uart_pwrite; - logic [31:0] uart_paddr; - logic uart_psel; - logic [31:0] uart_pwdata; - logic [31:0] uart_prdata; - logic uart_pready; - logic uart_pslverr; - axi2apb_64_32 #( - .AXI4_ADDRESS_WIDTH ( AxiAddrWidth ), - .AXI4_RDATA_WIDTH ( AxiDataWidth ), - .AXI4_WDATA_WIDTH ( AxiDataWidth ), - .AXI4_ID_WIDTH ( AxiIdWidth ), - .AXI4_USER_WIDTH ( AxiUserWidth ), - .BUFF_DEPTH_SLAVE ( 2 ), - .APB_ADDR_WIDTH ( 32 ) - ) i_axi2apb_64_32_uart ( - .ACLK ( clk_i ), - .ARESETn ( rst_ni ), - .test_en_i ( 1'b0 ), - .AWID_i ( uart.aw_id ), - .AWADDR_i ( uart.aw_addr ), - .AWLEN_i ( uart.aw_len ), - .AWSIZE_i ( uart.aw_size ), - .AWBURST_i ( uart.aw_burst ), - .AWLOCK_i ( uart.aw_lock ), - .AWCACHE_i ( uart.aw_cache ), - .AWPROT_i ( uart.aw_prot ), - .AWREGION_i( uart.aw_region ), - .AWUSER_i ( uart.aw_user ), - .AWQOS_i ( uart.aw_qos ), - .AWVALID_i ( uart.aw_valid ), - .AWREADY_o ( uart.aw_ready ), - .WDATA_i ( uart.w_data ), - .WSTRB_i ( uart.w_strb ), - .WLAST_i ( uart.w_last ), - .WUSER_i ( uart.w_user ), - .WVALID_i ( uart.w_valid ), - .WREADY_o ( uart.w_ready ), - .BID_o ( uart.b_id ), - .BRESP_o ( uart.b_resp ), - .BVALID_o ( uart.b_valid ), - .BUSER_o ( uart.b_user ), - .BREADY_i ( uart.b_ready ), - .ARID_i ( uart.ar_id ), - .ARADDR_i ( uart.ar_addr ), - .ARLEN_i ( uart.ar_len ), - .ARSIZE_i ( uart.ar_size ), - .ARBURST_i ( uart.ar_burst ), - .ARLOCK_i ( uart.ar_lock ), - .ARCACHE_i ( uart.ar_cache ), - .ARPROT_i ( uart.ar_prot ), - .ARREGION_i( uart.ar_region ), - .ARUSER_i ( uart.ar_user ), - .ARQOS_i ( uart.ar_qos ), - .ARVALID_i ( uart.ar_valid ), - .ARREADY_o ( uart.ar_ready ), - .RID_o ( uart.r_id ), - .RDATA_o ( uart.r_data ), - .RRESP_o ( uart.r_resp ), - .RLAST_o ( uart.r_last ), - .RUSER_o ( uart.r_user ), - .RVALID_o ( uart.r_valid ), - .RREADY_i ( uart.r_ready ), - .PENABLE ( uart_penable ), - .PWRITE ( uart_pwrite ), - .PADDR ( uart_paddr ), - .PSEL ( uart_psel ), - .PWDATA ( uart_pwdata ), - .PRDATA ( uart_prdata ), - .PREADY ( uart_pready ), - .PSLVERR ( uart_pslverr ) - ); + // UART Through JTAG// + +logic uart_amm_ready; +logic uart_amm_read; +logic uart_amm_write; +logic uart_amm_read_n; +logic uart_amm_write_n; +logic uart_amm_chipselect; +logic uart_amm_irq; +logic [0:0] uart_amm_address; +logic [31:0] uart_amm_rdata; +logic [31:0] uart_amm_wdata; + + +assign uart_amm_read_n = ~uart_amm_read; +assign uart_amm_write_n = ~uart_amm_write; + +cva6_intel_jtag_uart_0 uart_i ( + .clk (clk_i), // input, width = 1, clk.clk + .rst_n (rst_ni), + .av_chipselect (uart_amm_chipselect), // input, width = 1, avalon_jtag_slave.chipselect + .av_address (uart_amm_address), // input, width = 1, .address + .av_read_n (uart_amm_read_n), // input, width = 1, .read_n + .av_readdata (uart_amm_rdata), // output, width = 32, .readdata + .av_write_n (uart_amm_write_n), // input, width = 1, .write_n + .av_writedata (uart_amm_wdata), // input, width = 32, .writedata + .av_waitrequest (uart_amm_ready), // output, width = 1, .waitrequest + .av_irq (irq_sources[0]) // output, width = 1, irq.irq +); - if (InclUART) begin : gen_uart - apb_uart i_apb_uart ( - .CLK ( clk_i ), - .RSTN ( rst_ni ), - .PSEL ( uart_psel ), - .PENABLE ( uart_penable ), - .PWRITE ( uart_pwrite ), - .PADDR ( uart_paddr[4:2] ), - .PWDATA ( uart_pwdata ), - .PRDATA ( uart_prdata ), - .PREADY ( uart_pready ), - .PSLVERR ( uart_pslverr ), - .INT ( irq_sources[0] ), - .OUT1N ( ), // keep open - .OUT2N ( ), // keep open - .RTSN ( ), // no flow control - .DTRN ( ), // no flow control - .CTSN ( 1'b0 ), - .DSRN ( 1'b0 ), - .DCDN ( 1'b0 ), - .RIN ( 1'b0 ), - .SIN ( rx_i ), - .SOUT ( tx_o ) - ); - end else begin - /* pragma translate_off */ - `ifndef VERILATOR - mock_uart i_mock_uart ( - .clk_i ( clk_i ), - .rst_ni ( rst_ni ), - .penable_i ( uart_penable ), - .pwrite_i ( uart_pwrite ), - .paddr_i ( uart_paddr ), - .psel_i ( uart_psel ), - .pwdata_i ( uart_pwdata ), - .prdata_o ( uart_prdata ), - .pready_o ( uart_pready ), - .pslverr_o ( uart_pslverr ) - ); - `endif - /* pragma translate_on */ - end +//axi4 to avalon converter +interconnect_altera_mm_interconnect_1920_v5r556a axi_to_avalon_uart ( + .axi_bridge_1_m0_awid (uart.aw_id), // input, width = 8, axi_bridge_1_m0.awid + .axi_bridge_1_m0_awaddr (uart.aw_addr), // input, width = 64, .awaddr + .axi_bridge_1_m0_awlen (uart.aw_len), // input, width = 8, .awlen + .axi_bridge_1_m0_awsize (uart.aw_size), // input, width = 3, .awsize + .axi_bridge_1_m0_awburst (uart.aw_burst), // input, width = 2, .awburst + .axi_bridge_1_m0_awlock (uart.aw_lock), // input, width = 1, .awlock + .axi_bridge_1_m0_awcache (uart.aw_cache), // input, width = 4, .awcache + .axi_bridge_1_m0_awprot (uart.aw_prot), // input, width = 3, .awprot + .axi_bridge_1_m0_awvalid (uart.aw_valid), // input, width = 1, .awvalid + .axi_bridge_1_m0_awready (uart.aw_ready), // output, width = 1, .awready + .axi_bridge_1_m0_wdata (uart.w_data), // input, width = 64, .wdata + .axi_bridge_1_m0_wstrb (uart.w_strb), // input, width = 8, .wstrb + .axi_bridge_1_m0_wlast (uart.w_last), // input, width = 1, .wlast + .axi_bridge_1_m0_wvalid (uart.w_valid), // input, width = 1, .wvalid + .axi_bridge_1_m0_wready (uart.w_ready), // output, width = 1, .wready + .axi_bridge_1_m0_bid (uart.b_id), // output, width = 8, .bid + .axi_bridge_1_m0_bresp (uart.b_resp), // output, width = 2, .bresp + .axi_bridge_1_m0_bvalid (uart.b_valid), // output, width = 1, .bvalid + .axi_bridge_1_m0_bready (uart.b_ready), // input, width = 1, .bready + .axi_bridge_1_m0_arid (uart.ar_id), // input, width = 8, .arid + .axi_bridge_1_m0_araddr (uart.ar_addr), // input, width = 64, .araddr + .axi_bridge_1_m0_arlen (uart.ar_len), // input, width = 8, .arlen + .axi_bridge_1_m0_arsize (uart.ar_size), // input, width = 3, .arsize + .axi_bridge_1_m0_arburst (uart.ar_burst), // input, width = 2, .arburst + .axi_bridge_1_m0_arlock (uart.ar_lock), // input, width = 1, .arlock + .axi_bridge_1_m0_arcache (uart.ar_cache), // input, width = 4, .arcache + .axi_bridge_1_m0_arprot (uart.ar_prot), // input, width = 3, .arprot + .axi_bridge_1_m0_arvalid (uart.ar_valid), // input, width = 1, .arvalid + .axi_bridge_1_m0_arready (uart.ar_ready), // output, width = 1, .arready + .axi_bridge_1_m0_rid (uart.r_id), // output, width = 8, .rid + .axi_bridge_1_m0_rdata (uart.r_data), // output, width = 64, .rdata + .axi_bridge_1_m0_rresp (uart.r_resp), // output, width = 2, .rresp + .axi_bridge_1_m0_rlast (uart.r_last), // output, width = 1, .rlast + .axi_bridge_1_m0_rvalid (uart.r_valid), // output, width = 1, .rvalid + .axi_bridge_1_m0_rready (uart.r_ready), // input, width = 1, .rready + .jtag_uart_0_avalon_jtag_slave_address (uart_amm_address), // output, width = 1, jtag_uart_0_avalon_jtag_slave.address + .jtag_uart_0_avalon_jtag_slave_write (uart_amm_write), // output, width = 1, .write + .jtag_uart_0_avalon_jtag_slave_read (uart_amm_read), // output, width = 1, .read + .jtag_uart_0_avalon_jtag_slave_readdata (uart_amm_rdata), // input, width = 32, .readdata + .jtag_uart_0_avalon_jtag_slave_writedata (uart_amm_wdata), // output, width = 32, .writedata + .jtag_uart_0_avalon_jtag_slave_waitrequest (uart_amm_ready), // input, width = 1, .waitrequest + .jtag_uart_0_avalon_jtag_slave_chipselect (uart_amm_chipselect), // output, width = 1, .chipselect + .axi_bridge_1_clk_reset_reset_bridge_in_reset_reset (~rst_ni), // input, width = 1, axi_bridge_1_clk_reset_reset_bridge_in_reset.reset + .axi_bridge_1_m0_translator_clk_reset_reset_bridge_in_reset_reset (~rst_ni), // input, width = 1, axi_bridge_1_m0_translator_clk_reset_reset_bridge_in_reset.reset + .emif_fm_0_emif_usr_clk_clk (clk_i) // input, width = 1, emif_fm_0_emif_usr_clk.clk + ); // --------------- // 3. SPI diff --git a/corev_apu/altera/src/dmi_vjtag.sv b/corev_apu/altera/src/dmi_vjtag.sv index 7204ec76b4..e2a57b76c8 100644 --- a/corev_apu/altera/src/dmi_vjtag.sv +++ b/corev_apu/altera/src/dmi_vjtag.sv @@ -42,9 +42,9 @@ module dmi_vjtag #( output logic tdo_oe_o, // Data out output enable input logic[IrLength-1:0] ir_in_i, // Virtual IR in input logic jtag_state_tlr_i, // Test logic reset - input logic virtual_state_cdr_i, // Virtual Captude DR + input logic virtual_state_cdr_i, // Virtual Capture DR input logic virtual_state_sdr_i, // Virtual Shift DR - input logic virtual_state_udr_i // Virutal Update DR + input logic virtual_state_udr_i // Virtual Update DR ); assign dmi_rst_no = rst_ni; @@ -85,7 +85,7 @@ module dmi_vjtag #( assign dmi_req.addr = address_q; assign dmi_req.data = data_q; assign dmi_req.op = (state_q == Write) ? dm::DTM_WRITE : dm::DTM_READ; - // we'will always be ready to accept the data we requested + // we will always be ready to accept the data we requested assign dmi_resp_ready = 1'b1; logic error_dmi_busy; diff --git a/corev_apu/altera/src/dmi_vjtag_tap.sv b/corev_apu/altera/src/dmi_vjtag_tap.sv index 44e4008481..8f36b61a11 100644 --- a/corev_apu/altera/src/dmi_vjtag_tap.sv +++ b/corev_apu/altera/src/dmi_vjtag_tap.sv @@ -35,9 +35,9 @@ module dmi_vjtag_tap #( input logic testmode_i, input logic[IrLength-1:0] ir_in_i, // Virtual IR in input logic jtag_state_tlr_i, // Test logic reset - input logic virtual_state_cdr_i, // Virtual Captude DR + input logic virtual_state_cdr_i, // Virtual Capture DR input logic virtual_state_sdr_i, // Virtual Shift DR - input logic virtual_state_udr_i, // Virutal Update DR + input logic virtual_state_udr_i, // Virtual Update DR // we want to access DMI register output logic dmi_access_o, diff --git a/corev_apu/altera/u-boot-spl-dtb.hex b/corev_apu/altera/u-boot-spl-dtb.hex new file mode 100644 index 0000000000..408f9a011f --- /dev/null +++ b/corev_apu/altera/u-boot-spl-dtb.hex @@ -0,0 +1,9599 @@ +:02000004FFE01B +:100000000A0000141F2003D500002000000000009B +:10001000884302000000000000001040FFFFFFFFC7 +:1000200098061040FFFFFFFF62000014414238D5E0 +:100030003F2000F16C000054E0000054AB0100547C +:1000400000113ED5000C40B200111ED55F111ED527 +:100050000A00001401113CD5C10010B721007BB289 +:1000600001111CD5E07F86D240111CD5030000147D +:100070000006A0D2401018D5FF4403D5404238D521 +:100080001F2000F14C01005440000054AB0000540C +:10009000000438D5000C7492E00000B50400001490 +:1000A000000438D5001C7892600000B56008005844 +:1000B00000E01BD5DF3F03D5414238D53F2000F19A +:1000C0006C000054C0000054AB00005420F239D53D +:1000D00000007AB220F219D5DF3F03D50D0000945D +:1000E0004A010094A00038D5009C409200DC609248 +:1000F000C00000B45F2003D541060058200040F93D +:10010000A0FFFFB400001FD6BF4100D5B90800947E +:10011000FD031EAA000038D500FC44D3002C4092F9 +:100120001F0C34F100010054000038D500FC44D30A +:10013000002C40921F1C34F180000054FE031DAAC5 +:10014000C0035FD6FEFFFF17FDFFFF17FD031EAACA +:10015000A00038D5009C409200DC6092600000B5A1 +:1001600040030058D10800940003005821030058B0 +:10017000E4080094A00038D5009C409200DC609216 +:10018000C00000B460020058F00800946400001041 +:100190004502005869080094FE031DAAC0035FD6FB +:1001A00040010058E5080014C0035FD6C0035FD6C5 +:1001B0009FFFFF17000000000084D7170000000019 +:1001C0001022D1FF000000000010FCFF0000000022 +:1001D0000020FCFF00000000010000000000000003 +:1001E000FD7BBFA9FD0300917C3300940000805289 +:1001F000FD7BC1A8C0035FD6FD7BBEA92000805255 +:1002000005008052FD030091E7630091E6730091C1 +:10021000040080D2030080520200805261028052AA +:10022000E01F00B975010094C00000340001009087 +:10023000006C0891A0150094000080520700001483 +:10024000E01B40B91F04003180FFFF541FFC037105 +:1002500088000054001C0012FD7BC2A8C0035FD6BA +:100260000001009000380991F3FFFF17FD7BBDA945 +:10027000FD030091F30B00F9F30300AADFFFFF97E2 +:10028000021C0012E10000D0E08300912130379180 +:10029000283A0094E1830091E00313AAC634009445 +:1002A000F30B40F9FD7BC3A8C0035FD6FD7BBEA95D +:1002B000FD030091F35301A9F403002A13008052B7 +:1002C0008A000094000440B9BF3F03D59F02206A12 +:1002D00061FFFF54730600117F2A007121FFFF5454 +:1002E000F35341A9FD7BC2A8C0035FD6FD7BBDA926 +:1002F000FD030091F35301A9F51300F97B0000946D +:1003000013100091000080D266350094F40300AA17 +:1003100015C489D2600240B9BF3F03D52001003621 +:10032000E00314AA5F3500941F0015EB4801005448 +:10033000200080D29435009408190094F6FFFF172E +:1003400000008052F35341A9F51340F9FD7BC3A887 +:10035000C0035FD6A00D8012FBFFFF171F9C0F711B +:10036000C9020054FD7BBEA9017D8052FD030091AE +:10037000F30B00F91308C11AE00000F0004C0791DC +:10038000E103132A153A009455000094000042B985 +:10039000BF3F03D5000C04121300132ABF3F03D53F +:1003A0004F000094130002B900008052F30B40F993 +:1003B000FD7BC2A8C0035FD6A0028012C0035FD637 +:1003C000FD7BBFA9FD03009145000094000042B9E8 +:1003D000BF3F03D5006C0012017D8052FD7BC1A898 +:1003E000007C011BC0035FD6FD7BBCA9E20300AA11 +:1003F000FD030091F35301A9F40301AA0100801247 +:10040000F51300F9556A40F9E00315AAF92E009496 +:10041000F303002A0002F837E103002AE00315AADB +:100420000431009420020034E103132AE4C3009154 +:10043000E00315AA030080520201009042A40B9130 +:100440008A320094F303002A60000035E01B40F973 +:10045000800200F9E003132AF35341A9F51340F990 +:10046000FD7BC4A8C0035FD653028012FAFFFF17BA +:10047000FD7BBEA90001009000C40991FD0300911D +:10048000F30B00F9130100B073421C91E10313AAAE +:10049000D6FFFF974000003407340094000100901D +:1004A0006122009100F80991D0FFFF9760FFFF35AE +:1004B0000001009061420091002C0A91CBFFFF9750 +:1004C000C0FEFF35F30B40F9FD7BC2A8C0035FD629 +:1004D000000100B0008843F9C0035FD6000100B0FE +:1004E000008C43F9C0035FD6000100B0009043F9CF +:1004F000C0035FD6FD7BBBA9010100F021C01991AB +:10050000FD030091E2830091F30B00F9F303002A4D +:10051000C0038052BA490094A0000034000080D289 +:10052000F30B40F9FD7BC5A8C0035FD6E01340F98B +:10053000E1A30091F32300F9F040009400FFFF379E +:10054000E0A3009148410094011800913F0400F19C +:10055000A1048092048041FA41FEFF54F0FFFF178E +:10056000FD7BBEA9C0038052FD030091F30B00F98F +:10057000137D80D2E0FFFF970108D39AE00000F0DE +:10058000005805919539009400048052DAFFFF97D6 +:100590000108D39AE00000F000A805918F3900947B +:1005A00060008052D4FFFF970108D39AE00000F06A +:1005B00000FC05918939009420048052CEFFFF97FA +:1005C0000108D39AE00000F00050069183390094AE +:1005D00040048052C8FFFF970108D39AE00000F062 +:1005E00000A406917D39009400068052C2FFFF9757 +:1005F0000108D39AE00000F0F30B40F900F80691EF +:10060000FD7BC2A875390014FD031EAAE40B005837 +:10061000850040F9E10B00583F0005EBE101005473 +:10062000A00038D5009C409200DC6092200100B50B +:100630009F0000F9240B00589F0000B941C03ED52F +:1006400021007FB241C01ED5DF3F03D59F3F03D5B8 +:100650007F2003D5FFFFFF17440A0058850040F9AB +:10066000A6006D92460300B5040A0058850440B9FF +:10067000A00038D5010C4092C20900584220C19A0E +:10068000A600028A860000B5840800589F0000B9C1 +:1006900003000014A4080058820400B9A00038D553 +:1006A000009C409200DC6092200200B46407005875 +:1006B000850040F9450000B4A0001FD6A00038D541 +:1006C000009C409200DC609220FFFFB56406005859 +:1006D000850040F9450000B4A0001FD6A00038D521 +:1006E000009C409200DC609220FFFFB4600600583E +:1006F0006E070094200600584106005881070094B8 +:10070000A00038D5009C409200DC6092C00000B48C +:10071000800500588D07009464000010650500589E +:1007200006070094A00038D5009C409200DC60923F +:10073000600200B5A1030058200040F9A20400584F +:10074000000002EAA100005480040058A1040058EF +:10075000C20400580400001440040058E10300588B +:1007600082040058030040B900100091230000B932 +:10077000211000913F0002EB61FFFF54FE031DAA10 +:10078000C0035FD6000000001822D1FF0000000067 +:10079000E7E52812000000001022D1FF0000000051 +:1007A0002022D1FF000000000010D1FF0000000057 +:1007B00000010000000000000010FCFF000000002D +:1007C0000020FCFF0000000001000000000000000D +:1007D000000F0F00000000001017E2FF00000000F3 +:1007E000D022E2FF00000000782EE2FF00000000AF +:1007F000B822E2FF000000005F1C00720E1C001215 +:10080000E8079F1A000C0853FD7BBAA91E0698D270 +:10081000082C082A60281453FD0300910000012AC7 +:100820000801002A109080D2094888D28F0080D217 +:10083000910480D21EFDA7F20B8080D2A51C00126D +:1008400008010432F35301A9130480D2F4031E2AD1 +:10085000F55B02A9150298D26D00805270F4BFF2C8 +:100860000A7D80D2E901A0F26FF4BFF271F4BFF209 +:1008700073F4BFF26BF4BFF215FDA7F2F76303A99F +:10088000F96B04A9FB7305A9A5030034800580D288 +:1008900060F4BFF20C0040B9BF3F03D58C011812C1 +:1008A000BF3F03D501C01DB8BF3F03D52000805214 +:1008B000600100B9027D8052000240B9BF3F03D5FC +:1008C00080170035DF3F03D536E03BD500E03BD550 +:1008D000007C0A9B0008C99A0000168B0004009156 +:1008E000DF3F03D536E03BD5DF0200EBA3FFFF542B +:1008F0004204007121FEFF54210000143FFC1F71CF +:100900002813005460F4BFD2160040B9BF3F03D58E +:10091000D6120012177D8052C006001102008052CC +:100920000010001238008052790240B9BF3F03D551 +:100930001F00196B6105005462000035BF3F03D5ED +:10094000780100B9DF3F03D539E03BD502E03BD564 +:10095000427C0A9B4208C99A4200198B42040091CA +:10096000DF3F03D539E03BD53F0302EBA3FFFF5444 +:10097000F70600712200805281FDFF54A00D801205 +:100980001FFC077104184B7AE1010054DF3F03D5C7 +:1009900036E03BD502E03BD517FA80D2427C179B6C +:1009A0004208C99A4200168B42040091DF3F03D5EA +:1009B00036E03BD5DF0202EBA3FFFF54AD0500712B +:1009C00041F6FF54F35341A9F55B42A9F76343A9EC +:1009D000F96B44A9FB7345A9FD7BC6A8C0035FD68C +:1009E000BF3F03D50202985202FDA772D602020B46 +:1009F000D67A7ED3C80200B9BF3F03D579F4BFD2FF +:100A0000170080D23A008052200300B97F00176B94 +:100A1000C9F4FF54160400119B7877B8D61200125F +:100A2000187D8052020080527C0240B9BF3F03D53E +:100A3000DF021C6B6102005462000035BF3F03D52A +:100A40007A0100B9DF3F03D53CE03BD502E03BD55E +:100A5000427C0A9B4208C99A42001C8B42040091C6 +:100A6000DF3F03D53CE03BD59F0302EBA3FFFF54E0 +:100A7000180700712200805281FDFF54C0FFFF174C +:100A8000BF3F03D50000158B00F47ED31B0000B9D7 +:100A9000BF3F03D5F7060091E003162A360300B9DD +:100AA000DBFFFF17E20140B9BF3F03D5200240B989 +:100AB000BF3F03D55F00006BE0EFFF54C043228BC4 +:100AC00000F47ED3000040B9BF3F03D542040011BB +:100AD000420C0012BF3F03D5167C1C53E20100B943 +:100AE000DF06007181EEFF54166C58D3DF020E6BE7 +:100AF00021EEFF54E60000B4D70040B9DF0000B992 +:100B000018584CD3B8000035002800129DFFFF177D +:100B100017008052FBFFFF1719FA80D2360240B946 +:100B2000BF3F03D5DF02026B21020054DF3F03D534 +:100B30003AE03BD516E03BD5D67E0A9BD60AC99A49 +:100B4000D6021A8BD6060091DF3F03D53AE03BD59B +:100B50005F0316EBA3FFFF54390700F101FEFF54BA +:100B600087FFFF17A002801286FFFF175600140BA5 +:100B7000D67A7ED3D60240B9BF3F03D542040011D6 +:100B800018070051420C0012BF3F03D5E20100B923 +:100B9000B7FBFF34D90040B9F7060051F67839B8F1 +:100BA000D60040B9D6060011D60000B9D6FFFF170F +:100BB000BF3F03D51F0200B965F7FF34800580D21F +:100BC00060F4BFF2000040B9BF3F03D50000181227 +:100BD0001F000C6BA0088012E013801A69FFFF173A +:100BE000FD7BBEA9FD030091F35301A9BF3F03D5CF +:100BF000930180D27420805273F4BFF2740200B962 +:100C0000BF3F03D5000180D260F4BFF21F0000B9DE +:100C1000BF3F03D51F7804B925008052070080D25A +:100C2000E003052A060080D2040080D2030080522F +:100C30000200805241008052F0FEFF9760000035B4 +:100C4000BF3F03D5740200B9F35341A9FD7BC2A88D +:100C5000C0035FD6070080D2060080D20500805214 +:100C6000040080D20300805202008052610680524C +:100C700020008052E1FEFF17FD7BBDA9070080D256 +:100C8000060080D2FD03009105008052040080D24E +:100C900003008052020080524106805220008052A0 +:100CA000F30B00F9D5FEFF9760020035200080525B +:100CB000E7A30091E6B3009105008052040080D2C2 +:100CC000030080520200805261078052E02F00B979 +:100CD000CAFEFF97F303002AA0000035E02B40B9BD +:100CE0009FFDFF97F303002A20020034DAFFFF97ED +:100CF0000F000014D8FFFF97F303002A800100358E +:100D0000070080D2060080D205008052040080D205 +:100D1000030080520200805241068052200080521F +:100D2000B6FEFF97F303002A20FCFF34E003132AEA +:100D3000F30B40F9FD7BC3A8C0035FD6FD7BBFA9C1 +:100D4000070080D2060080D2FD030091050080528A +:100D5000040080D20300805202008052E1088052D9 +:100D600020008052A5FEFF9740000034D23100944D +:100D7000FD7BC1A8C0035FD6FD7BBEA923008052C6 +:100D8000070080D2FD030091E4730091060080D239 +:100D90000500805202008052A10B8052E01F00B972 +:100DA000E003032A95FEFF97FD7BC2A8C0035FD630 +:100DB000FD7BBFA9FD030091C6FDFF97010040B96F +:100DC000BF3F03D540E08152FD7BC1A8E001A07286 +:100DD0002000000AC0035FD6FD7BBEA9FD03009181 +:100DE000F30B00F9F3FFFF97F303002A000200342E +:100DF000E10000F0218C3991F3010836E20000F0A7 +:100E000042A43991E00000F0001C3A91733700943D +:100E1000607A1E7261010054F30B40F9E00000D0CB +:100E2000FD7BC2A800A42D91A3120014E10000F0E4 +:100E300021D43991E20000D042A82D91F2FFFF1792 +:100E4000013C0012E1020035007C101322028052A6 +:100E50001F1C007261000054007C08134220001126 +:100E60001F0C40F261000054007C0413421000117A +:100E70001F0440F261000054007C0213420800117C +:100E80001F0040F24214821A5F400071EC000054CF +:100E9000E10000F042240051210C3A9106000014B8 +:100EA00022008052EBFFFF17E10000F042440051A6 +:100EB00021E83991F30B40F9E00000F0FD7BC2A876 +:100EC00000643A9145370014FD7BBEA9FD030091F3 +:100ED000F35301A9BF3F03D5008082D22100805285 +:100EE00040FABFF22120A07205008052E77F8052B5 +:100EF000010000B9E100009021402991240041291E +:100F0000A5040011261040B9238441F8E220C01A3C +:100F1000E920C61A4200092A8020C01A680040B998 +:100F20008420C61A0000042A0201220A620000B9C5 +:100F3000620040B90000022A600000B9BF240071BD +:100F4000E1FDFF5466FDFF97134440B91440A152E0 +:100F500063FDFF977302142A134400B960FDFF97E5 +:100F6000134840B95EFDFF977302142A134800B975 +:100F70005BFDFF97134C40B959FDFF977302142A8C +:100F8000134C00B956FDFF97133440B954FDFF9739 +:100F90004104A0527302012A133400B950FDFF9797 +:100FA000132C40B94EFDFF9773021B32132C00B96E +:100FB0004BFDFF97133840B949FDFF977302173275 +:100FC000133800B946FDFF97133C40B944FDFF9725 +:100FD00073021732133C00B9F35341A9FD7BC2A839 +:100FE000C0035FD6FD7BBEA9FD030091F30B00F9A2 +:100FF0003BFDFF97002053B9BF3F03D51F0400718D +:10100000F3179F1A36FDFF97736E1C53005453B9A4 +:10101000BF3F03D51F040071410000547302183212 +:101020002FFDFF97002853B9BF3F03D51F04007160 +:10103000410000547302103229FDFF97002C53B970 +:10104000BF3F03D51F0400714100005473020832F2 +:10105000BF3F03D522FDFF97136C00B920FDFF971A +:10106000000053B9BF3F03D51F040071F3179F1A47 +:101070001BFDFF97000453B9BF3F03D51F04007148 +:10108000410000547302183215FDFF97000853B950 +:10109000BF3F03D51F04007141000054730210329A +:1010A000BF3F03D50EFDFF97137000B9F30B40F956 +:1010B000FD7BC2A8C0035FD6FD7BBAA900029ED209 +:1010C00060FCBFF2FD030091F35301A9F55B02A997 +:1010D000F76303A9180080D2F96B04A9FB2B00F970 +:1010E000B7000094F703002A00349ED260FCBFF2E0 +:1010F000B3000094FF02006BF603002AF322801A6B +:1011000000669ED260FCBFF2AD000094F503002A99 +:10111000007E9ED260FCBFF2A9000094BF02006B6B +:10112000F403002AA122801A000C80523F00136BA6 +:101130002120931AFF820171F792801A00029ED239 +:1011400021F47ED3E203172A213C009160FCBFF218 +:1011500021787C92FF6321CBF30300917A120091F6 +:10116000E10313AAA6000094FF02186B08060054BE +:10117000DF82017179120091000C8052170080D239 +:101180001A2682D2D692801A00349ED2E203162A00 +:10119000E10313AA60FCBFF299000094DF02176B11 +:1011A00068050054BFA200717812009100058052BA +:1011B000160080D2196082D2B592801A00669ED243 +:1011C000E203152AE10313AA60FCBFF28C0000942D +:1011D000BF02166BC80400549F8201717712009100 +:1011E000000C8052150080D2188082D29492801A0E +:1011F000007E9ED2E203142AE10313AA60FCBFF230 +:101200007F0000949F02156B28040054BF030091D7 +:10121000F35341A9F55B42A9F76343A9F96B44A9CC +:10122000FB2B40F9FD7BC6A8C0035FD65B7B78B87B +:10123000BF3F03D5797A78B8A9FCFF97180B0091C6 +:10124000390740913B6B20B8C8FFFF173B7B77B84D +:10125000BF3F03D5787A77B8A1FCFF97F70A0091D2 +:1012600018031A8B1B6B20B8CDFFFF171A7B76B8BB +:10127000BF3F03D5777A76B899FCFF97D60A0091DD +:10128000F702198BFA6A20B8D2FFFF17F97A75B8FE +:10129000BF3F03D5767A75B891FCFF97B50A0091E8 +:1012A000D602188BD96A20B8D7FFFF17FD7BBFA9DC +:1012B000FD03009181FFFF97FD7BC1A84AFFFF1747 +:1012C000BF3F03D5010082D26000805201FABFF215 +:1012D000200000B920E21BD50000801200E21BD5DF +:1012E00000008052C0035FD621E8885201CAA8726C +:1012F0001F00016B60030054E8010054616A8952C9 +:101300008169A8721F00016BC0020054212B885212 +:101310008189A8721F00016B4002005481EA895242 +:10132000E149A8721F00016BE0079F1A0004001139 +:10133000C0035FD661688A5221A9A9721F00016BA0 +:101340000001005401AB8A52A109AA721F00016B6F +:1013500080000054816A8852E129A972F2FFFF17C8 +:1013600020008052F3FFFF17FD7BBFA9E30300AA13 +:10137000E20301AAFD030091000040B9BF3F03D57D +:10138000DAFFFF97400000B91F08007141010054C7 +:10139000600040B9BF3F03D50008C05AD3FFFF9794 +:1013A0001F080071400000B9E0139F5AFD7BC1A8DF +:1013B000C0035FD600008052FDFFFF17FD7BBEA972 +:1013C000E40300AAFD030091E1730091E7FFFF979A +:1013D00020010035800440B9BF3F03D5E11F40B96B +:1013E0003F040071410000540008C05A0040005101 +:1013F000007C0253FD7BC2A8C0035FD6FD7BBEA963 +:10140000E50301AAE40300AAFD030091E603022A12 +:10141000E1730091D5FFFF9780010035811040B93D +:10142000BF3F03D5E21F40B95F04007121010054A2 +:101430002108C05AA10000B98350009122008052B7 +:101440005F00066BA3000054FD7BC2A8C0035FD6FB +:1014500042FFFF35F8FFFF17610040B9A51000916A +:10146000BF3F03D5E41F40B99F04007181000054C1 +:101470002108C05AA10000B902000014C4FFFF34C3 +:101480004204001163100091EEFFFF1702B09ED2DC +:1014900062FCBFF2410040B9BF3F03D5606A895288 +:1014A0002308C05A8069A8727F00006BC1010054F4 +:1014B000BF3F03D500B29ED24240029160FCBFF212 +:1014C000430017B8010040B92108C05A014400B8D0 +:1014D0001F0002EB81FFFF5400B29ED260FCBFF2FE +:1014E000C0035FD63F00006B80FFFF54000080D236 +:1014F000FCFFFF17FD7BBEA980BF9ED260FCBFF240 +:10150000FD030091F30B00F9130040B9BF3F03D571 +:10151000BF3F03D5F2FBFF97130402B9F0FBFF971F +:10152000000442B9BF3F03D5F30B40F9FD7BC2A8CD +:10153000C0035FD600809052E0FAA272C0035FD66B +:10154000FD7BBEA900C09ED260FCBFF2FD030091EE +:10155000F30B00F9130040B9BF3F03D5BF3F03D5DC +:10156000DFFBFF97130802B9DDFBFF97000842B9C4 +:10157000BF3F03D5F30B40F9FD7BC2A8C0035FD684 +:10158000FD7BBEA9FD0300919F0400944000003440 +:10159000C92F0094B7FBFF97BF3F03D5D0FBFF9740 +:1015A000E1E18152E1E1BF72010800B9BF3F03D51B +:1015B000004284D220FABFF21F0000F941FFFF97DA +:1015C0003BFFFF97E263009101008052C00380520D +:1015D000BA450094E0FDFF35D367009413050094ED +:1015E000FEFDFF97DFFBFF9701010090211C0D918D +:1015F000E2630091A0098052BE450094E103002AF5 +:10160000A0000034E00000B000543791733500941E +:10161000E0FFFF17E263009101008052A0038052B7 +:10162000A645009460FBFF35E26300910100805203 +:10163000400C8052A1450094C0FAFF3569FDFF9728 +:101640008EFDFF97FD7BC2A8C0035FD6FD7BBFA9BF +:10165000FD0300911DFEFF97FD7BC1A82000805275 +:10166000C6FDFF17FD7BB8A9E10000F021C0149171 +:10167000FD030091F35301A9F30300AAF55B02A94E +:10168000F76303A9F96B04A9FB7305A9586A40F92C +:10169000E00318AA5E290094530300B4632200D12A +:1016A000F703002A200080D2627A60B8F403002A8F +:1016B00000040091617860B85F00016B60FFFF5427 +:1016C000570CF836E10000B0E00000B021F82A9194 +:1016D00000AC33914135009420008052600200B983 +:1016E0009F02006BE000005400018052600600B9C8 +:1016F0009F0A00716000005480008052600A00B9A7 +:10170000F35341A9F55B42A9F76343A9F96B44A9D7 +:10171000FB7345A9FD7BC8A8C0035FD6BF02146B4D +:10172000AB010054E203142AE10000B0F35341A9D5 +:1017300021F82A91F55B42A9E00000B0F76343A9C4 +:1017400000443491F96B44A9FB7345A9FD7BC8A8FB +:1017500022350014E00318AA2D290094FC03002A66 +:101760004004F837E103002AE2E30191406A40F9BE +:10177000E03700F9200980527A4500946005003472 +:10178000E2E30191E1031C2A600E8052754500944A +:1017900040050034E2E30191E1031C2A6009805214 +:1017A00070450094E0040034E03740F9E1031C2A5E +:1017B000E2031AAA030080D28F280094FC0300AA37 +:1017C000400100B4E1031BAA7B2F00940003003406 +:1017D000E10000B0E00000B0E2031CAA2140299122 +:1017E00000143591FD340094D6060011E103172A48 +:1017F000E303162AE20319AAE00318AA040080D220 +:10180000BC290094E10300AAA0F8FFB5B5F7FF35A5 +:10181000E10000B021F82A91B6020035E00000B0E6 +:1018200000DC3591ACFFFF172000805260DA35B83C +:10183000B5060011EDFFFF1700018052FCFFFF17F6 +:1018400080008052FAFFFF17F90000B0FA0000B0E4 +:10185000FB0000D0398735915AE734917BDF169130 +:101860001600805215008052E1FFFF17F35341A983 +:10187000E00000B0F55B42A900883691F76343A908 +:10188000F96B44A9FB7345A9FD7BC8A8D3340014A8 +:1018900000E03BD5C0035FD6DF3F03D520E03BD55A +:1018A000404E01B9C0035FD6FD7BBBA9FD0300918B +:1018B000F55B02A9F50300AA600080520000024B0C +:1018C000360080D2F35301A9F30301AA000C000BE8 +:1018D00000300011F76303A9F703022AD622C09A49 +:1018E000F80303AAF96B04A9D90600D15A04001120 +:1018F000F30000B5F35341A9F55B42A9F76343A98F +:10190000F96B44A9FD7BC5A8C0035FD6FF02007137 +:101910003403158A60C256FAA3000054940000B53F +:10192000B502168B730216CBF2FFFF17000340B906 +:10193000D40214CB9F0213EBE30318AA0004001196 +:10194000000300B99492939AE00315AAE2031A2ABD +:10195000E10314AA730214CBB502148BD3FFFF97D3 +:10196000E4FFFF17FD7BBEA9FD030091F30B00F917 +:1019700053BA40F941BA40F92104409141BA00F903 +:1019800041BA40F943B240F942B640F9210003CBD5 +:101990003F0002EB0901005443BA40F9E00000D0D7 +:1019A00041B240F900D0079142B640F9610001CB45 +:1019B00043300094E00313AA020082D20100805257 +:1019C000512F0094E00313AAF30B40F9FD7BC2A84A +:1019D000C0035FD6FD7BBDA9430080526300014B6D +:1019E000FD030091F35301A9F40300AA630C030B58 +:1019F000F55B02A9160040F9C00600121F04007131 +:101A0000C0000054E00000F0E20316AAE10314AAAB +:101A100000A41E912A300094F503012A73300011AE +:101A2000D1FFFF97040080D28320D39A630016AAC7 +:101A3000610440B2BF0A00716310819A037824F8F0 +:101A4000840400919F0008F101FFFF54020440B29A +:101A5000F55B42A9820200F9F35341A9FD7BC3A8BB +:101A6000C0035FD666008052C600034BFD7BBAA957 +:101A7000C60C060BC6300011FD030091F76303A9E5 +:101A8000380080D21823C69A0624C69AF70300AA03 +:101A9000C6207DD3F35301A9F30302AAF55B02A983 +:101AA000F50305AA9600068BF96B04A9190700D166 +:101AB0007A040011FB7305A9FB0301AAFC03032AA6 +:101AC000130100B5F35341A9F55B42A9F76343A99C +:101AD000F96B44A9FB7345A9FD7BC6A8C0035FD67B +:101AE0009F0300713403178A60C258FA83010054BF +:101AF000740100B5600315AA9F0F007141000054E6 +:101B0000000440B2F702188B7B03188B730218CBCA +:101B1000C00200F9D6220091EAFFFF17C00240F987 +:101B200000040072610200548FFFFF97000440B26E +:101B3000C00200F9140314CBE1031BAA9F0213EBAC +:101B4000E00317AAC40240F99492939AE50315AAF8 +:101B5000E3031A2AE20314AAF702148B7B03148B03 +:101B6000730214CB848C7492BFFFFF97EAFFFF17B8 +:101B70001F0C007100FEFF54E1031C2AE00316AAAB +:101B800095FFFF97ECFFFF17E60300AA434238D505 +:101B9000630C02537F080071A100005400113CD572 +:101BA0001F005EF2E3179F1A63040011000100900A +:101BB000040080D2009443F9050840F9850400B57B +:101BC000020C40F9420400B50000C2D29F0000EBB5 +:101BD000880400540080C0D29F0000EB88040054A9 +:101BE0000020C0D29F0000EB880400540002C0D245 +:101BF0009F0000EB880400542000C0D29F0000EB3F +:101C0000E2979F9A840480D2000480D28480809AD4 +:101C10000510B0D27F040071A08002AAA54002AADC +:101C2000A510809A030880D2630004CB00A086D25E +:101C3000630005AA600000AA460000B4C20000F9D3 +:101C4000410000B4240000F9C0035FD6020442F84A +:101C5000A500028B9F0005EB8420859AD7FFFF1714 +:101C6000040680D2A20080D2EAFFFF17840580D24A +:101C7000820080D2E7FFFF17440580D2620080D245 +:101C8000E4FFFF17040580D2420080D2E1FFFF1776 +:101C9000FD7BBEA9000080D2FD030091E1630091AD +:101CA000FF1700B9B9FFFF97E00F40F9040080D299 +:101CB000060100901F9800F1E5879F1AC09443F930 +:101CC0000000048B010840F9010100B5030C40F944 +:101CD000C30000B5E11780B9000088D2FD7BC2A81F +:101CE0000034018BC0035FD6000040F9E35300913C +:101CF000E203052A84800091ECFEFF97F0FFFF17B6 +:101D0000FD7BBCA9FD030091F35301A9F51300F974 +:101D100041BA40F9610000B440B240F9800000B51A +:101D2000E00000F0002C0591652F0094130080D294 +:101D300014010090358080D20BFFFF97899643F9FC +:101D40002701138BE02041A9000100AAA00000B5E3 +:101D5000F35341A9F51340F9FD7BC4A8C0035FD636 +:101D6000E1E30091000080D288FFFF97E01F40F977 +:101D7000050115AAE18840A91F9800F1206973F8B0 +:101D8000E3879F1A44B240F97382009136FFFF97B0 +:101D9000EBFFFF17FD7BBEA9FD030091F35301A9E3 +:101DA00053B240F954B640F953BA00F9D5FFFF9742 +:101DB00042BA40F941B240F943B640F92100038BE1 +:101DC000210002CB41B600F941BA40F941B200F915 +:101DD000CCFFFF9741B240F941BE00F953B200F980 +:101DE00054B600F9F35341A9FD7BC2A8C0035FD6E6 +:101DF000FD7BBFA9FD03009140BA40F9400000B54A +:101E0000E5FFFF97474238D5010080D2E70C025327 +:101E1000000080D248B240F95CFFFF979F3F03D596 +:101E2000018080D2FF0400718181A8F2E11FC0F21D +:101E300061020054082018D5402018D501A218D5F9 +:101E4000DF3F03D5404238D5000C02531F04007118 +:101E500001030054001038D500000032414238D54B +:101E6000210C02533F04007101030054001018D5E7 +:101E7000DF3F03D5FD7BC1A8C0035FD6FF0800711B +:101E8000A100005408201CD540201CD501A21CD55F +:101E9000ECFFFF17FF0C0071A100005408201ED5B5 +:101EA00040201ED501A21ED5E6FFFF17822D00940B +:101EB0001F0800716100005400103CD5E7FFFF17B8 +:101EC00000103ED5E5FFFF173F0800716100005488 +:101ED00000101CD5E7FFFF1700101ED5E5FFFF1708 +:101EE000FD7BBFA9FD030091DF000094FD7BC1A82D +:101EF000FE000014EE000014E1000014FD7BBFA9F9 +:101F0000FD030091404238D5000C02531F040071BC +:101F1000E1020054001038D580000037F1FFFF9730 +:101F2000F4000094B3FFFF9740BA40F9400000B5B9 +:101F300099FFFF97404238D5000C02531F040071EF +:101F400021020054001038D500001E32414238D51D +:101F5000210C02533F04007121020054001018D5D7 +:101F6000DF3F03D5FD7BC1A8C0035FD61F0800710A +:101F70006100005400103CD5E8FFFF1700103ED56B +:101F8000E6FFFF171F0800716100005400103CD5E8 +:101F9000EEFFFF1700103ED5ECFFFF173F08007162 +:101FA0006100005400101CD5EEFFFF1700101ED575 +:101FB000ECFFFF17404238D5000C02531F0400719C +:101FC00021020054001038D560031036FD7BBFA9F4 +:101FD00000787F9200F87D92FD030091414238D550 +:101FE000210C02533F040071A1010054001018D5C8 +:101FF000DF3F03D59A0000949D000094FD7BC1A8AB +:10200000BC0000141F0800716100005400103CD592 +:10201000EEFFFF1700103ED5ECFFFF173F080071E1 +:102020006100005400101CD5F2FFFF1700101ED5F0 +:10203000F0FFFF17C0035FD6404238D5000C0253B3 +:102040001F04007181000054001038D500080253AD +:10205000C0035FD61F0800716100005400103CD51A +:10206000FBFFFF1700103ED5F9FFFF17404238D5A0 +:10207000000C02531F04007161010054001038D598 +:10208000007C409200F87392414238D5210C0253F3 +:102090003F04007141010054001018D5DF3F03D503 +:1020A000C0035FD61F0800716100005400103CD5CA +:1020B000F4FFFF1700103ED5F2FFFF173F08007135 +:1020C0006100005400101CD5F5FFFF1700101ED54D +:1020D000F3FFFF17404238D5000C02531F04007174 +:1020E00081000054001038D500000012C0035FD6F4 +:1020F0001F0800716100005400103CD5FBFFFF1762 +:1021000000103ED5F9FFFF17FD7BBFA9FD0300912D +:1021100073000094FD7BC1A857000014FD7BBFA98C +:10212000FD030091F9FFFF97404238D5000C0253A0 +:102130001F04007161010054001038D500001432F2 +:10214000414238D5210C02533F0400716101005413 +:10215000001018D5DF3F03D5FD7BC1A8C0035FD6B3 +:102160001F0800716100005400103CD5F4FFFF17F8 +:1021700000103ED5F2FFFF173F08007161000054C8 +:1021800000101CD5F4FFFF1700101ED5F2FFFF173B +:102190000CF87FD30C001AD5DF3F03D5060039D5E4 +:1021A000C20840D3900000B4C35C43D3C4DC60D306 +:1021B00003000014C33043D3C46C4DD342100091CC +:1021C0006510C05AE60303AAC720C59A890107AA69 +:1021D0008720C29A290107AA61000036497608D5EE +:1021E00002000014497E08D5C60400F1EAFEFF543F +:1021F000840400F18AFEFF54C0035FD6E10300AA05 +:102200009F3F03D52A0039D54B6958D36B0200B4E0 +:10221000EF031EAA500738D5105E54D3000080D2B9 +:102220000C04008B4C25CC9A8C0940929F0900F13C +:102230004B000054D7FFFF97000400917F0100EB93 +:102240000CFFFF54000080D200001AD59F3F03D539 +:10225000DF3F03D5FE030FAAC0035FD6000080D284 +:10226000E7FFFF17200080D2E5FFFF17000080D2B4 +:10227000C0035FD6000080D2C0035FD623003BD5E9 +:10228000634C50D3820080D24220C39A430400D1D1 +:102290000000238A207E0BD50000028B1F0001EB7B +:1022A000A3FFFF549F3F03D5C0035FD623003BD558 +:1022B000634C50D3820080D24220C39A430400D1A1 +:1022C0000000238A207608D50000028B1F0001EB56 +:1022D000A3FFFF549F3F03D5C0035FD61F7108D5EE +:1022E000DF3F03D5C0035FD6000080D2C0035FD6B6 +:1022F000494238D53F2100F16C000054C000005421 +:102300002B0100541F870ED59F3F03D5DF3F03D518 +:10231000080000141F870CD59F3F03D5DF3F03D56E +:10232000040000141F8708D59F3F03D5DF3F03D566 +:10233000C0035FD600000000464238D5DF2000F120 +:10234000EC000054400000542B000054BF0400F186 +:10235000400000542500009480001FD65F111ED558 +:10236000E67F86D246111CD57FE01CD5A602005818 +:1023700006101CD5E603009106411ED506C03ED5C9 +:1023800006C01CD5BF0000F1E0000054E601005873 +:1023900006111ED5E601005806401ED524401ED564 +:1023A000E0039FD6A601005806111ED5A6010058CD +:1023B00006401ED524401ED5E0039FD60000000035 +:1023C0003008C53000000000B1050000000000002A +:1023D000C903000000000000B1010000000000007F +:1023E000DA01000000000000C0035FD6000000001A +:1023F000000300581FEC7C92E0030091DD0500947F +:102400001F000091F20300AADE050094000080D2B4 +:102410005CFCFF97910100941F0000F11210929A4A +:10242000E10300911F0000F10010819A1F0000914C +:1024300040010058610100581F8400F81F0001EBA3 +:10244000C3FFFF54E00312AA413A40F90A01001405 +:1024500000F0E3FF000000000000F03F000000007B +:102460009806F03F00000000FD7BBDA943008052AC +:10247000FD030091410240F9223C40F9E20B00F9D2 +:10248000224040F9E21300F9228448A9E20F00F942 +:10249000E11700F9E2830091E14300914F060094B7 +:1024A000FD7BC3A8C0035FD6414238D53F2000F171 +:1024B0006C000054400200542B020054690080520A +:1024C000090000B9090440B92A1100128A01003438 +:1024D0000B00029109008012694500B8694500B8F7 +:1024E0004A050051CAFFFF35C10300586000805201 +:1024F000200000B900108052200400B9C0035FD64C +:10250000424238D55F2000F16C0000544001005475 +:102510002B01005409008012098000B92900805263 +:10252000090001B9E93C8052290000B90910805224 +:10253000290400B9C0035FD6090090520920A07297 +:1025400009000FB9C0035FD67F2003D5092040B929 +:10255000092400B92925001289FFFF35C0035FD681 +:102560000020FCFF00000000FD7BBFA9FD030091DF +:10257000000C40F900003FD6FD7BBFA9010084D2CA +:10258000FD030091419600F95F9A00F9C62A009474 +:1025900080000035FD7BC1A8200080523A40001425 +:1025A000FD7BC1A8C0035FD6400400B4FD7BBEA97B +:1025B000FD030091F30B00F9F30300AA1723009425 +:1025C0000001F836A7260094E10300AAF30B40F9B6 +:1025D000E00000D0FD7BC2A800D815917F31001427 +:1025E000E00313AA01008052C8060094E000003501 +:1025F000E00000D00010169101008052F30B40F96A +:10260000FD7BC2A875310014E00313AA97FFFF9762 +:10261000E103002A80000034E00000D000A41691FD +:10262000F7FFFF17F30B40F9FD7BC2A8C0035FD68D +:10263000C0035FD60001009001E00A91025C41F9FD +:1026400040688AD220ABA9F25F0000EB6100005421 +:10265000200440F9C0035FD600008092FEFFFF1700 +:10266000000080D2C0035FD6C0035FD6000048914F +:10267000C0035FD6A0028012C0035FD6A002801202 +:10268000C0035FD6450040B9E4A4805224C3AA72B7 +:10269000BF00046B61000054E10302AAF8FFFF17BA +:1026A000FD7BBFA9030880D2FD030091F2FFFF97D5 +:1026B0001F000071A10280120000811AFD7BC1A8D9 +:1026C000C0035FD6FD7BBCA9FD030091F35301A9B4 +:1026D000F30302AAF40300AAE0078092F55B02A9C3 +:1026E000F60304AAF71B00F9F70301AA010880D238 +:1026F000DFFFFF97640640F9F50300AAE30300AA91 +:10270000601280B9E10316AA02FC0091E00300CB3D +:102710004200008AE00313AA80003FD61FFC00712C +:1027200089050054A10240B900BA8152C0BFBD72F0 +:102730003F00006B41010054E30315AAE20316AA0F +:10274000E10313AAE00314AAF35341A9F55B42A9DC +:10275000F71B40F9FD7BC4A8DC010014E20315AAB5 +:10276000E10317AAE00314AAC7FFFF97F503002AA5 +:1027700020030035651240B9830A40F9A1040051D5 +:10278000822E40B9A07C4093040400D1E00300CB2A +:102790008400028B630002CB823240B981C021CB1E +:1027A0002100008A4200048B6300018B640640F91B +:1027B000420001CB4200008AC102018BE00313AA50 +:1027C00080003FD6813240B93F00006B4900005481 +:1027D00095008012E003152AF35341A9F55B42A945 +:1027E000F71B40F9FD7BC4A8C0035FD6400240F947 +:1027F000800000B5E00000F000C02091400200F928 +:10280000C0035FD6FD7BBFA9FD0300915BFFFF976F +:1028100080000035410640F9210071B2410600F9FF +:10282000FD7BC1A8C0035FD6400640F9C0007836E2 +:10283000400640F9000076B2400600F900008052E0 +:10284000C0035FD6FD7BBFA9FD0300914BFFFF973F +:10285000A0000035400640F9000076B2400600F9BD +:1028600000008052FD7BC1A8C0035FD600008052EB +:10287000C0035FD6FD7BB3A9820280D2C10000F005 +:10288000FD030091F55B02A9F6E3019121E00591BA +:10289000E00316AAF35301A9F76303A9F96B04A98E +:1028A000FB7305A9B42B0094010AA0D2D0FFFF97B7 +:1028B00000F4A7D2340C0094410640F9210077B20D +:1028C000410600F9400640F980005037D7FFFF97D6 +:1028D00040000034F82A00947AFAFF97F7DD975207 +:1028E00011630094B7D5BB723EF6FF97150100B097 +:1028F000020880D201008052E0430291822B0094B2 +:10290000E00316AAF7BB00B957FBFF97B5A22891C1 +:10291000000100B000802A91130015CBE0F301B252 +:10292000605595F2FA00009073FE43935A67389110 +:10293000190080D2FB000090737E009B0003805240 +:102940007356209BD87A79B81F03176BC0050054C3 +:10295000F40315AA7C07389126000014800A40B9B8 +:102960001F00186B41040054F40300B4E003182A5C +:102970003CFFFF97E10300AA400000B5810240F947 +:10298000E0031CAA95300094800A40B9E1A30191AC +:10299000E06B00B9E0430291FF3B00F9820A40F985 +:1029A00040003FD640020035E1A30191E04302918F +:1029B000AFFFFF97C0010035E0430291F8BB00B9BB +:1029C00023FBFF97E06342391F640071400200540B +:1029D0001300009073A2159124FFFF97E04302912A +:1029E00060023FD6E0031AAAB30B009494620091F0 +:1029F0009F0213EB41FBFF54390700913F1700F191 +:102A000021FAFF54E000009000E03891AA0B0094F6 +:102A1000B1FFFF17E05B40F9130000B073A22091F3 +:102A2000E2FEFF97EDFFFF17FD7BBFA90140985223 +:102A30002100A072FD030091411200B94F51009492 +:102A4000210080D2411E00F9E00000B0005838910A +:102A5000FD7BC1A8980B0014000080D2C0035FD694 +:102A6000FD7BBCA9FD030091F35301A9F40303AA64 +:102A7000E3F30091F55B02A9F503022AE20301AA40 +:102A8000011440B9000040F9DB230094200200B497 +:102A9000F30300AA16008052DF02156B8B0000546E +:102AA000800200F9000080520B00001401008052E7 +:102AB000D72A0094E13F80B900040091020013CBB3 +:102AC0005F0001EB0A010054D6060011F3FFFF1767 +:102AD000A0028012F35341A9F55B42A9FD7BC4A873 +:102AE000C0035FD6C0008012FBFFFF17FD7BBDA9AE +:102AF000FD030091E3A30091F35301A9F30300AA9E +:102B0000D8FFFF97A0010035611240B9600240F97B +:102B1000F41740F9E20314AA26230094E000F836E3 +:102B2000E203002AE10314AAE00000D0002415917A +:102B30002A300094A0028012F35341A9FD7BC3A860 +:102B4000C0035FD6FD7BB8A9FD030091F35301A933 +:102B5000F30302AAF403032AF55B02A9F76303A9AE +:102B6000F80300AAF70304AAF96B04A9F90301AA60 +:102B7000E103032A550040F9E2A30191E00315AAFD +:102B8000B106009480020034E00A40F9200200B54A +:102B9000020080D2130D8012E103142AE00315AA6B +:102BA000C2220094E10300AAE00000B000342C919E +:102BB0000A300094E003132AF35341A9F55B42A9BC +:102BC000F76343A9F96B44A9FD7BC8A8C0035FD68E +:102BD000E03700F9E2630191E103142AE00315AA4A +:102BE000C706009440010034E2630191E103142A16 +:102BF000E00315AAB0060094E0020035610640F932 +:102C0000E05B40B90000010BE05B00B9E2730191A9 +:102C1000E103142AE00315AACB060094E002003574 +:102C2000F35F40B9F3020035E103142AE00315AA6B +:102C3000020080D29D220094E1000090E20300AAED +:102C4000213C2B91E00000B000EC2C91E32F00948C +:102C5000D9FFFF17E3830191E2C30191E103142A35 +:102C6000E00315AA8006009460080034E00000B07C +:102C700000842D91100B009433008012CEFFFF17BB +:102C8000607E4093E03300F9001340B9E15B40B946 +:102C900003040051E003004B2200030A2100000A54 +:102CA000F63740F95A7C40936202020B21C3218B14 +:102CB000040740F94200030B4200000AD6FE0091CF +:102CC000D6E67A92E00318AAE30316AA427C409360 +:102CD00080003FD6E13340F91F0001EB03050054AB +:102CE000D6021A8B020080D2E103142AE00315AA4F +:102CF0006E220094E10300AAE00000B000F42D91E0 +:102D0000B62F0094E43340F9E30316AA426A40F96F +:102D1000E103142AE00315AADC0600944003003402 +:102D2000E00000B000902E91E30A0094E20346A96F +:102D3000E10316AA902A0094B70100B4E03740F9E5 +:102D4000E00A00F9E03340F9E03200B9E2E3019132 +:102D5000E103142AE00315AA3F0600941F00007146 +:102D6000E03F40F900009FDAE00E00F913008052C6 +:102D700091FFFF17F63B40F9DBFFFF17930080122E +:102D80008DFFFF17130080128BFFFF17FD7BB8A983 +:102D9000FD030091F35301A9F30300AAF55B02A917 +:102DA000F60301AAF50303AAF71B00F9E10000D01E +:102DB000F70302AA21141591143040B90200805281 +:102DC000000840F99402008BE00303AAF42B00F9F9 +:102DD00047FFFF972002F836426A40F9220300B409 +:102DE000406A40F9020440B9E00314AA741200F9E1 +:102DF0004208C05A416A40F95F2A0094F55B42A933 +:102E000001008452601240F9F35341A9F71B40F9C5 +:102E1000FD7BC8A8BD040014E303002AE40301916C +:102E2000E20315AAE10317AAE00316AA46FFFF97DB +:102E30008000F837E02B40F9601200F9F0FFFF172F +:102E4000F35341A9F55B42A9F71B40F9FD7BC8A8E4 +:102E5000C0035FD6C0035FD6FD7BBEA9217C021BE9 +:102E6000000880D2FD030091F30B00F9337C4093FE +:102E700061FE009121E47A924D0D0094A00100B50D +:102E8000E10313AAE0000090008C3991532F0094C5 +:102E9000E000009000283A91502F0094E10313AA1B +:102EA000000080D2F30B40F9FD7BC2A8F0FDFF17B4 +:102EB000F30B40F9FD7BC2A8C0035FD6000080522F +:102EC000C0035FD6C0035FD6FF8304D1FD7B01A999 +:102ED000FD430091F35302A9F30300AAF55B03A994 +:102EE000F76304A9F70301AAF80302AAF96B05A97D +:102EF000FB7306A9600440B90008C05A000C001119 +:102F000000747E92D4FFFF97E21240B9010C009149 +:102F100021F47E92E16B00F941040051E203024B7F +:102F20002100000B2100020A22008052357C4093D0 +:102F3000E00315AAC9FFFF97E40640F9F40300AACD +:102F4000E30300AAE20315AAE10318AAE00317AA03 +:102F500080003FD6F46700F9801900B4D8FFFF97CE +:102F60001F1C007261190054E06740F9D6FFFF97FB +:102F7000E06700F9BD090094E0DF00B9E103002A31 +:102F80006001F836B5028012E003152AFD7B41A9E5 +:102F9000F35342A9F55B43A9F76344A9F96B45A92B +:102FA000FB7346A9FF830491C0035FD6E06740F935 +:102FB000020080D2BD210094E10300AAE00000D00D +:102FC00000201891052F0094E1DF40B9E06740F937 +:102FD00004090094F403002A6000003415008012F4 +:102FE000EAFFFF17E00000B000902E91320A009433 +:102FF000E06740F9E10000D021C01891042300945B +:10300000E0DB00B900FCFF37E023039102008052AF +:10301000E10000B0213C3A91B5FEFF97F603002A8B +:103020002001F836E023039102008052E10000B055 +:1030300021E01891AEFEFF97F603002A00FDFF374E +:1030400034008052E40313AAE303162AE223039117 +:10305000E10318AAE00317AABBFEFF97F503002AB5 +:1030600040F9FF35E06740F962220091E103162A3A +:1030700062050094C00100342002805260220039B1 +:10308000E3230391E20318AAE10317AAE00313AABA +:103090003FFFFF972001F836612240393F4400711D +:1030A000C0000054F503002AB8FFFF176022403922 +:1030B0001F44007160FEFF54FA0000B0FC0000B035 +:1030C0005AE318919C9B2191FB0000B060DB1991A1 +:1030D000E03F00F9E203142AE1031AAAE023039176 +:1030E000FFFF023982FEFF97F903002AA00BF83791 +:1030F0001F00166B6100005494060011F6FFFF17C5 +:10310000E303002AE4830391E2230391E10318AA75 +:10311000E00317AAFF7B00F98BFEFF97FB03002A51 +:103120004001F836E303002AE203142AC10000F04C +:10313000E00000B021042C9100081991F5031B2A2E +:10314000A62E009491FFFF17E06740F9E2FF02917D +:10315000E103192A29050094E0FF42391F44007158 +:1031600001010054E3230391E20318AAE10317AA23 +:10317000E083039106FFFF97E08340F9601200F9B6 +:10318000600E40F91F0400B1A1000054E07F40F937 +:103190001F0400B140000054600E00F9791240F99C +:1031A000D9FAFFB4E3030391E203142AE1031AAA54 +:1031B000E02303912BFEFF9700FAFF37E203142A66 +:1031C000E1031AAAE023039149FEFF97FB03002ABB +:1031D000E103002AE8034CA9E2031CAAE9174FA95E +:1031E000030080D2E41341B9E54B00F9E49F00B934 +:1031F000E9230AA900220094E60300AAE1031B2A9E +:10320000E23F40F9030080D2E06740F9E64700F969 +:10321000F9210094E70300AAE06740F9E1031B2AC3 +:10322000030080D2E20000B042E41991E74300F9C4 +:10323000F1210094E00300F9E71B48A9E103142AF7 +:10324000E9234AA9E00319AAE49F40B9E54B40F9F4 +:10325000E30309AAE20308AA42030094A7FFFF17A9 +:10326000600E40F9000400D11F0C00B16900005449 +:10327000600A40F9600E00F9603640B900001F3264 +:10328000603600B941FFFF17950080123FFFFF171E +:10329000150080523DFFFF17FD7BBBA9FD03009188 +:1032A000F35301A9F40301AAF30300AAE00302AA5D +:1032B000F51300F9F50303AA11480094042840B956 +:1032C000E2E30091011040F9E14B00B901000090E8 +:1032D00021500C91030080D2A422C49AE01F00F96F +:1032E000E00313AAE12300F9E10314AAF6FCFF9717 +:1032F000A0000034E0000090002833916E09009493 +:1033000000008012F35341A9F51340F9FD7BC5A8D5 +:10331000C0035FD6FD7BBEA9FD030091F30B00F94E +:10332000130040F9602A40B94224C09A2124C09A6F +:10333000E00313AAC3330094612A40B9F30B40F9A8 +:103340000020C19AFD7BC2A8C0035FD64000805216 +:10335000C0035FD620008052C0035FD6E00301AAFD +:10336000C0035FD6FEFFFF17FFFFFF1700D44139F0 +:10337000001443D31F1C007100109F1AC0035FD6B6 +:10338000FBFFFF17FD7BB5A9FD030091F35301A9D6 +:10339000F55B02A9F60300AAF50301AAF76303A9E6 +:1033A000F70302AAF803032AF96B04A9F90304AA94 +:1033B000200040B91F040071600300540008005150 +:1033C0001F0400714903005453028012E00000B052 +:1033D00000F81991012E0094F407A0B0800240F982 +:1033E000A00200B5A00240B91F040071E00A005419 +:1033F000000800511F040071280900543A0080524F +:10340000E0031A2ADC460094F303002A200A003461 +:10341000E103002AE00000B000841A91EF2D00942F +:103420004300001413008052ECFFFF17330080525A +:10343000EAFFFF17B2470094000440B97F02006B17 +:1034400021FDFF54800240F9A10240B9C0FFFF975F +:103450001F080071E00400541F0C0071E0090054C3 +:103460001F040071610C0054800240F9E10319AAA5 +:1034700033008052BDFFFF97F90300AA9A0240F97A +:10348000E0031AAA9E470094E2430191E103132A44 +:10349000B82E009480000035E0B342391F880271D5 +:1034A000A0000054730600117F260071A1FEFF5496 +:1034B000F303182AE0031AAA91470094E24301910A +:1034C000E103132AAB2E009420080034E00000B082 +:1034D00000001D91F8080094820240F9E30319AA44 +:1034E000E10315AAE00316AA6CFFFF97E00700347A +:1034F000800240F982470094E20300AAE40317AA7D +:10350000E10315AAE00316AA23008052FB000094F1 +:10351000C00600343300801205000014E00000B043 +:1035200000F81991AD2D009453028012E003132A84 +:10353000F35341A9F55B42A9F76343A9F96B44A989 +:10354000FD7BCBA8C0035FD61A008052ADFFFF17EA +:10355000E0031A2A55470094800200F9E00000B504 +:10356000E1031A2A42028012E00000B0002C1B91F5 +:103570009A2D0094EDFFFF1720440094F303002AD6 +:1035800020F6FF34E103002A9F0200F9E00000B0BA +:1035900000E41B91A2FFFF17800240F979FFFF971B +:1035A000F303002A800240F955470094E103132AEF +:1035B0006F320094F303002A80F5FF34E00000B07E +:1035C00000781C91BC080094D9FFFF17E32B40F949 +:1035D000E2031AAAE10315AAE00316AA2303038B48 +:1035E0002EFFFF97A0F7FF3513008052D0FFFF1783 +:1035F000E00000B0B302801200581D91AE080094A4 +:10360000CBFFFF17FD7BBEA9FD030091F35301A97A +:10361000F40300AAF30301AA200040B94EFFFF976C +:10362000E303002AE10313AAE00314AAF35341A918 +:10363000044080D2FD7BC2A8E20000B042C41D91CC +:1036400051FFFF17FD7BBCA9FD030091F35301A9B6 +:10365000F55B02A9FF3F00B9400500B4F503012A5C +:10366000E10000B021A81591F40300AA682100949C +:10367000E103002AE000F83613008012E003132A69 +:10368000F35341A9F55B42A9FD7BC4A8C0035FD6F3 +:10369000E2F30091E00314AAF60000B0441F009486 +:1036A000D6DA1991F303002A93FEFF37E03F40B9C1 +:1036B0001F0000712DFEFF541F040071E000005434 +:1036C000E103132AE2F30091E00314AA381F0094E7 +:1036D000F303002AF5FFFF17E20316AAE103132AFA +:1036E000E00314AA030080D2C3200094A0FEFFB41C +:1036F000440100941F00156B41FEFF54E0FFFF17CB +:1037000013018012DEFFFF17FD7BBCA9FD030091B2 +:10371000F35301A9F40301AA01008052F71B00F939 +:10372000F707A0B0F3220091F55B02A9F50300AA08 +:10373000F60302AAE00313AA023080D2F227009413 +:10374000602080D2432080D20006A0F2E00600F97B +:1037500060C20091600600F960420391600A00F9BE +:10376000202080D20303A0F2000BA0F2606A00F9CF +:10377000A078805260E200B960220191600E00F9E9 +:1037800060E20191601200F9202080D2631A00F9F2 +:10379000000BA0F2632600F92000C0F2603E00F9A1 +:1037A000756E00F9768200F9A00038D5003C409291 +:1037B000604A00F920798052608A00B960820191E4 +:1037C000601600F9E00313AA633200F9744200F9AD +:1037D000F35341A9F55B42A9F71B40F9FD7BC4A84F +:1037E000C0035FD6C9FFFF17FD7BBDA9FD03009194 +:1037F000E2A30091F35301A9F30300AAF403012A01 +:1038000095030094A0000034E2A30091E103142A80 +:10381000E00313AA8C030094F35341A9E01740F985 +:10382000FD7BC3A8C0035FD6FD7BBDA941038052C9 +:10383000FD030091F35301A9F40300AAF51300F965 +:10384000151040F9E00315AA7FFFFF970003F83732 +:10385000E103002AE00315AAE4FFFF97F30300AA9F +:1038600021028052E00315AA77FFFF97E103002AA7 +:103870002002F837E00315AADCFFFF97E10300AA56 +:10388000E00313AA020080D2940E40F9D6FFFF97FE +:10389000F30300AA0078805220421BD5C6F9FF9797 +:1038A000E00313AA010080D280023FD6130080D229 +:1038B000ECFFFF170104A0D2F2FFFF17FD7BBEA9AA +:1038C000E50301AAE10303AAFD030091000040F90A +:1038D000E4630091E30302AAE20305AAE86200940C +:1038E000017C40931F000071E00F40F9FD7BC2A8EE +:1038F0002010809AC0035FD6FD7BBAA9FD0300911A +:10390000F71B00F9F707A0B0F55B02A9F50300AAC1 +:10391000E00302AAE28A41B9F60301AAF35301A91E +:10392000F40304AA62030035E103032A2A61009428 +:10393000F303002AA0020034E203002AC10000F0D1 +:10394000E00000B021A02991001C1791A32C009445 +:103950001301F836C10000F0E00000B0E303132AC1 +:10396000E20314AA217C2B91008817919B2C0094D0 +:10397000E003132AF35341A9F55B42A9F71B40F971 +:10398000FD7BC6A8C0035FD620008052E08A01B943 +:103990000000009000F02291F48304A900088052F6 +:1039A000E2230191E10316AA040080D2030080D231 +:1039B000E05B00B9E00315AA43FBFF97F303002A7D +:1039C000E4FFFF17FD7BBEA9FD030091F30B00F997 +:1039D000F30302AA000040F900C840F97D4A0094B0 +:1039E0001F00007160029F9AF30B40F9FD7BC2A893 +:1039F000C0035FD60080A052C0035FD60000805293 +:103A0000C0035FD600008052C0035FD6FD7BBBA918 +:103A1000FD030091F35301A9F40301AAF30300AAE3 +:103A2000F51300F9F6FFFF97F503002AF6FFFF975D +:103A300002488852E103002A63008452E003152AF9 +:103A4000E201A072684A0094200100B5E00000B0D5 +:103A500000F01D919807009440028012F35341A991 +:103A6000F51340F9FD7BC5A8C0035FD62100805245 +:103A7000E14B00B90100009021102791E01F00F9EF +:103A8000E12300F9DCFFFF97E103002AE00000B02A +:103A9000003C1E915C3E0094E403002AE2E30091A6 +:103AA000E10314AAE00313AA030080D206FBFF97E8 +:103AB000EBFFFF17FD7BBEA9E00303AA0340A0D2E2 +:103AC000FD0300912100038BF30B00F9F30302AA1D +:103AD00029270094E00313AAF30B40F9FD7BC2A849 +:103AE000C0035FD6FD7BBCA90340A0D2FD030091BB +:103AF000F35301A9F40301AA01BA8152620040B94B +:103B0000C1BFBD725F00016BE0010054F30300AA66 +:103B1000C9FAFF97E20300AA1F0400B1A1000054F4 +:103B2000010880D2E0078092D1FAFF97E20300AA51 +:103B3000E10314AAE00313AAF35341A9FD7BC4A82F +:103B4000D1FAFF1721008052E13B00B9010000903B +:103B500021D02A91020080D2E11B00F9E1A300915B +:103B6000DAFCFF97F35341A9FD7BC4A8C0035FD6DD +:103B7000E13584920000018B00EC7C92C0035FD69B +:103B8000FD7BBEA9023680D201008052FD03009168 +:103B9000F30B00F9F30300AA73C20691DA2600942E +:103BA000539200F9F30B40F9FD7BC2A8C0035FD626 +:103BB000FD7BBEA9FD030091F35301A9F30300AA05 +:103BC000F40302AA600240B96000F83600008012D7 +:103BD00007000014600640F9000100B4E10314AAD4 +:103BE0006D260094A0000035600240B9F35341A94E +:103BF000FD7BC2A8C0035FD673620091F2FFFF177E +:103C0000E20300AAE10000B0C00000D021003A9118 +:103C100000A00091E7FFFF17FD7BBCA9FD03009109 +:103C2000F35301A9F403042AF30301AA010080520B +:103C3000F55B02A9F50300AAF76303A9F70302AA3B +:103C4000F80303AAA4220094F603002A010080527C +:103C5000E00315AAAD22009401741E53C6761E53CC +:103C6000050080D2217C4093C27C409326C0268BE5 +:103C70009F02056B2C0100549F02007180A29F1AC5 +:103C8000F35341A9007C061BF55B42A9F76343A9E6 +:103C9000FD7BC4A8C0035FD6A7F07DD3E17A65F8A9 +:103CA000E46A67B88408C05ADF0A0071410500540D +:103CB000210CC0DA61020039233C08536306003945 +:103CC000235C1053630A0039237C1853630E0039B8 +:103CD000239C60D36312003923BC68D36316003978 +:103CE00023DC70D321FC78D3631A0039611E0039BC +:103CF000076B67B86402028B017B65F8E708C05A5E +:103D00001F080071C1020054210CC0DA616A223818 +:103D1000233C085383040039235C10538308003983 +:103D2000237C1853830C0039239C60D38310003903 +:103D300023BC68D38314003923DC70D321FC78D3EF +:103D400083180039811C00397302068BA504009189 +:103D5000C8FFFF17640200B9E6FFFF17676A22B8C1 +:103D6000FAFFFF17FD7BBDA9FD030091F35301A9E5 +:103D7000F40302AAF55B02A9F50300AAF603012ADF +:103D80008C1E00941F040031A1000054E20314AA09 +:103D9000E103162AE00315AA2C220094F303002A5B +:103DA0002001F836AF200094E30300AAC10000F020 +:103DB000E0000090E20314AA21A42C91001C1391AE +:103DC000862B0094E003132AF35341A9F55B42A923 +:103DD000FD7BC3A8C0035FD6FD7BB7A9FD0300919F +:103DE000F35301A9F55B02A9F503032AF76303A9BD +:103DF000F92300F97F1000710D02005413008012A6 +:103E0000E203152A83008052C10000F0E000009018 +:103E100021E42891004C1391702B0094E003132AA5 +:103E2000F35341A9F55B42A9F76343A9F92340F98C +:103E3000FD7BC9A8C0035FD6F40300AAF60301AA5C +:103E4000F70302AAF51C0094F303002A2001F836B8 +:103E500084200094E20300AAC10000F0E00000907A +:103E600021E42891002C13915C2B0094ECFFFF17A8 +:103E7000F800009018DF1691E20318AAE00314AAD4 +:103E800001008052B8FFFF97F303002A80FCFF3740 +:103E9000D90000F039E73491E30318AAE103002ABE +:103EA000E20319AAE00314AAE400805293210094CB +:103EB000F803002AE004F8366A200094F303182A75 +:103EC000E20300AAE10319AAE000009000A4149103 +:103ED000422B0094D2FFFF1700040091E403002A54 +:103EE000BF02006BAD000054C17A60F861FFFFB5FE +:103EF000E17A60F821FFFFB504030034E30317AA59 +:103F0000E20316AAE1430191E00314AAF50000B010 +:103F100042FFFF97B5A60B91E403002AE103132AA1 +:103F2000E3430191E20315AAE00314AA732100946C +:103F3000F303002A2001F8364A200094E20300AA85 +:103F4000E10315AAE000009000A41491C7FFFF1739 +:103F5000000080D2E2FFFF1713008052B0FFFF176E +:103F6000FD7BB9A9FD030091F35301A9F40300AA55 +:103F7000F55B02A9F60306AAF50307AAF76303A9EE +:103F8000F703042AF96B04A9FA0303AAF90305AAA3 +:103F9000FB2B00F9FB0302AAF83B40F99F1C00949D +:103FA0002002F836F303002A2E200094C10000F00E +:103FB000E20300AA21542C91E0000090002C139100 +:103FC000062B0094E003132AF35341A9F55B42A9A1 +:103FD000F76343A9F96B44A9FB2B40F9FD7BC7A804 +:103FE000C0035FD6E00314AAE20000B001008052D3 +:103FF00042AC15915CFFFF97F303002A40FEFF37A8 +:10400000E103002AE2031BAAE00314AA56FFFF976C +:10401000F303002A80FDFF37430FC0DAE103002AD3 +:10402000E2000090E00314AA429826910401805215 +:10403000E33700F9E3A30191302100943F0700B179 +:1040400040010054250FC0DAC20000F0E3A3019143 +:1040500042A81591E103132AE00314AA0401805237 +:10406000E53700F925210094F70AC05AC20000F094 +:10407000E3A3019142102291E103132AE00314AA61 +:1040800084008052F76B00B91C210094560100B4E3 +:10409000E00316AA68250094E200009004040011D1 +:1040A000E30316AA42982191E103132AE00314AA1C +:1040B00012210094550100B4E00315AA5E25009476 +:1040C000E200009004040011E30315AA42D81991FC +:1040D000E103132AE00314AA0821009458F7FFB45F +:1040E000E00318AA54250094E30318AA040400115D +:1040F000E103132AE00314AAE200009042E41991BC +:10410000FE200094B0FFFF17A00600B4FD7BBCA901 +:10411000E2098252FD030091F35301A9F40300AABE +:1041200013008052F55B02A93500020B4F1D00946D +:10413000F603002A7F02166B6B00005402008052C7 +:104140000D000014E3E30091E2C30091E103132AA0 +:10415000E00314AA381D0094E01B40F99F0200EB15 +:10416000E1020054E103132AE00314AA9920009409 +:1041700022008052930E40B9802E0012812240B955 +:10418000730AC05A2108C05A7302010B7302150B3F +:104190007302000B734E14127302004B600AC05A74 +:1041A000800600B902010035E003132AF35341A948 +:1041B000F55B42A9FD7BC4A8C0035FD6730600115E +:1041C000DDFFFF17E203132AE10314AAE00314AA98 +:1041D00064200094A0FEFF36F5FFFF170000805218 +:1041E000C0035FD6FD7BADA9FD030091F35301A988 +:1041F000F30300AAF40305AAE0C30291F55B02A948 +:10420000F60307AAF76303A9F70307AA1800805269 +:10421000F96B04A9190080121A008052FB7305A9DA +:10422000DB0000B0E67300B9E18F07A901008052FE +:10423000E2131129021080D233250094750A40B987 +:1042400060E30791DF020039B50AC05AF96B00B983 +:10425000FF7700B9E04B00F9FFAB00B9FCAB40B908 +:10426000E2A30291E00313AAE1031C2A001C0094BC +:10427000E06F00B9E07740B9FBAB40B91F000071B7 +:10428000E06F40B90418497A011700540004005146 +:104290001F200071480A0054E14B40F92058607813 +:1042A0006100001020A8208B00001FD6FC6B00B915 +:1042B000EBFFFF17E1031C2A020080D2E00313AAE0 +:1042C0009B1D0094010840B9E00313AA2108C05ABD +:1042D000D71C0094E10300AA600200B540018012DF +:1042E000F35341A9F55B42A9F76343A9F96B44A9CC +:1042F000FB7345A9FD7BD3A8C0035FD6E04340F91B +:10430000E14F00F900787BF87B070091AA24009424 +:10431000E203002AE14F40F980000035FB031C2A2C +:10432000500000141B0080D2E08F40B91F001B6BAF +:104330006CFEFF545F070071E2D79F1AF8FFFF176A +:10434000390700113F830071A0FCFF54E1031C2AD0 +:10435000E2B30291E00313AAD41C0094E10300AA83 +:10436000790000350000403900100035E0AF80B919 +:10437000E20216CB420800914200008BE03341B9C3 +:104380005FC020EBEA0E0054C0060091FF0200EB74 +:10439000A0000054E50317AAE0058052A0140038DD +:1043A000F70305AAE00317AA7D240094E0AF80B9C3 +:1043B0005F0700717B139C1A020080D2F702008B0A +:1043C000E0C302911AD839B8E08B40B91F00026BE4 +:1043D000AC000054DA010035FB031C2A02008052B5 +:1043E00020000014E03F40F9E10316AAE24F00F973 +:1043F000007862F870240094E24F40F94204009182 +:1044000040FEFF355A008052020000145A07005146 +:10441000E2031A2A130000143F07003100F6FF548C +:10442000E1C302912007005121D879B8FF0216EBB1 +:1044300089000054E2FE5F385FBC007181FFFF54C9 +:10444000FF020039E2031A2AF903002AFA03012ABB +:104450001F0400316100005420008052E07700B951 +:10446000E06B40B95F0000710018413A61070054E9 +:10447000E07340B91F0300710013407ACC0100546F +:10448000E000809200CC388B8102008B806A60B89B +:10449000210440B90000010B0000154B1F001C6BEC +:1044A000A100005418070051007F7D93846A60B812 +:1044B0009C00154B5F000071840B413A8001005451 +:1044C000E07340B91F03006BEA000054017F7D9345 +:1044D00080CE388B8203150B68031C4B826A21B88F +:1044E000080400B9180700111C008012E06F40B9E1 +:1044F0001F240071C1EDFF54612640B9E0AB40B903 +:104500002108C05A1F00016B01030054E17340B938 +:104510001F03016BAA010054017F7D9382CE388B6B +:104520009503150B00001C4B956A21B8E13B41B97E +:10453000400400B9A1000034612240B92108C05AEA +:104540000000010B400400B90007001165FFFF17D0 +:1045500022008052C3FFFF17FC6B40B9D6FFFF1744 +:10456000400080125FFFFF17600180125DFFFF17A0 +:10457000FD7BBDA9FD030091F35301A9F30303AA39 +:10458000F40302AAE3B300911B1D0094E00100B400 +:10459000E22F40B9050080D2040080D2437C021390 +:1045A000BF0003EB610100545F200071C90100549A +:1045B000FF8344EB80010054C00000F0E10314AA23 +:1045C0000020219185290094000080120800001429 +:1045D000017865B8A50400912108C05A248004AA76 +:1045E000F0FFFF1700008052640200F9F35341A965 +:1045F000FD7BC3A8C0035FD6FD7BBDA9FD03009171 +:10460000E3B30091F30B00F9F30302AAE200009078 +:1046100042D81991F81C0094000100B479FDFF976D +:10462000011C00120000805261020039F30B40F9B6 +:10463000FD7BC3A8C0035FD6E11F8052000080123B +:10464000FAFFFF17E30302AAE200009042982691C6 +:10465000C8FFFF17E30302AAC20000F042A81591A9 +:10466000C4FFFF17FD7BBDA9FD030091F35301A912 +:10467000F40302AAF30303AAC20000F0E3B300911B +:1046800042102B91DC1C0094800200F9E00000B481 +:10469000E12F80B900008052610200F9F35341A973 +:1046A000FD7BC3A8C0035FD6010080D2000080124A +:1046B000FAFFFF17FD7BBEA9030080D2FD03009126 +:1046C000F30B00F9F30302AAC20000F04294219117 +:1046D000C91C0094000100B4000040B90008C05A91 +:1046E000600200B900008052F30B40F9FD7BC2A8C4 +:1046F000C0035FD620008012FCFFFF17FD7BBEA920 +:10470000030080D2FD030091F30B00F9F30302AA2A +:10471000C20000F042C42191B71C0094000100B413 +:10472000000040B90008C05A600200B90000805281 +:10473000F30B40F9FD7BC2A8C0035FD620008012B6 +:10474000FCFFFF17FD7BBEA9030080D2FD03009193 +:10475000F30B00F9F30302AAC20000F042FC21911E +:10476000A51C0094000100B4000040B90008C05A24 +:10477000600200B900008052F30B40F9FD7BC2A833 +:10478000C0035FD620008012FCFFFF17FD7BBDA990 +:10479000FD030091F30B00F9F30302AAE3B30091C8 +:1047A000C20000F042242291931C0094600200F9A0 +:1047B0001F0000F1E0139F5AF30B40F9FD7BC3A8E3 +:1047C000C0035FD6FD7BBDA9FD030091F35301A992 +:1047D000F40302AAF30303AAC20000F0E3B30091BA +:1047E00042642791841C0094800200F9E00000B428 +:1047F000E12F40B900008052610200B9F35341A992 +:10480000FD7BC3A8C0035FD6010080520000801268 +:10481000FAFFFF17FD7BBCA9FD030091F35301A92B +:10482000F40300AAF30304AAE00302AAF55B02A9B9 +:10483000F503012AF60303AAE1E300916808009456 +:104840000002F837E01F40F9E20316AAE103152A37 +:10485000031840B9040840F9E00314AA80003FD6C9 +:10486000E01F40F9000840B9600200B90000805222 +:10487000F35341A9F55B42A9FD7BC4A8C0035FD6F1 +:1048800000008012FBFFFF17FD7BAFA9FD03009125 +:10489000F55B02A9F50303AAC30000D063A82D911C +:1048A000F60304AAE33F00F923008052E40302AABE +:1048B000E5B30191E20315AAF35301A9F40300AA99 +:1048C000F76303A9F703012AF96B04A9FB2B00F98D +:1048D000E36F00B9E30316AA3F020094A00300347B +:1048E000C00000F01300805200B02491E03F00F9B6 +:1048F000F53F40F9E103132A020080D2E00314AA35 +:104900006A1B0094F30300AAE103172A020080D275 +:10491000E00314AA651B0094E20313AAE30300AAB0 +:10492000E10315AAC00000F000042891AB28009410 +:1049300000008052F35341A9F55B42A9F76343A9F4 +:10494000F96B44A9FB2B40F9FD7BD1A8C0035FD6CE +:10495000E103172AE00314AAD80000F0D90000F000 +:10496000BF1A009418531C91F303002A391B259198 +:10497000F300F8367F220031641A4B3AC10D00541F +:10498000C00000F00094279115000014E103132AE1 +:10499000020080D2E00314AA441B0094FA0300AA88 +:1049A000E00318AA24230094E20300AAE10318AA52 +:1049B000E0031AAA0923009440090035E20302919A +:1049C000E103132AE00314AAFF3F00F970FFFF97E9 +:1049D000A0000034C00000F000402591E03F00F945 +:1049E000C4FFFF17FB4340F9C00000F0001C3B91DF +:1049F000E1031BAA79280094C20000F0E34302916E +:104A000042B42591E103132AE00314AAFA1B00948F +:104A1000200200B4E19340B93F100071C10100547D +:104A2000000040B980010034C00000F000E825918A +:104A30006A280094C00000F0007C27919E03009437 +:104A4000E103132AE00314AA921A0094F303002A44 +:104A5000C8FFFF17E3D30191E2230291E103132A78 +:104A6000E00314AA58FFFF9780000034C00000F054 +:104A700000102691DAFFFF17FA3F0391E4C301917A +:104A80005AE77A92E2031BAAE3031AAAE103162A61 +:104A9000E00315AA60FFFF9780000034C00000F01B +:104AA00000882691CEFFFF17E2034E295F00006BBE +:104AB00080000054C00000F000F42691C8FFFF17EA +:104AC000E14740F9427C4093E0031AAA5D23009439 +:104AD00020FBFF34C00000F000402791C0FFFF170B +:104AE000E06F40B9E0FAFF34E00319AAD222009443 +:104AF000E10319AAE20300AAE0031AAAB72200946C +:104B000000FAFF35446A40F9E6E30191E30316AA8F +:104B1000E20315AAE103132AE00314AA0500801298 +:104B20007D01009480F8FF34C00000F000882791D8 +:104B3000C3FFFF17200080527FFFFF17FD7BBCA93A +:104B4000FD030091F35301A9F30000B073222391F8 +:104B5000F55B02A9F50300AA140080D2F71B00F947 +:104B600080EA7BD3176873F8E00317AAB222009497 +:104B7000E10315AAE20300AAE00317AA9722009412 +:104B8000E0010035E00317AAAB220094A06A603868 +:104B90001FB0007141010054967E7B936002168B1A +:104BA000F35341A9F55B42A9F71B40F9FD7BC4A86B +:104BB000C0035FD6340080D2EAFFFF17D4FFFFB4F2 +:104BC000000080D2F7FFFF17FD7BBDA98105805251 +:104BD000FD030091F35301A9F51300F98C22009411 +:104BE000E00000B5130080D2E00313AAF35341A9FB +:104BF000F51340F9FD7BC3A8C0035FD614040091F0 +:104C0000F30000D0F50000D073E23991B5C23B91BA +:104C10007F0215EB82FEFF54600240F9E10314AA03 +:104C20006522009420FEFF3473A20091F9FFFF1764 +:104C3000FD7BBDA9FD030091F35301A9F51300F914 +:104C4000E00000B5130080D2E00313AAF35341A99A +:104C5000F51340F9FD7BC3A8C0035FD6F50300AA96 +:104C6000F30000F0F40000F0732227919462279182 +:104C70007F0214EB82FEFF54600240F9E10315AAA3 +:104C80004D22009420FEFF3473420091F9FFFF177C +:104C9000FD7BBAA9FD030091F35301A9F30300AA18 +:104CA000F55B02A9F76303A9F70305AAF96B04A949 +:104CB000FA0301AA200440B90100A2520008C05A18 +:104CC0001F00016B89010054C00000F034008052C5 +:104CD000005C2291A00000F9E003142AF35341A9DB +:104CE000F55B42A9F76343A9F96B44A9FD7BC6A80C +:104CF000C0035FD6F603022AF90303AAF803042AC5 +:104D0000E2630191E103162AE0031AAAA0FEFF97CD +:104D1000F403002AC0000034C00000F000402591D8 +:104D200014008012E00200F9ECFFFF17E103162ADD +:104D3000E0031AAA030080D2C20000F042B0229120 +:104D40002D1B0094F50300AA600000B5D50000F00B +:104D5000B53A2291020F80D201008052E00313AADB +:104D600069220094E103162A030080D2E0031AAA04 +:104D7000C20000F042D022911F1B0094600600F98F +:104D8000E02F40F97A0E00F9762200B9601600F99A +:104D90006BFFFF97601A00F9E02F40F98BFFFF9738 +:104DA000602200F9E00315AAA2FFFF97601E00F938 +:104DB000620640F9792600F9E12F40F9785200B9EE +:104DC000C00000F00008239184270094601A40F985 +:104DD000A00000B4602240F9600000B4601E40F9F9 +:104DE000C0F7FFB5C00000F000202391CDFFFF17F2 +:104DF000E50300AAE00303AA830000B40400805284 +:104E00005F00046B4C000054C0035FD6260080B9DD +:104E1000840400112120009163400091A600068BBC +:104E200066001FF826C05FB866801FB8F5FFFF1741 +:104E3000FD7BA4A9FD030091F35301A9F30305AA87 +:104E4000F40300AAF55B02A9F503012AF60303AAFD +:104E5000E103022A020080D2F76303A9F703042AC0 +:104E6000F96B04A9FB7305A9FF4300D10F1A009445 +:104E70007F0200F9E50313AAE403172AE30316AA45 +:104E8000E203152AE10314AAA03700F9A003029156 +:104E900080FFFF9760010035A3C30191A2E3019158 +:104EA000E103152AE00314AA47FEFF97FC03002A3A +:104EB000A0010034C00000F000102691600200F94B +:104EC00000008012BF030091F35341A9F55B42A992 +:104ED000F76343A9F96B44A9FB7345A9FD7BDCA8E3 +:104EE000C0035FD6A3D30191E103152AE00314AAFE +:104EF000C20000F042D81891BF1A0094F90300AA2A +:104F0000C00000B4A17740B918C0218B1F0018EB76 +:104F1000A30000541C010035C00000F0000C1991E2 +:104F2000E7FFFF17021440385F0000719C179C1ABE +:104F3000F7FFFF173F000071CD00005400F35F380A +:104F400080000034C00000F0008C1991DCFFFF17D6 +:104F50009F9301718D000054C00000F000441A912D +:104F6000D7FFFF17807F7D93D60000F0003C0091B3 +:104F7000D6E21A9100EC7C9217008052FF6320CB9E +:104F8000FB430091FA031BAA3F0318EBA300005454 +:104F900057030035C00000F000201B91C8FFFF1729 +:104FA000590300F9E00316AAA3210094E20300AA22 +:104FB000E10319AAE00316AA882100942001003514 +:104FC000203F40391FBC0071C1000054A13740F997 +:104FD00020430091782100941F000071F7169F1A5A +:104FE000E00319AA94210094000400915A2300912F +:104FF0003903008BE5FFFF17F7008052A7E3039109 +:10500000E2031C2AE1031BAA977F171B840080522E +:10501000A30000F063603491E0520011F74E0011DC +:10502000E603172A007C7D93003C009100EC7C9203 +:10503000FF6320CB00198052F8430091E50318AAC2 +:10504000E00300B9E00314AAFF0B00B966FCFF9768 +:10505000F603002A1F0000718A000054C00000D02F +:1050600000B01B9196FFFF1781000054C00000D0D4 +:1050700000241C9192FFFF17FF02006B8C0000546C +:10508000C00000D000641C918DFFFF17C20000D04B +:10509000E103152A42BC1C91E00314AA030080D24C +:1050A000551A0094400100B4C37E7D93810E40B92F +:1050B00002CF368BD60600112108C05A016B23B8E7 +:1050C000000440B90008C05A400400B9FFD336CBF1 +:1050D000E10318AAE7430091E203162AE30307AAB3 +:1050E000E00314AA43FFFF97A06340F9E10307AA76 +:1050F000A47340B9A33F40F9051040F9A003029101 +:10510000A0003FD600EEFF34C00000D000F81C9194 +:105110006BFFFF17FD7BB2A9FD030091DF0000F9D3 +:10512000F35301A9F40300AAF30306AAF55B02A94D +:10513000F503012AF60303AAE30304AAE403052AFC +:10514000E50306AAF71B00F9F70302AAE203012A06 +:10515000E10300AAE0A30191CEFEFF9740010035D4 +:10516000E3330191E2430191E103152AE00314AA1C +:1051700095FDFF9740010034C00000D0001026913B +:10518000600200F900008012F35341A9F55B42A9C7 +:10519000F71B40F9FD7BCEA8C0035FD6E05740F96E +:1051A000F72F00F9E44F40B9E1630191E32B40F997 +:1051B000F66300B9051040F922008052E0A3019186 +:1051C000A0003FD620FEFF34C00000D000F81C91A4 +:1051D000ECFFFF17FD7BB7A9FD030091F35301A975 +:1051E000F40300AA20008052F55B02A9D60000D08B +:1051F000D61A2591F76303A9F50304AAF803012A37 +:10520000F96B04A9F70305AA01008052FB7305A9F5 +:10521000A00000B9E00304AAE20F07A9E20316AA5E +:10522000641900946000F836000080523D000014BC +:10523000E103002ADA0000D0E00315AADB0000D069 +:10524000871800945AE72391F303002A7B8B279158 +:10525000190080529300F83699FEFF34FF0200B91E +:10526000F2FFFF17E2031AAAE103132AE00315AACB +:10527000030080D2E0190094400A00B4C10000F09D +:1052800021A82D91CC200094C0090035C00000B0A9 +:1052900000A82D91E103182AE04700F9E00314AAC1 +:1052A0006F180094FC03002AA004F8361F20003178 +:1052B00004184B3A41020054D60000D0D6962791EC +:1052C000E1031C2A020080D2E00314AAF71800941C +:1052D000E103182AF70300AA020080D2E00314AA0F +:1052E000F2180094E30300AAE20317AAC00000D05A +:1052F000E10316AA0004289138260094020080D207 +:10530000E103132AE00315AAE8180094E10300AAB8 +:10531000C00000D0000824913026009400008012C4 +:10532000F35341A9F55B42A9F76343A9F96B44A97B +:10533000FB7345A9FD7BC9A8C0035FD6020080D2DC +:10534000E1031C2AE00314AAD81800940108805233 +:10535000E03700F9AE200094E00300B5E00316AAA0 +:10536000B5200094E20300AAE10316AAE03740F951 +:105370009A20009460010035E20F47A9E6230291CC +:10538000E40315AAE1031C2AE00314AA0500801215 +:1053900061FFFF97E0000034E0031BAA4601009480 +:1053A000E1031C2AE00314AA3A180094BEFFFF1779 +:1053B00039070011C00000D0007C27913E01009405 +:1053C000E103132AE00315AA32180094F303002A1C +:1053D000A1FFFF17D60000D0D6922391B9FFFF1787 +:1053E000FD7BB7A9020080D2FD030091F35301A910 +:1053F000F40300AAF55B02A9F603012AF76303A9E7 +:10540000F96B04A9FB7305A9556A40F9A718009424 +:1054100001088052F30300AA7D200094E00000B44C +:10542000C00000D0E10313AA00481D91EB250094B1 +:10543000000080120A000014D70000D0F71A25914E +:10544000E20317AAE00315AA01008052D9180094BC +:10545000F303002A2001F83600008052F35341A9DB +:10546000F55B42A9F76343A9F96B44A9FB7345A90E +:10547000FD7BC9A8C0035FD6E103002AC20000D0AB +:10548000E00315AA42E01D91030080D25A1900944E +:10549000200300B4C10000F0213422914620009482 +:1054A0001F000071FA079F1AE103132AE00315AAEF +:1054B000DC0000D0EA1700949C8B2791F303002AAC +:1054C000DB0000D01900805260E723911800805261 +:1054D000E03700F95301F8363F030071001B407AB2 +:1054E000C1FBFF54C00000D0006C1F91BB2500948D +:1054F000D0FFFF173A008052ECFFFF17E23740F968 +:10550000E103132AE00315AA030080D23A1900949C +:10551000200A00B4C10000D021181E91262000945A +:10552000A0090035C00000D0002C1E9139070011E1 +:10553000E103162AE04700F9E00314AAC817009413 +:10554000FB03002A6004F8361F20003104184B3A90 +:1055500081000054C00000D000942791E04700F97A +:10556000E54740F9E1031B2A020080D2E00314AAB8 +:10557000E53F00F94D180094E40300AAE103162A60 +:10558000020080D2E00314AAE43B00F9471800941B +:10559000E30300AAE41747A9C00000D000A01E91B1 +:1055A000E20304AAE10305AA8C2500945A050034FD +:1055B000E103132AE00315AA020080D23B180094ED +:1055C000E10300AAC00000D00008249198FFFF1753 +:1055D000E1031B2A020080D2E00314AA33180094CE +:1055E000E30300AAE00317AAE33B00F912200094AA +:1055F000E20300AAE33B40F9E10317AAE00303AA90 +:10560000F61F009460010035E5230291E403132A9C +:10561000E30315AAE203162AE1031B2AE00314AAF6 +:1056200004FEFF97E0000034E0031CAAA2000094EF +:10563000E1031B2AE00314AA96170094C1FFFF1789 +:10564000C00000D018070011007C27919A00009438 +:105650005AF0FF34E103132AE00315AA8D170094D2 +:10566000F303002A9CFFFF17FD7BBBA9C10000D0FC +:1056700021E01A91FD030091F35301A9F40300AA5C +:10568000F55B02A9F76303A9611900946004F83778 +:10569000E3330191C20000D042402091F303002A7D +:1056A000E103002AE00314AAD3180094D80000D024 +:1056B000E103132AF60300AA18632091E00314AA59 +:1056C00067170094F303002A35008012F300F836C0 +:1056D000E003152AF35341A9F55B42A9F76343A9F7 +:1056E000FD7BC5A8C0035FD6E3330191E20318AA8E +:1056F000E103132AE00314AABF180094F70300AAD9 +:10570000000100B5C10000B0C00000D021002A9106 +:105710000090209131250094B5028012EDFFFF1713 +:10572000560100B4020080D2E103132AE00314AA58 +:10573000DE170094E10300AAE00316AA9E1F00945E +:105740001F000071B512931AE00317AAC8EAFF9769 +:10575000C0000034E103132AE00314AA4D1700949B +:10576000F303002ADAFFFF17F503132AD9FFFF1707 +:10577000010040F93F1440F2A1000054010041A98A +:105780003F0000EBE0179F1AC0035FD60000805275 +:10579000FEFFFF17FD7BBEA9FD030091F35301A996 +:1057A000F30300AAF40304AA010400A9810400D1B0 +:1057B0002100028B020800F9032000B92108C49AD5 +:1057C000217C049B010C00F9A0003FD6600100354C +:1057D000610E40F9E00314AAF5020094600600F996 +:1057E000000200B4612240B981000036610240F934 +:1057F000620A40F9E01F0094610E40F9600640F92A +:1058000021FC009121E47A922100008BBBF1FF97EB +:1058100000008052F35341A9FD7BC2A8C0035FD6AC +:1058200060018012FCFFFF1705000090040880D281 +:10583000A5C01D91D8FFFF17FD7BBEA9FD030091F8 +:10584000F30B00F9F30300AA002040B9E00008368A +:10585000610E40F9600640F921FC009121E47A9242 +:105860002100008BA4F1FF97600640A93F0000EBE8 +:10587000E0000054622240B962000836620A40F932 +:10588000BD1F0094600640F97F0000940000805224 +:10589000F30B40F9FD7BC2A8C0035FD6C207A0F09E +:1058A00042A0079140D860F8022040F9F00302AA14 +:1058B00000021FD6E10300AA120100B4431E40F902 +:1058C000C30000B4420640F962000836200080524E +:1058D000F3FFFF178C450014C0035FD6011C0012B4 +:1058E000920100B4401E40F9400100B4400640F966 +:1058F000C0000836C007A0F000F840F9021C40F9CB +:10590000F00302AA00021FD6E003012A7845001422 +:10591000C0035FD6FD7BBDA9FD030091F51300F91F +:10592000D507A0F0F35301A9B3E640F91400138B97 +:10593000A000F8B6E20300CB01008052E00314AAF5 +:10594000711F0094C007A0F000EC40F91F0014EB99 +:1059500068010054C007A0F000E840F91F0014EBF4 +:10596000E3000054E00313AAB4E600F9F35341A99D +:10597000F51340F9FD7BC3A8C0035FD600008092F9 +:10598000FBFFFF17E20301AAC107A0F00400028B8E +:1059900020EC00F9C107A0F024E800F9C107A0F04D +:1059A00020E400F901008052571F0014FD7BBDA9BF +:1059B000FD030091F51300F9F5000090B522249144 +:1059C000F35301A9A10A40F9340440F994F67E92F8 +:1059D000930200CB737E3F9173CE7492730640D1D5 +:1059E0007FFE3FF1CC00005400008052F35341A9E8 +:1059F000F51340F9FD7BC3A8C0035FD6000080D239 +:105A0000C5FFFF97A10A40F92100148B1F0001EB8D +:105A1000C1FEFF54E00313CBBFFFFF971F0400B18B +:105A2000E1010054000080D2BBFFFF97A20A40F9B9 +:105A3000010002CB3F7C00F18DFDFF54E30000B07C +:105A4000210040B2410400F9638C40F9000003CB0F +:105A5000C307A0F0608C01B9E4FFFF17A00A40F96A +:105A6000C107A0F0940213CB940240B2140400F9D1 +:105A7000208C41B90000134B208C01B920008052CA +:105A8000DBFFFF17410640F9A1094836800900B441 +:105A900006805FF8034000D1E40000908420249148 +:105AA000C1F87F92C60040926500018B870840F9DB +:105AB000A20440F942F47E92BF0007EB6102005459 +:105AC0002200028BE60000B500005FF8630000CB07 +:105AD0004200008B610041A9200C00F9010800F987 +:105AE000400040B2600400F9E00000B0830800F913 +:105AF000009040F95F0000EB23060054C007A0F0BF +:105B000000F040F9AAFFFF17A20400F9660100B5F2 +:105B100000005FF886400091630000CB2100008BFD +:105B2000600840F91F0006EBC0040054660C40F901 +:105B3000060C00F9C00800F900008052A600028B94 +:105B4000C60440F9460100372100028BA20840F943 +:105B5000C0030035864000915F0006EB61030054EE +:105B6000830C02A920008052620801A9220040B2E1 +:105B7000620400F9616821F8200200353FFC07F15A +:105B8000C802005421FC43D322008052207C02131F +:105B9000210400114220C01A21781F53800440F9CB +:105BA00081CC218B000002AA800400F920045FF858 +:105BB000600401A9230800F9030C00F9C0035FD6B3 +:105BC00020008052DEFFFF17A50C40F9450C00F9BC +:105BD000A20800F9E6FFFF1722FC49D33FFC27F19A +:105BE0006802005420FC46D300E0001102040011BA +:105BF00042781F5382CC228B45045FF85F0005EB8F +:105C000041040054007C0213210080522120C01A5C +:105C1000800440F9000001AA800400F9650801A988 +:105C2000430800F9A30C00F9E5FFFF175F5000F1EE +:105C300068000054406C0111EDFFFF175F5001F147 +:105C40008800005420FC4CD300B80111E8FFFF1776 +:105C50005F5005F18800005420FC4FD300DC011197 +:105C6000E3FFFF1720FC52D35F5415F100F0011140 +:105C7000C20F80520030821ADDFFFF17A50840F9DD +:105C80005F0005EBA0000054A00440F900F47E92F0 +:105C90003F0000EB43FFFF54A20C40F9E0FFFF1769 +:105CA000420640F94200483748020014E10300AAC6 +:105CB000C207A0F0C007A0F042E840F900EC40F9AC +:105CC000000002AA600100B5000080D2C0035FD6C8 +:105CD000000080D2F35341A9F55B42A9F76343A9C1 +:105CE000F96B44A9FB2B40F9FD7BC6A8C0035FD626 +:105CF000C1FEFFB7FD7BBAA9215C00913FB800F15E +:105D0000FD030091F35301A9F40000909422249123 +:105D1000F55B02A9F76303A9F96B04A9FB2B00F952 +:105D20004D03005435EC7C92BFDE07F1280300548C +:105D3000A1FE43D32204001142781F5382CE228B4E +:105D4000434000D1400440F91F0003EBA100005480 +:105D5000400C40F9210800115F0000EB20040054C2 +:105D6000018C40A9020C40F921F47E92620C00F9EA +:105D70000100018B430800F9220440F9420040B2BF +:105D8000220400F928000014150480D2E9FFFF174F +:105D9000A0FE49D3400700B41F1000F1880400544E +:105DA000A1FE46D321E000112204001142781F53C6 +:105DB00082CE228B424000D1400C40F95F0000EBC4 +:105DC000E0000054030440F963F47E92650015CBB3 +:105DD000BF7C00F18D050054210400512104001105 +:105DE000801240F9834200911F0003EBC008005469 +:105DF000020440F942F47E92450015CBBF7C00F1CD +:105E00004D0500540400158BA10240B2010400F9B5 +:105E1000A10040B2841202A9818C00A9830C00F970 +:105E2000056822F800400091ABFFFF171F5000F1FA +:105E300068000054016C0111DCFFFF171F5001F1D5 +:105E400088000054A1FE4CD321B80111D7FFFF17E1 +:105E50001F5005F188000054A1FE4FD321DC011131 +:105E6000D2FFFF17A1FE52D31F5415F121F00111EB +:105E7000C00F80522130801ACCFFFF17E1078052FB +:105E8000CAFFFF17040C40F9C500F8B7010840F934 +:105E9000240C00F9810800F90100038BB7FFFF17FC +:105EA000E00304AAC6FFFF17830E02A9C500F8B7D6 +:105EB0000200028B410440F9210040B2410400F984 +:105EC000D9FFFF17860640F95FFC07F1280C005444 +:105ED00042FC43D323008052447C0213420400114D +:105EE00042781F536320C41AC60003AA860600F92D +:105EF00082CE228B43045FF8030801A9400800F911 +:105F0000600C00F9207C0213220080524220C01A4B +:105F1000800640F95F0000EB080400545F0000EACF +:105F2000C100005421741E1242F87FD321100011C9 +:105F30001F0002EAA0FFFF54E80180922304001131 +:105F4000E503012A63781F5303CD238B8302038B60 +:105F5000E60303AAC00C40F9DF0000EBC10D0054BA +:105F6000A5040011C6400091BF0440F241FFFF5458 +:105F70003F0440F2E1100054800640F90000228AFC +:105F8000800600F9800640F942F87FD35F0000EBFD +:105F900048000054221100B5980A40F9170740F94B +:105FA000F7F67E92E20215CB5F7C00F10C160054EE +:105FB000C007A0F0FB0000B01A03178B13F040F9E4 +:105FC000608F40F9B302138B1F0400B1A10F00547E +:105FD00073820091E00313AA4FFEFF97F60300AA15 +:105FE0001F0400B1801300545F0300EB69000054EC +:105FF0001F0314EB01130054D907A0F0208F41B9FF +:106000000000130B208F01B95F0316EB210E005423 +:10601000800A40F9F302138B730240B2130400F9B3 +:10602000C107A0D0208F81B922DC40F91F0002EB0C +:106030004900005420DC00F9C107A0D022E040F95B +:106040001F0002EB8910005420E000F982000014C8 +:1060500044FC49D35FFC27F14802005443FC46D37B +:1060600063E000116404001184781F5384CE248BF4 +:1060700085045FF89F0005EB21040054637C021344 +:10608000220080524220C31AC60002AA860600F9E6 +:10609000051001A9800800F9A00C00F99AFFFF176C +:1060A0009F5000F168000054836C0111EEFFFF1750 +:1060B0009F5001F18800005443FC4CD363B8011198 +:1060C000E9FFFF179F5005F18800005443FC4FD3B0 +:1060D00063DC0111E4FFFF1743FC52D39F5415F119 +:1060E00063F00111C40F80526330841ADEFFFF1782 +:1060F000A50840F99F0005EBA0000054A30440F957 +:1061000063F47E925F0003EB43FFFF54A40C40F95D +:10611000E0FFFF17040440F984F47E92870015CB5A +:10612000FF7C00F1ED010054A10240B2010400F92E +:10613000030840F90200158B010C40F9610C00F9CD +:10614000230800F9E10040B2820A02A994420091BA +:1061500041D000A9540C00F9076824F832FFFF175A +:106160004701F8B70400048B810440F9210040B2D4 +:10617000810400F9010C40F9020C41F8410C00F9CE +:10618000220800F9D4FEFF17000C40F973FFFF1737 +:1061900060045FF8210400517F0000EBA0EEFF5483 +:1061A00079FFFF172110001142F87FD31F0002EA88 +:1061B000A0FFFF5462FFFF17E103052AFCFFFF1752 +:1061C000E00382D27302008B73CE749282FFFF17BA +:1061D000618F40F93F0400B161050054768F00F9EA +:1061E000C00E40F280000054010280D2200000CB9B +:1061F000D602008BD302138B000013CB73FE3F91AA +:1062000073CE74927302008BE00313AAC2FDFF9752 +:106210001F0400B100020054218F41B9000016CBC9 +:106220000000138B960A00F92100130B000040B206 +:10623000218F01B9C00600F91F0314EB20EFFF54B2 +:10624000FF7E00F188020054800A40F9210080D2CC +:10625000010400F9800A40F9020440F942F47E92F8 +:10626000420015CB5F7C00F14DD3FF54800A40F90A +:10627000A10240B2010400F90100158B810A00F966 +:10628000BFFEFF17DA021ACB00001A0B208F01B9EC +:10629000D4FFFF17000740F9F76200D1F7EE7C92B8 +:1062A000210180D200004092000017AA000700F9E7 +:1062B0000003178B018C00F8010400F9FF7E00F148 +:1062C00009EBFF5400430091EFFDFF9755FFFF17C7 +:1062D000FD7BBCA9FD030091F55B02A9157C019B28 +:1062E000F60300AAC00000F0F71B00F9F35301A960 +:1062F000178C44F9E00315AAF40640F969FEFF97EC +:106300003605F8B7F30300AA200300B4410640F9AC +:10631000A1004837E20315AA01008052FA1C00943C +:106320001300001401805FF8034000D182F67E92D2 +:106330007F0017EB21F47E92420041FA4230819AAD +:10634000422000D15F2001F188FEFF545F9C00F1E4 +:10635000A90000541F7C00A95FDC00F14801005433 +:10636000004000911F7C00A91F0800F9E00313AA58 +:10637000F35341A9F55B42A9F71B40F9FD7BC4A883 +:10638000C0035FD61F7C01A95F2001F160000054AB +:1063900000800091F4FFFF1700C000917F7E02A9EA +:1063A000F1FFFF17130080D2F1FFFF17FD7BBCA99F +:1063B000FD030091F35301A9F55B02A9F71B00F956 +:1063C0000101F8B6130080D2E00313AAF35341A9E8 +:1063D000F55B42A9F71B40F9FD7BC4A8C0035FD65B +:1063E000420640F9C2004837F35341A9F55B42A980 +:1063F000F71B40F9FD7BC4A876000014F40300AA43 +:10640000F70301AA1F4000F1E8000054F35341A92B +:10641000E00301AAF55B42A9F71B40F9FD7BC4A884 +:1064200020FEFF17215C0091000480D29F0200EB48 +:1064300036EC7C929422809A3FB800F1D6C2809AC2 +:106440008002008B0000168B16FEFF97E10300AA66 +:10645000800200B5E00317AA12FEFF971508D49A30 +:10646000F30300AAB582149B15FBFFB486FDFF97CA +:10647000950215CBE002158B0AFEFF97E10300AAF7 +:1064800020FAFFB40208D49A4280149B820202CB05 +:10649000BF0202EB620000547BFDFF97CAFFFF17AB +:1064A0002008D49A334000D10084149B800300B4A8 +:1064B000E003144B950600D13500158B007C40930A +:1064C000B502008AB54200D1A00213CB1F7C00F1B7 +:1064D00048000054B502148B600640F9A30213CBA8 +:1064E00000F47E92000003CB020040B2A002008BB9 +:1064F000A20600F9020440F9420040B2020400F989 +:10650000600640F900004092000003AA600600F90E +:10651000F30315AAE00301AA5BFDFF97610640F9AA +:1065200021F47E92210016CB3F7C00F14D010054F6 +:106530006002168B210040B20040009101801FF8DC +:10654000610640F921004092210016AA610600F977 +:106550004DFDFF97734200919CFFFF17429240F957 +:10656000237C4093459A40F94100058B620400D199 +:106570002100028BE30303CB429240F92100038AFE +:10658000000002CB0200018B409640F91F0002EB95 +:1065900022010054FD7BBFA9C00000900060329131 +:1065A000FD0300918D210094000080D2FD7BC1A8E5 +:1065B000C0035FD6421C0091E00301AA42F07D9225 +:1065C000429A00F9C0035FD621008052E4FFFF1712 +:1065D000E20300AAE00301AAE103022AE0FFFF1799 +:1065E000FD7BBCA9FD030091F35301A9F40301AAAB +:1065F000010B80D2F55B02A9F50302AAF60303AAF8 +:10660000F71B00F9F70300AA200080D231FFFF97A3 +:10661000F30300AA000200B4775A00A9E00315AA08 +:10662000261C0094605201A9AD1C0094601200F970 +:1066300061020191E00312AA42CE40F9622200F900 +:10664000420000B4410400F901CC00F90060069159 +:10665000200400F9E00313AAF35341A9F55B42A912 +:10666000F71B40F9FD7BC4A8C0035FD6410640F983 +:1066700021078837FD7BBCA9FD030091F35301A9D5 +:10668000F55B02A9F76303A9410640F953CE40F92F +:1066900021006FB2410600F9F30400B4D50000B048 +:1066A000730201D1B55A0991177182D23800805214 +:1066B000330400B4762240F9891C0094F40300AA44 +:1066C000601E40F99F0200EB04030054600E40F985 +:1066D000610240F90000148B601E00F9600640F969 +:1066E00020003FD6601A40F900040091601A00F9BA +:1066F0007B1C0094020014CB601640F90000028B52 +:10670000601600F95F0017EB09010054604241393F +:10671000C0000035610A40F9E00315AA03718252F6 +:106720002E21009478420139760000B4D30201D1C1 +:10673000E0FFFF17400640F900F86E92400600F9AE +:10674000F35341A9F55B42A9F76343A9FD7BC4A8B4 +:10675000C0035FD6C0035FD6520000B4C4FFFF176A +:10676000C0035FD6000840B91F00036B4C01005402 +:10677000FD7BBFA9FD030091200040B9400000B996 +:10678000E00301AAC0FCFF9700008052FD7BC1A876 +:10679000C0035FD600008012C0035FD6000840B976 +:1067A0001F00036B4C010054FD7BBFA9FD0300914A +:1067B0002000407940000079E00301AAB2FCFF9775 +:1067C00000008052FD7BC1A8C0035FD6000080128C +:1067D000C0035FD6FD7BBEA9FD030091F30B00F95A +:1067E000F30301AAE10302AAE203032A600240B90B +:1067F000FF1A0094600200B900008052F30B40F9C8 +:10680000FD7BC2A8C0035FD6FD7BBEA9800080D2FD +:10681000FD030091F30B00F9F30301AA21FDFF979B +:106820001F0000B9600200F900008052F30B40F92C +:10683000FD7BC2A8C0035FD6FD7BBEA9400080D20D +:10684000FD030091F30B00F9F30301AA15FDFF9777 +:106850001F000079600200F900008052F30B40F93C +:10686000FD7BC2A8C0035FD6FD7BBEA9FD030091DE +:10687000F30B00F9F30301AAE10302AAE203032ADE +:1068800060024079B41A00946002007900008052DE +:10689000F30B40F9FD7BC2A8C0035FD6000840B9E6 +:1068A0001F00036BCC010054FD7BBEA9FD030091CA +:1068B000F30B00F9F30301AAE10302AAE00313AA10 +:1068C000D2110094E00313AA6FFCFF9700008052DE +:1068D000F30B40F9FD7BC2A8C0035FD60000801215 +:1068E000C0035FD6FD7BBFA9E00301AAE10302AAB2 +:1068F000FD030091E203032AC111009400008052BD +:10690000FD7BC1A8C0035FD6FD7BBEA9000D80D270 +:10691000FD030091F35301A9F30301AAE1FCFF97E2 +:10692000F40300AA6C090094740200F9000080527C +:10693000F35341A9FD7BC2A8C0035FD6000840B94C +:106940001F00036BCC010054FD7BBEA9FD03009129 +:10695000F30B00F9F30301AAE10302AAE00313AA6F +:10696000F3080094E00313AA47FCFF97000080524D +:10697000F30B40F9FD7BC2A8C0035FD60000801274 +:10698000C0035FD6FD7BBFA9E00301AAE10302AA11 +:10699000FD030091E203032AE20800940000805204 +:1069A000FD7BC1A8C0035FD6FD7BBEA9000D80D2D0 +:1069B000FD030091F35301A9F30301AAB9FCFF976A +:1069C000F40300AAFB020094740200F90000805254 +:1069D000F35341A9FD7BC2A8C0035FD6FD7BBCA9D0 +:1069E000FD030091F35301A9F300009073A20491F9 +:1069F000F55B02A9F50300AAF60301AA140080D2F0 +:106A0000F76303A9180780D2807E189B016873F88A +:106A1000E00315AAE81A009420010035977E389B00 +:106A20007302178BD30200F9F35341A9F55B42A916 +:106A3000F76343A9FD7BC4A8C0035FD69406009109 +:106A40009F1200F121FEFF54800B8012F7FFFF1709 +:106A5000FD7BBCA9FD030091F35301A9F300009055 +:106A600073A20491F55B02A9F50300AAF60301AA3B +:106A7000F71B00F9F70313AA14008052610240F9D2 +:106A8000E00315AACC1A009460010035611240F9A8 +:106A9000210100B401078052945E219BD40200F9C9 +:106AA000F35341A9F55B42A9F71B40F9FD7BC4A84C +:106AB000C0035FD69406001173E200919F1200712B +:106AC000E1FDFF54800B8012F6FFFF17FD7BBEA98E +:106AD000FD030091F35301A913E47A92740201912A +:106AE000E10314AAE00313AA04EDFF97E10314AA3B +:106AF000E00313AAF35341A9FD7BC2A8FEECFF17E4 +:106B0000FF4309D1FD7B00A9FD030091F55B02A9BC +:106B1000F60301AAF35301A9F30300AAD4FE44D358 +:106B2000F76303A9180080D2F96B04A943EDFF971E +:106B3000D9FE43D3F703002AFA630191F503182A1B +:106B4000F40200B5780240F97F0200F977000034C2 +:106B5000E00313AADEFFFF97600240F9600600B46D +:106B6000A07E4093E2630191210080D2780200F977 +:106B7000000400D13F0301EB88020054E00314AA93 +:106B8000FD7B40A9F35341A9F55B42A9F76343A9F3 +:106B9000F96B44A9FF430991C0035FD681F27DD30D +:106BA000600E148B626A61F8427B38F8E20334AA03 +:106BB000626A21F857000034C5FFFF9794FE4193A5 +:106BC00018070091DEFFFF1723F07DD321F87FD354 +:106BD000447860F8646A23F8E6FFFF1754F07DD329 +:106BE000E103002A837860F8000400D1656A74F834 +:106BF000636A34F8E30322AA42F87FD37F0005EBEF +:106C0000C0010054207C4093000400D13F0302EBFC +:106C100069FBFF5441F07DD342F87FD3837860F85D +:106C2000636A21F8F9FFFF17A0060051E4630191A0 +:106C3000220080D2007C40933F0302EB08FDFF540A +:106C4000F40316AA780200F9CDFFFF17FD7BBAA95D +:106C5000FD030091F35301A9F40301AAF55B02A916 +:106C6000F76303A9F70301AA210C0091F96B04A9AA +:106C7000FA0303AAFB7305A9191840F9FB2640384B +:106C800020E05F383C5B41290000005233F05F3860 +:106C900058001C4B1603164B1300332AC212005126 +:106CA000D60E0051E00317AA731E0012427C4093D7 +:106CB000E41A0094E1CA7638F503002A220F80B95D +:106CC000E0C2368B7B03012A00040091210B40F9BE +:106CD00073021B2A731E0012DA1A0094B502002AEE +:106CE000B502132AF5010035E1031AAA827F409309 +:106CF00080C2388BD31A00941F000071810180126A +:106D00000000811AF35341A9F55B42A9F76343A937 +:106D1000F96B44A9FB7345A9FD7BC6A8C0035FD6E8 +:106D2000A0028012F8FFFF17FD7BB6A9FD030091BA +:106D3000F35301A9F55B02A9F76303A9F96B04A951 +:106D4000FB2B00F9172440F9040FF837F40300AACD +:106D5000F60301AAFB0302AAE103042AF503032AAE +:106D6000F303042AE00317AA030080D2C20000B094 +:106D70004224229120130094E10300AA801640F9D6 +:106D80000D1A009440010034A0018012BF0300914D +:106D9000F35341A9F55B42A9F76343A9F96B44A9F1 +:106DA000FB2B40F9FD7BCAA8C0035FD6E103132A81 +:106DB00003008052E00317AAC20000B042283B91B2 +:106DC0005C160094E103132A03008052C20000B055 +:106DD000425C3B91A09700B9E00317AA55160094B6 +:106DE000A09300B9A3B30191E103132AE00317AA0A +:106DF000C20000B042983B91FF120094A04700F9F6 +:106E0000800000B4A06F40B91F1C007148000054FE +:106E1000BF4700F9E103132A030080D2E00317AA59 +:106E200018018052C20000B042CC3B91B89B00B91F +:106E3000F1120094E103132A030080D2C20000B0D3 +:106E400042FC3B91A04300F9E00317AAEA12009428 +:106E5000A03F00F9A19740B981F9FF34A24340F95E +:106E600042F9FFB420F9FFB4802240F9F703009102 +:106E7000824E43A9190840B95B0500B4DF0200F156 +:106E8000441840FAE0040054D30400B4210CD81A8A +:106E90003F00156B21020054BF020871E801005445 +:106EA000E003152A5A0840B9003C0091A2C30191A1 +:106EB00000707C9201008052FF6320CB4009805219 +:106EC000F80300917D2F0094C0000034C00000B092 +:106ED00000343C91411F0094A00280120F00001466 +:106EE000A03B40F9E4030091A3E30191E203152ADA +:106EF000E1031BAAE64C009400010035650640F949 +:106F0000E4031A2AE30316AAE203192AE10318AAE2 +:106F1000E00314AAA0003FD6FF0200919CFFFF17D8 +:106F200080008012FDFFFF170001801298FFFF17FD +:106F3000FD7BB4A9FD030091F35301A9F55B02A900 +:106F4000F50300AAF60301AAF76303A90100805222 +:106F5000F70302AAF96B04A9C20000B0F803032AE0 +:106F6000192440F942182591E00319AA111200943E +:106F7000E007F837A45240B99F0400316001005483 +:106F8000E303182AE20317AAE10316AAE00315AAED +:106F9000F35341A9F55B42A9F76343A9F96B44A9EF +:106FA000FD7BCCA861FFFF17A30640F9F403002A7C +:106FB000810C80D2E0630191C20000B0420C3B9191 +:106FC000B51E0094E2630191E103142AE00319AABB +:106FD000F8110094E303182AE403002AFA03002AB4 +:106FE000E20317AAE10316AAE00315AA4FFFFF97D1 +:106FF000F303002AE0020034FF5700B9E103142A2A +:10700000E2530191E00319AAE9100094F403002A65 +:107010000002F837E05740B91F000071AD0100547D +:107020001F040071C1FEFF549F021A6B80FEFF54C3 +:10703000E403142AE303182AE20317AAE10316AAB9 +:10704000E00315AA39FFFF97F303002A80FDFF35FF +:10705000E003132AF35341A9F55B42A9F76343A95F +:10706000F96B44A9FD7BCCA8C0035FD63300801226 +:10707000F8FFFF17FD7BBDA9FD030091F35301A9A4 +:10708000F30300AAF40303AAF51300F9F503042A95 +:10709000002040F9030840B9607C4093003C009117 +:1070A00000EC7C92FF6320CB601A40F9040840B9E1 +:1070B0007F00046BEA000054A0028012BF0300911D +:1070C000F35341A9F51340F9FD7BC3A8C0035FD674 +:1070D000040C40F9E3030091000040F980003FD622 +:1070E000C0FEFF37E303152AE20314AAE10300916F +:1070F000E00313AA8FFFFF97F1FFFF1702008052F2 +:10710000040080D2030040B97F00026B48000054A5 +:10711000C0035FD6235862B86300048B040440F9AF +:10712000845862B8630004CB235822B8420400118B +:1071300064FC6093F4FFFF17EA0302AAE80303AAC2 +:1071400003008052020040B95F00036BC800005486 +:10715000020040B9070080525F00076B280200540C +:10716000C0035FD63F5823B863040011F6FFFF1732 +:10717000C37C7ED3225866B8C60400114200048B3B +:10718000046963B86409A49B020440F9426863B8C7 +:107190002215A29B4540248B25682CB80E000014B4 +:1071A000FD7BBFA9FD030091220040B9260080525B +:1071B0004B5967B8040140B9090440B9030440F9C8 +:1071C0006409A49B650040B9827C4092297D041B20 +:1071D0002509A59BC3040051020040B984FC60D37B +:1071E000A5FC60D36CF47ED32308038BDF00026B15 +:1071F00003FCFF548400058B640000B9FF8344EB5B +:1072000040000054BEFFFF97020040B9E7040011A0 +:107210005F00076BA8FCFF54FD7BC1A8C0035FD6CD +:1072200021C8228B030080D224CC5FB88408C05AC6 +:10723000047823B8630400915F00036B6CFFFF5474 +:10724000C0035FD6FD7BB5A9FD030091F35301A9EF +:10725000F55B02A9F76303A9F96B04A9FB7305A900 +:10726000A33B00F9020D00B4F503012AF70300AABD +:10727000410840F9F30302AA406C4329BB031229D9 +:10728000410900B4A0230291020180D23A1900946E +:10729000A44740F9840CC0DAA43700F9A45700F9D8 +:1072A0007B0B0034610640F9210B00B4650240F904 +:1072B000E50A00B4600320511F002071880A0054C1 +:1072C0007B7F0553BB9300B9E2031B2A746B7ED30B +:1072D000933E0091941200D173667C92FF6333CB8E +:1072E000E0030091FF6333CBF6030091A0DB09A913 +:1072F000CCFFFF97E00316AAE10305AAC9FFFF9799 +:10730000A0767E92003C0091E10317AA00707C9267 +:10731000FF6320CBE003152AF8030091E20300AAE3 +:10732000F7030091A03F00F9E00318AA1219009496 +:10733000FF6333CB1403148BF9030091FF6333CB4A +:10734000FC030091FF6333CBF5030091FF6333CB64 +:10735000A43740F9FA030091000080D262008092C5 +:10736000017C029B816A61B82108C05A217B20B848 +:10737000000400917F03006B48FFFF54040100B438 +:10738000E00304AA3300805200FC41D3400400B45F +:10739000730600117F06017181FFFF54B302801252 +:1073A000FF0200914D000014E4830032BBFFFF1781 +:1073B00062FFFF97A35740F98222D39A7F00026AA7 +:1073C000E0000054E3031AAAE20315AAE1031CAA91 +:1073D0005AFFFF97730600511D000014A29340B995 +:1073E000E0031CAA42F47ED3E3180094FAFFFF17CF +:1073F000A05A61B8210400510008C05A404400B8A6 +:10740000310000141301801234000014B301801203 +:10741000320000147F06007120FCFF5404FC073684 +:10742000E20319AAA0430291E30316AAE1031CAAEE +:1074300042FFFF97730A0051A29340B9E0031AAAD2 +:10744000340080D242F47ED3CB180094E3031CAA0C +:10745000E2031CAAE10315AAA0430291B3FAFF3587 +:1074600036FFFF97E1031CAAE30319AAE20315AA5A +:1074700032FFFF97B49340B9E00315AA827E7ED312 +:10748000BD18009484060051A04F40F9847C4093BD +:10749000E400F837A27A64B8017864B85F00016B41 +:1074A000C3000054840400D149FFFF54E10315AA2E +:1074B000A043029112FFFF97A19340B9E20318AADB +:1074C0002104005161F9FF36A00B47A9FF0200918A +:1074D000E10318AAA8180094BF030091E003132A3F +:1074E000F35341A9F55B42A9F76343A9F96B44A99A +:1074F000FB7345A9FD7BCBA8C0035FD65F0000717D +:107500004D050054FD7BBCA9FD030091F35301A977 +:10751000F30301AAF403022AE1C30091F55B02A977 +:10752000F50303AA4BFDFF97C0020035E01B40F9AD +:10753000E1E30091021040F940003FD620020035FF +:107540009406005116008052E00743A9630A40B92F +:10755000620240F9051440F99F02166BAC01005419 +:1075600024008052A0003FD6C0000035E00743A9A8 +:10757000E20315AA030840B9041840F980003FD679 +:10758000F35341A9F55B42A9FD7BC4A8C0035FD6B4 +:107590000400805273420091A0003FD620FFFF35C7 +:1075A000D6060011E9FFFF17A0028012C0035FD6C4 +:1075B000216084D21F7C00A9A1E8ACF22171D5F230 +:1075C000A1F9FDF2010800F9C19F9BD24117B3F266 +:1075D000C18ECAF24106E2F2010C00F9013E9C5252 +:1075E000417AB872012000B9C0035FD6FD7BB5A90E +:1075F000FD030091F35301A9F55B02A9F76303A909 +:10760000F96B04A9FB7305A9E27300B9E203022A2E +:10761000C201003423338FD224749DD2859B97D22C +:10762000C63A98D24350ABF224DBADF265E3B1F237 +:10763000464CB9F2E27340B942040051E27300B91A +:107640005F04003101010054F35341A9F55B42A9E5 +:10765000F76343A9F96B44A9FB7345A9FD7BCBA84C +:10766000C0035FD6220040392100019127105C3809 +:107670002A305C3831705C38472007AA22205C38F9 +:1076800036B05C3835F05C38E24002AA27505C38EE +:107690004A600AAA34305D384209C05AE2AF00B9E4 +:1076A00022405C384A09C05A30705D382FB05D38CE +:1076B000472007AA22605C38E24002AA27905C3883 +:1076C000516011AA220AC05AE2AB00B922805C388C +:1076D000310AC05A472007AA22A05C38E24002AA19 +:1076E00027D05C38566016AA22C05C38C90AC05A36 +:1076F000D60AC05A472007AA22E05C38E24002AA14 +:1077000027105D38556015AA22005D38BC0AC05AA2 +:10771000B50AC05A472007AA22205D38E24002AAD3 +:1077200027505D38546014AA820AC05AE2A700B9F3 +:1077300022405D38940AC05A472007AA22605D386B +:10774000E24002AA27905D38506010AA020AC05A8F +:10775000E2A300B922805D38100AC05A1002038BE0 +:10776000472007AA22A05D38E24002AA4F600FAA74 +:10777000E209C05AE29F00B922C05D3827D05D38C7 +:107780002EF05D382D305E38472007AA22E05D38A4 +:107790002C705E382BB05E38E24002AA27105E38AB +:1077A0004E600EAA28F05E38C209C05AE29B00B9AA +:1077B00022005E3833505F38472007AA22205E3807 +:1077C000E24002AA27505E384D600DAA22405E3882 +:1077D000BA09C05AAD09C05AAD01038B472007AAA8 +:1077E00022605E38E24002AA27905E384C600CAA04 +:1077F00022805E389909C05A472007AA22A05E3825 +:10780000E24002AA27D05E384B600BAA22C05E3845 +:107810007809C05A6B09C05A6B01038B422007AA32 +:1078200027E05E38424007AA27105F38486008AA60 +:107830000209C05AE29700B922005F380809C05A0D +:10784000422007AA27205F38424007AA27305F3826 +:10785000476007AAE208C05AE29300B922405F38A5 +:10786000E708C05A422013AA33605F38424013AA87 +:1078700033705F38426013AA5308C05AF37700B9D7 +:1078800033805F384208C05A37905F381E1C40B9B9 +:10789000732217AA37A05F38734217AA37B05F3830 +:1078A000776217AAF30AC05AF38F00B9F30AC05AD5 +:1078B00037D05F38F33F00F933C05F38732217AA1F +:1078C00037E05F38734217AA37F05F38776217AA3C +:1078D000F30AC05AF38B00B9F30AC05AF34300F914 +:1078E000131040B9F36300B9131440B9F36B00B936 +:1078F000F33340F9171840B97B7E7BD3F36340B96B +:10790000737E1B537B0313AAF3021E4AFE6B40B91E +:1079100073021E0A1E1C40B973021E4A7303138BA6 +:107920001B2040B97B403B8B7B021B8BF33740F91C +:107930004A011B8BFB6340B97E7E62D3F36B40B977 +:10794000737E0253DE0313AAF3021ECA7303130AE3 +:107950007B7F0253730217CAF702038B7102118BEC +:10796000131C40B97340338B3102138B537D1B536F +:1079700073160AAA7302118BF13340F9317E62D378 +:1079800031021BAADB0311CA7B030A8A7B031ECACE +:10799000DE03038B7603168BD702178B767E1B5381 +:1079A000D61613AAD602178B577D0253EA7A0AAA73 +:1079B00037020ACAF702138AF70211CA3102038B8F +:1079C000F502158B777E0253F37A13AABE021E8B43 +:1079D000570113CAD57E1B53B51616AAF702168A8D +:1079E000B5021E8BF7020ACAF402148B9402118BA3 +:1079F000B17E1B53311615AA3102148BD47E02536B +:107A0000967A16AA740216CA9402158A940213CAA8 +:107A100094020A8B2A7E1B539002108BB47E025371 +:107A2000947A15AA4A1511AA4A01108BD00214CAD9 +:107A30001002118A100216CA1302138BF009C05AE1 +:107A40001002038B4F7D1B537002108BEF150AAA97 +:107A5000EF01108B307E0253117A11AA900211CAE5 +:107A600010020A8A100214CA1302168BD009C05AD7 +:107A70001002038BEE7D1B537002108BCE150FAAE4 +:107A8000CE01108B507D0253107A0AAA2A0210CA26 +:107A90004A010F8A4A0111CA4A01148B4D010D8B0C +:107AA000CA7D1B534A150EAA4A010D8BED7D025368 +:107AB000AF790FAA0D020FCAAD010E8AAD0110CA2F +:107AC000B101118B8D09C05AAD01038B4C7D1B5345 +:107AD0002D020D8B8C150AAA8C010D8BCD7D0253C6 +:107AE000AD790EAAEE010DCACE010A8ACE010FCAE7 +:107AF000CE01108B507D0253CB010B8B8E7D1B531F +:107B0000107A0AAACE150CAACE010B8BAB0110CAB3 +:107B10006B010C8A0A01038B6B010DCA6B010F8B81 +:107B20008F7D0253EF790CAA6B010A8B0C020FCAEE +:107B3000CA7D1B538C010E8A4A150EAA8C0110CAED +:107B40004A010B8B8C010D8BCD7D0253AD790EAAB2 +:107B5000EB00038B8C010B8BEE010DCA4B7D1B538D +:107B6000CE010A8A6B150AAACE010FCA6B010C8BD3 +:107B7000CE01108B4C00038B50001A4ACE010C8BA7 +:107B80006C7D1B538C150BAA8C010E8B4E7D025302 +:107B9000CE790AAAAA010ECA4A010B8A4A010DCA65 +:107BA0004F010F8BEA3F40F94A01038BEF010A8B2B +:107BB0008A7D1B534A150CAA4A010F8B6F7D025315 +:107BC000EF790BAACB010FCA6B010C8A6B010ECAAD +:107BD0006D010D8BEB4340F96B01038BAD010B8BFA +:107BE0004B7D1B536B150AAA6B010D8B8D7D0253C8 +:107BF000AC790CAAEDAF40B92D010D4A0D020D4A2A +:107C0000B0FD5FD30D060DAAF0010CCA10020A8A5E +:107C100008010DCA10020FCA10020E8BAE01038BB1 +:107C200010020E8B6E7D1B53CE150BAACE01108B4E +:107C3000507D0253107A0AAAEA8F40B95101194ABD +:107C4000F3AB54298A030A4A6902094A2A020A4AFA +:107C500051FD5FD32A060AAA910110CA31020B8A8C +:107C6000E7000ACA31020CCA31020F8B4F01038BA5 +:107C700031020F8BCF7D1B53EF150EAAEF01118B35 +:107C8000717D02532B7A0BAAF18B40B93102184A4D +:107C90002902094A31FD5FD3290609AA11020BCA3C +:107CA00031020E8A420009CA310210CA31020C8B1D +:107CB0002C01038B31020C8BEC7D1B538C150FAA0E +:107CC0008C01118BD17D0253317A0EAAEEA340B9FB +:107CD000DC011C4A880308CA0E7D1F53C80508AA88 +:107CE0006E0111CACE010F8ACE010BCAD001108BD2 +:107CF0000E01038B10020E8B8E7D1B53CE150CAA2A +:107D0000CE01108BF07D0253107A0FAAEF9F40B97D +:107D1000EF01134AF3A340B9E70107CAEF7C1F53F1 +:107D2000E70507AA2F0210CAEF010CCAEF010B8B5F +:107D3000EB00048BEF010B8BCB7D1B536B150EAA55 +:107D40006B010F8B8F7D0253EF790CAAEC9B40B92E +:107D50008C01134A820102CA4C7C1F53820502AA7D +:107D60000C020FCA8C010ECA8C01118B5100048BBE +:107D70008C01118B717D1B5331160BAA31020C8BB8 +:107D8000CC7D02538E790EAAEC9F40B953030C4A66 +:107D90001A031A4AEC3F40F98C0108CA6C020CCA5B +:107DA000937D1F536C060CAAF3010ECA73020BCA13 +:107DB0007002108B9301048B1002138B337E1B53C4 +:107DC000731611AA7302108B707D02530B7A0BAAE3 +:107DD000F09B40B93403104AF04340F9100207CA3F +:107DE000900210CA147E1F53900610AAD4010BCA29 +:107DF000940211CA370110CA8F020F8B1402048B30 +:107E0000EF01148B747E1B53941613AA94020F8BEC +:107E10002F7E0253F17911AAAF0102CA4F030FCA94 +:107E2000FA7740B9F57D1F53AF060FAA750111CA45 +:107E3000B50213CAB5020E8BEE01048BB5020E8B90 +:107E40008E7E1B53CE1514AACE01158B757E025360 +:107E5000B37A13AAF59740B9B902194A55010CCA69 +:107E6000350315CAF99340B9B67E1F53D50615AA36 +:107E7000360213CAD60214CACB020B8BB602048B8D +:107E80006B01168BD67D1B53D6160EAAD6020B8B12 +:107E90008B7E0253747914AAEB9340B97801184A87 +:107EA000170317CAF89740B9EB7E1F53770517AA37 +:107EB0006B0214CA6B010ECA6B01118BF102048BA9 +:107EC0006B01118BD17E1B53311616AA31020B8B1D +:107ED000CB7D02536E790EAAEB7740B97801184A30 +:107EE0000B010FCA0B030BCA787D1F530B070BAA9C +:107EF00098020ECA180316CA1803138B7301048B59 +:107F00001803138B337E1B53731611AA7302188B3D +:107F1000D87E0253187B16AAF68F40B97B7E025397 +:107F2000D902194AF60015CA360316CA7B7B13AA72 +:107F3000D97E1F53360716AAD90118CA390311CAA8 +:107F40003903148BD402048B3903148B747E1B53B6 +:107F5000941613AA9402198B397E0253397B11AA05 +:107F6000F18B40B93A021A4A510017CA510311CA9B +:107F70003A7E1F53510711AA1A0319CA5A0313CA8A +:107F80004E030E8B3A02048BCE011A8B9A7E1B5342 +:107F90005A1714AA5A030E8BEE3F40F9D3010DCAAB +:107FA0008E010BCA6E020ECAAD0109CA290107CAA9 +:107FB000E7000CCAD37D1F538C010FCA6E060EAAB0 +:107FC00033031BCA730214CA7302188BD801048BC3 +:107FD0007302188B587F1B5318171AAA1803138B98 +:107FE000937E0253747A14AAF34340F97C020ACABE +:107FF000130216CA930313CA4A0108CA080102CA27 +:10800000420010CA7C7E1F53100215CA930713AAA0 +:108010007C0314CA9C031ACA9903198B7C02048B33 +:1080200039031C8B1C7F1B539C1718AA9C03198BAC +:10803000597F02533A7B1AAAF90111CAB90119CA28 +:10804000EF0117CA2D7F1F53B90519AA8D021ACA4D +:10805000AD0118CAAD011B8B3B03048BAD011B8B1B +:108060009B7F1B537B171CAA7B030D8B0D7F025339 +:10807000B87918AAAD020ECA4D010DCAB5020BCAD5 +:10808000AA7D1F534D050DAA4A0318CA4A011CCAEE +:108090005401148BAA01048B94020A8B6A7F1B5330 +:1080A0004A151BAA4A01148B947F0253947A1CAA86 +:1080B000FC0213CA29011CCAF70216CA3C7D1F53D1 +:1080C000890709AA1C0314CA9C031BCA9C031A8BA8 +:1080D0003A01048B9C031A8B5A7D1B535A170AAA28 +:1080E0005A031C8B7C7F02539B7B1BAA7C0119CA01 +:1080F00008011CCA6B0111CA1C7D1F53880708AAFE +:108100009C021BCA9C030ACA9803188B1C01048B8F +:1081100018031C8B5C7F1B539C171AAA9C03188B9B +:10812000587D02530A7B0AAAD8020DCAF80018CA61 +:10813000D6020ECA077F1F53F80418AA67030ACA9B +:10814000E7001ACAF400148B0703048B9402078B10 +:10815000877F1B53E7141CAAE700148B547F02533C +:108160009A7A1AAA340209CA540014CA310213CAEC +:10817000827E1F53540414AA42011ACA42001CCA28 +:108180005B001B8B8202048B7B03028BE27C1B5304 +:10819000421407AA42001B8B9B7F02537B7B1CAAC5 +:1081A000DC0108CA8C030CCACE0119CA9C7D1F537E +:1081B0008C070CAA5C031BCA9C0307CA9C030A8B8E +:1081C0008A01048B9C030A8B4A7C1B534A1502AA22 +:1081D0004A011C8BFC7C0253877B07AA7C0218CACD +:1081E00010021CCA73020DCA1C7E1F53900710AAEE +:1081F0007C0307CA9C0302CA9A031A8B1C02048BD5 +:108200005A031C8B5C7D1B539C170AAA9C031A8B78 +:108210005A7C0253427B02AA3A0314CAFA011ACAD0 +:108220005E01028A390309CA4F7F1F53FA051AAA51 +:108230004F0102AAEF01078AEF011EAAEF011B8B73 +:108240005B03058BEF011B8B9B7F1B537B171CAACA +:108250007B030F8B4F7D0253EA790AAAAF010CCA48 +:10826000B5020FCA9E030A8AAD0108CAAF7E1F532A +:10827000F50515AA8F030AAAEF01028AEF011EAACB +:10828000EF01078BA702058BEF01078B677F1B535D +:10829000E7141BAAE7000F8B8F7F0253FC791CAAFF +:1082A0002F0110CAEF020FCA7E031C8A290118CAC7 +:1082B000F77D1F53EF060FAA77031CAAF7020A8A5D +:1082C000F7021EAAF702028BE201058BF702028B6E +:1082D000E27C1B53421407AA4200178B777F02539C +:1082E000F77A1BAA1B011ACA6B011BCAFE00178A68 +:1082F0007B7D1F536B070BAAFB0017AA7B031C8A0D +:108300007B031EAA6A030A8B7B01058B4A011B8B28 +:108310005B7C1B537B1702AA7B030A8BEA7C02530C +:10832000477907AA0A0315CACA020ACA5E00078A61 +:1083300018030CCA567D1F53CA060AAA560007AA7C +:10834000D602178AD6021EAADC021C8B5601058BA8 +:108350009C03168B767F1B53D6161BAAD6021C8B4A +:108360005C7C0253827B02AA9C020FCA31021CCAA7 +:108370007E03028A3C7E1F53910711AA7C0302AA46 +:108380009C03078A9C031EAA9C03178B3702058B4C +:108390009C03178BD77E1B53F71616AAF7021C8B6C +:1083A0007C7F02539B7B1BAA9C010BCACE011CCA7B +:1083B000DE021B8A8C011ACADC7D1F538E070EAAAF +:1083C000DC021BAA9C03028A9C031EAA9C03078B47 +:1083D000C701058B9C03078BE77E1B53E71417AA85 +:1083E000E7001C8BDC7E0253967B16AA1C020ACA8D +:1083F00073021CCAFE02168A7C7E1F53930713AABF +:10840000FC0216AA9C031B8A9C031EAA8203028BF1 +:108410007C02058B42001C8BFC7C1B539C1707AA1B +:108420009C03028BE27E0253577817AA420311CABB +:10843000220302CAFE00178A5A030FCA597C1F532F +:10844000220702AAF90017AA3903168A39031EAABD +:108450003B031B8B5900058B7B03198B997F1B53A7 +:1084600039171CAA39031B8BFB7C02537B7B07AAA1 +:10847000A7020ECAAD0107CA9E031B8AA77D1F5320 +:10848000ED040DAA87031BAAE700178AE7001EAABE +:108490003E7F1B53E700168BB601058BE700168B5A +:1084A000F60113CA360116CADE1719AADE03078BB6 +:1084B000877F0253FC781CAAC77E1F53F60416AAB6 +:1084C00027031CAA29031C8AE7001B8AE70009AAC4 +:1084D000C902058BE700178B770102CAE700098BF9 +:1084E000C97F1B5329151EAAEF010ACA2901078B50 +:1084F000277F0253F97819AA070114CAE70207CAAD +:10850000D703198A940210CA100215CAE87C1F53B7 +:10851000B5020BCA070507AAC80319AA08011C8AD5 +:108520006B0111CA170117AAE800058BF7021B8B14 +:10853000DB7F0253F702088B287D1B53081509AA1D +:108540007B7B1EAA0801178B57010DCA170317CA98 +:108550003E011B8A4A010ECAF87E1F53170717AA4D +:1085600038011BAA1803198A18031EAA18031C8BAA +:10857000FC02058B18031C8B1C7D1B539C1708AA3F +:108580009C03188B387D0253097B09AA380216CA4E +:10859000980218CA1E01098A310213CA147F1F5398 +:1085A000980618AA140109AA94021B8A94021EAA0A +:1085B0009402198B1903058B9402198B997F1B5315 +:1085C00039171CAA3903148B147D0253887A08AA20 +:1085D000D40107CA940114CA9E03088ACE0102CAB4 +:1085E0008C7E1F53940514AA8C0308AA8C01098A57 +:1085F0008C011EAA8C011B8B9B02058B8C011B8B93 +:108600003B7F1B537B1719AA7B030C8B8C7F025378 +:108610009C791CAA6C0217CA10020CCA3E031C8A61 +:1086200073020DCA0C7E1F53900510AA2C031CAABE +:108630008C01088A8C011EAA8C01098B0902058B0A +:108640008C01098B697F1B5329151BAA29010C8BEF +:108650002C7F0253997919AA4C0018CA4C030CCAF2 +:108660007E03198A420016CA9A7D1F534C070CAA32 +:108670007A0319AA5A031C8A5A031EAA5A03088BA2 +:108680008801058B5A03088B287D1B53081509AAFE +:1086900008011A8B7A7F02535A7B1BAABB0114CAAA +:1086A000B5021BCA3E011A8AAD0107CABB7E1F5321 +:1086B000750715AA3B011AAA7B03198A7B031EAA18 +:1086C0007C031C8BBB02058B9C031B8B1B7D1B53EC +:1086D0007B1708AA7B031C8B3C7D02539C7B09AA59 +:1086E000C90210CAE90109CA1E011C8AD60217CAAA +:1086F0002F7D1F53E90509AA0F011CAAEF011A8A51 +:10870000EF011EAAF901198B2F01058B39030F8B7D +:108710006F7F1B53EF151BAAEF01198B197D0253B5 +:10872000397B08AAE8000CCA680108CA7E03198AC6 +:10873000E70018CA0B7D1F53680508AA6B0319AA26 +:108740006B011C8A6B011EAA6B011A8B1A01058B27 +:108750006B011A8BFA7D1B535A170FAA5A030B8B06 +:108760006B7F02537B791BAAEB0215CA4B010BCA24 +:10877000F70214CA6A7D1F534B050BAA2A031BCAB2 +:108780004A010FCA5C011C8B6A01068B9C030A8B91 +:108790004A7F1B534A151AAA4A011C8BFC7D0253BF +:1087A0008F7B0FAA1C0309CA31021CCA180310CA06 +:1087B0003C7E1F53910711AA7C030FCA9C031ACA5F +:1087C0009C03198B3902068B9C03198B597D1B5313 +:1087D00039170AAA39031C8B5C7F02539A7B1AAAA9 +:1087E0009C0208CACE011CCA94020CCADC7D1F532D +:1087F0008E070EAAFC011ACA9C030ACA9C031B8B93 +:10880000DB01068B9C031B8B3B7F1B537B1719AA39 +:108810007B031C8B5C7D02539C7B0AAA0A020BCA59 +:108820006A020ACA100215CA537D1F536A060AAAB1 +:1088300053031CCA730219CA73020F8B4F01068BB4 +:1088400073020F8B6F7F1B53EF151BAAEF01138B66 +:10885000337F0253737A19AA990111CA220302CAFB +:108860008C0109CA597C1F53220702AA990313CA13 +:1088700039031BCA3A031A8B5900068B5A03198B0A +:10888000F97D1B5339170FAA39031A8B7A7F0253CC +:108890005A7B1BAABB020ECAAD011BCAB50208CA8D +:1088A000BB7D1F536D070DAA7B021ACA7B030FCA3B +:1088B0007C031C8BBB01068B9C031B8B3B7F1B53D8 +:1088C0007B1719AA7B031C8BFC7D02539C7B0FAA90 +:1088D0002F010ACACF020FCA29010BCAF67D1F5306 +:1088E000CF060FAA56031CCAD60219CAD602138B8A +:1088F000F301068BD602138B737F1B5373161BAACF +:108900007302168B367F0253D67A19AA190102CA4E +:10891000F90019CA080111CA277F1F53F90419AABF +:10892000870316CAE7001BCAE7001A8B3A03068BB7 +:10893000E7001A8B7A7E1B535A1713AA5A03078B28 +:10894000677F0253FB781BAA67010DCAF70207CAAB +:108950006B010ECAE77E1F53F70417AAC7021BCA92 +:10896000E70013CAE7001C8BFC02068BE7001C8B98 +:108970005C7F1B539C171AAA9C03078B677E0253CC +:10898000F37813AA27020FCA070307CA31020ACADB +:10899000F87C1F53070707AA780313CA18031ACADB +:1089A0001803168BF600068B1803168B967F1B5345 +:1089B000D6161CAAD602188B587F0253187B1AAA07 +:1089C000DA0119CA94021ACACE0102CA9A7E1F534A +:1089D000540714AA7A0218CA5A031CCA5B031B8BD9 +:1089E0009A02068B7B031A8BDA7E1B535A1716AA40 +:1089F0005A031B8B9B7F02537B7B1CAA5C0117CA0B +:108A000010021CCA4A010DCA1C7E1F53900710AAEF +:108A10001C031BCA9C0316CAEF0110CA9C03138BCC +:108A20001302068B9C03138B537F1B5373161AAAD6 +:108A30002F010FCA73021C8BDC7E0253967B16AA91 +:108A40005C0007CA9C011CCAE97D1F532F050FAAB1 +:108A50008C7F1F53E901068B9C051CAA6C0316CA68 +:108A60008C011ACA39031CCA8C01188B9803068B17 +:108A70008C01188B787E1B53181713AA190119CA79 +:108A800018030C8B4C7F02539A791AAAAC0114CAB2 +:108A9000B5020CCA287F1F53190519AAE7000FCA8F +:108AA000AC7E1F532803068B950515AACC021ACA63 +:108AB0008C0113CAF70215CA9B011B8BAC02068BF3 +:108AC0007B030C8B0C7F1B538C1518AA6B0117CAE8 +:108AD0008C011B8B7B7E02537B7B13AAE70011CAA0 +:108AE00053031BCA940219CA730218CAEF7C1F539E +:108AF0007302168BEF0507AA7302098B897D1B533E +:108B000029150CAAEF01068B2901138B137F025341 +:108B1000737A18AACE0114CA760313CAD6020CCAF5 +:108B2000C27D1F53D6021A8B4E040EAAD602088BA2 +:108B3000287D1B53081509AACE01068B0801168B48 +:108B4000967D0253D67A0CAA6C7D1F53750216CA05 +:108B50008B050BAAB50209CA6C01068BB5021B8BEB +:108B600010020BCAB5020C8B0C7D1B538C1508AA86 +:108B70004A0110CA8C01158B357D0253A97A09AAC6 +:108B8000C70209CAE70008CAE700138BEF01078B89 +:108B9000877D1B53E7140CAAE7000F8B0F7D025350 +:108BA000E87908AA220108CA42000CCA4200168BC2 +:108BB000CE01028BE27C1B53421407AA4E000E8B9F +:108BC000827D02534C780CAA427D1F534A040AAAA4 +:108BD00002010CCA420007CA4A01068B4200098BF7 +:108BE000E96340B94A01028BC27D1B5342140EAAAD +:108BF000E708871342000A8B2201020B021000B91A +:108C0000E26B40B942000E0B021400B9021840B9E1 +:108C1000E700020B021C40B942000C0B07080329B5 +:108C2000022040B94200080B022000B982FAFF1767 +:108C3000FD7BBBA9FD030091F35301A9F40300AA36 +:108C4000F303022AF55B02A916088052F50301AA74 +:108C5000F76303A9F92300F9000040F917144092C3 +:108C60004000000B800200F9F903172AD602174BC7 +:108C70001F4022EB82000054800640F9000400915E +:108C8000800600F9FF0200F1C212537AC8010054B5 +:108C900073020151E10315AA98920091B502168B57 +:108CA0003303130B0003178B170080D2E20316AABD +:108CB000B1120094E10318AAE00314AA2200805222 +:108CC0004BFAFF97627E0653E10315AAE00314AA4C +:108CD00047FAFF97621600728001005473667A9219 +:108CE00080920091A102138B0000178BF35341A9CE +:108CF00042144092F55B42A9F76343A9F92340F976 +:108D0000FD7BC5A89C120014F35341A9F55B42A951 +:108D1000F76343A9F92340F9FD7BC5A8C0035FD6DB +:108D200042000034C3FFFF17C0035FD6FD7BBDA91F +:108D3000FD030091F35301A9F40301AAF30300AA70 +:108D4000010840A923FC5DD3620C02AA030780D26C +:108D50004208C05AE22B00B922F07DD32114409280 +:108D6000630001CB3FDC00F14208C05AE22F00B99A +:108D7000020F80D2420001CB4280839AC100009052 +:108D800021E00591E7FFFF97E1A30091E00313AA1B +:108D900002018052A7FFFF97604E403980020039E0 +:108DA0006026407980060039601240B9007C085383 +:108DB000800A0039601240B9800E0039605E403987 +:108DC00080120039602E407980160039601640B953 +:108DD000007C0853801A0039601640B9801E0039A3 +:108DE000606E403980220039603640798026003933 +:108DF000601A40B9007C0853802A0039601A40B9D3 +:108E0000802E0039607E403980320039603E4079E2 +:108E100080360039601E40B9007C0853803A003922 +:108E2000601E40B9803E0039608E40398042003972 +:108E30006046407980460039602240B9007C085382 +:108E4000804A0039602240B9804E0039F35341A96D +:108E5000FD7BC3A8C0035FD6FD7BB5A9FD030091D0 +:108E6000F35301A9F30300AA7442218BE02301917B +:108E7000F55B02A9F603032AF71B00F9F70302AA20 +:108E8000CCF9FF977F0214EB23010054E10317AAEA +:108E9000E0230191A6FFFF97F35341A9F55B42A997 +:108EA000F71B40F9FD7BCBA8C0035FD6950213CB1F +:108EB000E10313AADF02156BE0230191D532951A65 +:108EC000E203152A73C2358B96FFFF9723F6FF97AF +:108ED000EDFFFF17E1CC9C521F7C00292141AD72B0 +:108EE000010800B9A1D09552E16CB772010C00B92C +:108EF000416E9E52C18DA772011000B941A79E52CA +:108F0000E1A9B472011400B9E14F8A52C121AA72D9 +:108F1000011800B981118D52A160B372011C00B912 +:108F200061359B5261F0A372012000B921A39952CF +:108F3000017CAB72012400B9C0035FD6FD7BB9A9E7 +:108F4000FD030091F35301A9F55B02A9F76303A99F +:108F5000F96B04A9FB7305A9E26F00B9E203022AC9 +:108F6000C2000034E26F40B942040051E26F00B920 +:108F70005F04003101010054F35341A9F55B42A99C +:108F8000F76343A9F96B44A9FB7345A9FD7BC7A807 +:108F9000C0035FD6220040392100019123105C38C4 +:108FA00037305C3838705C38432003AA22205C38A4 +:108FB0003AB05C3839F05C38624002AA23505C3821 +:108FC000576017AA22405C3834305D38F70AC05A1F +:108FD00033705D38422003AA23605C383EB05D38B0 +:108FE00031F05D38424003AA23905C38586018AADB +:108FF00022805C38180BC05A422003AA23A05C3898 +:10900000424003AA23D05C385A601AAA22C05C38B6 +:109010005A0BC05A422003AA23E05C38424003AAFC +:1090200023105D38596019AA22005D38390BC05AE7 +:10903000422003AA23205D38424003AA23505D3812 +:10904000546014AA22405D38940AC05A422003AAF0 +:1090500023605D38424003AA23905D38536013AA11 +:1090600022805D38730AC05A422003AA23A05D38CB +:10907000424003AA23D05D385E601EAA22C05D383C +:10908000DE0BC05A422003AA23E05D38424003AA07 +:10909000516011AA22005E3823105E38310AC05A8E +:1090A00030305E382F705E38422003AA23205E38AD +:1090B0002EB05E382DF05E38424003AA23505E3851 +:1090C000506010AA22405E382B305F38100AC05A18 +:1090D0002A705F38422003AA23605E382CB05F38C4 +:1090E00036F05F38424003AA23905E384F600FAAE3 +:1090F00022805E38EF09C05A422003AA23A05E38BE +:10910000424003AA23D05E384E600EAA22C05E38C9 +:10911000CE09C05A422003AA23E05E38424003AA87 +:1091200023105F384D600DAA22005F38AD09C05A88 +:10913000422003AA23205F38424003AA23505F380D +:109140004B600BAA22405F386B09C05A422003AA29 +:1091500023605F38424003AA23905F384A600AAA1E +:1091600022805F384A09C05A422003AA23A05F38F0 +:10917000424003AA23D05F384C600CAA22C05F385B +:109180008C09C05A422003AA23E05F38424003AA58 +:10919000566016AA021840B9042040B9D60AC05A2F +:1091A00007184129432C82136318C24A6364C24AD8 +:1091B000021C40B94200044A041840B94200040AA3 +:1091C000042040B94200044A04F385526200020BB5 +:1091D000032440B94451A8726300040B040C40B945 +:1091E0004200030B031440B94200170BF7020F0BA8 +:1091F0006900020B030840B965348313A508C34A0C +:10920000A558C34A6300042A041040B96300040A45 +:10921000040840B98400060A6300042A2492885294 +:10922000A500030BE426AE72A500020B020C432935 +:109230004200034A4200090A4200034A032040B99F +:109240004200180B6300040BA43485134200030B87 +:10925000232D89136318C94A8408C54A6364C94A1F +:109260008458C54A4200030B031040B96800020B42 +:10927000030840B96300052A6300060A060840B9DE +:10928000C600050A6300062AE6799F528400030B94 +:10929000031840B98400020B021840B906B8B67230 +:1092A0004200094A4200080A4200034A031C40B92E +:1092B00042001A0B6300060BA600042A4200030BAF +:1092C000032D88136318C84AC600070A6364C84A96 +:1092D000A700040A4200030B030C40B9C600072A8A +:1092E0002701084A7B00020B833484136308C44AB5 +:1092F000E7001B0A6358C44AE700094A6300060BEB +:10930000A6749B526300020B021840B9E700190BC8 +:10931000A636BD724200060B9500032AE700020B39 +:10932000622F9B134218DB4A9C00030A4264DB4A0B +:10933000B502050AE700020B020840B9B5021C2A73 +:109340004600070B623483134208C34A4258C34A9B +:109350004200150B4200070B07011B4AE700060AF3 +:109360007500022AE700084A7C00020AE700090BA0 +:10937000694B9852C92AA7728902090BE700090BA9 +:10938000C92C86132919C64AB502040A2965C64A9A +:10939000B5021C2AE700090B493482132909C24A85 +:1093A000A500070B2959C24A2901150B2901070BF2 +:1093B0006703064AE700050A5500092AE7001B4A29 +:1093C0005C00090AE700080B283E8252283EAB7277 +:1093D0006802080BE700080BA82C85130819C54A7A +:1093E000B502030A0865C54AB5021C2AE700080B46 +:1093F000283589130809C94A8400070B0859C94A46 +:109400000801150BD500054AB502040A0801070B2F +:10941000B502064A87549052B5021B0BE747B27259 +:10942000C703070B3B01082AB502070B872C8413DF +:10943000E718C44A3C01080AE764C44A7B03020AED +:10944000B502070B07358813E708C84A7B031C2AB7 +:10945000E758C84A6300150BE7001B0BE700150B24 +:10946000B500044AB502030A1B01072AB502054AE2 +:109470001C01070AB502060BA6DA8B528663B57289 +:109480002602060BB502060B662C8313C618C34AC8 +:109490007B03090AC664C34A7B031C2AB502060B78 +:1094A000E6348713C608C74A4200150BC658C74A98 +:1094B000C6001B0BC600150B9500034AB502020A35 +:1094C000FB00062AB502044AFC00060AB502050B99 +:1094D00005539552E500BB720502050BB502050B5D +:1094E000452C8213A518C24A7B03080AA564C24A08 +:1094F0007B031C2AB502050BC5348613A508C64A92 +:109500002901150BA558C64AA5001B0BA500150B74 +:109510007500024AB502090ADB00052AB502034AB2 +:10952000DC00050AB502040B24608B526450A27261 +:10953000E401040BB502040B242D89138418C94AD5 +:109540007B03070A8464C94A7B031C2AB502040B07 +:10955000A43485138408C54A0801150B8458C54AEC +:1095600084001B0B8400150B5500094AB502080A3C +:10957000BB00042AB502024ABC00040AB502030B70 +:10958000C3B790522386A472C301030BB502030B29 +:10959000032D88136318C84A7B03060A6364C84A0C +:1095A0007B031C2AB502030B833484136308C44A6B +:1095B000E700150B6358C44A63001B0B6300150BCF +:1095C0003501084AB502070A9B00032AB502094A79 +:1095D0009C00030AB502020B62B88F5282A1AA72E4 +:1095E000A201020BB502020BE22C87134218C74AF4 +:1095F0007B03050A4264C74A7B031C2AB502020B9F +:10960000623483134208C34AC600150B4258C34A4A +:1096100042001B0B4200150B1501074AB502060A52 +:109620007B00022AB502084A7C00020AB502090B37 +:1096300089AE8B52C957AE726901090BB502090B8D +:10964000C92C86132919C64A7B03040A2965C64A10 +:109650007B031C2AB502090B493482132909C24A2B +:10966000A500150B2959C24A29011B0B2901150B0D +:10967000F500064AB502050A5B00092AB502074A49 +:109680005C00090AB502080BC83F9652C81BB072AD +:109690004801080BB502080BA82C85130819C54A08 +:1096A0007B03030A0865C54A7B031C2AB502080B25 +:1096B000283589130809C94A8400150B0859C94A75 +:1096C00008011B0B0801150BD500054AB502040A59 +:1096D0003B01082AB502064A3C01080AB502070BFD +:1096E000E7D48052877BB3728701070BB502070B63 +:1096F000872C8413E718C44A7B03020AE764C44A30 +:109700007B031C2AB502070B07358813E708C84AF4 +:109710006300150BE758C84AE7001B0BE700150B61 +:10972000B500044AB502030A1B01072AB502054A1F +:109730001C01070AB502060B862E9E526633B872CC +:10974000C602060BB502060B662C8313C618C34A65 +:109750007B03090AC664C34A7B031C2AB502060BB5 +:10976000E6348713C608C74A4200150BC658C74AD5 +:10977000C6001B0B9B4D8C13C600150B154B981385 +:109780007B47CC4AB51ED84A7B2B4C4AB50E584A6B +:109790007503150BFB00062AB502170B9700034A49 +:1097A000F702020AFC00060AF702044A7B03080AD1 +:1097B000F702050B25388D526593BC72A502050B87 +:1097C000F702050B452C8213A518C24A7B031C2AFD +:1097D000A564C24A18030E0BF702050BC5348613A5 +:1097E000A508C64A2901170BA558C64AA5001B0B98 +:1097F000DB4E9613A500170B574B9A137B47D64A9F +:10980000F71EDA4A7B2B564AF70E5A4A7703170B94 +:10981000DB00052AF702180B7800024A1803090A30 +:10982000DC00050A1803034A7B03070A1803040B2C +:10983000C4F08852C4F7BD72E402040B1803040B91 +:10984000242D89138418C94A7B031C2A8464C94ABD +:109850005A030D0B1803040BA43485138408C54A5E +:109860000801180B8458C54A84001B0BBB4E951386 +:109870008400180B384B99137B47D54A181FD94AD7 +:109880007B2B554A180F594A7803180BBB00042A42 +:1098900018031A0B5A00094A5A03080ABC00040AA2 +:1098A0005A03024A7B03060A5A03030BC3B89352B6 +:1098B00023F8A1720303030B5A03030B032D881330 +:1098C0006318C84A7B031C2A6364C84A39030B0B1C +:1098D0005A03030B833484136308C44AE7001A0B4A +:1098E0006358C44A63001B0BFB4E971363001A0BAB +:1098F0009A4A94137B47D74A5A1FD44A7B2B574A1C +:109900005A0F544A7A031A0B9B00032A5A03190B65 +:109910003901084A3903070A9C00030A3903094A36 +:109920007B03050A3903020B823994528281A472A7 +:109930004203020B3903020BE22C87134218C74A79 +:109940007B031C2A4264C74A94020A0B3903020BA8 +:10995000623483134208C34AC600190B4258C34AF3 +:1099600042001B0B1B4F98134200190B794A9313AB +:109970007B47D84A391FD34A7B2B584A390F534A61 +:109980007903190B7B00022A3903140B1401074ACF +:109990009402060A7C00020A9402084A7B03040A25 +:1099A0009402090BE98D855229BDA5722903090B83 +:1099B0009402090BC92C86132919C64A7B031C2A59 +:1099C0002965C64A73020C0B9402090B49348213B1 +:1099D0002909C24AA500140B2959C24A29011B0BA7 +:1099E0005B4F9A132901140BD44B9E137B47DA4A21 +:1099F000941EDE4A7B2B5A4A940E5E4A7403140B63 +:109A00005B00092A9402130BF300064A7302050A4D +:109A10005C00090A7302074A7B03030A7302080BFE +:109A200048959052884EA9728802080B7302080B61 +:109A3000A82C85130819C54A7B031C2A0865C54A4A +:109A4000DE03160B7302080B283589130809C94A6F +:109A50008400130B0859C94A08011B0B3B4F99138B +:109A60000801130B334A91137B47D94A731ED14A1D +:109A70007B2B594A730E514A7303130B3B01082A7F +:109A800073021E0BDE00054ADE03040A3C01080ACD +:109A9000DE03064A7B03020ADE03070B873B95526F +:109AA0000796AB726702070BDE03070B872C841344 +:109AB000E718C44A7B031C2AE764C44ADE03070B89 +:109AC00007358813E708C84A63001E0BE758C84AE1 +:109AD000E7001B0BE7001E0B1E4A9013DE1FD04A47 +:109AE0001B01072ADE0F504A1C01070ADE03110B77 +:109AF000914E94133146D44A7B03090A312A544AC1 +:109B00007B031C2A3102150BDE03110BB100044A42 +:109B10003102030A3102054A3102060B461B9152FB +:109B200026DFAE72C603060B3102060B662C8313CA +:109B3000C618C34AC664C34A3102060BE63487130B +:109B4000C608C74A4200110BC658C74AC6001B0BBD +:109B5000C600110BF1498F13311ECF4AFB00062AB4 +:109B6000310E4F4AFC00060A3102100B704E93135F +:109B70001046D34A7B03080A102A534A7B031C2A47 +:109B80001002170B3102100B9000034A1002020A58 +:109B90001002044A1002050B452A8A52C507B37207 +:109BA0002502050B1002050B452C8213A518C24A8D +:109BB000A564C24A1002050BC5348613A508C64A1F +:109BC0002901100BA558C64AA5001B0BA500100BB8 +:109BD000D0498E13101ECE4ADB00052A100E4E4AC5 +:109BE000DC00050A10020F0BCF4F9E13EF45DE4A33 +:109BF0007B03070AEF295E4A7B031C2AEF01180B3F +:109C000010020F0B6F00024AEF01090AEF01034A2D +:109C1000EF01040BA4CD98522406B5720402040B84 +:109C2000EF01040B242D89138418C94A8464C94A9E +:109C3000EF01040BA43485138408C54A08010F0BF7 +:109C40008458C54A84001B0B84000F0BAF498D1349 +:109C5000EF1DCD4ABB00042AEF0D4D4ABC00040A9B +:109C6000EF010E0B2E4E9113CE45D14A7B03060A0F +:109C7000CE29514A7B031C2ACE011A0BEF010E0B91 +:109C80004E00094ACE01080ACE01024ACE01030B5A +:109C900003F984526300B672E301030BCE01030B98 +:109CA000032D88136318C84A6364C84ACE01030BA6 +:109CB000833484136308C44AE7000E0B6358C44A14 +:109CC00063001B0B63000E0B6E498B13CE1DCB4A3A +:109CD0009B00032ACE0D4B4A9C00030ACE010D0BBC +:109CE0000D4E9013AD45D04A7B03050AAD29504A6D +:109CF0007B031C2AAD01190BCE010D0B2D01084A67 +:109D0000AD01070AAD01094AAD01020BE2F88F521D +:109D100022EBB772C201020BAD01020BE22C8713DA +:109D20004218C74A4264C74AAD01020B623483132A +:109D30004208C34AC6000D0B4258C34A42001B0BDF +:109D40005B498A137B1FCA4A42000D0B7B0F4A4AAC +:109D5000ED4D8F137B030B0BAD45CF4A0B01074A2B +:109D6000AD294F4A6B01060AAD01140B6B01084A7D +:109D7000AD011B0B6B01090B697E815209DCB872C6 +:109D8000A901090B6B01090BC92C86132919C64AB5 +:109D90007B00022A2965C64A7C00020A6B01090B76 +:109DA000493482132909C24A7B03040A7B031C2A13 +:109DB0002959C24A29011B0BA5000B0B29010B0BCA +:109DC0008B498C136B1DCC4A5B00092A6B0D4C4AE6 +:109DD0005C00090A6B010A0BCA4D8E134A45CE4A34 +:109DE0007B03030A4A294E4A7B031C2A4A01130BB0 +:109DF0006B010A0BEA00064A4A01050A4A01074AB2 +:109E00004A01080BE8289252E8B4BA726801080BBC +:109E10004A01080BA82C85130819C54A0865C54ACC +:109E20004A01080B283589130809C94A84000A0B1E +:109E30000859C94A08011B0B08010A0BCA4A9613A4 +:109E40004A1DD64A3B01082A4A0D564A3C01080AD7 +:109E50004A010C0BAC4D8D138C45CD4A7B03020A95 +:109E60008C294D4A7B031C2A8C011E0B4A010C0BCA +:109E7000CC00054A8C01040A8C01064A8C01070BB0 +:109E8000276A8C5247D9A0724701070B8C01070B38 +:109E9000872C8413E718C44AE764C44A8C01070B73 +:109EA00007358813E708C84A63000C0BE758C84A0F +:109EB000E7001B0BE7000C0BAC4A95138C1DD54A31 +:109EC0001B01072A8C0D554A1C01070A8C01160B31 +:109ED000764D8B13D646CB4A7B03090AD62A4B4ACA +:109EE0007B031C2AD602110B8C01160BB600044A08 +:109EF000D602030AD602054AD602060BE62C855284 +:109F00002685A2728601060BD602060B662C8313E9 +:109F1000C618C34AC664C34AD602060BE634871382 +:109F2000C608C74A4200160BC658C74AC6001B0BD4 +:109F3000C600160BF64A9713D61ED74AFB00062A10 +:109F4000D60E574AFC00060AD602150B554D8A1349 +:109F5000B546CA4A7B03080AB52A4A4A7B031C2A2B +:109F6000B502100BD602150B9500034AB502020A82 +:109F7000B502044AB502050BA5508152E5F6A4725C +:109F8000C502050BB502050B452C8213A518C24A64 +:109F9000A564C24AB502050BC5348613A508C64A96 +:109FA0002901150BA558C64AA5001B0BA500150BCA +:109FB000154B9813B51ED84ADB00052AB50E584A32 +:109FC000DC00050AB502170B974D8C13F746CC4AF7 +:109FD0007B03070AF72A4C4A7B031C2AF7020F0B64 +:109FE000B502170B7700024AF702090AF702034A83 +:109FF000F702040B0427845264C3A572A402040B65 +:10A00000F702040B242D89138418C94A8464C94AB1 +:10A01000F702040BA43485138408C54A0801170B02 +:10A020008458C54A84001B0B8400170B574B9A13A6 +:10A03000F71EDA4ABB00042AF70E5A4ABC00040A8B +:10A04000F702180BD84E96131847D64A7B03060A18 +:10A05000182B564A7B031C2A18030E0BF702180B09 +:10A060005800094A1803080A1803024A1803030B88 +:10A0700083BF8D5283A5A972E302030B1803030B60 +:10A08000032D88136318C84A6364C84A1803030B76 +:10A09000833484136308C44AE700180B6358C44A26 +:10A0A00063001B0B6300180B384B9913181FD94A18 +:10A0B0009B00032A180F594A9C00030A18031A0B25 +:10A0C000BA4E95135A47D54A7B03050A5A2B554A6F +:10A0D0007B031C2A5A030D0B18031A0B3A01084A7A +:10A0E0005A03070A5A03094A5A03020B62A2815211 +:10A0F0000267AA720203020B5A03020BE22C8713B7 +:10A100004218C74A4264C74A5A03020B6234831397 +:10A110004208C34AC6001A0B4258C34A42001B0BEE +:10A1200042001A0B9A4A94135A1FD44A7B00022AFF +:10A130005A0F544A7C00020A5A03190BF94E97131E +:10A140003947D74A7B03040A392B574A7B031C2A19 +:10A1500039030B0B5A03190B1901074A3903060A75 +:10A160003903084A3903090B896A8E5249A1AC7236 +:10A170004903090B3903090BC92C86132919C64A4F +:10A180002965C64A3903090B493482132909C24A91 +:10A19000A500190B2959C24A29011B0B2901190BCA +:10A1A000794A9313391FD34A5B00092A390F534A5E +:10A1B0005C00090A3903140B144F98139446D84ACB +:10A1C0007B03030A942A584A7B031C2A94020A0B35 +:10A1D0003903140BF400064A9402050A9402074A54 +:10A1E0009402080B6857815248CDAE722803080BC1 +:10A1F0009402080BA82C85130819C54A0865C54A9E +:10A200009402080B283589130809C94A8400140BE5 +:10A210000859C94A08011B0B0801140BD44B9E13A3 +:10A22000941EDE4A3B01082A940E5E4A3C01080A4D +:10A230009402130B534F9A137346DA4A7B03020AB4 +:10A24000732A5A4A7B031C2A73020C0B9402130BC9 +:10A25000D300054A7302040A7302064A7302070B0D +:10A26000C72599524738B0728702070B7302070B54 +:10A27000872C8413E718C44AE764C44A7302070BA7 +:10A2800007358813E708C84A6300130BE758C84A24 +:10A29000E7001B0B3B4F9913E700130B334A911355 +:10A2A000731ED14A7B47D94A730E514A7B2B594AB8 +:10A2B00073021E0BBE00044ADE03030A7B03160B67 +:10A2C000DE03054A73021B0BDE03060BA6908552C4 +:10A2D000464EB2726602060BDE03060B662C831333 +:10A2E000C618C34A1B01072AC664C34A1C01070AD1 +:10A2F000DE03060BE6348713C608C74A7B03090A48 +:10A300007B031C2AC658C74AC6001B0B42001E0B03 +:10A31000C6001E0B1E4A9013DE1FD04AFB00062A01 +:10A32000DE0F504AFC00060ADE03110B914E941317 +:10A330003146D44A7B03080A312A544A7B031C2A3B +:10A340003102150BDE03110B9100034A3102020AA0 +:10A350003102044A3102050B25149D52E557B472AF +:10A36000C503050B3102050B452C8213A518C24A03 +:10A37000A564C24A3102050BC5348613A508C64A36 +:10A380002901110BA558C64AA5001B0BFB498F13C9 +:10A390007B1FCF4AA500110B7B0F4F4A714E9313C1 +:10A3A0007B03100B3146D34A7000024A312A534ACC +:10A3B0001002090A3102170B1002034A31021B0B6B +:10A3C0001002040B64C98C524403B5722402040BBE +:10A3D0001002040B242D89138418C94ADB00052AB6 +:10A3E0008464C94ADC00050A1002040BA4348513F6 +:10A3F0008408C54A7B03070A7B031C2A8458C54A84 +:10A4000084001B0B0801100B8400100BD0498E1325 +:10A41000101ECE4ABB00042A100E4E4ABC00040A8D +:10A4200010020F0BCF4F9E13EF45DE4A7B03060A47 +:10A43000EF295E4A7B031C2AEF01180B10020F0B59 +:10A440004F00094AEF01080AEF01024AEF01030B2E +:10A45000036E91526349B8720302030BEF01030BC1 +:10A46000032D88136318C84A6364C84AEF01030BBD +:10A47000833484136308C44AE7000F0B6358C44A4B +:10A4800063001B0B63000F0BAF498D13EF1DCD4A0B +:10A490009B00032AEF0D4D4A9C00030AEF010E0BAF +:10A4A0002E4E9113CE45D14A7B03050ACE29514A3F +:10A4B0007B031C2ACE011A0BEF010E0B2E01084A5A +:10A4C000CE01070ACE01094ACE01020B62348A523C +:10A4D00082EDB872E201020BCE01020BE22C87136F +:10A4E0004218C74A4264C74ACE01020B6234831342 +:10A4F0004208C34AC6000E0B4258C34A42001B0B17 +:10A5000042000E0B6E498B13CE1DCB4A7B00022AF4 +:10A51000CE0D4B4A7C00020ACE010D0B0D4E90135E +:10A52000AD45D04A7B03040AAD29504A7B031C2A5F +:10A53000AD01190BCE010D0B0D01074AAD01060A45 +:10A54000AD01084AAD01090B29039D524932BA7287 +:10A55000C901090BAD01090BC92C86132919C64A7B +:10A560002965C64AAD01090B493482132909C24A3B +:10A57000A5000D0B2959C24A29011B0B29010D0BFE +:10A580004D498A13AD1DCA4A5B00092AAD0D4A4ADE +:10A590005C00090AAD010B0BEB4D8F136B45CF4AE5 +:10A5A0007B03030A6B294F4A7B031C2A6B01140BA4 +:10A5B000AD010B0BEB00064A6B01050A6B01074A64 +:10A5C0006B01080B88C4805228D3BA72A801080B0B +:10A5D0006B01080BA82C85130819C54A0865C54AE4 +:10A5E0006B01080B283589130809C94A84000B0B35 +:10A5F0000859C94A08011B0B08010B0B8B498C1326 +:10A600006B1DCC4A3B01082A6B0D4C4A3C01080AE1 +:10A610006B010A0BCA4D8E134A45CE4A7B03020AD0 +:10A620004A294E4A7B031C2A4A01130B6B010A0B71 +:10A63000CA00054A4A01040A4A01064A4A01070BB0 +:10A64000A7B08652C781BE726701070B4A01070B8C +:10A65000872C8413E718C44AE764C44A4A01070BED +:10A6600007358813E708C84A63000A0BE758C84A49 +:10A67000E7001B0BE7000A0BCA4A96134A1DD64A8D +:10A680001B01072A4A0D564A1C01070A4A010C0BF6 +:10A69000AC4D8D138C45CD4A7B03090A8C294D4A5C +:10A6A0007B031C2A8C011E0B4A010C0BAC00044AD4 +:10A6B0008C01030A8C01054A8C01060B060E94528C +:10A6C000460DA2724601060B8C01060B662C831305 +:10A6D000C618C34AC664C34A8C01060BE634871306 +:10A6E000C608C74A42000C0BC658C74AC6001B0B17 +:10A6F000C6000C0BAC4A95138C1DD54AFB00062AEC +:10A700008C0D554AFC00060A8C01160B764D8B13F6 +:10A71000D646CB4A7B03080AD62A4B4A7B031C2A1F +:10A72000D602110B8C01160B9600034AD602020AC0 +:10A73000D602044AD602050BC52298528534A3726C +:10A740008501050BD602050B452C8213A518C24ABC +:10A75000A564C24AD602050BC5348613A508C64AAD +:10A760002901160BA558C64AA5001B0BA500160B00 +:10A77000F64A9713D61ED74ADB00052AD60E574A4B +:10A78000DC00050AD602150B554D8A13B546CA4A98 +:10A790007B03070AB52A4A4A7B031C2AB502100B21 +:10A7A000D602150B7500024AB502090AB502034A22 +:10A7B000B502040B04818D52E4C6A372C402040BDB +:10A7C000B502040B242D89138418C94A8464C94A2C +:10A7D000B502040BA43485138408C54A0801150B7F +:10A7E0008458C54A84001B0B8400150B154B981325 +:10A7F000B51ED84ABB00042AB50E584ABC00040A4C +:10A80000B502170B974D8C13F746CC4A7B03060A0B +:10A81000F72A4C4A7B031C2AF7020F0BB502170BD1 +:10A820005700094AF702080AF702024AF702030B27 +:10A8300083E98E5203E9A472A302030BF702030B10 +:10A84000032D88136318C84A6364C84AF702030BD0 +:10A85000833484136308C44AE700170B6358C44A5F +:10A8600063001B0B6300170B574B9A13F71EDA4A52 +:10A870009B00032AF70E5A4A9C00030AF702180BA2 +:10A88000D84E96131847D64A7B03050A182B564A0A +:10A890007B031C2A18030E0BF702180B3801084A19 +:10A8A0001803070A1803094A1803020BA2969752C5 +:10A8B0000296A672E202020B1803020BE22C871327 +:10A8C0004218C74A4264C74A1803020B6234831312 +:10A8D0004208C34AC600180B4258C34A42001B0B29 +:10A8E0004200180B384B9913181FD94A7B00022AD3 +:10A8F000180F594A7C00020A18031A0BBA4E951316 +:10A900005A47D54A7B03040A5A2B554A7B031C2A13 +:10A910005A030D0B18031A0B1A01074A5A03060AA9 +:10A920005A03084A5A03090B699681528923A77270 +:10A930000903090B5A03090BC92C86132919C64AA6 +:10A940002965C64A5A03090BA9001A0B453482131C +:10A95000A508C24AA558C24AA5001B0BA5001A0BA0 +:10A960009A4A94135A1FD44A5B00052A5A0F544A34 +:10A970005C00050A5903190BFA4E97135A47D74A38 +:10A980007B03030A5A2B574A7B031C2A5A030B0BDF +:10A9900039031A0BFA00064A5A03090A5A03074AEE +:10A9A0005A03080B4849955208DBA9722803080B83 +:10A9B0005A03080B282D89130819C94A0865C94A82 +:10A9C0005A03080B88001A0BA43485138408C54A5F +:10A9D0008458C54A84001B0B1B4F981384001A0B24 +:10A9E0007A4A93135A1FD34A7B47D84A5A0F534A7D +:10A9F0007B2B584A7B030A0B5A03140B74031A0B64 +:10AA0000DA00094A5A03080ABB00042A5A03064A14 +:10AA1000BC00040A4703070BFA4999529A73AB72B8 +:10AA20009A021A0BE7001A0B1A2D88135A1BC84AF0 +:10AA30007B03020A5A67C84A7B031C2AE7001A0BE9 +:10AA40007A00070B833484136308C44A6358C44AEA +:10AA500063001B0B6300070BC74B9E13E71CDE4A0A +:10AA60009B00032AE70C5E4A9C00030AE700130BD5 +:10AA7000334F99137346D94A7B03050A732A594AFF +:10AA80007B031C2A73020C0BE700130B3301084AEB +:10AA900073021A0A7302094A7302060B66FE8D528C +:10AAA000C605AD72E600060B7302060B462F9A131D +:10AAB000C618DA4AC664DA4A7302060B4600130B5C +:10AAC000623483134208C34A4258C34A42001B0BF4 +:10AAD0009B4E94137B47D44A4200130B7B2B544A62 +:10AAE000334A91137B03160B731ED14A16011A4A7F +:10AAF000730E514AD602060A73021E0BD602084A8A +:10AB000073021B0BD602090BC95D9052E991AE721C +:10AB10006902090BD602090BC92C86132919C64AEA +:10AB20007B00022A2965C64A7C00020AD602090B6C +:10AB3000493482132909C24A7B03040A2959C24AAB +:10AB40007B031C2A29011B0BA500160B2901160BE0 +:10AB5000164A9013D61ED04A5B00090AD60E504AF8 +:10AB6000D102110BF64C8713D646C74AD62A474A5C +:10AB7000D602150B5503064AB502050A3102160B1B +:10AB8000B5021A4A5600092AB502080BE86D8C5224 +:10AB9000A814AF722802080BB502080BA82C851365 +:10ABA0000819C54AD602030A0865C54AD6021B2AF7 +:10ABB000B502080B283589130809C94A8400150B0A +:10ABC0000859C94A0801160BD600054A0801150B99 +:10ABD000F5498F13B51ECF4AD602040AB50E4F4A67 +:10ABE000D602064AB502100B704E93131046D34A94 +:10ABF000D6021A0B102A534A3A01080A1002170B00 +:10AC00003701082AB502100B90028F521099B072CA +:10AC1000B002100BD602100B902C8413101AC44AE9 +:10AC2000F702020A1066C44AF7021A2AD602100B6B +:10AC300010358813100AC84A6300160B105AC84A08 +:10AC40001002170B1002160BD6498E13D61ECE4AD1 +:10AC50001701100AD60E4E4ACF020F0B364E911333 +:10AC6000D646D14AD12A514A1601102A3102180B70 +:10AC7000D602090AEF01110BB100044A3102030A9E +:10AC8000D602172A3102054A3102060B06418052CC +:10AC9000E698B172E601060B3102060B662C8313AF +:10ACA000C618C34AC664C34A3102060B063690135F +:10ACB000C608D04A4200110BC658D04AC600160B2F +:10ACC000C600110BB1498D13311ECD4A1602060A7A +:10ACD000310E4D4A2E020E0BB14E95133146D54A18 +:10ACE000352A554A9100034A3102020AB502190B6E +:10ACF0003102044ACE01150B3102050B45FF9F526C +:10AD0000C517B272C501050B3102050B452C821324 +:10AD1000A518C24A1502062AA564C24AB502080A45 +:10AD20003102050BC5348613A508C64AB502162A9A +:10AD3000A558C64A2901110BA500150BA500110B3A +:10AD400071498B13311ECB4A310E4B4A2D020D0B2C +:10AD5000F14D8F133146CF4A2F2A4F4AD100052A91 +:10AD6000EF01140B3102100AAD010F0B6F00024A04 +:10AD7000EF01090AD400050AEF01034A3102142A3F +:10AD8000EF01040B649D8D52048AB472A401040B7C +:10AD9000EF01040B242D89138418C94A8464C94A1D +:10ADA000EF01040BA43485138408C54A08010F0B76 +:10ADB0008458C54A8400110B84000F0B4F498A1335 +:10ADC000EF1DCA4AEF0D4A4AE701070BEF7E945286 +:10ADD0002FDFB7726B010F0BEB000B0BC74D8E1300 +:10ADE000E744CE4AEE284E4A4700094ACE01030BFB +:10ADF000032D88136318C84AE700080AE700024ACF +:10AE00006364C84A6300070B6E010E0BCE01030B8F +:10AE1000A700042AE700060A833484136308C44A9F +:10AE2000AB00040AE7000B2A6358C44A6300070B0F +:10AE300087498C13E71CCC4A10020E0BEC0C4C4AD1 +:10AE4000471E8F5227CEB8724A01070B8C01130B95 +:10AE5000A74D8D13E744CD4A63000E0BED284D4AF4 +:10AE60002701084AAD01020B022E90134218D04A66 +:10AE7000E700100A8A010A0BE700094A4264D04A37 +:10AE80004D010D0B4200070B67348313AD01020B1C +:10AE90008200032AE708C34A4200050A8A00030A1F +:10AEA000E758C34A42000A2AE200020B070840B9E9 +:10AEB000E7000D0B4200070B020800B9020C40B975 +:10AEC0004200030B020C00B9021040B94200040B0F +:10AED000021000B9021440B94200050B021400B977 +:10AEE000021840B94200060B42000D0B021800B9CF +:10AEF000021C40B94200100B021C00B9022040B9EC +:10AF00004200080B022000B9022440B94200090B9C +:10AF1000022400B914F8FF17FD7BBCA9FD030091C2 +:10AF2000F35301A9F40300AAF303022AF55B02A973 +:10AF3000F60301AAF76303A917088052000040B97D +:10AF4000151400120000022B800200B9F702154B05 +:10AF500083000054800640B900040011800600B947 +:10AF6000BF020071E212537AE8010054E10316AA0D +:10AF700073020151D602178B98A20091E003152AA3 +:10AF8000B302130B15008052E20317AA0003008BD3 +:10AF9000F9090094E10318AAE00314AA22008052E0 +:10AFA000E7F7FF97627E0653E10316AAE00314AAAF +:10AFB000E3F7FF97621600728001005473667A927D +:10AFC00094A20091E003152AC102138B8002008B2A +:10AFD00042144092F35341A9F55B42A9F76343A998 +:10AFE000FD7BC4A8E4090014F35341A9F55B42A911 +:10AFF000F76343A9FD7BC4A8C0035FD642000034B9 +:10B00000C6FFFF17C0035FD6FD7BBDA903078052B3 +:10B01000FD030091F35301A9F40301AAF30300AA6D +:10B0200001084029427481134208C05AE22B00B93A +:10B0300022701D53211400126300014B3FDC00718C +:10B040004208C05AE22F00B9020F80524200014B61 +:10B050004280831AA10000F021200891E8FFFF97A9 +:10B06000E1A30091E00313AA02018052ABFFFF9716 +:10B07000602E403980020039601640798006003920 +:10B08000600A40B9007C0853800A0039600A40B960 +:10B09000800E0039603E403980120039601E4079D0 +:10B0A00080160039600E40B9007C0853801A0039C0 +:10B0B000600E40B9801E0039604E40398022003950 +:10B0C0006026407980260039601240B9007C085320 +:10B0D000802A0039601240B9802E0039605E403904 +:10B0E00080320039602E407980360039601640B9D0 +:10B0F000007C0853803A0039601640B9803E003920 +:10B10000606E4039804200396036407980460039AF +:10B11000601A40B9007C0853804A0039601A40B96F +:10B12000804E0039607E403980520039603E40795F +:10B1300080560039601E40B9007C0853805A00399F +:10B14000601E40B9805E0039608E403980620039EF +:10B150006046407980660039602240B9007C08531F +:10B16000806A0039602240B9806E0039609E4039A3 +:10B1700080720039604E407980760039602640B98F +:10B18000007C0853807A0039602640B9807E0039FF +:10B19000F35341A9FD7BC3A8C0035FD6FD7BB5A9CE +:10B1A000FD030091F35301A9F30300AA7442218B1C +:10B1B000E0230191F55B02A9F603032AF71B00F9CE +:10B1C000F70302AA44F7FF977F0214EB2301005410 +:10B1D000E10317AAE02301918CFFFF97F35341A9E4 +:10B1E000F55B42A9F71B40F9FD7BCBA8C0035FD6F6 +:10B1F000950213CBE10313AADF02156BE023019143 +:10B20000D532951AE203152A73C2358B7CFFFF975E +:10B2100052EDFF97EDFFFF17010040B900BA8152D0 +:10B22000C0BFBD723F00006B0001801200109F1A6A +:10B23000C0035FD68101F8372200022B420100547F +:10B24000032440B96308C05A5F00036BC800005470 +:10B25000020840B94208C05A41C0218B0000018B4E +:10B26000C0035FD6000080D2FEFFFF17FD7BBFA9A1 +:10B27000E70302AAE2008012FD030091E20000B998 +:10B28000E503012AE80300AA82008052EAFFFF9743 +:10B29000060040B940018012E00000B9C608C05A5B +:10B2A000C10400513F200071E8030054800000D029 +:10B2B000A4100011003008910048613861000010AE +:10B2C0002088208B00001FD6E103042A2200805230 +:10B2D000E00308AA8400020BD7FFFF97600000B4C8 +:10B2E0000000403920FFFF35840C001184741E12C9 +:10B2F000E40000B9E003062AFD7BC1A8C0035FD6C5 +:10B30000E103042AE00308AA82008052CAFFFF97E3 +:10B31000040040B9A53000118408C05AA400040BF1 +:10B32000F2FFFF1726018052F3FFFF17FD7BBEA936 +:10B33000FD030091E11F00B98100F8366000801222 +:10B34000FD7BC2A8C0035FD6E203012A5F0440F27E +:10B3500061FFFF54E2730091C5FFFF971F04007166 +:10B36000E1FEFF54E01F40B9F6FFFF17FD7BBEA9C9 +:10B37000FD030091E11F00B98100F83660008012E2 +:10B38000FD7BC2A8C0035FD6E203012A5F0440F23E +:10B3900061FFFF54E2730091B5FFFF971F0C00712E +:10B3A000E1FEFF54E01F40B9F6FFFF17FD7BBEA989 +:10B3B000EB0300AAEA0302AAFD030091FF1F00B9F4 +:10B3C000A100F837DAFFFF97E01F00B9E903002A70 +:10B3D0000002F837E91F40B9E2730091E0030BAABD +:10B3E000E103092AA2FFFF971F08007180010054A2 +:10B3F0001F240071200200541F040071C1FEFF547D +:10B400008A0000B4400140B900040011400100B9B5 +:10B41000E003092AFD7BC2A8C0035FD6CAFDFFB4C2 +:10B42000410140B921040051410100B941FDFF36FD +:10B43000E91F40B9F7FFFF17E91F40B9C900F83607 +:10B440003F21003161FEFF545F0100F129119F5A35 +:10B45000F0FFFF1709008012EEFFFF17FD7BBEA96A +:10B46000FD030091E2730091FF1F00B9D0FFFF9729 +:10B47000C000F837E11F40B93F04007100009F5A37 +:10B48000FD7BC2A8C0035FD600008012FDFFFF173E +:10B49000FD7BBEA9EC0300AA20008052FD030091B1 +:10B4A000E01F00B9E2730091E0030CAAC0FFFF9710 +:10B4B000E103002A2001F837E01F40B91F000071A6 +:10B4C000CD0000541F040071E1FEFF54E003012A87 +:10B4D000FD7BC2A8C0035FD601008012FCFFFF17EE +:10B4E000FD7BBDA9FD030091F35301A9F30300AA5D +:10B4F000347C4093E00302AAF55B02A9F50302AA9B +:10B500004D0800940004001194C220CB167C409397 +:10B510007402148B7F0214EBE9000054130080D2F4 +:10B52000E00313AAF35341A9F55B42A9FD7BC3A82D +:10B53000C0035FD6E20316AAE10315AAE00313AA2B +:10B54000C0080094E0FEFF3473060091F2FFFF177D +:10B55000021040B94208C05A41D0218B0000018B33 +:10B56000C0035FD6030840B96308C05A61C0218B8D +:10B570000000018B820000B4010440B92108C05AC8 +:10B58000410000B9C0035FD6FD7BBDA9FD0300915A +:10B59000F35301A9F40300AAF303012AE2B30091D3 +:10B5A000E103132AE00314AA31FFFF971F0C007177 +:10B5B000E0000054F32F40B91F2400710101005432 +:10B5C0007F0200714001801273B2801AE003132AD7 +:10B5D000F35341A9FD7BC3A8C0035FD61F100071C0 +:10B5E000E0FDFF5413008012F9FFFF17FD7BBEA999 +:10B5F000FD030091F35301A9F40302AA020C40B920 +:10B600004208C05A41C0218B1300018B940000B442 +:10B61000E00313AA08080094800200B9E00313AA0B +:10B62000F35341A9FD7BC2A8C0035FD6020080D2BC +:10B63000EFFFFF17FD7BBFA9E40302AAFD03009102 +:10B64000C4FFFF97010040F9FD7BC1A8210CC0DABF +:10B65000810000F9000440F9000CC0DA600000F934 +:10B6600000008052C0035FD6E40300AAFD7BBFA99F +:10B6700003008052FD030091E103032AE00304AAC2 +:10B68000B4FFFF97A00000B5E3008012E003032A97 +:10B69000FD7BC1A8C0035FD6000440F980FFFFB462 +:10B6A00063040011F5FFFF17FD7BBEA9FD030091A8 +:10B6B000F35301A9F40302AA020840B94208C05A90 +:10B6C00041C0218B0000018B13100091940000B445 +:10B6D000E00313AAD8070094800200B9E00313AA7C +:10B6E000F35341A9FD7BC2A8C0035FD6FD7BBBA974 +:10B6F000FD030091F35301A9F303012A747C4093E5 +:10B70000F55B02A9F60300AAF71B00F9F70302AAEA +:10B71000FF4B00B9E04B40B90100132A2101F83674 +:10B720001F00007173A29F5AE003132AF35341A92B +:10B73000F55B42A9F71B40F9FD7BC5A8C0035FD6A6 +:10B740001F040071A1020054E2330191E103132AA6 +:10B75000E00316AAD5FFFF97F50300AAE00100B4A5 +:10B76000E20314AAE10317AA360800946001003529 +:10B77000A06A7438A0FDFF34E20314AAE00317AAFC +:10B78000010880523B080094800000B5A06A74381C +:10B790001F000171A0FCFF54E103132AE223019171 +:10B7A000E00316AA02FFFF97F303002ADAFFFF1750 +:10B7B000FD7BBDA9FD030091F35301A9F40300AA89 +:10B7C000F30302AAE00302AAF51300F9F503012A24 +:10B7D00099070094E20313AAE303002AE103152A60 +:10B7E000E00314AAF35341A9F51340F9FD7BC3A864 +:10B7F000BFFFFF17FD7BBEA9FD030091F30B00F90E +:10B80000F30300AACAFEFF97C000F837E103002A3D +:10B81000E00313AAF30B40F9FD7BC2A85BFFFF17FF +:10B82000F30B40F9FD7BC2A8C0035FD6FD7BBEA928 +:10B83000FD030091F30B00F9F30300AACCFEFF9780 +:10B84000C000F837E103002AE00313AAF30B40F924 +:10B85000FD7BC2A84DFFFF17F30B40F9FD7BC2A88B +:10B86000C0035FD6FD7BBAA9FD030091F96B04A963 +:10B870007A7C4093F90302AAF35301A9F55B02A96C +:10B88000F60300AAF50304AAF76303A9F7031AAAAB +:10B89000F80305AAD8FFFF97F303002AA000F836A3 +:10B8A000550000B4A00200B9140080D219000014A1 +:10B8B000E20315AAE103132AE00316AA2AFFFF9761 +:10B8C000F40300AAE2730191E00316AA810A40B9C9 +:10B8D0002108C05A46FFFF97A00000B5E103132AD4 +:10B8E000E00316AAD2FFFF97ECFFFF17E15F40B914 +:10B8F000FF02016B41FFFF54E2031AAAE10319AAF8 +:10B90000D0070094C0FEFF35580000B4130300B9FF +:10B91000E00314AAF35341A9F55B42A9F76343A9D5 +:10B92000F96B44A9FD7BC6A8C0035FD60EFFFF17C5 +:10B93000050080D2CCFFFF17FD7BBDA9FD03009160 +:10B94000F35301A9F40300AAF30302AAE00302AA35 +:10B95000F55B02A9F60303AAF503012A3607009452 +:10B96000E40316AAE303002AE20313AAE103152A5B +:10B97000E00314AAF35341A9F55B42A9FD7BC3A8D8 +:10B98000ECFFFF17FD7BBEA9FD030091E57300915D +:10B99000B5FFFF97400000B400300091FD7BC2A8C6 +:10B9A000C0035FD6FD7BBEA9E40300AAFD0300919E +:10B9B000F35301A9F40302AAE20303AAEAFEFF97E4 +:10B9C000F30300AA000100B4D40000B4610A40B936 +:10B9D000E00304AA2108C05A15FFFF97800200F96E +:10B9E00073320091E00313AAF35341A9FD7BC2A86F +:10B9F000C0035FD6FD7BBDA9FD030091F35301A9F0 +:10BA0000F40300AAF30302AAE00302AAF55B02A969 +:10BA1000F60303AAF503012A07070094E40316AA14 +:10BA2000E303002AE20313AAE103152AE00314AAA0 +:10BA3000F35341A9F55B42A9FD7BC3A8D2FFFF17D1 +:10BA4000FD7BBDA9A2000090425C1591FD03009111 +:10BA5000E3B30091F35301A9F30300AAF403012A0D +:10BA6000E5FFFF97800000B4E12F40B93F1000715F +:10BA700060010054A2000090E3B30091424415918C +:10BA8000E103142AE00313AADBFFFF97200100B4AF +:10BA9000E12F40B93F100071C1000054000040B9CF +:10BAA0000008C05AF35341A9FD7BC3A8C0035FD669 +:10BAB00000008052FCFFFF17FD7BBDA9FD03009134 +:10BAC000F35301A9F40301AAF30300AAA100009013 +:10BAD00021201591F51300F9F503022A4C0000947A +:10BAE0004001F837E103002AE303152AE20314AA10 +:10BAF000E00313AAF35341A9040080D2F51340F9DF +:10BB0000FD7BC3A8A0FFFF17000080D2F35341A91B +:10BB1000F51340F9FD7BC3A8C0035FD6FD7BBCA92C +:10BB2000427C4093FD030091F35301A9F30301AA62 +:10BB3000F55B02A935C0228BF71B00F9F70300AAB9 +:10BB4000200040391FBC0071A0050054E10580525F +:10BB5000E00313AA470700941F0000F11610959AFE +:10BB6000E10313AAC202134BE00317AAD3FFFF9706 +:10BB7000E10300AA800400B4E00317AAF30316AAA5 +:10BB800023000094F403002A7F0215EBC202005444 +:10BB9000F60313AAC00240391FBC0071E001005433 +:10BBA000A20216CBE1058052E00316AA31070094E9 +:10BBB0001F0000F1E103142A1310959AE20316AA5C +:10BBC0006302164BE00317AAC9FEFF97F403002A8D +:10BBD000C0FDFF3604000014D6060091BF0216EB2C +:10BBE000A1FDFF54E003142AF35341A9F55B42A9D8 +:10BBF000F71B40F9FD7BC4A8C0035FD61400805238 +:10BC0000E2FFFF1794008012F7FFFF17FD7BBEA92C +:10BC1000FD030091F35301A9F40300AAF30301AA61 +:10BC2000E00301AA84060094E10313AAE203002AB8 +:10BC3000E00314AAF35341A9FD7BC2A8B8FFFF1784 +:10BC40002201F83600008012C0035FD60000801287 +:10BC5000F35341A9F55B42A9F71B40F9FD7BC5A849 +:10BC6000C0035FD6FD7BBBA9FD030091F35301A97F +:10BC7000F403012AF303022AF55B02A9F50303AAE0 +:10BC800096018012F71B00F9F70300AA000080520A +:10BC9000FF4F00B91F00007100A0547AACFDFF54A3 +:10BCA000E14F40B93F00136BD612801A1F00146B8E +:10BCB000E1000054550000B4A10200B93F00136B2D +:10BCC0006BFCFF54E003162AE2FFFF17E103002A92 +:10BCD000E2330191E00317AAB5FDFF97EEFFFF17CE +:10BCE000FD7BBEA902008052FD030091E373009129 +:10BCF000D4FFFF9740000035E01F40B9FD7BC2A88C +:10BD0000C0035FD6FD7BBEA9FD030091F35301A9DB +:10BD1000F30300AAF403012AF2FFFF970001F837AA +:10BD200002040051E103142AE00313AA030080D2A5 +:10BD3000F35341A9FD7BC2A8C2FFFF17F35341A9EA +:10BD4000FD7BC2A8C0035FD6FD7BBBA9FD030091AC +:10BD5000F76303A9987C4093F70303AAF35301A95F +:10BD6000F40300AAF55B02A9F50318AAF60302AAD8 +:10BD7000020080D28EFDFF97F303002AE000F83620 +:10BD8000E003132AF35341A9F55B42A9F76343A9E2 +:10BD9000FD7BC5A8C0035FD6E3330191E20316AA79 +:10BDA000E103132AE00314AA13FFFF97A00000B5D4 +:10BDB000E103132AE00314AA020080D2EEFFFF176A +:10BDC000E14F40B93F00156B41FFFF54E20318AA51 +:10BDD000E10317AA9B060094C0FEFF35E9FFFF1799 +:10BDE000FD7BBDA9FD030091F35301A9F51300F9F3 +:10BDF000F503012A210400513F0C0031A802005430 +:10BE0000F40300AA020080D20100801268FDFF97AF +:10BE1000F303002AC000F836E003132AF35341A9C4 +:10BE2000F51340F9FD7BC3A8C0035FD6E103132AD5 +:10BE3000E00314AA03FFFF971F00156BE0FEFF54F9 +:10BE4000E103132AE00314AA020080D2F0FFFF17D7 +:10BE5000B3008012F1FFFF17FD7BBCA9FD03009129 +:10BE6000F35301A9F40300AAF303012AE00302AA91 +:10BE7000F55B02A9F71B00F9F70302AAEE0500948F +:10BE800015040011F603002AB57E40937F02166B5D +:10BE90006B010054E20315AAE10314AAE00317AAF8 +:10BEA0006806009420020034627E4093E00314AAE6 +:10BEB000010080526F060094E00000B5000080523F +:10BEC000F35341A9F55B42A9F71B40F9FD7BC4A8D8 +:10BED000C0035FD6140014CB730600517302144BD9 +:10BEE00014040091EAFFFF1720008052F5FFFF17AE +:10BEF000FD7BBCA9FD030091F35301A9F40304AA3F +:10BF0000F55B02A9F603032AE3F30091BAFEFF975B +:10BF1000F30300AAE00000B5740000B5130080D25E +:10BF200019000014E03F40B9800200B91600001467 +:10BF3000F53F80B91500158B7F0215EB8300005487 +:10BF4000F4FEFFB4000080120B000014A10213CB1A +:10BF5000E00313AACF05009401040011E13F00B9EA +:10BF600061C2218B3F0015EBA900005494FDFFB482 +:10BF7000C0018012800200B9E9FFFF17F60000350A +:10BF800054FDFFB5E00313AAF35341A9F55B42A9A1 +:10BF9000FD7BC4A8C0035FD6D6060051F30301AAF7 +:10BFA000E6FFFF17FD7BBDA9FD030091E3B3009100 +:10BFB000F30B00F9F30302AAA2000090427C159152 +:10BFC0008DFEFF97A00000B5E02F40B9F30B40F9BC +:10BFD000FD7BC3A8C0035FD6E12F40B9E20313AADB +:10BFE0009EFFFF971F000071E0179F1AF8FFFF17D1 +:10BFF000FD7BBDA9FD030091F35301A9F40300AA41 +:10C00000F51300F9F50302AA020080D2E8FCFF97BD +:10C01000F303002AC000F836E003132AF35341A9C2 +:10C02000F51340F9FD7BC3A8C0035FD6E20315AA50 +:10C03000E103132AE00314AADBFFFF971F0400317A +:10C04000CB000054A0FEFF34E103132AE00314AA3E +:10C05000020080D2EEFFFF17F303002AEFFFFF1765 +:10C060001F0000718C010054C00100541F480031B2 +:10C07000CB000054E003004B8100009021E034919C +:10C0800020D860F8C00000B5800000F00074169160 +:10C0900003000014800000F000F01591C0035FD68B +:10C0A000800000F000481691FDFFFF17E50300AA8D +:10C0B000E00301AAA40C40B9A12040B98408C05AE9 +:10C0C0002108C05A8400010BA4C0248B4203F83716 +:10C0D00001C0228B487C40933F0004EBC80200540F +:10C0E0001F0005EB83020054637C4093660008CB7D +:10C0F0008600068BDF0005EBE3010054A70440B97E +:10C10000E708C05AA500078BDF0005EB8801005443 +:10C11000840000CBFD7BBFA9820008CBFD0300910A +:10C120000000038BAF05009400008052FD7BC1A886 +:10C13000C0035FD660008012C0035FD6400080124B +:10C14000C0035FD6FD7BBDA9FD030091F35301A998 +:10C15000F303032AF40300AA636C1C53F51300F9DC +:10C16000F503022A426C1C53D1FFFF978001003572 +:10C17000810A40B97302154B2108C05A2110130BD4 +:10C180002108C05A810A00B9810E40B92108C05A5D +:10C190003310130B730AC05A930E00B9F35341A91D +:10C1A000F51340F9FD7BC3A8C0035FD6FD7BBDA995 +:10C1B000FD030091F35301A9F40300AAF303032A3A +:10C1C000F51300F9F503022AB9FFFF978001003546 +:10C1D000812640B96302154B2108C05A6100010B4A +:10C1E0002108C05A812600B9810E40B92108C05AE1 +:10C1F0006300010B6308C05A830E00B9F35341A9D1 +:10C20000F51340F9FD7BC3A8C0035FD6FD7BBAA937 +:10C21000FD030091F35301A9F40300AAF55B02A901 +:10C22000F603032AF76303A9F70304AAF96B04A929 +:10C23000F90302AAFB7305A93DFCFF97F503002A49 +:10C24000A004F837980E40B9E00319AAFA04009444 +:10C25000FA0300AA812240B9180BC05A9802188B21 +:10C26000E20319AAE00318AA2108C05A9DFCFF970F +:10C27000200400B41300184B1307F837810A40B9A3 +:10C28000C30E001163741E12E00314AA2108C05AE1 +:10C290006330001121C0358B020080528102018B76 +:10C2A000E10200F9C2FFFF97F503002A40010035C3 +:10C2B000E00240F90160A052730AC05AD60AC05A7F +:10C2C000010000B9E00240F9130800B9E00240F9AA +:10C2D000160400B9E003152AF35341A9F55B42A9FE +:10C2E000F76343A9F96B44A9FB7345A9FD7BC6A875 +:10C2F000C0035FD69C2240B95A070011810E40B995 +:10C30000E3031A2A9B0BC05A9C0BC05A2108C05A3F +:10C31000E00314AA21001C8B020080528102018BD1 +:10C3200063FFFF97F303002A80FAFF35802240B9AC +:10C33000427F4093E10319AAF3031B2A0008C05A65 +:10C340004003000B0008C05A802200B900031C8B78 +:10C3500009050094C9FFFF17F503132ADEFFFF1735 +:10C36000FD7BBCA9FD030091F35301A9F30300AACF +:10C37000F40302AAF55B02A9F50301AAF71B00F971 +:10C38000BAFCFF97611240B923008052020080522C +:10C390002108C05A36D0208BE00313AA7702168BEF +:10C3A000E10317AA68FFFF97A0000035B50EC0DAB9 +:10C3B000756A36F8940EC0DAF40600F9F35341A911 +:10C3C000F55B42A9F71B40F9FD7BC4A8C0035FD60B +:10C3D000FD7BBDA9FD030091F35301A9F40300AA5D +:10C3E000F51300F9F503012A131040B9730AC05A76 +:10C3F00073D2218B1300138B9CFCFF971F00156BCE +:10C400002D010054E10313AAE00314AAF35341A938 +:10C4100003008052F51340F922008052FD7BC3A82F +:10C4200049FFFF1700008012F35341A9F51340F9AB +:10C43000FD7BC3A8C0035FD6FD7BBBA9FD030091B4 +:10C44000F35301A9F303032AE3130191F55B02A956 +:10C45000F503012AF60304AAF76303A9F80300AA67 +:10C46000F70302AA35FDFF97E02700F9F40300AABD +:10C47000E04740B9340100B51F0400310003005407 +:10C4800000020034F35341A9F55B42A9F76343A9C5 +:10C49000FD7BC5A8C0035FD6000C0011630E001120 +:10C4A00002741E1263741E1281320091E00318AAF6 +:10C4B0003FFFFF9700010035730AC05A930600B989 +:10C4C000E02740F900300091C00200F900008052DE +:10C4D000EDFFFF171F04003161FDFF54E4230191BC +:10C4E000E303132AE20317AAE103152AE00318AABB +:10C4F00047FFFF97E3FFFF17FD7BBCA9FD030091FA +:10C50000F35301A9F303042AE4E30091F51300F9BE +:10C51000F50303AAE303132AC8FFFF97F403002AD5 +:10C52000C0000035B3000034E01F40F9627E409344 +:10C53000E10315AA90040094E003142AF35341A9DF +:10C54000F51340F9FD7BC4A8C0035FD6FD7BBAA9F3 +:10C55000FD030091F35301A9F40300AAF303012A98 +:10C56000F55B02A9757C4093F76303A9F70302AA60 +:10C57000F92300F95EFCFF974006F8361F040031EE +:10C5800041050054E2730191E103132AE00314AA68 +:10C5900037FBFF97F85F40B9E2730191E00314AAFB +:10C5A000E103182A32FBFF97000C00511F040071B1 +:10C5B00029FFFF54960A40B9B312001173761E1278 +:10C5C000E00314AAD60AC05A73220011D6C2388BCF +:10C5D000E303132A9902168B02008052E10319AA81 +:10C5E000F3FEFF97200200350020A052806A36B883 +:10C5F000A21200913413009142F47E920100805205 +:10C60000E00314AA33C3338B3F040094E20315AA5A +:10C61000E10317AAE00314AA570400940040A052B3 +:10C6200060C21FB8E003182AF35341A9F55B42A981 +:10C63000F76343A9F92340F9FD7BC6A8C0035FD681 +:10C6400020008012F9FFFF17FD7BBDA9FD030091BB +:10C65000F35301A9F40300AAF30302AAE00302AA18 +:10C66000F51300F9F503012AF3030094E20313AA7A +:10C67000E303002AE103152AE00314AAF35341A9B6 +:10C68000F51340F9FD7BC3A8B1FFFF17FD7BBEA9E1 +:10C69000FD030091E3730091D7FCFF97E10300AA2B +:10C6A000E01F40B9010100B41F10007101010054E6 +:10C6B000200040B9A10180120008C05A1F1000716B +:10C6C0000090811AFD7BC2A8C0035FD6A001801232 +:10C6D000FDFFFF17FD7BBFA9820000F042E0129131 +:10C6E000FD030091EAFFFF97C00000341F040031F2 +:10C6F0004100005440008052FD7BC1A8C0035FD6BA +:10C70000A0018012FDFFFF17FD7BBFA9820000F092 +:10C7100042C01591FD030091DDFFFF971F0400311A +:10C720004100005420008052FD7BC1A8C0035FD6A9 +:10C73000FD7BBDA9FD030091F30B00F9F303032A70 +:10C74000E3B30091ACFCFF97C00000B4E12F40B907 +:10C750003F0C007169000054130040B9730AC05ABD +:10C76000E003132AF30B40F9FD7BC3A8C0035FD697 +:10C77000FD7BBDA9FD030091F30B00F9F303032A30 +:10C78000E3B300919CFCFF97C00000B4E12F40B9D7 +:10C790003F0C007169000054130040B9730AC05A7D +:10C7A000E003132AF30B40F9FD7BC3A8C0035FD657 +:10C7B000FD7BBDA9FD030091F35301A9F403032AF6 +:10C7C000F30304AAE3B300918BFCFF97200100B4AC +:10C7D000E12F40B93F00146B61018012E1A3811A7F +:10C7E000610200B9F35341A9FD7BC3A8C0035FD622 +:10C7F00001008012FBFFFF17FD7BBFA9FD03009125 +:10C80000E00000B5800000F0002018912AE4FF97B6 +:10C8100020008012FD7BC1A8C0035FD61F0440F238 +:10C8200021FFFF547DFAFF9760FFFF34F6FFFF17EB +:10C83000FD7BBFA9820000F0030080D2FD030091C0 +:10C8400042F017916CFCFF97000100B4810000F0EA +:10C85000210C1891580300941F000071E0179F1AD3 +:10C86000FD7BC1A8C0035FD620008052FDFFFF17EB +:10C87000FD7BBAA9FD030091F35301A9F40300AABB +:10C88000F303022AE00301AAF55B02A9F76303A9F7 +:10C89000F70301AAF96B04A9F90303AA660300943C +:10C8A000E2430191E103132A167C4093E00314AAAA +:10C8B0007EFBFF97F80300AA810000F0E00314AAB2 +:10C8C00021201591D2FCFF97E103002AE00314AA6E +:10C8D000C9FBFF97F303002A1F0000716C0000548E +:10C8E0003500801222000014E103132AE353019162 +:10C8F000E2630191E00314AA2BFCFF97F50300AA61 +:10C90000E1034A291F00016B0B040054BA024039AD +:10C910005FBF0071A1030054A0C2208B00F05F38FC +:10C9200040030035E02F40F9E20316AAE10317AAFD +:10C930002A030094A0020035E1031A2AE00315AA95 +:10C940004403009400040091E10318AA1A03009420 +:10C95000F503002AA0010035E02F40F90A090094F0 +:10C960001F04003120010054200300B9E003152A00 +:10C97000F35341A9F55B42A9F76343A9F96B44A9B5 +:10C98000FD7BC6A8C0035FD6E103132AE00314AA07 +:10C99000A7FBFF97D0FFFF17FD7BBBA9FD0300910D +:10C9A000F35301A9F40300AAE00301AAF55B02A96D +:10C9B00016008012F71B00F9F70301AA1E0300946A +:10C9C000157C4093810000F0E00314AA212015910A +:10C9D0008FFCFF97E103002AE00314AA86FBFF9770 +:10C9E000F303002A7F020071EC000054E003162AD2 +:10C9F000F35341A9F55B42A9F71B40F9FD7BC5A89C +:10CA0000C0035FD6E103132AE3130191E2230191EE +:10CA1000E00314AAE4FBFF97010040393FBC00711A +:10CA2000C1010054E14780B90000018B00F05F387C +:10CA300040010035E02740F9E20315AAE10317AAF7 +:10CA4000E6020094A0000035E02740F9CE080094EB +:10CA5000DF02006BD6A2801AE103132AE00314AAB6 +:10CA600073FBFF97F303002ADFFFFF17000200B4F8 +:10CA7000FD7BBEA9FD030091F35301A9F30300AAB6 +:10CA8000F40301AAA100009021C0149160FCFF975B +:10CA9000E103002AE20314AAE00313AAF35341A915 +:10CAA000030080D2FD7BC2A8D3FBFF17C0035FD673 +:10CAB000FD7BBDA9FD030091F35301A9F303042AF3 +:10CAC000F40303AAE4B3009163761E53FF2F00B969 +:10CAD00038FFFF97E20300AAE02F40B9600100345D +:10CAE000F35341A9FD7BC3A8C0035FD6437861B867 +:10CAF0006308C05A837A21B8210400917F02016B38 +:10CB00006CFFFF54F7FFFF17010080D2FCFFFF17F7 +:10CB1000FD7BBEA9FD030091E3730091B6FBFF9777 +:10CB20001F0000F1E0079F1AFD7BC2A8C0035FD67B +:10CB3000FD7BB9A9FD030091F35301A9F40306AAF3 +:10CB4000F55B02A9F60303AAF503052AE3B30191F5 +:10CB5000F76303A9F70300AAF803042AF96B04A9F1 +:10CB6000FB7305A9A4FBFF97200100B4F96F80B9FE +:10CB7000F30300AA1B00805239F77E921900198B2B +:10CB80007F0219EB83000054F501F8373B00801257 +:10CB90000D000014604640B81A08C05AC0040034A2 +:10CBA000DF0200F16403557A01040054E1031A2AFC +:10CBB000E00317AA8BFCFF97FC03002A4001F8361C +:10CBC000BB028012E0031B2AF35341A9F55B42A983 +:10CBD000F76343A9F96B44A9FB7345A9FD7BC7A87B +:10CBE000C0035FD6560200B4E103002AE20316AA8E +:10CBF000E00317AA03008012CEFEFF971F04003146 +:10CC000000FEFF54614A208B3F0301EBA3FDFF545C +:10CC10007F03156B01030054BAFBFF34340100B5E8 +:10CC20001B008052E8FFFF171C008012E003182A47 +:10CC3000F5FFFF171C00801200008052F5FFFF1760 +:10CC40001F400071010280520290811A9C0A002943 +:10CC500094220091000080D25F00006B29FEFF54F7 +:10CC6000617A60B82108C05A817A20B80004009126 +:10CC7000FAFFFF17734A208B7B070011C1FFFF17D4 +:10CC8000E103012AE30300AA020080D2000080D25F +:10CC90005F0001EB41000054C0035FD6647862B8C6 +:10CCA000420400918408C05A808000AAF9FFFF174F +:10CCB000FD7BBCA9FD030091F35301A9F303052AF1 +:10CCC000F40306AAF55B02A9F603032AF503042A76 +:10CCD000E3F3009148FBFF97200300B4E20300AAAE +:10CCE000A002130BE13F80B9007C161B21F47E9259 +:10CCF00040C8208B4200018B05C8358BA1C8338BFF +:10CD00005F0001EBC3010054E103152ADDFFFF972B +:10CD1000E70300AAB40000B4E103132AE00305AA64 +:10CD2000D8FFFF97800200F9E00307AAF35341A957 +:10CD3000F55B42A9FD7BC4A8C0035FD607008092C3 +:10CD4000FAFFFF17FD7BBBA9FD030091F35301A977 +:10CD5000F30300AAF55B02A9F503022AF60303AA6E +:10CD6000F76303A9F703042AF80305AAF96B04A9DA +:10CD7000FA03012AD91C001257FEFF971F00007109 +:10CD80008D020054F403002AE1031A2AE00313AAD7 +:10CD90005EFEFF97E503002AC001F837E703192A72 +:10CDA000E60318AAE403142AE303172AE20316AAE7 +:10CDB000E103152AE00313AAF35341A9F55B42A945 +:10CDC000F76343A9F96B44A9FD7BC5A8B9FFFF1719 +:10CDD00000008092F35341A9F55B42A9F76343A990 +:10CDE000F96B44A9FD7BC5A8C0035FD6FD7BBCA938 +:10CDF000FD030091F35301A9F30300AAF403012AF0 +:10CE0000F55B02A9F50302AAF603032AF76303A957 +:10CE1000F70304AAB81C0012BBFBFF97A001F83768 +:10CE2000E103002AE603182AE50317AAE403162AF9 +:10CE3000E30315AAE203142AE00313AAF35341A95A +:10CE4000F55B42A9F76343A9FD7BC4A8BEFFFF17AA +:10CE500000008092F35341A9F55B42A9F76343A90F +:10CE6000FD7BC4A8C0035FD6FD7BBAA9FD0300917A +:10CE7000F35301A9F40304AAF55B02A9F503032AFD +:10CE8000F76303A9F70300AAF803012AF92300F9BD +:10CE9000F90302AA9CFBFF97F303002A2002F8374C +:10CEA000E103002AE00317AA0BFEFF97F603002A0E +:10CEB000E103132AE00317AA14FEFF97F303002AE5 +:10CEC000E3730191E20319AAE103182AE00317AA08 +:10CED000C9FAFF97E60300AA200100B5F35F40B945 +:10CEE000E003132AF35341A9F55B42A9F76343A971 +:10CEF000F92340F9FD7BC6A8C0035FD6E25F80B985 +:10CF0000637E409363C0368BC77E409342F47E922B +:10CF10000000805263F47ED3C200028BC100038BF9 +:10CF20003F0002EB6900005413008012EDFFFF1771 +:10CF30001F00156BC1010054E103162AE00306AA85 +:10CF400050FFFF97E50300AA851600A9E103132A05 +:10CF5000C008078B4BFFFF97A500008BA50400D1ED +:10CF600013008052850600F9DEFFFF170004001150 +:10CF7000E60301AAEAFFFF17FD7BBDA9FD030091AF +:10CF8000F35301A9940000D0F30300AA94E634916E +:10CF9000F51300F9950000F0B5DE1691E10314AA2F +:10CFA000E00313AAE20315AAE30080520B190094D0 +:10CFB000F30300AAE103002A406A40F91DFEFF972F +:10CFC000E0FEFF34E00313AAF35341A9F51340F93F +:10CFD000FD7BC3A8C0035FD6FD7BB9A9000080928A +:10CFE000FD030091F35301A9F51300F9E3FFFF9747 +:10CFF0002005F8B7F30300AA1500805214008052F0 +:10D00000E2E30091E103152AE00313AAD918009482 +:10D010004002F837B5060011E0030035410240F93F +:10D02000807E4093001C0091E31F40F92110008B8B +:10D03000E22340F9230400F942040091410240F93F +:10D04000420003CB2010008B020800F9F4000035E9 +:10D0500034008052EBFFFF17E00313AAC7FFFF97CE +:10D06000F30300AAC000F8B600008052F35341A9B0 +:10D07000F51340F9FD7BC7A8C0035FD6E2E300913A +:10D0800001008052BB18009400FFFF37350080522A +:10D09000E2FFFF17A0028012F5FFFF170000805289 +:10D0A000C0035FD6FD7BBFA9A10000F021200E9137 +:10D0B000FD030091416A00F95FEA00B9406A40F956 +:10D0C000CEFDFF9780000035FD7BC1A8406A40F986 +:10D0D000F3FFFF17FD7BC1A8C0035FD6FD7BB7A997 +:10D0E000FD030091F35301A9F30300AAF55B02A924 +:10D0F000F50305AAF76303A9F96B04A9F90303AAC9 +:10D10000FB7305A9E43B00F9E27B00B9610000B5BF +:10D11000810000D021541891E00313AABCFAFF97B4 +:10D12000F403002A2001F83620008012F35341A9AD +:10D13000F55B42A9F76343A9F96B44A9FB7345A9C1 +:10D14000FD7BC9A8C0035FD69A0000F05AA70B91D7 +:10D15000E103002AE3330291E2031AAAE00313AACF +:10D1600025FAFF97F60300AA00FEFFB4E103142A94 +:10D17000E00313AA58FDFF97E06F00B9E103142AFA +:10D18000E00313AA61FDFF979B0000D0F803002A7B +:10D19000E103142AE00313AA9C0000D0B0F8FF9723 +:10D1A0007B6F17919C9B1791F703002A5708F8365D +:10D1B000F703142AB4E20191B50000B4E00314AA05 +:10D1C000020480D2010080524F010094E103172A2B +:10D1D000E00313AA820000D042C817914DFEFF97CA +:10D1E000F38F40B9FA03002A80008052E16F40B902 +:10D1F0001C0080521B0080D2730EC01A007F409327 +:10D2000000C0218B737E4093730200CBD30A138B33 +:10D210007F0216EB63040054E06F40B9C20240B9CC +:10D220001F080071A10800544208C05AD61200918C +:10D23000427C60D3C10240B92108C05A2000028B51 +:10D24000550000B4800200F93F0300F18103005251 +:10D25000E2079F1A5F00016A40000054200300F9B2 +:10D260001F0B0071E0060054C1120091020080D231 +:10D27000F60301AAC14640B82108C05A2100028B1A +:10D280007A0000341FE6FF97E10300AA550000B4BE +:10D29000810600F97B03018B94420091BC040034A9 +:10D2A000E03B40F9400000B41B0000F90000805250 +:10D2B0009FFFFF17E2031BAAE103172A0300801256 +:10D2C000E00313AA1BFDFF97E603002AE2031CAA52 +:10D2D000E103172AE00313AA03008012E67F00B9D6 +:10D2E00014FDFF97C001F837E11B4F29C600010A62 +:10D2F000DF00006B41010054E3330291E2031AAAFC +:10D30000E103172AE00313AABBF9FF97F60300AA6B +:10D3100020F5FFB5A002801285FFFF17E103172A51 +:10D32000E00313AA5BF8FF97F703002AA0FFFF179B +:10D330003C008052B7FFFF17020080D2BEFFFF17EC +:10D34000C20640B9C12200914208C05A427C60D353 +:10D35000C8FFFF17840000B0003C001284582091E1 +:10D36000030080D25F00036B4C000054C0035FD603 +:10D370002568633863040091A520404A001C1853B7 +:10D3800085D86578A000004AF7FFFF17FD7BBEA98E +:10D39000E60302AAE203012AFD030091E10300AAC9 +:10D3A00000008052ECFFFF970004C05AE17B00911F +:10D3B000420080D2E03F0079E00306AAEE0000942C +:10D3C000FD7BC2A8C0035FD6E203022A030080D21D +:10D3D0007F0002EB41000054C0035FD6246863382D +:10D3E000630400910040C41AFAFFFF17FD7BBFA938 +:10D3F000E003202AFD030091F4FFFF97E003202AB9 +:10D40000FD7BC1A8C0035FD6FD7BBDA9FD030091D4 +:10D41000F35301A9F30301AAF403002AF55B02A95F +:10D42000F603032A3540228B7F0215EBC30000541C +:10D43000E003142AF35341A9F55B42A9FD7BC3A87D +:10D44000C0035FD6A50213CBE10313AADF02056B6D +:10D45000E003142AC532851AE203052AE4FFFF9788 +:10D4600073C2258BF403002ABCE4FF97EFFFFF177C +:10D47000FD7BBDA9FD030091F30B00F9F30302AAA4 +:10D48000E203012AE10300AA00008052DFFFFF97B8 +:10D490000008C05AE1B30091820080D2E02F00B9A9 +:10D4A000E00313AAB4000094F30B40F9FD7BC3A87A +:10D4B000C0035FD6FD7BBFA9800000D00034299156 +:10D4C000FD030091FCE0FF9700000014FD7BBDA967 +:10D4D000FD030091F51300F9F503012A01FC009109 +:10D4E000F35301A921E47A92F40300AA000880D240 +:10D4F000AFE3FF97F30300AAA00000B495007836CD +:10D50000E20314AA010080527F000094E00313AAF2 +:10D51000F35341A9F51340F9FD7BC3A8C0035FD6BF +:10D52000420300B4860000B0C6C02D91050080D231 +:10D5300004686538236865384402003423020034E7 +:10D540009F00036B60010054C7C864386700003651 +:10D5500084800011841C0012C7C86338670000363D +:10D5600063800011631C00127F00046BA100005453 +:10D57000A5040091BF0002EBC1FDFF54E303042AA0 +:10D580008000034BC0035FD603008052040080522A +:10D59000FCFFFF17E27F40B2E2FFFF17020080D2DC +:10D5A000236862380368223842040091A3FFFF35E4 +:10D5B000C0035FD6E50300AA030080D22468633865 +:10D5C000A2686338630400914000046B8408407AC9 +:10D5D00061FFFF54C0035FD6E50300AA040080D2B8 +:10D5E0005F0004EB6100005400008052070000144B +:10D5F00026686438A3686438840400916000066B70 +:10D60000C408407AE1FEFF54C0035FD6211C00121B +:10D61000020040395F00016B41000054C0035FD637 +:10D620006200003400040091FAFFFF17000080D26E +:10D63000FBFFFF17E10300AA22004039620000351A +:10D64000200000CBC0035FD621040091FBFFFF1731 +:10D65000FD7BBFA9E40300AAE303012AFD030091B7 +:10D66000631C0012F4FFFF978000008B010040391B +:10D670003F00036BA0000054000400D19F0000EBAA +:10D6800069FFFF54000080D2FD7BC1A8C0035FD6B4 +:10D690000100018BE20300AA5F0001EB600000546F +:10D6A0004300403963000035400000CBC0035FD623 +:10D6B00042040091F9FFFF17000200B4FD7BBEA9F0 +:10D6C000FD030091F30B00F9F30300AADAFFFF97C3 +:10D6D0000004009173E1FF97E40300AA600000B426 +:10D6E000E10313AAAEFFFF97E00304AAF30B40F98E +:10D6F000FD7BC2A8C0035FD6040080D2E00304AA69 +:10D70000C0035FD6030840F2C1020054261C4092B9 +:10D71000040080D205018052C42004AAA50400712F +:10D72000C1FFFF54450003CBBF1C00F1480100546A +:10D7300043FC43D3E4008092637C049B4200038B50 +:10D74000030003CB040080D25F0004EBE10000542F +:10D75000C0035FD6046823F863200091F2FFFF172F +:10D76000E30300AAF8FFFF176168243884040091DE +:10D77000F6FFFF171F0001EB00010054030001AA90 +:10D78000630840F220010054E40300AA030080D2A1 +:10D790005F0003EBE1010054C0035FD6246863F827 +:10D7A000046823F863200091440003CB9F1C00F120 +:10D7B00068FFFF5443FC43D3E4008092637C049BE6 +:10D7C0004200038B040003CB210003CBF0FFFF17C3 +:10D7D000256863388568233863040091EDFFFF17DF +:10D7E000E60300AA1F0001EB890000542300028B0E +:10D7F0007F0000EB08010054FD7BBFA9E00306AAEF +:10D80000FD030091DCFFFF97E00306AAFD7BC1A8A2 +:10D81000C0035FD60100028BE20322AA000080D27F +:10D82000000400D15F0000EB61000054E00306AA91 +:10D83000C0035FD66468603824682038F9FFFF179A +:10D84000E50300AA040080D25F0004EB61000054ED +:10D850000000805206000014A36864382068643811 +:10D86000840400916000006B00FFFF54C0035FD68A +:10D870000200028B211C00121F0002EB6100005409 +:10D88000000080D2C0035FD6E30300AA64144038CE +:10D890009F00016B80FFFF54E00303AAF7FFFF170F +:10D8A000FD7BBEA9FD030091F35301A9F40300AA77 +:10D8B000FACFFF97F30300AAF6CFFF97017D80D23E +:10D8C000E003002A737E019B600AC09A000014CB1B +:10D8D000F35341A9FD7BC2A8C0035FD6FD7BBEA95F +:10D8E000FD030091F30B00F9ECCFFF97F30300AABF +:10D8F000E8CFFF97014888D2E003002AE101A0F2B7 +:10D90000737E019B600AC09AF30B40F9FD7BC2A8AD +:10D91000C0035FD6FD7BBEA9FD030091F30B00F9A8 +:10D92000F30300AADBCFFF97737E009B004888D2E9 +:10D93000E001A0F2600AC09AF30B40F9FD7BC2A897 +:10D94000C0035FD6FD7BBEA9FD030091F35301A97F +:10D95000F40300AAD1CFFF97F30300AAE00314AAAF +:10D96000EDFFFF977302008B73060091CBCFFF97FB +:10D970001F0013EBC3FFFF54F35341A9FD7BC2A863 +:10D98000C0035FD6FD7BBDA9FD030091F35301A940 +:10D99000F30300AAF51300F915D092D21513A0F2E3 +:10D9A0006EE3FF977F0215EB7492959AE00314AA39 +:10D9B000E5FFFF97730214EB41FFFF54F35341A9B6 +:10D9C000F51340F9FD7BC3A8C0035FD6000080D2E9 +:10D9D000C0035FD6FD7BB9A9FD030091F55B02A9E9 +:10D9E000F6430191950000B0B55A2891F35301A96F +:10D9F000F403022AF30301AA020280D2E10315AA6A +:10DA0000F76303A9F70300AAE00316AAF92300F9B4 +:10DA100059FFFF97185580D2E3830191020280D20B +:10DA2000E00303AAA102028BB5000090B592199100 +:10DA300051FFFF97B90580529F0240F21610969A47 +:10DA40009F027FF2A000009000A41991B512809A65 +:10DA5000140080D2C06A7438E10315AAE26A603803 +:10DA6000E00313AA330400940027D49A600100371E +:10DA7000730A0091940600919F4200F1C1FEFF5489 +:10DA8000F35341A9F55B42A9F76343A9F92340F990 +:10DA9000FD7BC7A8C0035FD6730E009179F21F38D3 +:10DAA000F5FFFF17FD7BBFA9FD03009182DFFF9704 +:10DAB000400180528ADFFF977FFEFF97FD7BB7A969 +:10DAC000FD030091E18B05A9E1430291E10703A960 +:10DAD000E1430191E12300F9E1068012E14B00B935 +:10DAE000E1430091FF4F00B9E39306A9E20F43A978 +:10DAF000E20F01A9E20F44A9E20F02A9E59B07A9E1 +:10DB0000E74700F91F0400944001805274DFFF973B +:10DB100069FEFF97281C44D3E20300AA202C48D3B7 +:10DB2000257C0C530301000BC40080526330410B71 +:10DB3000210C0012A60C050BC600080B6304041B85 +:10DB4000A119805244018052677C011BE77C0B5372 +:10DB5000E38C041B63C00011430000390308000B71 +:10DB60006300070B6300062B610000544004009122 +:10DB7000C0035FD6667C011BC67C0B53C004000B40 +:10DB8000C38C041B63C0001143040039A300002AA6 +:10DB90006300003540080091F6FFFF17A301805293 +:10DBA000037C031B637C07536508052B6080041B03 +:10DBB00000C000114008003961000054400C009181 +:10DBC000ECFFFF17A17C011B217C0B532494041B49 +:10DBD00084C00011440C00396100003540100091F0 +:10DBE000E4FFFF1721C000114014009141100039DB +:10DBF000E0FFFF17EBD390D208D490D22B00A0F215 +:10DC00002800A0F2CA008052A71980524601805213 +:10DC1000A90180523F000BEB48000054BEFFFF17E4 +:10DC20002208C89A001400914584089BE10302AAC7 +:10DC3000AD1C0453A22C0853A401020BA37C0C536B +:10DC40008430450BA50C00126C0C030B8C010D0BE2 +:10DC500084140A1B857C071BA57C0B53A490061B10 +:10DC600084C0001104B01F384408020B8400050B67 +:10DC700084000C0B857C071BA57C0B53A204020BB4 +:10DC8000A490061B84C0001104C01F38447C091BEB +:10DC9000847C07538308030B8288061B42C0001153 +:10DCA00002D01F38627C071B427C0B53438C061B3F +:10DCB00042C0001163C0001103E01F3802F01F389A +:10DCC000D5FFFF17FD7BB5A9EF0300AAEE03042AD9 +:10DCD000FD030091F35301A9F40301AAF303062AFB +:10DCE000F55B02A9E10302AAF603032AF76303A97D +:10DCF000F503052AF96B04A9FB2B00F993023036D2 +:10DD00007F280071F9079F1A78021B127A021C12F1 +:10DD100053002036737A1F1233090836C101F8B652 +:10DD2000E10301CBCE050051B7058052D901003582 +:10DD3000DF2A0071C1080054FBA30191E0031BAA74 +:10DD4000ADFFFF9700001B4B0E000014D9001A1204 +:10DD5000EEFFFF17D3061036CE050051770580522F +:10DD600099000034DF420071E0060054CE050051F6 +:10DD700001FEFFB500068052E0A301392000805269 +:10DD80001F00156B2102805205A0951AC401054B96 +:10DD90007F02016A80090054B7000034FF0114EBD0 +:10DDA00042000054F7010039EF050091D901003419 +:10DDB000FF0114EB6200005401068052E1010039BA +:10DDC000E1050091DF420071610800549F0201EB00 +:10DDD00089000054010B80520103012AE10500393A +:10DDE000EF090091DA010035010480527F0240F210 +:10DDF00003068052E203042A6310811AE1030FAA8A +:10DE000042040071C50600549F00007181A09F1A52 +:10DE1000840400518400014BEFC1218BE203052AE9 +:10DE2000E1030FAA0306805236000014930018364F +:10DE3000CE05005117048052CAFFFF171700805209 +:10DE4000C8FFFF17CE09005161F9FFB4DF4200712E +:10DE5000850000D0E3179F1AC7060051630C00111C +:10DE6000E6A30191A5940B91020080D22400078AB9 +:10DE700040040011841C40922124C39AA468643891 +:10DE80000403042A446826384204009101FFFFB5C8 +:10DE9000BCFFFF173F0014EB420000542300003981 +:10DEA000210400914204007165FFFF549F0000713E +:10DEB00081A09F1A840400518400014BEFC1218B83 +:10DEC000B6FFFF17E203042AE1030FAA03048052FE +:10DED000F5FFFF17EF0301AAC3FFFF173F0014EB85 +:10DEE000420000542300003921040091C5FFFF17B0 +:10DEF0003F0014EB4200005423000039210400913C +:10DF0000420400511F00026B4DFFFF54A500004B5F +:10DF100001040051E501058BE3A30191217C4093AD +:10DF2000E20305AA6102F8361F000071E203042A29 +:10DF300000A09F1A03048052A0C0208BE10300AA16 +:10DF400042040071450200549F00007184A09F1A92 +:10DF5000F35341A900C0248BF55B42A9F76343A9A1 +:10DF6000F96B44A9FB2B40F9FD7BCBA8C0035FD61E +:10DF70005F0014EB620000542668633846000039E5 +:10DF800042040091210400D1E7FFFF173F0014EB8A +:10DF9000420000542300003921040091E9FFFF17DB +:10DFA000FD7BBCA9FD030091F35301A9F40300AA72 +:10DFB000F303032AF55B02A9F60301AAF71B00F994 +:10DFC000F703052AC20300B5B5000090B54E1991BC +:10DFD000817C4093E00315AAAEFDFF97E303002A7E +:10DFE00037052036020080D27F00026B4C050054BA +:10DFF000027C40921F00007142A09F9A050480524B +:10E000009402028BE20314AA6402140B8100024BF7 +:10E010007F00016BEB0400547F02006B6102004B38 +:10E0200021A09F9A8002018BF35341A9F55B42A97D +:10E03000F71B40F9FD7BC4A8C0035FD6F50302AA15 +:10E04000E4FFFF175F0016EB420000544500003963 +:10E05000420400918100024B7F00016B4BFFFF5493 +:10E060001F00136B6102004B21D09F9A9402018B19 +:10E07000610600511300134B73D29F1A3300130B28 +:10E08000D9FFFF17E20314AA6402140B050480529F +:10E09000F1FFFF178102028BDF0201EB69000054E0 +:10E0A000A1164038816A223842040091CFFFFF1741 +:10E0B0005F0016EB42000054450000394204009115 +:10E0C000D3FFFF17FD7BB5A9FD030091F35301A911 +:10E0D000F55B02A9F76303A9F80300AAF96B04A989 +:10E0E000F90302AAFB7305A91C0001ABE13300F997 +:10E0F000751840B9735C40A983000054E00320AA5E +:10E100001C008092E03300F99A000090F40318AAF2 +:10E1100040631F919B000090E03700F960C32D9190 +:10E12000E03B00F92003403980010035E03340F93D +:10E13000000100B49F021CEB420000549F02003912 +:10E14000800600919F0300EB420000549FF31F38AC +:10E150008002184B8A0100141F940071C000005403 +:10E160009F021CEB4200005480020039940600918B +:10E17000E400001405008052090000143FB400714F +:10E18000A00000543FC00071C1010054A50000323E +:10E1900002000014A5001C32F90300AA210740392F +:10E1A000200700913FAC0071A001005488FEFF548D +:10E1B0003F800071800100543F8C00718001005449 +:10E1C00022C00051421C00125F240071C803005499 +:10E1D0001A008052440180520A000014A5001E3229 +:10E1E000EEFFFF17A5001D32ECFFFF17A5001A3246 +:10E1F000EAFFFF174107041B000400913AC00051D9 +:10E200000100403922C00051421C00125F240071FD +:10E2100029FFFF54010040393FB80071610D0054DF +:10E22000040440390204009181C00051211C0012F5 +:10E230003F240071280A0054040080524601805295 +:10E240001D0000143FA80071C1020054200B009172 +:10E250003501F837622E0091E10313AA53F07D9245 +:10E260003A0040B99AFDFF36FA031A4BA5001C325A +:10E27000E9FFFF17A22200115F000071CD000054DA +:10E28000632E0091E10313AAF503022A73F07D9235 +:10E29000F4FFFF17E1C2358BF503022AF1FFFF17E8 +:10E2A0001A008012DCFFFF178404061B4204009151 +:10E2B00084C000514100403920C00051001C0012B0 +:10E2C0001F24007129FFFF549F0000719BA09F1A1B +:10E2D0004000403901781D123FA001712001005417 +:10E2E00001300151211C00123FB800718807005411 +:10E2F000230088D20320C8F26124C19A01070036A6 +:10E30000590400911FB00171C1000054410440390B +:10E310003FB001716100005459080091800980529A +:10E32000210340393FE00171080100543F88017129 +:10E33000C80500543F940071E02D00540A02805239 +:10E340003F600171400600549F021CEB62000054C4 +:10E35000A0048052800200392103403980060091D8 +:10E36000812E00349F0300EB4900005481060039E0 +:10E37000940A0091630000149FA80071C102005428 +:10E38000020800911501F837602E0091E103152A6B +:10E3900000F07D92640240B9F503012AF30300AA5C +:10E3A000CAFFFF17A12200113F0000718D00005429 +:10E3B000602E009100F07D92F7FFFF17E00313AA93 +:10E3C000F3C2358BF4FFFF17E20300AA1B00801293 +:10E3D000C0FFFF171B008052BEFFFF17F90302AA00 +:10E3E00000008012CFFFFF17218C01513F540071B4 +:10E3F000C8FAFF54E23740F94158617862000010D2 +:10E4000041A8218B20001FD60A0180521F300171C4 +:10E4100061290054D52BF837763E0091E903152A7F +:10E42000D6F27D92620240F9E603052AE00314AABF +:10E43000E5031B2AE4031A2AE3030A2AE1031CAAC0 +:10E44000E97F00B920FEFF97F40300AAE97F40B9F5 +:10E45000F503092A49000014A5022037E1031A2A0E +:10E46000E00314AA02048052050000141F001CEBF4 +:10E4700042000054020000390004009121040051C0 +:10E480003F0000714CFFFF545F03007140070051D3 +:10E4900000C09F9A410700519402008B20008052D7 +:10E4A00043C3801A0000034B1A00010B9F021CEBB0 +:10E4B00022010054B502F837602E0091E103152ABD +:10E4C00000F07D92620240B9F503012AF30300AA2D +:10E4D0008202003994060091E2031A2AE10314AA89 +:10E4E00000048052420400515F0000710C0200548D +:10E4F000410700515F03007121C09F9A9402018B74 +:10E500003907009108FFFF17A12200113F00007199 +:10E510008D000054602E009100F07D92EAFFFF17FD +:10E52000E00313AAF3C2358BE7FFFF173F001CEB94 +:10E53000420000542000003921040091EAFFFF1737 +:10E540001502F837763E0091E603152AD6F27D9241 +:10E55000620240F9E00314AAE4031B2AE3031A2A27 +:10E56000E1031CAAE67F00B98EFEFF97F40300AA20 +:10E57000E67F40B9F503062AF30316AAE1FFFF1769 +:10E58000A6220011DF0000718D000054763E00913C +:10E59000D6F27D92EFFFFF17F60313AAF3C2358B75 +:10E5A000ECFFFF17D502F837613E0091E00313AA94 +:10E5B00033F07D92160040F920074039E20316AA95 +:10E5C0001F84017140070054080300541F34017177 +:10E5D000600300541F540171600E00541F24017128 +:10E5E000400800545F070031A10600542604805201 +:10E5F0001A028052A600062A32000014A12200113D +:10E600003F000071CD000054623E0091E00313AA68 +:10E61000F503012A53F07D92E7FFFF17E0C2358B27 +:10E62000F503012AE4FFFF171FA40171C005005480 +:10E630001FB4017181FDFF54A5001A32E02302913D +:10E64000890000B0E20300AA29DD2991AB001A126B +:10E65000060080D24C078052CA6A6638411D44D3F6 +:10E660004A0D40922D696138E10300AA2A696A388F +:10E670002D2400380A040039AB000035DF1400F106 +:10E6800060000054010C00910C080039C604009190 +:10E69000DF1800F141020054A57819123F0000393B +:10E6A000E4031B2AE3031A2A2F000014C20240F9D4 +:10E6B00020088052A500002A5A028052A6001B3270 +:10E6C000E5031B2AE4031A2AE1031CAAE00314AAA7 +:10E6D000030280527CFDFF9726000014E00301AA8C +:10E6E000DEFFFF17A5001A32200B4039A57819125A +:10E6F0001FD0007181F7FF54E9230291EC030291CE +:10E70000EA0309AA0B0080D2CD058052C16A6B389A +:10E71000E0030CAAE57F00B9FFFCFF9700000CCBDB +:10E72000E57F40B9E20309AA017C4093210400D1AE +:10E730003F040031210300542941208B7F0D00F15B +:10E74000400000542D1500386B0500917F1100F139 +:10E75000E1FDFF54E4031B2AE3031A2AE2030AAA99 +:10E760003F010039E1031CAAE00314AA0DFEFF9744 +:10E77000F40300AA1F0440B129060054F35341A931 +:10E78000F55B42A9F76343A9F96B44A9FB7345A95B +:10E79000FD7BCBA8C0035FD686696138461400387C +:10E7A000E3FFFF17200B40391FB001712003005415 +:10E7B000080200541F080171000300541F3001714A +:10E7C00062008052E213821AE57F00B9F60200B4BB +:10E7D000E1230291E00316AA7FFCFF97E57F40B991 +:10E7E000E4031B2AE3031A2AE2230291DEFFFF1748 +:10E7F0001FCC017161010054E00316AAE57F00B946 +:10E8000073FCFF97E20300AAE57F40B9A0F4FFB5CF +:10E8100022008052EDFFFF1742008052EBFFFF17EE +:10E8200002008052E9FFFF17E0230291810000F00F +:10E83000214C19915AFBFF97E9FFFF172007403938 +:10E84000E13B40F921686038E00319AA39070091DB +:10E850003F0840F241FFFF54F90300AA29FFFF17C8 +:10E860001FB00171820218CB610200543501F837E4 +:10E87000603E0091E103152A00F07D92630240F9A9 +:10E88000620000F9F503012AF30300AA1DFFFF1738 +:10E89000A12200113F0000718D000054603E0091E4 +:10E8A00000F07D92F6FFFF17E00313AAF3C2358B49 +:10E8B000F3FFFF17F500F837603E0091E103152ADA +:10E8C00000F07D92630240F9620000B9EEFFFF178D +:10E8D000A12200113F0000718D000054603E0091A4 +:10E8E00000F07D92F8FFFF17E00313AAF3C2358B07 +:10E8F000F5FFFF179F021CEBA2C3FF5481020039F2 +:10E900001BFEFF17A5001B320A028052C0FEFF1734 +:10E91000210740393F14017161000054390700910B +:10E92000A5001932A5001F324A018052B8FEFF1718 +:10E93000390700D1F40300AAF2FEFF171FB00171DE +:10E94000A0D6FF54AC0100541F68017140D6FF549B +:10E950001FA00171E00200543505F837762E0091B2 +:10E96000E903152AD6F27D92620240B9E003022A39 +:10E97000427C4093160000141FD00171C0D4FF5494 +:10E980001FE8017180D4FF54F4FFFF17A922001182 +:10E990003F0100718D000054763E0091D6F27D92C9 +:10E9A000A1FEFF17F60313AAF3C2358B9EFEFF17D5 +:10E9B0005501F837762E0091E903152AD6F27D929B +:10E9C000620240B9403C4092423C4093BF007FF21B +:10E9D0004210809A95FEFF17A92200113F01007195 +:10E9E0008D000054762E0091D6F27D92F5FFFF1730 +:10E9F000F60313AAF3C2358BF2FFFF17A922001109 +:10EA00003F0100718D000054762E0091D6F27D9268 +:10EA1000D6FFFF17F60313AAF3C2358BD3FFFF17F8 +:10EA2000FD7BB9A9FD030091F35301A9F30301AAEA +:10EA3000F40300AAE10303AAE0430191F51300F9EE +:10EA4000F50302AA020480D24BFBFF97E00745A919 +:10EA5000E00703A9E3C30091E00746A9E20315AA72 +:10EA6000E00704A9E10313AAE00314AA96FDFF97A7 +:10EA70007FC220EB88000054600600517F0200F145 +:10EA800000109F1AF35341A9F51340F9FD7BC7A865 +:10EA9000C0035FD6FD7BB6A9FD030091E39307A9F0 +:10EAA000E3830291E30F03A9E3C30191E32300F998 +:10EAB000E3048012E34B00B9E3430091FF4F00B938 +:10EAC000E59B08A9E74F00F9E61F43A9E61F01A946 +:10EAD000E41744A9E41702A9E61F05A9E41706A94B +:10EAE00079FDFF97FD7BCAA8C0035FD6FD7BBCA95B +:10EAF000FD030091F35301A9F30300AAF40301AA53 +:10EB0000E10302AA020480D2E063228B1AFBFF9782 +:10EB1000E3830091E20314AAE00313AAE17B40B26D +:10EB200069FDFF97F35341A9FD7BC4A8C0035FD6DD +:10EB3000FD7BB8A9FD030091E20F05A9E203029154 +:10EB4000E20B03A9E2430191E22300F9E2058012FE +:10EB5000E24B00B9FF4F00B9E20F43A9E20F01A950 +:10EB6000E20F44A9E20F02A9E2430091E41706A9CB +:10EB7000E61F07A9DEFFFF97FD7BC8A8C0035FD68D +:10EB8000FF8311D1020480D2FD7B00A9FD03009117 +:10EB9000F30B00F9F30300AAE063228BF6FAFF9768 +:10EBA000E20313AAE3830091E0230191818280D2E2 +:10EBB0009CFFFF97F303002A60000034E0230191DB +:10EBC0003DDBFF97E003132AFD7B40A9F30B40F9DF +:10EBD000FF831191C0035FD6FD7BB7A9FD030091B0 +:10EBE000E18B05A9E1430291E10703A9E14301910A +:10EBF000E12300F9E1068012E14B00B9E143009105 +:10EC0000FF4F00B9E39306A9E20F43A9E20F01A960 +:10EC1000E20F44A9E20F02A9E59B07A9E74700F923 +:10EC2000D8FFFF97FD7BC9A8C0035FD6E30300AA06 +:10EC30000000403986000090C6C02D911FC00071B1 +:10EC4000610400546404403960044039C468643885 +:10EC50006400003600800011001C00121FE00171EA +:10EC6000E10200546308009102028052E803022A84 +:10EC7000000080D287088052640040396500403926 +:10EC8000C46864389F00076AE002005464000036DC +:10EC9000A5800011A51C0012A9C00051A45C01515F +:10ECA000BFE4007184C0899A9F00026B6301005425 +:10ECB000410000B4230000F9C0035FD65F0000717B +:10ECC000000180524210801AE9FFFF175F000071B7 +:10ECD00040018052FCFFFF170011009B630400916C +:10ECE000E6FFFF17042080D2F0FFFF174201805299 +:10ECF000CFFFFF17FD7BBEA9FD030091F35301A9D0 +:10ED0000F40300AAF30302AA610000B54AFAFF97D0 +:10ED10008102008B200400D19F0200EB42020054CC +:10ED200023F05F388200009042C02D914368633821 +:10ED3000A301103603F05F3843686338E3001037EF +:10ED4000530000B4600200F9F35341A9010080D2DE +:10ED5000FD7BC2A8E6FFFF17000400D19F0200EB75 +:10ED6000A1FEFF54530000B4610200F9000080923C +:10ED7000F35341A9FD7BC2A8C0035FD6020080D235 +:10ED8000DDFFFF17010080D2FDFFFF17A10000B0DB +:10ED9000E203002A20602791A10000B021A0289161 +:10EDA000E3E702B2210000CBA39999F221FC43933F +:10EDB000217C039B030580522100239B3F0000EB35 +:10EDC00061000054000080D2C0035FD6030840B940 +:10EDD0007F00026BA0FFFF5400A00091F8FFFF1717 +:10EDE000FD7BBDA9A10000B021A02891FD030091E9 +:10EDF000F35301A9B30000B0F51300F9F50300AA1D +:10EE0000736227910020403920030035340013CB72 +:10EE1000E0E702B2A09999F294FE4393947E009B9E +:10EE200000058052944E209B9F0213EB610000541A +:10EE3000130080D207000014611240F9E00315AA04 +:10EE400020003FD600010035600A40B9A0220039F9 +:10EE5000E00313AAF35341A9F51340F9FD7BC3A8BE +:10EE6000C0035FD673A20091F0FFFF17F35341A9CF +:10EE7000F51340F9FD7BC3A8C5FFFF17FD7BBDA9B6 +:10EE8000A10000B021A02891FD030091F35301A936 +:10EE9000B40000B094622791330014CBF51300F94D +:10EEA000F50300AA1F20003973FE4393E0E702B286 +:10EEB000A09999F2737E009B000580527352209BAB +:10EEC0009F0213EBE0000054811240F9E00315AA01 +:10EED00020003FD6E0000035800A40B9A02200396A +:10EEE000F35341A9F51340F9FD7BC3A8C0035FD6D6 +:10EEF00094A20091F3FFFF17FD7BBDA9FD030091D4 +:10EF0000F35301A9F30300AAF403012AF51300F94E +:10EF1000F50303AA02020035B2FFFF97200200B4F6 +:10EF2000030840F9230200B4E103142AE20315AAFE +:10EF3000E00313AA60003FD61F0000712100801279 +:10EF40000000811AF35341A9F51340F9FD7BC3A8D2 +:10EF5000C0035FD6E003022A8DFFFF97F0FFFF1783 +:10EF6000800B8012F8FFFF17A0048012F6FFFF1736 +:10EF7000E30302AA02008052E0FFFF17FD7BBEA957 +:10EF8000FD030091F30B00F9F30301AA3F0000F920 +:10EF9000010C40F9610600F9810000D0212C3C9160 +:10EFA000001040F9600A00F97F5A00B960E2009150 +:10EFB0007BF9FF9760620091810000B021CC37910E +:10EFC00077F9FF9700008052F30B40F9FD7BC2A850 +:10EFD000C0035FD6E60300AAE403012AE00302AA05 +:10EFE000C50040B9BFB00171E00200542C020054CA +:10EFF000BF240171E00200542C030054BF4C007187 +:10F000004003005481000090BFF0007121F8379157 +:10F0100083000090633038916210819AC30440B934 +:10F0200081000090213C389163840111C1FEFF17DB +:10F0300081000090BFF80171210438918300009095 +:10F04000F5FFFF17830000B062F43A91F4FFFF1759 +:10F050008300009062183891F1FFFF178300009041 +:10F0600062303891EEFFFF178300009062F837910D +:10F07000EBFFFF17FD7BBDA9FD030091F35301A931 +:10F08000F30301AAF40302AAF55B02A9F60300AA9E +:10F09000640B0094F50300AAE00316AA960B0094F3 +:10F0A0001F50017181010054A00A40F91F0013EBA9 +:10F0B000690100547302148B1F0013EB20048012AB +:10F0C000E023801AF35341A9F55B42A9FD7BC3A855 +:10F0D000C0035FD6A0048012FBFFFF17C0008012A0 +:10F0E000F9FFFF17FD7BBCA9FD030091F35301A9B4 +:10F0F000F30300AAF55B02A9F50301AAF60302AA2D +:10F10000F71B00F9F70303AADBFFFF9700020035A6 +:10F11000E00313AA740B0094F40300AAE00313AAFB +:10F12000400B0094010440F9E30317AAE20316AA76 +:10F13000E00314AAA102018BF35341A9F55B42A994 +:10F14000F71B40F9FD7BC4A8B3030014007C409377 +:10F15000F35341A9F55B42A9F71B40F9FD7BC4A815 +:10F16000C0035FD6FD7BBDA9FD030091F35301A948 +:10F17000F30300AAF55B02A9F50301AAF60302AAAC +:10F18000BDFFFF97C0010035E00313AA560B0094A2 +:10F19000F40300AAE00313AA220B0094010440F92F +:10F1A000E20316AAE00314AAA102018BF35341A9BA +:10F1B000F55B42A9FD7BC3A809040014007C4093C1 +:10F1C000F35341A9F55B42A9FD7BC3A8C0035FD6F9 +:10F1D000FD7BBCA9FD030091F35301A9F30300AA31 +:10F1E000F55B02A9F50301AAF60302AAF71B00F9D1 +:10F1F000F70303AAA0FFFF9700020035E00313AA5C +:10F20000390B0094F40300AAE00313AA050B009441 +:10F21000010440F9E30317AAE20316AAE00314AAC3 +:10F22000A102018BF35341A9F55B42A9F71B40F9F9 +:10F23000FD7BC4A8B1030014007C4093F35341A9A3 +:10F24000F55B42A9F71B40F9FD7BC4A8C0035FD65C +:10F25000FD7BBEA9FD030091F35301A9F30300AAAE +:10F2600000F847391F540171A104005460FE47396A +:10F270001FA802714104005460FA069114008052E4 +:10F2800001008052020040395F1840F22101005411 +:10F290000210403994060011004000915F00007197 +:10F2A0002104811A9F120071E1FEFF54C102003552 +:10F2B000810000D060DA009121681991620080D24B +:10F2C000C6F8FF97A000003520008052F35341A9F3 +:10F2D000FD7BC2A8C0035FD6810000D0604A0191C7 +:10F2E00021781991A20080D2BCF8FF97E0FEFF348C +:10F2F0009F120071E0039F5AF5FFFF170000801274 +:10F30000F3FFFF1700008052F1FFFF17FD7BBEA93E +:10F31000220080D2FD030091F30B00F9011040F9A7 +:10F3200021FC009121E47A9221000191FF6321CB1D +:10F33000010080D2F3FF009173E67A92E30313AAEF +:10F34000C00300941F0400F121010054E00313AA3C +:10F35000C0FFFF971F000071E0039F5ABF03009199 +:10F36000F30B40F9FD7BC2A8C0035FD600008012FA +:10F37000FBFFFF17FD7BB4A9FD030091F35301A927 +:10F38000F55B02A9F76303A9F96B04A9FA0302AAC2 +:10F39000FB2B00F9BF7F06A9021040F9BF7F07A928 +:10F3A00042FC0091BF7F08A942E47A924200019199 +:10F3B000BF7F09A9FF6322CBBF7F0AA9BF7F0BA92B +:10F3C0007F000471CD0000548000009000C835918A +:10F3D00002FEFF971500801253000014F7FF009102 +:10F3E000F803032AF7E67A92F60300AAF90301AAC2 +:10F3F000FB03042AF30305AAE30317AA220080D221 +:10F40000900300941F0400F1E0000054C10640B9CD +:10F41000E20319AA8000009000883691EFFDFF9763 +:10F42000EDFFFF17E1FA4739E2FE47393F5401711A +:10F43000610000545FA80271A00000548000009099 +:10F4400000383791E5FDFF97E3FFFF17A183019196 +:10F45000E00316AACAFEFF97F503002A400600350E +:10F46000E0FA0691E2FA0791F40300AA810240391A +:10F470003F1840F2A1060054811240396106003461 +:10F480007F03186B21060054B90000B42318001242 +:10F490007F14007124184F7AA0050054A03B40F956 +:10F4A000014080D2626200911F0008F10020819A21 +:10F4B000600A00F98112407980164079204000AA44 +:10F4C0000000198B600200F9811A4079801E407992 +:10F4D000204000AA600600F9E103182AE00316AAFA +:10F4E000BDFEFF9760E20091810000B0212C3C91AD +:10F4F0002BF8FF9780124039810240391FBC0371FD +:10F50000E0179F1A00781F533F000271410000541A +:10F5100000000032605A00B9150080528012403954 +:10F5200060720139BF030091E003152AF35341A92A +:10F53000F55B42A9F76343A9F96B44A9FB2B40F99A +:10F54000FD7BCCA8C0035FD6F90000B4811240391E +:10F55000C1000034231800127F14007124184F7A60 +:10F560004000005418070011944200915F0014EB12 +:10F57000E1F7FF5401104039221800125F140071A6 +:10F5800024184F7AC0020054004000919F0200EB03 +:10F5900021FFFF54E00317AA2EFFFF971F040071FD +:10F5A000A1F1FF547F0200F9014080D2C00E40F962 +:10F5B000600600F9A03B40F97F5A00B91F0008F12E +:10F5C0000020819A600A00F9810000B060E2009199 +:10F5D000212C3C91F2F7FF97D3FFFF1702104079DF +:10F5E0003F0300F101144079E50313AAE4031B2A49 +:10F5F000E303182AE00316AA414001AA21001A8B4E +:10F600004213819A5CFFFF97F503002AC6FFFF179C +:10F61000E50302AAE403012A23008052020080D2FB +:10F62000010080D254FFFF17E40300AA650000F038 +:10F630008107A0B0A5C02D9120000891020080D2C2 +:10F64000060D8012C705805281C4228B21E040390B +:10F65000A1000034A3C861386300060A631C00726D +:10F660002110871A41682038420400915F9000F110 +:10F67000C1FEFF541F900039C0035FD6FD7BBEA9B9 +:10F68000E23F80D2FD030091F30B00F9011040F935 +:10F690004208C19A4104019B220080D221FC0091C2 +:10F6A00021E47A9221000191FF6321CB010080D2F5 +:10F6B000F3FF009173E67A92E30313AAE102009448 +:10F6C0001F0400F16102005461FE4379A04A955283 +:10F6D0003F00006BE101005460FA069173FA079154 +:10F6E000820080D2416860383FB80371C100005485 +:10F6F0000310407901144079614001AA3F04007170 +:10F7000020010054004000911F0013EBC1FEFF5484 +:10F7100000008012BF030091F30B40F9FD7BC2A8EB +:10F72000C0035FD600008052FBFFFF17FD7BBBA923 +:10F73000FD030091F35301A9F30300AAF55B02A9AD +:10F74000F60301AAF71B00F9FF4F00B90100403989 +:10F7500000044039202000AA610A4039014001AA72 +:10F76000600E4039206000AA61124039018001AA70 +:10F770006016403920A000AA611A403901C001AAD0 +:10F78000601E403920E000AAA1C888D22109A4F255 +:10F79000012AC8F2418AEAF21F0001EBE00000549E +:10F7A00000008012F35341A9F55B42A9F71B40F911 +:10F7B000FD7BC5A8C0035FD674420091F50302AA81 +:10F7C000E10314AA820080D2E0330191EAF7FF97A7 +:10F7D000820080D201008052E00314AACAF7FF978A +:10F7E0006032403961364039623E4039012001AA19 +:10F7F000603A4039204000AAE10313AA0260022ABD +:10F8000000008052FAF6FF97F703002AE1330191D6 +:10F81000E00314AA820080D2D7F7FF97E04F40B9E7 +:10F820001F00176BE1FBFF5461624039606640398D +:10F83000202000AA616A4039014001AA606E403967 +:10F84000206000AA61724039018001AA60764039C7 +:10F8500020A000AA617A403901C001AA607E403927 +:10F8600020E000AA1F0016EBC1F9FF5461A2403945 +:10F8700060A64039202000AA61AA4039014001AAAF +:10F8800060AE4039206000AA61B24039018001AA0F +:10F8900060B6403920A000AA61BA403901C001AA6F +:10F8A00060BE403920E000AA1F0015EBA8F7FF5406 +:10F8B00061C2403960C64039202000AA61CA40397F +:10F8C000014001AA60CE4039206000AA61D24039CF +:10F8D000018001AA60D6403920A000AA61DA40392F +:10F8E00001C001AA60DE403920E000AA1F0015EB2C +:10F8F000E0939F5AACFFFF17FD7BBAA91F0000F1F0 +:10F90000441840FAFD030091F35301A9F55B02A9E5 +:10F91000F76303A9F92300F941010054170080524D +:10F92000BF030091E003172AF35341A9F55B42A9F5 +:10F93000F76343A9F92340F9FD7BC6A8C0035FD64E +:10F94000F30302AAF70301AA021040F9E13F80D2B3 +:10F95000F50300AAF60303AA2108C29A2208029B13 +:10F96000010080D242FC009142E47A92420001916F +:10F97000FF6322CB220080D2F8FF009118E77A9231 +:10F98000E30318AA2F020094E20300AA1F0400F167 +:10F9900061FCFF54E30313AAE10317AAE00315AACD +:10F9A00028020094F40300AA1F0400F181FBFF5415 +:10F9B0006102403960064039202000AA610A4039BE +:10F9C000014001AA600E4039206000AA611240394E +:10F9D000018001AA6016403920A000AA611A4039AE +:10F9E00001C001AA601E403920E000AA21E988D2A6 +:10F9F000C1E9A9F241AAC8F2A1A9E8F21F0001EBEE +:10FA0000A00D0054A20E40F9E10317AAE00313AAC7 +:10FA100047FFFF97F703002A20F8FF35A07640B98B +:10FA2000C001003579E20091A1430191E00319AAD8 +:10FA3000020280D2BF7F05A982F7FF9760070034DA +:10FA400040008052A07600B9E10319AAA0E201911A +:10FA5000020280D248F7FF9760424139614641393E +:10FA6000744E4139012001AA604A4139204000AA60 +:10FA700061524139146014AA60564139202000AA0D +:10FA8000615A4139014001AA605E4139206000AAF3 +:10FA9000947E001B740400B4A11240F9940600D1B6 +:10FAA000800AC19A0104019B000880D240DAFF97C6 +:10FAB000F80300AA600300B4E30300AA61264139F9 +:10FAC000A01240F9940AC09A60224139012001AA8B +:10FAD000602A413994060091E20314AA204000AA4A +:10FAE000612E4139016001AA60324139208000AAAB +:10FAF0006136413901A001AA603A413920C000AA0B +:10FB0000613E413901E001AAE00315AACD0100944C +:10FB10009F0200EB20010054E00318AADAD7FF97F8 +:10FB2000DF0200F97FFFFF1700BB41B960F9FF3426 +:10FB3000B4820E29C9FFFF17D80200F9604241398B +:10FB400061464139624E4139012001AA604A41397A +:10FB5000204000AA61524139026002AA6056413930 +:10FB6000202000AA615A4139014001AA605E413952 +:10FB7000206000AAE10318AA427C001B000080520A +:10FB80001BF6FF976262413961664139412001AA43 +:10FB9000626A4139224002AA616E4139416001AA7C +:10FBA0001F00016BC0000054C00240F9B6D7FF9798 +:10FBB0005CFFFF17570080525AFFFF173700805233 +:10FBC00058FFFF17FD7BBDA9020280D201008052C1 +:10FBD000FD030091F30B00F9F30300AAE083009109 +:10FBE000C9F6FF97E1830091E00313AA020280D2D5 +:10FBF00014F7FF971F000071E0079F1AF30B40F9FD +:10FC0000FD7BC3A8C0035FD6FD7BBDA9E30302AAA9 +:10FC1000FD030091F35301A9F40301AAF30300AA21 +:10FC2000F51300F9F50302AAE20301AA210080D22C +:10FC300032FFFF971F04007120010054610E40F94C +:10FC4000E30315AAE20314AAE00313AA210400D1D6 +:10FC50002AFFFF971F040071E0179F1AF35341A971 +:10FC6000F51340F9FD7BC3A8C0035FD6FD7BBBA99C +:10FC7000FD030091F35301A9F303012A610B80D224 +:10FC8000F55B02A9F71B00F9BF2700F9031040F943 +:10FC90002108C39A230C039B63FC009163E47A92CE +:10FCA00063000191FF6323CB7F0200710C010054BC +:10FCB000A0028012BF030091F35341A9F55B42A952 +:10FCC000F71B40F9FD7BC5A8C0035FD6F6FF009186 +:10FCD000F40302AAD6E67A92F50300AAA2230191C0 +:10FCE000E10316AAC9FFFF971F04007121FEFF540C +:10FCF000C05240B9B72740F91F00136BA20000544F +:10FD0000E00317AA60D7FF9700008012EAFFFF17F1 +:10FD100000108052735E209B730202F120FFFF549B +:10FD2000E00313AAA8FFFF97C0FEFF3461824039A9 +:10FD300060864039202000AA618A4039014001AA2A +:10FD4000608E4039206000AA61924039018001AA8A +:10FD50006096403920A000AA619A403901C001AAEA +:10FD6000609E403920E000AA800200F962A240397A +:10FD700061A64039412001AA62AA4039224002AA64 +:10FD800061AE4039416001AA62B24039228002AAC4 +:10FD900061B6403941A001AA62BA403922C002AA24 +:10FDA00061BE403941E001AA21040091210000CB4D +:10FDB000810600F9A01240F9800A00F9E00313AAB5 +:10FDC0001AFEFF97E30300AA82000090421C3B91B9 +:10FDD000010480D2806200912FFBFF9780E20091A6 +:10FDE000810000B0212C3C91EDF5FF97E00313AAB0 +:10FDF000020280D2610000F021201F9191F6FF974E +:10FE00001F00007161C24039E0179F1A00781F532C +:10FE10004100103600000032805A00B9E00317AAF2 +:10FE200019D7FF9700008052A3FFFF17E10300AA34 +:10FE300000805FF8020040F9423440F9421040F976 +:10FE4000620000B4F00302AA00021FD62000805214 +:10FE5000C0035FD6FD7BB3A9FD030091F35301A955 +:10FE6000F40300AAF55B02A9F71B00F9ED07009463 +:10FE7000F30300AA02FCFF976022403960050034BA +:10FE8000E00314AAE7070094F50300AAE00314AA0C +:10FE9000190800941F58007181040054760000F086 +:10FEA000970000D0D6963391F746089133008052E0 +:10FEB000E2C30191E103132AE00315AA2DFCFF9789 +:10FEC000E0020035830640F9E20316AAE403132A90 +:10FED000010480D2E0430191EFFAFF97E0430191E2 +:10FEE000F6F5FF97E3230191E20300AAE10317AAC5 +:10FEF000E00314AAD608009480010035E02740F9F9 +:10FF0000C8070094138400B8E1C30191020C80D2A9 +:10FF100019F6FF97E02740F9820700947306001155 +:10FF20007F06027161FCFF5400008052F35341A927 +:10FF3000F55B42A9F71B40F9FD7BCDA8C0035FD656 +:10FF4000020040F9423440F9A20000B4420C40F9EA +:10FF5000A20000B4F00302AA00021FD6A00480127F +:10FF6000C0035FD600008052FEFFFF17004440F937 +:10FF7000F4FFFF17FD7BBBA9FD030091F35301A91B +:10FF8000F55B02A9F503002AF603012AC00280529C +:10FF9000E1230191F71B00F9F70302AAE609009497 +:10FFA000F403002A80020035E02740F9130840F9E5 +:10FFB000736201D1E02740F9616201910040009134 +:10FFC0003F0000EB61000054540280120A0000144C +:10FFD000E00313AA93070094010040B93F00156B9A +:10FFE00061010054000440B91F00166B0101005468 +:10FFF000F30200F9E003142AF35341A9F55B42A987 +:02000004FFE11A +:10000000F71B40F9FD7BC5A8C0035FD6732E40F9EE +:10001000E8FFFF17FD7BB9A9FD030091F35301A988 +:10002000F30300AAF40302AAF55B02A9F50301AAEF +:10003000F60303AAF71B00F97A070094610240F95E +:10004000373440F9E40240F9440500B40140403936 +:10005000C1030034F37F04A9E5FFFFF0E10316AA12 +:10006000FF7F05A9A5B0389143008052FF7F06A904 +:10007000041040F9E0230191827C149BC6D5FF97C0 +:10008000E0000034007C4093F35341A9F55B42A9A2 +:10009000F71B40F9FD7BC7A8C0035FD6E40240F917 +:1000A000E20314AAE32B40F9E10315AAE00313AA23 +:1000B00080003FD6F30300AAE0230191DFD5FF972C +:1000C000E00313AAF1FFFF17E30316AAE20314AA41 +:1000D000E10315AAE00313AAF35341A9F00304AA0C +:1000E000F55B42A9F71B40F9FD7BC7A800021FD6AC +:1000F000A0048092E5FFFF17FD7BB9A9FD030091E5 +:10010000F35301A9F30300AAF40302AAF55B02A9C1 +:10011000F50301AAF60303AAF71B00F941070094AF +:10012000610240F9373440F9E40640F9440500B46F +:1001300001404039C1030034F37F04A9E5FFFFF01B +:10014000E10316AAFF7F05A9A5B0389123008052CC +:10015000FF7F06A9041040F9E0230191827C149BE3 +:100160008DD5FF9700010034137C4093E00313AA60 +:10017000F35341A9F55B42A9F71B40F9FD7BC7A8E2 +:10018000C0035FD6E40640F9E20314AAE32B40F96A +:10019000E10315AAE00313AA80003FD6F30300AAE7 +:1001A000E0230191A5D5FF97F1FFFF17E30316AAFE +:1001B000E20314AAE10315AAE00313AAF35341A929 +:1001C000F00304AAF55B42A9F71B40F9FD7BC7A821 +:1001D00000021FD6B3048092E5FFFF17FD7BBDA987 +:1001E000FD030091F35301A9F30300AAF40301AA4C +:1001F000F51300F9F50302AA0A070094600240F91A +:10020000003440F9030840F9230100B4E20315AAC1 +:10021000E10314AAE00313AAF00303AAF35341A9CC +:10022000F51340F9FD7BC3A800021FD6A0048092FD +:10023000F35341A9F51340F9FD7BC3A8C0035FD672 +:10024000004440F974FFFF17FD7BBCA9FD0300913A +:10025000E1E30091F35301A9F51300F9F503002A36 +:10026000C00280523409009440030035E01F40F979 +:1002700053028012140840F9946201D1E11F40F941 +:1002800080620191214000911F0001EBC1000054E8 +:10029000E003132AF35341A9F51340F9FD7BC4A8E9 +:1002A000C0035FD6E00314AADE060094010040B943 +:1002B0003F00156B81000054000440B97F02006BC1 +:1002C00073A2801A942E40F9946201D1ECFFFF17BB +:1002D000F303002AEFFFFF17FD7BBFA9FD03009189 +:1002E000DAFFFF971F4C0031A0000054E103202AE1 +:1002F000007C410BFD7BC1A8C0035FD6000080528B +:10030000FDFFFF17FD7BB8A9FD030091F35301A981 +:10031000F55B02A9F503052AF76303A9F703032A8E +:10032000F80307AAF96B04A9FA0300AAF90306AABD +:10033000FB7305A9FB0301AAFC0302AA9F04003179 +:1003400061050054E003032AE4FFFF97F403002A49 +:10035000B40AF837E3E30191E2031CAAE1031BAA04 +:10036000E0031AAABA070094F303002A40080035F4 +:10037000E03F40F9AB060094170000B9A57E40931A +:10038000E1E70232BF0001EAE1F30132E2079F1A1E +:10039000BF0001EAE1079F1A1F2000392204020B67 +:1003A000E1CF0432BF0001EA199401A9E1079F1AC5 +:1003B0004108010BA25C789242DC68F2E2079F1AC6 +:1003C000BF3C70F2220C020BE1079F1A4110010B97 +:1003D000012800B9E13F40F9140400B9014400F9D3 +:1003E000E03F40F9000300F923000014F403042A5D +:1003F000E1E30191C0028052CF080094F303002A88 +:1004000040030035E03F40F9160840F9D66201D1BB +:10041000E03F40F9C1620191004000913F0000EBD4 +:10042000610000543300801210000014E00316AA8B +:100430007C060094E10300AA000040B9FF02006BB3 +:10044000A1020054200440B99F02006B41020054F5 +:10045000E003172AE13700F9A0FFFF970002F83701 +:10046000E13740F9200400B97F02007164BA423AD2 +:1004700000F7FF54E003132AF35341A9F55B42A9A7 +:10048000F76343A9F96B44A9FB7345A9FD7BC8A891 +:10049000C0035FD6D62E40F9DDFFFF17F303002A15 +:1004A000F2FFFF17F303142AF3FFFF17FD7BB9A92F +:1004B000FD030091F35301A9F30300AAF55B02A920 +:1004C000F60301AAC10380D2F76303A9F703032A45 +:1004D000F803042AF96B04A9E40302AA620000D01D +:1004E000030440F9427C3391F903052AFA0306AA72 +:1004F000F50307AAE043019167F9FF97E0430191F3 +:100500006EF4FF97200300B4E20300AAF40300AAEC +:10051000E70315AAE00313AAE6031AAAE503192ABA +:10052000E403182AE303172AE10316AA76FFFF97CC +:10053000F303002A40010034E00314AA52D5FF97C8 +:10054000E003132AF35341A9F55B42A9F76343A9DA +:10055000F96B44A9FD7BC7A8C0035FD6A00240F990 +:1005600069060094F7FFFF1773018012F5FFFF176C +:10057000FD7BBBA9FD030091F35301A9F51300F91D +:10058000F50300AAFF2300F9FF4B00B9AD06009464 +:10059000F40300AA000041B900781F12800201B9DB +:1005A000930641B9BF3F03D5A04A40F9610000F06E +:1005B000E2F3009121EC2A91B90A0094C0000035C1 +:1005C000E13F40B960020432737A03123F000071C8 +:1005D0007302801AA04A40F9610000F0E2F3009132 +:1005E00021242B91AE0A0094C0000035E13F40B9B0 +:1005F00060020332737A02123F0000717302801AA4 +:10060000A04A40F9610000F021602B91250B009475 +:100610001F1C00724000005473020A32BF3F03D512 +:10062000930601B9930A41B9BF3F03D5A04A40F9E7 +:10063000610000F0E203019121B02B91630080D2B0 +:10064000C80A009440010035E00748292104005100 +:1006500000040051215C18532010002AE14B40B9DE +:10066000210400513300132A1300132ABF3F03D57E +:10067000930A01B9930E41B9BF3F03D5A04A40F98F +:10068000610000F0E203019121F02B91630080D220 +:10069000B40A009440010035E007482921040051C4 +:1006A00000040051215C18532010002AE14B40B98E +:1006B000210400513300132A1300132ABF3F03D52E +:1006C000930E01B9800241B900000032800201B9E5 +:1006D00000008052F35341A9F51340F9FD7BC5A8F2 +:1006E000C0035FD6FD7BB9A9FD030091F35301A9B7 +:1006F000F55B02A9F76303A9F96B04A9FB7305A9CC +:10070000460600941F0400B1200B00541BF04391D7 +:10071000F30300AA75FB7FB9BF3F03D5B55650D38D +:1007200074FF7FB9BF3F03D5945A52D3F503152AFE +:10073000940600111A0080D2403F10537902429172 +:10074000E06F00B9200080D21720DA9A3943009177 +:10075000F703372A160080D2DF0215EB230300547B +:100760005A0700915F0314EB83FEFF5464FB7FB9CB +:10077000BF3F03D58418001265FB7FB9BF3F03D587 +:100780000A0880D2A55450D366F23F9100008052EF +:10079000290080D20A01A0F29F00006B610300547F +:1007A00000008052F35341A9F55B42A9F76343A9C6 +:1007B000F96B44A9FB7345A9FD7BC7A8C0035FD6AD +:1007C000BF3F03D5E06F40B93CD30191207300B91E +:1007D000000080D233F4FF97F80300AA800340B9E9 +:1007E000BF3F03D500050036E00318AA2DF4FF979C +:1007F0001FA00FF108040054200080D262F4FF977C +:10080000D6D7FF97F6FFFF17C10040B9BF3F03D50A +:10081000E1007837217C10533F081F72E00100543B +:1008200000040011C6044091DCFFFF1763020A8B2D +:100830002B21C09A07008052BF00076BC0FEFF54F7 +:10084000680040B9E704001108010B2A680000B9EC +:1008500063044091F9FFFF17614370B92321C09AE7 +:100860002100032A614330B9EEFFFF17A002801276 +:10087000CDFFFF17600000F0008434910ED4FF9785 +:100880000DF3FF97200340B9D60600910000170A28 +:10089000200300B939074091B0FFFF17C00200B430 +:1008A000FD7BBEA9FD030091F35301A9F40300AA47 +:1008B000000040F99F0600F9133440F973E201D1BA +:1008C000800240F961E2019100A001913F0000EB3C +:1008D00081000054F35341A9FD7BC2A8C0035FD639 +:1008E000E00313AA55050094EDFFFF97733E40F90E +:1008F000F3FFFF17C0035FD6E20300AAE00301AADB +:10090000010100B4410040F9213440F9020000F92E +:10091000210440F9610000B4F00301AA00021FD6CF +:1009200000008052C0035FD6FD7BBDA9FD0300918E +:10093000F35301A9F30301AAF40300AA010040F94B +:10094000E2A30091C003805214090094C001003555 +:10095000E01740F9600200F9000040F9003440F966 +:10096000020040F9620100B4E10314AAE00313AAF3 +:1009700040003FD680000035E01740F9E10313AA9C +:10098000DEFFFF97F35341A9FD7BC3A8C0035FD6E9 +:10099000800A40B91F040071EC000054800000344C +:1009A000800E40B960FE01A9F4FFFF17000080D25D +:1009B000FDFFFF17A0028012F3FFFF17FD7BB9A90F +:1009C000E403022A620000F0FD030091F30B00F93A +:1009D000E58300917F0000F9F30303AA42340491F8 +:1009E00003008052004840F9F3090094A00000354C +:1009F0007F0200F9E10313AAE0830091CBFFFF9788 +:100A0000F30B40F9FD7BC7A8C0035FD6FD7BB9A9F6 +:100A1000E403012A03008052FD030091F30B00F967 +:100A2000F30302AAE5830091610000F0620000F088 +:100A300021E8049142340491DF0900947F0200F917 +:100A400080000035E10313AAE0830091B7FFFF9710 +:100A5000F30B40F9FD7BC7A8C0035FD6004840F9FF +:100A6000EBFFFF17200100B4010040F9E10000B4E2 +:100A7000210040F9213440F9210C40F9A10000B4D3 +:100A8000F00301AA00021FD6000080D2C0035FD687 +:100A9000A0048092FEFFFF17C00200B4FD7BBDA939 +:100AA000FD030091F35301A9F40301AAF30300AA83 +:100AB000F51300F9010040F9010200B4210040F9EA +:100AC000353440F9A11240F9210200B474FFFF97B8 +:100AD000E10314AAE00313AAF35341A9A21240F9B7 +:100AE000F51340F9F00302AAFD7BC3A800021FD64C +:100AF000000080D2C0035FD6000080D2F35341A92A +:100B0000F51340F9FD7BC3A8C0035FD6A004809213 +:100B1000FBFFFF17200100B4020040F9E20000B41F +:100B2000420040F9423440F9421440F9A20000B4B6 +:100B3000F00302AA00021FD600008052C0035FD655 +:100B4000A0048012FEFFFF17FD7BB6A9FD030091F4 +:100B5000F35301A9F40300AAF55B02A9F76303A903 +:100B6000F96B04A9004840F9A010F8B7770000F02D +:100B7000F76A0491F503012A03008052E10317AAE2 +:100B8000620000F042340491A7090094F603002AA1 +:100B9000400BF836804A40F9760000F0D606059101 +:100BA000E10316AA65090094200EF837007C4093F3 +:100BB000810080D213FC42D3E00313AAC5D5FF976E +:100BC000F70300AA800D00B4E20300AAE30313AA0E +:100BD000804A40F9E10316AA62090094400C0035EE +:100BE0007A0000F0F9E301915AC70491F603132A41 +:100BF000180080D213008052DF02186BED0A0054F7 +:100C0000E07A78B8E0080034E30319AAE203182A6E +:100C1000E1031AAAE00314AA69FFFF97F303002A6D +:100C20001F14083180000054400700341F080031B1 +:100C300041080054130080523A000014E30319AA3B +:100C4000E203132AE10317AAE00314AA5CFFFF974B +:100C50001F080031A100005473060011DF02136B5E +:100C6000E1FEFF54CCFFFF17C00300353F0740B142 +:100C700089000054E003192A40030035C6FFFF171E +:100C8000E3031AAAE203132AE10318AAE00314AA51 +:100C90004BFFFF971F14083100FEFF542002003560 +:100CA000E02B40F99F0200EBD500003560FDFF54BA +:100CB0005F0740B1A9000054E0031A2AEFFFFF17B5 +:100CC000C1FCFF54FBFFFF17E10319AAE0031AAAB6 +:100CD00091FFFF971F98003100FCFF54E0FBFF36A7 +:100CE000F35341A9F55B42A9F76343A9F96B44A902 +:100CF000FD7BCAA8C0035FD6780000F0F9E301913C +:100D0000FA43019118C7049113008052D4FFFF17D2 +:100D1000E03F40F91F0014EB9500003581000054BE +:100D200018070091B5FFFF17C1FFFF543F0740B1FF +:100D3000A9000054F303192A7F02007160D29F1AA0 +:100D4000E8FFFF17E17A78B8E00319AA53FFFF978D +:100D5000F303002A60FEFF36E00317AA4AD3FF9789 +:100D6000F6FFFF17F303002AFCFFFF171300805262 +:100D7000F2FFFF1773018012F0FFFF17000080528F +:100D8000D8FFFF17FD7BBFA921008052FD03009112 +:100D90006EFFFF9700008052FD7BC1A8C0035FD6A5 +:100DA000200100B4010040F9E10000B4210040F945 +:100DB000213440F9211840F9A10000B4F00301AA40 +:100DC00000021FD600008052C0035FD6A00480122C +:100DD000FEFFFF17200100B4010040F9E10000B45C +:100DE000210040F9213440F9211C40F9A10000B450 +:100DF000F00301AA00021FD600008052C0035FD694 +:100E0000A0048012FEFFFF1700008052C0035FD6CF +:100E1000001440F9C0035FD6FD7BBFA9FD0300911C +:100E2000000040F9F9030094FD7BC1A8001440F9CB +:100E3000C0035FD6FD7BBEA902008052FD03009176 +:100E4000F35301A9F40300AAF30301AA004840F9EF +:100E5000610000F021F4039194080094007C409319 +:100E6000601600F9E10313AAE00314AA2A0400940F +:100E7000740200F97F1600B9F35341A9FD7BC2A8A3 +:100E8000C0035FD6FD7BBEA9FD030091F30B00F903 +:100E9000F30300AADD030094E10300AAE00313AA10 +:100EA000E5FFFF9700008052F30B40F9FD7BC2A8DD +:100EB000C0035FD6FD7BBEA9FD030091F30B00F9D3 +:100EC000000040F9D1030094F30300AAE6FEFF9767 +:100ED0001F0440B1A8000054612A40B90008C19A1B +:100EE000612E40B9007C019BF30B40F9FD7BC2A849 +:100EF000C0035FD6FD7BBDA9FD030091F35301A99B +:100F0000F40300AAF51300F9C00300940100805215 +:100F1000E20300AAF30300AAE00314AAD0FEFF979D +:100F2000F503002AA0010035804A40F922008052D2 +:100F3000610000F021A003915C080094602A00B9D0 +:100F400022008052610000F0804A40F921C80391DC +:100F500056080094602E00B9E003152AF35341A906 +:100F6000F51340F9FD7BC3A8C0035FD624344CD3EE +:100F70000224001200244092213448D30320C49A52 +:100F8000800C80D20008C39A1F00007100149F1AC1 +:100F9000427C001B4220C49A4208C19A4210005170 +:100FA000422400124040002AC0035FD60000805255 +:100FB000C0035FD6FD7BBDA9E103012AFD030091BB +:100FC000F35301A9F303022AF51300F9F50300AA6C +:100FD000000040F9016861B8BF3F03D5F403012A5E +:100FE000214450D33F0400F1200200543F0800F197 +:100FF00020020054410200B53FC1FF97E103002ADF +:10100000A00240F9006873B8BF3F03D5822E48D3D1 +:1010100000244092F35341A92108C29AF51340F9E4 +:10102000FD7BC3A8007C019BC0035FD642C1FF9734 +:10103000F3FFFF1743C1FF97F1FFFF17610080D255 +:10104000F0FFFF17FD7BBEA9FD030091F35301A93B +:10105000F40300AA6D030094F30300AAE00314AAAA +:10106000EE0300941F0400B1C0000054600200F9B8 +:1010700000008052F35341A9FD7BC2A8C0035FD694 +:10108000A0028012FCFFFF17020040F9E1000035CA +:10109000425040B9BF3F03D5037D8052A200C03704 +:1010A00000008052C0035FD642A440B9FAFFFF1788 +:1010B000020040F9E1000035425040B9BF3F03D57E +:1010C00063040071C1FEFF54A00D8012F6FFFF17EC +:1010D00042A440B9FAFFFF1765000090080088524B +:1010E00009008852E40300AAA5300991FD7BBFA93D +:1010F000060080520820A0720960A072FD030091D2 +:10110000A7004079E000082AA1030035BF3F03D5BE +:10111000820040F9405000B9E00304AADBFFFF97CA +:10112000A0030035800040F921030035005440B988 +:10113000BF3F03D5A20840B90200220AA00440B96B +:101140004200002AE240022A4200092A81020035B8 +:10115000BF3F03D5800040F9025000B9E00304AA64 +:10116000C6040011C9FFFF97A5300091DF1400717C +:1011700081FCFF54FD7BC1A8C0035FD6BF3F03D5F0 +:10118000820040F940A400B9E4FFFF1700A840B96D +:10119000E8FFFF1700008052E7FFFF17BF3F03D5AE +:1011A000800040F902A400B9EDFFFF17FD7BBEA946 +:1011B000FD030091F35301A9F30300AAB4C0FF9704 +:1011C000F40300AAE00313AA10030094941A00B4D5 +:1011D000F30300AA000040F9000040B9BF3F03D567 +:1011E00000000032BF3F03D5610240F9200000B982 +:1011F0003FBCFF97BF3F03D5600240F9E10080523A +:10120000013000B93ABCFF97BF3F03D5600240F9F7 +:10121000E10F8052018800B935BCFF97610240F9A7 +:10122000204840B900741E12204800B9610240F9FC +:10123000209C40B900741E12209C00B9802640B941 +:10124000850E40B9E103052AA5781E1248FFFF97D5 +:10125000BF3F03D5610240F9254800B9821240B969 +:10126000BF3F03D5610240F9224C00B9BF3F03D50F +:10127000610240F9206000B9811640B9BF3F03D533 +:10128000600240F9015800B9811A40B9BF3F03D547 +:10129000600240F9015C00B9811E40B9BF3F03D52F +:1012A000600240F9016400B9812240B9BF3F03D513 +:1012B000600240F9016800B9812640B9BF3F03D5FB +:1012C000600240F9016C00B9810240B9BF3F03D50B +:1012D000600240F9013C00B9810640B9BF3F03D527 +:1012E000600240F9014000B9810A40B9BF3F03D50F +:1012F000600240F9014400B9804A40B9853240B9E2 +:10130000E103052AA5781E1219FFFF97BF3F03D5F9 +:10131000610240F9259C00B9823640B9BF3F03D530 +:10132000610240F922A000B9BF3F03D5610240F934 +:1013300020B400B9813A40B9BF3F03D5600240F9FB +:1013400001AC00B9813E40B9BF3F03D5600240F90E +:1013500001B000B9814240B9BF3F03D5600240F9F6 +:1013600001B800B9814640B9BF3F03D5600240F9DA +:1013700001BC00B9814A40B9BF3F03D5600240F9C2 +:1013800001C000B9812A40B9BF3F03D5600240F9CE +:10139000019400B9812E40B9BF3F03D5600240F9E6 +:1013A000019800B9610240F9204840B900040032B8 +:1013B000204800B9610240F9209C40B90004003285 +:1013C000209C00B9E00313AA0100805243FFFF975D +:1013D00021008052E00313AA40FFFF9700208052B3 +:1013E0002000A072B2BBFF97814E40B9BF3F03D52A +:1013F000600240F901D400B9815240B9BF3F03D522 +:10140000600240F901D800B9815640B9BF3F03D509 +:10141000600240F901DC00B9815A40B9BF3F03D5F1 +:10142000600240F901E000B9815E40B9BF3F03D5D9 +:10143000600240F901E400B9816240B9BF3F03D5C1 +:10144000600240F901E800B9816640B9BF3F03D5A9 +:10145000600240F901EC00B9816A40B9BF3F03D591 +:10146000600240F901F000B9BF3F03D5610240F9C5 +:1014700020008052207800B9BF3F03D5610240F9B7 +:1014800020CC00B9600240F9004840B9BF3F03D505 +:1014900000000332BF3F03D5610240F9204800B984 +:1014A000600240F9009C40B9BF3F03D50000033201 +:1014B000BF3F03D5610240F9209C00B9BF3F03D56F +:1014C000600240F91F3000B989BBFF97BF3F03D5C9 +:1014D000600240F91F8800B985BBFF97610240F99F +:1014E000201440B900741C12201400B9610240F9A4 +:1014F00020F440B9005C181220F400B9600240F9F1 +:10150000000040B9BF3F03D500781F12BF3F03D58D +:10151000610240F9200000B975BBFF9700008052BE +:10152000F35341A9FD7BC2A8C0035FD6FD7BBDA9D3 +:10153000E103012AFD030091F35301A9F30300AA7B +:10154000F51300F9000040F9006861B8BF3F03D50A +:10155000004850D31F1000718804005461000090AF +:101560002150069121486038600000100188218BCD +:1015700020001FD6F503022A01098052E00313AAB6 +:10158000820D80528CFEFF97610240F9216875B888 +:10159000BF3F03D5212840920008C19AF35341A9C7 +:1015A000F51340F9FD7BC3A8C0035FD6F403032AFB +:1015B00081138052E00313AA021880527EFEFF9727 +:1015C000610240F9216874B8F2FFFF17CABFFF97A4 +:1015D000E003002AF2FFFF17D7BFFF97FDFFFF17B9 +:1015E000D8BFFF97FBFFFF17000080D2ECFFFF176B +:1015F000FD7BBFA903168052820B8052FD03009130 +:1016000001088052CAFFFF97FD7BC1A8C0035FD6C7 +:10161000FD7BBEA9FD030091F30B00F9F30300AAC3 +:10162000F4FFFF97E003002A610240F9214440B92A +:10163000BF3F03D5212448D3F30B40F90024C19ABE +:10164000FD7BC2A8C0035FD6FD7BBDA9FD03009151 +:10165000F35301A9F30300AAF51300F9000040F9C0 +:10166000EA010094F40300AA610E40F93F0C00F176 +:1016700080040054227800D15F5400F1C810005457 +:101680005F540071881000546000009000B00B910E +:10169000005862786200001040A8208B00001FD61E +:1016A000E00314AA83158052020B805281078052F6 +:1016B0009FFFFF97810240F9213C40B9BF3F03D50E +:1016C00021284092210400910008C19AF35341A9B6 +:1016D000F51340F9FD7BC3A8C0035FD6E00314AA4D +:1016E000C4FFFF97810240F9E003002A214440B97A +:1016F000BF3F03D5210400120024C19AF4FFFF1755 +:10170000010040F9210440B9BF3F03D58100C03634 +:10171000B8FFFF97007C0153EDFFFF17B5FFFF9760 +:10172000007C0253EAFFFF17E00314AAB1FFFF9702 +:10173000810240F9E003002A214440B9BF3F03D5AC +:10174000214450D3EDFFFF17E00314AA8317805202 +:10175000020D8052811C805275FFFF97810240F973 +:1017600021E440B9BF3F03D52128409221040091D4 +:101770000008C19A008442D3D5FFFF17800240F9C8 +:10178000009440B9BF3F03D53FA000F1E003002A19 +:101790008102005400681A531F000071811A80D220 +:1017A000001B80D20010819A810240F9F5179F1A20 +:1017B000336860B8BF3F03D5604A50D3732A001224 +:1017C0001F100071E80200546100009021600C912C +:1017D00021486038600000100188218B20001FD64E +:1017E000026C1B533FA400F100701C530010821ABE +:1017F000EAFFFF1701098052E00314AA820D80520C +:10180000EDFDFF97E003002A810240F91501003445 +:10181000216440B9BF3F03D5212840920008C19AF6 +:10182000730600110008D31AA9FFFF17216840B9F9 +:10183000F9FFFF1781138052E00314AA02188052A7 +:10184000DDFDFF97E003002A810240F975000034B6 +:1018500021B840B9F0FFFF1721BC40B9EEFFFF17D8 +:1018600025BFFF97EFFFFF1733BFFF97EDFFFF1770 +:1018700034BFFF97EBFFFF17E00314AA65FFFF9744 +:10188000E003002A92FFFF17E00314AA61FFFF970D +:10189000A4FFFF17A00080928DFFFF17C10228361A +:1018A000FD7BBEA9FD030091F35301A913FC0011B8 +:1018B00073661A12000880D2737E4093E10313AA64 +:1018C000BBD2FF97F40300AAE00000B4E20313AA1E +:1018D000010080528CEFFF978102138BE00314AA62 +:1018E00086C1FF97E00314AAF35341A9FD7BC2A868 +:1018F000C0035FD6017C4093200080D275D2FF17D1 +:10190000FD7BB9A9FD030091F35301A9F40301AADA +:10191000F55B02A9F60300AAF76303A9F80303AA7B +:10192000F70306AAF96B04A9F90302AAFA0304AAA9 +:10193000FB2B00F9FB0305AA460000B4DF0000F909 +:10194000591100B4800A40B9E1A301917A030094CF +:10195000F503002A400C0035011380D2200080D20C +:101960005CD2FF97F30300AA401000B415E0019188 +:1019700000A0019101008012B55600A9000000A945 +:1019800060620191000000A9746600A9E03740F987 +:10199000780A00F97ADA02A9602200F9618E00B9AA +:1019A0007B4A00F9000440F9017440B90101003795 +:1019B000E03740F9010440F9217440B9810108374A +:1019C00016040094608E00B909000014010040F96B +:1019D00001FFFFB4FBFEFFB7406A40F9633202919A +:1019E000E2031B2AA3EBFF9740FEFF35805E40B960 +:1019F00040010034380100B5608A40B900001F3250 +:101A0000608A00B9200080D2815E80B931D2FF9710 +:101A1000400A00B4600A00F9E03740F9000440F9D8 +:101A2000016840B921010034608A40B9217C4093AB +:101A300000001C32608A00B9200080D225D2FF97B6 +:101A4000C00800B4601200F9D60200B4C00240F928 +:101A5000016440B9A1000035C02240F9000440F9FA +:101A6000017040B921010034608A40B9217C409363 +:101A700000001D32608A00B9200080D215D2FF9785 +:101A8000C00600B4600E00F9C13A40F9D53A00F939 +:101A9000C0A20191603E00F9A10600F9350000F9ED +:101AA000E00313AAE8040094F503002AA00500351A +:101AB000810E40F9410200B5360300B5E03740F928 +:101AC000000440F9010840F9A10300B5370400B54E +:101AD000608A40B900001A32608A00B9E003152A12 +:101AE000F35341A9F55B42A9F76343A9F96B44A9F4 +:101AF000FB2B40F9FD7BC7A8C0035FD6E00313AA08 +:101B000020003FD6F403002A80FDFF34E00313AA2F +:101B1000F503142ADCCFFF97F1FFFF17C00240F94D +:101B2000012040F9C1FCFFB4E00313AA20003FD616 +:101B3000F403002A40FCFF34F5FFFF17E00313AA6B +:101B400020003FD6F403002A20FCFF34F0FFFF17EB +:101B5000F30200F9DFFFFF1774018012ECFFFF179B +:101B6000F403002AEAFFFF17B5028012DCFFFF171B +:101B700075018012DAFFFF17E60305AAE50304AA40 +:101B8000E40303AA030080D25EFFFF17FD7BBDA91B +:101B9000FD030091F35301A9F40300AAF30302AA81 +:101BA000F55B02A9361C0012F50303AA400040F9B8 +:101BB00028010094C00100B4E10300AA76000034BB +:101BC000007040B9E0011036E60315AAE00314AA3C +:101BD000620E40A905008092F35341A9040080D20F +:101BE000F55B42A9FD7BC3A846FFFF1720008012CA +:101BF000F35341A9F55B42A9FD7BC3A8C0035FD69F +:101C000000008012FBFFFF17800800B4FD7BBEA917 +:101C1000FD030091F35301A9F30300AA008840B922 +:101C2000600060360000805231000014601A40F9F4 +:101C3000800400B5740240F9805A40B9C0040035F0 +:101C4000602240F9010440F9206440B9E00000340A +:101C5000622640F9A20000B5217440B910FFFF9739 +:101C6000400400B4602600F9611A40F9C10100B4D3 +:101C7000200040F9006040B9A0000035202040F964 +:101C8000000440F9006C40B9E0000034612A40F9DA +:101C9000A10000B5817240B901FFFF97600200B456 +:101CA000602A00F9600240F9011C40F9A10200B568 +:101CB000608A40B900001432608A00B9DAFFFF1769 +:101CC000D2FFFF9740010035608A40B940FB67367C +:101CD000D5FFFF17611E40F941FBFFB5817240B986 +:101CE000EFFEFF97A00000B560018012F35341A9F9 +:101CF000FD7BC2A8C0035FD6601E00F9D1FFFF17AD +:101D0000604A40F960FDFFB7E00313AA20003FD608 +:101D100000FDFF34F6FFFF17A0028012C0035FD65C +:101D2000000700B4FD7BBEA9FD030091F35301A998 +:101D3000F30300AA018840B9A100003600008052D8 +:101D4000F35341A9FD7BC2A8C0035FD6140040F93C +:101D5000AEFFFF9720010035601A40F9600100B521 +:101D6000608A40B900000032608A00B9E00313AA1B +:101D70005104009440010034618A40B921781F1257 +:101D8000618A00B9EFFFFF17E6FFFF9760FFFF359D +:101D9000608A40B960FE0736E9FFFF17601A40F914 +:101DA000A00100B5604A40F9A000F8B7E00313AA0B +:101DB0000100805265FBFF9700FEFF35811240F95C +:101DC000810100B5E00313AA5504009480FBFF34A1 +:101DD000EAFFFF17000040F9012440F941FEFFB47B +:101DE000E00313AA20003FD6E0FDFF34E3FFFF1716 +:101DF000E00313AA20003FD660FEFF34DFFFFF1789 +:101E0000A0028012C0035FD6400000B4000840F971 +:101E1000C0035FD6400000B4000C40F9C0035FD699 +:101E2000400000B4001040F9C0035FD6400000B489 +:101E3000001C40F9C0035FD6400000B4002440F904 +:101E4000C0035FD6400000B4002840F9C0035FD64D +:101E5000023440F903A001915F0003EB40E001D19F +:101E600000109F9A200000F900008052C0035FD646 +:101E7000010040F9221840F9233C40F942A00191A9 +:101E800061E001D17F0002EB21109F9A010000F96F +:101E900000008052C0035FD65F0000F9038C46F853 +:101EA00063E001D1E40303AA858C47F89F0000EBAF +:101EB000610000544002801208000014642040F9C0 +:101EC000840440F9840840B93F00046B8100005449 +:101ED00000008052430000F9C0035FD6A3E001D1A7 +:101EE000F1FFFF17001840F9C0035FD6001440F956 +:101EF000C0035FD6002040F9000440F9000840B953 +:101F0000C0035FD6018840B921001932018800B9A9 +:101F1000C0035FD6012400F9C0035FD6FD7BBDA9D5 +:101F2000FD030091F35301A9F40300AAF303012A6E +:101F3000F51300F9154840F9406A40F9E103152A04 +:101F400071E7FF97E103002A406A40F9E403132A8E +:101F5000E203152A06008052050080D2630000F0DB +:101F600063A40B9178EBFF97F30300AA1F0400B161 +:101F700060010054801A40F9DFFFFF971FB801711C +:101F8000E1000054E10313AAF51340F9801A40F967 +:101F9000F35341A9FD7BC3A812040014E00313AA64 +:101FA000F35341A9F51340F9FD7BC3A8C0035FD6E5 +:101FB000FD7BBEA9E303012AE40302AAFD0300910D +:101FC000F35301A9F30300AAF403012A019040B9D5 +:101FD00005008052406A40F9620000F042A40B9173 +:101FE00083EBFF97E103142AE00313AAF35341A9FB +:101FF000FD7BC2A8CAFFFF17FD7BBFA9FD030091AF +:10200000ECFFFF971F0400B141000054000080D294 +:10201000FD7BC1A8C0035FD601008052C0FFFF173F +:10202000FD7BBFA9FD030091BDFFFF971F0400B119 +:1020300041000054000080D2FD7BC1A8C0035FD6E0 +:1020400001008052F7FFFF17F6FFFF17FDFFFF1794 +:10205000FD7BBDA9810000B021E02691FD03009128 +:10206000F35301A99400009094C23B91330014CB28 +:10207000F51300F9F50300AAE0EB03B273FE4393F6 +:10208000E0DD9DF2737E009B000F80527352209B17 +:102090007F0214EBE1000054140080D2E00314AA84 +:1020A000F35341A9F51340F9FD7BC3A8C0035FD6E4 +:1020B000810240F9E00315AA3FEDFF9700FFFF34CE +:1020C00094E20191F3FFFF17810000B0E203002AC0 +:1020D00020802A91810000D021200E91E3EB03B2F1 +:1020E000210000CBE3DD9DF221FC4393217C039B87 +:1020F000030F80522100239B3F0000EB610000543E +:10210000000080D2C0035FD6030840B97F00026B95 +:10211000A0FFFF5400E00191F8FFFF17FD7BB9A974 +:10212000FD030091F35301A9940000B094E22691BD +:10213000F96B04A93A1C0012810000B021202791FC +:10214000F90300AA210014CBF55B02A91500805207 +:1021500033FC4493F76303A958018052FB2B00F929 +:10216000FB03132A170080D2160080527F03176BDF +:102170000C020054BF020071A41A4B3AB512961A11 +:10218000DF2E00316100005418070071A1FEFF54DA +:10219000E003152AF35341A9F55B42A9F76343A96C +:1021A000F96B44A9FB2B40F9FD7BC7A8C0035FD6A0 +:1021B000E1031A2AE3A301918212178BE00319AA03 +:1021C00073FEFF97010400113F0400718900005461 +:1021D000DF0200710018423AD602801AF706009119 +:1021E000E3FFFF17FD7BBDA9FD030091F35301A998 +:1021F000F30300AAF40302AAE00301AAF55B02A913 +:10220000F50303AAF60304AA92FFFF97600100B446 +:10221000E10300AAE50316AAE40315AAE20314AA3F +:10222000E00313AA030080D2F35341A9F55B42A94E +:10223000FD7BC3A851FEFF1720008012F35341A974 +:10224000F55B42A9FD7BC3A8C0035FD6E40303AAE4 +:1022500003008092E4FFFF17FD7BB7A9FD03009107 +:10226000F35301A993000090F40301AAF55B02A9BE +:1022700073C23B91960000B0F76303A9D6E22691A2 +:10228000F50302AAF96B04A9F80303AAFB7305A9D5 +:102290009C1C0012E03F00F9420000B45F0000F90E +:1022A000E00314AABD030094E2130291610000B0A0 +:1022B000217C1591E03B00F9E00314AAEC030094A3 +:1022C000F70300AAE00200B4D60213CBE0EB03B29E +:1022D000E0DD9DF2D6FE4393D67E009B000F805238 +:1022E000C04E209B16008052E03700F9E08740B9CD +:1022F0001F00166BCD010054FBC2368BFA0313AAE4 +:10230000E03740F91F001AEB21020054E0031BAA3A +:10231000C9ECFF9700040091D602000BF4FFFF17F1 +:10232000E08740B91F040031410000540000805292 +:10233000F35341A9F55B42A9F76343A9F96B44A99B +:10234000FB7345A9FD7BC9A8C0035FD6F80000B4A4 +:102350005F0318EB600000545AE30191E9FFFF1797 +:10236000590B40F9390400B4590B40F979FFFFB417 +:10237000200340F920FFFFB4E1031BAA8EECFF9776 +:102380006000003439430091FAFFFF17BC020034AB +:10239000E00314AAF50300941F1C007261000054AE +:1023A000407340B940FC1736D90100B5030080D214 +:1023B000E20347A9E5230291E40314AAE1031AAA60 +:1023C000EEFDFF971F4C003120FAFF5420FBFF3534 +:1023D000F5FAFFB4E14740F9A10200F9D5FFFF1774 +:1023E000230740F9F3FFFF173CFEFF34E9FFFF1717 +:1023F000FD7BBCA9FD030091F35301A9F55B02A984 +:10240000F76303A92105F8B7F50300AA561C0012CB +:10241000406A40F9170080121400805210E4FF97C0 +:102420001F00007113A0971A737E40937F0600B1BE +:10243000E1000054E003142AF35341A9F55B42A9DB +:10244000F76343A9FD7BC4A8C0035FD6E00313AACA +:1024500052030094406A40F9F803132AE103132A57 +:10246000F4E8FF9740010034E403162AE10313AABD +:10247000E00315AA030080D2020080D277FFFF9705 +:102480001F000071801A407A9412801A406A40F945 +:10249000E103182AFFE3FF971F00007113A0971AAA +:1024A000737E4093E2FFFF1714008052E2FFFF1794 +:1024B000FD7BBDA9FD030091F35301A9F30300AA1D +:1024C000F51300F9351C0072004840F94101005431 +:1024D000608A40B980017836E00313AA11FEFF97A5 +:1024E00020010034F35341A9F51340F9FD7BC3A843 +:1024F000C0035FD66001F8B6600240F9007040B9D1 +:1025000080FE1737748E46F894E201D180E2019183 +:102510001F0013EBE100005400008052F2FFFF1790 +:10252000920300941F1C007241FDFF54F3FFFF173C +:10253000E00314AAE103152ADEFFFF97943E40F959 +:10254000F2FFFF17405640F9C00200B5FD7BBFA95E +:1025500040E2029182000090FD030091406600F984 +:1025600042200A91000000A943A20291010080527A +:10257000000080D286FDFF9700010035415640F9EA +:102580003F4800F9405640F9E6FDFF9760000035EE +:1025900041820691210400A9FD7BC1A8C0035FD63A +:1025A000A0028012C0035FD6FD7BBFA9E103002A11 +:1025B000FD030091405640F9D9FEFF971F080031F6 +:1025C0004100005400008052FD7BC1A8C0035FD6CB +:1025D000420640F9014840F9E20322AA42000012F3 +:1025E00084FFFF17435640F9E203002A010080D21E +:1025F000E00303AA7FFFFF17FD7BBBA9FD0300914A +:10260000F35301A9141C0012600000D000C0149103 +:10261000E01F00F9600000B000D40B91E02300F946 +:10262000600000B000F40B91F51300F9E02700F909 +:10263000E003142AECFFFF97A0010035F5E30091B9 +:10264000130080D2A07A73F8FF020094E10300AA7D +:10265000405640F9E203142A66FFFF9780000035D8 +:10266000730600917F0E00F1E1FEFF54F35341A980 +:10267000F51340F9FD7BC5A8C0035FD6000080526A +:10268000C0035FD6FD7BBEA9FD030091F30B00F9EB +:10269000131C001200008052ABFFFF97E0010035D1 +:1026A000E003132AC1FFFF9780010035E003132ADE +:1026B000D2FFFF9720010035E003132AF0FFFF97B8 +:1026C000C0000035E103132AF30B40F9FD7BC2A8DB +:1026D000405640F977FFFF17F30B40F9FD7BC2A886 +:1026E000C0035FD6E303002AE20312AA405640F972 +:1026F000400100B4406640F9010040F9208000D15B +:10270000E10300AA446440F9250C42F89F0001EB64 +:1027100061000054000080D2C0035FD6010440F97C +:10272000210840B93F00036B80FFFF54A08000D117 +:10273000F4FFFF17FD7BBCA9FD030091F35301A932 +:10274000F55B02A9F71B00F9F70301AA416640F9FE +:10275000010800B4FF0200F9E603002AE2FFFF9738 +:10276000400700B5E003062A58FEFF97F60300AACB +:10277000400700B4010680D2200080D2D5CEFF975A +:10278000F30300AAE00600B4C16240B9C1000034FE +:10279000217C4093200080D2CECEFF97200500B44C +:1027A000600200F97582009160420091760600F99E +:1027B000B55600A9000000A9406640F9010040F9A3 +:1027C000350400F9611200F9A00600F9150000F9BE +:1027D000C12A40F9010300B4E00313AA20003FD648 +:1027E000F403002A80020034C06240B98000003443 +:1027F000600240F9A4CCFF977F0200F9611240F912 +:10280000A00640F9200400F9010000F97F1200F948 +:10281000BF0600F9E00313AA9BCCFF97E003142A3C +:10282000F35341A9F55B42A9F71B40F9FD7BC4A80E +:10283000C0035FD6F30200F914008052F8FFFF17BF +:1028400074018012F4FFFF17E00200F9FBFFFF178D +:1028500054048012F2FFFF17F40B8012F0FFFF17F1 +:1028600074018012EEFFFF17FD7BBDA9FD030091EF +:10287000F35301A9F303012AF40302AA5F0000F94C +:10288000E1A30091ACFFFF9700020035E11740F98A +:1028900024400091230840F99F0003EBE00000541E +:1028A000636001D1E103132AE20303AA458C45F8D2 +:1028B0009F0002EB610000544002801203000014EC +:1028C000A1000035830200F9F35341A9FD7BC3A8A1 +:1028D000C0035FD6A36001D121040051F3FFFF17AD +:1028E000FD7BBDA9FD030091F30B00F9F30301AAE1 +:1028F0003F0000F9E1A300918FFFFF970001003531 +:10290000E11740F922400091210840F93F0002EB15 +:1029100060000054216001D1610200F9F30B40F91D +:10292000FD7BC3A8C0035FD6FD7BBBA9FD0300915F +:102930007F0000F9F35301A9F55B02A9F76303A92E +:10294000610400B4F60301AA557C4093F70303AA7F +:10295000E123019178FFFF97F303002A80020035FD +:10296000F82740F9140F41F8946201D18062019177 +:102970001F0018EB61000054530280120C00001479 +:10298000800640F9E20315AAE10316AA13EBFF97AC +:10299000F303002A80010035800640F926EBFF97FB +:1029A000BF0200EB01010054F40200F9E003132A16 +:1029B000F35341A9F55B42A9F76343A9FD7BC5A881 +:1029C000C0035FD6942E40F9E8FFFF17B3028012D0 +:1029D000F7FFFF17FD7BBDA9FD030091F35301A98C +:1029E000F403002AF30301AAE00301AAF51300F996 +:1029F000F50302AA10EBFF97E30315AAE203002AEE +:102A0000E10313AAE003142AF35341A9F51340F993 +:102A1000FD7BC3A8C5FFFF17FD7BBEA9FD03009189 +:102A2000F30B00F9F30300AA000440F9017440B964 +:102A300021020036426A40F9010040F9C20100B4A7 +:102A4000406A40F9D5E7FF97E10313AA220C41F849 +:102A5000426001D1E30302AA648C45F87F0001EBD8 +:102A6000E100005400040011F30B40F9FD7BC2A803 +:102A7000C0035FD600008012F4FFFF17428C40B9FC +:102A80001F00026B00A0821A826001D1F2FFFF17C3 +:102A90005F0000F93F0400316100005440028012E1 +:102AA000C0035FD6FD7BBDA9FD030091F35301A9CF +:102AB000F303012AF40302AAE1A300911EFFFF978A +:102AC00020010035E11740F9230C41F8636001D182 +:102AD000E20303AA448C45F85F0001EBA100005417 +:102AE00040028012F35341A9FD7BC3A8C0035FD607 +:102AF000628C40B95F00136B61000054830200F9DF +:102B0000F9FFFF17836001D1F2FFFF175F0000F9A3 +:102B10006100F83640028012C0035FD6FD7BBDA97C +:102B2000FD030091F35301A9F303012AF40302AA60 +:102B3000E1A3009100FFFF9720010035E11740F964 +:102B4000230C41F8636001D1E20303AA448C45F8E9 +:102B50005F0001EBA100005440028012F35341A931 +:102B6000FD7BC3A8C0035FD6624840F97F02026BB9 +:102B700061000054830200F9F9FFFF17836001D15F +:102B8000F2FFFF175F0000F96100F8B64002801203 +:102B9000C0035FD6FD7BBDA9FD030091F35301A9DE +:102BA000F30301AAF40302AAE1A30091E2FEFF9756 +:102BB00020010035E11740F9230C41F8636001D191 +:102BC000E20303AA448C45F85F0001EBA100005426 +:102BD00040028012F35341A9FD7BC3A8C0035FD616 +:102BE000624840F95F0013EB61000054830200F972 +:102BF000F9FFFF17836001D1F2FFFF17FD7BBCA92E +:102C0000FD030091F35301A9F40301AAE1E300914C +:102C1000F51300F9F50302AAC7FEFF97200200355D +:102C2000E01F40F9130C41F8736201D1E30313AACA +:102C3000618C45F87F0000EB610000544002801277 +:102C400008000014620240F95F0014EB21010054F7 +:102C5000E00313AA33FCFF9740000035B30200F9EC +:102C6000F35341A9F51340F9FD7BC4A8C0035FD617 +:102C7000336001D1EEFFFF17C1010035FD7BBEA916 +:102C8000FD030091F35301A9F40300AAF30302AA80 +:102C900024FCFF97E103002A40000035740200F98C +:102CA000E003012AF35341A9FD7BC2A8C0035FD60C +:102CB000E003012AC0035FD6FD7BBDA9FD0300919F +:102CC000F30B00F9F30302AAE2A300917F0200F9DB +:102CD000E6FEFF97E103002AE01740F9E20313AA9A +:102CE000E6FFFF97F30B40F9FD7BC3A8C0035FD657 +:102CF000FD7BBDA9FD030091F30B00F9F30302AACC +:102D0000E2A300917F0200F933FFFF97E103002A5D +:102D1000E01740F9E20313AAD8FFFF97F30B40F93D +:102D2000FD7BC3A8C0035FD6FD7BBDA9FD03009159 +:102D3000F30B00F9F30302AAE2A300917F0200F96A +:102D400054FFFF97E103002AE01740F9E20313AABA +:102D5000CAFFFF97F30B40F9FD7BC3A8C0035FD602 +:102D6000FD7BBDA9FD030091F30B00F9F30302AA5B +:102D7000E2A300917F0200F965FFFF97E103002ABB +:102D8000E01740F9E20313AABCFFFF97F30B40F9E9 +:102D9000FD7BC3A8C0035FD6FD7BBDA9FD030091E9 +:102DA000F30B00F9F30302AAE2A300917F0200F9FA +:102DB00075FFFF97E103002AE01740F9E20313AA29 +:102DC000AEFFFF97F30B40F9FD7BC3A8C0035FD6AE +:102DD000FD7BBEA9FD030091F30B00F9F30301AAEB +:102DE0003F0000F9BFFEFF97E0000035610240F9A7 +:102DF000A10000B4F30B40F9E00301AAFD7BC2A8D7 +:102E0000C8FBFF17F30B40F9FD7BC2A8C0035FD6D8 +:102E1000FD7BBEA9FD030091F30B00F9F30301AAAA +:102E2000ECFFFF97A0000035600240F91F0000F1A1 +:102E300040028012E013801AF30B40F9FD7BC2A818 +:102E4000C0035FD6FD7BBEA9FD030091F35301A92A +:102E500014600191012040F921400091220440F9C1 +:102E6000340400F9018805A9540000F9011840F95B +:102E7000E10100B4212040F9210440F9211C40F96E +:102E8000610100B4F30300AA20003FD6A000003483 +:102E9000628645A9410400F9220000F97FFE05A9D8 +:102EA000F35341A9FD7BC2A8C0035FD60000805246 +:102EB000FCFFFF17FD7BBEA9FD030091F30B00F99A +:102EC000F30300AA012040F9210440F9211040F940 +:102ED000A10000B5601A40F9000100B50000805261 +:102EE0000300001420003FD660FFFF34F30B40F9CD +:102EF000FD7BC2A8C0035FD6002040F9000440F962 +:102F0000012040F9C1FEFFB4E00313AAF00301AAB7 +:102F1000F30B40F9FD7BC2A800021FD6FD7BBEA9C2 +:102F2000FD030091F30B00F9F30300AA011840F927 +:102F3000210100B5602240F9000440F9011440F974 +:102F4000810100B500008052F30B40F9FD7BC2A85F +:102F5000C0035FD6212040F9210440F9212440F923 +:102F6000A1FEFFB420003FD660FEFF34F7FFFF173D +:102F7000E00313AAF00301AAF30B40F9FD7BC2A8FA +:102F800000021FD6FD7BBDA9FD030091F35301A9EB +:102F9000F40300AAA3FBFF97F30300AA610000B0AB +:102FA000804A40F9E283009121F81691630080D2B3 +:102FB0006C000094E0000035E02340B9600200F9A5 +:102FC000E02740B9600A00F9E02B40B9600600F93B +:102FD000E00314AAF35341A9FD7BC3A87DFDFF17AD +:102FE000FD7BBEA9FD030091F30B00F9F30301AAD9 +:102FF0008CFBFF97010040F93F0013EB08010054E0 +:10300000020440F92200028B5F0013EB8900005498 +:10301000000840F97302008B730201CBE00313AA8E +:10302000F30B40F9FD7BC2A8C0035FD6FD7BBDA9B1 +:10303000FD030091F35301A9F303022AE20301AA5D +:10304000E103002AF40303AA406A40F9E3B30091C4 +:1030500069E2FF97C00100B462060011E12F80B958 +:10306000427C7E933F0002EB630100540000028B20 +:1030700000C05FB80008C05A800200B9000080524A +:10308000F35341A9FD7BC3A8C0035FD6A002801201 +:10309000FCFFFF1740098012FAFFFF17E30302AAA3 +:1030A00002008052E2FFFF17FD7BBEA9FD030091E5 +:1030B000E3730091E21F00B902008052DCFFFF972A +:1030C000E01F40B9FD7BC2A8C0035FD6FD7BBEA94F +:1030D000FD030091E21F00B9E2730091F0FFFF973A +:1030E000E01F40B9FD7BC2A8C0035FD6FD7BBDA930 +:1030F000FD030091F30B00F9F30302AAE20301AA16 +:10310000E103002A406A40F9E3B300913AE2FF97F5 +:10311000E00000B5730000B401008012610200B944 +:10312000F30B40F9FD7BC3A8C0035FD6B3FFFFB428 +:10313000E12F40B9FAFFFF17FD7BBEA9FD03009107 +:10314000E2730091EAFFFF97E11F40B91F0000F111 +:10315000A0028012FD7BC2A82010801AC0035FD697 +:10316000E403032AE30302AAE20301AAE103002A1B +:10317000406A40F94FE6FF17FD7BBFA9E10300AAB3 +:10318000FD030091406A40F9DFE2FF97007C409325 +:10319000FD7BC1A8C0035FD6E10300AA8000F8B799 +:1031A000406A40F9020080D240E1FF17000080D25F +:1031B000C0035FD6FD7BB9A9FD030091F35301A9BC +:1031C000F30305AAE503042AE403032AE30302AA9E +:1031D000E20301AAE103002A406A40F9E6A3009154 +:1031E00054E6FF97F403002A60010035E103452906 +:1031F000600A00B9020880D2603200913F0000717D +:1032000021A09F5A217C4093610200F9E1C3009103 +:1032100059E9FF97E003142AF35341A9FD7BC7A89E +:10322000C0035FD6E403032AE30302AAE20301AA70 +:10323000E103002A406A40F9060080D205008012AE +:103240003CE6FF17FD7BBFA9E10300AAFD03009147 +:10325000406A40F96EE2FF971F00007100A09F5A7C +:10326000FD7BC1A8007C4093C0035FD6E30302AAA4 +:10327000E20301AAE103002A406A40F9DEE1FF17F8 +:10328000FD7BBFA9020080D2FD030091F8FFFF97EC +:103290001F0000F1E0079F1AFD7BC1A8C0035FD6A5 +:1032A000F8FFFF17E10300AA406A40F90AE5FF179B +:1032B000E10300AA406A40F914E5FF17FD7BBCA9B1 +:1032C000FD030091F35301A9F30300AAF40302AA3A +:1032D000F55B02A9F503012AF71B00F9771C001220 +:1032E000620000B4E07F40B2400000F9E00313AA9E +:1032F000A2FFFF97ECFFFF97F603002AE00313AA53 +:103300009EFFFF97EBFFFF97E503002AE703172ACD +:10331000E60314AAE403162AE303152AE103132A99 +:10332000620000B0F35341A942A40B91F55B42A99E +:10333000F71B40F9FD7BC4A8406A40F95DE6FF1722 +:1033400023008052DEFFFF17FD7BBEA9FD03009125 +:10335000E2630091FBFFFF97FD7BC2A8C0035FD62D +:1033600001008052F9FFFF1720008052C0035FD692 +:10337000FD7BBDA9E303012AE103002AFD030091BF +:10338000F30B00F9E4830091F30302AA620000B09A +:10339000406A40F942A40B91B4E6FF97A001F837C8 +:1033A000E00313AA020780D201008052D6E8FF97FB +:1033B000E01340F9600200F9E01740F9600600F9F7 +:1033C00000008052F30B40F9FD7BC3A8C0035FD619 +:1033D000A0028012FCFFFF17FD7BBFA9E403032AB4 +:1033E000E30302AAFD030091E20301AAE103002A1C +:1033F000406A40F955E2FF97007C4093FD7BC1A8ED +:10340000C0035FD6FD7BBEA9FD030091F35301A964 +:10341000F40300AAF303012A6000009000A835918C +:1034200089FFFF97C000F8B7E203132AE10314AA4B +:10343000F35341A9FD7BC2A81CFFFF17E003132A29 +:10344000F35341A9FD7BC2A8C0035FD6014840F9F0 +:103450006100F8B600008052C0035FD6FD7BBBA9B7 +:10346000FD030091F35301A9740000B094A60B91E1 +:10347000F55B02A9750000B0B5CA0A91F76303A90C +:10348000406A40F9F6DFFF971F00007100A09F5AC5 +:10349000137C40937F0600B1E1000054000080528D +:1034A000F35341A9F55B42A9F76343A9FD7BC5A886 +:1034B000C0035FD6E00313AA38FFFF97600000B592 +:1034C000A0028012F7FFFF17E3330191E10314AA72 +:1034D000E00313AA22008052D5FEFF97F703002ACB +:1034E00000FFFF35E00313AA9EFFFF97F80300AA31 +:1034F0001F0400B160FEFF54E2230191E10315AA0D +:10350000E00313AAFAFEFF97C0FDFFB4E14B80B9B8 +:10351000820180D2E57F40B22108C29AE14B00B916 +:10352000E14B40B9FF02016B0B010054406A40F9C6 +:10353000E103132AD7DFFF971F00007100A09F5AF5 +:10354000137C4093D4FFFF17020C402900300091F8 +:10355000E84F40B94108C05A4208C05A04C05FB899 +:10356000471000918608C05A8408C05A1F0107EB13 +:1035700062010054410000F0600000B021542A9123 +:1035800000200B9195EDFF97E14F40B9600000B02E +:1035900000B40B9191EDFF97CAFFFF17040100B42F +:1035A0003600180B6208C05A2100180B9F0005EB6B +:1035B00001010054BF3F03D5220000B9E103162AE0 +:1035C000210040B9BF3F03D5F7060011D5FFFF1713 +:1035D000230040B96200024A4200060A4200034A40 +:1035E000F6FFFF17014840F96100F8B6000080526D +:1035F000C0035FD6FD7BBBA9FD030091F35301A976 +:10360000740000B094A60B91F55B02A9750000B0A0 +:10361000B5CA0A91F76303A9406A40F990DFFF97A2 +:103620001F00007100A09F5A137C40937F0600B1D9 +:10363000E100005400008052F35341A9F55B42A918 +:10364000F76343A9FD7BC5A8C0035FD6E00313AAB7 +:10365000D2FEFF97600000B5A0028012F7FFFF17AF +:10366000E3330191E10314AAE00313AA220080527C +:103670006FFEFF97F703002A00FFFF35E00313AA50 +:1036800038FFFF97F80300AA1F0400B160FEFF5443 +:10369000E2230191E10315AAE00313AA94FEFF9728 +:1036A000C0FDFFB4E14B80B9820180D2E57F40B21A +:1036B0002108C29AE14B00B9E14B40B9FF02016B0E +:1036C0000B010054406A40F9E103132A71DFFF97B0 +:1036D0001F00007100A09F5A137C4093D4FFFF1776 +:1036E000020C402900300091E84F40B94108C05A0F +:1036F0004208C05A04C05FB8471000918608C05AFB +:103700008408C05A1F0107EB62010054410000F019 +:10371000600000B021A82A9100200B912FEDFF97A7 +:10372000E14F40B9600000B000B40B912BEDFF9762 +:10373000CAFFFF17040100B43600180B6208C05A14 +:103740002100180B9F0005EB01010054BF3F03D57A +:10375000220000B9E103162A210040B9BF3F03D57A +:10376000F7060011D5FFFF17230040B96200024A97 +:103770004200060A4200034AF6FFFF17600000B04D +:1037800000480C91FD7BBFA9FD0300914AC8FF973B +:103790006BB5FF97400E8012FD7BC1A8C0035FD6BA +:1037A000FD7BBDA9FD030091F35301A9F40300AA19 +:1037B000F303032AF55B02A9F50301AAF60302AAA3 +:1037C000E20316AAE10315AAE00314AA7F060094F7 +:1037D00080000034730600517F06003121FFFF5442 +:1037E000F35341A9F55B42A9FD7BC3A8C0035FD693 +:1037F000FD7BBCA9FD030091F30B00F9F30300AAC4 +:1038000020008052E043007920008052E02700B978 +:10381000FF2B00B941010034610240F9603E40B91C +:10382000210C40B90100010A00040312213C1912C5 +:103830002100002A21000232E12B00B9E18300912E +:10384000E00313AA020080D26006009460000035F5 +:10385000E12F40B9613E00B9F30B40F9FD7BC4A8EC +:10386000C0035FD6FD7BBCA9FD030091F30B00F9FB +:10387000F30300AA007D80D243E8FF97E00313AA78 +:10388000E1830091020080D2FF430079FFFF042909 +:103890004E060094F303002A6000003500FA80D23F +:1038A00039E8FF97E003132AF30B40F9FD7BC4A826 +:1038B000C0035FD63F1C0071A8030054FD7BBEA966 +:1038C000420000D042C00A91FD030091F35301A9C8 +:1038D00042486138630000106288228B40001FD686 +:1038E000134840F9134400F9148040B98406009449 +:1038F000F403142A730AD49A130C00F900008052BE +:10390000F35341A9FD7BC2A8C0035FD6134C40F915 +:10391000F5FFFF17135040F9F3FFFF172110005177 +:1039200001CC218B335440F9EFFFFF1700008012C8 +:10393000C0035FD6FD7BA3A9210080520100A272C3 +:10394000FD030091F35301A9020080D2F30300AA02 +:10395000F55B02A9B6028052F76303A9F96B04A9CB +:10396000FB2B00F9013400B9E1068052E123017913 +:1039700001E04079F69700B9213C1053E19B00B972 +:10398000E143029111060094F403002AC0040035BB +:1039900060068052F53F0491E0230179E00300B214 +:1039A000B5E67A92F50306A900018052E2830191FF +:1039B000E143029163008052E07300B9E00313AA6F +:1039C000F6FF122977FFFF97F403002AC0020035A3 +:1039D000A00240B90008C05A604A00B9A10640B927 +:1039E0002108C05A614E00B9016C58D33F040071E0 +:1039F000A00200543F080071C00200542100B052E0 +:103A0000610A00B980009036603640B90000033288 +:103A1000603600B9610A40B92000B0523F00006B27 +:103A200021020054E003142AF35341A9F55B42A993 +:103A3000F76343A9F96B44A9FB2B40F9FD7BDDA893 +:103A4000C0035FD6014081522100B072EDFFFF1725 +:103A50001F0071F24100B0526200B0522100821A80 +:103A6000E8FFFF17F53F069139FE9F52B5E67A92BF +:103A7000B6008052D7008052B8028052F91FA0725F +:103A8000FA0300B21B088052D6060071A001005450 +:103A9000E2E30191E1C30291E00313AAF5EB07A968 +:103AA000FB8B00B9F7630179F8E71629C705009485 +:103AB00060010035A01E40B90008C05A60FE8F3773 +:103AC000A00E40B90008C05AE0FA8F36603640B9FF +:103AD00000001E32603600B9D3FFFF17F403002A3E +:103AE000D1FFFF17FD7BBCA983008052020080D26A +:103AF000FD030091F30B00F9F30301AAA101805229 +:103B0000E1430079A1028052E12700B901E0407948 +:103B1000213C1053E12B00B9E183009121FFFF9775 +:103B200060000035E12F40B9610200B9F30B40F9A4 +:103B3000FD7BC4A8C0035FD6FD7BBAA9211C00127F +:103B40003F040071FD030091F35301A9F40300AA9F +:103B5000421C0012F51300F9E5179F1A5FCC0271A1 +:103B6000631C001201D8413940018052E4179F1AAA +:103B70003F000071337C001B813E80527312811A1A +:103B8000BF00046A8000005481DE413941000034E6 +:103B9000337C001B635C1853C00080526240022AD1 +:103BA000E083007942040832A0038052E1030191CE +:103BB00063008052E08B0829E00314AA020080D23F +:103BC000F8FEFF97E0030035000080D235E7FF974D +:103BD000027D805221008052F50300AAE00314AA5E +:103BE000627E021B270500941F000071A104801251 +:103BF0000410417A61020054B57E4092737E409376 +:103C0000E1F30091E00314AAB7FFFF97C00000356D +:103C1000E13F40B9E1013837211018123F0024710B +:103C200000010054800C80D257E7FF97E00315AAEB +:103C30001CE7FF971F0013EB43FEFF54A00D8012FB +:103C4000F35341A9F51340F9FD7BC6A8C0035FD625 +:103C500080008012FBFFFF1703CC40B963020035E0 +:103C6000FD7BBDA903028052FD030091E32300798F +:103C7000A3028052E387022901F040B9E10008362F +:103C8000E143009183008052020080D2C5FEFF977D +:103C9000FD7BC3A8C0035FD6E1430091020080D240 +:103CA0004A050094FBFFFF1700008052C0035FD657 +:103CB000FD7BBDA982018052FD030091E2230079C2 +:103CC000020840B9FF1B00B98201F837211C00121D +:103CD000A20280523F000071A10380522110821A7B +:103CE000020080D2E11700B9E1430091370500944A +:103CF000FD7BC3A8C0035FD6A1038052F9FFFF1765 +:103D0000FD7BB6A9FD030091F35301A9F40302AAB8 +:103D1000F55B02A9F60301AAF76303A9F70303AA57 +:103D2000F96B04A9FB7305A93EF8FF97F50300AAF8 +:103D3000000440B9540100B5140080D2E00314AA75 +:103D4000F35341A9F55B42A9F76343A9F96B44A971 +:103D5000FB7345A9FD7BCAA8C0035FD65305009439 +:103D6000F30300AAA0FEFFB4A12E4039E00315AA78 +:103D70007FF0FF9720FEFF37A20E40F98102168BDD +:103D80003F0002EBA90000546000009000C02E919B +:103D900092EBFF97E9FFFF17618240B9E00313AA96 +:103DA000AEFFFF97A0FCFF35E20314AAE10317AAB8 +:103DB000E00313AA7A000090E9040094F80314AA1F +:103DC000F903002A5A732F913C0080523F0318EBED +:103DD000618240B93593989A621E40B9BF0600F1DE +:103DE000F73700F9E0979F1A5F0000710044001157 +:103DF000E0030179207C161BE2A30191FC570E29F8 +:103E0000C012801AE08B00B9A0028052E17B00B999 +:103E1000E1030291E08700B9E00313AAEB040094E8 +:103E2000FB03002A60020035BF0600F1E9010054DF +:103E3000E00313AA010080529EFFFF976001003447 +:103E4000E0031AAA65EBFF97BFC23BEB61F7FF5493 +:103E5000608240B9D602158B180315EB175C159BD1 +:103E600061FBFF54B6FFFF17FB03152AF7FFFF178F +:103E70001B008052F5FFFF17FD7BBBA9020180529A +:103E8000FD030091E10F00F9E10300B2E11300F935 +:103E900001408052E2630079A2028052E12B00B916 +:103EA000E1C30091E2FF0629E2630091C704009498 +:103EB000FD7BC5A8C0035FD6FF8309D181FFB71280 +:103EC000FD7B00A9FD030091F35301A9020840B94D +:103ED000146C40F95F00016B09040054F37F0191F9 +:103EE00073E67A92E10313AAE4FFFF97C00000355E +:103EF00081824239608242393F00006BC000005429 +:103F000020098012FD7B40A9F35341A9FF83099149 +:103F1000C0035FD681764339607643393F00006B3A +:103F200001FFFF5481024339600243393F00006BB7 +:103F300081FEFF5481824339608243393F00006B28 +:103F400001FEFF546152039180520391820080D29E +:103F50003CE6FF9760FDFF3500008052EAFFFF1747 +:103F6000FF8309D1FD7B00A9FD030091F35301A953 +:103F7000F40300AAF303012A3F040071A0000054D7 +:103F800069030054200C00511F04007148030054C1 +:103F900023008052E00314AAC2088012210080523C +:103FA000E6FEFF97C0010035737A1E127F0600718E +:103FB00061010054F37F0191E00314AA73E67A9241 +:103FC000E10313AAADFFFF97A000003560E6423978 +:103FD0001F00007160418012E013801AFD7B40A930 +:103FE000F35341A9FF830991C0035FD603008052B8 +:103FF000E9FFFF17A0028012F9FFFF17CFFEFF179E +:10400000FFC309D182FFB752FD7B00A9FD030091D8 +:10401000F35301A9F55B02A9010840B92100020B85 +:104020008200B8123F00026B88100054F3BF019168 +:10403000F40300AA73E67A92E10313AA8FFFFF97B5 +:10404000F503002A000F0035806E40F9800000B5AE +:10405000004080D213C7FF97806E00F9806E40F950 +:10406000000F00B4E10313AA024080D2C2E5FF971B +:10407000610243393F200071880E0054400000B0B7 +:1040800000E00A9101D861B8E03F8052810A00B98E +:104090008000A8723F00006BA901005460D680B96F +:1040A00002D877D300D84BD31F0020F14900005429 +:1040B000824A00F9E09F80528000A8723F00006BA6 +:1040C0006900005460E2433980DA0139601E4339E7 +:1040D000766E423901040051211C0012D6020012F2 +:1040E0003F700071C10380520080811A80DE013967 +:1040F0006182423981CA0139608A433941000037FF +:104100006000003461CE423981D60139B6000034F6 +:1041100061824239610008366172423981CE0139CB +:10412000001C6FD3804E00F983A202916576029144 +:1041300060A242390200805226008052001C6FD3D8 +:10414000805200F9604602910400403901F05F3866 +:10415000843C10538120010B04E05F382100042BC4 +:104160004200861AF600003464824339847C219B25 +:1041700061764339217C049B21B06DD3610000F945 +:10418000000C009163200091BF0000EBE1FDFF54A3 +:1041900060824239DF02007142049F1A80000036BB +:1041A000607242391F1040F2410000540202003494 +:1041B00023008052E00314AAE103032A020A8012BA +:1041C0008FFFFF97E00200352000805260BE023969 +:1041D000801E40B900010034F600003460D680B97A +:1041E00000D877D3804A00F90300001460BE42393A +:1041F00000FF0737609E423980D20139609E433903 +:10420000001044D380120239E003152AFD7B40A937 +:10421000F35341A9F55B42A9FFC30991C0035FD6DF +:10422000F503002A806E40F900FFFFB416C6FF9721 +:104230009F6E00F9F5FFFF1715008052F3FFFF177F +:1042400075018012F1FFFF17B5028012EFFFFF1713 +:10425000FD7BBCA9FD030091F35301A9F403012ADE +:10426000F55B02A9F50300AA96008052F76303A943 +:10427000371C001238080012A3D64139E00315AAF2 +:10428000820980122100805263701D126300182A77 +:104290005BFFFF97F303002AC0000034D6060071CD +:1042A000C1FEFF549F0200710008533A01010054FF +:1042B000E103142AE00315AA7FFDFF97F303002A08 +:1042C000E00315AA0E040094172C0039E003132A0A +:1042D000F35341A9F55B42A9F76343A9FD7BC4A849 +:1042E000C0035FD6421C007201010054030040F974 +:1042F000641440B9631040B99F00016B8190811A2A +:104300003F00036B2120831A02800039012800B985 +:1043100053030014FD7BB8A9FD030091F35301A9D9 +:10432000F55B02A9361C0012F76303A9F96B04A917 +:10433000FB2B00F9011840B921110035E100805232 +:104340001F2800B901F000B9210080520180003916 +:10435000F30300AA42030094E00313AA5B03009452 +:10436000200A003500FA80D287E5FF97E00313AA00 +:1043700068030094400B0035607E40B9607A00B954 +:1043800020008052602600B97FCE00B9E00313AA56 +:104390007FEA00B93203009402008052010080528B +:1043A000E00313AAD0FFFF97E00313AA2EFDFF97A7 +:1043B000F403002A40090035E00313AAD003009457 +:1043C0001F2C003900018052E0C300794115805252 +:1043D000600240F9020080D2000C40B91F20117227 +:1043E000403580520010811AE06B00B9A002805263 +:1043F000E1830191E06700B9E00313AA730300941D +:10440000C0000035E0B341391FA8027161000054BB +:104410004000B052600A00B9357D8052F7068052E4 +:10442000B8028052390580523A0080525B00B05287 +:10443000E1830191E00313AA020080D2F7C300795F +:10444000F8FF0C296103009480050035600240F9F3 +:10445000F9C30079FA6700B9620A40B9000C40B9A3 +:104460005F001B6B020080D200201112010002329B +:104470002000801AE1830191E06B00B9E00313AAE8 +:1044800052030094A0030035E16F40B94101F837B1 +:10449000B506007160030054007D80D23AE5FF97B5 +:1044A000E4FFFF17603A40B900681612603A00B99D +:1044B000AFFFFF17630A40B94200B0527F00026BA2 +:1044C000600000542200B052620A00B9613E00B997 +:1044D00021785ED3611E00B97FE20079F35341A9D0 +:1044E000F55B42A9F76343A9F96B44A9FB2B40F99B +:1044F000FD7BC8A8C0035FD61FB8013101FFFF5480 +:10450000E00313AAD8FCFF97000080D2E5E4FF97F0 +:10451000F503002A9F020071E00313AAE1079F1A26 +:10452000B4FCFF9720020035613E40B92101F83705 +:10453000E00315AADBE4FF971FA00FF14801005428 +:10454000800C80D2940600110FE5FF97F2FFFF1751 +:104550002100805261220339E1FFFF1700008052E1 +:10456000DFFFFF17A00D8012B6000035E103002A1F +:10457000400000F000DC2F9198E9FF97C00B8012FB +:10458000D7FFFF17FD7BBEA9220080520200A27256 +:10459000FD030091F30B00F9F30300AA010040F9B9 +:1045A000210840B92100022A013800B9D002009444 +:1045B000E00313AABC020094200100357F1A00B961 +:1045C000400000F000EC339184E9FF97400F801227 +:1045D000F30B40F9FD7BC2A8C0035FD6E00313AA2A +:1045E000010080524CFFFF9740FFFF3521008052B1 +:1045F00061260339F7FFFF17FD7BABA9FD0300918F +:10460000F35301A9F55B02A9F76303A9F96B04A9A8 +:10461000FB7305A9FC0300AA006840F907F6FF97A1 +:104620001C0000F9961B40B9B6490035000080D245 +:104630009CE4FF97802743394008003480234339A6 +:104640009F2703396009003540008052E02301793B +:10465000E0008052E0FF122980F340B9400C0036A0 +:10466000E1430291E0031CAA83008052020080D241 +:104670004CFCFF9740320035E1730291020280D278 +:10468000808301913CE4FF9760008052E023017930 +:1046900080E34079E1430291020080D2003C105354 +:1046A000E09B00B9A0028052E09700B9E0031CAA89 +:1046B000C602009440300035800B40B96000F836E7 +:1046C000E03F417980E3007920018052E0230179C5 +:1046D000E0008052E09700B980E34079E143029125 +:1046E000020080D2003C1053E09B00B9E0031CAAFA +:1046F000B6020094402E0035E18F5429810F0B291A +:10470000E283532982030A29840B40B90300A8528B +:104710009F00036B8107005443745AD36304005114 +:104720007F0C0071A8060054440000B084200A9158 +:10473000845863786300001064A8248B80001FD61F +:10474000E0031CAA90FFFF97F303002A80F7FF34D1 +:10475000E003132AF35341A9F55B42A9F76343A988 +:10476000F96B44A9FB7345A9FD7BD5A8C0035FD6AF +:10477000803F40B99F2303396002F837E0031CAA49 +:1047800039FCFF97000080D246E4FF97F30300AAAC +:10479000E0031CAA2100805216FCFF970029003577 +:1047A000803F40B90001F837E00313AA3DE4FF97CA +:1047B0001FA00FF1883D0054800C80D272E4FF9757 +:1047C000F4FFFF170000A852800B00B9803F40B9EA +:1047D00000785ED3801F00B92000805280E300790A +:1047E0009AFFFF17E1430291E0031CAA020080D266 +:1047F00076020094A0FFFF17034080522300A872A6 +:10480000830B00B9441843D3430000F06344349150 +:10481000420840929FCF00B99FEB00B963686438AB +:10482000440000B084600791827862B8044C50D391 +:10483000627C021B03304CD3820B0F292200805272 +:10484000834700B94220C41A841F40B9840B003446 +:10485000001410530040412A010180D221080011A8 +:10486000000400915F0008719F7F0AA90020C19A8F +:10487000417C40939F7F0BA99F6300F9007C019BC3 +:10488000807F09A90040805242D0801A828300B9FB +:1048900083010034804340B91F04003120010054DB +:1048A000003C105381008052020080D2E123017944 +:1048B000E1430291FF831229E0031CAA4302009402 +:1048C000E0008052E0230179A0028052E09700B915 +:1048D00080E34079E1430291020080D2003C105312 +:1048E000E09B00B9E0031CAA38020094801E00354A +:1048F0000000801280D70139E0031CAAC1FDFF9798 +:10490000E01D0035E0031CAA7D020094012C403913 +:10491000E0031CAAE8FBFF97F303002A001D003503 +:10492000830B40B9231DF836E0031CAA02FCFF9755 +:10493000601C00350000A4D2953740B90000E2F2B7 +:10494000E03B00F9803B40B9F83F0491540000B0CF +:1049500018E77A92B502000A94720B91B56A1612A2 +:10496000400080D2E03700F9810240B92000805237 +:104970000020C11A1F00156AA1020054E03740F957 +:10498000942200911F0400F120190054200080D2CD +:10499000E03700F9F5FFFF170380805298FFFF17FB +:1049A000034080524300A87296FFFF176300A8528D +:1049B00094FFFF178300A85292FFFF1700241E5395 +:1049C0000078412A21444FD3A5FFFF17170080D25A +:1049D0001A00A852E0C30191196877B8800640B95F +:1049E000A002000A1F00196AA01500543F031A6BA9 +:1049F000C01200540000A4523F03006BA0120054E8 +:104A00000000A2523F03006BFB179F1A400280D2A6 +:104A10000024DB9A60130036E0068052E0A301799F +:104A200080E34079A5028052E1430391020080D2E5 +:104A3000003C1053E5831A29E0031CAAE30100940B +:104A4000001200357F130071C0008052E0A301798D +:104A5000E0179F1AA5028052E143039100781F538B +:104A6000020080D2E5831A29E0031CAAD701009432 +:104A7000FB03002A601000353F031A6BE00E005460 +:104A80000000A4523F03006BC00E00540000A2526D +:104A90003F03006BE0179F1A802700B9E0031CAAB0 +:104AA0006F010094820B40B92100B052800240B9DE +:104AB0005F00016B80030054800000341F08007108 +:104AC000010E00543B008052C0008052E063017927 +:104AD000A0028052E0B700B900FE9F52E2E30191CC +:104AE000E01FB0726003002AE0BB00B9E00300B22F +:104AF000E04300F900088052E1C30291F83F00F959 +:104B0000E08B00B9E0031CAAB0010094A00B0035B3 +:104B1000001340B90008C05A006C58D31F001B6B2B +:104B2000010B0054800240B980EB00B9E009003568 +:104B3000967F40B91F100071967B00B9E0179F1A4D +:104B400080CF00B9E103162AE0031CAA02008052BC +:104B5000E5FDFF9780EB40B980EF00B980CF40B909 +:104B60006000003400408052808300B9E0031CAA3A +:104B7000E30100941F140079F40300AA1F300039E8 +:104B8000808340B9E103002A1FE40272811200F918 +:104B9000E1079F1A1FF00172E2079F1A1FCC0472EF +:104BA0004104010BE2079F1A1F9C08722208020BA6 +:104BB000E1079F1A1F3C1072E0079F1A410C010B7E +:104BC0002010000B802A00B9818340B9804740F94A +:104BD0000008C19A410000F021843291800E00F952 +:104BE00080B2009184DF407983D34079828F41394C +:104BF000D0E7FF9787AF41398056019182834139D1 +:104C0000410000F0836740B921DC3291661C00123C +:104C1000653C48D3645C50D3637C1853C5E7FF9769 +:104C2000826B40B980AA0191410000F021103391BC +:104C3000434C50D3425C54D3BEE7FF9720008052D0 +:104C4000801B00B9C3FEFF171B01805270FFFF17C6 +:104C50009B0080526EFFFF17000180528FFFFF17ED +:104C6000800080528DFFFF171F30007148F6FF54FF +:104C7000410000B021600891365860B8AEFFFF17C0 +:104C8000817F40B9E0031CAA817B00B902008052F9 +:104C90009FCF00B99FEB00B993FDFF97F7120091EA +:104CA000FF2200F1C0E6FF544BFFFF17400000F069 +:104CB00000943091C9E7FF9760418012F303002A06 +:104CC0009F1B00B9A3FEFF17200080520000A272B4 +:104CD000803700B980FFB712826F40F97F00006B08 +:104CE000A9020054820000B5400000F000F83091A5 +:104CF000F1FFFF17200080520000AE72803700B92C +:104D00004110433981E300B9E10008363F041E72C7 +:104D1000240280520400AE720000841A00001D328A +:104D2000803700B9803740B96100003600041F3277 +:104D3000803700B99783462981FFB7127F00016B46 +:104D4000A9F0FF54A2FBFFB4817F40B9F702000A2B +:104D5000560000B0590000B05A0000F0E0031CAA51 +:104D6000D6420A91396308915AA7319102008052C4 +:104D700014008052980080D25BFDFF97C10240B9B9 +:104D8000200080520020C11A1F00176A000800543A +:104D9000550000B0B5720691FB0315AAC00240B9D8 +:104DA000A11240391F100071E0179F1A3F00006BDD +:104DB00061060054C00640B9A10240B9E002000AF1 +:104DC0001F00016AC0050054A30A40B9E0031CAAF1 +:104DD000020980122100805263781D1288FCFF971F +:104DE000F403002AC0020035A00240B90100A85215 +:104DF0001F00016BC00500540100A4521F00016B8D +:104E0000A00500540100A2521F00016BE0179F1A79 +:104E1000802700B9E0031CAA91000094C10240B9A8 +:104E20003F2C0071C1040054400000F00044319157 +:104E3000614180127441801268E7FF97030080523D +:104E40000209801221008052E0031CAA6CFCFF972B +:104E50009FCF00B9817F40B9E0031CAA817B00B9D4 +:104E6000020080529FEB00B91FFDFF972000805287 +:104E7000802700B9E0031CAA79000094B5320091A4 +:104E800060F30091BF0200EBA1F8FF54D62200911D +:104E9000180700F141F7FF54E103142A400000F025 +:104EA000000C32914DE7FF9784FFFF1700018052FD +:104EB000D8FFFF1780008052D6FFFF173F300071E8 +:104EC00081000054E0031AAA61418012DAFFFF1743 +:104ED000E0031CAA23FCFF97F403002A00FBFF3524 +:104EE000A30A40B923021037C00240B980EB00B9D1 +:104EF000A0020035817F40B91F100071817B00B98D +:104F0000E0179F1A80CF00B902008052E0031CAA6C +:104F1000F5FCFF97E0031CAAE8FBFF97F403002AC7 +:104F2000E0F8FF350CFFFF17E0031CAA020980120E +:104F30002100805232FCFF97F403002A60FDFF3409 +:104F4000BFFFFF171F30007168000054215B60B87D +:104F5000EAFFFF1701008052E8FFFF17130080529D +:104F6000FCFDFF17C00B801255FFFF170000805299 +:104F7000C0035FD6FD7BBDA9E103002AFD030091BC +:104F8000E2A30091F30B00F9F303002A20098052F9 +:104F900066F7FF97C0000035E01740F966000094FF +:104FA000600100B50000805206000014E2A30091E9 +:104FB000E103132A2009805240F7FF97E0FEFF34F7 +:104FC000F30B40F9FD7BC3A8C0035FD6012843392A +:104FD000A201805202F800B961FEFF346AFDFF971A +:104FE000F1FFFF17FD7BBFA9FD030091BEF3FF9703 +:104FF00092F3FF97FD7BC1A8000040F9DCFFFF178B +:10500000FD7BBDA9FD030091F35301A9F40300AAA0 +:10501000F51300F9B4F3FF9788F3FF97150040F9F3 +:10502000E00315AA75FDFF97F303002AE0000035A1 +:10503000E00314AA3BF3FF97F303002A6000003457 +:10504000E00315AACAFFFF97E003132AF35341A90F +:10505000F51340F9FD7BC3A8C0035FD6006840F993 +:10506000010040F9213440F9210C40F9610000B4FD +:10507000F00301AA00021FD6A0048012C0035FD66D +:10508000006840F9030040F9633440F9631840F9BF +:10509000630000B4F00303AA00021FD6A00480122C +:1050A000C0035FD6006840F9010040F9213440F99F +:1050B000211040F9610000B4F00301AA00021FD6DC +:1050C000A0048012C0035FD6006840F9010040F9D7 +:1050D000213440F9211C40F9610000B4F00301AA19 +:1050E00000021FD600008052C0035FD6006840F95E +:1050F000010040F9213440F9210040F9610000B479 +:10510000F00301AA00021FD600008052C0035FD640 +:10511000006840F9010040F9213440F9210440F9C8 +:10512000610000B4F00301AA00021FD60000805203 +:10513000C0035FD6018840B9E1000036FD7BBFA9FE +:10514000FD0300913DF3FF97FD7BC1A8000040F9EE +:10515000C0035FD6000080D2C0035FD6FD7BBDA92F +:10516000FD030091F35301A9F40301AAF55B02A921 +:10517000F50302AA136840F9600240F9163440F9B9 +:10518000E00313AAECFFFF97C32240F9230100B408 +:10519000E20315AAE10314AAE00313AAF00303AA89 +:1051A000F35341A9F55B42A9FD7BC3A800021FD6BA +:1051B000000040F9F35341A9001840B9F55B42A93A +:1051C000FD7BC3A8C0035FD6FD7BBDA9FD03009195 +:1051D000F35301A9F40301AAF51300F9F50302AA98 +:1051E000136840F9E00313AAD3FFFF97600240F968 +:1051F000003440F9030840F9230100B4E20315AA82 +:10520000E10314AAE00313AAF00303AAF35341A98C +:10521000F51340F9FD7BC3A800021FD6A00480123D +:10522000F35341A9F51340F9FD7BC3A8C0035FD632 +:10523000FD7BBDA9FD030091F35301A9F403012AED +:10524000F51300F9F50300AA27F3FF97BAFFFF97BC +:10525000F30300AAE00315AAF2F2FF97002C4039ED +:105260001F00146B4001005460D641391FFC0371CC +:1052700080010054E103142AE00313AAF35341A967 +:10528000F51340F9FD7BC3A8F2FBFF170000805225 +:10529000F35341A9F51340F9FD7BC3A8C0035FD6C2 +:1052A000600F8012FBFFFF17FD7BBDA9E103002A01 +:1052B000FD030091E2A30091F30B00F9F303002A30 +:1052C000200980522CEBFF9720010034E103132AC0 +:1052D000400000D00074189140E6FF97000080D293 +:1052E000F30B40F9FD7BC3A8C0035FD6E01740F97C +:1052F000FDF2FF9790FFFF97FAFFFF17FD7BBEA916 +:10530000C1028052FD030091006840F9E263009100 +:10531000E2F2FF97E00F40F9400000B4C1F2FF97BE +:10532000FD7BC2A8C0035FD6FD7BBCA9FD03009135 +:10533000F35301A9F30301AAF55B02A9010040F9A7 +:10534000213440F9210400B4048C40B9F40300AACC +:10535000F60302AAE7E30091060080D205408052DE +:1053600023098052420000D0410000D042B02E916B +:1053700021A02E914EECFF97F503002AC0010035C5 +:10538000E01F40F9A7F2FF97760200F9E17F40B2F3 +:10539000740A00F9612200F92100805201340039B9 +:1053A000C172403901200039A0018052746A00F9AD +:1053B00060FA00B9E003152AF35341A9F55B42A94D +:1053C000FD7BC4A8C0035FD6B5048012FAFFFF17A7 +:1053D000BF3F03D5020440F9410000B9217D80D2CE +:1053E000210400F16100005400008052C0035FD628 +:1053F000020440F9420040B9BF3F03D55F0840F2C4 +:1054000001FFFF5420008052F9FFFF17FD7BBDA96B +:10541000FD030091F35301A9F30300AAF403012A49 +:10542000F55B02A9F60302AA000440F9004840B95E +:10543000BF3F03D515C48952C00200B9B50600713B +:10544000C00100549F02006AC10000540000805255 +:10545000F35341A9F55B42A9FD7BC3A8C0035FD606 +:10546000001980D248E1FF97600640F9004840B932 +:10547000BF3F03D5F1FFFF17A00D8012F5FFFF1707 +:10548000FD7BB6A9FD030091F35301A9F40302AA21 +:10549000F55B02A9F60301AAF76303A9F96B04A956 +:1054A000FB7305A924FFFF97130840F9141400B4F7 +:1054B000800E40B9001C0011007C03530004001151 +:1054C00000747AD3000400D1003C009100EC7C927F +:1054D000FF6320CB000080D2F7030091F1E0FF973B +:1054E000F50300AA600640F9004840B9BF3F03D564 +:1054F000A0004836E00315AAEAE0FF971FD007F1A5 +:1055000029FFFF54BF3F03D5600640F90100801218 +:10551000014400B9141100B5C10A40B9BF3F03D519 +:10552000600640F9012800B9141D00B4800A40B992 +:1055300001C080D21F007FF2004080D20000819A1B +:10554000C20640B9410180524100010A3F28007162 +:10555000202A0054C10240790300123200001332A5 +:105560003F3000710010831AA200003603001A3287 +:105570005F007FF200041A320010831A42001036D6 +:10558000000018322100002A0000B4522100002A35 +:10559000BF3F03D5600640F9012C00B901D49052F9 +:1055A0002100A072600640F9004440B9BF3F03D516 +:1055B00000191036940000B5BF3F03D5610640F9CD +:1055C000204400B9A0184037A0260837C10640B9CA +:1055D000410010364026303741020036600640F95F +:1055E00001190836003C40B9BF3F03D5C00E00B9D1 +:1055F000600640F9003840B9BF3F03D5C01200B97A +:10560000600640F9003440B9BF3F03D5C01600B969 +:10561000600640F9003040B9BF3F03D5C01A00B959 +:10562000742300B4000080D2BF7700B9761E40F921 +:105630009CE0FF97F90300AA010A805280D6412915 +:105640001BD09752776E40791C028052980240F925 +:10565000B57E001BC02A40B9F72E1F53F70A001170 +:105660001A058052A17E011BB57E02532108C01A83 +:10567000C02640B92108C01AC0CE40B91F00007131 +:10568000E0079F1A000400112108C01A007D805213 +:10569000217C001B3F00006B2020801AA06F00B906 +:1056A000600640F9164440B9BF3F03D5DF021B6ACC +:1056B000011C005460824139801700347517003492 +:1056C000800A40B9BF7700B91F040071E11200548D +:1056D000C1021A6AA0160054BF3F03D5600640F904 +:1056E000014400B9A2D30191E00313AA81008052C2 +:1056F00047FFFF97A015F837A07740B90100805207 +:10570000007451D31F00156B0090951AA07700B953 +:10571000A07740B93F00006BC30F00541F00156B0A +:1057200042180054B502004BEFFFFF17E00780D28C +:1057300066FFFF1760824139821240B9A001003430 +:10574000BF3F03D5600640F9021C00B981824129A0 +:10575000007C011BBF3F03D5610640F9202000B942 +:10576000E00313AA410080521AFFFF976BFFFF1757 +:10577000800E40B9810240F9427C001B800A40B98A +:105780001F040071A105005443008052A0E3019161 +:1057900026C0FF97F503002A200A0035E4FE009199 +:1057A000850E40B984E47A92E00313AA4100805246 +:1057B000E30304AAA64340F906FFFF97BF3F03D5C2 +:1057C000600640F901008012018C00B9BF3F03D58B +:1057D000600640F90702805288028052020080521F +:1057E0000700B0720800B072048800B95F00007151 +:1057F000811240B9E0179F1A00701D53BF2000713D +:1058000008020054A17C011B0000082A6004002942 +:10581000C030020B600800B960000111600C00B9D3 +:1058200063000191BF20007129010054A52000519F +:1058300042040011EEFFFF1723008052D4FFFF1730 +:105840000000072A21701D53F1FFFF1761FC009132 +:10585000E00304AA21E47A92A8B1FF97600640F918 +:10586000000040B9BF3F03D5010480520140A0723F +:105870000000012ABF3F03D5610640F9200000B9AE +:10588000600640F9008040B9BF3F03D54110805207 +:105890000000012ABF3F03D5610640F9208000B90E +:1058A000811240B9BF3F03D5600640F9011C00B921 +:1058B00081824129007C011BBF3F03D5610640F96D +:1058C000202000B915FFFF17000080521DFFFF17B1 +:1058D0002104007181E6FF54B50D8012BF030091D1 +:1058E000E003152AF35341A9F55B42A9F76343A9E5 +:1058F000F96B44A9FB7345A9FD7BCAA8C0035FD619 +:10590000003040B9BF3F03D5C00E00B945FFFF17B7 +:10591000600640F9000042B9BF3F03D521040011E1 +:10592000004700B87BFFFF171F080071E103005418 +:10593000D6032036A2D30191E00313AA01018052BD +:10594000B3FEFF97C002F837A07740B9010080523C +:10595000007451D3E002004B1F00156B0090951AA4 +:10596000A07700B9A07740B93F00006BA3000054B6 +:105970001F00156B22010054B502004BEEFFFF170C +:10598000024740B8BF3F03D5600640F9210400112B +:10599000020002B9F4FFFF1715008052BF3F03D584 +:1059A000600640F91C4400B996041837E00319AAB0 +:1059B000BCDFFF97A16F40B91F4021EB29E7FF54DF +:1059C000B50D8012BF3F03D5600640F9164400B9FB +:1059D0006082413920050035800A40B9760640F9D9 +:1059E0001F040071F4179F1A000080D29406001162 +:1059F000ACDFFF97F50300AAC08E40B9BF3F03D5C7 +:105A00009F02206AE0010054E00315AAA5DFFF977A +:105A10001FA00FF188030054200080D2DADFFF9727 +:105A20004EC3FF97F5FFFF1715008052DFFFFF17EA +:105A3000B5028012E4FFFF1715008052E2FFFF1746 +:105A400015008052BF3F03D5600640F961008052C7 +:105A5000018C00B9600640F9000040B9BF3F03D592 +:105A600000781A12BF3F03D5610640F9200000B943 +:105A7000A0E3019171BFFF97800C80D2C2DFFF9736 +:105A800097FFFF17B50D8012EFFFFF17150080522B +:105A9000FAFFFF17F501801291FFFF1795008012A2 +:105AA0008FFFFF17021C40B95F00016BE007005435 +:105AB000FD7BBEA9FD030091F35301A9F403012A64 +:105AC000A1060034022C40F9F30300AA020600B438 +:105AD00040003FD6E003002A1F4034EB200600546C +:105AE000827A1F53410400D12000008B0008C29A23 +:105AF000BF3F03D5610640F93F1000B9BF3F03D552 +:105B0000610640F93F0C00B9BF3F03D5610640F97B +:105B1000200800B9BF3F03D5600640F90100845258 +:105B20000104B072012C00B940E28452610640F9D0 +:105B3000212C40B9BF3F03D500040071C0020054BE +:105B400061FFFF37BF3F03D5600640F9E1830032B4 +:105B5000011000B9BF3F03D5600640F9010084522F +:105B60000104B072012C00B940E28452610640F990 +:105B7000212C40B9BF3F03D500040071C000005480 +:105B800061FFFF37741E00B903000014002040B904 +:105B900020FAFF35F35341A9FD7BC2A8C0035FD6AD +:105BA00000008052D3FFFF17C0035FD6FD7BBEA964 +:105BB000FD030091F35301A95FFDFF97012840B950 +:105BC000130840F9F40300AAE00313AAB6FFFF97F5 +:105BD000802640B91F100071200300541F2000715F +:105BE000E0179F1A003C1053BF3F03D5610640F9F0 +:105BF000201800B9600640F9017440B9BF3F03D5D1 +:105C000082CE40B92000103221780F125F0000715F +:105C10002100801ABF3F03D5600640F9017400B926 +:105C2000612640F9010100B4E00313AAF00301AAC0 +:105C3000F35341A9FD7BC2A800021FD62000805269 +:105C4000EAFFFF1700008052F35341A9FD7BC2A871 +:105C5000C0035FD6FD7BBDA9FD030091F35301A9ED +:105C6000F51300F934FDFF97130840F9F40300AA77 +:105C7000612A40F9610000B4E00313AA20003FD676 +:105C8000BF3F03D5600640F935008052E1008052E5 +:105C9000150400B9E00313AACEFDFF976006003497 +:105CA000800240F9011040B9E00313AA7EFFFF977C +:105CB000BF3F03D5610640F900008012204400B9BF +:105CC000BF3F03D5610640F93F2400B9BF3F03D56C +:105CD000610640F9201400B9BF3F03D5600640F9C2 +:105CE0001F9000B9BF3F03D5600640F9158000B989 +:105CF000603640B960010035600640F9004C40B99B +:105D0000BF3F03D5006C50D30000150B007C01533E +:105D1000010400510040012A00000332603600B93E +:105D2000613640B9BF3F03D5600640F9014C00B968 +:105D3000BF3F03D5600640F91F1000B9BF3F03D530 +:105D4000600640F91F0C00B960824139A00000359F +:105D5000BF3F03D5600640F961008052019000B951 +:105D6000000080520200001480008012F35341A909 +:105D7000F51340F9FD7BC3A8C0035FD6240040F9AA +:105D80000308022902108052040000F90206A072E2 +:105D9000020C00B9221440B9020800B9233040B9FE +:105DA0004178021242780112210002327F200071F4 +:105DB000420003324210811A0120805242081F32F1 +:105DC000020800B9011800B9C0035FD657FDFF17DC +:105DD000FD7BBEA9FD030091F35301A9002040F90A +:105DE000136C40B9006840B900080012730A1C53D4 +:105DF0007302002ABDA9FF97147C40B9BBA9FF9785 +:105E0000947A1A12147C00B9BF3F03D5B4A9FF9746 +:105E1000132800B9B5A9FF97137C40B9B3A9FF9720 +:105E200073021B32137C00B900008052F35341A966 +:105E3000FD7BC2A8C0035FD6FD7BBDA9FD03009119 +:105E4000F35301A9F40300AAF51300F9F8EFFF9743 +:105E5000819240B9F30300AA406A40F9420000B0C1 +:105E60000300805242743F9132DAFF972001F836E6 +:105E7000400000F0002C079158E3FF97A002801229 +:105E8000F35341A9F51340F9FD7BC3A8C0035FD6C6 +:105E9000157C0113800640F9600200F9E00314AAA2 +:105EA00068F0FF97600600F983008052420000F01E +:105EB000819240B942981491406A40F91DDAFF97E7 +:105EC000603200B90000009000403791602600F970 +:105ED000A00600517F2A00B963008052A042002A28 +:105EE000420000F000000332603600B942A0079182 +:105EF000819240B9406A40F91EDAFF97606A00B9A2 +:105F000003008052420000F0819240B942BC0791E8 +:105F1000406A40F917DAFF97732200F9606E00B902 +:105F2000410000F021DC0791804A40F9DDF4FF9741 +:105F30006082013900008052D2FFFF17FD7BB9A9B2 +:105F4000FD030091F35301A9F30300AAF55B02A935 +:105F5000F71B00F9ADEFFF97F50300AAE00313AAC2 +:105F6000B6EFFF97F60300AAE00313AAB0EFFF977E +:105F7000F40300AAE00313AAADEFFF97F70300AA0A +:105F8000E2230191E00313AA21008052B4EAFF97B3 +:105F900020040035E0230191B3EAFF97E02200B925 +:105FA00020030034E1230191E00313AAEB130094D2 +:105FB00060000035E02301918B130094822240B9E8 +:105FC000E00315AAB582009103508352E10314AA9D +:105FD000C300A0726AFFFF97951E00F9B40A00F98A +:105FE000801E40F9C00200F9136800F9E00313AA0B +:105FF000F35341A9F55B42A9F71B40F9FD7BC7A804 +:1060000015FFFF17400000D000040891F3E2FF974E +:10601000A0028012F35341A9F55B42A9F71B40F996 +:10602000FD7BC7A8C0035FD6FD7BBEA9FD03009121 +:10603000F30B00F9F30300AA74EFFF97E20300AA41 +:1060400001800091E00313AAF30B40F9FD7BC2A885 +:106050005FFFFF17217C7C93026861B882000034E7 +:106060001F6821B82100805201001039C0035FD69B +:10607000227C7C9301D0218B006862B860000034E0 +:10608000200440F9C0035FD6000080D2FEFFFF1756 +:10609000E20300AA030080D264EC7CD3E003032A6D +:1060A000446864B804010035637C7C9345D0208B40 +:1060B00024008052446823B8A10400F94400103938 +:1060C000C0035FD6630400917F0001F161FEFF54BD +:1060D00060038012FBFFFF17FD7BBEA9FD0300914B +:1060E000F30B00F9F30300AA83000094E303002AF2 +:1060F00020020035654240B94407A0D084A0089131 +:10610000E00304AAE103052ADAFFFF971F0013EB5F +:1061100021020054035841B963010034021C40F9C4 +:10612000E103052A400000B000300A91ABE2FF977E +:10613000E3018012E003032AF30B40F9FD7BC2A8C0 +:10614000C0035FD6E103052AE00304AAC2FFFF975C +:10615000F9FFFF1743028012F7FFFF17067440F99B +:10616000660100B48101F8B7050440F9BF0001EBF6 +:1061700023010054A50001CBBF0002EBC300005473 +:10618000E20000B4F00306AA00021FD6C00B801282 +:10619000C0035FD6A0028012FEFFFF1700008052EE +:1061A000FCFFFF17FD7BBEA9FD030091F30B00F977 +:1061B000F30300AA001440B98001003543000090A9 +:1061C0004100009063C82B9121042D91223680520A +:1061D00040000090005C2D9180E2FF97400000900D +:1061E00000AC2D9136DEFF974007A0D0E10313AA43 +:1061F00000A00891040080520300805202008052E7 +:10620000A4FFFF974007F837604200B9600206918B +:106210007F5A01B9000000A9603640B9600000351E +:10622000605E40B9603600B9601240B9E103002AEF +:10623000C0030034220400D10000C05A0010C05A2C +:106240005F0001EA00009F1A611640B9602600B99C +:10625000E203012AE1020034430400D12100C05AC4 +:106260002110C05A7F0002EA21009F1A22008052AA +:106270004020C01A000400514220C11A61020529C1 +:10628000610240F942040051623200B90080C4D278 +:106290001F0021EA2001005400008052F30B40F956 +:1062A000FD7BC2A8C0035FD600008052E7FFFF1746 +:1062B00001008052EEFFFF17620640F9010080D214 +:1062C000E00313AAA6FFFF971F000071C10B801205 +:1062D0000410417A20FEFF54611E40F940000090F6 +:1062E00000C031913DE2FF97ECFFFF172000805284 +:1062F000EBFFFF17FD7BBBA9FD030091F35301A941 +:10630000F55B02A916000691F76303A918008052F5 +:10631000F92300F9590000B039F30A9113C040F98C +:1063200073C205D177BA40F9F7C205D175C205919C +:10633000BF0216EB01010054E003182AF35341A9F0 +:10634000F55B42A9F76343A9F92340F9FD7BC5A892 +:10635000C0035FD661C240F9600206913F0000EBC6 +:1063600060000054E00313AAE3FFFF97E00313AAC1 +:106370005AFFFF97F403002A4001F836611E40F9E6 +:10638000E203002AE00319AA14E2FF97E0BA40F9F9 +:10639000F30317AAF803142A17C005D1E4FFFF1767 +:1063A000A10240A9200400F9F403182A010000F911 +:1063B000BF7E00A9601E40F9B3BDFF97E00313AA9A +:1063C000B1BDFF97F2FFFF1700008052C0035FD6F8 +:1063D000040040F9843440F9840040F9F00304AA31 +:1063E00000021FD6FD7BBAA9E403012AFD03009138 +:1063F000F55B02A9F503022AF603032A420000D046 +:10640000E303002A42680D91F35301A9F403012A22 +:10641000C10380D2F303002AE00301919EE1FF97BC +:10642000E0030191A5DCFF97440000D0E50300AA3A +:10643000E7C30091E6E3009184A80D91E303162AD7 +:10644000E203152AE103142AE003132A110500943C +:1064500000010035E01B40F9000040F977EEFF979E +:10646000F35341A9F55B42A9FD7BC6A8C0035FD6E3 +:10647000000080D2FBFFFF17FD7BBCA9FD0300914C +:10648000F35301A9F303012AF40302AAF51300F957 +:10649000F50303AA69EEFF97054440F9E40315AA42 +:1064A000E3E30091E20314AAE103132AA0003FD61C +:1064B000F35341A9F51340F9FD7BC4A8C0035FD68F +:1064C000FD7BBCA9FD030091F35301A9F303012A4D +:1064D000F40302AAF51300F9F50303AA57EEFF9798 +:1064E000054040F9E40315AAE3E30091E20314AA8E +:1064F000E103132AA0003FD6F35341A9F51340F955 +:10650000FD7BC4A8C0035FD6FD7BBDA9FD03009140 +:10651000F35301A9F30300AAF51300F94AEEFF971C +:10652000F40300AAE00313AA44EEFF97135019A93D +:10653000540100B553028012400000D000E00D91DC +:10654000A6E1FF97E003132AF35341A9F51340F99D +:10655000FD7BC3A8C0035FD6F50300AAE00314AA1D +:1065600088040094F303002AE0FEFF35E00315AA37 +:10657000F1000094F303002A80000035E00315AA1F +:1065800038020094F303002AE00314AA7F04009465 +:10659000EDFFFF17FD7BBFA9FD03009127EEFF97DD +:1065A000FD7BC1A82D020014FD7BB7A9FD0300915E +:1065B000F35301A9F303012AF51300F9F50302AA25 +:1065C0001EEEFF97011040B9C1020034F40300AA87 +:1065D000600AC11A00CC011B40020035E103012A08 +:1065E000A00AC19A00D4019BC00100B5020B80D261 +:1065F00001008052E0E3009143DCFF97823A40F9CA +:10660000F35704A9E1E30091E00314AA40003FD648 +:10661000F35341A9F51340F9FD7BC9A8C0035FD628 +:10662000A0028012FBFFFF17FD7BBFA9FD030091B5 +:1066300002EEFF970C02009400008052FD7BC1A87F +:10664000C0035FD660418012C0035FD660418012F4 +:10665000C0035FD6FD7BB6A9FD030091F35301A9EA +:10666000F30302AAF47F40B2F55B02A93500805221 +:1066700036008052F76303A9F80301AAF96B04A955 +:10668000F90304AAFB2B00F9FB0303AA179C40F9AA +:10669000330100B500008052F35341A9F55B42A9D4 +:1066A000F76343A9F96B44A9FB2B40F9FD7BCAA80A +:1066B000C0035FD6E2BE41B9FA0313AAE0DA463955 +:1066C000FFFF06A9417C1053E0DB0079E0D2463998 +:1066D000E0C30139E0DE4639E1A70139413C48D346 +:1066E000F8FF07A9007C011BFF4700F9F5A301395A +:1066F000E1C70139007C0313E0030239E1070239E5 +:10670000E2230239F68F00B9FF6709A95F0314EB92 +:106710004093949AE09300B9E0CE40F9E1A301914F +:10672000160C0094A0010034057C4093E003052A78 +:10673000BF000071050300340BFBFF54610340F9F7 +:1067400039C3258B18C3258B73C225CB21C0258B5C +:10675000610300F9CFFFFF17E0CE40F9E1A30191FB +:106760009C0B009420FEFF35E13F40F9E09340B9D7 +:106770002100008BE13F00F9E14F40F95A0300EBA3 +:106780002100008BE14F00F921FCFF54E50313AA1F +:10679000E7FFFF1780008012C0FFFF17FD7BBBA93A +:1067A000211C001224208052FD03009100CC40F9EE +:1067B000FFFF01A9E13B007921008052FFFF03A9FF +:1067C000E1E3003921008052E4330079FFFF02A9A0 +:1067D000E13F00B9E1630091E34300B9E22700F92A +:1067E0007C0B0094FD7BC5A8C0035FD6FD7BBEA9D2 +:1067F00023008052A1008052FD030091E27F0091AE +:10680000E7FFFF974000F837E07F4039FD7BC2A8E3 +:10681000C0035FD6FD7BBCA9FD030091F35301A922 +:10682000F30300AA000080D2F55B02A91DDCFF97EC +:10683000F40300AAF58793D2E00314AA19DCFF97AA +:106840001F0015EBA901005461CA40F9400000D0B7 +:1068500000381191E10300B4230840A9610040F918 +:10686000DEE0FF97A00D8012F35341A9F55B42A92A +:10687000FD7BC4A8C0035FD6E00313AADCFFFF972B +:1068800040FFFF37F603202A60CE41B9E001003611 +:10689000E2FF0091E00313AA23008052010E805210 +:1068A000BFFFFF9720FEFF37E1FF4039210019129B +:1068B0003F000071E0079F1ADF02006AE0FBFF540F +:1068C00000008052E9FFFF1721008052F9FFFF17F7 +:1068D000420000D0410000D042C0119121EC119142 +:1068E000E0FFFF17FD7BBBA9211C00122420805272 +:1068F000FD03009100CC40F9FFFF01A9E13B0079C5 +:1069000021008052FFFF03A9E1E3003941008052DA +:10691000E4330079FFFF02A9E13F00B9E163009190 +:10692000E34300B9E22700F92A0B0094FD7BC5A8D8 +:10693000C0035FD6FD7BAEA9222080522200A07248 +:10694000FD030091F35301A9C3008052F30300AA91 +:10695000F51300F902BC01B9222080D22200A0F276 +:1069600001CC40F92220C0F22200E0F202E000F95E +:1069700062008052210C40B93F0073F261108052D6 +:106980003510821AE2030191010C801284FFFF97F7 +:106990004016F836147C40939F0640B148140054CA +:1069A00020008052E05300B960008052E05B013962 +:1069B00020208052FFAB00792000A072E05B00B97C +:1069C000811640B94102183762008052E25300B983 +:1069D00002008152E2BB007962018052E27B013900 +:1069E000E06300B9800240391FD0007101010054FA +:1069F0008006403900A80051001C00121F040071DD +:106A00006800005400018052E073013961013036A2 +:106A1000E05340B900001932E05300B90000815240 +:106A2000E01B0179600D8052E03B023980208052EA +:106A30002000A072E09300B9400000D000900F91B8 +:106A4000601E00F960CA40F960A600F9600080523B +:106A50006002003920008052601600B90080815227 +:106A6000600600B9739E00F9801A4079810A40B926 +:106A7000017C011B610600F9618A02B901000090E6 +:106A800021101991613A00F90100009021501991EB +:106A9000614200F90100009021301991614600F92E +:106AA000801640B98000383660CE41B9000000320F +:106AB00060CE01B9801640B98000703660CE41B911 +:106AC00000001B3260CE01B9801640B98000183634 +:106AD000E05340B900781E12E05300B9E05340B9CA +:106AE000E2130191E3170191A102000A200441D3AE +:106AF0003F0079F2E10080520000811AE11B019110 +:106B0000007C40930008009100F07DD3216860383C +:106B100061DA0639E123019142686038216860B882 +:106B20006068603861BE01B9211C00124000000B92 +:106B300060DE06393F100071E105005480024039E3 +:106B40001F74027140090054E80800541F8000714E +:106B5000200500541FB00071E0040054E2E30091EE +:106B6000E00313AA23008052A10680520CFFFF9776 +:106B7000000CF837E0E34039E003083700001F322B +:106B8000E0E70039E00313AA19FFFF97200BF8375D +:106B900003008052020080D2C1008052E0E300393D +:106BA000E00313AA50FFFF97E2E30091E00313AA6A +:106BB00043008052210080524BFFFF97A009F83715 +:106BC000E00313AA14FFFF97F503002AE002003543 +:106BD000E2DF0091E00313AA23008052A106805255 +:106BE000EFFEFF976008F837E0DF403920080034F7 +:106BF0000008083660D24639200B003580224079E3 +:106C00006008003460D2063955000014821A4039F9 +:106C10006201003594620091800A40B980FFFF351F +:106C2000740F8092F503142AE003152AF35341A947 +:106C3000F51340F9FD7BD2A8C0035FD6421C4092F9 +:106C4000E1030191E00314AAFEDAFF9740FEFF354D +:106C5000B4FEFFB451FFFF17340000F094A20C9172 +:106C6000EEFFFF171F080371A1F7FF54E00313AAFB +:106C7000DFFEFF97F503002A80FDFF37D5FB37378E +:106C800003008052020080D2C1008052E00313AAA8 +:106C900015FFFF97B5021A32230080526242079116 +:106CA000E103032A75420739E00313AA0EFFFF9799 +:106CB000E00313AAD8FEFF97F503002A60FBFF3517 +:106CC000E00313AACAFEFF971F0000714D00005495 +:106CD00020F9373761CA40F9400000D000B80F9161 +:106CE000C10000B4230840A9610040F9BBDFFF9751 +:106CF000B5028012CDFFFF17420000D0410000D046 +:106D000042C0119121EC1191F9FFFF17610640F982 +:106D10000020A0D23F0000EBA90300548000805265 +:106D200060D20639800240391F04007160000054AF +:106D3000801640B94001583661DA4639400000D02B +:106D400000600F91020080D2030040397F00016B88 +:106D5000410100540104403961DA063960D24639F4 +:106D60001F10007168FCFF5474D200F940010054F8 +:106D700015008052ADFFFF174204009100080091FA +:106D80005F1800F121FEFF54F4FFFF1760008052EE +:106D90009DFFFF17800240391F040071A0FEFF54C1 +:106DA000801640B960FE5F3760CE41B98000303652 +:106DB000400000D00040109188DFFF9760D240F97A +:106DC000000040391FB000714002005428010054F7 +:106DD0001F800071E0010054E00F801262420791B1 +:106DE00023008052E10280526042073918000014EB +:106DF0001F080371A00000541FBC03716000005401 +:106E00001F740271A1FEFF54140080520700001489 +:106E100034008052E00313AA03008052020080D2A3 +:106E2000C1008052B0FEFF97E00313AA0300805216 +:106E3000020080D201098012ABFEFF97B4F9FF3443 +:106E400003008052020080D281008052E00313AA26 +:106E5000A5FEFF97C7FFFF1760418012C0035FD6F2 +:106E6000D1FCFF179DFCFF17FD7BBDA9FD03009121 +:106E7000F35301A9341C0012F30300AAF51300F91F +:106E8000010040F9353440F99F2A00716100005437 +:106E9000A1018052F5FFFF97A20A40F9E103142AED +:106EA000E00313AA40003FD61F2C003160FFFF54BF +:106EB000F35341A9F51340F9FD7BC3A8C0035FD686 +:106EC000010040F9213440F9220040F9820000B469 +:106ED000411240B9F00302AA00021FD600008052FE +:106EE000C0035FD600008052C0035FD6011C0012B1 +:106EF000409E40F9600000B4409E40F9DBFFFF1760 +:106F0000C0035FD6419E40F9E10100B4FD7BBEA9FC +:106F1000FD030091F35301A9F30300AA549E40F925 +:106F20006102403981000035F35341A9FD7BC2A8BD +:106F3000C0035FD673060091E00314AACBFFFF974E +:106F4000F8FFFF17C0035FD6409E40F9400100B430 +:106F5000409E40F9000040F9003440F9020040F939 +:106F6000A20000B4409E40F9F00302AA411240B9C9 +:106F700000021FD6C0035FD6FD7BBDA9FD030091B3 +:106F8000F35301A9546A40F9940700B4E00314AA2A +:106F9000410000D021800491B5D6FF97F30300AAE9 +:106FA000A00200B5E00314AA410000D021B0049172 +:106FB00017D3FF97F303002AE2A30091E103132AFA +:106FC000A00D805267EFFF9720030035E11740F9CD +:106FD000419E00F9400640F9000078B2400600F9F1 +:106FE000DAFFFF9700008052F35341A9FD7BC3A84D +:106FF000C0035FD64107805285D9FF97000100B4D6 +:107000000200134BE10313AAE00314AAC4D2FF97B2 +:10701000F303002A20FDFF36E3FFFF17E00313AA66 +:1070200085D9FF97E203002AF7FFFF177F0200715F +:10703000ED010054405640F9E2A30091617E409377 +:1070400004008052030080D284ECFF9700010035D9 +:10705000E01740F9A8EBFF971FB4017181000054BD +:10706000E01740F92FEBFF9720FBFF34400000B002 +:1070700000D004918CDAFF97E2A3009101008052C6 +:10708000A00D805229EFFF9720FAFF34E2A3009170 +:1070900001008052A00D805208EFFF9780F9FF3465 +:1070A000E1A30091A00D80525AEFFF97EFFFFF1769 +:1070B000FD7BBFA9FD0300915DEBFF97A00480124B +:1070C000FD7BC1A8C0035FD6FD7BBAA9FD0300917B +:1070D000F35301A9F40300AAF55B02A94BEBFF9758 +:1070E000F30300AAE00314AA81EBFF97F60300AABA +:1070F000E00314AAC9EBFF971F0400B1C0070054B6 +:10710000607E00A90200805241000090804A40F950 +:1071100021203591E5EFFF97601A00B902008052F7 +:1071200041000090804A40F9214C3591DFEFFF97F4 +:10713000601600B92200805241000090804A40F958 +:1071400021743591D9EFFF97601200B9E2E3009105 +:10715000E00314AA0100805241E6FF97C002003507 +:10716000E0E3009140E6FF971F04403148000054DF +:10717000601E00B9601E40B960010035804A40F9C8 +:1071800015209C52B5BEA07241000090E203152A62 +:1071900021F40391C5EFFF971F000071B502801A1B +:1071A000751E00B9DF060071E0010054E000805256 +:1071B0000E000014029800115F900071C800005486 +:1071C00021008092E1FEBFF2E1FDDFF22128C29AA8 +:1071D00021FD0736F35341A9F55B42A9FD7BC6A803 +:1071E000C0035FD6E0028052602200B900008052E6 +:1071F000F9FFFF17A0028012F7FFFF17021880B9EE +:10720000030040F9001440B94200038B2120C01A4A +:10721000217C4093406861B8BF3F03D5C0035FD66F +:10722000FD7BBFA9FD03009101EBFF97E40300AADA +:10723000000C40F9A1008052F1FFFF97A00000363A +:10724000FD7BC1A801008052800C40F9ECFFFF17C4 +:1072500040018012FD7BC1A8C0035FD6FD7BBEA9A3 +:10726000FD030091F30B00F9331C0012F0EAFF97C5 +:10727000A1008052000C40F9D3000034E0FFFF97DA +:1072800000000012F30B40F9FD7BC2A8C0035FD6DB +:10729000DBFFFF971F007BF2E0179F1AFAFFFF1733 +:1072A000031880B9040040F9001440B96300048B4E +:1072B0002120C01A217C4093BF3F03D5626821B8CA +:1072C000C0035FD6FD7BBEA9FD030091F30B00F95F +:1072D000331C0012D6EAFF97E40300AA000C40F921 +:1072E000A1008052C6FFFF9740012836800C40F96C +:1072F000E203132A01008052EAFFFF977F2A007100 +:107300004100005415BDFF97000080520200001498 +:1073100040018012F30B40F9FD7BC2A8C0035FD689 +:10732000FD7BBEA9FD030091F30B00F9F303012AD5 +:10733000BFEAFF97620E42D3610600125F0C007134 +:10734000731644D3600A417AA10100543F0C0071C6 +:1073500060010054220000F042D82891000C40F94E +:107360004268E13861008052CEFFFF9700008052F2 +:10737000F30B40F9FD7BC2A8C0035FD660418012C9 +:10738000FCFFFF17FD7BBFA9E50300AAE603012A66 +:10739000FD030091000C40F96100805298FFFF97B7 +:1073A000077818120200193261008052A00C40F9CF +:1073B000BCFFFF97C21C0012A00C40F901008052D4 +:1073C000B8FFFF97C23C48D3A00C40F9210080527F +:1073D000B4FFFF97E203072AFD7BC1A8610080523A +:1073E000A00C40F9AFFFFF17FD7BBEA9FD03009184 +:1073F000F30B00F9F303012A8DEAFF97020C40F921 +:10740000616E1C53736E1D53421C40B97302020B14 +:10741000610AC11ADCFFFF9700008052F30B40F9AC +:10742000FD7BC2A8C0035FD6E50300AAE603012ADC +:10743000FD7BBFA9FD030091A00C40F9A100805283 +:107440006FFFFF97A0FF3736A00C40F90200805273 +:107450002100805293FFFF9762008052A00C40F9F8 +:10746000810080528FFFFF97A00C40F941008052AD +:10747000022040B98BFFFF9762008052A00C40F9B8 +:10748000E103022A87FFFF97DF040031A0000054C8 +:10749000FD7BC1A8E103062AE00305AABAFFFF1796 +:1074A000FD7BC1A8C0035FD6FD7BBDA9FD03009194 +:1074B000F35301A9F30300AA54EAFF97E00313AAC8 +:1074C0005BEAFF97E1830091F40300AAE00313AAAB +:1074D000A20E009460000035E0830091420E0094FB +:1074E000E00313AA49EAFF97800E00F90100801219 +:1074F000E00314AACDFFFF9700008052F35341A987 +:10750000FD7BC3A8C0035FD6FD7BBDA9FD03009131 +:10751000F35301A9F40300AAF55B02A9F503022ABB +:10752000020040F9563440F9C21640F9020200B494 +:1075300040003FD6F303002AE0010034400000B0D1 +:10754000004C1291140300B4810A40A9E303132AEA +:10755000210040F9A1DDFF97E003132AF35341A96D +:10756000F55B42A9FD7BC3A8C0035FD6B3028012BE +:10757000F3FFFF17C21A40F9220100B4E103152AF4 +:10758000E00314AA40003FD6F303002A60FEFF3454 +:10759000400000B000D41291EBFFFF17B30280123D +:1075A000FCFFFF17420000B0410000B0E303132AC4 +:1075B00042C0119121EC1191E7FFFF17FD7BBEA99D +:1075C000FD030091F35301A9F40300AA12EAFF9707 +:1075D000F30300AAE00314AA1BEAFF97140000F9C2 +:1075E000610640B9010800B9610A40B9010C00B94F +:1075F00001018052011000B900008052F35341A9EB +:10760000FD7BC2A8C0035FD6FD7BBEA9FD03009130 +:10761000F35301A9F40300AA08EAFF97F30300AAB1 +:1076200002008052804A40F9410000B021041291CA +:107630009EEEFF97600200B900008052F35341A90B +:10764000FD7BC2A8C0035FD6FD7BBCA9FD030091F2 +:10765000F35301A9F55B02A9F50300AAF76303A997 +:10766000181840F9000340F9163440F9E00318AA4D +:10767000F2E9FF97F40300AAE00315AAF2E9FF97E5 +:10768000135C4129800240B920030034B303003465 +:107690007F02006B7392801A800640B91F00136B43 +:1076A00081000054800A40B91F00176BE0000054AD +:1076B000E203172AE103132AE00318AA93FFFF97B6 +:1076C0006002003593DE0029C10240F9E10100B4F7 +:1076D000E00315AAF00301AAF35341A9F55B42A9FF +:1076E000F76343A9FD7BC4A800021FD67F02007187 +:1076F00000D490522000A0727312801AE7FFFF1787 +:10770000F303002AE5FFFF1700008052F35341A95D +:10771000F55B42A9F76343A9FD7BC4A8C0035FD60C +:10772000011840F9210040F9213440F9210440F9C1 +:10773000610000B4F00301AA00021FD6C0035FD6A7 +:10774000051840F9A60040F9A52040F9C63440F9D3 +:10775000A50440F9A50840B9BFC80171A1000054B3 +:10776000C50C40F9A50000B4F00305AA00021FD61D +:10777000C00B8012C0035FD6A0048012FEFFFF176B +:10778000000040F9B1FFFF17000040F9E5FFFF17C7 +:10779000000040F9EBFFFF17FD7BBFA9FD0300913F +:1077A0009DE9FF97800000B4000040B9FD7BC1A8AF +:1077B000C0035FD620008012FDFFFF17FD7BBCA930 +:1077C000FD030091F35301A9F40300AAF55B02A99C +:1077D000F60302AAF503012A020040F9423440F9F7 +:1077E000431C40F9230300B4E2C3009160003FD67C +:1077F000F303002AA0020034400000B000EC0C911A +:10780000740100B4810A40A9E403132AE303152A92 +:10781000210040F9F1DCFF97E003132AF35341A95B +:10782000F55B42A9FD7BC4A8C0035FD6420000B04F +:10783000410000B0E403132AE303152A42C011916A +:1078400021EC1191F4FFFF17E1E30091E00314AA8A +:1078500080E9FF97E01F40F9600000B553028012F5 +:10786000EEFFFF176CE9FF97000040B91F00156B92 +:10787000A1000054E01F40F913008052C00200F93B +:10788000E6FFFF17E0E300917AE9FF97F2FFFF17A9 +:10789000FD7BB9A9FD030091F35301A9F55B02A992 +:1078A000F503022AF60307AAE2830191F76303A90D +:1078B000F803032AF70306AAF96B04A9F903012ABE +:1078C000FA0304AAE103002AFB7305A9FC03002ABA +:1078D000FB0305AA400E805214EDFF97E00100342F +:1078E000F303002AE203002AE1031C2A400000B04F +:1078F00000500E91B9DCFF97E003132AF35341A91E +:10790000F55B42A9F76343A9F96B44A9FB7345A949 +:10791000FD7BC7A8C0035FD6E03340F9E2A3019125 +:10792000E103192AA6FFFF97F303002A5F0300F182 +:107930000018533AA1050054E03340F9E3A3019144 +:10794000E2031BAAE1031AAA41EAFF97F303002A04 +:1079500040FDFF35E03740F92FE9FF97F40300AA17 +:10796000BF02007100D490522000A072A012801AB1 +:1079700099020029980A00B9E03740F9018840B916 +:1079800001010037E7E8FF97F303002A60FBFF35AA +:10799000E03740F92CE9FF97E13740F9010000F9A1 +:1079A000E03740F928E9FF97F90300AAE03340F9EE +:1079B00022E9FF97FA0300AA000440B980040034CA +:1079C00015050035940000B4800A40B91F00186BFB +:1079D00001050054E03340F9E00200F91300805241 +:1079E000D90200F9C5FFFF1780020034E13340F9E6 +:1079F000400000B000B40E91010100B4260840A977 +:107A0000E503132AE403192AE3031C2AC10040F901 +:107A100072DCFF97B9FFFF17420000B0410000B0D1 +:107A2000E503132AE403192AE3031C2A42C0119137 +:107A300021EC1191F7FFFF17E03740F9E0F9FFB4AF +:107A4000F5E8FF97F40300AACCFFFF17E00319AA9B +:107A50004CFFFF97F303002A40FBFF34A7FFFF17FB +:107A6000400740B900FBFF341F00156BC0FAFF54FC +:107A7000E03340F9E203182AE103152AA3FEFF9739 +:107A8000F303002A80FAFF34E00319AA3FFFFF97AF +:107A90009AFFFF17FD7BBDA902008012FD03009134 +:107AA000F35301A9F40300AAF51300F9F50301AAA1 +:107AB000410000B021A40B91004840F97BEDFF97F5 +:107AC000A00200B902D49052410000B0804A40F9AF +:107AD000210412912200A07274EDFF97A00600B954 +:107AE000410000B021581391804A40F9EDEDFF9715 +:107AF000131C1F53804A40F9410000B0217C1391B0 +:107B0000E8EDFF971F1C0072400000547302003222 +:107B1000804A40F9410000B021A01391E1EDFF97A8 +:107B20001F1C00724000005473021E32804A40F94C +:107B3000410000B021D01391DAEDFF971F1C0072B5 +:107B40004000005473021C32804A40F9410000B0EA +:107B500021F81391D3EDFF971F1C007240000054D1 +:107B600073021932804A40F9410000B0220080526D +:107B7000213814914DEDFF971F1000710003005440 +:107B80001F200071000300541F08007141000054C1 +:107B900073021732804A40F9410000B0220080523F +:107BA000217C149141EDFF971F10007100020054D9 +:107BB0001F200071000200541F0800714100005492 +:107BC00073021432B30A00B900008052F35341A982 +:107BD000F51340F9FD7BC3A8C0035FD673021632CC +:107BE000EDFFFF1773021232EBFFFF177302133220 +:107BF000F5FFFF1773021132F3FFFF17FD7BBEA9DC +:107C0000FD030091F30B00F9F30300AA82E8FF974C +:107C1000E10300AA604A40F9A000F8B7E00313AA04 +:107C2000F30B40F9FD7BC2A89BFFFF1700008052B9 +:107C3000F30B40F9FD7BC2A8C0035FD6FD7BBEA954 +:107C4000FD030091F35301A9F403012A78E8FF979B +:107C5000F30300AA000440F992020094600640F980 +:107C6000E103142ABE0200946086423960000034A9 +:107C7000600640F991020094600640F98302009486 +:107C800000008052F35341A9FD7BC2A8C0035FD618 +:107C900024084039E30300AAE20301AAE401003604 +:107CA000202040396000003420284039200100366F +:107CB000406040396000003440684039A000003620 +:107CC000402840B9800100344084403940010037E9 +:107CD00000008052C0035FD623284039A3FF073736 +:107CE0002368403963FF07372284403922FF073772 +:107CF0001B060014E10302AAE00303AAFB0500141B +:107D0000FD7BBFA9FD03009149E8FF97003C40F9C6 +:107D1000A00000B4FD7BC1A8010840B9000040F9F3 +:107D2000430C001400008052FD7BC1A8C0035FD645 +:107D3000FD7BBAA9222080D2E213C0F2FD0300919C +:107D4000E2FF02A9E20300B2E22700F962008052DA +:107D5000FF0705A9E1A30091F30B00F9F30300AAC3 +:107D6000FFFF03A9E25300B90D0300948000003522 +:107D7000E1A30091E00313AA1F030094F30B40F961 +:107D8000FD7BC6A8C0035FD6FD7BBEA9FD030091A5 +:107D9000F35301A9F403012A25E8FF97F30300AA8E +:107DA000010040B9000440F9E203142A580200948B +:107DB000610240B9E203142A63125129651A52295B +:107DC000600640F9F35341A9FD7BC2A88A02001462 +:107DD000FD7BB9A9FD030091F35301A9F403012A26 +:107DE000F55B02A9F60300AAF76303A9F96B04A9DE +:107DF000FB2B00F90EE8FF97F30300AA000440B93B +:107E0000740000341F00146B42000054F403002A75 +:107E1000600640F923020094607640B98001F8378B +:107E2000E103142AE00316AAD8FFFF97627640B94F +:107E300021008052600640F926020094600640F955 +:107E400015008052110200941B000014606E40B9AE +:107E50001F00146B00040054E00316AAF4E7FF9718 +:107E6000F80300AA01488852E00316AAE101A072B3 +:107E7000FF7F0D29190740F9C4FFFF9702008052C8 +:107E800021008052E00319AA12020094E00319AA0B +:107E9000FE010094E1A30191E00318AAA5FFFF975A +:107EA000F503002AA00200344000009000940291E3 +:107EB00081B6FF97E003152AF35341A9F55B42A968 +:107EC000F76343A9F96B44A9FB2B40F9FD7BC7A8D5 +:107ED000C0035FD6606640B91F00146BE1FBFF541E +:107EE000756A40B9E00316AA2CFEFF97BF02006B2B +:107EF00041FBFF54D2FFFF171B008012FA031B2A1D +:107F000017008052E103142AE00316AA9FFFFF978F +:107F1000E00319AAE3010094E203172A210080522A +:107F2000E00319AAEB010094E00319AAD701009419 +:107F3000E1B30191E00318AA7EFFFF97F503002A41 +:107F400040FBFF35E0074D295F070031C1010054B8 +:107F50003F00006B7B03971AFA029A1AF70600118A +:107F6000FF42007161FDFF545F07003121010054A1 +:107F700040000090001003914FB6FF97746E00B957 +:107F8000AFFFFF173F00006BE0010054FB060051FC +:107F9000E00319AA5A031B0BC2010094420080524D +:107FA000E00319AA21008052420FC21AC9010094AD +:107FB000146700B9E00316AAF8FDFF97006B00B93B +:107FC000EFFFFF17FB03172AE5FFFF1700008052A2 +:107FD000C0035FD6FD7BBDA9FD030091F35301A94A +:107FE000F30301AAF55B02A9F50300AA000040F91A +:107FF000001840F98EE7FF97F40300AA160440F931 +:10800000A00240F9E5FDFF97E103002A8282423990 +:10801000E00316AAE3010094602640B91F04007132 +:108020006022403921020054611A40F9E10100B494 +:1080300000040034602A40B91F2000716800005419 +:10804000809A40B960030036E10313AAE00314AA42 +:10805000FE02009460050034F35341A9F55B42A988 +:10806000FD7BC3A8C0035FD680030034601A40F9CB +:10807000400300B4602A40B91F200071680000541A +:10808000809A40B9A0020036E10313AAE00314AAC3 +:10809000CD03009420FEFF35E10313AAE00314AAE8 +:1080A000F35341A9F55B42A9FD7BC3A80504001465 +:1080B000E10313AAE00314AA39020094E0FCFF359F +:1080C000E10313AAE00314AAF35341A9F55B42A903 +:1080D000FD7BC3A848020014E10313AAE00314AA1D +:1080E00095020094A0FBFF35E10313AAE00314AA54 +:1080F000F35341A9F55B42A9FD7BC3A88F0200148D +:10810000808A4239E10313AAC0000034E00314AAB4 +:10811000F35341A9F55B42A9FD7BC3A8ACFFFF1750 +:10812000E00314AAF35341A9F55B42A9FD7BC3A860 +:108130000003001400008052C0035FD6FD7BBAA983 +:10814000FD030091F35301A9F51300F9F50300AA0B +:108150002EE7FF97F40300AAE00315AA34E7FF9780 +:10816000F30300AA800640F9600600F9800A40F98E +:10817000600A00F980524139608A023980624039D0 +:1081800060820239801E40B9601A00B9802240B96D +:10819000601E00B9802640B9602200B9803640B91F +:1081A000607600B9801640F9601600F9800240B987 +:1081B000600600B9803A40B9608200B9803E40B99B +:1081C000608600B9804240B9608A00B9804640B9F3 +:1081D000608E00B9804A40B9609200B9804E40B9C3 +:1081E000609600B9805240B9609A00B9600240B907 +:1081F00000010035E2E30091E00315AA010080527E +:1082000017E2FF97800300346EA0FF97600200B969 +:10821000E00315AA6F0B0094603E00F9400000B423 +:10822000F10A0094606240B9A0000035E00313AA8F +:108230009A01009420008052606200B9600240B947 +:10824000E13F99D24173A7F20100018B2108C09A46 +:1082500040068052217C001BE00315AA617200B920 +:10826000B5FFFF97F35341A9F51340F9FD7BC6A86D +:10827000C0035FD6E0E30091FBE1FF97E4FFFF1747 +:10828000FD7BBFA9FD030091019040B9406A40F910 +:1082900073CCFF971F00007100A09F5AFD7BC1A8FF +:1082A000007C4093C0035FD6FD7BBDA9FD03009118 +:1082B000F35301A9F40300AAF51300F9D3E6FF97DD +:1082C000F30300AAE00314AAD9E6FF97F50300AA76 +:1082D00001008052E00314AA5CE7FF97600600F9F2 +:1082E00062A2009121008052E00314AA43E7FF97A5 +:1082F000600A00F9210000D021143F91804A40F922 +:10830000E8EBFF976062003902108052210000D034 +:10831000804A40F921603F9164EBFF97601E00B9ED +:1083200082008052210000D0804A40F921A03F9174 +:108330005EEBFF97602200B902008052210000D05E +:10834000804A40F921E03F9158EBFF97602600B941 +:10835000611640F9E05B40B23F0000EB6900005459 +:1083600020008052A0860239804A40F9210000F0A6 +:1083700021340091CBEBFF9760520139E00314AA3E +:10838000C0FFFF97F50300AA2001F8B6200000F017 +:108390000064009111DAFF9740028012F35341A963 +:1083A000F51340F9FD7BC3A8C0035FD602249452A5 +:1083B00041000090E200A072210412913BEBFF9774 +:1083C000600200B902208052E00315AA210000F0EB +:1083D0002120019135EBFF97603A00B902028052EB +:1083E000E00315AA210000F0214801912FEBFF972F +:1083F000603E00B902198052E00315AA210000F086 +:108400002174019129EBFF97604200B9E21F80526D +:10841000E00315AA210000F021AC019123EBFF97A6 +:10842000604600B982028052E00315AA210000F0E4 +:1084300021E401911DEBFF97604A00B9820280524E +:10844000E00315AA210000F0211C029117EBFF9711 +:10845000604E00B9210000F0215402910200801208 +:10846000E00315AA1AEBFF97603600B9E00314AADF +:108470009FE6FF97000440B9605200B900008052A7 +:10848000C7FFFF1702604039211C0012220100348F +:1084900003644039E3000034000180520008C31A2D +:1084A000007C021B41000034007C0153C0035FD6F6 +:1084B00000008052FEFFFF17040440F9631C001205 +:1084C000840040B9BF3F03D5E30200340320A85223 +:1084D0008400032A230040397F080071A102005460 +:1084E000030440F92110403965E040B9BF3F03D58E +:1084F000E31F80522120C21A6320C21AA300230A5C +:108500002100032ABF3F03D5020440F941E000B92E +:10851000BF3F03D5000440F9040000B900008052B9 +:10852000C0035FD60120A8128400010AF9FFFF17DB +:10853000A0028012FBFFFF17FD7BBDA9FD03009188 +:10854000F35301A913008052F55B02A9F50300AAB9 +:10855000000080D2D3D4FF97F403002AF67082D2B1 +:10856000E00314AACFD4FF971F0016EB4901005473 +:1085700001718252200000D000543E9197D9FF979C +:1085800000008052F35341A9F55B42A9FD7BC3A8CB +:10859000C0035FD671B8FF97A00240B9BF3F03D5B3 +:1085A000C000F836730600117F0E0071A1FDFF5464 +:1085B00020008052F4FFFF1713008052E9FFFF17DD +:1085C000421C1053211C14532100022A001C185372 +:1085D0002000002AC0035FD6E20300AA2008403929 +:1085E000E001003620204039600000342028403966 +:1085F00060010036202840B96001003420844039F1 +:108600000000001240980239200440391F200071F8 +:10861000E900005460418012C0035FD60000805220 +:10862000F9FFFF1720008052F7FFFF17001C409250 +:10863000230000D0631020916078E078E0FEFF37DF +:10864000408C0239202440391F20007148FEFF541D +:10865000001C40926078E07800FEFF3740900239BD +:10866000208040391F20007168FDFF54001C40929B +:108670006078E07820FDFF37409402390000805296 +:10868000E6FFFF17C0035FD6010040B9BF3F03D527 +:1086900021000032BF3F03D5010000B9C0035FD6FF +:1086A000010040B9BF3F03D521781F12BF3F03D55A +:1086B000010000B9C0035FD6010040B9BF3F03D538 +:1086C00021001932BF3F03D5010000B9C0035FD6B6 +:1086D000FD7BBFA9E503012AFD030091F1FFFF9790 +:1086E000031040B9BF3F03D561000032BF000071E5 +:1086F00063781F126300811A430C1F33BF3F03D5F9 +:10870000FD7BC1A8031000B9E0FFFF17FD7BBFA9E7 +:10871000E303012AFD030091E2FFFF97050040B942 +:10872000BF3F03D56304005146781F536104020B19 +:10873000E2018052A56C09122108C61A21040051D9 +:108740003F3C00712190821AA14C012ABF3F03D502 +:10875000FD7BC1A8010000B9CCFFFF17FD7BBFA9BD +:10876000E403012AE30300AAFD030091CDFFFF9774 +:10877000020040B9BF3F03D542741D1244000836C1 +:1087800042001F324400003642001E32BF3F03D574 +:10879000FD7BC1A8620000B9E00303AABBFFFF177D +:1087A000FD7BBFA9E503012AE40300AAFD030091B4 +:1087B000BCFFFF97030040B9BF3F03D5020100345F +:1087C00062001732A20C1633BF3F03D5FD7BC1A850 +:1087D000820000B9E00304AAACFFFF17200080521A +:1087E000627816120020C51AE003202A050C001238 +:1087F000F5FFFF17FD7BBFA9E903012AE73F995267 +:10880000FD0300914773A772E80300AAA5FFFF9735 +:108810002001070B4700070B0008C91AE208C21A1B +:108820004200000B5F00036B480000546300024BE2 +:108830004204000B5F00056B48000054A500024B8A +:1088400001040051C6040051A500010B6300010B97 +:1088500081040051C600000B2100000BA508C01ABE +:108860002108C01AC608C01AA51C18536308C01AEC +:10887000211C1053C61C00122100062AA360032AE3 +:108880002100032ABF3F03D5FD7BC1A8010D00B91C +:10889000E00308AA7DFFFF17FD7BBFA9E20300AA42 +:1088A000FD030091000440F97EFFFF97400440F96A +:1088B000011440B9BF3F03D5400C502921340A129E +:1088C000633C10536010002A0000012ABF3F03D50B +:1088D000410440F9201400B9BF3F03D5400440F9DA +:1088E0001F2400B9401840B9007C0153BF3F03D595 +:1088F000410440F9201800B9BF3F03D5400440F9B6 +:108900001F4400B9FD7BC1A8400440F95FFFFF1779 +:10891000FD7BBEA9FD030091F35301A9F30300AA57 +:10892000BF3F03D5019000B921000032BF3F03D5FE +:1089300014E28452019000B9940600519F06003160 +:1089400041010054E00313AAFCFEFF9740020034EB +:10895000BF3F03D5000080527F9200B9F35341A975 +:10896000FD7BC2A8C0035FD6609240B9BF3F03D56C +:10897000A0000836200080D203D4FF9777B7FF9776 +:10898000EEFFFF1714FEFF35200000D000B43A912F +:1089900092D8FF9780008012F1FFFF17FD7BBFA9DF +:1089A000E60300AAFD0300910CFFFF97E303002AF2 +:1089B000C0010035C3984239E00306AA0200805284 +:1089C000BEFEFF97E303002A00010035C29442393E +:1089D000C1904239C08C4239FAFEFF97BF3F03D5A0 +:1089E000C10440F9200400B9E003032AFD7BC1A8BB +:1089F000C0035FD6FD7BBBA9E50301AAE60300AA7D +:108A0000FD030091F35301A9F55B02A9F76303A9E4 +:108A100022084079352840B9341840F90198423984 +:108A2000130440F9A1070034427C0853441C085346 +:108A3000E00305AAE44F00B993FEFF971F7C007185 +:108A40006807005460000034811C002AE14F00B91F +:108A5000A1060051E04F40B921080C532100002A23 +:108A6000A020403921000932E14F00B980010034D3 +:108A7000A10840F9BF3F03D5C00440F9019400B9F3 +:108A8000E14F40B9A02040390004005100041053C8 +:108A90000000012A00000D32E04F00B9E14F40B95B +:108AA000E00313AA9BFFFF97F603002AA0020035FC +:108AB00060A240B9BF3F03D597008052BF02176B39 +:108AC000B892971AB792971AE20317AAE133019165 +:108AD000E04F00B9E00314AA27D3FF97BF1200713B +:108AE0000901005460A640B9BF3F03D5A202184B4C +:108AF000E1330191E04F00B98002178B1ED3FF973D +:108B0000E003162AF35341A9F55B42A9F76343A991 +:108B1000FD7BC5A8C0035FD6421C001280018052B5 +:108B20005FF001714210801AC1FFFF177641801279 +:108B3000F4FFFF179AFFFF17FD7BBBA9E20300AA12 +:108B4000E00301AAFD030091F35301A9F55B02A91B +:108B5000F76303A94398423933104039342840B9A8 +:108B60007F000071361840F921144039550440F94E +:108B70007302811A01204039731E085341010034E9 +:108B8000030840F9BF3F03D5410440F9239400B9DD +:108B90000120403921040051210410533300132ACD +:108BA00073020D324198423937FEFF971F7C0071E6 +:108BB0008804005440000034731E002A340300343B +:108BC00097008052800600519F02176BE10316AA9E +:108BD0009892971A000814539792971A1300132A21 +:108BE000E20317AAE0330191E3D2FF977302113237 +:108BF000E04F40B9BF3F03D5A0AA00B99F12007152 +:108C0000090100548202184BC102178BE033019115 +:108C1000D9D2FF97E04F40B9BF3F03D5A0AE00B90E +:108C2000E103132AE00315AA3AFFFF97F35341A982 +:108C3000F55B42A9F76343A9FD7BC5A8C0035FD6D6 +:108C4000C00B8012FAFFFF17FD7BBFA9E60300AA45 +:108C5000FD0300912860403960FEFF97E403002A7D +:108C6000A0050035C3984239E70301AAE00306AA2C +:108C70000203805211FEFF97E403002AC00400356E +:108C8000C12040B9BF3F03D5C00440F9011C00B961 +:108C9000C098423960040034E5144039C19042392B +:108CA000C2944239C08C423946FEFF97A500002A83 +:108CB000E10840F9BF3F03D5C00440F9016800B99D +:108CC00008010034C1984239E00307AAEEFDFF977E +:108CD0001F7C0071A802005440000034A560002AE7 +:108CE000BF3F03D5C00440F9050400B9C00440F9F2 +:108CF000011440B9BF3F03D5E0204039216C1C125C +:108D0000000400510000012ABF3F03D5C10440F90F +:108D1000201400B9E003042AFD7BC1A8C0035FD67C +:108D2000E5104039DEFFFF1764418012FAFFFF179C +:108D3000FD7BBCA9FD030091F35301A9F30300AA35 +:108D400020008052F55B02A9F76303A9362840B9D9 +:108D5000380840F9351840F94BFEFF9760864239D4 +:108D6000C0050034611640F90043368BF703162A1C +:108D70001F0001EB22050054740A40F99402188B7D +:108D8000770000B49F0A40F2E1010054D2A4FF979B +:108D900080030035000080D2FF0200EB6103005425 +:108DA000600640F9E5FDFF97C00D00358000801298 +:108DB000F35341A9F55B42A9F76343A9FD7BC4A81E +:108DC000C0035FD680164038F70600D1A0160038E1 +:108DD000ECFFFF17816A60F8A16A20F8002000917B +:108DE000E10200CB3F1C00F168FFFF54E0F27D92EE +:108DF0009402008BB502008BF70200CBE6FFFF1751 +:108E0000000080D2F7FFFF17816A6038A16A20381E +:108E100000040091E1FFFF17BF3F03D5600640F952 +:108E2000166C00B9BF3F03D5600640F9210080529F +:108E3000016000B996040035000080D2750640F943 +:108E400098D2FF97F40300AAA06240B9BF3F03D5B0 +:108E500040092837E00314AA92D2FF971F2800F197 +:108E600048080054200080D2C7D2FF973BB6FF9736 +:108E7000F6FFFF17600640F9142C40B9BF3F03D539 +:108E8000943E007241020054200080D2BED2FF976F +:108E900032B6FF97F7060071E1FEFF54200000D0C4 +:108EA00000503B91A10D80124CD7FF97BF3F03D5D7 +:108EB000600640F941008052016000B9A00D8012A7 +:108EC000BCFFFF1737E28452F3FFFF17601E40B963 +:108ED000620A40F9807E001B1F00166B0090961AF4 +:108EE000A10640F2610000541F0440F24002005409 +:108EF000E303002A010080D27F0001EB410100540E +:108F0000B542208BD602004B600640F9142C40B9C4 +:108F1000BF3F03D5943E001210B6FF9794FDFF3576 +:108F2000C5FFFF1744004039A46A2138210400918D +:108F3000F2FFFF17037C02537F0001EB20FEFF547A +:108F4000440040B9A47A21B821040091FBFFFF1727 +:108F5000200000D0A10D801200CC3B91D3FFFF1761 +:108F60000000805293FFFF17200000D0A10D801257 +:108F700000783C91CDFFFF17BF3F03D5600640F955 +:108F800001048052016000B9000080D2750640F9EA +:108F900044D2FF97F40300AAA06240B9BF3F03D5B3 +:108FA00000F02F36E00314AA3ED2FF971F2800F1ED +:108FB00008FDFF54200080D273D2FF97E7B5FF97DA +:108FC000F6FFFF17FD7BBFA9E60300AAFD03009192 +:108FD00082FDFF97E303002AA0060035C3984239BB +:108FE000E70301AAE00306AA0202805233FDFF97BD +:108FF000E303002AC0050035C12040B9BF3F03D5B7 +:10900000C00440F9011C00B9C09842396005003421 +:10901000E2144039C1904239C0944239214C145372 +:109020002040002A0000022ABF3F03D5C10440F9B6 +:10903000200800B9C2944239C1904239C08C4239EB +:1090400060FDFF97BF3F03D5C10440F9200400B97C +:10905000E10840F9BF3F03D5C00440F9017800B9E9 +:10906000C098423900010034C00440F9003840B9CA +:10907000BF3F03D500001232BF3F03D5C10440F902 +:10908000203800B9C00440F9011440B9BF3F03D5EE +:10909000E0204039216C1C12000400510000012A1C +:1090A000BF3F03D5C10440F9201400B9E003032AEF +:1090B000FD7BC1A8C0035FD6E2104039D6FFFF1781 +:1090C000FD7BBBA9FD030091F35301A9F30300AAA3 +:1090D00020008052F55B02A9F76303A9F96B04A98C +:1090E000372840B9360840F9F503172A341840F9F3 +:1090F00065FDFF97609A4239200600356086423947 +:10910000E0050034611640F9C07E4092B642368BCD +:10911000DF0201EB42050054760A40F9D602008BCB +:10912000750000B4DF0A40F201020054EAA3FF9781 +:10913000A0030035000080D2BF0200EB8103005481 +:10914000600640F9FDFCFF97C00D0034000080521E +:10915000F35341A9F55B42A9F76343A9F96B44A90D +:10916000FD7BC5A8C0035FD680164038B50600D188 +:10917000C0160038EBFFFF17816A60F8C16A20F85B +:1091800000200091A10200CB3F1C00F168FFFF54BA +:10919000A0F27D92D602008B9402008BB50200CB28 +:1091A000E5FFFF17000080D2F7FFFF17816A6038E4 +:1091B000C16A203800040091E0FFFF17798240B9AE +:1091C0009F0640F2A0040054E00315AAB5B2FF9731 +:1091D000F60300AAA00900B4E10314AAF40316AA36 +:1091E000E20315AA64D1FF97BF3F03D5600640F99B +:1091F000177C00B9BF3F03D5600640F921008052BB +:10920000017000B9017D80D2607240B9009C0F915D +:109210000008C19ADCD1FF9757020035000080D2C8 +:10922000750640F99FD1FF97F40300AAA07240B9D8 +:10923000BF3F03D5000A2837E00314AA99D1FF974E +:109240001F2800F1E80B0054200080D2CED1FF97F8 +:1092500042B5FF97F6FFFF17160080D2E3FFFF1716 +:109260003F03176B000080D23593971A620A40F9CA +:10927000A17E02531F0001EB61020054A10600729F +:10928000A1020054000080D27A0640F985D1FF97F0 +:10929000F80300AA402F40B9BF3F03D51F3C10720E +:1092A00020050054E00318AA7ED1FF971F2800F183 +:1092B00008030054200080D2B3D1FF9727B5FF9751 +:1092C000F5FFFF17837A60B800040091430000B9EE +:1092D000E9FFFF17A2767E92217C4093630A40F952 +:1092E0008202028B000080D23F0000EBC0FCFF54E2 +:1092F000446860380004009164000039FBFFFF17E8 +:109300008000801293FFFF176001801291FFFF170A +:10931000200000B000503B91A10D80122FD6FF9786 +:10932000BF3F03D5600640F941008052017000B98B +:10933000760000B4E00316AAD3B1FF97A00D801207 +:1093400084FFFF179442358BF702154B03B5FF9747 +:10935000B2FFFF17200000B0A10D8012000C3D915C +:10936000EFFFFF17F6EEFFB4E00316AAC6B1FF97B2 +:1093700074FFFF17BF3F03D5600640F90104805218 +:10938000017000B9000080D2750640F945D1FF9701 +:10939000F40300AAA07240B9BF3F03D540FE2F36A8 +:1093A000E00314AA3FD1FF971F2800F148FDFF54A6 +:1093B000200080D274D1FF97E8B4FF97F6FFFF1723 +:1093C000200000B0A10D801200BC3D91D4FFFF171A +:1093D000211C0012421C0012210400513F1C00718C +:1093E000E80000542300009063800C9163486138CA +:1093F000610000102388238B60001FD6604180121B +:10940000C0035FD6A20000341F04177260418012AF +:1094100000009F1AFBFFFF171F041472FCFFFF17C9 +:10942000620000341F0076F2F9FFFF171F0073F28D +:10943000F7FFFF17620000341F0072F2F4FFFF17FE +:109440001F0071F2F2FFFF1700008052EDFFFF17BF +:10945000FD7BBFA9E40301AA22008052FD03009115 +:1094600021044039050C40B9E003052AD9FFFF97D4 +:109470004003003580204039C00000348124403949 +:10948000E003052A22008052D2FFFF9760020035D8 +:1094900080604039C000003481644039E003052A0F +:1094A00022008052CBFFFF9780010035802440B915 +:1094B00080010034818040391F080071E2179F1A33 +:1094C000E003052AC3FFFF971F000071E0179F1AF2 +:1094D000FD7BC1A8C0035FD600008052FDFFFF17CF +:1094E00020008052FBFFFF17220040F923E09FD2AB +:1094F0004200038A5F0420F1E00200542220403938 +:10950000A2000034220440F94200038A5F0420F1E3 +:109510002002005422604039C2000034220C40F97D +:1095200023E09FD24200038A5F0420F140010054EF +:10953000222440B95F040071C900005422804039E0 +:109540005F20007161000054222840B942000037BA +:10955000C0FFFF1700008052C0035FD623084039C8 +:10956000630100372328403923010037236840393D +:10957000E300003723844039A3000037220040393C +:109580005F04007141000054B2FFFF1700008052D9 +:10959000C0035FD6040040F9E20300AAE30301AA76 +:1095A000841840F9840040F9843440F9841040F96B +:1095B000A40000B4840440F9640000B4F00304AAD9 +:1095C00000021FD6E10303AAE00302AAE4FFFF178B +:1095D000FD7BBBA9FD030091F35301A9F40301AA8C +:1095E000F55B02A9F50300AAF76303A9F92300F9C3 +:1095F000020040F9421840F9420040F9563440F95F +:10960000E5FFFF971F1C0072400B0054E00315AAF2 +:109610005CF8FF97F303002AA001F837C01240F965 +:10962000600200B4020840F9220200B4E10314AA67 +:10963000E00315AA40003FD6F303002A1F3008318B +:1096400060010054E00315AA50F8FF97BF03009192 +:10965000E003132AF35341A9F55B42A9F76343A939 +:10966000F92340F9FD7BC5A8C0035FD6802A40B925 +:1096700040070034802640B9961A40F91F04007153 +:1096800001070054F70316AA160080D28022403941 +:1096900093024039826240397302000B7302020B5D +:1096A000617E4093213C009121187C92FF6321CB85 +:1096B000810A4079F9030091E10300396005003423 +:1096C00001040051E3070091850A40F921701D5300 +:1096D000A424C19A21200051641400383F20003195 +:1096E00081FFFF5400040011A2000034421C40928C +:1096F0002003008BE11F805203D0FF97D80217AAE6 +:10970000640080521F0300F161721D5384049F1A8C +:10971000E20319AA84044092E00315AA030080D250 +:109720001CF8FF97F303002A20F9FF35D8F8FFB49F +:10973000812A40B9E30317AAE20316AAE00315AA97 +:10974000440080D221701D5312F8FF97C0F7FF34F8 +:10975000F303002ABEFFFF17170080D2CBFFFF17CD +:10976000170080D2CAFFFF17200080D2DFFFFF174B +:1097700073418012B6FFFF17030040F9E40300AA0B +:10978000E20301AA631840F9630040F9633440F929 +:10979000631040F9E30000B4650040F9650000B4CF +:1097A000F00305AA00021FD6600840F9C00200B508 +:1097B0004020403943004039811840B96300000B14 +:1097C000406040396300000BA10000343F00036B90 +:1097D00062000054A0028012C0035FD64094442966 +:1097E0001F04007141010054801440B9800000340E +:1097F0001F00056B0090851A402800B9402840B929 +:10980000A0FEFF3400008052F4FFFF1781FFFF34F9 +:109810002100034B3F00056B2190851A412800B9B8 +:10982000F7FFFF17202C40F9020080121F0800B933 +:10983000202C40F9020000B9202C40F9000040B96A +:109840001F0C40F2000100540000009000B02E9167 +:1098500002028052202800F900008052229400B9B0 +:10986000C0035FD6000000900204805200E02D91FA +:10987000F9FFFF17E2038052229000B9EAFFFF17B9 +:1098800000048052209400B90000009000102D9137 +:10989000202800F900008052C0035FD6010C47A9C0 +:1098A000049840B9064040F9847C0313029040B903 +:1098B000630001CB012C40F9847C4093252040B902 +:1098C000014440F9210006CB210003CB630CC49A6C +:1098D000210CC49A4100014B4200054B5F00036B11 +:1098E0004230831A030080123F00026B2190821ADB +:1098F000210400513F04003141000054C0035FD6F1 +:10990000043C40F9029C80B99F0002EBC000005467 +:10991000039840B9023840F97F200071410100549A +:1099200043004039022C40F9436000B9029840B925 +:10993000043840F9427C031382C0228B023800F9BC +:10994000ECFFFF1743004079F7FFFF17030848A912 +:10995000012C40F9420003CB039840B9212440B9BF +:10996000637C0313637C4093420CC39A3F00026BF9 +:109970002130821A210400513F040031410000547B +:10998000C0035FD6022C40F9044440F9436040B95B +:10999000029C80B99F0002EBC0000054049840B9BB +:1099A000024040F99F20007101010054430000393A +:1099B000029840B9034040F9427C031362C0228BF5 +:1099C000024000F9ECFFFF1743000079F9FFFF1791 +:1099D000202840B92200A0521F4040710090821AF6 +:1099E000202800B900008052C0035FD6FD7BBEA9CD +:1099F000FD030091F30B00F9F303012A0CE1FF973B +:109A0000136C00B900008052F30B40F9FD7BC2A833 +:109A1000C0035FD6FD7BBDA9FD030091F35301A9EF +:109A2000F303012AF51300F9F50300AAF7E0FF9705 +:109A3000F40300AAE00315AAFDE0FF97012C40F90A +:109A4000820240B93F0800B95F00136B4390931A3C +:109A50004290931A013040F92108C29A022C40F931 +:109A60002104001121381F12411400B92200805234 +:109A7000012C40F9220800B9036800B900008052A7 +:109A8000F35341A9F51340F9FD7BC3A8C0035FD68A +:109A9000FD7BBEA9FD030091F35301A9F30300AAC6 +:109AA000DAE0FF97F40300AAE00313AA65E1FF9749 +:109AB000800600F9000200B4604A40F90224945282 +:109AC000E200A072210000F02104129177E5FF97D7 +:109AD000800200B9210000D0218C0C91604A40F92D +:109AE000F0E5FF97E103002A000080523F1C00725E +:109AF00040000054A0028012F35341A9FD7BC2A88C +:109B0000C0035FD6FD7BBEA9FD030091F30B00F9F6 +:109B1000C7E0FF97013040B9F30300AA001440F9F1 +:109B2000C3040094A0000035E00313AAF30B40F92E +:109B3000FD7BC2A8A8DCFF17F30B40F9FD7BC2A890 +:109B4000C0035FD602844239019840B92104005114 +:109B5000420476D3211000122100022A02884239E1 +:109B6000006C40B942047AD3000478D34000002A44 +:109B70002000002AC0035FD6019840B90284423910 +:109B800021040051420478D3211070D32100022A0D +:109B900002884239006C40B942047CD300047AD375 +:109BA0004000002A2000002AC0035FD60284423908 +:109BB000019840B921040051420478D3210C0012CD +:109BC0002100022A02884239006C40B942047CD349 +:109BD00000047AD34000002A2000002AC0035FD688 +:109BE000FD7BBDA9FD030091F35301A9F30300AA76 +:109BF000F51300F9F50301AA8DE0FF97E20300AA2F +:109C0000F40300AA01008052E00313AA94DBFF973B +:109C1000F303002A00020035E00314AA61DCFF9779 +:109C20001F000071A10480120410417A60000054EA +:109C30001F300831A1010054E00314AA8ADBFF970A +:109C4000A00200F9800000B5B3028012E00314AA5C +:109C500061DCFF97E003132AF35341A9F51340F9A0 +:109C6000FD7BC3A8C0035FD6F303002AFAFFFF17EA +:109C7000FD7BBBA9FD030091F35301A9F55B02A98C +:109C8000F50300AAF76303A999E0FF97F60300AA7A +:109C9000E00315AA5DE0FF97F30300AAE00315AA0D +:109CA00063E0FF97F40300AA00018052E04F00B97F +:109CB000600640F9802E00F981820191600240B96E +:109CC000806A00B9E00315AAC6FFFF97F303002AD4 +:109CD000A0010035E00315AA55E0FF9718A00091F8 +:109CE000F70300AAE10318AAE00315AA9B04009455 +:109CF000F303002A400100341F3008310418423AAF +:109D000080030054E003132AF35341A9F55B42A9F1 +:109D1000F76343A9FD7BC5A8C0035FD6E00318AA7B +:109D200031040094F303002A40020034010B40B9CF +:109D3000E01640F93E040094200000D000B40C91DD +:109D4000D50000B4A10A40A9E303132A210040F979 +:109D5000A2D3FF97ECFFFF17220000F0210000F0D4 +:109D6000E303132A42C0119121EC1191F9FFFF176F +:109D7000960600B4E10314AAE00315AAC0023FD678 +:109D8000F303002A00FCFF35802E40F9210000D0AB +:109D9000E233019121880D91005C40B9A04A40F95D +:109DA000BFE4FF9780010035E14F40B93F0C0071DF +:109DB00089000054809640B93F00006BC9000054F0 +:109DC000200000D000C00D9184D3FF970001805285 +:109DD000E04F00B9E04F40B9809A00B9802E40F9B9 +:109DE0009F8602391F0800B9802E40F91F2C00B948 +:109DF00020008052812E40F9200800B9819240B99C +:109E000021F8FF35812E40F9201800B9812E40F944 +:109E1000221840B95F00006BE100005400040011FB +:109E20001F00047101FFFF54809200B93F1800B970 +:109E3000B5FFFF171F04007100109F1AFBFFFF17EB +:109E4000B3028012B0FFFF17C0035FD6FD7BBBA932 +:109E5000FD030091F35301A9F40301AAF55B02A9E4 +:109E6000F60300AAF76303A9F92300F9000040F9FB +:109E7000382440B9191840F9E00319AAECDFFF971C +:109E8000812240391F07007195024039F30300AA6F +:109E9000B502010B81624039B502010BB51E40923B +:109EA000A13E009121107C92FF6321CB6100805282 +:109EB00021049F1A01840239012840F9F703009117 +:109EC00020003FD6612E40F93F0800B9612E40F9CD +:109ED000200000B91F070071A1000054612E40F955 +:109EE000802A40B900040051200400B9612E40F9D5 +:109EF00020008052200800B9810A4079E10200392F +:109F000081224039E100003420701D53E3060091A6 +:109F1000002000511F200031610400542004001172 +:109F200082624039A2000034421C4092E0C2208B81 +:109F3000E11F8052F4CDFF97C00240F9010080522A +:109F4000C2FFFF97773A00F9F702158B773E00F9C9 +:109F50007F7E08A9610247A93F0000EBC1020054BF +:109F6000951A40F91F07007181060054754200F9E7 +:109F7000802A40B9A002008B604600F9C00240F977 +:109F800006F6FF971823C01A602E40F9181000B982 +:109F9000610248A93F0000EB4101005414008052C7 +:109FA00049000014820A40F94224C09A6214003821 +:109FB000D8FFFF17E00313AA39FEFF97E6FFFF174C +:109FC000E00313AA62FEFF97604240F91F0015EB01 +:109FD00001030054602E40F9003440B9A0FD1F3643 +:109FE000200000D0001C0C91B90100B4210B40A945 +:109FF000210040F994008012F8D2FF97BF0300912E +:10A00000E003142AF35341A9F55B42A9F76343A97E +:10A01000F92340F9FD7BC5A8C0035FD6220000D01C +:10A02000210000D042C0119121EC1191F2FFFF17E5 +:10A03000F50300AAD7FFFF17753A00F9802A40B947 +:10A04000B502008B753E00F9E00313AA14FEFF97DA +:10A05000C00240F9D1F5FF97210080522120C01A9B +:10A06000602E40F9011000B9610247A93F0000EBE2 +:10A07000610300541ACEFF9714D0439194020991C2 +:10A08000B5008052602E40F9002840B9BF3F03D58B +:10A090000000150A1F10007120F8FF5410CEFF9722 +:10A0A0009F0200EB05FFFF54602E40F9002840B9E5 +:10A0B000BF3F03D50000150AB40D80121F100071B8 +:10A0C000E0F6FF54602E40F9210080521F1000B9C5 +:10A0D000C00240F95DFFFF97C9FFFF17E00313AA15 +:10A0E000EFFDFF97E1FFFF17FD7BBCA9FD0300918A +:10A0F000F35301A9F403012AF55B02A9F50300AAB1 +:10A10000F60303AAF76303A9F70302AAF80304AA54 +:10A11000001840F946DFFF979F0A40F260020054A2 +:10A12000200000B0004C0E91750100B4A10A40A9B6 +:10A13000210040F913008012A8D2FF97E003132AF0 +:10A14000F35341A9F55B42A9F76343A9FD7BC4A87A +:10A15000C0035FD6220000D0210000D042C0119180 +:10A1600021EC1191F4FFFF17F30300AA98000036C9 +:10A17000E00315AA0100805234FFFF97DF0200F1CF +:10A18000E41A40FAA1060054DF0200F1E0079F1A2A +:10A1900000781F53612A40F960860239E00313AA50 +:10A1A000947E035320003FD6773A00F9612E40F9A0 +:10A1B000F702148B773E00F9764200F9D602148B31 +:10A1C000764600F9749E00B93F0800B9612E40F947 +:10A1D000220040B91F00026B40000054200000B96B +:10A1E000E00315AA6DF5FF97622E40F92100805219 +:10A1F0002020C01A401000B9602E40F9010800B9B3 +:10A20000E00313AAA6FDFF97D1FDFF97600648A9BA +:10A210003F0000EB68FFFF54B1CDFF9714D043918E +:10A2200094020991B6008052602E40F9002840B98E +:10A23000BF3F03D50000160A1F1000712101005412 +:10A2400013008052D8F70F36E00315AA2100805280 +:10A25000FEFEFF97BAFFFF1700008052CEFFFF17E8 +:10A260009FCDFF979F0200EB05FEFF54602E40F943 +:10A27000002840B9BF3F03D50000160A1F10007127 +:10A2800000FEFF54B30D8012EFFFFF17050040F9E9 +:10A29000A53440F9A50040F9650000B4F00305AA13 +:10A2A00000021FD6A0048012C0035FD6E00301AAFB +:10A2B000E103022AE20303AAE30304AAE2B3FF17BD +:10A2C000FD7BBEA9FD030091F30B00F9F30301AA86 +:10A2D000D7DEFF97010040F9610200F9000440F960 +:10A2E000600600F900008052F30B40F9FD7BC2A824 +:10A2F000C0035FD6FD7BBEA9FD030091F35301A906 +:10A30000F40300AAC1DEFF9701008052F30300AA04 +:10A31000E00314AA02DFFF971F0400B1A10000545C +:10A32000A0028012F35341A9FD7BC2A8C0035FD6EF +:10A33000600600F921008052E00314AAF8DEFF97BE +:10A340001F0400B1E0FEFF54600A00F94100805292 +:10A35000E00314AAF2DEFF971F0400B120FEFF54B1 +:10A36000600200F900008052EFFFFF17FD7BBDA9DE +:10A37000FD030091F35301A9F30300AAF51300F9BB +:10A38000ABDEFF9715400091F40300AAE10315AA84 +:10A39000E00313AAF102009440020034E303002A10 +:10A3A0002000009000BC3291330100B4610A40A942 +:10A3B000210040F909D2FF9740028012F35341A9CE +:10A3C000F51340F9FD7BC3A8C0035FD6220000D07F +:10A3D000210000D042C0119121EC1191F6FFFF172E +:10A3E000E00315AA80020094E00313AA710100940F +:10A3F00060FEFF3420000090002C33912EADFF97BB +:10A40000A10A40B9800A40F989020094EBFFFF17C6 +:10A41000000840F9E103012A006861B8BF3F03D595 +:10A42000C0035FD6E30300AAE003012ABF3F03D5C0 +:10A43000610040F9E203022A206822B8C0035FD617 +:10A44000FD7BBEA9FD030091F35301A9BF3F03D5D6 +:10A45000010040F93F1402B9140040F9000080D215 +:10A4600010CDFF97F30300AA801A42B9BF3F03D56E +:10A470001F0C40F220010054E00313AA09CDFF97FE +:10A480001FA00FF128010054200080D23ECDFF977D +:10A49000B2B0FF97F5FFFF1700008052F35341A9B8 +:10A4A000FD7BC2A8C0035FD6A00D8012FCFFFF1782 +:10A4B000FD7BBDA9FD030091F35301A9F30300AA9D +:10A4C000F51300F9010040F9211442B9BF3F03D54B +:10A4D000010040F9211842B9BF3F03D53F0C40F2BB +:10A4E00080010054D7FFFF97400100341300801211 +:10A4F000200000B000E80E91B8D1FF97E003132AC6 +:10A50000F35341A9F51340F9FD7BC3A8C0035FD6FF +:10A51000BF3F03D5600240F9E1018052011402B946 +:10A52000000080D2750240F9DECCFF97F40300AA48 +:10A53000A01A42B9BF3F03D5C0011836E00314AAE0 +:10A54000D8CCFF971FA00FF1A8000054200080D2A4 +:10A550000DCDFF9781B0FF97F6FFFF17200000B0E9 +:10A56000B30D801200500F919CD1FF97E4FFFF17AD +:10A57000E00313AAB3FFFF97F303002A00FCFF34A4 +:10A58000200000B000E80E9194D1FF97DCFFFF1788 +:10A59000FD7BBEA9FD030091F35301A9D097FF975E +:10A5A00013D00291000080D2BECCFF97F40300AA22 +:10A5B000600240B9BF3F03D520010037E00314AA71 +:10A5C000B8CCFF971FA00FF128010054200080D2C3 +:10A5D000EDCCFF9761B0FF97F6FFFF1700008052A8 +:10A5E000F35341A9FD7BC2A8C0035FD6A00D801222 +:10A5F000FCFFFF17FD7BBFA9FD0300911F1440F274 +:10A60000C0000054E10300AA200000B000E43C9127 +:10A6100072D1FF97A8CBFF97E20301AA231440F25F +:10A62000C0000054200000B000B43D91F9FFFF17B6 +:10A6300021740BD5630001916100008B7F0002EB58 +:10A6400083FFFF54FD7BC1A8C0035FD6FD7BBBA980 +:10A65000FD030091F55B02A9F50300AA000080D27A +:10A66000F35301A9F76303A918008052F92300F9F5 +:10A670008CCCFF97F60300AAA99EFF97B4CE47A9FA +:10A68000849DFF9701008052021040911900A8D2CA +:10A69000E00314AA1CCCFF97F70312AA941240916E +:10A6A00054B200F9731240D17A9DFF97E0B600F9D9 +:10A6B000789DFF979402008B769DFF97730200CBE5 +:10A6C0000F9EFF97B30000B5B801003538008052E7 +:10A6D000B4CE48A9FCFFFF177F0219EBE00314AAD0 +:10A6E0007792999AE10317AA730217CB9402178BFA +:10A6F000C1FFFF9719B0FF97F3FFFF172E9EFF973B +:10A700005B9EFF97E003162A66CCFF97F35341A99F +:10A71000E103002AF55B42A9200000B0F76343A9DA +:10A7200000843E91F92340F9FD7BC5A82BD1FF178A +:10A73000FD7BBCA9FD030091F35301A91300029115 +:10A7400014800291F55B02A9160080D2F76303A979 +:10A750001700A8D2150080D278827FA9610240F943 +:10A760003F0015EB6801005473420091D602158B2F +:10A770009F0213EB01FFFF54403E40F91F0016EB10 +:10A78000E0020054200000D00004049112000014E4 +:10A790001F0017EB0190979A400100B4200400D1EC +:10A7A0001F0001EAE1000054A002188BD5B0FF970A +:10A7B000B502008B600240F9000015CBE8FFFF17DF +:10A7C000200000D0002403913BACFF97200000D074 +:10A7D00000BC039138ACFF9737CBFF97F35341A9E7 +:10A7E000F55B42A9F76343A9FD7BC4A8C0035FD60C +:10A7F000010840F921A840B9BF3F03D5020840F93C +:10A80000424040B9BF3F03D563789852443C0012A0 +:10A810007F20226BA0020054224850D3A3B494524C +:10A820009F00036B42149F1A000040F9000840B9D2 +:10A83000BF3F03D500040012430080D224344AD322 +:10A840006320C09A203C4ED30000040B242445D33F +:10A85000211000128100010B0000010B0000020B0F +:10A860006020C09AC0035FD602008052EFFFFF173E +:10A87000014040F9E10400B4013C40F92100449159 +:10A88000BF3F03D5024280D24200BFF2410000B96F +:10A89000229C60D3BF3F03D5834280D24300BFF2E6 +:10A8A000620000B9BF3F03D563F00191610000B9B8 +:10A8B000BF3F03D5815280D24100BFF2220000B9D0 +:10A8C000018847A92100028B210400D1BF3F03D595 +:10A8D000024380D24200BFF2410000B9229C60D303 +:10A8E000BF3F03D563D001D1620000B9BF3F03D59C +:10A8F000617C00B9BF3F03D5815380D24100BFF2D4 +:10A90000220000B9BF3F03D522208052228016B812 +:10A91000014840F9C10400B4014440F9BF3F03D5E8 +:10A92000024480D24200BFF2410000B9229C60D3B1 +:10A93000BF3F03D5834480D24300BFF2620000B919 +:10A94000BF3F03D5617C00B9BF3F03D5815480D29E +:10A950004100BFF2220000B9018048A92000008B0D +:10A96000000400D1BF3F03D5014580D24100BFF2B2 +:10A97000200000B9019C60D3BF3F03D5824580D23F +:10A980004200BFF2410000B9BF3F03D5407C00B98F +:10A99000BF3F03D5805580D24000BFF2010000B90F +:10A9A000BF3F03D541408052018015B8C0035FD638 +:10A9B000FD7BB2A9FD030091F35301A9F40300AAA2 +:10A9C000F55B02A9F71B00F910DDFF97F30300AA5E +:10A9D000E00314AA16DDFF97F60300AA021380D243 +:10A9E00001008052E023019147CBFF97E9FEFF97DA +:10A9F000800C003574008052000080D2770240F94C +:10AA0000A8CBFF97F50300AAE00E40B9BF3F03D5DE +:10AA1000C00B0037E00315AAA2CBFF971FA00FF1D0 +:10AA2000280A0054200080D2D7CBFF974BAFFF9766 +:10AA3000F6FFFF17413E40F93F0014EB4001005480 +:10AA4000413E40F9200000B000BC3F9121FC54D3AE +:10AA500062D0FF97200000D081FE54D30090009177 +:10AA60005ED0FF97413E40F93F0014EB09010054CE +:10AA7000200000D00024019158D0FF97200000D082 +:10AA800000F0019155D0FF978BCAFF97413E40F9E6 +:10AA9000200000D00048029121FC54D34FD0FF97F2 +:10AAA00081058052E00313AA5AFEFF97610240F924 +:10AAB00040043836200041B9222080522200A07282 +:10AAC0000000022A200001B9E2DF9F52610240F932 +:10AAD000C2FFBF72200041B90000020A200001B984 +:10AAE00022208052610240F9200441B90000022A6C +:10AAF000200401B9610240F9201041B900001F3261 +:10AB0000201001B9AB98FF9760000035E023019158 +:10AB1000CFFEFF97E023019106FFFF97E02301910D +:10AB200054FFFF97E06340F9C00200F9403E40F94E +:10AB3000C00600F93D000014200041B9C2DF9F5259 +:10AB4000C2FFBF720000020A200001B92220801259 +:10AB5000610240F9200441B90000020A200401B951 +:10AB6000EDFFFF17E00313AA52FEFF979406007152 +:10AB700041F4FF54200000D0008402914EABFF97B7 +:10AB8000150080122900001401228052E00313AA4C +:10AB900020FEFF97147C05535196FF97012042B980 +:10ABA000BF3F03D5217C125394060012020180524C +:10ABB000E00313AA21001E532100142A1AFEFF9756 +:10ABC00001158052E00313AA12FEFF97E103002A49 +:10ABD000021C8052E00313AA13FEFF97E00313AA9E +:10ABE00004FFFF971F0000F1F40300AA0000A8D2A1 +:10ABF0009412809A406A40F9E523019144E2019160 +:10AC0000030080D202008052010080D234C9FF9735 +:10AC1000F503002A00F1FF34B5008012200000B0D7 +:10AC200000303F9124ABFF97E003152AF35341A96D +:10AC3000F55B42A9F71B40F9FD7BCEA8C0035FD6A8 +:10AC4000FD7BBCA9FD030091F35301A9F40301AA04 +:10AC5000E2E30091F55B02A9F50300AA010040F9C7 +:10AC6000C00C80524DE0FF97F303002A80010035AD +:10AC7000E01F40F9010040F9363440F9800200F944 +:10AC8000C20240F9620100B4E10315AAE00314AA6C +:10AC900040003FD680010034F303002AE003132A6A +:10ACA000F35341A9F55B42A9FD7BC4A8C0035FD65D +:10ACB000A00A40B91F04007101010054A00E40B960 +:10ACC000800600F9C10640F9A1FEFFB4E00314AA12 +:10ACD00020003FD6F1FFFF17B3028012F0FFFF17ED +:10ACE000FD7BB9A9E403012A03008052FD03009112 +:10ACF000F30B00F9F30302AAE5830091210000B0F1 +:10AD0000220000B021F03A9142BC3A912AE1FF972B +:10AD10007F0200F980000035E10313AAE08300916F +:10AD2000C8FFFF97F30B40F9FD7BC7A8C0035FD6B0 +:10AD3000010040F9210040F9213440F9210840F98F +:10AD4000610000B4F00301AA00021FD60000805287 +:10AD5000C0035FD6010040F9210040F9213440F9D9 +:10AD6000210C40F9610000B4F00301AA00021FD6D3 +:10AD700000008052C0035FD6FD7BBEA9FD03009199 +:10AD8000F35301A9F40300AA130080D2800A40B94A +:10AD90001F00136B6800005400008052060000146E +:10ADA000800240F90014138B73060091EAFFFF97AD +:10ADB000E0FEFF36F35341A9FD7BC2A8C0035FD676 +:10ADC000010040F9210040F9213440F9211040F9F7 +:10ADD000610000B4F00301AA00021FD600008052F7 +:10ADE000C0035FD6FD7BBEA9FD030091F35301A90B +:10ADF000F40300AA130080D2800A40B91F00136B2D +:10AE0000680000540000805206000014800240F9DF +:10AE10000014138B73060091EAFFFF97E0FEFF36E4 +:10AE2000F35341A9FD7BC2A8C0035FD6FD7BBDA93A +:10AE3000FD030091F35301A9F403012AF30300AACF +:10AE4000F51300F915008052BF02146B6B0000541B +:10AE5000000080520C000014600240F9800000B530 +:10AE6000B506001173820091F8FFFF17E00313AAE3 +:10AE7000B9FFFF9780000035E00313AAADFFFF97ED +:10AE800000FFFF34F35341A9F51340F9FD7BC3A83C +:10AE9000C0035FD6FD7BBCA903008052220000B036 +:10AEA000FD030091F35301A942BC3A91F40301AAB6 +:10AEB000F55B02A9F71B00F9F70300AA3F0800B9E8 +:10AEC000210000B021F03A91D7E0FF97F303002A68 +:10AED0001F0000712D020054007C7B9301009052F2 +:10AEE0007BC9FF97800200F9400300B4150080D2AF +:10AEF000820240F9E103152AE00317AA4214158BD8 +:10AF000078FFFF976001F836F303002A810A40B901 +:10AF1000800240F9C6FFFF97E003132AF35341A9CB +:10AF2000F55B42A9F71B40F9FD7BC4A8C0035FD6BF +:10AF3000800A40B9B506009100040011800A00B9EA +:10AF40007F02156B6CFDFF5413008052F3FFFF1757 +:10AF500073018012F1FFFF17004840F9CEFFFF1781 +:10AF6000FD7BBEA9000280D2FD030091F35301A92D +:10AF7000F40301AA0100905255C9FF97600100B483 +:10AF8000F30300AAE10300AAE00314AAC2FFFF979B +:10AF900040000034137C4093E00313AAF35341A90B +:10AFA000FD7BC2A8C0035FD673018092FBFFFF1731 +:10AFB000FD7BBFA9FD030091EAFFFF971F0440B18D +:10AFC00049000054000080D2FD7BC1A8C0035FD6B9 +:10AFD000014840F9F7FFFF17FD7BBEA9FD03009173 +:10AFE000F30B00F9F30300AA000040F990DBFF9790 +:10AFF000630640F901048052020040F9200080D22B +:10B00000610CC11A0020C31A21741E53217C409385 +:10B01000446861B80000042A406821B800008052EA +:10B02000F30B40F9FD7BC2A8C0035FD6FD7BBFA92F +:10B03000FD0300917EDBFF9700008052FD7BC1A8DD +:10B04000C0035FD6FD7BBDA9FD030091F35301A9A9 +:10B05000F30300AAF51300F9000040F974DBFF9731 +:10B06000620640F901048052040040F943100012C6 +:10B07000410CC11A220080D24220C39AF503022A51 +:10B0800021741E53217C4093856861B8A200220A76 +:10B09000826821B8130040F9000080D27302018B4E +:10B0A00000CAFF97F40300AA600240B9BF3F03D56E +:10B0B0001F00156A20010054E00314AAF9C9FF9784 +:10B0C0001FD007F148010054200080D22ECAFF97FC +:10B0D000A2ADFF97F5FFFF1700008052F35341A97F +:10B0E000F51340F9FD7BC3A8C0035FD6A00D801205 +:10B0F000FBFFFF17FD7BBDA9FD030091F35301A9E1 +:10B10000F30300AAF51300F949DBFF97F40300AA43 +:10B11000E00313AACBDBFF97F50300AA604A40F9CE +:10B1200002028052210000B0217C0A91DFDFFF97EC +:10B13000A042208B800200F900008052F35341A905 +:10B14000F51340F9FD7BC3A8C0035FD6FD7BBEA904 +:10B15000220000D0210000D0FD030091034840F9F7 +:10B16000E463009142C80D9121A80D911EDCFF9768 +:10B1700000008052FD7BC2A8C0035FD6FD7BBFA943 +:10B18000FD0300912ADBFF97000040F9010040B960 +:10B19000BF3F03D581000036BF3F03D5C10E8052AB +:10B1A000010C00B900008052FD7BC1A8C0035FD62E +:10B1B000FD7BBDA9FD030091F35301A9F40300AA8F +:10B1C0001BDBFF97F30300AAE00314AAECFFFF9731 +:10B1D000BF3F03D5600240F921000090E2B3009127 +:10B1E00021F03A911F0000B9804A40F9C0DFFF9773 +:10B1F000600100B473420091E00313AADFFEFF97E1 +:10B20000E02F00B960000035E00313AAF6FEFF97B7 +:10B21000F35341A9FD7BC3A8C0035FD60000805251 +:10B22000FCFFFF17FD7BBBA9FD030091F35301A9B0 +:10B23000F40300AAFEDAFF97F30300AAE00314AABE +:10B2400083DBFF97600200F9A00000B5A002801226 +:10B25000F35341A9FD7BC5A8C0035FD6E2A30091CB +:10B26000E00314AA01008052FDD5FF97E02700B942 +:10B2700000FFFF35E0A30091CAD6FF97E02700B991 +:10B2800080FEFF35E0A30091F7D5FF97017D80D2C6 +:10B290000008C19A600A00B9A0FDFF34804A40F955 +:10B2A00021000090E293009121F03A9190DFFF9706 +:10B2B000800000B5E00314AABEFFFF97E5FFFF176B +:10B2C00073420091E00314AAE10313AA23FFFF973E +:10B2D000E02700B9E0FBFF35E00313AAC2FEFF97A9 +:10B2E000E02700B980FEFF34DAFFFF17FD7BBDA920 +:10B2F000FD030091F35301A9F40300AAF51300F92B +:10B30000F50301AACADAFF97F30300AAE00314AA1F +:10B31000A8FFFF9701048052620A40B9600240F919 +:10B32000427C151B420400714310C05AE201805256 +:10B330002100034B21109F1A2140007121509F1AB8 +:10B340003F3C007121D0821A2110012ABF3F03D552 +:10B35000010400B9600240F9BF3F03D521008052CB +:10B36000010000B9E00314AAF35341A9F51340F911 +:10B37000FD7BC3A882FFFF17FD7BBDA94201805260 +:10B38000210000D0FD030091F35301A9F30300AAAB +:10B3900021B81991F55B02A9004840F943DFFF97F6 +:10B3A000F503002A604A40F902F48152210000D0DE +:10B3B00021E819913DDFFF9781008052140CC11ADA +:10B3C000210000D0604A40F9211C1A91947E4093DC +:10B3D000B4DFFF971F1C007281020054604A40F9DD +:10B3E000210000D03600805221681A91ADDFFF970E +:10B3F000E00313AA91DAFF97F30300AA1664003959 +:10B40000000080D2750200B9740600F925C9FF97C3 +:10B41000600A00F900008052F35341A9F55B42A98C +:10B42000FD7BC3A8C0035FD616008052F1FFFF1753 +:10B43000FD7BBBA9FD030091F35301A9F55B02A9B4 +:10B44000F71B00F9030040F9633440F9630040F949 +:10B45000630600B4F30300AAF60301AA60003FD616 +:10B46000F403002A20030035E00313AA73DAFF97E0 +:10B47000F50300AA20008052020280D2010080520F +:10B48000177D80D2A0620039E00301919EC8FF972A +:10B49000A10640F9E30313AA620640F900000090F8 +:10B4A000217C179B001018914EACFF97A01200F959 +:10B4B000800100B5610640F9200000D054028012DE +:10B4C00000AC1A91C5CDFF97E003142AF35341A9AC +:10B4D000F55B42A9F71B40F9FD7BC5A8C0035FD609 +:10B4E000A30640F9E0030191010280D2220000D0BE +:10B4F00042281B9168CDFF97C40AD79AE3030191B4 +:10B50000610640F9020000F0200000D042A82D9111 +:10B5100000581B91B1CDFF97ECFFFF17B4048012C8 +:10B52000EAFFFF17FD7BBCA920118052FD030091AB +:10B53000E1E30091F35301A9F55B02A97EDCFF97DB +:10B54000C0010035E01F40F9340000903500009044 +:10B5500094822A91B5222A91167D8052130840F9CF +:10B56000736201D1E11F40F96262019121400091B3 +:10B570005F0001EBC100005400008052F35341A969 +:10B58000F55B42A9FD7BC4A8C0035FD6E00313AA04 +:10B59000E4D9FF9700010035E00313AA27DAFF97EB +:10B5A00001644039E1000035610640F9E00315AA65 +:10B5B0008ACDFF97732E40F9736201D1EAFFFF171E +:10B5C000010040B9020080D2E00313AA217C161BBF +:10B5D00098FFFF9700FFFF34E00314AA610640F9CB +:10B5E000F4FFFF17010040F9213440F9210840F928 +:10B5F000610000B4F00301AA00021FD6A00480126B +:10B60000C0035FD6018840B9E1010036FD7BBEA9C9 +:10B61000FD030091F30B00F9F30300AA07DAFF978B +:10B6200000604039A0000034E00313AAF30B40F996 +:10B63000FD7BC2A8ECFFFF17F30B40F9FD7BC2A80E +:10B64000C0035FD6C0035FD6040000F084C02D9114 +:10B65000030080D202686338620000343F0003EBCD +:10B6600041000054C0035FD685C8623865000036CB +:10B6700042800011421C00120268233863040091CA +:10B68000F5FFFF17E403002A2007A0B0001843F9D4 +:10B69000E00000B500008012C0035FD600008012F9 +:10B6A000F35341A9FD7BC2A8C0035FD6FD7BBEA9B1 +:10B6B000E30302AAFD030091F35301A9F403012A55 +:10B6C000F303012A2107A0B0E20314AA211C43F9C5 +:10B6D0002140248BDBD2FF979F0200EB01FEFF5439 +:10B6E000E003132AEFFFFF17FD7BBDA9FD030091C7 +:10B6F000F35301A9F51300F93F0400712901005427 +:10B70000F40300AA000840B91F80007160030054D0 +:10B710001F400071800800543FBC3F71C9000054B5 +:10B720002000009000CC28912CCDFF970000805283 +:10B730000B0000141F300071A1FFFF5480324079CC +:10B7400015741E533508D51A007C151B3308004BA1 +:10B7500013000014800240F9005873B8F35341A954 +:10B76000F51340F9FD7BC3A8C0035FD6800240F902 +:10B7700000587378FAFFFF17E05F1C323F00006B40 +:10B7800002FDFF5480324079C2008052007C021BCF +:10B79000007C02133508C01AB386001B802240B912 +:10B7A0001F00156BC0010054C1008052820E40B9C9 +:10B7B000A07E011B0300010B4400004B7F00026BC5 +:10B7C00083224079820240F98180811A6000000B57 +:10B7D000ADFFFF97C0FAFF37952200B9800A40B944 +:10B7E0001F40007140FCFF541F80007140FBFF545C +:10B7F0001F300071C1F9FF546106130B820240F93A +:10B80000217C015320040011416861384068603890 +:10B810002020000B53000036007C0453002C001243 +:10B82000CFFFFF17E0FD9F523F00006BA8F7FF54CA +:10B83000803240791504000B3508D51A007C151BA1 +:10B840000004000B3300004BD5FFFF17FD7BBBA9A5 +:10B85000FD030091F35301A9F40303AAF55B02A9C8 +:10B86000F50300AAF60302AAF76303A9F92300F976 +:10B870004105003417344079001C40B9F702011B20 +:10B88000A4324079DF1640F2E007005484FC0091B6 +:10B89000F803009184E47A928438019184347C9294 +:10B8A000FF6324CBF3FF009173E67A92A0324079D4 +:10B8B0001F0014EB690300541F030091B40200B48D +:10B8C000A0324079F80300912100805200FC0091E1 +:10B8D00000E47A920038019100347C92FF6320CB1F +:10B8E000E003172AF3FF009173E67A92E20313AAAA +:10B8F00065FFFF971F04007121020054E20314AAA0 +:10B90000E10313AAE00316AA9BC7FF971F03009148 +:10B91000000080520C000014171440B9D9FFFF1723 +:10B92000F9060011E20313AAE003172A210080524E +:10B9300055FFFF971F040071400100541F03009141 +:10B9400000008012BF030091F35341A9F55B42A9A7 +:10B95000F76343A9F92340F9FD7BC5A8C0035FD66F +:10B96000A2324079E00316AAE10313AAF703192AC9 +:10B9700081C7FF97A0324079D602008B940200CB9A +:10B98000CBFFFF179F0014EBA8F9FF54930AC49A4A +:10B99000E20316AAE003172AE103132A3AFFFF97EE +:10B9A0001F00136BE1FCFF54A1324079F702000B3A +:10B9B000207C001BD602008B940200CBC0FFFF1737 +:10B9C000FD7BBCA9FD030091F35301A9F30300AA79 +:10B9D0002007A0B0F55B02A9001843F9F71B00F996 +:10B9E000000100B514008012E003142AF35341A9AA +:10B9F000F55B42A9F71B40F9FD7BC4A8C0035FD6E5 +:10BA0000F50301AAF60302AA011040F9000880D24A +:10BA100021FC009121E47A9265AAFF97F70300AA1E +:10BA200020FEFFB4E20300AA2100805200008052F1 +:10BA300015FFFF97A000F83614008012E00317AA44 +:10BA400011A8FF97E9FFFF17E10317AAE00313AA64 +:10BA5000020880D248C7FF97651E4079602E4039A2 +:10BA600074324039642E40791420142A65FEFF3464 +:10BA70006042403920FEFF3461564039021E805238 +:10BA80003FDC03712490427A81FDFF54810208510A +:10BA9000823E4092213C00123F003871E8FCFF5486 +:10BAA000410400D13F0002EA81FCFF546136403975 +:10BAB0006636403921FCFFB4230400D17F0001EA3F +:10BAC000C1FBFF5464000035612640B961FBFF34BF +:10BAD00061464039947E0553634A403994060051CB +:10BAE0002320032A9402036A81FAFF54440100359B +:10BAF000612640B901010034E10201910004805245 +:10BB0000C00200B9420380D2E00315AA1AC7FF970A +:10BB1000CBFFFF17633C7BD30014041B61920091A1 +:10BB20006308C29A624E40390000030B63524039E9 +:10BB30004320032A43000035632240B96300004BD1 +:10BB400082018052000280526308C61A7FD03F7182 +:10BB50000080821AEBFFFF17FD7BB7A9222000911E +:10BB6000FD030091F35301A9F40300AAF30301AA12 +:10BB7000E0430191E1C30091F51300F991FFFF97B4 +:10BB800020050035650A40B92207A0B0F503002A58 +:10BB900042E01891BF80007121010054E07740B964 +:10BBA000600E00B9E07340B9602E00B94001003565 +:10BBB000400440F9602E00B907000014E0CF40793E +:10BBC000600E00B9E03340F9009C58D3602E00B9F4 +:10BBD000A0FEFF34E1BF4079E0834139630E40B9F4 +:10BBE000603200B961220079420840F90004031B69 +:10BBF000E377413963360079E12F40F9601600B9E7 +:10BC0000249C58D364320079E10304AA873C409213 +:10BC10005F2024EB400100542000009000E40F91CD +:10BC2000EECBFF97B5008012E003152AF35341A92C +:10BC3000F51340F9FD7BC9A8C0035FD6A30000350A +:10BC40002000009000901091E4CBFF97F6FFFF17C3 +:10BC5000647C041B9F404071E9000054E103042A06 +:10BC60002200A0522000009000F81091DBCBFF973B +:10BC7000EDFFFF1763781F53BF800071210300544D +:10BC80000000034B601E00B9E07F40B9602A00B994 +:10BC900000008012602200B9C00080527F4A003943 +:10BCA000217C001B000880D221FC001121347A92F3 +:10BCB000BFA9FF97600200F960FBFFB4930200F98F +:10BCC000602A40B980020129602A40B9807E022999 +:10BCD000200080D2800E00F99F1200F9D3FFFF17D9 +:10BCE000E23340F9425C48D342E87BD34208C79A2A +:10BCF000622600B94200034B4200000B0000805254 +:10BD0000621E00B9E2FFFF17FD7BBDA9FD03009194 +:10BD1000F35301A9F51300F93507A0B0021040F95B +:10BD2000A01A03F92007A0B000E0189142FC00918E +:10BD300042E47A9242000191FF6322CB020C80D24E +:10BD4000F3FF00918CC6FF9773E67A922100805230 +:10BD5000E20313AA000080524BFEFF971F040071FC +:10BD600020010054BF1A03F914008012BF03009190 +:10BD7000E003142AF35341A9F51340F9FD7BC3A84E +:10BD8000C0035FD660FA0791420080D22100009084 +:10BD900021D41291ABC6FF97F403002A40FEFF3571 +:10BDA000210000D060DA009121681991620080D2F0 +:10BDB000A4C6FF97C0FDFF34210000D0604A019166 +:10BDC00021781991A20080D29EC6FF9700FDFF3412 +:10BDD000E5FFFF17FD7BB8A92207A0B0FD03009186 +:10BDE0005F1803F9E2830091F35301A9F30300AA5A +:10BDF000F403012A5FCCFF97400200345401003461 +:10BE0000620640B9E103142A200000900048129114 +:10BE100072CBFF9700008012F35341A9FD7BC8A8A5 +:10BE2000C0035FD6600E40F9FF0302A9601240F91B +:10BE3000E01B00F9FFE30039FF630139FF7B00B924 +:10BE4000E1830091E00313AAB0FFFF97F3FFFF1710 +:10BE5000FD7BBDA9FD030091F35301A9F30300AAE3 +:10BE6000F55B02A9001440B9E0000034150080D24F +:10BE7000E00315AAF35341A9F55B42A9FD7BC3A8D2 +:10BE8000C0035FD6630240F9F60301AA621240B90B +:10BE9000601A40B974344079827E021BA0040034D9 +:10BEA000600840B91F80007140040054601440B91C +:10BEB000632440B94000000B6200024B9F02026BFA +:10BEC0009492821A75020691E103142AE20315AADC +:10BED000EDFDFF97C0FCFF37600240F9003040796C +:10BEE000007C141BC00200B9601A40B9611240B94D +:10BEF000610E00B940020034620240F9400840B9C6 +:10BF00001F800071C001005421040011611200B9AA +:10BF100040344079007C011B412440B91F00016B73 +:10BF200083FAFF5420008052601600B9D1FFFF173A +:10BF3000601C40B94000000BE3FFFF17600240F9AE +:10BF4000EAFDFF97601200B91F040071C9FEFF549B +:10BF5000610240F9210840B93F800071C0000054DF +:10BF60003F40007102FE9F5201FE81522110821A51 +:10BF7000EBFFFF17E15F1C32E9FFFF17FD7BBDA957 +:10BF8000FD030091F30B00F9F30300AA011C40B973 +:10BF900041020035E1B30091AEFFFF97A00000B56C +:10BFA0007F1200F9F30B40F9FD7BC3A8C0035FD6F5 +:10BFB000E12F40B9217C055321040051611E00B9D5 +:10BFC000601200F9601240F9010040393F00007131 +:10BFD00000109F9AF4FFFF17001040F92104005150 +:10BFE000611E00B900800091F6FFFF17FD7BBAA922 +:10BFF000FD030091F35301A9F30300AAF55B02A925 +:10C00000F643019115E00091F76303A91FA400F91D +:10C01000F92300F9E00313AAD9FFFF97F40300AA5C +:10C02000200100B5000080527F1A00F9F35341A9A6 +:10C03000F55B42A9F76343A9F92340F9FD7BC6A844 +:10C04000C0035FD6601E40B9610E40B96006052985 +:10C05000601240F9601A00F9820240395F9403715E +:10C06000A0FDFF54812E403941041836210C0012E6 +:10C070003F3C007101FDFF54E2FC373617004039A8 +:10C08000F40300AA19344039020080D2F77A191259 +:10C09000F7060051FF060031C10800548002403904 +:10C0A0001F9403710418457A60FBFF5462C2228B0F +:10C0B000010080D2000080525FE000390260195315 +:10C0C0004004402A826A6138210400914000200B1C +:10C0D000001C00123F2C00F121FFFF543F03006BB6 +:10C0E000A1F9FF5494F9FFB460E2009160A600F951 +:10C0F00076E20491E10314AAF50316AAE00316AA56 +:10C10000020180D29CC5FF977F020539A102403908 +:10C11000E01B80523F00006A010B0054803240391E +:10C1200080001836A102164BE00316AA47FDFF97C0 +:10C1300081224039E01B80523F00006A60020054B7 +:10C14000F70315AAC005805281220091620080D2B7 +:10C15000E0160038E00317AA87C5FF978032403900 +:10C1600080002036E00317AA610080D237FDFF97D8 +:10C17000BF120039F50317AAA1024039E01B805213 +:10C180003F00006AE1070054BF02003960E2443911 +:10C190001F940371A10700547FE2043960A640F99F +:10C1A000400000B576A600F920008052A0FFFF17DE +:10C1B00084060091030080D261F87FD3E003032A54 +:10C1C00081686138616836382103003461040011E8 +:10C1D000630400917F1400F101FFFF54217C409320 +:10C1E000833A0091856A009160004039E403012A96 +:10C1F000C06A2138E0030034630800912004001174 +:10C2000021040091BF0003EB01FFFF54817240390C +:10C21000C1CA2038C100003480080011817A403939 +:10C22000C1CA203841000034800C00115800000BB6 +:10C230001FFF03710CEFFF54147C4093E10315AA18 +:10C24000A0C2208B67C5FF97E20314AAE10316AAD8 +:10C25000E00315AA48C5FF97E00313AA48FFFF971C +:10C26000F40300AA80EDFFB4027F409389FFFF171B +:10C27000E003012AEEFFFF17B5060091A4FFFF17A8 +:10C28000B5060091BDFFFF171F14007181F8FF5420 +:10C290004003801260E20439C1FFFF17FD7BBBA998 +:10C2A000FD030091F35301A9F30300AAF55B02A972 +:10C2B000F50301AAF76303A9F703022AF96B04A99E +:10C2C0001AE00491990B8052F40315AA80024039B8 +:10C2D000800000341FBC00710410597A80010054A2 +:10C2E000E00314AAD4C4FF97C00400B5570C083665 +:10C2F00000008052F35341A9F55B42A9F76343A9BB +:10C30000F96B44A9FD7BC5A8C0035FD694060091D4 +:10C31000EFFFFF17B5060091A002403980000034FE +:10C320001FBC00710410597A61FFFF54601A40B9B4 +:10C33000A0090034A20214CB5F0400F16102005492 +:10C34000010000F021DC0F91E00314AAA3C4FF97C1 +:10C35000A0080035600240F9012840B96186012932 +:10C36000002840B9600A00B97F1600B97F1E00B9E5 +:10C370007F1200F9A002403980FAFF35DCFFFF1779 +:10C38000F50314AAE5FFFF175F0800F1C10600548A +:10C39000010000F021D80F91ECFFFF1760A640F9D3 +:10C3A000A5C4FF971F0300EB61A640F90023809A04 +:10C3B000167C4092E00314AAE20316AA59C4FF9720 +:10C3C0002001003460A640F91F001AEBE00400547D +:10C3D000E20316AAE1031AAAE00314AA51C4FF97C4 +:10C3E00040040035611240F9202C403920032036EA +:10C3F000620240F920344079430840B97F800071DF +:10C400008101005421284079213C10530000010B88 +:10C41000600A00B9200100346082012900008052C6 +:10C420007F8202297F1E00B97F1200F9A7FFFF1744 +:10C4300001008052F6FFFF17402840B960820129B1 +:10C44000402840B9600A00B920008052F5FFFF176C +:10C45000A002403900010035D7F40737600280128E +:10C46000A5FFFF17B80214CBE00313AAE0FEFF9765 +:10C4700060F9FF35200080129FFFFF17FD7BB5A9F3 +:10C48000FD030091F76303A9F80301AA013080D2EC +:10C49000F70302AA2100A0F2F35301A9F30300AAB3 +:10C4A000000880D2F55B02A9F96B04A9FA0303AA7C +:10C4B000F90304AAFB7305A9BDA7FF97801800B470 +:10C4C000FB0300AAE1E30191A4FDFF97F403002A16 +:10C4D000A00F0035E10313AAE0031BAA220080523B +:10C4E0006FFFFF97F403002AA00E0035611340F997 +:10C4F000E28340B9F6274179202840795F800071B6 +:10C50000351C40B933344079003C10533F0300F9E7 +:10C51000E123417900009F1AFF0215EB0A0D005438 +:10C520005F0300F18D000054FA021A8BBF021AEB70 +:10C53000B5D29A9AD67E011B7302000B1CFE815263 +:10C54000D67E4093FA0316AAFF021AEB4A03005460 +:10C550005A0316CBB5021ACBF7021AEB00090054A6 +:10C56000DF0215EB000880D2DAD2959A41FF0091E4 +:10C5700021E47A928EA7FF97FC0300AA800100B401 +:10C58000E20300AAE3031AAAE103132AE0E30191FC +:10C59000AFFCFF97C0030034000000F000EC1191E5 +:10C5A0008EC9FF97E0031CAA37A5FF9714008012DD +:10C5B00043000014E103132AE0E301914BFCFF97D1 +:10C5C000F303002A1F04007102FE9F52A8000054CA +:10C5D000000000F000A0119180C9FF97F4FFFF1741 +:10C5E000E08340B91F800071E00000541F400071DB +:10C5F0008013821A7F02006BC2FEFF545A03168B0F +:10C60000D2FFFF17E05F1C32FBFFFF17B5021ACB0A +:10C610005A0317CBE2031AAA8103178BE00318AA67 +:10C6200055C4FF97E0031CAA17A5FF97200340F904 +:10C6300000001A8B200300F9350400B4E103132A2B +:10C64000E0E3019118031A8B28FCFF97F303002AFB +:10C650001F040071E9FBFF54E08340B91F800071A3 +:10C66000600400541F40007101FE9F5200FE815281 +:10C670000010811A7F02006BC2FAFF54FA0316AA57 +:10C68000FC03132A14FE815217FE9F525F0315EB21 +:10C690002B030054A37E4093E20318AAE103132A5C +:10C6A000E0E301916AFCFF97F403002A00040035DF +:10C6B000200340F90000158B200300F9E03F40F90A +:10C6C000F1A4FF97E0031BAAEFA4FF97E003142A4D +:10C6D000F35341A9F55B42A9F76343A9F96B44A958 +:10C6E000FB7345A9FD7BCBA8C0035FD6E05F1C327E +:10C6F000E1FFFF17E1031C2AE0E30191FBFBFF9739 +:10C70000010400519F03016B80010054437F40935B +:10C71000E20318AAE103132AE0E30191E33700F9E9 +:10C720004BFCFF97E33740F940020034000000F073 +:10C7300000EC1191A9FFFF171F040071A9F4FF5429 +:10C74000E18340B93F800071000100543F40007117 +:10C750008112971A1F00016BC2F3FF545A03168B04 +:10C76000FC03002ACAFFFF17E15F1C32FAFFFF1724 +:10C77000200340F9E1031C2AB5021ACB18031A8BD7 +:10C780000000038B200300F9E0E30191D7FBFF9742 +:10C79000F303002A1F040071C9F1FF54E08340B97C +:10C7A0001F800071000100541F4000718012971A11 +:10C7B0007F02006BE2F0FF54FA0316AAE003132A8B +:10C7C000E8FFFF17E05F1C32FAFFFF1774018012C9 +:10C7D000BFFFFF1700000000BC15E2FF00000000D3 +:10C7E0000000000000000000CD15E2FF0000000086 +:10C7F0000000000000000000E215E2FF0000000061 +:10C800000000000000000000F415E2FF000000003E +:10C8100000000000000000000A16E2FF0000000017 +:10C820000000000000000000000000000000000008 +:10C830000000000000000000E4F0E0FF0000000045 +:10C84000D0F1E0FF0000000064F1E0FF0000000014 +:10C8500000000000000000000000000000000000D8 +:10C860003714E2FF000000008CD1E1FF000000005F +:10C870004514E2FF0000000000000000000000007E +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000907CE1FF00000000AC +:10C8A000D47FE1FF00000000000000000000000055 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E000000000000000000090C8E1FF0000000010 +:10C8F000D07DE1FF000000003C7CE1FF0000000073 +:10C900000000000000000000000000000000000027 +:10C91000E812E2FF0000000000000000000000003C +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C940000000000000000000B40EE1FF0000000045 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C97000C912E2FF000000000000000000000000FB +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000180EE1FF0000000081 +:10C9B0000000000000000000000000000000000077 +:10C9C000080EE1FF00000000080EE1FF000000007B +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000100EE1FF0000000049 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10003E16E2FF000000000000000000000000E1 +:10CA20000000000000000000000000000000000006 +:10CA3000ECB2E1FF00000000B0B1E1FF0000000037 +:10CA40007CB1E1FF000000000000000000000000D9 +:10CA50005020D1FF00000000010000001400000081 +:10CA600008000000000000005420D1FF000000007A +:10CA70000200000014000000080000000000000098 +:10CA80005820D1FF00000000030000001400000047 +:10CA900008000000000000005C20D1FF0000000042 +:10CAA0000400000000000000100000000000000072 +:10CAB0002C20D1FF00000000050000001000000045 +:10CAC00010000000000000003820D1FF000000002E +:10CAD0000600000010000000100000000000000030 +:10CAE0003C20D1FF00000000070000001000000003 +:10CAF00010000000000000007420D1FF00000000C2 +:10CB0000080000000000000010000000000000000D +:10CB10007820D1FF000000000900000000000000A4 +:10CB200010000000000000000000000000000000F5 +:10CB300000000000000000008054E1FF0000000041 +:10CB4000AC5BE1FF000000000000000000000000FE +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000005A14E2FF0000000066 +:10CB80002498E1FF000000006A14E2FF00000000AA +:10CB90002498E1FF000000008014E2FF0000000084 +:10CBA0002498E1FF000000009614E2FF000000005E +:10CBB0002498E1FF00000000AC14E2FF0000000038 +:10CBC0002498E1FF00000000C214E2FF0000000012 +:10CBD0002498E1FF00000000D714E2FF00000000ED +:10CBE0008098E1FF00000000EA14E2FF000000006E +:10CBF0002498E1FF00000000FB14E2FF00000000A9 +:10CC00002498E1FF000000001415E2FF000000007E +:10CC10007498E1FF000000002415E2FF000000000E +:10CC20008098E1FF000000003415E2FF00000000E2 +:10CC30002498E1FF000000004815E2FF000000001A +:10CC40002498E1FF000000005915E2FF00000000F9 +:10CC50002498E1FF000000006915E2FF00000000D9 +:10CC60002498E1FF000000007A15E2FF00000000B8 +:10CC70002498E1FF000000008A15E2FF0000000098 +:10CC80002498E1FF00000000000000000000000008 +:10CC90000000000000000000D099E1FF000000004B +:10CCA00000000000000000004C9EE1FF00000000BA +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000E8A0E1FF00000000DC +:10CCF00098CCE1FF00000000149AE1FF0000000062 +:10CD0000EC99E1FF000000000000000000000000BE +:10CD10000000000000000000C4FAE1FF0000000075 +:10CD20007FF8E1FF0000000071F8E1FF0000000063 +:10CD300065F8E1FF000000000000000000000000B6 +:10CD4000D310E2FF00000000E410E2FF000000004A +:10CD5000F310E2FF000000000311E2FF00000000FA +:10CD60001511E2FF000000002511E2FF00000000A5 +:10CD70003811E2FF000000004911E2FF000000004E +:10CD80005B11E2FF000000006C11E2FF00000000F8 +:10CD90007F11E2FF000000009411E2FF000000009C +:10CDA000A611E2FF00000000B711E2FF0000000042 +:10CDB000C911E2FF00000000DA11E2FF00000000EC +:10CDC000ED11E2FF000000000012E2FF0000000091 +:10CDD0002613E2FF00000000000000000000000039 +:10CDE0003113E2FF0000000000000000000000001E +:10CDF0000000000000000000000000000000000033 +:10CE00007812E2FF000000000000000000000000B7 +:10CE10000000000000000000000000000000000012 +:10CE2000003DE1FF000000000000000000000000E5 +:10CE300000000000000000003052E1FF0000000090 +:10CE40000000000000000000ACA2E1FF00000000B4 +:10CE50009212E2FF0000000000000000000000004D +:10CE600000000000000000000000000000000000C2 +:10CE7000C513E2FF000000000000000000000000F9 +:10CE8000CD13E2FF000000000000000000000000E1 +:10CE9000D613E2FF000000000100000000000000C7 +:10CEA000EA13E2FF000000000000000000000000A4 +:10CEB000FE13E2FF00000000000000000000000080 +:10CEC0000000000000000000000000000000000062 +:10CED000E873E1FF000000002072E1FF00000000A5 +:10CEE000C472E1FF0000000000000000000000002C +:10CEF0005C72E1FF00000000000000000000000084 +:10CF000000000000000000002073E1FF00000000AE +:10CF1000B070E1FF000000008B02E2FF00000000A3 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000005613E2FF00000000A7 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000008913E2FF0000000054 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000007102E2FF000000005D +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB000D8AFE1FF0000000044B0E1FF0000000036 +:10CFC00000000000000000004113E2FF000000002C +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000A813E2FF00000000A5 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000C064E1FF000000001C +:10D010007864E1FF00000000A865E1FF0000000067 +:10D020009465E1FF00000000000000000000000027 +:10D030004A0AE2FF00000000780EE2FF0000000054 +:10D040001900000000000000830EE2FF0000000055 +:10D05000980EE2FF00000000050000000000000044 +:10D06000AD0EE2FF00000000B30EE2FF0000000082 +:10D070000200000000000000B90EE2FF0000000006 +:10D08000C00EE2FF000000001600000000000000DB +:10D09000C70EE2FF00000000CB0EE2FF0000000020 +:10D0A0001700000000000000D40EE2FF00000000A6 +:10D0B000DA0EE2FF00000000120000000000000095 +:10D0C000E10EE2FF00000000E70EE2FF00000000BA +:10D0D0001A00000000000000DD0CE2FF000000006C +:10D0E000ED0EE2FF00000000110000000000000053 +:10D0F0009108E2FF000000000B0FE2FF00000000BB +:10D100000E00000000000000120FE2FF000000000F +:10D110001A0FE2FF000000001000000000000000F5 +:10D12000220FE2FF00000000260FE2FF00000000D7 +:10D130001B000000000000002A0FE2FF00000000BA +:10D14000320FE2FF000000001C00000000000000A1 +:10D15000410FE2FF00000000450FE2FF0000000069 +:10D16000FFFFFFFF000000006AEBE1FF000000008E +:10D170006AEBE1FF00000000EFBEADDEEFBEADDE0A +:10D18000EFBEADDEEFBEADDEEFBEADDE00000000F7 +:10D1900001000000000E16191B00000000000040F6 +:10D1A0000100000006000000000000200100000057 +:10D1B0000500000000000040000000000200000028 +:10D1C000000000200000000001000000000000102E +:10D1D000000000000000000010270000A0860100F1 +:10D1E00040420F0080969800000000000000000000 +:10D1F000000000000000000025005B00020022008B +:10D200004C004C004C004C00A900000000080E0827 +:10D21000171717170800000040787D0180BA8C01AD +:10D2200080F0FA02007519030075190340787D013A +:10D2300080F0FA0200E1F50580F0FA0200D4650CF6 +:10D2400000C2EB0B00C2EB0B00C2EB0B270000008F +:10D250008000000080000000B3000000010000001A +:10D2600001000000E60000000100000001000000D5 +:10D27000030000004A0000007F00000007000000DB +:10D280004A0000007F000000960098009B009D006F +:10D2900004000000000000600300000000000070B7 +:10D2A000010000000000007000000000000000709D +:10D2B000000B0B0D0F0F0F0F000004400001044086 +:10D2C0000002044000030440000404400104044040 +:10D2D0000005044000000540000105400200000078 +:10D2E00000000030000000000000003000007D0061 +:10D2F0000F00760022007D007D007D007D007D0016 +:10D300003700370037007D007D007A007D007D000A +:10D310002A007D00760076000515202224000000FA +:10D32000130200090000000EC840150000000300B1 +:10D330000000010020000001000000006103000067 +:10D34000C84016000000030000000100400000017A +:10D350000000000061030000C86016000000030028 +:10D360000000010040000001000000006103000017 +:10D37000C840170000000300000001008000000109 +:10D380000000000061030000C860170000000300F7 +:10D3900000000100800000010000000061030000A7 +:10D3A000C840180000000300000001000001000157 +:10D3B0000000000061030000C840190000000300E5 +:10D3C00000000100000200010000000061090000EF +:10D3D000C8471A000000030000000100000400011B +:10D3E0000000000041090000C8471B0000000300C6 +:10D3F00000000100000800010000000041090000D9 +:10D40000C8471C00000003000000010000100001DC +:10D410000000000041090000C8431700000003009D +:10D420000000010080000001000000006101000018 +:10D43000C8431800000003000000010000010001C3 +:10D440000000000061010000C84319000000030053 +:10D45000000001000002000100000000610900005E +:10D46000C8431A000000030000000100000400018E +:10D470000000000061090000C8461A000000030017 +:10D48000000001000004000100000000410900004C +:10D49000C8461B0000000300000001000008000156 +:10D4A0000000000041090000C8461C000000030005 +:10D4B0000000010000100001000000004109000010 +:10D4C000C8481A0000000300000001000004000129 +:10D4D0000000000001080100C8481B000000030014 +:10D4E0000000010000080001000000000108010028 +:10D4F000C8481C00000003000000010000100001EB +:10D500000000000001080100C860180000000300CE +:10D5100000000100000100010000000061030000A4 +:10D52000C8601900000003000000010000020001B3 +:10D530000000000061030000C8671900000003003C +:10D54000000001000002000100000000410900008D +:10D55000C8671A0000000300000001000004000179 +:10D560000000000041090000C8671B000000030024 +:10D570000000010000080001000000004109000057 +:10D58000C8671C000000030000000100001000013B +:10D590000000000041090000C863140000000300FF +:10D5A0000000010010000001000000006101000007 +:10D5B000C863150000000300000001002000000106 +:10D5C0000000000061010000C863160000000300B5 +:10D5D00000000100400000010000000061010000A7 +:10D5E000C863170000000300000001008000000174 +:10D5F0000000000061010000C86318000000030083 +:10D6000000000100000100010000000061010000B5 +:10D61000C8631900000003000000010000020001BF +:10D620000000000061090000C8631A000000030048 +:10D63000000001000004000100000000610900007A +:10D64000C86619000000030000000100000200018C +:10D650000000000041090000C8661A000000030035 +:10D66000000001000004000100000000410900006A +:10D67000C8661B0000000300000001000008000154 +:10D680000000000041090000C8661C000000030003 +:10D69000000001000010000100000000410900002E +:10D6A000C86819000000030000000100000200012A +:10D6B0000000000001080100C8681A000000030013 +:10D6C000000001000004000100000000010801004A +:10D6D000C8681B00000003000000010000080001F2 +:10D6E0000000000001080100C8681C0000000300E1 +:10D6F000000001000010000100000000010801000E +:10D70000C8671C00000003000000010000100001B9 +:10D7100000000000410300009D40130000000300D2 +:10D72000000001000800000100000000610000008E +:10D730009D601400000003000000010010000001C3 +:10D7400000000000400000009D6015000000030084 +:10D750000000010020000001000000004000000067 +:10D760009D60160000000300000001004000000161 +:10D7700000000000000000009D6017000000030092 +:10D780000000010080000001000000000000000017 +:10D790009D6018000000030000000100000100016E +:10D7A00000000000210000009D601900000003003F +:10D7B0000000010000020001000000002100000044 +:10D7C0009D601A0000000300000001000004000139 +:10D7D00000000000610000009D601B0000000300CD +:10D7E00000000100000800010000000061000000CE +:10D7F0009D701400000003000000010010000001F3 +:10D8000000000000400000009D70150000000300B3 +:10D8100000000100200000010000000040000000A6 +:10D820009D70160000000300000001004000000190 +:10D8300000000000610000009D7017000000030060 +:10D8400000000100800000010000000061000000F5 +:10D850009D7018000000030000000100000100019D +:10D8600000000000610000009D701900000003002E +:10D87000000001000002000100000000610800003B +:10D880009D701A0000000300000001000004000168 +:10D8900000000000610000009D701B0000000300FC +:10D8A000000001000008000100000000610000000D +:10D8B0009D7021000000030000000100000800012D +:10D8C00000000000610000009D5B190000000300E3 +:10D8D00000000200000100010000000081080100BA +:10D8E0009D5A1A000000030000000100000400011E +:10D8F00000000000810A0000C220120000000300A6 +:10D900000000010004000001000000000100000010 +:10D91000C220130000000300000001000800000105 +:10D920000000000001000000C220140000000300FD +:10D9300000000100100000010000000000000000D5 +:10D94000C2201500000003000000010020000001BB +:10D950000000000001000000C220160000000300CB +:10D960000000010040000001000000000100000074 +:10D97000C220170000000300000001008000000129 +:10D980000000000001000000C2253200000003007A +:10D990000000010004000001000000000100000080 +:10D9A000C225350000000300000001002000000136 +:10D9B0000000000001000000C22536000000030046 +:10D9C0000010000000040001000000000100000041 +:10D9D000C2253700000003000000010080000001A4 +:10D9E0000000000001000000C22018000000030039 +:10D9F0000000010000010001000000000100000023 +:10DA0000C2253800000003000000010000010001F1 +:10DA10000000000001000000C225390000000300E2 +:10DA200000000100000200010000000001000000F1 +:10DA3000C2253A00000003000000010000040001BC +:10DA40000000000061080000C2261800000003006A +:10DA500000000100000100010000000000000000C3 +:10DA6000C2201900000003000000010000020001B4 +:10DA70000000000060000000C22539000000030023 +:10DA80000000010000020001000000000108000089 +:10DA9000C223140000000300000001001000000178 +:10DAA0000000000061000000C22815000000030013 +:10DAB00000000100200000010000000061000000E3 +:10DAC000C22619000000030000000100000200014E +:10DAD0000000000000000000C2201A000000030047 +:10DAE00000000100000400010000000060080000C8 +:10DAF000C2253A00000003000000010000040001FC +:10DB00000000000061080000C2953A000000030018 +:10DB10000000010000040001000000006008000097 +:10DB2000C2253B00000003000000010000080001C6 +:10DB30000000000061080000C2253C000000030056 +:10DB4000000001000010000100000000610800005A +:10DB5000C2201B00000003000000010000080001BB +:10DB60000000000061000000C2201C000000030053 +:10DB7000000001000010000100000000610800002A +:10DB8000C224150000000300000001002000000175 +:10DB90000000000041080000C22817000000030038 +:10DBA00000000100800000010000000001000000F2 +:10DBB000C2943C00000003000000010000100001BE +:10DBC0000000000001080200C2853B0000000300C5 +:10DBD0000000010000080001000000000108020030 +:10DBE000C2853A00000003000000010000040001AB +:10DBF0000000000001080200C2863A000000030095 +:10DC00000000010000040001000000000108020003 +:10DC1000C28539000000030000000100000200017D +:10DC20000000000001080200C2843C000000030064 +:10DC300000000100001000010000000001080200C7 +:10DC4000C2803B000000030000000100000800014A +:10DC50000000000001080200C2813B000000030038 +:10DC6000000001000008000100000000010802009F +:10DC7000C2813A000000030000000100000400011E +:10DC80000000000001080200C2843A000000030006 +:10DC90000000010000040001000000000108020073 +:10DCA000C2803900000003000000010000020001F2 +:10DCB0000000000001080200C281390000000300DA +:10DCC0000000010000020001000000000108020045 +:10DCD000C2833900000003000000010000020001BF +:10DCE0000000000001080200C284390000000300A7 +:10DCF0000000010000020001000000000108020015 +:10DD0000C281380000000300000001000001000192 +:10DD10000000000001080200C28438000000030077 +:10DD200000000100000100010000000001080200E5 +:10DD3000C2813700000003000000010080000001E4 +:10DD40000000000001080200C28437000000030048 +:10DD50000000010080000001000000000108020036 +:10DD600020BB15000000030000000100200000019E +:10DD7000000000004100000020BA1600000003006F +:10DD80000000010040000001000000004000000011 +:10DD900020BB16000000030000000100400000014D +:10DDA000000000004000000020BA1700000003003F +:10DDB00000000100800000010000000041000000A0 +:10DDC00020BB1700000003000000010080000001DC +:10DDD000000000004100000020BB1800000003000C +:10DDE00000000100000100010000000041000000EF +:10DDF00020BA18000000030000000100000100012B +:10DE0000000000004100000020BA19104400060084 +:10DE1000000001000002000100000000E108000015 +:10DE200020BA1900000003000000010000020001F8 +:10DE300000000000E100000020BB191044000600B3 +:10DE4000000001000002000100000000C108000005 +:10DE500020BB1900000003000000010000020001C7 +:10DE600000000000C100000020BB180000000300FB +:10DE7000000001000001000100000000C1000000DE +:10DE800020BB201044000600000001000004000137 +:10DE900000000000E108000020BB2000000003009B +:10DEA000000001000004000100000000C1000000AB +:10DEB00020BA201044000600000001000004000108 +:10DEC00000000000C108000020BA2000000003008C +:10DED000000001000004000100000000C10000007B +:10DEE00020BA21000000030000000100000800012A +:10DEF00000000000C110000020BB21000000030052 +:10DF0000000001000008000100000000C110000036 +:10DF100021BA2000000003000000010000080001F9 +:10DF200000000000C110000020BB211044000600CA +:10DF3000000001000008000100000000C1180000FE +:10DF400020BB2200000003000000010000100001BF +:10DF500000000000C110000020BA220000000300F1 +:10DF6000000001000010000100000000C1180000C6 +:10DF70002C5B1B10410006000000020000040001A1 +:10DF800000000000800801002C5B1C000000030062 +:10DF900000000200000800010000000080080100ED +:10DFA0000102154D000005000000010040000001C5 +:10DFB00000000000600000000102164D0000050096 +:10DFC000000001008000000100000000600000006F +:10DFD0000102194D0000050000000400800000014E +:10DFE00000000000604000000102194D0100050022 +:10DFF000000001000002000100000000604000007D +:10E000000102204D00800600000004000001000114 +:10E0100000000000604000000102204D0081060069 +:10E02000000004000001000100000000604000004A +:10E030000102204D00000500000004000001000165 +:10E0400000000000604000000102204D01000500BA +:10E05000000001000004000100000000604000001A +:10E060000102204F00000500000004000001000133 +:10E0700000000000604000000102214D000005008A +:10E080000000040000020001000000006000000029 +:10E0900001201803000005000000040040000001FA +:10E0A000000000000000000001201803010005002E +:10E0B000000001000001000100000000000000005D +:10E0C0000120184D01800600000001000001000140 +:10E0D00000000000604000000120184D0000050015 +:10E0E000000004004000000100000000604000004B +:10E0F0000120184D01000500000001000001000191 +:10E100000000000060400000010213000000030056 +:10E1100000000100100000010000000000000000ED +:10E1200001021400000003000000010020000001B3 +:10E1300000000000000000000102150000000300C4 +:10E14000000001004000000100000000000000008D +:10E150000102160000000300000001008000000121 +:10E160000000000000000000014015000000030056 +:10E17000000001002000000100000000610000001C +:10E1800001401700000003000000010080000001B2 +:10E190000000000001000000014014000000030026 +:10E1A000000001001000000100000000210000003C +:10E1B0000160170000000300000001008000000162 +:10E1C000000000006108000001601800000003006A +:10E1D00000000100000100010000000061080000D3 +:10E1E00001601900000003000000010000020001AE +:10E1F0000000000061080000342A1A0F0390060096 +:10E200000000040000010001000000006048000060 +:10E21000342A1B0F039006000000040000020001D6 +:10E220000000000060480000342A1C0F0090060027 +:10E23000000004000004000100000000600800006D +:10E24000342B1A0F039006000000040000010001A7 +:10E250000000000060480000342B1B0F03900600F4 +:10E2600000000400000200010000000060480000FF +:10E27000342B1C0F00900600000004000004000175 +:10E280000000000060080000342B190F0890060001 +:10E290000000020000010001000000004008000032 +:10E2A0002020110000000300008000000400000195 +:10E2B0000000000000000000202012000000030009 +:10E2C0000000010004000001000000000000000048 +:10E2D00020201300000003000000010008000001DE +:10E2E00000000000000000002020140000000300D7 +:10E2F000000001001000000100000000000000000C +:10E300002020150000000300000001002000000193 +:10E3100000000000000000002020160000000300A4 +:10E3200000000100400000010000000000000000AB +:10E330002020170000000300000001008000000101 +:10E340000000000000000000202018000000030072 +:10E350000000040040000001000000000000000078 +:10E3600020801500000003000000010020000001D3 +:10E3700000000000010000002071150000000300F3 +:10E38000000001002000000100000000610000000A +:10E390002071170000000300000001008000000150 +:10E3A0000000000000000000EF2014000000030047 +:10E3B000000001001000000100000000000000004B +:10E3C000EF20150000000300000001002000000104 +:10E3D0000000000000000000EF2016000000030015 +:10E3E00000000100400000010000000000000000EB +:10E3F000EF301000000003000000010001000001E8 +:10E400000000000001000000EF30130000000300D6 +:10E4100000000100080000010000000001000000F1 +:10E42000EF30150000000300000001002000000193 +:10E430000000000001000000EF6015000000030074 +:10E440000000010020000001000000006103000046 +:10E45000EF30160000000300000001004000000142 +:10E460000000000001000000EF4012000000030067 +:10E470000000010004000001000000000100000095 +:10E48000EF50120000000300000001000400000132 +:10E490000000000001000000EF6012000000030017 +:10E4A0000000010004000001000000000100000065 +:10E4B000EF401600000003000000010040000001D2 +:10E4C0000000000061000000EF6015000000030084 +:10E4D00000000100200000010000000061000000B9 +:10E4E000EF60160000000300000001004000000182 +:10E4F0000000000061030000EF7015000000030041 +:10E500000000010020000001000000006100000088 +:10E51000EF70160000000300000001004000000141 +:10E520000000000061030000EF80160000000300FF +:10E530000000010040000001000000006103000035 +:10E54000EF8019000000030000000100000200013C +:10E550000000000061030000EF301700000003001E +:10E560000000010080000001000000000100000028 +:10E57000EF601700000003000000010080000001B0 +:10E580000000000061030000EF70170000000300AE +:10E590000000010080000001000000006103000095 +:10E5A000EF601800000003000000010000010001FE +:10E5B0000000000061030000EF701800000003007D +:10E5C00000000100000100010000000061030000E4 +:10E5D000EF801800000003000000010000010001AE +:10E5E0000000000061030000EF601900000003005C +:10E5F00000000100000200010000000061030000B3 +:10E60000EF7019000000030000000100000200018B +:10E610000000000061030000EF711900000003001A +:10E620000000010000020001000000006103000082 +:10E63000EF60200000000300000001000004000162 +:10E640000000000061030000EF80200000000300D4 +:10E650000000010000040001000000006103000050 +:10E66000EF40200000000300000001000004000152 +:10E670000000000061030000EF40210000000300E3 +:10E68000000001000008000100000000610300001C +:10E69000EF702100000003000000010000080001ED +:10E6A0000000000061030000EF7022000000030082 +:10E6B00000000100001000010000000061030000E4 +:10E6C000EF501400000003000000010010000001E2 +:10E6D0000000000001000000EF40140000000300F3 +:10E6E00000000100100000010000000061000000B7 +:10E6F000EF401500000003000000010020000001B1 +:10E700000000000061000000EF4016000000030060 +:10E710000000010040000001000000006100000056 +:10E72000EF4017000000030000000100800000011E +:10E730000000000061000000EF401800000003002E +:10E740000000010000010001000000006103000062 +:10E75000EF4019000000030000000100000200016A +:10E760000000000061000000EF61190000000300DC +:10E770000000010000040001000000006100000032 +:10E78000EF71190000000300000001000004000107 +:10E790000000000061000000EF9022000000030074 +:10E7A00000000100001000010000000061000000F6 +:10E7B0000000000000000000000000000000000059 +:10E7C000000000000000000028732AC11FF8D211C9 +:10E7D000BA4B00A0C93EC93B14004201D0FFD0FF94 +:10E7E000D0FFD0FF4701D0FFD0FFD0FFD0FF1601F0 +:10E7F00000006700D0FFD0FF4E00D0FF4801D0FFDF +:10E80000D0FF3F01000000000100F4FD0200F4FD14 +:10E81000F4FDF4FD03000000211042206330844029 +:10E82000A550C660E770088129914AA16BB18CC1DF +:10E83000ADD1CEE1EFF13112100273325222B55256 +:10E840009442F772D662399318837BB35AA3BDD32F +:10E850009CC3FFF3DEE36224433420040114E66426 +:10E86000C774A44485546AA54BB528850995EEE57F +:10E87000CFF5ACC58DD55336722611163006D77636 +:10E88000F6669556B4465BB77AA719973887DFF7CF +:10E89000FEE79DD7BCC7C448E5588668A7784008FE +:10E8A000611802282338CCC9EDD98EE9AFF948891F +:10E8B00069990AA92BB9F55AD44AB77A966A711A96 +:10E8C000500A333A122AFDDBDCCBBFFB9EEB799B6F +:10E8D000588B3BBB1AABA66C877CE44CC55C222CE6 +:10E8E000033C600C411CAEED8FFDECCDCDDD2AADBF +:10E8F0000BBD688D499D977EB66ED55EF44E133E76 +:10E90000322E511E700E9FFFBEEFDDDFFCCF1BBF0E +:10E910003AAF599F788F8891A981CAB1EBA10CD1E8 +:10E920002DC14EF16FE18010A100C230E3200450F0 +:10E93000254046706760B9839893FBA3DAB33DC363 +:10E940001CD37FE35EF3B1029012F322D232354240 +:10E95000145277625672EAB5CBA5A89589856EF5F3 +:10E960004FE52CD50DC5E234C324A0148104667490 +:10E97000476424540544DBA7FAB79987B8975FE743 +:10E980007EF71DC73CD7D326F2369106B0165766E0 +:10E990007676154634564CD96DC90EF92FE9C899CB +:10E9A000E9898AB9ABA94458654806782768C01830 +:10E9B000E1088238A3287DCB5CDB3FEB1EFBF98BA3 +:10E9C000D89BBBAB9ABB754A545A376A167AF10A80 +:10E9D000D01AB32A923A2EFD0FED6CDD4DCDAABDB3 +:10E9E0008BADE89DC98D267C076C645C454CA23CD0 +:10E9F000832CE01CC10C1FEF3EFF5DCF7CDF9BAF83 +:10EA0000BABFD98FF89F176E367E554E745E932E1F +:10EA1000B23ED10EF01E00010203040506070809EC +:10EA20000A0B0C0D0E0F030201000504070608096E +:10EA30000A0B0C0D0E0F030B1B6664745F6669787E +:10EA400075705F6D656D6F72795F62616E6B73007B +:10EA500073706C5F6E6F64655F746F5F626F6F740D +:10EA60005F6465766963650073706C5F7265676982 +:10EA7000737465725F6661745F646576696365006F +:10EA80006669745F66696E645F636F6E6669675F0F +:10EA90006E6F646500736F63667067615F73656353 +:10EAA0007265675F70726F626500736F636670672F +:10EAB000615F64747265675F70726F626500626F38 +:10EAC0006172645F626F6F745F6F72646572006C15 +:10EAD0006F61645F73696D706C655F666974007304 +:10EAE000706C5F6C6F61645F696D6167655F6661C3 +:10EAF00074006164645F6D74645F64657669636506 +:10EB00000073706C5F6C6F61645F73696D706C65CE +:10EB10005F666974006664745F7265636F72645FD8 +:10EB20006C6F616461626C65006664745F66696ED7 +:10EB3000645F6F725F6164645F7375626E6F64655A +:10EB400000647269766572732F6D74642F6D7464DE +:10EB5000636F72652E6300425547206174202573F0 +:10EB60003A25642F25732829210A004255472100A0 +:10EB70000808080808080808082828282828080875 +:10EB80000808080808080808080808080808080805 +:10EB9000A0101010101010101010101010101010E5 +:10EBA00004040404040404040404101010101010DD +:10EBB00010414141414141010101010101010101B6 +:10EBC00001010101010101010101011010101010EA +:10EBD0001042424242424202020202020202020287 +:10EBE00002020202020202020202021010101008C7 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC1000A010101010101010101010101010101064 +:10EC200010101010101010101010101010101010E4 +:10EC300001010101010101010101010101010101C4 +:10EC400001010101010101100101010101010102A4 +:10EC50000202020202020202020202020202020294 +:10EC60000202020202020210020202020202020276 +:10EC700025733A20756E6C6F636B206661696C65F5 +:10EC8000642C20777269746573206D6179206E6FD2 +:10EC90007420776F726B0A00616C6C6F6320737005 +:10ECA000616365206578686175737465640A002521 +:10ECB000732025733A2043616E27742067657420A2 +:10ECC00072657365743A2025640A00534452414DBD +:10ECD00020696E6974206661696C65642E0A00257E +:10ECE000732E25730025733A25640025733A202F6F +:10ECF00063686F73656E206E6F7420666F756E64E7 +:10ED00002C207573696E672064656661756C740A82 +:10ED10000025733A206C696D697420256420746F36 +:10ED20002073706C5F626F6F745F6C6973742065C1 +:10ED3000786365656465640A006465766963655F28 +:10ED4000747970650025733A20756E6B6E6F776EFF +:10ED5000206465766963655F747970652025730A40 +:10ED600000752D626F6F742C73706C2D626F6F74F1 +:10ED70002D6F726465720025733A2073706C2D627A +:10ED80006F6F742D6F7264657220696E76616C6945 +:10ED9000642C207573696E672064656661756C7498 +:10EDA0000A0025733A206E6F2076616C69642065D5 +:10EDB0006C656D656E742073706C2D626F6F742D51 +:10EDC0006F72646572206C6973740A00626F61729D +:10EDD000645F2575004669726577616C6C2026203A +:10EDE0007365637572652073657474696E677320EB +:10EDF000696E6974206661696C65643A2025640AED +:10EE000000547279696E6720746F20626F6F74208E +:10EE100066726F6D2025730A0053504C3A20556E70 +:10EE2000737570706F7274656420426F6F742044E4 +:10EE30006576696365210A0053504C3A2066616922 +:10EE40006C656420746F20626F6F742066726F6DE2 +:10EE500020616C6C20626F6F7420646576696365F5 +:10EE6000730A00436F756C64206E6F74206765745D +:10EE70002046495420627566666572206F662025BB +:10EE80006C752062797465730A0009636865636B49 +:10EE900020434F4E4649475F53504C5F5359535F91 +:10EEA0004D414C4C4F435F53495A450A0051535012 +:10EEB000493A20666C61736820636F6D6D616E64A2 +:10EEC00020657865637574696F6E2074696D656F10 +:10EED00075740A00496E646972656374207772699B +:10EEE00074652074696D6564206F757420282569C8 +:10EEF000290A00496E6469726563742072656164F1 +:10EF000020636C65617220636F6D706C6574696FEE +:10EF10006E206572726F7220282569290A00496E79 +:10EF2000646972656374207265616420636F6D70DB +:10EF30006C6574696F6E206572726F722028256926 +:10EF4000290A00496E646972656374207772697476 +:10EF50006520636C65617220636F6D706C657469A8 +:10EF60006F6E206572726F7220282569290A004928 +:10EF70006E64697265637420777269746520636F6B +:10EF80006D706C6574696F6E206572726F72202887 +:10EF90002569290A00515350493A205153504920BC +:10EFA0006973207374696C6C206275737920616673 +:10EFB00074657220706F6C6C20666F7220256420FF +:10EFC0006D732E0A0063646E732C69732D64656320 +:10EFD0006F6465642D63730063646E732C66696689 +:10EFE0006F2D64657074680063646E732C66696667 +:10EFF0006F2D77696474680063646E732C74726932 +:10F00000676765722D616464726573730063646E13 +:10F01000732C69732D646D61004572726F723A20B2 +:10F020007375626E6F646520776974682053504908 +:10F0300020666C61736820636F6E666967206D6916 +:10F040007373696E67210A00706167652D73697A51 +:10F050006500626C6F636B2D73697A650063646E23 +:10F06000732C747368736C2D6E730063646E732CF1 +:10F0700074736432642D6E730063646E732C7463F6 +:10F080006873682D6E730063646E732C74736C63A5 +:10F09000682D6E730063646E732C726561642D64F9 +:10F0A000656C61790053463A2043616C6962726114 +:10F0B00074696F6E206661696C6564202872656191 +:10F0C00064290A0053463A2043616C696272617494 +:10F0D000696F6E206661696C656420286C6F7720AB +:10F0E00072616E6765290A00636C6F636B2D6469DA +:10F0F0007600636C6F636B2D6D756C7400636C6F61 +:10F10000636B2D6672657175656E63790023636C40 +:10F110006F636B2D63656C6C730061737369676EED +:10F1200065642D636C6F636B2D706172656E7473B3 +:10F130000061737369676E65642D636C6F636B73D5 +:10F140000061737369676E65642D636C6F636B2D0B +:10F150007261746573004D505520202020202020BE +:10F1600025313064206B487A0A004C34204D6169A7 +:10F170006E0920202020253864206B487A0A004C34 +:10F180003420737973206672656520253864206B9E +:10F19000487A0A004C34204D502020202020202086 +:10F1A000253864206B487A0A004C342053502020C4 +:10F1B0002020202020253864206B487A0A00534400 +:10F1C0004D4D4320202020202020253864206B48EE +:10F1D0007A0A00515350493A205265666572656E4D +:10F1E000636520636C6F636B206174202564206B02 +:10F1F000487A0A00496E73756666696369656E745C +:10F200002052414D20666F722070616765207461E5 +:10F21000626C653A203078256C78203E2030782565 +:10F220006C782E20506C6561736520696E63726521 +:10F23000617365207468652073697A6520696E2042 +:10F240006765745F706167655F7461626C655F7349 +:10F25000697A652829006379636C69632066756E35 +:10F260006374696F6E20257320746F6F6B20746FE9 +:10F270006F206C6F6E673A20256C6C647573207616 +:10F28000732025647573206D61780A0052656D6F77 +:10F2900076696E67204D5444206465766963652005 +:10F2A00023256420282573292077697468207573C5 +:10F2B0006520636F756E742025640A004572726F55 +:10F2C00072207768656E2064656C6574696E67206E +:10F2D000706172746974696F6E2022257322202810 +:10F2E0002564290A00303132333435363738394114 +:10F2F00042434445462F636C6F636B73002F66690E +:10F30000726D776172650025732025733A20464936 +:10F31000464F206F766572666C6F77206F6E205255 +:10F32000780A007370692D736C617665002573200F +:10F3300025733A204661696C656420746F206465AA +:10F340002D61737365727420726573657420666FC6 +:10F35000722053504920286572726F7220256429EB +:10F360000A00626974732D7065722D776F72640084 +:10F3700069676E6F72696E6720696E76616C696429 +:10F3800020626974732D7065722D776F7264202509 +:10F39000640A0025732025733A204E6F6E2062792F +:10F3A000746520616C69676E6564205350492074F0 +:10F3B00072616E736665722E0A004444523A20658B +:10F3C0006D69665F636C6561722829206661696C8E +:10F3D00065640A004444523A206661696C656420A1 +:10F3E000746F206765742061636B2066726F6D2097 +:10F3F000454D49460A002E2E004641542073656350 +:10F40000746F722073697A65206D69736D617463BE +:10F4100068202866733D25752C206465763D256C33 +:10F4200075290A0046415420636C75737465722017 +:10F4300073697A65206E6F74207365740A004641A3 +:10F440005420636C75737465722073697A652074D7 +:10F450006F6F20626967202863733D25752C206DCE +:10F4600061783D2575290A00496E76616C696420D2 +:10F4700046415420656E7472790A004572726F724B +:10F480002072656164696E6720636C757374657260 +:10F490000A00506172746974696F6E202564206976 +:10F4A0006E76616C6964206F6E2064657669636551 +:10F4B0002025640A0055AA00236164647265737391 +:10F4C0002D63656C6C730025733A2025733A2025F3 +:10F4D000730A0025733A206E756D2062616E6B733E +:10F4E00020256420657863656564732068617264B3 +:10F4F000636F646564206C696D69742025642E20D7 +:10F500005265636F6D70696C6520776974682068F7 +:10F510006967686572204D454D4F52595F42414EB3 +:10F520004B535F4D41583F0A005741524E494E4799 +:10F530003A20636F756C64206E6F7420736574205D +:10F5400025732025732E0A002F616C696173657322 +:10F55000006C696E75782C7068616E646C65006310 +:10F560006F6D70617469626C6500656E74727900AC +:10F570002373697A652D63656C6C73003C76616CEE +:10F580006964206F66667365742F6C656E67746856 +:10F590003E003C6E6F206572726F723E003C756E6D +:10F5A0006B6E6F776E206572726F723E002F7265A0 +:10F5B0007365727665642D6D656D6F727900726129 +:10F5C0006E6765730025734025782C2578002573B8 +:10F5D000402578006E6F2D6D6170006D61746368F9 +:10F5E0002D6D61736B006D617463682D76616C7550 +:10F5F00065006175746F2D73697A65007374617449 +:10F600007573006F6B6179004D697373696E672064 +:10F610004454420A002F6D656D6F7279004D4D4361 +:10F6200020446576696365202564206E6F742066CA +:10F630006F756E640A006861736865642D6E6F642F +:10F6400065730043616E2774206765742068617379 +:10F650006865642D6E6F6465732070726F7065727B +:10F660007479006861736865642D6E6F64657320DA +:10F6700070726F7065727479206D75737420626535 +:10F68000206E756C6C2D7465726D696E6174656445 +:10F69000004E756D626572206F66206861736865E3 +:10F6A00064206E6F6465732065786365656473209C +:10F6B0006D6178696D756D002F636F6E6669677532 +:10F6C000726174696F6E730053656C656374656411 +:10F6D00020636F6E666967206E6F7420696E2068A4 +:10F6E0006173686564206E6F646573004661696C60 +:10F6F000656420746F206861736820636F6E66694B +:10F700006775726174696F6E004E6F206461746119 +:10F7100020746F206861736800546F6F206D616E94 +:10F7200079206861736820726567696F6E7300681D +:10F7300061736865642D737472696E6773005665D2 +:10F7400072696669636174696F6E206661696C6570 +:10F750006400436F6E66696775726174696F6E20CD +:10F760006E6F6465202725732720636F6E7461694F +:10F770006E73202740270A0072657175697265648F +:10F780002D6D6F646500636F6E66004E6F2027738A +:10F7900069676E617475726527207375626E6F6438 +:10F7A0006520666F756E6400206572726F72210A43 +:10F7B000257320666F722027257327206861736880 +:10F7C000206E6F646520696E202725732720636F84 +:10F7D0006E666967206E6F64650A004661696C65D4 +:10F7E0006420746F207665726966792027616E796E +:10F7F00027206F662074686520726571756972656F +:10F8000064207369676E61747572652873290A00D4 +:10F8100064656661756C74006465736372697074A5 +:10F82000696F6E0025733A204D697373696E6720A6 +:10F83000464454206465736372697074696F6E2006 +:10F84000696E204454420A00556E737570706F7271 +:10F85000746564202573206164647265737320731A +:10F86000697A650A00646174612D6F6666736574F8 +:10F8700000646174612D706F736974696F6E0064E8 +:10F880006174612D73697A6500616C676F00706BDC +:10F8900063732D312E3500546F74616C2073697A57 +:10F8A0006520746F6F206C617267650070616464BD +:10F8B000696E67006B65792D6E616D652D68696E87 +:10F8C000740025733A257300556E6B6E6F776E204A +:10F8D0007369676E617475726520616C676F7269B8 +:10F8E00074686D004E6F6465206E616D6520636F96 +:10F8F0006E7461696E73204000726571756972651E +:10F9000064004661696C656420746F207665726975 +:10F910006679207265717569726564207369676EB6 +:10F92000617475726520272573270A00556E616220 +:10F930006C6520746F2076657269667920726571D6 +:10F940007569726564207369676E617475726500AC +:10F9500043616E2774206765742068617368206155 +:10F960006C676F2070726F70657274790075626F6A +:10F970006F742D69676E6F7265002D736B6970709F +:10F980006564200043616E27742067657420686198 +:10F9900073682076616C75652070726F7065727423 +:10F9A0007900556E737570706F727465642068614C +:10F9B000736820616C676F726974686D004261647E +:10F9C00020686173682076616C7565206C656E00D7 +:10F9D00042616420686173682076616C7565002BF4 +:10F9E00020002D2000436F72727570746564206F63 +:10F9F00072207472756E63617465642074726565DB +:10FA000000206572726F72210A257320666F722062 +:10FA1000272573272068617368206E6F64652069ED +:10FA20006E202725732720696D616765206E6F64DE +:10FA3000650A00496E76616C696420464154206510 +:10FA40006E7472793A2025233038780A00232323F4 +:10FA5000204552524F522023232320506C6561735E +:10FA6000652052455345542074686520626F617269 +:10FA700064202323230A00303132333435363738BB +:10FA800039616263646566005744543A2020204E11 +:10FA90006F74207374617274696E672025730A0035 +:10FAA0005744543A2020204661696C656420746F85 +:10FAB0002073746172742025730A00707265666524 +:10FAC0007463682D64617461007072656665746347 +:10FAD000682D696E7374720061726D2C7368617247 +:10FAE00065642D6F766572726964650061726D2C54 +:10FAF0007461672D6C6174656E63790061726D2C41 +:10FB0000646174612D6C6174656E63790043616E2C +:10FB10002774206C6F61642025733A204E6F206C2F +:10FB20006F6164206164647265737320616E642028 +:10FB30006E6F206275666665720A0025733A2053FF +:10FB40006B6970206C6F616420272573273A2069E8 +:10FB50006D6167652073697A652069732030210AB9 +:10FB60000043616E6E6F742067657420696D616714 +:10FB70006520646174612F73697A650A002323200C +:10FB8000436865636B696E67206861736828657395 +:10FB90002920666F7220496D616765202573202ECC +:10FBA0002E2E20004F4B0A006D6D635F626C6B0060 +:10FBB0004D4D433A20626C6F636B206E756D6265CC +:10FBC00072203078256C78206578636565647320D1 +:10FBD0006D6178283078256C78290A006D6D632076 +:10FBE0006661696C20746F2073656E642073746F36 +:10FBF0007020636D640A004361726420646964204C +:10FC00006E6F7420726573706F6E6420746F2076EF +:10FC10006F6C746167652073656C65637421203A4D +:10FC20002025640A00756E61626C6520746F207314 +:10FC3000656C6563742061206D6F64650A004E6FAA +:10FC4000206578745F63736420666F756E64210A43 +:10FC50000053656C6563742048533430302066610E +:10FC6000696C65642025640A0053656C65637420C3 +:10FC700048533430304553206661696C65642025F3 +:10FC8000640A00756E61626C6520746F2073656C28 +:10FC90006563742061206D6F6465203A2025640AD5 +:10FCA000004D616E202530367820536E722025304D +:10FCB0003478253034780025632563256325632552 +:10FCC0006325630025642E2564006D6D635F6C6F92 +:10FCD00061645F696D6167655F7261775F736563BA +:10FCE000746F723A206D6D6320626C6F636B20726B +:10FCF000656164206572726F720A004D4D433A204F +:10FD00006E6F20636172642070726573656E740A31 +:10FD100000000A0C0D0F14191E23282D32373C4603 +:10FD2000504343553A204469726563746F72792079 +:10FD3000696E697469616C697A6174696F6E206655 +:10FD400061696C6564210A007265672D6F66667370 +:10FD50006574007265672D73686966740072656703 +:10FD60002D696F2D7769647468002F636F6E666903 +:10FD700067002A2A204E657374656420444F53201F +:10FD8000706172746974696F6E7320646574656301 +:10FD90007465642C2073746F7070696E67202A2AF2 +:10FDA0000A002A2A2043616E27742072656164204C +:10FDB000706172746974696F6E207461626C652021 +:10FDC0006F6E2025643A256C75202A2A0A0062612C +:10FDD00064204D425220736563746F7220736967AB +:10FDE0006E61747572652030782530327825303236 +:10FDF000780A0057686F6C65204469736B0068640B +:10FE00000075736264006D6D63736400787800251B +:10FE10007325632564000A552D426F6F742053507B +:10FE20004C20323032342E30372D33363737332DA5 +:10FE30006730646164306130613437382D646972D1 +:10FE400074792028446563203034203230323520E4 +:10FE50002D2031373A31323A3439202B303130309D +:10FE6000290A005761726D20005B66726F6D205326 +:10FE7000444D5D2000436F6C640057617463686497 +:10FE80006F67004D5055005265736574207374613F +:10FE900074653A2025732573002854726967676575 +:10FEA000726564206279202573202564290A002365 +:10FEB00072657365742D63656C6C73007265736530 +:10FEC0007473006B65792D2573007273612C6E75E8 +:10FED0006D2D62697473007273612C6E302D696EC2 +:10FEE0007665727365007273612C6578706F6E65EC +:10FEF0006E74007273612C6D6F64756C7573007233 +:10FF000073612C722D737175617265640052534177 +:10FF10003A2043616E27742066696E64204D6F64D9 +:10FF2000756C61722045787020696D706C656D65C7 +:10FF30006E746174696F6E0A004444523A206164C1 +:10FF40006472657373203078256C6C782069732037 +:10FF50006E6F742063616368656C696E6520736998 +:10FF60007A6520616C69676E65642E0A00444452AC +:10FF70003A2073697A65203078256C6C7820697333 +:10FF8000206E6F74206D756C7469706C65206F667F +:10FF90002063616368656C696E652073697A650AC0 +:10FFA00000534452414D2D4543433A20496E6974F4 +:10FFB00069616C697A656420737563636573732026 +:10FFC00077697468202564206D730A004444523AAE +:10FFD000204661696C656420746F206465636F649A +:10FFE00065206D656D6F7279206E6F64650A0044DF +:10FFF00044523A205761726E696E673A204452410A +:02000004FFE219 +:100000004D2073697A652066726F6D20646576692C +:10001000636520747265652028256C6C64204D69C9 +:1000200042290A00206D69736D61746368207769E5 +:1000300074682068617264776172652028256C6C31 +:1000400064204D6942292E0A004444523A204572E8 +:10005000726F723A204452414D2073697A6520666E +:10006000726F6D20646576696365207472656520C2 +:10007000697320677265617465720A002074686133 +:100080006E2068617264776172652073697A652E8B +:100090000A004444523A20256C6C64204D69420A9F +:1000A000004444523A204572726F722061732053AB +:1000B0004452414D2063616C6962726174696F6E74 +:1000C000206661696C65640A004444523A204D65BB +:1000D0006D6F7279207465737420726571756972C1 +:1000E000657320534452414D2073697A652000693D +:1000F0006E20706F776572206F662074776F210AAB +:10010000004444523A20534452414D2073697A6569 +:1001100020636865636B206661696C6564210A0011 +:100120007374646F75742D7061746800636F6E739F +:100130006F6C65004E6F2073657269616C2064722C +:100140006976657220666F756E6400506167652020 +:100150007461626C6520706F696E746572206E6F79 +:10016000742073657475702E003021300906052BDC +:100170000E03021A050004148000000000000000B5 +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B00000000000000000003031300D06096086AC +:1001C000480165030402010500042044574D4D43D6 +:1001D0003A2043616E277420676574204649464F74 +:1001E0002064657074680A0064727673656C0073CD +:1001F0006D706C73656C006669666F2D6D6F6465FC +:100200000044574D4D433A204D4D4320636C6F637E +:100210006B206973207A65726F21004661696C20DA +:10022000746F2072656164204A544147205573659C +:1002300072636F64652E2044656661756C7420423C +:100240006F61726420494420746F20300A00426F4D +:10025000617264204944206973206E6F7420696E56 +:100260002072616E6765203020746F203235350A48 +:1002700000616C74722C7273742D6D677200616C06 +:1002800074722C7379732D6D677200696E74656C6E +:100290002C6167696C65782D636C6B6D67720061AA +:1002A0006C74722C6D6F647273742D6F66667365F7 +:1002B0007400696E74656C2C6F66667365742D735B +:1002C000657474696E67730025733A204F766572A2 +:1002D000666C6F77206173206F666673657420307B +:1002E00078256C6C78206F722072656700207772B9 +:1002F000697465206973206D6F7265207468616E22 +:1003000020626C6F636B2073697A65203078257882 +:100310000A004D61696C626F783A204973737569A0 +:100320006E67206D61696C626F7820636D64205226 +:1003300045424F4F545F4850530A002573202573A0 +:100340003A20496E76616C696420637320256420CD +:10035000286572723D2564290A007370695F666CB6 +:100360006173684025643A2564006A656465635F6B +:100370007370695F6E6F720053463A204661696C14 +:10038000656420746F2073657420757020736C61D0 +:1003900076650A00496E76616C6964206275732027 +:1003A000256420286572723D2564290A0025732082 +:1003B00025733A20496E76616C69642063686970C0 +:1003C0002073656C6563742025643A256420286574 +:1003D00072723D2564290A0003130B0C3B3CBBBC25 +:1003E0006B6CEBEC7370692D666C61736800257340 +:1003F0002025733A204D6163726F6E6978205175C4 +:10040000616420626974206E6F74207365740A00E1 +:10041000656E61626C696E672072657365742068D1 +:1004200061636B3B206D6179206E6F742072656330 +:100430006F7665722066726F6D20756E6578706577 +:1004400063746564207265626F6F74730A0025734C +:100450002025733A20666C617368206F7065726145 +:1004600074696F6E2074696D6564206F75740A001D +:1004700075646576696365202A2900284E554C4CC1 +:10048000007370692D6D61782D6672657175656E8A +:1004900063790025732025733A2043616E6E6F7473 +:1004A0002073657420737065656420286572723DE1 +:1004B0002564290A0025732025733A2043616E6E56 +:1004C0006F7420736574206D6F6465202865727287 +:1004D0003D2564290A007370692D63706F6C007389 +:1004E00070692D63706861007370692D63732D6886 +:1004F000696768007370692D33776972650073707E +:10050000692D68616C662D6475706C657800737018 +:10051000692D74782D6275732D7769647468007322 +:1005200070692D72782D6275732D77696474680017 +:100530002F63686F73656E00752D626F6F742C6228 +:100540006F6F7430006664740063616E6E6F742048 +:1005500066696E6420696D616765206E6F646520F1 +:10056000272573273A2025640A002F6669742D69B0 +:100570006D61676573006664745F726F6F743A20B3 +:1005800025730A0053504C3A206664745F73687296 +:10059000696E6B5F746F5F6D696E696D756D2065F7 +:1005A0007272202D2025640A0053504C3A2061724B +:1005B00063685F66697875705F66647420657272DF +:1005C000202D2025640A0025733A2066617420726C +:1005D0006567697374657220657272202D202564C9 +:1005E0000A0025733A206572726F72207265616429 +:1005F000696E6720696D6167652025732C206572BF +:1006000072202D2025640A00232320436865636B34 +:10061000696E6720686173682865732920666F7248 +:1006200020636F6E666967202573202E2E2E2000B2 +:100630002F696D61676573006C6F616461626C65E1 +:10064000730025733A2063616E2774206C6F6164B8 +:1006500020696D616765206C6F616461626C6573B0 +:1006600020696E6465782025642028726574203DB9 +:10067000202564290A006F7300617263680073703B +:100680006C3A20756E737570706F72746564206D4E +:100690006D6320626F6F74206465766963652E0AEE +:1006A0000073706C3A20636F756C64206E6F7420F9 +:1006B000696E697469616C697A65206D6D632E205D +:1006C0006572726F723A2025640A0073706C3A206A +:1006D000636F756C64206E6F742066696E64206D44 +:1006E0006D63206465766963652025642E206572DC +:1006F000726F723A2025640A0073706C3A206D6D37 +:100700006320696E6974206661696C65642077692D +:100710007468206572726F723A2025640A007370E3 +:100720006C3A206D6D6320706172746974696F6ECC +:1007300020737769746368206661696C65640A0078 +:1007400073706C3A20706172746974696F6E2065A1 +:1007500072726F720A0073706C3A206D6D633A208A +:1007600077726F6E6720626F6F74206D6F64650AB9 +:1007700000752D626F6F742E6974620053504920AA +:1007800070726F6265206661696C65642E0A00751F +:100790002D626F6F742C73706C2D7061796C6F614A +:1007A000642D6F6666736574005054452025702073 +:1007B00028256C6C7829206973206E6F7420612065 +:1007C000626C6F636B2E20536F6D65206472697667 +:1007D000657220636F64652077616E747320746F37 +:1007E000206D6F6469667920646361636865207356 +:1007F000657474696E677320666F7220616E207213 +:10080000616E6765206E6F7420636F7665726564D4 +:1008100020696E206D656D5F6D61702E004D4D43DA +:10082000325F32004D4D4332004D4D433100535045 +:10083000490052414D006172636869746563747563 +:10084000726500636F6D7072657373696F6E006FB0 +:100850007065726174696E672073797374656D0079 +:10086000696D616765207479706500627A697032BC +:1008700000677A6970006C7A6D61006C7A6F006C49 +:100880007A34007A737464006E6F6E6500616E79FD +:1008900000752D626F6F7400552D426F6F7420705C +:1008A000686173650053504C205068617365007532 +:1008B0006E636F6D7072657373656400627A6970E0 +:1008C0003220636F6D7072657373656400677A6957 +:1008D0007020636F6D70726573736564006C7A6D00 +:1008E0006120636F6D70726573736564006C7A6FFD +:1008F00020636F6D70726573736564006C7A342069 +:10090000636F6D70726573736564007A73746420CD +:10091000636F6D7072657373656400616973696D8F +:1009200061676500446176696E63692041495320BF +:10093000696D6167650066696C6573797374656D6F +:100940000046696C6573797374656D20496D6167E4 +:100950006500666C61745F647400466C6174204469 +:1009600065766963652054726565006770696D61BD +:100970006765005449204B657973746F6E65205329 +:10098000504C20496D616765006B65726E656C0047 +:100990004B65726E656C20496D616765006B6572B1 +:1009A0006E656C5F6E6F6C6F6164004B65726E6537 +:1009B0006C20496D61676520286E6F206C6F6164E3 +:1009C000696E6720646F6E6529006B7762696D617F +:1009D0006765004B69726B776F6F6420426F6F744D +:1009E00020496D61676500696D78696D61676500B3 +:1009F000467265657363616C6520692E4D582042AF +:100A00006F6F7420496D61676500696D7838696D35 +:100A1000616765004E585020692E4D583820426F4E +:100A20006F7420496D61676500696D78386D696D17 +:100A3000616765004E585020692E4D58384D204250 +:100A40006F6F7420496D61676500696E76616C69CE +:100A50006400496E76616C696420496D6167650068 +:100A60006D756C7469004D756C74692D46696C65A3 +:100A700020496D616765006F6D6170696D616765C3 +:100A8000005449204F4D41502053504C2057697419 +:100A9000682047502043480070626C696D6167654B +:100AA00000467265657363616C652050424C20425C +:100AB0006F6F7420496D6167650072616D64697361 +:100AC0006B0052414D4469736B20496D616765004D +:100AD0007363726970740053637269707400736F2A +:100AE0006366706761696D61676500416C7465720A +:100AF0006120536F43465047412043562F415620B3 +:100B00007072656C6F6164657200736F63667067A5 +:100B100061696D6167655F763100416C7465726112 +:100B200020536F4346504741204131302070726559 +:100B30006C6F61646572007374616E64616C6F6E7A +:100B400065005374616E64616C6F6E652050726FE6 +:100B50006772616D0075626C696D61676500446103 +:100B600076696E63692055424C20696D6167650046 +:100B70006D7873696D616765004672656573636161 +:100B80006C65204D585320426F6F7420496D61672A +:100B9000650061746D656C696D6167650041544DF8 +:100BA000454C20524F4D2D426F6F7420496D616747 +:100BB00065007838365F7365747570007838362054 +:100BC00073657475702E62696E006C706333327871 +:100BD00078696D616765004C504333325858204244 +:100BE0006F6F7420496D61676500726B696D616735 +:100BF0006500526F636B6368697020426F6F742089 +:100C0000496D61676500726B736400526F636B635B +:100C100068697020534420426F6F7420496D61678A +:100C20006500726B73706900526F636B6368697003 +:100C30002053504920426F6F7420496D61676500F1 +:100C4000767962726964696D61676500567962726E +:100C5000696420426F6F7420496D616765007A791D +:100C60006E71696D6167650058696C696E78205AAC +:100C7000796E7120426F6F7420496D616765007AEB +:100C8000796E716D70696D6167650058696C696E28 +:100C900078205A796E714D5020426F6F7420496DE3 +:100CA000616765007A796E716D7062696600586976 +:100CB0006C696E78205A796E714D5020426F6F7456 +:100CC00020496D6167652028626966290066706742 +:100CD00061004650474120496D6167650074656554 +:100CE0000054727573746564204578656375746922 +:100CF0006F6E20456E7669726F6E6D656E742049F9 +:100D00006D616765006669726D776172655F6976AE +:100D100074004669726D7761726520776974682026 +:100D200048414276342049565400706D6D6300543A +:100D30004920506F776572204D616E6167656D6502 +:100D40006E74204D6963726F2D436F6E74726F6C99 +:100D50006C6572204669726D776172650073746D9F +:100D60003332696D6167650053544D6963726F6515 +:100D70006C656374726F6E6963732053544D3332C4 +:100D800020496D616765006D746B5F696D616765B2 +:100D9000004D6564696154656B20426F6F74524FFA +:100DA0004D206C6F616461626C6520496D6167659F +:100DB00000636F70726F00436F70726F636573735F +:100DC0006F7220496D6167650073756E78695F6544 +:100DD000676F6E00416C6C77696E6E657220654757 +:100DE0004F4E20426F6F7420496D616765007375C7 +:100DF0006E78695F746F633000416C6C77696E6EFA +:100E0000657220544F433020426F6F7420496D61EA +:100E10006765006664745F6C6567616379006C6523 +:100E20006761637920496D6167652077697468201F +:100E3000466C61742044657669636520547265650B +:100E4000200073706B67696D6167650052656E6540 +:100E50007361732053504B4720496D616765007380 +:100E60006673706C005374617246697665205350E6 +:100E70004C20496D61676500496E76616C6964203C +:100E80004F530061726D2D747275737465642D66B5 +:100E900069726D776172650041524D2054727573AD +:100EA000746564204669726D77617265006C696E65 +:100EB0007578004C696E7578006E657462736400B5 +:100EC0004E6574425344006F736500456E65612042 +:100ED0004F534500706C616E3900506C616E203963 +:100EE000007274656D73005254454D530054727511 +:100EF0007374656420457865637574696F6E204509 +:100F00006E7669726F6E6D656E7400552D426F6FEF +:100F100074007678776F726B73005678576F726BC8 +:100F20007300716E7800514E58006F70656E736279 +:100F30006900524953432D56204F70656E53424904 +:100F40000065666900454649204669726D776172A1 +:100F50006500496E76616C696420415243480061C6 +:100F60006C70686100416C7068610061726D004175 +:100F7000524D00496E74656C2078383600696136D0 +:100F8000340049413634006D36386B004D36384BED +:100F9000006D6963726F626C617A65004D6963729E +:100FA0006F426C617A65006D697073004D495053F2 +:100FB000006D6970733634004D495053203634202B +:100FC000426974006E696F7332004E494F53204975 +:100FD0004900706F776572706300506F776572506B +:100FE000430070706300733339300049424D205321 +:100FF00033393000537570657248007370617263E5 +:101000000053504152430073706172633634005391 +:10101000504152432036342042697400626C61634F +:101020006B66696E00426C61636B66696E00617627 +:10103000723332004156523332006E6473333200E1 +:101040004E44533332006F72316B004F70656E52F5 +:1010500049534320313030300073616E64626F78E1 +:101060000053616E64626F780061726D36340041C6 +:1010700041726368363400414D44207838365F361B +:1010800034007874656E7361005874656E73610026 +:10109000726973637600524953432D560073686139 +:1010A00031007368613235360063726331362D6307 +:1010B0006369747400637263333200727361343035 +:1010C00039360072736133303732007273613230F7 +:1010D0003438004644545F4552525F4E4F54464F99 +:1010E000554E44004644545F4552525F455849535B +:1010F0005453004644545F4552525F4E4F53504143 +:101100004345004644545F4552525F4241444F4676 +:1011100046534554004644545F4552525F42414451 +:1011200050415448004644545F4552525F42414446 +:101130005048414E444C45004644545F4552525F2E +:101140004241445354415445004644545F45525231 +:101150005F5452554E4341544544004644545F4504 +:1011600052525F4241444D41474943004644545F17 +:101170004552525F42414456455253494F4E0046F4 +:1011800044545F4552525F42414453545255435474 +:10119000555245004644545F4552525F4241444CCB +:1011A00041594F5554004644545F4552525F494E91 +:1011B0005445524E414C004644545F4552525F42A2 +:1011C00041444E43454C4C53004644545F455252B3 +:1011D0005F42414456414C5545004644545F455298 +:1011E000525F4241444F5645524C41590046445487 +:1011F0005F4552525F4E4F5048414E444C4553005C +:101200004644545F4552525F424144464C41475325 +:1012100000626C6B5F706172746974696F6E004418 +:101220004F5300454649007363736900757362004C +:101230007361746100686F7374006E766D65006E23 +:10124000766D786970006566696C6F6164657200BF +:1012500076697274696F007076626C6F636B00629E +:101260006C6B6D617000726B6D746400706C333107 +:10127000305F63616368650061726D2C706C33313F +:10128000302D6361636865006E636F72655F6363D1 +:101290007500617274657269732C6E636F72652D6F +:1012A00063637500636C6B0066697865645F726187 +:1012B00074655F7261775F636C6F636B00666978FA +:1012C00065645F636C6F636B0066697865642D634A +:1012D0006C6F636B0066697865645F666163746FE9 +:1012E000725F636C6F636B0066697865642D66611D +:1012F00063746F722D636C6F636B00636C6B2D6135 +:1013000067696C657800726F6F7400726F6F745FDD +:10131000647269766572006E6F700073696D706CCF +:10132000655F6275730073696D706C652D627573AE +:101330000073696D706C652D6D6664006D69736313 +:1013400000696E74656C2C736F63667067612D73D2 +:10135000656372656700696E74656C2C736F636694 +:101360007067612D647472656700736F6366706780 +:10137000615F737973726573657400736F63667010 +:1013800067615F64776D6D6300616C74722C736F5D +:1013900063667067612D64772D6D73686300737089 +:1013A000695F666C617368006A656465632C73705D +:1013B000692D6E6F72006E7331363535305F73652F +:1013C0007269616C006E733136353530006E733181 +:1013D000363535306100696E67656E69632C6A7AEF +:1013E000343738302D75617274006E7669646961C6 +:1013F0002C746567726132302D7561727400736E82 +:1014000070732C64772D6170622D75617274007336 +:1014100070695F67656E657269635F647276007399 +:1014200070695F67656E6572696300636164656EAC +:1014300063655F7370690063646E732C71737069A8 +:101440002D6E6F720074692C616D3635342D6F739B +:1014500070690064775F73706900736E70732C64D9 +:10146000772D6170622D73736900736E70732C64D5 +:10147000772D6170622D7373692D332E32306100C8 +:10148000736E70732C64772D6170622D7373692D88 +:10149000332E32326100736E70732C64772D61705D +:1014A000622D7373692D332E32336100736E707346 +:1014B0002C64772D6170622D7373692D342E30305A +:1014C0006100736E70732C64772D6170622D73737D +:1014D000692D342E303100736E70732C6477632D58 +:1014E0007373692D312E30316100616C74722C730D +:1014F0006F63667067612D73706900616C74722C24 +:10150000736F63667067612D617272696131302D2E +:101510007370690063616E61616E2C6B3231302DC6 +:101520007370690063616E61616E2C6B3231302DB6 +:1015300073736900696E74656C2C7374726174697D +:101540007831302D73706900696E74656C2C616739 +:10155000696C65782D737069006D7363632C6F63BC +:10156000656C6F742D737069006D7363632C6A61B1 +:1015700067756172322D73706900736E70732C61C0 +:1015800078733130782D73706900736E70732C68C6 +:1015900073646B2D737069007273615F6D6F645F4C +:1015A000657870006D6F645F6578705F7377006158 +:1015B0006C74725F7364725F63746C00616C7472DC +:1015C0002C7364722D63746C2D73313000696E74EA +:1015D000656C2C7364722D63746C2D6167696C6526 +:1015E0007800696E74656C2C7364722D63746C2D55 +:1015F0006E357800696E74656C2C7364722D63743B +:101600006C2D6167696C65783500696E74656C2C4A +:101610007364722D63746C2D6167696C6578376DC6 +:1016200000736F63667067612D7265736574006423 +:10163000657369676E776172655F77647400736E56 +:1016400070732C64772D77647400776174636864B9 +:101650006F67003C4E554C4C3E004641540046419D +:101660005433320025303258002530327800746906 +:101670006D656F75742D7365630068775F6D61725A +:1016800067696E5F6D7300752D626F6F742C6E6F7E +:101690006175746F737461727400752D626F6F740D +:1016A0002C6175746F7374617274006379636C6913 +:1016B000635F726567697374657220666F72202557 +:1016C00073206661696C65640A00657665727920CD +:1016D000256C646D73005744543A20202053746184 +:1016E000727465642025732077697468257320738C +:1016F0006572766963696E67202573202825647397 +:101700002074696D656F7574290A0000000000007F +:1017100000000000000000000000000000000000C9 +:1017200000000000000000003017E2FF0000000091 +:1017300000000000000000000000000000000000A9 +:101740000000008000000000100300000000000006 +:101750000000008000000000000000800000000089 +:1017600000000060000000000000000000006000B9 +:10177000000000F700000000000000F7000000007B +:101780000000E00800000000000000000000600011 +:101790000000E0FF000000000000E0FF000000008B +:1017A0000000100000000000100300000000000016 +:1017B0000000FCFF000000000000FCFF0000000033 +:1017C0000080000000000000000000000000600039 +:1017D0000000000001000000000000000100000007 +:1017E000000000001F0000001003000000000000C7 +:1017F00000000000200000000000000020000000A9 +:101800000000000001000000000000000000600077 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C00000000000000000009D10E2FF000000008A +:1018D000140000000F0000006901E2FF000000009A +:1018E000FC74E0FF00000000A210E2FF0000000016 +:1018F0002000000013000000B801E2FF000000001B +:10190000FC74E0FF00000000000000000000000088 +:1019100000000000000000000819E2FF00000000C5 +:101920000819E2FF000000001819E2FF00000000A3 +:101930001819E2FF000000002819E2FF0000000073 +:101940002819E2FF000000003819E2FF0000000043 +:101950003819E2FF000000004819E2FF0000000013 +:101960004819E2FF000000005819E2FF00000000E3 +:101970005819E2FF000000006819E2FF00000000B3 +:101980006819E2FF000000007819E2FF0000000083 +:101990007819E2FF000000008819E2FF0000000053 +:1019A0008819E2FF000000009819E2FF0000000023 +:1019B0009819E2FF00000000A819E2FF00000000F3 +:1019C000A819E2FF00000000B819E2FF00000000C3 +:1019D000B819E2FF00000000C819E2FF0000000093 +:1019E000C819E2FF00000000D819E2FF0000000063 +:1019F000D819E2FF00000000E819E2FF0000000033 +:101A0000E819E2FF00000000F819E2FF0000000002 +:101A1000F819E2FF00000000081AE2FF00000000D1 +:101A2000081AE2FF00000000181AE2FF00000000A0 +:101A3000181AE2FF00000000281AE2FF0000000070 +:101A4000281AE2FF00000000381AE2FF0000000040 +:101A5000381AE2FF00000000481AE2FF0000000010 +:101A6000481AE2FF00000000581AE2FF00000000E0 +:101A7000581AE2FF00000000681AE2FF00000000B0 +:101A8000681AE2FF00000000781AE2FF0000000080 +:101A9000781AE2FF00000000881AE2FF0000000050 +:101AA000881AE2FF00000000981AE2FF0000000020 +:101AB000981AE2FF00000000A81AE2FF00000000F0 +:101AC000A81AE2FF00000000B81AE2FF00000000C0 +:101AD000B81AE2FF00000000C81AE2FF0000000090 +:101AE000C81AE2FF00000000D81AE2FF0000000060 +:101AF000D81AE2FF00000000E81AE2FF0000000030 +:101B0000E81AE2FF00000000F81AE2FF00000000FF +:101B1000F81AE2FF00000000081BE2FF00000000CE +:101B2000081BE2FF00000000181BE2FF000000009D +:101B3000181BE2FF00000000281BE2FF000000006D +:101B4000281BE2FF00000000381BE2FF000000003D +:101B5000381BE2FF00000000481BE2FF000000000D +:101B6000481BE2FF00000000581BE2FF00000000DD +:101B7000581BE2FF00000000681BE2FF00000000AD +:101B8000681BE2FF00000000781BE2FF000000007D +:101B9000781BE2FF00000000881BE2FF000000004D +:101BA000881BE2FF00000000981BE2FF000000001D +:101BB000981BE2FF00000000A81BE2FF00000000ED +:101BC000A81BE2FF00000000B81BE2FF00000000BD +:101BD000B81BE2FF00000000C81BE2FF000000008D +:101BE000C81BE2FF00000000D81BE2FF000000005D +:101BF000D81BE2FF00000000E81BE2FF000000002D +:101C0000E81BE2FF00000000F81BE2FF00000000FC +:101C1000F81BE2FF00000000081CE2FF00000000CB +:101C2000081CE2FF00000000181CE2FF000000009A +:101C3000181CE2FF00000000281CE2FF000000006A +:101C4000281CE2FF00000000381CE2FF000000003A +:101C5000381CE2FF00000000481CE2FF000000000A +:101C6000481CE2FF00000000581CE2FF00000000DA +:101C7000581CE2FF00000000681CE2FF00000000AA +:101C8000681CE2FF00000000781CE2FF000000007A +:101C9000781CE2FF00000000881CE2FF000000004A +:101CA000881CE2FF00000000981CE2FF000000001A +:101CB000981CE2FF00000000A81CE2FF00000000EA +:101CC000A81CE2FF00000000B81CE2FF00000000BA +:101CD000B81CE2FF00000000C81CE2FF000000008A +:101CE000C81CE2FF00000000D81CE2FF000000005A +:101CF000D81CE2FF00000000E81CE2FF000000002A +:101D0000E81CE2FF00000000F81CE2FF00000000F9 +:101D1000F81CE2FF00000000081DE2FF00000000C8 +:101D2000081DE2FF00000000181DE2FF0000000097 +:101D3000181DE2FF00000000281DE2FF0000000067 +:101D4000281DE2FF00000000381DE2FF0000000037 +:101D5000381DE2FF00000000481DE2FF0000000007 +:101D6000481DE2FF00000000581DE2FF00000000D7 +:101D7000581DE2FF00000000681DE2FF00000000A7 +:101D8000681DE2FF00000000781DE2FF0000000077 +:101D9000781DE2FF00000000881DE2FF0000000047 +:101DA000881DE2FF00000000981DE2FF0000000017 +:101DB000981DE2FF00000000A81DE2FF00000000E7 +:101DC000A81DE2FF00000000B81DE2FF00000000B7 +:101DD000B81DE2FF00000000C81DE2FF0000000087 +:101DE000C81DE2FF00000000D81DE2FF0000000057 +:101DF000D81DE2FF00000000E81DE2FF0000000027 +:101E0000E81DE2FF00000000F81DE2FF00000000F6 +:101E1000F81DE2FF00000000081EE2FF00000000C5 +:101E2000081EE2FF00000000181EE2FF0000000094 +:101E3000181EE2FF00000000281EE2FF0000000064 +:101E4000281EE2FF00000000381EE2FF0000000034 +:101E5000381EE2FF00000000481EE2FF0000000004 +:101E6000481EE2FF00000000581EE2FF00000000D4 +:101E7000581EE2FF00000000681EE2FF00000000A4 +:101E8000681EE2FF00000000781EE2FF0000000074 +:101E9000781EE2FF00000000881EE2FF0000000044 +:101EA000881EE2FF00000000981EE2FF0000000014 +:101EB000981EE2FF00000000A81EE2FF00000000E4 +:101EC000A81EE2FF00000000B81EE2FF00000000B4 +:101ED000B81EE2FF00000000C81EE2FF0000000084 +:101EE000C81EE2FF00000000D81EE2FF0000000054 +:101EF000D81EE2FF00000000E81EE2FF0000000024 +:101F0000E81EE2FF00000000F81EE2FF00000000F3 +:101F1000F81EE2FF00000000081FE2FF00000000C2 +:101F2000081FE2FF00000000181FE2FF0000000091 +:101F3000181FE2FF00000000281FE2FF0000000061 +:101F4000281FE2FF00000000381FE2FF0000000031 +:101F5000381FE2FF00000000481FE2FF0000000001 +:101F6000481FE2FF00000000581FE2FF00000000D1 +:101F7000581FE2FF00000000681FE2FF00000000A1 +:101F8000681FE2FF00000000781FE2FF0000000071 +:101F9000781FE2FF00000000881FE2FF0000000041 +:101FA000881FE2FF00000000981FE2FF0000000011 +:101FB000981FE2FF00000000A81FE2FF00000000E1 +:101FC000A81FE2FF00000000B81FE2FF00000000B1 +:101FD000B81FE2FF00000000C81FE2FF0000000081 +:101FE000C81FE2FF00000000D81FE2FF0000000051 +:101FF000D81FE2FF00000000E81FE2FF0000000021 +:10200000E81FE2FF00000000F81FE2FF00000000F0 +:10201000F81FE2FF000000000820E2FF00000000BF +:102020000820E2FF000000001820E2FF000000008E +:102030001820E2FF000000002820E2FF000000005E +:102040002820E2FF000000003820E2FF000000002E +:102050003820E2FF000000004820E2FF00000000FE +:102060004820E2FF000000005820E2FF00000000CE +:102070005820E2FF000000006820E2FF000000009E +:102080006820E2FF000000007820E2FF000000006E +:102090007820E2FF000000008820E2FF000000003E +:1020A0008820E2FF000000009820E2FF000000000E +:1020B0009820E2FF00000000A820E2FF00000000DE +:1020C000A820E2FF00000000B820E2FF00000000AE +:1020D000B820E2FF00000000C820E2FF000000007E +:1020E000C820E2FF00000000D820E2FF000000004E +:1020F000D820E2FF00000000E820E2FF000000001E +:10210000E820E2FF00000000F820E2FF00000000ED +:10211000F820E2FF00000000FFFFFFFFFFFFFFFFCE +:1021200000000200000000009D10E2FF000000001F +:102130001400000000000000588EE0FF00000000C6 +:102140000000010000000000A869E0FF000000009E +:102150008469E0FF000000003C69E0FF000000002F +:10216000A210E2FF000000002000000000000000BC +:102170009CB1E0FF00000000000001000000000032 +:102180000869E0FF00000000E468E0FF00000000D4 +:102190009C68E0FF00000000A910E2FF00000000C2 +:1021A00002000000000000008CD3E0FF00000000EF +:1021B00000000100000000003868E0FF000000009F +:1021C0006868E0FF000000009C67E0FF000000007E +:1021D000B510E2FF00000000040000000000000055 +:1021E00070D4E0FF000000000000010000000000CB +:1021F0000868E0FF00000000D467E0FF0000000076 +:102200006467E0FF000000008000000000000000A4 +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:102260004816E1FF00000000000000000000000030 +:102270000000000000000000AC0FE1FF00000000C3 +:1022800000000000000000000B13E2FF000000004F +:1022900000000000000000007C37E1FF00000000AB +:1022A000000000000000000000000000000000002E +:1022B000C0A2E1FF000000000000000000000000DC +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000CB10E2FF0000000096 +:102E80000001000000000000000000000000000041 +:102E900000000000000000007470E0FF000000006F +:102EA000C310E2FF000000008001000000000000ED +:102EB0000000000000000000000000000000000012 +:102EC0007470E0FF00000000BB10E2FF0000000093 +:102ED00000020000000000000000000000000000F0 +:102EE00000000000000000007470E0FF000000001F +:102EF000AF15E2FF000000006200000000000000CB +:102F0000D8C7E1FF00000000000000000000000042 +:102F10006CA3E1FF000000000000000000000000C2 +:102F20000000000000000000F4A2E1FF000000002B +:102F30000000000000000000000000000000000091 +:102F40000000000000000000200000001800000049 +:102F50000000000000000000B022E2FF00000000BE +:102F600000000000000000001112E2FF000000005D +:102F700054000000000000000000000000000000FD +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00038C8E1FF00000000000000000000000011 +:102FE0002B14E2FF0000000072000000000000004F +:102FF00060C8E1FF000000000000000000000000C9 +:103000003C81E1FF00000000007DE1FF00000000C6 +:103010000000000000000000A882E1FF00000000A6 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000A80000005800000090 +:103040000000000000000000C8C8E1FF0000000010 +:103050000004000000000000D512E2FF00000000A4 +:103060001E0000000000000010C9E1FF0000000089 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:10309000F40EE1FF0000000000000000000000004E +:1030A0000000000000000000000000000000000020 +:1030B00000000000300000000000000000000000E0 +:1030C00030C9E1FF00000000000000000000000027 +:1030D000A812E2FF000000001E0000000000000037 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:103130000000000000000000D0C9E1FF0000000016 +:1031400004000000000000002F16E2FF0000000055 +:10315000890000000000000010CAE1FF000000002C +:10316000000000000000000024B2E1FF00000000A9 +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A00020000000000000000000000000000000FF +:1031B00030CAE1FF00000000040000000000000031 +:1031C0005314E2FF00000000720000000000000045 +:1031D00078CBE1FF000000000000000000000000CC +:1031E000709CE1FF00000000049BE1FF0000000074 +:1031F0000000000000000000909AE1FF00000000C5 +:1032000000000000000000000000000000000000BE +:103210000000000000000000A800000010000000F6 +:103220000000000000000000D0CCE1FF0000000022 +:103230000000000000000000BD12E2FF00000000DE +:103240001E0000000000000070C9E1FF0000000047 +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000840EE1FF000000000000000000000000DC +:10328000000000000000000000000000000000003E +:1032900000000000300000000000000000000000FE +:1032A00090C9E1FF000000000400000000000000E1 +:1032B0006A03E2FF0000000073000000000000004D +:1032C000E8CFE1FF00000000000000000000000067 +:1032D0000865E1FF000000002866E1FF0000000033 +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:103300000000000000000000980200000000000023 +:10331000000000000000000008D0E1FF00000000F5 +:103320000004000000000000A8FBE1FF0000000016 +:103330001600000000000000000000000000000077 +:1033400000000000000000000050E1FF000000004D +:10335000E44FE1FF0000000000000000000000005A +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:1033900020CEE1FF0000000000040000000000005B +:1033A000A415E2FF000000004A0000000000000039 +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:10340000000000000000000048CEE1FF00000000C6 +:1034100004000000000000008812E2FF000000002D +:103420001D0000000000000050CEE1FF0000000081 +:103430000000000000000000E406E1FF00000000C2 +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:103480000000000000000000040000000000000038 +:10349000B613E2FF000000006D0000000000000015 +:1034A00070CEE1FF000000000000000000000000FE +:1034B000A874E1FF00000000000000000000000010 +:1034C0000000000000000000C870E1FF00000000E4 +:1034D00000000000000000000000000000000000EC +:1034E0000000000000000000200000002800000094 +:1034F0000000000000000000D0CEE1FF000000004E +:1035000000000000000000006C12E2FF000000005C +:103510001D0000000000000000CEE1FF00000000E0 +:1035200000000000000000007005E1FF0000000046 +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:103570000000000000000000040000000000000047 +:103580000B13E2FF0000000000000000000000003C +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000001B13E2FF00000000BC +:103600006E00000000000000D0CDE1FF00000000CF +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:103660000000000000000000040000000000000056 +:10367000FB12E2FF000000001E000000000000003E +:1036800018CFE1FF00000000000000000000000073 +:10369000AC11E1FF0000000000000000000000008D +:1036A00000000000000000004410E1FF00000000E6 +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000008000000F2 +:1036D00000000000000000004822E2FF000000009F +:1036E00000000000000000005C13E2FF000000008A +:1036F0004D0000000000000038CFE1FF0000000096 +:103700000000000000000000E435E1FF00000000C0 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:103730000000000000000000000000000000000089 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760007B13E2FF000000004900000000000000A1 +:1037700058CFE1FF000000002860E1FF00000000DA +:103780003C5FE1FF000000000000000000000000BE +:103790000000000000000000385EE1FF00000000B3 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000700000002001000078 +:1037C000000000000000000028CBE1FF0000000026 +:1037D00000000000000000002116E2FF00000000D1 +:1037E000660000000000000078CFE1FF000000004C +:1037F0004CB1E1FF00000000F4B0E1FF0000000068 +:103800002CB0E1FF000000000000000000000000FC +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000800000000000000000000000000000080 +:1038400098CFE1FF0000000000040000000000002D +:103850004713E2FF000000004D00000000000000E0 +:10386000C8CFE1FF000000000000000000000000E1 +:103870004C34E1FF000000000000000000000000E8 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000F14E2FF00000000F4 +:1038D0007400000000000000000000000000000074 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940006A13E2FF000000007800000000000000A1 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A00000000000000000009822E2FF000000007C +:1039B0000000000000000000A415E2FF000000006D +:1039C00000000000000000008EF8E1FF0000000091 +:1039D0004C6CE0FF000000002312E2FF000000003A +:1039E00005000000800000006CFCE0FF000000000B +:1039F00000000000000000007CF6E0FF0000000076 +:103A00001F12E2FF0000000002000000080000009A +:103A100010F6E0FF000000000000000000000000C1 +:103A20000CF3E0FF000000002908E2FF00000000A6 +:103A300001000000000000000436E0FF000000006C +:103A40002408E2FF00000000020000000000000067 +:103A50000436E0FF000000001D08E2FF0000000047 +:103A600003000000000000000436E0FF000000003A +:103A70003208E2FF0000000000000000000000002B +:103A8000E43AE0FF000000002E08E2FF0000000022 +:103A900008000000000000000C3AE0FF00000000F9 +:103AA000ACFBE1FF00000000160000000000000079 +:103AB0000000000000000000000000000000000006 +:103AC000000000000000000054FEE0FF00000000C5 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B00000000000000000000900000000000000025 +:103B100000000000000000008212E2FF0000000030 +:103B20001D00000000000000D025E1FF00000000A3 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B9000A412E2FF000000001E0000000000000070 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000840DE1FF0000000094 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000003C13E2FF0000000084 +:103C10004800000000000000D025E1FF0000000087 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80002B0DE2FF000000004900000000000000D2 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000080000000000000000000000CC +:103CF00000000000010000009815E2FF0000000035 +:103D00004A00000000000000000000000000000069 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70006812E2FF000000004B000000000000009D +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD0000000000090010000000000000000000052 +:103DE00000000000000000001713E2FF00000000C8 +:103DF0004D00000000000000000000000000000076 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60001512E2FF000000005400000000000000F6 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC000000000000000000078000000000000007A +:103ED0000000000000000000510BE2FF00000000A5 +:103EE0006200000000000000000000000000000070 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50002916E2FF000000006600000000000000DB +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000613E2FF00000000F7 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:10404000BE13E2FF000000006D0000000000000051 +:104050000000000000000000000000000000000060 +:104060000000000000000000C06EE1FF0000000042 +:10407000E46EE1FF0000000000000000000000000E +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A00000000000180000000000000000000000F8 +:1040B00000000000010000001B13E2FF00000000F0 +:1040C0006E00000000000000842FE1FF00000000EF +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:104120001800000000000000000000000000000077 +:104130002015E2FF000000007200000000000000F7 +:10414000D025E1FF0000000000000000000000009A +:1041500000000000000000000876E1FF0000000001 +:104160000000000000000000FC7BE1FF00000000F8 +:10417000BC75E1FF0000000000000000000000002E +:10418000000000000000000000000000000000002F +:10419000000000000C0000000000000030000000E3 +:1041A0000C000000010000001F14E2FF00000000EE +:1041B000740000000000000000000000000000008B +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:104220009E13E2FF00000000730000000000000089 +:10423000C863E1FF00000000000000000000000073 +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:104280000000000098020000000000000000000094 +:1042900000000000000000007213E2FF00000000B8 +:1042A0007800000000000000000000000000000096 +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:104310004A16E2FF000000008900000000000000D3 +:10432000000000000000000000000000000000008D +:1043300078B3E1FF00000000000000000000000072 +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:104370000000000028000000000000000000000015 +:104380000000000001000000D00DFEED000014153B +:1043900000000038000011CC0000002800000011CF +:1043A000000000020000000000000249000011941B +:1043B00000000000000000000000000000000000FD +:1043C00000000001000000000000000300000015D4 +:1043D00000000000696E74656C2C736F6366706713 +:1043E000612D6167696C65780000000000000003C2 +:1043F000000000040000000B0000000200000003A9 +:10440000000000040000001A000000020000000389 +:104410000000001500000026536F4346504741201E +:104420004167696C657820536F43444B000000007E +:1044300000000001736F630000000003000000042F +:104440000000000B00000001000000030000000459 +:104450000000001A00000001000000030000000B33 +:104460000000000073696D706C652D62757300004B +:1044700000000003000000040000002C736F6300C4 +:1044800000000003000000100000003800000000E1 +:104490000000000000000000FFFFFFFF000000011F +:1044A000636C6F636B2D636F6E74726F6C6C65728F +:1044B0004066666431303030300000000000000398 +:1044C0000000001400000000696E74656C2C6167C8 +:1044D000696C65782D636C6B6D677200000000037A +:1044E000000000080000003FFFD1000000001000A5 +:1044F0000000000300000004000000430000000171 +:104500000000000300000004000000500000000A4A +:10451000000000020000000164776D6D63304066AA +:1045200066383038303030000000000300000004EE +:104530000000000B00000001000000030000000468 +:104540000000001A00000000000000030000001539 +:1045500000000000616C74722C736F636670676199 +:104560002D64772D6D736863000000000000000368 +:10457000000000080000003FFF80800000001000E5 +:1045800000000003000000040000005800000400C8 +:1045900000000003000000040000006300000001B0 +:1045A00000000003000000100000006D0000000784 +:1045B00000000027000000070000002F000000039B +:1045C000000000060000007472657365740000004E +:1045D0000000000300000010000000800000000A3E +:1045E000000000210000000A00000030000000036D +:1045F00000000008000000876269750063697500AB +:104600000000000300000008000000930000000804 +:104610000000000500000003000000050000009AF3 +:104620006F6B6179000000000000000300000000D3 +:10463000000000A10000000300000000000000B224 +:104640000000000300000004000000BC00000004A3 +:104650000000000300000004000000C6000000038A +:104660000000000300000004000000CD0000000076 +:1046700000000003000000040000005000000011D2 +:1046800000000002000000016E616E644066666218 +:10469000393030303000000000000003000000041A +:1046A0000000000B000000010000000300000004F7 +:1046B0000000001A000000000000000300000019C4 +:1046C00000000000616C74722C736F636670676128 +:1046D0002D64656E616C692D6E616E640000000072 +:1046E00000000003000000100000003FFFB90000C0 +:1046F00000010000FFB800000000100000000003EF +:1047000000000015000000D56E616E645F64617486 +:10471000610064656E616C695F726567000000002E +:104720000000000300000010000000800000000AEC +:104730000000002D0000000A00000033000000030C +:104740000000000C000000876E616E64006E616EF8 +:10475000645F780000000003000000100000006D9E +:104760000000000700000025000000070000002DE9 +:1047700000000003000000090000009A64697361F2 +:10478000626C65640000000000000003000000048B +:10479000000000DF00000010000000020000000127 +:1047A0007273746D67724066666431313030300008 +:1047B0000000000300000004000000EE0000000103 +:1047C000000000030000000D00000000616C747226 +:1047D0002C7273742D6D67720000000000000003DE +:1047E000000000080000003FFFD1100000000100A1 +:1047F0000000000300000004000000FB0000002097 +:10480000000000030000000400000050000000074A +:1048100000000002000000017379736D677240664A +:1048200066643132303030000000000300000014B4 +:1048300000000000616C74722C7379732D6D6772C7 +:1048400000737973636F6E000000000300000008BE +:104850000000003FFFD12000000005000000000321 +:1048600000000004000000500000000900000002E9 +:104870000000000173657269616C304066666330E8 +:104880003230303000000000000000030000001152 +:1048900000000000736E70732C64772D6170622DC0 +:1048A0007561727400000000000000030000000841 +:1048B0000000003FFFC020000000010000000003D6 +:1048C000000000040000010E0000000200000003D0 +:1048D00000000004000001180000000400000003B4 +:1048E000000000080000006D0000000700000050FC +:1048F00000000003000000050000009A6F6B617962 +:10490000000000000000000300000008000000801C +:104910000000000A00000022000000030000000464 +:104920000000012505F5E100000000020000000183 +:104930007761746368646F674066666430303230F4 +:1049400030000000000000030000000C0000000028 +:10495000736E70732C64772D77647400000000030D +:10496000000000080000003FFFD00200000001002E +:1049700000000003000000080000006D00000007B8 +:10498000000000400000000300000008000000805C +:104990000000000A00000003000000030000000502 +:1049A0000000009A6F6B61790000000000000002B7 +:1049B00000000001736472406638303131313030AC +:1049C00000000000000000030000001500000000CF +:1049D000696E74656C2C7364722D63746C2D6167E1 +:1049E000696C6578000000000000000300000018FA +:1049F0000000003FF800040000000080F801000003 +:104A000000000190F8011000000005000000000304 +:104A1000000000080000006D0000000700000066B4 +:104A20000000000300000004000000500000000D22 +:104A3000000000020000000173706940666638647F +:104A40003230303000000000000000030000000E93 +:104A50000000000063646E732C717370692D6E6FBB +:104A60007200000000000003000000040000000BC2 +:104A70000000000100000003000000040000001A14 +:104A80000000000000000003000000100000003FD4 +:104A9000FF8D200000000100FF90000000100000CA +:104AA0000000000300000004000001350000008049 +:104AB00000000003000000040000014500000004A5 +:104AC0000000000300000004000001550000000089 +:104AD000000000030000000400000080000000123D +:104AE00000000003000000050000009A6F6B617970 +:104AF0000000000000000001666C61736840300037 +:104B000000000003000000040000000B0000000192 +:104B100000000003000000040000001A0000000173 +:104B2000000000030000000E000000006A656465DC +:104B3000632C7370692D6E6F72000000000000031B +:104B4000000000040000003F00000000000000031F +:104B5000000000040000016A05F5E1000000000308 +:104B6000000000000000017C0000000300000004C1 +:104B70000000018B000001000000000300000004A1 +:104B80000000019A00000010000000030000000473 +:104B9000000001AA00000032000000030000000431 +:104BA000000001B800000032000000030000000413 +:104BB000000001C600000004000000030000000423 +:104BC000000001D400000004000000030000000405 +:104BD000000001E2000000040000000300000004E7 +:104BE000000001F3000000040000000200000002C9 +:104BF00000000001736F63667067612D73656372F7 +:104C000065670000000000030000001500000000C0 +:104C1000696E74656C2C736F63667067612D736564 +:104C200063726567000000000000000300000004DC +:104C30000000000B00000001000000030000000461 +:104C40000000001A0000000100000001695F737994 +:104C5000735F6D67725F636F726540666664313261 +:104C60003030300000000003000000080000003F6A +:104C7000FFD12000000002300000000300000018F7 +:104C80000000020400000020FF010000FF010011ED +:104C900000000024FFFFFFFFFFFFFFFF00000002F6 +:104CA000000000016E6F635F66775F6C345F706554 +:104CB000725F6C345F7065725F73637240666664C6 +:104CC00032313030300000000000000300000008E6 +:104CD0000000003FFFD2100000000074000000033D +:104CE00000000114000002040000000001010001A6 +:104CF00001010001000000040101000101010001A7 +:104D00000000000C01010001010100010000001081 +:104D100001010001010100010000001C010100016E +:104D20000101010100000020010100010101010158 +:104D30000000002401010001010101010000002820 +:104D400001010001010101010000002C010100012D +:104D5000010100010000003001010001010100011A +:104D600000000034010100010101000100000040C9 +:104D700001010001010100010000004401010001E6 +:104D800001010101000000480101000101010101D0 +:104D90000000005001010001010101010000005468 +:104DA00001010001010101010000005801010001A1 +:104DB000010101010000005C01010001010101018C +:104DC0000000006001010001010101010000006418 +:104DD0000101000101010101000000680101000161 +:104DE000010101010000006C01010001010101014C +:104DF000000000700101000101010101000000023A +:104E0000000000016E6F635F66775F6C345F7379DB +:104E1000735F6C345F7379735F736372406666644B +:104E20003231313030000000000000030000000883 +:104E30000000003FFFD211000000009800000003B6 +:104E4000000001440000020400000008010100010C +:104E5000010100010000000C01010001010100013D +:104E60000000001001010001010100010000001418 +:104E70000101000101010001000000180101000111 +:104E8000010100010000001C0101000101010001FD +:104E90000000002001010001010100010000002CC0 +:104EA00001010001010100010000003001010001C9 +:104EB00001010001000000340101000101010001B5 +:104EC0000000003801010001010100010000004064 +:104ED0000101000101010001000000440101000185 +:104EE0000101000100000048010100010101000171 +:104EF0000000004C0101000101010001000000540C +:104F00000101000101010001000000580101000140 +:104F1000010100010000005C01010001010100012C +:104F200000000060010100010101010100000064B6 +:104F300001010001010101010000006801010001FF +:104F4000010101010000006C0101000101010101EA +:104F50000000007001010001010101010000007466 +:104F600001010001010101010000007801010001BF +:104F70000301000100000090010100010101000196 +:104F80000000009401010001010100010000000285 +:104F9000000000016E6F635F66775F736F63326658 +:104FA0007067615F736F6332667067615F736372AE +:104FB0004066666432313230300000000000000389 +:104FC000000000080000003FFFD2120000000004B3 +:104FD000000000030000000C0000020400000000BC +:104FE0000FFE01010FFE01010000000200000001A0 +:104FF0006E6F635F66775F6C77736F63326670673F +:10500000615F6C77736F6332667067615F73637241 +:105010004066666432313330300000000000000327 +:10502000000000080000003FFFD213000000000451 +:10503000000000030000000C00000204000000005B +:105040000FFE01010FFE010100000002000000013F +:105050006E6F635F66775F7463755F7463755F73AC +:105060006372406666643231343030000000000301 +:10507000000000080000003FFFD214000000000400 +:10508000000000030000000C00000204000000000B +:105090000101000101010001000000020000000107 +:1050A0006E6F635F66775F707269765F4D656D6F77 +:1050B00072794D61705F70726976406666643234F1 +:1050C0003830300000000003000000080000003FFE +:1050D000FFD248000000000C000000030000000C9C +:1050E0000000020400000000FFF73FFBFFF73FFB5A +:1050F00000000002000000014343555F636F685FDA +:10510000637075305F6279706173735F4F435F46A0 +:1051100069726577616C6C5F6D61696E5F4669721B +:105120006577616C6C40663731303032303000006A +:1051300000000003000000080000003FF71002001C +:105140000000001400000003000000300000020412 +:10515000000000048000FFFFE003FFFF00000008E4 +:105160008000FFFFE003FFFF0000000C8000FFFF56 +:10517000E003FFFF000000108000FFFFE003FFFFDF +:105180000000000200000001736F635F6E6F635FD9 +:1051900066775F6D7066655F6373725F696E737467 +:1051A0005F305F6D7066655F736372406638303282 +:1051B0003030303000000000000000030000000824 +:1051C0000000003FF80200000000001C0000000387 +:1051D00000000018000002040000000000010101AE +:1051E00000010101000000040000000100010101B4 +:1051F0000000000200000001736F635F6E6F635F69 +:1052000066775F6464725F6670676132736472614F +:105210006D5F696E73745F305F6464725F73637235 +:10522000406638303230313030000000000000037A +:10523000000000080000003FF802010000000050DC +:1052400000000003000000E4000002040000000071 +:10525000000000000000000F00000004000000003B +:105260000000000F00000008000000000000000F18 +:105270000000001000000000FFFF0000000000140C +:1052800000000000000000FF000000180000000007 +:10529000FFFF00000000001C00000000000000FFF5 +:1052A0000000002000000000FFFF000000000024BC +:1052B00000000000000000FF0000002800000000C7 +:1052C000FFFF00000000002C00000000000000FFB5 +:1052D0000000003000000000FFFF0000000000346C +:1052E00000000000000000FF000000380000000087 +:1052F000FFFF00000000003C00000000000000FF75 +:105300000000004000000000FFFF0000000000441B +:1053100000000000000000FF000000480000000046 +:10532000FFFF00000000004C00000000000000FF34 +:105330000000000200000001736F635F6D7066651E +:105340005F6E6F635F696E73745F305F6363755F19 +:105350006D656D305F495F6D61696E5F516F734759 +:10536000656E657261746F72406638303232303803 +:105370003000000000000003000000080000003FB3 +:10538000F80220800000001C000000030000003C28 +:1053900000000204000000080000020000000303F7 +:1053A0000000000C000000030000000300000010DB +:1053B00000000BFE00007FFF00000014000000084A +:1053C000000003FF00000018000000000000000FB4 +:1053D0000000000200000002000000016361636839 +:1053E000652D636F6E74726F6C6C657240663730DA +:1053F00030303030300000000000000300000012A8 +:1054000000000000617274657269732C6E636F72C4 +:10541000652D6363750000000000000300000008B4 +:105420000000003FF700000000100900000000022B +:105430000000000200000001616C69617365730087 +:1054400000000003000000160000021A2F736F63B3 +:105450002F73657269616C3040666663303230303C +:1054600030000000000000030000001200000222D3 +:105470002F736F632F737069406666386432303003 +:105480003000000000000002000000016D656D6F3B +:105490007279000000000003000000070000002CEB +:1054A0006D656D6F72790000000000030000002040 +:1054B0000000003F000000000000000000000000AD +:1054C00080000000000000028000000000000001D9 +:1054D0008000000000000003000000040000000B3A +:1054E0000000000200000003000000040000001A99 +:1054F00000000002000000020000000163686F73FA +:10550000656E00000000000300000011000002278B +:1055100073657269616C303A3131353230306E38D2 +:10552000000000000000000300000015000002332E +:105530002F736F632F64776D6D633040666638300C +:10554000383030300000000000000002000000028F +:1055500000000009636F6D70617469626C650023FF +:10556000616464726573732D63656C6C730023737F +:10557000697A652D63656C6C73006D6F64656C0092 +:105580006465766963655F747970650072616E67E2 +:105590006573007265670023636C6F636B2D6365D1 +:1055A0006C6C73007068616E646C65006669666F30 +:1055B0002D6465707468006669666F2D6D6F646533 +:1055C000007265736574730072657365742D6E6126 +:1055D0006D657300636C6F636B7300636C6F636BFB +:1055E0002D6E616D657300696F6D6D7573007374F9 +:1055F00061747573006361702D73642D68696768E9 +:1056000073706565640062726F6B656E2D63640014 +:105610006275732D77696474680064727673656C63 +:1056200000736D706C73656C007265672D6E616DD3 +:105630006573006E616E642D6275732D7769647495 +:1056400068002372657365742D63656C6C7300610B +:105650006C74722C6D6F647273742D6F66667365F3 +:1056600074007265672D7368696674007265672DD2 +:10567000696F2D776964746800636C6F636B2D6666 +:1056800072657175656E63790063646E732C66690B +:10569000666F2D64657074680063646E732C666950 +:1056A000666F2D77696474680063646E732C74721E +:1056B00069676765722D61646472657373007370E6 +:1056C000692D6D61782D6672657175656E637900FF +:1056D0006D3235702C666173742D72656164006380 +:1056E000646E732C706167652D73697A65006364FD +:1056F0006E732C626C6F636B2D73697A65006364E3 +:105700006E732C747368736C2D6E730063646E73A8 +:105710002C74736432642D6E730063646E732C7426 +:10572000636873682D6E730063646E732C74736C9E +:1057300063682D6E73007370692D74782D627573B4 +:105740002D7769647468007370692D72782D6275A5 +:10575000732D776964746800696E74656C2C6F666C +:10576000667365742D73657474696E677300736511 +:105770007269616C300073706930007374646F75A6 +:10578000742D7061746800752D626F6F742C737066 +:0D5790006C2D626F6F742D6F726465720076 +:04000005FFE0000018 +:00000001FF diff --git a/corev_apu/bootrom/ariane.dts b/corev_apu/bootrom/ariane.dts index 9b5b84f145..3f79380f34 100644 --- a/corev_apu/bootrom/ariane.dts +++ b/corev_apu/bootrom/ariane.dts @@ -41,7 +41,7 @@ reg = <0x0 0x2000000 0x0 0xc0000>; reg-names = "control"; }; - // PLIC needs to be disabeld for tandem verification + // PLIC needs to be disabled for tandem verification // PLIC0: interrupt-controller@c000000 { // #address-cells = <0>; // #interrupt-cells = <1>; @@ -54,7 +54,7 @@ // }; // Specifying the interrupt controller in the devicetree is not necessary. // Furthermore, the IRQ 65535 will cause a `hwirq 0xffff is too large` during - // Linux boot (occured with mainline linux 5.14.0). + // Linux boot (occurred with mainline linux 5.14.0). // debug-controller@0 { // compatible = "riscv,debug-013"; // interrupts-extended = <&CPU0_intc 65535>; diff --git a/corev_apu/clint/README.md b/corev_apu/clint/README.md index a62fc203b6..37eb2c09c4 100644 --- a/corev_apu/clint/README.md +++ b/corev_apu/clint/README.md @@ -2,7 +2,7 @@ This repository contains a RISC-V privilege spec 1.11 (WIP) compatible CLINT for the Ariane Core. -The CLINT plugs into an existing AXI Bus with an AXI 4 Lite interface. The IP mirrors transaction IDs and is fully pin-compatible with the full AXI 4 interface. It does not support burst transfers (as specified in the AMBA 4 Bus specifcation) +The CLINT plugs into an existing AXI Bus with an AXI 4 Lite interface. The IP mirrors transaction IDs and is fully pin-compatible with the full AXI 4 interface. It does not support burst transfers (as specified in the AMBA 4 Bus specification) | Address | Description | Note | |-------------------|-------------|------------------------------------------------| diff --git a/corev_apu/fpga/Makefile b/corev_apu/fpga/Makefile index 678e224438..e703bae0c3 100644 --- a/corev_apu/fpga/Makefile +++ b/corev_apu/fpga/Makefile @@ -12,7 +12,9 @@ ips := xlnx_axi_clock_converter.xci \ xlnx_axi_quad_spi.xci \ xlnx_axi_gpio.xci \ xlnx_clk_gen.xci \ - xlnx_mig_7_ddr3.xci + xlnx_dpti_clk.xci \ + xlnx_mig_7_ddr3.xci \ + ips := $(addprefix $(work-dir)/, $(ips)) ips-target := $(join $(addsuffix /ip/, $(addprefix $(ip-dir)/, $(basename $(ips)))), $(ips)) diff --git a/corev_apu/fpga/ariane-multi-hart.cfg b/corev_apu/fpga/ariane-multi-hart.cfg index 3f21b8646c..5f579d4b3d 100644 --- a/corev_apu/fpga/ariane-multi-hart.cfg +++ b/corev_apu/fpga/ariane-multi-hart.cfg @@ -1,10 +1,10 @@ -adapter_khz 1000 +adapter speed 1000 -interface ftdi -ftdi_vid_pid 0x0403 0x6010 +adapter driver ftdi +ftdi vid_pid 0x0403 0x6010 # Channel 1 is taken by Xilinx JTAG -ftdi_channel 0 +ftdi channel 0 # links: # http://openocd.org/doc-release/html/Debug-Adapter-Configuration.html @@ -16,9 +16,9 @@ ftdi_channel 0 # Bit3 TMS ADBUS3 TMS Out Select Signal Out # Bit4 GPIOL0 ADBUS4 nTRST In/Out General Purpose I/O # this corresponds to the following in/out layout, with TMS initially set to 1 -ftdi_layout_init 0x0018 0x001b +ftdi layout_init 0x0018 0x001b # we only have to specify nTRST, the others are assigned correctly by default -ftdi_layout_signal nTRST -ndata 0x0010 +ftdi layout_signal nTRST -ndata 0x0010 set _CHIPNAME riscv jtag newtap $_CHIPNAME cpu -irlen 5 @@ -26,8 +26,8 @@ jtag newtap $_CHIPNAME cpu -irlen 5 set _TARGETNAME $_CHIPNAME.cpu target create $_TARGETNAME riscv -chain-position $_TARGETNAME -rtos riscv -gdb_report_data_abort enable -gdb_report_register_access_error enable +gdb report_data_abort enable +gdb report_register_access_error enable riscv set_reset_timeout_sec 120 riscv set_command_timeout_sec 120 diff --git a/corev_apu/fpga/ariane.cfg b/corev_apu/fpga/ariane.cfg index 82d3f5abe4..a9f87f3fe3 100644 --- a/corev_apu/fpga/ariane.cfg +++ b/corev_apu/fpga/ariane.cfg @@ -1,10 +1,10 @@ -adapter_khz 1000 +adapter speed 1000 -interface ftdi -ftdi_vid_pid 0x0403 0x6010 +adapter driver ftdi +ftdi vid_pid 0x0403 0x6010 # Channel 1 is taken by Xilinx JTAG -ftdi_channel 0 +ftdi channel 0 # links: # http://openocd.org/doc-release/html/Debug-Adapter-Configuration.html @@ -16,9 +16,9 @@ ftdi_channel 0 # Bit3 TMS ADBUS3 TMS Out Select Signal Out # Bit4 GPIOL0 ADBUS4 nTRST In/Out General Purpose I/O # this corresponds to the following in/out layout, with TMS initially set to 1 -ftdi_layout_init 0x0018 0x001b +ftdi layout_init 0x0018 0x001b # we only have to specify nTRST, the others are assigned correctly by default -ftdi_layout_signal nTRST -ndata 0x0010 +ftdi layout_signal nTRST -ndata 0x0010 set _CHIPNAME riscv jtag newtap $_CHIPNAME cpu -irlen 5 @@ -26,8 +26,8 @@ jtag newtap $_CHIPNAME cpu -irlen 5 set _TARGETNAME $_CHIPNAME.cpu target create $_TARGETNAME riscv -chain-position $_TARGETNAME -coreid 0 -gdb_report_data_abort enable -gdb_report_register_access_error enable +gdb report_data_abort enable +gdb report_register_access_error enable riscv set_reset_timeout_sec 120 riscv set_command_timeout_sec 120 diff --git a/corev_apu/fpga/ariane_pmod.cfg b/corev_apu/fpga/ariane_pmod.cfg index 21da859932..9ed8cdfb64 100644 --- a/corev_apu/fpga/ariane_pmod.cfg +++ b/corev_apu/fpga/ariane_pmod.cfg @@ -1,13 +1,13 @@ -adapter_khz 1000 +adapter speed 1000 -interface ftdi +adapter driver ftdi # ftdi_device_desc "Olimex Ltd. ARM-USB-OCD-H JTAG+RS232" -ftdi_vid_pid 0x15ba 0x002b +ftdi vid_pid 0x15ba 0x002b -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 +ftdi layout_init 0x0808 0x0a1b +ftdi layout_signal nSRST -oe 0x0200 +ftdi layout_signal nTRST -data 0x0100 -oe 0x0100 +ftdi layout_signal LED -data 0x0800 set _CHIPNAME riscv jtag newtap $_CHIPNAME cpu -irlen 5 @@ -16,8 +16,8 @@ set _TARGETNAME $_CHIPNAME.cpu # select the HART to debug with the coreid switch target create $_TARGETNAME riscv -chain-position $_TARGETNAME -coreid 0 -gdb_report_data_abort enable -gdb_report_register_access_error enable +gdb report_data_abort enable +gdb report_register_access_error enable riscv set_reset_timeout_sec 120 riscv set_command_timeout_sec 120 diff --git a/corev_apu/fpga/ariane_pmod_tiny.cfg b/corev_apu/fpga/ariane_pmod_tiny.cfg index bc8a500c83..989f4e4597 100644 --- a/corev_apu/fpga/ariane_pmod_tiny.cfg +++ b/corev_apu/fpga/ariane_pmod_tiny.cfg @@ -1,13 +1,13 @@ -adapter_khz 1000 +adapter speed 1000 -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a +adapter driver ftdi +ftdi device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" +ftdi vid_pid 0x15ba 0x002a -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 +ftdi layout_init 0x0808 0x0a1b +ftdi layout_signal nSRST -oe 0x0200 +ftdi layout_signal nTRST -data 0x0100 -oe 0x0100 +ftdi layout_signal LED -data 0x0800 set _CHIPNAME riscv jtag newtap $_CHIPNAME cpu -irlen 5 @@ -16,8 +16,8 @@ set _TARGETNAME $_CHIPNAME.cpu # select the HART to debug with the coreid switch target create $_TARGETNAME riscv -chain-position $_TARGETNAME -coreid 0 -gdb_report_data_abort enable -gdb_report_register_access_error enable +gdb report_data_abort enable +gdb report_register_access_error enable riscv set_reset_timeout_sec 120 riscv set_command_timeout_sec 120 diff --git a/corev_apu/fpga/constraints/ariane.xdc b/corev_apu/fpga/constraints/ariane.xdc index 714bc451cb..c2b6a13896 100644 --- a/corev_apu/fpga/constraints/ariane.xdc +++ b/corev_apu/fpga/constraints/ariane.xdc @@ -7,7 +7,7 @@ set_input_jitter tck 1.000 set_input_delay -clock tck -clock_fall 5 [get_ports tdi ] set_input_delay -clock tck -clock_fall 5 [get_ports tms ] set_output_delay -clock tck 5 [get_ports tdo ] -set_false_path -from [get_ports trst_n ] +set_false_path -from [get_ports trst_n ] set_max_delay -datapath_only -from [get_pins i_dmi_jtag/i_dmi_cdc/i_cdc_resp/i_src/data_src_q_reg*/C] -to [get_pins i_dmi_jtag/i_dmi_cdc/i_cdc_resp/i_dst/data_dst_q_reg*/D] 20.000 @@ -15,5 +15,30 @@ set_max_delay -datapath_only -from [get_pins i_dmi_jtag/i_dmi_cdc/i_cdc_resp/i_s set_max_delay -datapath_only -from [get_pins i_dmi_jtag/i_dmi_cdc/i_cdc_req/i_dst/ack_dst_q_reg/C] -to [get_pins i_dmi_jtag/i_dmi_cdc/i_cdc_req/i_src/ack_src_q_reg/D] 20.000 # set multicycle path on reset, on the FPGA we do not care about the reset anyway -set_multicycle_path -from [get_pins i_rstgen_main/i_rstgen_bypass/synch_regs_q_reg[3]/C] 4 -set_multicycle_path -from [get_pins i_rstgen_main/i_rstgen_bypass/synch_regs_q_reg[3]/C] 3 -hold +set_multicycle_path -from [get_pins {i_rstgen_main/i_rstgen_bypass/synch_regs_q_reg[3]/C}] 4 +set_multicycle_path -hold -from [get_pins {i_rstgen_main/i_rstgen_bypass/synch_regs_q_reg[3]/C}] 3 + +create_clock -period 16.667 -name prog_clko_pin -waveform {0.000 8.333} [get_ports prog_clko] + +set_input_delay -clock [get_clocks prog_clko_pin] -min -add_delay 1.000 [get_ports {prog_d[*]}] +set_input_delay -clock [get_clocks prog_clko_pin] -max -add_delay 7.150 [get_ports {prog_d[*]}] +set_input_delay -clock [get_clocks prog_clko_pin] -min -add_delay 1.000 [get_ports prog_rxen] +set_input_delay -clock [get_clocks prog_clko_pin] -max -add_delay 7.150 [get_ports prog_rxen] +set_input_delay -clock [get_clocks prog_clko_pin] -min -add_delay 1.000 [get_ports prog_txen] +set_input_delay -clock [get_clocks prog_clko_pin] -max -add_delay 7.150 [get_ports prog_txen] +set_output_delay -clock [get_clocks prog_clko_pin] -min -add_delay 0.400 [get_ports {prog_d[*]}] +set_output_delay -clock [get_clocks prog_clko_pin] -max -add_delay 8.600 [get_ports {prog_d[*]}] +set_output_delay -clock [get_clocks prog_clko_pin] -min -add_delay 0.400 [get_ports prog_oen] +set_output_delay -clock [get_clocks prog_clko_pin] -max -add_delay 8.600 [get_ports prog_oen] +set_output_delay -clock [get_clocks prog_clko_pin] -min -add_delay 0.400 [get_ports prog_rdn] +set_output_delay -clock [get_clocks prog_clko_pin] -max -add_delay 8.600 [get_ports prog_rdn] +set_output_delay -clock [get_clocks prog_clko_pin] -min -add_delay 0.400 [get_ports prog_wrn] +set_output_delay -clock [get_clocks prog_clko_pin] -max -add_delay 8.600 [get_ports prog_wrn] + +set_property IOB TRUE [get_ports {prog_d[*]}] +set_property IOB TRUE [get_ports prog_rxen] +set_property IOB TRUE [get_ports prog_txen] + +set_property DONT_TOUCH true [get_cells i_cva6_rvfi] +set_property DONT_TOUCH true [get_cells i_iti] +set_property DONT_TOUCH true [get_cells i_encapsulator] \ No newline at end of file diff --git a/corev_apu/fpga/constraints/genesys-2.xdc b/corev_apu/fpga/constraints/genesys-2.xdc index 52fd714452..2a99992571 100644 --- a/corev_apu/fpga/constraints/genesys-2.xdc +++ b/corev_apu/fpga/constraints/genesys-2.xdc @@ -8,6 +8,47 @@ set_property -dict { PACKAGE_PIN W27 IOSTANDARD LVCMOS33 } [get_ports { tdi set_property -dict { PACKAGE_PIN W28 IOSTANDARD LVCMOS33 } [get_ports { tdo }]; set_property -dict { PACKAGE_PIN W29 IOSTANDARD LVCMOS33 } [get_ports { tms }]; +#PMOD Header JA +set_property -dict {PACKAGE_PIN U27 IOSTANDARD LVCMOS33} [get_ports prog_clko]; #IO_L13P_T2_MRCC_14 +set_property -dict {PACKAGE_PIN U28 IOSTANDARD LVCMOS33} [get_ports prog_oen] +set_property -dict {PACKAGE_PIN T26 IOSTANDARD LVCMOS33} [get_ports prog_rdn] +set_property -dict {PACKAGE_PIN T27 IOSTANDARD LVCMOS33} [get_ports prog_rxen] +set_property -dict {PACKAGE_PIN T22 IOSTANDARD LVCMOS33} [get_ports prog_siwun] +set_property -dict {PACKAGE_PIN T23 IOSTANDARD LVCMOS33} [get_ports prog_spien] +set_property -dict {PACKAGE_PIN T20 IOSTANDARD LVCMOS33} [get_ports prog_txen] +set_property -dict {PACKAGE_PIN T21 IOSTANDARD LVCMOS33} [get_ports prog_wrn] + +#PMOD Header JB +set_property -dict {PACKAGE_PIN V29 IOSTANDARD LVCMOS33} [get_ports {prog_d[0]}] +set_property -dict {PACKAGE_PIN V30 IOSTANDARD LVCMOS33} [get_ports {prog_d[1]}] +set_property -dict {PACKAGE_PIN V25 IOSTANDARD LVCMOS33} [get_ports {prog_d[2]}] +set_property -dict {PACKAGE_PIN W26 IOSTANDARD LVCMOS33} [get_ports {prog_d[3]}] +set_property -dict {PACKAGE_PIN T25 IOSTANDARD LVCMOS33} [get_ports {prog_d[4]}] +set_property -dict {PACKAGE_PIN U25 IOSTANDARD LVCMOS33} [get_ports {prog_d[5]}] +set_property -dict {PACKAGE_PIN U22 IOSTANDARD LVCMOS33} [get_ports {prog_d[6]}] +set_property -dict {PACKAGE_PIN U23 IOSTANDARD LVCMOS33} [get_ports {prog_d[7]}] + + +#PMOD Header JC +# set_property -dict {PACKAGE_PIN AC26 IOSTANDARD LVCMOS33} [get_ports prog_clko] +# set_property -dict {PACKAGE_PIN AJ27 IOSTANDARD LVCMOS33} [get_ports prog_oen] +# set_property -dict {PACKAGE_PIN AH30 IOSTANDARD LVCMOS33} [get_ports prog_rdn] +# set_property -dict {PACKAGE_PIN AK29 IOSTANDARD LVCMOS33} [get_ports prog_rxen] +# set_property -dict {PACKAGE_PIN AD26 IOSTANDARD LVCMOS33} [get_ports prog_siwun] +# set_property -dict {PACKAGE_PIN AG30 IOSTANDARD LVCMOS33} [get_ports prog_spien] +# set_property -dict {PACKAGE_PIN AK30 IOSTANDARD LVCMOS33} [get_ports prog_txen] +# set_property -dict {PACKAGE_PIN AK28 IOSTANDARD LVCMOS33} [get_ports prog_wrn] + +#PMOD Header JD +# set_property -dict {PACKAGE_PIN V27 IOSTANDARD LVCMOS33} [get_ports {prog_d[0]}] +# set_property -dict {PACKAGE_PIN Y30 IOSTANDARD LVCMOS33} [get_ports {prog_d[1]}] +# set_property -dict {PACKAGE_PIN V24 IOSTANDARD LVCMOS33} [get_ports {prog_d[2]}] +# set_property -dict {PACKAGE_PIN W22 IOSTANDARD LVCMOS33} [get_ports {prog_d[3]}] +# set_property -dict {PACKAGE_PIN U24 IOSTANDARD LVCMOS33} [get_ports {prog_d[4]}] +# set_property -dict {PACKAGE_PIN Y26 IOSTANDARD LVCMOS33} [get_ports {prog_d[5]}] +# set_property -dict {PACKAGE_PIN V22 IOSTANDARD LVCMOS33} [get_ports {prog_d[6]}] +# set_property -dict {PACKAGE_PIN W21 IOSTANDARD LVCMOS33} [get_ports {prog_d[7]}] + ## UART set_property -dict {PACKAGE_PIN Y23 IOSTANDARD LVCMOS33} [get_ports tx] set_property -dict {PACKAGE_PIN Y20 IOSTANDARD LVCMOS33} [get_ports rx] diff --git a/corev_apu/fpga/scripts/run.tcl b/corev_apu/fpga/scripts/run.tcl index 3d1536c4aa..32bdf25f68 100644 --- a/corev_apu/fpga/scripts/run.tcl +++ b/corev_apu/fpga/scripts/run.tcl @@ -37,6 +37,7 @@ read_ip { \ "xilinx/xlnx_axi_gpio/xlnx_axi_gpio.srcs/sources_1/ip/xlnx_axi_gpio/xlnx_axi_gpio.xci" \ "xilinx/xlnx_axi_quad_spi/xlnx_axi_quad_spi.srcs/sources_1/ip/xlnx_axi_quad_spi/xlnx_axi_quad_spi.xci" \ "xilinx/xlnx_clk_gen/xlnx_clk_gen.srcs/sources_1/ip/xlnx_clk_gen/xlnx_clk_gen.xci" \ + "xilinx/xlnx_dpti_clk/xlnx_dpti_clk.srcs/sources_1/ip/xlnx_dpti_clk/xlnx_dpti_clk.xci" \ } # read_ip xilinx/xlnx_protocol_checker/ip/xlnx_protocol_checker.xci @@ -44,9 +45,10 @@ set_property include_dirs { \ "src/axi_sd_bridge/include" \ "../../vendor/pulp-platform/common_cells/include" \ "../../vendor/pulp-platform/axi/include" \ - "../../vendor/pulp-platform/obi/include" \ + "../../vendor/pulp-platform/obi/include" \ "../../core/cache_subsystem/hpdcache/rtl/include" \ "../register_interface/include" \ + "../instr_tracing/ITI/include" \ "../../core/include" \ } [current_fileset] diff --git a/corev_apu/fpga/src/agilex7.svh b/corev_apu/fpga/src/agilex7.svh index 467ddaf3fe..391bc08739 100644 --- a/corev_apu/fpga/src/agilex7.svh +++ b/corev_apu/fpga/src/agilex7.svh @@ -8,7 +8,7 @@ // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. -// Description: Set global FPGA degines +// Description: Set global FPGA defines // Author: Florian Zaruba `define AGILEX7 @@ -17,5 +17,5 @@ `define ARIANE_DATA_WIDTH 64 -// Instantiate protocl checker +// Instantiate protocol checker // `define PROTOCOL_CHECKER diff --git a/corev_apu/fpga/src/ariane_xilinx.sv b/corev_apu/fpga/src/ariane_xilinx.sv index 58d9adb92c..aa547e5b4d 100644 --- a/corev_apu/fpga/src/ariane_xilinx.sv +++ b/corev_apu/fpga/src/ariane_xilinx.sv @@ -10,6 +10,9 @@ // Description: Xilinx FPGA top-level // Author: Florian Zaruba +`include "axi/assign.svh" +`include "rvfi_types.svh" +`include "iti_types.svh" module ariane_xilinx ( // WARNING: Do not define input parameters. This causes the FPGA build to fail. @@ -177,11 +180,20 @@ module ariane_xilinx ( output logic spi_ss , output logic spi_clk_o , // common part - // input logic trst_n , + // input logic trst_n , input logic tck , input logic tms , input logic tdi , - output wire tdo , + output wire tdo , + input logic prog_clko , + input logic prog_rxen , + input logic prog_txen , + input logic prog_spien , + output logic prog_rdn , + output logic prog_wrn , + output logic prog_oen , + output logic prog_siwun , + inout logic [7:0] prog_d , input logic rx , output logic tx ); @@ -199,11 +211,17 @@ endfunction // CVA6 Xilinx configuration localparam config_pkg::cva6_cfg_t CVA6Cfg = build_fpga_config(cva6_config_pkg::cva6_cfg); +localparam type rvfi_instr_t = `RVFI_INSTR_T(CVA6Cfg); +//localparam type rvfi_csr_elmt_t = `RVFI_CSR_ELMT_T(CVA6Cfg); +//localparam type rvfi_csr_t = `RVFI_CSR_T(CVA6Cfg, rvfi_csr_elmt_t); +localparam type rvfi_to_iti_t = `RVFI_TO_ITI_T(CVA6Cfg); +localparam type iti_to_encoder_t = `ITI_TO_ENCODER_T(CVA6Cfg); + localparam type rvfi_probes_instr_t = `RVFI_PROBES_INSTR_T(CVA6Cfg); localparam type rvfi_probes_csr_t = `RVFI_PROBES_CSR_T(CVA6Cfg); localparam type rvfi_probes_t = struct packed { logic csr; - logic instr; + rvfi_probes_instr_t instr; }; // 24 MByte in 8 byte words @@ -214,7 +232,7 @@ localparam NumWords = (24 * 1024 * 1024) / 8; localparam NBSlave = 2; // debug, ariane localparam AxiAddrWidth = 64; localparam AxiDataWidth = 64; -localparam AxiIdWidthMaster = 4; +localparam AxiIdWidthMaster = 5; localparam AxiIdWidthSlaves = AxiIdWidthMaster + $clog2(NBSlave); // 5 localparam AxiUserWidth = CVA6Cfg.AxiUserWidth; @@ -753,9 +771,16 @@ end // --------------- ariane_axi::req_t axi_ariane_req; ariane_axi::resp_t axi_ariane_resp; +rvfi_probes_t rvfi_probes; + +rvfi_instr_t [CVA6Cfg.NrCommitPorts-1:0] rvfi_instr; +rvfi_to_iti_t rvfi_to_iti; +iti_to_encoder_t iti_to_encoder; ariane #( .CVA6Cfg ( CVA6Cfg ), + .rvfi_probes_instr_t ( rvfi_probes_instr_t ), + .rvfi_probes_csr_t ( rvfi_probes_csr_t ), .rvfi_probes_t ( rvfi_probes_t ) ) i_ariane ( .clk_i ( clk ), @@ -765,7 +790,7 @@ ariane #( .irq_i ( irq ), .ipi_i ( ipi ), .time_irq_i ( timer_irq ), - .rvfi_probes_o( /* open */ ), + .rvfi_probes_o( rvfi_probes ), .debug_req_i ( debug_req_irq ), .noc_req_o ( axi_ariane_req ), .noc_resp_i ( axi_ariane_resp ) @@ -774,6 +799,136 @@ ariane #( `AXI_ASSIGN_FROM_REQ(slave[0], axi_ariane_req) `AXI_ASSIGN_TO_RESP(axi_ariane_resp, slave[0]) + cva6_rvfi #( + .CVA6Cfg (CVA6Cfg), + .rvfi_instr_t(rvfi_instr_t), + .rvfi_csr_t(), + .rvfi_probes_instr_t(rvfi_probes_instr_t), + .rvfi_probes_csr_t(rvfi_probes_csr_t), + .rvfi_probes_t(rvfi_probes_t), + .rvfi_to_iti_t(rvfi_to_iti_t) + ) i_cva6_rvfi ( + .clk_i (clk), + .rst_ni (ndmreset_n), + .rvfi_probes_i(rvfi_probes), + .rvfi_instr_o (rvfi_instr), + .rvfi_to_iti_o (rvfi_to_iti), + .rvfi_csr_o () + ); + + + cva6_iti #( + .CVA6Cfg (CVA6Cfg), + .CAUSE_LEN (iti_pkg::CAUSE_LEN), + .ITYPE_LEN (iti_pkg::ITYPE_LEN), + .IRETIRE_LEN (iti_pkg::IRETIRE_LEN), + .block_mode(0), + .rvfi_to_iti_t(rvfi_to_iti_t), + .iti_to_encoder_t(iti_to_encoder_t) + ) i_iti ( + .clk_i (clk), + .rst_ni (ndmreset_n), + // inputs from rvfi + .valid_i(rvfi_to_iti.valid), + .rvfi_to_iti_i(rvfi_to_iti), + // outputs for the encoder module TODO + .valid_o(), + .iti_to_encoder_o(iti_to_encoder) + ); + + logic packet_valid; + te_pkg::it_packet_type_e [0:0] packet_type; + logic [te_pkg::P_LEN-1:0] packet_length; + logic [te_pkg::PAYLOAD_LEN-1:0] packet_payload; + + rv_tracer #( + .N(1), + .ONLY_BRANCHES(1) + )i_encoder( + .clk_i (clk), + .rst_ni (ndmreset_n), + .valid_i (iti_to_encoder.valid), + .itype_i (iti_to_encoder.itype), + .cause_i (iti_to_encoder.cause), + .tval_i (iti_to_encoder.tval), + .priv_i (iti_to_encoder.priv), + .iaddr_i (iti_to_encoder.iaddr), + .iretire_i (iti_to_encoder.iretire), + .ilastsize_i (iti_to_encoder.ilastsize), + .time_i (iti_to_encoder.cycles), + .tvec_i ('0), + .epc_i ('0), + .encapsulator_ready_i('1), + .paddr_i ('0), + .pwrite_i ('0), + .psel_i ('0), + .penable_i ('0), + .pwdata_i ('0), + .packet_valid_o (packet_valid), + .packet_type_o (packet_type), + .packet_length_o (packet_length), + .packet_payload_o (packet_payload), + .stall_o (), + .pready_o (), + .prdata_o () + ); + + logic encap_valid; + encap_pkg::encap_fifo_entry_s encap_fifo_entry_i; + encap_pkg::encap_fifo_entry_s encap_fifo_entry_o; + logic encap_fifo_full; + logic encap_fifo_empty; + logic encap_fifo_pop; + + encapsulator i_encapsulator ( + .clk_i (clk), + .valid_i (packet_valid), + .packet_length_i (packet_length), + .flow_i ('0), + .timestamp_present_i('1), + //.srcid_i(), + .timestamp_i (rvfi_to_iti.cycles), + //.type_i(), + .trace_payload_i (packet_payload), + .valid_o (encap_valid), + .encap_fifo_entry_o (encap_fifo_entry_i) + ); + + fifo_v3 # ( + .DEPTH(16), + .dtype(encap_pkg::encap_fifo_entry_s) + ) i_fifo_encap ( + .clk_i (clk), + .rst_ni (ndmreset_n), + .flush_i ('0), + .testmode_i('0), + .full_o (encap_fifo_full), + .empty_o (encap_fifo_empty), + .usage_o (), + .data_i (encap_fifo_entry_i), + .push_i (encap_valid), + .data_o (encap_fifo_entry_o), + .pop_i (encap_fifo_pop) + ); + + localparam DATA_LEN = 8; + logic valid_slice; + logic [DATA_LEN-1:0] slice; + logic [$clog2(DATA_LEN)-4:0] valid_bytes; + + slicer_DPTI #( + .SLICE_LEN(DATA_LEN), + .NO_TIME ('0) + ) i_slicer ( + .clk_i (clk), + .rst_ni (ndmreset_n), + .valid_i (!encap_fifo_empty), + .encap_fifo_entry_i(encap_fifo_entry_o), + .fifo_full_i (usrFull), // usrFull DPTI + .valid_o (valid_slice), + .slice_o (slice), + .done_o (encap_fifo_pop) + ); // --------------- // CLINT // --------------- @@ -846,7 +1001,67 @@ end else begin .rdata_o ( rom_rdata ) ); end +// --------------- +// DPTI +// --------------- +logic FifoEn ; +logic usrFull ; +logic usrEmpty ; +logic [7:0] w_data; +logic [7:0] r_data; + +logic [11:0] w_count; +logic [11:0] r_count; + +logic prog_rxen_debug; +logic prog_txen_debug; +logic prog_spien_debug; +logic prog_rdn_debug; +logic prog_wrn_debug; +logic prog_oen_debug; +logic prog_siwun_debug; + +assign prog_rxen_debug = prog_rxen; +assign prog_txen_debug = prog_txen; +assign prog_spien_debug = prog_spien; +assign prog_rdn_debug = prog_rdn; +assign prog_wrn_debug = prog_wrn; +assign prog_oen_debug = prog_oen; +assign prog_siwun_debug = prog_siwun; + +//assign w_data = {iti_to_encoder.itype[0],iti_to_encoder.itype[1],iti_to_encoder.valid} ; + +assign FifoEn = !usrFull && !usrEmpty; + dpti_ctrl i_dpti_ctrl ( + .wr_clk (clk), + .wr_en (valid_slice), + .wr_full(usrFull), + .wr_afull(), + .wr_err(), + .wr_count(w_count), + .wr_di(slice), + + .rd_clk(clk), + .rd_en(FifoEn), + .rd_empty(usrEmpty), + .rd_aempty(), + .rd_err (), + .rd_count(r_count), + .rd_do(r_data), + + .rst(rst), + + .prog_clko(prog_clko), + .prog_rxen(prog_rxen), + .prog_txen(prog_txen), + .prog_spien('0), + .prog_rdn(prog_rdn), + .prog_wrn(prog_wrn), + .prog_oen(prog_oen), + .prog_siwun(prog_siwun), + .prog_d(prog_d) +); // --------------- // Peripherals // --------------- @@ -1904,4 +2119,4 @@ axi_clock_converter_0 pcie_axi_clock_converter ( ); `endif -endmodule +endmodule \ No newline at end of file diff --git a/corev_apu/fpga/src/axi_dw_adapter/axi_dw_adapter_rd.v b/corev_apu/fpga/src/axi_dw_adapter/axi_dw_adapter_rd.v index 55afcfc584..dac48d9c20 100644 --- a/corev_apu/fpga/src/axi_dw_adapter/axi_dw_adapter_rd.v +++ b/corev_apu/fpga/src/axi_dw_adapter/axi_dw_adapter_rd.v @@ -135,12 +135,12 @@ parameter SEGMENT_STRB_WIDTH = STRB_WIDTH / SEGMENT_COUNT; // bus width assertions initial begin if (S_WORD_SIZE * S_STRB_WIDTH != S_DATA_WIDTH) begin - $error("Error: AXI slave interface data width not evenly divisble (instance %m)"); + $error("Error: AXI slave interface data width not evenly divisible (instance %m)"); $finish; end if (M_WORD_SIZE * M_STRB_WIDTH != M_DATA_WIDTH) begin - $error("Error: AXI master interface data width not evenly divisble (instance %m)"); + $error("Error: AXI master interface data width not evenly divisible (instance %m)"); $finish; end diff --git a/corev_apu/fpga/src/axi_dw_adapter/axi_dw_adapter_wr.v b/corev_apu/fpga/src/axi_dw_adapter/axi_dw_adapter_wr.v index 881495c706..98bc95aa8a 100644 --- a/corev_apu/fpga/src/axi_dw_adapter/axi_dw_adapter_wr.v +++ b/corev_apu/fpga/src/axi_dw_adapter/axi_dw_adapter_wr.v @@ -147,12 +147,12 @@ parameter SEGMENT_STRB_WIDTH = STRB_WIDTH / SEGMENT_COUNT; // bus width assertions initial begin if (S_WORD_SIZE * S_STRB_WIDTH != S_DATA_WIDTH) begin - $error("Error: AXI slave interface data width not evenly divisble (instance %m)"); + $error("Error: AXI slave interface data width not evenly divisible (instance %m)"); $finish; end if (M_WORD_SIZE * M_STRB_WIDTH != M_DATA_WIDTH) begin - $error("Error: AXI master interface data width not evenly divisble (instance %m)"); + $error("Error: AXI master interface data width not evenly divisible (instance %m)"); $finish; end diff --git a/corev_apu/fpga/src/bootrom/Makefile b/corev_apu/fpga/src/bootrom/Makefile index 81679948f2..e1fa839ae2 100644 --- a/corev_apu/fpga/src/bootrom/Makefile +++ b/corev_apu/fpga/src/bootrom/Makefile @@ -8,6 +8,13 @@ CLOCK_FREQUENCY ?= 25000000 #25MHz HALF_CLOCK_FREQUENCY ?= 12500000 #12.5MHz UART_BITRATE ?= 57600 HAS_ETHERNET ?= 0 +else ifeq ($(PLATFORM), PLAT_AGILEX) +DRAM_SIZE_64 ?= 0x40000000 #1GB +DRAM_SIZE_32 ?= 0x08000000 #128MB +CLOCK_FREQUENCY ?= 100000000 #100MHz +HALF_CLOCK_FREQUENCY ?= 50000000 #50MHz +UART_BITRATE ?= 115200 +HAS_ETHERNET ?= 1 else DRAM_SIZE_64 ?= 0x40000000 #1GB DRAM_SIZE_32 ?= 0x08000000 #128MB @@ -17,10 +24,12 @@ UART_BITRATE ?= 115200 HAS_ETHERNET ?= 1 endif -CC = $(RISCV)/bin/${CROSSCOMPILE}gcc -OBJCOPY = $(RISCV)/bin/$(CROSSCOMPILE)objcopy +ifeq ($(CC),cc) + CC = $(RISCV)/bin/${CROSSCOMPILE}gcc + OBJCOPY = $(RISCV)/bin/$(CROSSCOMPILE)objcopy +endif SED = sed -PLATFORM_DEFINES = -DCLOCK_FREQUENCY=$(CLOCK_FREQUENCY) -DUART_BITRATE=$(UART_BITRATE) -D$(PLATFORM) +PLATFORM_DEFINES = -DCLOCK_FREQUENCY=$(CLOCK_FREQUENCY) -DUART_BITRATE=$(UART_BITRATE) -D$(PLATFORM) -DXLEN=$(XLEN) ifeq ($(XLEN), 64) CFLAGS = $(PLATFORM_DEFINES) -Os -ggdb -march=rv64im_zicsr -mabi=lp64 -Wall -mcmodel=medany -mexplicit-relocs -ffreestanding @@ -33,7 +42,7 @@ LDFLAGS = -nostdlib -nodefaultlibs -nostartfiles INCLUDES = -I./ -I./src -SRCS_C = src/main.c src/uart.c src/spi.c src/sd.c src/gpt.c +SRCS_C = src/main.c src/uart.c src/spi.c src/sd.c src/gpt.c src/dw_mmc.c src/bouncebuf.c SRCS_ASM = startup.S OBJS_C = $(SRCS_C:.c=.o) OBJS_S = $(SRCS_ASM:.S=.o) @@ -43,7 +52,11 @@ MAIN_BIN = $(MAIN:.elf=.bin) MAIN_IMG = $(MAIN:.elf=.img) MAIN_SV = $(MAIN:.elf=.sv) +ifeq ($(PLATFORM), PLAT_AGILEX) +DTB = cv$(XLEN)a6_agilex.dtb +else DTB = cv$(XLEN)a6.dtb +endif ifeq ($(HAS_ETHERNET), 1) SED_DELETE_OPT = -e "/DELETE_ETH/d" @@ -65,12 +78,12 @@ $(MAIN): $(DTB) $(OBJS_C) $(OBJS_S) linker.lds $(OBJCOPY) -O binary $< $@ %.o: %.c - @$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ @echo "CC <= $<" + @$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ %.o: %.S - @$(CC) $(CFLAGS) $(CCASFLAGS) $(INCLUDES) -c $< -o $@ @echo "CC <= $<" + @$(CC) $(CFLAGS) $(CCASFLAGS) $(INCLUDES) -c $< -o $@ %.dts: %.dts.in $(SED) -e "s/DRAM_SIZE_64/$(DRAM_SIZE_64)/g" \ @@ -82,11 +95,11 @@ $(MAIN): $(DTB) $(OBJS_C) $(OBJS_S) linker.lds cat $@ %.dtb: %.dts - dtc -I dts $< -O dtb -o $@ + dtc -I dts $< -O dtb -o cv$(XLEN)a6.dtb %.sv: %.img - ./gen_rom.py $< @echo "PYTHON >= $(MAIN_SV)" + ./gen_rom.py $< clean: $(RM) $(OBJS_C) $(OBJS_S) $(MAIN) $(MAIN_BIN) $(MAIN_IMG) *.dtb *.dts *.sv diff --git a/corev_apu/fpga/src/bootrom/cv32a6.dts.in b/corev_apu/fpga/src/bootrom/cv32a6.dts.in index 314a7b069e..c607836128 100644 --- a/corev_apu/fpga/src/bootrom/cv32a6.dts.in +++ b/corev_apu/fpga/src/bootrom/cv32a6.dts.in @@ -64,7 +64,7 @@ }; // Specifying the interrupt controller in the devicetree is not necessary. // Furthermore, the IRQ 65535 will cause a `hwirq 0xffff is too large` during - // Linux boot (occured with mainline linux 5.14.0). + // Linux boot (occurred with mainline linux 5.14.0). // debug-controller@0 { // compatible = "riscv,debug-013"; // interrupts-extended = <&CPU0_intc 65535>; diff --git a/corev_apu/fpga/src/bootrom/cv32a6_agilex.dts.in b/corev_apu/fpga/src/bootrom/cv32a6_agilex.dts.in new file mode 100644 index 0000000000..d905323ff6 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/cv32a6_agilex.dts.in @@ -0,0 +1,101 @@ +// Copyright (c) 2025 PlanV Technologies +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + compatible = "eth,ariane-bare-dev"; + model = "eth,ariane-bare"; + chosen { + stdout-path = "/soc/uart@10000000:UART_BITRATE"; + }; + cpus { + #address-cells = <1>; + #size-cells = <0>; + timebase-frequency = ; + CPU0: cpu@0 { + clock-frequency = ; + device_type = "cpu"; + reg = <0>; + status = "okay"; + compatible = "eth, ariane", "riscv"; + riscv,isa = "rv32ima"; + mmu-type = "riscv,sv32"; + tlb-split; + // HLIC - hart local interrupt controller + CPU0_intc: interrupt-controller { + #interrupt-cells = <1>; + interrupt-controller; + compatible = "riscv,cpu-intc"; + }; + }; + }; + memory@80000000 { + device_type = "memory"; + reg = <0x80000000 DRAM_SIZE_32>; + }; + L26: soc { + #address-cells = <1>; + #size-cells = <1>; + compatible = "eth,ariane-bare-soc", "simple-bus"; + ranges; + clint@2000000 { + compatible = "riscv,clint0"; + interrupts-extended = <&CPU0_intc 3 &CPU0_intc 7>; + reg = <0x2000000 0xc0000>; + reg-names = "control"; + }; + PLIC0: interrupt-controller@c000000 { + #address-cells = <0>; + #interrupt-cells = <1>; + compatible = "riscv,plic0"; + interrupt-controller; + interrupts-extended = <&CPU0_intc 11 &CPU0_intc 9>; + reg = <0xc000000 0x4000000>; + riscv,max-priority = <7>; + riscv,ndev = <30>; + }; + // Specifying the interrupt controller in the devicetree is not necessary. + // Furthermore, the IRQ 65535 will cause a `hwirq 0xffff is too large` during + // Linux boot (occured with mainline linux 5.14.0). + // debug-controller@0 { + // compatible = "riscv,debug-013"; + // interrupts-extended = <&CPU0_intc 65535>; + // reg = <0x0 0x1000>; + // reg-names = "control"; + // }; + uart@10000000 { + compatible = "ns16550a"; + reg = < 0x10000000 0x1000>; + clock-frequency = ; + current-speed = ; + interrupt-parent = <&PLIC0>; + interrupts = <1>; + reg-shift = <0>; // regs are spaced on 32 bit boundary + reg-io-width = <1>; // only 32-bit access are supported + }; + timer@18000000 { + compatible = "pulp,apb_timer"; + interrupts = <0x00000004 0x00000005 0x00000006 0x00000007>; + reg = <0x18000000 0x00001000>; + interrupt-parent = <&PLIC0>; + reg-names = "control"; + }; + sysmgr: sysmgr@ffd12000 { + compatible = "altr,sys-mgr-s10","altr,sys-mgr"; + reg = <0xffd12000 0x500>; + }; + mmc: mmc@ff808000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "altr,socfpga-dw-mshc"; + reg = <0xff808000 0x1000>; + fifo-depth = <0x400>; + altr,sysmgr-syscon = <&sysmgr 0x28 4>; + status = "disabled"; + }; + }; +}; +// delete ethernet device if disabled +/delete-node/ ð // DELETE_ETH diff --git a/corev_apu/fpga/src/bootrom/cv64a6.dts.in b/corev_apu/fpga/src/bootrom/cv64a6.dts.in index eb8134d78d..6f0095ae27 100644 --- a/corev_apu/fpga/src/bootrom/cv64a6.dts.in +++ b/corev_apu/fpga/src/bootrom/cv64a6.dts.in @@ -64,7 +64,7 @@ }; // Specifying the interrupt controller in the devicetree is not necessary. // Furthermore, the IRQ 65535 will cause a `hwirq 0xffff is too large` during - // Linux boot (occured with mainline linux 5.14.0). + // Linux boot (occurred with mainline linux 5.14.0). // debug-controller@0 { // compatible = "riscv,debug-013"; // interrupts-extended = <&CPU0_intc 65535>; diff --git a/corev_apu/fpga/src/bootrom/cv64a6_agilex.dts.in b/corev_apu/fpga/src/bootrom/cv64a6_agilex.dts.in new file mode 100644 index 0000000000..4968db46e5 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/cv64a6_agilex.dts.in @@ -0,0 +1,103 @@ +// Copyright (c) 2025 PlanV Technologies +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +/dts-v1/; + +/ { + #address-cells = <2>; + #size-cells = <2>; + compatible = "eth,ariane-bare-dev"; + model = "eth,ariane-bare"; + chosen { + stdout-path = "/soc/uart@10000000:UART_BITRATE"; + }; + cpus { + #address-cells = <1>; + #size-cells = <0>; + timebase-frequency = ; + CPU0: cpu@0 { + clock-frequency = ; + device_type = "cpu"; + reg = <0>; + status = "okay"; + compatible = "eth, ariane", "riscv"; + riscv,isa = "rv64imafdc"; + mmu-type = "riscv,sv39"; + tlb-split; + // HLIC - hart local interrupt controller + CPU0_intc: interrupt-controller { + #interrupt-cells = <1>; + interrupt-controller; + compatible = "riscv,cpu-intc"; + }; + }; + }; + memory@80000000 { + device_type = "memory"; + reg = <0x0 0x80000000 0x0 DRAM_SIZE_64>; + }; + L26: soc { + #address-cells = <2>; + #size-cells = <2>; + compatible = "eth,ariane-bare-soc", "simple-bus"; + ranges; + clint@2000000 { + compatible = "riscv,clint0"; + interrupts-extended = <&CPU0_intc 3 &CPU0_intc 7>; + reg = <0x0 0x2000000 0x0 0xc0000>; + reg-names = "control"; + }; + PLIC0: interrupt-controller@c000000 { + #address-cells = <0>; + #interrupt-cells = <1>; + compatible = "riscv,plic0"; + interrupt-controller; + interrupts-extended = <&CPU0_intc 11 &CPU0_intc 9>; + reg = <0x0 0xc000000 0x0 0x4000000>; + riscv,max-priority = <7>; + riscv,ndev = <30>; + }; + // Specifying the interrupt controller in the devicetree is not necessary. + // Furthermore, the IRQ 65535 will cause a `hwirq 0xffff is too large` during + // Linux boot (occured with mainline linux 5.14.0). + // debug-controller@0 { + // compatible = "riscv,debug-013"; + // interrupts-extended = <&CPU0_intc 65535>; + // reg = <0x0 0x0 0x0 0x1000>; + // reg-names = "control"; + // }; + uart@10000000 { + compatible = "ns16550a"; + reg = <0x0 0x10000000 0x0 0x1000>; + clock-frequency = ; + current-speed = ; + interrupt-parent = <&PLIC0>; + interrupts = <1>; + reg-shift = <0>; // regs are spaced on 32 bit boundary + reg-io-width = <1>; // only 32-bit access are supported + }; + timer@18000000 { + compatible = "pulp,apb_timer"; + interrupts = <0x00000004 0x00000005 0x00000006 0x00000007>; + reg = <0x00000000 0x18000000 0x00000000 0x00001000>; + interrupt-parent = <&PLIC0>; + reg-names = "control"; + }; + sysmgr: sysmgr@ffd12000 { + compatible = "altr,sys-mgr-s10","altr,sys-mgr"; + reg = <0xffd12000 0x500>; + }; + mmc: mmc@ff808000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "altr,socfpga-dw-mshc"; + reg = <0xff808000 0x1000>; + fifo-depth = <0x400>; + altr,sysmgr-syscon = <&sysmgr 0x28 4>; + status = "disabled"; + }; + + + }; +}; +// delete ethernet device if disabled +/delete-node/ ð // DELETE_ETH diff --git a/corev_apu/fpga/src/bootrom/src/bootrom_errno.h b/corev_apu/fpga/src/bootrom/src/bootrom_errno.h new file mode 100644 index 0000000000..4c04274a69 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/bootrom_errno.h @@ -0,0 +1,25 @@ +// Copyright (c) 2025 Thales Research and Technology +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +/** + * \file bootrom_errno.h + * \brief Contains error numbers useful for our bootrom. + * \author Julien Mallet +*/ + +#ifndef BOOTROM_ERRNO_H +#define BOOTROM_ERRNO_H + + +#define EIO 5 /* I/O error */ +#define EBUSY 16 /* Device or resource busy */ +#define EINVAL 22 /* Invalid argument */ +#define ECOMM 70 /* Communication error on send */ +#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define ETIMEDOUT 110 /* Connection timed out */ + +#define ENOTSUPP 255 /* Operation is not supported */ + +#ifndef ENOMEM +#define ENOMEM 12 +#endif +#endif \ No newline at end of file diff --git a/corev_apu/fpga/src/bootrom/src/bootrom_io.h b/corev_apu/fpga/src/bootrom/src/bootrom_io.h new file mode 100644 index 0000000000..5c4a079820 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/bootrom_io.h @@ -0,0 +1,50 @@ +// Copyright (c) 2025 Thales Research and Technology +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +/** + * \file bootrom_io.h + * \brief Contains the functions for reading and writing registers. + * \author Julien Mallet +*/ + +#ifndef BOOTROM_IO_H +#define BOOTROM_IO_H + +// Generic I/O + +#include "bootrom_types.h" +#include + + +static inline u8_t readb(volatile u32_t addr) +{ + return *(volatile u8_t *)(addr); +} + +static inline u16_t readw(volatile u32_t addr) +{ + return *(volatile u16_t *)(addr); +} + +static inline u32_t readl(volatile u32_t addr) +{ + return *(volatile u32_t *)(addr); +} + + +static inline void writeb(u8_t val, volatile u32_t addr) +{ + *(volatile u8_t *)(addr) = val; +} + +static inline void writew(u16_t val, volatile u32_t addr) +{ + *(volatile u16_t *)(addr) = val; +} + +static inline void writel(u32_t val, volatile u32_t addr) +{ + *(volatile u32_t *)(addr) = val; +} + + +#endif \ No newline at end of file diff --git a/corev_apu/fpga/src/bootrom/src/bootrom_time.h b/corev_apu/fpga/src/bootrom/src/bootrom_time.h new file mode 100644 index 0000000000..94f1b2d43d --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/bootrom_time.h @@ -0,0 +1,24 @@ +// Copyright (c) 2025 Thales Research and Technology +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +/** + * \file bootrom_time.h + * \brief Contains a custom udelay function. It is a software wait with a loop that does not uses any hardware timer or any pre-existing timer. As such, the duration is not accurate at all. udelay(5) will not be a 5 microsecond wait. This solution is however good enough for our bootrom as it keeps the code small and still does a decent wait. + * \author Julien Mallet +*/ + +#ifndef BOOTROM_TIME_H +#define BOOTROM_TIME_H + +#include "bootrom_types.h" + +// #define UDELAY(nr_us) for(volatile unsigned int count=0 ; count<50*nr_us ; count++){} + +void udelay(u32_t nr_us) +{ + volatile u32_t count = 0; + for(count = 0 ; count < 1*nr_us; ++count) + {} +} + + +#endif \ No newline at end of file diff --git a/corev_apu/fpga/src/bootrom/src/bootrom_types.h b/corev_apu/fpga/src/bootrom/src/bootrom_types.h new file mode 100644 index 0000000000..cf62caaedc --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/bootrom_types.h @@ -0,0 +1,29 @@ +// Copyright (c) 2025 Thales Research and Technology +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +/** + * \file bootrom_types.h + * \brief Contains custom types which show their size. + * \author Julien Mallet + * +*/ + +#ifndef BOOTROM_TYPES_H +#define BOOTROM_TYPES_H + + +typedef __signed__ char s8_t; +typedef unsigned char u8_t; + +typedef __signed__ short s16_t; +typedef unsigned short u16_t; + +typedef __signed__ int s32_t; +typedef unsigned int u32_t; + +typedef __signed__ long long s64_t; +typedef unsigned long long u64_t; + +typedef unsigned long int uptr_t; + + +#endif \ No newline at end of file diff --git a/corev_apu/fpga/src/bootrom/src/bouncebuf.c b/corev_apu/fpga/src/bootrom/src/bouncebuf.c new file mode 100644 index 0000000000..1eda2edc08 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/bouncebuf.c @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Generic bounce buffer implementation + * + * Copyright (C) 2012 Marek Vasut + */ + +// #include +// #include +// #include +// #include +// #include +#include "bouncebuf.h" +#include "cache.h" +#include "dma-mapping.h" +#include "uart.h" +#include "bootrom_errno.h" +#include + +// void flush_dcache_range(unsigned long start, unsigned long end) +// { +// if (start >= end) +// return; + +// /* +// * ARCv1 -> call __dc_line_op +// * ARCv2 && L1 D$ disabled -> nothing +// * ARCv2 && L1 D$ enabled && IOC enabled -> nothing +// * ARCv2 && L1 D$ enabled && no IOC -> call __dc_line_op; call __slc_rgn_op +// */ +// // if (!_config_enabled(CONFIG_ISA_ARCV2,0)|| !ioc_enabled()) +// __dc_line_op(start, end - start, OP_FLUSH); + +// // if (_config_enabled(CONFIG_ISA_ARCV2,0) && !ioc_enabled() && !slc_data_bypass()) +// // __slc_rgn_op(start, end - start, OP_FLUSH); +// } + +static int addr_aligned(struct bounce_buffer *state) +{ + const unsigned long align_mask = ARCH_DMA_MINALIGN - 1; + + /* Check if start is aligned */ + if ((unsigned long)state->user_buffer & align_mask) { + print_uart("Unaligned buffer address "); + print_uart_int(state->user_buffer); + print_uart("align mask"); + print_uart_int(align_mask); + print_uart("(unsigned long)state->user_buffer & align_mask"); + print_uart_int((unsigned long)state->user_buffer & align_mask); + print_uart("\n"); + return 0; + } + + /* Check if length is aligned */ + if (state->len != state->len_aligned) { + print_uart("Unaligned buffer length"); + print_uart_int(state->len); + print_uart("\n"); + return 0; + } + + /* Aligned */ + return 1; +} + +int bounce_buffer_start_extalign(struct bounce_buffer *state, void *data, + u32_t len, unsigned int flags, + u32_t alignment, + int (*addr_is_aligned)(struct bounce_buffer *state)) +{ + state->user_buffer = data; + state->bounce_buffer = data; + state->len = len; + state->len_aligned = roundup(len, alignment); + state->flags = flags; + + // if (!addr_is_aligned(state)) { + // print_uart("call mem align \n"); + // state->bounce_buffer = memalign(alignment, + // state->len_aligned); + // if (!state->bounce_buffer){ + // print_uart("return enomem \n"); + // return -ENOMEM; + // } + + // if (state->flags & GEN_BB_READ){ + // print_uart("memcpy \n"); + // memcpy(state->bounce_buffer, state->user_buffer, + // state->len); + // } + // } + + /* + * Flush data to RAM so DMA reads can pick it up, + * and any CPU writebacks don't race with DMA writes + */ + print_uart("dma map single\n"); + dma_map_single(state->bounce_buffer, + state->len_aligned, + DMA_BIDIRECTIONAL); + print_uart("return 0\n"); + return 0; +} + +int bounce_buffer_start(struct bounce_buffer *state, void *data, + u32_t len, unsigned int flags) +{ + return bounce_buffer_start_extalign(state, data, len, flags, + ARCH_DMA_MINALIGN, + addr_aligned); +} + +int bounce_buffer_stop(struct bounce_buffer *state) +{ + if (state->flags & GEN_BB_WRITE) { + /* Invalidate cache so that CPU can see any newly DMA'd data */ + dma_unmap_single((dma_addr_t)(uintptr_t)state->bounce_buffer, + state->len_aligned, + DMA_BIDIRECTIONAL); + } + + if (state->bounce_buffer == state->user_buffer) + return 0; + + // if (state->flags & GEN_BB_WRITE) + // memcpy(state->user_buffer, state->bounce_buffer, state->len); + + // free(state->bounce_buffer); + + return 0; +} diff --git a/corev_apu/fpga/src/bootrom/src/bouncebuf.h b/corev_apu/fpga/src/bootrom/src/bouncebuf.h new file mode 100644 index 0000000000..6ff99e6809 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/bouncebuf.h @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Generic bounce buffer implementation + * + * Copyright (C) 2012 Marek Vasut + */ + +#ifndef __INCLUDE_BOUNCEBUF_H__ +#define __INCLUDE_BOUNCEBUF_H__ + +#include "bootrom_types.h" + +/* + * GEN_BB_READ -- Data are read from the buffer eg. by DMA hardware. + * The source buffer is copied into the bounce buffer (if unaligned, otherwise + * the source buffer is used directly) upon start() call, then the operation + * requiring the aligned transfer happens, then the bounce buffer is lost upon + * stop() call. + */ +#define GEN_BB_READ (1 << 0) +/* + * GEN_BB_WRITE -- Data are written into the buffer eg. by DMA hardware. + * The source buffer starts in an undefined state upon start() call, then the + * operation requiring the aligned transfer happens, then the bounce buffer is + * copied into the destination buffer (if unaligned, otherwise destination + * buffer is used directly) upon stop() call. + */ +#define GEN_BB_WRITE (1 << 1) +/* + * GEN_BB_RW -- Data are read and written into the buffer eg. by DMA hardware. + * The source buffer is copied into the bounce buffer (if unaligned, otherwise + * the source buffer is used directly) upon start() call, then the operation + * requiring the aligned transfer happens, then the bounce buffer is copied + * into the destination buffer (if unaligned, otherwise destination buffer is + * used directly) upon stop() call. + */ +#define GEN_BB_RW (GEN_BB_READ | GEN_BB_WRITE) +// #define u32_t u32_t + +struct bounce_buffer { + /* Copy of data parameter passed to start() */ + void *user_buffer; + /* + * DMA-aligned buffer. This field is always set to the value that + * should be used for DMA; either equal to .user_buffer, or to a + * freshly allocated aligned buffer. + */ + void *bounce_buffer; + /* Copy of len parameter passed to start() */ + u32_t len; + /* DMA-aligned buffer length */ + u32_t len_aligned; + /* Copy of flags parameter passed to start() */ + unsigned int flags; +}; + +/** + * bounce_buffer_start() -- Start the bounce buffer session + * state: stores state passed between bounce_buffer_{start,stop} + * data: pointer to buffer to be aligned + * len: length of the buffer + * flags: flags describing the transaction, see above. + */ +int bounce_buffer_start(struct bounce_buffer *state, void *data, + u32_t len, unsigned int flags); + +/** + * bounce_buffer_start() -- Start the bounce buffer session with external align check function + * state: stores state passed between bounce_buffer_{start,stop} + * data: pointer to buffer to be aligned + * len: length of the buffer + * flags: flags describing the transaction, see above. + * alignment: alignment of the newly allocated bounce buffer + * addr_is_aligned: function for checking the alignment instead of the default one + */ +int bounce_buffer_start_extalign(struct bounce_buffer *state, void *data, + u32_t len, unsigned int flags, + u32_t alignment, + int (*addr_is_aligned)(struct bounce_buffer *state)); + +/** + * bounce_buffer_stop() -- Finish the bounce buffer session + * state: stores state passed between bounce_buffer_{start,stop} + */ +int bounce_buffer_stop(struct bounce_buffer *state); + +#endif diff --git a/corev_apu/fpga/src/bootrom/src/cache.h b/corev_apu/fpga/src/bootrom/src/cache.h new file mode 100644 index 0000000000..c174fdef34 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/cache.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2017 Andes Technology Corporation + * Rick Chen, Andes Technology Corporation + */ + +#ifndef _ASM_RISCV_CACHE_H +#define _ASM_RISCV_CACHE_H + +/* cache */ +void cache_flush(void); + +/* + * The current upper bound for RISCV L1 data cache line sizes is 32 bytes. + * We use that value for aligning DMA buffers unless the board config has + * specified an alternate cache line size. + */ +#ifdef CONFIG_SYS_CACHELINE_SIZE +#define ARCH_DMA_MINALIGN CONFIG_SYS_CACHELINE_SIZE +#else +#define ARCH_DMA_MINALIGN 64 +#endif + +#endif /* _ASM_RISCV_CACHE_H */ diff --git a/corev_apu/fpga/src/bootrom/src/dma-mapping.h b/corev_apu/fpga/src/bootrom/src/dma-mapping.h new file mode 100644 index 0000000000..6c6d9ba17e --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/dma-mapping.h @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_DMA_MAPPING_H +#define _LINUX_DMA_MAPPING_H + +// #include +// #include +#include "bootrom_types.h" +#include "memalign.h" +#include "cache.h" +// #include +// #include +#ifndef _LINUX_DMA_DIRECTION_H +#define _LINUX_DMA_DIRECTION_H +/* + * These definitions mirror those in pci.h, so they can be used + * interchangeably with their PCI_ counterparts. + */ +enum dma_data_direction { + DMA_BIDIRECTIONAL = 0, + DMA_TO_DEVICE = 1, + DMA_FROM_DEVICE = 2, + DMA_NONE = 3, +}; +#endif + +#define dma_mapping_error(x, y) 0 + +/** + * Map a buffer to make it available to the DMA device + * + * Linux-like DMA API that is intended to be used from drivers. This hides the + * underlying cache operation from drivers. Call this before starting the DMA + * transfer. In most of architectures in U-Boot, the virtual address matches to + * the physical address (but we have exceptions like sandbox). U-Boot does not + * support iommu at the driver level, so it also matches to the DMA address. + * Hence, this helper currently just performs the cache operation, then returns + * straight-mapped dma_address, which is intended to be set to the register of + * the DMA device. + * + * @vaddr: address of the buffer + * @len: length of the buffer + * @dir: the direction of DMA + */ +typedef u64_t dma_addr_t; + +void enable_caches(void); +void flush_cache(unsigned long addr, unsigned long size); +void flush_dcache_all(void); +void flush_dcache_range(unsigned long start, unsigned long stop); +void invalidate_dcache_range(unsigned long start, unsigned long stop); +void invalidate_dcache_all(void); +void invalidate_icache_all(void); + +static inline dma_addr_t dma_map_single(void *vaddr, size_t len, + enum dma_data_direction dir) +{ + unsigned long addr = (unsigned long)vaddr; + + len = ALIGN(len, ARCH_DMA_MINALIGN); + + // if (dir == DMA_FROM_DEVICE) + // invalidate_dcache_range(addr, addr + len); + // else + // flush_dcache_range(addr, addr + len); + + return addr; +} + +/** + * Unmap a buffer to make it available to CPU + * + * Linux-like DMA API that is intended to be used from drivers. This hides the + * underlying cache operation from drivers. Call this after finishin the DMA + * transfer. + * + * @addr: DMA address + * @len: length of the buffer + * @dir: the direction of DMA + */ +static inline void dma_unmap_single(dma_addr_t addr, size_t len, + enum dma_data_direction dir) +{ + len = ALIGN(len, ARCH_DMA_MINALIGN); + + // if (dir != DMA_TO_DEVICE) + // invalidate_dcache_range(addr, addr + len); +} + +#endif diff --git a/corev_apu/fpga/src/bootrom/src/dw_mmc.c b/corev_apu/fpga/src/bootrom/src/dw_mmc.c new file mode 100644 index 0000000000..baf157575a --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/dw_mmc.c @@ -0,0 +1,527 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2012 SAMSUNG Electronics + * Jaehoon Chung + * Rajeshawari Shinde + */ + + + +#include "bootrom_time.h" +#include "uart.h" +#include "dwmmc.h" +#include "cache.h" +#include "bouncebuf.h" +#include "memalign.h" +// #include "wait_bit.h" + +#define PAGE_SIZE 4096 +#define FIFO_MODE 1 + +void write_print(u32_t print,u32_t address, u32_t val){ + writel(val,MMC_BASE_ADDR+address); + if (print){ + print_uart("WRITE L ADDR: "); + print_uart_int(MMC_BASE_ADDR+address); + print_uart(" DATA: "); + print_uart_int(val); + print_uart( "\n"); + } + + if(MMC_BASE_ADDR+address == 0x80000000UL){ + + print_uart("WRITING TO FIRST ADDRESS: "); + print_uart("WRITE L ADDR: "); + print_uart_int(MMC_BASE_ADDR+address); + print_uart(" DATA: "); + print_uart_int(val); + print_uart( "\n"); + } + +} + +u32_t read_print(u32_t print, u32_t address){ + u32_t val = readl(MMC_BASE_ADDR+address); + if (print){ + print_uart("READ L ADDR: "); + print_uart_int(MMC_BASE_ADDR+address); + print_uart("DATA: "); + print_uart_int(val); + print_uart( "\n"); + } + return val; +} +static int dwmci_wait_reset(u32_t value) +{ + unsigned long timeout = 1000; + u32_t ctrl; + + write_print(0, DWMCI_CTRL, value); + + while (timeout--) { + ctrl = read_print(0, DWMCI_CTRL); + if (!(ctrl & DWMCI_RESET_ALL)) + return 1; + } + return 0; +} + +static void dwmci_set_idma_desc(struct dwmci_idmac *idmac, + u32_t desc0, u32_t desc1, u32_t desc2) +{ + struct dwmci_idmac *desc = idmac; + + desc->flags = desc0; + desc->cnt = desc1; + desc->addr = desc2; + desc->next_addr = (unsigned long)desc + sizeof(struct dwmci_idmac); + print_uart("descriptor pointer address: "); + print_uart_int(desc); + print_uart("set descriptor: flags "); + print_uart_int(desc->flags); + print_uart(" cnt "); + print_uart_int(desc->cnt); + print_uart(" addr "); + print_uart_int(desc->addr); + print_uart(" next_addr "); + print_uart_int(desc->next_addr); + print_uart("\n"); +} + +static void dwmci_prepare_data(struct mmc_data *data, + struct dwmci_idmac *cur_idmac, + void *bounce_buffer) +{ + unsigned long ctrl; + unsigned int i = 0, flags, cnt, blk_cnt; + unsigned long data_start, data_end; + + + blk_cnt = data->blocks; + + dwmci_wait_reset(DWMCI_CTRL_FIFO_RESET); + + /* Clear IDMAC interrupt */ + write_print(0, DWMCI_IDSTS, 0xFFFFFFFF); + + data_start = (unsigned long)cur_idmac; + write_print(0, DWMCI_DBADDR, (unsigned long)cur_idmac); + + do { + flags = DWMCI_IDMAC_OWN | DWMCI_IDMAC_CH ; + flags |= (i == 0) ? DWMCI_IDMAC_FS : 0; + if (blk_cnt <= 8) { + flags |= DWMCI_IDMAC_LD; + cnt = data->blocksize * blk_cnt; + } else + cnt = data->blocksize * 8; + + dwmci_set_idma_desc(cur_idmac, flags, cnt, + (unsigned long)bounce_buffer + (i * PAGE_SIZE)); + + cur_idmac++; + if (blk_cnt <= 8) + break; + blk_cnt -= 8; + i++; + } while(1); + + print_uart("prepare data, skipping flush! \n"); + // data_end = (unsigned long)cur_idmac; + // flush_dcache_range(data_start, roundup(data_end, ARCH_DMA_MINALIGN)); + + ctrl = read_print(1, DWMCI_CTRL); + ctrl |= DWMCI_IDMAC_EN | DWMCI_DMA_EN; + write_print(0, DWMCI_CTRL, ctrl); + + ctrl = read_print(1, DWMCI_BMOD); + ctrl |= DWMCI_BMOD_IDMAC_FB | DWMCI_BMOD_IDMAC_EN; + write_print(0, DWMCI_BMOD, ctrl); + + write_print(0, DWMCI_BLKSIZ, data->blocksize); + write_print(0, DWMCI_BYTCNT, data->blocksize * data->blocks); +} + +static int dwmci_fifo_ready(u32_t bit, u32_t *len) +{ + u32_t timeout = 20000; + // print_uart(" fifo ready get len: "); + *len = read_print(0, DWMCI_STATUS); + while (--timeout && (*len & bit)) { + udelay(200); + print_uart(" fifo ready get len inside while : "); + *len = read_print(1, DWMCI_STATUS); + } + + if (!timeout) { + print_uart("FIFO underflow timeout\n"); + return -ETIMEDOUT; + } + + return 0; +} + + +static int dwmci_data_transfer(struct mmc_data *data) +{ + int ret = 0; + u32_t timeout, mask, size, i, len = 0; + u32_t *buf = NULL; + // unsigned long start = get_timer(0); + // u32_t fifo_depth = (((host->fifoth_val & RX_WMARK_MASK) >> + // RX_WMARK_SHIFT) + 1) * 2; + + size = data->blocksize * data->blocks; + // if (data->flags == MMC_DATA_READ) + buf = (unsigned int *)data->dest; + // else + // buf = (unsigned int *)data->src; + + timeout = 1000000; + + size /= 4; + read_print(0,DWMCI_STATUS); + for (;;) { + mask = read_print(0, DWMCI_RINTSTS); + int val = read_print(0,DWMCI_STATUS); + // if(val & 0x4) + // print_uart("FIFO empty \n"); + /* Error during data transfer. */ + if (mask & (DWMCI_DATA_ERR | DWMCI_DATA_TOUT)) { + print_uart("DATA ERROR!\n"); + ret = -EINVAL; + return ret; + } + + + + if (FIFO_MODE && size!=0) { + // print_uart("FIFO_MODE && size \n"); + len = 0; + if (data->flags == MMC_DATA_READ && + (mask & (DWMCI_INTMSK_RXDR | DWMCI_INTMSK_DTO))) { + write_print(0, DWMCI_RINTSTS, + mask & (DWMCI_INTMSK_RXDR | + DWMCI_INTMSK_DTO)); + while (size) { + ret = dwmci_fifo_ready( DWMCI_FIFO_EMPTY, + &len); + if (ret < 0) + break; + + len = (len >> DWMCI_FIFO_SHIFT) & + DWMCI_FIFO_MASK; + len = min(size, len); + // print_uart("actually reading! to "); + // print_uart_int(buf); + // print_uart("\n"); + + // print_uart("size "); + // print_uart_int(size); + // print_uart("\n"); + + // print_uart("len "); + // print_uart_int(len); + // print_uart("\n"); + + for (i = 0; i < len; i++) + *buf++ = + read_print(0, DWMCI_DATA); + size = size > len ? (size - len) : 0; + } + } // else if (data->flags == MMC_DATA_WRITE && + // (mask & DWMCI_INTMSK_TXDR)) { + // while (size) { + // ret = dwmci_fifo_ready(host, + // DWMCI_FIFO_FULL, + // &len); + // if (ret < 0) + // break; + + // len = fifo_depth - ((len >> + // DWMCI_FIFO_SHIFT) & + // DWMCI_FIFO_MASK); + // len = min(size, len); + // for (i = 0; i < len; i++) + // write_print(0, DWMCI_DATA, + // *buf++); + // size = size > len ? (size - len) : 0; + // } + // write_print(0, DWMCI_RINTSTS, + // DWMCI_INTMSK_TXDR); + // } + } + + /* Data arrived correctly. */ + if (mask & DWMCI_INTMSK_DTO) { + ret = 0; + break; + } + + /* Check for timeout. */ + if (timeout-- > 0) { + udelay(10); + } + else { + read_print(1,DWMCI_STATUS); + print_uart("Timeout waiting for data!\n"); + ret = -ETIMEDOUT; + break; + } + } + + write_print(0, DWMCI_RINTSTS, mask); + + return ret; +} + +static int dwmci_set_transfer_mode() +{ + unsigned long mode; + + mode = DWMCI_CMD_DATA_EXP; + // if (data->flags & MMC_DATA_WRITE) + // mode |= DWMCI_CMD_RW; + + return mode; +} + + +static int dwmci_send_cmd(struct mmc_cmd *cmd, + struct mmc_data *data) +{ + + struct dwmci_idmac *cur_idmac = (struct dwmci_idmac *) (0xFFE30000); + + // ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac, + // data ? DIV_ROUND_UP(data->blocks, 8) : 0); + int ret = 0, flags = 0, i; + unsigned int timeout = 500; + u32_t retry = 100000; + u32_t mask, ctrl,reg; + // unsigned long start = get_timer(0); + struct bounce_buffer bbstate; + + while (read_print(0, DWMCI_STATUS) & DWMCI_BUSY) { + if (timeout-- > 0) + { + udelay(10); + } + else { + read_print(1, DWMCI_STATUS); + print_uart("Timeout on data busy, continue anyway\n"); + break; + } + } + + write_print(0, DWMCI_RINTSTS, DWMCI_INTMSK_ALL); + + if (data) { + if (FIFO_MODE) { + write_print(0, DWMCI_BLKSIZ, data->blocksize); + write_print(0, DWMCI_BYTCNT, + data->blocksize * data->blocks); + dwmci_wait_reset(DWMCI_CTRL_FIFO_RESET); + } else { + // if (data->flags == MMC_DATA_READ) { + ret = bounce_buffer_start(&bbstate, + (void*)data->dest, + data->blocksize * + data->blocks, GEN_BB_WRITE); + // } else { + // ret = bounce_buffer_start(&bbstate, + // (void*)data->src, + // data->blocksize * + // data->blocks, GEN_BB_READ); + // } + + if (ret) + return ret; + + dwmci_prepare_data(data, cur_idmac, + bbstate.bounce_buffer); + } + } + + write_print(0, DWMCI_CMDARG, cmd->cmdarg); + + if (data) + flags = dwmci_set_transfer_mode(); + + if ((cmd->resp_type & MMC_RSP_136) && (cmd->resp_type & MMC_RSP_BUSY)) + return -EBUSY; + + if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION) + flags |= DWMCI_CMD_ABORT_STOP; + else + flags |= DWMCI_CMD_PRV_DAT_WAIT; + + if (cmd->resp_type & MMC_RSP_PRESENT) { + flags |= DWMCI_CMD_RESP_EXP; + if (cmd->resp_type & MMC_RSP_136) + flags |= DWMCI_CMD_RESP_LENGTH; + } + + if (cmd->resp_type & MMC_RSP_CRC) + flags |= DWMCI_CMD_CHECK_CRC; + + flags |= (cmd->cmdidx | DWMCI_CMD_START | DWMCI_CMD_USE_HOLD_REG); + + // print_uart("Sending CMD\n"); + + write_print(0, DWMCI_CMD, flags); + + for (i = 0; i < retry; i++) { + mask = read_print(0, DWMCI_RINTSTS); + if (mask & DWMCI_INTMSK_CDONE) { + if (!data) + write_print(0, DWMCI_RINTSTS, mask); + break; + } + } + + if (i == retry) { + print_uart("Timeout. RINTSTS: "); + print_uart_int(mask); + print_uart("\n"); + + return -ETIMEDOUT; + } + + if (mask & DWMCI_INTMSK_RTO) { + /* + * Timeout here is not necessarily fatal. (e)MMC cards + * will splat here when they receive CMD55 as they do + * not support this command and that is exactly the way + * to tell them apart from SD cards. Thus, this output + * below shall be debug(). eMMC cards also do not favor + * CMD8, please keep that in mind. + */ + print_uart("Response Timeout.\n"); + return -ETIMEDOUT; + } else if (mask & DWMCI_INTMSK_RE) { + print_uart("Response Error.\n"); + return -EIO; + } else if ((cmd->resp_type & MMC_RSP_CRC) && + (mask & DWMCI_INTMSK_RCRC)) { + print_uart("Response CRC Error.\n"); + return -EIO; + } + + + if (cmd->resp_type & MMC_RSP_PRESENT) { + if (cmd->resp_type & MMC_RSP_136) { + cmd->response[0] = read_print(0, DWMCI_RESP3); + cmd->response[1] = read_print(0, DWMCI_RESP2); + cmd->response[2] = read_print(0, DWMCI_RESP1); + cmd->response[3] = read_print(0, DWMCI_RESP0); + } else { + cmd->response[0] = read_print(0, DWMCI_RESP0); + } + } + + if (data) { + ret = dwmci_data_transfer(data); + + /* only dma mode need it */ + if (!FIFO_MODE) { + // if (data->flags == MMC_DATA_READ) + mask = DWMCI_IDINTEN_RI; + // else + // mask = DWMCI_IDINTEN_TI; + + timeout = 1000; + ret = 1; + + while(timeout-- > 0){ + reg = read_print(0,DWMCI_IDSTS); + if ((reg & mask) == mask){ + ret = 0; + break; + } + + udelay(10); + } + // ret = wait_for_bit_le32(MMC_BASE_ADDR + DWMCI_IDSTS, + // mask, true, 1000, false); + if (ret){ + print_uart_int(reg); + print_uart(" DWMCI_IDINTEN mask timeout.\n"); + return ret; + } + /* clear interrupts */ + write_print(0, DWMCI_IDSTS, DWMCI_IDINTEN_MASK); + + ctrl = read_print(1, DWMCI_CTRL); + ctrl &= ~(DWMCI_DMA_EN); + write_print(0, DWMCI_CTRL, ctrl); + bounce_buffer_stop(&bbstate); + } + } + + udelay(100); + + return ret; +} + + +// Set the number of block to read from the SD card. +static u8_t set_block_count(u32_t blkcnt) +{ + u8_t err = 0; + struct mmc_cmd cmd23; + + cmd23.cmdidx = MMC_CMD_SET_BLOCK_COUNT; + cmd23.cmdarg = blkcnt; + cmd23.resp_type = MMC_RSP_R1; + + // mmc_trace_before_send(&cmd23); + err = dwmci_send_cmd(&cmd23, NULL); + // mmc_trace_after_send(&cmd23, err); + + return err; +} + + +// Copies the data blocks from the SD card to dst by sending the read command. The blkcnt argument type is u64_t because lbas are 64 bits integer in the gpt format. But the block size argument of the read command is a u32_t. Since blkcnt is the result of the subtraction between two lbas and given the size of the linux image, we assume blkcnt will NEVER be above the maximum value of a u32_t. We can then safely cast blkcnt from u64_t to u32_t. +u8_t sd_copy_mmc(void *dst, u64_t src_lba, u64_t blkcnt) +{ + u8_t err = 0; + + struct mmc_cmd cmd18; + struct mmc_data data; + + if (blkcnt > 1) + { + err = set_block_count(blkcnt); + if (err) + return err; + cmd18.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK; + } + else + cmd18.cmdidx = MMC_CMD_READ_SINGLE_BLOCK; + + /* + We assume the card is high capacity as all SD Card today are. + The check of the SD card high capacity property is done during "Send Operating Condition Command (ACMD41)" in the OCR register. + */ + // if (g_dwc_mshc->high_capacity) + cmd18.cmdarg = src_lba; + // else + // cmd18.cmdarg = src_lba * g_dwc_mshc->read_bl_len; + + cmd18.resp_type = MMC_RSP_R1; + + data.dest = dst; + // The blkcnt argument type is u64_t because lbas are 64 bits integer in the gpt format. But the block size argument of the read command is a u32_t. Since blkcnt is the result of the subtraction between two lbas and given the size of the linux image, we assume blkcnt will NEVER be above the maximum value of a u32_t. We can then safely cast blkcnt from u64_t to u32_t. + data.blocks = (u32_t) blkcnt; + data.blocksize = 0x200; // blocksize is 512 by default + data.flags = MMC_DATA_READ; + + // mmc_trace_before_send(&cmd18); + err = dwmci_send_cmd(&cmd18, &data); + // mmc_trace_after_send(&cmd18, err); + + return err; +} + diff --git a/corev_apu/fpga/src/bootrom/src/dwmmc.h b/corev_apu/fpga/src/bootrom/src/dwmmc.h new file mode 100644 index 0000000000..3d6acab507 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/dwmmc.h @@ -0,0 +1,320 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * (C) Copyright 2012 SAMSUNG Electronics + * Jaehoon Chung + */ + +#ifndef __DWMMC_HW_H +#define __DWMMC_HW_H + +// #include +// #include +#include "mmc.h" +#include "bootrom_errno.h" +#include "bootrom_io.h" +#include "cache.h" +// #include +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif +#define BIT(nr) (1UL << (nr)) +#define MMC_BASE_ADDR 0xFF808000 +#define MMC_MEM_SIZE 0x1000 + +#define DWMCI_CTRL 0x000 +#define DWMCI_PWREN 0x004 +#define DWMCI_CLKDIV 0x008 +#define DWMCI_CLKSRC 0x00C +#define DWMCI_CLKENA 0x010 +#define DWMCI_TMOUT 0x014 +#define DWMCI_CTYPE 0x018 +#define DWMCI_BLKSIZ 0x01C +#define DWMCI_BYTCNT 0x020 +#define DWMCI_INTMASK 0x024 +#define DWMCI_CMDARG 0x028 +#define DWMCI_CMD 0x02C +#define DWMCI_RESP0 0x030 +#define DWMCI_RESP1 0x034 +#define DWMCI_RESP2 0x038 +#define DWMCI_RESP3 0x03C +#define DWMCI_MINTSTS 0x040 +#define DWMCI_RINTSTS 0x044 +#define DWMCI_STATUS 0x048 +#define DWMCI_FIFOTH 0x04C +#define DWMCI_CDETECT 0x050 +#define DWMCI_WRTPRT 0x054 +#define DWMCI_GPIO 0x058 +#define DWMCI_TCMCNT 0x05C +#define DWMCI_TBBCNT 0x060 +#define DWMCI_DEBNCE 0x064 +#define DWMCI_USRID 0x068 +#define DWMCI_VERID 0x06C +#define DWMCI_HCON 0x070 +#define DWMCI_UHS_REG 0x074 +#define DWMCI_BMOD 0x080 +#define DWMCI_PLDMND 0x084 +#define DWMCI_DBADDR 0x088 +#define DWMCI_IDSTS 0x08C +#define DWMCI_IDINTEN 0x090 +#define DWMCI_DSCADDR 0x094 +#define DWMCI_BUFADDR 0x098 +#define DWMCI_DATA 0x200 + +/* Interrupt Mask register */ +#define DWMCI_INTMSK_ALL 0xffffffff +#define DWMCI_INTMSK_RE (1 << 1) +#define DWMCI_INTMSK_CDONE (1 << 2) +#define DWMCI_INTMSK_DTO (1 << 3) +#define DWMCI_INTMSK_TXDR (1 << 4) +#define DWMCI_INTMSK_RXDR (1 << 5) +#define DWMCI_INTMSK_RCRC (1 << 6) +#define DWMCI_INTMSK_DCRC (1 << 7) +#define DWMCI_INTMSK_RTO (1 << 8) +#define DWMCI_INTMSK_DRTO (1 << 9) +#define DWMCI_INTMSK_HTO (1 << 10) +#define DWMCI_INTMSK_FRUN (1 << 11) +#define DWMCI_INTMSK_HLE (1 << 12) +#define DWMCI_INTMSK_SBE (1 << 13) +#define DWMCI_INTMSK_ACD (1 << 14) +#define DWMCI_INTMSK_EBE (1 << 15) + +/* Raw interrupt Regsiter */ +#define DWMCI_DATA_ERR (DWMCI_INTMSK_EBE | DWMCI_INTMSK_SBE | DWMCI_INTMSK_HLE |\ + DWMCI_INTMSK_FRUN | DWMCI_INTMSK_EBE | DWMCI_INTMSK_DCRC) +#define DWMCI_DATA_TOUT (DWMCI_INTMSK_HTO | DWMCI_INTMSK_DRTO) +/* CTRL register */ +#define DWMCI_CTRL_RESET (1 << 0) +#define DWMCI_CTRL_FIFO_RESET (1 << 1) +#define DWMCI_CTRL_DMA_RESET (1 << 2) +#define DWMCI_DMA_EN (1 << 5) +#define DWMCI_CTRL_SEND_AS_CCSD (1 << 10) +#define DWMCI_IDMAC_EN (1 << 25) +#define DWMCI_RESET_ALL (DWMCI_CTRL_RESET | DWMCI_CTRL_FIFO_RESET |\ + DWMCI_CTRL_DMA_RESET) + +/* CMD register */ +#define DWMCI_CMD_RESP_EXP (1 << 6) +#define DWMCI_CMD_RESP_LENGTH (1 << 7) +#define DWMCI_CMD_CHECK_CRC (1 << 8) +#define DWMCI_CMD_DATA_EXP (1 << 9) +#define DWMCI_CMD_RW (1 << 10) +#define DWMCI_CMD_SEND_STOP (1 << 12) +#define DWMCI_CMD_ABORT_STOP (1 << 14) +#define DWMCI_CMD_PRV_DAT_WAIT (1 << 13) +#define DWMCI_CMD_UPD_CLK (1 << 21) +#define DWMCI_CMD_USE_HOLD_REG (1 << 29) +#define DWMCI_CMD_START (1 << 31) + +/* CLKENA register */ +#define DWMCI_CLKEN_ENABLE (1 << 0) +#define DWMCI_CLKEN_LOW_PWR (1 << 16) + +/* Card-type registe */ +#define DWMCI_CTYPE_1BIT 0 +#define DWMCI_CTYPE_4BIT (1 << 0) +#define DWMCI_CTYPE_8BIT (1 << 16) + +/* Status Register */ +#define DWMCI_FIFO_EMPTY (1 << 2) +#define DWMCI_FIFO_FULL (1 << 3) +#define DWMCI_BUSY (1 << 9) +#define DWMCI_FIFO_MASK 0x1fff +#define DWMCI_FIFO_SHIFT 17 + +/* FIFOTH Register */ +#define MSIZE(x) ((x) << 28) +#define RX_WMARK(x) ((x) << 16) +#define TX_WMARK(x) (x) +#define RX_WMARK_SHIFT 16 +#define RX_WMARK_MASK (0xfff << RX_WMARK_SHIFT) + +#define DWMCI_IDMAC_OWN (1 << 31) +#define DWMCI_IDMAC_CH (1 << 4) +#define DWMCI_IDMAC_FS (1 << 3) +#define DWMCI_IDMAC_LD (1 << 2) + +/* Bus Mode Register */ +#define DWMCI_BMOD_IDMAC_RESET (1 << 0) +#define DWMCI_BMOD_IDMAC_FB (1 << 1) +#define DWMCI_BMOD_IDMAC_EN (1 << 7) + +/* UHS register */ +#define DWMCI_DDR_MODE (1 << 16) + +/* Internal IDMAC interrupt defines */ +#define DWMCI_IDINTEN_RI BIT(1) +#define DWMCI_IDINTEN_TI BIT(0) + +#define DWMCI_IDINTEN_MASK (DWMCI_IDINTEN_TI | \ + DWMCI_IDINTEN_RI) + +/* quirks */ +#define DWMCI_QUIRK_DISABLE_SMU (1 << 0) + +/** + * struct dwmci_host - Information about a designware MMC host + * + * @name: Device name + * @ioaddr: Base I/O address of controller + * @quirks: Quick flags - see DWMCI_QUIRK_... + * @caps: Capabilities - see MMC_MODE_... + * @bus_hz: Bus speed in Hz, if @get_mmc_clk() is NULL + * @div: Arbitrary clock divider value for use by controller + * @dev_index: Arbitrary device index for use by controller + * @dev_id: Arbitrary device ID for use by controller + * @buswidth: Bus width in bits (8 or 4) + * @fifoth_val: Value for FIFOTH register (or 0 to leave unset) + * @mmc: Pointer to generic MMC structure for this device + * @priv: Private pointer for use by controller + */ +// struct dwmci_host { +// const char *name; +// void *ioaddr; +// unsigned int quirks; +// unsigned int caps; +// unsigned int version; +// unsigned int clock; +// unsigned int bus_hz; +// unsigned int div; +// int dev_index; +// int dev_id; +// int buswidth; +// u32_t fifoth_val; +// struct mmc *mmc; +// void *priv; + +// int (*clksel)(struct dwmci_host *host); +// void (*board_init)(struct dwmci_host *host); + +// /** +// * Get / set a particular MMC clock frequency +// * +// * This is used to request the current clock frequency of the clock +// * that drives the DWMMC peripheral. The caller will then use this +// * information to work out the divider it needs to achieve the +// * required MMC bus clock frequency. If you want to handle the +// * clock external to DWMMC, use @freq to select the frequency and +// * return that value too. Then DWMMC will put itself in bypass mode. +// * +// * @host: DWMMC host +// * @freq: Frequency the host is trying to achieve +// */ +// unsigned int (*get_mmc_clk)(struct dwmci_host *host, int freq); +// #ifndef CONFIG_BLK +// struct mmc_config cfg; +// #endif + +// /* use fifo mode to read and write data */ +// bool fifo_mode; +// }; + +struct dwmci_idmac { + u32_t flags; + u32_t cnt; + u32_t addr; + u32_t next_addr; +} __aligned(ARCH_DMA_MINALIGN); + +// static inline void dwmci_writel(struct dwmci_host *host, int reg, u32_t val) +// { +// writel(val, host->ioaddr + reg); +// } + +// static inline void dwmci_writew(struct dwmci_host *host, int reg, u16_t val) +// { +// writew(val, host->ioaddr + reg); +// } + +// static inline void dwmci_writeb(struct dwmci_host *host, int reg, u8_t val) +// { +// writeb(val, host->ioaddr + reg); +// } +// static inline u32_t dwmci_readl(struct dwmci_host *host, int reg) +// { +// return readl(host->ioaddr + reg); +// } + +// static inline u16_t dwmci_readw(struct dwmci_host *host, int reg) +// { +// return readw(host->ioaddr + reg); +// } + +// static inline u8_t dwmci_readb(struct dwmci_host *host, int reg) +// { +// return readb(host->ioaddr + reg); +// } + +// #ifdef CONFIG_BLK +// /** +// * dwmci_setup_cfg() - Set up the configuration for DWMMC +// * +// * This is used to set up a DWMMC device when you are using CONFIG_BLK. +// * +// * This should be called from your MMC driver's probe() method once you have +// * the information required. +// * +// * Generally your driver will have a platform data structure which holds both +// * the configuration (struct mmc_config) and the MMC device info (struct mmc). +// * For example: +// * +// * struct rockchip_mmc_plat { +// * struct mmc_config cfg; +// * struct mmc mmc; +// * }; +// * +// * ... +// * +// * Inside U_BOOT_DRIVER(): +// * .plat_auto = sizeof(struct rockchip_mmc_plat), +// * +// * To access platform data: +// * struct rockchip_mmc_plat *plat = dev_get_plat(dev); +// * +// * See rockchip_dw_mmc.c for an example. +// * +// * @cfg: Configuration structure to fill in (generally &plat->mmc) +// * @host: DWMMC host +// * @max_clk: Maximum supported clock speed in HZ (e.g. 150000000) +// * @min_clk: Minimum supported clock speed in HZ (e.g. 400000) +// */ +// void dwmci_setup_cfg(struct mmc_config *cfg, struct dwmci_host *host, +// u32_t max_clk, u32_t min_clk); + +// /** +// * dwmci_bind() - Set up a new MMC block device +// * +// * This is used to set up a DWMMC block device when you are using CONFIG_BLK. +// * It should be called from your driver's bind() method. +// * +// * See rockchip_dw_mmc.c for an example. +// * +// * @dev: Device to set up +// * @mmc: Pointer to mmc structure (normally &plat->mmc) +// * @cfg: Empty configuration structure (generally &plat->cfg). This is +// * normally all zeroes at this point. The only purpose of passing +// * this in is to set mmc->cfg to it. +// * Return: 0 if OK, -ve if the block device could not be created +// */ +// int dwmci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg); + +// #else +// /** +// * add_dwmci() - Add a new DWMMC interface +// * +// * This is used when you are not using CONFIG_BLK. Convert your driver over! +// * +// * @host: DWMMC host structure +// * @max_clk: Maximum supported clock speed in HZ (e.g. 150000000) +// * @min_clk: Minimum supported clock speed in HZ (e.g. 400000) +// * Return: 0 if OK, -ve on error +// */ +// int add_dwmci(struct dwmci_host *host, u32_t max_clk, u32_t min_clk); +// #endif /* !CONFIG_BLK */ + +// #ifdef CONFIG_DM_MMC +// /* Export the operations to drivers */ +// int dwmci_probe(struct udevice *dev); +// extern const struct dm_mmc_ops dm_dwmci_ops; +// #endif + +#endif /* __DWMMC_HW_H */ diff --git a/corev_apu/fpga/src/bootrom/src/main.c b/corev_apu/fpga/src/bootrom/src/main.c index fe2f744ec8..504479df08 100644 --- a/corev_apu/fpga/src/bootrom/src/main.c +++ b/corev_apu/fpga/src/bootrom/src/main.c @@ -7,9 +7,8 @@ #include "sd.h" #include "gpt.h" -// 1 second at 50MHz -#define SECOND_CYCLES (50 * 1000 * 1000) -#define WAIT_SECONDS (5) +#define SECOND_CYCLES CLOCK_FREQUENCY +#define WAIT_SECONDS (10) static inline uintptr_t get_cycle_count() { uintptr_t cycle; @@ -73,11 +72,24 @@ int main() } else { print_uart(" booting!\r\n"); #ifndef PLAT_AGILEX - res = gpt_find_boot_partition((uint8_t *)0x80000000UL, 2 * 16384); // linux boot not yet supported for altera + res = gpt_find_boot_partition((uint8_t *)0x80000000UL, 2 * 16384); + #else + int start_block_fw_payload = 0x32800; //payload at 100MB + print_uart("I am Agilex 7! \r\n"); + + print_uart("Loading fw_payload into memory address 0x80000000 \n"); + for (uint64_t i = 0; i < 15000; i++){ + res = sd_copy_mmc((uint8_t *)0x80000000UL + (i * 0x200), start_block_fw_payload + i, 1); // for now hardcoded, need to develop the code to find the file in the SD card + + if (res) + { + print_uart("TRANSFER ERROR\n"); + return res; + } + } #endif } - #ifndef PLAT_AGILEX // linux boot not yet supported for altera if (res == 0) { // jump to the address @@ -86,7 +98,6 @@ int main() "la a1, _dtb;" "jr s0"); } - #endif while (1) { diff --git a/corev_apu/fpga/src/bootrom/src/memalign.h b/corev_apu/fpga/src/bootrom/src/memalign.h new file mode 100644 index 0000000000..7c4efef6f9 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/memalign.h @@ -0,0 +1,157 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (c) 2015 Google, Inc + */ + +#ifndef __ALIGNMEM_H +#define __ALIGNMEM_H + +/* + * ARCH_DMA_MINALIGN is defined in asm/cache.h for each architecture. It + * is used to align DMA buffers. + */ +#ifndef __ASSEMBLY__ +// #include +#include "cache.h" +#include + +/* + * The ALLOC_CACHE_ALIGN_BUFFER macro is used to allocate a buffer on the + * stack that meets the minimum architecture alignment requirements for DMA. + * Such a buffer is useful for DMA operations where flushing and invalidating + * the cache before and after a read and/or write operation is required for + * correct operations. + * + * When called the macro creates an array on the stack that is sized such + * that: + * + * 1) The beginning of the array can be advanced enough to be aligned. + * + * 2) The size of the aligned portion of the array is a multiple of the minimum + * architecture alignment required for DMA. + * + * 3) The aligned portion contains enough space for the original number of + * elements requested. + * + * The macro then creates a pointer to the aligned portion of this array and + * assigns to the pointer the address of the first element in the aligned + * portion of the array. + * + * Calling the macro as: + * + * ALLOC_CACHE_ALIGN_BUFFER(uint32_t, buffer, 1024); + * + * Will result in something similar to saying: + * + * uint32_t buffer[1024]; + * + * The following differences exist: + * + * 1) The resulting buffer is guaranteed to be aligned to the value of + * ARCH_DMA_MINALIGN. + * + * 2) The buffer variable created by the macro is a pointer to the specified + * type, and NOT an array of the specified type. This can be very important + * if you want the address of the buffer, which you probably do, to pass it + * to the DMA hardware. The value of &buffer is different in the two cases. + * In the macro case it will be the address of the pointer, not the address + * of the space reserved for the buffer. However, in the second case it + * would be the address of the buffer. So if you are replacing hard coded + * stack buffers with this macro you need to make sure you remove the & from + * the locations where you are taking the address of the buffer. + * + * Note that the size parameter is the number of array elements to allocate, + * not the number of bytes. + * + * This macro can not be used outside of function scope, or for the creation + * of a function scoped static buffer. It can not be used to create a cache + * line aligned global buffer. + */ +#define ALIGN(x,a) __ALIGN_MASK((x),(typeof(x))(a)-1) +#define ALIGN_DOWN(x, a) ALIGN((x) - ((a) - 1), (a)) +#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) +#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a))) +#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0) + +#define __round_mask(x, y) ((__typeof__(x))((y)-1)) +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) +#define round_down(x, y) ((x) & ~__round_mask(x, y)) + +#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) + +#define DIV_ROUND_DOWN_ULL(ll, d) \ + ({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; }) + +#define DIV_ROUND_UP_ULL(ll, d) DIV_ROUND_DOWN_ULL((ll) + (d) - 1, (d)) + +#define ROUND(a, b) (((a) + (b) - 1) & ~((b) - 1)) + +#if BITS_PER_LONG == 32 +# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d) +#else +# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d) +#endif + +/* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */ +#define roundup(x, y) ( \ +{ \ + const typeof(y) __y = y; \ + (((x) + (__y - 1)) / __y) * __y; \ +} \ +) +#define rounddown(x, y) ( \ +{ \ + typeof(x) __x = (x); \ + __x - (__x % (y)); \ +} \ +) + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define PAD_COUNT(s, pad) (((s) - 1) / (pad) + 1) +#define PAD_SIZE(s, pad) (PAD_COUNT(s, pad) * pad) +#define ALLOC_ALIGN_BUFFER_PAD(type, name, size, align, pad) \ + char __##name[ROUND(PAD_SIZE((size) * sizeof(type), pad), align) \ + + (align - 1)]; \ + \ + type *name = (type *)ALIGN((uintptr_t)__##name, align) +#define ALLOC_ALIGN_BUFFER(type, name, size, align) \ + ALLOC_ALIGN_BUFFER_PAD(type, name, size, align, 1) +#define ALLOC_CACHE_ALIGN_BUFFER_PAD(type, name, size, pad) \ + ALLOC_ALIGN_BUFFER_PAD(type, name, size, ARCH_DMA_MINALIGN, pad) +#define ALLOC_CACHE_ALIGN_BUFFER(type, name, size) \ + ALLOC_ALIGN_BUFFER(type, name, size, ARCH_DMA_MINALIGN) + +/* + * DEFINE_CACHE_ALIGN_BUFFER() is similar to ALLOC_CACHE_ALIGN_BUFFER, but it's + * purpose is to allow allocating aligned buffers outside of function scope. + * Usage of this macro shall be avoided or used with extreme care! + */ +#define DEFINE_ALIGN_BUFFER(type, name, size, align) \ + static char __##name[ALIGN(size * sizeof(type), align)] \ + __aligned(align); \ + \ + static type *name = (type *)__##name +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size) \ + DEFINE_ALIGN_BUFFER(type, name, size, ARCH_DMA_MINALIGN) + +/** + * malloc_cache_aligned() - allocate a memory region aligned to cache line size + * + * This allocates memory at a cache-line boundary. The amount allocated may + * be larger than requested as it is rounded up to the nearest multiple of the + * cache-line size. This ensured that subsequent cache operations on this + * memory (flush, invalidate) will not affect subsequently allocated regions. + * + * @size: Minimum number of bytes to allocate + * + * Return: pointer to new memory region, or NULL if there is no more memory + * available. + */ +static inline void *malloc_cache_aligned(size_t size) +{ + return memalign(ARCH_DMA_MINALIGN, ALIGN(size, ARCH_DMA_MINALIGN)); +} +#endif + +#endif /* __ALIGNMEM_H */ diff --git a/corev_apu/fpga/src/bootrom/src/mmc.h b/corev_apu/fpga/src/bootrom/src/mmc.h new file mode 100644 index 0000000000..6ab17a2306 --- /dev/null +++ b/corev_apu/fpga/src/bootrom/src/mmc.h @@ -0,0 +1,127 @@ +// Copyright (c) 2025 Thales Research and Technology +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +/** + * \file mmc.h + * \brief Contains all the symbols for the mmc commands. + * \author Julien Mallet + * +*/ + +#ifndef MMC_H +#define MMC_H + + +#include "bootrom_types.h" + +/* *************** DATA *************** */ +#define MMC_DATA_READ 1 + + +/* *************** VOLTAGE *************** */ +#define MMC_VDD_32_33 0x00100000 /* VDD voltage 3.2 ~ 3.3 */ +#define MMC_VDD_33_34 0x00200000 /* VDD voltage 3.3 ~ 3.4 */ + + +/* *************** OCR *************** */ +#define OCR_HCS 0x40000000 +#define OCR_BUSY 0x80000000 + + +/* *************** MMC STATUS *************** */ +// #define MMC_STATUS_CURR_STATE (0xf << 9) + + +/* *************** MMC CMD *************** */ +#define MMC_CMD_GO_IDLE_STATE 0 +#define MMC_CMD_ALL_SEND_CID 2 +#define MMC_CMD_SELECT_CARD 7 +#define MMC_CMD_SEND_CSD 9 +#define MMC_CMD_STOP_TRANSMISSION 12 +// #define MMC_CMD_SEND_STATUS 13 +#define MMC_CMD_SET_BLOCKLEN 16 +#define MMC_CMD_READ_SINGLE_BLOCK 17 +#define MMC_CMD_READ_MULTIPLE_BLOCK 18 +#define MMC_CMD_SET_BLOCK_COUNT 23 + + +#define MMC_CMD_APP_CMD 55 + +// SD SPECIFIC +#define SD_CMD_SEND_RELATIVE_ADDR 3 +// #define SD_CMD_APP_SET_BUS_WIDTH 6 +#define SD_CMD_SEND_IF_COND 8 +#define SD_CMD_APP_SEND_OP_COND 41 +#define SD_CMD_APP_SEND_SCR 51 + + +/* *************** MMC RESPONSE *************** */ +#define MMC_RSP_PRESENT (1 << 0) +#define MMC_RSP_136 (1 << 1) /* 136 bit response */ +#define MMC_RSP_CRC (1 << 2) /* expect valid crc */ +#define MMC_RSP_BUSY (1 << 3) /* card may send busy */ +#define MMC_RSP_OPCODE (1 << 4) /* response contains opcode */ + +#define MMC_RSP_NONE (0) +#define MMC_RSP_R1 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) +#define MMC_RSP_R1b (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE| MMC_RSP_BUSY) +#define MMC_RSP_R2 (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC) +#define MMC_RSP_R3 (MMC_RSP_PRESENT) +#define MMC_RSP_R4 (MMC_RSP_PRESENT) +#define MMC_RSP_R5 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) +#define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) +#define MMC_RSP_R7 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) + + +/* *************** MMC STORAGE *************** */ + +/* Maximum block size for MMC */ +#define MMC_MAX_BLOCK_LEN 512 + + +/* *************** MMC STRUCTURES *************** */ + +struct mmc_cmd +{ + u8_t cmdidx; // Command index + u32_t resp_type; // Response type + u32_t cmdarg; // Command argument + u32_t response[4]; // Response array +}; + + +struct mmc_data +{ + u8_t *dest; + + u32_t flags; + u32_t blocks; + u32_t blocksize; +}; + + +struct sdhci_host_t +{ + u32_t dma_buf_addr; // addr of the buffer used by the dma + u16_t rca; // relative card address + u8_t bus_width; +}; + + +/* *************** FUNCTIONS SIGNATURES *************** */ + + +// MMC CMD +u8_t mmc_go_idle(volatile struct sdhci_host_t *g_dwc_mshc); +u8_t mmc_send_if_cond(volatile struct sdhci_host_t *g_dwc_mshc); +u8_t sd_send_op_cond(volatile struct sdhci_host_t *g_dwc_mshc); +u8_t mmc_send_cid(volatile struct sdhci_host_t *g_dwc_mshc); +u8_t sd_send_rca(volatile struct sdhci_host_t *g_dwc_mshc); +u8_t sd_send_csd(volatile struct sdhci_host_t *g_dwc_mshc); +u8_t sd_select_card(volatile struct sdhci_host_t *g_dwc_mshc); +u8_t sd_send_scr(volatile struct sdhci_host_t *g_dwc_mshc); +// u32_t mmc_send_status(volatile struct sdhci_host_t *g_dwc_mshc); +u8_t mmc_set_blocklen(volatile struct sdhci_host_t *g_dwc_mshc, u32_t len); +u8_t sd_copy(volatile struct sdhci_host_t *g_dwc_mshc, void *dst, u64_t src_lba, u64_t blkcnt); + + +#endif \ No newline at end of file diff --git a/corev_apu/fpga/src/bootrom/src/spi.c b/corev_apu/fpga/src/bootrom/src/spi.c index b79ae6680a..cd4784acf3 100644 --- a/corev_apu/fpga/src/bootrom/src/spi.c +++ b/corev_apu/fpga/src/bootrom/src/spi.c @@ -119,7 +119,7 @@ int spi_write_bytes(uint8_t *bytes, uint32_t len, uint8_t *ret) for (int i = 0; i < len;) { status = read_reg(SPI_STATUS_REG); - if ((status & 0x1) != 0x1) // recieve fifo not empty + if ((status & 0x1) != 0x1) // receive fifo not empty { ret[i++] = read_reg(SPI_RECEIVE_REG); } diff --git a/corev_apu/fpga/src/bootrom/src/uart.c b/corev_apu/fpga/src/bootrom/src/uart.c index 79a4ee8b78..7a22b32f10 100644 --- a/corev_apu/fpga/src/bootrom/src/uart.c +++ b/corev_apu/fpga/src/bootrom/src/uart.c @@ -15,6 +15,11 @@ uint8_t read_reg_u8(uintptr_t addr) return *(volatile uint8_t *)addr; } +uint32_t read_reg_u32(uintptr_t addr) +{ + return *(volatile uint32_t *)addr; +} + int is_transmit_empty() { return read_reg_u8(UART_LINE_STATUS) & 0x20; @@ -22,7 +27,7 @@ int is_transmit_empty() char is_transmit_empty_altera() { - return read_reg_u8(UART_THR+6); + return ((read_reg_u8(UART_THR+7) << 8 ) + read_reg_u8(UART_THR+6)); } int is_receive_empty() @@ -30,7 +35,7 @@ int is_receive_empty() #ifndef PLAT_AGILEX return !(read_reg_u8(UART_LINE_STATUS) & 0x1); #else - return !(read_reg_u8(UART_THR+1) & 0x8); + return (read_reg_u8(UART_THR) == 0); #endif } diff --git a/corev_apu/fpga/src/bootrom/src/uart.h b/corev_apu/fpga/src/bootrom/src/uart.h index 38c7e44a44..b7cbc47e5e 100644 --- a/corev_apu/fpga/src/bootrom/src/uart.h +++ b/corev_apu/fpga/src/bootrom/src/uart.h @@ -20,7 +20,7 @@ #define UART_DLAB_LSB UART_BASE + 0 #define UART_DLAB_MSB UART_BASE + 4 -void init_uart(); +void init_uart(uint32_t freq, uint32_t baud); int read_serial(uint8_t *res); diff --git a/corev_apu/fpga/src/genesysii.svh b/corev_apu/fpga/src/genesysii.svh index 0456b92ef0..650f597b84 100644 --- a/corev_apu/fpga/src/genesysii.svh +++ b/corev_apu/fpga/src/genesysii.svh @@ -8,7 +8,7 @@ // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. -// Description: Set global FPGA degines +// Description: Set global FPGA defines // Author: Florian Zaruba `define GENESYSII @@ -17,5 +17,5 @@ `define ARIANE_DATA_WIDTH 64 -// Instantiate protocl checker +// Instantiate protocol checker // `define PROTOCOL_CHECKER diff --git a/corev_apu/fpga/src/kc705.svh b/corev_apu/fpga/src/kc705.svh index bd17d0aebd..6d3749c20d 100644 --- a/corev_apu/fpga/src/kc705.svh +++ b/corev_apu/fpga/src/kc705.svh @@ -8,7 +8,7 @@ // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. -// Description: Set global FPGA degines +// Description: Set global FPGA defines // Author: Florian Zaruba `define KC705 @@ -17,5 +17,5 @@ `define ARIANE_DATA_WIDTH 64 -// Instantiate protocl checker +// Instantiate protocol checker // `define PROTOCOL_CHECKER diff --git a/corev_apu/fpga/src/nexys_video.svh b/corev_apu/fpga/src/nexys_video.svh index 6223199012..912ef31e4b 100644 --- a/corev_apu/fpga/src/nexys_video.svh +++ b/corev_apu/fpga/src/nexys_video.svh @@ -2,7 +2,7 @@ `define ARIANE_DATA_WIDTH 64 -// Instantiate protocl checker +// Instantiate protocol checker // `define PROTOCOL_CHECKER // write-back cache diff --git a/corev_apu/fpga/src/vc707.svh b/corev_apu/fpga/src/vc707.svh index ac7b20a9d5..e60568f7db 100644 --- a/corev_apu/fpga/src/vc707.svh +++ b/corev_apu/fpga/src/vc707.svh @@ -8,12 +8,12 @@ // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. -// Description: Set global FPGA degines +// Description: Set global FPGA defines // Author: Florian Zaruba `define VC707 `define ARIANE_DATA_WIDTH 64 -// Instantiate protocl checker +// Instantiate protocol checker // `define PROTOCOL_CHECKER diff --git a/corev_apu/fpga/src/vcu118.svh b/corev_apu/fpga/src/vcu118.svh index 47440a844b..0713c214fc 100644 --- a/corev_apu/fpga/src/vcu118.svh +++ b/corev_apu/fpga/src/vcu118.svh @@ -8,7 +8,7 @@ // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. -// Description: Set global FPGA degines +// Description: Set global FPGA defines // Author: Florian Zaruba `define VCU118 diff --git a/corev_apu/fpga/xilinx/ariane_xlnx_ip.yml b/corev_apu/fpga/xilinx/ariane_xlnx_ip.yml index 2b3c0c1e51..a4ec93211b 100644 --- a/corev_apu/fpga/xilinx/ariane_xlnx_ip.yml +++ b/corev_apu/fpga/xilinx/ariane_xlnx_ip.yml @@ -50,6 +50,17 @@ xlnx_clk_gen: clkout4_requested_out_freq: 50 clkin1_jitter_ps: 50 +xlnx_dpti_clk: + ip: clk_wiz + vendor: xilinx.com + config: + prim_in_freq: 60 + num_out_clks: 2 + clkout2_used: true + clkout1_requested_out_freq: 60 + clkout1_requested_phase: 230 + clkout2_requested_out_freq: 60 + xlnx_ila: ip: ila vendor: xilinx.com diff --git a/corev_apu/fpga/xilinx/xlnx_dpti_clk/Makefile b/corev_apu/fpga/xilinx/xlnx_dpti_clk/Makefile new file mode 100644 index 0000000000..d1acb462e2 --- /dev/null +++ b/corev_apu/fpga/xilinx/xlnx_dpti_clk/Makefile @@ -0,0 +1,2 @@ +PROJECT:=xlnx_dpti_clk +include ../common.mk \ No newline at end of file diff --git a/corev_apu/fpga/xilinx/xlnx_dpti_clk/tcl/run.tcl b/corev_apu/fpga/xilinx/xlnx_dpti_clk/tcl/run.tcl new file mode 100644 index 0000000000..d836651eab --- /dev/null +++ b/corev_apu/fpga/xilinx/xlnx_dpti_clk/tcl/run.tcl @@ -0,0 +1,26 @@ +set partNumber $::env(XILINX_PART) +set boardName $::env(XILINX_BOARD) + +set ipName xlnx_dpti_clk + +create_project $ipName . -force -part $partNumber +set_property board_part $boardName [current_project] + +create_ip -name clk_wiz -vendor xilinx.com -library ip -module_name $ipName + +set_property -dict [list CONFIG.PRIM_IN_FREQ {60.000} \ + CONFIG.NUM_OUT_CLKS {2} \ + CONFIG.CLKOUT2_USED {true} \ + CONFIG.CLKOUT1_REQUESTED_OUT_FREQ {60} \ + CONFIG.CLKOUT1_REQUESTED_PHASE {230.000} \ + CONFIG.CLKOUT2_REQUESTED_OUT_FREQ {60} \ + CONFIG.USE_RESET {false} \ + ] [get_ips $ipName] + + +generate_target {instantiation_template} [get_files ./$ipName.srcs/sources_1/ip/$ipName/$ipName.xci] +generate_target all [get_files ./$ipName.srcs/sources_1/ip/$ipName/$ipName.xci] +create_ip_run [get_files -of_objects [get_fileset sources_1] ./$ipName.srcs/sources_1/ip/$ipName/$ipName.xci] +launch_run -jobs 8 ${ipName}_synth_1 +wait_on_run ${ipName}_synth_1 + diff --git a/corev_apu/instr_tracing/DPTI/Digilent.licence b/corev_apu/instr_tracing/DPTI/Digilent.licence new file mode 100644 index 0000000000..124159423d --- /dev/null +++ b/corev_apu/instr_tracing/DPTI/Digilent.licence @@ -0,0 +1,40 @@ +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 including rights to use, copy, redistribute, and/or sublicense the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The Software is only to be used with Digilent Inc. hardware directly or with +Digilent Inc. hardware included in an OEM device. + +The Software may be used for the development of custom programs by the +licensee, for use ONLY with Digilent Inc. hardware. This includes, but is not +limited to, all Dynamic Link Libraries (DLLs), Shared Libraries, documentation, +header files, and Applications Programming Interfaces (APIs). + +You agree that you will not modify, adapt, decompile, reverse engineer, +translate, or otherwise attempt to discover the source code for the Software. + +Digilent Inc. maintains all its rights under all applicable laws, including but +not limited to pertinent intellectual property laws. + +The above copyright notice and this permission notice shall be included in all +copies 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. + +Copyright (c) 2022 Digilent Inc. + +Contact: +1300 NE Henley Ct. Suite 3 +Pullman, WA 99163 +United States of America + +digilent.com/support + \ No newline at end of file diff --git a/corev_apu/instr_tracing/DPTI/dpti_ctrl.vhd b/corev_apu/instr_tracing/DPTI/dpti_ctrl.vhd new file mode 100755 index 0000000000..7395fdab8f --- /dev/null +++ b/corev_apu/instr_tracing/DPTI/dpti_ctrl.vhd @@ -0,0 +1,399 @@ +---------------------------------------------------------------------------------- +-- Company: Digilent Inc. +-- Engineer: +-- +-- Create Date: 16:16:24 10/26/2011 +-- Design Name: +-- Module Name: dpti_ctrl - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: This module implements a synchronous DPTI interface. It includes +-- two local FIFOs that allow the data to be moved from the DPTI clock domain +-- to another clock domain in the FPGA. +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- 5/30/2016(sjb) -- Prepared for public release +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + +-- Uncomment the following library declaration if using +-- arithmetic functions with Signed or Unsigned values +--use IEEE.NUMERIC_STD.ALL; + +-- Uncomment the following library declaration if instantiating +-- any Xilinx primitives in this code. +library UNISIM; +use UNISIM.VComponents.all; + +Library UNIMACRO; +use UNIMACRO.vcomponents.all; + +entity dpti_ctrl is + Port ( + --User Write FIFO signals + wr_clk : in std_logic; + wr_en : in std_logic; + wr_full : out std_logic; + wr_afull : out std_logic; + wr_err : out std_logic; + wr_count : out std_logic_vector(11 downto 0); + wr_di : in std_logic_vector(7 downto 0); + + --User Read FIFO signals + rd_clk : in std_logic; + rd_en : in std_logic; + rd_empty : out std_logic; + rd_aempty : out std_logic; + rd_err : out std_logic; + rd_count : out std_logic_vector(11 downto 0); + rd_do : out std_logic_vector(7 downto 0); + + --misc. signals + rst : in std_logic; --Asynchronously resets the entire component. Must be held high for at least 100ns, or 6 clock cycles of the slowest fifo clock if that is longer + + --DPTI Port signals + prog_clko : in STD_LOGIC; + prog_rxen : in STD_LOGIC; + prog_txen : in STD_LOGIC; + prog_spien : in STD_LOGIC; --called jtagen on some platforms + prog_rdn : out STD_LOGIC; + prog_wrn : out STD_LOGIC; + prog_oen : out STD_LOGIC; + prog_siwun : out STD_LOGIC; + prog_d : inout STD_LOGIC_VECTOR (7 downto 0)); +end dpti_ctrl; + +architecture Behavioral of dpti_ctrl is + + + + + +------------------------------------------------------------------------------- +-- Component Declarations +------------------------------------------------------------------------------- + +component xlnx_dpti_clk is +port + ( + CLK_IN1 : in std_logic; + CLK_OUT1 : out std_logic; + CLK_OUT2 : out std_logic; + LOCKED : out std_logic + ); +end component; + +------------------------------------------------------------------------------- +-- Local Type Declarations +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- Constant Declarations +------------------------------------------------------------------------------- + +-- The following constants define state codes for the Synchronous PTI port +-- state machine. The high order bits of the state number provide a unique +-- state identifier for each state. The low order bits are the state machine +-- outputs for that state. This type of state machine implementation uses no +-- combinational logic to generate the outputs, which should result in glitch +-- free outputs. + + +constant stPtiRdy : std_logic_vector(6 downto 0):= "0" & "00" & "1111"; +constant stPtiInOut0 : std_logic_vector(6 downto 0):= "1" & "00" & "1111"; +constant stPtiInOut1 : std_logic_vector(6 downto 0):= "1" & "00" & "1011"; +constant stPtiInOut2 : std_logic_vector(6 downto 0):= "1" & "01" & "1010"; +constant stPtiInOut3 : std_logic_vector(6 downto 0):= "1" & "10" & "0101"; + +------------------------------------------------------------------------------- +-- Signal Declarations +------------------------------------------------------------------------------- + +signal stPtiCur : std_logic_vector(6 downto 0) := stPtiRdy; +signal stPtiNext : std_logic_vector(6 downto 0); + +signal clkPti : std_logic; +signal clkIOB : std_logic; +signal locked : std_logic; + +--user fifo signals +signal usrWrClk : std_logic; +signal usrWrEn : std_logic; +signal usrFull : std_logic; +signal usrAFull : std_logic; +signal usrWrErr : std_logic; +signal usrRdClk : std_logic; +signal usrRdEn : std_logic; +signal usrEmpty : std_logic; +signal usrAEmpty : std_logic; +signal usrRdErr : std_logic; +signal usrRdCnt : std_logic_vector(11 downto 0); +signal usrDO : std_logic_vector(7 downto 0); +signal usrWrCnt : std_logic_vector(11 downto 0); +signal usrDI : std_logic_vector(7 downto 0); + +-- Internal control signals +signal ctlRd : std_logic; +signal ctlWr : std_logic; +signal ctlOe : std_logic; +signal ctlDir : std_logic; + +signal ctlRxf : std_logic; +signal ctlTxe : std_logic; +signal ctlRst : std_logic; + +signal ctlFull : std_logic; +signal ctlAFull : std_logic; +signal ctlEmpty : std_logic; +signal ctlFwr : std_logic; +signal ctlFrd : std_logic; + +signal dummyWrCnt : std_logic_vector(11 downto 0); +signal dummyRdCnt : std_logic_vector(11 downto 0); + +signal busPtiTris : std_logic; +signal busPtiOut : std_logic_vector(7 downto 0); + +signal busPtiIn : std_logic_vector(7 downto 0); +signal busPtiInReg : std_logic_vector(7 downto 0); +signal busFifoOut : std_logic_vector(7 downto 0); + +------------------------------------------------------------------------------- +-- Module Implementation +------------------------------------------------------------------------------- + +begin + +--This clocking wizard is used to sychronize the clock used throughout this design +--with the prog_clko input. It reduces delays introduced by the global clocking +--network (~4ns in post-route simulation on Artix 200t). It is also used to generate +--a phase shifted clock for latching input data/flags +clkwiz_inst : xlnx_dpti_clk + port map + ( + CLK_IN1 => prog_clko, + CLK_OUT1 => clkIOB, + CLK_OUT2 => clkPti, + LOCKED => locked); + +--This process latches the inputs from the FTDI part at IOB flip-flops. They are latched +--using a phaseshifted clock about ~11ns after the rising edge of the input clock. This +--makes meeting the input delay timing constraints possible. Additional contstraints for +--traveling from the clkIOB domain to clkPti are automatically inferred by the tools +--because they have a known phase relationship (signals will need to settle in <~5ns). +--If the design fails interclock timing analysis with clkIOB, first ensure that IOB flip +--flops are being instantiated for the registers in this process. Then you can try reducing +--the phase shift by a few degrees (too much will cause the inputdelay constraints to fail). Last +--resort is to modify the design so that these flags are all immediately latched to the clkPti +--domain. +--@sjb: I recently came across this code and began questioning if it is necessary. At first thought, it seems +-- that latching the input signals would add to needed setup times vs. just letting them thru +-- asynchronously. It took me awhile, but I believe I understand why this is needed, so I have decided +-- to document my reasoning further for the next time someone comes across this. +-- I believe I inserted these because the FTDI part only holds the data on the bus valid for 1 ns +-- after a prog_clk edge, and I was concerned that the databus/ctrl signals might +-- beat the clock due to delays introduced by the clocking infrastructure. The IOBs treat this situation +-- by ensuring the data/ctrl gets latched internally the moment it is guarenteed to be valid. This seems like +-- the most architecture independent way to treat the problem, because it only requires three things, all of which +-- are very likely to be present in future FPGA architectures/devices: +-- 1) Ability to generate a clock with minimum input delay (~<3ns) +-- 2) IOB flip-flops with minimum setup requirement (~<3ns) +-- 3) Ability to generate a clock with a 230 degree phase shift relative to the generated clock with minimum input delay. +-- Last note, I think the input_delay constraints with the -min option in timing.xdc describe this requirement +-- to the tools. I'm pretty sure removing these flip-flops will cause the design to fail meeting those constraints. + +process(ctlRst, clkIOB) +begin + if (ctlRst = '1') then + busPtiInReg <= (others =>'0'); + ctlRxf <= '0'; + ctlTxe <= '0'; + elsif (rising_edge(clkIOB)) then + busPtiInReg <= busPtiIn; + ctlRxf <= prog_rxen; + ctlTxe <= prog_txen; + end if; +end process; + +------------------------------------------------------------------------------- +-- Map basic status and control signals +------------------------------------------------------------------------------- + +--Asynchronous reset signal +ctlRst <= (prog_spien or rst) or not(locked); + + +--Top level output mapping +prog_siwun <= '1'; +prog_wrn <= ctlWr; +prog_rdn <= ctlRd; +prog_oen <= ctlOe; + +-- Data bus direction and control. +IOBUF_gen : for index in 0 to 7 generate + IOBUF_inst : IOBUF + generic map ( + DRIVE => 16, + SLEW => "FAST") + port map ( + O => busPtiIn(index), -- Buffer output + IO => prog_d(index), -- Buffer inout port (connect directly to top-level port) + I => busPtiOut(index), -- Buffer input + T => busPtiTris -- 3-state enable input, high=input, low=output + ); +end generate; + +busPtiTris <= ctlDir or ctlRst; + +------------------------------------------------------------------------------- +-- PTI State Machine +------------------------------------------------------------------------------- + +-- Map glitch-less control signals from the current state +ctlRd <= stPtiCur(0); --keep in mind: active low +ctlWr <= stPtiCur(1) or ctlEmpty; --keep in mind: active low +ctlOe <= stPtiCur(2); +ctlDir <= stPtiCur(3); + +--Map additional control signals from the current state +ctlFwr <= stPtiCur(4) and not ctlRxf; +ctlFrd <= stPtiCur(5) and ((not ctlTxe) and (not ctlEmpty)); + +-- This process moves the state machine to the next state on each clock. +process (clkPti, ctlRst) +begin + if ctlRst = '1' then + stPtiCur <= stPtiRdy; + elsif clkPti = '1' and clkPti'Event then + stPtiCur <= stPtiNext; + end if; +end process; + +-- This process determines the next state based on the current state and the +-- state machine inputs. +-- TODO: It appears the bandwidth is very limited when the FTDI->FPGA FPGA side FIFO +-- gets almost filled (4080 out of 4096). Almost full seems to take a very long time +-- to deassert, regardless of how fast the user is reading data. This causes the state machine +-- to continuosly receive a single byte at a time (1/3 bandwidth) until the FIFO is full, or until +-- the FIFO has been read by the user past the almost fill point and no data has been available on +-- the DPTI bus for a long time (~50 us). Need to fix this because it will lower bandwidth of designs that involve +-- continuously sending large amounts of data to the FPGA. +process (stPtiCur, stPtiNext, ctlRxf, ctlTxe, ctlFull, ctlAFull, ctlEmpty) +begin + case stPtiCur is + when stPtiRdy => + stPtiNext <= stPtiInOut0; + + when stPtiInOut0 => --Start any pending transactions + if ctlRxf = '0' and ctlFull = '0' then --Receive data from FTDI (gets priority) + stPtiNext <= stPtiInOut1; + elsif ctlTxe = '0' and ctlEmpty = '0' then --send data to FTDI + stPtiNext <= stPtiInOut3; + else --no transaction yet + stPtiNext <= stPtiInOut0; + end if; + + when stPtiInOut1 => --Initiate read transaction (FTDI->FPGA) + stPtiNext <= stPtiInOut2; + + when stPtiInOut2 => --Continue Read transaction + if ctlRxf = '0' and ctlAFull = '0' then + stPtiNext <= stPtiInOut2; + else --if no data available, or FPGA-side FIFO is almost full, stop transaction + stPtiNext <= stPtiInOut0; + end if; + + when stPtiInOut3 => --Start/Continue write transaction (FPGA->FTDI) + if ctlTxe = '0' and ctlEmpty = '0' then --note almost empty is used because the FIFO is first-word fall thru + stPtiNext <= stPtiInOut3; + else --if FTDI FIFO is full, or we are on the last byte being sent, stop transaction + stPtiNext <= stPtiInOut0; + end if; + + when others => + stPtiNext <= stPtiRdy; + end case; +end process; + +------------------------------------------------------------------------------- +-- Input/Output Fifos for data +------------------------------------------------------------------------------- + +--Output Fifo +usr2dpti_fifo : FIFO_DUALCLOCK_MACRO +generic map ( + DEVICE => "7SERIES", -- Target Device: "VIRTEX5", "VIRTEX6", "7SERIES" + ALMOST_FULL_OFFSET => X"0FF0", -- Sets almost full threshold + ALMOST_EMPTY_OFFSET => X"000F", -- Sets the almost empty threshold + DATA_WIDTH => 8, -- Valid values are 1-72 (37-72 only valid when FIFO_SIZE="36Kb") + FIFO_SIZE => "36Kb", -- Target BRAM, "18Kb" or "36Kb" + FIRST_WORD_FALL_THROUGH => TRUE) -- Sets the FIFO FWFT to TRUE or FALSE +port map ( + ALMOSTEMPTY => open, -- 1-bit output almost empty + ALMOSTFULL => usrAFull, -- 1-bit output almost full + DO => busPtiOut, -- Output data, width defined by DATA_WIDTH parameter + EMPTY => ctlEmpty, -- 1-bit output empty + FULL => usrFull, -- 1-bit output full + RDCOUNT => dummyRdCnt, -- Output read count, width determined by FIFO depth + RDERR => open, -- 1-bit output read error + WRCOUNT => usrWrCnt, -- Output write count, width determined by FIFO depth + WRERR => usrWrErr, -- 1-bit output write error + DI => usrDI, -- Input data, width defined by DATA_WIDTH parameter + RDCLK => clkPti, -- 1-bit input read clock + RDEN => ctlFrd, -- 1-bit input read enable + RST => ctlRst, -- 1-bit input reset + WRCLK => usrWrClk, -- 1-bit input write clock + WREN => usrWrEn -- 1-bit input write enable +); + +usrWrClk <= wr_clk; +usrWrEn <= wr_en; +wr_full <= usrFull; +wr_afull <= usrAFull; +wr_err <= usrWrErr; +wr_count <= usrWrCnt; +usrDI <= wr_di; + +--Input Fifo +dpti2usr_fifo : FIFO_DUALCLOCK_MACRO +generic map ( + DEVICE => "7SERIES", -- Target Device: "VIRTEX5", "VIRTEX6", "7SERIES" + ALMOST_FULL_OFFSET => X"0FF0", -- Sets almost full threshold + ALMOST_EMPTY_OFFSET => X"000F", -- Sets the almost empty threshold + DATA_WIDTH => 8, -- Valid values are 1-72 (37-72 only valid when FIFO_SIZE="36Kb") + FIFO_SIZE => "36Kb", -- Target BRAM, "18Kb" or "36Kb" + FIRST_WORD_FALL_THROUGH => TRUE) -- Sets the FIFO FWFT to TRUE or FALSE +port map ( + ALMOSTEMPTY => usrAEmpty, -- 1-bit output almost empty + ALMOSTFULL => ctlAFull, -- 1-bit output almost full + DO => usrDO, -- Output data, width defined by DATA_WIDTH parameter + EMPTY => usrEmpty, -- 1-bit output empty + FULL => ctlFull, -- 1-bit output full + RDCOUNT => usrRdCnt, -- Output read count, width determined by FIFO depth + RDERR => usrRdErr, -- 1-bit output read error + WRCOUNT => dummyWrCnt, -- Output write count, width determined by FIFO depth + WRERR => open, -- 1-bit output write error + DI => busPtiInReg, -- Input data, width defined by DATA_WIDTH parameter + RDCLK => usrRdClk, -- 1-bit input read clock + RDEN => usrRdEn, -- 1-bit input read enable + RST => ctlRst, -- 1-bit input reset + WRCLK => clkPti, -- 1-bit input write clock + WREN => ctlFwr -- 1-bit input write enable +); + +usrRdClk <= rd_clk; +usrRdEn <= rd_en; +rd_empty <= usrEmpty; +rd_aempty <= usrAEmpty; +rd_err <= usrRdErr; +rd_count <= usrRdCnt; +rd_do <= usrDO; + +end Behavioral; + diff --git a/corev_apu/instr_tracing/DPTI/slicer_DPTI.sv b/corev_apu/instr_tracing/DPTI/slicer_DPTI.sv new file mode 100644 index 0000000000..7a80687cc3 --- /dev/null +++ b/corev_apu/instr_tracing/DPTI/slicer_DPTI.sv @@ -0,0 +1,66 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 21/05/2025 +module slicer_DPTI #( + parameter SLICE_LEN = 32, + parameter NO_TIME = 0 // 0 : include time ; 1 : exclude time +) ( + input logic clk_i, + input logic rst_ni, + + input logic valid_i, + input encap_pkg::encap_fifo_entry_s encap_fifo_entry_i, + input logic fifo_full_i, + + output logic valid_o, + output logic [SLICE_LEN-1:0] slice_o, + output logic done_o +); + localparam DATA_LEN = encap_pkg::H_LEN + (NO_TIME ? 0 : encap_pkg::T_LEN) + encap_pkg::PAYLOAD_LEN; + localparam NUM_SLICES = DATA_LEN / SLICE_LEN; + localparam COUNT_LEN = $clog2(NUM_SLICES); + + logic [DATA_LEN-1 : 0] data_to_slice_q, data_to_slice_d; + logic [COUNT_LEN-1:0] slice_index_d, slice_index_q; + logic running_q, running_d; + + assign slice_o = data_to_slice_q[DATA_LEN-1:DATA_LEN-SLICE_LEN]; + assign valid_o = running_q && !fifo_full_i; + assign done_o = running_q && (slice_index_q == NUM_SLICES - 1) && !fifo_full_i; + + always_comb begin + data_to_slice_d = data_to_slice_q; + slice_index_d = slice_index_q; + running_d = running_q; + + if (valid_i && !running_q) begin + //new data to slice + data_to_slice_d = NO_TIME ? {encap_fifo_entry_i.header,encap_fifo_entry_i.payload} : + {encap_fifo_entry_i.header,encap_fifo_entry_i.timestamp,encap_fifo_entry_i.payload}; + slice_index_d = 0; + running_d = 1; + end else if (running_q && !fifo_full_i) begin // Stall if fifo is full + //Slicing + data_to_slice_d = data_to_slice_q << SLICE_LEN; + slice_index_d = slice_index_q + 1; + if (slice_index_q == NUM_SLICES - 1) begin + running_d = 0; + end + end + end + + always_ff @(posedge clk_i or negedge rst_ni) begin + if (!rst_ni) begin + data_to_slice_q <= '0; + slice_index_q <= '0; + running_q <= '0; + end else begin + data_to_slice_q <= data_to_slice_d; + slice_index_q <= slice_index_d; + running_q <= running_d; + end + end + + +endmodule diff --git a/corev_apu/instr_tracing/Decapsuler/Decapsuler.cpp b/corev_apu/instr_tracing/Decapsuler/Decapsuler.cpp new file mode 100644 index 0000000000..fea1d5aba7 --- /dev/null +++ b/corev_apu/instr_tracing/Decapsuler/Decapsuler.cpp @@ -0,0 +1,311 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 17/06/2025 +// Contributors: +// Côme Allart - Thales + +// This code is designed to decapsulate a RAW format into a csv Trace. It is used to convert them in a human readable format for CI diff. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +const size_t NR_PKT = 20; +const size_t PACKET_SIZE = 40; +const size_t BLOCK_SIZE = NR_PKT * PACKET_SIZE; +typedef unsigned char BYTE; +using packet_t = std::array; +typedef std::array sample_t; + +uint64_t extract_bits(const packet_t &packet, std::size_t bit_offset, + std::size_t bit_length) { // FIXME add assertion to prevent desynchro segfault + uint64_t result = 0xdead; // We use 'dead' as an indicator to quickly detect if a desynchro happened during the aquisition (without stoping decapsulation) + if (bit_length <= 64) { + result = 0; + for (std::size_t i = 0; i < bit_length; ++i) { + std::size_t global_bit = bit_offset + i; + std::size_t byte_index = global_bit / 8; + std::size_t bit_index = 7 - (global_bit % 8); + uint64_t bit = (packet[byte_index] >> bit_index) & 0x1; + result = (result << 1) | bit; + } + } + return result; +} + +template struct PrintableOption : public std::optional { + PrintableOption(std::optional &o) : std::optional(o) {} + PrintableOption(T &v) : std::optional(v) {} + PrintableOption(uint64_t v) : std::optional(v) {} + PrintableOption() : std::optional() {} + + friend std::ostream &operator<<(std::ostream &s, const PrintableOption &o) { + if (o.has_value()) + s << unsigned(*o); + else + s << "_"; + + return s; + } +}; + +struct BitExtractor { + const packet_t &packet; + bool is_backward; + size_t i; + + BitExtractor(const packet_t &packet, bool backward) + : packet(packet), is_backward(backward), + i(backward ? PACKET_SIZE * 8 : 0) {} + + uint64_t operator()(size_t bits) { return extract(bits); } + uint64_t to(size_t bit) { return extract_to(bit); } + + uint64_t extract_to(size_t bit) { return extract(i - bit); } + uint64_t extract(size_t bits) { + if (is_backward) + i -= bits; + + uint64_t result = extract_bits(packet, i, bits); + + if (!is_backward) + i += bits; + + return result; + } +}; + +struct Trace { + bool P_Time; // MSB + uint8_t P_ID; // 2 bits after MSB + uint8_t P_Size; // 5bits after P_ID + uint64_t P_Timestamp; // 64 bits after P_Size + PrintableOption format; // 2bits LSB + PrintableOption subformat; // 2bits before LSB if format=3 + PrintableOption address; // start of payload + PrintableOption branch; // F3SF0 (5) F3SF1 (5) else NDF + PrintableOption branches; // F1 (3) + PrintableOption branch_map; // F1 (4 : branches) + PrintableOption branch_count; // NDF + PrintableOption branch_fmt; // NDF + PrintableOption context; // NDF + PrintableOption ecause; //F3SF1 (8) F3SF1T (70) + PrintableOption ienable; //F3SF3 (5) + PrintableOption encoder_mode;//F3SF3 (6) + PrintableOption interrupt; // F3SF1(9) F3SF1T(71) + PrintableOption irreport; // F2 (5) F1(5) + PrintableOption irdepth; //if call/ret F2(6:2^cal) F1(6:2^cal) else NDF + PrintableOption notify; // F2(3) F1(3) + PrintableOption ioptions; //F3SF3 (8:15) + PrintableOption privilege; // F3SF0 (6) F3SF1 (6) F3SF2 (5) + PrintableOption qual_status;// F3SF3(7) + PrintableOption time; //if time F3SF0(8:72) F3SF1(8:72) F3SF2(7:71) //FIXME encoder could have time in last position + PrintableOption thaddr; // F3SF1(40) F3SF1_t(104) + PrintableOption tval; //F3SF1 (41:73) F3SF1_t(105:137) + PrintableOption updiscon;// F2(4) + PrintableOption denable;// NDF here + PrintableOption dloss;// NDF here + PrintableOption doptions;// NDF here + uint8_t size_branch_map; + + Trace(const packet_t &packet, bool time_flag, bool call_flag) { + size_branch_map = 0; + + BitExtractor header_extractor(packet, false); + BitExtractor payload_extractor(packet, true); + + // Header of encapsulated packet : + P_Time = header_extractor(1); + P_ID = header_extractor(2); + P_Size = header_extractor(5); + size_t P_Start = (PACKET_SIZE - P_Size) * 8; + P_Timestamp = header_extractor(64); + + // Extraction of fields contained in the payload : + format = payload_extractor(2); + if (format == 3) { + subformat = payload_extractor(2); + } + + if (format == 3 && subformat.has_value()) { + switch (subformat.value()) { + case 0: { // F3SF0 + branch = payload_extractor(1); + privilege = payload_extractor(2); + if (time_flag) { + time = payload_extractor(64); + } + address = payload_extractor.to(P_Start); + break; + } + case 1: { // F3SF1 + branch = payload_extractor(1); + privilege = payload_extractor(2); + if (time_flag) { + time = payload_extractor(64); + } + ecause = payload_extractor(32); + interrupt = payload_extractor(1); + thaddr = payload_extractor(1); + tval = payload_extractor(32); + address = payload_extractor.to(P_Start); + break; + } + case 2: { // F3SF2 + privilege = payload_extractor(2); + if (time_flag) { + time = payload_extractor(64); + } + break; + } + case 3: { // F3SF3 + ienable = payload_extractor(1); + encoder_mode = payload_extractor(1); + qual_status = payload_extractor(2); + ioptions = payload_extractor(7); + break; + } + } + } + + // F2 + if (format == 2) { + notify = payload_extractor(1); + updiscon = payload_extractor(1); + irreport = payload_extractor(1); + if (call_flag) { // FIXME addapt to call_counter_size + irdepth = payload_extractor(1); // if = 0 else 2^call_counter_size + } + address = payload_extractor.to(P_Start); + } + + // F1 + if (format == 1) { + branches = payload_extractor(5); + if (branches == 0) { + size_branch_map = 31; + } else if (branches == 1) { + size_branch_map = 1; + } else if (branches <= 3) { + size_branch_map = 3; + } else if (branches <= 7) { + size_branch_map = 7; + } else if (branches <= 15) { + size_branch_map = 15; + } else { + size_branch_map = 31; + } + branch_map = payload_extractor(size_branch_map); + + if (branches != 0) { + notify = payload_extractor(1); + updiscon = payload_extractor(1); + irreport = payload_extractor(1); + if (call_flag) { // FIXME addapt to call_counter_size + irdepth = payload_extractor(1); // if = 0 else 2^call_counter_size + } + address = payload_extractor.to(P_Start); + } + } + } + + static std::string csvHeader() { + return std::string( + "format,subformat,address,branch,branches,branch_map,branch_count," + "branch_fmt,context,ecause,ienable,encoder_mode,interrupt,irreport," + "irdepth,notify,ioptions,privilege,qual_status,time,thaddr,tval," + "updiscon,denable,dloss,doptions"); + } + + friend std::ostream &operator<<(std::ostream &s, Trace const &trace) { + trace.put_str(s); + return s; + } + + std::ostream &put_str(std::ostream &s) const { + s << format << "," << subformat << ","; + + s << std::hex << std::nouppercase << address << std::dec << ","; + + s << branch << "," << branches << "," << branch_map << "," << branch_count + << "," << branch_fmt << ","; + + s << context << "," << ecause << "," << ienable << "," << encoder_mode + << "," << interrupt << ","; + + s << irreport << "," << irdepth << "," << notify << "," << ioptions << "," + << privilege << "," << qual_status << ","; + + s << std::hex << std::nouppercase << time << std::dec << ","; + + s << thaddr << "," << tval << "," << updiscon << "," << denable << "," + << dloss << "," << doptions; + + return s; + } + + std::string toCSVLine() { + std::ostringstream oss; + oss << *this; + return oss.str(); + } +}; + + packet_t hexstr_to_packet(const std::string &hexstr){ + unsigned int byte; + packet_t packet; + for (int i=0; i< 40; i++){ + std::sscanf(hexstr.c_str() + 2*i, "%2x",&byte); + packet[i] = (BYTE) byte; + } + return packet; + } + + std::filesystem::path ext_csv(const std::filesystem::path &pi) { + auto po = pi ; + po.replace_extension(".csv"); + return po; + } + +int main(int argc, char* argv[]) { + if (argc <2){ + std::cerr << "Usage: "<< argv[0] <<" Filepath \n"; + return 1; + } + + const bool TIME_FLAG = 1; + const bool CALL_FLAG = 0; + std::filesystem::path nameFile_i = argv[1]; + std::filesystem::path nameFile_o = ext_csv(nameFile_i); + + std::vector all_packets; + std::ifstream file_to_extract(nameFile_i); + std::ofstream csvFile(nameFile_o); + std::string line; + + while(std::getline(file_to_extract,line)){ + packet_t packet; + packet=hexstr_to_packet(line); + all_packets.push_back(packet); + } + + std::cout << "Number packet read :" << all_packets.size() << std::endl; + csvFile << Trace::csvHeader() << "\n"; + for (packet_t &packet : all_packets){ + Trace trace(packet, TIME_FLAG, CALL_FLAG); + csvFile << trace.toCSVLine() << "\n"; + } + + return 0; +} \ No newline at end of file diff --git a/corev_apu/instr_tracing/Decapsuler/Makefile b/corev_apu/instr_tracing/Decapsuler/Makefile new file mode 100644 index 0000000000..5de6887a2a --- /dev/null +++ b/corev_apu/instr_tracing/Decapsuler/Makefile @@ -0,0 +1,29 @@ +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales + +# Makefile to build the Decapsuler executable + +CC = $(GCC_11_5_PATH)/g++ +TARGETS = Decapsuler +CFLAGS = -Wall -Wextra -g + +all: $(TARGETS) + +Decapsuler: Decapsuler.cpp + $(CC) --version + $(CC) -o Decapsuler Decapsuler.cpp $(CFLAGS) + +.PHONY: clean + +clean: + rm -f $(TARGETS) + +clean_all: + rm -f $(TARGETS) + rm -rf receiver_data diff --git a/corev_apu/instr_tracing/Decapsuler/affiche_csv.py b/corev_apu/instr_tracing/Decapsuler/affiche_csv.py new file mode 100644 index 0000000000..5d29ce00f2 --- /dev/null +++ b/corev_apu/instr_tracing/Decapsuler/affiche_csv.py @@ -0,0 +1,34 @@ +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales +# Script used to print a csv file in a more readable way +import pandas as pd +import argparse +import os + +pd.set_option('display.max_columns',None) +pd.set_option('display.max_rows',None) +pd.set_option("display.width",220) + +parser = argparse.ArgumentParser(description="Print the CSV file in a more readable format") +parser.add_argument("--file","-f",required=True, help="CSV file path") +args = parser.parse_args() + +csv_path = args.file + +if not os.path.isfile(csv_path): + print(f"Error '{csv_path}' does not exist") + exit(1) + +df = pd.read_csv(csv_path) + +#print(df) + +output_filename = os.path.splitext(os.path.basename(csv_path))[0] + "_output.txt" +with open(output_filename, "w",encoding="utf-8") as f: + f.write(df.to_string(index=False)) \ No newline at end of file diff --git a/corev_apu/instr_tracing/Decapsuler/compare_encoder.sh b/corev_apu/instr_tracing/Decapsuler/compare_encoder.sh new file mode 100755 index 0000000000..823ba3408d --- /dev/null +++ b/corev_apu/instr_tracing/Decapsuler/compare_encoder.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales + +set -euo pipefail + +if [ "$#" -ne 2 ]; then + echo "Usage: $0 " + exit 2 +fi + +dir_work="encoder_log" +rm -rf "$dir_work" +mkdir -p "$dir_work" + +trace_raw_path="$1" +trace_ref_path="$2" + + +base_raw=$(basename "$trace_raw_path") +base_ref=$(basename "$trace_ref_path") + + +for trace in "$trace_raw_path" "$trace_ref_path"; do + if [ ! -f "$trace" ]; then + echo "ERROR file '$trace' does not exist" + exit 1 + fi + base=$(basename "$trace") + cp "$trace" "$dir_work/$base" +done + +trace_raw="$dir_work/$base_raw" +trace_ref="$dir_work/$base_ref" + +./Decapsuler "$trace_raw" + +python3 affiche_csv.py -f "$dir_work/${base_raw%.txt}.csv" +mv "${base_raw%.txt}_output.txt" "$dir_work" +python3 affiche_csv.py -f "$trace_ref" +mv "${base_ref%.te_inst}_output.txt" "$dir_work" + + +python3 diff_color.py "$dir_work/${base_raw%.txt}.csv" "$trace_ref" + + \ No newline at end of file diff --git a/corev_apu/instr_tracing/Decapsuler/debug_encoder_diff.sh b/corev_apu/instr_tracing/Decapsuler/debug_encoder_diff.sh new file mode 100644 index 0000000000..85afb5745b --- /dev/null +++ b/corev_apu/instr_tracing/Decapsuler/debug_encoder_diff.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales + +exit_error() { + echo "$1" >&2 + exit ${2:-1} +} + +if [ "$#" -ne 1 ]; then + exit_error "Usage: $0 " 2 +fi + +exe="$1" +base=$(basename "$exe" .o) + +#TODO \ No newline at end of file diff --git a/corev_apu/instr_tracing/Decapsuler/diff_color.py b/corev_apu/instr_tracing/Decapsuler/diff_color.py new file mode 100644 index 0000000000..be107c9974 --- /dev/null +++ b/corev_apu/instr_tracing/Decapsuler/diff_color.py @@ -0,0 +1,104 @@ +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales + + +import csv +import sys +import re + +def gray(s): return f"\033[90m{s}\033[0m" +def red(s): return f"\033[91m{s}\033[0m" +def green(s): return f"\033[92m{s}\033[0m" +def white(s): return f"\033[97m{s}\033[0m" + +ANSI_ESCAPE= re.compile + +def strip(text): + return re.sub(r'\x1b\[[0-9;]*m','',text) + +def read_csv_to_matrix(filepath): + with open(filepath,newline='') as csvfile: + reader = csv.reader(csvfile,delimiter=',') + rows = list(reader) + header = rows[0] + data = rows[1:] + return header,data + + + +def format_value(val_gen, val_ref): + if val_gen is None: + return f"{red('NDF')}{white(' -> ')}{green(val_ref)}" + elif val_gen == val_ref: + return gray(val_gen) + else: + return f"{red(val_gen)}{white(' -> ')}{green(val_ref)}" + +def compare_matrices(header,gen_data,ref_data): + max_rows = max(len(gen_data),len(ref_data)) + num_cols = len(header) + result_matrix = [[None for _ in range (num_cols)] for _ in range(max_rows)] + + for row_idx in range(max_rows): + for col_idx in range(num_cols): + try: + val_ref = ref_data[row_idx][col_idx] + except IndexError: + val_ref="" + try: + val_gen = gen_data[row_idx][col_idx] + except IndexError: + val_gen=None + result_matrix[row_idx][col_idx] = format_value(val_gen,val_ref) + + return result_matrix + +def print_column_by_column(header,matrix,cols_per_block=8): + num_cols = len(header) + num_rows = len(matrix) + + for block_start in range(0,num_cols, cols_per_block): + block_end = min(block_start + cols_per_block,num_cols) + block_indices = range(block_start,block_end) + + col_widths =[] + for i in block_indices: + max_len = max(len(strip(matrix[r][i])) for r in range(num_rows)) + max_len = max(max_len, len(header[i])) + col_widths.append(max_len + 2) + header_line ="" + for i,w in zip(block_indices,col_widths): + header_line += header[i].center(w) + " " + print(header_line) + + for r in range(num_rows): + row_line = "" + for i,w in zip(block_indices,col_widths): + content = matrix[r][i] + pad_len = w - len(strip(content)) + left_pad = pad_len // 2 + right_pad = pad_len - left_pad + row_line += " "*left_pad + content + " "*right_pad + " " + print(row_line) + + print("\n") + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("usage : diff.py ") + sys.exit(1) + + gen_path = sys.argv[1] + ref_path = sys.argv[2] + + gen_header, gen_data = read_csv_to_matrix(gen_path) + ref_header , ref_data = read_csv_to_matrix(ref_path) + + matrix = compare_matrices(ref_header,gen_data,ref_data) + print_column_by_column(ref_header,matrix,cols_per_block=14) diff --git a/corev_apu/instr_tracing/ITI/cva6_iti/block_retirement.sv b/corev_apu/instr_tracing/ITI/cva6_iti/block_retirement.sv new file mode 100644 index 0000000000..aaa2e0d115 --- /dev/null +++ b/corev_apu/instr_tracing/ITI/cva6_iti/block_retirement.sv @@ -0,0 +1,96 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 20/03/2025 +// Contributors: +// Darshak Sheladiya, SYSGO GmbH +// Umberto Laghi, UNIBO + +//Systolic module used to determines the iaddr, ilastsize, iretire for Encoder Module + + +module block_retirement #( + parameter config_pkg::cva6_cfg_t CVA6Cfg = config_pkg::cva6_cfg_empty, + parameter type uop_entry_t = logic, + parameter type itt_out_t = logic, + parameter CAUSE_LEN = 5, //Size is ecause_width_p in the E-Trace SPEC + parameter ITYPE_LEN = 3, //Size is itype_width_p in the E-Trace SPEC (3 or 4) + parameter IRETIRE_LEN = 32 //Size is iretire_width_p in the E-Trace SPEC +) ( + input uop_entry_t uop_entry_i, + input logic [ CAUSE_LEN-1:0] cause_i, + input logic [CVA6Cfg.XLEN-1:0] tval_i, + input logic [ IRETIRE_LEN-1:0] counter_i, + input logic [CVA6Cfg.XLEN-1:0] iaddr_i, + input logic was_special_i, + + output itt_out_t itt_out_o, + output logic [ IRETIRE_LEN-1:0] counter_o, + output logic [CVA6Cfg.XLEN-1:0] iaddr_o, + output logic is_special_o +); + + logic special_inst; + logic exception; + logic interrupt; + assign special_inst = !(uop_entry_i.itype inside {iti_pkg::INT, iti_pkg::EXC, iti_pkg::STANDARD}) && uop_entry_i.valid ; + assign exception = (uop_entry_i.itype == iti_pkg::EXC) ? 1'b1 : 1'b0; + assign interrupt = (uop_entry_i.itype == iti_pkg::INT) ? 1'b1 : 1'b0; + + always_comb begin + counter_o = counter_i; + is_special_o = was_special_i; + iaddr_o = iaddr_i; + itt_out_o = '0; + + if (uop_entry_i.valid) begin + + if (was_special_i) begin + counter_o = 0; + iaddr_o = uop_entry_i.pc; + is_special_o = 1'b0; + end + + counter_o = uop_entry_i.compressed ? counter_o + 1 : counter_o + 2; + + if (special_inst) begin + itt_out_o.valid = 1'b1; + itt_out_o.iretire = counter_o; + itt_out_o.itype = uop_entry_i.itype; + itt_out_o.ilastsize = ~uop_entry_i.compressed; + itt_out_o.iaddr = iaddr_o; + itt_out_o.priv = uop_entry_i.priv; + itt_out_o.cycles = uop_entry_i.cycles; + itt_out_o.cause = '0; + itt_out_o.tval = '0; + is_special_o = 1'b1; + end + + if (interrupt) begin + itt_out_o.valid = 1'b1; + itt_out_o.iretire = uop_entry_i.compressed ? 1 : 2; + itt_out_o.itype = uop_entry_i.itype; + itt_out_o.ilastsize = ~uop_entry_i.compressed; + itt_out_o.iaddr = uop_entry_i.pc; + itt_out_o.priv = uop_entry_i.priv; + itt_out_o.cycles = uop_entry_i.cycles; + itt_out_o.cause = cause_i; + itt_out_o.tval = '0; + is_special_o = 1'b1; + end + + if (exception) begin + itt_out_o.valid = 1'b1; + itt_out_o.iretire = uop_entry_i.compressed ? 1 : 2; + itt_out_o.itype = uop_entry_i.itype; + itt_out_o.ilastsize = ~uop_entry_i.compressed; + itt_out_o.iaddr = uop_entry_i.pc; + itt_out_o.priv = uop_entry_i.priv; + itt_out_o.cycles = uop_entry_i.cycles; + itt_out_o.cause = cause_i; + itt_out_o.tval = tval_i; + is_special_o = 1'b1; + end + end + end +endmodule diff --git a/corev_apu/instr_tracing/ITI/cva6_iti/iti.sv b/corev_apu/instr_tracing/ITI/cva6_iti/iti.sv new file mode 100644 index 0000000000..c8f69536ca --- /dev/null +++ b/corev_apu/instr_tracing/ITI/cva6_iti/iti.sv @@ -0,0 +1,214 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 20/03/2025 +// Contributors: +// Darshak Sheladiya, SYSGO GmbH +// Umberto Laghi, UNIBO + +// For reference : See Section 4.2 Instruction Trace Interface from Efficient Trace for RISC-V v2.0 (may 5 2022) +// iti stand for Instruction Trace Interface, changing because tip (Trace Ingress Port) and "type" are too similar creating confusion + +module cva6_iti #( + parameter config_pkg::cva6_cfg_t CVA6Cfg = config_pkg::cva6_cfg_empty, + parameter CAUSE_LEN = 5, //Size is ecause_width_p in the E-Trace SPEC + parameter ITYPE_LEN = 3, //Size is itype_width_p in the E-Trace SPEC (3 or 4) + parameter IRETIRE_LEN = 32, //Size is iretire_width_p in the E-Trace SPEC + parameter block_mode = 0, + parameter type rvfi_to_iti_t = logic, + parameter type iti_to_encoder_t = logic +) ( + input logic clk_i, + input logic rst_ni, + + input logic [CVA6Cfg.NrCommitPorts-1:0] valid_i, + input rvfi_to_iti_t rvfi_to_iti_i, + + output logic [CVA6Cfg.NrCommitPorts-1:0] valid_o, + output iti_to_encoder_t iti_to_encoder_o +); + + // pragma translate_off + int f; + initial begin + f = $fopen("iti.traces", "w"); + $fwrite(f, "itype_0,cause,tval,priv,iaddr_0,context,ctype,iretire_0,ilastsize_0\n"); + end + final $fclose(f); + // pragma translate_on + + /* Structure used for each instr*/ + localparam type uop_entry_t = struct packed { + logic valid; + logic [CVA6Cfg.XLEN-1:0] pc; + iti_pkg::itype_t itype; + logic compressed; + riscv::priv_lvl_t priv; + logic [63:0] cycles; + }; + + /* Structure used to output trace_signals if special instr */ + localparam type itt_out_t = struct packed { + logic valid; + logic [IRETIRE_LEN-1:0] iretire; + iti_pkg::itype_t itype; + logic ilastsize; + logic [CVA6Cfg.XLEN-1:0] iaddr; + riscv::priv_lvl_t priv; + logic [CAUSE_LEN-1:0] cause; + logic [CVA6Cfg.XLEN-1:0] tval; + logic [63:0] cycles; + }; + + logic interrupt; + iti_pkg::itype_t [CVA6Cfg.NrCommitPorts-1:0] itype; + + logic [IRETIRE_LEN-1:0] counter_d, counter_q; + logic [CVA6Cfg.XLEN-1:0] addr_d, addr_q; + logic special_d, special_q; + + uop_entry_t [CVA6Cfg.NrCommitPorts-1:0] uop_entry; + itt_out_t [CVA6Cfg.NrCommitPorts-1:0] itt_out; + + logic [CVA6Cfg.NrCommitPorts-1:0][IRETIRE_LEN-1:0] counter_itt; + logic [CVA6Cfg.NrCommitPorts-1:0][CVA6Cfg.XLEN-1:0] addr_itt; + logic [CVA6Cfg.NrCommitPorts-1:0] special_itt; + logic [CVA6Cfg.NrCommitPorts-1:0][CAUSE_LEN-1:0] cause_itt; + logic [CVA6Cfg.NrCommitPorts-1:0][CVA6Cfg.XLEN-1:0] tval_itt; + + logic [CVA6Cfg.NrCommitPorts-1:0][IRETIRE_LEN-1:0] counter; + logic [CVA6Cfg.NrCommitPorts-1:0][CVA6Cfg.XLEN-1:0] addr; + logic [CVA6Cfg.NrCommitPorts-1:0] special; + + + assign interrupt = rvfi_to_iti_i.cause[CVA6Cfg.XLEN-1]; // determined based on the MSB of cause + + for (genvar i = 0; i < CVA6Cfg.NrCommitPorts; i++) begin + itype_detector #( + .ITYPE_LEN(ITYPE_LEN) + ) i_itype_detector ( + .valid_i (valid_i[i]), + .exception_i (rvfi_to_iti_i.ex_valid), + .interrupt_i (interrupt), + .op_i (rvfi_to_iti_i.op[i]), + .branch_taken_i(rvfi_to_iti_i.is_taken[i]), + .itype_o (itype[i]) + ); + + // Adding this to ensure that interrupt/exception happen only in commit port 0 of cva6 + assign cause_itt[i] = i == 0 ? rvfi_to_iti_i.cause[CAUSE_LEN-1:0] : '0; + assign tval_itt[i] = i == 0 ? rvfi_to_iti_i.tval : '0; + + if (block_mode) begin + // Systolic logic (First block_retirement is connected to D Flip-Flop to continue computation if needed) + assign counter_itt[i] = i == 0 ? counter_q : counter[i-1]; + assign addr_itt[i] = i == 0 ? addr_q : addr[i-1]; + assign special_itt[i] = i == 0 ? special_q : special[i-1]; + + block_retirement #( + .CVA6Cfg(CVA6Cfg), + .uop_entry_t(uop_entry_t), + .itt_out_t(itt_out_t), + .CAUSE_LEN(CAUSE_LEN), + .ITYPE_LEN(ITYPE_LEN), + .IRETIRE_LEN(IRETIRE_LEN) + ) i_block_retirement ( + .uop_entry_i(uop_entry[i]), + .cause_i(cause_itt[i]), + .tval_i(tval_itt[i]), + .counter_i(counter_itt[i]), + .iaddr_i(addr_itt[i]), + .was_special_i(special_itt[i]), + .itt_out_o(itt_out[i]), + .counter_o(counter[i]), + .iaddr_o(addr[i]), + .is_special_o(special[i]) + ); + + end else begin + single_retirement #( + .CVA6Cfg(CVA6Cfg), + .uop_entry_t(uop_entry_t), + .itt_out_t(itt_out_t), + .CAUSE_LEN(CAUSE_LEN), + .ITYPE_LEN(ITYPE_LEN), + .IRETIRE_LEN(IRETIRE_LEN) + ) i_single_retirement ( + .uop_entry_i(uop_entry[i]), + .cause_i(cause_itt[i]), + .tval_i(tval_itt[i]), + .itt_out_o(itt_out[i]) + ); + + end + end + + + always_comb begin + iti_to_encoder_o.cause = '0; + iti_to_encoder_o.tval = '0; + iti_to_encoder_o.priv = riscv::PRIV_LVL_U; + iti_to_encoder_o.cycles = '0; + for (int i = 0; i < CVA6Cfg.NrCommitPorts; i++) begin + uop_entry[i].valid = valid_i[i]; + uop_entry[i].pc = rvfi_to_iti_i.pc[i]; + uop_entry[i].itype = itype[i]; + uop_entry[i].compressed = rvfi_to_iti_i.is_compressed[i]; + uop_entry[i].priv = rvfi_to_iti_i.priv_lvl; + uop_entry[i].cycles = rvfi_to_iti_i.cycles; + + iti_to_encoder_o.valid[i] = 1'b0; + iti_to_encoder_o.iretire[i] = '0; + iti_to_encoder_o.ilastsize[i] = '0; + iti_to_encoder_o.itype[i] = iti_pkg::STANDARD; + iti_to_encoder_o.iaddr[i] = '0; + + valid_o[i] = 1'b0; + + if (itt_out[i].valid) begin + valid_o[i] = itt_out[i].valid; + iti_to_encoder_o.valid[i] = itt_out[i].valid; + iti_to_encoder_o.iretire[i] = itt_out[i].iretire; + iti_to_encoder_o.ilastsize[i] = itt_out[i].ilastsize; + iti_to_encoder_o.itype[i] = itt_out[i].itype; + iti_to_encoder_o.iaddr[i] = itt_out[i].iaddr; + iti_to_encoder_o.priv = itt_out[i].priv; // privilege don't change between 2 instr committed in the same cycle + iti_to_encoder_o.cycles = itt_out[i].cycles; // Same here (same time at same cycle) + end + end + if (itt_out[0].valid) begin // interrupt & exception only in port 0 + iti_to_encoder_o.cause = itt_out[0].cause; + iti_to_encoder_o.tval = itt_out[0].tval; + end + end + if (block_mode) begin + assign counter_d = counter[CVA6Cfg.NrCommitPorts-1]; + assign addr_d = addr[CVA6Cfg.NrCommitPorts-1]; + assign special_d = special[CVA6Cfg.NrCommitPorts-1]; + end + + always_ff @(posedge clk_i, negedge rst_ni) begin + if (block_mode) begin + if (!rst_ni) begin + counter_q <= '0; + addr_q <= '0; + special_q <= 1'b1; + end else begin + counter_q <= counter_d; + addr_q <= addr_d; + special_q <= special_d; + end + end + //pragma translate_off + for (int i = 0; i < CVA6Cfg.NrCommitPorts; i++) begin + if (itt_out[i].valid) begin + $fwrite(f, "%d,%0d,%0d,%d,%h,0,0,%0d,%0d\n", itt_out[i].itype, itt_out[i].cause, + itt_out[i].tval, itt_out[i].priv, itt_out[i].iaddr, itt_out[i].iretire, + itt_out[i].ilastsize); + end + end + //pragma translate_on + end + + +endmodule diff --git a/corev_apu/instr_tracing/ITI/cva6_iti/itype_detector.sv b/corev_apu/instr_tracing/ITI/cva6_iti/itype_detector.sv new file mode 100755 index 0000000000..5c503ab2d5 --- /dev/null +++ b/corev_apu/instr_tracing/ITI/cva6_iti/itype_detector.sv @@ -0,0 +1,92 @@ +// Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file +// except in compliance with the License, or, at your option, the Apache License version 2.0. You +// may obtain a copy of the License at + +// https://solderpad.org/licenses/SHL-2.1/ + +// Unless required by applicable law or agreed to in writing, any work distributed under the +// 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. + +// Author: Umberto Laghi +// Contact: umberto.laghi@studio.unibo.it +// Github: @ubolakes +// Contributors: +// Darshak Sheladiya, SYSGO GmbH +// Maxime COLSON, Thales CDI France + +/* ITYPE DETECTOR */ +/* +it produces the type of the instruction +*/ + +module itype_detector #( + parameter ITYPE_LEN = 3 //Size is itype_width_p in the E-Trace SPEC (3 or 4) +) ( + input logic valid_i, + input logic exception_i, + input logic interrupt_i, + input ariane_pkg::fu_op op_i, + input logic branch_taken_i, + output iti_pkg::itype_t itype_o +); + + // internal signals + logic exception; + logic interrupt; + logic eret; + logic nontaken_branch; + logic taken_branch; + logic updiscon; + + // assignments + assign exception = exception_i; + assign interrupt = interrupt_i; // no need to have an inst committed + + + + + assign eret = op_i inside {ariane_pkg::MRET, ariane_pkg::SRET, ariane_pkg::DRET}; + + assign nontaken_branch = ( op_i == ariane_pkg::EQ || + op_i == ariane_pkg::NE || + op_i == ariane_pkg::LTS || + op_i == ariane_pkg::GES || + op_i == ariane_pkg::LTU || + op_i == ariane_pkg::GEU) && + ~branch_taken_i; + + assign taken_branch = ( op_i == ariane_pkg::EQ || + op_i == ariane_pkg::NE || + op_i == ariane_pkg::LTS || + op_i == ariane_pkg::GES || + op_i == ariane_pkg::LTU || + op_i == ariane_pkg::GEU) && + branch_taken_i; + + assign updiscon = op_i == ariane_pkg::JALR; + + // assigning the itype + always_comb begin + // initialization + itype_o = iti_pkg::STANDARD; + + if (exception) begin // exception + itype_o = iti_pkg::EXC; + end else if (interrupt) begin // interrupt + itype_o = iti_pkg::INT; + end else if (valid_i) begin + if (eret) begin // exception or interrupt return + itype_o = iti_pkg::ERET; + end else if (nontaken_branch) begin // nontaken branch + itype_o = iti_pkg::NON_TAKEN_BR; + end else if (taken_branch) begin // taken branch + itype_o = iti_pkg::TAKEN_BR; + end else if (ITYPE_LEN == 3 && updiscon) begin // uninferable discontinuity + itype_o = iti_pkg::UNINF_JMP; + end + end + end + +endmodule diff --git a/corev_apu/instr_tracing/ITI/cva6_iti/single_retirement.sv b/corev_apu/instr_tracing/ITI/cva6_iti/single_retirement.sv new file mode 100644 index 0000000000..a9d4a668be --- /dev/null +++ b/corev_apu/instr_tracing/ITI/cva6_iti/single_retirement.sv @@ -0,0 +1,56 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 20/03/2025 + +//Module used to determines the iaddr, ilastsize, iretire in single retirement for Encoder Module + + +module single_retirement #( + parameter config_pkg::cva6_cfg_t CVA6Cfg = config_pkg::cva6_cfg_empty, + parameter type uop_entry_t = logic, + parameter type itt_out_t = logic, + parameter CAUSE_LEN = 5, //Size is ecause_width_p in the E-Trace SPEC + parameter ITYPE_LEN = 3, //Size is itype_width_p in the E-Trace SPEC (3 or 4) + parameter IRETIRE_LEN = 32 //Size is iretire_width_p in the E-Trace SPEC +) ( + input uop_entry_t uop_entry_i, + input logic [ CAUSE_LEN-1:0] cause_i, + input logic [CVA6Cfg.XLEN-1:0] tval_i, + output itt_out_t itt_out_o +); + + + logic exception; + logic interrupt; + assign exception = (uop_entry_i.itype == iti_pkg::EXC) ? 1'b1 : 1'b0; + assign interrupt = (uop_entry_i.itype == iti_pkg::INT) ? 1'b1 : 1'b0; + + always_comb begin + itt_out_o = '0; + + if (uop_entry_i.valid) begin + + itt_out_o.valid = 1'b1; + itt_out_o.iretire = 1; + itt_out_o.itype = uop_entry_i.itype; + itt_out_o.ilastsize = ~uop_entry_i.compressed; + itt_out_o.iaddr = uop_entry_i.pc; + itt_out_o.priv = uop_entry_i.priv; + itt_out_o.cycles = uop_entry_i.cycles; + itt_out_o.cause = '0; + itt_out_o.tval = '0; + + if (interrupt) begin + itt_out_o.cause = cause_i; + itt_out_o.tval = '0; + end + + if (exception) begin + itt_out_o.cause = cause_i; + itt_out_o.tval = tval_i; + end + + end + end +endmodule diff --git a/corev_apu/instr_tracing/ITI/include/iti_pkg.sv b/corev_apu/instr_tracing/ITI/include/iti_pkg.sv new file mode 100644 index 0000000000..0099f9e5e1 --- /dev/null +++ b/corev_apu/instr_tracing/ITI/include/iti_pkg.sv @@ -0,0 +1,36 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 20/03/2025 +// Contributors: +// Darshak Sheladiya, SYSGO GmbH +// Umberto Laghi, UNIBO + +// This package is temporary, the idea is to have it directly in the encoder later + +package iti_pkg; + + localparam CAUSE_LEN = 5; //Size is ecause_width_p in the E-Trace SPEC + localparam ITYPE_LEN = 3; //Size is itype_width_p in the E-Trace SPEC (3 or 4) + localparam IRETIRE_LEN = 32; //Size is iretire_width_p in the E-Trace SPEC + + typedef enum logic [ITYPE_LEN-1:0] { + STANDARD = 0, // none of the other named itype codes + EXC = 1, // exception + INT = 2, // interrupt + ERET = 3, // exception or interrupt return + NON_TAKEN_BR = 4, // nontaken branch + TAKEN_BR = 5, // taken branch + UNINF_JMP = 6, // uninferable jump if ITYPE_LEN == 3, otherwise reserved + RES = 7 /*, // reserved + UC = 8, // uninferable call + IC = 9, // inferable call + UIJ = 10, // uninferable jump + IJ = 11, // inferable jump + CRS = 12, // co-routine swap + RET = 13, // return + OUIJ = 14, // other uninferable jump + OIJ = 15*/ // other inferable jump + } itype_t; + +endpackage diff --git a/corev_apu/instr_tracing/ITI/include/iti_types.svh b/corev_apu/instr_tracing/ITI/include/iti_types.svh new file mode 100644 index 0000000000..d8519ee996 --- /dev/null +++ b/corev_apu/instr_tracing/ITI/include/iti_types.svh @@ -0,0 +1,24 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 20/03/2025 +// Contributors: +// Darshak Sheladiya, SYSGO GmbH +// Umberto Laghi, UNIBO + +`ifndef ITI_TYPES_SVH +`define ITI_TYPES_SVH + +`define ITI_TO_ENCODER_T(Cfg) struct packed { \ + logic [Cfg.NrCommitPorts-1:0] valid; \ + logic [Cfg.NrCommitPorts-1:0][iti_pkg::IRETIRE_LEN-1:0] iretire; \ + logic [Cfg.NrCommitPorts-1:0] ilastsize; \ + iti_pkg::itype_t [Cfg.NrCommitPorts-1:0] itype; \ + logic [iti_pkg::CAUSE_LEN-1:0] cause; \ + logic [Cfg.XLEN-1:0] tval; \ + riscv::priv_lvl_t priv; \ + logic [Cfg.NrCommitPorts-1:0][Cfg.XLEN-1:0] iaddr; \ + logic [63:0] cycles; \ + } + +`endif // ITI_TYPES_SVH diff --git a/corev_apu/instr_tracing/Pictures/Branch_example_dark.svg b/corev_apu/instr_tracing/Pictures/Branch_example_dark.svg new file mode 100644 index 0000000000..eb3a61cea7 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Branch_example_dark.svg @@ -0,0 +1,3 @@ + + +
0000000080001100 <Proc_6>  :
.... ... 
  80001112: c080 {sw s0,0(s1)}
  80001114: 4785 {li a5,1}
  80001116: 02f40463 {beq s0,a5,8000113e }
8000111a:      c81d {beqz s0,80001150 }
> Not Taken ; branches = 1(10)  branche_map = 1(2)
 Not Taken ; branches = 2(10)  branche_map = 11(2)
 8000111c: 4709 {li a4,2}
 8000111e: 04e40063 {beq s0,a4,8000115e }
> Taken ; branches = 3(10)  branche_map = 011(2)
8000115e: 60e2 {ld ra,24(sp)}
80001160: 6442 {ld s0,16(sp)}
80001162: c09c {sw a5,0(s1)}
80001164: 64a2 {ld s1,8(sp)}
80001166: 6105 {addi sp,sp,32}
80001168: 8082 {ret}
> Uninferable ; packet is sent with : branches = 3(10)  branche_map = 011(2)
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Branch_example_light.svg b/corev_apu/instr_tracing/Pictures/Branch_example_light.svg new file mode 100644 index 0000000000..329d0d46c0 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Branch_example_light.svg @@ -0,0 +1,3 @@ + + +
0000000080001100 <Proc_6>  :
.... ... 
  80001112: c080 {sw s0,0(s1)}
  80001114: 4785 {li a5,1}
  80001116: 02f40463 {beq s0,a5,8000113e }
8000111a:      c81d {beqz s0,80001150 }
> Not Taken ; branches = 1(10)  branche_map = 1(2)
 Not Taken ; branches = 2(10)  branche_map = 11(2)
 8000111c: 4709 {li a4,2}
 8000111e: 04e40063 {beq s0,a4,8000115e }
> Taken ; branches = 3(10)  branche_map = 011(2)
8000115e: 60e2 {ld ra,24(sp)}
80001160: 6442 {ld s0,16(sp)}
80001162: c09c {sw a5,0(s1)}
80001164: 64a2 {ld s1,8(sp)}
80001166: 6105 {addi sp,sp,32}
80001168: 8082 {ret}
> Uninferable ; packet is sent with : branches = 3(10)  branche_map = 011(2)
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Branch_map_dark.svg b/corev_apu/instr_tracing/Pictures/Branch_map_dark.svg new file mode 100644 index 0000000000..167a10467e --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Branch_map_dark.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid
empty
Branch
Map
flush
branch_taken
branch_map
branches
full
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Branch_map_light.svg b/corev_apu/instr_tracing/Pictures/Branch_map_light.svg new file mode 100644 index 0000000000..8b440e73ca --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Branch_map_light.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid
empty
Branch
Map
flush
branch_taken
branch_map
branches
full
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/EEPROM.PNG b/corev_apu/instr_tracing/Pictures/EEPROM.PNG new file mode 100644 index 0000000000..5aa9091488 Binary files /dev/null and b/corev_apu/instr_tracing/Pictures/EEPROM.PNG differ diff --git a/corev_apu/instr_tracing/Pictures/Emmiter_dark.svg b/corev_apu/instr_tracing/Pictures/Emmiter_dark.svg new file mode 100644 index 0000000000..06c13f0817 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Emmiter_dark.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid
packet_valid_o
packet_length_o
Packet
Emmiter
lc_cause
lc_tval
lc_interrupt
tc_cause
tc_tval
tc_interrupt
tc_priv
tc_time
tc_address
branches
branch_map
nc_exc_only
nc_ppccd
tc_ienable
lc_updiscon
packet_payload_o
branch_map_flush
nocontext
notime
qual_status
ioptions
packet_format
packet_subformat
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Emmiter_light.svg b/corev_apu/instr_tracing/Pictures/Emmiter_light.svg new file mode 100644 index 0000000000..987de87216 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Emmiter_light.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid
packet_valid_o
packet_length_o
Packet
Emmiter
lc_cause
lc_tval
lc_interrupt
tc_cause
tc_tval
tc_interrupt
tc_priv
tc_time
tc_address
branches
branch_map
nc_exc_only
nc_ppccd
tc_ienable
lc_updiscon
packet_payload_o
branch_map_flush
nocontext
notime
qual_status
ioptions
packet_format
packet_subformat
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Encapsulated_Packet_dark.svg b/corev_apu/instr_tracing/Pictures/Encapsulated_Packet_dark.svg new file mode 100644 index 0000000000..0822cb05b0 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Encapsulated_Packet_dark.svg @@ -0,0 +1,3 @@ + + +
Header
Time
Payload
1 Byte
8 Bytes
1    31 Bytes
P_Length
flow
T?
1 bit
2 bits
5 bits
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Encapsulated_Packet_light.svg b/corev_apu/instr_tracing/Pictures/Encapsulated_Packet_light.svg new file mode 100644 index 0000000000..fa085eceb7 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Encapsulated_Packet_light.svg @@ -0,0 +1,3 @@ + + +
Header
Time
Payload
1 Byte
8 Bytes
1    31 Bytes
P_Length
flow
T?
1 bit
2 bits
5 bits
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Encoder_dark.svg b/corev_apu/instr_tracing/Pictures/Encoder_dark.svg new file mode 100644 index 0000000000..489d9ddc87 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Encoder_dark.svg @@ -0,0 +1,3 @@ + + +
Control
Register
Filter
Priority
Resync
Packet
Emmiter
APB
Branch
map
iti_to_encoder 
iretire [N:0][IRET_LEN-1:0];
ilastsize[N:0];
itype [N:0][2:0];
cause [XLEN-1:0];
tval [XLEN-1:0];
priv [1:0];
iaddr [N:0][XLEN-1:0];
cycles [63:0];
valid_i
packet_valid_o
packet_length_o
packet_payload_o
ENCODER
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Encoder_light.svg b/corev_apu/instr_tracing/Pictures/Encoder_light.svg new file mode 100644 index 0000000000..edb997026f --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Encoder_light.svg @@ -0,0 +1,3 @@ + + +
Control
Register
Filter
Priority
Resync
Packet
Emmiter
APB
Branch
map
iti_to_encoder 
iretire [N:0][IRET_LEN-1:0];
ilastsize[N:0];
itype [N:0][2:0];
cause [XLEN-1:0];
tval [XLEN-1:0];
priv [1:0];
iaddr [N:0][XLEN-1:0];
cycles [63:0];
valid_i
packet_valid_o
packet_length_o
packet_payload_o
ENCODER
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Filter_dark.svg b/corev_apu/instr_tracing/Pictures/Filter_dark.svg new file mode 100644 index 0000000000..db6c3f763e --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Filter_dark.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid
nc_qualified
Filter
Other 
Events
priv_filter
upper_priv
lower_priv
match_priv
priv_mode
priv_lvl_i
iaddr_filter
upper_iaddr
match_iaddr
iaddr_mode
iaddr_i
lower_iaddr
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Filter_light.svg b/corev_apu/instr_tracing/Pictures/Filter_light.svg new file mode 100644 index 0000000000..2e04cf1a26 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Filter_light.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid
nc_qualified
Filter
Other 
Events
priv_filter
upper_priv
lower_priv
match_priv
priv_mode
priv_lvl_i
iaddr_filter
upper_iaddr
match_iaddr
iaddr_mode
iaddr_i
lower_iaddr
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Gen2_wired.png b/corev_apu/instr_tracing/Pictures/Gen2_wired.png new file mode 100644 index 0000000000..fead93f9fb Binary files /dev/null and b/corev_apu/instr_tracing/Pictures/Gen2_wired.png differ diff --git a/corev_apu/instr_tracing/Pictures/ITI_diagram_dark.svg b/corev_apu/instr_tracing/Pictures/ITI_diagram_dark.svg new file mode 100644 index 0000000000..c0d441c077 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/ITI_diagram_dark.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid_i [N:0]
rvfi_to_iti [N:0] * 
valid_o [N:0]
iti_to_encoder [N:0] * 
ITI
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/ITI_diagram_detailed_dark.svg b/corev_apu/instr_tracing/Pictures/ITI_diagram_detailed_dark.svg new file mode 100644 index 0000000000..3c3b1b6e95 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/ITI_diagram_detailed_dark.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid_i [N:0]
rvfi_to_iti 
valid_o [N:0]
iti_to_encoder 
pc [N:0][XLEN-1:0];
op [N:0][7:0];
is_compressed [N:0];
branch_valid [N:0];
is_taken [N:0];
ex_valid ;
tval [XLEN-1:0];
cause [XLEN-1:0];
priv_Ivl [1:0];
cycles [63:0];
iretire[N:0][IRET_LEN-1:0];
ilastsize[N:0];
itype [N:0][2:0];
cause [XLEN-1:0];
tval [XLEN-1:0];
priv [1:0];
iaddr [N:0][XLEN-1:0];
cycles [63:0];
ITI
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/ITI_diagram_detailed_light.svg b/corev_apu/instr_tracing/Pictures/ITI_diagram_detailed_light.svg new file mode 100644 index 0000000000..677f5ee169 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/ITI_diagram_detailed_light.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid_i [N:0]
rvfi_to_iti 
valid_o [N:0]
iti_to_encoder 
pc [N:0][XLEN-1:0];
op [N:0][7:0];
is_compressed [N:0];
branch_valid [N:0];
is_taken [N:0];
ex_valid ;
tval [XLEN-1:0];
cause [XLEN-1:0];
priv_Ivl [1:0];
cycles [63:0];
iretire[N:0][IRET_LEN-1:0];
ilastsize[N:0];
itype [N:0][2:0];
cause [XLEN-1:0];
tval [XLEN-1:0];
priv [1:0];
iaddr [N:0][XLEN-1:0];
cycles [63:0];
ITI
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_block_mode_dark.svg b/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_block_mode_dark.svg new file mode 100644 index 0000000000..5e7c938e20 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_block_mode_dark.svg @@ -0,0 +1,3 @@ + + +
itype_detector
itype_detector
itype_detector
itype
clk
rst
valid_i [N:0]
rvfi_to_iti [0]
rvfi_to_iti [1]
rvfi_to_iti [N]
valid_o [N:0]
iti_to_encoder [0]
iti_to_encoder [1]
iti_to_encoder [N]
ITI multiple retirement mode (block) 
Block
Retirement
Block
Retirement
Block
Retirement
special
iret
addr
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_block_mode_light.svg b/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_block_mode_light.svg new file mode 100644 index 0000000000..a543bf353f --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_block_mode_light.svg @@ -0,0 +1,3 @@ + + +
itype_detector
itype_detector
itype_detector
itype
clk
rst
valid_i [N:0]
rvfi_to_iti [0]
rvfi_to_iti [1]
rvfi_to_iti [N]
valid_o [N:0]
iti_to_encoder [0]
iti_to_encoder [1]
iti_to_encoder [N]
ITI multiple retirement mode (block) 
Block
Retirement
Block
Retirement
Block
Retirement
special
iret
addr
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_single_mode_dark.svg b/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_single_mode_dark.svg new file mode 100644 index 0000000000..0aca033e7c --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_single_mode_dark.svg @@ -0,0 +1,3 @@ + + +
Single 
Retirement
Single 
Retirement
Single 
Retirement
itype_detector
itype_detector
itype_detector
itype
clk
rst
valid_i [N:0]
rvfi_to_iti [0]
rvfi_to_iti [1]
rvfi_to_iti [N]
valid_o [N:0]
iti_to_encoder [0]
iti_to_encoder [1]
iti_to_encoder [N]
ITI single retirement mode 
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_single_mode_light.svg b/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_single_mode_light.svg new file mode 100644 index 0000000000..ed16f45d69 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/ITI_diagram_inside_single_mode_light.svg @@ -0,0 +1,3 @@ + + +
Single 
Retirement
Single 
Retirement
Single 
Retirement
itype_detector
itype_detector
itype_detector
itype
clk
rst
valid_i [N:0]
rvfi_to_iti [0]
rvfi_to_iti [1]
rvfi_to_iti [N]
valid_o [N:0]
iti_to_encoder [0]
iti_to_encoder [1]
iti_to_encoder [N]
ITI single retirement mode 
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/ITI_diagram_light.svg b/corev_apu/instr_tracing/Pictures/ITI_diagram_light.svg new file mode 100644 index 0000000000..00f0773da3 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/ITI_diagram_light.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid_i [N:0]
rvfi_to_iti [N:0] * 
valid_o [N:0]
iti_to_encoder [N:0] * 
ITI
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/JA_dark.svg b/corev_apu/instr_tracing/Pictures/JA_dark.svg new file mode 100644 index 0000000000..407ef39bf9 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/JA_dark.svg @@ -0,0 +1,3 @@ + + +
VDD
GND
VDD
GND
rxen
rdn
wrn
txen
oen
clko
spien
siwun
PMOD JA
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/JA_light.svg b/corev_apu/instr_tracing/Pictures/JA_light.svg new file mode 100644 index 0000000000..2242b11d9a --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/JA_light.svg @@ -0,0 +1,3 @@ + + +
VDD
GND
VDD
GND
rxen
rdn
wrn
txen
oen
clko
spien
siwun
PMOD JA
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/JB_dark.svg b/corev_apu/instr_tracing/Pictures/JB_dark.svg new file mode 100644 index 0000000000..dd322aa9a3 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/JB_dark.svg @@ -0,0 +1,3 @@ + + +
VDD
GND
VDD
GND
d[3]
d[2]
d[7]
d[6]
d[1]
d[0]
d[5]
d[4]
PMOD JB
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/JB_light.svg b/corev_apu/instr_tracing/Pictures/JB_light.svg new file mode 100644 index 0000000000..a58e8ebb93 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/JB_light.svg @@ -0,0 +1,3 @@ + + +
VDD
GND
VDD
GND
d[3]
d[2]
d[7]
d[6]
d[1]
d[0]
d[5]
d[4]
PMOD JB
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Main_tracer_dark.svg b/corev_apu/instr_tracing/Pictures/Main_tracer_dark.svg new file mode 100644 index 0000000000..c5dd875103 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Main_tracer_dark.svg @@ -0,0 +1,3 @@ + + +
CVA6
RVFI
ITI

TRACER

rvfi_to_iti
iti_to_encoder
ENCODER
TC
0100
1101
DECODER
Encapsulated 
Packets
[Protocol] 
Packets
HARDWARE
SOFTWARE
program binary
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Main_tracer_light.svg b/corev_apu/instr_tracing/Pictures/Main_tracer_light.svg new file mode 100644 index 0000000000..1a4691ae32 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Main_tracer_light.svg @@ -0,0 +1,3 @@ + + +
CVA6
RVFI
ITI

TRACER

rvfi_to_iti
iti_to_encoder
ENCODER
TC
0100
1101
DECODER
Encapsulated 
Packets
[Protocol] 
Packets
HARDWARE
SOFTWARE
program binary
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Priority_dark.svg b/corev_apu/instr_tracing/Pictures/Priority_dark.svg new file mode 100644 index 0000000000..c1d8b7b587 --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Priority_dark.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid_i
valid_o 
packet_format
Priority
lc_exception
lc_updiscon
lc_final_qualified
tc_exception
tc_updiscon
tc_retired
tc_privchange
tc_enc_enabled
tc_enc_disabled
tc_branchmap_empty
tc_branchmap_full
nc_exception
nc_updiscon
nc_retired
nc_privchange
max_resync
tc_first_qualified
tc_qualified
nc_qualified
nc_branchmap_empty
packet_subformat
qual_status
resync_rst
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/Priority_light.svg b/corev_apu/instr_tracing/Pictures/Priority_light.svg new file mode 100644 index 0000000000..d4eae6ec3d --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/Priority_light.svg @@ -0,0 +1,3 @@ + + +
clk
rst
valid_i
valid_o 
packet_format
Priority
lc_exception
lc_updiscon
lc_final_qualified
tc_exception
tc_updiscon
tc_retired
tc_privchange
tc_enc_enabled
tc_enc_disabled
tc_branchmap_empty
tc_branchmap_full
nc_exception
nc_updiscon
nc_retired
nc_privchange
max_resync
tc_first_qualified
tc_qualified
nc_qualified
nc_branchmap_empty
packet_subformat
qual_status
resync_rst
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/TC_dark.svg b/corev_apu/instr_tracing/Pictures/TC_dark.svg new file mode 100644 index 0000000000..a4e86c2dce --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/TC_dark.svg @@ -0,0 +1,3 @@ + + +
SLICER

Transmission Channel

0100
1101
DECODER
Encapsulated 
Packets
DPTI
Frames
HARDWARE
SOFTWARE
RECEIVER
F2232H
USB
Bridge
DPTI
CTRL
ENCAPS
Packet
Slices
Packets
Decapsulated 
Packets
RAW
Packets
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/TC_light.svg b/corev_apu/instr_tracing/Pictures/TC_light.svg new file mode 100644 index 0000000000..6d2bbcaf9b --- /dev/null +++ b/corev_apu/instr_tracing/Pictures/TC_light.svg @@ -0,0 +1,3 @@ + + +
SLICER

Transmission Channel

0100
1101
DECODER
Encapsulated 
Packets
DPTI
Frames
HARDWARE
SOFTWARE
RECEIVER
F2232H
USB
Bridge
DPTI
CTRL
ENCAPS
Packet
Slices
Packets
Decapsulated 
Packets
RAW
Packets
\ No newline at end of file diff --git a/corev_apu/instr_tracing/Pictures/decoded_trace.png b/corev_apu/instr_tracing/Pictures/decoded_trace.png new file mode 100644 index 0000000000..3d400c6986 Binary files /dev/null and b/corev_apu/instr_tracing/Pictures/decoded_trace.png differ diff --git a/corev_apu/instr_tracing/Pictures/genesys-2.png b/corev_apu/instr_tracing/Pictures/genesys-2.png new file mode 100644 index 0000000000..8c0db43dba Binary files /dev/null and b/corev_apu/instr_tracing/Pictures/genesys-2.png differ diff --git a/corev_apu/instr_tracing/Pictures/genesys2_DPTI.png b/corev_apu/instr_tracing/Pictures/genesys2_DPTI.png new file mode 100644 index 0000000000..81ea39c2c3 Binary files /dev/null and b/corev_apu/instr_tracing/Pictures/genesys2_DPTI.png differ diff --git a/corev_apu/instr_tracing/Pictures/receiver.png b/corev_apu/instr_tracing/Pictures/receiver.png new file mode 100644 index 0000000000..05bfd12d56 Binary files /dev/null and b/corev_apu/instr_tracing/Pictures/receiver.png differ diff --git a/corev_apu/instr_tracing/README.md b/corev_apu/instr_tracing/README.md new file mode 100644 index 0000000000..4e89698f03 --- /dev/null +++ b/corev_apu/instr_tracing/README.md @@ -0,0 +1,721 @@ + + + +# Instruction Tracing + +## Introduction + +Instruction tracing is a crucial feature in modern processor design, particularly when it comes to **certification**, **debugging**, and **formal verification**. It allows engineers to **track the exact sequence of executed instructions**, providing a ground truth that can be compared against expected behavior. + +### Why Instruction Tracing? + +There are several scenarios where instruction tracing is essential: + +* **Certification and Compliance**: In safety-critical systems (e.g., avionics, automotive), it may be necessary to prove that instructions executed **exactly** as specified. +* **Debugging**: When an execution does not behave as expected, a trace can help **reconstruct** the execution flow and understand where and why things went wrong. + +### How Does It Work? + +In this project, we implemented an instruction tracer that uses the **E-TRACE encoding format** (as specified in the [E-Trace specification](https://github.com/riscv-non-isa/riscv-trace-spec)). + + E‑Trace implements a branch‑trace algorithm: it only emits control‑flow "deltas" (branches taken/not‑taken, indirect jumps/calls/returns, interrupts/exceptions) along with PC deltas, assumes sequential instructions implicitly, and can pack multiple retirements into compact packet, achieving a high compression rates while minimizing off‑chip bandwidth and interface complexity. + +There exist other encoding formats such as [N‑Trace](https://github.com/riscv-non-isa/tg-nexus-trace), which is built on the IEEE‑5001 Nexus standard. + +### System Overview + +The tracing system we built is composed of four main elements, illustrated in the block diagram below: + + + + + + + + + +## 1. Instruction Trace Interface (ITI) + +The **Instruction Trace Interface (ITI)** module is implemented in accordance with the [E-Trace specification](https://github.com/riscv-non-isa/riscv-trace-spec) (2025), specifically section 4.2 concerning the Instruction Trace Interface. It sits between the **cva6\_rvfi** (RISC-V Formal Interface) and the **encoder**, and plays a role in collecting and formatting instruction trace data. + +The ITI currently supports **two operating modes**: + +* **Multiple-retirement mode**(`block_mode = 1`): the trace data for several instructions is grouped together and sent to the encoder as a block. +* **Single-retirement mode**(`block_mode = 0`): the trace data are sent to the encoder instructions by instructions. + +At the moment, the ITI only supports the 3-bit itype format (`itype_len = 3`) for classifying instruction types. This is sufficient to distinguish key instruction categories such as branches, uninferable jumps, exceptions, and interrupts. While the E-Trace specification also defines a 4-bit format (`itype_len = 4`) for finer-grained classification, this is not yet implemented in the current design. Support for the 4-bit version could be added later if needed and if compatible with the encoder. + +> For more details about the `itype` field, refer to Table 7 of the [E-Trace specification](https://github.com/riscv-non-isa/riscv-trace-spec), as well as the field description provided just below. + +### Input Interface + + + + + + + +

+The module receives a structured input named **`rvfi_to_iti`**, which encapsulates all the necessary signals to: + +* determine the **instruction type (`itype`)** using fields such as `opcode`, `branch_valid`, etc., +* supply relevant metadata to the encoder like `cycle`, `privilege level`, `pc`, etc. + +Changes were also made to the `cva6_rvfi` module to collect the signals required by the ITI and to properly resynchronize them, since they may originate from different stages of the processor pipeline. This justifies the use of a structured interface to ensure reliable and consistent data transfer to the ITI. + +--- + +### Multiple-Retirement Mode + +In **multiple-retirement mode**, the ITI groups instructions into **blocks**, based on the occurrence of *special* instructions , typically those altering the control flow (e.g., jumps, exceptions, interrupts). + +The ITI outputs the following signals to the encoder in this mode: + +* `iret`: number of half-words for the retired instructions in the current block, +* `iaddr`: address of the first instruction in the block, +* `ilastsize`: size of the last instruction in the block. + +To support this, the ITI adopts a **systolic-like architecture** made up of `block_retirement` submodules. There are `Nr_commit_ports` such submodules, each able to: + +* detect special instructions independently, +* initiate a new block if necessary, +* propagate control and data signals (like `special`, `iaddr`, and incremented `iret`) along a chain. + +This design enables the generation of **multiple blocks in a single cycle** when several special instructions retire simultaneously. + + + + + + + + +--- +### Single-Retirement Mode + +In **single-retirement mode**, the ITI module forwards the trace information **instruction by instruction**, without grouping them into blocks. + +In this configuration: + +* There is no need to track special instructions or segment blocks. +* The encoder receives a simple feed of retired instructions, making this mode well-suited for simpler architectures. + + + + + + + + +--- +### Full System Overview + +The overall role of the ITI module in the trace infrastructure is summarized in the following diagram: + + + + + + +--- +### Continuous Integration for ITI + +The CI (Continuous Integration) test for the ITI is contained in Instr_tracing_test.sh and consist of running a simulation on ariane_testharness with the previous test iti_test.sh and extracting the iti.trace. Then it run the regressionFlow from the [E-Trace specification](https://github.com/riscv-non-isa/riscv-trace-spec) and compare both files. +We cleaned both file to compare what is comparable ,we exclude the start and the end because it's not matching based spike version + + +## 2. Encoder + Encapsulator + +### Collaboration and Reference Design + +For this module, we collaborate with the University of Bologna by integrating their version of the encoder, available +[here](https://github.com/pulp-platform/rv_tracer) + +Their repository is well-documented and serves as a solid foundation. The encoder design is aligned with the **E-Trace specification** and leverages an ITI running in **multiple-retirement mode** to emit **trace packets**. These packets are structured according to the **instruction delta trace algorithm** described in the [E-Trace specification](https://github.com/riscv-non-isa/riscv-trace-spec) (Figure 1), which provides a model for encoding deltas (non-linearities) in the control flow. + +Each data trace outputed by the ITI, whether block-based or instruction-based, is interpreted to identify these deltas and transmit them in the form of trace packets. These packets vary in format and size depending on the instruction type and control flow transitions. + +--- + +### Custom Implementation and Simplification + +While their encoder provides a baseline, it remains under active development. In its current state, its behavior (in terms of number of packets emitted, their contents, or supported options) differs from the Reference Flow. + +As a result, we opted to build a simplified version derived from the original architecture. This internal encoder: + +* Expects **instruction-by-instruction traces** as input, +* Supports only **Nr\_commit\_ports = 1** (single commit port), +* Implements only a **basic subset** of the E-Trace functionality. + +This choice facilitates initial validation and integration, though we remain open to switching back to a mature multiple-retirement encoder once available. + +Below is a high-level architectural diagram of the current encoder setup (here `N=1`): + + + + + + +--- + +### Submodules Description + +The encoder is composed of several key submodules: + +### Submodules Description + +The encoder is composed of several key submodules: + +* **Priority**: + This submodule constitutes the core of the *Instruction Delta Trace Algorithm*. It is responsible for analyzing control flow transitions across instructions and determining the format and/or subformat of trace packets to be emitted. + + + + + + + + The logic is driven by three categories of input signals that represent the state of the instruction stream at different points in time: + - **lc**: *Last Cycle* - information from the previous retired instruction, + - **tc**: *This Cycle* - information from the currently retiring instruction, + - **nc**: *Next Cycle* - information from the next instruction. + + > Some signals are intentionally absent for the sake of understanding + + Using these signals, the `Priority` module identifies the relevant **deltas** (e.g., taken branches, jumps, exceptions) and selects the appropriate **packet format and/or subformat**, which will subsequently guide the `Packet_Emitter`. + +
+ + | Format | Subformat | Description | + | :------: | :-------: | :------------------ | + | 3 | 3 | Support | + | | 2 | Context | + | | 1 | Trap | + | | 0 | Synchronisation | + | 2 | | Address Only | + | 1 | | Branch | + | 0 | | Optional extensions | +
+ + > For more details, refer to [Chapter 7 (Instruction Trace Encoder Output Packet)](https://github.com/riscv-non-isa/riscv-trace-spec) (2025), or consult the corresponding encoder section in the [University of Bologna's implementation](https://github.com/pulp-platform/rv_tracer). + + +* **Packet_Emitter**: + This submodule is responsible for **constructing and filling the trace packet** to be emitted. It plays a central role in materializing the output of the delta trace algorithm into a well-structured packet format compliant with the E-Trace specification. + + + + + + + + Similar to the `Priority` module, it receives multiple input signals that span across different time domains (*lc*,*tc*,*nc*). + + However, the most important **inputs** for this submodule is the **packet format and/or subformat**, which is deteminated by the `Priority` module. This format/subformat dictates the structure and contents of the packet's payload. Also **ppccd** means privilege change, precise context change or context change with discontinuity. + + Based on this, the `Packet_Emitter` output: + - The **payload** which contains all the fields expected for this packet, + - The **packet length** (in bytes), depending on the format/subformat and data, + - A **branch_map_flush** signal that is used to flush the `branch_map` field. This ensures the `branch_map` is ready to accurately track future branches for the next packet. + + > For a complete description of each packet type and its associated payload content, refer to [Chapter 7 (Instruction Trace Encoder Output Packet)](https://github.com/riscv-non-isa/riscv-trace-spec) of the E-Trace specification (2025). + +* **Filter**: + The `Filter` submodule is responsible for **selectively enabling or disabling instruction tracing** (with the qualified signal) based on configurable events defined through **Control Registers**. By filtering out irrelevant or redundant instructions, it can significantly improves trace analysis efficiency and bandwidth usage. + + + + + + + + The filtering mechanism supports a variety of events, including: + + - **Range Address**: Enables tracing **only when the instruction address (`iaddr`) falls within a specified address window**, defined by a `lower_addr` and a `higher_addr` boundary. + - **Stop Event**: Immediately halts instruction tracing when triggered. + - **Selected Privilege Level**: Enables or disables tracing depending on the **current privilege level** (e.g., user, supervisor, machine mode). + - **Other Events**: Filtering can also be triggered by **exceptions**, **interrupts**, or other **context-specific conditions**. + + +* **Branch\_Map**: + The `Branch_Map` submodule acts as a **history buffer** for recently executed branch instructions. It plays a crucial role in the generation of compressed trace packets by allowing the encoder to **reconstruct control-flow paths** through a compact representation. + + + + + + + This module maintains two key outputs: + + - **`branch_map`**: a **bitfield** representing the history of up to 31 conditional branches. For each branch, a **bit is added to the right**: + - `0` if the branch was **taken**, + - `1` if the branch was **not taken**. + + - **`branches`**: an **integer count** of how many branches are currently stored in the map (max: **31**). This counter helps determine the valid width of the `branch_map` field and guides packet formatting/decoding. + + The branch_map is updated as instructions retire. Once the maximum depth is reached or a flush is triggered (e.g., via `branch_map_flush` from the `Packet_Emitter`), the map is cleared to allow tracking of the next sequence. + + Here is an illustrative example, taken from [E-Trace Specification – Chapter 12, Example 4](https://github.com/riscv-non-isa/riscv-trace-spec). + + + + + + + + +--- + +### Encapsulation Module + +This module was developed by the **University of Bologna**, and we reused the `encapsulator.sv` module **as-is**, without any modifications. We chose **not to integrate the other submodules** provided in the original repository, as they are designed for the **ATB (Advanced Trace Bus)** protocol. In our case, we rely on a different trace output interface, named **DPTI (Digilent Parallel Transfer Interface)**, making the use of those ATB-specific modules unnecessary. [Here](https://github.com/pulp-platform/rv_encapsulator) is the repository of the encapsulator from the **University of Bologna**. + +The **encapsulator** is placed directly after the encoder and is responsible for wrapping each trace packet into a **standardized encapsulation format** as defined by the [encapsulation specification](https://github.com/riscv-non-isa/e-trace-encap). + +This format ensures **interoperability**, provides **framing rules**, and facilitates **packet-level synchronization** in the *transmission channel* interface. Each encapsulated packet in this implementation is **fixed at 320 bits (40 bytes)** and includes this field groups: + +- **Header (8 bits)**: + Includes a `length` field (5 bits) specifying the payload size in bytes, a `flow` field (2 bits) which is currently set to `00` (no multi-sink used yet), and an `extend` bit (1 bit) which is set to `1`, indicating the presence of a timestamp (T ? in the figure bellow). + +- **Timestamp (`T * 8` bits)**: + The timestamp is included in our packets and is **fixed at 8 bytes (64 bits)**. Its presence is governed by the `extend` bit in the header. + +- **Payload (1–248 bits)**: + Contains the actual trace packet, emmited by the encoder with `packet_payload_o`. + +An illustration of the encapsulation structure is shown below: + + + + + + +

+ +Once encapsulated, the packets are written into a **FIFO buffer**, where they await transmission through the trace communication channel. + +This design enables modular evolution: improvements or full spec-compliance in the encoder can be adopted later without altering the overall encapsulation and transmission stages. +

+ +> While the [encapsulation specification](https://github.com/riscv-non-isa/e-trace-encap) also defines support for **source IDs** , **null packets** (e.g., `null.idle`, `null.alignment`), and **synchronization sequences**, these features are **not yet implemented** in the current prototype. + +### Continuous Integration for Encoder + Encapsulator + +The CI (Continuous Integration) test for the Encoder and Encapsulator is also contained in Instr_tracing_test.sh and consists in running a simulation on ariane_testharness with the previous test iti_test.sh and extracting the `encoded.trace`, it will convert them in decaspulated csv format with the Decapsuler. Then it runs the regressionFlow from the [E-Trace specification](https://github.com/riscv-non-isa/riscv-trace-spec) and compare both files. +We cleaned both file to compare what is comparable, again we exclude the start and the end because it's not matching based spike version. + + +--- + + +## 3. Transmission Channel (TC) via DPTI + +
+ +

Figure: Digilent Genesys2 development board

+
+ +Picture from [Digilent Reference Manual](digilent.com/reference/programmable-logic/genesys-2/reference-manual) +

+Since most onboard peripherals (UART, SPI, etc.) are already used by the `ariane_xilinx` platform, we use the **FTDI FT2232H**'s DPTI interface exposed on the **USB-JTAG bridge (J17)**: + +
+ +

Figure: USB-JTAG bridge

+
+ +Picture from [Digilent Reference Manual](digilent.com/reference/programmable-logic/genesys-2/reference-manual) + +- **DPTI/DSPI header** on J17 provides: + - A **Digilent Parallel Transfer Interface (DPTI)** channel + - A generic SPI channel (not used here due to limited bandwidth) + +We selected **DPTI** because it is a **mature, out‑of‑the‑box solution** full driver support from Digilent Adept ([Adept Drivers & Utilities](https://digilent.com/reference/software/adept/)). + +--- + +### FT2232H Ports in Genesys 2 + +The FT2232H chip offers two independent channels but in the Top platform `ariane_xilinx` both of them are used : + +| Port | Default Use in `ariane_xilinx`| +|-------|-------------------------------| +| Port A| Bitstream injection | +| Port B| Debug Module interface | + +Because both channels are occupied, we have two deployment options: + +1. **Re-purpose Port B** + - **Disconnect the Debug Module** in `ariane_xilinx.sv`. + - Update `genesys.xdc` to add DPTI pin constraints (e.g., check the [default constraint file](https://github.com/Digilent/digilent-xdc/blob/master/Genesys-2-Master.xdc) section DPTI). + - Inject your program via the on‑chip **bootrom**, modify the Makefile in `corev_apu/fpga/src/bootrom` accordingly. + +2. **Add an FT2232H MiniModule** + - Use a standard [FT2232H Mini Module](https://ftdichip.com/products/ft2232h-mini-module/) connected to two PMOD headers. + - This gives you two **additional** FT2232H channels without touching the existing Port A/B setup. + +
+ +

Figure: FT2232H MiniModule wired to Genesys2 PMODs

+
+

+
+ + + + + + + + + + + +
+

+ +> For more details on the wiring, check these resources: +> - [FT2232H Datasheet](https://ftdichip.com/wp-content/uploads/2024/09/DS_FT2232H.pdf), Table 3.1 +> - [FT2232H Mini Module Datasheet](https://ftdichip.com/wp-content/uploads/2020/07/DS_FT2232H_Mini_Module.pdf), Table 3.1 and Table 3.2 and USB Bus-powered section. + +--- + +### Platform Modifications + + + + + + + + +1. **DPTI Controller** + - Add `dpti_ctrl.vhd` to handle **frame send/receive** over DPTI. This module is provided by Digilent and can be found in the [**Digilent Adept SDK**](https://lp.digilent.com/complete-adept-runtime-download), under `samples/dpti/DptiDemo/logic/dpti_ctrl.vhd`. + - Protocol: **8-bit parallel**, synchronous/asynchronous, running at **60 MHz**, allowing for up to **480 Mbps** throughput. + - The controller requires a clock. It is instantiated in the platform using `xlnx_dpti_clk` located in `cva6/corev_apu/fpga/xilinx/xlnx_dpti_clk`. Alternatively, it can be added to the Vivado project using a Clock Wizard. An example configuration is available in `samples/dpti/DptiDemo/logic/clk_wiz_0.v`. + +2. **Packet Slicer** + - Our trace packets are **320 bits** (40 bytes). + - Insert `slicer_DPTI.sv` to segment each packet into **40 eight‑bit frames** for DPTI transport. + +3. **PMOD Pin Mapping & Constraints** + - PMOD pins used must support external clock (C‑capable). Follow [UG472](https://docs.amd.com/v/u/en-US/ug472_7Series_Clocking) (Vivado) guidelines. + - Example excerpt from `genesys2.xdc`: + ```xdc + ## PMOD Header JA + #set_property -dict { PACKAGE_PIN U27 IOSTANDARD LVCMOS33 } [get_ports prog_clko]; #IO_L13P_T2_MRCC_14 Sch=ja_p[1] + #set_property -dict { PACKAGE_PIN U28 IOSTANDARD LVCMOS33 } [get_ports prog_oen]; #IO_L13N_T2_MRCC_14 Sch=ja_n[1] + #set_property -dict { PACKAGE_PIN T26 IOSTANDARD LVCMOS33 } [get_ports prog_rdn]; #IO_L12P_T1_MRCC_14 Sch=ja_p[2] + #set_property -dict { PACKAGE_PIN T27 IOSTANDARD LVCMOS33 } [get_ports prog_rxen]; #IO_L12N_T1_MRCC_14 Sch=ja_n[2] + #set_property -dict { PACKAGE_PIN T22 IOSTANDARD LVCMOS33 } [get_ports prog_siwun]; #IO_L5P_T0_D06_14 Sch=ja_p[3] + #set_property -dict { PACKAGE_PIN T23 IOSTANDARD LVCMOS33 } [get_ports prog_spien]; #IO_L5N_T0_D07_14 Sch=ja_n[3] // Not needed here + #set_property -dict { PACKAGE_PIN T20 IOSTANDARD LVCMOS33 } [get_ports prog_txen]; #IO_L4P_T0_D04_14 Sch=ja_p[4] + #set_property -dict { PACKAGE_PIN T21 IOSTANDARD LVCMOS33 } [get_ports prog_wrn]; #IO_L4N_T0_D05_14 Sch=ja_n[4] + + ## PMOD Header JB + #set_property -dict { PACKAGE_PIN V29 IOSTANDARD LVCMOS33 } [get_ports { prog_d[0] }]; #IO_L17P_T2_A14_D30_14 Sch=jb_p[1] + #set_property -dict { PACKAGE_PIN V30 IOSTANDARD LVCMOS33 } [get_ports { prog_d[1] }]; #IO_L17N_T2_A13_D29_14 Sch=jb_n[1] + #set_property -dict { PACKAGE_PIN V25 IOSTANDARD LVCMOS33 } [get_ports { prog_d[2] }]; #IO_L18P_T2_A12_D28_14 Sch=jb_p[2] + #set_property -dict { PACKAGE_PIN W26 IOSTANDARD LVCMOS33 } [get_ports { prog_d[3] }]; #IO_L18N_T2_A11_D27_14 Sch=jb_n[2] + #set_property -dict { PACKAGE_PIN T25 IOSTANDARD LVCMOS33 } [get_ports { prog_d[4] }]; #IO_L14P_T2_SRCC_14 Sch=jb_p[3] + #set_property -dict { PACKAGE_PIN U25 IOSTANDARD LVCMOS33 } [get_ports { prog_d[5] }]; #IO_L14N_T2_SRCC_14 Sch=jb_n[3] + #set_property -dict { PACKAGE_PIN U22 IOSTANDARD LVCMOS33 } [get_ports { prog_d[6] }]; #IO_L21P_T3_DQS_14 Sch=jb_p[4] + #set_property -dict { PACKAGE_PIN U23 IOSTANDARD LVCMOS33 } [get_ports { prog_d[7] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=jb_n[4] + ``` + - Ensure **V3V3** pins are tied to **VIO** in the MiniModule. + +4. **FT2232H Configuration** + - Use **FT_Prog** (or equivalent) to set the MiniModule into **USB FIFO mode**. + - ⚠️ Digilent Adept drivers validate a protected EEPROM region not writable via FT_Prog. + - Either use Digilent reprogramming executable + - Or adapt the C++ receiver to be compatible with the FTDI drivers. + +
+ +

Figure: Valid EEPROM for DPTI

+
+ +--- + +### Bitstream Build & Deployment + +Once hardware wiring and constraints are in place with ITI, Encoder, Encapsulator, etc. : +> We used Vivado version: 2018.2 +```bash +make clean +make fpga TARGET=cv32a6_imac_sv32 +``` + +Then upload the generated ariane_xilinx.bit via Vivado Lab or your preferred hardware manager. + +--- +## 4. Software-Side Reception + +The trace reception is handled on a **Linux-based host PC**, which is connected either to the **FTDI MiniModule** or directly to the **Genesys2 board via port J17**. + +To enable communication via **DPTI (Digilent Parallel Trace Interface)**, you must first install the [**Digilent Adept SDK**](https://lp.digilent.com/complete-adept-runtime-download), specifically version `2.4.2`. This provides the required runtime libraries and development headers. The receiver code needs a C++17 version for `std::optional`. + +--- + +### Setup Instructions + +1. **Install Adept SDK** + + * Ensure the Digilent API is installed and correctly configured. + * The official Digilent SDK and documentation provide a guide. + +2. **Configure and Compile the Receiver** + + * The receiver code is located in `Receiver_DPTI.cpp`. + * You must **edit the `Makefile`** to match the paths to the Adept libraries and headers. + + * Refer to the README files in `digilent.adept.sdk_2.4.2/samples` for more informations . + * Then compile the program with: + + ```bash + make clean + make + ``` + +3. **Device Detection and Debugging** + + * The receiver includes debug function, such as `Scan_Device`, which: + + * Lists connected FTDI devices + * Displays their names + +4. **Configure BOARD\_NAME** + + * You must update the `BOARD_NAME` field in `Receiver_DPTI.cpp` to match the actual serial string of your connected device. + * Example: + + ```cpp + char* BOARD_NAME = (char*) "#tpt_0001#ptc_0002#210300075227"; + ``` + * After editing the file, recompile: + + ```bash + make clean + make + ``` + +5. **Running the Receiver** + + * Launch the receiver with: + + ```bash + ./Receiver_DPTI + ``` + * The program proceeds in **two phases**: + + * **Acquisition Phase**: Data is streamed and stored in raw format. Stop the acquisition with `SIGINT` (Ctrl+C). + * **Decapsulation Phase**: The raw binary packets are parsed and converted into human-readable CSV format. + + +
+ +

Figure: Valid execution ./Receiver_DPTI

+
+ +--- + +### Output Files + +Two output files are generated in the `receiver_data/` directory: + +* `YYYYMMDD_hhmm_raw_file.txt` - the raw encapsulated packets +* `YYYYMMDD_hhmm_data.csv` - the decoded content in CSV format + +These CSV files can be supplied to a decoder for further analysis. + +>Currently, no custom decoder is implemented. We use the reference decoder provided in the Reference Flow repository to interpret the trace contents. The University of Bologna released a version of their decoder on 3rd July 2025, but we have not evaluated it yet. + +--- + +## 5. Decoder + +At this stage, we have **not yet implemented** our own decoder. Instead, we rely on the **Reference Flow decoder** provided by the E‑Trace specification. + +#### Running the Reference Flow + +To perform decoding, you first need to run the full reference flow regression so that it can generate the files from the program binary required by its version of Spike(in the `referenceFlow`). In addition, your compiled program must be renamed with a `.riscv` extension so that the flow recognizes it as RISC‑V input and it need to be place in `referenceFlow/tests/test_files`. + +1. **Prepare your binary** + ```bash + cp path/to/your_program.elf referenceFlow/tests/test_files/your_program.riscv + ``` +2. **Execute the full reference flow** +```bash +cd referenceFlow +./scripts/run_regression.sh \ + -t itype3_debug \ + --annotate \ + --debug\ + tests/test_files/your_program.riscv +``` + + * `-t`: Specify the test suite used, here we choose `itype3_debug` to match our encoder and `_debug` to add more information in packets like `full_address mode` + * `--annotate`: This flag is optionnal and using it create annotated version of output files , usefull for understanding/debugging + * `--debug`: This flag is optionnal and using it will print in the terminal more informations about each stage + +### Decoding the Trace +Once the reference flow regression has run successfully (and generated the files needed), you can invoke the decoder step: + +```bash +cd referenceFlow +./scripts/decoder_model.py \ + -u regression_YYYYMMDD_hhmmss/itype3_debug/your_program.decoder.ucf \ + -c regression_YYYYMMDD_hhmmss/itype3_debug/hardware.scf \ + -i TRACE_OUTPUT + +``` + * `-u`: user_config, this file is generated with the first regression, inside there are information about debug flags, object-files, encoder configuration, etc + * `-c`: static_config, this file is also generated but correspond to test suite you choose, inside there are informations about default values (size of fields, encoder options, etc) + * `-i`: This file is the output of the encoder by default :`regression_YYYYMMDD_hhmmss/itype3_debug/your_program.te_inst_raw` but you can use the trace from the receiver, it support CSV format and raw format (needs to be a real binary in this case) + + If everything matches, meaning there are no difference between the captured trace and the reference Trace, you will obtain an output file like this: + +
+ +

Figure: Excerpt from decoded trace

+
+ +

+⚠️ Mismatches can occur if, for example: + +* The platform's address map (CrossBar) doesn't align with your binary's load addresses + +* The encoder fails to emit a packet (e.g., due to a bug in the encoder) + +* There is receiver desynchronization or signal glitches during trace capture + +### Current Limitations & Future Work +When we load the program via the onboard Debug Module, you will notice "trace pollution" : extra instructions corresponding to debug and JTAG activity appear in the trace. One way to mitigate this is to use the Filter submodule in the encoder to suppress unwanted instructions. However: + +**Problem:** We have not yet exposed the APB path needed to drive the Filter's control registers at runtime. + +**Next Steps:** Extend the encoder to include an APB interface for the Filter module, allowing dynamic trace filtering before encapsulation. + + +## 6. Debug Automation & VSCode Setup + +This section presents a set of **automation tools and configurations** developed to streamline the debug process using **Visual Studio Code (VSCode)**. The goal is to make it easy to: + +* **Compile user programs** into a binary format compatible with the **CV32A6** core +* **Launch OpenOCD** using the expected configuration (`ariane.cfg`) +* **Start GDB** in **remote debug mode**, attached to the target via OpenOCD + +--- + +### VSCode Integration + +To integrate these operations directly within the VSCode interface, we make use of two special configuration files: + +* `.vscode/launch.json` - defines how to start a debugging session +* `.vscode/tasks.json` - defines custom build and terminal commands + +With this setup, you can use the built-in **debug pane** of VSCode to: + +* Upload and connect to the board +* Step through code using breakpoints and GDB integration + +These files must be placed inside a `.vscode/` directory at the root of the project. + +--- + +### File Overview + +**launch.json** + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug FPGA via OpenOCD", + "type": "cppdbg", + "targetArchitecture": "x86_64", + "request": "launch", + "program": "${workspaceFolder}/Prog_compiled", + "miDebuggerServerAddress": "localhost:3333", + "useExtendedRemote": true, + "miDebuggerPath": "toolchain/bin/riscv-none-elf-gdb", + "stopAtEntry": true, + "stopAtConnect": true, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "preLaunchTask": "build-and-start-openocd", + "postRemoteConnectCommands": [ + { + "text": "source ${workspaceFolder}/gdb_init.txt" + } + ] + } + ] + } +``` + +**tasks.json** + +```json +{ + "version": "2.0.0", + "tasks": [ + + { + "label": "build-exec", + "type": "shell", + "command": "riscv-none-elf-gcc", + "args": [ + "-g", "-T", "custom_linker.ld", + "-march=rv32imac_zicsr", + "-lgcc", "-fvisibility=hidden", + "-mcmodel=medany", "-mabi=ilp32", + "-nostartfiles", "crt.S", "syscalls.c", "test.c", + "-o", "Prog_compiled" + ], + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "start openocd", + "type": "shell", + "command": "bash", + "args": [ + "-c", + "nohup gnome-terminal -- bash -c \"openocd -f ariane.cfg; exec bash\"" + ], + "problemMatcher": [] + }, + { + "label": "build-and-start-openocd", + "dependsOn": ["build-exec", "start openocd"] + } + ] + } + + +``` + +These configurations are adaptable to your own build system or directory structure. + +--- + +### Additional Resources + +* [VSCode Debugging Documentation](https://code.visualstudio.com/docs/debugtest/debugging) +* [VSCode Task Configuration](https://code.visualstudio.com/docs/debugtest/tasks) diff --git a/corev_apu/instr_tracing/SW/Receiver_DPTI/Makefile b/corev_apu/instr_tracing/SW/Receiver_DPTI/Makefile new file mode 100644 index 0000000000..50517ba22e --- /dev/null +++ b/corev_apu/instr_tracing/SW/Receiver_DPTI/Makefile @@ -0,0 +1,30 @@ +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales + +# Makefile to build the receiver executable +# You need to properly install Digilent Adept and correctly link adept sdk lib +CC = g++ +INC ?= $(HOME)/runtime_adept/digilent.adept.sdk_2.4.2 +LIBDIR = /usr/lib64/digilent/adept +TARGETS = Receiver_DPTI +CFLAGS = -I $(INC) -L $(LIBDIR) -ldpti -ldmgr -Wall -Wextra -g + +all: $(TARGETS) + +Receiver_DPTI: Receiver_DPTI.cpp + $(CC) -o Receiver_DPTI Receiver_DPTI.cpp $(CFLAGS) + +.PHONY: clean + +clean: + rm -f $(TARGETS) + +clean_all: + rm -f $(TARGETS) + rm -rf receiver_data diff --git a/corev_apu/instr_tracing/SW/Receiver_DPTI/Receiver_DPTI.cpp b/corev_apu/instr_tracing/SW/Receiver_DPTI/Receiver_DPTI.cpp new file mode 100644 index 0000000000..51290d38d6 --- /dev/null +++ b/corev_apu/instr_tracing/SW/Receiver_DPTI/Receiver_DPTI.cpp @@ -0,0 +1,455 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 17/06/2025 +// Contributors: +// Côme Allart - Thales + +// This code is designed to receive encapsulated packets emitted by an instruction encoder (See e-trace-encap). +// It captures them in two formats: raw and decapsulated (.csv). +// These files can then be passed to a decoder (e.g., riscv-trace-spec/referenceFlow/scripts/decoder_model.py). + +// To properly use this receiver, you need a Digilent FPGA board using the DPTI module from the Adept SDK. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dpcdecl.h" +#include "dmgr.h" +#include "dpti.h" + +volatile sig_atomic_t stop = 0; + +void handle_sigint(int) { stop = 1; } + +const size_t NR_PKT = 20; +const size_t PACKET_SIZE = 40; +const size_t BLOCK_SIZE = NR_PKT * PACKET_SIZE; + +typedef BYTE packet_t[PACKET_SIZE]; +typedef std::array sample_t; + +uint64_t extract_bits(const packet_t &packet, std::size_t bit_offset, + std::size_t bit_length) { // FIXME add assertion to prevent desynchro segfault + uint64_t result = 0xdead; // We use 'dead' as an indicator to quickly detect if a desynchro happened during the aquisition (without stoping decapsulation) + if (bit_length <= 64) { + result = 0; + for (std::size_t i = 0; i < bit_length; ++i) { + std::size_t global_bit = bit_offset + i; + std::size_t byte_index = global_bit / 8; + std::size_t bit_index = 7 - (global_bit % 8); + uint64_t bit = (packet[byte_index] >> bit_index) & 0x1; + result = (result << 1) | bit; + } + } + return result; +} + +template struct PrintableOption : public std::optional { + PrintableOption(std::optional &o) : std::optional(o) {} + PrintableOption(T &v) : std::optional(v) {} + PrintableOption(uint64_t v) : std::optional(v) {} + PrintableOption() : std::optional() {} + + friend std::ostream &operator<<(std::ostream &s, const PrintableOption &o) { + if (o.has_value()) + s << unsigned(*o); + else + s << "_"; + + return s; + } +}; + +struct BitExtractor { + const packet_t &packet; + bool is_backward; + size_t i; + + BitExtractor(const packet_t &packet, bool backward) + : packet(packet), is_backward(backward), + i(backward ? PACKET_SIZE * 8 : 0) {} + + uint64_t operator()(size_t bits) { return extract(bits); } + uint64_t to(size_t bit) { return extract_to(bit); } + + uint64_t extract_to(size_t bit) { return extract(i - bit); } + uint64_t extract(size_t bits) { + if (is_backward) + i -= bits; + + uint64_t result = extract_bits(packet, i, bits); + + if (!is_backward) + i += bits; + + return result; + } +}; + +struct Trace { + bool P_Time; // MSB + uint8_t P_ID; // 2 bits after MSB + uint8_t P_Size; // 5bits after P_ID + uint64_t P_Timestamp; // 64 bits after P_Size + PrintableOption format; // 2bits LSB + PrintableOption subformat; // 2bits before LSB if format=3 + PrintableOption address; // start of payload + PrintableOption branch; // F3SF0 (5) F3SF1 (5) else NDF + PrintableOption branches; // F1 (3) + PrintableOption branch_map; // F1 (4 : branches) + PrintableOption branch_count; // NDF + PrintableOption branch_fmt; // NDF + PrintableOption context; // NDF + PrintableOption ecause; //F3SF1 (8) F3SF1T (70) + PrintableOption ienable; //F3SF3 (5) + PrintableOption encoder_mode;//F3SF3 (6) + PrintableOption interrupt; // F3SF1(9) F3SF1T(71) + PrintableOption irreport; // F2 (5) F1(5) + PrintableOption irdepth; //if call/ret F2(6:2^cal) F1(6:2^cal) else NDF + PrintableOption notify; // F2(3) F1(3) + PrintableOption ioptions; //F3SF3 (8:15) + PrintableOption privilege; // F3SF0 (6) F3SF1 (6) F3SF2 (5) + PrintableOption qual_status;// F3SF3(7) + PrintableOption time; //if time F3SF0(8:72) F3SF1(8:72) F3SF2(7:71) //FIXME encoder could have time in last position + PrintableOption thaddr; // F3SF1(40) F3SF1_t(104) + PrintableOption tval; //F3SF1 (41:73) F3SF1_t(105:137) + PrintableOption updiscon;// F2(4) + PrintableOption denable;// NDF here + PrintableOption dloss;// NDF here + PrintableOption doptions;// NDF here + uint8_t size_branch_map; + + Trace(const packet_t &packet, bool time_flag, bool call_flag) { + size_branch_map = 0; + + BitExtractor header_extractor(packet, false); + BitExtractor payload_extractor(packet, true); + + // Header of encapsulated packet : + P_Time = header_extractor(1); + P_ID = header_extractor(2); + P_Size = header_extractor(5); + size_t P_Start = (PACKET_SIZE - P_Size) * 8; + P_Timestamp = header_extractor(64); + + // Extraction of fields contained in the payload : + format = payload_extractor(2); + if (format == 3) { + subformat = payload_extractor(2); + } + + if (format == 3 && subformat.has_value()) { + switch (subformat.value()) { + case 0: { // F3SF0 + branch = payload_extractor(1); + privilege = payload_extractor(2); + if (time_flag) { + time = payload_extractor(64); + } + address = payload_extractor.to(P_Start); + break; + } + case 1: { // F3SF1 + branch = payload_extractor(1); + privilege = payload_extractor(2); + if (time_flag) { + time = payload_extractor(64); + } + ecause = payload_extractor(32); + interrupt = payload_extractor(1); + thaddr = payload_extractor(1); + tval = payload_extractor(32); + address = payload_extractor.to(P_Start); + break; + } + case 2: { // F3SF2 + privilege = payload_extractor(2); + if (time_flag) { + time = payload_extractor(64); + } + break; + } + case 3: { // F3SF3 + ienable = payload_extractor(1); + encoder_mode = payload_extractor(1); + qual_status = payload_extractor(2); + ioptions = payload_extractor(7); + break; + } + } + } + + // F2 + if (format == 2) { + notify = payload_extractor(1); + updiscon = payload_extractor(1); + irreport = payload_extractor(1); + if (call_flag) { // FIXME addapt to call_counter_size + irdepth = payload_extractor(1); // if = 0 else 2^call_counter_size + } + address = payload_extractor.to(P_Start); + } + + // F1 + if (format == 1) { + branches = payload_extractor(5); + if(branches==0) { + size_branch_map = 31; + } else if (branches == 1) { + size_branch_map = 1; + } else if (branches <= 3) { + size_branch_map = 3; + } else if (branches <= 7) { + size_branch_map = 7; + } else if (branches <= 15) { + size_branch_map = 15; + } else { + size_branch_map = 31; + } + + branch_map = payload_extractor(size_branch_map); + + if (branches != 0) { + notify = payload_extractor(1); + updiscon = payload_extractor(1); + irreport = payload_extractor(1); + if (call_flag) { // FIXME addapt to call_counter_size + irdepth = payload_extractor(1); // if = 0 else 2^call_counter_size + } + address = payload_extractor.to(P_Start); + } + } + } + + static std::string csvHeader() { + return std::string( + "format,subformat,address,branch,branches,branch_map,branch_count," + "branch_fmt,context,ecause,ienable,encoder_mode,interrupt,irreport," + "irdepth,notify,ioptions,privilege,qual_status,time,thaddr,tval," + "updiscon,denable,dloss,doptions"); + } + + friend std::ostream &operator<<(std::ostream &s, Trace const &trace) { + trace.put_str(s); + return s; + } + + std::ostream &put_str(std::ostream &s) const { + s << format << "," << subformat << ","; + + s << std::hex << std::nouppercase << address << std::dec << ","; + + s << branch << "," << branches << "," << branch_map << "," << branch_count + << "," << branch_fmt << ","; + + s << context << "," << ecause << "," << ienable << "," << encoder_mode + << "," << interrupt << ","; + + s << irreport << "," << irdepth << "," << notify << "," << ioptions << "," + << privilege << "," << qual_status << ","; + + s << std::hex << std::nouppercase << time << std::dec << ","; + + s << thaddr << "," << tval << "," << updiscon << "," << denable << "," + << dloss << "," << doptions ; + + return s; + } + + std::string toCSVLine() { + std::ostringstream oss; + oss << *this; + return oss.str(); + } +}; + +std::string getTime () { + auto now = std::chrono::system_clock::now(); + std::time_t t = std::chrono::system_clock::to_time_t(now); + std::tm tm = *std::localtime(&t); + std::ostringstream ts; + ts << std::put_time(&tm, "%Y%m%d_%H%M"); + std::string timestamp = ts.str(); + + return timestamp; +} + +void Scan_Device (){ + int indexmax; + DmgrEnumDevices(&indexmax); + std::cout << indexmax < transaction_DPTI(uint32_t peripheral_handle) { + bool Transaction; + int error; + auto sample_ptr = std::make_unique(); + Transaction = DptiIO(peripheral_handle, NULL, 0, (BYTE *) sample_ptr.get(), BLOCK_SIZE, false); + + if (!Transaction) { + error = DmgrGetLastError(); + if (error == ercTransferCancelled) { + throw std::runtime_error("data transfer timed out"); + } else { + throw std::runtime_error("data transfer failed code : " + std::to_string(error)); + } + } + return sample_ptr; +} + +int main() { + // Change this field according to your board / encoder + char *BOARD_NAME = (char*)"#tpt_0001#ptc_0002#210300075227"; + const int32_t PORT = 1; // 0 or 1 + const bool TIME_FLAG = 1; + const bool CALL_FLAG = 0; + + uint32_t peripheral_handle; + peripheral_handle = hifInvalid; + size_t counter = 0; + std::vector> all_data; + //Scan_Device(); + const std::string out_dir = "receiver_data"; + + if (!std::filesystem::exists(out_dir)) { + std::filesystem::create_directory(out_dir); + } + + std::string timestamp= getTime(); + + // File paths + std::string raw_path = out_dir + "/" + timestamp + "_raw_file.txt"; + std::string csv_path = out_dir + "/" + timestamp + "_data.csv"; + + std::ofstream raw_file(raw_path); + std::ofstream csvFile(csv_path); + + + + // Initialisation of the DPTI Channel + try { + peripheral_handle = init_DPTI(BOARD_NAME, PORT); + } catch (const std::exception &e) { + if (peripheral_handle != hifInvalid) { + DptiDisable(peripheral_handle); + DmgrClose(peripheral_handle); + } + std::cerr << "ERROR Init : " << e.what() << std::endl; + return 1; + } + + + // Capture loop + signal(SIGINT, handle_sigint); + std::cout << "\nLoop (Ctrl+C to exit)\n\n"; + auto capture_start = std::chrono::high_resolution_clock::now(); + while (!stop) { + try { + auto sample_ptr = transaction_DPTI(peripheral_handle); + all_data.push_back(std::move(sample_ptr)); + + std::cout << "\rIteration : " << counter << " " << std::flush; + counter += NR_PKT; + } catch (const std::exception &e) { + std::cerr << "ERROR Transaction : " << e.what() << std::endl; + break; + } + } + auto capture_end = std::chrono::high_resolution_clock::now(); + + std::chrono::duration capture_delta_time = + capture_end - capture_start; + double capture_delta_time_sec = capture_delta_time.count(); + double throughput = (counter * PACKET_SIZE * 8) / capture_delta_time_sec; + if (throughput < 1e6) { + std::cout << "\n\nThroughput : " << std::fixed << std::setprecision(2) + << throughput / 1e3 << " Kb/s"; + } else { + std::cout << "\n\nThroughput : " << std::fixed << std::setprecision(2) + << throughput / 1e6 << " Mb/s"; + } + std::cout << "\t\tCapturing took :" << capture_delta_time_sec << "s\n"; + + // Writing output : Raw / Decapsulated csv + auto write_start = std::chrono::high_resolution_clock::now(); + if (csvFile.is_open() && raw_file.is_open()) { + csvFile << Trace::csvHeader() << "\n"; + for (const auto &sample_ptr : all_data) { + for (const packet_t &packet : *sample_ptr) { + Trace trace(packet, TIME_FLAG, CALL_FLAG); + csvFile << trace.toCSVLine() << "\n"; + for (size_t k = 0; k < PACKET_SIZE; ++k) { + raw_file << std::uppercase << std::hex << std::setw(2) + << std::setfill('0') << (unsigned)packet[k]; + } + raw_file << "\n"; + } + } + std::cout + << "\n========================SUCCESS_WRITE========================\n"; + } + auto write_end = std::chrono::high_resolution_clock::now(); + std::chrono::duration write_delta_time = write_end - write_start; + double write_delta_time_sec = write_delta_time.count(); + std::cout << "\nWriting Took : " << write_delta_time_sec << "s\n"; + + auto raw_size = std::filesystem::file_size(raw_path); + auto csv_size = std::filesystem::file_size(csv_path); + std::cout << "\nRaw file size: " << raw_size / 1e6 << " Mbytes\t"; + std::cout << "CSV file size: " << csv_size / 1e6 << " Mbytes\n"; + + DptiDisable(peripheral_handle); + DmgrClose(peripheral_handle); + + std::cout + << "\n========================SUCCESS_CLOSE========================\n\n"; + + return 0; +} \ No newline at end of file diff --git a/corev_apu/instr_tracing/SW/Receiver_DPTI/clean_csv.sh b/corev_apu/instr_tracing/SW/Receiver_DPTI/clean_csv.sh new file mode 100644 index 0000000000..0bbd3ed316 --- /dev/null +++ b/corev_apu/instr_tracing/SW/Receiver_DPTI/clean_csv.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales +# THis script remove lines above the start packet 3.3 + +if [ $# -ne 1 ]; then + echo "Usage!: $0 file/to/clean.csv" + exit 1 +fi +# This script will clean the csv trace by starting the trace at the first packet after reset +input_file="$1" +output_file="${input_file%.csv}_cleaned.csv" +temp_file=$(mktemp) + +awk 'found || /^3,3,_,_,/ {found=1; print}' "$input_file" > "$temp_file" + +{ + printf "format,subformat,address,branch,branches,branch_map,branch_count," + printf "branch_fmt,context,ecause,ienable,encoder_mode,interrupt,irreport," + printf "irdepth,notify,ioptions,privilege,qual_status,time,thaddr,tval," + printf "updiscon,denable,dloss,doptions\n" + + cat "$temp_file" +} > "$output_file" + +rm "$temp_file" + +echo "File Cleaned : $output_file" \ No newline at end of file diff --git a/corev_apu/instr_tracing/SW/Receiver_DPTI/run_timeout.sh b/corev_apu/instr_tracing/SW/Receiver_DPTI/run_timeout.sh new file mode 100644 index 0000000000..68355bf883 --- /dev/null +++ b/corev_apu/instr_tracing/SW/Receiver_DPTI/run_timeout.sh @@ -0,0 +1,39 @@ +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales + +#Script to automate the aquisition process for the receiver + +NR_PKTS=(1 2 10 20 50 100 200) +DURATION=5 + +LOG_FILE="log_$(date +'%Y%m%d_%H%M%S').txt" +echo "Fichier de log : $LOG_FILE" + +echo -e "NR_PKT\tThroughput (Mb/s)" > "$LOG_FILE" + +capture_fct() { + ./Receiver_DPTI & + PID=$! + sleep "$DURATION" + kill -SIGINT "$PID" + sleep 2 +} + +for i in "${NR_PKTS[@]}"; do + echo "=== NR_PKT = $i ===" + sed -i "s/const int NR_PKT = [0-9]\+;/const int NR_PKT = $i;/" Receiver_DPTI.cpp + make > /dev/null || { echo "Compilation échouée à $i"; exit 1; } + + OUTPUT=$(capture_fct | grep -oP 'Throughput\s*:\s*\K[0-9.]+' ) + echo "$i : $OUTPUT" | tee -a "$LOG_FILE" + +done + +python3 script.py "$LOG_FILE" + diff --git a/corev_apu/instr_tracing/SW/Receiver_DPTI/script.py b/corev_apu/instr_tracing/SW/Receiver_DPTI/script.py new file mode 100644 index 0000000000..2b3f1ef61e --- /dev/null +++ b/corev_apu/instr_tracing/SW/Receiver_DPTI/script.py @@ -0,0 +1,59 @@ +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales + +#Script to plot data from run_timeout.sh aquisition with receiver + +import sys +import matplotlib.pyplot as plt + +def parse_log(file_path): + nr_pkts = [] + throughputs = [] + with open(file_path) as f: + for line in f: + line = line.strip() + if not line or ':' not in line or line.startswith('NR_PKT'): + continue + try: + pkt_str, tp_str = line.split(':') + pkt = int(pkt_str.strip()) + tp = float(tp_str.strip()) + nr_pkts.append(pkt) + throughputs.append(tp) + except ValueError: + continue + return nr_pkts, throughputs + +def main(): + if len(sys.argv) != 2: + print(f"Usage: {sys.argv[0]} ") + sys.exit(1) + + log_file = sys.argv[1] + nr_pkts, throughputs = parse_log(log_file) + + if not nr_pkts: + print("Aucune donnée valide trouvée dans le fichier.") + sys.exit(1) + + print("\nNR_PKT\tThroughput (Mb/s)") + for pkt, tp in zip(nr_pkts, throughputs): + print(f"{pkt}\t{tp}") + + plt.figure() + plt.plot(nr_pkts, throughputs, marker='o') + plt.xlabel("Nombre de paquets (NR_PKT)") + plt.ylabel("Throughput (Mb/s)") + plt.title("NR_PKT vs Throughput") + plt.grid(True) + plt.tight_layout() + plt.show() + +if __name__ == "__main__": + main() diff --git a/corev_apu/instr_tracing/SW/Receiver_DPTI/to_script.sh b/corev_apu/instr_tracing/SW/Receiver_DPTI/to_script.sh new file mode 100644 index 0000000000..3dcaa82005 --- /dev/null +++ b/corev_apu/instr_tracing/SW/Receiver_DPTI/to_script.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales +capture_fct() { + ./Receiver_DPTI & + PID=$! + sleep 5 + kill -SIGINT "$PID" + sleep 2 +} + +NR_PKTS=(10 20 50 100 200) + +for i in "${NR_PKTS[@]}"; do + echo "=== $i ===" + + sed -i "s/const int NR_PKT = [0-9]\+;/const int NR_PKT = $i;/" Receiver_DPTI.cpp + make -s + capture_fct >> log2.txt + +done diff --git a/corev_apu/instr_tracing/rv_encapsulator-main/LICENSE b/corev_apu/instr_tracing/rv_encapsulator-main/LICENSE new file mode 100644 index 0000000000..3931d9e54f --- /dev/null +++ b/corev_apu/instr_tracing/rv_encapsulator-main/LICENSE @@ -0,0 +1,176 @@ +SOLDERPAD HARDWARE LICENSE version 0.51 + +This license is based closely on the Apache License Version 2.0, but is not +approved or endorsed by the Apache Foundation. A copy of the non-modified +Apache License 2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0. + +As this license is not currently OSI or FSF approved, the Licensor permits any +Work licensed under this License, at the option of the Licensee, to be treated +as licensed under the Apache License Version 2.0 (which is so approved). + +This License is licensed under the terms of this License and in particular +clause 7 below (Disclaimer of Warranties) applies in relation to its use. + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the Rights owner or entity authorized by the Rights owner +that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Rights" means copyright and any similar right including design right (whether +registered or unregistered), semiconductor topography (mask) rights and +database rights (but excluding Patents and Trademarks). + +"Source" form shall mean the preferred form for making modifications, including +but not limited to source code, net lists, board layouts, CAD files, +documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object +code, generated documentation, the instantiation of a hardware design and +conversions to other media types, including intermediate forms such as +bytecodes, FPGA bitstreams, artwork and semiconductor topographies (mask +works). + +"Work" shall mean the work of authorship, whether in Source form or other +Object form, made available under the License, as indicated by a Rights notice +that is included in or attached to the work (an example is provided in the +Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) or physically connect to or interoperate with the interfaces of, the Work +and Derivative Works thereof. + +"Contribution" shall mean any design or work of authorship, including the +original version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor for +inclusion in the Work by the Rights owner or by an individual or Legal Entity +authorized to submit on behalf of the Rights owner. For the purposes of this +definition, "submitted" means any form of electronic, verbal, or written +communication sent to the Licensor or its representatives, including but not +limited to communication on electronic mailing lists, source code control +systems, and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated in writing +by the Rights owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of License. Subject to the terms and conditions of this License, each +Contributor hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable license under the Rights to reproduce, +prepare Derivative Works of, publicly display, publicly perform, sublicense, +and distribute the Work and such Derivative Works in Source or Object form and +do anything in relation to the Work as if the Rights did not exist. + +3. Grant of Patent License. Subject to the terms and conditions of this +License, each Contributor hereby grants to You a perpetual, worldwide, +non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this +section) patent license to make, have made, use, offer to sell, sell, import, +and otherwise transfer the Work, where such license applies only to those +patent claims licensable by such Contributor that are necessarily infringed by +their Contribution(s) alone or by combination of their Contribution(s) with the +Work to which such Contribution(s) was submitted. If You institute patent +litigation against any entity (including a cross-claim or counterclaim in a +lawsuit) alleging that the Work or a Contribution incorporated within the Work +constitutes direct or contributory patent infringement, then any patent +licenses granted to You under this License for that Work shall terminate as of +the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or +Derivative Works thereof in any medium, with or without modifications, and in +Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy + of this License; and + + You must cause any modified files to carry prominent notices stating that + You changed the files; and + + You must retain, in the Source form of any Derivative Works that You + distribute, all copyright, patent, trademark, and attribution notices from + the Source form of the Work, excluding those notices that do not pertain to + any part of the Derivative Works; and + + If the Work includes a "NOTICE" text file as part of its distribution, then + any Derivative Works that You distribute must include a readable copy of + the attribution notices contained within such NOTICE file, excluding those + notices that do not pertain to any part of the Derivative Works, in at + least one of the following places: within a NOTICE text file distributed as + part of the Derivative Works; within the Source form or documentation, if + provided along with the Derivative Works; or, within a display generated by + the Derivative Works, if and wherever such third-party notices normally + appear. The contents of the NOTICE file are for informational purposes only + and do not modify the License. You may add Your own attribution notices + within Derivative Works that You distribute, alongside or as an addendum to + the NOTICE text from the Work, provided that such additional attribution + notices cannot be construed as modifying the License. You may add Your own + copyright statement to Your modifications and may provide additional or + different license terms and conditions for use, reproduction, or + distribution of Your modifications, or for any such Derivative Works as a + whole, provided Your use, reproduction, and distribution of the Work + otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any +Contribution intentionally submitted for inclusion in the Work by You to the +Licensor shall be under the terms and conditions of this License, without any +additional terms or conditions. Notwithstanding the above, nothing herein shall +supersede or modify the terms of any separate license agreement you may have +executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, +trademarks, service marks, or product names of the Licensor, except as required +for reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in +writing, Licensor provides the Work (and each Contributor provides its +Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied, including, without limitation, any warranties +or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any risks +associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in +tort (including negligence), contract, or otherwise, unless required by +applicable law (such as deliberate and grossly negligent acts) or agreed to in +writing, shall any Contributor be liable to You for damages, including any +direct, indirect, special, incidental, or consequential damages of any +character arising as a result of this License or out of the use or inability to +use the Work (including but not limited to damages for loss of goodwill, work +stoppage, computer failure or malfunction, or any and all other commercial +damages or losses), even if such Contributor has been advised of the +possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or +Derivative Works thereof, You may choose to offer, and charge a fee for, +acceptance of support, warranty, indemnity, or other liability obligations +and/or rights consistent with this License. However, in accepting such +obligations, You may act only on Your own behalf and on Your sole +responsibility, not on behalf of any other Contributor, and only if You agree +to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_encapsulator-main/README.md b/corev_apu/instr_tracing/rv_encapsulator-main/README.md new file mode 100644 index 0000000000..6668722375 --- /dev/null +++ b/corev_apu/instr_tracing/rv_encapsulator-main/README.md @@ -0,0 +1,2 @@ +The encapsulator is a modified version of https://github.com/pulp-platform/rv_encapsulator +This directory (`rv_encapsulator-main`) is temporary and will soon be replaced by a submodule. \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_encapsulator-main/src/include/encap_pkg.sv b/corev_apu/instr_tracing/rv_encapsulator-main/src/include/encap_pkg.sv new file mode 100644 index 0000000000..32af59527f --- /dev/null +++ b/corev_apu/instr_tracing/rv_encapsulator-main/src/include/encap_pkg.sv @@ -0,0 +1,50 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +/* +all the type associated params are commented because the type is not required for trace encoders +supporting only instruction tracing +*/ + +package encap_pkg; + + localparam H_LEN = 8; // header length + //localparam SRCID_LEN = 7; // not used because only one source in system + //localparam TYPE_LEN = 8; + localparam PAYLOAD_LEN = 248 /*- TYPE_LEN - (SRCID_LEN % 8)*/; // trace_payload_len + localparam T_LEN = 64; // timestamp length: mcycle length is always 64 + localparam FLOW_LEN = 2; + localparam P_LEN = 5; + localparam MAX_LEN = 264; // max length for payload to slice + + typedef struct packed { + logic extend; + logic [FLOW_LEN-1:0] flow; + logic [P_LEN-1:0] length; + } header_s; + + typedef struct packed { + //logic [TYPE_LEN-1:0] type; // omitted because only instruction trace available + logic [PAYLOAD_LEN-1:0] trace_payload; + } payload_s; + + typedef struct packed { + header_s header; + //logic [SRCID_LEN-1:0] srcid; + logic [T_LEN-1:0] timestamp; + payload_s payload; + } encap_fifo_entry_s; + +endpackage \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_encapsulator-main/src/rtl/encapsulator.sv b/corev_apu/instr_tracing/rv_encapsulator-main/src/rtl/encapsulator.sv new file mode 100644 index 0000000000..e93c8ba864 --- /dev/null +++ b/corev_apu/instr_tracing/rv_encapsulator-main/src/rtl/encapsulator.sv @@ -0,0 +1,75 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +/* ENCAPSULATOR */ +/* +this module generates the header and payload necessary based on the protocol used +*/ + +module encapsulator ( + // inputs + input logic clk_i, + input logic valid_i, + input logic [encap_pkg::P_LEN-1:0] packet_length_i, + input logic [encap_pkg::FLOW_LEN-1:0] flow_i, + input logic timestamp_present_i, + //input logic srcid_i, + input logic [encap_pkg::T_LEN-1:0] timestamp_i, + //input logic [encap_pkg::TYPE_LEN-1:0] type_i, + input logic [encap_pkg::PAYLOAD_LEN-1:0] trace_payload_i, + + // outputs + output logic valid_o, + output encap_pkg::encap_fifo_entry_s encap_fifo_entry_o +); + // pragma translate_off + int f; + initial begin + f = $fopen("encaps.traces", "w"); + end + final $fclose(f); + // pragma translate_on + +always_comb begin + // initialization + valid_o = '0; + encap_fifo_entry_o = '0; + + // assignments + if (valid_i) begin + valid_o = '1; + // header + encap_fifo_entry_o.header.length = packet_length_i; + encap_fifo_entry_o.header.flow = flow_i; + encap_fifo_entry_o.header.extend = timestamp_present_i; + // srcID + //encap_fifo_entry_o.srcid = srcid_i; + // timestamp + encap_fifo_entry_o.timestamp = timestamp_i; + // payload + encap_fifo_entry_o.payload.trace_payload = trace_payload_i; + end +end +// pragma translate_off +always_ff @(posedge clk_i) begin + if (valid_o) begin + $fwrite( + f, + "%h\n",encap_fifo_entry_o); + end +end +// pragma translate_on + +endmodule \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/LICENSE b/corev_apu/instr_tracing/rv_tracer-main/LICENSE new file mode 100644 index 0000000000..3931d9e54f --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/LICENSE @@ -0,0 +1,176 @@ +SOLDERPAD HARDWARE LICENSE version 0.51 + +This license is based closely on the Apache License Version 2.0, but is not +approved or endorsed by the Apache Foundation. A copy of the non-modified +Apache License 2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0. + +As this license is not currently OSI or FSF approved, the Licensor permits any +Work licensed under this License, at the option of the Licensee, to be treated +as licensed under the Apache License Version 2.0 (which is so approved). + +This License is licensed under the terms of this License and in particular +clause 7 below (Disclaimer of Warranties) applies in relation to its use. + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the Rights owner or entity authorized by the Rights owner +that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Rights" means copyright and any similar right including design right (whether +registered or unregistered), semiconductor topography (mask) rights and +database rights (but excluding Patents and Trademarks). + +"Source" form shall mean the preferred form for making modifications, including +but not limited to source code, net lists, board layouts, CAD files, +documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object +code, generated documentation, the instantiation of a hardware design and +conversions to other media types, including intermediate forms such as +bytecodes, FPGA bitstreams, artwork and semiconductor topographies (mask +works). + +"Work" shall mean the work of authorship, whether in Source form or other +Object form, made available under the License, as indicated by a Rights notice +that is included in or attached to the work (an example is provided in the +Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) or physically connect to or interoperate with the interfaces of, the Work +and Derivative Works thereof. + +"Contribution" shall mean any design or work of authorship, including the +original version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor for +inclusion in the Work by the Rights owner or by an individual or Legal Entity +authorized to submit on behalf of the Rights owner. For the purposes of this +definition, "submitted" means any form of electronic, verbal, or written +communication sent to the Licensor or its representatives, including but not +limited to communication on electronic mailing lists, source code control +systems, and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated in writing +by the Rights owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of License. Subject to the terms and conditions of this License, each +Contributor hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable license under the Rights to reproduce, +prepare Derivative Works of, publicly display, publicly perform, sublicense, +and distribute the Work and such Derivative Works in Source or Object form and +do anything in relation to the Work as if the Rights did not exist. + +3. Grant of Patent License. Subject to the terms and conditions of this +License, each Contributor hereby grants to You a perpetual, worldwide, +non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this +section) patent license to make, have made, use, offer to sell, sell, import, +and otherwise transfer the Work, where such license applies only to those +patent claims licensable by such Contributor that are necessarily infringed by +their Contribution(s) alone or by combination of their Contribution(s) with the +Work to which such Contribution(s) was submitted. If You institute patent +litigation against any entity (including a cross-claim or counterclaim in a +lawsuit) alleging that the Work or a Contribution incorporated within the Work +constitutes direct or contributory patent infringement, then any patent +licenses granted to You under this License for that Work shall terminate as of +the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or +Derivative Works thereof in any medium, with or without modifications, and in +Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy + of this License; and + + You must cause any modified files to carry prominent notices stating that + You changed the files; and + + You must retain, in the Source form of any Derivative Works that You + distribute, all copyright, patent, trademark, and attribution notices from + the Source form of the Work, excluding those notices that do not pertain to + any part of the Derivative Works; and + + If the Work includes a "NOTICE" text file as part of its distribution, then + any Derivative Works that You distribute must include a readable copy of + the attribution notices contained within such NOTICE file, excluding those + notices that do not pertain to any part of the Derivative Works, in at + least one of the following places: within a NOTICE text file distributed as + part of the Derivative Works; within the Source form or documentation, if + provided along with the Derivative Works; or, within a display generated by + the Derivative Works, if and wherever such third-party notices normally + appear. The contents of the NOTICE file are for informational purposes only + and do not modify the License. You may add Your own attribution notices + within Derivative Works that You distribute, alongside or as an addendum to + the NOTICE text from the Work, provided that such additional attribution + notices cannot be construed as modifying the License. You may add Your own + copyright statement to Your modifications and may provide additional or + different license terms and conditions for use, reproduction, or + distribution of Your modifications, or for any such Derivative Works as a + whole, provided Your use, reproduction, and distribution of the Work + otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any +Contribution intentionally submitted for inclusion in the Work by You to the +Licensor shall be under the terms and conditions of this License, without any +additional terms or conditions. Notwithstanding the above, nothing herein shall +supersede or modify the terms of any separate license agreement you may have +executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, +trademarks, service marks, or product names of the Licensor, except as required +for reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in +writing, Licensor provides the Work (and each Contributor provides its +Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied, including, without limitation, any warranties +or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any risks +associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in +tort (including negligence), contract, or otherwise, unless required by +applicable law (such as deliberate and grossly negligent acts) or agreed to in +writing, shall any Contributor be liable to You for damages, including any +direct, indirect, special, incidental, or consequential damages of any +character arising as a result of this License or out of the use or inability to +use the Work (including but not limited to damages for loss of goodwill, work +stoppage, computer failure or malfunction, or any and all other commercial +damages or losses), even if such Contributor has been advised of the +possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or +Derivative Works thereof, You may choose to offer, and charge a fee for, +acceptance of support, warranty, indemnity, or other liability obligations +and/or rights consistent with this License. However, in accepting such +obligations, You may act only on Your own behalf and on Your sole +responsibility, not on behalf of any other Contributor, and only if You agree +to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/README.md b/corev_apu/instr_tracing/rv_tracer-main/README.md new file mode 100644 index 0000000000..b9a88a29eb --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/README.md @@ -0,0 +1,2 @@ +The encoder is a modified version of https://github.com/pulp-platform/rv_tracer +This directory (`rv_tracer-main`) is temporary and will soon be replaced by a submodule. \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/include/te_pkg.sv b/corev_apu/instr_tracing/rv_tracer-main/include/te_pkg.sv new file mode 100644 index 0000000000..fefb0053a6 --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/include/te_pkg.sv @@ -0,0 +1,187 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +// uncomment to enable 64bits arch support +// `define TE_ARCH64 + +package te_pkg; + localparam PRIV_LEN = 2; // depends on CPU implementation + localparam INST_LEN = 32; + localparam PTYPE_LEN = 4; // is it F + SF? spec not clear + localparam P_LEN = 5; + localparam PAYLOAD_LEN = 248; + localparam TRIGGER_LEN = 4; + localparam CTYPE_LEN = 2; +`ifdef TE_ARCH64 // 64bit arch specific parameters + localparam XLEN = 64; + // APB addresses to access registers + // the value is added to the peripheral address + /* FILTER */ + // cause + localparam CAUSE_UPPER = 8'h5; + localparam CAUSE_LOWER = 8'h6; + localparam CAUSE_MATCH = 8'h7; + // tvec + localparam TVEC_UPPER_L = 8'h8; // least significant bits + localparam TVEC_UPPER_M = 8'h9; // most significant bits + localparam TVEC_LOWER_L = 8'ha; // least significant bits + localparam TVEC_LOWER_M = 8'hb; // most significant bits + localparam TVEC_MATCH_L = 8'hc; // least significant bits + localparam TVEC_MATCH_M = 8'hd; // most significant bits + // tval + localparam TVAL_UPPER_L = 8'he; // least significant bits + localparam TVAL_UPPER_M = 8'hf; // most significant bits + localparam TVAL_LOWER_L = 8'h10; // least significant bits + localparam TVAL_LOWER_M = 8'h11; // most significant bits + localparam TVAL_MATCH_L = 8'h12; // least significant bits + localparam TVAL_MATCH_M = 8'h13; // most significant bits + // iaddr + localparam IADDR_UPPER_L = 8'h16; // least significant bits + localparam IADDR_UPPER_M = 8'h17; // most significant bits + localparam IADDR_LOWER_L = 8'h18; // least significant bits + localparam IADDR_LOWER_M = 8'h19; // most significant bits + localparam IADDR_MATCH_L = 8'h1a; // least significant bits + localparam IADDR_MATCH_M = 8'h1b; // most significant bits +`else // 32bit arch + localparam XLEN = 32; + // APB addresses to access registers + // APB addresses to access registers + // the value is added to the peripheral address + /* FILTER */ + // cause + localparam CAUSE_UPPER = 8'h5; + localparam CAUSE_LOWER = 8'h6; + localparam CAUSE_MATCH = 8'h7; + // tvec + localparam TVEC_UPPER = 8'h8; + localparam TVEC_LOWER = 8'ha; + localparam TVEC_MATCH = 8'hc; + // tval + localparam TVAL_UPPER = 8'he; + localparam TVAL_LOWER = 8'h10; + localparam TVAL_MATCH = 8'h12; + // iaddr + localparam IADDR_UPPER = 8'h16; + localparam IADDR_LOWER = 8'h18; + localparam IADDR_MATCH = 8'h1a; +`endif + /* both archs parameters */ + // localparams for resync counter + localparam CYCLE_MODE = 0; + localparam PACKET_MODE = 1; + // localparams for irreport and irdepth + localparam CALL_COUNTER_SIZE = '0; + localparam RETURN_STACK_SIZE = '0; + // localparams for branch map - defined by spec + localparam BRANCH_MAP_LEN = 31; + localparam BRANCH_COUNT_LEN = 5; + // localparams for filter mode + localparam RANGE_MODE = 1'b0; + localparam EQUAL_MODE = 1'b1; + // localparam for time signal + localparam TIME_LEN = 64; + // localparam for itype + localparam ITYPE_LEN = 3; + // localparam for iretire + localparam IRETIRE_LEN = 32; + + // common APB addresses to access registers + /* FILTER */ + // input and mode + localparam CAUSE_ENABLE_MODE = 8'h0; + localparam TVEC_ENABLE_MODE = 8'h1; + localparam TVAL_ENABLE_MODE = 8'h2; + localparam PRIV_ENABLE_MODE = 8'h3; + localparam IADDR_ENABLE_MODE = 8'h4; + // priv + localparam PRIV_RANGE = 8'h14; + localparam PRIV_MATCH = 8'h15; + /* TRACE MANAGEMENT */ + localparam TRACE_STATE = 8'h1c; + localparam LOSSLESS_TRACE = 8'h1d; + localparam SHALLOW_TRACE = 8'h1e; + /* PACKET EMITTER */ + localparam NO_TIME = 8'h1f; + localparam NO_CONTEXT = 8'h20; + localparam DELTA_ADDRESS = 8'h21; + localparam FULL_ADDRESS = 8'h22; + localparam IMPLICIT_EXCEPTION = 8'h23; + localparam SIJUMP = 8'h24; + localparam IMPLICIT_RETURN = 8'h25; + localparam BRANCH_PREDICTION = 8'h26; + localparam JUMP_TARGET_CACHE = 8'h27; + +// packet types +typedef enum logic[1:0] { + F_OPT_EXT = 2'h0, + F_DIFF_DELTA = 2'h1, + F_ADDR_ONLY = 2'h2, + F_SYNC = 2'h3 +} format_e; + +// subformats available for type 3 packets (F_SYNC) +typedef enum logic[1:0] { + SF_START = 2'h0, + SF_TRAP = 2'h1, + SF_CONTEXT = 2'h2, + SF_SUPPORT = 2'h3 +} f_sync_subformat_e; + +// subformats available for type 0 packets (F_OPT_EXT) +// used a struct for future extensions +typedef enum logic[0:0] { + SF_PBC = 1'h0, // correctly predicted branches + SF_JTC = 1'h1 // jump target cache in spec +} f_opt_ext_subformat_e; + +// qual_status values necessary for format 3 subformat 3 +// packet payload +typedef enum logic[1:0] { + NO_CHANGE = 2'h0, + ENDED_REP = 2'h1, + TRACE_LOST = 2'h2, + ENDED_NTR = 2'h3 +} qual_status_e; + +// struct to determine the ioptions enabled/disabled +// for format 3 subformat 3 packets +typedef struct packed { + logic delta_address_en; + logic full_address_en; + logic implicit_exception_en; + logic sijump_en; + logic implicit_return_en; + logic branch_prediction_en; + logic jump_target_cache_en; +} ioptions_s; + +// enum that expresses the packet format and +// subformat to better readability +typedef enum logic[3:0] { + F0SF0 = 4'h0, + F0SF1 = 4'h1, + F1 = 4'h4, + F2 = 4'h8, + F3SF0 = 4'hC, + F3SF1 = 4'hD, + F3SF2 = 4'hE, + F3SF3 = 4'hF +} it_packet_type_e; // "it" stands for "instruction trace" + +/*TODO: + doptions struct for data tracing + refer to page 36 of the spec */ + +endpackage \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/rtl/lzc.sv b/corev_apu/instr_tracing/rv_tracer-main/rtl/lzc.sv new file mode 100644 index 0000000000..f28730ac7f --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/rtl/lzc.sv @@ -0,0 +1,106 @@ +// Copyright 2018 ETH Zurich and University of Bologna. +// Solderpad Hardware License, Version 0.51, see LICENSE for details. +// SPDX-License-Identifier: SHL-0.51 + +// `include "common_cells/assertions.svh" + +/// A trailing zero counter / leading zero counter. +/// Set MODE to 0 for trailing zero counter => cnt_o is the number of trailing zeros (from the LSB) +/// Set MODE to 1 for leading zero counter => cnt_o is the number of leading zeros (from the MSB) +/// If the input does not contain a zero, `empty_o` is asserted. Additionally `cnt_o` contains +/// the maximum number of zeros - 1. For example: +/// in_i = 000_0000, empty_o = 1, cnt_o = 6 (mode = 0) +/// in_i = 000_0001, empty_o = 0, cnt_o = 0 (mode = 0) +/// in_i = 000_1000, empty_o = 0, cnt_o = 3 (mode = 0) +/// Furthermore, this unit contains a more efficient implementation for Verilator (simulation only). +/// This speeds up simulation significantly. +module lzc #( + /// The width of the input vector. + parameter int unsigned WIDTH = 2, + /// Mode selection: 0 -> trailing zero, 1 -> leading zero + parameter bit MODE = 1'b0, + /// Dependent parameter. Do **not** change! + /// + /// Width of the output signal with the zero count. + parameter int unsigned CNT_WIDTH = cf_math_pkg::idx_width(WIDTH) +) ( + /// Input vector to be counted. + input logic [WIDTH-1:0] in_i, + /// Count of the leading / trailing zeros. + output logic [CNT_WIDTH-1:0] cnt_o, + /// Counter is empty: Asserted if all bits in in_i are zero. + output logic empty_o +); + + if (WIDTH == 1) begin : gen_degenerate_lzc + + assign cnt_o[0] = !in_i[0]; + assign empty_o = !in_i[0]; + + end else begin : gen_lzc + + localparam int unsigned NumLevels = $clog2(WIDTH); + + // `ifndef COMMON_CELLS_ASSERTS_OFF + // `ASSERT_INIT(width_0, WIDTH > 0, "input must be at least one bit wide") + // `endif + + logic [WIDTH-1:0][NumLevels-1:0] index_lut; + logic [2**NumLevels-1:0] sel_nodes; + logic [2**NumLevels-1:0][NumLevels-1:0] index_nodes; + + logic [WIDTH-1:0] in_tmp; + + // reverse vector if required + always_comb begin : flip_vector + for (int unsigned i = 0; i < WIDTH; i++) begin + in_tmp[i] = (MODE) ? in_i[WIDTH-1-i] : in_i[i]; + end + end + + for (genvar j = 0; unsigned'(j) < WIDTH; j++) begin : g_index_lut + assign index_lut[j] = (NumLevels)'(unsigned'(j)); + end + + for (genvar level = 0; unsigned'(level) < NumLevels; level++) begin : g_levels + if (unsigned'(level) == NumLevels - 1) begin : g_last_level + for (genvar k = 0; k < 2 ** level; k++) begin : g_level + // if two successive indices are still in the vector... + if (unsigned'(k) * 2 < WIDTH - 1) begin : g_reduce + assign sel_nodes[2 ** level - 1 + k] = in_tmp[k * 2] | in_tmp[k * 2 + 1]; + assign index_nodes[2 ** level - 1 + k] = (in_tmp[k * 2] == 1'b1) + ? index_lut[k * 2] : + index_lut[k * 2 + 1]; + end + // if only the first index is still in the vector... + if (unsigned'(k) * 2 == WIDTH - 1) begin : g_base + assign sel_nodes[2 ** level - 1 + k] = in_tmp[k * 2]; + assign index_nodes[2 ** level - 1 + k] = index_lut[k * 2]; + end + // if index is out of range + if (unsigned'(k) * 2 > WIDTH - 1) begin : g_out_of_range + assign sel_nodes[2 ** level - 1 + k] = 1'b0; + assign index_nodes[2 ** level - 1 + k] = '0; + end + end + end else begin : g_not_last_level + for (genvar l = 0; l < 2 ** level; l++) begin : g_level + assign sel_nodes[2 ** level - 1 + l] = + sel_nodes[2 ** (level + 1) - 1 + l * 2] | sel_nodes[2 ** (level + 1) - 1 + l * 2 + 1]; + assign index_nodes[2 ** level - 1 + l] = (sel_nodes[2 ** (level + 1) - 1 + l * 2] == 1'b1) + ? index_nodes[2 ** (level + 1) - 1 + l * 2] : + index_nodes[2 ** (level + 1) - 1 + l * 2 + 1]; + end + end + end + + assign cnt_o = NumLevels > unsigned'(0) ? index_nodes[0] : {($clog2(WIDTH)) {1'b0}}; + assign empty_o = NumLevels > unsigned'(0) ? ~sel_nodes[0] : ~(|in_i); + + end : gen_lzc + +// `ifndef COMMON_CELLS_ASSERTS_OFF +// `ASSERT_INIT(width_0, WIDTH >= 1, "The WIDTH must at least be one bit wide!") +// `endif + +endmodule : lzc diff --git a/corev_apu/instr_tracing/rv_tracer-main/rtl/rv_tracer.sv b/corev_apu/instr_tracing/rv_tracer-main/rtl/rv_tracer.sv new file mode 100644 index 0000000000..c920c876a2 --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/rtl/rv_tracer.sv @@ -0,0 +1,911 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +/* TOP LEVEL MODULE */ + +module rv_tracer #( + //parameter IRETIRE_LEN = 32, // set to 1 for single retirement + parameter N = 1, // max number of special inst retired in a cycle, the input port number depends on this value + parameter ONLY_BRANCHES = 0, // special inst are branches or not + parameter APB_ADDR_WIDTH = 32 // address width for APB interface +) +( + input logic clk_i, + input logic rst_ni, + + input logic [N-1:0] valid_i, // used for multiple retirement + + /* data from the CPU */ + // mandatory inputs + input logic [N-1:0][te_pkg::ITYPE_LEN-1:0] itype_i, // termination type of block + input logic [te_pkg::XLEN-1:0] cause_i, + input logic [te_pkg::XLEN-1:0] tval_i, + input logic [te_pkg::PRIV_LEN-1:0] priv_i, + input logic [N-1:0][te_pkg::XLEN-1:0] iaddr_i, // pc of 1st inst in block + input logic [N-1:0][te_pkg::IRETIRE_LEN-1:0] iretire_i, // length of block in halfwords + input logic [N-1:0] ilastsize_i, // length of last inst in 2^ilastsize halfword + // non mandatory inputs + input logic [te_pkg::TIME_LEN-1:0] time_i, + //input logic [:0] context_i, + //input logic [te_pkg::CTYPE_LEN-1:0] ctype_i, // spec says it's 1 or 2 bit wide + //input logic [te_pkg::TRIGGER_LEN-1:0] trigger_i, // must be supported CPU side + + // support inputs + input logic [te_pkg::XLEN-1:0] tvec_i, // tvec_q, contains trap handler address + input logic [te_pkg::XLEN-1:0] epc_i, // epc_q, required for format 3 subformat 1 + input logic encapsulator_ready_i, // non mandatory + + // APB interface inputs + input logic [APB_ADDR_WIDTH-1:0] paddr_i, + input logic pwrite_i, + input logic psel_i, + input logic penable_i, + input logic [31:0] pwdata_i, + + // outputs + // info needed for the encapsulator + output logic [N-1:0] packet_valid_o, + output te_pkg::it_packet_type_e [N-1:0] packet_type_o, + output logic [N-1:0][te_pkg::P_LEN-1:0] packet_length_o, // in bytes + output logic [N-1:0][te_pkg::PAYLOAD_LEN-1:0] packet_payload_o, + // sideband signals + output logic stall_o, + + // APB interface outputs + output logic pready_o, + output logic [31:0] prdata_o +); + + /* signals for management */ + // registers + logic trace_activated; + logic trace_enable; + logic nocontext; + logic notime; + logic encoder_mode; + // filter + logic trigger_trace_on; // hardwired to 0? + logic trigger_trace_off; // hardwired to 0? + //logic qualified; // is it needed or I can use qualified_d? + logic trace_req_deactivate; + // priority + te_pkg::format_e packet_format[N-1:0]; + te_pkg::f_sync_subformat_e packet_f_sync_subformat[N-1:0]; + te_pkg::f_opt_ext_subformat_e packet_f_opt_ext_subformat[N-1:0]; + logic thaddr[N-1:0]; + logic lc_tc_mux[N-1:0]; + te_pkg::qual_status_e qual_status[N-1:0]; + logic nc_branch_map_flush; + logic [te_pkg::BRANCH_MAP_LEN-1:0] branch_map; + logic [te_pkg::BRANCH_COUNT_LEN-1:0] branch_count; + logic resync_rst; + // packet emitter + logic packet_valid[N-1:0]; + // resync counter + logic [N-1:0] packet_emitted; + // not classified + logic nc_branch_map_empty; + logic clk_gated; + logic turn_on_tracer_d, turn_on_tracer_q; + logic lossless_trace; + logic shallow_trace; + + // we have three phases, called last cycle (lc), this cycle (tc) and next + // cycle (nc), based on which we make decision whether we need to emit a + // packet or not. + logic tc_branch_map_empty; + logic [N-1:0] tc_resync; + logic [N-1:0] nc_exc_only; + logic [N-1:0] nc_ppccd_br; + logic [$clog2(te_pkg::XLEN):0] keep_bits[N-1:0]; + logic [te_pkg::XLEN-1:0] addr_to_compress[N-1:0]; + + logic [1:0][N-1:0][te_pkg::IRETIRE_LEN-1:0] iretired_tab; + logic [2:0] exception_tab; + logic [2:0] interrupt_tab; + logic [2:0][te_pkg::XLEN-1:0] cause_tab; + logic [1:0][te_pkg::XLEN-1:0] tvec_tab; + logic [2:0][te_pkg::XLEN-1:0] tval_tab; + logic [1:0][N-1:0][te_pkg::ITYPE_LEN-1:0] itype_tab; + logic [1:0][te_pkg::PRIV_LEN-1:0] priv_tab; + logic [1:0][N-1:0][te_pkg::XLEN-1:0] address_tab; + logic [2:0][te_pkg::XLEN-1:0] epc_tab; + logic [1:0][te_pkg::TIME_LEN-1:0] time_tab; + logic [2:0][N-1:0] updiscon_tab; + logic [2:0][N-1:0] qualified_tab; + + logic [N-1:0][te_pkg::IRETIRE_LEN-1:0] tc_iretired, nc_iretired; + logic lc_exception, tc_exception, nc_exception; + logic lc_interrupt, tc_interrupt, nc_interrupt; + logic [te_pkg::XLEN-1:0] lc_cause, tc_cause, nc_cause; + logic [te_pkg::XLEN-1:0] tc_tvec, nc_tvec; + logic [te_pkg::XLEN-1:0] lc_tval, tc_tval, nc_tval; + logic [N-1:0][te_pkg::ITYPE_LEN-1:0] tc_itype, nc_itype; + logic [te_pkg::PRIV_LEN-1:0] tc_priv, nc_priv; + logic [N-1:0][te_pkg::XLEN-1:0] tc_address, nc_address; + logic [te_pkg::XLEN-1:0] lc_epc, tc_epc, nc_epc; + logic [te_pkg::TIME_LEN-1:0] tc_time, nc_time; + logic [N-1:0] lc_updiscon, tc_updiscon, nc_updiscon; + logic [N-1:0] lc_qualified, tc_qualified, nc_qualified; + + + logic tc_first_qualified; + logic tc_final_qualified; + logic [N-1:0] updiscon; + logic [N-1:0][te_pkg::XLEN-1:0] address; + logic [N-1:0] qualified; + + + logic [N-1:0] valid0_d, valid0_q; + logic privchange_d, privchange_q; + // logic context_change_d, context_change_q; // non mandatory + // logic precise_context_report_d, precise_context_report_q; // requires ctype signal CPU side + // logic context_report_as_disc_d, context_report_as_disc_q; // ibidem + // logic no_context_report_d, no_context_report_q; // ibidem + // logic imprecise_context_report_d, imprecise_context_report_q; // ibidem + logic gt_max_resync_d, gt_max_resync_q; + logic et_max_resync_d, et_max_resync_q; + logic branch_map_full_d, branch_map_full_q; + //logic branch_misprediction_d, branch_misprediction_q; // non mandatory + logic trace_activated_d, trace_activated_q; + logic enc_activated_d, enc_activated_q; + logic enc_deactivated_d, enc_deactivated_q; + //logic packets_lost_d, packets_lost_q; // non mandatory + te_pkg::ioptions_s enc_config_d, enc_config_q; + logic enc_config_change_d, enc_config_change_q; + logic branch_d, branch_q; + logic branch_taken_d, branch_taken_q; + + // branch_map inputs + logic [N-1:0] branch_valid; + logic [N-1:0] branch_taken; + + // te_reg output to filter input + logic cause_filter; + logic [te_pkg::XLEN-1:0] upper_cause; + logic [te_pkg::XLEN-1:0] lower_cause; + logic [te_pkg::XLEN-1:0] match_cause; + logic cause_mode; + logic tvec_filter; + logic [te_pkg::XLEN-1:0] upper_tvec; + logic [te_pkg::XLEN-1:0] lower_tvec; + logic [te_pkg::XLEN-1:0] match_tvec; + logic tvec_mode; + logic tval_filter; + logic [te_pkg::XLEN-1:0] upper_tval; + logic [te_pkg::XLEN-1:0] lower_tval; + logic [te_pkg::XLEN-1:0] match_tval; + logic tval_mode; + logic priv_lvl_filter; + logic [te_pkg::PRIV_LEN-1:0] upper_priv; + logic [te_pkg::PRIV_LEN-1:0] lower_priv; + logic [te_pkg::PRIV_LEN-1:0] match_priv; + logic priv_lvl_mode; + logic iaddr_filter; + logic [te_pkg::XLEN-1:0] upper_iaddr; + logic [te_pkg::XLEN-1:0] lower_iaddr; + logic [te_pkg::XLEN-1:0] match_iaddr; + logic iaddr_mode; + + /* the following commented section has non mandatory signals + for now it's commented + */ + /* combinatorial network to define the following + signals from ctype: + - tc_no_context_report_i -> ctype == 0 + - tc_precise_context_report_i -> ctype == 2 + - tc_context_report_as_disc_i -> ctype == 3 + - tc_imprecise_context_report_i -> ctype == 1 + - nc_precise_context_report_i -> ctype == 2 + - nc_context_report_as_disc_i -> ctype == 3*/ + /* + always_comb begin : ctype_manager + case(ctype_i) + 2'h0: // no report - add signal + tc_no_context_report = '1; + 2'h1: + tc_imprecise_context_report = '1; + 2'h2: + tc_precise_context_report = '1; + 2'h3: + tc_context_report_as_disc = '1; + endcase + end + */ + + /*TODO: create a trigger decoder that produces: + - trigger_trace_on -> 2 + - trigger_trace_off -> 3 + - trigger_notify -> 4 + */ + // maybe it's enough to define values and hardwire them to 0 + + /* ASSIGNMENT */ + /* hardwired assignments */ + assign trigger_trace_on = '0; + assign trigger_trace_off = '0; + + /* FFs inputs */ + assign valid0_d = valid_i; + assign trace_activated_d = trace_activated; + assign enc_activated_d = trace_activated_d && ~trace_activated_q; + assign enc_deactivated_d = ~trace_activated_d && trace_activated_q; + assign enc_config_change_d = enc_config_d != enc_config_q; + + /* next cycle */ + assign nc_branch_map_empty = nc_branch_map_flush || (tc_branch_map_empty /*&& ~branch_q*/); + + // output + assign packet_valid_o = packet_emitted; + // sideband + assign stall_o = ~encapsulator_ready_i && lossless_trace; + + // other + assign branch_taken_d = |branch_taken; + + // first and final qualified + assign tc_first_qualified = trace_activated && |tc_qualified && !lc_qualified && trace_enable; + assign tc_final_qualified = trace_activated && |lc_qualified && !tc_qualified && trace_enable; + + always_ff @( posedge clk_i, negedge rst_ni ) begin + if(~rst_ni) begin + iretired_tab <= '0; + exception_tab <= '0; + interrupt_tab <= '0; + cause_tab <= '0; + tvec_tab <= '0; + tval_tab <= '0; + itype_tab <= '0; + priv_tab <= '0; + address_tab <= '0; + epc_tab <= '0; + time_tab <= '0; + updiscon_tab <= '0; + qualified_tab <= '0; + end else begin + if (|valid_i) begin + iretired_tab <= {iretired_tab[0], iretire_i}; + exception_tab <= {exception_tab[1:0], itype_i[0] == 1}; + interrupt_tab <= {interrupt_tab[1:0], itype_i[0] == 2}; + cause_tab <= {cause_tab[1:0],cause_i}; + tvec_tab <= {tvec_tab[0], tvec_i}; + tval_tab <= {tval_tab [1:0], tval_i}; + itype_tab <= {itype_tab[0], itype_i}; + priv_tab <= {priv_tab[0], priv_i}; + address_tab <= {address_tab[0], address}; + epc_tab <= {epc_tab[1:0], epc_i}; + time_tab <= {time_tab[0], time_i}; + updiscon_tab <= {updiscon_tab[1:0], updiscon}; + qualified_tab <={qualified_tab[1:0], qualified}; + end + end + + end + //lc asignements + assign lc_exception = exception_tab[2]; + assign lc_interrupt = interrupt_tab[2]; + assign lc_cause = cause_tab[2]; + assign lc_tval = tval_tab[2]; + assign lc_epc = epc_tab[2]; + assign lc_updiscon = updiscon_tab[2]; + assign lc_qualified = qualified_tab[2]; + // tc assignements + assign tc_iretired = iretired_tab[1]; + assign tc_exception = exception_tab[1]; + assign tc_interrupt = interrupt_tab[1]; + assign tc_cause= cause_tab[1]; + assign tc_tvec = tvec_tab[1]; + assign tc_tval = tval_tab[1]; + assign tc_itype = itype_tab[1]; + assign tc_priv = priv_tab[1]; + assign tc_address = address_tab[1]; + assign tc_epc = epc_tab[1]; + assign tc_time = time_tab[1]; + assign tc_updiscon = updiscon_tab[1]; + assign tc_qualified = qualified_tab[1]; + + // nc assignements + assign nc_iretired = iretired_tab[0]; + assign nc_exception = exception_tab[0]; + assign nc_interrupt = interrupt_tab[0]; + assign nc_cause= cause_tab[0]; + assign nc_tvec = tvec_tab[0]; + assign nc_tval = tval_tab[0]; + assign nc_itype = itype_tab[0]; + assign nc_priv = priv_tab[0]; + assign nc_address = address_tab[0]; + assign nc_epc = epc_tab[0]; + assign nc_time = time_tab[0]; + assign nc_updiscon = updiscon_tab[0]; + assign nc_qualified = qualified_tab[0]; + + //FIXME need cleaning + // not static assignments + always_comb begin + // init + branch_valid = '0; + branch_taken = '0; + + privchange_d = privchange_q; + // context_change_d = context_change_q; + // precise_context_report_d = precise_context_report_q; // requires ctype signal CPU side + // context_report_as_disc_d = context_report_as_disc_q; //ibidem + // no_context_report_d = no_context_report_q; // ibidem + // imprecise_context_report_d = imprecise_context_report_q; // ibidem + branch_d = branch_q; + + // itype, iretired and address + // it works for all three cases + for (int i = 0; i < N; i++) begin + if (valid_i[i]) begin + address[i] = iaddr_i[i]; + //FIXME we remove block reconstruction address + //address[i] = iaddr_i[i]+2*(iretire_i[i] - 2**ilastsize_i[i]); + end + end + //FIXME weird timing here nc for erveryone ? + // assigning branch map inputs + for (int i = 0; i < N; i++) begin + if (nc_itype[i] == 4 || nc_itype[i] == 5) begin + branch_valid[i] = '1; + end + if (nc_itype[i] == 5) begin + branch_taken[i] = '1; + end + end + + // updiscon + if (N == 1 || (N > 1 && ONLY_BRANCHES)) begin + if (qualified[0]) begin + updiscon[0] = itype_i[0] == 6; + end + end + // wait for this case + if (N > 1 && !ONLY_BRANCHES) begin + for (int i = 0; i < N; i++) begin + if (qualified[i]) begin + updiscon[i] = itype_i[i] == 6; + end + end + end + + // updating registers values + if (|valid_i) begin + privchange_d = (nc_priv != tc_priv) && |valid_i; + // context_change_d; // TODO + //precise_context_report_d; // requires ctype signal CPU side + //context_report_as_disc_d; //ibidem + //no_context_report_d; // ibidem + //imprecise_context_report_d; // ibidem + branch_d = |branch_valid; + end + + if (!turn_on_tracer_q) begin + turn_on_tracer_d = |valid_i && nc_qualified; + end + end + + /* MODULES INSTANTIATION */ + // one instance for all 3 cases + + + /* MAPPED REGISTERS */ + te_reg #( + .APB_ADDR_WIDTH(APB_ADDR_WIDTH) + ) i_te_reg( + .clk_i (clk_i), + .rst_ni (rst_ni), + .trace_req_off_i ('0), + .trace_req_on_i (turn_on_tracer_q), // trigger_trace_on // from trigger unit + .encapsulator_ready_i(encapsulator_ready_i), + .cause_filter_o (cause_filter), + .upper_cause_o (upper_cause), + .lower_cause_o (lower_cause), + .match_cause_o (match_cause), + .cause_mode_o (cause_mode), + .tvec_filter_o (tvec_filter), + .upper_tvec_o (upper_tvec), + .lower_tvec_o (lower_tvec), + .match_tvec_o (match_tvec), + .tvec_mode_o (tvec_mode), + .tval_filter_o (tval_filter), + .upper_tval_o (upper_tval), + .lower_tval_o (lower_tval), + .match_tval_o (match_tval), + .tval_mode_o (tval_mode), + .priv_lvl_filter_o (priv_lvl_filter), + .upper_priv_o (upper_priv), + .lower_priv_o (lower_priv), + .match_priv_o (match_priv), + .priv_lvl_mode_o (priv_lvl_mode), + .iaddr_filter_o (iaddr_filter), + .upper_iaddr_o (upper_iaddr), + .lower_iaddr_o (lower_iaddr), + .match_iaddr_o (match_iaddr), + .iaddr_mode_o (iaddr_mode), + .trace_enable_o (trace_enable), + .trace_activated_o (trace_activated), + .nocontext_o (nocontext), + .notime_o (notime), + .encoder_mode_o (encoder_mode), + .configuration_o (enc_config_d), + .lossless_trace_o (lossless_trace), + .shallow_trace_o (shallow_trace), + .clk_gated_o (clk_gated), + .paddr_i (paddr_i), + .pwrite_i (pwrite_i), + .psel_i (psel_i), + .penable_i (penable_i), + .pwdata_i (pwdata_i), + .pready_o (pready_o), + .prdata_o (prdata_o) + ); + + /* BRANCH MAP */ + te_branch_map #( + .N(N) + ) i_te_branch_map( + .clk_i (clk_gated), + .rst_ni (rst_ni), + .valid_i (branch_valid & nc_qualified & valid0_q), + .branch_taken_i(branch_taken), + .flush_i (nc_branch_map_flush), + //.branch_taken_prediction_i(), // non mandatory + .map_o (branch_map), + .branches_o (branch_count), + //.pbc_o(), // non mandatory - branch prediction mode + //.misprediction_o(), // non mandatory - ibidem + .is_full_o (branch_map_full_d), + .is_empty_o (tc_branch_map_empty) + ); + + /* RESYNC COUNTER */ + te_resync_counter #( + .N(N), + .MODE(te_pkg::CYCLE_MODE), // count cycles + .MAX_VALUE(13'h1FFF) // 8192 + ) i_te_resync_counter( // for testing we keep the def settings + .clk_i (clk_gated), + .rst_ni (rst_ni), + .trace_enabled_i (trace_enable), + .packet_emitted_i(packet_emitted), + .resync_rst_i (resync_rst), + .gt_resync_max_o (gt_max_resync_d), + .et_resync_max_o (et_max_resync_d) + ); + + // N instances for all 3 cases + + /* FILTER */ + generate + if (ONLY_BRANCHES) begin + for (genvar i = 0; i < N; i++) begin + te_filter i_te_filter( + .trace_enable_i (trace_enable || trace_activated), // tracks 1st branch if 1st inst + .cause_filter_i (cause_filter), + .upper_cause_i (upper_cause), + .lower_cause_i (lower_cause), + .match_cause_i (match_cause), + .cause_mode_i (cause_mode), + .cause_i (cause_i), + .tvec_filter_i (tvec_filter), + .upper_tvec_i (upper_tvec), + .lower_tvec_i (lower_tvec), + .match_tvec_i (match_tvec), + .tvec_mode_i (tvec_mode), + .tvec_i (tvec_i), + .tval_filter_i (tval_filter), + .upper_tval_i (upper_tval), + .lower_tval_i (lower_tval), + .match_tval_i (match_tval), + .tval_mode_i (tval_mode), + .tval_i (tval_i), + .priv_lvl_filter_i(priv_lvl_filter), + .upper_priv_i (upper_priv), + .lower_priv_i (lower_priv), + .match_priv_i (match_priv), + .priv_lvl_mode_i (priv_lvl_mode), + .priv_i (priv_i), + .iaddr_filter_i (iaddr_filter), + .upper_iaddr_i (upper_iaddr), + .lower_iaddr_i (lower_iaddr), + .match_iaddr_i (match_iaddr), + .iaddr_mode_i (iaddr_mode), + .iaddr_i (iaddr_i[i]), + .nc_qualified_o (qualified[i]) + ); + end + end + endgenerate + + /* PRIORITY, PACKET EMITTER*/ + // case dependant + generate + // 1 instance for N == 1 || (N > 1 && ONLY_BRANCHES) + if (N == 1 || (N > 1 && ONLY_BRANCHES)) begin + /* PRIORITY */ + te_priority i_te_priority( + .clk_i (clk_gated), + .rst_ni (rst_ni), + .valid_i (valid0_q[0] || (enc_activated_q || enc_deactivated_q)), // necessary to generate F3SF3 packet + .lc_exception_i (lc_exception || lc_interrupt), + .lc_updiscon_i (lc_updiscon), + .tc_qualified_i (tc_qualified[0]), + .tc_exception_i (tc_exception|| tc_interrupt), + .tc_retired_i (tc_iretired[0]), + .tc_first_qualified_i (tc_first_qualified), + .tc_privchange_i (privchange_q), + //.tc_context_change_i(), // non mandatory + //.tc_precise_context_report_i(), // requires ctype signal CPU side + //.tc_context_report_as_disc_i(), // ibidem + //.tc_imprecise_context_report_i(), // ibidem + .tc_gt_max_resync_i (gt_max_resync_q), + .tc_et_max_resync_i (et_max_resync_q), + .tc_branch_map_empty_i (tc_branch_map_empty), + .tc_branch_map_full_i (branch_map_full_d), + //.tc_branch_misprediction_i(), // non mandatory + //.tc_pbc_i(), // non mandatory + .tc_enc_enabled_i (enc_activated_q), + .tc_enc_disabled_i (enc_deactivated_q), + .tc_opmode_change_i (enc_config_change_q), + .tc_final_qualified_i (tc_final_qualified), + .tc_packets_lost_i (~encapsulator_ready_i), // non mandatory + .nc_exception_i (nc_exception || nc_interrupt), + .nc_privchange_i (privchange_d), + //.nc_context_change_i(), + //.nc_precise_context_report_i(), // requires ctype signal CPU side + //.nc_context_report_as_disc_i(), // ibidem + .nc_branch_map_empty_i (nc_branch_map_empty), + .nc_qualified_i (nc_qualified[0]), + .nc_retired_i (nc_iretired[0]), + //.halted_i(), // non mandatory side band signal + //.reset_i(), // ibidem + //.implicit_return_i(), // non mandatory + //.tc_trigger_req_i(), // non mandatory + //.notify_o(), // non mandatory, depends on trigger request + .addr_to_compress_i (addr_to_compress[0]), + .valid_o (packet_valid[0]), + .packet_format_o (packet_format[0]), + .packet_f_sync_subformat_o(packet_f_sync_subformat[0]), + //.packet_f_opt_ext_subformat_o(packet_f_opt_ext_subformat), // non mandatory + .thaddr_o (thaddr[0]), + .lc_tc_mux_o (lc_tc_mux[0]), + .resync_timer_rst_o (resync_rst), + .qual_status_o (qual_status[0]), + .tc_resync_o (tc_resync[0]), + .nc_exc_only_o (nc_exc_only[0]), + .nc_ppccd_br_o (nc_ppccd_br[0]), + .keep_bits_o (keep_bits[0]) + ); + + /* PACKET EMITTER */ + te_packet_emitter i_te_packet_emitter( + .clk_i (clk_gated), + .rst_ni (rst_ni), + .valid_i (packet_valid[0]), + .packet_format_i (packet_format[0]), + .packet_f_sync_subformat_i(packet_f_sync_subformat[0]), + //.packet_f_opt_ext_subformat_i(packet_f_opt_ext_subformat), // non mandatory + .lc_cause_i (lc_cause), + .lc_tval_i (lc_tval), + .lc_interrupt_i (lc_interrupt), + .tc_cause_i (tc_cause), + .tc_tval_i (tc_tval), + .tc_interrupt_i (tc_interrupt), + .tc_resync_i (tc_resync[0]), + .nc_exc_only_i (nc_exc_only[0]), + .nc_ppccd_br_i (nc_ppccd_br[0]), + .nocontext_i (nocontext), + .notime_i (notime), + .tc_branch_i (branch_q), + .tc_branch_taken_i (branch_taken_q), + .tc_priv_i (tc_priv), + .tc_time_i (tc_time), // non mandatory + //.context_i(), // non mandatory + .tc_address_i (tc_address[0]), + .lc_tc_mux_i (lc_tc_mux[0]), + .thaddr_i (thaddr[0]), + .tc_tvec_i (tc_tvec), + .lc_epc_i (lc_epc), + .tc_ienable_i (trace_enable), + .encoder_mode_i (encoder_mode), + .qual_status_i (qual_status[0]), + .ioptions_i (enc_config_q), + //.denable_i(), // stand-by + //.dloss_i(), //stand-by + //.notify_i(), // non mandatory + .lc_updiscon_i (lc_updiscon[0]), + //.irreport_i(), // non mandatory + //.irdepth_i(), // non mandatory + .branches_i (branch_count), + .branch_map_i (branch_map), + .keep_bits_i (keep_bits[0]), + .shallow_trace_i (shallow_trace), + .packet_valid_o (packet_emitted[0]), + .packet_type_o (packet_type_o[0]), + .packet_payload_o (packet_payload_o[0]), + .payload_length_o (packet_length_o[0]), + .branch_map_flush_o (nc_branch_map_flush), + .addr_to_compress_o (addr_to_compress[0]) + ); + + end else if (N > 1 && !ONLY_BRANCHES) begin + // N instances for N > 1 && !ONLY_BRANCHES + for (genvar i = 0; i < N; i++) begin + if (i == 0) begin + /* PRIORITY */ + te_priority i_te_priority( + .clk_i (clk_gated), + .rst_ni (rst_ni), + .valid_i (|valid0_q || (enc_activated_q || enc_deactivated_q)), + .lc_exception_i (lc_exception || lc_interrupt), + .lc_updiscon_i (lc_updiscon[i]), + .tc_qualified_i (tc_qualified[i]), + .tc_exception_i (tc_exception|| tc_interrupt), + .tc_retired_i (tc_iretired[i]), + .tc_first_qualified_i (tc_first_qualified), + .tc_privchange_i (privchange_q), + //.tc_context_change_i(), // non mandatory + //.tc_precise_context_report_i(), // requires ctype signal CPU side + //.tc_context_report_as_disc_i(), // ibidem + //.tc_imprecise_context_report_i(), // ibidem + .tc_gt_max_resync_i (gt_max_resync_q), // connected only to the first port + .tc_et_max_resync_i (et_max_resync_q), // connected only to the first port + .tc_branch_map_empty_i (tc_branch_map_empty), + .tc_branch_map_full_i (branch_map_full_q), // connected only to the first port + //.tc_branch_misprediction_i(), // non mandatory + //.tc_pbc_i(), // non mandatory + .tc_enc_enabled_i (enc_activated_q), + .tc_enc_disabled_i (enc_deactivated_q), + .tc_opmode_change_i (enc_config_change_q), + .tc_final_qualified_i (tc_final_qualified), + .tc_packets_lost_i (~encapsulator_ready_i), // non mandatory + .nc_exception_i (nc_exception || nc_interrupt), + .nc_privchange_i (privchange_d), + //.nc_context_change_i(), + //.nc_precise_context_report_i(), // requires ctype signal CPU side + //.nc_context_report_as_disc_i(), // ibidem + .nc_branch_map_empty_i (nc_branch_map_empty), + .nc_qualified_i (nc_qualified[i]), + .nc_retired_i (nc_iretired[i]), + //.halted_i(), // non mandatory side band signal + //.reset_i(), // ibidem + //.implicit_return_i(), // non mandatory + //.tc_trigger_req_i(), // non mandatory + //.notify_o(), // non mandatory, depends on trigger request + .addr_to_compress_i (addr_to_compress[i]), + .valid_o (packet_valid[i]), + .packet_format_o (packet_format[i]), + .packet_f_sync_subformat_o(packet_f_sync_subformat[i]), + //.packet_f_opt_ext_subformat_o(packet_f_opt_ext_subformat), // non mandatory + .thaddr_o (thaddr[i]), + .lc_tc_mux_o (lc_tc_mux[i]), + .resync_timer_rst_o (resync_rst), + .qual_status_o (qual_status[i]), + .tc_resync_o (tc_resync[i]), + .nc_exc_only_o (nc_exc_only[i]), + .nc_ppccd_br_o (nc_ppccd_br[i]), + .keep_bits_o (keep_bits[i]) + ); + + /* PACKET EMITTER */ + te_packet_emitter i_te_packet_emitter( + .clk_i (clk_gated), + .rst_ni (rst_ni), + .valid_i (packet_valid[i]), + .packet_format_i (packet_format[i]), + .packet_f_sync_subformat_i(packet_f_sync_subformat[i]), + //.packet_f_opt_ext_subformat_i(packet_f_opt_ext_subformat), // non mandatory + .lc_cause_i (lc_cause), + .lc_tval_i (lc_tval), + .lc_interrupt_i (lc_interrupt), + .tc_cause_i (tc_cause), + .tc_tval_i (tc_tval), + .tc_interrupt_i (tc_interrupt), + .tc_resync_i (tc_resync[i]), + .nc_exc_only_i (nc_exc_only[i]), + .nc_ppccd_br_i (nc_ppccd_br[i]), + .nocontext_i (nocontext), + .notime_i (notime), + .tc_branch_i (branch_q), + .tc_branch_taken_i (branch_taken_q), + .tc_priv_i (tc_priv), + .tc_time_i (tc_time), // non mandatory + //.context_i(), // non mandatory + .tc_address_i (tc_address[i]), + .lc_tc_mux_i (lc_tc_mux[i]), + .thaddr_i (thaddr[i]), + .tc_tvec_i (tc_tvec), + .lc_epc_i (lc_epc), + .tc_ienable_i (trace_enable), + .encoder_mode_i (encoder_mode), + .qual_status_i (qual_status[i]), + .ioptions_i (enc_config_q), + //.denable_i(), // stand-by + //.dloss_i(), //stand-by + //.notify_i(), // non mandatory + .lc_updiscon_i (lc_updiscon[i]), + //.irreport_i(), // non mandatory + //.irdepth_i(), // non mandatory + .branches_i (branch_count), + .branch_map_i (branch_map), + .keep_bits_i (keep_bits[i]), + .shallow_trace_i (shallow_trace), + .packet_valid_o (packet_emitted[i]), + .packet_type_o (packet_type_o[i]), + .packet_payload_o (packet_payload_o[i]), + .payload_length_o (packet_length_o[i]), + .branch_map_flush_o (nc_branch_map_flush), + .addr_to_compress_o (addr_to_compress[i]) + ); + end else begin + /* PRIORITY */ + te_priority i_te_priority( + .clk_i (clk_gated), + .rst_ni (rst_ni), + .valid_i (|valid0_q || (enc_activated_q || enc_deactivated_q)), + .lc_exception_i (lc_exception || lc_interrupt), + .lc_updiscon_i (lc_updiscon[i]), + .tc_qualified_i (tc_qualified[i]), + .tc_exception_i (tc_exception || tc_interrupt), + .tc_retired_i (tc_iretired[i]), + .tc_first_qualified_i (tc_first_qualified), + .tc_privchange_i (privchange_q), + //.tc_context_change_i(), // non mandatory + //.tc_precise_context_report_i(), // requires ctype signal CPU side + //.tc_context_report_as_disc_i(), // ibidem + //.tc_imprecise_context_report_i(), // ibidem + .tc_gt_max_resync_i (), // connected only to the first port + .tc_et_max_resync_i (), // connected only to the first port + .tc_branch_map_empty_i (tc_branch_map_empty), + .tc_branch_map_full_i (), // connected only to the first port + //.tc_branch_misprediction_i(), // non mandatory + //.tc_pbc_i(), // non mandatory + .tc_enc_enabled_i (enc_activated_q), + .tc_enc_disabled_i (enc_deactivated_q), + .tc_opmode_change_i (enc_config_change_q), + .tc_final_qualified_i (tc_final_qualified), + .tc_packets_lost_i (~encapsulator_ready_i), // non mandatory + .nc_exception_i (nc_exception || nc_interrupt), + .nc_privchange_i (privchange_d), + //.nc_context_change_i(), + //.nc_precise_context_report_i(), // requires ctype signal CPU side + //.nc_context_report_as_disc_i(), // ibidem + .nc_branch_map_empty_i (nc_branch_map_empty), + .nc_qualified_i (nc_qualified[i]), + .nc_retired_i (nc_iretired[i]), + //.halted_i(), // non mandatory side band signal + //.reset_i(), // ibidem + //.implicit_return_i(), // non mandatory + //.tc_trigger_req_i(), // non mandatory + //.notify_o(), // non mandatory, depends on trigger request + .addr_to_compress_i (addr_to_compress[i]), + .valid_o (packet_valid[i]), + .packet_format_o (packet_format[i]), + .packet_f_sync_subformat_o(packet_f_sync_subformat[i]), + //.packet_f_opt_ext_subformat_o(packet_f_opt_ext_subformat), // non mandatory + .thaddr_o (thaddr[i]), + .lc_tc_mux_o (lc_tc_mux[i]), + .resync_timer_rst_o (), // connected only to the first port + .qual_status_o (qual_status[i]), + .tc_resync_o (tc_resync[i]), + .nc_exc_only_o (nc_exc_only[i]), + .nc_ppccd_br_o (nc_ppccd_br[i]), + .keep_bits_o (keep_bits[i]) + ); + + /* PACKET EMITTER */ + te_packet_emitter i_te_packet_emitter( + .clk_i (clk_gated), + .rst_ni (rst_ni), + .valid_i (packet_valid[i]), + .packet_format_i (packet_format[i]), + .packet_f_sync_subformat_i(packet_f_sync_subformat[i]), + //.packet_f_opt_ext_subformat_i(packet_f_opt_ext_subformat), // non mandatory + .lc_cause_i (lc_cause), + .lc_tval_i (lc_tval), + .lc_interrupt_i (lc_interrupt), + .tc_cause_i (tc_cause), + .tc_tval_i (tc_tval), + .tc_interrupt_i (tc_interrupt), + .tc_resync_i (tc_resync[i]), + .nc_exc_only_i (nc_exc_only[i]), + .nc_ppccd_br_i (nc_ppccd_br[i]), + .nocontext_i (nocontext), + .notime_i (notime), + .tc_branch_i (branch_q), + .tc_branch_taken_i (branch_taken_q), + .tc_priv_i (tc_priv), + .tc_time_i (tc_time), // non mandatory + //.context_i(), // non mandatory + .tc_address_i (tc_address[i]), + .lc_tc_mux_i (lc_tc_mux[i]), + .thaddr_i (thaddr[i]), + .tc_tvec_i (tc_tvec), + .lc_epc_i (lc_epc), + .tc_ienable_i (trace_enable), + .encoder_mode_i (encoder_mode), + .qual_status_i (qual_status[i]), + .ioptions_i (enc_config_q), + //.denable_i(), // stand-by + //.dloss_i(), //stand-by + //.notify_i(), // non mandatory + .lc_updiscon_i (lc_updiscon[i]), + //.irreport_i(), // non mandatory + //.irdepth_i(), // non mandatory + .branches_i (branch_count), + .branch_map_i (branch_map), + .keep_bits_i (keep_bits[i]), + .shallow_trace_i (shallow_trace), + .packet_valid_o (packet_emitted[i]), + .packet_type_o (packet_type_o[i]), + .packet_payload_o (packet_payload_o[i]), + .payload_length_o (packet_length_o[i]), + .branch_map_flush_o (), // connected only to the first port + .addr_to_compress_o (addr_to_compress[i]) + ); + end + end + end + endgenerate + + /* REGISTERS MANAGEMENT */ + always_ff @( posedge clk_i, negedge rst_ni ) begin : registers + if(~rst_ni) begin + valid0_q <= '0; + privchange_q <= '0; + // context_change_q <= '0; + //precise_context_report_q <= '0; // requires ctype signal CPU side + //context_report_as_disc_q <= '0; //ibidem + //no_context_report_q <= '0; // ibidem + //imprecise_context_report_q <= '0; // ibidem + gt_max_resync_q <= '0; + et_max_resync_q <= '0; + branch_map_full_q <= '0; + //branch_misprediction_q <= '0; // non mandatory + trace_activated_q <= '0; + enc_activated_q <= '0; + enc_deactivated_q <= '0; + //packets_lost_q <= '0; // non mandatory + enc_config_q <= te_pkg::DELTA_ADDRESS; // 3'b0 + enc_config_change_q <= '0; + branch_taken_q <= '0; + branch_q <= '0; + turn_on_tracer_q <= '0; + end else begin + privchange_q <= privchange_d; + // context_change_q <= context_change_d; + //precise_context_report_q <= precise_context_report_d; // requires ctype signal CPU side + //context_report_as_disc_q <= context_report_as_disc_d; //ibidem + //no_context_report_q <= no_context_report_d; // ibidem + //imprecise_context_report_q <= imprecise_context_report_d; // ibidem + branch_q <= branch_d; + valid0_q <= valid0_d; + gt_max_resync_q <= gt_max_resync_d; + et_max_resync_q <= et_max_resync_d; + branch_map_full_q <= branch_map_full_d; + //branch_misprediction_q <= branch_misprediction_d; // non mandatory + trace_activated_q <= trace_activated_d; + enc_activated_q <= enc_activated_d; + enc_deactivated_q <= enc_deactivated_d; + //packets_lost_q <= packets_lost_d; // non mandatory + enc_config_q <= enc_config_d; + enc_config_change_q <= enc_config_change_d; + branch_taken_q <= branch_taken_d; + turn_on_tracer_q <= turn_on_tracer_d; + end + end + +endmodule \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/rtl/te_branch_map.sv b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_branch_map.sv new file mode 100644 index 0000000000..c1e2f0fc8b --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_branch_map.sv @@ -0,0 +1,85 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +/* BRANCH MAP */ +/* +It keeps track of taken and non taken branches. + +Whenever a branch happens it updates the branch map +and the number of branches stored. + +When flush_i signal is asserted, the branch map is +cleaned. +*/ + +module te_branch_map #( + parameter N = 1 // max number of committed branches in one cycle +) +( + input logic clk_i, + input logic rst_ni, + + input logic [N-1:0] valid_i, + input logic [N-1:0] branch_taken_i, + input logic flush_i, + + output logic [te_pkg::BRANCH_MAP_LEN-1:0] map_o, + output logic [te_pkg::BRANCH_COUNT_LEN-1:0] branches_o, + output logic is_full_o, + output logic is_empty_o +); + + + logic [te_pkg::BRANCH_MAP_LEN-1:0] map_d, map_q; + logic [te_pkg::BRANCH_COUNT_LEN-1:0] branch_cnt_d, branch_cnt_q; + + always_comb begin + map_d = map_q; + branch_cnt_d = branch_cnt_q; + + if (flush_i) begin + map_d = '0; + branch_cnt_d = '0; + end + + if (valid_i) begin + if(flush_i) begin + map_d[0] = ~branch_taken_i; + branch_cnt_d = 5'b1; + end else begin + map_d[branch_cnt_q] = ~branch_taken_i ; + branch_cnt_d = branch_cnt_q +1; + end + end + end + + assign map_o = map_d; + assign branches_o = branch_cnt_d; + assign is_full_o = (branch_cnt_d == 31); + assign is_empty_o = (branch_cnt_d == 0); + + + always_ff @(posedge clk_i, negedge rst_ni) begin + if(~rst_ni) begin + map_q <= '0; + branch_cnt_q <= '0; + + end else begin + map_q <= map_d; + branch_cnt_q <= branch_cnt_d; + end + end + +endmodule \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/rtl/te_filter.sv b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_filter.sv new file mode 100644 index 0000000000..6d33b7ebc5 --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_filter.sv @@ -0,0 +1,142 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +/* FILTER MODULE */ +/* +it declares instructions qualified or not +*/ + +module te_filter +( + // if trace isn't enabled it doesn't make sense to filter + input logic trace_enable_i, + + /* + The idea is to have all inputs to be filtered in range or match. + To achieve this, the filter requires for each parameter: + - enable + - upper and lower values + - to be matched value + - select between in range or match + - qualified for each mode + + The trace to be qualified according to the filters set it requires + an AND between the qualified of the parameters to filter. + */ + + // parameters to filter + // cause + input logic cause_filter_i, + input logic [te_pkg::XLEN-1:0] upper_cause_i, + input logic [te_pkg::XLEN-1:0] lower_cause_i, + input logic [te_pkg::XLEN-1:0] match_cause_i, + input logic cause_mode_i, + input logic [te_pkg::XLEN-1:0] cause_i, + // tvec + input logic tvec_filter_i, + input logic [te_pkg::XLEN-1:0] upper_tvec_i, + input logic [te_pkg::XLEN-1:0] lower_tvec_i, + input logic [te_pkg::XLEN-1:0] match_tvec_i, + input logic tvec_mode_i, + input logic [te_pkg::XLEN-1:0] tvec_i, + // tval + input logic tval_filter_i, + input logic [te_pkg::XLEN-1:0] upper_tval_i, + input logic [te_pkg::XLEN-1:0] lower_tval_i, + input logic [te_pkg::XLEN-1:0] match_tval_i, + input logic tval_mode_i, + input logic [te_pkg::XLEN-1:0] tval_i, + // priv_lvl + input logic priv_lvl_filter_i, + input logic [te_pkg::PRIV_LEN-1:0] upper_priv_i, + input logic [te_pkg::PRIV_LEN-1:0] lower_priv_i, + input logic [te_pkg::PRIV_LEN-1:0] match_priv_i, + input logic priv_lvl_mode_i, + input logic [te_pkg::PRIV_LEN-1:0] priv_i, + // iaddr (pc) + input logic iaddr_filter_i, + input logic [te_pkg::XLEN-1:0] upper_iaddr_i, + input logic [te_pkg::XLEN-1:0] lower_iaddr_i, + input logic [te_pkg::XLEN-1:0] match_iaddr_i, + input logic iaddr_mode_i, + input logic [te_pkg::XLEN-1:0] iaddr_i, + + output logic nc_qualified_o +); + + // output signals for comparators + // cause + logic cause_in_range; + logic cause_equals; + // tvec + logic tvec_in_range; + logic tvec_equals; + // tval + logic tval_in_range; + logic tval_equals; + // priv_lvl + logic priv_lvl_in_range; + logic priv_lvl_equals; + // iaddr (pc) + logic iaddr_in_range; + logic iaddr_equals; + + // assignments + // cause + assign cause_in_range = cause_mode_i == te_pkg::RANGE_MODE && + cause_i <= upper_cause_i && + cause_i >= lower_cause_i; + assign cause_equals = cause_mode_i == te_pkg::EQUAL_MODE && + cause_i == match_cause_i; + // tvec + assign tvec_in_range = tvec_mode_i == te_pkg::RANGE_MODE && + tvec_i <= upper_tvec_i && + tvec_i >= lower_tvec_i; + assign tvec_equals = tvec_mode_i == te_pkg::EQUAL_MODE && + tvec_i == match_tvec_i; + // tval + assign tval_in_range = tval_mode_i == te_pkg::RANGE_MODE && + tval_i <= upper_tval_i && + tval_i >= lower_tval_i; + assign tval_equals = tval_mode_i == te_pkg::EQUAL_MODE && + tval_i == match_tval_i; + // priv_lvl + assign priv_lvl_in_range = priv_lvl_mode_i == te_pkg::RANGE_MODE && + priv_i <= upper_priv_i && + priv_i >= lower_priv_i; + assign priv_lvl_equals = priv_lvl_mode_i == te_pkg::EQUAL_MODE && + priv_i == match_priv_i; + // iaddr + assign iaddr_in_range = iaddr_mode_i == te_pkg::RANGE_MODE && + iaddr_i <= upper_iaddr_i && + iaddr_i >= lower_iaddr_i; + assign iaddr_equals = iaddr_mode_i == te_pkg::EQUAL_MODE && + iaddr_i == match_iaddr_i; + + // assigning output + // if no filter is enabled -> the instruction is qualified + assign nc_qualified_o = ((cause_filter_i && (cause_in_range || cause_equals)) || + ~cause_filter_i) && // cause + ((tvec_filter_i && (tvec_in_range || tvec_equals)) || + ~tvec_filter_i) && // tvec + ((tval_filter_i && (tval_in_range || tval_equals)) || + ~tval_filter_i) && // tval + ((priv_lvl_filter_i && (priv_lvl_in_range || priv_lvl_equals)) || + ~priv_lvl_filter_i) && // priv_lvl + ((iaddr_filter_i && (iaddr_in_range || iaddr_equals)) || + ~iaddr_filter_i) && // iaddr + trace_enable_i; + +endmodule \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/rtl/te_packet_emitter.sv b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_packet_emitter.sv new file mode 100644 index 0000000000..447519f685 --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_packet_emitter.sv @@ -0,0 +1,1096 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +/* PACKET EMITTER */ +/* +it produces the packets for the output interface +*/ + +module te_packet_emitter +( + input logic clk_i, + input logic rst_ni, + input logic valid_i, + + // necessary info to assemble packet + input te_pkg::format_e packet_format_i, + input te_pkg::f_sync_subformat_e packet_f_sync_subformat_i, // SF for F3 + //input f_opt_ext_subformat_e packet_f_opt_ext_subformat_i, // non mandatory, SF for F0 + + // lc (last cycle) signals + input logic [te_pkg::XLEN-1:0] lc_cause_i, + input logic [te_pkg::XLEN-1:0] lc_tval_i, + input logic lc_interrupt_i, + + // tc (this cycle) signals + input logic [te_pkg::XLEN-1:0] tc_cause_i, + input logic [te_pkg::XLEN-1:0] tc_tval_i, + input logic tc_interrupt_i, + input logic tc_resync_i, + + input logic nc_exc_only_i, + input logic nc_ppccd_br_i, + + // nc (next cycle) signals + + /* the following signals used to determine + if the packet emitter has to put context + and/or time in the payload*/ + input logic nocontext_i, // both read from registers + input logic notime_i, + // in this implementation both hardwired to 0 + + // format 3 subformat 0 specific signals + input logic tc_branch_i, + input logic tc_branch_taken_i, + input logic [te_pkg::PRIV_LEN-1:0] tc_priv_i, + input logic [te_pkg::TIME_LEN-1:0] tc_time_i, // optional + //input logic [:0] context_i, // optional + input logic [te_pkg::XLEN-1:0] tc_address_i, + + // format 3 subformat 1 specific signals + input logic lc_tc_mux_i, + /* format 3 subformat 1 packets require sometimes lc_cause o tc_cause + To discriminate I use a mux to choose between lc or tc */ + + input logic thaddr_i, + input logic [te_pkg::XLEN-1:0] tc_tvec_i, // trap handler address + input logic [te_pkg::XLEN-1:0] lc_epc_i, + + // format 3 subformat 3 specific signals + input logic tc_ienable_i, // trace encoder enabled + input logic encoder_mode_i, // only branch trace supported (value==0) + input te_pkg::qual_status_e qual_status_i, + input te_pkg::ioptions_s ioptions_i, + // about DATA trace, in stand-by at the moment + //input logic denable_i, // DATA trace enabled, if supported + //input logic dloss_i, // one or more DATA trace packets lost, if supported + //input logic [:0] doptions_i, // it's like ioptions, but for DATA trace + + + // format 2 specific signals + /* notify -> means the packet was requested by the cpu trigger unit*/ + //input logic notify_i, // non mandatory + + // most of the time these 2 values can be compressed + input logic lc_updiscon_i, + + // necessary if implicit_return mode is enabled + //input logic irreport_i, + + //input logic [2**te_pkg::CALL_COUNTER_SIZE-1:0] irdepth_i, // non mandatory, traces nested calls + + // format 1 specific signals + /* this format exists in two modes: + - address, branch map + - NO address, branch maps + + Their generation depends on the value of branches: + - 0: no need for address + - >0: address required + */ + input logic [te_pkg::BRANCH_COUNT_LEN-1:0] branches_i, + input logic [te_pkg::BRANCH_MAP_LEN-1:0] branch_map_i, // can change size to improve efficiency + + // format 0 specific signals + /* This format can have two possible subformats: + - subformat 0: number of correctly predicted branches + - subformat 1: jump target cache index + + Non mandatory, required support by the encoder. + */ + input logic [$clog2(te_pkg::XLEN):0] keep_bits_i, // required for address compression + input logic shallow_trace_i, // used to flush branch map at each packet + + // outputs + output logic packet_valid_o, // asserted when a packet is generated + output te_pkg::it_packet_type_e packet_type_o, + output logic [te_pkg::PAYLOAD_LEN-1:0] packet_payload_o, + output logic [te_pkg::P_LEN-1:0] payload_length_o, // in bytes + output logic branch_map_flush_o, // flushing done after each request + // to send back to priority module in order to compress them + output logic [te_pkg::XLEN-1:0] addr_to_compress_o +); + + // internal signals + logic branch; + logic interrupt; + logic [te_pkg::XLEN-1:0] address; + logic [te_pkg::XLEN-1:0] ecause; + logic [te_pkg::XLEN-1:0] diff_addr; + logic [te_pkg::XLEN-1:0] latest_addr_d, latest_addr_q; // address of the latest packet emitted + logic [te_pkg::XLEN-1:0] tval; + logic [1:0] time_and_context; // if payload requires time/context + logic notify; + logic updiscon; + logic irreport; + logic [2**te_pkg::CALL_COUNTER_SIZE-1:0] irdepth; + logic [4:0] branch_map_off; + logic [3:0] address_off; + logic [8:0] used_bits; // counts the bits used inside each payload + logic flush_d, flush_q; + logic update_latest_addr; + logic resync_d, resync_q; + logic [te_pkg::XLEN-1:0] resync_addr_d, resync_addr_q; + + // assigning values + assign branch = ~(tc_branch_i && tc_branch_taken_i); + assign address = thaddr_i ? tc_tvec_i : lc_epc_i; + assign ecause = lc_tc_mux_i ? tc_cause_i : lc_cause_i; + assign tval = lc_tc_mux_i ? tc_tval_i : lc_tval_i; + assign interrupt = lc_tc_mux_i ? tc_interrupt_i : lc_interrupt_i; + assign time_and_context = {~notime_i, ~nocontext_i}; + assign branch_map_flush_o = flush_q; + assign payload_length_o = (used_bits + 7) >> 3; + + always_comb begin + // init + resync_d = resync_q; + resync_addr_d = resync_addr_q; + + // updates resync signal + if (tc_resync_i) begin + resync_d = '1; + resync_addr_d = tc_address_i; + end + + // synchronous reset of resync signal + if (packet_type_o == te_pkg::F3SF0 && resync_q) begin + resync_d = '0; + end + end + + + // register to store the last address emitted in a packet + always_ff @(posedge clk_i, negedge rst_ni) begin + if(~rst_ni) begin + latest_addr_q <= '0; + flush_q <= '0; + resync_q <= '0; + resync_addr_q <= '0; + end else begin + latest_addr_q <= latest_addr_d; + resync_q <= resync_d; + resync_addr_q <= resync_addr_d; + flush_q <= flush_d; + end + end + + // combinatorial network to compute the offset to compress the branch_map + always_comb begin : branch_map_offset + if(branches_i == 1) begin + branch_map_off = 1; + end else if(branches_i <= 3) begin + branch_map_off = 3; + end else if(branches_i <= 7) begin + branch_map_off = 7; + end else if(branches_i <= 15) begin + branch_map_off = 15; + end else if (branches_i < 31) begin + branch_map_off = 31; + end else begin + branch_map_off = '0; + end + + end + + /* + the address compression works in byte chunks: based on the value of + keep_bits_i, the number of least significant bytes to keep is determined. + + example: + keep_bits_i == 7 -> 1 lsB kept 0111 + keep_bits_i == 10 -> 2 lsB kept 1010 + keep_bits_i == 25 -> 4 lsB kept 11001 + */ + // 33 = 100001 + 7 = 101000 >>3 = 0101 = 5 + + // find the number of least significant bytes to keep in the compressed address + assign address_off = (keep_bits_i + 7)>>3; + + // combinatorial network to output packets + always_comb begin + // init values + packet_payload_o = '0; + packet_valid_o = '0; + flush_d = '0; + used_bits = '0; + packet_type_o = te_pkg::F0SF0; + update_latest_addr = '0; + + if(valid_i) begin + /* branch_map_flush_o + the signal is output in this cycle, but the branch map does + the flush in the next cycle to leave time to the packet + emitter to read values and put them in the payload + */ + // flushes at each packet emitted to get a less precise tracing + flush_d = shallow_trace_i; + + // setting the packet to emit as valid + packet_valid_o = '1; + + /* packet payload creation: + at the beginning it's put in the payload the common part (i.e. the packet format) + then, for each format and subformat it's put the rest of the payload + */ + + // setting the packet format - common for all payloads + packet_payload_o[1:0] = packet_format_i; + + // format bits + used_bits += 2; + + case(packet_format_i) + te_pkg::F_SYNC: begin // format 3 + // setting packet subformat - common for all type 3 payloads + packet_payload_o[3:2] = packet_f_sync_subformat_i; + + used_bits += 2; // subformat bits + + // setting the rest of payload for each type + case(packet_f_sync_subformat_i) + te_pkg::SF_START: begin // subformat 0 + // updating packet type + packet_type_o = te_pkg::F3SF0; + update_latest_addr = '1; + + case(time_and_context) + 2'b00: begin + used_bits += 1 + (address_off * 8) + te_pkg::PRIV_LEN; + + packet_payload_o[4+:1+te_pkg::PRIV_LEN] = { + tc_priv_i, + branch + }; + // address compression + case (address_off) + 1: begin + packet_payload_o[5+te_pkg::PRIV_LEN+:8] = { + addr_to_compress_o[7:0] + }; + end + 2: begin + packet_payload_o[5+te_pkg::PRIV_LEN+:16] = { + addr_to_compress_o[15:0] + }; + end + 3: begin + packet_payload_o[5+te_pkg::PRIV_LEN+:24] = { + addr_to_compress_o[23:0] + }; + end + 4: begin + packet_payload_o[5+te_pkg::PRIV_LEN+:32] = { + addr_to_compress_o[31:0] + }; + end + `ifdef TE_ARCH64 // 64bits case + 5: begin + packet_payload_o[5+te_pkg::PRIV_LEN+:40] = { + addr_to_compress_o[39:0] + }; + end + 6: begin + packet_payload_o[5+te_pkg::PRIV_LEN+:48] = { + addr_to_compress_o[47:0] + }; + end + 7: begin + packet_payload_o[5+te_pkg::PRIV_LEN+:56] = { + addr_to_compress_o[55:0] + }; + end + 8: begin + packet_payload_o[5+te_pkg::PRIV_LEN+:64] = { + addr_to_compress_o + }; + end + `endif + endcase + end + + 2'b10: begin + used_bits += 1 + te_pkg::PRIV_LEN + te_pkg::TIME_LEN + (address_off * 8); + + packet_payload_o[4+:1+te_pkg::PRIV_LEN+te_pkg::TIME_LEN] = { + tc_time_i, + tc_priv_i, + branch + }; + // address compression + // FIXME(MAX): simplify case with: + // for (int unsigned i = 1; i <= 8; i++) begin + // if (i == address_off) begin + // packet_payload_o[5+te_pkg::PRIV_LEN+te_pkg::TIME_LEN+:i*8] = { + // addr_to_compress_o[i*8-1:0] + // }; + // end + // end + case (address_off) + 1: begin + packet_payload_o[5+te_pkg::PRIV_LEN+te_pkg::TIME_LEN+:8] = { + addr_to_compress_o[7:0] + }; + end + 2: begin + packet_payload_o[5+te_pkg::PRIV_LEN+te_pkg::TIME_LEN+:16] = { + addr_to_compress_o[15:0] + }; + end + 3: begin + packet_payload_o[5+te_pkg::PRIV_LEN+te_pkg::TIME_LEN+:24] = { + addr_to_compress_o[23:0] + }; + end + 4: begin + packet_payload_o[5+te_pkg::PRIV_LEN+te_pkg::TIME_LEN+:32] = { + addr_to_compress_o[31:0] + }; + end + `ifdef TE_ARCH64 // 64bits case + 5: begin + packet_payload_o[5+te_pkg::PRIV_LEN+te_pkg::TIME_LEN+:40] = { + addr_to_compress_o[39:0] + }; + end + 6: begin + packet_payload_o[5+te_pkg::PRIV_LEN+te_pkg::TIME_LEN+:48] = { + addr_to_compress_o[47:0] + }; + end + 7: begin + packet_payload_o[5+te_pkg::PRIV_LEN+te_pkg::TIME_LEN+:56] = { + addr_to_compress_o[55:0] + }; + end + 8: begin + packet_payload_o[5+te_pkg::PRIV_LEN+te_pkg::TIME_LEN+:64] = { + addr_to_compress_o + }; + end + `endif + endcase + end + /*TODO: other cases*/ + endcase + end + te_pkg::SF_TRAP: begin // subformat 1 + // updating packet type + packet_type_o = te_pkg::F3SF1; + update_latest_addr = '1; + + case(time_and_context) + 2'b00: begin + used_bits += 1 + te_pkg::PRIV_LEN + te_pkg::XLEN + 2 + (address_off * 8) + te_pkg::XLEN; // last XLEN is for tval + + packet_payload_o[4+:1+te_pkg::PRIV_LEN+te_pkg::XLEN+2] = { + thaddr_i, + interrupt, + ecause, + tc_priv_i, + branch + }; + // address compression //FIXME Why tval is with addr_to_compress ? and not before ??? + case (address_off) + 1: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+:8+te_pkg::XLEN] = { + addr_to_compress_o[7:0], + tval + + }; + end + 2: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+:16+te_pkg::XLEN] = { + addr_to_compress_o[15:0], + tval + }; + end + 3: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+:24+te_pkg::XLEN] = { + addr_to_compress_o[23:0], + tval + }; + end + 4: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+:32+te_pkg::XLEN] = { + addr_to_compress_o[31:0], + tval + }; + end + `ifdef TE_ARCH64 // 64bits case + 5: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+:40+te_pkg::XLEN] = { + addr_to_compress_o[39:0], + tval + }; + end + 6: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+:48+te_pkg::XLEN] = { + addr_to_compress_o[47:0], + tval + }; + end + 7: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+:56+te_pkg::XLEN] = { + addr_to_compress_o[55:0], + tval + }; + end + 8: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+:64+te_pkg::XLEN] = { + addr_to_compress_o, + tval + }; + end + `endif + endcase + end + + 2'b10: begin + used_bits += 1 + te_pkg::PRIV_LEN + te_pkg::XLEN + 2 + (address_off * 8) + te_pkg::TIME_LEN + te_pkg::XLEN ; // why time_len *2 , time = 64 bits ? + + packet_payload_o[4+:1+te_pkg::PRIV_LEN+te_pkg::XLEN+2+te_pkg::TIME_LEN] = { + thaddr_i, + interrupt, + ecause, + tc_time_i, + tc_priv_i, + branch + }; + // address compression + case (address_off) + 1: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+te_pkg::TIME_LEN+:8+te_pkg::XLEN] = { // FIXME Replace XLEN by TIME_LEN every time ? + addr_to_compress_o[7:0], + tval + + }; + end + 2: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+te_pkg::TIME_LEN+:16+te_pkg::XLEN] = { + addr_to_compress_o[15:0], + tval + }; + end + 3: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+te_pkg::TIME_LEN+:24+te_pkg::XLEN] = { + addr_to_compress_o[23:0], + tval + }; + end + 4: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+te_pkg::TIME_LEN+:32+te_pkg::XLEN] = { + addr_to_compress_o[31:0], + tval + }; + end + `ifdef TE_ARCH64 // 64bits case + 5: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+te_pkg::TIME_LEN+:40+te_pkg::XLEN] = { + addr_to_compress_o[39:0], + tval + }; + end + 6: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+te_pkg::TIME_LEN+:48+te_pkg::XLEN] = { + addr_to_compress_o[47:0], + tval + }; + end + 7: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+te_pkg::TIME_LEN+:56+te_pkg::XLEN] = { + addr_to_compress_o[55:0], + tval + }; + end + 8: begin + packet_payload_o[7+te_pkg::PRIV_LEN+te_pkg::XLEN+te_pkg::TIME_LEN+:64+te_pkg::XLEN] = { + addr_to_compress_o, + tval + }; + end + `endif + endcase + end + /*TODO: other cases*/ + endcase + end + te_pkg::SF_CONTEXT: begin // subformat 2 + // updating packet type + packet_type_o = te_pkg::F3SF2; + + case(time_and_context) + 2'b00: begin + used_bits += te_pkg::PRIV_LEN; + + packet_payload_o[4+:te_pkg::PRIV_LEN] = { + tc_priv_i + }; + end + + 2'b10: begin + used_bits += te_pkg::PRIV_LEN + te_pkg::TIME_LEN; + + packet_payload_o[4+:te_pkg::PRIV_LEN+te_pkg::TIME_LEN] = { + tc_time_i, + tc_priv_i + }; + end + /*TODO: other cases*/ + endcase + end + te_pkg::SF_SUPPORT: begin // subformat 3 + // updating packet type + packet_type_o = te_pkg::F3SF3; + + used_bits += 11; + + packet_payload_o[4+:1+1+2+7] = { + /* info required for data tracing - in the future + doptions_i, + dloss_i, + denable_i, */ + ioptions_i, + qual_status_i, + encoder_mode_i, + tc_ienable_i + }; + end + endcase + end + + te_pkg::F_ADDR_ONLY: begin // format 2 + // updating packet type + packet_type_o = te_pkg::F2; + update_latest_addr = '1; + + // requires trigger unit in CPU + /* + if(notify_i) begin // request from trigger unit + notify = !tc_address_i[XLEN-1]; + updiscon = notify; + irreport = updsicon; + irdepth = irdepth_i; + end else begin*/ + + // case of an updiscon + if(lc_updiscon_i && (nc_exc_only_i || nc_ppccd_br_i)) begin //FIXME spec says lc_updiscon AND nc_execption/interrupt /priv change / resync <= need to add nc_resync + notify = tc_address_i[te_pkg::XLEN-1]; + updiscon = !notify; + irreport = updiscon; + irdepth = {2**te_pkg::CALL_COUNTER_SIZE{updiscon}}; + /* non mandatory + end else if(implicit_mode_i && irreport_i) begin // request for implicit return mode + notify = tc_address_i[XLEN-1]; + updiscon = notify; + irreport = !updiscon; + irdepth = irdepth_i; + */ + end else begin //other cases + notify = tc_address_i[te_pkg::XLEN-1]; + updiscon = notify; + irreport = updiscon; + irdepth = {2**te_pkg::CALL_COUNTER_SIZE{updiscon}}; + end + + // checking if implicit return is supported + if (te_pkg::CALL_COUNTER_SIZE == 0 && + te_pkg::RETURN_STACK_SIZE == 0) begin // not supported + + // payload bits + used_bits += 3 + address_off*8 ; + + // address compression + case (address_off) + 1: begin + packet_payload_o[2+:8+3] = { + addr_to_compress_o[7:0], + irreport, + updiscon, + notify + }; + end + 2: begin + packet_payload_o[2+:16+3] = { + addr_to_compress_o[15:0], + irreport, + updiscon, + notify + }; + end + 3: begin + packet_payload_o[2+:24+3] = { + addr_to_compress_o[23:0], + irreport, + updiscon, + notify + }; + end + 4: begin + packet_payload_o[2+:32+3] = { + addr_to_compress_o[31:0], + irreport, + updiscon, + notify + }; + end + `ifdef TE_ARCH64 // 64bits case + 5: begin + packet_payload_o[2+:40+3] = { + addr_to_compress_o[39:0], + irreport, + updiscon, + notify + }; + end + 6: begin + packet_payload_o[2+:48+3] = { + addr_to_compress_o[47:0], + irreport, + updiscon, + notify + }; + end + 7: begin + packet_payload_o[2+:56+3] = { + addr_to_compress_o[55:0], + irreport, + updiscon, + notify + }; + end + 8: begin + packet_payload_o[2+:64+3] = { + addr_to_compress_o, + irreport, + updiscon, + notify + }; + end + `endif + endcase + + end else begin // supported + // payload bits + used_bits += 3 + 2**te_pkg::CALL_COUNTER_SIZE + address_off*8 ; + + // address compression + case (address_off) + 1: begin + packet_payload_o[2+:8+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[7:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 2: begin + packet_payload_o[2+:16+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[15:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 3: begin + packet_payload_o[2+:24+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[23:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 4: begin + packet_payload_o[2+:32+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[31:0], + irdepth, + irreport, + updiscon, + notify + }; + end + `ifdef TE_ARCH64 // 64bits case + 5: begin + packet_payload_o[2+:40+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[39:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 6: begin + packet_payload_o[2+:48+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[47:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 7: begin + packet_payload_o[2+:56+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[55:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 8: begin + packet_payload_o[2+:64+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o, + irdepth, + irreport, + updiscon, + notify + }; + end + `endif + endcase + end + end + + te_pkg::F_DIFF_DELTA: begin // format 1 + /* There can be two type of payloads for this format: + 1. address, branch map + 2. no address, branch map + + Type 1 payload is used when there has been at least + one branch from last packet. This can be determined + by the number of branches in the branch map. + + Type 2 payload is used when the address is not needed, + for examples if the branch map is full. + */ + // flushing the branch_map + flush_d = '1; + // updating packet type + packet_type_o = te_pkg::F1; + + // requires trigger unit in CPU + /* + if(notify_i) begin // request from trigger unit + notify = !tc_address_i[XLEN-1]; + updiscon = notify; + irreport = updsicon; + irdepth = irdepth_i; + end else begin*/ + + // case of an updiscon + if(lc_updiscon_i && (nc_exc_only_i || nc_ppccd_br_i)) begin //FIXME spec says lc_updiscon AND nc_execption/interrupt /priv change / resync <= need to add nc_resync + notify = tc_address_i[te_pkg::XLEN-1]; + updiscon = !notify; + irreport = updiscon; + irdepth = {2**te_pkg::CALL_COUNTER_SIZE{updiscon}}; + /* non mandatory + end else if(implicit_return_i && irreport_i) begin // request for implicit return mode + notify = tc_address_i[XLEN-1]; + updiscon = notify; + irreport = !updiscon; + irdepth = irdepth_i; + */ + end else begin // other cases + notify = tc_address_i[te_pkg::XLEN-1]; + updiscon = notify; + irreport = updiscon; + irdepth = {2**te_pkg::CALL_COUNTER_SIZE{updiscon}}; + end + + // branches and branch_map bits + used_bits += (branch_map_off==0)? te_pkg::BRANCH_COUNT_LEN + 32 : te_pkg::BRANCH_COUNT_LEN + branch_map_off; + + // adding branch count and branch map + if (branch_map_off == 1) begin + packet_payload_o[2+:te_pkg::BRANCH_COUNT_LEN+1] = { + branch_map_i[0], + branches_i + }; + end else if (branch_map_off == 3) begin + packet_payload_o[2+:te_pkg::BRANCH_COUNT_LEN+3] = { + branch_map_i[2:0], + branches_i + }; + end else if (branch_map_off == 7) begin + packet_payload_o[2+:te_pkg::BRANCH_COUNT_LEN+7] = { + branch_map_i[6:0], + branches_i + }; + end else if (branch_map_off == 15) begin + packet_payload_o[2+:te_pkg::BRANCH_COUNT_LEN+15] = { + branch_map_i[14:0], + branches_i + }; + end else if (branch_map_off == 31) begin + packet_payload_o[2+:te_pkg::BRANCH_COUNT_LEN+31] = { + branch_map_i[30:0], + branches_i + }; + end else begin //FIXME if we have discontinuity branches =31 not 0 + packet_payload_o[2+:te_pkg::BRANCH_COUNT_LEN+31] = { + branch_map_i[30:0], + 5'b00000 + }; + end + + // attaching the rest of the payload + if(branches_i < 31) begin // branch map not full - address + update_latest_addr = '1; + // checking if implicit return is supported + if (te_pkg::CALL_COUNTER_SIZE == 0 && + te_pkg::RETURN_STACK_SIZE == 0) begin // not supported + // rest of the payload bits + used_bits += 3 + address_off*8 ; + + // address compression + case (address_off) + 1: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:8+3] = { + addr_to_compress_o[7:0], + irreport, + updiscon, + notify + }; + end + 2: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:16+3] = { + addr_to_compress_o[15:0], + irreport, + updiscon, + notify + }; + end + 3: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:24+3] = { + addr_to_compress_o[23:0], + irreport, + updiscon, + notify + }; + end + 4: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:32+3] = { + addr_to_compress_o[31:0], + irreport, + updiscon, + notify + }; + end + `ifdef TE_ARCH64 // 64bits case + 5: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:40+3] = { + addr_to_compress_o[39:0], + irreport, + updiscon, + notify + }; + end + 6: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:48+3] = { + addr_to_compress_o[47:0], + irreport, + updiscon, + notify + }; + end + 7: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:56+3] = { + addr_to_compress_o[55:0], + irreport, + updiscon, + notify + }; + end + 8: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:64+3] = { + addr_to_compress_o, + irreport, + updiscon, + notify + }; + end + `endif + endcase + + end else begin // supported -> uses irdepth and irreport + // rest of the payload bits + used_bits += 3 + 2**te_pkg::CALL_COUNTER_SIZE + address_off*8 ; + + // address compression + case (address_off) + 1: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:8+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[7:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 2: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:16+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[15:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 3: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:24+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[23:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 4: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:32+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[31:0], + irdepth, + irreport, + updiscon, + notify + }; + end + `ifdef TE_ARCH64 // 64bits case + 5: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:40+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[39:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 6: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:48+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[47:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 7: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:56+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o[55:0], + irdepth, + irreport, + updiscon, + notify + }; + end + 8: begin + packet_payload_o[2+te_pkg::BRANCH_COUNT_LEN+branch_map_off+:64+3+2**te_pkg::CALL_COUNTER_SIZE] = { + addr_to_compress_o, + irdepth, + irreport, + updiscon, + notify + }; + end + `endif + endcase + end + end + end + + //F_OPT_EXT: begin // format 0 // TODO + // requires trigger unit in CPU + /* + if(notify_i) begin // request from trigger unit + notify = !tc_address_i[XLEN-1]; + updiscon = notify; + irreport = updsicon; + irdepth = irdepth_i; + end else begin + notify = tc_address_i[XLEN-1]; + updiscon = notify; + irreport = updiscon; + irdepth = {2**CALL_COUNTER_SIZE{updiscon}}; + end */ + + /* requires non mandatory support for jtc and branch prediction + case(packet_f_opt_ext_subformat_i) + SF_PBC: begin // subformat 0 + /* There can be two type of payloads for this subformat: + 1. no address, branch count + 2. address, branch count + * / + + // only for F0SF0 payload w/address + // updating latest address sent in a packet + + packet_payload_o = {F_OPT_EXT, SF_PBC, etc..}; + packet_valid_o = '1; + end + + SF_JTC: begin // subformat 1 + packet_payload_o = {F_OPT_EXT, SF_JTC, etc..}; + packet_valid_o = '1; + end + endcase + */ + //end + endcase + end + end + + always_comb begin : address_to_compress + diff_addr = '0; + addr_to_compress_o = '0; + latest_addr_d = latest_addr_q; + + // determines differential address for F1, F2 + if (packet_valid_o && (packet_format_i == te_pkg::F_DIFF_DELTA || + packet_format_i == te_pkg::F_ADDR_ONLY)) begin + if (ioptions_i.delta_address_en) begin + diff_addr = latest_addr_q - tc_address_i; // mostly >0 exept for jump , remove signed + addr_to_compress_o = diff_addr; + end else if (ioptions_i.full_address_en) begin + addr_to_compress_o = tc_address_i; + end + end + + // determines latest address + if (packet_valid_o && update_latest_addr) begin + if (packet_type_o == te_pkg::F1 || + packet_type_o == te_pkg::F2) begin // F1, F2 + latest_addr_d = tc_address_i; + addr_to_compress_o = tc_address_i; + end + if (packet_type_o == te_pkg::F3SF0) begin // F3SF0 + if (resync_q) begin //FIXME WHY ? + latest_addr_d = tc_address_i; + addr_to_compress_o = tc_address_i; + end else begin + latest_addr_d = tc_address_i; + addr_to_compress_o = tc_address_i; + end + end + if (packet_type_o == te_pkg::F3SF1) begin // F3SF1 + latest_addr_d = address; + addr_to_compress_o = address; + end + end + end + +endmodule \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/rtl/te_priority.sv b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_priority.sv new file mode 100644 index 0000000000..9fd6db48af --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_priority.sv @@ -0,0 +1,405 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +/*PRIORITY*/ +/* +change this module name to a more appropriate one +for example "packet identifier" or something similar +*/ +/* +it orders packet generation - refer to page 53 of the spec +*/ + +module te_priority ( + + input logic clk_i, + input logic rst_ni, + + input logic valid_i, + + /* signals for the jump target cache mode - non mandatory */ + //input logic jtc_enabled_i, + //input logic address_in_cache_i, // communicates if the address is present in cache + + // lc (last cycle) signals + input logic lc_exception_i, + input logic lc_updiscon_i, // updsicon == uninferable PC discontinuity + + // tc (this cycle) signals + input logic tc_qualified_i, + input logic tc_exception_i, + input logic [te_pkg::IRETIRE_LEN-1:0] tc_retired_i, + input logic tc_first_qualified_i, + input logic tc_privchange_i, + //input logic tc_context_change_i, // non mandatory + //input logic tc_precise_context_report_i, // requires ctype signal CPU side + //input logic tc_context_report_as_disc_i, // ibidem + //input logic tc_imprecise_context_report_i, // ibidem + input logic tc_gt_max_resync_i, // greater than timeout + input logic tc_et_max_resync_i, // one step to timeout + input logic tc_branch_map_empty_i, + input logic tc_branch_map_full_i, + //input logic tc_branch_misprediction_i, // non mandatory + //input logic tc_pbc_i, // correctly predicted branch count, non mandatory + + // format 3 subformat 3 - NOT shown in graph + input logic tc_enc_enabled_i, + input logic tc_enc_disabled_i, + input logic tc_opmode_change_i, + input logic tc_final_qualified_i, + input logic tc_packets_lost_i, // non mandatory + + // nc (next cycle) signals + input logic nc_exception_i, + input logic nc_privchange_i, + //input logic nc_context_change_i, // non mandatory + //input logic nc_precise_context_report_i, // requires ctype signal CPU side + //input logic nc_context_report_as_disc_i, // ibidem + input logic nc_branch_map_empty_i, + input logic nc_qualified_i, + input logic [te_pkg::IRETIRE_LEN-1:0] nc_retired_i, // used w/nc_exception for signal nc_exc_only + + // non mandatory sideband signals + // refer to page 52 of the spec + //input logic halted_i, + //input logic reset_i, + + // inputs for irreport and irdepth, non mandatory + //input logic implicit_return_i, // tells if the mode is enabled + //input logic [:0] call_counter_size_i, // size of nested calls counter, 2^value + //input logic [:0] return_stack_size_i, // size of nested calls stack, 2^value + + // trigger unit request ports, must be supported by the CPU + //input logic tc_trigger_req_i, + //output logic notify_o, + // communicates the packet emitter that format 2 packet was requested by trigger unit + + // input to compress + input logic [te_pkg::XLEN-1:0] addr_to_compress_i, + + // outputs for packet_emitter + output logic valid_o, + output te_pkg::format_e packet_format_o, + output te_pkg::f_sync_subformat_e packet_f_sync_subformat_o, + //output te_pkg::f_opt_ext_subformat_e packet_f_opt_ext_subformat_o, // non mandatory, used for jtc and branch prediction + output logic thaddr_o, // required for f3 sf1 packet payload + output logic lc_tc_mux_o, // operates the MUX to choose between lc or tc cause, tval, interrupt: 0 -> lc, 1 + output logic resync_timer_rst_o, // resets counter + output te_pkg::qual_status_e qual_status_o, + //output logic irreport_o, // non mandatory, required implicit return mode + output logic tc_resync_o, + output logic nc_exc_only_o, + output logic nc_ppccd_br_o, + // output for compression + output logic [$clog2(te_pkg::XLEN):0] keep_bits_o + ); + + + /* internal signals required for packet determination */ + // last cycle + logic lc_ended_ntr_d, lc_ended_ntr_q; + logic lc_ended_rep_d, lc_ended_rep_q; + // this cycle + logic tc_exc_only; // for a precise definition: page 51 of the spec + logic tc_ppccd; // ibidem + logic tc_resync_br; // ibidem + logic tc_er_n; // ibidem + logic tc_rpt_br; // ibidem + //logic tc_cci; // ibidem + logic tc_reported_d, tc_reported_q; // ibidem + logic reported_status; + logic reported_update; // determines when reported_q updates + // reported is updated when the lc_exception was updated or not + logic tc_f3_sf3; + // next cycle + + // signals for compression + logic [$clog2(te_pkg::XLEN)-1:0] addr_zeros, addr_ones; + logic [$clog2(te_pkg::XLEN)-1:0] sign_extendable; + logic empty_zeros; + logic empty_ones; + + // signals to store + logic tc_resync_br_d, tc_resync_br_q; + + // value assignment + assign tc_exc_only = tc_exception_i && tc_retired_i == 0; + assign tc_ppccd = tc_privchange_i /*|| (tc_context_change_i && + (tc_precise_context_report_i || + tc_context_report_as_disc_i))*/; + assign tc_resync_br = tc_et_max_resync_i && ~tc_branch_map_empty_i; + assign tc_er_n = (tc_exception_i && tc_retired_i != 0) /*|| tc_trigger_req_i*/; + assign tc_rpt_br = tc_branch_map_full_i && !nc_branch_map_empty_i/* || tc_branch_misprediction_i*/; + //assign tc_cci = tc_context_change_i && tc_imprecise_context_report_i; + assign nc_exc_only_o = nc_exception_i && nc_retired_i == 0; + assign nc_ppccd_br_o = (nc_privchange_i /*|| (nc_context_change_i && + (nc_precise_context_report_i || nc_context_report_as_disc_i))*/) && + ~nc_branch_map_empty_i; + assign tc_f3_sf3 = tc_enc_enabled_i || tc_enc_disabled_i || tc_opmode_change_i || + tc_final_qualified_i || tc_packets_lost_i; + assign reported_update = ( packet_format_o == te_pkg::F_SYNC && + packet_f_sync_subformat_o == te_pkg::SF_TRAP && + ~thaddr_o) || + ( packet_format_o == te_pkg::F_SYNC && + packet_f_sync_subformat_o == te_pkg::SF_START && + ~tc_exc_only); + assign tc_resync_o = valid_i && tc_resync_br_q; + + always_comb begin + // init + tc_resync_br_d = tc_resync_br_q; + + if (reported_update) begin + tc_reported_d = reported_status; + end + + if (tc_resync_br) begin + tc_resync_br_d = '1; + end + + if (valid_o && + (packet_format_o == te_pkg::F_DIFF_DELTA || + packet_format_o == te_pkg::F_ADDR_ONLY)) begin + tc_resync_br_d = '0; + end + end + + /* + The reset value is 0, the spec doesn't say how to behave. + The 0 value specifies an exception w/out retired instr + in this cycle and an exception in the previous cycle. + */ + always_ff @( posedge clk_i, negedge rst_ni ) begin + if(~rst_ni) begin + tc_reported_q <= '0; + lc_ended_ntr_q <= '0; + lc_ended_rep_q <= '0; + tc_resync_br_q <= '0; + end else begin + tc_reported_q <= tc_reported_d; + tc_resync_br_q <= tc_resync_br_d; + lc_ended_ntr_q <= lc_ended_ntr_d; + lc_ended_rep_q <= lc_ended_rep_d; + end + end + + /*TODO: add condition to determine if F2, F1, F0SF0 are requested by the trigger unit*/ + + /* combinatorial network to determine packet format */ + // refer to flowchart at page 53 of the spec + always_comb begin : select_packet_format + // default init values + valid_o = '0; + packet_format_o = te_pkg::F_OPT_EXT; + packet_f_sync_subformat_o = te_pkg::SF_START; + //packet_f_opt_ext_subformat_o = SF_PBC; + //notify_o = '0; + thaddr_o = '0; + lc_tc_mux_o = '0; + resync_timer_rst_o = '0; + reported_status = '0; + qual_status_o = te_pkg::NO_CHANGE; + lc_ended_ntr_d = '0; + lc_ended_rep_d = '0; + + if(valid_i) begin + // format 3 subformat 3 packet generation + /* this if is not in the flowchart, but it's only described. + To me it made more sense to have it as the first if. */ + if(tc_f3_sf3) begin + packet_format_o = te_pkg::F_SYNC; + packet_f_sync_subformat_o = te_pkg::SF_SUPPORT; + // if-then-else to determine qual_status value for payload + if(lc_ended_ntr_q == '1) begin + qual_status_o = te_pkg::ENDED_NTR; + end else if(lc_ended_rep_q == '1) begin + qual_status_o = te_pkg::ENDED_REP; + end else if(tc_packets_lost_i == '1) begin + qual_status_o = te_pkg::TRACE_LOST; + end + valid_o = '1; + /* TODO: if for halted and reset sideband signals, + if at least one asserted -> considers unqualified*/ + end else if(tc_qualified_i) begin + if(lc_exception_i) begin + if(tc_exc_only) begin + packet_format_o = te_pkg::F_SYNC; + packet_f_sync_subformat_o = te_pkg::SF_TRAP; + resync_timer_rst_o = '1; + lc_tc_mux_o = 0; + reported_status = '1; + thaddr_o = '0; + /* thaddr_d = 0; resync_cnt = 0 + cause = lc_cause_i; tval = lc_tval*/ + valid_o = '1; + end else if(tc_reported_q) begin + packet_format_o = te_pkg::F_SYNC; + packet_f_sync_subformat_o = te_pkg::SF_START; + resync_timer_rst_o = '1; + //reported_d = '0; // not necessary + // resync_cnt = 0 + valid_o = '1; + end else begin // not reported + packet_format_o = te_pkg::F_SYNC; + packet_f_sync_subformat_o = te_pkg::SF_TRAP; + resync_timer_rst_o = '1; + lc_tc_mux_o = '0; + thaddr_o = '1; + /*thaddr_d = 1; resync_cnt = 0 + cause = lc_cause_i; tval = lc_tval */ + valid_o = '1; + end + end else if(tc_first_qualified_i || tc_ppccd || (tc_gt_max_resync_i && !tc_resync_br_q)) begin + packet_format_o = te_pkg::F_SYNC; + packet_f_sync_subformat_o = te_pkg::SF_START; + resync_timer_rst_o = '1; + //resync_cnt = 0 + valid_o = '1; + end else if(lc_updiscon_i) begin + // packet generated due to updiscon + lc_ended_ntr_d = '1; + if(tc_exc_only) begin + packet_format_o = te_pkg::F_SYNC; + packet_f_sync_subformat_o = te_pkg::SF_TRAP; + thaddr_o = '0; + resync_timer_rst_o = '1; + lc_tc_mux_o = '1; + /* thaddr = 0; resync_cnt = 0 + cause = tc_cause_i; tval = tc_tval */ + valid_o = '1; + end else begin + /* choosing between format 0/1/2 */ + /*if(tc_pbc_i >= 31) begin // format 0 subformat 0 + packet_format_o = F_OPT_EXT; + packet_f_opt_ext_subformat_o = SF_JTC; + // value for payload TBD + end else if(jtc_enabled_i && address_in_cache_i) begin // format 0 subformat 1 + packet_format_o = F_OPT_EXT; + packet_f_opt_ext_subformat_o = SF_JTC; + // value for payload TBD + end else*/ if(!tc_branch_map_empty_i) begin + packet_format_o = te_pkg::F_DIFF_DELTA; + end else begin // branch count == 0 + packet_format_o = te_pkg::F_ADDR_ONLY; + end + valid_o = '1; + end + end else if(tc_resync_br_q || tc_er_n) begin + // non mandatory + /* if(tc_er_n && tc_trigger_req_i) begin // requested from trigger unit + notify_o = '1; + end */ + + /* choosing between format 0/1/2 */ + /*if(tc_pbc_i >= 31) begin + packet_format_o = F_OPT_EXT; + packet_f_opt_ext_subformat_o = SF_JTC; + // value for payload TBD + end else if(jtc_enabled_i && address_in_cache_i) begin + packet_format_o = F_OPT_EXT; + packet_f_opt_ext_subformat_o = SF_JTC; + // value for payload TBD + end else*/ if(!tc_branch_map_empty_i) begin + packet_format_o = te_pkg::F_DIFF_DELTA; + end else begin // branch count == 0 + packet_format_o = te_pkg::F_ADDR_ONLY; + end + valid_o = '1; + end else if(nc_exc_only_o || nc_ppccd_br_o || !nc_qualified_i) begin + if(!nc_qualified_i) begin + // the packet is sent because it's the last instr qualified + lc_ended_rep_d = '1; + end + /* choosing between format 0/1/2 */ + /*if(tc_pbc_i >= 31) begin + packet_format_o = F_OPT_EXT; + packet_f_opt_ext_subformat_o = SF_JTC; + // value for payload TBD + end else if(jtc_enabled_i && address_in_cache_i) begin + packet_format_o = F_OPT_EXT; + packet_f_opt_ext_subformat_o = SF_JTC; + // value for payload TBD + end else*/ if(!tc_branch_map_empty_i) begin + packet_format_o = te_pkg::F_DIFF_DELTA; + end else begin // branch count == 0 + packet_format_o = te_pkg::F_ADDR_ONLY; + end + valid_o = '1; + end else if(tc_rpt_br) begin + /* // non mandatory, requires support for jtc and branch prediction + if(tc_pbc_i >= 31) begin + packet_format_o = F_OPT_EXT; + packet_f_opt_ext_subformat_o = SF_PBC; + valid_o = '1; + end else begin*/ + packet_format_o = te_pkg::F_DIFF_DELTA; + valid_o = '1; + //end + end /*else if(tc_cci) begin // non mandatory, requires support for context + packet_format_o = F_SYNC; + packet_f_sync_subformat_o = SF_CONTEXT; + valid_o = '1; + end*/ + end + end + end + + /* compression logic */ + /* short explanation on how it works: + by using the lzc we determine how many bits we can discard starting from the MSB, + this process is done with the normal address (we count 0s) and bitwise not of the + signal (we count 1s). + Then we decide in which way we can compress more and output the keep_bits signal. + + On the encoder side, it's possible to reconstruct the address: because we don't + remove all 0s (or 1s) from the MSB, but we keep one. This way it's possible to + sign extend the compressed address and get back the original address. + + Example 1: + address to compress: 0000001100010 + bits kept: -----01100010 + + Example 2: + address to compress: 1111011110110 + bits kept: ---1011110110 + + */ + // choosing between removing 1s or 0s + assign sign_extendable = addr_zeros > addr_ones ? addr_zeros : addr_ones; + // outputting the least sign bits we want to keep + // empty signals are used to cover 32'b0 and 32'b1 corner cases + assign keep_bits_o = (empty_zeros || empty_ones) ? 1 : te_pkg::XLEN - sign_extendable + 1; + + // leading zero counters + // from common_cells + lzc #( + .WIDTH(te_pkg::XLEN), + .MODE(1) + )i_lzc_zeros( + .in_i (addr_to_compress_i), + .cnt_o (addr_zeros), + .empty_o(empty_zeros) + ); + + lzc #( + .WIDTH(te_pkg::XLEN), + .MODE(1) + )i_lzc_ones( + .in_i (~addr_to_compress_i), + .cnt_o (addr_ones), + .empty_o(empty_ones) + ); + +endmodule \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/rtl/te_reg.sv b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_reg.sv new file mode 100644 index 0000000000..0b7a086a51 --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_reg.sv @@ -0,0 +1,792 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +/*REG*/ +/* +it stores values for the encoder in memory mapped registers +*/ + +// uncomment to enable 64bits arch support +//`define TE_ARCH64 + +module te_reg #( + parameter APB_ADDR_WIDTH = 32 // it is the max allowed, maybe change to a smaller value +) +( + input logic clk_i, + input logic rst_ni, + + // tracing management + input logic trace_req_off_i, // from filter + input logic trace_req_on_i, // directly from trigger unit + input logic encapsulator_ready_i, + + // filter settings + output logic cause_filter_o, + output logic [te_pkg::XLEN-1:0] upper_cause_o, + output logic [te_pkg::XLEN-1:0] lower_cause_o, + output logic [te_pkg::XLEN-1:0] match_cause_o, + output logic cause_mode_o, + output logic tvec_filter_o, + output logic [te_pkg::XLEN-1:0] upper_tvec_o, + output logic [te_pkg::XLEN-1:0] lower_tvec_o, + output logic [te_pkg::XLEN-1:0] match_tvec_o, + output logic tvec_mode_o, + output logic tval_filter_o, + output logic [te_pkg::XLEN-1:0] upper_tval_o, + output logic [te_pkg::XLEN-1:0] lower_tval_o, + output logic [te_pkg::XLEN-1:0] match_tval_o, + output logic tval_mode_o, + output logic priv_lvl_filter_o, + output logic [te_pkg::PRIV_LEN-1:0] upper_priv_o, + output logic [te_pkg::PRIV_LEN-1:0] lower_priv_o, + output logic [te_pkg::PRIV_LEN-1:0] match_priv_o, + output logic priv_lvl_mode_o, + output logic iaddr_filter_o, + output logic [te_pkg::XLEN-1:0] upper_iaddr_o, + output logic [te_pkg::XLEN-1:0] lower_iaddr_o, + output logic [te_pkg::XLEN-1:0] match_iaddr_o, + output logic iaddr_mode_o, + + output logic trace_enable_o, // turned off by filter + output logic trace_activated_o, // managed by user + // packet_emitter settings and control + output logic nocontext_o, + output logic notime_o, + output logic encoder_mode_o, // hardwired to 0 - can only be 0 according to spec + output te_pkg::ioptions_s configuration_o, + output logic lossless_trace_o, + output logic shallow_trace_o, + + output logic clk_gated_o, + + // APB I/O interface + input logic [APB_ADDR_WIDTH-1:0] paddr_i, + input logic pwrite_i, + input logic psel_i, + input logic penable_i, + input logic [31:0] pwdata_i, + output logic pready_o, + output logic [31:0] prdata_o +); + + // FFs I/Os + logic trace_enable_d, trace_enable_q; + // trace enabling + logic trace_req_off, trace_req_on; + logic turn_on, turn_off; + logic clk_gated; + logic test_enabled; + + // registers I/O + logic cause_filter_d, cause_filter_q; + logic [te_pkg::XLEN-1:0] upper_cause_d, upper_cause_q; + logic [te_pkg::XLEN-1:0] lower_cause_d, lower_cause_q; + logic [te_pkg::XLEN-1:0] match_cause_d, match_cause_q; + logic cause_mode_d, cause_mode_q; + logic tvec_filter_d, tvec_filter_q; + logic [te_pkg::XLEN-1:0] upper_tvec_d, upper_tvec_q; + logic [te_pkg::XLEN-1:0] lower_tvec_d, lower_tvec_q; + logic [te_pkg::XLEN-1:0] match_tvec_d, match_tvec_q; + logic tvec_mode_d, tvec_mode_q; + logic tval_filter_d, tval_filter_q; + logic [te_pkg::XLEN-1:0] upper_tval_d, upper_tval_q; + logic [te_pkg::XLEN-1:0] lower_tval_d, lower_tval_q; + logic [te_pkg::XLEN-1:0] match_tval_d, match_tval_q; + logic tval_mode_d, tval_mode_q; + logic priv_lvl_filter_d, priv_lvl_filter_q; + logic [te_pkg::PRIV_LEN-1:0] upper_priv_d, upper_priv_q; + logic [te_pkg::PRIV_LEN-1:0] lower_priv_d, lower_priv_q; + logic [te_pkg::PRIV_LEN-1:0] match_priv_d, match_priv_q; + logic priv_lvl_mode_d, priv_lvl_mode_q; + logic iaddr_filter_d, iaddr_filter_q; + logic [te_pkg::XLEN-1:0] upper_iaddr_d, upper_iaddr_q; + logic [te_pkg::XLEN-1:0] lower_iaddr_d, lower_iaddr_q; + logic [te_pkg::XLEN-1:0] match_iaddr_d, match_iaddr_q; + logic iaddr_mode_d, iaddr_mode_q; + logic trace_activated_d, trace_activated_q; + logic nocontext_d, nocontext_q; + logic notime_d, notime_q; + te_pkg::ioptions_s configuration_d, configuration_q; + logic lossless_trace_d, lossless_trace_q; + logic shallow_trace_d, shallow_trace_q; + + // APB transaction + logic read_access; + logic write_access; + logic setup_d, setup_q; + + // assignments + // filter + assign cause_filter_o = cause_filter_q; + assign upper_cause_o = upper_cause_q; + assign lower_cause_o = lower_cause_q; + assign match_cause_o = match_cause_q; + assign cause_mode_o = cause_mode_q; + assign tvec_filter_o = tvec_filter_q; + assign upper_tvec_o = upper_tvec_q; + assign lower_tvec_o = lower_tvec_q; + assign match_tvec_o = match_tvec_q; + assign tvec_mode_o = tvec_mode_q; + assign tval_filter_o = tval_filter_q; + assign upper_tval_o = upper_tval_q; + assign lower_tval_o = lower_tval_q; + assign match_tval_o = match_tval_q; + assign tval_mode_o = tval_mode_q; + assign priv_lvl_filter_o = priv_lvl_filter_q; + assign upper_priv_o = upper_priv_q; + assign lower_priv_o = lower_priv_q; + assign match_priv_o = match_priv_q; + assign priv_lvl_mode_o = priv_lvl_mode_q; + assign iaddr_filter_o = iaddr_filter_q; + assign upper_iaddr_o = upper_iaddr_q; + assign lower_iaddr_o = lower_iaddr_q; + assign match_iaddr_o = match_iaddr_q; + assign iaddr_mode_o = iaddr_mode_q; + // packet emitter + assign configuration_o = configuration_q; + assign lossless_trace_o = lossless_trace_q; // if == 1 stalls the core when the encapsulator buffer is full + assign shallow_trace_o = shallow_trace_q; // if == 1 flushes the branch map at each packet emitted + assign nocontext_o = nocontext_q; + assign notime_o = notime_q; + assign encoder_mode_o = '0; // hardwired + assign trace_activated_o = trace_activated_q; + + // tracing is switched on only when it's not enabled anc a request of turning on is received + assign turn_on = (trace_enable_q == 0) && (trace_req_on /*|| encapsulator_ready_i*/); // encapsulator signal is temporarely disabled + // tracing is switched off only when it's not enabled anc a request of turning off is received + assign turn_off = (trace_enable_q == 1) && (trace_req_off /*|| ~encapsulator_ready_i*/); + // the toggle of trace_enable value happens only when turn off or turn off is asserted + assign trace_enable_d = (turn_off || turn_on) ? ~trace_enable_q : trace_enable_q; + assign trace_enable_o = trace_enable_d; + + assign clk_gated_o = clk_gated; + assign test_enabled = '0; + + assign setup_d = psel_i && ~penable_i; + assign pready_o = setup_q && psel_i && penable_i; + assign read_access = pready_o && !pwrite_i; + assign write_access = pready_o && pwrite_i; + + /* APB read and write */ + always_comb begin + // initialization + // set _d as _q, because we don't to erase them all + cause_filter_d = cause_filter_q; + cause_mode_d = cause_mode_q; + tvec_filter_d = tvec_filter_q; + tvec_mode_d = tvec_mode_q; + tval_filter_d = tval_filter_q; + tval_mode_d = tval_mode_q; + priv_lvl_filter_d = priv_lvl_filter_q; + priv_lvl_mode_d = priv_lvl_mode_q; + iaddr_filter_d = iaddr_filter_q; + iaddr_mode_d = iaddr_mode_q; + lower_priv_d = lower_priv_q; + upper_priv_d = upper_priv_q; + match_priv_d = match_priv_q; + trace_activated_d = trace_activated_q; + lossless_trace_d = lossless_trace_q; + shallow_trace_d = shallow_trace_q; + notime_d = notime_q; + nocontext_d = nocontext_q; + configuration_d = configuration_q; + upper_cause_d = upper_cause_q; + lower_cause_d = lower_cause_q; + match_cause_d = match_cause_q; + upper_tvec_d = upper_tvec_q; + lower_tvec_d = lower_tvec_q; + match_tvec_d = match_tvec_q; + upper_tval_d = upper_tval_q; + lower_tval_d = lower_tval_q; + match_tval_d = match_tval_q; + upper_iaddr_d = upper_iaddr_q; + lower_iaddr_d = lower_iaddr_q; + match_iaddr_d = match_iaddr_q; + prdata_o = '0; // clean output + + if (read_access) begin + case (paddr_i[7:0]) + // XLEN agnostic (or always <= than 32) + // FILTER + // enable and mode + te_pkg::CAUSE_ENABLE_MODE: begin + prdata_o[0] = cause_filter_q; + prdata_o[1] = cause_mode_q; + end + + te_pkg::TVEC_ENABLE_MODE: begin + prdata_o[0] = tvec_filter_q; + prdata_o[1] = tvec_mode_q; + end + + te_pkg::TVAL_ENABLE_MODE: begin + prdata_o[0] = tval_filter_q; + prdata_o[1] = tval_mode_q; + end + + te_pkg::PRIV_ENABLE_MODE: begin + prdata_o[0] = priv_lvl_filter_q; + prdata_o[1] = priv_lvl_mode_q; + end + + te_pkg::IADDR_ENABLE_MODE: begin + prdata_o[0] = iaddr_filter_q; + prdata_o[1] = iaddr_mode_q; + end + + // priv + te_pkg::PRIV_RANGE: begin + prdata_o[te_pkg::PRIV_LEN-1:0] = lower_priv_q; + prdata_o[te_pkg::PRIV_LEN*2-1:te_pkg::PRIV_LEN] = upper_priv_q; + end + + te_pkg::PRIV_MATCH: begin + prdata_o[te_pkg::PRIV_LEN-1:0] = match_priv_q; + end + + // TRACE MANAGEMENT + te_pkg::TRACE_STATE: begin + prdata_o[0] = trace_activated_q; + end + + te_pkg::LOSSLESS_TRACE: begin + prdata_o[0] = lossless_trace_q; + end + + te_pkg::SHALLOW_TRACE: begin + prdata_o[0] = shallow_trace_q; + end + + // PACKET EMITTER + te_pkg::NO_TIME: begin + prdata_o[0] = notime_q; + end + + te_pkg::NO_CONTEXT: begin + prdata_o[0] = nocontext_q; + end + + te_pkg::DELTA_ADDRESS: begin + prdata_o[0] = configuration_q.delta_address_en; + end + te_pkg::FULL_ADDRESS: begin + prdata_o[0] = configuration_q.full_address_en; + end + te_pkg::IMPLICIT_EXCEPTION: begin + prdata_o[0] = configuration_q.implicit_exception_en; + end + te_pkg::SIJUMP: begin + prdata_o[0] = configuration_q.sijump_en; + end + te_pkg::IMPLICIT_RETURN: begin + prdata_o[0] = configuration_q.implicit_return_en; + end + te_pkg::BRANCH_PREDICTION: begin + prdata_o[0] = configuration_q.branch_prediction_en; + end + te_pkg::JUMP_TARGET_CACHE: begin + prdata_o[0] = configuration_q.jump_target_cache_en; + end + + `ifdef TE_ARCH64 // 64bits case + // FILTER + // cause + te_pkg::CAUSE_UPPER: begin + prdata_o[te_pkg::XLEN-1:0] = upper_cause_q; + end + + te_pkg::CAUSE_LOWER: begin + prdata_o[te_pkg::XLEN-1:0] = lower_cause_q; + end + + te_pkg::CAUSE_MATCH: begin + prdata_o[te_pkg::XLEN-1:0] = match_cause_q; + end + + // tvec + te_pkg::TVEC_UPPER_L: begin // least significant bits + prdata_o = upper_tvec_q[31:0]; + end + + te_pkg::TVEC_UPPER_M: begin // most significant bits + prdata_o = upper_tvec_q[63:32]; + end + + te_pkg::TVEC_LOWER_L: begin // least significant bits + prdata_o = lower_tvec_q[31:0]; + end + + te_pkg::TVEC_LOWER_M: begin // most significant bits + prdata_o = lower_tvec_q[63:32]; + end + + te_pkg::TVEC_MATCH_L: begin // least significant bits + prdata_o = match_tvec_q[31:0]; + end + + te_pkg::TVEC_MATCH_M: begin // most significant bits + prdata_o = match_tvec_q[63:32]; + end + + // tval + te_pkg::TVAL_UPPER_L: begin // least significant bits + prdata_o = upper_tval_q[31:0]; + end + + te_pkg::TVAL_UPPER_M: begin // most significant bits + prdata_o = upper_tval_q[63:32]; + end + + te_pkg::TVAL_LOWER_L: begin // least significant bits + prdata_o = lower_tval_q[31:0]; + end + + te_pkg::TVAL_LOWER_M: begin // most significant bits + prdata_o = lower_tval_q[63:32]; + end + + te_pkg::TVAL_MATCH_L: begin // least significant bits + prdata_o = match_tval_q[31:0]; + end + + te_pkg::TVAL_MATCH_M: begin // most significant bits + prdata_o = match_tval_q[63:32]; + end + + // iaddr + te_pkg::IADDR_UPPER_L: begin // least significant bits + prdata_o = upper_iaddr_q[31:0]; + end + + te_pkg::IADDR_UPPER_M: begin // most significant bits + prdata_o = upper_iaddr_q[63:32]; + end + + te_pkg::IADDR_LOWER_L: begin // least significant bits + prdata_o = lower_iaddr_q[31:0]; + end + + te_pkg::IADDR_LOWER_M: begin // most significant bits + prdata_o = lower_iaddr_q[63:32]; + end + + te_pkg::IADDR_MATCH_L: begin // least significant bits + prdata_o = match_iaddr_q[31:0]; + end + + te_pkg::IADDR_MATCH_M: begin // most significant bits + prdata_o = match_iaddr_q[63:32]; + end + + `else // 32bits case + // FILTER + // cause + te_pkg::CAUSE_UPPER: begin + prdata_o[te_pkg::XLEN-1:0] = upper_cause_q; + end + + te_pkg::CAUSE_LOWER: begin + prdata_o[te_pkg::XLEN-1:0] = lower_cause_q; + end + + te_pkg::CAUSE_MATCH: begin + prdata_o[te_pkg::XLEN-1:0] = match_cause_d; + end + + // tvec + te_pkg::TVEC_UPPER: begin + prdata_o = upper_tvec_q; + end + + te_pkg::TVEC_LOWER: begin + prdata_o = lower_tvec_q; + end + + te_pkg::TVEC_MATCH: begin + prdata_o = match_tvec_q; + end + + // tval + te_pkg::TVAL_UPPER: begin + prdata_o = upper_tval_q; + end + + te_pkg::TVAL_LOWER: begin + prdata_o = lower_tval_q; + end + + te_pkg::TVAL_MATCH: begin + prdata_o = match_tval_q; + end + + // iaddr + te_pkg::IADDR_UPPER: begin + prdata_o = upper_iaddr_q; + end + + te_pkg::IADDR_LOWER: begin + prdata_o = lower_iaddr_q; + end + + te_pkg::IADDR_MATCH: begin + prdata_o = match_iaddr_q; + end + `endif + endcase + end else if (write_access) begin + + + case (paddr_i[7:0]) + // common cases + te_pkg::CAUSE_ENABLE_MODE: begin + cause_filter_d = pwdata_i[0]; + cause_mode_d = pwdata_i[1]; + end + + te_pkg::TVEC_ENABLE_MODE: begin + tvec_filter_d = pwdata_i[0]; + tvec_mode_d = pwdata_i[1]; + end + + te_pkg::TVAL_ENABLE_MODE: begin + tval_filter_d = pwdata_i[0]; + tval_mode_d = pwdata_i[1]; + end + + te_pkg::PRIV_ENABLE_MODE: begin + priv_lvl_filter_d = pwdata_i[0]; + priv_lvl_mode_d = pwdata_i[1]; + end + + te_pkg::IADDR_ENABLE_MODE: begin + iaddr_filter_d = pwdata_i[0]; + iaddr_mode_d = pwdata_i[1]; + end + + // priv + te_pkg::PRIV_RANGE: begin + lower_priv_d = pwdata_i[te_pkg::PRIV_LEN-1:0]; + upper_priv_d = pwdata_i[te_pkg::PRIV_LEN*2-1:te_pkg::PRIV_LEN]; + end + + te_pkg::PRIV_MATCH: begin + match_priv_d = pwdata_i[te_pkg::PRIV_LEN-1:0]; + end + + // TRACE MANAGEMENT + te_pkg::TRACE_STATE: begin + trace_activated_d = pwdata_i[0]; + end + + te_pkg::LOSSLESS_TRACE: begin + lossless_trace_d = pwdata_i[0]; + end + + te_pkg::SHALLOW_TRACE: begin + shallow_trace_d = pwdata_i[0]; + end + + // PACKET EMITTER + te_pkg::NO_TIME: begin + notime_d = pwdata_i[0]; + end + + te_pkg::NO_CONTEXT: begin + nocontext_d = pwdata_i[0]; + end + + te_pkg::DELTA_ADDRESS: begin + configuration_d.delta_address_en = pwdata_i[0]; + end + + te_pkg::FULL_ADDRESS: begin + configuration_d.full_address_en = pwdata_i[0]; + end + + te_pkg::IMPLICIT_EXCEPTION: begin + configuration_d.implicit_exception_en = pwdata_i[0]; + end + + te_pkg::SIJUMP: begin + configuration_d.sijump_en = pwdata_i[0]; + end + + te_pkg::IMPLICIT_RETURN: begin + configuration_d.implicit_return_en = pwdata_i[0]; + end + + te_pkg::BRANCH_PREDICTION: begin + configuration_d.branch_prediction_en = pwdata_i[0]; + end + + te_pkg::JUMP_TARGET_CACHE: begin + configuration_d.jump_target_cache_en = pwdata_i[0]; + end + + `ifdef TE_ARCH64 + // cause + te_pkg::CAUSE_UPPER: begin + upper_cause_d = pwdata_i[te_pkg::XLEN-1:0]; + end + + te_pkg::CAUSE_LOWER: begin + lower_cause_d = pwdata_i[te_pkg::XLEN-1:0]; + end + + te_pkg::CAUSE_MATCH: begin + match_cause_d = pwdata_i[te_pkg::XLEN-1:0]; + end + + // tvec + te_pkg::TVEC_UPPER_L: begin // least significant bits + upper_tvec_d[31:0] = pwdata_i; + end + + te_pkg::TVEC_UPPER_M: begin // most significant bits + upper_tvec_d[63:32] = pwdata_i; + end + + te_pkg::TVEC_LOWER_L: begin // least significant bits + lower_tvec_d[31:0] = pwdata_i; + end + + te_pkg::TVEC_LOWER_M: begin // most significant bits + lower_tvec_d[63:32] = pwdata_i; + end + + te_pkg::TVEC_MATCH_L: begin // least significant bits + match_tvec_d[31:0] = pwdata_i; + end + + te_pkg::TVEC_MATCH_M: begin // most significant bits + match_tvec_d[63:32] = pwdata_i; + end + + // tval + te_pkg::TVAL_UPPER_L: begin // least significant bits + upper_tval_d[31:0] = pwdata_i; + end + + te_pkg::TVAL_UPPER_M: begin // most significant bits + upper_tval_d[63:32] = pwdata_i; + end + + te_pkg::TVAL_LOWER_L: begin // least significant bits + lower_tval_d[31:0] = pwdata_i; + end + + te_pkg::TVAL_LOWER_M: begin // most significant bits + lower_tval_d[63:32] = pwdata_i; + end + + te_pkg::TVAL_MATCH_L: begin // least significant bits + match_tval_d[31:0] = pwdata_i; + end + + te_pkg::TVAL_MATCH_M: begin // most significant bits + match_tval_d[63:32] = pwdata_i; + end + + // iaddr + te_pkg::IADDR_UPPER_L: begin // least significant bits + upper_iaddr_d[31:0] = pwdata_i; + end + + te_pkg::IADDR_UPPER_M: begin // most significant bits + upper_iaddr_d[63:32] = pwdata_i; + end + + te_pkg::IADDR_LOWER_L: begin // least significant bits + lower_iaddr_d[31:0] = pwdata_i; + end + + te_pkg::IADDR_LOWER_M: begin // most significant bits + lower_iaddr_d[63:32] = pwdata_i; + end + + te_pkg::IADDR_MATCH_L: begin // least significant bits + match_iaddr_d[31:0] = pwdata_i; + end + + te_pkg::IADDR_MATCH_M: begin // most significant bits + match_iaddr_d[63:32] = pwdata_i; + end + `else // 32 bits case + // cause + te_pkg::CAUSE_UPPER: begin + upper_cause_d = pwdata_i[te_pkg::XLEN-1:0]; + end + + te_pkg::CAUSE_LOWER: begin + lower_cause_d = pwdata_i[te_pkg::XLEN-1:0]; + end + + te_pkg::CAUSE_MATCH: begin + match_cause_d = pwdata_i[te_pkg::XLEN-1:0]; + end + + // tvec + te_pkg::TVEC_UPPER: begin + upper_tvec_d = pwdata_i; + end + + te_pkg::TVEC_LOWER: begin + lower_tvec_d = pwdata_i; + end + + te_pkg::TVEC_MATCH: begin + match_tvec_d = pwdata_i; + end + + // tval + te_pkg::TVAL_UPPER: begin + upper_tval_d = pwdata_i; + end + + te_pkg::TVAL_LOWER: begin + lower_tval_d = pwdata_i; + end + + te_pkg::TVAL_MATCH: begin + match_tval_d = pwdata_i; + end + + // iaddr + te_pkg::IADDR_UPPER: begin + upper_iaddr_d = pwdata_i; + end + + te_pkg::IADDR_LOWER: begin + lower_iaddr_d = pwdata_i; + end + + te_pkg::IADDR_MATCH: begin + match_iaddr_d = pwdata_i; + end + `endif + endcase + end + end + + // clock gating module + pulp_clock_gating i_clock_gating( + .clk_i (clk_i), + .en_i (trace_activated_o), + .test_en_i(test_enabled), + .clk_o (clk_gated) + ); + + // edge detector for trace_req_on_i + // turns on and off the tracing + edge_detect i_edge_detect_on( + .clk_i(clk_gated), + .rst_ni(rst_ni), + .d_i(trace_req_on_i), + .re_o(trace_req_on), + .fe_o() + ); + + // edge detector for trace_req_off_i + // turns on and off the tracing + edge_detect i_edge_detect_off( + .clk_i(clk_gated), + .rst_ni(rst_ni), + .d_i(trace_req_off_i), + .re_o(trace_req_off), + .fe_o() + ); + + always_ff @(posedge clk_i, negedge rst_ni) begin + if(~rst_ni) begin + trace_enable_q <= '1; + // storing config parameters + cause_filter_q <= '0; + upper_cause_q <= '0; + lower_cause_q <= '0; + match_cause_q <= '0; + cause_mode_q <= '0; + tvec_filter_q <= '0; + upper_tvec_q <= '0; + lower_tvec_q <= '0; + match_tvec_q <= '0; + tvec_mode_q <= '0; + tval_filter_q <= '0; + upper_tval_q <= '0; + lower_tval_q <= '0; + match_tval_q <= '0; + tval_mode_q <= '0; + priv_lvl_filter_q <= '0; + upper_priv_q <= '0; + lower_priv_q <= '0; + match_priv_q <= '0; + priv_lvl_mode_q <= '0; + iaddr_filter_q <= '0; + upper_iaddr_q <= '0; + lower_iaddr_q <= '0; + match_iaddr_q <= '0; + iaddr_mode_q <= '0; + configuration_q.delta_address_en <= '0; // delta address only one mandatory //FIXME changing this for debug + configuration_q.full_address_en <= '1; + configuration_q.implicit_exception_en <= '0; + configuration_q.sijump_en <= '0; + configuration_q.implicit_return_en <= '0; + configuration_q.branch_prediction_en <= '0; + configuration_q.jump_target_cache_en <= '0; + lossless_trace_q <= '0; + shallow_trace_q <= '0; + nocontext_q <= '1; + notime_q <= '0; + trace_activated_q <= '1; + setup_q <= '0; + end else begin + trace_enable_q <= trace_enable_d; + // storing config parameters + cause_filter_q <= cause_filter_d; + upper_cause_q <= upper_cause_d; + lower_cause_q <= lower_cause_d; + match_cause_q <= match_cause_d; + cause_mode_q <= cause_mode_d; + tvec_filter_q <= tvec_filter_d; + upper_tvec_q <= upper_tvec_d; + lower_tvec_q <= lower_tvec_d; + match_tvec_q <= match_tvec_d; + tvec_mode_q <= tvec_mode_d; + tval_filter_q <= tval_filter_d; + upper_tval_q <= upper_tval_d; + lower_tval_q <= lower_tval_d; + match_tval_q <= match_tval_d; + tval_mode_q <= tval_mode_d; + priv_lvl_filter_q <= priv_lvl_filter_d; + upper_priv_q <= upper_priv_d; + lower_priv_q <= lower_priv_d; + match_priv_q <= match_priv_d; + priv_lvl_mode_q <= priv_lvl_mode_d; + iaddr_filter_q <= iaddr_filter_d; + upper_iaddr_q <= upper_iaddr_d; + lower_iaddr_q <= lower_iaddr_d; + match_iaddr_q <= match_iaddr_d; + iaddr_mode_q <= iaddr_mode_d; + configuration_q <= configuration_d; + lossless_trace_q <= lossless_trace_d; + shallow_trace_q <= shallow_trace_d; + nocontext_q <= nocontext_d; + notime_q <= notime_d; + trace_activated_q <= trace_activated_d; + setup_q <= setup_d; + end + end + +endmodule \ No newline at end of file diff --git a/corev_apu/instr_tracing/rv_tracer-main/rtl/te_resync_counter.sv b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_resync_counter.sv new file mode 100644 index 0000000000..d8c6f9a8aa --- /dev/null +++ b/corev_apu/instr_tracing/rv_tracer-main/rtl/te_resync_counter.sv @@ -0,0 +1,106 @@ +// Copyright 2025 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. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Umberto Laghi +// Contact: umberto.laghi2@unibo.it +// Github: @ubolakes + +/* RESYNC COUNTER */ +/* +It keeps track of the emitted packets or cycles elapsed, +operational mode and threshold are set by the user. + +It produces a signal when the counter reaches the specified +threshold and it remains to 1 until it receives a reset signal. + +In packed mode: the packets that exceeds the defined threshold +are discarded, because they belong to a pre-resync period. +Packets received while the counter is requesting a resync are +ignored. +*/ + +module te_resync_counter #( + parameter N = 1, + parameter MODE = te_pkg::CYCLE_MODE, // counts cycles as default + parameter MAX_VALUE = 16'hFFFF // default max value, can be personalized + ) + ( + input logic clk_i, + input logic rst_ni, + + input logic trace_enabled_i, // it comes from filter + input logic [N-1:0] packet_emitted_i, + input logic resync_rst_i, + + output logic gt_resync_max_o, // greater than the max value, in reality MAX_VALUE + output logic et_resync_max_o // equals to the max value, in reality MAX_VALUE-1 + ); + + /* + The packets that exceeds the defined threshold are discarded, + because they belong to a pre-resync period. + Packets received while the counter is requesting a resync are + ignored. + */ + + // signals declaration + logic [$clog2(MAX_VALUE):0] counter_d, counter_q; + logic [$clog2(N):0] n_packets; + logic overflow; + + // assignments + // both for packet and cycle mode + assign et_resync_max_o = counter_d == MAX_VALUE; + assign gt_resync_max_o = counter_d > MAX_VALUE && ~resync_rst_i; + + always_comb begin + // init + counter_d = counter_q; + n_packets = '0; + + // packet mode + if (MODE == te_pkg::PACKET_MODE && trace_enabled_i) begin + // counting the packets received + for (int i = 0; i < N; i++) begin + if (packet_emitted_i[i]) begin + n_packets += 1; + end + end + + // summing the packets counted + for (int i = 0; i < n_packets; i++) begin + if (counter_d <= MAX_VALUE) begin + counter_d += 1; + end + end + end + + // cycle mode + if (MODE == te_pkg::CYCLE_MODE && trace_enabled_i && counter_d <= MAX_VALUE) begin + counter_d += 1; + end + + // synchronous reset + if (resync_rst_i) begin + counter_d = '0; + end + end + + + always_ff @(posedge clk_i, negedge rst_ni) begin + if (~rst_ni) begin + counter_q <= '0; + end else begin + counter_q <= counter_d; + end + end + +endmodule \ No newline at end of file diff --git a/corev_apu/openpiton/ariane_verilog_wrap.sv b/corev_apu/openpiton/ariane_verilog_wrap.sv index 5b8e574421..15933b858b 100644 --- a/corev_apu/openpiton/ariane_verilog_wrap.sv +++ b/corev_apu/openpiton/ariane_verilog_wrap.sv @@ -21,7 +21,7 @@ module ariane_verilog_wrap parameter int unsigned BHTEntries = 128, // debug module base address parameter logic [63:0] DmBaseAddress = 64'h0, - // swap endianess in l15 adapter + // swap endianness in l15 adapter parameter bit SwapEndianess = 1, // PMA configuration // idempotent region diff --git a/corev_apu/openpiton/bootrom/linux/src/spi.c b/corev_apu/openpiton/bootrom/linux/src/spi.c index c574f59cf6..fa5b53f416 100644 --- a/corev_apu/openpiton/bootrom/linux/src/spi.c +++ b/corev_apu/openpiton/bootrom/linux/src/spi.c @@ -115,7 +115,7 @@ int spi_write_bytes(uint8_t *bytes, uint32_t len, uint8_t *ret) for (int i = 0; i < len;) { status = read_reg(SPI_STATUS_REG); - if ((status & 0x1) != 0x1) // recieve fifo not empty + if ((status & 0x1) != 0x1) // receive fifo not empty { ret[i++] = read_reg(SPI_RECEIVE_REG); } diff --git a/corev_apu/src/ariane.sv b/corev_apu/src/ariane.sv index fec7854b31..24432248f4 100644 --- a/corev_apu/src/ariane.sv +++ b/corev_apu/src/ariane.sv @@ -13,19 +13,38 @@ // Description: Ariane Top-level module `include "cvxif_types.svh" -`include "axi_types.svh" module ariane import ariane_pkg::*; #( parameter config_pkg::cva6_cfg_t CVA6Cfg = config_pkg::cva6_cfg_empty, - parameter type rvfi_probes_t = logic, + parameter type rvfi_probes_instr_t = logic, + parameter type rvfi_probes_csr_t = logic, + parameter type rvfi_probes_t = struct packed { + logic csr; + logic instr; + }, + // CVXIF Types + localparam type readregflags_t = `READREGFLAGS_T(CVA6Cfg), + localparam type writeregflags_t = `WRITEREGFLAGS_T(CVA6Cfg), + localparam type id_t = `ID_T(CVA6Cfg), + localparam type hartid_t = `HARTID_T(CVA6Cfg), + localparam type x_compressed_req_t = `X_COMPRESSED_REQ_T(CVA6Cfg, hartid_t), + localparam type x_compressed_resp_t = `X_COMPRESSED_RESP_T(CVA6Cfg), + localparam type x_issue_req_t = `X_ISSUE_REQ_T(CVA6Cfg, hartid_t, id_t), + localparam type x_issue_resp_t = `X_ISSUE_RESP_T(CVA6Cfg, writeregflags_t, readregflags_t), + localparam type x_register_t = `X_REGISTER_T(CVA6Cfg, hartid_t, id_t, readregflags_t), + localparam type x_commit_t = `X_COMMIT_T(CVA6Cfg, hartid_t, id_t), + localparam type x_result_t = `X_RESULT_T(CVA6Cfg, hartid_t, id_t, writeregflags_t), + localparam type cvxif_req_t = `CVXIF_REQ_T(CVA6Cfg, x_compressed_req_t, x_issue_req_t, x_register_t, x_commit_t), + localparam type cvxif_resp_t = `CVXIF_RESP_T(CVA6Cfg, x_compressed_resp_t, x_issue_resp_t, x_result_t), // AXI Types - localparam type axi_ar_chan_t = `AXI_AR_CHAN_T(CVA6Cfg), - localparam type axi_aw_chan_t = `AXI_AW_CHAN_T(CVA6Cfg), - localparam type axi_w_chan_t = `AXI_W_CHAN_T(CVA6Cfg), - localparam type axi_b_chan_t = `AXI_B_CHAN_T(CVA6Cfg), - localparam type axi_r_chan_t = `AXI_R_CHAN_T(CVA6Cfg), - localparam type noc_req_t = `AXI_REQ_T(CVA6Cfg), - localparam type noc_resp_t = `AXI_RSP_T(CVA6Cfg) + parameter int unsigned AxiAddrWidth = ariane_axi::AddrWidth, + parameter int unsigned AxiDataWidth = ariane_axi::DataWidth, + parameter int unsigned AxiIdWidth = ariane_axi::IdWidth, + parameter type axi_ar_chan_t = ariane_axi::ar_chan_t, + parameter type axi_aw_chan_t = ariane_axi::aw_chan_t, + parameter type axi_w_chan_t = ariane_axi::w_chan_t, + parameter type noc_req_t = ariane_axi::req_t, + parameter type noc_resp_t = ariane_axi::resp_t ) ( input logic clk_i, input logic rst_ni, @@ -47,29 +66,32 @@ module ariane import ariane_pkg::*; #( input noc_resp_t noc_resp_i ); - // CVXIF Types - localparam type readregflags_t = `READREGFLAGS_T(CVA6Cfg); - localparam type writeregflags_t = `WRITEREGFLAGS_T(CVA6Cfg); - localparam type id_t = `ID_T(CVA6Cfg); - localparam type hartid_t = `HARTID_T(CVA6Cfg); - localparam type x_compressed_req_t = `X_COMPRESSED_REQ_T(CVA6Cfg, hartid_t); - localparam type x_compressed_resp_t = `X_COMPRESSED_RESP_T(CVA6Cfg); - localparam type x_issue_req_t = `X_ISSUE_REQ_T(CVA6Cfg, hartit_t, id_t); - localparam type x_issue_resp_t = `X_ISSUE_RESP_T(CVA6Cfg, writeregflags_t, readregflags_t); - localparam type x_register_t = `X_REGISTER_T(CVA6Cfg, hartid_t, id_t, readregflags_t); - localparam type x_commit_t = `X_COMMIT_T(CVA6Cfg, hartid_t, id_t); - localparam type x_result_t = `X_RESULT_T(CVA6Cfg, hartid_t, id_t, writeregflags_t); - localparam type cvxif_req_t = `CVXIF_REQ_T(CVA6Cfg, x_compressed_req_t, x_issue_req_t, x_register_req_t, x_commit_t); - localparam type cvxif_resp_t = `CVXIF_RESP_T(CVA6Cfg, x_compressed_resp_t, x_issue_resp_t, x_result_t); - cvxif_req_t cvxif_req; cvxif_resp_t cvxif_resp; cva6 #( - .CVA6Cfg ( CVA6Cfg ), - .rvfi_probes_t ( rvfi_probes_t ), - .noc_req_t ( noc_req_t ), - .noc_resp_t ( noc_resp_t ) + .CVA6Cfg ( CVA6Cfg ), + //.rvfi_probes_instr_t ( rvfi_probes_instr_t ), + //.rvfi_probes_csr_t ( rvfi_probes_csr_t ), + .rvfi_probes_t ( rvfi_probes_t ), + //.axi_ar_chan_t (axi_ar_chan_t), + //.axi_aw_chan_t (axi_aw_chan_t), + //.axi_w_chan_t (axi_w_chan_t), + .noc_req_t (noc_req_t), + .noc_resp_t (noc_resp_t) + //.readregflags_t (readregflags_t), + //.writeregflags_t (writeregflags_t), + //.id_t (id_t), + //.hartid_t (hartid_t), + //.x_compressed_req_t (x_compressed_req_t), + //.x_compressed_resp_t (x_compressed_resp_t), + //.x_issue_req_t (x_issue_req_t), + //.x_issue_resp_t (x_issue_resp_t), + //.x_register_t (x_register_t), + //.x_commit_t (x_commit_t), + //.x_result_t (x_result_t), + //.cvxif_req_t (cvxif_req_t), + //.cvxif_resp_t (cvxif_resp_t) ) i_cva6 ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), @@ -86,6 +108,8 @@ module ariane import ariane_pkg::*; #( .noc_resp_i ( noc_resp_i ) ); + + if (CVA6Cfg.CvxifEn) begin: gen_cvxif if (CVA6Cfg.CoproType == config_pkg::COPRO_EXAMPLE) begin: gen_COPRO_EXAMPLE cvxif_example_coprocessor #( diff --git a/corev_apu/tb/ariane_gate_tb.sv b/corev_apu/tb/ariane_gate_tb.sv index 958a56fc14..d077443296 100644 --- a/corev_apu/tb/ariane_gate_tb.sv +++ b/corev_apu/tb/ariane_gate_tb.sv @@ -24,10 +24,13 @@ import uvm_pkg::*; `timescale 1ns/1ns +`ifndef READ_ELF_T +`define READ_ELF_T import "DPI-C" function void read_elf(input string filename); import "DPI-C" function byte get_section(output longint address, output longint len); import "DPI-C" context function void read_section_sv(input longint address, inout byte buffer[]); import "DPI-C" function string getenv(input string env_name); +`endif module ariane_gate_tb; diff --git a/corev_apu/tb/ariane_soc_pkg.sv b/corev_apu/tb/ariane_soc_pkg.sv index d20b6a6b8b..7785485310 100644 --- a/corev_apu/tb/ariane_soc_pkg.sv +++ b/corev_apu/tb/ariane_soc_pkg.sv @@ -29,12 +29,12 @@ package ariane_soc; PLIC = 6, CLINT = 7, ROM = 8, - Debug = 9 + Debug = 9, + HPS = 10 } axi_slaves_t; localparam NB_PERIPHERALS = Debug + 1; - localparam logic[63:0] DebugLength = 64'h1000; localparam logic[63:0] ROMLength = 64'h10000; localparam logic[63:0] CLINTLength = 64'hC0000; @@ -44,6 +44,7 @@ package ariane_soc; localparam logic[63:0] SPILength = 64'h800000; localparam logic[63:0] EthernetLength = 64'h10000; localparam logic[63:0] GPIOLength = 64'h1000; + localparam logic[63:0] HPSLength = 64'h800000; `ifdef NEXYS_VIDEO localparam logic[63:0] DRAMLength = 64'h20000000; // 512MByte of DDR on Nexys video board `else @@ -63,7 +64,8 @@ package ariane_soc; SPIBase = 64'h2000_0000, EthernetBase = 64'h3000_0000, GPIOBase = 64'h4000_0000, - DRAMBase = 64'h8000_0000 + DRAMBase = 64'h8000_0000, + HPSBase = 64'hFF80_0000 } soc_bus_start_t; localparam NrRegion = 1; diff --git a/corev_apu/tb/ariane_tb.cpp b/corev_apu/tb/ariane_tb.cpp index 8de0c5b20f..3653eaa516 100644 --- a/corev_apu/tb/ariane_tb.cpp +++ b/corev_apu/tb/ariane_tb.cpp @@ -120,7 +120,7 @@ class preload_aware_dtm_t : public dtm_t { preload_aware_dtm_t(int argc, char **argv) : dtm_t(argc, argv) {} bool is_address_preloaded(addr_t taddr, size_t len) override { return true; } // We do not want to reset the hart here as the reset function in `dtm_t` seems to disregard - // the privilege level and in general does not perform propper reset (despite the name). + // the privilege level and in general does not perform proper reset (despite the name). // As all our binaries in preloading will always start at the base of DRAM this should not // be such a big problem. void reset() {} @@ -351,7 +351,7 @@ int main(int argc, char **argv) { try { read_section_void(addr, (void *) MEM_USER , mem_size); } catch (...){ - std::cerr << "No user memory instanciated ...\n"; + std::cerr << "No user memory instantiated ...\n"; } } diff --git a/corev_apu/tb/ariane_testharness.sv b/corev_apu/tb/ariane_testharness.sv index 04530ff45f..e4e3236392 100644 --- a/corev_apu/tb/ariane_testharness.sv +++ b/corev_apu/tb/ariane_testharness.sv @@ -15,6 +15,7 @@ `include "axi/assign.svh" `include "rvfi_types.svh" +`include "iti_types.svh" `ifdef VERILATOR `include "custom_uvm_macros.svh" @@ -46,6 +47,8 @@ module ariane_testharness #( localparam type rvfi_instr_t = `RVFI_INSTR_T(CVA6Cfg); localparam type rvfi_csr_elmt_t = `RVFI_CSR_ELMT_T(CVA6Cfg); localparam type rvfi_csr_t = `RVFI_CSR_T(CVA6Cfg, rvfi_csr_elmt_t); + localparam type rvfi_to_iti_t = `RVFI_TO_ITI_T(CVA6Cfg); + localparam type iti_to_encoder_t = `ITI_TO_ENCODER_T(CVA6Cfg); // RVFI PROBES localparam type rvfi_probes_instr_t = `RVFI_PROBES_INSTR_T(CVA6Cfg); @@ -625,10 +628,16 @@ module ariane_testharness #( rvfi_probes_t rvfi_probes; rvfi_csr_t rvfi_csr; rvfi_instr_t [CVA6Cfg.NrCommitPorts-1:0] rvfi_instr; + rvfi_to_iti_t rvfi_to_iti; + iti_to_encoder_t iti_to_encoder; ariane #( .CVA6Cfg ( CVA6Cfg ), - .rvfi_probes_t ( rvfi_probes_t ) + .rvfi_probes_instr_t ( rvfi_probes_instr_t ), + .rvfi_probes_csr_t ( rvfi_probes_csr_t ), + .rvfi_probes_t ( rvfi_probes_t ), + .noc_req_t ( ariane_axi::req_t ), + .noc_resp_t ( ariane_axi::resp_t ) ) i_ariane ( .clk_i ( clk_i ), .rst_ni ( ndmreset_n ), @@ -668,19 +677,133 @@ module ariane_testharness #( end end + cva6_iti #( + .CVA6Cfg (CVA6Cfg), + .CAUSE_LEN (iti_pkg::CAUSE_LEN), + .ITYPE_LEN (iti_pkg::ITYPE_LEN), + .IRETIRE_LEN (iti_pkg::IRETIRE_LEN), + .block_mode(0), + .rvfi_to_iti_t(rvfi_to_iti_t), + .iti_to_encoder_t(iti_to_encoder_t) + ) i_cva6_iti ( + .clk_i (clk_i), + .rst_ni (ndmreset_n), + // inputs from rvfi + .valid_i(rvfi_to_iti.valid), + .rvfi_to_iti_i(rvfi_to_iti), + .valid_o(), + .iti_to_encoder_o(iti_to_encoder) + ); + + logic packet_valid; + te_pkg::it_packet_type_e [0:0] packet_type; + logic [te_pkg::P_LEN-1:0] packet_length; + logic [te_pkg::PAYLOAD_LEN-1:0] packet_payload; + + rv_tracer #( + .N(1), + .ONLY_BRANCHES(1) + ) i_encoder( + .clk_i (clk_i), + .rst_ni (rst_ni), + .valid_i (iti_to_encoder.valid), + .itype_i (iti_to_encoder.itype), + .cause_i (iti_to_encoder.cause), + .tval_i (iti_to_encoder.tval), + .priv_i (iti_to_encoder.priv), + .iaddr_i (iti_to_encoder.iaddr), + .iretire_i (iti_to_encoder.iretire), + .ilastsize_i (iti_to_encoder.ilastsize), + .time_i (iti_to_encoder.cycles), + .tvec_i ('0), + .epc_i ('0), + .encapsulator_ready_i('1), + .paddr_i ('0), + .pwrite_i ('0), + .psel_i ('0), + .penable_i ('0), + .pwdata_i ('0), + .packet_valid_o (packet_valid), + .packet_type_o (packet_type), + .packet_length_o (packet_length), + .packet_payload_o (packet_payload), + .stall_o (), + .pready_o (), + .prdata_o () + ); + logic encap_valid; + encap_pkg::encap_fifo_entry_s encap_fifo_entry_i; + encap_pkg::encap_fifo_entry_s encap_fifo_entry_o; + logic encap_fifo_full; + logic encap_fifo_empty; + logic encap_fifo_pop; + + encapsulator i_encapsulator ( + .clk_i (clk_i), + .valid_i (packet_valid), + .packet_length_i (packet_length), + .flow_i ('0), + .timestamp_present_i('1), + //.srcid_i(), + .timestamp_i (rvfi_to_iti.cycles), + //.type_i(), + .trace_payload_i (packet_payload), + .valid_o (encap_valid), + .encap_fifo_entry_o (encap_fifo_entry_i) + ); + + fifo_v3 # ( + .DEPTH(16), + .dtype(encap_pkg::encap_fifo_entry_s) + ) i_fifo_encap ( + .clk_i (clk_i), + .rst_ni (rst_ni), + .flush_i ('0), + .testmode_i('0), + .full_o (encap_fifo_full), + .empty_o (encap_fifo_empty), + .usage_o (), + .data_i (encap_fifo_entry_i), + .push_i (encap_valid), + .data_o (encap_fifo_entry_o), + .pop_i (encap_fifo_pop) + ); + localparam DATA_LEN = 8; + + logic slicer_valid; + logic [DATA_LEN-1:0] slice; + logic [$clog2(DATA_LEN)-4:0] valid_bytes; + + slicer_DPTI #( + .SLICE_LEN(DATA_LEN), + .NO_TIME ('0) + ) i_slicer ( + .clk_i (clk_i), + .rst_ni (rst_ni), + .valid_i (!encap_fifo_empty), + .encap_fifo_entry_i(encap_fifo_entry_o), + .fifo_full_i ('0), // usrFull DPTI in ariane_xilinx + .valid_o (slicer_valid), + .slice_o (slice), + .done_o (encap_fifo_pop) + ); cva6_rvfi #( .CVA6Cfg (CVA6Cfg), .rvfi_instr_t(rvfi_instr_t), .rvfi_csr_t(rvfi_csr_t), - .rvfi_probes_t(rvfi_probes_t) + .rvfi_probes_instr_t(rvfi_probes_instr_t), + .rvfi_probes_csr_t(rvfi_probes_csr_t), + .rvfi_probes_t(rvfi_probes_t), + .rvfi_to_iti_t(rvfi_to_iti_t) ) i_cva6_rvfi ( - .clk_i (clk_i), - .rst_ni (rst_ni), + .clk_i (clk_i), + .rst_ni (rst_ni), .rvfi_probes_i(rvfi_probes), - .rvfi_instr_o(rvfi_instr), - .rvfi_csr_o(rvfi_csr) + .rvfi_instr_o (rvfi_instr), + .rvfi_to_iti_o (rvfi_to_iti), + .rvfi_csr_o (rvfi_csr) ); rvfi_tracer #( diff --git a/corev_apu/tb/common/mock_uart.sv b/corev_apu/tb/common/mock_uart.sv index 0124ea714e..839b41f0e1 100644 --- a/corev_apu/tb/common/mock_uart.sv +++ b/corev_apu/tb/common/mock_uart.sv @@ -10,7 +10,7 @@ // // Author: Florian Zaruba, ETH Zurich // Date: 28/09/2018 -// Description: Mock replacement for UART in testbench (not synthesiesable!) +// Description: Mock replacement for UART in testbench (not synthesizable!) module mock_uart ( input logic clk_i, diff --git a/corev_apu/tb/common/tb_amoport.sv b/corev_apu/tb/common/tb_amoport.sv index 18a59636ff..604f211fc9 100644 --- a/corev_apu/tb/common/tb_amoport.sv +++ b/corev_apu/tb/common/tb_amoport.sv @@ -88,7 +88,7 @@ program tb_amoport import ariane_pkg::*; import tb_pkg::*; #( else size = 'h2; - // For LRs/SCs, choose from only 4 adresses, + // For LRs/SCs, choose from only 4 addresses, // so that valid LR/SC combinations become more likely. // Note: AMOs to address 0 are not supported in axi_riscv_atomics module // so we start at 8 (for alignment purposes) @@ -97,7 +97,7 @@ program tb_amoport import ariane_pkg::*; import tb_pkg::*; #( else void'(randomize(paddr) with {paddr >= 8; paddr < (MemWords<<$clog2(CVA6Cfg.XLEN/8));}); - // Align adress + // Align address if (size == 2) paddr[1:0] = '0; else diff --git a/corev_apu/tb/common/tb_dcache_pkg.sv b/corev_apu/tb/common/tb_dcache_pkg.sv index 7584d81a86..0597824453 100644 --- a/corev_apu/tb/common/tb_dcache_pkg.sv +++ b/corev_apu/tb/common/tb_dcache_pkg.sv @@ -31,7 +31,7 @@ package tb_pkg; time CLK_LO = 5ns; // set clock low time time CLK_PERIOD = CLK_HI+CLK_LO; time APPL_DEL = 2ns; // set stimuli application delay - time ACQ_DEL = 8ns; // set response aquisition delay + time ACQ_DEL = 8ns; // set response acquisition delay parameter ERROR_CNT_STOP_LEVEL = 1; // use 1 for debugging. 0 runs the complete simulation... diff --git a/corev_apu/tb/common/tb_writeport.sv b/corev_apu/tb/common/tb_writeport.sv index 46cb362875..82cc10bbee 100644 --- a/corev_apu/tb/common/tb_writeport.sv +++ b/corev_apu/tb/common/tb_writeport.sv @@ -152,7 +152,7 @@ program tb_writeport import tb_pkg::*; import ariane_pkg::*; #( dut_req_port_o.data_wdata = 'x; endtask : genSeqWrite - // Repeadedly write to the same address + // Repeatedly write to the same address task automatic genConstWrite(); automatic logic [CVA6Cfg.XLEN-1:0] val; paddr = CachedAddrBeg; diff --git a/corev_apu/tb/dpi/elfloader.cc b/corev_apu/tb/dpi/elfloader.cc index f137015a5e..8cdf6a4cbc 100644 --- a/corev_apu/tb/dpi/elfloader.cc +++ b/corev_apu/tb/dpi/elfloader.cc @@ -50,7 +50,7 @@ extern "C" char get_section (long long* address, long long* len) { } extern "C" void read_section (long long address, const svOpenArrayHandle buffer) { - // get actual poitner + // get actual pointer void* buf = svGetArrayPtr(buffer); // check that the address points to a section assert(mems.count(address) > 0); diff --git a/corev_apu/tb/rvfi_tracer.sv b/corev_apu/tb/rvfi_tracer.sv index 13d7183fa6..c680f8cd50 100644 --- a/corev_apu/tb/rvfi_tracer.sv +++ b/corev_apu/tb/rvfi_tracer.sv @@ -69,6 +69,39 @@ module rvfi_tracer #( logic[31:0] end_of_test_q; logic[31:0] end_of_test_d; + function automatic logic fp_instr_writes_gpr(logic [31:0] insn); + logic [6:0] opcode; + logic [4:0] funct5; + logic [2:0] rm; + + opcode = insn[6:0]; + funct5 = insn[31:27]; + rm = insn[14:12]; + + if (opcode != riscv::OpcodeOpFp) begin + return 1'b0; + end + + if (funct5 == 5'b11000) begin + return 1'b1; + end + + if (funct5 == 5'b10100) begin + return 1'b1; + end + + if (funct5 == 5'b11100) begin + if ((rm == 3'b000) || (rm == 3'b001)) begin + return 1'b1; + end + if (CVA6Cfg.XF16ALT && ((rm == 3'b100) || (rm == 3'b101))) begin + return 1'b1; + end + end + + return 1'b0; + endfunction + assign end_of_test_o = end_of_test_d; always_ff @(posedge clk_i) begin @@ -77,6 +110,7 @@ module rvfi_tracer #( pc64 = {{CVA6Cfg.XLEN-CVA6Cfg.VLEN{rvfi_i[i].pc_rdata[CVA6Cfg.VLEN-1]}}, rvfi_i[i].pc_rdata}; // print the instruction information if the instruction is valid or a trap is taken if (rvfi_i[i].valid) begin + logic dest_is_fp; // Instruction information if (rvfi_i[i].intr[2]) begin $fwrite(f, "core INTERRUPT 0: 0x%h (0x%h) DASM(%h)\n", @@ -96,6 +130,7 @@ module rvfi_tracer #( end // Decode instruction to know if destination register is FP register. // Handle both uncompressed and compressed instructions. + dest_is_fp = 1'b0; if ( rvfi_i[i].insn[6:0] == 7'b1001111 || rvfi_i[i].insn[6:0] == 7'b1001011 || rvfi_i[i].insn[6:0] == 7'b1000111 || @@ -106,21 +141,29 @@ module rvfi_tracer #( && rvfi_i[i].insn[31:26] != 6'b110000) || (rvfi_i[i].insn[0] == 1'b0 && ((rvfi_i[i].insn[15:13] == 3'b001 && CVA6Cfg.XLEN == 64) || (rvfi_i[i].insn[15:13] == 3'b011 && CVA6Cfg.XLEN == 32) ))) begin + if (fp_instr_writes_gpr(rvfi_i[i].insn)) begin + dest_is_fp = 1'b0; + end else begin + dest_is_fp = 1'b1; + end + end + + if (dest_is_fp) begin $fwrite(f, " f%d 0x%h", rvfi_i[i].rd_addr, rvfi_i[i].rd_wdata); end else if (rvfi_i[i].rd_addr != 0) begin $fwrite(f, " x%d 0x%h", rvfi_i[i].rd_addr, rvfi_i[i].rd_wdata); if (rvfi_i[i].mem_rmask != 0) begin $fwrite(f, " mem 0x%h", rvfi_i[i].mem_addr); end - end else begin - if (rvfi_i[i].mem_wmask != 0) begin - $fwrite(f, " mem 0x%h 0x%h", rvfi_i[i].mem_addr, rvfi_i[i].mem_wdata); - if (TOHOST_ADDR != '0 && - rvfi_i[i].mem_paddr == TOHOST_ADDR && - rvfi_i[i].mem_wdata[0] == 1'b1) begin - end_of_test_q <= rvfi_i[i].mem_wdata[31:0]; - $display("*** [rvfi_tracer] INFO: Simulation terminated after %d cycles!\n", cycles); - end + end + // Handle memory writes (including for AMO instructions which have both rd and mem_wmask) + if (rvfi_i[i].mem_wmask != 0) begin + $fwrite(f, " mem 0x%h 0x%h", rvfi_i[i].mem_addr, rvfi_i[i].mem_wdata); + if (TOHOST_ADDR != '0 && + rvfi_i[i].mem_paddr == TOHOST_ADDR && + rvfi_i[i].mem_wdata[0] == 1'b1) begin + end_of_test_q <= rvfi_i[i].mem_wdata[31:0]; + $display("*** [rvfi_tracer] INFO: Simulation terminated after %d cycles!\n", cycles); end end $fwrite(f, "\n"); diff --git a/corev_apu/tb/tb_cva6_icache/hdl/mem_emul.sv b/corev_apu/tb/tb_cva6_icache/hdl/mem_emul.sv index 994190e314..300c8d1f8e 100644 --- a/corev_apu/tb/tb_cva6_icache/hdl/mem_emul.sv +++ b/corev_apu/tb/tb_cva6_icache/hdl/mem_emul.sv @@ -151,7 +151,7 @@ module mem_emul import ariane_pkg::*; import wt_cache_pkg::*; #( infifo_data.rtype = ICACHE_INV_REQ; // since we do not keep a mirror tag table here, - // we allways invalidate all ways of the aliased index. + // we always invalidate all ways of the aliased index. // this is not entirely correct and will produce // too many invalidations infifo_data.inv.idx = rand_addr_q[CVA6Cfg.ICACHE_INDEX_WIDTH-1:0]; diff --git a/corev_apu/tb/tb_cva6_icache/hdl/tb_pkg.sv b/corev_apu/tb/tb_cva6_icache/hdl/tb_pkg.sv index ae461862ab..488d4713a9 100644 --- a/corev_apu/tb/tb_cva6_icache/hdl/tb_pkg.sv +++ b/corev_apu/tb/tb_cva6_icache/hdl/tb_pkg.sv @@ -30,7 +30,7 @@ package tb_pkg; time CLK_HI = 5ns; // set clock high time time CLK_LO = 5ns; // set clock low time time APPL_DEL = 2ns; // set stimuli application delay - time ACQ_DEL = 8ns; // set response aquisition delay + time ACQ_DEL = 8ns; // set response acquisition delay parameter ERROR_CNT_STOP_LEVEL = 1; // use 1 for debugging. 0 runs the complete simulation... diff --git a/corev_apu/tb/tb_serdiv/hdl/tb.sv b/corev_apu/tb/tb_serdiv/hdl/tb.sv index a01a1bfe3b..7590353946 100644 --- a/corev_apu/tb/tb_serdiv/hdl/tb.sv +++ b/corev_apu/tb/tb_serdiv/hdl/tb.sv @@ -188,7 +188,7 @@ module tb; $display("TB> response acquisition started"); /////////////////////////////////////////////// - // acquisiton and verification + // acquisition and verification /////////////////////////////////////////////// repeat(4) begin diff --git a/corev_apu/tb/tb_serdiv/hdl/tb_pkg.sv b/corev_apu/tb/tb_serdiv/hdl/tb_pkg.sv index 9767d472e2..15ff02e819 100644 --- a/corev_apu/tb/tb_serdiv/hdl/tb_pkg.sv +++ b/corev_apu/tb/tb_serdiv/hdl/tb_pkg.sv @@ -33,7 +33,7 @@ package tb_pkg; time CLK_LO = 5ns; // set clock low time time CLK_PERIOD = CLK_HI+CLK_LO; time APPL_DEL = 2ns; // set stimuli application delay - time ACQ_DEL = 8ns; // set response aquisition delay + time ACQ_DEL = 8ns; // set response acquisition delay parameter ERROR_CNT_STOP_LEVEL = 1; // use 1 for debugging. 0 runs the complete simulation... diff --git a/corev_apu/tb/tb_wb_dcache/hdl/cv32a6_config_pkg.sv b/corev_apu/tb/tb_wb_dcache/hdl/cv32a6_config_pkg.sv index c6c7b9a2d9..1b1aafcfaf 100644 --- a/corev_apu/tb/tb_wb_dcache/hdl/cv32a6_config_pkg.sv +++ b/corev_apu/tb/tb_wb_dcache/hdl/cv32a6_config_pkg.sv @@ -44,6 +44,8 @@ package cva6_config_pkg; localparam CVA6ConfigDcacheLineWidth = 128; localparam CVA6ConfigDcacheIdWidth = 1; + localparam CVA6ConfigMemTidWidth = 2; + localparam CVA6ConfigWtDcacheWbufDepth = 8; localparam CVA6ConfigSuperscalarEn = 0; @@ -87,6 +89,7 @@ package cva6_config_pkg; AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + MemTidWidth: unsigned'(CVA6ConfigMemTidWidth), NrLoadBufEntries: unsigned'(CVA6ConfigNrLoadBufEntries), RVF: bit'(CVA6ConfigRVF), RVD: bit'(CVA6ConfigRVF), @@ -139,10 +142,10 @@ package cva6_config_pkg; DcacheByteSize: unsigned'(CVA6ConfigDcacheByteSize), DcacheSetAssoc: unsigned'(CVA6ConfigDcacheSetAssoc), DcacheLineWidth: unsigned'(CVA6ConfigDcacheLineWidth), - DataUserEn: bit'(CVA6ConfigDataUserEn), + DataUserEn: unsigned'(CVA6ConfigDataUserEn), WtDcacheWbufDepth: int'(CVA6ConfigWtDcacheWbufDepth), FetchUserWidth: unsigned'(CVA6ConfigFetchUserWidth), - FetchUserEn: bit'(CVA6ConfigFetchUserEn), + FetchUserEn: unsigned'(CVA6ConfigFetchUserEn), InstrTlbEntries: int'(2), DataTlbEntries: int'(2), UseSharedTlb: bit'(1), diff --git a/corev_apu/tb/tb_wb_dcache/hdl/cv64a6_config_pkg.sv b/corev_apu/tb/tb_wb_dcache/hdl/cv64a6_config_pkg.sv index e855c21010..7ccfbfac87 100644 --- a/corev_apu/tb/tb_wb_dcache/hdl/cv64a6_config_pkg.sv +++ b/corev_apu/tb/tb_wb_dcache/hdl/cv64a6_config_pkg.sv @@ -44,6 +44,8 @@ package cva6_config_pkg; localparam CVA6ConfigDcacheLineWidth = 128; localparam CVA6ConfigDcacheIdWidth = 1; + localparam CVA6ConfigMemTidWidth = 2; + localparam CVA6ConfigWtDcacheWbufDepth = 8; localparam CVA6ConfigSuperscalarEn = 0; @@ -87,6 +89,7 @@ package cva6_config_pkg; AxiDataWidth: unsigned'(CVA6ConfigAxiDataWidth), AxiIdWidth: unsigned'(CVA6ConfigAxiIdWidth), AxiUserWidth: unsigned'(CVA6ConfigDataUserWidth), + MemTidWidth: unsigned'(CVA6ConfigMemTidWidth), NrLoadBufEntries: unsigned'(CVA6ConfigNrLoadBufEntries), RVF: bit'(CVA6ConfigRVF), RVD: bit'(CVA6ConfigRVF), @@ -139,10 +142,10 @@ package cva6_config_pkg; DcacheByteSize: unsigned'(CVA6ConfigDcacheByteSize), DcacheSetAssoc: unsigned'(CVA6ConfigDcacheSetAssoc), DcacheLineWidth: unsigned'(CVA6ConfigDcacheLineWidth), - DataUserEn: bit'(CVA6ConfigDataUserEn), + DataUserEn: unsigned'(CVA6ConfigDataUserEn), WtDcacheWbufDepth: int'(CVA6ConfigWtDcacheWbufDepth), FetchUserWidth: unsigned'(CVA6ConfigFetchUserWidth), - FetchUserEn: bit'(CVA6ConfigFetchUserEn), + FetchUserEn: unsigned'(CVA6ConfigFetchUserEn), InstrTlbEntries: int'(16), DataTlbEntries: int'(16), UseSharedTlb: bit'(0), diff --git a/corev_apu/tb/tb_wb_dcache/hdl/tb.sv b/corev_apu/tb/tb_wb_dcache/hdl/tb.sv index 37e992c220..9cba78c7db 100644 --- a/corev_apu/tb/tb_wb_dcache/hdl/tb.sv +++ b/corev_apu/tb/tb_wb_dcache/hdl/tb.sv @@ -318,7 +318,7 @@ module tb import ariane_pkg::*; import std_cache_pkg::*; import tb_pkg::*; #( amo_op_a_u = $unsigned(amo_shadow[31:0]); amo_op_b_u = $unsigned(amo_req_i.operand_b[31:0]); - // The result that is expected to be returned by AMO and evantually to be stored in rd. + // The result that is expected to be returned by AMO and eventually to be stored in rd. // For most AMOs, this is the previous memory content. // RISC-V spec requires: "For RV64, 32-bit AMOs always sign-extend the value placed in rd." amo_exp_result = amo_op_a; diff --git a/corev_apu/tb/tb_wt_axi_dcache/hdl/tb.sv b/corev_apu/tb/tb_wt_axi_dcache/hdl/tb.sv index f3279f3439..f47b77fa4e 100644 --- a/corev_apu/tb/tb_wt_axi_dcache/hdl/tb.sv +++ b/corev_apu/tb/tb_wt_axi_dcache/hdl/tb.sv @@ -279,7 +279,7 @@ module tb import ariane_pkg::*; import wt_cache_pkg::*; import tb_pkg::*; #()(); amo_op_a_u = $unsigned(amo_shadow[31:0]); amo_op_b_u = $unsigned(amo_req_i.operand_b[31:0]); - // The result that is expected to be returned by AMO and evantually to be stored in rd. + // The result that is expected to be returned by AMO and eventually to be stored in rd. // For most AMOs, this is the previous memory content. // RISC-V spec requires: "For RV64, 32-bit AMOs always sign-extend the value placed in rd." amo_exp_result = amo_op_a; diff --git a/corev_apu/tb/tb_wt_dcache/hdl/tb_mem.sv b/corev_apu/tb/tb_wt_dcache/hdl/tb_mem.sv index f7094bcc7c..92f4c7cc60 100644 --- a/corev_apu/tb/tb_wt_dcache/hdl/tb_mem.sv +++ b/corev_apu/tb/tb_wt_dcache/hdl/tb_mem.sv @@ -159,7 +159,7 @@ module tb_mem import tb_pkg::*; import ariane_pkg::*; import wt_cache_pkg::*;#( rand_addr_q <= lval<<3; // with the current TB setup, we cannot invalidate a memory location if a write response to the same address is - // in flight, since this could lead to an incosistent state between the real memory and the shadow memory view. + // in flight, since this could lead to an inconsistent state between the real memory and the shadow memory view. // the workaround is not to overwrite shadow memory regions that are still pending in the write buffer // this can be improved. for(int k=0; k<8; k++) begin @@ -205,7 +205,7 @@ module tb_mem import tb_pkg::*; import ariane_pkg::*; import wt_cache_pkg::*;#( infifo_data.rtype = DCACHE_INV_REQ; // since we do not keep a mirror tag table here, - // we allways invalidate all ways of the aliased index. + // we always invalidate all ways of the aliased index. // this is not entirely correct and will produce // too many invalidations infifo_data.inv.idx = rand_addr_q[CVA6Cfg.DCACHE_INDEX_WIDTH-1:0]; diff --git a/notes_mk b/notes_mk new file mode 100644 index 0000000000..2ba8798f30 --- /dev/null +++ b/notes_mk @@ -0,0 +1,23 @@ +OBI_COMMITS : + - core/frontend/frontend.sv + - core/load_unit.sv + - core/store_buffer.sv + - core/cvxif_example/* + - verif/env/uvme/cvxif_vseq/* + - core/csr_regfile.sv + - core/cva6_fifo_v3.sv + - core/cvxif_example/compressed_instr_decoder.sv + - core/frontend/instr_queue.sv + - core/include/config_pkg.sv + - core/include/utils_macros.svh + - core/issue_read_operands.sv + - core/scoreboard.sv + - core/cva6_pipeline.sv + - core/include/build_config_pkg.sv + - core/commit_stage.sv + - core/controller.sv_lib + - core/decoder.sv + + notes to angela : + id_type in cva6.sv : 35? + Probably there is something wrong with ID's. diff --git a/verif/core-v-verif b/verif/core-v-verif index b7a496781c..c81d54fdbf 160000 --- a/verif/core-v-verif +++ b/verif/core-v-verif @@ -1 +1 @@ -Subproject commit b7a496781c6906a0cd8996ad426d7c36010840cb +Subproject commit c81d54fdbf891cac75c3ebf8b6f081894b63ad3f diff --git a/verif/env/corev-dv/simulator.yaml b/verif/env/corev-dv/simulator.yaml index 6aafabf62c..bd120533d3 100644 --- a/verif/env/corev-dv/simulator.yaml +++ b/verif/env/corev-dv/simulator.yaml @@ -61,3 +61,27 @@ cov_opts: > -cm_dir /test.vdb -cm_log /dev/null -cm_name test__ +- tool: questa + compile: + cmd: + - "vlog -64 + +incdir+$QUESTASIM_HOME/verilog_src/uvm-1.2/src + +incdir+ + +incdir+ + +acc + $QUESTASIM_HOME/verilog_src/uvm-1.2/src/uvm_pkg.sv + -f /../env/corev-dv/cva6-files.f + -sv + -mfcu -cuname design_cuname + +define+UVM_REGEX_NO_DPI + -writetoplevels /top.list + -l /compile.log " + - "vopt -64 -debug + +designfile -f /top.list + -l /optimize.log + -o design_opt" + sim: + cmd: > + vsim -64 -c -do /dv/questa_sim.tcl design_opt -sv_seed -sv_lib $QUESTASIM_HOME/uvm-1.2/linux_x86_64/uvm_dpi + cov_opts: > + -do "coverage save -onexit /cov.ucdb;" diff --git a/verif/env/uvme/cov/uvme_exception_covg.sv b/verif/env/uvme/cov/uvme_exception_covg.sv index a91e730ef6..a2466b69ba 100644 --- a/verif/env/uvme/cov/uvme_exception_covg.sv +++ b/verif/env/uvme/cov/uvme_exception_covg.sv @@ -34,7 +34,6 @@ covergroup cg_exception( option.per_instance = 1; option.name = name; -`ifndef QUESTA cp_exception: coverpoint instr.cause { bins BREAKPOINT = {3} iff (instr.trap); @@ -155,7 +154,6 @@ covergroup cg_exception( ignore_bins IGN_EXC = !binsof(cp_exception) intersect{6}; ignore_bins IGN_ADD = binsof(cp_add_mem) intersect{0}; } -`endif endgroup : cg_exception diff --git a/verif/env/uvme/uvma_interrupt/cov/uvma_interrupt_cov_model.sv b/verif/env/uvme/uvma_interrupt/cov/uvma_interrupt_cov_model.sv index d9dfabe362..731190b743 100644 --- a/verif/env/uvme/uvma_interrupt/cov/uvma_interrupt_cov_model.sv +++ b/verif/env/uvme/uvma_interrupt/cov/uvma_interrupt_cov_model.sv @@ -21,7 +21,14 @@ covergroup cg_interrupt( option.name = name; cp_interrupt_req : coverpoint req_item.interrupt_vector { - bins INTERRUPTS[] = {[0:$]} with (item inside {[0:(2**(num_irq_supported))-1]}); + // FIXME: Tanuj Khandelwal + // Questa is crashing on this CG + // Hence it has been changed a little to make it pass + `ifndef QUESTA + bins INTERRUPTS[] = {[0:$]} with (item inside {[0:((2**(num_irq_supported))-1)]}); + `else + bins INTERRUPTS[] = {[0:((2**(num_irq_supported))-1)]}; + `endif } endgroup: cg_interrupt diff --git a/verif/env/uvme/uvma_interrupt/uvma_interrupt_mon.sv b/verif/env/uvme/uvma_interrupt/uvma_interrupt_mon.sv index 6663accf23..252925ca5d 100644 --- a/verif/env/uvme/uvma_interrupt/uvma_interrupt_mon.sv +++ b/verif/env/uvme/uvma_interrupt/uvma_interrupt_mon.sv @@ -64,7 +64,7 @@ class uvma_interrupt_mon_c extends uvm_monitor; endclass : uvma_interrupt_mon_c -function uvma_interrupt_mon_c::new(string name = "uvma_interrupt_mon", uvm_component parent); +function uvma_interrupt_mon_c::new(string name = "uvma_interrupt_mon", uvm_component parent = null); super.new(name, parent); endfunction diff --git a/verif/env/uvme/uvma_interrupt/uvma_interrupt_pkg.sv b/verif/env/uvme/uvma_interrupt/uvma_interrupt_pkg.sv index 0a08d68af4..1f3cad0e0b 100644 --- a/verif/env/uvme/uvma_interrupt/uvma_interrupt_pkg.sv +++ b/verif/env/uvme/uvma_interrupt/uvma_interrupt_pkg.sv @@ -16,7 +16,7 @@ `include "uvm_macros.svh" `include "uvml_hrtbt_macros.sv" `include "uvma_interrupt_macros.sv" - +`include "uvma_axi_macros.sv" /** * Encapsulates all the types needed for an UVM agent capable of driving and/or * monitoring Clock & Reset. diff --git a/verif/env/uvme/uvme_cva6_cfg.sv b/verif/env/uvme/uvme_cva6_cfg.sv index c8b9f99175..9d63c1c345 100644 --- a/verif/env/uvme/uvme_cva6_cfg.sv +++ b/verif/env/uvme/uvme_cva6_cfg.sv @@ -49,7 +49,7 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; rand uvma_obi_memory_cfg_c obi_memory_amo_cfg; rand uvma_obi_memory_cfg_c obi_memory_load_cfg; rand uvma_obi_memory_cfg_c obi_memory_zcmt_cfg; - //rand uvma_obi_memory_cfg_c obi_memory_mmu_ptw_cfg; + rand uvma_obi_memory_cfg_c obi_memory_mmu_ptw_cfg; rand uvma_rvfi_cfg_c#(ILEN,XLEN) rvfi_cfg; rand uvma_isacov_cfg_c isacov_cfg; @@ -104,7 +104,7 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; `uvm_field_object(obi_memory_amo_cfg, UVM_DEFAULT) `uvm_field_object(obi_memory_load_cfg, UVM_DEFAULT) `uvm_field_object(obi_memory_zcmt_cfg, UVM_DEFAULT) - //`uvm_field_object(obi_memory_mmu_ptw_cfg, UVM_DEFAULT) + `uvm_field_object(obi_memory_mmu_ptw_cfg, UVM_DEFAULT) // TODO:`uvm_field_object(obi_memory_data_cfg, UVM_DEFAULT) @@ -222,8 +222,8 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; obi_memory_zcmt_cfg.drv_slv_gnt_mode == UVMA_OBI_MEMORY_DRV_SLV_GNT_MODE_CONSTANT; obi_memory_zcmt_cfg.drv_slv_rvalid_mode == UVMA_OBI_MEMORY_DRV_SLV_RVALID_MODE_CONSTANT; - //obi_memory_mmu_ptw_cfg.drv_slv_gnt_mode == UVMA_OBI_MEMORY_DRV_SLV_GNT_MODE_CONSTANT; - //obi_memory_mmu_ptw_cfg.drv_slv_rvalid_mode == UVMA_OBI_MEMORY_DRV_SLV_RVALID_MODE_CONSTANT; + obi_memory_mmu_ptw_cfg.drv_slv_gnt_mode == UVMA_OBI_MEMORY_DRV_SLV_GNT_MODE_CONSTANT; + obi_memory_mmu_ptw_cfg.drv_slv_rvalid_mode == UVMA_OBI_MEMORY_DRV_SLV_RVALID_MODE_CONSTANT; } else { obi_memory_instr_cfg.drv_slv_gnt_mode != UVMA_OBI_MEMORY_DRV_SLV_GNT_MODE_CONSTANT; @@ -241,8 +241,8 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; obi_memory_zcmt_cfg.drv_slv_gnt_mode != UVMA_OBI_MEMORY_DRV_SLV_GNT_MODE_CONSTANT; obi_memory_zcmt_cfg.drv_slv_rvalid_mode != UVMA_OBI_MEMORY_DRV_SLV_RVALID_MODE_CONSTANT; - //obi_memory_mmu_ptw_cfg.drv_slv_gnt_mode != UVMA_OBI_MEMORY_DRV_SLV_GNT_MODE_CONSTANT; - //obi_memory_mmu_ptw_cfg.drv_slv_rvalid_mode != UVMA_OBI_MEMORY_DRV_SLV_RVALID_MODE_CONSTANT; + obi_memory_mmu_ptw_cfg.drv_slv_gnt_mode != UVMA_OBI_MEMORY_DRV_SLV_GNT_MODE_CONSTANT; + obi_memory_mmu_ptw_cfg.drv_slv_rvalid_mode != UVMA_OBI_MEMORY_DRV_SLV_RVALID_MODE_CONSTANT; } } @@ -321,16 +321,16 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; obi_memory_load_cfg.achk_width == RTLCVA6Cfg.ObiLoadbusCfg.OptionalCfg.AChkWidth ; obi_memory_load_cfg.rchk_width == RTLCVA6Cfg.ObiLoadbusCfg.OptionalCfg.RChkWidth ; - //obi_memory_mmu_ptw_cfg.drv_mode == UVMA_OBI_MEMORY_MODE_SLV; - //obi_memory_mmu_ptw_cfg.version == UVMA_OBI_MEMORY_VERSION_1P2; - //obi_memory_mmu_ptw_cfg.auser_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.AUserWidth; - //obi_memory_mmu_ptw_cfg.wuser_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.WUserWidth; - //obi_memory_mmu_ptw_cfg.ruser_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.RUserWidth; - //obi_memory_mmu_ptw_cfg.addr_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.AddrWidth ; - //obi_memory_mmu_ptw_cfg.data_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.DataWidth ; - //obi_memory_mmu_ptw_cfg.id_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.IdWidth ; - //obi_memory_mmu_ptw_cfg.achk_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.AChkWidth ; - //obi_memory_mmu_ptw_cfg.rchk_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.RChkWidth ; + obi_memory_mmu_ptw_cfg.drv_mode == UVMA_OBI_MEMORY_MODE_SLV; + obi_memory_mmu_ptw_cfg.version == UVMA_OBI_MEMORY_VERSION_1P2; + obi_memory_mmu_ptw_cfg.auser_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.AUserWidth; + obi_memory_mmu_ptw_cfg.wuser_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.WUserWidth; + obi_memory_mmu_ptw_cfg.ruser_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.RUserWidth; + obi_memory_mmu_ptw_cfg.addr_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.AddrWidth ; + obi_memory_mmu_ptw_cfg.data_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.DataWidth ; + obi_memory_mmu_ptw_cfg.id_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.IdWidth ; + obi_memory_mmu_ptw_cfg.achk_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.AChkWidth ; + obi_memory_mmu_ptw_cfg.rchk_width == RTLCVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.RChkWidth ; soft obi_memory_instr_cfg.drv_slv_gnt_random_latency_min == 2; soft obi_memory_instr_cfg.drv_slv_gnt_random_latency_max == 5; @@ -367,12 +367,12 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; soft obi_memory_zcmt_cfg.drv_slv_rvalid_random_latency_min == 2; soft obi_memory_zcmt_cfg.drv_slv_rvalid_random_latency_max == 5; soft obi_memory_zcmt_cfg.drv_slv_rvalid_fixed_latency <= 5; - //soft obi_memory_mmu_ptw_cfg.drv_slv_gnt_random_latency_min <= 0; - //soft obi_memory_mmu_ptw_cfg.drv_slv_gnt_random_latency_max <= 10; - //soft obi_memory_mmu_ptw_cfg.drv_slv_gnt_fixed_latency <= 2; - //soft obi_memory_mmu_ptw_cfg.drv_slv_rvalid_random_latency_min <= 0; - //soft obi_memory_mmu_ptw_cfg.drv_slv_rvalid_random_latency_max <= 10; - //soft obi_memory_mmu_ptw_cfg.drv_slv_rvalid_fixed_latency <= 3; + soft obi_memory_mmu_ptw_cfg.drv_slv_gnt_random_latency_min <= 0; + soft obi_memory_mmu_ptw_cfg.drv_slv_gnt_random_latency_max <= 10; + soft obi_memory_mmu_ptw_cfg.drv_slv_gnt_fixed_latency <= 2; + soft obi_memory_mmu_ptw_cfg.drv_slv_rvalid_random_latency_min <= 0; + soft obi_memory_mmu_ptw_cfg.drv_slv_rvalid_random_latency_max <= 10; + soft obi_memory_mmu_ptw_cfg.drv_slv_rvalid_fixed_latency <= 3; if (is_active == UVM_ACTIVE) { clknrst_cfg.is_active == UVM_ACTIVE; @@ -386,14 +386,14 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; obi_memory_amo_cfg.is_active == UVM_ACTIVE; obi_memory_load_cfg.is_active == UVM_ACTIVE; obi_memory_zcmt_cfg.is_active == UVM_ACTIVE; - //obi_memory_mmu_ptw_cfg.is_active == UVM_ACTIVE; + obi_memory_mmu_ptw_cfg.is_active == UVM_ACTIVE; } else { obi_memory_instr_cfg.is_active == UVM_PASSIVE; obi_memory_store_cfg.is_active == UVM_PASSIVE; obi_memory_amo_cfg.is_active == UVM_PASSIVE; obi_memory_zcmt_cfg.is_active == UVM_PASSIVE; obi_memory_load_cfg.is_active == UVM_PASSIVE; - //obi_memory_mmu_ptw_cfg.is_active == UVM_PASSIVE; + obi_memory_mmu_ptw_cfg.is_active == UVM_PASSIVE; } } @@ -405,8 +405,8 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; obi_memory_zcmt_cfg.trn_log_enabled == 1; obi_memory_amo_cfg.trn_log_enabled == 1; obi_memory_load_cfg.trn_log_enabled == 1; - //obi_memory_mmu_ptw_cfg.trn_log_enabled == 1; - //obi_memory_mmu_ptw_cfg.trn_log_enabled == 1; + obi_memory_mmu_ptw_cfg.trn_log_enabled == 1; + obi_memory_mmu_ptw_cfg.trn_log_enabled == 1; rvfi_cfg.trn_log_enabled == 1; isacov_cfg.trn_log_enabled == 1; } else { @@ -417,7 +417,7 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; obi_memory_amo_cfg.trn_log_enabled == 0; obi_memory_zcmt_cfg.trn_log_enabled == 0; obi_memory_load_cfg.trn_log_enabled == 0; - //obi_memory_mmu_ptw_cfg.trn_log_enabled == 0; + obi_memory_mmu_ptw_cfg.trn_log_enabled == 0; rvfi_cfg.trn_log_enabled == 0; isacov_cfg.trn_log_enabled == 0; } @@ -438,7 +438,7 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; // obi_memory_zcmt_cfg.cov_model_enabled == 0; // } obi_memory_load_cfg.cov_model_enabled == 1; - //obi_memory_mmu_ptw_cfg.cov_model_enabled == 1; + obi_memory_mmu_ptw_cfg.cov_model_enabled == 1; interrupt_cfg.cov_model_enabled == 1; } else { isacov_cfg.cov_model_enabled == 0; @@ -447,7 +447,7 @@ class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; obi_memory_store_cfg.cov_model_enabled == 0; obi_memory_amo_cfg.cov_model_enabled == 0; obi_memory_load_cfg.cov_model_enabled == 0; - //obi_memory_mmu_ptw_cfg.cov_model_enabled == 0; + obi_memory_mmu_ptw_cfg.cov_model_enabled == 0; interrupt_cfg.cov_model_enabled == 0; } @@ -489,7 +489,7 @@ function uvme_cva6_cfg_c::new(string name="uvme_cva6_cfg"); obi_memory_amo_cfg = uvma_obi_memory_cfg_c::type_id::create("obi_memory_amo_cfg"); obi_memory_zcmt_cfg = uvma_obi_memory_cfg_c::type_id::create("obi_memory_zcmt_cfg"); obi_memory_load_cfg = uvma_obi_memory_cfg_c::type_id::create("obi_memory_load_cfg"); - //obi_memory_mmu_ptw_cfg = uvma_obi_memory_cfg_c::type_id::create("obi_memory_mmu_ptw_cfg"); + obi_memory_mmu_ptw_cfg = uvma_obi_memory_cfg_c::type_id::create("obi_memory_mmu_ptw_cfg"); rvfi_cfg = uvma_rvfi_cfg_c#(ILEN,XLEN)::type_id::create("rvfi_cfg"); isacov_cfg = uvma_isacov_cfg_c::type_id::create("isacov_cfg"); interrupt_cfg = uvma_interrupt_cfg_c::type_id::create("interrupt_cfg"); diff --git a/verif/env/uvme/uvme_cva6_cntxt.sv b/verif/env/uvme/uvme_cva6_cntxt.sv index 0f6e832ab6..6dd9d852a8 100644 --- a/verif/env/uvme/uvme_cva6_cntxt.sv +++ b/verif/env/uvme/uvme_cva6_cntxt.sv @@ -38,7 +38,7 @@ class uvme_cva6_cntxt_c extends uvm_object; uvma_obi_memory_cntxt_c obi_memory_amo_cntxt; uvma_obi_memory_cntxt_c obi_memory_zcmt_cntxt; uvma_obi_memory_cntxt_c obi_memory_load_cntxt; - //uvma_obi_memory_cntxt_c obi_memory_mmu_ptw_cntxt; + uvma_obi_memory_cntxt_c obi_memory_mmu_ptw_cntxt; uvma_cva6_core_cntrl_cntxt_c core_cntrl_cntxt; uvma_rvfi_cntxt_c rvfi_cntxt; @@ -66,7 +66,7 @@ class uvme_cva6_cntxt_c extends uvm_object; `uvm_field_object(obi_memory_amo_cntxt, UVM_DEFAULT) `uvm_field_object(obi_memory_load_cntxt, UVM_DEFAULT) `uvm_field_object(obi_memory_zcmt_cntxt, UVM_DEFAULT) - //`uvm_field_object(obi_memory_mmu_ptw_cntxt, UVM_DEFAULT) + `uvm_field_object(obi_memory_mmu_ptw_cntxt, UVM_DEFAULT) `uvm_field_object(core_cntrl_cntxt, UVM_DEFAULT) `uvm_field_object(rvfi_cntxt, UVM_DEFAULT) @@ -109,7 +109,9 @@ function uvme_cva6_cntxt_c::new(string name="uvme_cva6_cntxt"); if (RTLCVA6Cfg.RVZCMT) begin obi_memory_zcmt_cntxt = uvma_obi_memory_cntxt_c::type_id::create("obi_memory_zcmt_cntxt"); end - //obi_memory_mmu_ptw_cntxt = uvma_obi_memory_cntxt_c::type_id::create("obi_memory_mmu_ptw_cntxt"); + if (RTLCVA6Cfg.MmuPresent) begin + obi_memory_mmu_ptw_cntxt = uvma_obi_memory_cntxt_c::type_id::create("obi_memory_mmu_ptw_cntxt"); + end end mem = uvml_mem_cva6::type_id::create("mem"); diff --git a/verif/env/uvme/uvme_cva6_env.sv b/verif/env/uvme/uvme_cva6_env.sv index 2b99bd8fd0..405d3e2cc1 100644 --- a/verif/env/uvme/uvme_cva6_env.sv +++ b/verif/env/uvme/uvme_cva6_env.sv @@ -49,7 +49,7 @@ class uvme_cva6_env_c extends uvm_env; uvma_obi_memory_agent_c obi_memory_amo_agent; uvma_obi_memory_agent_c obi_memory_load_agent; uvma_obi_memory_agent_c obi_memory_zcmt_agent; - //uvma_obi_memory_agent_c obi_memory_mmu_ptw_agent; + uvma_obi_memory_agent_c obi_memory_mmu_ptw_agent; uvma_cva6_core_cntrl_agent_c core_cntrl_agent; uvma_rvfi_agent_c#(ILEN,XLEN) rvfi_agent; @@ -195,7 +195,9 @@ function void uvme_cva6_env_c::build_phase(uvm_phase phase); if (RTLCVA6Cfg.RVZCMT) begin cntxt.obi_memory_zcmt_cntxt.mem = cntxt.mem_obi; end - //cntxt.obi_memory_mmu_ptw_cntxt.mem = cntxt.mem_obi; + if (RTLCVA6Cfg.MmuPresent) begin + cntxt.obi_memory_mmu_ptw_cntxt.mem = cntxt.mem_obi; + end cntxt.interrupt_cntxt.mem_obi = cntxt.mem_obi; `uvm_info("UVMECVA6ENV", "OBI interface is active", UVM_NONE) end @@ -281,7 +283,9 @@ function void uvme_cva6_env_c::assign_cfg(); if (RTLCVA6Cfg.RVZCMT) begin uvm_config_db#(uvma_obi_memory_cfg_c)::set(this, "obi_memory_zcmt_agent", "cfg", cfg.obi_memory_zcmt_cfg); end - //uvm_config_db#(uvma_obi_memory_cfg_c)::set(this, "obi_memory_mmu_ptw_agent", "cfg", cfg.obi_memory_mmu_ptw_cfg); + if (RTLCVA6Cfg.MmuPresent) begin + uvm_config_db#(uvma_obi_memory_cfg_c)::set(this, "obi_memory_mmu_ptw_agent", "cfg", cfg.obi_memory_mmu_ptw_cfg); + end end uvm_config_db#(uvma_core_cntrl_cfg_c)::set(this, "core_cntrl_agent", "cfg", cfg); @@ -316,7 +320,9 @@ function void uvme_cva6_env_c::assign_cntxt(); if (RTLCVA6Cfg.RVZCMT) begin uvm_config_db#(uvma_obi_memory_cntxt_c)::set(this, "obi_memory_zcmt_agent", "cntxt", cntxt.obi_memory_zcmt_cntxt); end - //uvm_config_db#(uvma_obi_memory_cntxt_c)::set(this, "obi_memory_mmu_ptw_agent", "cntxt", cntxt.obi_memory_mmu_ptw_cntxt); + if (RTLCVA6Cfg.MmuPresent) begin + uvm_config_db#(uvma_obi_memory_cntxt_c)::set(this, "obi_memory_mmu_ptw_agent", "cntxt", cntxt.obi_memory_mmu_ptw_cntxt); + end end uvm_config_db#(uvma_rvfi_cntxt_c)::set(this, "rvfi_agent", "cntxt", cntxt.rvfi_cntxt); @@ -341,7 +347,9 @@ function void uvme_cva6_env_c::create_agents(); if (RTLCVA6Cfg.RVZCMT) begin obi_memory_zcmt_agent = uvma_obi_memory_agent_c::type_id::create("obi_memory_zcmt_agent", this); end - //obi_memory_mmu_ptw_agent = uvma_obi_memory_agent_c::type_id::create("obi_memory_mmu_ptw_agent", this); + if (RTLCVA6Cfg.MmuPresent) begin + obi_memory_mmu_ptw_agent = uvma_obi_memory_agent_c::type_id::create("obi_memory_mmu_ptw_agent", this); + end end core_cntrl_agent = uvma_cva6_core_cntrl_agent_c::type_id::create("core_cntrl_agent", this); @@ -449,7 +457,9 @@ function void uvme_cva6_env_c::assemble_vsequencer(); if (RTLCVA6Cfg.RVZCMT) begin vsequencer.obi_memory_zcmt_sequencer = obi_memory_zcmt_agent.sequencer; end - //vsequencer.obi_memory_mmu_ptw_sequencer = obi_memory_mmu_ptw_agent.sequencer; + if (RTLCVA6Cfg.MmuPresent) begin + vsequencer.obi_memory_mmu_ptw_sequencer = obi_memory_mmu_ptw_agent.sequencer; + end end vsequencer.interrupt_sequencer = interrupt_agent.sequencer; vsequencer.cvxif_vsequencer = cvxif_agent.vsequencer; @@ -465,7 +475,7 @@ task uvme_cva6_env_c::run_phase(uvm_phase phase); uvma_obi_memory_slv_seq_c amo_slv_seq; uvma_obi_memory_slv_seq_c zcmt_slv_seq; uvma_obi_memory_slv_seq_c load_slv_seq; - //uvma_obi_memory_slv_seq_c mmu_ptw_slv_seq; + uvma_obi_memory_slv_seq_c mmu_ptw_slv_seq; fork @@ -548,15 +558,16 @@ task uvme_cva6_env_c::run_phase(uvm_phase phase); load_slv_seq.start(obi_memory_load_agent.sequencer); end end - //begin : obi_mmu_ptw_slv_thread - // if(cfg.obi_memory_mmu_ptw_cfg.is_active == UVM_ACTIVE && !config_pkg::OBI_NOT_COMPLIANT) begin - // mmu_ptw_slv_seq = uvma_obi_memory_slv_seq_c::type_id::create("mmu_ptw_slv_seq"); - // if (!mmu_ptw_slv_seq.randomize()) begin - // `uvm_fatal("MMUPTWSLVSEQ", "Randomize failed"); - // end - // mmu_ptw_slv_seq.start(obi_memory_mmu_ptw_agent.sequencer); - // end - //end + begin : obi_mmu_ptw_slv_thread + if(cfg.obi_memory_mmu_ptw_cfg.is_active == UVM_ACTIVE && !config_pkg::OBI_NOT_COMPLIANT && RTLCVA6Cfg.MmuPresent) begin + mmu_ptw_slv_seq = uvma_obi_memory_slv_seq_c::type_id::create("mmu_ptw_slv_seq"); + if (!mmu_ptw_slv_seq.randomize()) begin + `uvm_fatal("MMUPTWSLVSEQ", "Randomize failed"); + end + mmu_ptw_slv_seq.start(obi_memory_mmu_ptw_agent.sequencer); + `uvm_warning("MMUPTWSLVSEQ", "Sequence started \n"); + end + end join_none endtask diff --git a/verif/env/uvme/uvme_cva6_sb.sv b/verif/env/uvme/uvme_cva6_sb.sv index cf15c8f53d..10d6cedb17 100644 --- a/verif/env/uvme/uvme_cva6_sb.sv +++ b/verif/env/uvme/uvme_cva6_sb.sv @@ -323,7 +323,7 @@ endfunction : check_mepc function bit [XLEN:0] uvme_cva6_sb_c::check_mcycle_h(uvma_isacov_instr_c instr, uvma_isacov_instr_c instr_prev, int cycle_count); // Check mcycle value after a CSR read - if (instr_prev == null) return; + if (instr_prev == null) return {1'h0 , -2147483648}; write_in_mcycle = (instr_prev.is_csr_write() && instr_prev.csr_val == 12'hb00) ? 1 : 0; if (cfg.xlen == 32) begin diff --git a/verif/env/uvme/uvme_cva6_vsqr.sv b/verif/env/uvme/uvme_cva6_vsqr.sv index e064484a98..ffe4f66ef8 100644 --- a/verif/env/uvme/uvme_cva6_vsqr.sv +++ b/verif/env/uvme/uvme_cva6_vsqr.sv @@ -44,7 +44,7 @@ class uvme_cva6_vsqr_c extends uvm_sequencer#( uvma_obi_memory_sqr_c obi_memory_amo_sequencer; uvma_obi_memory_sqr_c obi_memory_zcmt_sequencer; uvma_obi_memory_sqr_c obi_memory_load_sequencer; - //uvma_obi_memory_sqr_c obi_memory_mmu_ptw_sequencer; + uvma_obi_memory_sqr_c obi_memory_mmu_ptw_sequencer; diff --git a/verif/regress/Instr_tracing_test.sh b/verif/regress/Instr_tracing_test.sh new file mode 100755 index 0000000000..e4a0078b48 --- /dev/null +++ b/verif/regress/Instr_tracing_test.sh @@ -0,0 +1,127 @@ +#!/bin/bash + +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales + +# Usage ./compare_iti_trace.sh +# Exit 0 if iti traces match, 1 otherwise. + +exit_error() { + echo "$1" >&2 + exit ${2:-1} +} + +clean_file_preserve_header() { + local input_f="$1" + local output_f="$2" + local start_skip="$3" + local end_skip="$4" + + local total_lines lines_to_keep + total_lines=$(wc -l < "$input_f") + lines_to_keep=$((total_lines - start_skip - end_skip)) + + if [ "$lines_to_keep" -le 0 ]; then + exit_error "Error: not enought lines in $input_f" + fi + + { + head -n1 "$input_f" + tail -n "+$((start_skip + 1))" "$input_f" | head -n "$lines_to_keep" + } | sed $'s/\r$//'> "$output_f" +} + +if [ "$#" -ne 1 ]; then + exit_error "Usage: $0 " 2 +fi + +exe="$1" +base=$(basename "$exe" .o) +mkdir verif/sim/Instr_tracing_artifact +workdir="$(realpath verif/sim/Instr_tracing_artifact)" + + +if ! bash verif/regress/iti_test.sh "$exe"; then + exit_error "Error: iti_test.sh failed" +fi + +if [ ! -f verif/sim/iti.traces ]; then + exit_error "Error: iti.traces does not exist" +fi +if [ ! -f verif/sim/encaps.traces ]; then + exit_error "Error: encaps.traces does not exist" +fi + +cp verif/sim/iti.traces "$workdir/iti.trace" +cp verif/sim/encaps.traces "$workdir/encaps.trace" + +rm verif/sim/iti.traces +rm verif/sim/encaps.traces + +cd "$workdir" +git clone https://github.com/riscv-non-isa/riscv-trace-spec.git +cd riscv-trace-spec +git checkout dca761264721068c4576eebd206e2c8b0b9d58b6 +cd referenceFlow +bash scripts/build.sh + +tmp_riscv="$workdir/riscv-trace-spec/referenceFlow/tests/test_files/$base.riscv" +cd ../../.. +cp "$exe" "$tmp_riscv" +cd Instr_tracing_artifact/riscv-trace-spec/referenceFlow +if ! ./scripts/run_regression.sh -t itype3_debug --annotate --debug $tmp_riscv; then + exit_error "Error: run_regression failed" +fi + +reg_dir=$(ls -td ./regression_* 2>/dev/null | head -n1) +if [ -z "$reg_dir" ]; then + exit_error "Error: Folder regression does not exist" +fi + +iti_out="$reg_dir/itype3_debug/$base.encoder_input" +if [ ! -f "$iti_out" ]; then + exit_error "Error: $iti_out does not exist" +fi +encod_out="$reg_dir/itype3_debug/$base.te_inst" +if [ ! -f "$iti_out" ]; then + exit_error "Error: $encod_out does not exist" +fi + +cp "$iti_out" "$workdir/iti_reg.trace" +cp "$encod_out" "$workdir/encod_reg.trace" + +clean_file_preserve_header "$workdir/iti_reg.trace" "$workdir/iti_reg_cleaned.trace" 6 2 +clean_file_preserve_header "$workdir/iti.trace" "$workdir/iti_cleaned.trace" 7 0 + +if diff -q "$workdir/iti_reg_cleaned.trace" "$workdir/iti_cleaned.trace" > /dev/null; then + echo "SUCESS: Same ITI Traces" +else + diff -u "$workdir/iti_reg_cleaned.trace" "$workdir/iti_cleaned.trace" + exit_error "FAILED: ITI traces do not match" +fi + +decapsuler_path="$workdir/../../../corev_apu/instr_tracing/Decapsuler" + +if ! make -C "$decapsuler_path"; then + exit_error "Error: Compilation of Decapsuler failed" +fi + +if ! "$decapsuler_path/Decapsuler" "$workdir/encaps.trace"; then + exit_error "Error: Decapsulation failed" +fi + +clean_file_preserve_header "$workdir/encod_reg.trace" "$workdir/encod_reg_cleaned.trace" 3 2 +clean_file_preserve_header "$workdir/encaps.csv" "$workdir/encaps_cleaned.trace" 3 0 + +if diff -q "$workdir/encod_reg_cleaned.trace" "$workdir/encaps_cleaned.trace" > /dev/null; then + echo "SUCESS: Same Encoder Packets" +else + python3 "$decapsuler_path/diff_color.py" "$workdir/encaps.csv" "$workdir/encod_reg.trace" + exit_error "FAILED: Encoder Packets do not match" +fi \ No newline at end of file diff --git a/verif/regress/dv-riscv-mmu-sv32-test.sh b/verif/regress/dv-riscv-mmu-sv32-test.sh index d9cbea492c..21c3d7114c 100644 --- a/verif/regress/dv-riscv-mmu-sv32-test.sh +++ b/verif/regress/dv-riscv-mmu-sv32-test.sh @@ -31,3 +31,15 @@ fi cd verif/sim python3 cva6.py --testlist=../tests/testlist_riscv-mmu-sv32-arch-test-$DV_TARGET.yaml --target $DV_TARGET --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../tests/riscv-arch-test/riscv-target/spike/link.ld cd - + +cd verif/sim +python3 cva6.py --testlist=../tests/testlist_riscv-mmu-sv32-arch-test-$DV_TARGET.yaml --target cv32a6_imac_sv32_obi --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../tests/riscv-arch-test/riscv-target/spike/link.ld +cd - + +cd verif/sim +python3 cva6.py --testlist=../tests/testlist_riscv-mmu-sv32-arch-test-$DV_TARGET.yaml --target cv32a65x_sv32 --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../tests/riscv-arch-test/riscv-target/spike/link.ld +cd - + +cd verif/sim +python3 cva6.py --testlist=../tests/testlist_riscv-mmu-sv32-arch-test-$DV_TARGET.yaml --target cv32a65x_sv32_axi --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../tests/riscv-arch-test/riscv-target/spike/link.ld +cd - \ No newline at end of file diff --git a/verif/regress/iti_test.sh b/verif/regress/iti_test.sh new file mode 100644 index 0000000000..1b914d202a --- /dev/null +++ b/verif/regress/iti_test.sh @@ -0,0 +1,56 @@ +# Copyright 2025 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Author: Maxime Colson - Thales + +if [ "$#" -eq 1 ]; then + ELF_ARG="$1" +elif [ "$#" -gt 1 ]; then + echo "Usage: $0 " + exit 1 +else + ELF_ARG="../tests/custom/ITI/test_iti_asm.o" +fi +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -g ../tests/custom/common/syscalls.c ../tests/custom/common/crt.S ../tests/custom/ITI/iti_asm.S -I../tests/custom/env -I../tests/custom/common -lgcc" + +cd verif/sim/ + +make -C ../.. clean +make clean_all +python3 cva6.py --elf_tests "$ELF_ARG" --target cv32a60x --iss_yaml cva6.yaml --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a60x/linker/link.ld $DV_OPTS +#python3 cva6.py --c_tests ../tests/custom/ITI/test_iti_asm.c --iss_yaml cva6.yaml --target cv32a60x --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/pmp-tests-combined.sh b/verif/regress/pmp-tests-combined.sh new file mode 100644 index 0000000000..f2062948f4 --- /dev/null +++ b/verif/regress/pmp-tests-combined.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Description: Combined smoke tests for all cv32a6x targets + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +echo "==============================================" +echo "Running combined pmp tests for all targets" +echo "==============================================" + +echo "" +echo "----------------------------------------------" +echo "Running pmp_cv32a60x-tests.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/pmp_cv32a60x_tests.sh" + +echo "" +echo "----------------------------------------------" +echo "Running pmp_cv32a65x-tests.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/pmp_cv32a65x_tests.sh" + +echo "" +echo "----------------------------------------------" +echo "Running pmp_cv32a65x_sv32_tests.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/pmp_cv32a65x_sv32_tests.sh" + +echo "" +echo "----------------------------------------------" +echo "Running pmp_cv32a_imac_sv32_tests.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/pmp_cv32a_imac_sv32_tests.sh" \ No newline at end of file diff --git a/verif/regress/pmp_cv32a60x_tests.sh b/verif/regress/pmp_cv32a60x_tests.sh new file mode 100644 index 0000000000..54b400dda6 --- /dev/null +++ b/verif/regress/pmp_cv32a60x_tests.sh @@ -0,0 +1,49 @@ +##----------------------------------------------------------------------------- +## Copyright 2024 Robert Bosch GmbH +## +## SPDX-License-Identifier: SHL-0.51 +## +## Original Author: Konstantinos Leventos - Robert Bosch France SAS +##----------------------------------------------------------------------------- + +# Where the tools are +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +# Install the required tools +source ./verif/regress/install-spike.sh + +# Setup sim env +source ./verif/sim/setup-env.sh + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-uvm +fi + +if ! [ -n "$UVM_VERBOSITY" ]; then + UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +export DV_TARGET=cv32a65x_axi + +make clean +cd verif/sim/ +make clean_all + +python3 cva6.py --testlist=../tests/testlist_pmp-$DV_TARGET.yaml --target cv32a60x_zcmt_pmp --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../../config/gen_from_riscv_config/cv32a60x/linker/link.ld + +make clean_all + + +export DV_TARGET=cv32a65x + +python3 cva6.py --testlist=../tests/testlist_pmp-$DV_TARGET.yaml --target cv32a60x_zcmt_pmp_axi --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../../config/gen_from_riscv_config/cv32a60x/linker/link.ld + +make clean_all + +cd - +make clean diff --git a/verif/regress/pmp_cv32a65x_sv32_tests.sh b/verif/regress/pmp_cv32a65x_sv32_tests.sh new file mode 100644 index 0000000000..8d4956741d --- /dev/null +++ b/verif/regress/pmp_cv32a65x_sv32_tests.sh @@ -0,0 +1,53 @@ +##----------------------------------------------------------------------------- +## Copyright 2024 Robert Bosch GmbH +## +## SPDX-License-Identifier: SHL-0.51 +## +## Original Author: Konstantinos Leventos - Robert Bosch France SAS +##----------------------------------------------------------------------------- + +# Where the tools are +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +# Install the required tools +source ./verif/regress/install-spike.sh + +# Setup sim env +source ./verif/sim/setup-env.sh + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-uvm +fi + +if ! [ -n "$UVM_VERBOSITY" ]; then + UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +export DV_TARGET=cv32a65x_axi + +make clean +cd verif/sim/ +make clean_all + +python3 cva6.py --testlist=../tests/testlist_pmp-$DV_TARGET.yaml --target cv32a65x_sv32_axi --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../../config/gen_from_riscv_config/cv32a60x/linker/link.ld + +make clean_all + + +export DV_TARGET=cv32a65x + +<<<<<<<< HEAD:verif/regress/pmp_cv32a65x_sv32_tests.sh +python3 cva6.py --testlist=../tests/testlist_pmp-$DV_TARGET.yaml --target $DV_TARGET --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../../config/gen_from_riscv_config/cv32a60x/linker/link.ld +======== +python3 cva6.py --testlist=../tests/testlist_pmp-$DV_TARGET.yaml --target cv32a65x_sv32 --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../../config/gen_from_riscv_config/cv32a60x/linker/link.ld +>>>>>>>> 27305f670 (create all configs and their smoke tests):verif/regress/pmp_cv32a65x_tests.sh + +make clean_all + +cd - +make clean diff --git a/verif/regress/pmp_cv32a65x_tests.sh b/verif/regress/pmp_cv32a65x_tests.sh new file mode 100644 index 0000000000..e06740b557 --- /dev/null +++ b/verif/regress/pmp_cv32a65x_tests.sh @@ -0,0 +1,41 @@ +##----------------------------------------------------------------------------- +## Copyright 2024 Robert Bosch GmbH +## +## SPDX-License-Identifier: SHL-0.51 +## +## Original Author: Konstantinos Leventos - Robert Bosch France SAS +##----------------------------------------------------------------------------- + +# Where the tools are +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +# Install the required tools +source ./verif/regress/install-spike.sh + +# Setup sim env +source ./verif/sim/setup-env.sh + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-uvm +fi + +if ! [ -n "$UVM_VERBOSITY" ]; then + UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +export DV_TARGET=cv32a65x_axi + +make clean +cd verif/sim/ +make clean_all + +python3 cva6.py --testlist=../tests/testlist_pmp-$DV_TARGET.yaml --target $DV_TARGET --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../../config/gen_from_riscv_config/cv32a60x/linker/link.ld + +make clean_all +cd - +make clean diff --git a/verif/regress/pmp_cv32a6_imac_sv32_tests.sh b/verif/regress/pmp_cv32a6_imac_sv32_tests.sh new file mode 100644 index 0000000000..7b69bd0e4a --- /dev/null +++ b/verif/regress/pmp_cv32a6_imac_sv32_tests.sh @@ -0,0 +1,49 @@ +##----------------------------------------------------------------------------- +## Copyright 2024 Robert Bosch GmbH +## +## SPDX-License-Identifier: SHL-0.51 +## +## Original Author: Konstantinos Leventos - Robert Bosch France SAS +##----------------------------------------------------------------------------- + +# Where the tools are +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +# Install the required tools +source ./verif/regress/install-spike.sh + +# Setup sim env +source ./verif/sim/setup-env.sh + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-uvm +fi + +if ! [ -n "$UVM_VERBOSITY" ]; then + UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +export DV_TARGET=cv32a65x_axi + +make clean +cd verif/sim/ +make clean_all + +python3 cva6.py --testlist=../tests/testlist_pmp-$DV_TARGET.yaml --target cv32a6_imac_sv32_obi --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../../config/gen_from_riscv_config/cv32a60x/linker/link.ld + +make clean_all + + +export DV_TARGET=cv32a65x + +python3 cva6.py --testlist=../tests/testlist_pmp-$DV_TARGET.yaml --target cv32a6_imac_sv32 --iss_yaml=cva6.yaml --iss=$DV_SIMULATORS $DV_OPTS --linker=../../config/gen_from_riscv_config/cv32a60x/linker/link.ld + +make clean_all + +cd - +make clean diff --git a/verif/regress/smoke-tests-combined.sh b/verif/regress/smoke-tests-combined.sh new file mode 100644 index 0000000000..f6c08b598d --- /dev/null +++ b/verif/regress/smoke-tests-combined.sh @@ -0,0 +1,106 @@ +#!/bin/bash +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Description: Combined smoke tests for all cv32a6x targets + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +echo "==============================================" +echo "Running combined smoke tests for all targets" +echo "==============================================" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a60x.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a60x.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a60x_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a60x_axi.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a65x.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a65x.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a65x_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a65x_axi.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a65x_noPMP.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a65x_noPMP.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a65x_noPMP_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a65x_noPMP_axi.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a65x_noPMP_noSuperScalar.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a65x_noPMP_noSuperScalar.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a65x_noPMP_noSuperScalar_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a65x_noPMP_noSuperScalar_axi.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a60x_zcmt_pmp.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a60x_zcmt_pmp.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a60x_zcmt_pmp_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a60x_zcmt_pmp_axi.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a6_imac_sv32.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a6_imac_sv32.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a6_imac_sv32_obi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a6_imac_sv32_obi.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a65x_sv32.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a65x_sv32.sh" + +echo "" +echo "----------------------------------------------" +echo "Running smoke-tests-cv32a65x_sv32_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/smoke-tests-cv32a65x_sv32_axi.sh" + +echo "" +echo "==============================================" +echo "All smoke tests completed!" +echo "==============================================" \ No newline at end of file diff --git a/verif/regress/smoke-tests-cv32a60x.sh b/verif/regress/smoke-tests-cv32a60x.sh index a4f81ebdb6..24f6e33575 100644 --- a/verif/regress/smoke-tests-cv32a60x.sh +++ b/verif/regress/smoke-tests-cv32a60x.sh @@ -47,9 +47,24 @@ CC_OPTS="-static \ cd verif/sim/ + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + make -C ../.. clean make clean_all -python3 cva6.py --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a60x --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --iss_timeout=30000 --testlist=../tests/testlist_riscv-tests-cv32a60x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a60x --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + +python3 cva6.py --iss_timeout=30000 --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a60x --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 make -C ../.. clean make clean_all diff --git a/verif/regress/smoke-tests-cv32a60x_axi.sh b/verif/regress/smoke-tests-cv32a60x_axi.sh index 51c8dafad1..952e98f249 100644 --- a/verif/regress/smoke-tests-cv32a60x_axi.sh +++ b/verif/regress/smoke-tests-cv32a60x_axi.sh @@ -47,9 +47,24 @@ CC_OPTS="-static \ cd verif/sim/ +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + make -C ../.. clean make clean_all -python3 cva6.py --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a60x_axi --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --iss_timeout=30000 --testlist=../tests/testlist_riscv-tests-cv32a60x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a60x_axi --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + +python3 cva6.py --iss_timeout=30000 --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a60x_axi --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 make -C ../.. clean make clean_all diff --git a/verif/regress/smoke-tests-cv32a60x_zcmt_pmp.sh b/verif/regress/smoke-tests-cv32a60x_zcmt_pmp.sh new file mode 100644 index 0000000000..3353949419 --- /dev/null +++ b/verif/regress/smoke-tests-cv32a60x_zcmt_pmp.sh @@ -0,0 +1,71 @@ +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Jean-Roch COULON - Thales + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static \ + -mcmodel=medany \ + -fvisibility=hidden \ + -nostartfiles \ + -g \ + ../tests/custom/common/syscalls.c \ + ../tests/custom/common/crt.S \ + -I../tests/custom/env \ + -I../tests/custom/common" + + +cd verif/sim/ + + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + +make -C ../.. clean +make clean_all +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --iss_timeout=30000 --testlist=../tests/testlist_riscv-tests-cv32a60x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a60x_zcmt_pmp --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + +python3 cva6.py --iss_timeout=30000 --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a60x_zcmt_pmp --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/smoke-tests-cv32a60x_zcmt_pmp_axi.sh b/verif/regress/smoke-tests-cv32a60x_zcmt_pmp_axi.sh new file mode 100644 index 0000000000..af32e919bc --- /dev/null +++ b/verif/regress/smoke-tests-cv32a60x_zcmt_pmp_axi.sh @@ -0,0 +1,71 @@ +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Jean-Roch COULON - Thales + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static \ + -mcmodel=medany \ + -fvisibility=hidden \ + -nostartfiles \ + -g \ + ../tests/custom/common/syscalls.c \ + ../tests/custom/common/crt.S \ + -I../tests/custom/env \ + -I../tests/custom/common" + + +cd verif/sim/ + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + +make -C ../.. clean +make clean_all +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --iss_timeout=30000 --testlist=../tests/testlist_riscv-tests-cv32a60x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a60x_zcmt_pmp_axi --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + +python3 cva6.py --iss_timeout=30000 --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a60x_zcmt_pmp_axi --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/smoke-tests-cv32a65x.sh b/verif/regress/smoke-tests-cv32a65x.sh index 85ecb5b781..746252cf3c 100644 --- a/verif/regress/smoke-tests-cv32a65x.sh +++ b/verif/regress/smoke-tests-cv32a65x.sh @@ -46,8 +46,25 @@ CC_OPTS="-static \ cd verif/sim/ + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + make -C ../.. clean make clean_all + +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a65x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a65x --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + python3 cva6.py --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a65x --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 make -C ../.. clean make clean_all diff --git a/verif/regress/smoke-tests-cv32a65x_axi.sh b/verif/regress/smoke-tests-cv32a65x_axi.sh index 9e19f2d6a9..76c7ac2830 100644 --- a/verif/regress/smoke-tests-cv32a65x_axi.sh +++ b/verif/regress/smoke-tests-cv32a65x_axi.sh @@ -46,8 +46,24 @@ CC_OPTS="-static \ cd verif/sim/ +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + make -C ../.. clean make clean_all + +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a65x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a65x_axi --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + python3 cva6.py --iss_timeout=30000 --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a65x_axi --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 make -C ../.. clean make clean_all diff --git a/verif/regress/smoke-tests-cv32a65x_noPMP.sh b/verif/regress/smoke-tests-cv32a65x_noPMP.sh new file mode 100644 index 0000000000..c9cc300705 --- /dev/null +++ b/verif/regress/smoke-tests-cv32a65x_noPMP.sh @@ -0,0 +1,72 @@ +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Jean-Roch COULON - Thales + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static \ + -mcmodel=medany \ + -fvisibility=hidden \ + -nostartfiles \ + -g \ + ../tests/custom/common/syscalls.c \ + ../tests/custom/common/crt.S \ + -I../tests/custom/env \ + -I../tests/custom/common" + +cd verif/sim/ + + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + +make -C ../.. clean +make clean_all + +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a65x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a65x_noPMP --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + +python3 cva6.py --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a65x_noPMP --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/smoke-tests-cv32a65x_noPMP_axi.sh b/verif/regress/smoke-tests-cv32a65x_noPMP_axi.sh new file mode 100644 index 0000000000..bd8abea2ad --- /dev/null +++ b/verif/regress/smoke-tests-cv32a65x_noPMP_axi.sh @@ -0,0 +1,71 @@ +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Jean-Roch COULON - Thales + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static \ + -mcmodel=medany \ + -fvisibility=hidden \ + -nostartfiles \ + -g \ + ../tests/custom/common/syscalls.c \ + ../tests/custom/common/crt.S \ + -I../tests/custom/env \ + -I../tests/custom/common" + +cd verif/sim/ + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + +make -C ../.. clean +make clean_all + +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a65x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a65x_noPMP_axi --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + +python3 cva6.py --iss_timeout=30000 --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a65x_noPMP_axi --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/smoke-tests-cv32a65x_noPMP_noSuperScalar.sh b/verif/regress/smoke-tests-cv32a65x_noPMP_noSuperScalar.sh new file mode 100644 index 0000000000..d92eada6e9 --- /dev/null +++ b/verif/regress/smoke-tests-cv32a65x_noPMP_noSuperScalar.sh @@ -0,0 +1,72 @@ +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Jean-Roch COULON - Thales + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static \ + -mcmodel=medany \ + -fvisibility=hidden \ + -nostartfiles \ + -g \ + ../tests/custom/common/syscalls.c \ + ../tests/custom/common/crt.S \ + -I../tests/custom/env \ + -I../tests/custom/common" + +cd verif/sim/ + + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + +make -C ../.. clean +make clean_all + +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a65x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a65x_noPMP_noSuperScalar --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + +python3 cva6.py --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a65x_noPMP_noSuperScalar --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/smoke-tests-cv32a65x_noPMP_noSuperScalar_axi.sh b/verif/regress/smoke-tests-cv32a65x_noPMP_noSuperScalar_axi.sh new file mode 100644 index 0000000000..8280025540 --- /dev/null +++ b/verif/regress/smoke-tests-cv32a65x_noPMP_noSuperScalar_axi.sh @@ -0,0 +1,71 @@ +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Jean-Roch COULON - Thales + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static \ + -mcmodel=medany \ + -fvisibility=hidden \ + -nostartfiles \ + -g \ + ../tests/custom/common/syscalls.c \ + ../tests/custom/common/crt.S \ + -I../tests/custom/env \ + -I../tests/custom/common" + +cd verif/sim/ + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + +make -C ../.. clean +make clean_all + +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a65x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a65x_noPMP_noSuperScalar_axi --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + +python3 cva6.py --iss_timeout=30000 --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a65x_noPMP_noSuperScalar_axi --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/smoke-tests-cv32a65x_sv32.sh b/verif/regress/smoke-tests-cv32a65x_sv32.sh new file mode 100644 index 0000000000..70f5bf7444 --- /dev/null +++ b/verif/regress/smoke-tests-cv32a65x_sv32.sh @@ -0,0 +1,72 @@ +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Jean-Roch COULON - Thales + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static \ + -mcmodel=medany \ + -fvisibility=hidden \ + -nostartfiles \ + -g \ + ../tests/custom/common/syscalls.c \ + ../tests/custom/common/crt.S \ + -I../tests/custom/env \ + -I../tests/custom/common" + +cd verif/sim/ + + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + +make -C ../.. clean +make clean_all + +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a65x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a65x_sv32 --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + +python3 cva6.py --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a65x_sv32 --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/smoke-tests-cv32a65x_sv32_axi.sh b/verif/regress/smoke-tests-cv32a65x_sv32_axi.sh new file mode 100644 index 0000000000..1942600e67 --- /dev/null +++ b/verif/regress/smoke-tests-cv32a65x_sv32_axi.sh @@ -0,0 +1,71 @@ +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Jean-Roch COULON - Thales + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static \ + -mcmodel=medany \ + -fvisibility=hidden \ + -nostartfiles \ + -g \ + ../tests/custom/common/syscalls.c \ + ../tests/custom/common/crt.S \ + -I../tests/custom/env \ + -I../tests/custom/common" + +cd verif/sim/ + +# 32-bit configurations without MMU +riscv_tests_list=( + rv32ui-p-add + rv32ui-p-lw + rv32ui-p-sw + rv32ui-p-beq + rv32ui-p-jal +) + +make -C ../.. clean +make clean_all + +for t in ${riscv_tests_list[@]} ; do + python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a65x-p.yaml --test $t --iss_yaml cva6.yaml --target cv32a65x_sv32_axi --iss=$DV_SIMULATORS $DV_OPTS + [[ $? > 0 ]] && ((errors++)) +done + + +python3 cva6.py --iss_timeout=30000 --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a65x_sv32_axi --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/cv32a65x/linker/link.ld --gcc_opts="$CC_OPTS" $DV_OPTS --sv_seed 1 +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/smoke-tests-cv32a6_imac_sv32_obi.sh b/verif/regress/smoke-tests-cv32a6_imac_sv32_obi.sh new file mode 100644 index 0000000000..891e39b585 --- /dev/null +++ b/verif/regress/smoke-tests-cv32a6_imac_sv32_obi.sh @@ -0,0 +1,56 @@ +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Jean-Roch COULON - Thales + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# install the required test suites +source ./verif/regress/install-riscv-compliance.sh +source ./verif/regress/install-riscv-tests.sh +source ./verif/regress/install-riscv-arch-test.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +CC_OPTS="-static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -g ../tests/custom/common/syscalls.c ../tests/custom/common/crt.S -I../tests/custom/env -I../tests/custom/common -lgcc" + + +cd verif/sim/ + +make -C ../.. clean +make clean_all +python3 cva6.py --testlist=../tests/testlist_riscv-compliance-cv32a60x.yaml --test rv32i-I-ADD-01 --iss_yaml cva6.yaml --target cv32a6_imac_sv32_obi --iss=$DV_SIMULATORS $DV_OPTS +python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a60x-p.yaml --test rv32ui-p-add --iss_yaml cva6.yaml --target cv32a6_imac_sv32_obi --iss=$DV_SIMULATORS $DV_OPTS +python3 cva6.py --testlist=../tests/testlist_riscv-arch-test-cv32a60x.yaml --test rv32im-cadd-01 --iss_yaml cva6.yaml --target cv32a6_imac_sv32_obi --iss=$DV_SIMULATORS $DV_OPTS --linker=../../config/gen_from_riscv_config/linker/link.ld +python3 cva6.py --c_tests ../tests/custom/hello_world/hello_world.c --iss_yaml cva6.yaml --target cv32a6_imac_sv32_obi --iss=$DV_SIMULATORS --linker=../../config/gen_from_riscv_config/linker/link.ld --gcc_opts="$CC_OPTS -nostdlib -lgcc" $DV_OPTS +make -C ../.. clean +make clean_all + +cd - diff --git a/verif/regress/zcmt-tests-combined.sh b/verif/regress/zcmt-tests-combined.sh new file mode 100644 index 0000000000..5894bb7fe2 --- /dev/null +++ b/verif/regress/zcmt-tests-combined.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# Copyright 2021 Thales DIS design services SAS +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Description: Combined smoke tests for all cv32a6x targets + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +echo "==============================================" +echo "Running combined zcmt tests for all targets" +echo "==============================================" + +echo "" +echo "----------------------------------------------" +echo "Runningzcmt-tests-cv32a60x_zcmt_pmp_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/zcmt-tests-cv32a60x_zcmt_pmp_axi.sh" + + +echo "" +echo "----------------------------------------------" +echo "Running zcmt-tests-cv32a60x_zcmt_pmp.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/zcmt-tests-cv32a60x_zcmt_pmp.sh" + +echo "" +echo "----------------------------------------------" +echo "Running zcmt-tests-cv32a65x_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/zcmt-tests-cv32a65x_axi.sh" + +echo "" +echo "----------------------------------------------" +echo "Running zcmt-tests-cv32a65x.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/zcmt-tests-cv32a65x.sh" + +echo "" +echo "----------------------------------------------" +echo "Running zcmt-tests-cv32a65x_noPMP_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/zcmt-tests-cv32a65x_noPMP_axi.sh" + + +echo "" +echo "----------------------------------------------" +echo "Running zcmt-tests-cv32a65x_noPMP.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/zcmt-tests-cv32a65x_noPMP.sh" + +echo "" +echo "----------------------------------------------" +echo "Running zcmt-tests-cv32a65x_noPMP_noSuperScalar_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/zcmt-tests-cv32a65x_noPMP_noSuperScalar.sh" + +echo "" +echo "----------------------------------------------" +echo "Running zcmt-tests-cv32a65x_noPMP_noSuperScalar_axi.sh" +echo "----------------------------------------------" +source "$SCRIPT_DIR/zcmt-tests-cv32a65x_noPMP_noSuperScalar.sh" \ No newline at end of file diff --git a/verif/regress/zcmt-tests-cv32a60x_zcmt_pmp.sh b/verif/regress/zcmt-tests-cv32a60x_zcmt_pmp.sh new file mode 100644 index 0000000000..7710130021 --- /dev/null +++ b/verif/regress/zcmt-tests-cv32a60x_zcmt_pmp.sh @@ -0,0 +1,46 @@ +# Copyright 2026 PlanV Technologies +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Angela Gonzalez - PlanV + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +cd verif/sim/ +make clean_all + +python3 cva6.py --target cv32a60x_zcmt_pmp --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long_ret.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a60x_zcmt_pmp --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a60x_zcmt_pmp --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a60x_zcmt_pmp --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/jvt_csr.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" + +make clean_all +cd - diff --git a/verif/regress/zcmt-tests-cv32a60x_zcmt_pmp_axi.sh b/verif/regress/zcmt-tests-cv32a60x_zcmt_pmp_axi.sh new file mode 100644 index 0000000000..a108698702 --- /dev/null +++ b/verif/regress/zcmt-tests-cv32a60x_zcmt_pmp_axi.sh @@ -0,0 +1,46 @@ +# Copyright 2026 PlanV Technologies +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Angela Gonzalez - PlanV + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +cd verif/sim/ +make clean_all + +python3 cva6.py --target cv32a60x_zcmt_pmp_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long_ret.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a60x_zcmt_pmp_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a60x_zcmt_pmp_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a60x_zcmt_pmp_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/jvt_csr.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" + +make clean_all +cd - diff --git a/verif/regress/zcmt-tests-cv32a65x.sh b/verif/regress/zcmt-tests-cv32a65x.sh new file mode 100644 index 0000000000..f6fa864d90 --- /dev/null +++ b/verif/regress/zcmt-tests-cv32a65x.sh @@ -0,0 +1,46 @@ +# Copyright 2026 PlanV Technologies +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Angela Gonzalez - PlanV + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +cd verif/sim/ +make clean_all + +python3 cva6.py --target cv32a65x --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long_ret.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/jvt_csr.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" + +make clean_all +cd - diff --git a/verif/regress/zcmt-tests-cv32a65x_axi.sh b/verif/regress/zcmt-tests-cv32a65x_axi.sh new file mode 100644 index 0000000000..5a7411755c --- /dev/null +++ b/verif/regress/zcmt-tests-cv32a65x_axi.sh @@ -0,0 +1,46 @@ +# Copyright 2026 PlanV Technologies +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Angela Gonzalez - PlanV + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +cd verif/sim/ +make clean_all + +python3 cva6.py --target cv32a65x_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long_ret.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/jvt_csr.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" + +make clean_all +cd - diff --git a/verif/regress/zcmt-tests-cv32a65x_noPMP.sh b/verif/regress/zcmt-tests-cv32a65x_noPMP.sh new file mode 100644 index 0000000000..27bca76198 --- /dev/null +++ b/verif/regress/zcmt-tests-cv32a65x_noPMP.sh @@ -0,0 +1,46 @@ +# Copyright 2026 PlanV Technologies +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Angela Gonzalez - PlanV + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +cd verif/sim/ +make clean_all + +python3 cva6.py --target cv32a65x_noPMP --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long_ret.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/jvt_csr.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" + +make clean_all +cd - diff --git a/verif/regress/zcmt-tests-cv32a65x_noPMP_axi.sh b/verif/regress/zcmt-tests-cv32a65x_noPMP_axi.sh new file mode 100644 index 0000000000..ae5bbec931 --- /dev/null +++ b/verif/regress/zcmt-tests-cv32a65x_noPMP_axi.sh @@ -0,0 +1,46 @@ +# Copyright 2026 PlanV Technologies +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Angela Gonzalez - PlanV + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +cd verif/sim/ +make clean_all + +python3 cva6.py --target cv32a65x_noPMP_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long_ret.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/jvt_csr.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" + +make clean_all +cd - diff --git a/verif/regress/zcmt-tests-cv32a65x_noPMP_noSuperScalar.sh b/verif/regress/zcmt-tests-cv32a65x_noPMP_noSuperScalar.sh new file mode 100644 index 0000000000..c18f0d05f8 --- /dev/null +++ b/verif/regress/zcmt-tests-cv32a65x_noPMP_noSuperScalar.sh @@ -0,0 +1,46 @@ +# Copyright 2026 PlanV Technologies +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Angela Gonzalez - PlanV + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +cd verif/sim/ +make clean_all + +python3 cva6.py --target cv32a65x_noPMP_noSuperScalar --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long_ret.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP_noSuperScalar --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP_noSuperScalar --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP_noSuperScalar --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/jvt_csr.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" + +make clean_all +cd - diff --git a/verif/regress/zcmt-tests-cv32a65x_noPMP_noSuperScalar_axi.sh b/verif/regress/zcmt-tests-cv32a65x_noPMP_noSuperScalar_axi.sh new file mode 100644 index 0000000000..cbad8f32bb --- /dev/null +++ b/verif/regress/zcmt-tests-cv32a65x_noPMP_noSuperScalar_axi.sh @@ -0,0 +1,46 @@ +# Copyright 2026 PlanV Technologies +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https://solderpad.org/licenses/ +# +# Original Author: Angela Gonzalez - PlanV + +# where are the tools +if ! [ -n "$RISCV" ]; then + echo "Error: RISCV variable undefined" + return +fi + +if ! [ -n "$DV_SIMULATORS" ]; then + DV_SIMULATORS=vcs-testharness,spike +fi + +# install the required tools +if [[ "$DV_SIMULATORS" == *"veri-testharness"* ]]; then + source ./verif/regress/install-verilator.sh +fi +source ./verif/regress/install-spike.sh + +# setup sim env +source ./verif/sim/setup-env.sh + +echo "$SPIKE_INSTALL_DIR$" + +if ! [ -n "$UVM_VERBOSITY" ]; then + export UVM_VERBOSITY=UVM_NONE +fi + +export DV_OPTS="$DV_OPTS --issrun_opts=+debug_disable=1+UVM_VERBOSITY=$UVM_VERBOSITY" + +cd verif/sim/ +make clean_all + +python3 cva6.py --target cv32a65x_noPMP_noSuperScalar_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long_ret.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP_noSuperScalar_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jalt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP_noSuperScalar_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/cm_jt_long.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" +python3 cva6.py --target cv32a65x_noPMP_noSuperScalar_axi --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --asm_tests ../tests/custom/zcmt/jvt_csr.S --linker=../tests/custom/zcmt/link.ld --gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib" + +make clean_all +cd - diff --git a/verif/sim/Makefile b/verif/sim/Makefile index 05b63cea90..11eeed2bb6 100644 --- a/verif/sim/Makefile +++ b/verif/sim/Makefile @@ -355,8 +355,7 @@ questa_uvm_comp: -suppress vlog-2745 -suppress vlog-8386 \ -suppress vlog-8607 \ +define+UNSUPPORTED_WITH+ \ - +define+QUESTA+ \ - $(cov-comp-opt) $(isscomp_opts) + +define+QUESTA vopt -work $(VSIM_WORK_DIR) \ -64 +acc uvmt_cva6_tb -o uvmt_cva6_tb_opt @@ -364,6 +363,7 @@ questa_uvm_run: @echo "[QUESTA] Running Model" vsim -64 \ $(COMMON_RUN_UVM_FLAGS) \ + $(COMMON_RUN_ARGS) \ -sv_lib $(QUESTASIM_HOME)/uvm-1.2/linux_x86_64/uvm_dpi \ -c -do "run -all; " \ -work $(VSIM_WORK_DIR) -t 1ns \ @@ -371,13 +371,14 @@ questa_uvm_run: -suppress 3829 -suppress vsim-8386\ +permissive \ -sv_seed 0 \ - $(cov-run-opt) $(issrun_opts) \ + -noautoldlibpath \ +define+UNSUPPORTED_WITH+ \ + $(issrun_opts) \ uvmt_cva6_tb_opt + $(tool_path)/spike-dasm --isa=$(variant) < ./trace_rvfi_hart_00.dasm > $(log) + grep $(isspostrun_opts) ./trace_rvfi_hart_00.dasm # TODO: Add support for waveform collection. - #$(tool_path)/spike-dasm --isa=$(variant) < $(path_var)/trace_rvfi_hart_00.dasm > $(log) - #grep $(isspostrun_opts) $(path_var)/trace_rvfi_hart_00.dasm questa-uvm: make questa_uvm_comp @@ -457,6 +458,7 @@ clean_all: vcs_clean_all rm -f trace*.log rm -f trace*.dasm rm -f *.vpd *.fsdb *.vcd *.fst + rm -f *.trace help: @echo "Shell environment:" diff --git a/verif/sim/cva6.py b/verif/sim/cva6.py index 2244aa6814..26c9100508 100644 --- a/verif/sim/cva6.py +++ b/verif/sim/cva6.py @@ -943,18 +943,48 @@ def load_config(args, cwd): args.mabi = "ilp32" args.isa = "rv32imc_zba_zbb_zbs_zbc" args.priv = "m" + elif base == "cv32a60x_zcmt_pmp": + args.mabi = "ilp32" + args.isa = "rv32imc_zba_zbb_zbs_zbc" + args.priv = "m" elif base == "cv32a65x": args.mabi = "ilp32" args.isa = "rv32imc_zba_zbb_zbs_zbc" args.priv = "m" + elif base == "cv32a65x_noPMP": + args.mabi = "ilp32" + args.isa = "rv32imc_zba_zbb_zbs_zbc" + args.priv = "m" + elif base == "cv32a65x_noPMP_noSuperScalar": + args.mabi = "ilp32" + args.isa = "rv32imc_zba_zbb_zbs_zbc" + args.priv = "m" elif base == "cv32a60x_axi": args.mabi = "ilp32" args.isa = "rv32imc_zba_zbb_zbs_zbc" args.priv = "m" + elif base == "cv32a60x_zcmt_pmp_axi": + args.mabi = "ilp32" + args.isa = "rv32imc_zba_zbb_zbs_zbc" + args.priv = "m" elif base == "cv32a65x_axi": args.mabi = "ilp32" args.isa = "rv32imc_zba_zbb_zbs_zbc" args.priv = "m" + elif base == "cv32a65x_noPMP_axi": + args.mabi = "ilp32" + args.isa = "rv32imc_zba_zbb_zbs_zbc" + args.priv = "m" + elif base == "cv32a65x_noPMP_noSuperScalar_axi": + args.mabi = "ilp32" + args.isa = "rv32imc_zba_zbb_zbs_zbc" + args.priv = "m" + elif base == "cv32a65x_sv32": + args.mabi = "ilp32" + args.isa = "rv32imc_zba_zbb_zbs_zbc" + elif base == "cv32a65x_sv32_axi": + args.mabi = "ilp32" + args.isa = "rv32imc_zba_zbb_zbs_zbc" elif base == "cv64a6_mmu": args.mabi = "lp64" args.isa = "rv64imac_zba_zbb_zbs_zbc" @@ -964,6 +994,9 @@ def load_config(args, cwd): elif base == "cv32a6_imac_sv32": args.mabi = "ilp32" args.isa = "rv32imac_zbkb" + elif base == "cv32a6_imac_sv32_obi": + args.mabi = "ilp32" + args.isa = "rv32imac_zbkb" elif base == "cv32a6_imafc_sv32": args.mabi = "ilp32f" args.isa = "rv32imafc" @@ -1102,7 +1135,7 @@ def check_spike_version(): def check_verilator_version(): - REQUIRED_VERILATOR_VERSION = "5.008" + REQUIRED_VERILATOR_VERSION = "5.024" verilator_version_string = run_cmd("verilator --version") logging.info(f"Verilator Version: {verilator_version_string.strip()}") diff --git a/verif/sim/dv b/verif/sim/dv index f0c570d112..7e54b678ab 160000 --- a/verif/sim/dv +++ b/verif/sim/dv @@ -1 +1 @@ -Subproject commit f0c570d11236f94f9c5449870223a5ac717cc580 +Subproject commit 7e54b678ab7499040336255550cdbd99ae887431 diff --git a/verif/tb/uvmt/cva6_tb_wrapper.sv b/verif/tb/uvmt/cva6_tb_wrapper.sv index 37a3330200..a8493a0c01 100644 --- a/verif/tb/uvmt/cva6_tb_wrapper.sv +++ b/verif/tb/uvmt/cva6_tb_wrapper.sv @@ -47,49 +47,44 @@ import "DPI-C" function byte get_section( output longint address, output longint len ); -import "DPI-C" context function read_section_sv( +import "DPI-C" context function void read_section_sv( input longint address, inout byte buffer[] ); `endif -module cva6_tb_wrapper - import uvmt_cva6_pkg::*; -#( - parameter config_pkg::cva6_cfg_t CVA6Cfg = config_pkg::cva6_cfg_empty, - parameter type rvfi_instr_t = logic, - parameter type rvfi_csr_elmt_t = logic, - parameter type rvfi_csr_t = logic, - parameter type rvfi_probes_instr_t = logic, - parameter type rvfi_probes_csr_t = logic, - parameter type rvfi_probes_t = logic, - - // CVXIF Types - localparam type readregflags_t = `READREGFLAGS_T(CVA6Cfg), - localparam type writeregflags_t = `WRITEREGFLAGS_T(CVA6Cfg), - localparam type id_t = `ID_T(CVA6Cfg), - localparam type hartid_t = `HARTID_T(CVA6Cfg), - localparam type x_compressed_req_t = `X_COMPRESSED_REQ_T(CVA6Cfg, hartid_t), - localparam type x_compressed_resp_t = `X_COMPRESSED_RESP_T(CVA6Cfg), - localparam type x_issue_req_t = `X_ISSUE_REQ_T(CVA6Cfg, hartit_t, id_t), - localparam type x_issue_resp_t = `X_ISSUE_RESP_T(CVA6Cfg, writeregflags_t, readregflags_t), - localparam type x_register_t = `X_REGISTER_T(CVA6Cfg, hartid_t, id_t, readregflags_t), - localparam type x_commit_t = `X_COMMIT_T(CVA6Cfg, hartid_t, id_t), - localparam type x_result_t = `X_RESULT_T(CVA6Cfg, hartid_t, id_t, writeregflags_t), - localparam type cvxif_req_t = - `CVXIF_REQ_T(CVA6Cfg, x_compressed_req_t, x_issue_req_t, x_register_req_t, x_commit_t), - localparam type cvxif_resp_t = - `CVXIF_RESP_T(CVA6Cfg, x_compressed_resp_t, x_issue_resp_t, x_result_t), - `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_fetch, CVA6Cfg.ObiFetchbusCfg), - `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_store, CVA6Cfg.ObiStorebusCfg), - `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_load, CVA6Cfg.ObiLoadbusCfg), - `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_amo, CVA6Cfg.ObiAmobusCfg), - `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_mmu_ptw, CVA6Cfg.ObiMmuPtwbusCfg), - `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_zcmt, CVA6Cfg.ObiZcmtbusCfg), - // - - parameter int unsigned AXI_USER_EN = 0, - parameter int unsigned NUM_WORDS = 2 ** 25 +module cva6_tb_wrapper import uvmt_cva6_pkg::*; #( + parameter config_pkg::cva6_cfg_t CVA6Cfg = config_pkg::cva6_cfg_empty, + parameter type rvfi_instr_t = logic, + parameter type rvfi_csr_elmt_t = logic, + parameter type rvfi_csr_t = logic, + parameter type rvfi_probes_instr_t = logic, + parameter type rvfi_probes_csr_t = logic, + parameter type rvfi_probes_t = logic, + parameter type rvfi_to_iti_t = logic, + // CVXIF Types + localparam type readregflags_t = `READREGFLAGS_T(CVA6Cfg), + localparam type writeregflags_t = `WRITEREGFLAGS_T(CVA6Cfg), + localparam type id_t = `ID_T(CVA6Cfg), + localparam type hartid_t = `HARTID_T(CVA6Cfg), + localparam type x_compressed_req_t = `X_COMPRESSED_REQ_T(CVA6Cfg, hartid_t), + localparam type x_compressed_resp_t = `X_COMPRESSED_RESP_T(CVA6Cfg), + localparam type x_issue_req_t = `X_ISSUE_REQ_T(CVA6Cfg, hartit_t, id_t), + localparam type x_issue_resp_t = `X_ISSUE_RESP_T(CVA6Cfg, writeregflags_t, readregflags_t), + localparam type x_register_t = `X_REGISTER_T(CVA6Cfg, hartid_t, id_t, readregflags_t), + localparam type x_commit_t = `X_COMMIT_T(CVA6Cfg, hartid_t, id_t), + localparam type x_result_t = `X_RESULT_T(CVA6Cfg, hartid_t, id_t, writeregflags_t), + localparam type cvxif_req_t = `CVXIF_REQ_T(CVA6Cfg, x_compressed_req_t, x_issue_req_t, x_register_req_t, x_commit_t), + localparam type cvxif_resp_t = `CVXIF_RESP_T(CVA6Cfg, x_compressed_resp_t, x_issue_resp_t, x_result_t), + // + `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_fetch, CVA6Cfg.ObiFetchbusCfg), + `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_store, CVA6Cfg.ObiStorebusCfg), + `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_load, CVA6Cfg.ObiLoadbusCfg), + `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_amo, CVA6Cfg.ObiAmobusCfg), + `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_mmu_ptw, CVA6Cfg.ObiMmuPtwbusCfg), + `OBI_LOCALPARAM_TYPE_GLOBAL_ALL(obi_zcmt, CVA6Cfg.ObiZcmtbusCfg), + parameter int unsigned AXI_USER_EN = 0, + parameter int unsigned NUM_WORDS = 2**25 ) ( input logic clk_i, input logic rst_ni, @@ -149,6 +144,7 @@ module cva6_tb_wrapper rvfi_instr_t [CVA6Cfg.NrCommitPorts-1:0] rvfi_instr; rvfi_probes_t rvfi_probes; + rvfi_to_iti_t rvfi_to_iti; rvfi_csr_t rvfi_csr; assign rvfi_o = rvfi_instr; assign rvfi_csr_o = rvfi_csr; @@ -431,31 +427,31 @@ module cva6_tb_wrapper assign obi_load_rsp.r.r_optional.rchk = obi_load_slave.rchk; if (CVA6Cfg.MmuPresent) begin - //assign obi_mmu_ptw_slave.req = i_cva6.obi_fetch_req.req; - //assign obi_mmu_ptw_slave.addr = i_cva6.obi_fetch_req.a.addr; - //assign obi_mmu_ptw_slave.we = i_cva6.obi_fetch_req.a.we; - //assign obi_mmu_ptw_slave.be = i_cva6.obi_fetch_req.a.be; - //assign obi_mmu_ptw_slave.wdata = i_cva6.obi_fetch_req.a.wdata; - //assign obi_mmu_ptw_slave.auser = i_cva6.obi_fetch_req.a.a_optional.auser; - //assign obi_mmu_ptw_slave.wuser = i_cva6.obi_fetch_req.a.a_optional.wuser; - //assign obi_mmu_ptw_slave.aid = i_cva6.obi_fetch_req.a.aid; - //assign obi_mmu_ptw_slave.atop = i_cva6.obi_fetch_req.a.a_optional.atop; - //assign obi_mmu_ptw_slave.memtype = i_cva6.obi_fetch_req.a.a_optional.memtype; - //assign obi_mmu_ptw_slave.prot = i_cva6.obi_fetch_req.a.a_optional.prot; - //assign obi_mmu_ptw_slave.reqpar = i_cva6.obi_fetch_req.reqpar; - //assign obi_mmu_ptw_slave.achk = i_cva6.obi_fetch_req.a.a_optional.achk; - //assign obi_mmu_ptw_slave.rready = i_cva6.obi_fetch_req.rready; - //assign obi_mmu_ptw_slave.rreadypar = i_cva6.obi_fetch_req.rreadypar; - //assign i_cva6.obi_fetch_rsp.gnt = obi_mmu_ptw_slave.gnt; - //assign i_cva6.obi_fetch_rsp.gntpar = obi_mmu_ptw_slave.gntpar; - //assign i_cva6.obi_fetch_rsp.rvalid = obi_mmu_ptw_slave.rvalid; - //assign i_cva6.obi_fetch_rsp.r.rdata = obi_mmu_ptw_slave.rdata; - //assign i_cva6.obi_fetch_rsp.r.err = obi_mmu_ptw_slave.err; - //assign i_cva6.obi_fetch_rsp.r.r_optional.ruser = obi_mmu_ptw_slave.ruser; - //assign i_cva6.obi_fetch_rsp.r.rid = obi_mmu_ptw_slave.rid; - //assign i_cva6.obi_fetch_rsp.r.r_optional.exokay = obi_mmu_ptw_slave.exokay; - //assign i_cva6.obi_fetch_rsp.rvalidpar = obi_mmu_ptw_slave.rvalidpar; - //assign i_cva6.obi_fetch_rsp.r.r_optional.rchk = obi_mmu_ptw_slave.rchk; + assign obi_mmu_ptw_slave.req = obi_mmu_ptw_req.req; + assign obi_mmu_ptw_slave.addr = obi_mmu_ptw_req.a.addr; + assign obi_mmu_ptw_slave.we = obi_mmu_ptw_req.a.we; + assign obi_mmu_ptw_slave.be = obi_mmu_ptw_req.a.be; + assign obi_mmu_ptw_slave.wdata = obi_mmu_ptw_req.a.wdata; + assign obi_mmu_ptw_slave.auser = obi_mmu_ptw_req.a.a_optional.auser; + assign obi_mmu_ptw_slave.wuser = obi_mmu_ptw_req.a.a_optional.wuser; + assign obi_mmu_ptw_slave.aid = obi_mmu_ptw_req.a.aid; + assign obi_mmu_ptw_slave.atop = obi_mmu_ptw_req.a.a_optional.atop; + assign obi_mmu_ptw_slave.memtype = obi_mmu_ptw_req.a.a_optional.memtype; + assign obi_mmu_ptw_slave.prot = obi_mmu_ptw_req.a.a_optional.prot; + assign obi_mmu_ptw_slave.reqpar = obi_mmu_ptw_req.reqpar; + assign obi_mmu_ptw_slave.achk = obi_mmu_ptw_req.a.a_optional.achk; + assign obi_mmu_ptw_slave.rready = obi_mmu_ptw_req.rready; + assign obi_mmu_ptw_slave.rreadypar = obi_mmu_ptw_req.rreadypar; + assign obi_mmu_ptw_rsp.gnt = obi_mmu_ptw_slave.gnt; + assign obi_mmu_ptw_rsp.gntpar = obi_mmu_ptw_slave.gntpar; + assign obi_mmu_ptw_rsp.rvalid = obi_mmu_ptw_slave.rvalid; + assign obi_mmu_ptw_rsp.r.rdata = obi_mmu_ptw_slave.rdata; + assign obi_mmu_ptw_rsp.r.err = obi_mmu_ptw_slave.err; + assign obi_mmu_ptw_rsp.r.r_optional.ruser = obi_mmu_ptw_slave.ruser; + assign obi_mmu_ptw_rsp.r.rid = obi_mmu_ptw_slave.rid; + assign obi_mmu_ptw_rsp.r.r_optional.exokay = obi_mmu_ptw_slave.exokay; + assign obi_mmu_ptw_rsp.rvalidpar = obi_mmu_ptw_slave.rvalidpar; + assign obi_mmu_ptw_rsp.r.r_optional.rchk = obi_mmu_ptw_slave.rchk; end if (CVA6Cfg.RVZCMT) begin @@ -494,13 +490,17 @@ module cva6_tb_wrapper .CVA6Cfg (CVA6Cfg), .rvfi_instr_t(rvfi_instr_t), .rvfi_csr_t(rvfi_csr_t), - .rvfi_probes_t(rvfi_probes_t) + .rvfi_probes_instr_t(rvfi_probes_instr_t), + .rvfi_probes_csr_t(rvfi_probes_csr_t), + .rvfi_probes_t(rvfi_probes_t), + .rvfi_to_iti_t(rvfi_to_iti_t) ) i_cva6_rvfi ( .clk_i (clk_i), .rst_ni (rst_ni), .rvfi_probes_i(rvfi_probes), - .rvfi_instr_o (rvfi_instr), - .rvfi_csr_o (rvfi_csr) + .rvfi_instr_o(rvfi_instr), + .rvfi_to_iti_o (rvfi_to_iti), + .rvfi_csr_o(rvfi_csr) ); rvfi_tracer #( @@ -558,7 +558,7 @@ module cva6_tb_wrapper AXI_BUS #( .AXI_ADDR_WIDTH(CVA6Cfg.AxiAddrWidth), .AXI_DATA_WIDTH(CVA6Cfg.AxiDataWidth), - .AXI_ID_WIDTH (ariane_axi_soc::IdWidthSlave), + .AXI_ID_WIDTH (CVA6Cfg.AxiIdWidth), .AXI_USER_WIDTH(CVA6Cfg.AxiUserWidth) ) cva6_axi_bus (); @@ -569,7 +569,7 @@ module cva6_tb_wrapper ); axi2mem #( - .AXI_ID_WIDTH (ariane_axi_soc::IdWidthSlave), + .AXI_ID_WIDTH (CVA6Cfg.AxiIdWidth), .AXI_ADDR_WIDTH(CVA6Cfg.AxiAddrWidth), .AXI_DATA_WIDTH(CVA6Cfg.AxiDataWidth), .AXI_USER_WIDTH(CVA6Cfg.AxiUserWidth) diff --git a/verif/tb/uvmt/uvmt_cva6_dut_wrap.sv b/verif/tb/uvmt/uvmt_cva6_dut_wrap.sv index 02170fe60a..61c199efca 100644 --- a/verif/tb/uvmt/uvmt_cva6_dut_wrap.sv +++ b/verif/tb/uvmt/uvmt_cva6_dut_wrap.sv @@ -22,6 +22,7 @@ module uvmt_cva6_dut_wrap # ( parameter type rvfi_probes_instr_t = logic, parameter type rvfi_probes_csr_t = logic, parameter type rvfi_probes_t = logic, + parameter type rvfi_to_iti_t = logic, // parameter int unsigned AXI_USER_EN = 0, parameter int unsigned NUM_WORDS = 2**25 @@ -58,6 +59,7 @@ module uvmt_cva6_dut_wrap # ( .rvfi_probes_instr_t(rvfi_probes_instr_t), .rvfi_probes_csr_t ( rvfi_probes_csr_t ), .rvfi_probes_t ( rvfi_probes_t ), + .rvfi_to_iti_t ( rvfi_to_iti_t ), // .AXI_USER_EN (AXI_USER_EN), .NUM_WORDS (NUM_WORDS) diff --git a/verif/tb/uvmt/uvmt_cva6_tb.sv b/verif/tb/uvmt/uvmt_cva6_tb.sv index b0c060c217..e91d745722 100644 --- a/verif/tb/uvmt/uvmt_cva6_tb.sv +++ b/verif/tb/uvmt/uvmt_cva6_tb.sv @@ -41,6 +41,7 @@ module uvmt_cva6_tb; localparam type rvfi_instr_t = `RVFI_INSTR_T(CVA6Cfg); localparam type rvfi_csr_elmt_t = `RVFI_CSR_ELMT_T(CVA6Cfg); localparam type rvfi_csr_t = `RVFI_CSR_T(CVA6Cfg, rvfi_csr_elmt_t); + localparam type rvfi_to_iti_t = `RVFI_TO_ITI_T(CVA6Cfg); // RVFI PROBES localparam type rvfi_probes_instr_t = `RVFI_PROBES_INSTR_T(CVA6Cfg); @@ -163,16 +164,18 @@ module uvmt_cva6_tb; .ACHK_WIDTH(CVA6Cfg.ObiLoadbusCfg.OptionalCfg.AChkWidth), .RCHK_WIDTH(CVA6Cfg.ObiLoadbusCfg.OptionalCfg.RChkWidth), .IS_1P2(1)) obi_load_assert(.obi(obi_load_if)); - //bind uvmt_cva6_dut_wrap uvma_obi_memory_assert_if_wrp #( - // .AUSER_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.AUserWidth), - // .WUSER_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.WUserWidth), - // .RUSER_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.RUserWidth), - // .ADDR_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.AddrWidth), - // .DATA_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.DataWidth), - // .ID_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.IdWidth), - // .ACHK_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.AChkWidth), - // .RCHK_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.RChkWidth), - // .IS_1P2(1)) obi_mmu_ptw_assert(.obi(obi_mmu_ptw_if)); + if (CVA6Cfg.MmuPresent) begin + bind uvmt_cva6_dut_wrap uvma_obi_memory_assert_if_wrp #( + .AUSER_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.AUserWidth), + .WUSER_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.WUserWidth), + .RUSER_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.RUserWidth), + .ADDR_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.AddrWidth), + .DATA_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.DataWidth), + .ID_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.IdWidth), + .ACHK_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.AChkWidth), + .RCHK_WIDTH(CVA6Cfg.ObiMmuPtwbusCfg.OptionalCfg.RChkWidth), + .IS_1P2(1)) obi_mmu_ptw_assert(.obi(obi_mmu_ptw_if)); + end end uvme_cva6_core_cntrl_if core_cntrl_if(); @@ -219,6 +222,7 @@ module uvmt_cva6_tb; .rvfi_probes_instr_t(rvfi_probes_instr_t ), .rvfi_probes_csr_t ( rvfi_probes_csr_t ), .rvfi_probes_t ( rvfi_probes_t ), + .rvfi_to_iti_t ( rvfi_to_iti_t ), // .AXI_USER_EN (CVA6Cfg.AXI_USER_EN), .NUM_WORDS (NUM_WORDS) @@ -507,6 +511,7 @@ module uvmt_cva6_tb; uvm_config_db#(virtual uvma_obi_memory_if)::set(.cntxt(null), .inst_name("*obi_memory_load_agent"), .field_name("vif"), .value(obi_load_if)); uvm_config_db#(virtual uvma_obi_memory_if)::set(.cntxt(null), .inst_name("*obi_memory_amo_agent"), .field_name("vif"), .value(obi_amo_if)); uvm_config_db#(virtual uvma_obi_memory_if)::set(.cntxt(null), .inst_name("*obi_memory_zcmt_agent"), .field_name("vif"), .value(obi_zcmt_if)); + uvm_config_db#(virtual uvma_obi_memory_if)::set(.cntxt(null), .inst_name("*obi_memory_mmu_ptw_agent"), .field_name("vif"), .value(obi_mmu_ptw_if)); uvm_config_db#(virtual uvmt_rvfi_if#( .CVA6Cfg(CVA6Cfg), .rvfi_instr_t(rvfi_instr_t), .rvfi_csr_t (rvfi_csr_t)))::set(.cntxt(null), .inst_name("*"), .field_name("rvfi_vif"), .value(rvfi_if)); uvm_config_db#(virtual uvme_cva6_core_cntrl_if)::set(.cntxt(null), .inst_name("*"), .field_name("core_cntrl_vif"), .value(core_cntrl_if)); uvm_config_db#(virtual uvma_interrupt_if)::set(.cntxt(null), .inst_name("*"), .field_name("interrupt_vif"), .value(interrupt_vif)); diff --git a/verif/tests/custom/ITI/iti_asm.S b/verif/tests/custom/ITI/iti_asm.S new file mode 100644 index 0000000000..de4e8674f3 --- /dev/null +++ b/verif/tests/custom/ITI/iti_asm.S @@ -0,0 +1,35 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 20/03/2025 +// Contributors: +// Darshak Sheladiya, SYSGO GmbH +// Umberto Laghi, UNIBO + +.section .text +.align 1 +.align 4 +.global branch_test +.type branch_test, @function + + +branch_test: + li x12,10 + loop: + bne x13,x13, branch_test + bne x13,x13, branch_test + bne x13,x13, branch_test + bne x13,x13, branch_test + la x11, branch_test + lw x10, 0(x11) + bne x13,x13, branch_test + bne x13,x13, branch_test + bne x13,x13, branch_test + bne x13,x13, branch_test + bne x13,x13, branch_test + bne x13,x13, branch_test + addi x12,x12, -1 + bne x12, x0, loop + + + jalr x0,0(ra) diff --git a/verif/tests/custom/ITI/test_iti_asm.c b/verif/tests/custom/ITI/test_iti_asm.c new file mode 100644 index 0000000000..bbb506395e --- /dev/null +++ b/verif/tests/custom/ITI/test_iti_asm.c @@ -0,0 +1,16 @@ +// Copyright (c) 2025 Thales DIS design services SAS +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// Author: Maxime Colson - Thales +// Date: 20/03/2025 +// Contributors: +// Darshak Sheladiya, SYSGO GmbH +// Umberto Laghi, UNIBO + +//This test will be improved by taking into account other scenarios + +void branch_test(); + +int main(int argc, char* arg[]) { + branch_test(); + return 0; +} diff --git a/verif/tests/custom/ITI/test_iti_asm.o b/verif/tests/custom/ITI/test_iti_asm.o new file mode 100755 index 0000000000..3aeb07aa9a Binary files /dev/null and b/verif/tests/custom/ITI/test_iti_asm.o differ diff --git a/verif/tests/custom/pmp/decreasing_entries_test.S b/verif/tests/custom/pmp/decreasing_entries_test.S new file mode 100644 index 0000000000..9ad2c3dc7c --- /dev/null +++ b/verif/tests/custom/pmp/decreasing_entries_test.S @@ -0,0 +1,98 @@ +# ------------------------------------------------------------------------------ +# Copyright 2024 Robert Bosch GmbH +# +# SPDX-License-Identifier: SHL-0.51 +# +# Original Author: Konstantinos LEVENTOS - Robert Bosch France SAS +# ------------------------------------------------------------------------------ +# decreasing_entries_test.S (TST04-4) +# ------------------------------------------------------------------------------ + + .text + .globl main +main: + + # Configure PMP using decreasing entries of TOR. + + # From 0xB000_0000 to 0xC000_0000 Read-Write-Execute. + li t0, 0x30000000 + csrw pmpaddr7, t0 + + # From 0xA000_0000 to 0xB000_0000 Read-Write-Execute. + li t0, 0x2c000000 + csrw pmpaddr6, t0 + + # From 0x9000_0000 to 0xA000_0000 Read-Write-Execute. + li t0, 0x28000000 + csrw pmpaddr5, t0 + + # From 0x8000_0000 to 0x9000_0000 Read-Write-Execute. + li t0, 0x24000000 + csrw pmpaddr4, t0 + + # From 0x0002_0000 to 0x8000_0000 no Permissions. + li t0, 0x20000000 + csrw pmpaddr3, t0 + + # From 0x0001_0000 to 0x0002_0000 only Execute. + li t0, 0x00008000 + csrw pmpaddr2, t0 + + # From 0x0000_1000 to 0x0001_0000 no Permissions. + li t0, 0x00004000 + csrw pmpaddr1, t0 + + # From 0x0000_0000 to 0x0000_1000 only Execute. + li t0, 0x00000400 + csrw pmpaddr0, t0 + + + # Addr 4-7 configs, written in cfg1, with LOCK OFF, and TOR. + li t0, 0x0f0f0f0f + csrw pmpcfg1, t0 + + # Addr 0-3 configs, written in cfg0, with LOCK OFF, and TOR. + li t0, 0x080c080c + csrw pmpcfg0, t0 + + + # Do the READ-WRITE test. + + # Check 1 read-write test, at 0x8800_0000. + li t1, 0x88000000 + li t2, 0xEFFACED1 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check 2 read-write test, at 0x9800_0000. + li t1, 0x98000000 + li t2, 0xACCEDED2 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check 3 read-write test, at 0xA800_0000. + li t1, 0xA8000000 + li t2, 0xDEFACED3 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check 4 read-write test, at 0xB800_0000. + li t1, 0xB8000000 + li t2, 0xDEC0DED4 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + +pass: + # Success post-processing + li a0, 0x0; + jal exit; + +fail: + # Failure post-processing + li a0, 0x1; + jal exit; diff --git a/verif/tests/custom/pmp/defined_matches_test.S b/verif/tests/custom/pmp/defined_matches_test.S new file mode 100644 index 0000000000..2df2a84512 --- /dev/null +++ b/verif/tests/custom/pmp/defined_matches_test.S @@ -0,0 +1,48 @@ +# ------------------------------------------------------------------------------ +# Copyright 2024 Robert Bosch GmbH +# +# SPDX-License-Identifier: SHL-0.51 +# +# Original Author: Konstantinos LEVENTOS - Robert Bosch France SAS +# ------------------------------------------------------------------------------ +# defined_matches_test.S (TST10-1, TST10-2) +# ------------------------------------------------------------------------------ + + .text + .globl main +main: + + # Check a Memory Access succeeds if no PMP entry is defined. + li t1, 0x90000000 + li t2, 0xC0D1F1ED + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Set up a PMP entry using NAPOT, from 0x8000_0000 to 0xA0000_0000, Read-Write-Execute. + li t0, 0x0000001f + csrw pmpcfg0, t0 + csrr t1, pmpcfg0 + bne t0, t1, fail + li t0, 0x23ffffff + csrw pmpaddr0, t0 + csrr t1, pmpaddr0 + bne t0, t1, fail + + # Check a memory access succeeds if no PMP entry matches. + li t1, 0xB0000000 + li t2, 0xCA5CADED + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + +pass: + # Success post-processing + li a0, 0x0; + jal exit; + +fail: + # Failure post-processing + li a0, 0x1; + jal exit; diff --git a/verif/tests/custom/pmp/double_entries_test.S b/verif/tests/custom/pmp/double_entries_test.S new file mode 100644 index 0000000000..a7e7ef988d --- /dev/null +++ b/verif/tests/custom/pmp/double_entries_test.S @@ -0,0 +1,72 @@ +# ------------------------------------------------------------------------------ +# Copyright 2024 Robert Bosch GmbH +# +# SPDX-License-Identifier: SHL-0.51 +# +# Original Author: Konstantinos LEVENTOS - Robert Bosch France SAS +# ------------------------------------------------------------------------------ +# double_entries_test.S (TST04-2) +# ------------------------------------------------------------------------------ + + .text + .globl main +main: + + # Set up PMP using NAPOT, from 0xB000_0000 to 0xC000_0000, Read-Write. + li t0, 0x001b0000 + csrw pmpcfg1, t0 + csrr t1, pmpcfg1 + bne t0, t1, fail + li t0, 0x2dffffff + csrw pmpaddr6, t0 + csrr t1, pmpaddr6 + bne t0, t1, fail + + # Set up PMP using NAPOT, from 0x8000_0000 to 0x9000_0000, Read-Write. + li t0, 0x001b0000 + csrw pmpcfg0, t0 + csrr t1, pmpcfg0 + bne t0, t1, fail + li t0, 0x21ffffff + csrw pmpaddr2, t0 + csrr t1, pmpaddr2 + bne t0, t1, fail + + # Read-Write check in 0xB800_0000. + li t1, 0xB8000000 + li t2, 0xC0D1F1ED + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Read-Write check in 0x8800_0000. + li t1, 0x88000000 + li t2, 0xCA5CADED + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check that all other addr / cfg are zero. + csrr t0, pmpaddr0 + bne t0, zero, fail + csrr t0, pmpaddr1 + bne t0, zero, fail + csrr t0, pmpaddr3 + bne t0, zero, fail + csrr t0, pmpaddr4 + bne t0, zero, fail + csrr t0, pmpaddr5 + bne t0, zero, fail + csrr t0, pmpaddr7 + bne t0, zero, fail + + +pass: + # Success post-processing + li a0, 0x0; + jal exit; + +fail: + # Failure post-processing + li a0, 0x1; + jal exit; diff --git a/verif/tests/custom/pmp/exact_csrr_test.S b/verif/tests/custom/pmp/exact_csrr_test.S new file mode 100644 index 0000000000..a5839c029e --- /dev/null +++ b/verif/tests/custom/pmp/exact_csrr_test.S @@ -0,0 +1,99 @@ +# ------------------------------------------------------------------------------ +# Copyright 2024 Robert Bosch GmbH +# +# SPDX-License-Identifier: SHL-0.51 +# +# Original Author: Konstantinos LEVENTOS - Robert Bosch France SAS +# ------------------------------------------------------------------------------ +# exact_csrr_test.S (TST05-1) +# ------------------------------------------------------------------------------ + + .text + .globl main +main: + + # Write in addresses and check what is written. + + # Checking PMP ADDR 0 + li t0, 0xFACADE00 + csrw pmpaddr0, t0 + csrr t1, pmpaddr0 + bne t0, t1, fail + csrw pmpaddr0, zero + + # Checking PMP ADDR 1 + li t0, 0xFACADE02 + csrw pmpaddr1, t0 + csrr t1, pmpaddr1 + bne t0, t1, fail + csrw pmpaddr1, zero + + # Checking PMP ADDR 2 + li t0, 0xFACADE04 + csrw pmpaddr2, t0 + csrr t1, pmpaddr2 + bne t0, t1, fail + csrw pmpaddr2, zero + + # Checking PMP ADDR 3 + li t0, 0xFACADE06 + csrw pmpaddr3, t0 + csrr t1, pmpaddr3 + bne t0, t1, fail + csrw pmpaddr3, zero + + # Checking PMP ADDR 4 + li t0, 0xFACADE08 + csrw pmpaddr4, t0 + csrr t1, pmpaddr4 + bne t0, t1, fail + csrw pmpaddr4, zero + + # Checking PMP ADDR 5 + li t0, 0xFACADE0A + csrw pmpaddr5, t0 + csrr t1, pmpaddr5 + bne t0, t1, fail + csrw pmpaddr5, zero + + # Checking PMP ADDR 6 + li t0, 0xFACADE0C + csrw pmpaddr6, t0 + csrr t1, pmpaddr6 + bne t0, t1, fail + csrw pmpaddr6, zero + + # Checking PMP ADDR 7 + li t0, 0xFACADE0E + csrw pmpaddr7, t0 + csrr t1, pmpaddr7 + bne t0, t1, fail + csrw pmpaddr7, zero + + + # Write in configurations and check what is written, except for the reserved combinations with R=0 and W=1. + + # Checking PMP CFG 0 + li t0, 0x01030304 + csrw pmpcfg0, t0 + csrr t1, pmpcfg0 + bne t0, t1, fail + csrw pmpcfg0, zero + + # Checking PMP CFG 1 + li t0, 0x04050507 + csrw pmpcfg1, t0 + csrr t1, pmpcfg1 + bne t0, t1, fail + csrw pmpcfg1, zero + + +pass: + # Success post-processing + li a0, 0x0; + jal exit; + +fail: + # Failure post-processing + li a0, 0x1; + jal exit; diff --git a/verif/tests/custom/pmp/granularity_test.S b/verif/tests/custom/pmp/granularity_test.S new file mode 100644 index 0000000000..e341d0c8ad --- /dev/null +++ b/verif/tests/custom/pmp/granularity_test.S @@ -0,0 +1,44 @@ +# ------------------------------------------------------------------------------ +# Copyright 2024 Robert Bosch GmbH +# +# SPDX-License-Identifier: SHL-0.51 +# +# Original Author: Konstantinos LEVENTOS - Robert Bosch France SAS +# ------------------------------------------------------------------------------ +# granularity_test.S (TST01) +# ------------------------------------------------------------------------------ + + .text + .globl main +main: + + # Configure PMP to find its granularity. + + # Write all zeroes in cfg0. + li t0, 0 + csrw pmpcfg0, t0 + + # Write all ones in addr0. + li t1, -1 + csrw pmpaddr0, t1 + + # Read the value back. + csrr t2, pmpaddr0 + + # Check for granularity 8 = 2^(1+2) <=> G = 1. + # As per: https://docs.openhwgroup.org/projects/cva6-user-manual/01_cva6_user/PMP.html + # Which states: The PMP grain is 2**G+2. Only a PMP granularity of 8 bytes (G=1) is supported in CVA6. + # And from the RISC-V Spec: G is the index of the least-significant bit set, the PMP granularity is 2^(G+2) bytes. + li t3, 0xFFFFFFFE + bne t2, t3, fail + + +pass: + # Success post-processing + li a0, 0x0; + jal exit; + +fail: + # Failure post-processing + li a0, 0x1; + jal exit; diff --git a/verif/tests/custom/pmp/locked_outside_napot_test.S b/verif/tests/custom/pmp/locked_outside_napot_test.S new file mode 100644 index 0000000000..cc653b1cff --- /dev/null +++ b/verif/tests/custom/pmp/locked_outside_napot_test.S @@ -0,0 +1,45 @@ +# ------------------------------------------------------------------------------ +# Copyright 2024 Robert Bosch GmbH +# +# SPDX-License-Identifier: SHL-0.51 +# +# Original Author: Konstantinos LEVENTOS - Robert Bosch France SAS +# ------------------------------------------------------------------------------ +# locked_outside_napot_test.S (TST14-26, TST14-36) +# ------------------------------------------------------------------------------ + + .text + .globl main +main: + + # Set up PMP using NAPOT, from 0x8000_0000 to 0xB000_0000. + li t2, 0x25ffffff + csrw pmpaddr0, t2 + + # Configure it with LOCK ON, Read-Write-Execute. + li t0, 0x0000009f + csrw pmpcfg0, t0 + csrr t1, pmpcfg0 + bne t0, t1, fail + + # Check pmpaddr after switching to NAPOT (and lock) + csrr t0, pmpaddr0 + bne t0, t2, fail + + # Check a memory access succeeds when outside the LOCKED entry. + li t1, 0xB8000000 + li t2, 0xC0D1F1ED + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + +pass: + # Success post-processing + li a0, 0x0; + jal exit; + +fail: + # Failure post-processing + li a0, 0x1; + jal exit; diff --git a/verif/tests/custom/pmp/locked_outside_tor_test.S b/verif/tests/custom/pmp/locked_outside_tor_test.S new file mode 100644 index 0000000000..6db06b9566 --- /dev/null +++ b/verif/tests/custom/pmp/locked_outside_tor_test.S @@ -0,0 +1,61 @@ +# ------------------------------------------------------------------------------ +# Copyright 2024 Robert Bosch GmbH +# +# SPDX-License-Identifier: SHL-0.51 +# +# Original Author: Konstantinos LEVENTOS - Robert Bosch France SAS +# ------------------------------------------------------------------------------ +# locked_outside_tor_test.S (TST16-26, TST16-36) +# ------------------------------------------------------------------------------ + + .text + .globl main +main: + + # From 0x0000_0000 to 0x0000_1000 only Execute. + li t0, 0x00000400 + csrw pmpaddr0, t0 + + # From 0x0000_1000 to 0x0001_0000 no Permissions. + li t0, 0x00004000 + csrw pmpaddr1, t0 + + # From 0x0001_0000 to 0x0002_0000 only Execute. + li t0, 0x00008000 + csrw pmpaddr2, t0 + + # From 0x0002_0000 to 0x8000_0000 no Permissions. + li t0, 0x20000000 + csrw pmpaddr3, t0 + + # From 0x8000_0000 to 0xB000_0000 Read-Write-Execute. + li t0, 0x2C000000 + csrw pmpaddr4, t0 + + # Configure the TOR areas with LOCK ON. + li t0, 0x888c888c + csrw pmpcfg0, t0 + csrr t1, pmpcfg0 + bne t0, t1, fail + li t0, 0x0000008f + csrw pmpcfg1, t0 + csrr t1, pmpcfg1 + bne t0, t1, fail + + # Check a memory access succeeds when outside the LOCKED entry. + li t1, 0xB8000000 + li t2, 0xC0D1F1ED + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + +pass: + # Success post-processing + li a0, 0x0; + jal exit; + +fail: + # Failure post-processing + li a0, 0x1; + jal exit; diff --git a/verif/tests/custom/pmp/lsu_napot_test.S b/verif/tests/custom/pmp/lsu_napot_test.S new file mode 100644 index 0000000000..9a7c97fb4e --- /dev/null +++ b/verif/tests/custom/pmp/lsu_napot_test.S @@ -0,0 +1,111 @@ +# ------------------------------------------------------------------------------ +# Copyright 2024 Robert Bosch GmbH +# +# SPDX-License-Identifier: SHL-0.51 +# +# Original Author: Konstantinos LEVENTOS - Robert Bosch France SAS +# ------------------------------------------------------------------------------ +# lsu_napot_test.S (TST14-11, TST14-21, TST14-31) +# ------------------------------------------------------------------------------ + + .text + .globl main +main: + + # Configure PMP using NAPOT. + + # From 0x0000_0000 to 0x0000_1000 only Execute. + li t0, 0x000001ff + csrw pmpaddr0, t0 + + # From 0x0001_0000 to 0x0002_0000 only Execute. + li t0, 0x00005fff + csrw pmpaddr1, t0 + + # From 0x8000_0000 to 0xC000_0000 Read-Write-Execute. + li t0, 0x27ffffff + csrw pmpaddr2, t0 + + + # Addr 0-2 configs, written in cfg0, with LOCK OFF, and NAPOT. + li t0, 0x001f1c1c + csrw pmpcfg0, t0 + csrr t1, pmpcfg0 + bne t0, t1, fail + + + # Do the READ-WRITE test. + + # Check 1 read-write test, at 0x8000_0000. + li t1, 0x80000000 + li t2, 0xEFFACED1 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check 2 read-write test, at 0x9000_0000. + li t1, 0x90000000 + li t2, 0xACCEDED2 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check 3 read-write test, at 0xA000_0000. + li t1, 0xA0000000 + li t2, 0xDEFACED3 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check 4 read-write test, at 0xB000_0000. + li t1, 0xB0000000 + li t2, 0xDEC0DED4 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + + # Do the EXEC "RET" test. + + # Exec test 1, at 0x0000_0800. + li t0, 0x00000800 + li t1, 0x8082 + sw t1, 0(t0) + lw t2, 0(t0) + bne t1, t2, fail + jalr t0 + + # Exec test 2, at 0x0001_8000. + li t0, 0x00018000 + li t1, 0x8082 + sw t1, 0(t0) + lw t2, 0(t0) + bne t1, t2, fail + jalr t0 + + # Exec test 3, at 0x9800_0000. + li t0, 0x98000000 + li t1, 0x8082 + sw t1, 0(t0) + lw t2, 0(t0) + bne t1, t2, fail + jalr t0 + + # Exec test 4, at 0xA800_0000. + li t0, 0xA8000000 + li t1, 0x8082 + sw t1, 0(t0) + lw t2, 0(t0) + bne t1, t2, fail + jalr t0 + + +pass: + # Success post-processing + li a0, 0x0; + jal exit; + +fail: + # Failure post-processing + li a0, 0x1; + jal exit; diff --git a/verif/tests/custom/pmp/lsu_tor_test.S b/verif/tests/custom/pmp/lsu_tor_test.S new file mode 100644 index 0000000000..7989e66239 --- /dev/null +++ b/verif/tests/custom/pmp/lsu_tor_test.S @@ -0,0 +1,125 @@ +# ------------------------------------------------------------------------------ +# Copyright 2024 Robert Bosch GmbH +# +# SPDX-License-Identifier: SHL-0.51 +# +# Original Author: Konstantinos LEVENTOS - Robert Bosch France SAS +# ------------------------------------------------------------------------------ +# lsu_tor_test.S (TST16-11, TST16-21, TST16-31) +# ------------------------------------------------------------------------------ + + .text + .globl main +main: + + # Configure PMP using TOR. + + # From 0x0000_0000 to 0x0000_1000 only Execute. + li t0, 0x00000400 + csrw pmpaddr0, t0 + + # From 0x0000_1000 to 0x0001_0000 no Permissions. + li t0, 0x00004000 + csrw pmpaddr1, t0 + + # From 0x0001_0000 to 0x0002_0000 only Execute. + li t0, 0x00008000 + csrw pmpaddr2, t0 + + # From 0x0002_0000 to 0x8000_0000 no Permissions. + li t0, 0x20000000 + csrw pmpaddr3, t0 + + # From 0x8000_0000 to 0xC000_0000 Read-Write-Execute. + li t0, 0x30000000 + csrw pmpaddr4, t0 + + + # Addr 0-3 configs, written in cfg0, with LOCK OFF, and TOR. + li t0, 0x080c080c + csrw pmpcfg0, t0 + csrr t1, pmpcfg0 + bne t0, t1, fail + + # Addr 4 config, written in cfg1, with LOCK OFF, and TOR. + li t0, 0x0000000f + csrw pmpcfg1, t0 + csrr t1, pmpcfg1 + bne t0, t1, fail + + + # Do the READ-WRITE test. + + # Check 1 read-write test, at 0x8000_0000. + li t1, 0x80000000 + li t2, 0xEFFACED1 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check 2 read-write test, at 0x9000_0000. + li t1, 0x90000000 + li t2, 0xACCEDED2 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check 3 read-write test, at 0xA000_0000. + li t1, 0xA0000000 + li t2, 0xDEFACED3 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + # Check 4 read-write test, at 0xB000_0000. + li t1, 0xB0000000 + li t2, 0xDEC0DED4 + sw t2, 0(t1) + lw t3, 0(t1) + bne t2, t3, fail + + + # Do the EXEC "RET" test. + + # Exec test 1, at 0x0000_0800. + li t0, 0xA0000800 + li t1, 0x8082 + sw t1, 0(t0) + lw t2, 0(t0) + bne t1, t2, fail + jalr t0 + + # Exec test 2, at 0x0001_8000. + li t0, 0xB0018000 + li t1, 0x8082 + sw t1, 0(t0) + lw t2, 0(t0) + bne t1, t2, fail + jalr t0 + + # Exec test 3, at 0x9800_0000. + li t0, 0x98000000 + li t1, 0x8082 + sw t1, 0(t0) + lw t2, 0(t0) + bne t1, t2, fail + jalr t0 + + # Exec test 4, at 0xA800_0000. + li t0, 0xA8000000 + li t1, 0x8082 + sw t1, 0(t0) + lw t2, 0(t0) + bne t1, t2, fail + jalr t0 + + +pass: + # Success post-processing + li a0, 0x0; + jal exit; + +fail: + # Failure post-processing + li a0, 0x1; + jal exit; diff --git a/verif/tests/custom/zcmt/cm_jalt.S b/verif/tests/custom/zcmt/cm_jalt.S deleted file mode 100644 index 46e1ff79ab..0000000000 --- a/verif/tests/custom/zcmt/cm_jalt.S +++ /dev/null @@ -1,62 +0,0 @@ -.globl _start -_start: - la t0, trap_handler - csrw mtvec, t0 - - la a1, target1 - la t0, __jvt_base$ - - sw a1, 128(t0) //cm.jalt entry start from index >=32 - - csrw jvt, t0 - - fence.i - # Perform jump using the index from JVT - cm.jalt 32 - - li t1, 1 - addi x20,x20, 9 - j write_tohost - - - - -exit: - j write_tohost - -write_tohost: - li x1, 1 - la t0, tohost - sw x1, 0(t0) - j write_tohost - - -# Jump Vector Table (JVT) Section -# Create a separate section for the JVT -.section .riscv.jvt, "ax" -.align 6 # Align the JVT on a 64-byte boundary (6 = 2^6 = 64) -__jvt_base$: - .word 0x80000054 - .word 0x80000800 - .word 0x80000802 - .word 0x80000804 - -# Target Addresses (Where cm.jalt will jump) -target0: - li x5, 99 - j write_tohost -target1: - li x2, 99 - j write_tohost - -target2: - addi x2,x20, 5 - j write_tohost - - -trap_handler: - j exit - - -.align 6; .global tohost; tohost: .dword 0; -.align 6; .global fromhost; fromhost: .dword 0; diff --git a/verif/tests/custom/zcmt/cm_jalt_long.S b/verif/tests/custom/zcmt/cm_jalt_long.S index 51f0e3f002..9031394875 100644 --- a/verif/tests/custom/zcmt/cm_jalt_long.S +++ b/verif/tests/custom/zcmt/cm_jalt_long.S @@ -1,59 +1,57 @@ -.globl _start -_start: - la t0, trap_handler - csrw mtvec, t0 +#include "riscv_test.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + + la t0, trap_handler + csrw mtvec, t0 la a1, target1 la t0, __jvt_base$ - sw a1, 128(t0) //cm.jalt entry start from index >=32 + sw a1, 256(t0) // cm.jalt entry start from index >=32 - csrw jvt, t0 + csrw jvt, t0 fence.i - # Perform jump using the index from JVT - cm.jalt 32 + //Perform jump using the index from JVT + cm.jalt 64 li t1, 1 - addi x20,x20, 9 - j write_tohost - - -exit: - j write_tohost - -write_tohost: - li x1, 1 - la t0, tohost - sw x1, 0(t0) - j write_tohost - + addi x20, x20, 9 + j failure -# Jump Vector Table (JVT) Section -# Create a separate section for the JVT -.section .riscv.jvt, "ax" -.align 6 # Align the JVT on a 64-byte boundary (6 = 2^6 = 64) -__jvt_base$: - .word 0x80000054 - .word 0x80000800 - .word 0x80000802 - .word 0x80000804 - -# Target Addresses (Where cm.jalt will jump) -.align 20 target1: li x2, 99 - lui t0, %hi(write_tohost) # Load upper 20 bits of target address into t0 - addi t0, t0, %lo(write_tohost) # Add the lower 12 bits to t0 - jalr x0, 0(t0) - - + j success trap_handler: - lui t0, %hi(write_tohost) # Load upper 20 bits of target address into t0 - addi t0, t0, %lo(write_tohost) # Add the lower 12 bits to t0 - jalr x0, 0(t0) - - -.align 6; .global tohost; tohost: .dword 0; -.align 6; .global fromhost; fromhost: .dword 0; \ No newline at end of file + j failure + +// jump to this label to signal that the test failed +failure: + li x1, 1 + slli x1, x1, 1 + addi x1, x1, 1 + sw x1, tohost, t5 + self_loop_2: j self_loop_2 + +// jump to this label to signal that the test passed +success: + li x1, 0 + slli x1, x1, 1 + addi x1, x1, 1 + sw x1, tohost, t5 + self_loop: j self_loop + + +RVTEST_CODE_END + +.data +RVTEST_DATA_BEGIN + // Jump Vector Table (JVT) + .align 6 +__jvt_base$: + .space 256 //Reserve space for indices 0-63 (unused) + .word 0 //Entry 64 (will be overwritten by test) +RVTEST_DATA_END \ No newline at end of file diff --git a/verif/tests/custom/zcmt/cm_jalt_long_ret.S b/verif/tests/custom/zcmt/cm_jalt_long_ret.S index 7dfc6f0a4b..28969110ee 100644 --- a/verif/tests/custom/zcmt/cm_jalt_long_ret.S +++ b/verif/tests/custom/zcmt/cm_jalt_long_ret.S @@ -1,57 +1,61 @@ -.globl _start -_start: - la t0, trap_handler - csrw mtvec, t0 +#include "riscv_test.h" + +RVTEST_RV32M +RVTEST_CODE_BEGIN + + la t0, trap_handler + csrw mtvec, t0 la a1, target1 la t0, __jvt_base$ - sw a1, 128(t0) //cm.jalt entry start from index >=32 + sw a1, 256(t0) // cm.jalt entry start from index >=32 - csrw jvt, t0 + csrw jvt, t0 fence.i - # Perform jump using the index from JVT - cm.jalt 32 + cm.jalt 64 li t1, 1 - addi x20,x20, 9 - j write_tohost - - -exit: - j write_tohost + addi x20, x20, 9 + j success -write_tohost: - li x1, 1 - la t0, tohost - sw x1, 0(t0) - j write_tohost +// trap handler +trap_handler: + lui t0, %hi(failure) # Load upper 20 bits of address of 'success' into t0 + addi t0, t0, %lo(failure) # Add lower 12 bits to form full address + jalr x0, 0(t0) -# Jump Vector Table (JVT) Section -# Create a separate section for the JVT -.section .riscv.jvt, "ax" -.align 6 # Align the JVT on a 64-byte boundary (6 = 2^6 = 64) -__jvt_base$: - .word 0x80000054 - .word 0x80000800 - .word 0x80000802 - .word 0x80000804 - -# Target Addresses (Where cm.jalt will jump) -.align 20 +// cm.jalt target label target1: li x2, 99 ret - - -trap_handler: - lui t0, %hi(write_tohost) # Load upper 20 bits of target address into t0 - addi t0, t0, %lo(write_tohost) # Add the lower 12 bits to t0 - jalr x0, 0(t0) +// failure path +failure: + li x1, 1 + slli x1, x1, 1 + addi x1, x1, 1 + sw x1, tohost, t5 + self_loop_2: j self_loop_2 + +// success path +success: + li x1, 0 + slli x1, x1, 1 + addi x1, x1, 1 + sw x1, tohost, t5 + self_loop: j self_loop -.align 6; .global tohost; tohost: .dword 0; -.align 6; .global fromhost; fromhost: .dword 0; \ No newline at end of file +RVTEST_CODE_END + +.data +RVTEST_DATA_BEGIN + + .align 6 +__jvt_base$: + .space 256 //Reserve space for indices 0-63 (unused) + .word 0 //Entry 64 (will be overwritten by test) +RVTEST_DATA_END \ No newline at end of file diff --git a/verif/tests/custom/zcmt/cm_jalt_ret.S b/verif/tests/custom/zcmt/cm_jalt_ret.S deleted file mode 100644 index 82eaf36cc4..0000000000 --- a/verif/tests/custom/zcmt/cm_jalt_ret.S +++ /dev/null @@ -1,62 +0,0 @@ -.globl _start -_start: - la t0, trap_handler - csrw mtvec, t0 - - la a1, target1 - la t0, __jvt_base$ - - sw a1, 128(t0) //cm.jalt entry start from index >=32 - - csrw jvt, t0 - - fence.i - # Perform jump using the index from JVT - cm.jalt 32 - - li t1, 1 - addi x20,x20, 9 - j write_tohost - - - - -exit: - j write_tohost - -write_tohost: - li x1, 1 - la t0, tohost - sw x1, 0(t0) - j write_tohost - - -# Jump Vector Table (JVT) Section -# Create a separate section for the JVT -.section .riscv.jvt, "ax" -.align 6 # Align the JVT on a 64-byte boundary (6 = 2^6 = 64) -__jvt_base$: - .word 0x80000054 - .word 0x80000800 - .word 0x80000802 - .word 0x80000804 - -# Target Addresses (Where cm.jalt will jump) -target0: - li x5, 9 - j write_tohost -target1: - li x2, 99 - ret - -target2: - addi x2,x20, 5 - j write_tohost - - -trap_handler: - j exit - - -.align 6; .global tohost; tohost: .dword 0; -.align 6; .global fromhost; fromhost: .dword 0; diff --git a/verif/tests/custom/zcmt/cm_jt.S b/verif/tests/custom/zcmt/cm_jt.S deleted file mode 100644 index b2dd88a49c..0000000000 --- a/verif/tests/custom/zcmt/cm_jt.S +++ /dev/null @@ -1,58 +0,0 @@ -.globl _start -_start: - la t0, trap_handler - csrw mtvec, t0 - - la a1, target1 - la t0, __jvt_base$ - - sw a1, 0(t0) - - csrw jvt, t0 - - fence.i - - cm.jt 0 # Perform jump using the index 0 from JVT - - addi x18,x18, 3 - j target2 - -exit: - j write_tohost - -write_tohost: - li x1, 1 - la t0, tohost - sw x1, 0(t0) - j write_tohost - - - -# Jump Vector Table (JVT) Section -# Create a separate section for the JVT -.section .riscv.jvt, "ax" -.align 6 # Align the JVT on a 64-byte boundary (6 = 2^6 = 64) -__jvt_base$: - .word 0x80000054 - .word 0x80000800 - .word 0x80000802 - .word 0x80000804 - -# Target Addresses (Where cm.jt will jump) -target0: - j write_tohost -target1: - addi x6,x0, 7 - j write_tohost - -target2: - addi x2,x20, 5 - j write_tohost - - -trap_handler: - j exit - - -.align 6; .global tohost; tohost: .dword 0; -.align 6; .global fromhost; fromhost: .dword 0; diff --git a/verif/tests/custom/zcmt/cm_jt_long.S b/verif/tests/custom/zcmt/cm_jt_long.S index 5020464ad2..29a7aa658d 100644 --- a/verif/tests/custom/zcmt/cm_jt_long.S +++ b/verif/tests/custom/zcmt/cm_jt_long.S @@ -1,5 +1,8 @@ -.globl _start -_start: +#include "riscv_test.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + la t0, trap_handler csrw mtvec, t0 @@ -15,38 +18,48 @@ _start: cm.jt 0 # Perform jump using the index 0 from JVT addi x18,x18, 3 + j failure -write_tohost: - li x1, 1 - la t0, tohost - sw x1, 0(t0) - j write_tohost - - - -# Jump Vector Table (JVT) Section -# Create a separate section for the JVT -.section .riscv.jvt, "ax" -.align 6 # Align the JVT on a 64-byte boundary (6 = 2^6 = 64) -__jvt_base$: - .word 0x80000054 - .word 0x80000800 - .word 0x80000802 - .word 0x80000804 - -# Target Addresses (Where cm.jt will jump) -.align 20 target1: addi x6,x0, 6 - la t0, write_tohost # Load upper 20 bits of target address into t0 - jalr x0, 0(t0) + j success trap_handler: - lui t0, %hi(write_tohost) # Load upper 20 bits of target address into t0 - addi t0, t0, %lo(write_tohost) # Add the lower 12 bits to t0 + lui t0, %hi(failure) # Load upper 20 bits of target address into t0 + addi t0, t0, %lo(failure) # Add the lower 12 bits to t0 jalr x0, 0(t0) +// jump to this label to signal that the test failed +failure: + li x1, 1 + slli x1, x1, 1 + addi x1, x1, 1 + sw x1, tohost, t5 + self_loop_2: j self_loop_2 + +// jump to this label to signal that the test passed +success: + li x1, 0 + slli x1, x1, 1 + addi x1, x1, 1 + sw x1, tohost, t5 + self_loop: j self_loop + +RVTEST_CODE_END + +.data + +RVTEST_DATA_BEGIN + +// Jump Vector Table (JVT) Section +.section .riscv.jvt, "ax" +.align 6 +__jvt_base$: + .word 0x80000054 + .word 0x80000800 + .word 0x80000802 + .word 0x80000804 + -.align 6; .global tohost; tohost: .dword 0; -.align 6; .global fromhost; fromhost: .dword 0; +RVTEST_DATA_END \ No newline at end of file diff --git a/verif/tests/custom/zcmt/encoding.h b/verif/tests/custom/zcmt/encoding.h new file mode 100644 index 0000000000..696e55a9ed --- /dev/null +++ b/verif/tests/custom/zcmt/encoding.h @@ -0,0 +1,1475 @@ +// See LICENSE for license details. + +#ifndef RISCV_CSR_ENCODING_H +#define RISCV_CSR_ENCODING_H + +#define MSTATUS_UIE 0x00000001 +#define MSTATUS_SIE 0x00000002 +#define MSTATUS_HIE 0x00000004 +#define MSTATUS_MIE 0x00000008 +#define MSTATUS_UPIE 0x00000010 +#define MSTATUS_SPIE 0x00000020 +#define MSTATUS_HPIE 0x00000040 +#define MSTATUS_MPIE 0x00000080 +#define MSTATUS_SPP 0x00000100 +#define MSTATUS_HPP 0x00000600 +#define MSTATUS_MPP 0x00001800 +#define MSTATUS_FS 0x00006000 +#define MSTATUS_XS 0x00018000 +#define MSTATUS_MPRV 0x00020000 +#define MSTATUS_SUM 0x00040000 +#define MSTATUS_MXR 0x00080000 +#define MSTATUS_TVM 0x00100000 +#define MSTATUS_TW 0x00200000 +#define MSTATUS_TSR 0x00400000 +#define MSTATUS32_SD 0x80000000 +#define MSTATUS_UXL 0x0000000300000000 +#define MSTATUS_SXL 0x0000000C00000000 +#define MSTATUS64_SD 0x8000000000000000 + +#define SSTATUS_UIE 0x00000001 +#define SSTATUS_SIE 0x00000002 +#define SSTATUS_UPIE 0x00000010 +#define SSTATUS_SPIE 0x00000020 +#define SSTATUS_SPP 0x00000100 +#define SSTATUS_FS 0x00006000 +#define SSTATUS_XS 0x00018000 +#define SSTATUS_SUM 0x00040000 +#define SSTATUS_MXR 0x00080000 +#define SSTATUS32_SD 0x80000000 +#define SSTATUS_UXL 0x0000000300000000 +#define SSTATUS64_SD 0x8000000000000000 + +#define DCSR_XDEBUGVER (3U<<30) +#define DCSR_NDRESET (1<<29) +#define DCSR_FULLRESET (1<<28) +#define DCSR_EBREAKM (1<<15) +#define DCSR_EBREAKH (1<<14) +#define DCSR_EBREAKS (1<<13) +#define DCSR_EBREAKU (1<<12) +#define DCSR_STOPCYCLE (1<<10) +#define DCSR_STOPTIME (1<<9) +#define DCSR_CAUSE (7<<6) +#define DCSR_DEBUGINT (1<<5) +#define DCSR_HALT (1<<3) +#define DCSR_STEP (1<<2) +#define DCSR_PRV (3<<0) + +#define DCSR_CAUSE_NONE 0 +#define DCSR_CAUSE_SWBP 1 +#define DCSR_CAUSE_HWBP 2 +#define DCSR_CAUSE_DEBUGINT 3 +#define DCSR_CAUSE_STEP 4 +#define DCSR_CAUSE_HALT 5 + +#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) +#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) +#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) + +#define MCONTROL_SELECT (1<<19) +#define MCONTROL_TIMING (1<<18) +#define MCONTROL_ACTION (0x3f<<12) +#define MCONTROL_CHAIN (1<<11) +#define MCONTROL_MATCH (0xf<<7) +#define MCONTROL_M (1<<6) +#define MCONTROL_H (1<<5) +#define MCONTROL_S (1<<4) +#define MCONTROL_U (1<<3) +#define MCONTROL_EXECUTE (1<<2) +#define MCONTROL_STORE (1<<1) +#define MCONTROL_LOAD (1<<0) + +#define MCONTROL_TYPE_NONE 0 +#define MCONTROL_TYPE_MATCH 2 + +#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 +#define MCONTROL_ACTION_DEBUG_MODE 1 +#define MCONTROL_ACTION_TRACE_START 2 +#define MCONTROL_ACTION_TRACE_STOP 3 +#define MCONTROL_ACTION_TRACE_EMIT 4 + +#define MCONTROL_MATCH_EQUAL 0 +#define MCONTROL_MATCH_NAPOT 1 +#define MCONTROL_MATCH_GE 2 +#define MCONTROL_MATCH_LT 3 +#define MCONTROL_MATCH_MASK_LOW 4 +#define MCONTROL_MATCH_MASK_HIGH 5 + +#define MIP_SSIP (1 << IRQ_S_SOFT) +#define MIP_HSIP (1 << IRQ_H_SOFT) +#define MIP_MSIP (1 << IRQ_M_SOFT) +#define MIP_STIP (1 << IRQ_S_TIMER) +#define MIP_HTIP (1 << IRQ_H_TIMER) +#define MIP_MTIP (1 << IRQ_M_TIMER) +#define MIP_SEIP (1 << IRQ_S_EXT) +#define MIP_HEIP (1 << IRQ_H_EXT) +#define MIP_MEIP (1 << IRQ_M_EXT) + +#define SIP_SSIP MIP_SSIP +#define SIP_STIP MIP_STIP + +#define PRV_U 0 +#define PRV_S 1 +#define PRV_H 2 +#define PRV_M 3 + +#define SATP32_MODE 0x80000000 +#define SATP32_ASID 0x7FC00000 +#define SATP32_PPN 0x003FFFFF +#define SATP64_MODE 0xF000000000000000 +#define SATP64_ASID 0x0FFFF00000000000 +#define SATP64_PPN 0x00000FFFFFFFFFFF + +#define SATP_MODE_OFF 0 +#define SATP_MODE_SV32 1 +#define SATP_MODE_SV39 8 +#define SATP_MODE_SV48 9 +#define SATP_MODE_SV57 10 +#define SATP_MODE_SV64 11 + +#define PMP_R 0x01 +#define PMP_W 0x02 +#define PMP_X 0x04 +#define PMP_A 0x18 +#define PMP_L 0x80 +#define PMP_SHIFT 2 + +#define PMP_TOR 0x08 +#define PMP_NA4 0x10 +#define PMP_NAPOT 0x18 + +#define IRQ_S_SOFT 1 +#define IRQ_H_SOFT 2 +#define IRQ_M_SOFT 3 +#define IRQ_S_TIMER 5 +#define IRQ_H_TIMER 6 +#define IRQ_M_TIMER 7 +#define IRQ_S_EXT 9 +#define IRQ_H_EXT 10 +#define IRQ_M_EXT 11 +#define IRQ_COP 12 +#define IRQ_HOST 13 + +#define DEFAULT_RSTVEC 0x00001000 +#define CLINT_BASE 0x02000000 +#define CLINT_SIZE 0x000c0000 +#define EXT_IO_BASE 0x40000000 +#define DRAM_BASE 0x80000000 + +// page table entry (PTE) fields +#define PTE_V 0x001 // Valid +#define PTE_R 0x002 // Read +#define PTE_W 0x004 // Write +#define PTE_X 0x008 // Execute +#define PTE_U 0x010 // User +#define PTE_G 0x020 // Global +#define PTE_A 0x040 // Accessed +#define PTE_D 0x080 // Dirty +#define PTE_SOFT 0x300 // Reserved for Software + +#define PTE_PPN_SHIFT 10 + +#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) + +#ifdef __riscv + +#if __riscv_xlen == 64 +# define MSTATUS_SD MSTATUS64_SD +# define SSTATUS_SD SSTATUS64_SD +# define RISCV_PGLEVEL_BITS 9 +# define SATP_MODE SATP64_MODE +#else +# define MSTATUS_SD MSTATUS32_SD +# define SSTATUS_SD SSTATUS32_SD +# define RISCV_PGLEVEL_BITS 10 +# define SATP_MODE SATP32_MODE +#endif +#define RISCV_PGSHIFT 12 +#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) + +#ifndef __ASSEMBLER__ + +#ifdef __GNUC__ + +#define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + +#define write_csr(reg, val) ({ \ + asm volatile ("csrw " #reg ", %0" :: "rK"(val)); }) + +#define swap_csr(reg, val) ({ unsigned long __tmp; \ + asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "rK"(val)); \ + __tmp; }) + +#define set_csr(reg, bit) ({ unsigned long __tmp; \ + asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ + __tmp; }) + +#define clear_csr(reg, bit) ({ unsigned long __tmp; \ + asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ + __tmp; }) + +#define rdtime() read_csr(time) +#define rdcycle() read_csr(cycle) +#define rdinstret() read_csr(instret) + +#endif + +#endif + +#endif + +#endif +/* Automatically generated by parse-opcodes. */ +#ifndef RISCV_ENCODING_H +#define RISCV_ENCODING_H +#define MATCH_BEQ 0x63 +#define MASK_BEQ 0x707f +#define MATCH_BNE 0x1063 +#define MASK_BNE 0x707f +#define MATCH_BLT 0x4063 +#define MASK_BLT 0x707f +#define MATCH_BGE 0x5063 +#define MASK_BGE 0x707f +#define MATCH_BLTU 0x6063 +#define MASK_BLTU 0x707f +#define MATCH_BGEU 0x7063 +#define MASK_BGEU 0x707f +#define MATCH_JALR 0x67 +#define MASK_JALR 0x707f +#define MATCH_JAL 0x6f +#define MASK_JAL 0x7f +#define MATCH_LUI 0x37 +#define MASK_LUI 0x7f +#define MATCH_AUIPC 0x17 +#define MASK_AUIPC 0x7f +#define MATCH_ADDI 0x13 +#define MASK_ADDI 0x707f +#define MATCH_SLLI 0x1013 +#define MASK_SLLI 0xfc00707f +#define MATCH_SLTI 0x2013 +#define MASK_SLTI 0x707f +#define MATCH_SLTIU 0x3013 +#define MASK_SLTIU 0x707f +#define MATCH_XORI 0x4013 +#define MASK_XORI 0x707f +#define MATCH_SRLI 0x5013 +#define MASK_SRLI 0xfc00707f +#define MATCH_SRAI 0x40005013 +#define MASK_SRAI 0xfc00707f +#define MATCH_ORI 0x6013 +#define MASK_ORI 0x707f +#define MATCH_ANDI 0x7013 +#define MASK_ANDI 0x707f +#define MATCH_ADD 0x33 +#define MASK_ADD 0xfe00707f +#define MATCH_SUB 0x40000033 +#define MASK_SUB 0xfe00707f +#define MATCH_SLL 0x1033 +#define MASK_SLL 0xfe00707f +#define MATCH_SLT 0x2033 +#define MASK_SLT 0xfe00707f +#define MATCH_SLTU 0x3033 +#define MASK_SLTU 0xfe00707f +#define MATCH_XOR 0x4033 +#define MASK_XOR 0xfe00707f +#define MATCH_SRL 0x5033 +#define MASK_SRL 0xfe00707f +#define MATCH_SRA 0x40005033 +#define MASK_SRA 0xfe00707f +#define MATCH_OR 0x6033 +#define MASK_OR 0xfe00707f +#define MATCH_AND 0x7033 +#define MASK_AND 0xfe00707f +#define MATCH_ADDIW 0x1b +#define MASK_ADDIW 0x707f +#define MATCH_SLLIW 0x101b +#define MASK_SLLIW 0xfe00707f +#define MATCH_SRLIW 0x501b +#define MASK_SRLIW 0xfe00707f +#define MATCH_SRAIW 0x4000501b +#define MASK_SRAIW 0xfe00707f +#define MATCH_ADDW 0x3b +#define MASK_ADDW 0xfe00707f +#define MATCH_SUBW 0x4000003b +#define MASK_SUBW 0xfe00707f +#define MATCH_SLLW 0x103b +#define MASK_SLLW 0xfe00707f +#define MATCH_SRLW 0x503b +#define MASK_SRLW 0xfe00707f +#define MATCH_SRAW 0x4000503b +#define MASK_SRAW 0xfe00707f +#define MATCH_LB 0x3 +#define MASK_LB 0x707f +#define MATCH_LH 0x1003 +#define MASK_LH 0x707f +#define MATCH_LW 0x2003 +#define MASK_LW 0x707f +#define MATCH_LD 0x3003 +#define MASK_LD 0x707f +#define MATCH_LBU 0x4003 +#define MASK_LBU 0x707f +#define MATCH_LHU 0x5003 +#define MASK_LHU 0x707f +#define MATCH_LWU 0x6003 +#define MASK_LWU 0x707f +#define MATCH_SB 0x23 +#define MASK_SB 0x707f +#define MATCH_SH 0x1023 +#define MASK_SH 0x707f +#define MATCH_SW 0x2023 +#define MASK_SW 0x707f +#define MATCH_SD 0x3023 +#define MASK_SD 0x707f +#define MATCH_FENCE 0xf +#define MASK_FENCE 0x707f +#define MATCH_FENCE_I 0x100f +#define MASK_FENCE_I 0x707f +#define MATCH_MUL 0x2000033 +#define MASK_MUL 0xfe00707f +#define MATCH_MULH 0x2001033 +#define MASK_MULH 0xfe00707f +#define MATCH_MULHSU 0x2002033 +#define MASK_MULHSU 0xfe00707f +#define MATCH_MULHU 0x2003033 +#define MASK_MULHU 0xfe00707f +#define MATCH_DIV 0x2004033 +#define MASK_DIV 0xfe00707f +#define MATCH_DIVU 0x2005033 +#define MASK_DIVU 0xfe00707f +#define MATCH_REM 0x2006033 +#define MASK_REM 0xfe00707f +#define MATCH_REMU 0x2007033 +#define MASK_REMU 0xfe00707f +#define MATCH_MULW 0x200003b +#define MASK_MULW 0xfe00707f +#define MATCH_DIVW 0x200403b +#define MASK_DIVW 0xfe00707f +#define MATCH_DIVUW 0x200503b +#define MASK_DIVUW 0xfe00707f +#define MATCH_REMW 0x200603b +#define MASK_REMW 0xfe00707f +#define MATCH_REMUW 0x200703b +#define MASK_REMUW 0xfe00707f +#define MATCH_AMOADD_W 0x202f +#define MASK_AMOADD_W 0xf800707f +#define MATCH_AMOXOR_W 0x2000202f +#define MASK_AMOXOR_W 0xf800707f +#define MATCH_AMOOR_W 0x4000202f +#define MASK_AMOOR_W 0xf800707f +#define MATCH_AMOAND_W 0x6000202f +#define MASK_AMOAND_W 0xf800707f +#define MATCH_AMOMIN_W 0x8000202f +#define MASK_AMOMIN_W 0xf800707f +#define MATCH_AMOMAX_W 0xa000202f +#define MASK_AMOMAX_W 0xf800707f +#define MATCH_AMOMINU_W 0xc000202f +#define MASK_AMOMINU_W 0xf800707f +#define MATCH_AMOMAXU_W 0xe000202f +#define MASK_AMOMAXU_W 0xf800707f +#define MATCH_AMOSWAP_W 0x800202f +#define MASK_AMOSWAP_W 0xf800707f +#define MATCH_LR_W 0x1000202f +#define MASK_LR_W 0xf9f0707f +#define MATCH_SC_W 0x1800202f +#define MASK_SC_W 0xf800707f +#define MATCH_AMOADD_D 0x302f +#define MASK_AMOADD_D 0xf800707f +#define MATCH_AMOXOR_D 0x2000302f +#define MASK_AMOXOR_D 0xf800707f +#define MATCH_AMOOR_D 0x4000302f +#define MASK_AMOOR_D 0xf800707f +#define MATCH_AMOAND_D 0x6000302f +#define MASK_AMOAND_D 0xf800707f +#define MATCH_AMOMIN_D 0x8000302f +#define MASK_AMOMIN_D 0xf800707f +#define MATCH_AMOMAX_D 0xa000302f +#define MASK_AMOMAX_D 0xf800707f +#define MATCH_AMOMINU_D 0xc000302f +#define MASK_AMOMINU_D 0xf800707f +#define MATCH_AMOMAXU_D 0xe000302f +#define MASK_AMOMAXU_D 0xf800707f +#define MATCH_AMOSWAP_D 0x800302f +#define MASK_AMOSWAP_D 0xf800707f +#define MATCH_LR_D 0x1000302f +#define MASK_LR_D 0xf9f0707f +#define MATCH_SC_D 0x1800302f +#define MASK_SC_D 0xf800707f +#define MATCH_ECALL 0x73 +#define MASK_ECALL 0xffffffff +#define MATCH_EBREAK 0x100073 +#define MASK_EBREAK 0xffffffff +#define MATCH_URET 0x200073 +#define MASK_URET 0xffffffff +#define MATCH_SRET 0x10200073 +#define MASK_SRET 0xffffffff +#define MATCH_MRET 0x30200073 +#define MASK_MRET 0xffffffff +#define MATCH_DRET 0x7b200073 +#define MASK_DRET 0xffffffff +#define MATCH_SFENCE_VMA 0x12000073 +#define MASK_SFENCE_VMA 0xfe007fff +#define MATCH_WFI 0x10500073 +#define MASK_WFI 0xffffffff +#define MATCH_CSRRW 0x1073 +#define MASK_CSRRW 0x707f +#define MATCH_CSRRS 0x2073 +#define MASK_CSRRS 0x707f +#define MATCH_CSRRC 0x3073 +#define MASK_CSRRC 0x707f +#define MATCH_CSRRWI 0x5073 +#define MASK_CSRRWI 0x707f +#define MATCH_CSRRSI 0x6073 +#define MASK_CSRRSI 0x707f +#define MATCH_CSRRCI 0x7073 +#define MASK_CSRRCI 0x707f +#define MATCH_FADD_S 0x53 +#define MASK_FADD_S 0xfe00007f +#define MATCH_FSUB_S 0x8000053 +#define MASK_FSUB_S 0xfe00007f +#define MATCH_FMUL_S 0x10000053 +#define MASK_FMUL_S 0xfe00007f +#define MATCH_FDIV_S 0x18000053 +#define MASK_FDIV_S 0xfe00007f +#define MATCH_FSGNJ_S 0x20000053 +#define MASK_FSGNJ_S 0xfe00707f +#define MATCH_FSGNJN_S 0x20001053 +#define MASK_FSGNJN_S 0xfe00707f +#define MATCH_FSGNJX_S 0x20002053 +#define MASK_FSGNJX_S 0xfe00707f +#define MATCH_FMIN_S 0x28000053 +#define MASK_FMIN_S 0xfe00707f +#define MATCH_FMAX_S 0x28001053 +#define MASK_FMAX_S 0xfe00707f +#define MATCH_FSQRT_S 0x58000053 +#define MASK_FSQRT_S 0xfff0007f +#define MATCH_FADD_D 0x2000053 +#define MASK_FADD_D 0xfe00007f +#define MATCH_FSUB_D 0xa000053 +#define MASK_FSUB_D 0xfe00007f +#define MATCH_FMUL_D 0x12000053 +#define MASK_FMUL_D 0xfe00007f +#define MATCH_FDIV_D 0x1a000053 +#define MASK_FDIV_D 0xfe00007f +#define MATCH_FSGNJ_D 0x22000053 +#define MASK_FSGNJ_D 0xfe00707f +#define MATCH_FSGNJN_D 0x22001053 +#define MASK_FSGNJN_D 0xfe00707f +#define MATCH_FSGNJX_D 0x22002053 +#define MASK_FSGNJX_D 0xfe00707f +#define MATCH_FMIN_D 0x2a000053 +#define MASK_FMIN_D 0xfe00707f +#define MATCH_FMAX_D 0x2a001053 +#define MASK_FMAX_D 0xfe00707f +#define MATCH_FCVT_S_D 0x40100053 +#define MASK_FCVT_S_D 0xfff0007f +#define MATCH_FCVT_D_S 0x42000053 +#define MASK_FCVT_D_S 0xfff0007f +#define MATCH_FSQRT_D 0x5a000053 +#define MASK_FSQRT_D 0xfff0007f +#define MATCH_FADD_Q 0x6000053 +#define MASK_FADD_Q 0xfe00007f +#define MATCH_FSUB_Q 0xe000053 +#define MASK_FSUB_Q 0xfe00007f +#define MATCH_FMUL_Q 0x16000053 +#define MASK_FMUL_Q 0xfe00007f +#define MATCH_FDIV_Q 0x1e000053 +#define MASK_FDIV_Q 0xfe00007f +#define MATCH_FSGNJ_Q 0x26000053 +#define MASK_FSGNJ_Q 0xfe00707f +#define MATCH_FSGNJN_Q 0x26001053 +#define MASK_FSGNJN_Q 0xfe00707f +#define MATCH_FSGNJX_Q 0x26002053 +#define MASK_FSGNJX_Q 0xfe00707f +#define MATCH_FMIN_Q 0x2e000053 +#define MASK_FMIN_Q 0xfe00707f +#define MATCH_FMAX_Q 0x2e001053 +#define MASK_FMAX_Q 0xfe00707f +#define MATCH_FCVT_S_Q 0x40300053 +#define MASK_FCVT_S_Q 0xfff0007f +#define MATCH_FCVT_Q_S 0x46000053 +#define MASK_FCVT_Q_S 0xfff0007f +#define MATCH_FCVT_D_Q 0x42300053 +#define MASK_FCVT_D_Q 0xfff0007f +#define MATCH_FCVT_Q_D 0x46100053 +#define MASK_FCVT_Q_D 0xfff0007f +#define MATCH_FSQRT_Q 0x5e000053 +#define MASK_FSQRT_Q 0xfff0007f +#define MATCH_FLE_S 0xa0000053 +#define MASK_FLE_S 0xfe00707f +#define MATCH_FLT_S 0xa0001053 +#define MASK_FLT_S 0xfe00707f +#define MATCH_FEQ_S 0xa0002053 +#define MASK_FEQ_S 0xfe00707f +#define MATCH_FLE_D 0xa2000053 +#define MASK_FLE_D 0xfe00707f +#define MATCH_FLT_D 0xa2001053 +#define MASK_FLT_D 0xfe00707f +#define MATCH_FEQ_D 0xa2002053 +#define MASK_FEQ_D 0xfe00707f +#define MATCH_FLE_Q 0xa6000053 +#define MASK_FLE_Q 0xfe00707f +#define MATCH_FLT_Q 0xa6001053 +#define MASK_FLT_Q 0xfe00707f +#define MATCH_FEQ_Q 0xa6002053 +#define MASK_FEQ_Q 0xfe00707f +#define MATCH_FCVT_W_S 0xc0000053 +#define MASK_FCVT_W_S 0xfff0007f +#define MATCH_FCVT_WU_S 0xc0100053 +#define MASK_FCVT_WU_S 0xfff0007f +#define MATCH_FCVT_L_S 0xc0200053 +#define MASK_FCVT_L_S 0xfff0007f +#define MATCH_FCVT_LU_S 0xc0300053 +#define MASK_FCVT_LU_S 0xfff0007f +#define MATCH_FMV_X_W 0xe0000053 +#define MASK_FMV_X_W 0xfff0707f +#define MATCH_FCLASS_S 0xe0001053 +#define MASK_FCLASS_S 0xfff0707f +#define MATCH_FCVT_W_D 0xc2000053 +#define MASK_FCVT_W_D 0xfff0007f +#define MATCH_FCVT_WU_D 0xc2100053 +#define MASK_FCVT_WU_D 0xfff0007f +#define MATCH_FCVT_L_D 0xc2200053 +#define MASK_FCVT_L_D 0xfff0007f +#define MATCH_FCVT_LU_D 0xc2300053 +#define MASK_FCVT_LU_D 0xfff0007f +#define MATCH_FMV_X_D 0xe2000053 +#define MASK_FMV_X_D 0xfff0707f +#define MATCH_FCLASS_D 0xe2001053 +#define MASK_FCLASS_D 0xfff0707f +#define MATCH_FCVT_W_Q 0xc6000053 +#define MASK_FCVT_W_Q 0xfff0007f +#define MATCH_FCVT_WU_Q 0xc6100053 +#define MASK_FCVT_WU_Q 0xfff0007f +#define MATCH_FCVT_L_Q 0xc6200053 +#define MASK_FCVT_L_Q 0xfff0007f +#define MATCH_FCVT_LU_Q 0xc6300053 +#define MASK_FCVT_LU_Q 0xfff0007f +#define MATCH_FMV_X_Q 0xe6000053 +#define MASK_FMV_X_Q 0xfff0707f +#define MATCH_FCLASS_Q 0xe6001053 +#define MASK_FCLASS_Q 0xfff0707f +#define MATCH_FCVT_S_W 0xd0000053 +#define MASK_FCVT_S_W 0xfff0007f +#define MATCH_FCVT_S_WU 0xd0100053 +#define MASK_FCVT_S_WU 0xfff0007f +#define MATCH_FCVT_S_L 0xd0200053 +#define MASK_FCVT_S_L 0xfff0007f +#define MATCH_FCVT_S_LU 0xd0300053 +#define MASK_FCVT_S_LU 0xfff0007f +#define MATCH_FMV_W_X 0xf0000053 +#define MASK_FMV_W_X 0xfff0707f +#define MATCH_FCVT_D_W 0xd2000053 +#define MASK_FCVT_D_W 0xfff0007f +#define MATCH_FCVT_D_WU 0xd2100053 +#define MASK_FCVT_D_WU 0xfff0007f +#define MATCH_FCVT_D_L 0xd2200053 +#define MASK_FCVT_D_L 0xfff0007f +#define MATCH_FCVT_D_LU 0xd2300053 +#define MASK_FCVT_D_LU 0xfff0007f +#define MATCH_FMV_D_X 0xf2000053 +#define MASK_FMV_D_X 0xfff0707f +#define MATCH_FCVT_Q_W 0xd6000053 +#define MASK_FCVT_Q_W 0xfff0007f +#define MATCH_FCVT_Q_WU 0xd6100053 +#define MASK_FCVT_Q_WU 0xfff0007f +#define MATCH_FCVT_Q_L 0xd6200053 +#define MASK_FCVT_Q_L 0xfff0007f +#define MATCH_FCVT_Q_LU 0xd6300053 +#define MASK_FCVT_Q_LU 0xfff0007f +#define MATCH_FMV_Q_X 0xf6000053 +#define MASK_FMV_Q_X 0xfff0707f +#define MATCH_FLW 0x2007 +#define MASK_FLW 0x707f +#define MATCH_FLD 0x3007 +#define MASK_FLD 0x707f +#define MATCH_FLQ 0x4007 +#define MASK_FLQ 0x707f +#define MATCH_FSW 0x2027 +#define MASK_FSW 0x707f +#define MATCH_FSD 0x3027 +#define MASK_FSD 0x707f +#define MATCH_FSQ 0x4027 +#define MASK_FSQ 0x707f +#define MATCH_FMADD_S 0x43 +#define MASK_FMADD_S 0x600007f +#define MATCH_FMSUB_S 0x47 +#define MASK_FMSUB_S 0x600007f +#define MATCH_FNMSUB_S 0x4b +#define MASK_FNMSUB_S 0x600007f +#define MATCH_FNMADD_S 0x4f +#define MASK_FNMADD_S 0x600007f +#define MATCH_FMADD_D 0x2000043 +#define MASK_FMADD_D 0x600007f +#define MATCH_FMSUB_D 0x2000047 +#define MASK_FMSUB_D 0x600007f +#define MATCH_FNMSUB_D 0x200004b +#define MASK_FNMSUB_D 0x600007f +#define MATCH_FNMADD_D 0x200004f +#define MASK_FNMADD_D 0x600007f +#define MATCH_FMADD_Q 0x6000043 +#define MASK_FMADD_Q 0x600007f +#define MATCH_FMSUB_Q 0x6000047 +#define MASK_FMSUB_Q 0x600007f +#define MATCH_FNMSUB_Q 0x600004b +#define MASK_FNMSUB_Q 0x600007f +#define MATCH_FNMADD_Q 0x600004f +#define MASK_FNMADD_Q 0x600007f +#define MATCH_C_NOP 0x1 +#define MASK_C_NOP 0xffff +#define MATCH_C_ADDI16SP 0x6101 +#define MASK_C_ADDI16SP 0xef83 +#define MATCH_C_JR 0x8002 +#define MASK_C_JR 0xf07f +#define MATCH_C_JALR 0x9002 +#define MASK_C_JALR 0xf07f +#define MATCH_C_EBREAK 0x9002 +#define MASK_C_EBREAK 0xffff +#define MATCH_C_LD 0x6000 +#define MASK_C_LD 0xe003 +#define MATCH_C_SD 0xe000 +#define MASK_C_SD 0xe003 +#define MATCH_C_ADDIW 0x2001 +#define MASK_C_ADDIW 0xe003 +#define MATCH_C_LDSP 0x6002 +#define MASK_C_LDSP 0xe003 +#define MATCH_C_SDSP 0xe002 +#define MASK_C_SDSP 0xe003 +#define MATCH_C_ADDI4SPN 0x0 +#define MASK_C_ADDI4SPN 0xe003 +#define MATCH_C_FLD 0x2000 +#define MASK_C_FLD 0xe003 +#define MATCH_C_LW 0x4000 +#define MASK_C_LW 0xe003 +#define MATCH_C_FLW 0x6000 +#define MASK_C_FLW 0xe003 +#define MATCH_C_FSD 0xa000 +#define MASK_C_FSD 0xe003 +#define MATCH_C_SW 0xc000 +#define MASK_C_SW 0xe003 +#define MATCH_C_FSW 0xe000 +#define MASK_C_FSW 0xe003 +#define MATCH_C_ADDI 0x1 +#define MASK_C_ADDI 0xe003 +#define MATCH_C_JAL 0x2001 +#define MASK_C_JAL 0xe003 +#define MATCH_C_LI 0x4001 +#define MASK_C_LI 0xe003 +#define MATCH_C_LUI 0x6001 +#define MASK_C_LUI 0xe003 +#define MATCH_C_SRLI 0x8001 +#define MASK_C_SRLI 0xec03 +#define MATCH_C_SRAI 0x8401 +#define MASK_C_SRAI 0xec03 +#define MATCH_C_ANDI 0x8801 +#define MASK_C_ANDI 0xec03 +#define MATCH_C_SUB 0x8c01 +#define MASK_C_SUB 0xfc63 +#define MATCH_C_XOR 0x8c21 +#define MASK_C_XOR 0xfc63 +#define MATCH_C_OR 0x8c41 +#define MASK_C_OR 0xfc63 +#define MATCH_C_AND 0x8c61 +#define MASK_C_AND 0xfc63 +#define MATCH_C_SUBW 0x9c01 +#define MASK_C_SUBW 0xfc63 +#define MATCH_C_ADDW 0x9c21 +#define MASK_C_ADDW 0xfc63 +#define MATCH_C_J 0xa001 +#define MASK_C_J 0xe003 +#define MATCH_C_BEQZ 0xc001 +#define MASK_C_BEQZ 0xe003 +#define MATCH_C_BNEZ 0xe001 +#define MASK_C_BNEZ 0xe003 +#define MATCH_C_SLLI 0x2 +#define MASK_C_SLLI 0xe003 +#define MATCH_C_FLDSP 0x2002 +#define MASK_C_FLDSP 0xe003 +#define MATCH_C_LWSP 0x4002 +#define MASK_C_LWSP 0xe003 +#define MATCH_C_FLWSP 0x6002 +#define MASK_C_FLWSP 0xe003 +#define MATCH_C_MV 0x8002 +#define MASK_C_MV 0xf003 +#define MATCH_C_ADD 0x9002 +#define MASK_C_ADD 0xf003 +#define MATCH_C_FSDSP 0xa002 +#define MASK_C_FSDSP 0xe003 +#define MATCH_C_SWSP 0xc002 +#define MASK_C_SWSP 0xe003 +#define MATCH_C_FSWSP 0xe002 +#define MASK_C_FSWSP 0xe003 +#define MATCH_CUSTOM0 0xb +#define MASK_CUSTOM0 0x707f +#define MATCH_CUSTOM0_RS1 0x200b +#define MASK_CUSTOM0_RS1 0x707f +#define MATCH_CUSTOM0_RS1_RS2 0x300b +#define MASK_CUSTOM0_RS1_RS2 0x707f +#define MATCH_CUSTOM0_RD 0x400b +#define MASK_CUSTOM0_RD 0x707f +#define MATCH_CUSTOM0_RD_RS1 0x600b +#define MASK_CUSTOM0_RD_RS1 0x707f +#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b +#define MASK_CUSTOM0_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM1 0x2b +#define MASK_CUSTOM1 0x707f +#define MATCH_CUSTOM1_RS1 0x202b +#define MASK_CUSTOM1_RS1 0x707f +#define MATCH_CUSTOM1_RS1_RS2 0x302b +#define MASK_CUSTOM1_RS1_RS2 0x707f +#define MATCH_CUSTOM1_RD 0x402b +#define MASK_CUSTOM1_RD 0x707f +#define MATCH_CUSTOM1_RD_RS1 0x602b +#define MASK_CUSTOM1_RD_RS1 0x707f +#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b +#define MASK_CUSTOM1_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM2 0x5b +#define MASK_CUSTOM2 0x707f +#define MATCH_CUSTOM2_RS1 0x205b +#define MASK_CUSTOM2_RS1 0x707f +#define MATCH_CUSTOM2_RS1_RS2 0x305b +#define MASK_CUSTOM2_RS1_RS2 0x707f +#define MATCH_CUSTOM2_RD 0x405b +#define MASK_CUSTOM2_RD 0x707f +#define MATCH_CUSTOM2_RD_RS1 0x605b +#define MASK_CUSTOM2_RD_RS1 0x707f +#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b +#define MASK_CUSTOM2_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM3 0x7b +#define MASK_CUSTOM3 0x707f +#define MATCH_CUSTOM3_RS1 0x207b +#define MASK_CUSTOM3_RS1 0x707f +#define MATCH_CUSTOM3_RS1_RS2 0x307b +#define MASK_CUSTOM3_RS1_RS2 0x707f +#define MATCH_CUSTOM3_RD 0x407b +#define MASK_CUSTOM3_RD 0x707f +#define MATCH_CUSTOM3_RD_RS1 0x607b +#define MASK_CUSTOM3_RD_RS1 0x707f +#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b +#define MASK_CUSTOM3_RD_RS1_RS2 0x707f +#define CSR_FFLAGS 0x1 +#define CSR_FRM 0x2 +#define CSR_FCSR 0x3 +#define CSR_CYCLE 0xc00 +#define CSR_TIME 0xc01 +#define CSR_INSTRET 0xc02 +#define CSR_HPMCOUNTER3 0xc03 +#define CSR_HPMCOUNTER4 0xc04 +#define CSR_HPMCOUNTER5 0xc05 +#define CSR_HPMCOUNTER6 0xc06 +#define CSR_HPMCOUNTER7 0xc07 +#define CSR_HPMCOUNTER8 0xc08 +#define CSR_HPMCOUNTER9 0xc09 +#define CSR_HPMCOUNTER10 0xc0a +#define CSR_HPMCOUNTER11 0xc0b +#define CSR_HPMCOUNTER12 0xc0c +#define CSR_HPMCOUNTER13 0xc0d +#define CSR_HPMCOUNTER14 0xc0e +#define CSR_HPMCOUNTER15 0xc0f +#define CSR_HPMCOUNTER16 0xc10 +#define CSR_HPMCOUNTER17 0xc11 +#define CSR_HPMCOUNTER18 0xc12 +#define CSR_HPMCOUNTER19 0xc13 +#define CSR_HPMCOUNTER20 0xc14 +#define CSR_HPMCOUNTER21 0xc15 +#define CSR_HPMCOUNTER22 0xc16 +#define CSR_HPMCOUNTER23 0xc17 +#define CSR_HPMCOUNTER24 0xc18 +#define CSR_HPMCOUNTER25 0xc19 +#define CSR_HPMCOUNTER26 0xc1a +#define CSR_HPMCOUNTER27 0xc1b +#define CSR_HPMCOUNTER28 0xc1c +#define CSR_HPMCOUNTER29 0xc1d +#define CSR_HPMCOUNTER30 0xc1e +#define CSR_HPMCOUNTER31 0xc1f +#define CSR_SSTATUS 0x100 +#define CSR_SIE 0x104 +#define CSR_STVEC 0x105 +#define CSR_SCOUNTEREN 0x106 +#define CSR_SSCRATCH 0x140 +#define CSR_SEPC 0x141 +#define CSR_SCAUSE 0x142 +#define CSR_STVAL 0x143 +#define CSR_SIP 0x144 +#define CSR_SATP 0x180 +#define CSR_MSTATUS 0x300 +#define CSR_MISA 0x301 +#define CSR_MEDELEG 0x302 +#define CSR_MIDELEG 0x303 +#define CSR_MIE 0x304 +#define CSR_MTVEC 0x305 +#define CSR_MCOUNTEREN 0x306 +#define CSR_MSCRATCH 0x340 +#define CSR_MEPC 0x341 +#define CSR_MCAUSE 0x342 +#define CSR_MTVAL 0x343 +#define CSR_MIP 0x344 +#define CSR_PMPCFG0 0x3a0 +#define CSR_PMPCFG1 0x3a1 +#define CSR_PMPCFG2 0x3a2 +#define CSR_PMPCFG3 0x3a3 +#define CSR_PMPADDR0 0x3b0 +#define CSR_PMPADDR1 0x3b1 +#define CSR_PMPADDR2 0x3b2 +#define CSR_PMPADDR3 0x3b3 +#define CSR_PMPADDR4 0x3b4 +#define CSR_PMPADDR5 0x3b5 +#define CSR_PMPADDR6 0x3b6 +#define CSR_PMPADDR7 0x3b7 +#define CSR_PMPADDR8 0x3b8 +#define CSR_PMPADDR9 0x3b9 +#define CSR_PMPADDR10 0x3ba +#define CSR_PMPADDR11 0x3bb +#define CSR_PMPADDR12 0x3bc +#define CSR_PMPADDR13 0x3bd +#define CSR_PMPADDR14 0x3be +#define CSR_PMPADDR15 0x3bf +#define CSR_TSELECT 0x7a0 +#define CSR_TDATA1 0x7a1 +#define CSR_TDATA2 0x7a2 +#define CSR_TDATA3 0x7a3 +#define CSR_DCSR 0x7b0 +#define CSR_DPC 0x7b1 +#define CSR_DSCRATCH 0x7b2 +#define CSR_DSCRATCH0 CSR_DSCRATCH +#define CSR_DSCRATCH1 0x7b3 +#define CSR_MCYCLE 0xb00 +#define CSR_MINSTRET 0xb02 +#define CSR_MHPMCOUNTER3 0xb03 +#define CSR_MHPMCOUNTER4 0xb04 +#define CSR_MHPMCOUNTER5 0xb05 +#define CSR_MHPMCOUNTER6 0xb06 +#define CSR_MHPMCOUNTER7 0xb07 +#define CSR_MHPMCOUNTER8 0xb08 +#define CSR_MHPMCOUNTER9 0xb09 +#define CSR_MHPMCOUNTER10 0xb0a +#define CSR_MHPMCOUNTER11 0xb0b +#define CSR_MHPMCOUNTER12 0xb0c +#define CSR_MHPMCOUNTER13 0xb0d +#define CSR_MHPMCOUNTER14 0xb0e +#define CSR_MHPMCOUNTER15 0xb0f +#define CSR_MHPMCOUNTER16 0xb10 +#define CSR_MHPMCOUNTER17 0xb11 +#define CSR_MHPMCOUNTER18 0xb12 +#define CSR_MHPMCOUNTER19 0xb13 +#define CSR_MHPMCOUNTER20 0xb14 +#define CSR_MHPMCOUNTER21 0xb15 +#define CSR_MHPMCOUNTER22 0xb16 +#define CSR_MHPMCOUNTER23 0xb17 +#define CSR_MHPMCOUNTER24 0xb18 +#define CSR_MHPMCOUNTER25 0xb19 +#define CSR_MHPMCOUNTER26 0xb1a +#define CSR_MHPMCOUNTER27 0xb1b +#define CSR_MHPMCOUNTER28 0xb1c +#define CSR_MHPMCOUNTER29 0xb1d +#define CSR_MHPMCOUNTER30 0xb1e +#define CSR_MHPMCOUNTER31 0xb1f +#define CSR_MHPMEVENT3 0x323 +#define CSR_MHPMEVENT4 0x324 +#define CSR_MHPMEVENT5 0x325 +#define CSR_MHPMEVENT6 0x326 +#define CSR_MHPMEVENT7 0x327 +#define CSR_MHPMEVENT8 0x328 +#define CSR_MHPMEVENT9 0x329 +#define CSR_MHPMEVENT10 0x32a +#define CSR_MHPMEVENT11 0x32b +#define CSR_MHPMEVENT12 0x32c +#define CSR_MHPMEVENT13 0x32d +#define CSR_MHPMEVENT14 0x32e +#define CSR_MHPMEVENT15 0x32f +#define CSR_MHPMEVENT16 0x330 +#define CSR_MHPMEVENT17 0x331 +#define CSR_MHPMEVENT18 0x332 +#define CSR_MHPMEVENT19 0x333 +#define CSR_MHPMEVENT20 0x334 +#define CSR_MHPMEVENT21 0x335 +#define CSR_MHPMEVENT22 0x336 +#define CSR_MHPMEVENT23 0x337 +#define CSR_MHPMEVENT24 0x338 +#define CSR_MHPMEVENT25 0x339 +#define CSR_MHPMEVENT26 0x33a +#define CSR_MHPMEVENT27 0x33b +#define CSR_MHPMEVENT28 0x33c +#define CSR_MHPMEVENT29 0x33d +#define CSR_MHPMEVENT30 0x33e +#define CSR_MHPMEVENT31 0x33f +#define CSR_MVENDORID 0xf11 +#define CSR_MARCHID 0xf12 +#define CSR_MIMPID 0xf13 +#define CSR_MHARTID 0xf14 +#define CSR_CYCLEH 0xc80 +#define CSR_TIMEH 0xc81 +#define CSR_INSTRETH 0xc82 +#define CSR_HPMCOUNTER3H 0xc83 +#define CSR_HPMCOUNTER4H 0xc84 +#define CSR_HPMCOUNTER5H 0xc85 +#define CSR_HPMCOUNTER6H 0xc86 +#define CSR_HPMCOUNTER7H 0xc87 +#define CSR_HPMCOUNTER8H 0xc88 +#define CSR_HPMCOUNTER9H 0xc89 +#define CSR_HPMCOUNTER10H 0xc8a +#define CSR_HPMCOUNTER11H 0xc8b +#define CSR_HPMCOUNTER12H 0xc8c +#define CSR_HPMCOUNTER13H 0xc8d +#define CSR_HPMCOUNTER14H 0xc8e +#define CSR_HPMCOUNTER15H 0xc8f +#define CSR_HPMCOUNTER16H 0xc90 +#define CSR_HPMCOUNTER17H 0xc91 +#define CSR_HPMCOUNTER18H 0xc92 +#define CSR_HPMCOUNTER19H 0xc93 +#define CSR_HPMCOUNTER20H 0xc94 +#define CSR_HPMCOUNTER21H 0xc95 +#define CSR_HPMCOUNTER22H 0xc96 +#define CSR_HPMCOUNTER23H 0xc97 +#define CSR_HPMCOUNTER24H 0xc98 +#define CSR_HPMCOUNTER25H 0xc99 +#define CSR_HPMCOUNTER26H 0xc9a +#define CSR_HPMCOUNTER27H 0xc9b +#define CSR_HPMCOUNTER28H 0xc9c +#define CSR_HPMCOUNTER29H 0xc9d +#define CSR_HPMCOUNTER30H 0xc9e +#define CSR_HPMCOUNTER31H 0xc9f +#define CSR_MCYCLEH 0xb80 +#define CSR_MINSTRETH 0xb82 +#define CSR_MHPMCOUNTER3H 0xb83 +#define CSR_MHPMCOUNTER4H 0xb84 +#define CSR_MHPMCOUNTER5H 0xb85 +#define CSR_MHPMCOUNTER6H 0xb86 +#define CSR_MHPMCOUNTER7H 0xb87 +#define CSR_MHPMCOUNTER8H 0xb88 +#define CSR_MHPMCOUNTER9H 0xb89 +#define CSR_MHPMCOUNTER10H 0xb8a +#define CSR_MHPMCOUNTER11H 0xb8b +#define CSR_MHPMCOUNTER12H 0xb8c +#define CSR_MHPMCOUNTER13H 0xb8d +#define CSR_MHPMCOUNTER14H 0xb8e +#define CSR_MHPMCOUNTER15H 0xb8f +#define CSR_MHPMCOUNTER16H 0xb90 +#define CSR_MHPMCOUNTER17H 0xb91 +#define CSR_MHPMCOUNTER18H 0xb92 +#define CSR_MHPMCOUNTER19H 0xb93 +#define CSR_MHPMCOUNTER20H 0xb94 +#define CSR_MHPMCOUNTER21H 0xb95 +#define CSR_MHPMCOUNTER22H 0xb96 +#define CSR_MHPMCOUNTER23H 0xb97 +#define CSR_MHPMCOUNTER24H 0xb98 +#define CSR_MHPMCOUNTER25H 0xb99 +#define CSR_MHPMCOUNTER26H 0xb9a +#define CSR_MHPMCOUNTER27H 0xb9b +#define CSR_MHPMCOUNTER28H 0xb9c +#define CSR_MHPMCOUNTER29H 0xb9d +#define CSR_MHPMCOUNTER30H 0xb9e +#define CSR_MHPMCOUNTER31H 0xb9f +#define CAUSE_MISALIGNED_FETCH 0x0 +#define CAUSE_FETCH_ACCESS 0x1 +#define CAUSE_ILLEGAL_INSTRUCTION 0x2 +#define CAUSE_BREAKPOINT 0x3 +#define CAUSE_MISALIGNED_LOAD 0x4 +#define CAUSE_LOAD_ACCESS 0x5 +#define CAUSE_MISALIGNED_STORE 0x6 +#define CAUSE_STORE_ACCESS 0x7 +#define CAUSE_USER_ECALL 0x8 +#define CAUSE_SUPERVISOR_ECALL 0x9 +#define CAUSE_HYPERVISOR_ECALL 0xa +#define CAUSE_MACHINE_ECALL 0xb +#define CAUSE_FETCH_PAGE_FAULT 0xc +#define CAUSE_LOAD_PAGE_FAULT 0xd +#define CAUSE_STORE_PAGE_FAULT 0xf +#endif +#ifdef DECLARE_INSN +DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) +DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) +DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) +DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) +DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) +DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) +DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) +DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) +DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) +DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) +DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) +DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) +DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) +DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) +DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) +DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) +DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) +DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) +DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) +DECLARE_INSN(add, MATCH_ADD, MASK_ADD) +DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) +DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) +DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) +DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) +DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) +DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) +DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) +DECLARE_INSN(or, MATCH_OR, MASK_OR) +DECLARE_INSN(and, MATCH_AND, MASK_AND) +DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) +DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) +DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) +DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) +DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) +DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) +DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) +DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) +DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) +DECLARE_INSN(lb, MATCH_LB, MASK_LB) +DECLARE_INSN(lh, MATCH_LH, MASK_LH) +DECLARE_INSN(lw, MATCH_LW, MASK_LW) +DECLARE_INSN(ld, MATCH_LD, MASK_LD) +DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) +DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) +DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) +DECLARE_INSN(sb, MATCH_SB, MASK_SB) +DECLARE_INSN(sh, MATCH_SH, MASK_SH) +DECLARE_INSN(sw, MATCH_SW, MASK_SW) +DECLARE_INSN(sd, MATCH_SD, MASK_SD) +DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) +DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) +DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) +DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) +DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) +DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) +DECLARE_INSN(div, MATCH_DIV, MASK_DIV) +DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) +DECLARE_INSN(rem, MATCH_REM, MASK_REM) +DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) +DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) +DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) +DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) +DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) +DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) +DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) +DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) +DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) +DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) +DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) +DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) +DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) +DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) +DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) +DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) +DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) +DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) +DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) +DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) +DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) +DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) +DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) +DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) +DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) +DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) +DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) +DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) +DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) +DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) +DECLARE_INSN(uret, MATCH_URET, MASK_URET) +DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) +DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) +DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) +DECLARE_INSN(sfence_vma, MATCH_SFENCE_VMA, MASK_SFENCE_VMA) +DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) +DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) +DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) +DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) +DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) +DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) +DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) +DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) +DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) +DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) +DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) +DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) +DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) +DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) +DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) +DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) +DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) +DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) +DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) +DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) +DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) +DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) +DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) +DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) +DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) +DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) +DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) +DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) +DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) +DECLARE_INSN(fadd_q, MATCH_FADD_Q, MASK_FADD_Q) +DECLARE_INSN(fsub_q, MATCH_FSUB_Q, MASK_FSUB_Q) +DECLARE_INSN(fmul_q, MATCH_FMUL_Q, MASK_FMUL_Q) +DECLARE_INSN(fdiv_q, MATCH_FDIV_Q, MASK_FDIV_Q) +DECLARE_INSN(fsgnj_q, MATCH_FSGNJ_Q, MASK_FSGNJ_Q) +DECLARE_INSN(fsgnjn_q, MATCH_FSGNJN_Q, MASK_FSGNJN_Q) +DECLARE_INSN(fsgnjx_q, MATCH_FSGNJX_Q, MASK_FSGNJX_Q) +DECLARE_INSN(fmin_q, MATCH_FMIN_Q, MASK_FMIN_Q) +DECLARE_INSN(fmax_q, MATCH_FMAX_Q, MASK_FMAX_Q) +DECLARE_INSN(fcvt_s_q, MATCH_FCVT_S_Q, MASK_FCVT_S_Q) +DECLARE_INSN(fcvt_q_s, MATCH_FCVT_Q_S, MASK_FCVT_Q_S) +DECLARE_INSN(fcvt_d_q, MATCH_FCVT_D_Q, MASK_FCVT_D_Q) +DECLARE_INSN(fcvt_q_d, MATCH_FCVT_Q_D, MASK_FCVT_Q_D) +DECLARE_INSN(fsqrt_q, MATCH_FSQRT_Q, MASK_FSQRT_Q) +DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) +DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) +DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) +DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) +DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) +DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) +DECLARE_INSN(fle_q, MATCH_FLE_Q, MASK_FLE_Q) +DECLARE_INSN(flt_q, MATCH_FLT_Q, MASK_FLT_Q) +DECLARE_INSN(feq_q, MATCH_FEQ_Q, MASK_FEQ_Q) +DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) +DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) +DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) +DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) +DECLARE_INSN(fmv_x_w, MATCH_FMV_X_W, MASK_FMV_X_W) +DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) +DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) +DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) +DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) +DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) +DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) +DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) +DECLARE_INSN(fcvt_w_q, MATCH_FCVT_W_Q, MASK_FCVT_W_Q) +DECLARE_INSN(fcvt_wu_q, MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q) +DECLARE_INSN(fcvt_l_q, MATCH_FCVT_L_Q, MASK_FCVT_L_Q) +DECLARE_INSN(fcvt_lu_q, MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q) +DECLARE_INSN(fmv_x_q, MATCH_FMV_X_Q, MASK_FMV_X_Q) +DECLARE_INSN(fclass_q, MATCH_FCLASS_Q, MASK_FCLASS_Q) +DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) +DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) +DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) +DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) +DECLARE_INSN(fmv_w_x, MATCH_FMV_W_X, MASK_FMV_W_X) +DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) +DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) +DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) +DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) +DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) +DECLARE_INSN(fcvt_q_w, MATCH_FCVT_Q_W, MASK_FCVT_Q_W) +DECLARE_INSN(fcvt_q_wu, MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU) +DECLARE_INSN(fcvt_q_l, MATCH_FCVT_Q_L, MASK_FCVT_Q_L) +DECLARE_INSN(fcvt_q_lu, MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU) +DECLARE_INSN(fmv_q_x, MATCH_FMV_Q_X, MASK_FMV_Q_X) +DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) +DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) +DECLARE_INSN(flq, MATCH_FLQ, MASK_FLQ) +DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) +DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) +DECLARE_INSN(fsq, MATCH_FSQ, MASK_FSQ) +DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) +DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) +DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) +DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) +DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) +DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) +DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) +DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) +DECLARE_INSN(fmadd_q, MATCH_FMADD_Q, MASK_FMADD_Q) +DECLARE_INSN(fmsub_q, MATCH_FMSUB_Q, MASK_FMSUB_Q) +DECLARE_INSN(fnmsub_q, MATCH_FNMSUB_Q, MASK_FNMSUB_Q) +DECLARE_INSN(fnmadd_q, MATCH_FNMADD_Q, MASK_FNMADD_Q) +DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) +DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) +DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) +DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) +DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) +DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) +DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) +DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) +DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) +DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) +DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) +DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) +DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) +DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) +DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) +DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) +DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) +DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) +DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) +DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) +DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) +DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) +DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) +DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) +DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) +DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) +DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) +DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) +DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) +DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) +DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) +DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) +DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) +DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) +DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) +DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) +DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) +DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) +DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) +DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) +DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) +DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) +DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) +DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) +DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) +DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) +DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) +DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, MASK_CUSTOM0_RD_RS1_RS2) +DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) +DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) +DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) +DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) +DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) +DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, MASK_CUSTOM1_RD_RS1_RS2) +DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) +DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) +DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) +DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) +DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) +DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, MASK_CUSTOM2_RD_RS1_RS2) +DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) +DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) +DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) +DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) +DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) +DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2) +#endif +#ifdef DECLARE_CSR +DECLARE_CSR(fflags, CSR_FFLAGS) +DECLARE_CSR(frm, CSR_FRM) +DECLARE_CSR(fcsr, CSR_FCSR) +DECLARE_CSR(cycle, CSR_CYCLE) +DECLARE_CSR(time, CSR_TIME) +DECLARE_CSR(instret, CSR_INSTRET) +DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) +DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) +DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) +DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) +DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) +DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) +DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) +DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) +DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) +DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) +DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) +DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) +DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) +DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) +DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) +DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) +DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) +DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) +DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) +DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) +DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) +DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) +DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) +DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) +DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) +DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) +DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) +DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) +DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) +DECLARE_CSR(sstatus, CSR_SSTATUS) +DECLARE_CSR(sie, CSR_SIE) +DECLARE_CSR(stvec, CSR_STVEC) +DECLARE_CSR(scounteren, CSR_SCOUNTEREN) +DECLARE_CSR(sscratch, CSR_SSCRATCH) +DECLARE_CSR(sepc, CSR_SEPC) +DECLARE_CSR(scause, CSR_SCAUSE) +DECLARE_CSR(stval, CSR_STVAL) +DECLARE_CSR(sip, CSR_SIP) +DECLARE_CSR(satp, CSR_SATP) +DECLARE_CSR(mstatus, CSR_MSTATUS) +DECLARE_CSR(misa, CSR_MISA) +DECLARE_CSR(medeleg, CSR_MEDELEG) +DECLARE_CSR(mideleg, CSR_MIDELEG) +DECLARE_CSR(mie, CSR_MIE) +DECLARE_CSR(mtvec, CSR_MTVEC) +DECLARE_CSR(mcounteren, CSR_MCOUNTEREN) +DECLARE_CSR(mscratch, CSR_MSCRATCH) +DECLARE_CSR(mepc, CSR_MEPC) +DECLARE_CSR(mcause, CSR_MCAUSE) +DECLARE_CSR(mtval, CSR_MTVAL) +DECLARE_CSR(mip, CSR_MIP) +DECLARE_CSR(pmpcfg0, CSR_PMPCFG0) +DECLARE_CSR(pmpcfg1, CSR_PMPCFG1) +DECLARE_CSR(pmpcfg2, CSR_PMPCFG2) +DECLARE_CSR(pmpcfg3, CSR_PMPCFG3) +DECLARE_CSR(pmpaddr0, CSR_PMPADDR0) +DECLARE_CSR(pmpaddr1, CSR_PMPADDR1) +DECLARE_CSR(pmpaddr2, CSR_PMPADDR2) +DECLARE_CSR(pmpaddr3, CSR_PMPADDR3) +DECLARE_CSR(pmpaddr4, CSR_PMPADDR4) +DECLARE_CSR(pmpaddr5, CSR_PMPADDR5) +DECLARE_CSR(pmpaddr6, CSR_PMPADDR6) +DECLARE_CSR(pmpaddr7, CSR_PMPADDR7) +DECLARE_CSR(pmpaddr8, CSR_PMPADDR8) +DECLARE_CSR(pmpaddr9, CSR_PMPADDR9) +DECLARE_CSR(pmpaddr10, CSR_PMPADDR10) +DECLARE_CSR(pmpaddr11, CSR_PMPADDR11) +DECLARE_CSR(pmpaddr12, CSR_PMPADDR12) +DECLARE_CSR(pmpaddr13, CSR_PMPADDR13) +DECLARE_CSR(pmpaddr14, CSR_PMPADDR14) +DECLARE_CSR(pmpaddr15, CSR_PMPADDR15) +DECLARE_CSR(tselect, CSR_TSELECT) +DECLARE_CSR(tdata1, CSR_TDATA1) +DECLARE_CSR(tdata2, CSR_TDATA2) +DECLARE_CSR(tdata3, CSR_TDATA3) +DECLARE_CSR(dcsr, CSR_DCSR) +DECLARE_CSR(dpc, CSR_DPC) +DECLARE_CSR(dscratch, CSR_DSCRATCH) +DECLARE_CSR(dscratch0, CSR_DSCRATCH0) +DECLARE_CSR(dscratch1, CSR_DSCRATCH1) +DECLARE_CSR(mcycle, CSR_MCYCLE) +DECLARE_CSR(minstret, CSR_MINSTRET) +DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) +DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) +DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) +DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) +DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) +DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) +DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) +DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) +DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) +DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) +DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) +DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) +DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) +DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) +DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) +DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) +DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) +DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) +DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) +DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) +DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) +DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) +DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) +DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) +DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) +DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) +DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) +DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) +DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) +DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) +DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) +DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) +DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) +DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) +DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) +DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) +DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) +DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) +DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) +DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) +DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) +DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) +DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) +DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) +DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) +DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) +DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) +DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) +DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) +DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) +DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) +DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) +DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) +DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) +DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) +DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) +DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) +DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) +DECLARE_CSR(mvendorid, CSR_MVENDORID) +DECLARE_CSR(marchid, CSR_MARCHID) +DECLARE_CSR(mimpid, CSR_MIMPID) +DECLARE_CSR(mhartid, CSR_MHARTID) +DECLARE_CSR(cycleh, CSR_CYCLEH) +DECLARE_CSR(timeh, CSR_TIMEH) +DECLARE_CSR(instreth, CSR_INSTRETH) +DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) +DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) +DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) +DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) +DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) +DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) +DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) +DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) +DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) +DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) +DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) +DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) +DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) +DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) +DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) +DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) +DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) +DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) +DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) +DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) +DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) +DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) +DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) +DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) +DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) +DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) +DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) +DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) +DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) +DECLARE_CSR(mcycleh, CSR_MCYCLEH) +DECLARE_CSR(minstreth, CSR_MINSTRETH) +DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) +DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) +DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) +DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) +DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) +DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) +DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) +DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) +DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) +DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) +DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) +DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) +DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) +DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) +DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) +DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) +DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) +DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) +DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) +DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) +DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) +DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) +DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) +DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) +DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) +DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) +DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) +DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) +DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) +#endif +#ifdef DECLARE_CAUSE +DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) +DECLARE_CAUSE("fetch access", CAUSE_FETCH_ACCESS) +DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) +DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) +DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) +DECLARE_CAUSE("load access", CAUSE_LOAD_ACCESS) +DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) +DECLARE_CAUSE("store access", CAUSE_STORE_ACCESS) +DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) +DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) +DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) +DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) +DECLARE_CAUSE("fetch page fault", CAUSE_FETCH_PAGE_FAULT) +DECLARE_CAUSE("load page fault", CAUSE_LOAD_PAGE_FAULT) +DECLARE_CAUSE("store page fault", CAUSE_STORE_PAGE_FAULT) +#endif \ No newline at end of file diff --git a/verif/tests/custom/zcmt/jvt_csr.S b/verif/tests/custom/zcmt/jvt_csr.S index 4ccd3d9fd2..f1d770902d 100644 --- a/verif/tests/custom/zcmt/jvt_csr.S +++ b/verif/tests/custom/zcmt/jvt_csr.S @@ -1,5 +1,8 @@ -.globl _start -_start: +#include "riscv_test.h" + +RVTEST_RV32U +RVTEST_CODE_BEGIN + la t0, trap_handler csrw mtvec, t0 la t0, __jvt_base$ @@ -8,44 +11,44 @@ _start: fence.i csrr x7, jvt - j exit - -exit: - j write_tohost - -write_tohost: - li x1, 1 - la t0, tohost - sw x1, 0(t0) - j write_tohost + j success - -# Jump Vector Table (JVT) Section -# Create a separate section for the JVT -.section .riscv.jvt, "ax" -.align 6 # Align the JVT on a 64-byte boundary (6 = 2^6 = 64) -__jvt_base$: - .word 0x80000054 - .word 0x80000800 - .word 0x80000802 - .word 0x80000804 - -# Target Addresses (Where cm.jt will jump) -target0: - j write_tohost -target1: - addi x6,x0, 7 - j write_tohost - -target2: - addi x2,x20, 5 - j write_tohost - - trap_handler: - j exit + lui t0, %hi(failure) # Load upper 20 bits of target address into t0 + addi t0, t0, %lo(failure) # Add the lower 12 bits to t0 + jalr x0, 0(t0) + +// jump to this label to signal that the test failed +failure: + li x1, 1 + slli x1, x1, 1 + addi x1, x1, 1 + sw x1, tohost, t5 + self_loop_2: j self_loop_2 + +// jump to this label to signal that the test passed +success: + li x1, 0 + slli x1, x1, 1 + addi x1, x1, 1 + sw x1, tohost, t5 + self_loop: j self_loop + +RVTEST_CODE_END + +.data + +RVTEST_DATA_BEGIN + +// Jump Vector Table (JVT) Section +.section .riscv.jvt, "ax" +.align 6 +__jvt_base$: + .word 0x80000054 + .word 0x80000800 + .word 0x80000802 + .word 0x80000804 -.align 6; .global tohost; tohost: .dword 0; -.align 6; .global fromhost; fromhost: .dword 0; +RVTEST_DATA_END \ No newline at end of file diff --git a/verif/tests/custom/zcmt/link.ld b/verif/tests/custom/zcmt/link.ld new file mode 100644 index 0000000000..ae985b0a8d --- /dev/null +++ b/verif/tests/custom/zcmt/link.ld @@ -0,0 +1,81 @@ +/*======================================================================*/ +/* Proxy kernel linker script */ +/*======================================================================*/ +/* This is the linker script used when building the proxy kernel. */ + +/*----------------------------------------------------------------------*/ +/* Setup */ +/*----------------------------------------------------------------------*/ + +/* The OUTPUT_ARCH command specifies the machine architecture where the + argument is one of the names used in the BFD library. More + specifically one of the entires in bfd/cpu-mips.c */ + +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +/*----------------------------------------------------------------------*/ +/* Sections */ +/*----------------------------------------------------------------------*/ + +SECTIONS +{ + + /* text: test code section */ + . = 0x80000000; + _start_text = .; + .text.init : { *(.text.init) } + + . = ALIGN(0x1000); + .tohost : { *(.tohost) } + + . = ALIGN(0x1000); + .uvmif : { *(.uvmif) } + + . = ALIGN(0x1000); + .text : { *(.text) } + . = ALIGN(0x1000); + .text.startup : { *(.text.startup) } + . = ALIGN(0x1000); + _end_text = .; + . = ALIGN(0x1000); + .rodata : { *(.rodata*)} + . = ALIGN(0x8); + . = ALIGN(0x1000); + .page_table : { *(.page_table) } + .user_stack : { *(.user_stack) } + .kernel_data : { *(.kernel_data) } + .kernel_stack : { *(.kernel_stack) } + + /* data segment */ + .data : { *(.data) } + + .sdata : { + __global_pointer$ = . + 0x800; + *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*) + *(.sdata .sdata.* .gnu.linkonce.s.*) + } + + /* bss segment */ + .sbss : { + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } + .bss : { *(.bss) } + + /* thread-local data segment */ + .tdata : + { + _tdata_begin = .; + *(.tdata) + _tdata_end = .; + } + .tbss : + { + *(.tbss) + _tbss_end = .; + } + + /* End of uninitalized data segement */ + _end = .; +} \ No newline at end of file diff --git a/verif/tests/custom/zcmt/riscv_test.h b/verif/tests/custom/zcmt/riscv_test.h new file mode 100644 index 0000000000..384b06138b --- /dev/null +++ b/verif/tests/custom/zcmt/riscv_test.h @@ -0,0 +1,272 @@ +// See LICENSE for license details. + +#ifndef _ENV_PHYSICAL_SINGLE_CORE_H +#define _ENV_PHYSICAL_SINGLE_CORE_H + +#include "encoding.h" + +//----------------------------------------------------------------------- +// Begin Macro +//----------------------------------------------------------------------- + +#define RVTEST_RV64U \ + .macro init; \ + .endm + +#define RVTEST_RV64UF \ + .macro init; \ + RVTEST_FP_ENABLE; \ + .endm + +#define RVTEST_RV64UV \ + .macro init; \ + RVTEST_VECTOR_ENABLE; \ + .endm + +#define RVTEST_RV32U \ + .macro init; \ + .endm + +#define RVTEST_RV32UF \ + .macro init; \ + RVTEST_FP_ENABLE; \ + .endm + +#define RVTEST_RV32UV \ + .macro init; \ + RVTEST_VECTOR_ENABLE; \ + .endm + +#define RVTEST_RV64M \ + .macro init; \ + RVTEST_ENABLE_MACHINE; \ + .endm + +#define RVTEST_RV64S \ + .macro init; \ + RVTEST_ENABLE_SUPERVISOR; \ + .endm + +#define RVTEST_RV32M \ + .macro init; \ + RVTEST_ENABLE_MACHINE; \ + .endm + +#define RVTEST_RV32S \ + .macro init; \ + RVTEST_ENABLE_SUPERVISOR; \ + .endm + +#if __riscv_xlen == 64 +# define CHECK_XLEN li a0, 1; slli a0, a0, 31; bgez a0, 1f; RVTEST_PASS; 1: +#else +# define CHECK_XLEN li a0, 1; slli a0, a0, 31; bltz a0, 1f; RVTEST_PASS; 1: +#endif + +#define INIT_XREG \ + li x1, 0; \ + li x2, 0; \ + li x3, 0; \ + li x4, 0; \ + li x5, 0; \ + li x6, 0; \ + li x7, 0; \ + li x8, 0; \ + li x9, 0; \ + li x10, 0; \ + li x11, 0; \ + li x12, 0; \ + li x13, 0; \ + li x14, 0; \ + li x15, 0; \ + li x16, 0; \ + li x17, 0; \ + li x18, 0; \ + li x19, 0; \ + li x20, 0; \ + li x21, 0; \ + li x22, 0; \ + li x23, 0; \ + li x24, 0; \ + li x25, 0; \ + li x26, 0; \ + li x27, 0; \ + li x28, 0; \ + li x29, 0; \ + li x30, 0; \ + li x31, 0; + +#define INIT_PMP \ + la t0, 1f; \ + csrw mtvec, t0; \ + /* Set up a PMP to permit all accesses */ \ + li t0, (1 << (31 + (__riscv_xlen / 64) * (53 - 31))) - 1; \ + csrw pmpaddr0, t0; \ + li t0, PMP_NAPOT | PMP_R | PMP_W | PMP_X; \ + csrw pmpcfg0, t0; \ + .align 2; \ +1: + +#define INIT_SATP \ + la t0, 1f; \ + csrw mtvec, t0; \ + csrwi satp, 0; \ + .align 2; \ +1: + +#define DELEGATE_NO_TRAPS \ + la t0, 1f; \ + csrw mtvec, t0; \ + csrwi medeleg, 0; \ + csrwi mideleg, 0; \ + csrwi mie, 0; \ + .align 2; \ +1: + +#define RVTEST_ENABLE_SUPERVISOR \ + li a0, MSTATUS_MPP & (MSTATUS_MPP >> 1); \ + csrs mstatus, a0; \ + li a0, SIP_SSIP | SIP_STIP; \ + csrs mideleg, a0; \ + +#define RVTEST_ENABLE_MACHINE \ + li a0, MSTATUS_MPP; \ + csrs mstatus, a0; \ + +#define RVTEST_FP_ENABLE \ + li a0, MSTATUS_FS & (MSTATUS_FS >> 1); \ + csrs mstatus, a0; \ + csrwi fcsr, 0 + +#define RVTEST_VECTOR_ENABLE \ + li a0, (MSTATUS_VS & (MSTATUS_VS >> 1)) | \ + (MSTATUS_FS & (MSTATUS_FS >> 1)); \ + csrs mstatus, a0; \ + csrwi fcsr, 0; \ + csrwi vcsr, 0; + +#define RISCV_MULTICORE_DISABLE \ + csrr a0, mhartid; \ + 1: bnez a0, 1b + +#define EXTRA_TVEC_USER +#define EXTRA_TVEC_MACHINE +#define EXTRA_INIT +#define EXTRA_INIT_TIMER + +#define INTERRUPT_HANDLER j other_exception /* No interrupts should occur */ + +#define RVTEST_CODE_BEGIN \ + .section .text.init; \ + .align 6; \ + .weak stvec_handler; \ + .weak mtvec_handler; \ + .globl _start; \ +_start: \ + /* reset vector */ \ + j reset_vector; \ + .align 2; \ +trap_vector: \ + /* test whether the test came from pass/fail */ \ + csrr t5, mcause; \ + li t6, CAUSE_USER_ECALL; \ + beq t5, t6, write_tohost; \ + li t6, CAUSE_SUPERVISOR_ECALL; \ + beq t5, t6, write_tohost; \ + li t6, CAUSE_MACHINE_ECALL; \ + beq t5, t6, write_tohost; \ + /* if an mtvec_handler is defined, jump to it */ \ + la t5, mtvec_handler; \ + beqz t5, 1f; \ + jr t5; \ + /* was it an interrupt or an exception? */ \ + 1: csrr t5, mcause; \ + bgez t5, handle_exception; \ + INTERRUPT_HANDLER; \ +handle_exception: \ + /* we don't know how to handle whatever the exception was */ \ + other_exception: \ + /* some unhandlable exception occurred */ \ + 1: ori TESTNUM, TESTNUM, 1337; \ + write_tohost: \ + sw TESTNUM, tohost, t5; \ + j write_tohost; \ +reset_vector: \ + INIT_XREG; \ + RISCV_MULTICORE_DISABLE; \ + INIT_SATP; \ + INIT_PMP; \ + DELEGATE_NO_TRAPS; \ + li TESTNUM, 0; \ + la t0, trap_vector; \ + csrw mtvec, t0; \ + CHECK_XLEN; \ + /* if an stvec_handler is defined, delegate exceptions to it */ \ + la t0, stvec_handler; \ + beqz t0, 1f; \ + csrw stvec, t0; \ + li t0, (1 << CAUSE_LOAD_PAGE_FAULT) | \ + (1 << CAUSE_STORE_PAGE_FAULT) | \ + (1 << CAUSE_FETCH_PAGE_FAULT) | \ + (1 << CAUSE_MISALIGNED_FETCH) | \ + (1 << CAUSE_USER_ECALL) | \ + (1 << CAUSE_BREAKPOINT); \ + csrw medeleg, t0; \ +1: csrwi mstatus, 0; \ + init; \ + EXTRA_INIT; \ + EXTRA_INIT_TIMER; \ + la t0, 1f; \ + csrw mepc, t0; \ + csrr a0, mhartid; \ + mret; \ +1: + +//----------------------------------------------------------------------- +// End Macro +//----------------------------------------------------------------------- + +#define RVTEST_CODE_END \ + unimp + +//----------------------------------------------------------------------- +// Pass/Fail Macro +//----------------------------------------------------------------------- + +#define RVTEST_PASS \ + fence; \ + li TESTNUM, 1; \ + li a7, 93; \ + li a0, 0; \ + ecall + +#define TESTNUM gp +#define RVTEST_FAIL \ + fence; \ +1: beqz TESTNUM, 1b; \ + sll TESTNUM, TESTNUM, 1; \ + or TESTNUM, TESTNUM, 1; \ + li a7, 93; \ + addi a0, TESTNUM, 0; \ + ecall + +//----------------------------------------------------------------------- +// Data Section Macro +//----------------------------------------------------------------------- + +#define EXTRA_DATA + +#define RVTEST_DATA_BEGIN \ + EXTRA_DATA \ + .pushsection .tohost,"aw",@progbits; \ + .align 6; .global tohost; tohost: .dword 0; \ + .align 6; .global fromhost; fromhost: .dword 0; \ + .popsection; \ + .pushsection .uvmif,"aw",@progbits; \ + .align 6; .global int_ack; int_ack: .dword 0; \ + .popsection; \ + .align 4; .global begin_signature; begin_signature: + +#define RVTEST_DATA_END .align 4; .global end_signature; end_signature: + +#endif \ No newline at end of file diff --git a/verif/tests/custom/zcmt/syscalls.c b/verif/tests/custom/zcmt/syscalls.c new file mode 100644 index 0000000000..daa53cfcf3 --- /dev/null +++ b/verif/tests/custom/zcmt/syscalls.c @@ -0,0 +1,521 @@ +// See LICENSE for license details. + +#include +#include +#include +#include +#include +#include +#include "util.h" + +#define SYS_write 64 + +#undef strcmp + +extern volatile uint64_t tohost; +extern volatile uint64_t fromhost; + +// tohost is 64 bits wide, irrespective of XLEN. The structure expected in Spike is: +// - tohost[63:56] == device (syscall: 0) +// - tohost[55:48] == command (syscall: 0) +// - tohost[47:0] == payload (syscall: address of magic_mem) +// +// magic_mem for a syscall contains the following elements (XLEN bits each) +// - syscall index (93 dec for syscall_exit, cf. Spike values in +// riscv-isa-sim/fesvr/syscall.cc:140 and ff.) +// - syscall args in the declaration order of the given syscall + +static uintptr_t syscall(uintptr_t which, uintptr_t arg0, uintptr_t arg1, uintptr_t arg2) +{ + // Arguments in magic_mem have XLEN bits each. + volatile uintptr_t magic_mem[8] __attribute__((aligned(64))); + magic_mem[0] = which; + magic_mem[1] = arg0; + magic_mem[2] = arg1; + magic_mem[3] = arg2; +#ifdef __riscv_atomic // __sync_synchronize requires A extension + __sync_synchronize(); +#endif + + // A WRITE_MEM transaction writing non-zero value to TOHOST triggers + // the environment (Spike or RTL harness). + // - here tohost is guaranteed non-NULL because magic_mem is a valid RISC-V + // pointer. + // - the environment acknowledges the env request by writing 0 into tohost. + // - the completion of the request is signalled by the environment through + // a write of a non-zero value into fromhost. + tohost = (((uint64_t) ((unsigned long int) magic_mem)) << 16) >> 16; // clear the DEV and CMD bytes, clip payload. + while (fromhost == 0) + ; + fromhost = 0; + +#ifdef __riscv_atomic // __sync_synchronize requires A extension + __sync_synchronize(); +#endif + return magic_mem[0]; +} + +#define NUM_COUNTERS 2 +static uintptr_t counters[NUM_COUNTERS]; +static char* counter_names[NUM_COUNTERS]; + +void setStats(int enable) +{ + int i = 0; +#define READ_CTR(name) do { \ + while (i >= NUM_COUNTERS) ; \ + uintptr_t csr = read_csr(name); \ + if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ + counters[i++] = csr; \ + } while (0) + + READ_CTR(mcycle); + READ_CTR(minstret); + +#undef READ_CTR +} + +uintptr_t getStats(int counterid) +{ + return counters[counterid]; +} + +void __attribute__((noreturn)) tohost_exit(uintptr_t code) +{ + // Simply write PASS/FAIL result into 'tohost'. + // Left shift 'code' by 1 and set bit 0 to 1, but leave the 16 uppermost bits clear + // so that the syscall is properly recognized even if 'code' value is very large. + tohost = ((((uint64_t) code) << 17) >> 16) | 1; + + // Do not care about the value returned by host. + // Leave 1 cycle of slack (one NOP instruction) to help debugging + // the termination mechanism if needed. + __asm__("nop\n\t"); + + // Go into an endless loop if the write into 'tohost' did not terminate the simulation. + while (1); +} + +uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) +{ + tohost_exit(1337); +} + +void exit(int code) +{ + tohost_exit(code); +} + +void abort() +{ + exit(128 + SIGABRT); +} + +void printstr(const char* s) +{ +#if !NOPRINT + syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); +#endif +} + +void __attribute__((weak)) thread_entry(int cid, int nc) +{ + // multi-threaded programs override this function. + // for the case of single-threaded programs, only let core 0 proceed. + while (cid != 0); +} + +int __attribute__((weak)) main(int argc, char** argv) +{ + // single-threaded programs override this function. + printstr("Implement main(), foo!\n"); + return -1; +} + +static void init_tls() +{ + register void* thread_pointer asm("tp"); + extern char _tdata_begin, _tdata_end, _tbss_end; + size_t tdata_size = &_tdata_end - &_tdata_begin; + memcpy(thread_pointer, &_tdata_begin, tdata_size); + size_t tbss_size = &_tbss_end - &_tdata_end; + memset(thread_pointer + tdata_size, 0, tbss_size); +} + +void _init(int cid, int nc) +{ + init_tls(); + thread_entry(cid, nc); + + // only single-threaded programs should ever get here. + int ret = main(0, 0); + + char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); + char* pbuf = buf; + for (int i = 0; i < NUM_COUNTERS; i++) + if (counters[i]) + pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); + if (pbuf != buf) + printstr(buf); + + exit(ret); +} + +int puts(const char *s) +{ + const char *p = s; + + while (*p) + putchar(*p++); + + putchar('\n'); + return 0; +} + +#undef putchar +int putchar(int ch) +{ +#if !NOPRINT + static __thread char buf[64] __attribute__((aligned(64))); + static __thread int buflen = 0; + + buf[buflen++] = ch; + + if (ch == '\n' || buflen == sizeof(buf)) + { + syscall(SYS_write, 1, (uintptr_t)buf, buflen); + buflen = 0; + } +#endif + + return 0; +} + +void printhex(uint64_t x) +{ + char str[17]; + int i; + for (i = 0; i < 16; i++) + { + str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); + x >>= 4; + } + str[16] = 0; + + printstr(str); +} + +static inline void printnum(void (*putch)(int, void**), void **putdat, + unsigned long long num, unsigned base, int width, int padc) +{ + unsigned digs[sizeof(num)*CHAR_BIT]; + int pos = 0; + + while (1) + { + digs[pos++] = num % base; + if (num < base) + break; + num /= base; + } + + while (width-- > pos) + putch(padc, putdat); + + while (pos-- > 0) + putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); +} + +static unsigned long long getuint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, unsigned long long); + else if (lflag) + return va_arg(*ap, unsigned long); + else + return va_arg(*ap, unsigned int); +} + +static long long getint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, long long); + else if (lflag) + return va_arg(*ap, long); + else + return va_arg(*ap, int); +} + +static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) +{ + register const char* p; + const char* last_fmt; + register int ch, err; + unsigned long long num; + int base, lflag, width, precision, altflag; + char padc; + + while (1) { + while ((ch = *(unsigned char *) fmt) != '%') { + if (ch == '\0') + return; + fmt++; + putch(ch, putdat); + } + fmt++; + + // Process a %-escape sequence + last_fmt = fmt; + padc = ' '; + width = -1; + precision = -1; + lflag = 0; + altflag = 0; + reswitch: + switch (ch = *(unsigned char *) fmt++) { + + // flag to pad on the right + case '-': + padc = '-'; + goto reswitch; + + // flag to pad with 0's instead of spaces + case '0': + padc = '0'; + goto reswitch; + + // width field + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + for (precision = 0; ; ++fmt) { + precision = precision * 10 + ch - '0'; + ch = *fmt; + if (ch < '0' || ch > '9') + break; + } + goto process_precision; + + case '*': + precision = va_arg(ap, int); + goto process_precision; + + case '.': + if (width < 0) + width = 0; + goto reswitch; + + case '#': + altflag = 1; + goto reswitch; + + process_precision: + if (width < 0) + width = precision, precision = -1; + goto reswitch; + + // long flag (doubled for long long) + case 'l': + lflag++; + goto reswitch; + + // character + case 'c': + putch(va_arg(ap, int), putdat); + break; + + // string + case 's': + if ((p = va_arg(ap, char *)) == NULL) + p = "(null)"; + if (width > 0 && padc != '-') + for (width -= strnlen(p, precision); width > 0; width--) + putch(padc, putdat); + for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { + putch(ch, putdat); + p++; + } + for (; width > 0; width--) + putch(' ', putdat); + break; + + // (signed) decimal + case 'd': + num = getint(&ap, lflag); + if ((long long) num < 0) { + putch('-', putdat); + num = -(long long) num; + } + base = 10; + goto signed_number; + + // unsigned decimal + case 'u': + base = 10; + goto unsigned_number; + + // (unsigned) octal + case 'o': + // should do something with padding so it's always 3 octits + base = 8; + goto unsigned_number; + + // pointer + case 'p': + static_assert(sizeof(long) == sizeof(void*)); + lflag = 1; + putch('0', putdat); + putch('x', putdat); + /* fall through to 'x' */ + + // (unsigned) hexadecimal + case 'x': + base = 16; + unsigned_number: + num = getuint(&ap, lflag); + signed_number: + printnum(putch, putdat, num, base, width, padc); + break; + + // escaped '%' character + case '%': + putch(ch, putdat); + break; + + // unrecognized escape sequence - just print it literally + default: + putch('%', putdat); + fmt = last_fmt; + break; + } + } +} + +int printf(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + vprintfmt((void*)putchar, 0, fmt, ap); + + va_end(ap); + return 0; // incorrect return value, but who cares, anyway? +} + +int sprintf(char* str, const char* fmt, ...) +{ + va_list ap; + char* str0 = str; + va_start(ap, fmt); + + void sprintf_putch(int ch, void** data) + { + char** pstr = (char**)data; + **pstr = ch; + (*pstr)++; + } + + vprintfmt(sprintf_putch, (void**)&str, fmt, ap); + *str = 0; + + va_end(ap); + return str - str0; +} + +void* memcpy(void* dest, const void* src, size_t len) +{ + if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { + const uintptr_t* s = src; + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = *s++; + } else { + const char* s = src; + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = *s++; + } + return dest; +} + +void* memset(void* dest, int byte, size_t len) +{ + if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { + uintptr_t word = byte & 0xFF; + word |= word << 8; + word |= word << 16; + word |= word << 16 << 16; + + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = word; + } else { + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = byte; + } + return dest; +} + +size_t strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +size_t strnlen(const char *s, size_t n) +{ + const char *p = s; + while (n-- && *p) + p++; + return p - s; +} + +int strcmp(const char* s1, const char* s2) +{ + unsigned char c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + } while (c1 != 0 && c1 == c2); + + return c1 - c2; +} + +char* strcpy(char* dest, const char* src) +{ + char* d = dest; + while ((*d++ = *src++)) + ; + return dest; +} + +long atol(const char* str) +{ + long res = 0; + int sign = 0; + + while (*str == ' ') + str++; + + if (*str == '-' || *str == '+') { + sign = *str == '-'; + str++; + } + + while (*str) { + res *= 10; + res += *str++ - '0'; + } + + return sign ? -res : res; +} \ No newline at end of file diff --git a/verif/tests/custom/zcmt/util.h b/verif/tests/custom/zcmt/util.h new file mode 100644 index 0000000000..1758ece6f5 --- /dev/null +++ b/verif/tests/custom/zcmt/util.h @@ -0,0 +1,92 @@ +// See LICENSE for license details. + +#ifndef __UTIL_H +#define __UTIL_H + +extern void setStats(int enable); + +#include + +#define static_assert(cond) switch(0) { case 0: case !!(long)(cond): ; } + +static int verify(int n, const volatile int* test, const int* verify) +{ + int i; + // Unrolled for faster verification + for (i = 0; i < n/2*2; i+=2) + { + int t0 = test[i], t1 = test[i+1]; + int v0 = verify[i], v1 = verify[i+1]; + if (t0 != v0) return i+1; + if (t1 != v1) return i+2; + } + if (n % 2 != 0 && test[n-1] != verify[n-1]) + return n; + return 0; +} + +static int verifyDouble(int n, const volatile double* test, const double* verify) +{ + int i; + // Unrolled for faster verification + for (i = 0; i < n/2*2; i+=2) + { + double t0 = test[i], t1 = test[i+1]; + double v0 = verify[i], v1 = verify[i+1]; + int eq1 = t0 == v0, eq2 = t1 == v1; + if (!(eq1 & eq2)) return i+1+eq1; + } + if (n % 2 != 0 && test[n-1] != verify[n-1]) + return n; + return 0; +} + +static void __attribute__((noinline)) barrier(int ncores) +{ +#ifdef __riscv_atomic // __sync_* builtins require A extension + static volatile int sense; + static volatile int count; + static __thread int threadsense; + + __sync_synchronize(); + + threadsense = !threadsense; + if (__sync_fetch_and_add(&count, 1) == ncores-1) + { + count = 0; + sense = threadsense; + } + else while(sense != threadsense) + ; + + __sync_synchronize(); +#endif // __riscv_atomic +} + +static uint64_t lfsr(uint64_t x) +{ + uint64_t bit = (x ^ (x >> 1)) & 1; + return (x >> 1) | (bit << 62); +} + +static uintptr_t insn_len(uintptr_t pc) +{ + return (*(unsigned short*)pc & 3) ? 4 : 2; +} + +#ifdef __riscv +#include "encoding.h" +#endif + +#define stringify_1(s) #s +#define stringify(s) stringify_1(s) +#define stats(code, iter) do { \ + unsigned long _c = -read_csr(mcycle), _i = -read_csr(minstret); \ + code; \ + _c += read_csr(mcycle), _i += read_csr(minstret); \ + if (cid == 0) \ + printf("\n%s: %ld cycles, %ld.%ld cycles/iter, %ld.%ld CPI\n", \ + stringify(code), _c, _c/iter, 10*_c/iter%10, _c/_i, 10*_c/_i%10); \ + } while(0) + +#endif //__UTIL_H \ No newline at end of file diff --git a/verif/tests/testlist_pmp-cv32a65x.yaml b/verif/tests/testlist_pmp-cv32a65x.yaml new file mode 100644 index 0000000000..fa3da4cdd5 --- /dev/null +++ b/verif/tests/testlist_pmp-cv32a65x.yaml @@ -0,0 +1,77 @@ +# Copyright 2025 Thales CDI +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https:#solderpad.org/licenses/ +# +# Original Author: Valentin Thomazic (valentin.thomazic@thalesgroup.com) + +# ================================================================================ +# Regression test list format +# -------------------------------------------------------------------------------- +# testlist : Assembly test list +# test : Assembly test name +# description : Description of this test +# gen_opts : Instruction generator options +# iterations : Number of iterations of this test +# no_iss : Enable/disable ISS simulator (Optional) +# gen_test : Test name used by the instruction generator +# asm_tests : Path to directed, hand-coded assembly test file or directory +# rtl_test : RTL simulation test name +# cmp_opts : Compile options passed to the instruction generator +# sim_opts : Simulation options passed to the instruction generator +# no_post_compare : Enable/disable comparison of trace log and ISS log (Optional) +# compare_opts : Options for the RTL & ISS trace comparison +# gcc_opts : gcc compile options +# -------------------------------------------------------------------------------- + +common_test_config: &common_test_config + path_var: TESTS_PATH + gcc_opts: "-static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles ../tests/custom/common/syscalls.c ../tests/custom/common/crt.S -I../tests/custom/env -I../tests/custom/common -lgcc" + +testlist: + - test: decreasing_entries_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/decreasing_entries_test.S + + - test: defined_matches + <<: *common_test_config + iterations: 0 + asm_tests: /custom/pmp/defined_matches.S + + - test: double_entries_test + <<: *common_test_config + iterations: 0 + asm_tests: /custom/pmp/double_entries_test.S + + - test: exact_csrr_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/exact_csrr_test.S + + - test: granularity_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/granularity_test.S + + - test: locked_outside_napot_test + <<: *common_test_config + iterations: 0 + asm_tests: /custom/pmp/locked_outside_napot_test.S + + - test: locked_outside_tor_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/locked_outside_tor_test.S + + - test: lsu_napot_test + <<: *common_test_config + iterations: 0 + asm_tests: /custom/pmp/lsu_napot_test.S + + - test: lsu_tor_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/lsu_tor_test.S diff --git a/verif/tests/testlist_pmp-cv32a65x_axi.yaml b/verif/tests/testlist_pmp-cv32a65x_axi.yaml new file mode 100644 index 0000000000..fa3da4cdd5 --- /dev/null +++ b/verif/tests/testlist_pmp-cv32a65x_axi.yaml @@ -0,0 +1,77 @@ +# Copyright 2025 Thales CDI +# +# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +# You may obtain a copy of the License at https:#solderpad.org/licenses/ +# +# Original Author: Valentin Thomazic (valentin.thomazic@thalesgroup.com) + +# ================================================================================ +# Regression test list format +# -------------------------------------------------------------------------------- +# testlist : Assembly test list +# test : Assembly test name +# description : Description of this test +# gen_opts : Instruction generator options +# iterations : Number of iterations of this test +# no_iss : Enable/disable ISS simulator (Optional) +# gen_test : Test name used by the instruction generator +# asm_tests : Path to directed, hand-coded assembly test file or directory +# rtl_test : RTL simulation test name +# cmp_opts : Compile options passed to the instruction generator +# sim_opts : Simulation options passed to the instruction generator +# no_post_compare : Enable/disable comparison of trace log and ISS log (Optional) +# compare_opts : Options for the RTL & ISS trace comparison +# gcc_opts : gcc compile options +# -------------------------------------------------------------------------------- + +common_test_config: &common_test_config + path_var: TESTS_PATH + gcc_opts: "-static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles ../tests/custom/common/syscalls.c ../tests/custom/common/crt.S -I../tests/custom/env -I../tests/custom/common -lgcc" + +testlist: + - test: decreasing_entries_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/decreasing_entries_test.S + + - test: defined_matches + <<: *common_test_config + iterations: 0 + asm_tests: /custom/pmp/defined_matches.S + + - test: double_entries_test + <<: *common_test_config + iterations: 0 + asm_tests: /custom/pmp/double_entries_test.S + + - test: exact_csrr_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/exact_csrr_test.S + + - test: granularity_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/granularity_test.S + + - test: locked_outside_napot_test + <<: *common_test_config + iterations: 0 + asm_tests: /custom/pmp/locked_outside_napot_test.S + + - test: locked_outside_tor_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/locked_outside_tor_test.S + + - test: lsu_napot_test + <<: *common_test_config + iterations: 0 + asm_tests: /custom/pmp/lsu_napot_test.S + + - test: lsu_tor_test + <<: *common_test_config + iterations: 1 + asm_tests: /custom/pmp/lsu_tor_test.S diff --git a/verif/tests/uvmt/compliance-tests/uvmt_cva6_firmware_test.sv b/verif/tests/uvmt/compliance-tests/uvmt_cva6_firmware_test.sv index eb6f7adc3d..8ba4eb6344 100644 --- a/verif/tests/uvmt/compliance-tests/uvmt_cva6_firmware_test.sv +++ b/verif/tests/uvmt/compliance-tests/uvmt_cva6_firmware_test.sv @@ -143,7 +143,7 @@ task uvmt_cva6_firmware_test_c::run_phase(uvm_phase phase); `uvm_info("TEST", "Test FINISHED", UVM_NONE) // Set sim_finished (otherwise tb will flag that sim was aborted) uvm_config_db#(bit)::set(null, "", "sim_finished", 1); - uvm_config_db#(int)::set(null, "", "test_exit_code", { 0'b0, tb_exit_vif.tb_exit_o[31:1] }); + uvm_config_db#(int)::set(null, "", "test_exit_code", { 1'b0, tb_exit_vif.tb_exit_o[31:1] }); // Let the termination-triggering instruction appear in the log. @(posedge env_cntxt.clknrst_cntxt.vif.clk); // Let all pending AXI requests settle.