commit f4c0960704417f9f53ba41c9a4af9409f1fe3821 Author: Andrei Solodovnikov Date: Thu Sep 7 17:04:37 2023 +0300 Initial commit diff --git a/.pic/Basic Verilog structures/concatenation/fig_01.drawio.png b/.pic/Basic Verilog structures/concatenation/fig_01.drawio.png new file mode 100644 index 0000000..c3265e4 Binary files /dev/null and b/.pic/Basic Verilog structures/concatenation/fig_01.drawio.png differ diff --git a/.pic/Basic Verilog structures/concatenation/fig_02.drawio.png b/.pic/Basic Verilog structures/concatenation/fig_02.drawio.png new file mode 100644 index 0000000..d8cc32b Binary files /dev/null and b/.pic/Basic Verilog structures/concatenation/fig_02.drawio.png differ diff --git a/.pic/Basic Verilog structures/concatenation/fig_03.drawio.png b/.pic/Basic Verilog structures/concatenation/fig_03.drawio.png new file mode 100644 index 0000000..797586f Binary files /dev/null and b/.pic/Basic Verilog structures/concatenation/fig_03.drawio.png differ diff --git a/.pic/Basic Verilog structures/controllers/fig_01.drawio.png b/.pic/Basic Verilog structures/controllers/fig_01.drawio.png new file mode 100644 index 0000000..15147c9 Binary files /dev/null and b/.pic/Basic Verilog structures/controllers/fig_01.drawio.png differ diff --git a/.pic/Basic Verilog structures/controllers/fig_02.drawio.png b/.pic/Basic Verilog structures/controllers/fig_02.drawio.png new file mode 100644 index 0000000..70e3035 Binary files /dev/null and b/.pic/Basic Verilog structures/controllers/fig_02.drawio.png differ diff --git a/.pic/Basic Verilog structures/controllers/fig_03.drawio.png b/.pic/Basic Verilog structures/controllers/fig_03.drawio.png new file mode 100644 index 0000000..fd32f0c Binary files /dev/null and b/.pic/Basic Verilog structures/controllers/fig_03.drawio.png differ diff --git a/.pic/Basic Verilog structures/controllers/fig_04.drawio.png b/.pic/Basic Verilog structures/controllers/fig_04.drawio.png new file mode 100644 index 0000000..6d65aae Binary files /dev/null and b/.pic/Basic Verilog structures/controllers/fig_04.drawio.png differ diff --git a/.pic/Basic Verilog structures/controllers/fig_05.drawio.png b/.pic/Basic Verilog structures/controllers/fig_05.drawio.png new file mode 100644 index 0000000..9cfc8ee Binary files /dev/null and b/.pic/Basic Verilog structures/controllers/fig_05.drawio.png differ diff --git a/.pic/Basic Verilog structures/controllers/fig_06.drawio.png b/.pic/Basic Verilog structures/controllers/fig_06.drawio.png new file mode 100644 index 0000000..2a4b61c Binary files /dev/null and b/.pic/Basic Verilog structures/controllers/fig_06.drawio.png differ diff --git a/.pic/Basic Verilog structures/controllers/fig_07.drawio.png b/.pic/Basic Verilog structures/controllers/fig_07.drawio.png new file mode 100644 index 0000000..296e622 Binary files /dev/null and b/.pic/Basic Verilog structures/controllers/fig_07.drawio.png differ diff --git a/.pic/Basic Verilog structures/controllers/fig_08.drawio.png b/.pic/Basic Verilog structures/controllers/fig_08.drawio.png new file mode 100644 index 0000000..c9ae2e3 Binary files /dev/null and b/.pic/Basic Verilog structures/controllers/fig_08.drawio.png differ diff --git a/.pic/Basic Verilog structures/controllers/fig_09.drawio.png b/.pic/Basic Verilog structures/controllers/fig_09.drawio.png new file mode 100644 index 0000000..8ebe3e6 Binary files /dev/null and b/.pic/Basic Verilog structures/controllers/fig_09.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_00.jpg b/.pic/Basic Verilog structures/modules/fig_00.jpg new file mode 100644 index 0000000..119ae02 Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_00.jpg differ diff --git a/.pic/Basic Verilog structures/modules/fig_01.drawio.png b/.pic/Basic Verilog structures/modules/fig_01.drawio.png new file mode 100644 index 0000000..ab3deae Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_01.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_02.drawio.png b/.pic/Basic Verilog structures/modules/fig_02.drawio.png new file mode 100644 index 0000000..82870c5 Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_02.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_03.drawio.png b/.pic/Basic Verilog structures/modules/fig_03.drawio.png new file mode 100644 index 0000000..f736598 Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_03.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_04.drawio.png b/.pic/Basic Verilog structures/modules/fig_04.drawio.png new file mode 100644 index 0000000..b7033f5 Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_04.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_05.drawio.png b/.pic/Basic Verilog structures/modules/fig_05.drawio.png new file mode 100644 index 0000000..bbe563e Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_05.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_06.drawio.png b/.pic/Basic Verilog structures/modules/fig_06.drawio.png new file mode 100644 index 0000000..3423950 Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_06.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_07.drawio.png b/.pic/Basic Verilog structures/modules/fig_07.drawio.png new file mode 100644 index 0000000..bd89b94 Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_07.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_08.drawio.png b/.pic/Basic Verilog structures/modules/fig_08.drawio.png new file mode 100644 index 0000000..5b0bbd5 Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_08.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_09.drawio.png b/.pic/Basic Verilog structures/modules/fig_09.drawio.png new file mode 100644 index 0000000..35df915 Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_09.drawio.png differ diff --git a/.pic/Basic Verilog structures/modules/fig_10.drawio.png b/.pic/Basic Verilog structures/modules/fig_10.drawio.png new file mode 100644 index 0000000..362fdf9 Binary files /dev/null and b/.pic/Basic Verilog structures/modules/fig_10.drawio.png differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_01.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_01.drawio.png new file mode 100644 index 0000000..e81db96 Binary files /dev/null and b/.pic/Basic Verilog structures/multiplexors/fig_01.drawio.png differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_02.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_02.drawio.png new file mode 100644 index 0000000..fcebdc1 Binary files /dev/null and b/.pic/Basic Verilog structures/multiplexors/fig_02.drawio.png differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_03.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_03.drawio.png new file mode 100644 index 0000000..f8ed3da Binary files /dev/null and b/.pic/Basic Verilog structures/multiplexors/fig_03.drawio.png differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_04.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_04.drawio.png new file mode 100644 index 0000000..6154d6c Binary files /dev/null and b/.pic/Basic Verilog structures/multiplexors/fig_04.drawio.png differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_05.drawio.png b/.pic/Basic Verilog structures/multiplexors/fig_05.drawio.png new file mode 100644 index 0000000..176697f Binary files /dev/null and b/.pic/Basic Verilog structures/multiplexors/fig_05.drawio.png differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_06.png b/.pic/Basic Verilog structures/multiplexors/fig_06.png new file mode 100644 index 0000000..5922c02 Binary files /dev/null and b/.pic/Basic Verilog structures/multiplexors/fig_06.png differ diff --git a/.pic/Basic Verilog structures/multiplexors/fig_07.png b/.pic/Basic Verilog structures/multiplexors/fig_07.png new file mode 100644 index 0000000..bf3f684 Binary files /dev/null and b/.pic/Basic Verilog structures/multiplexors/fig_07.png differ diff --git a/.pic/Basic Verilog structures/registers/fig_01.drawio.png b/.pic/Basic Verilog structures/registers/fig_01.drawio.png new file mode 100644 index 0000000..bf1e368 Binary files /dev/null and b/.pic/Basic Verilog structures/registers/fig_01.drawio.png differ diff --git a/.pic/Basic Verilog structures/registers/fig_02.drawio.png b/.pic/Basic Verilog structures/registers/fig_02.drawio.png new file mode 100644 index 0000000..a65e24d Binary files /dev/null and b/.pic/Basic Verilog structures/registers/fig_02.drawio.png differ diff --git a/.pic/Basic Verilog structures/registers/fig_03.drawio.png b/.pic/Basic Verilog structures/registers/fig_03.drawio.png new file mode 100644 index 0000000..4a3aad3 Binary files /dev/null and b/.pic/Basic Verilog structures/registers/fig_03.drawio.png differ diff --git a/.pic/Basic Verilog structures/registers/fig_04.drawio.png b/.pic/Basic Verilog structures/registers/fig_04.drawio.png new file mode 100644 index 0000000..eef8ade Binary files /dev/null and b/.pic/Basic Verilog structures/registers/fig_04.drawio.png differ diff --git a/.pic/Basic Verilog structures/registers/fig_05.drawio.png b/.pic/Basic Verilog structures/registers/fig_05.drawio.png new file mode 100644 index 0000000..324b2bf Binary files /dev/null and b/.pic/Basic Verilog structures/registers/fig_05.drawio.png differ diff --git a/.pic/Basic Verilog structures/registers/fig_06.drawio.png b/.pic/Basic Verilog structures/registers/fig_06.drawio.png new file mode 100644 index 0000000..c3eedf9 Binary files /dev/null and b/.pic/Basic Verilog structures/registers/fig_06.drawio.png differ diff --git a/.pic/Basic Verilog structures/registers/fig_07.drawio.png b/.pic/Basic Verilog structures/registers/fig_07.drawio.png new file mode 100644 index 0000000..7e8cd5b Binary files /dev/null and b/.pic/Basic Verilog structures/registers/fig_07.drawio.png differ diff --git a/.pic/Basic Verilog structures/testbench/tb_1.png b/.pic/Basic Verilog structures/testbench/tb_1.png new file mode 100644 index 0000000..eeba199 Binary files /dev/null and b/.pic/Basic Verilog structures/testbench/tb_1.png differ diff --git a/.pic/Basic Verilog structures/testbench/tb_2.png b/.pic/Basic Verilog structures/testbench/tb_2.png new file mode 100644 index 0000000..ad40951 Binary files /dev/null and b/.pic/Basic Verilog structures/testbench/tb_2.png differ diff --git a/.pic/Basic Verilog structures/testbench/tb_3.png b/.pic/Basic Verilog structures/testbench/tb_3.png new file mode 100644 index 0000000..f25db8c Binary files /dev/null and b/.pic/Basic Verilog structures/testbench/tb_3.png differ diff --git a/.pic/Basic Verilog structures/testbench/tb_4.png b/.pic/Basic Verilog structures/testbench/tb_4.png new file mode 100644 index 0000000..c067ce7 Binary files /dev/null and b/.pic/Basic Verilog structures/testbench/tb_4.png differ diff --git a/.pic/Basic Verilog structures/verilog syntax/file_structure.png b/.pic/Basic Verilog structures/verilog syntax/file_structure.png new file mode 100644 index 0000000..aa9dc62 Binary files /dev/null and b/.pic/Basic Verilog structures/verilog syntax/file_structure.png differ diff --git a/.pic/Basic Verilog structures/verilog syntax/nets_variables.png b/.pic/Basic Verilog structures/verilog syntax/nets_variables.png new file mode 100644 index 0000000..8e5f9de Binary files /dev/null and b/.pic/Basic Verilog structures/verilog syntax/nets_variables.png differ diff --git a/.pic/Basic Verilog structures/verilog syntax/tri_state.png b/.pic/Basic Verilog structures/verilog syntax/tri_state.png new file mode 100644 index 0000000..31f4bfd Binary files /dev/null and b/.pic/Basic Verilog structures/verilog syntax/tri_state.png differ diff --git a/.pic/Introduction/About FPGA/EP2.jpg b/.pic/Introduction/About FPGA/EP2.jpg new file mode 100644 index 0000000..d1031fc Binary files /dev/null and b/.pic/Introduction/About FPGA/EP2.jpg differ diff --git a/.pic/Introduction/About FPGA/TinyFPGA.jpg b/.pic/Introduction/About FPGA/TinyFPGA.jpg new file mode 100644 index 0000000..65a7e81 Binary files /dev/null and b/.pic/Introduction/About FPGA/TinyFPGA.jpg differ diff --git a/.pic/Introduction/About FPGA/beatles.jpg b/.pic/Introduction/About FPGA/beatles.jpg new file mode 100644 index 0000000..a286956 Binary files /dev/null and b/.pic/Introduction/About FPGA/beatles.jpg differ diff --git a/.pic/Introduction/About FPGA/cyclone4.jpg b/.pic/Introduction/About FPGA/cyclone4.jpg new file mode 100644 index 0000000..a052f8a Binary files /dev/null and b/.pic/Introduction/About FPGA/cyclone4.jpg differ diff --git a/.pic/Introduction/About FPGA/ice.jpg b/.pic/Introduction/About FPGA/ice.jpg new file mode 100644 index 0000000..9f35f67 Binary files /dev/null and b/.pic/Introduction/About FPGA/ice.jpg differ diff --git a/.pic/Introduction/How FPGA works/FPGA_and_gate_transistor.drawio.png b/.pic/Introduction/How FPGA works/FPGA_and_gate_transistor.drawio.png new file mode 100644 index 0000000..8839a8e Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_and_gate_transistor.drawio.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_ang_gate.png b/.pic/Introduction/How FPGA works/FPGA_ang_gate.png new file mode 100644 index 0000000..e7a738d Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_ang_gate.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_d_flip_flop.png b/.pic/Introduction/How FPGA works/FPGA_d_flip_flop.png new file mode 100644 index 0000000..22e250b Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_d_flip_flop.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_logic_cell.png b/.pic/Introduction/How FPGA works/FPGA_logic_cell.png new file mode 100644 index 0000000..08e6d5d Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_logic_cell.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_lut_scheme.drawio.png b/.pic/Introduction/How FPGA works/FPGA_lut_scheme.drawio.png new file mode 100644 index 0000000..673a790 Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_lut_scheme.drawio.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_initial.drawio.png b/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_initial.drawio.png new file mode 100644 index 0000000..9ac6159 Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_initial.drawio.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_output.drawio.png b/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_output.drawio.png new file mode 100644 index 0000000..faeee8e Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_output.drawio.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_path.drawio.png b/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_path.drawio.png new file mode 100644 index 0000000..b84466b Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_mux6in1_onehot_path.drawio.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_mux_symbol.png b/.pic/Introduction/How FPGA works/FPGA_mux_symbol.png new file mode 100644 index 0000000..768f5c7 Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_mux_symbol.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_not_gate.png b/.pic/Introduction/How FPGA works/FPGA_not_gate.png new file mode 100644 index 0000000..74d9371 Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_not_gate.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_or_gate.png b/.pic/Introduction/How FPGA works/FPGA_or_gate.png new file mode 100644 index 0000000..3af577b Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_or_gate.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_or_gate_tree.drawio.png b/.pic/Introduction/How FPGA works/FPGA_or_gate_tree.drawio.png new file mode 100644 index 0000000..d4c7d0e Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_or_gate_tree.drawio.png differ diff --git a/.pic/Introduction/How FPGA works/FPGA_xor_gate.png b/.pic/Introduction/How FPGA works/FPGA_xor_gate.png new file mode 100644 index 0000000..83fe29b Binary files /dev/null and b/.pic/Introduction/How FPGA works/FPGA_xor_gate.png differ diff --git a/.pic/Introduction/What is HDL/4004_arch.png b/.pic/Introduction/What is HDL/4004_arch.png new file mode 100644 index 0000000..94bef33 Binary files /dev/null and b/.pic/Introduction/What is HDL/4004_arch.png differ diff --git a/.pic/Introduction/What is HDL/aes_enc_sml.png b/.pic/Introduction/What is HDL/aes_enc_sml.png new file mode 100644 index 0000000..fe3d28c Binary files /dev/null and b/.pic/Introduction/What is HDL/aes_enc_sml.png differ diff --git a/.pic/Introduction/What is HDL/ancient_city.png b/.pic/Introduction/What is HDL/ancient_city.png new file mode 100644 index 0000000..12468b2 Binary files /dev/null and b/.pic/Introduction/What is HDL/ancient_city.png differ diff --git a/.pic/Introduction/What is HDL/i4004.gif b/.pic/Introduction/What is HDL/i4004.gif new file mode 100644 index 0000000..8eaed79 Binary files /dev/null and b/.pic/Introduction/What is HDL/i4004.gif differ diff --git a/.pic/Labs/board files/Program_Device1.png b/.pic/Labs/board files/Program_Device1.png new file mode 100644 index 0000000..b284684 Binary files /dev/null and b/.pic/Labs/board files/Program_Device1.png differ diff --git a/.pic/Labs/board files/Program_Device2.png b/.pic/Labs/board files/Program_Device2.png new file mode 100644 index 0000000..8f44117 Binary files /dev/null and b/.pic/Labs/board files/Program_Device2.png differ diff --git a/.pic/Labs/board files/alu_9.png b/.pic/Labs/board files/alu_9.png new file mode 100644 index 0000000..e488d34 Binary files /dev/null and b/.pic/Labs/board files/alu_9.png differ diff --git a/.pic/Labs/board files/nexys_adder1.png b/.pic/Labs/board files/nexys_adder1.png new file mode 100644 index 0000000..e2d5867 Binary files /dev/null and b/.pic/Labs/board files/nexys_adder1.png differ diff --git a/.pic/Labs/board files/nexys_adder2.png b/.pic/Labs/board files/nexys_adder2.png new file mode 100644 index 0000000..3b54398 Binary files /dev/null and b/.pic/Labs/board files/nexys_adder2.png differ diff --git a/.pic/Labs/board files/nexys_alu.png b/.pic/Labs/board files/nexys_alu.png new file mode 100644 index 0000000..7889b42 Binary files /dev/null and b/.pic/Labs/board files/nexys_alu.png differ diff --git a/.pic/Labs/board files/nexys_cobra.jpg b/.pic/Labs/board files/nexys_cobra.jpg new file mode 100644 index 0000000..e1e934f Binary files /dev/null and b/.pic/Labs/board files/nexys_cobra.jpg differ diff --git a/.pic/Labs/board files/nexys_rf1.jpg b/.pic/Labs/board files/nexys_rf1.jpg new file mode 100644 index 0000000..3e2c492 Binary files /dev/null and b/.pic/Labs/board files/nexys_rf1.jpg differ diff --git a/.pic/Labs/board files/nexys_rf2.jpg b/.pic/Labs/board files/nexys_rf2.jpg new file mode 100644 index 0000000..0e9c72f Binary files /dev/null and b/.pic/Labs/board files/nexys_rf2.jpg differ diff --git a/.pic/Labs/board files/nexys_rf3.jpg b/.pic/Labs/board files/nexys_rf3.jpg new file mode 100644 index 0000000..e3008d9 Binary files /dev/null and b/.pic/Labs/board files/nexys_rf3.jpg differ diff --git a/.pic/Labs/board files/nexys_rf4.jpg b/.pic/Labs/board files/nexys_rf4.jpg new file mode 100644 index 0000000..66ec03b Binary files /dev/null and b/.pic/Labs/board files/nexys_rf4.jpg differ diff --git a/.pic/Labs/board files/nexys_rf5.jpg b/.pic/Labs/board files/nexys_rf5.jpg new file mode 100644 index 0000000..be36bb2 Binary files /dev/null and b/.pic/Labs/board files/nexys_rf5.jpg differ diff --git a/.pic/Labs/l1.png b/.pic/Labs/l1.png new file mode 100644 index 0000000..a076f1d Binary files /dev/null and b/.pic/Labs/l1.png differ diff --git a/.pic/Labs/l10.png b/.pic/Labs/l10.png new file mode 100644 index 0000000..7bed173 Binary files /dev/null and b/.pic/Labs/l10.png differ diff --git a/.pic/Labs/l2.png b/.pic/Labs/l2.png new file mode 100644 index 0000000..0b88be0 Binary files /dev/null and b/.pic/Labs/l2.png differ diff --git a/.pic/Labs/l3.png b/.pic/Labs/l3.png new file mode 100644 index 0000000..77b6eb0 Binary files /dev/null and b/.pic/Labs/l3.png differ diff --git a/.pic/Labs/l4.png b/.pic/Labs/l4.png new file mode 100644 index 0000000..e26d048 Binary files /dev/null and b/.pic/Labs/l4.png differ diff --git a/.pic/Labs/l5.png b/.pic/Labs/l5.png new file mode 100644 index 0000000..1aea12d Binary files /dev/null and b/.pic/Labs/l5.png differ diff --git a/.pic/Labs/l6.png b/.pic/Labs/l6.png new file mode 100644 index 0000000..e81b79b Binary files /dev/null and b/.pic/Labs/l6.png differ diff --git a/.pic/Labs/l7.png b/.pic/Labs/l7.png new file mode 100644 index 0000000..a93deaa Binary files /dev/null and b/.pic/Labs/l7.png differ diff --git a/.pic/Labs/l8.png b/.pic/Labs/l8.png new file mode 100644 index 0000000..79473fd Binary files /dev/null and b/.pic/Labs/l8.png differ diff --git a/.pic/Labs/l9.png b/.pic/Labs/l9.png new file mode 100644 index 0000000..eca3400 Binary files /dev/null and b/.pic/Labs/l9.png differ diff --git a/.pic/Labs/lab_01_adder/column_add_bin.drawio.png b/.pic/Labs/lab_01_adder/column_add_bin.drawio.png new file mode 100644 index 0000000..a96bb2d Binary files /dev/null and b/.pic/Labs/lab_01_adder/column_add_bin.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/column_add_bin_transparent.drawio.png b/.pic/Labs/lab_01_adder/column_add_bin_transparent.drawio.png new file mode 100644 index 0000000..8b13979 Binary files /dev/null and b/.pic/Labs/lab_01_adder/column_add_bin_transparent.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/column_add_dec.drawio.png b/.pic/Labs/lab_01_adder/column_add_dec.drawio.png new file mode 100644 index 0000000..26ca608 Binary files /dev/null and b/.pic/Labs/lab_01_adder/column_add_dec.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/column_add_dec_transparent.drawio.png b/.pic/Labs/lab_01_adder/column_add_dec_transparent.drawio.png new file mode 100644 index 0000000..070eac6 Binary files /dev/null and b/.pic/Labs/lab_01_adder/column_add_dec_transparent.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/fig_01.drawio.png b/.pic/Labs/lab_01_adder/fig_01.drawio.png new file mode 100644 index 0000000..b91e3f9 Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_01.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/fig_01_transparent.drawio.png b/.pic/Labs/lab_01_adder/fig_01_transparent.drawio.png new file mode 100644 index 0000000..59d3a8f Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_01_transparent.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/fig_02.drawio.png b/.pic/Labs/lab_01_adder/fig_02.drawio.png new file mode 100644 index 0000000..4f29471 Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_02.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/fig_02_transparent.drawio.png b/.pic/Labs/lab_01_adder/fig_02_transparent.drawio.png new file mode 100644 index 0000000..1b5d874 Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_02_transparent.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/fig_03.png b/.pic/Labs/lab_01_adder/fig_03.png new file mode 100644 index 0000000..bec9b4d Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_03.png differ diff --git a/.pic/Labs/lab_01_adder/fig_04.png b/.pic/Labs/lab_01_adder/fig_04.png new file mode 100644 index 0000000..48479d3 Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_04.png differ diff --git a/.pic/Labs/lab_01_adder/fig_05.drawio.png b/.pic/Labs/lab_01_adder/fig_05.drawio.png new file mode 100644 index 0000000..c8ea7f6 Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_05.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/fig_05_transparent.drawio.png b/.pic/Labs/lab_01_adder/fig_05_transparent.drawio.png new file mode 100644 index 0000000..92d6dcc Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_05_transparent.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/fig_06.drawio.png b/.pic/Labs/lab_01_adder/fig_06.drawio.png new file mode 100644 index 0000000..a9c5bbd Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_06.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/fig_06_transparent.drawio.png b/.pic/Labs/lab_01_adder/fig_06_transparent.drawio.png new file mode 100644 index 0000000..a16908d Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_06_transparent.drawio.png differ diff --git a/.pic/Labs/lab_01_adder/fig_07.png b/.pic/Labs/lab_01_adder/fig_07.png new file mode 100644 index 0000000..1aba512 Binary files /dev/null and b/.pic/Labs/lab_01_adder/fig_07.png differ diff --git a/.pic/Labs/lab_01_adder/im_watching_you.jpg b/.pic/Labs/lab_01_adder/im_watching_you.jpg new file mode 100644 index 0000000..d74cd37 Binary files /dev/null and b/.pic/Labs/lab_01_adder/im_watching_you.jpg differ diff --git a/.pic/Labs/lab_01_adder/tt1.png b/.pic/Labs/lab_01_adder/tt1.png new file mode 100644 index 0000000..d2a61e5 Binary files /dev/null and b/.pic/Labs/lab_01_adder/tt1.png differ diff --git a/.pic/Labs/lab_01_adder/tt2.png b/.pic/Labs/lab_01_adder/tt2.png new file mode 100644 index 0000000..221db3e Binary files /dev/null and b/.pic/Labs/lab_01_adder/tt2.png differ diff --git a/.pic/Labs/lab_01_adder/tt3.png b/.pic/Labs/lab_01_adder/tt3.png new file mode 100644 index 0000000..16b3d46 Binary files /dev/null and b/.pic/Labs/lab_01_adder/tt3.png differ diff --git a/.pic/Labs/lab_01_adder/tt4.png b/.pic/Labs/lab_01_adder/tt4.png new file mode 100644 index 0000000..88d88f4 Binary files /dev/null and b/.pic/Labs/lab_01_adder/tt4.png differ diff --git a/.pic/Labs/lab_02_alu/fig_01.png b/.pic/Labs/lab_02_alu/fig_01.png new file mode 100644 index 0000000..739ae21 Binary files /dev/null and b/.pic/Labs/lab_02_alu/fig_01.png differ diff --git a/.pic/Labs/lab_02_alu/fig_02.png b/.pic/Labs/lab_02_alu/fig_02.png new file mode 100644 index 0000000..0720c3b Binary files /dev/null and b/.pic/Labs/lab_02_alu/fig_02.png differ diff --git a/.pic/Labs/lab_02_alu/fig_03.png b/.pic/Labs/lab_02_alu/fig_03.png new file mode 100644 index 0000000..bccbbbb Binary files /dev/null and b/.pic/Labs/lab_02_alu/fig_03.png differ diff --git a/.pic/Labs/lab_02_alu/fig_04.png b/.pic/Labs/lab_02_alu/fig_04.png new file mode 100644 index 0000000..53c3e8a Binary files /dev/null and b/.pic/Labs/lab_02_alu/fig_04.png differ diff --git a/.pic/Labs/lab_03_memory/fig_01.drawio.png b/.pic/Labs/lab_03_memory/fig_01.drawio.png new file mode 100644 index 0000000..b900d6b Binary files /dev/null and b/.pic/Labs/lab_03_memory/fig_01.drawio.png differ diff --git a/.pic/Labs/lab_03_memory/fig_02.png b/.pic/Labs/lab_03_memory/fig_02.png new file mode 100644 index 0000000..5241fcc Binary files /dev/null and b/.pic/Labs/lab_03_memory/fig_02.png differ diff --git a/.pic/Labs/lab_03_memory/fig_03.drawio.png b/.pic/Labs/lab_03_memory/fig_03.drawio.png new file mode 100644 index 0000000..03fccc4 Binary files /dev/null and b/.pic/Labs/lab_03_memory/fig_03.drawio.png differ diff --git a/.pic/Labs/lab_03_memory/fig_04.drawio.png b/.pic/Labs/lab_03_memory/fig_04.drawio.png new file mode 100644 index 0000000..d67f2bc Binary files /dev/null and b/.pic/Labs/lab_03_memory/fig_04.drawio.png differ diff --git a/.pic/Labs/lab_04_cybercobra/logoCC3000.svg b/.pic/Labs/lab_04_cybercobra/logoCC3000.svg new file mode 100644 index 0000000..6569ccb --- /dev/null +++ b/.pic/Labs/lab_04_cybercobra/logoCC3000.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.pic/Labs/lab_04_cybercobra/logoCC3000_1.svg b/.pic/Labs/lab_04_cybercobra/logoCC3000_1.svg new file mode 100644 index 0000000..722373e --- /dev/null +++ b/.pic/Labs/lab_04_cybercobra/logoCC3000_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.pic/Labs/lab_04_cybercobra/pdd_codes.xlsx b/.pic/Labs/lab_04_cybercobra/pdd_codes.xlsx new file mode 100644 index 0000000..dfb241b Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/pdd_codes.xlsx differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_1.drawio.png b/.pic/Labs/lab_04_cybercobra/ppd_1.drawio.png new file mode 100644 index 0000000..8c8a4b8 Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_1.drawio.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_2.drawio.png b/.pic/Labs/lab_04_cybercobra/ppd_2.drawio.png new file mode 100644 index 0000000..fe60bbd Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_2.drawio.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_3.drawio.png b/.pic/Labs/lab_04_cybercobra/ppd_3.drawio.png new file mode 100644 index 0000000..e193cc2 Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_3.drawio.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_4.drawio.png b/.pic/Labs/lab_04_cybercobra/ppd_4.drawio.png new file mode 100644 index 0000000..52cd283 Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_4.drawio.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_5.drawio.png b/.pic/Labs/lab_04_cybercobra/ppd_5.drawio.png new file mode 100644 index 0000000..3d097c7 Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_5.drawio.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_6.drawio.png b/.pic/Labs/lab_04_cybercobra/ppd_6.drawio.png new file mode 100644 index 0000000..79cdc7e Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_6.drawio.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_code_1.png b/.pic/Labs/lab_04_cybercobra/ppd_code_1.png new file mode 100644 index 0000000..e6affa1 Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_code_1.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_code_2.png b/.pic/Labs/lab_04_cybercobra/ppd_code_2.png new file mode 100644 index 0000000..737ce82 Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_code_2.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_code_3.png b/.pic/Labs/lab_04_cybercobra/ppd_code_3.png new file mode 100644 index 0000000..5e1aabd Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_code_3.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_code_4.png b/.pic/Labs/lab_04_cybercobra/ppd_code_4.png new file mode 100644 index 0000000..c81d207 Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_code_4.png differ diff --git a/.pic/Labs/lab_04_cybercobra/ppd_code_5.png b/.pic/Labs/lab_04_cybercobra/ppd_code_5.png new file mode 100644 index 0000000..c87775c Binary files /dev/null and b/.pic/Labs/lab_04_cybercobra/ppd_code_5.png differ diff --git a/.pic/Labs/lab_05_decoder/rv32i_BIS.png b/.pic/Labs/lab_05_decoder/rv32i_BIS.png new file mode 100644 index 0000000..efe3fa4 Binary files /dev/null and b/.pic/Labs/lab_05_decoder/rv32i_BIS.png differ diff --git a/.pic/Labs/lab_05_decoder/rv32i_summary.png b/.pic/Labs/lab_05_decoder/rv32i_summary.png new file mode 100644 index 0000000..ee25aeb Binary files /dev/null and b/.pic/Labs/lab_05_decoder/rv32i_summary.png differ diff --git a/.pic/Labs/lab_05_decoder/rv32i_summary.xlsx b/.pic/Labs/lab_05_decoder/rv32i_summary.xlsx new file mode 100644 index 0000000..f7719ef Binary files /dev/null and b/.pic/Labs/lab_05_decoder/rv32i_summary.xlsx differ diff --git a/.pic/Labs/lab_06_dp/fig_01.drawio.png b/.pic/Labs/lab_06_dp/fig_01.drawio.png new file mode 100644 index 0000000..192f2ad Binary files /dev/null and b/.pic/Labs/lab_06_dp/fig_01.drawio.png differ diff --git a/.pic/Labs/lab_06_dp/fig_02.drawio.png b/.pic/Labs/lab_06_dp/fig_02.drawio.png new file mode 100644 index 0000000..5b368d9 Binary files /dev/null and b/.pic/Labs/lab_06_dp/fig_02.drawio.png differ diff --git a/.pic/Labs/lab_06_dp/fig_02.excel.png b/.pic/Labs/lab_06_dp/fig_02.excel.png new file mode 100644 index 0000000..f2bc681 Binary files /dev/null and b/.pic/Labs/lab_06_dp/fig_02.excel.png differ diff --git a/.pic/Labs/lab_06_dp/fig_02.xlsx b/.pic/Labs/lab_06_dp/fig_02.xlsx new file mode 100644 index 0000000..80a4043 Binary files /dev/null and b/.pic/Labs/lab_06_dp/fig_02.xlsx differ diff --git a/.pic/Labs/lab_09_periph/fig_01.drawio.png b/.pic/Labs/lab_09_periph/fig_01.drawio.png new file mode 100644 index 0000000..a3e120c Binary files /dev/null and b/.pic/Labs/lab_09_periph/fig_01.drawio.png differ diff --git a/.pic/Labs/lab_09_periph/fig_02.drawio.png b/.pic/Labs/lab_09_periph/fig_02.drawio.png new file mode 100644 index 0000000..f6f0a74 Binary files /dev/null and b/.pic/Labs/lab_09_periph/fig_02.drawio.png differ diff --git a/.pic/Labs/labs.png b/.pic/Labs/labs.png new file mode 100644 index 0000000..5985693 Binary files /dev/null and b/.pic/Labs/labs.png differ diff --git a/.pic/Labs/ldone.png b/.pic/Labs/ldone.png new file mode 100644 index 0000000..5c64710 Binary files /dev/null and b/.pic/Labs/ldone.png differ diff --git a/.pic/Labs/rv_model.png b/.pic/Labs/rv_model.png new file mode 100644 index 0000000..e32e251 Binary files /dev/null and b/.pic/Labs/rv_model.png differ diff --git a/.pic/Other/FAQ/boot_filesystem_remove.png b/.pic/Other/FAQ/boot_filesystem_remove.png new file mode 100644 index 0000000..e3c04c1 Binary files /dev/null and b/.pic/Other/FAQ/boot_filesystem_remove.png differ diff --git a/.pic/Other/FAQ/close_sim.png b/.pic/Other/FAQ/close_sim.png new file mode 100644 index 0000000..2a30e09 Binary files /dev/null and b/.pic/Other/FAQ/close_sim.png differ diff --git a/.pic/Other/FAQ/unable_to_open_archive.jpg b/.pic/Other/FAQ/unable_to_open_archive.jpg new file mode 100644 index 0000000..910d3a2 Binary files /dev/null and b/.pic/Other/FAQ/unable_to_open_archive.jpg differ diff --git a/.pic/Other/Students server/x2goclient_config.png b/.pic/Other/Students server/x2goclient_config.png new file mode 100644 index 0000000..83e3ca0 Binary files /dev/null and b/.pic/Other/Students server/x2goclient_config.png differ diff --git a/.pic/Other/Teachers/anisimovam.jpg b/.pic/Other/Teachers/anisimovam.jpg new file mode 100644 index 0000000..42e9807 Binary files /dev/null and b/.pic/Other/Teachers/anisimovam.jpg differ diff --git a/.pic/Other/Teachers/anisimovan.jpg b/.pic/Other/Teachers/anisimovan.jpg new file mode 100644 index 0000000..7787fac Binary files /dev/null and b/.pic/Other/Teachers/anisimovan.jpg differ diff --git a/.pic/Other/Teachers/barkov.jpg b/.pic/Other/Teachers/barkov.jpg new file mode 100644 index 0000000..284fd1e Binary files /dev/null and b/.pic/Other/Teachers/barkov.jpg differ diff --git a/.pic/Other/Teachers/beklemishev.jpg b/.pic/Other/Teachers/beklemishev.jpg new file mode 100644 index 0000000..366d699 Binary files /dev/null and b/.pic/Other/Teachers/beklemishev.jpg differ diff --git a/.pic/Other/Teachers/chusov.jpg b/.pic/Other/Teachers/chusov.jpg new file mode 100644 index 0000000..e32db45 Binary files /dev/null and b/.pic/Other/Teachers/chusov.jpg differ diff --git a/.pic/Other/Teachers/demichev.jpg b/.pic/Other/Teachers/demichev.jpg new file mode 100644 index 0000000..88b015b Binary files /dev/null and b/.pic/Other/Teachers/demichev.jpg differ diff --git a/.pic/Other/Teachers/demidov.jpg b/.pic/Other/Teachers/demidov.jpg new file mode 100644 index 0000000..5dadc73 Binary files /dev/null and b/.pic/Other/Teachers/demidov.jpg differ diff --git a/.pic/Other/Teachers/hisamov.jpg b/.pic/Other/Teachers/hisamov.jpg new file mode 100644 index 0000000..f17df33 Binary files /dev/null and b/.pic/Other/Teachers/hisamov.jpg differ diff --git a/.pic/Other/Teachers/orlov.jpg b/.pic/Other/Teachers/orlov.jpg new file mode 100644 index 0000000..8a60fcc Binary files /dev/null and b/.pic/Other/Teachers/orlov.jpg differ diff --git a/.pic/Other/Teachers/podusenko.jpg b/.pic/Other/Teachers/podusenko.jpg new file mode 100644 index 0000000..5b5bf57 Binary files /dev/null and b/.pic/Other/Teachers/podusenko.jpg differ diff --git a/.pic/Other/Teachers/popov.jpg b/.pic/Other/Teachers/popov.jpg new file mode 100644 index 0000000..e3379e2 Binary files /dev/null and b/.pic/Other/Teachers/popov.jpg differ diff --git a/.pic/Other/Teachers/rygkova.jpg b/.pic/Other/Teachers/rygkova.jpg new file mode 100644 index 0000000..bdf07bf Binary files /dev/null and b/.pic/Other/Teachers/rygkova.jpg differ diff --git a/.pic/Other/Teachers/silantiev.jpg b/.pic/Other/Teachers/silantiev.jpg new file mode 100644 index 0000000..f1593d0 Binary files /dev/null and b/.pic/Other/Teachers/silantiev.jpg differ diff --git a/.pic/Other/Teachers/solodovnikov.jpg b/.pic/Other/Teachers/solodovnikov.jpg new file mode 100644 index 0000000..5a4fee6 Binary files /dev/null and b/.pic/Other/Teachers/solodovnikov.jpg differ diff --git a/.pic/Other/Teachers/ternovoi.jpg b/.pic/Other/Teachers/ternovoi.jpg new file mode 100644 index 0000000..e520d36 Binary files /dev/null and b/.pic/Other/Teachers/ternovoi.jpg differ diff --git a/.pic/Other/Teachers/zamtaradze.jpg b/.pic/Other/Teachers/zamtaradze.jpg new file mode 100644 index 0000000..3d29a62 Binary files /dev/null and b/.pic/Other/Teachers/zamtaradze.jpg differ diff --git a/.pic/Other/VSCode Verilog Simulation/icarus_verilog_integration.png b/.pic/Other/VSCode Verilog Simulation/icarus_verilog_integration.png new file mode 100644 index 0000000..ad23f59 Binary files /dev/null and b/.pic/Other/VSCode Verilog Simulation/icarus_verilog_integration.png differ diff --git a/.pic/Other/rv32i/BJ.png b/.pic/Other/rv32i/BJ.png new file mode 100644 index 0000000..d22dd62 Binary files /dev/null and b/.pic/Other/rv32i/BJ.png differ diff --git a/.pic/Other/rv32i/ISBUJ.png b/.pic/Other/rv32i/ISBUJ.png new file mode 100644 index 0000000..e756381 Binary files /dev/null and b/.pic/Other/rv32i/ISBUJ.png differ diff --git a/.pic/Other/rv32i/RISU.png b/.pic/Other/rv32i/RISU.png new file mode 100644 index 0000000..ef4ce16 Binary files /dev/null and b/.pic/Other/rv32i/RISU.png differ diff --git a/.pic/Other/rv32i/add_and_sll_sub.png b/.pic/Other/rv32i/add_and_sll_sub.png new file mode 100644 index 0000000..acf477a Binary files /dev/null and b/.pic/Other/rv32i/add_and_sll_sub.png differ diff --git a/.pic/Other/rv32i/addi_andi.png b/.pic/Other/rv32i/addi_andi.png new file mode 100644 index 0000000..d2220e0 Binary files /dev/null and b/.pic/Other/rv32i/addi_andi.png differ diff --git a/.pic/Other/rv32i/example_instr_code.png b/.pic/Other/rv32i/example_instr_code.png new file mode 100644 index 0000000..b21f229 Binary files /dev/null and b/.pic/Other/rv32i/example_instr_code.png differ diff --git a/.pic/Other/rv32i/lui_auipc.png b/.pic/Other/rv32i/lui_auipc.png new file mode 100644 index 0000000..1a2cc15 Binary files /dev/null and b/.pic/Other/rv32i/lui_auipc.png differ diff --git a/.pic/Other/rv32i/nop.png b/.pic/Other/rv32i/nop.png new file mode 100644 index 0000000..f3501bf Binary files /dev/null and b/.pic/Other/rv32i/nop.png differ diff --git a/.pic/Other/rv32i/pseudo.png b/.pic/Other/rv32i/pseudo.png new file mode 100644 index 0000000..8cb1209 Binary files /dev/null and b/.pic/Other/rv32i/pseudo.png differ diff --git a/.pic/Other/rv32i/slli_srli_srai.png b/.pic/Other/rv32i/slli_srli_srai.png new file mode 100644 index 0000000..547bb60 Binary files /dev/null and b/.pic/Other/rv32i/slli_srli_srai.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_1.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_1.png new file mode 100644 index 0000000..45131be Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_1.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_10.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_10.png new file mode 100644 index 0000000..f97b965 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_10.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_11.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_11.png new file mode 100644 index 0000000..4b23df9 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_11.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_12.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_12.png new file mode 100644 index 0000000..252f1b7 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_12.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_13.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_13.png new file mode 100644 index 0000000..4f41b0b Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_13.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_14.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_14.png new file mode 100644 index 0000000..7818e17 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_14.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_15.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_15.png new file mode 100644 index 0000000..729d6d0 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_15.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_16.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_16.png new file mode 100644 index 0000000..f7af81d Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_16.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_17.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_17.png new file mode 100644 index 0000000..4d62003 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_17.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_18.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_18.png new file mode 100644 index 0000000..f65aad1 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_18.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_19.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_19.png new file mode 100644 index 0000000..de057d2 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_19.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_2.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_2.png new file mode 100644 index 0000000..ed01de6 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_2.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_20.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_20.png new file mode 100644 index 0000000..b78e044 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_20.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_21.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_21.png new file mode 100644 index 0000000..f7921a2 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_21.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_22.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_22.png new file mode 100644 index 0000000..757f2ee Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_22.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_23.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_23.png new file mode 100644 index 0000000..7903a2c Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_23.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_24.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_24.png new file mode 100644 index 0000000..07dd80a Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_24.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_25.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_25.png new file mode 100644 index 0000000..4b4cfa5 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_25.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_26.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_26.png new file mode 100644 index 0000000..42119fc Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_26.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_27.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_27.png new file mode 100644 index 0000000..27607be Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_27.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_3.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_3.png new file mode 100644 index 0000000..40cfb79 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_3.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_4.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_4.png new file mode 100644 index 0000000..08b7810 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_4.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_5.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_5.png new file mode 100644 index 0000000..55f5d25 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_5.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_6.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_6.png new file mode 100644 index 0000000..a4a7eb1 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_6.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_7.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_7.png new file mode 100644 index 0000000..7442800 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_7.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_8.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_8.png new file mode 100644 index 0000000..18f2d3a Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_8.png differ diff --git a/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_9.png b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_9.png new file mode 100644 index 0000000..f233e17 Binary files /dev/null and b/.pic/Vivado Basics/Debug manual/bugs_hide_and_seek_tutorial_9.png differ diff --git a/.pic/Vivado Basics/Elaboration failed/err_log.png b/.pic/Vivado Basics/Elaboration failed/err_log.png new file mode 100644 index 0000000..a4b5be5 Binary files /dev/null and b/.pic/Vivado Basics/Elaboration failed/err_log.png differ diff --git a/.pic/Vivado Basics/Elaboration failed/simFail.png b/.pic/Vivado Basics/Elaboration failed/simFail.png new file mode 100644 index 0000000..21fa399 Binary files /dev/null and b/.pic/Vivado Basics/Elaboration failed/simFail.png differ diff --git a/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_1.png b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_1.png new file mode 100644 index 0000000..b489de9 Binary files /dev/null and b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_1.png differ diff --git a/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_2.png b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_2.png new file mode 100644 index 0000000..80aba2d Binary files /dev/null and b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_2.png differ diff --git a/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_3.png b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_3.png new file mode 100644 index 0000000..e59f573 Binary files /dev/null and b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_3.png differ diff --git a/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_4.png b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_4.png new file mode 100644 index 0000000..d2a2677 Binary files /dev/null and b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_4.png differ diff --git a/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_5.png b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_5.png new file mode 100644 index 0000000..662301e Binary files /dev/null and b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_5.png differ diff --git a/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_6.png b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_6.png new file mode 100644 index 0000000..357cf3b Binary files /dev/null and b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_6.png differ diff --git a/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_7.png b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_7.png new file mode 100644 index 0000000..2c4ddfb Binary files /dev/null and b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_7.png differ diff --git a/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_8.png b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_8.png new file mode 100644 index 0000000..b2ad0c0 Binary files /dev/null and b/.pic/Vivado Basics/Folder Structure In The Project/folder_structure_8.png differ diff --git a/.pic/Vivado Basics/How to add a mem-file/how_to_mem_1.png b/.pic/Vivado Basics/How to add a mem-file/how_to_mem_1.png new file mode 100644 index 0000000..d11c33a Binary files /dev/null and b/.pic/Vivado Basics/How to add a mem-file/how_to_mem_1.png differ diff --git a/.pic/Vivado Basics/How to add a mem-file/how_to_mem_2.png b/.pic/Vivado Basics/How to add a mem-file/how_to_mem_2.png new file mode 100644 index 0000000..c6ea4a5 Binary files /dev/null and b/.pic/Vivado Basics/How to add a mem-file/how_to_mem_2.png differ diff --git a/.pic/Vivado Basics/How to add a mem-file/how_to_mem_3.png b/.pic/Vivado Basics/How to add a mem-file/how_to_mem_3.png new file mode 100644 index 0000000..b4c645d Binary files /dev/null and b/.pic/Vivado Basics/How to add a mem-file/how_to_mem_3.png differ diff --git a/.pic/Vivado Basics/How to add a mem-file/how_to_mem_4.png b/.pic/Vivado Basics/How to add a mem-file/how_to_mem_4.png new file mode 100644 index 0000000..a2a5ecf Binary files /dev/null and b/.pic/Vivado Basics/How to add a mem-file/how_to_mem_4.png differ diff --git a/.pic/Vivado Basics/How to open a schematic/open_schematic_1.png b/.pic/Vivado Basics/How to open a schematic/open_schematic_1.png new file mode 100644 index 0000000..0a6ca0a Binary files /dev/null and b/.pic/Vivado Basics/How to open a schematic/open_schematic_1.png differ diff --git a/.pic/Vivado Basics/How to open a schematic/open_schematic_2.png b/.pic/Vivado Basics/How to open a schematic/open_schematic_2.png new file mode 100644 index 0000000..09b3906 Binary files /dev/null and b/.pic/Vivado Basics/How to open a schematic/open_schematic_2.png differ diff --git a/.pic/Vivado Basics/How to open a schematic/open_schematic_3.png b/.pic/Vivado Basics/How to open a schematic/open_schematic_3.png new file mode 100644 index 0000000..caa717a Binary files /dev/null and b/.pic/Vivado Basics/How to open a schematic/open_schematic_3.png differ diff --git a/.pic/Vivado Basics/How to open a schematic/open_schematic_4.png b/.pic/Vivado Basics/How to open a schematic/open_schematic_4.png new file mode 100644 index 0000000..014ac58 Binary files /dev/null and b/.pic/Vivado Basics/How to open a schematic/open_schematic_4.png differ diff --git a/.pic/Vivado Basics/How to open a schematic/open_schematic_5.png b/.pic/Vivado Basics/How to open a schematic/open_schematic_5.png new file mode 100644 index 0000000..f00f3b6 Binary files /dev/null and b/.pic/Vivado Basics/How to open a schematic/open_schematic_5.png differ diff --git a/.pic/Vivado Basics/How to open a schematic/open_schematic_6.png b/.pic/Vivado Basics/How to open a schematic/open_schematic_6.png new file mode 100644 index 0000000..04deba9 Binary files /dev/null and b/.pic/Vivado Basics/How to open a schematic/open_schematic_6.png differ diff --git a/.pic/Vivado Basics/Implementation steps/impl_cell_address.png b/.pic/Vivado Basics/Implementation steps/impl_cell_address.png new file mode 100644 index 0000000..06e0d65 Binary files /dev/null and b/.pic/Vivado Basics/Implementation steps/impl_cell_address.png differ diff --git a/.pic/Vivado Basics/Implementation steps/impl_elaborated_netlist.png b/.pic/Vivado Basics/Implementation steps/impl_elaborated_netlist.png new file mode 100644 index 0000000..c347673 Binary files /dev/null and b/.pic/Vivado Basics/Implementation steps/impl_elaborated_netlist.png differ diff --git a/.pic/Vivado Basics/Implementation steps/impl_fpga_device_full_view.png b/.pic/Vivado Basics/Implementation steps/impl_fpga_device_full_view.png new file mode 100644 index 0000000..def06ed Binary files /dev/null and b/.pic/Vivado Basics/Implementation steps/impl_fpga_device_full_view.png differ diff --git a/.pic/Vivado Basics/Implementation steps/impl_fpga_device_zoomed_view.png b/.pic/Vivado Basics/Implementation steps/impl_fpga_device_zoomed_view.png new file mode 100644 index 0000000..d8edbbd Binary files /dev/null and b/.pic/Vivado Basics/Implementation steps/impl_fpga_device_zoomed_view.png differ diff --git a/.pic/Vivado Basics/Implementation steps/impl_steps_ref_scheme.drawio.png b/.pic/Vivado Basics/Implementation steps/impl_steps_ref_scheme.drawio.png new file mode 100644 index 0000000..0e1d6ed Binary files /dev/null and b/.pic/Vivado Basics/Implementation steps/impl_steps_ref_scheme.drawio.png differ diff --git a/.pic/Vivado Basics/Implementation steps/impl_synthesised_netlist.png b/.pic/Vivado Basics/Implementation steps/impl_synthesised_netlist.png new file mode 100644 index 0000000..9bbd5d2 Binary files /dev/null and b/.pic/Vivado Basics/Implementation steps/impl_synthesised_netlist.png differ diff --git a/.pic/Vivado Basics/Install Vivado/final_page.png b/.pic/Vivado Basics/Install Vivado/final_page.png new file mode 100644 index 0000000..89f3af4 Binary files /dev/null and b/.pic/Vivado Basics/Install Vivado/final_page.png differ diff --git a/.pic/Vivado Basics/Install Vivado/installation_customization.png b/.pic/Vivado Basics/Install Vivado/installation_customization.png new file mode 100644 index 0000000..88e6a3f Binary files /dev/null and b/.pic/Vivado Basics/Install Vivado/installation_customization.png differ diff --git a/.pic/Vivado Basics/Install Vivado/update_suggetion.png b/.pic/Vivado Basics/Install Vivado/update_suggetion.png new file mode 100644 index 0000000..187cb4d Binary files /dev/null and b/.pic/Vivado Basics/Install Vivado/update_suggetion.png differ diff --git a/.pic/Vivado Basics/Run Simulation/Run_sim1.png b/.pic/Vivado Basics/Run Simulation/Run_sim1.png new file mode 100644 index 0000000..fc5c6fc Binary files /dev/null and b/.pic/Vivado Basics/Run Simulation/Run_sim1.png differ diff --git a/.pic/Vivado Basics/Run Simulation/Run_sim2.png b/.pic/Vivado Basics/Run Simulation/Run_sim2.png new file mode 100644 index 0000000..abfc1e9 Binary files /dev/null and b/.pic/Vivado Basics/Run Simulation/Run_sim2.png differ diff --git a/.pic/Vivado Basics/Run Simulation/Run_sim3.png b/.pic/Vivado Basics/Run Simulation/Run_sim3.png new file mode 100644 index 0000000..72984ac Binary files /dev/null and b/.pic/Vivado Basics/Run Simulation/Run_sim3.png differ diff --git a/.pic/Vivado Basics/Run Simulation/Run_sim4.png b/.pic/Vivado Basics/Run Simulation/Run_sim4.png new file mode 100644 index 0000000..fb907fb Binary files /dev/null and b/.pic/Vivado Basics/Run Simulation/Run_sim4.png differ diff --git a/.pic/Vivado Basics/Verilog Header/Verilog_Header1.png b/.pic/Vivado Basics/Verilog Header/Verilog_Header1.png new file mode 100644 index 0000000..e38a432 Binary files /dev/null and b/.pic/Vivado Basics/Verilog Header/Verilog_Header1.png differ diff --git a/.pic/Vivado Basics/Verilog Header/Verilog_Header2.png b/.pic/Vivado Basics/Verilog Header/Verilog_Header2.png new file mode 100644 index 0000000..10a9e52 Binary files /dev/null and b/.pic/Vivado Basics/Verilog Header/Verilog_Header2.png differ diff --git a/.pic/Vivado Basics/Verilog Header/Verilog_Header3.png b/.pic/Vivado Basics/Verilog Header/Verilog_Header3.png new file mode 100644 index 0000000..81308b9 Binary files /dev/null and b/.pic/Vivado Basics/Verilog Header/Verilog_Header3.png differ diff --git a/.pic/Vivado Basics/Verilog Header/Verilog_Header4.png b/.pic/Vivado Basics/Verilog Header/Verilog_Header4.png new file mode 100644 index 0000000..ddb0886 Binary files /dev/null and b/.pic/Vivado Basics/Verilog Header/Verilog_Header4.png differ diff --git a/.pic/Vivado Basics/Vivado Trainer/fpga_filter.png b/.pic/Vivado Basics/Vivado Trainer/fpga_filter.png new file mode 100644 index 0000000..6ea20a1 Binary files /dev/null and b/.pic/Vivado Basics/Vivado Trainer/fpga_filter.png differ diff --git a/Basic Verilog structures/Concatenation.md b/Basic Verilog structures/Concatenation.md new file mode 100644 index 0000000..20003e9 --- /dev/null +++ b/Basic Verilog structures/Concatenation.md @@ -0,0 +1,108 @@ +# Конкатенация (объединение сигналов) + +Конкатенация позволяет присвоить какому-то многоразрядному сигналу "склейку" из нескольких сигналов меньшей разрядности, либо наоборот: присвоить сигнал большей разрядности группе сигналов меньшей разрядности. + +Оператор конкатенации выглядит следующим образом: `{sig1, sig2, ..., sign}`. + +Предположим, у нас есть следующий набор сигналов: + +![../.pic/Basic%20Verilog%20structures/concatenation/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/concatenation/fig_01.drawio.png) + +```SystemVerilog + +logic a; +logic b; +logic [7:0] c; +logic [1:0] d; + +logic [5:0] e; +``` + +И мы хотим, чтобы на провод `e` подавались следующие сигналы: + +- на старший бит сигнала `e` подавался сигнал `a` +- на его следующий бит подавался сигнал `b` +- на его следующие 2 бита подавались биты `[4:3]` сигнала `c` +- на младшие 2 бита подавался сигнал `d` + +![../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.png) + +Это можно сделать путем 4 непрерывных присваиваний: + +```SystemVerilog +logic a; +logic b; +logic [7:0] c; +logic [1:0] d; + +logic [5:0] e; + +assign e[5] = a; +assign e[4] = b; +assign e[3:2] = c[4:3]; +assign e[1:0] = d; +``` + +либо через одно присваивание, использующее конкатенацию: + +```SystemVerilog +logic a; +logic b; +logic [7:0] c; +logic [1:0] d; + +logic [5:0] e; + +assign e = {a, b, c[4:3], d}; +``` + +Кроме того, возможна и обратная ситуация. Предположим, мы хотим подать отдельные биты сигнала `e` на различные провода: + +![../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.png) + +```SystemVerilog +logic a; +logic b; +logic [7:0] c; +logic [1:0] d; + +logic [5:0] e; + +assign a = e[5]; +assign b = e[4]; +assign c[4:3] = e[3:2]; +assign d = e[1:0]; +``` + +Подобную операцию можно так же выполнить в одно выражение через конкатенацию: + +```SystemVerilog +logic a; +logic b; +logic [7:0] c; +logic [1:0] d; + +logic [5:0] e; + +assign {a, b, c[4:3], d} = e; +``` + +Кроме того, конкатенация может использоваться при **множественном дублировании** сигналов. Дублирование выполняется выражением: + +```SystemVerilog +{a, {число_повторений{повторяемый_сигнал}} ,b} +``` + +Допустим, мы хотим присвоить какому-то сигналу три копии `[4:3]` битов сигнала `c`, после которых идут сигналы `a` и `b`. +Это можно сделать выражением: + +```SystemVerilog +logic a; +logic b; +logic [7:0] c; + +logic [7:0] e; + +assign e = { {3{c[4:3]}}, a, b}; +``` + diff --git a/Basic Verilog structures/Controllers.md b/Basic Verilog structures/Controllers.md new file mode 100644 index 0000000..c124fa7 --- /dev/null +++ b/Basic Verilog structures/Controllers.md @@ -0,0 +1,156 @@ +# Пример разработки модуля-контроллера периферийного устройства + +Для того, чтобы лучше понять, что от вас требуется в рамках лабораторной работы по периферийным устройствам, рассмотрим процесс разработки структурной схемы (не SystemVerilog-описания) для контроллера светодиодов. + +В первую очередь, здесь будет продублирована выдержка из спецификации на этот контроллер (общая часть раздела "[Описание контроллеров периферийных устройств](../../Labs/7.%20Peripheral%20units/README.md#описание-контроллеров-периферийных-устройств)", а также подраздел "[Светодиоды](../../Labs/7.%20Peripheral%20units/README.md#светодиоды)"): + +## Спецификация контроллера + +### Общие термины + +1. Под "**запросом на запись** по адресу `0xАДРЕС`" будет пониматься совокупность следующих условий: + 1. Происходит восходящий фронт `clk_i`. + 2. На входе `req_i` выставлено значение `1`. + 3. На входе `write_enable_i` выставлено значение `1`. + 4. На входе `addr_i` выставлено значение `0xАДРЕС` +2. Под "**запросом на чтение** по адресу `0xАДРЕС`" будет пониматься совокупность следующих условий: + 1. На входе `req_i` выставлено значение `1`. + 2. На входе `write_enable_i` выставлено значение `0`. + 3. На входе `addr_i` выставлено значение `0xАДРЕС` + +Обратите внимание на то, что **запрос на чтение** должен обрабатываться **синхронно** (выходные данные должны выдаваться по положительному фронту `clk_i`). + +При описании поддерживаемых режимов доступа по данному адресу используется интуитивно понятное обозначение: + +* R — доступ **только на чтение**; +* W — доступ **только на запись**; +* RW — доступ на **чтение и запись**. + +В случае отсутствия **запроса на чтения**, на выход `read_data_o` должно подаваться значение `32'hfa11_1eaf`. Это никак не повлияет на работу процессора, но будет удобно в процессе отладки на временной диаграмме (тоже самое было сделано в процессе разработки памяти данных). + +Если пришел **запрос на запись** или **чтение**, это еще не значит, что контроллер должен его выполнить. В случае, если запрос происходит по адресу, не поддерживающему этот запрос (например **запрос на запись** по адресу поддерживающему только чтение или наоборот), данный запрос должен игнорироваться, а на выходе `read_data_o` должно появиться значение `32'hdead_beef`. + +К примеру, в случае запроса на чтение по адресу `0x0100004` (четвертый байт в адресном пространстве периферийного устройства "переключатели"), на выходе `read_data_o` должно оказаться значение `32'hdead_beef`. В случае отсутствия запроса на чтение (`req_i == 0` или `write_enable_i == 1`), на выходе `read_data_o` контроллера переключателей должно оказаться значение `32'hfa11_1eaf`. + +В случае осуществления записи по принятому запросу, необходимо записать данные с сигнала `write_data_i` в регистр, ассоциированный с адресом `addr_i` (если разрядность регистра меньше разрядности сигнала `write_data_i`, старшие биты записываемых данных отбрасываются). + +В случае осуществления чтения по принятому запросу, необходимо по положительному фронту `clk_i` выставить данные с сигнала, ассоциированного с адресом `addr_i` на выходной сигнал `read_data_o` (если разрядность сигнала меньше разрядности выходного сигнала `read_data_o`, возвращаемые данные должны дополниться нулями в старших битах). + +### Светодиоды + +Светодиоды являются простейшим устройством вывода. Поэтому, чтобы задание было интересней, для их управления был добавлен регистр, управляющий режимом вывода данных на светодиоды. +Рассмотрим прототип модуля, который вам необходимо реализовать: + +```SystemVerilog +module led_sb_ctrl( +/* + Часть интерфейса модуля, отвечающая за подключение к системной шине +*/ + input logic clk_i, + input logic rst_i + input logic req_i, + input logic write_enable_i, + input logic [31:0] addr_i, + input logic [31:0] write_data_i, + output logic [31:0] read_data_o, + +/* + Часть интерфейса модуля, отвечающая за подключение к периферии +*/ + output logic [15:0] led_o +); + +logic [15:0] led_val; +logic led_mode; + +endmodule +``` + +Данный модуль должен выводить на выходной сигнал `led_o` данные с регистра `led_val`. Запись и чтение регистра `led_val` осуществляется по адресу `0x00`. Запись любого значения, превышающего `2¹⁶-1` должна игнорироваться. + +Регистр `led_mode` отвечает за режим вывода данных на светодиоды. Когда этот регистр равен единице, светодиоды должны "моргать" выводимым значением. Под морганием подразумевается вывод значения из регистра `led_val` на выход `led_o` на одну секунду (загорится часть светодиодов, соответствующие которым биты шины `led_o` равны единице), после чего на одну секунду выход `led_o` необходимо подать нули. Запись и чтение регистра `led_mode` осуществляется по адресу `0x04`. Запись любого значения, отличного от `0` и `1` должна игнорироваться. + +Отсчет времени можно реализовать простейшим счетчиком, каждый такт увеличивающимся на 1 и сбрасывающимся по достижении определенного значения, чтобы продолжить считать с нуля. Зная тактовую частоту, нетрудно определить до скольки должен считать счетчик. При тактовой частоте в 10 МГц происходит 10 миллионов тактов в секунду. Это означает, что при такой тактовой частоте через секунду счетчик будет равен `10⁷-1` (счет идет с нуля). + +Обратите внимание на то, что адрес `0x24` является адресом сброса. В случае записи по этому адресу единицы вы должны сбросить регистры `led_val`, `led_mode` и все вспомогательные регистры, которые вы создали. Для реализации сброса вы можете как создать отдельный регистр `led_rst`, в который будет происходить запись, а сам сброс будет происходить по появлению единицы в этом регистре (в этом случае необходимо не забыть сбрасывать и этот регистр), так и создать обычный провод, формирующий единицу в случае выполнения всех указанных условий (условий запроса на запись, адреса сброса и значения записываемых данных равному единице). + +Адресное пространство контроллера: + +|Адрес|Режим доступа|Допустимые значения| Функциональное назначение | +|-----|-------------|-------------------|-----------------------------------------------------------------------------------| +|0x00 | RW | [0:65535] | Чтение и запись в регистр `led_val` отвечающий за вывод данных на светодиоды | +|0x04 | RW | [0:1] | Чтение и запись в регистр `led_mode`, отвечающий за режим "моргания" светодиодами | +|0x24 | W | 1 | Запись сигнала сброса + +## Реализация схемы контроллера + +Для начала, добавим на структурную схему входы и выходы модуля: + +![../.pic/Basic%20Verilog%20structures/controllers/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_01.drawio.png) + +В первую очередь, спецификация вводит понятия **запрос на чтение** и **запрос на запись**. Создадим вспомогательные провода, которые будут сигнализировать о том, что произошел **запрос на чтение** или **запрос на запись**: + +![../.pic/Basic%20Verilog%20structures/controllers/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_02.drawio.png) + +Далее, спецификация накладывает ограничение на допустимые адреса и значения. Поэтому создадим вспомогательные сигналы, сигнализирующие о том, что текущий адрес соответствует одному из регистров контроллера, а данные для записи соответствуют диапазону допустимых значений этих регистров: + +![../.pic/Basic%20Verilog%20structures/controllers/fig_03.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_03.drawio.png) + +Теперь, когда подготовительные работы выполнены, начнем с реализации сброса этого контроллера. Сброс может произойти в двух случаях: когда `rst_i == 1` либо же в случае **запроса на запись** единицы по адресу `0x24`. Создадим вспомогательный провод `rst`, который будет равен единице в случае, если произойдет любое из этих событий. Этот сигнал будет сбрасывать все созданные в данном модуле регистры. + +![../.pic/Basic%20Verilog%20structures/controllers/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_04.drawio.png) + +Продолжим описание контроллера, создав первый из **архитектурных регистров** — `led_val`. Запись в этот регистр возможна только в случае выполнения трех условий: + +* произошел **запрос на запись**; +* `addr_i == 0x00`; +* `write_data_i` находится в диапазоне [0:65535]. + +Создадим вспомогательный сигнал `val_en`, который будет равен единице только в случае выполнения этих трех условий: + +![../.pic/Basic%20Verilog%20structures/controllers/fig_05.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_05.drawio.png) + +Теперь реализация регистра `lev_val` становится совершенно тривиальной задачей, ведь у нас есть: + +* сигнал сброса регистра `rst`; +* сигнал разрешения записи в регистр `val_en`; +* сигнал данных для записи в регистр `write_data_i`(из которого мы будем брать только младшие 16 бит данных). + +![../.pic/Basic%20Verilog%20structures/controllers/fig_06.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_06.drawio.png) + +Аналогичным образом реализуем еще один **архитектурный регистр** `led_mode`: + +![../.pic/Basic%20Verilog%20structures/controllers/fig_07.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_07.drawio.png) + +Два этих регистра должны управлять поведением выходного сигнала `led_o` следующим образом: + +1. В случае `led_mode == 0` на выходе `led_o` должно оказаться значение `led_val`; +2. В случае `led_mode == 1` на выходе `led_o` должно циклически меняться значение c `led_val` на `16'd0` и обратно с периодом в одну секунду. + +Для реализации счета времени нам потребуется вспомогательный **неархитектурный регистр** `cntr`, который станет простейшим счетчиком со сбросом. Мы знаем, что тактовый сигнал нашей схемы будет работать с периодом в 10 МГц. Если каждый такт инкрементировать счетчик на единицу, то за одну секунду счетчик досчитает до 10 миллионов. Первой мыслью может показаться, что нам нужно, чтобы счетчик считал до 10 миллионов, дойдя до которых он бы сбрасывался в ноль, однако в этом случае у нас будут сложности при дальнейшей реализации. Будет куда удобней, если вместо этого счетчик будет считать до 20 миллионов (полного периода смены значения с `led_val` на `16'd0` и обратно). В этом случае, нам останется всего лишь добавить условие вывода значения на мультиплексор: + +* пока значение счетчика меньше 10 миллионов, на выходе `led_o` будет значение `led_val` +* в противном случае, на выходе `led_o` будет значение `16'd0`. + +Таким образом, поведение счетчика описывается следующим образом: + +* счетчик сбрасывается, в следующих случаях: + * произошел сброс (`rst == 1`); + * произошло отключение "моргания" светодиодов (`led_mode == 0`); + * счетчик досчитал до 20 миллионов (`cntr >= 32'd20_000_000`); +* в остальных ситуациях, счетчик инкрементирует свое значение. + +![../.pic/Basic%20Verilog%20structures/controllers/fig_08.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_08.drawio.png) + +Последним этапом описания контроллера будет добавление логики управления выходным сигналом `read_data_o`. + +На управление этим сигналом наложены следующие требования: + +* изменения этого сигнала должны быть **синхронными** (значит перед выходным сигналом должен стоять регистр); +* в случае отсутствия **запроса на чтение**, данный сигнал должен принять значение `32'hfa11_1eaf`; +* в случае **запроса на чтение** по неподдерживаемому адресу, данный сигнал должен принять значение `32'hdead_beef`; +* в случае **запроса на чтение** по поддерживаемому адресу, данный сигнал должен принять значение ассоциированного с этим адресом регистра (дополнив это значение нулями в старших разрядах). + +Таким образом, итоговая схема примет вид: + +![../.pic/Basic%20Verilog%20structures/controllers/fig_09.drawio.png](../.pic/Basic%20Verilog%20structures/controllers/fig_09.drawio.png) diff --git a/Basic Verilog structures/Modules.md b/Basic Verilog structures/Modules.md new file mode 100644 index 0000000..2780932 --- /dev/null +++ b/Basic Verilog structures/Modules.md @@ -0,0 +1,296 @@ +# Описание модулей в SystemVerilog + +Основой цифровых схем в SystemVerilog является модуль. Модуль — это блок SystemVerilog-кода описывающий цифровую схему какого-то устройства, например пульта телевизора: + +![../.pic/Basic%20Verilog%20structures/modules/fig_00.drawio.jpg](../.pic/Basic%20Verilog%20structures/modules/fig_00.jpg) + +У пульта есть входные сигналы: кнопки, нажатие на которые сообщает о нашем намерении изменить громкость или переключить канал. Кроме того, есть выходной сигнал ИК-светодиода, по которому пульт отправляет информацию телевизору. + +Для создания модуля в языке SystemVerilog используются ключевые слова `module` и `endmodule`, которые определяют начало и конец модуля, обрамляя его. Можно сказать, что эти ключевые слова являются корпусом нашего устройства, отделяют его содержимое от внешнего мира. + +Определим наш модуль: + +![../.pic/Basic%20Verilog%20structures/modules/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_01.drawio.png) + +```SystemVerilog +module + + +endmodule +``` + +У всякого модуля должно быть название. Назовём его `box`. В круглых скобках пишутся имена портов, их направление и типы. Если модуль не имеет ни входов, ни выходов, внутри скобок ничего не пишется. После них всегда ставится точка с запятой. + +![../.pic/Basic%20Verilog%20structures/modules/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_02.drawio.png) + +```SystemVerilog +module box(); + + +endmodule +``` + +Модуль без входов и выходов (портов) — это просто коробка, которая никак не взаимодействует с внешним миром. Подключим к нему два входных сигнала `a, b` и один выходной `q`. Для объявления портов, необходимо указать направление порта (вход это или выход), и тип используемого сигнала. В рамках данного курса лабораторных работ в качестве типа и входов и выходов будет использоваться тип `logic`, о котором будет рассказано чуть позже. + +![../.pic/Basic%20Verilog%20structures/modules/fig_03.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_03.drawio.png) + +```SystemVerilog +module box( + input logic a, + input logic b, + output logic q +); + + +endmodule +``` + +Внутри модуля могут быть объявления сигналов, параметров, констант и т.п., о которых другой модуль не узнает. Объявим внутри модуля `box` провод `c`. + +![../.pic/Basic%20Verilog%20structures/modules/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_04.drawio.png) + +```SystemVerilog +module box( + input logic a, + input logic b, + + output logic q +); + + logic c; + +endmodule +``` + +Для объявления провода `c` использовалось ключевое слово (тип) `logic`. Этот тип, подобно стволовым клеткам, может быть в конечном итоге привести к созданию как ячеек памяти (регистров), так и проводов, в зависимости от того, как было описано присваивание объекту этого типа. Поэтому в примере выше говорить о том, что был создан провод не совсем корректно, объект схемы `c` станет проводом, когда будет произведено подключение к этому объекту, соответствующее подключению провода. + +Подключим провод `c` ко входу `a`. Для этого используется конструкция `assign c = a;`. Такая конструкция называется **непрерывным присваиванием**. Если очень сильно упростить, то непрерывное присваивание схоже со спайкой двух проводов. После подобного присваивания, провод `c` всегда будет иметь то же значение, что и `a` — как только входной сигнал `a` изменит свое значение, внутренний провод `c` также изменит свое значение (проводу `c` будет **непрерывно присваиваться** значение входа `a`). + +![../.pic/Basic%20Verilog%20structures/modules/fig_05.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_05.drawio.png) + +```SystemVerilog +module box( + input logic a, + input logic b, + + output logic q +); + + logic c; + + assign c = a; + +endmodule +``` + +Стоит однако заметить, что аналогия со спайкой проводов имеет свои недостатки: после неё некоторые студенты начинают думать, что расположение "спаиваемых" сигналов относительно знака равно не имеет значения, однако это не так. + +В непрерывном присваивании участвует две компоненты: выражение-приемник сигнала и выражение-источник сигнала. Обычно, выражением-приемником является провод (либо группа проводов). Выражение-источник сигнала может быть совершенно различным. В примере приведенном выше выражением-источником так же был провод, но вместо него мог использоваться и регистр и выражение, построенное из цепочки арифметических или логических вентилей. + +Важно понять, что при непрерывном присваивании слева от знака равно указывается то **чему мы будем присваивать**, а справа от знака равно указывается то **что мы будем присваивать**. + +К примеру, мы можем присвоить проводу `с` значение выхода логического вентиля. Пусть нам нужно, чтобы к сигналу `c` был подключен результат операции `a ИЛИ b`. + +![../.pic/Basic%20Verilog%20structures/modules/fig_06.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_06.drawio.png) + +Такую схему можно реализовать следующим описанием: + +```SystemVerilog +module box( + input logic a, + input logic b, + + output logic q +); + + logic c; + + assign c = a | b; + +endmodule +``` + +Пусть в схеме имеется ещё один логический вентиль - Исключающее ИЛИ. На него подаётся результат операции `a ИЛИ b`, то есть `c`, а также входной сигнал `b`. Результат операции `c ИСКЛЮЧАЮЩЕЕ ИЛИ b` подаётся на выход `q` нашего модуля. + +![../.pic/Basic%20Verilog%20structures/modules/fig_07.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_07.drawio.png) + +```SystemVerilog +module box( + input logic a, + input logic b, + + output logic q +); + + logic c; + + assign c = a | b; + assign q = c ^ b; + +endmodule +``` + +Отлично! Мы научились создавать простейшее описание модуля. + +Для завершения базового представления о модулях осталось разобраться с таким понятием как **вектор**. + +## Векторы + +В SystemVerilog **вектором** называют группу проводов или регистров, объединенных общим именем, которая может использоваться как для передачи многоразрядных чисел, так и нескольких сигналов, выполняющих общую задачу. + +Синтаксис объявления вектора представлен ниже: + +
+<тип> [<старший индекс>:<младший индекс>] имя_вектора
+
+ +Несмотря на то, что может использоваться любой диапазон индексов (даже отрицательный), на практике стараются начинать младший индекс с нуля. + +Пример: + +
+logic [7:0] sum; // Объявляется 8-битный вектор с именем sum типа logic.
+                 // Старший индекс равен 7, младший — 0.
+
+ +Используя индекс, можно обратиться к отдельным битам вектора. С помощью диапазона индексов можно получить доступ к диапазону соответствующих битов. + +|фрагмент кода|описание| +|-------------|--------| +|sum[0]; | Обращение к младшему биту вектора sum, объявленного выше| +|sum[7:4]; | Обращение к старшим четырем битам 8-битного вектора sum, объявленного выше| + +Важно понимать, что векторы могут быть использованы и при описании портов модуля: + +```SystemVerilog +module vector_ex( + input logic [3:0] a, // У данного модуля четырехразрядный вход 'a' + output logic [7:0] b // и восьмиразрядный выход 'b'. +); + +assign b[7:4] = a; // К старшим четырем битам выхода b подключен вход a +assign b[3:1] = a[2:0]; // К битам с третьего по первый выхода b подключены + // биты со второго по нулевой входа a +assign b[0] = a[3]; // к младшему биту b подключен старший бит a; + +endmodule +``` + +## Иерархия модулей + +Модули могут содержать другие модули. Реализуя модуль "Пульт ДУ" можно использовать такие цифровые схемы как "Передатчик ИК-сигнала" и "Контроллер нажатия клавиш". Обе эти цифровые схемы могут быть независимыми модулями, которые объединяются в модуле верхнего уровня. + +Допустим, у нас есть модуль `inv`, который подает на выход инверсию входа и мы хотим реализовать модуль `top`, который хочет использовать функционал модуля `inv` следующим образом: + +![../.pic/Basic%20Verilog%20structures/modules/fig_08.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_08.drawio.png) + +Опишем `inv`: + +```SystemVerilog +module inv( + input logic a, + output logic d +); + + assign d = ~a; +endmodule +``` + +Опишем `top`: + +```SystemVerilog +module top( + input logic a, + input logic b, + output logic q +); + // подключение модуля + inv invertor_1( // подключаем модуль inv и + // даём экземпляру этого модуля + // имя invertor_1 + + .a(a), // вход а модуля inv подключаем ко + //входу a модуля top + + .d(c) // выход d модуля inv подключаем к + // проводу с модуля top + ); + +endmodule +``` + +Обратите внимание на то, как подключаются сигналы к вложенному модулю: при подключении после `.` пишется имя сигнала подключаемого модуля, затем в скобках пишется имя сигнала подключающего модуля. Для лучшего понимания, посмотрите внимательно на схеме на провод `c` и выход `d` модуля `inv`, а так же на SystemVerilog-описание этой схемы. + +Мы можем подключить сколько угодно экземпляров одного модуля, поэтому у каждого из экземпляра должно быть свое уникальное имя. Пусть `c` подаётся на логический вентиль И вместе со входом `b`. Результат операции И тоже пойдет на инвертор, а затем на выход `q` модуля top. + +![../.pic/Basic%20Verilog%20structures/modules/fig_09.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_09.drawio.png) + +Тогда в нашем описании добавится подключение второго модуля `inv` и провод `c`. + +```SystemVerilog +module inv( + input logic a, + output logic d +); + + assign d = ~a; +endmodule +``` + +```SystemVerilog +module top( + input logic a, + input logic b, + output logic q +); + + logic c; + + // подключение модуля 1 + inv invertor_1( // подключаем модуль inv и даём ему + // имя invertor_1 + + .a(a), // подключаем вход 'а' модуля inv ко + // входу 'a' модуля top + + .d(c) // подключаем выход 'd' модуля inv к + // проводу 'с' модуля top + ); + + // подключение модуля 2 + inv invertor_2( // подключаем модуль inv и даём ему + // имя invertor_2 + + .a(c & b), // на вход 'а' модуля inv подаём + // результат логической операции + // "с И b" + + .d(q) // подключаем выход 'd' модуля inv + // к выходу q модуля top + ); + +endmodule +``` + +___ + +## Итоги + +1. Ключевым блоком в иерархии цифровой схемы, описанной на языке SystemVerilog является **модуль**. Модули позволяют выносить части сложной цифровой схемы в отдельные блоки, из которых потом и будет составлена итоговая схема, что сильно упрощает разработку. +2. Условно, модуль можно разделить на следующие части: + 1. Объявление модуля: + 1. Ключевые слова `module` / `endmodule` определяющие границы описания модуля. + 2. Название модуля, следующее за ключевым словом `module`. Описанный модуль представляет собой отдельный тип, имя которого совпадает с названием модуля. + 3. Указание входов и выходов (портов) модуля, идущих в круглых скобках после названия модуля. Для указания направления порта модуля используются ключевые слова `input` и `output`. После указание направления порта следует указать тип порта (в рамках данного курса типом портов всегда будет logic), его разрядность, а затем имя. + 2. Функциональное описание модуля: + 1. Объявление внутренних сигналов модуля (будь то проводов или регистров) с помощью ключевого слова `logic`. + 2. Создание при необходимости объектов других модулей. + 3. Описание функциональной связи между различными сигналами и объектами внутри описываемого модуля. + +## Проверь себя + +Как по-вашему описать нижеприведенную схему на языке описания аппаратуры SystemVerilog? + +Обратите внимание, что вход `a` модуля `top` является двухразрядным: нулевой его бит идет на вход `a` модуля `or`, первый бит идет на вход `b` модуля `or`. + +![../.pic/Basic%20Verilog%20structures/modules/fig_10.drawio.png](../.pic/Basic%20Verilog%20structures/modules/fig_10.drawio.png) diff --git a/Basic Verilog structures/Multiplexors.md b/Basic Verilog structures/Multiplexors.md new file mode 100644 index 0000000..94e8224 --- /dev/null +++ b/Basic Verilog structures/Multiplexors.md @@ -0,0 +1,240 @@ +# Описание мультиплексора на языке SystemVerilog + +**Мультипле́ксор** — устройство, имеющее **несколько сигнальных входов**, **один или более управляющих входов** и **один выход**. Мультиплексор позволяет передавать сигнал **с одного из входов на выход**; при этом выбор желаемого входа осуществляется подачей соответствующей комбинации управляющих сигналов. + +Иными словами, мультиплексор — это переключатель (коммутатор), соединяющий выход с одним из множества входов. + +![../.pic/Basic%20Verilog%20structures/multiplexor/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_01.drawio.png) + +Для начала создадим простой двухвходовой мультиплексор. Предположим, на `Y` нам необходимо передать один из сигналов — `D0` или `D1` в зависимости от значения управляющего сигнала `S`: когда `S==0`, на `Y` подается сигнал `D0`, в противном случае — `D1`. + +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_02.drawio.png) + +На языке SystemVerilog это можно описать несколькими способами. Первый — с помощью **[тернарного условного оператора](https://ru.wikipedia.org/wiki/Тернарная_условная_операция)**: + +## Тернарный условный оператор + +
+ +О тернарном условном операторе + +Операторы бывают различной **[арности](https://ru.wikipedia.org/wiki/Арность)**(количества аргументов оператора[операндов]): + +- унарный (с одним операндом), пример: `-a`; +- бинарный (с двумя операндами), пример: `a+b`; +- тернарный (с тремя операндами), пример: `cond ? if_true : false`; +- и др. + +Несмотря на то, что тернарным оператором может быть любой оператор, принимающий три операнда, обычно под ним подразумевается **тернарный условный оператор**, работающий следующим образом: + +```text +<условие> ? <значение_если_условие_истинно> : <значение_если_условие_ложно> +``` + +Первым операндом идет некоторое условие (любое выражение, которое может быть сведено к 1 или 0). Далее ставится знак вопроса (часть тернарного оператора, отделяющая выражение первого операнда от выражения второго операнда). Далее пишется выражение, которое будет результатом тернарного условного оператора в случае, если условие оказалось истинным. После чего ставится двоеточие (часть тернарного условного оператора, отделяющая выражение второго операнда от выражения третьего операнда). Затем пишется выражение, которое будет результатом тернарного условного оператора в случае, если условие оказалось ложным. + +Пример для языка C++: + +```c++ +a = b+c >= 5 ? b+c : b+d; +``` + +Сперва вычисляется первый операнд (выражение `b+c >= 5`). Если это выражение оказалось истинным (равно единице), то переменной `a` будет присвоено значение второго операнда (выражения `b+c`), в противном случае переменной `a` будет присвоено значение третьего операнда (выражения `b+d`). +
+ +```SystemVerilog +logic Y; +assign Y = S==1 ? D1 : D0; +``` + +Данное выражение говорит нам, что если `S==1`, то `Y` присваивается значение `D1`, в противном случае — значение `D0`. + +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_03.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_03.drawio.png) + +Также мультиплексор можно описать через конструкцию `if-else` в блоке `always`. + +## Блок if-else + +> Далее будет ключевой параграф сложного для понимания текста, очень важно запомнить что там написано и разобрать приведенные листинги. + +

+ +--- + +### Блок always + +Блок `always` — это специальный блок, который позволяет описывать комбинационные и последовательностные схемы, используя более сложные конструкции, такие как `if-else`, `case`. На самом деле, в языке SystemVeriog помимо общего блока `always`, которым можно описать любой вид логики, существует множество специализированных блоков, предназначенных для описания отдельно комбинационной, синхронной и последовательностной асинхронной логики соответственно: + +- always_comb +- always_ff +- always_latch + +Мультиплексор можно описать в любом из этих блоков, разница будет лишь в том, к чему именно будет подключен выход мультиплексора: к проводу, регистру, или защелке. + +При присваивании внутри блоков `always` используйте специальный оператор **неблокирующего присваивания** `<=`. Бывает еще оператор **блокирующего присваивания** `=`, объяснение различий в этих операторах требует отдельного документа, поэтому на текущий момент, во избежание проблем в будущем просто запомните: **внутри любого блока always необходимо использовать только оператор неблокирующего присваивания <=**. + +```SystemVerilog +logic Y; +always_comb begin // 1) Используется always_comb, т.к. мы хотим подключить + // выход мультиплексора к проводу + if(S) begin // 2) if-else может находиться только внутри блока always. + Y <= D1; // 3) Используется оператор неблокирующего присваивания. + end else begin + Y <= D0; + end +end +``` + +Кроме того, важно запомнить, что присваивание сигналу допускается **только в одном** блоке always. + +Неправильно: + +```SystemVerilog +logic Y; +always_comb begin + if(S==1) begin + Y <= D1; + end +end + +always_comb begin + if(S==0) begin // Нельзя выполнять операцию присваивания + Y <= D0; // для одного сигнала (Y) в нескольких + end // блоках always! +end +``` + +Если нарушить это правило то в будущем (возможно не сразу, но в любом случае — обязательно), возникнет ошибка, которая так или иначе будет связана с **multiple drivers**. + +--- + +> Остановитесь на выделенном выше фрагменте документа, пока полностью не разберете его. Без освоения всех описанных выше особенностей языка SystemVerilog вы столкнетесь в будущем с множеством ошибок. + +

+ +## case-блок + +Мультиплексор также можно описать с использованием **конструкции case**. Блок `case` лучше подходит для описания мультиплексора, когда у того более двух входов (ведь в случае конструкции `if-else` пришлось бы делать вложенное ветвление). + +Конструкция `case` представляет собой инструмент множественного ветвления, который сравнивает значение заданного выражения с множеством вариантов, и, в случае первого совпадения, использует соответствующую ветвь. На случай, если ни один из вариантов не совпадет с заданным выражением, конструкция `case` поддерживает вариант `default`. Данная конструкция визуально похожа на оператор `switch-case` в Си, однако вы должны понимать, что используется она не для написания программы, а описания аппаратуры, в частности **мультиплексоров**/**демультиплексоров** и **дешифраторов**. + +**Конструкция `case`, наряду с `if-else`, может быть описана только в блоке `always`**. + +Реализация двухвходового мультиплексора с помощью `case` может выглядеть так: + +```SystemVerilog +logic Y; +always @(*) begin + case(S) // Описываем блок case, где значение сигнала S + // будет сравниваться с различными возможными его значениями + 1'b0: Y <= D0; // Если S==0, то Y = D0 + 1'b1: Y <= D1; + endcase // Каждый case должен заканчиваться endcase +end // (так же как каждый begin должен оканчиваться end) +``` + +Рассмотрим вариант посложнее и опишем следующую схему: + +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.png) + +Здесь уже используется мультиплексор 4в1. Управляющий сигнал `S` в данном случае двухбитный. В блоке `case` мы перечисляем всевозможные варианты значений `S` и описываем выход мультиплексора. + +```SystemVerilog +module case_mux_ex( + input logic A, + input logic B, + input logic C, + input logic D, + input logic [2:0] S, + + output logic Y + +); + always_comb begin + case(S) + 3'b00: Y <= A; + 3'b01: Y <= C | B; // в блоке case можно мультиплексировать + // не только провода, но и логические выражения + 3'b10: Y <= (C|B) & D; + /* + Обратите внимание, что разрядность сигнала S — 3 бита. + Это означает, что есть 8 комбинаций его разрядов. + Выше было описано только 3 комбинации из 8. + Если для всех остальных комбинаций на выходе мультиплексора должно + быть какое-то одно значение "по умолчанию", используется специальная + комбинация "default": + */ + default: Y <= D; + endcase + end +endmodule +``` + +### Защелка + +Очень важно при описании блока `case` описывать оставшиеся комбинации управляющего сигнала с помощью `default` — в противном случае в вашей схеме может появиться [защелка](https://www.build-electronic-circuits.com/d-latch/) (даже несмотря на то, что для описания защелок в SytemVerilog есть отдельный блок `always`: `always_latch`). + +Защелка позволяет хранить данные, причем данные в нее записываются не по тактовому синхроимпульсу, а на протяжении относительно длинного промежутка времени, когда управляющий сигнал "открывает" защелку. Из-за этого она не является ни комбинационной, ни синхронной схемой. Обычно появление защелки в цифровой схеме говорит об ошибке разработки: в случае, если планировалась комбинационная логика, добавление защелки приведет к непредвиденному удержанию предыдущих значений (поскольку защелка сохраняет предыдущее значение до прихода очередной комбинации управляющего сигнала, описанной в блоке `case`). В случае синхронной логики, будет непредсказуемое поведение данных, т.к. информация в защелку будет записываться не синхронно, как это ожидается, а на протяжении длительного промежутка времени, пока защелка "открыта". + +Пример: + +```SystemVerilog +module unexpected_d_latch_ex( + input logic [1:0] S, + input logic D0, + input logic D1, + output logic R +); + +always_comb begin + case(S) + 2'b00: R <= D0; + 2'b01: R <= D1; + // Поскольку сигнал S двухразрядный, осталось еще две комбинации: + // S == 2'b10 + // S == 2'b11 + endcase +end + + +endmodule +``` + +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_06.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_06.png) + +На данной схеме различные её части обозначены следующим образом: + +1. Мультиплексор, который мы хотели описать +2. Защелка +3. Мультиплексор, который был добавлен чтобы генерировать сигнал, "открывающий" защелку +4. Константная единица (питание) +5. Константный ноль (земля). + +В случае, если `S == 0` или `S == 1`, на выход мультиплексора 3 будет подана единица, которая переведет защелку в "прозрачный" режим (данные с выхода мультиплексора 1 будут проходить сквозь защелку). + +В случае, если `S > 1`, на выход мультиплексора 3 будет подан ноль, который переведет защелку в "непрозрачный" режим (данные с выхода мультиплексора 1 не будут идти сквозь защелку, вместо этого на выходе защелки останутся последние данные, которые шли через нее, пока она была "открыта"). + +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_07.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_07.png) + +Таким образом, во избежание появление защелки, необходимо описывать все возможные комбинации в блоке `case` (при необходимости покрывая множество оставшихся комбинаций с помощью `default`). + +## Итоги + +1. Мультиплексор — это **комбинационный** блок, подающий на выход один из нескольких входных сигналов. +2. Мультиплексор можно описать множеством способов, среди них: + 1. Использование [тернарного условного оператора](#тернарный-условный-оператор) через непрерывное присваивание; + 2. Использование конструкции [`if-else`](#блок-if-else) внутри блока `always`; + 3. Использование конструкции [`case`](#case-блок) внутри блока always (при этом стоит помнить, что через `case` можно описывать не только мультиплексоры). + 1. При использовании `case`, во избежание появления [защелок](#защелка), необходимо убедиться в том, что описаны все возможные комбинации управляющего сигнала (при необходимости, множество оставшихся комбинаций можно покрыть с помощью комбинации `default`) +3. Конструкции `if-else` и `case` в рамках данных лабораторных работ можно описывать только внутри блока [`always`](#блок-always). При работе с этим блоком необходимо помнить следующие особенности: + 1. Существует несколько типов блока `always`: `always_comb`, `always_ff`, `always_latch`, определяющих то, к чему будет подключена описанная в этом блоке логика: проводу, регистру или защелке соответственно. + 2. Внутри блока always следует использовать оператор неблокирующего присваивания `<=`. + 3. Присваивание для любого сигнала возможно только внутри **одного** блока always. Два разных сигнала могут присваиваться как в одном блоке always, так каждый в отдельном, но операция присваивания одному и тому же сигналу в двух разных блоках always — нет. + +--- + +## Проверь себя + +Как, по-вашему, описать на языке SystemVerilog схему, приведённую ниже? + +![../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_04.drawio.png) diff --git a/Basic Verilog structures/README.md b/Basic Verilog structures/README.md new file mode 100644 index 0000000..b63258a --- /dev/null +++ b/Basic Verilog structures/README.md @@ -0,0 +1,12 @@ +# Базовые конструкции языка Verilog + +Данные файлы содержат информацию, овладев которой вы сможете без труда выполнить первые лабораторные работы. +Порядок изучения следующий: + +1. Для первой лабораторной работы необходимо разобраться как описывается базовый модуль и [комбинационная логика](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B0), построенная на непрерывном присваивании. Этому посвящен документ [Modules.md](Modules.md). +2. Для выполнения второй лабораторной работы необходимо уметь писать базовый модуль (см. пункт 1) и описывать такой комбинационный блок, как [мультиплексор](https://ru.wikipedia.org/wiki/%D0%9C%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%BE%D1%80_%28%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0%29). Этому посвящен документ [Multiplexors.md](./Multiplexors.md). +3. Для выполнения третьей лабораторной работы в дополнение к предыдущим добавляется знание по описанию базовой ячейки памяти — регистру, и способу группировки сигналов (конкатенации). Этому посвящены документы [Registers.md](./Registers.md) и [Concatenation.md](./Concatenation.md) соответственно. + +Для выполнения всех последующих лаб необходимы знания по всем этим документам. + +Желаю успехов при подготовке к лабораторным работам! diff --git a/Basic Verilog structures/Registers.md b/Basic Verilog structures/Registers.md new file mode 100644 index 0000000..a7be8ba --- /dev/null +++ b/Basic Verilog structures/Registers.md @@ -0,0 +1,217 @@ +# Описание регистра на языке SystemVerilog + +Перед тем, как описывать память, необходимо научиться описывать отдельные регистры. [Регистр](https://ru.wikipedia.org/wiki/Регистр_(цифровая_техника)) — это базовая ячейка памяти, позволяющая хранить состояние, пока на схему подается питание. В современной электронике, регистр чаще всего строится на D-триггерах. В лабораторной работе по АЛУ уже вскользь упоминалось, что как для описания проводов, так и для описания регистров, используется тип `logic`. + +```SystemVerilog +logic reg_name; +``` + +![../.pic/Basic%20Verilog%20structures/registers/fig_01.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_01.drawio.png) + +У регистра может быть несколько входов и один выход. Основных входов, без которых не может существовать регистр два: вход данных и вход тактирующего синхроимпульса. На рисунке они обозначены как `D` и `clk`. Опциональный вход сигнала сброса (`rst`) позволяет обнулять содержимое регистра вне зависимости от входных данных и может работать как с тактовым синхроимпульсом (синхронный сброс), так и без него (асинхронный сброс). + +Помимо прочего у регистра также может быть входной сигнал разрешения записи (`enable`), который определяет будут ли записаны данные с входного сигнала данных в регистр или нет, опциональный вход установки (`set`), позволяющий принудительно выставить значение регистра в единицу. + +Выход у регистра один. На рисунке выше он обозначен как `Q`. + +Важно понимать, что названия приведенных портов не являются чем-то высеченным на камне, они просто описывают функциональное назначение. В процессе описания работы регистра вы будете оперировать только над именем регистра, и сигналами, которые подводите к нему. + +Поскольку все сигналы в цифровой схеме передаются по цепям, удобно представлять, что к выходу регистра всегда неявно подключен провод, с именем, совпадающим с именем регистра, поэтому вы можете использовать имя регистра в дальнейшей цифровой логике: + +![../.pic/Basic%20Verilog%20structures/registers/fig_02.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_02.drawio.png) + +Итак, мы добавили регистр на холст схемы, но как соединить его с какой-то логикой? Предположим, у нас есть сигнал тактового синхроимпульса и данные, которые мы хотим записать: + +![../.pic/Basic%20Verilog%20structures/registers/fig_03.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_03.drawio.png) + +Данной схеме соответствует код: + +```SystemVerilog +modulе rеg_ехаmрlе( + inрut logic clk, + inрut logic dаtа, + оutрut logic rеg_dаtа +); + + logic rеg_nаmе; + +еndmоdulе +``` + +Очевидно, мы хотим подключить сигнал `clk` ко входу тактирующего сигнала регистра, вход `data` ко входу данных, а выход регистра к выходу `reg_data`: + +![../.pic/Basic%20Verilog%20structures/registers/fig_04.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_04.drawio.png) + +Запись в регистр возможна только по фронту тактирующего синхроимпульса. **Фронт** — это переход сигнала из нуля в единицу (**положительный фронт**), либо из единицы в ноль (**отрицательный фронт**). + +Описание регистра, а так же указание фронта и тактирующего сигнала происходит в конструкции `always_ff`: + +```SystemVerilog +аlwауs_ff @(pоsеdgе clk) +``` + +Далее, внутри данной конструкции необходимо указать, что происходит с содержимым регистра. В нашем случае, происходит запись с входного сигнала `data` + +```SystemVerilog +аlwауs_ff @(pоsеdgе clk) + rеg_nаmе <= dаtа; +еnd +``` + +Обратите внимание на оператор `<=`. В данном случае, это не знак "меньше либо равно", а оператор **неблокирующего присваивания**. Существует оператор **блокирующего присваивания** (`=`), который меняет способ построения схемы для такого же выражения справа от оператора, однако в данный момент этот оператор останется за рамками курса. Хоть это и плохая практика в обучении, но пока вам надо просто запомнить, что **при описании записи в регистр всегда используйте оператор неблокирующего присваивания `<=`**. + +Помимо прочего, нам необходимо связать выход схемы с выходом регистра. Это можно сделать уже известным вам оператором **непрерывного присваивания** `assign`. + +Таким образом, итоговый код описания данной схемы примет вид: + +```SystemVerilog +modulе rеg_ехаmрlе( + inрut logic сlk, + inрut logic dаtа, + оutрut logic rеg_dаtа +); + + logic rеg_nаmе; + + аlwауs_ff @(pоsеdgе clk) bеgin + rеg_nаmе <= dаtа; + еnd + + аssign reg_data = reg_name; + +еndmоdulе +``` + +Предположим, мы хотим добавить управление записью в регистр через сигналы `enable` и `reset`. Это, например, можно сделать следующим образом: + +```SystemVerilog +modulе rеg_ехаmрlе( + inрut logic сlk, + inрut logic dаtа, + inрut logic reset, + inрut logic enable, + оutрut logic rеg_dаtа +); + + logic rеg_nаmе; + + аlwауs_ff @(pоsеdgе clk) bеgin + if(rеsеt) bеgin + rеg_nаmе <= 1'b0; + еnd + еlse if(enable) bеgin + rеg_nаmе <= dаtа; + еnd + еnd + + аssign rеg_dаtа = rеg_nаmе; + +еndmоdulе +``` + +Обратите внимание на очередность условий. В первую очередь, мы проверяем условие **сброса**, и только после этого условие **разрешения на запись**. +Если сперва проверить разрешение на запись, а затем в блоке `else` описать логику сброса, то регистр не будет сбрасываться в случае, если `enable` будет равен `1` (запись в регистр будет приоритетней его сброса). Если сброс описать не в блоке `else`, а в отдельном блоке `if`, то может возникнуть неопределенное состояние: нельзя однозначно сказать в какой момент придет сигнал `reset` относительно сигнала `enable` и что в итоге запишется в регистр. Поэтому при наличии сигнала сброса, остальная логика по записи в регистр должна размещаться в блоке `else`. + +Кроме того, САПР-ы смотрят на паттерн описания элемента схемы, и когда распознают его, реализуют элемент так как задумывал разработчик. Поэтому при описании регистра всегда сперва описывается сигнал сброса (если он используется) и только затем в блоке `else` описывается вся остальная часть логики записи. + +Итоговая схема регистра со сбросом и сигналом разрешения записи: + +![../.pic/Basic%20Verilog%20structures/registers/fig_05.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_05.drawio.png) + +Помимо прочего есть еще одно важное правило, которое необходимо знать при описании регистра: + +**Присваивание регистру может выполняться только в одном блоке `always`** + +Даже если вдруг, САПР не выдаст сразу сообщение об ошибке, в конечном итоге, на этапе синтеза схемы она рано или поздно появится в виде сообщения связанного с **"multiple drivers"**. + +В блоке присваивания регистру можно описывать и комбинационную логику, стоящую перед ним, например схему: + +![../.pic/Basic%20Verilog%20structures/registers/fig_06.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_06.drawio.png) + +можно описать как + +```SystemVerilog +modulе rеg_ехаmрlе( + inрut logic сlk, + inрut logic dаtа, + input logic A, + input logic B, + оutрut logic rеg_dаtа +); + + logic rеg_nаmе; + + аlwауs_ff @(pоsеdgе clk) bеgin + rеg_nаmе <= А & В; + еnd + + аssign reg_data = reg_name; + +еndmоdulе +``` + +Однако это всего лишь упрощение. Если вы умеете описывать регистр с подключением к нему всего одного провода на входе данных, вы все равно сможете описать эту схему: + +```SystemVerilog +modulе rеg_ехаmрlе( + inрut logic сlk, + inрut logic А, + inрut logic В, + оutрut logic rеg_dаtа +); + + logic rеg_nаmе; // Обратите внимание, что несмотря на то, что + logic аb; // и reg_name и ab объявлены типом logic, + // ab станет проводом, а reg_name — регистром + // (из-за непрерывного присваивания на ab, и блока + // always_ff для reg_name) + аssign аb = А & В; + + аlwауs_ff @(pоsеdgе clk) bеgin + rеg_nаmе <= аb; + еnd + + аssign reg_data = reg_name; + +еndmоdulе +``` + +Поэтому так важно разобраться в базовом способе описания регистра. + +Более того, с точки зрения синтезатора данное описание проще для синтеза, т.к. ему не разделять из одного `always` блока комбинационную и синхронные части. + +Вообще говоря регистр в общем смысле этого слова представляет собой многоразрядную конструкцию (в рассмотренном ранее примере, однобитный регистр мог представлять из себя простой D-триггер). +Создание многоразрядного регистра мало отличается от создания многоразрядного провода, а описание логики записи в многоразрядный регистр ничем не отличается от логики записи в одноразрядный регистр: + +```SystemVerilog +modulе rеg_ехаmрlе( + inрut logic сlk, + inрut logic [7:0] dаtа, + оutрut logic [7:0] rеg_dаtа +); + + logic [7:0] rеg_nаmе; + + аlwауs_ff @(pоsеdgе clk) bеgin + rеg_nаmе <= dаtа; + еnd + + аssign reg_data = reg_name; + +еndmоdulе +``` + +## Итоги + +1. [Регистр](https://ru.wikipedia.org/wiki/Регистр_(цифровая_техника)) — это базовая ячейка памяти, позволяющая хранить состояние, пока на схему подается питание. +2. Для объявления регистра используется тип `logic`, при необходимости после типа указывается разрядность будущего регистра. +3. Для описания логики записи в регистр используется блок `always_ff`, в круглых скобках которого указывается тактирующий сигнал и фронт, по которому будет вестись запись, а так же (в случае асинхронного сброса), сигнал сброса. +4. Регистр может иметь различные управляющие сигналы: установки/сброса/разрешения на запись. Логика этих управляющих сигналов является частью логики записи в этот регистр и так же описывается в блоке `always_ff`. +5. При описании логики записи в регистр, необходимо пользоваться оператором **неблокирующего присваивания** `<=`. +6. Нельзя описывать логику записи в регистр более чем в одном блоке `always` (иными словами, операция присваивания для каждого регистра может находиться только в одном блоке always). + +## Проверь себя + +Как, по-вашему, описать на языке SystemVerilog схему, приведённую ниже? + +![../.pic/Basic%20Verilog%20structures/registers/fig_07.drawio.png](../.pic/Basic%20Verilog%20structures/registers/fig_07.drawio.png) diff --git a/Basic Verilog structures/Testbench.md b/Basic Verilog structures/Testbench.md new file mode 100644 index 0000000..9844472 --- /dev/null +++ b/Basic Verilog structures/Testbench.md @@ -0,0 +1,90 @@ +# Тестовое окружение (Testbench) + +Для проверки правильного функционирования цифровых устройств необходимо разработать тестовое окружение. Тестовое окружение (testbench) – это блок, который окружает проверяемое устройство, формирует для него тестовые сигналы и автоматически проверяет, что сигналы на выходе проверяемого устройства соответствуют заложенным функциям. Тестовое окружение не является реальным аппаратным блоком (он только симулируется), поэтому в нем возможно использовать традиционные конструкции программирования. Например, то, что описывается в блоках `initial` в тестовом окружении, выполняется как программа в классическом программировании – строчка за строчкой. + +![../.pic/Basic%20Verilog%20structures/testbench/tb_1.png](../.pic/Basic%20Verilog%20structures/testbench/tb_1.png) + +Для того, чтобы создать тестовое окружение (testbench) необходимо создать новый файл симуляции в проекте. Для этого нажмите на `Add source`, после чего нужно выбрать `Add or create simulation sources` (на картинке ниже) → `Create File…` и так далее. + +![../.pic/Basic%20Verilog%20structures/testbench/tb_2.png](../.pic/Basic%20Verilog%20structures/testbench/tb_2.png) + +Так как для проверки разных модулей придется создавать различные тестовые окружения, то Vivado придется сообщать в явном виде какой из файлов симуляции вы сейчас хотите запустить. Для этого надо щелкнуть на нужном файле правой кнопкой и выбрать пункт `Set as Top` (продемонстрировано на картинке далее). + +![../.pic/Basic%20Verilog%20structures/testbench/tb_3.png](../.pic/Basic%20Verilog%20structures/testbench/tb_3.png) + +Название файла, для которого будет запускаться симуляция, отображается жирным шрифтом в окне `Sources` в папке `Simulation Sources`. После того, как выбран нужный файл симуляции, его можно запустить через панель `PROJECT MANAGER`, нажав на `Run Simulation`, а затем, в самом простом случае, можно запустить поведенческое моделирование `Run Behavioral Simulation`, оно позволяет увидеть поведение устройства в ответ на воздействия testbench’а. Временные задержки на прохождение сигналов через цифровые блоки при этом не учитываются. Так же можно посмотреть на реакцию устройства после синтеза `Post-Synthesis` или после имплементации `Post-Implementation`. Функциональная симуляция не учитывает временные задержки, временная – учитывает. Наиболее приближенная к реальности симуляция `Post-Implementation Timing Simulation`. Она учитывает временные задержки конкретных компонентов, в конкретной ПЛИС, с конкретными задержками распространения сигнала по каждому из проводов. + +![../.pic/Basic%20Verilog%20structures/testbench/tb_4.png](../.pic/Basic%20Verilog%20structures/testbench/tb_4.png) + +Пример тестового окружение для сумматора + +Ниже приводится пример тестового окружения, в котором: + +❶ – создаются провода и регистры для подключения к тестируемому модулю, + +❷ – подключается проверяемый модуль, + +❸ – описывается задача `task`, которую, подобно функции или подпрограмме, можно вызывать с различными параметрами, + +❹ – в блоке `initial` последовательно два раза вызывается задача `add_op`, после чего симуляция останавливается `$stop`, + +❺ – пример генерации тактового сигнала для подачи на вход проверяемого устройства. + + +``` verilog +`timescale 1ns / 1ps // Первое число указывает в каких величинах задержка + // например, использование #10 это 10 наносекунд + // если бы параметр был 10ns, то #10 означало бы 100ns + // Второе число указывает точность симуляции + // тут симуляция происходит для каждой пикосекунды + +module my_testbench (); // объявляем модуль тестового окружения + // внешних сигналов нет, поэтому скобки пустые + reg [31:0] A, B; //❶ объявляем регистры для управления входами сумматора + wire [31:0] S; // объявляем провод для подключения к выходу суммы + reg Cin; // объявляем регистр для управления входом Cin + wire Cout; // объявляем провод для подключения к выходу Cout + + adder dut ( //❷ подключаем тестируемый модуль + .a(A), // dut (device under test) – классическое название тестируемого модуля, + .b(B), // при желании можно использовать любое другое имя + .cin(Cin), + .s(S), + .cout(Cout)); + + initial begin // блок последовательного исполнения, начинает работу с момента времени 0 + add_op(6, 3); //❹ запустить задачу task add_op с параметрами 6 и 3 + add_op(2, 7); // когда закончиться предыдущая задача запустить новую + $stop; // остановить симуляцию + end + + task add_op; //❸ объявляем задачу add_op + input [31:0] a_op, b_op; // task получает на вход два параметра + begin + A = a_op; // подать на вход A сумматора новое значение a_op + B = b_op; // подать на вход B сумматора новое значение b_op + Cin = 0; // подать на вход Cin ноль + #100; // выждать 100 ns чтобы сигнальчики разбежались и сумматор успел посчитать + if (S == (a_op + b_op)) // если реальность (S) и ожидание (a_op+b_op) совпадают, то + $display("GOOD %d + %d = %d", A, B, S); // вывести в терминал сообщение good + else // в противном случае + $display("BAD %d + %d = %d", A, B, S); // вывести в терминал другое сообщение + end +endtask + +endmodule +``` + +``` verilog + reg clk; //❺ это вообще не относится к описанному выше testbench’у + always #10 clk = ~clk; // каждые 10ns менять clk на противоположное значение +``` + +Блоков initial в тестовом окружении может быть сколько угодно. Все эти блоки запускаются на исполнение параллельно. Блоков task так же может быть сколько угодно много и каждый из них может выполнять разные проверки. Так же поддерживаются множество стандартных языковых конструкции, например цикл for. Параметры для $display передаются так же, как у printf в языке C (на википедии есть вся информация). + +Данный пример проверяет две суммы (6+3) и (2+7). Тест необходимо дополнить большим количеством проверок: несколько с очень большими числами, несколько с отрицательными, несколько с отрицательными и положительными, несколько со входным переносом Cin = 1, несколько операций с числами вызывающим переполнение (чтобы проверить формирование Cout). + +По аналогии с этим примером необходимо реализовать модули проверки для: +- АЛУ (по несколько проверок на каждую операцию) +- Регистрового файла (последовательно записать какие-нибудь данные в разные адреса, а потом считать, убедившись, что все правильно, при этом считывание по адресу 0 должно всегда показывать 0) +- Памяти инструкций (считать содержимое из нескольких ячеек, чтобы убедиться, что память проинициализирована) diff --git a/Basic Verilog structures/Verilog syntax.md b/Basic Verilog structures/Verilog syntax.md new file mode 100644 index 0000000..666d936 --- /dev/null +++ b/Basic Verilog structures/Verilog syntax.md @@ -0,0 +1,262 @@ +# Конструкции языка Verilog + +Verilog чувствителен к регистру. Это значит что "ЗаписЬ" и "запись" Verilog будет воспринимать как два разных слова. Все ключевые слова Verilog записываются строчными буквами. +Каждое утверждение оканчивается точкой с запятой (`;`). Таким образом, символ переноса строки не прерывает выражение и может быть использован для повышения читаемости кода. +В Verilog Си-подобные комментарии. Вы можете закомментировать одну строку или окончание строки с помощью двух косых черт (`//`). Кроме того, вы можете использовать многострочные комментарии — всё что находится между парами символов `/*` и `*/` считается комментарием. +Любое имя, определяемое пользователем (имя переменной/модуля и т.п.) должно начинаться с латинской буквы, а не с числа. Определяемые пользователем имена не должны совпадать с ключевыми словами Verilog. + +В тексте будет много определений синтаксиса языка Verilog. При появлении новых конструкций будет использована следующая нотация: + +|| | +|-------------|-------------| +| **жирным** | будут выделены ключевые слова Verilog, такие слова необходимо использовать в точности как они написаны | +|_курсивом_ | будут выделены имена, определяемые пользователем | +|<> |            в скобках будут указаны требуемые характеристики, такие как тип, направление input/output размерность и т.п.| + +По прочтению этой главы вы узнаете: + +* Типы данных, представленных в языке Verilog; +* Как описывать базовую конструкцию модуля Verilog. + +## Типы данных + +В Verilog, каждому сигналу, константе, переменной или функции должен быть присвоен _тип данных_. Какие-то типы являются синтезируемыми, а какие-то используются только для моделирования абстрактного поведения. + +Verilog поддерживает четыре базовых состояния, которые может принять сигнал: 0, 1, X и Z. Ниже представлено описание каждого из этих состояний: + +|Значение|Описание| +|--------|--------| +|0| Логический ноль / ЛОЖЬ| +|1| Логическая единица / ИСТИНА| +|X| Неопределенное (неизвестное) или непроинициализированное состояние| +|Z| [Высокоимпедансное состояние](https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%81%D0%BE%D0%BA%D0%BE%D0%B8%D0%BC%D0%BF%D0%B5%D0%B4%D0%B0%D0%BD%D1%81%D0%BD%D0%BE%D0%B5_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5)| + + + +### Класс данных "Цепь" + +Как говорилось выше, каждому сигналу в Verilog должен быть назначен тип данных. Класс данных под названием "цепь" моделирует соединение (электрическую цепь) между компонентами и может принимать значения 0, 1, X, Z. Сигнал цепи постоянно управляется источником сигнала и меняет своё значение каждый раз, когда меняется значение на источнике (цепь не может хранить значение). + +![../.pic/Basic%20Verilog%20structures/verilog%20syntax/nets_variables.png](../.pic/Basic%20Verilog%20structures/verilog%20syntax/nets_variables.png) + +Рассмотрим рисунок выше. Красным цветом выделены сигналы класса "цепь". Сигнал _net\_11_ используется для соединения выхода логического элемента И со входом данных D-триггера _data\_0_. Выход логического элемента И является источником сигнала для цепи _net\_11_. Выход _data\_0_ является источником сигнала _net\_2_. + +В Verilog множество типов класса цепь, но самым распространенным является тип **wire**(провод). Вы можете представить подобный сигнал, как провод, подключенный к некому источнику. Значение сигнала в любой части провода одинаково и совпадает со значением подключенного к нему источника сигнала. Если провод не подключен ни к одному источнику, он находится в высокоимпедансном состоянии (принимает значение Z). + +Есть еще один тип, полностью идентичный типу **wire**, который называется **tri**. Эти типы взаимозаменяемы и разделены только для повышения читаемости кода. Тип **tri** используется, когда сигналом управляют несколько источников. + +![../.pic/Basic%20Verilog%20structures/verilog%20syntax/](../.pic/Basic%20Verilog%20structures/verilog%20syntax/tri_state.png) + +Пример сигнала, управляемого несколькими источниками. + +### Класс данных "Переменная" + +Verilog также поддерживает типы данных, которые моделируют ячейки памяти. Сигналы класса "переменная" могут принимать значения 0, 1, X, Z. Типы класса "переменная" могут хранить присвоенное им значение до очередного присваивания. Ниже представлено описание переменных типов: + +|Тип |Описание| +|------------|--------| +|**reg** | Переменная, моделирующая базовую ячейку памяти. Может принимать значения 0, 1, X, Z| +|**integer** | 32-битная переменная, представленная в [дополнительном коде](), представляющая диапазон чисел [‑2 147 483 648 : 2 147 483 647]| +|**real** | 64-битная переменная, представляющая числа с плавающей точкой в диапазоне [2.2×10‑308 : 2.2×10308]| +|**time** | Беззнаковая 64-битная переменная, принимающая значения в диапазоне [0 : 9.2×1018] | +|**realtime**| Синоним типа **real**. Используется для повышения читаемости| + +### Векторы + +В Verilog вектором называют одномерный массив элементов. Все типы класса "цепь", а также тип **reg** могут использоваться для формирования вектора. Синтаксис объявления вектора представлен ниже: + +
+<тип> [<старший индекс>:<младший индекс>] имя_вектора
+
+ +Несмотря на то, что может использоваться любой диапазон индексов (даже отрицательный), на практике стараются начинать младший индекс с нуля. +Пример: + +
+wire [7:0] sum; // Объявляется 8-битный вектор с именем sum типа wire.
+                // Старший индекс равен 7, младший — 0.
+                // Векторы типа wire обычно называют "шиной"(bus).
+
+reg [15:0] Q;   // В данной строке объявлен 16-битный вектор типа reg.
+
+ +Используя индекс, можно обратиться к отдельным битам вектора. С помощью диапазона индексов, можно получить доступ к диапазону соответствующих битов. + +|фрагмент кода|описание| +|-------------|--------| +|sum[0]; | Обращение к младшему биту вектора sum, объявленного выше| +|Q[15:8]; | Обращение к старшим восьми битам 16-битного вектора Q, объявленного выше| + + + +Обратите внимание, что нельзя объявить вектор типа **integer**, **time**, **real**, **realtime**. Однако, типы **integer** и **time** являются векторами сами по себе. Иными словами, вы не можете объявить следующий вектор: + +
+integer [7:0] dunno_what_size_of_this_object;
+
+ +но можете обращаться к отдельным битам объявленного объекта как если бы он был вектором: + +|фрагмент кода|описание| +|-------------|--------| +|integer int_object;
int_object[31];|
Обращение к старшему биту вектора| + +Таким образом, вы можете считать **integer** синонимом `reg signed [31:0]` (о значении **signed** будет чуть позже), а **time** синонимом `reg [63:0]` + +Поскольку **real** и **realtime** представляют числа с плавающей точкой, они не считаются векторами, и вы не можете обратиться к их отдельным битам. + +### Множества (Arrays) + +Множество (array) — это многомерный массив элементов. Множество можно назвать вектором векторов. Векторы внутри множества (элементы множества) обладают одинаковой размерностью. Для объявления множества, необходимо указать тип и размерность элементов множества, а также имя и размерность самого множества. При указании размерности множества, обычно сперва указывают начальный индекс, а после конечный. +Синтаксис объявления множества: + +
+<тип элемента> [<старший индекс элемента> : <младший индекс элемента>] 
+имя_множества [начальный индекс множества : конечный индекс множества]
+
+ +Пример: + +
+reg [7:0] mem [0:4095]; // Объявляется множество 8-битных векторов типа
+                        // reg, размером 4096.
+                        // Множество, элементами которого являются вектора
+                        // типа reg (например то, что объявлено здесь)
+                        // называют памятью.
+                        // Элементы памяти называют "словами".
+
+integer A [1:100];      // Объявляется множество со 100 элементами типа
+                        // integer.
+
+ +К элементу множества можно обратиться, используя его индекс. Кроме того, если элементом множества является вектор, можно так же обратиться к отдельному биту этого вектора, добавив и его индекс. +Примеры: + +|фрагмент кода|описание| +|-------------|--------| +|mem[2]; | Обращение к третьему элементу множества mem (третьему, поскольку нумерация начинается с нуля).
Подобное обращение вернет 8-битный вектор типа reg.| +|mem[2][7]; | Обращение к старшему биту третьего элемента множества mem.| +|A[2]; | Обращение ко второму элементу множества A (в этом случае, нумерация начинается с единицы, поскольку так было указано при объявлении множества A)| + + +### Целочисленные константы + +В Verilog есть два способа выразить целое число. Первый способ — это обычная запись десятичного числа, формируемая последовательностью цифр от 0 до 9, с опциональным указанием знака перед ней. Второй способ — это запись целого числа с указанием основания системы исчисления. Данная форма записи состоит из трех частей: + +1. опциональной константы размера +2. апострофа (`'`), за которым указывается формат основания системы исчисления +3. набора цифр, представляющих значение числа + +
+<размер>'[s]<основание><значение>
+
+ +Между каждой из частей может стоять пробел, но не внутри любой из них. + +Первая часть (константа размера) указывает точное число бит целочисленной константы. Для указания размера используется ненулевое положительное десятичное число. Например, для указания двух шестнадцатиричных цифр потребуется 8 бит, поскольку каждая шестнадцатиричная цифра занимает 4 бита. +Вторая часть, формат основания системы исчисления состоит из апострофа и нечувствительной к регистру букве, обозначающей основание системы исчисления, перед которой допустимо указать символ s(или S) для указания того, что число знаковое. + +|Синтаксис|Описание | +|---------|-------------------------------| +|**'b** | Беззнаковое двоичное | +|**'o** | Беззнаковое восьмеричное | +|**'d** | Беззнаковое десятичное | +|**'h** | Беззнаковое шестнадцатиричное | +|**'sb** | Знаковое двоичное | +|**'so** | Знаковое восьмеричное | +|**'sd** | Знаковое десятичное | +|**'sh** | Знаковое шестнадцатиричное | + +Третья часть содержит беззнаковое число, записанное цифрами, разрешенными для данной системы исчисления. Шестнадцатиричные цифры a-f не чувствительны к регистру. Кроме того, в качестве цифры могут использоваться символы `x`, `z` и `?`(аналогичен `z`) для обозначения неопределенного/высокоимпендансного состояния соответствующих им бит. +Если размер беззнакового числа в третьей части меньше размера, указанного в первой части, это число дополняется слева нулями за исключением случаев, когда в старшем бите числа записано `x` или `z`, в этом случае, число дополняется слева `x` или `z` соответственно. +Если размер беззнакового числа в третьей части больше размера, указанного в первой части, это число обрезается слева. + +Константы, для которых не указан размер будут иметь размер минимум 32 бита. Отрицательные числа представляются в дополнительном коде. + +При записи числа в любом его месте кроме начала может использоваться символ нижнего подчеркивания (`_`). Этот символ будет игнорироваться и используется как разделитель для повышения читаемости. + +Пример 1 — Беззнаковые константы: + +|фрагмент кода|описание| +|-------------|--------| +|659 | знаковое десятичное число| +|'h 837FF | беззнаковое шестнадцатиричное число| +|'o7460 | беззнаковое восьмеричное число| +|4af | запрещенная запись (шестнадцатиричная запись возможна лишь с 'h)| +
+Пример 2 — Знаковые константы: + +|фрагмент кода|описание| +|-------------|--------| +|4'b1001 | 4-битное двоичное беззнаковое число| +|5 'D 3 | 5-битное десятичное беззнаковое число| +|3'b01x | 3-битное беззнаковое двоичное число, у которого неизвестен младший бит| +|12'hx | 12-битное неизвестное число| +|16'hz | 16-битное высокоимпеднансное число| +
+Пример 3 — Использование знака с константами: + +|фрагмент кода|описание| +|-------------|--------| +|8 'd -6 | Запрещено, константа в третьей части записывается в виде беззнакового числа| +|-8 'd 6 | Здесь записано -6 в дополнительном коде (1111_1010), хранящееся в 8-ми битах.| +|4 'shf | Здесь записано 4-битное число с двоичной записью: '1111', которое интерпретируется как '-1' в десятичной записи.
Это эквивалент записи -4'h 1| +|-4 'sd15 | Это эквивалент записи -(-4'd 1), или двоичного '0001'| +|16'sd? | То же, что и 16'hz| +
+Пример 4 — Выравнивание размера: + +|фрагмент кода|описание| +|-------------|--------| +|8 'h F0AA |Константа превышает указаный размер и будет обрезана до AA| +|8'sb1001 |Константа меньше указанного размера и дополняется слева нулями до "00001001"| +|13'h1z1 |Константа меньше указанного размера и дополняется слева Z до "zzzzzzzzz0001"| +
+Пример 5 — Использование нижнего подчеркивания: + +|фрагмент кода | +|-----------------------| +|27_195_000 | +|16'b0011_0101_0001_1111| +|32 'h 12ab_f001 | + +### Присваивания между различными типами + +Verilog является так называемым языком со слабой типизацией, что означает, что он допускает присваивания между различными типами. Причиной тому является то, что Verilog относится к любому типу как к группе битов. Присваивая значения одного типа другому, Verilog автоматически обрезает или дополняет необходимым для присваивания количеством старших бит. Ниже приведен пример того, как Verilog справляется с присваиваниями между различными типами (предположим, что мы создали переменную `ABC_TB`, которая объявлена как `reg [2:0]`) + +
+ABC_TB = 2'b00; // ABC_TB будет присвоено 3'b000. Автоматически добавлен
+                // старший бит
+ABC_TB = 5;     // ABC_TB будет присвоено 3'b101. Целочисленное число
+                // размером минимум 32 бита обрезано до 3-х.
+ABC_TB = 8;     // ABC_TB будет присвоено 3'b000. Целочисленное число
+                // со значащими битами "1000" будет брезано до 3-х.
+
+ + +### Проверь себя + +Чаще всего используемыми типами в Verilog являются wire и reg. В чем их фундаментальное различие? + +1. У них нет различий, поскольку они оба могут принимать значения 0, 1, X, Z. +2. wire является типом класса "цепь" — это значит, что значением этого сигнала постоянно управляет источник. reg является типом класса "переменная" — это значит, что он будет хранить своё значение после присваивания. +3. wire может принимать лишь значения 0 и 1, в то время как reg может принимать значения 0, 1, X, Z. +4. Они не могут подаваться на входы друг друга. + +## Создание модуля в Verilog + +Все устройства, описываемые языком Verilog воплощаются в виде модуля (**module**). Модули могут включать в себя создание других модулей с целью создания иерархических проектов. Начало и конец описания подобного устройства обозначаются ключевыми словами **module** и **endmodule** соответственно. На практике считается хорошим тоном размещать каждый модуль в отдельном файле с расширением `.v`. + +Синтаксис объявления модуля: +
+module module_name (<port_list> and <port_definitions>);
+// module_items
+endmodule
+
+ +![../.pic/Basic%20Verilog%20structures/verilog%20syntax/file_structure.png](../.pic/Basic%20Verilog%20structures/verilog%20syntax/file_structure.png) + +### Объявления портов + +Первое, что указывается после имени модуля — это описание его входов и выходов, или так называемых портов. Каждому порту должно быть дано имя, направление и тип. diff --git a/Introduction/About FPGA.md b/Introduction/About FPGA.md new file mode 100644 index 0000000..2c2768f --- /dev/null +++ b/Introduction/About FPGA.md @@ -0,0 +1,83 @@ +# Хочу под ПЛИС! + +`статья 2020 года` + +Ну, раз хочешь под [ПЛИС](https://marsohod.org/index.php/ourblog/11-blog/265-fpga) проектировать, то мы просто не могли пройти мимо. Не очень дорогая, но невероятно универсальная для цифровой электроники вещь. Можно назвать не иначе, как конструктором Lego для взрослых, только детальки имеют нанометровые размеры, и ты можешь сделать все что угодно. Ну, пока «пластилин» не закончится, она ведь не резиновая, хотя современные дешевые ПЛИС позволяют разворачивать на себе относительно большие проекты. + +![../.pic/Introduction/About%20FPGA/beatles.jpg](../.pic/Introduction/About%20FPGA/beatles.jpg) + +Гибкость! Гибкость помогает реализовать просто гигантский полет фантазии. Хочешь, [нейроночку](https://habr.com/ru/post/349750/) [запусти](https://cyberleninka.ru/article/n/ustroystvo-na-osnove-plis-dlya-raspoznavaniya-rukopisnyh-tsifr-na-izobrazheniyah). Хочешь, [книжку небольшую](https://www.amazon.com/Designing-Video-Game-Hardware-Verilog/dp/1728619440) прочитай за недельку, да видео-игру запили. Или крутую обработку каких-нибудь данных для студенческого проекта или курсовой. Или процессор разверни, да не один, а сразу несколько, и все они зачем-то будут общаться друг с другом, [вон сколько](https://opencores.org/projects?expanded=Processor&language=Verilog) бесплатных доступно для скачивания. Да-да, для скачивания. [Процессор можно описать](https://ru.wikipedia.org/wiki/Soft-микропроцессор), например, на verilog (что ты и делаешь на лабах по АПС вообще-то) и просто скачать его код и развернуть у себя на отладке. Или [клеточный автомат](https://marsohod.org/projects/marsohod2/276-2014-09-04-09-57-27) реализуй, просто так, по-приколу. Или [измеритель дивергенции](http://www.mindspring.com/~tomtitor/index.html), почему нет. Или вот, в [интернетах ваших](https://marsohod.org), не менее 60 проектов различного уровня сложности, все в одном месте, и многое прям сделать хочется. ПЛИС — это настолько шикарная вещь, что легендарные the Beatles даже песню написали о желании приобрести ее. Так что не тормози, скорее заимей себе такую. Во-первых, это весело, а во-вторых это тебе точно пригодится в будущем. + +Понимаю-понимаю. Область новая, неизведанная, как выбирать — не понятно, а вещь хоть и не самая дорогая, но и не особо дешевая, тем более для студента. Так что ниже, для тебя подготовлена подборочка недорогих ПЛИС от [Николая](https://://t.me/ternovoy_n) (ему можно задавать вопросы), которые точно сгодятся для [первых шагов](https://cxem.net/mc/mc380.php) в этот удивительный мир digital design. + +На первых порах предлагается использовать проблемно-ориентированный подход в обучении. То есть, сразу поставь себе какую-нибудь простую задачу, связанную с разработкой на ПЛИС и пробуй ее решить, в процессе этого обучаясь. Получение результата вызывает невероятно позитивные эмоции, тем самым питает и помогает в достижении новых горизонтов. + +В помощь тебе [классический курс по verilog hdl](http://iosifk.narod.ru/hdl_coding/verilog.htm) на русском. Про youtube и google/yandex не забывай, там легко найдешь ответы на первые вопросы о подключении и настройке. Про САПРы будет сказано в подборке. + +А когда прям затянет и захочешь глубоко и серьезно, то вот тебе [отличная статья](https://habr.com/ru/post/281525/) со списком тем, которые должен освоить разработчик под ПЛИС, рекомендуемой литературой по каждой из тем, набором тестовых вопросов и лабораторных работ, а еще с классическими ошибками новичков и советами по их исправлению. + +Итак, твоему вниманию представляется проштампованный список от команды АПС. + +–– + +### Altera Cyclone IV EP4CE6 FPGA Development Board + +![../.pic/Introduction/About%20FPGA/cyclone4.jpg](../.pic/Introduction/About%20FPGA/cyclone4.jpg) + +**~3040 рублей** + +Можно найти на [aliexpress](https://aliexpress.ru/item/32691369830.html?spm=2114.13010708.0.0.3bf733edolPr16). + +Из достоинств этой платы, можно отметить относительно низкую цену, наличие базовой периферии для минимальной визуализации данных (есть семисегментные индикаторы). Данная плата максимально приближена к той, что вы будете использовать на лабораторных работах по АПС в 2020/2021 учебном году. Плюс уже знакомый САПР Altera Quartus II. + +> Особенно внимательно нужно выбирать отладочные платы с aliexpress и ebay - бывают фейки, читай отзывы, комментарии. Указанная плата уже прошла проверку временем, и я могу быть уверен, что вы сможете получить обратную связь от производителя, в случае возникновения у вас проблем с доставкой или заводским браком. Так же, вы сможете найти открытые исходники электрической схемы на платы, схемы соединений и огромное количество демопроектов, на базе которых вы сможете начать свое обучение. Данную плату я заказывал лично 2 года назад, проблем с ней не было, но некачественно переведенная документация с китайского на английский немного осложняла мне работу. + +–– + +### Отладочная плата с ПЛИС Altera EP2C5T144 + +![../.pic/Introduction/About%20FPGA/EP2.jpg](../.pic/Introduction/About%20FPGA/EP2.jpg) + +**~ 1100 рублей** + +[Еще одна отладка](https://www.ebay.com/itm/CycloneII-EP2C5T144-FPGA-Development-Board-ALTERA-USB-Blaster-JTAG-programmer/192501574934?hash=item2cd1fced16:g:88wAAOSw1m9axIQa) с ПЛИС от Altera, только с [ebay](https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=Altera+CycloneII+EP2C5T144+FPGA+Mini+Development+Learn+Core+Board+E081&_sacat=0) и тоже доставка бесплатная. Еще дешевле предыдущих — несомненный плюс, но совсем нет периферии — минус. Но периферию эту всегда докупить можно, так что минус устраняемый. Написано, что доставляют по всему миру бесплатно, но иногда бывает, что весь мир не включает Россию — если узнаешь ответ, то скажи. Еще один как бы минус — для Cyclone II (именно такая ПЛИС тут и стоит) потребуется относительно старый САПР Quartus 13 (сейчас 19). Для начала пути это вообще никаких проблем создать не должно, а душа ведь просит последнюю версию. Но какая цена хорошая. + +–– + +### TinyFPGA BX + +![../.pic/Introduction/About%20FPGA/TinyFPGA.jpg](../.pic/Introduction/About%20FPGA/TinyFPGA.jpg) + +**~ 2900 рублей** + +[TinyFPGA BX](https://www.crowdsupply.com/tinyfpga/tinyfpga-ax-bx) одна из самых дешевых и доступных плат. Относительно низкая цена объясняется достаточно бедной периферией, однако для вас найдется 24 GPIO пина (конфигурируемых порта ввода\вывода), к которым вы сможете подключить различную периферию (например различные датчики температуры, движения, света, да всего, что угодно). На плате установлена ПЛИС [iCE40LP8K](https://www.latticesemi.com/ice40) фирмы [Lattice](https://www.latticesemi.com/en). Стоит отметить, что с ПЛИС данного семейства можно работать при помощи архаичного и «недружелюбного» САПРа [iceCUBE2](https://www.latticesemi.com/iCEcube2), однако данная ПЛИС полностью поддерживается и OpenSource проектом iceStorm, о котором подробнее можно прочитать по [ссылке](https://github.com/YosysHQ/icestorm). + +–– + +### iCEBreaker FPGA + +![../.pic/Introduction/About%20FPGA/ice.jpg](../.pic/Introduction/About%20FPGA/ice.jpg) + +**~ 5500 рублей** + +[Отладочная плата](https://www.crowdsupply.com/1bitsquared/icebreaker-fpga) на базе ПЛИС вендора Lattice, семейства [ice40UP](http://www.latticesemi.com/Products/FPGAandCPLD/iCE40UltraPlus). + +Особенность данной платы заключается в том, что вокруг неё активно развивается OpenSourse сообщество. Зайди на страничку, посмотри видео. Работать с данной платой, можно не только используя САПР [Radiant](https://www.latticesemi.com/radiant) от вендора, но и пользоваться OpenSource проектом [iceStorm](https://github.com/YosysHQ/icestorm), подробнее об этом, вы сможете прочитать на их странице. + +Периферии, кроме классических портов ввода\вывода (GPIO), кнопок и светодиодов — нет. Поэтому придется так же докупить необходимые модули и соединительные провода для их подключения. + +–– + +В данный список, очень хотелось бы добавить современные отладочные платы от Xilinx (лидера по производству ПЛИС), однако в связи с санкциями, закупка плат данного вендора весьма проблематична, а местные дистрибьюторы достаточно сильно завышают цену. Однако, ситуация в любой момент сможет измениться, а для вас, как для студентов, доступна опция Academic Price – существенная скидка на покупку платы. Поэтому заинтересованным рекомендую мониторить [этот сайт](https://store.digilentinc.com). + +Так же стоит отметить [сайт с платами](https://www.terasic.com.tw/en/) от Intel (Altera), но самая дешевая стоит 55$ по академической цене. + +Конечно, есть варианты обхода доставки плат от официальных иностранных представителей через такие сервисы, как [Бандеролька](https://qwintry.com/ru) и прочие, но накладные расходы на доставку порой могут превышать стоимость самой платы. Поэтому о рентабельности данной затеи судить только вам самим. Либо! Вы можете написать мне о своем желании купить скопом, чтобы сэкономить, и когда наберется, скажем, человек 5, скооперироваться и сделать общий заказ. + +–– + +### Проект Марсоход + +Напоследок, не могу не поделиться с вами проектом [Марсоход](https://marsohod.org) (ссылки на него уже фигурировали выше). На их сайте вы найдете учебные материалы по основам цифровой схемотехники и разработки под ПЛИС. [Тут](https://marsohod.org/projects) приведена ссылка на проекты от Марсоход, которые реализованы под конкретные платы их собственного производства. В зависимости от заинтересовавшего вас проекта вы сможете выбрать подходящую вам плату. + +Успехов! diff --git a/Introduction/How FPGA works.md b/Introduction/How FPGA works.md new file mode 100644 index 0000000..921418c --- /dev/null +++ b/Introduction/How FPGA works.md @@ -0,0 +1,188 @@ +# Что такое ПЛИС и как она работает + +- [Что такое ПЛИС и как она работает](#что-такое-плис-и-как-она-работает) + - [История появления ПЛИС](#история-появления-плис) + - [Цифровые схемы и логические вентили](#цифровые-схемы-и-логические-вентили) + - [Цифровые схемы](#цифровые-схемы) + - [Логические вентили](#логические-вентили) + - [Мультиплексоры](#мультиплексоры) + - [Таблицы подстановки (Look-Up Tables, LUTs)](#таблицы-подстановки-look-up-tables-luts) + - [D-триггеры](#d-триггеры) + - [Арифметика](#арифметика) + - [Логическая ячейка](#логическая-ячейка) + - [Выводы](#выводы) + +## История появления ПЛИС + +До появления интегральных схем, электронные схемы собирались из отдельных элементов, как модель, собранная из кубиков Lego. В случае, если при сборке электронной схемы была допущена ошибка, вы могли исправить её ручной корректировкой соединения элементов подобно исправлению ошибки, допущенной при сборке модели Lego. +С улучшением технологических процессов произошла миниатюризация базовых элементов, из которых состоят электронные схемы, что привело к появлению интегральных схем — электронных схем, выполненных на полупроводниковой подложке и заключенных в неразборный корпус. +В большинстве случаев, исправить ошибку, допущенную при разработке и изготовлении интегральной схемы становится невозможным. С учетом того, что изготовление прототипа интегральной схемы является затратным мероприятием (от десятков тысяч до миллионов долларов в зависимости от тех процесса и площади изготавливаемого кристалла), возникла необходимость в способе проверки прототипа схемы до изготовления её прототипа. Так появились **программируемые логические интегральные схемы** (**ПЛИС**). +ПЛИС содержит некое конечное множество базовых блоков (примитивов), программируемые блоки межсоединений примитивов и блоки ввода-вывода. Подав определенный набор воздействий на ПЛИС (**запрограммировав** её), можно настроить примитивы, их межсоединения между собой и блоками ввода-вывода, чтобы получить определенную цифровую схему. Удобство ПЛИС заключается в том, что в случае обнаружения ошибки на прототипе, исполненном в ПЛИС, вы можете исправить свою цифровую схему, и повторно запрограммировать ПЛИС. +Кроме того, эффективно использовать ПЛИС не как средство дешевого прототипирования, но и как средство реализации конечного продукта в случае малого тиража (дешевле купить и запрограммировать готовую партию ПЛИС, чем изготовить партию собственных микросхем). + +Стоит оговориться, что обычно под термином ПЛИС подразумевается конкретный тип программируемых схем: **FPGA** (**field-programmable gate array**, **программируемая пользователем вентильная матрица**) здесь и далее термин **ПЛИС** будет использоваться как синоним **FPGA**. + +Давайте разберемся что же это за устройство и как оно работает изнутри, но перед этим необходимо провести ликбез по цифровым схемам и логическим вентилям. + +## Цифровые схемы и логические вентили + +### Цифровые схемы + +В электронике, словом "цифровая" описывают схемы, которые абстрагируются от непрерывных (аналоговых) значений напряжений, вместо этого используется только два дискретных значения: `0` и `1`. На текущем уровне абстракции нас не интересуют конкретные значения напряжений и пороги этих значений. К примеру, ПЛИС часто используются значения `1.2` В в качестве `1` и `0 В` в качестве `0`. Если реальным значением сигнала будет напряжение `0.8 В`, что достаточно близко к `1.2 В`, оно всё ещё будет считаться `1`. +Цифровые схемы разрабатываются таким образом, чтобы устанавливать крайние значения напряжений (сигнал, имеющий значение напряжения `0.8 В`, пройдя через очередной логический вентиль будет иметь значение напряжения около `1.2 В`), что делает их крайне устойчивыми к шумам и влиянию внешнего мира. +Таким образом, концепция "цифровой схемы" позволяет нам уйти от всего этого сложного поведения на уровне напряжений, давая нам возможность разрабатывать схему в идеальном мире, где у напряжения может быть всего два значения: `0` и `1`. А обеспечением этих условий будут заниматься базовые блоки, из которых мы будем строить цифровые схемы. + +Эти базовые блоки называются **логическими вентилями**. + +### Логические вентили + +Существует множество логических вентилей, но чаще всего используется четыре из них: **И**, **ИЛИ**, **Исключающее ИЛИ**, **НЕ**. Каждый из этих элементов принимает на вход **цифровое значение** (см. [**цифровая схема**](#цифровые-схемы)), выполняет определенную **логическую функцию** над входами и подает на выход результат этой функции в виде **цифрового значения**. + +Логический вентиль **И** принимает два входа и выдает на выход значение `1` только в том случае, если оба входа равны `1`. Если хотя бы один из входов `0`, то на выходе будет `0`. На схемах, логический вентиль **И** отображается следующим образом: + +![../.pic/Introduction/How%20FPGA%20works/FPGA_ang_gate.png](../.pic/Introduction/How%20FPGA%20works/FPGA_ang_gate.png) + +Логический вентиль **ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если хотя бы один из входов равен `1`. Если оба входа равны `0`, то на выходе будет `0`. На схемах, логический вентиль **ИЛИ** отображается следующим образом: + +![../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate.png](../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate.png) + +Логический вентиль **Исключающее ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если значения входов не равны между собой (один из них равен `1`, а другой `0`). Если значения входов равны между собой (оба равны `0` или оба равны `1`), то на выходе будет `1`. На схемах, логический вентиль **Исключающее ИЛИ** отображается следующим образом: + +![../.pic/Introduction/How%20FPGA%20works/FPGA_xor_gate.png](../.pic/Introduction/How%20FPGA%20works/FPGA_xor_gate.png) + +Логический вентиль **НЕ** является самым простым вентилем. Он принимает один вход и подает на выход его инверсию. Если на вход пришло значение `0`, то на выходе будет `1`, если на вход пришло значение `1`, то на выходе будет `0`. На схемах, логический вентиль **НЕ** отображается следующим образом: + +![../.pic/Introduction/How%20FPGA%20works/FPGA_not_gate.png](../.pic/Introduction/How%20FPGA%20works/FPGA_not_gate.png) + +Так же существуют вариации базовых вентилей, такие как **И-НЕ**, **ИЛИ-НЕ**, **Исключающее ИЛИ-НЕ**, отличающиеся от исходных тем, что их выходы инвертируются. + +Логические вентили строятся из **транзисторов**. **Транзистор** — это полупроводниковый элемент, может пропускать/блокировать ток в зависимости от поданного напряжения на его управляющий вход. + +На приведенном ниже рисунке показан способ построения логического вентиля **И** на базе двух транзисторов. Подача значения `1` на вход **А** или **B** "открывает" соответствующий транзистор. Если оба транзистора открыты, на выход идет **напряжение питания** (`1` в контексте **цифровых значений**). В случае, если хотя бы на одном входе **А** или **B** будет значение `0`, соответствующий транзистор будет закрыт (можно считать что он превратится в разрыв цепи). В этом случае выход будет подключен к **земле** (`0` в контексте цифровых значений). Как вы видите, напряжение на выход подается от **источников постоянного питания** или **земли**, а не от входов вентиля, именно этим и обеспечивается постоянное обновление напряжения и устойчивость **цифровых схем** к помехам. + +![../.pic/Introduction/How%20FPGA%20works/FPGA_and_gate_transistor.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_and_gate_transistor.drawio.png) + +Теперь, имея базовое представление о транзисторах и логических вентилях, мы можем построить из них что-то полезное. Используя одни лишь описанные выше логические вентили можно построить **любую(!)** цифровую схему. + +Однако, при описаний цифровых схем, некоторые цифровые блоки используются настолько часто, что для них ввели отдельные символы (**сумматоры**, **умножители**, **мультиплексоры**), используемые при описании более сложных схем. Мы рассмотрим один из фундаментальных строительных блоков в ПЛИС — **мультиплексор**. + +### Мультиплексоры + +Мультиплексор — это устройство, которое в зависимости от значения **управляющего сигнала** подает на выход значение одного из входных сигналов. + +Схематически, мультиплексор обозначается следующим образом: + +![../.pic/Introduction/How%20FPGA%20works/FPGA_mux_symbol.png](../.pic/Introduction/How%20FPGA%20works/FPGA_mux_symbol.png) + +Символ `/` на линии `sel` используется, чтобы показать что этот сигнал шириной 6 бит. + +Число входов мультиплексора может быть различным, но выход у него всегда один. + +**Способ, которым кодируется значение управляющего сигнала может также различаться**. Простейшая цифровая схема мультиплексора получится, если использовать `one-hot`-кодирование. При таком кодировании, значение **многоразрядного** сигнала **всегда** содержит **ровно одну** `1`. Информация, которую несет закодированный таким образом сигнал содержится в положении этой `1` внутри многоразрядного сигнала. + +Посмотрим, как можно реализовать мультиплексор с управляющим сигналом, использующим `one-hot`-кодирование, используя только логические вентили **И**, **ИЛИ**: + +![../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_initial.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_initial.drawio.png) + +Если мы выставим значение управляющего сигнала, равное `000010`, означающее что только **первый** бит этого сигнала (**счет ведется с нуля**) будет равен **единице** (`sel[1] = 1`), то увидим, что на один из входов каждого логического вентиля **И** будет подано значение `0`. Исключением будет логический вентиль **И** для входа `b`, на вход которого будет подано значение `1`. Это означает, что все логические вентили **И** (кроме первого, на который подается вход `b`) будут выдавать на выход `0` (см. [Логические вентили](#логические-вентили)) вне зависимости от того, что было подано на входы a,c,d,e и f. Единственным входом, который будет на что-то влиять окажется вход `b`. Когда он равен `1`, на выходе соответствующего логического вентиля **И** окажется значение `1`. Когда он равен `0` на выходе **И** окажется значение `0`. Иными словами, выход **И** будет повторять значение `b`. + +![../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_path.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_path.drawio.png) + +Логический вентиль **ИЛИ** на данной схеме имеет больше двух входов. Подобный вентиль может быть создан в виде каскада логических вентилей **ИЛИ**: + +![../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate_tree.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate_tree.drawio.png) + +**Многовходовой вентиль ИЛИ** ведет себя ровно так же, как двухвходовой: он выдает на выход значение `1` когда хотя бы один из входов равен `1`. В случае, если все входы равны `0`, на выход **ИЛИ** пойдет `0`. + +Но для нашей схемы мультиплексора гарантируется, что каждый вход **ИЛИ** кроме одного будет равняться `0` (поскольку выход каждого **И** кроме одного будет равен `0`). Это означает, что выход **многовходового ИЛИ** будет зависеть только от **одного** входа (в случае, когда `sel = 000010` — от входа `b`). + +![../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_output.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_output.drawio.png) + +Меняя значение `sel`, мы можем управлять тем, какой из входов мультиплексора будет управлять его выходом. + +Теперь, попробуйте представить огромную матрицу мультиплексоров, у которых можно "запрограммировать" управляющий сигнал `sel` (под "запрограммировать" подразумевается "выставить то значение, которое нам нужно"). Это позволит направлять сигналы вашей цифровой схемы туда, куда вам будет нужно. Именно так ПЛИС и управляет тем, куда именно приходят сигналы. + +Разумеется, **маршрутизация миллионов сигналов** — дело запутанное, но по своей сути **это всего лишь куча мультиплексоров, у которых управляющий сигнал `sel` подключен к программируемой памяти**. + +## Таблицы подстановки (Look-Up Tables, LUTs) + +Итак, у нас есть способ динамически менять маршрут сигналов и приводить их туда, куда нам нужно. Теперь необходимо понять, как генерировать произвольную логику. И для этого мы снова воспользуемся мультиплексорами, в частности их производными, которые называются **Таблицы подстановки** или **Look-Up Tables** (**LUTs**). + +Представьте мультиплексор с четырьмя входными сигналами, и двухбитным управляющим сигналом (обратите внимание, что в теперь это сигнал не использует `one-hot`-кодирование). Но теперь, вместо того, чтобы выставлять входные сигналы во внешний мир, давайте подключим их к программируемой памяти. Это означает, что мы можем "запрограммировать" каждый из входов на какое-то константное значение. Поместим то что у нас получилось в отдельный блок и вот, мы получили двухвходовую **Таблицу подстановки** (далее **LUT**). + +![../.pic/Introduction/How%20FPGA%20works/FPGA_lut_scheme.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_lut_scheme.drawio.png) + +Эти два входа **LUT** являются битами управляющего сигнала мультиплексора, спрятанного внутри **LUT**. Программируя входы мультиплексора (точнее, программируя память, к которой подключены входы мультиплексора), мы можем получить из **LUT** **любую(!)** логическую функцию, принимающую два входа и возвращающую один выход. + +Допустим мы хотим получить **логическое И**. Для этого, нам потребуется записать в память следующее содержимое: + +|Адрес (In[1:0])| Значение | +|---------------|----------| +| 00 | 0 | +| 01 | 0 | +| 10 | 0 | +| 11 | 1 | + +Это простейший пример — обычно **LUT**-ы имеют больше входов, что позволяет им реализовывать более сложную логику. + +## D-триггеры + +Как вы уже поняли, используя неограниченное количество LUT-ов, вы можете построить цифровую схему, реализующую логическую функцию любой сложности. Однако цифровые схемы не ограничиваются реализацией одних только логических функций (цифровые схемы, реализующие логическую функцию называются **комбинационными**, поскольку выход зависит только от комбинации входов). Например, так не построить цифровую схему, реализующую процессор. Для таких схем, нужны элементы памяти. Заметим, что речь идет не о программируемой памяти, задавая значения которой мы управляем тем, куда будут направлены сигналы, и какие логические функции будут реализовывать LUT-ы. Речь идет о ячейках памяти, которые будут использоваться логикой самой схемы. +Такой базовой ячейкой памяти является **D-триггер**, из которых можно собрать другие ячейки памяти, например **регистры** (а из регистров можно собрать **память с произвольным доступом** (**random access memory**, **RAM**)), **сдвиговые регистры** и т.п. + +**D-триггер** — это цифровой элемент, способный хранить один бит информации. В базовом варианте у этого элемента есть два входа и один выход. Один из входов подает значение, которое будет записано в **D-триггер**, второй вход управляет записью (обычно он называется `clk` или `clock` и подключается к тактирующему синхроимпульсу схемы). Когда управляющий сигнал меняет свое значение с `0` на `1` (либо с `1` на `0`, зависит от схемы), в **D-триггер** записывается значение сигнала данных. Обычно, описывая **D-триггер**, говорится, что он строится из двух защелок, которые в свою очередь строятся из **RS-триггеров**, однако в конечном итоге, все эти элементы строятся на базе логических вентилей **И**/**ИЛИ**, **НЕ**: + +![../.pic/Introduction/How%20FPGA%20works/FPGA_d_flip_flop.png](../.pic/Introduction/How%20FPGA%20works/FPGA_d_flip_flop.png) + +## Арифметика + +Помимо прочего, описанных выше блоков (мультиплексоров и построенных на их основе LUT-ов и регистров) выделяется еще один тип блоков, настолько часто используемый в цифровых схемах, что его заранее размещают в ПЛИС в больших количествах: это арифметические блоки. Эти блоки используются при сложении, вычитании, сравнении чисел, реализации счётчиков. В разных ПЛИС могут быть предустановлены разные блоки: где-то это может быть однобитный сумматор, а где-то блок вычисления ускоренного переноса (`carry-chain`). + +Все эти блоки могут быть реализованы через логические вентили, например так можно реализовать сумматор: + +![../.pic/Labs/lab_01_adder/fig_02.drawio.png](../.pic/Labs/lab_01_adder/fig_02.drawio.png) + +## Логическая ячейка + +И вот, мы подходим к внутреннему устройству ПЛИС. Мы уже узнали, что в ПЛИС есть матрица программируемых мультиплексоров, направляющих сигналы туда, куда нам нужно. +Вторым важным элементом является **логический блок** (обычно состоящих из **логических ячеек**, но для простоты мы отождествим эти два термина). + +Логический блок содержит одну или несколько **LUT**, **арифметический блок**, и один или несколько **D-триггеров**, которые соединены между собой некоторым количеством мультиплексоров. +Ниже представлена схема того, как может выглядеть **логический блок**: + +![../.pic/Labs/lab_03_memory/fig_02.png](../.pic/Labs/lab_03_memory/fig_02.png) + +Может показаться запутанным, но все достаточно просто. Логический блок представляет собой цепочку операций: `логическая функция, реализованная через LUT -> арифметическая операция -> Запись в D-триггер`. Каждый из мультиплексоров определяет то, будет ли пропущен какой-либо из этих этапов. +Таким образом, конфигурируя каждый логический блок, можно получить следующие вариации кусочка цифровой схемы: + +1. Комбинационная схема (логическая функция, реализованная в LUT) +2. Арифметическая операция +3. Запись данных в D-триггер +4. Комбинационная схема, с записью результата в D-триггер +5. Арифметическая операция с записью результата в D-триггер +6. Комбинационная схема с последующей арифметической операцией +7. Комбинационная схема с последующей арифметической операцией и записью в D-триггер + +А вот реальный пример использования логического блока в ПЛИС `xc7a100tcsg324-1` при реализации Арифметико-логического устройства (АЛУ), подключенного к периферии отладочной платы `Nexys-7`: + +![real_logic_cell](../.pic/Introduction/How%20FPGA%20works/FPGA_logic_cell.png) + +Здесь вы можете увидеть использование LUT-ов, блока расчета ускоренного переноса, и одного из D-триггеров. D-триггеры, обозначенные серым цветом, не используются. + +Располагая большим наборов таких логических блоков, и имея возможность межсоединять их нужным вам образом, вы получаете широчайшие возможности по реализации практически любой цифровой схемы (ограничением является только ёмкость ПЛИС, т.е. количество подобных логических блоков, входов выходов и т.п.). + +Помимо логических блоков, в ПЛИС есть и другие примитивы: **Блочная память**, **блоки умножителей** и т.п. + +## Выводы + +Обобщим сказанное: + +1. Используя такие полупроводниковые элементы, как **транзисторы**, можно собирать **логические вентили**: элементы **И**, **ИЛИ**, **НЕ** и т.п. +2. Используя **логические вентили**, можно создавать схемы, реализующие как **логические функции** (**комбинационные схемы**), так и сложную логику с памятью (**синхронные схемы**). +3. Из логических вентилей среди прочего строится и такая важная комбинационная схема, как **мультиплексор**: цифровой блок, в зависимости от управляющего сигнала подающий на выход один из входных сигналов. +4. Подключив управляющий сигнал мультиплексора к **программируемой памяти** можно управлять тем, какие сигналы пойдут на выход и направлять их в нужную часть схемы (**маршрутизировать сигналы**). +5. Подключив входные сигналы мультиплексора к программируемой памяти, можно получить **Таблицу подстановок** (**Look-Up Table**, **LUT**), которая может реализовывать простейшие логические функции. LUT-ы позволяют заменить логические вентили И/ИЛИ/НЕ, и удобны тем, что их можно динамически изменять, логические вентили в свою очередь исполняются на заводе и уже не могут быть изменены после создания. +6. Из логических вентилей так же можно собрать базовую ячейку памяти: **D-триггер**, и такую часто используемую комбинационную схему как **полный однобитный сумматор** (или любой другой часто используемый арифметический блок). +7. Объединив LUT, арифметический блок и D-триггер получается структура в ПЛИС, которая называется **логический блок**. +8. Логический блок (а так же другие **примитивы**, такие как **блочная память** или **умножители**) — это множество блоков, которые заранее физически размещаются в кристалле ПЛИС, их количество строго определено конкретной ПЛИС и не может быть изменено. +9. **Конфигурируя примитивы** и **маршрутизируя сигнал** между ними (см. п.4), можно получить **практически любую цифровую схему** (с учетом ограничения ёмкости ПЛИС). diff --git a/Introduction/What is HDL.md b/Introduction/What is HDL.md new file mode 100644 index 0000000..60e5fc9 --- /dev/null +++ b/Introduction/What is HDL.md @@ -0,0 +1,60 @@ +# Что такое язык описания аппаратуры (HDL) + +На заре появления цифровой электроники, цифровые схемы в виде диаграммы на бумаге были маленькими, а их реализация в виде физической аппаратуры — большой. В процессе развития электроники (и её преобразования в микроэлектронику) цифровые схемы на бумаге становились всё больше, а относительный размер их реализации в виде физических микросхем — всё меньше. На рисунке ниже, вы можете увидеть диаграмму цифровой схемы устройства intel 4004, выпущенного в 1971 году. + +![../.pic/Introduction/What%20is%20HDL/i4004.gif](../.pic/Introduction/What%20is%20HDL/i4004.gif) + +Данная микросхема состоит из 2300 транзисторов. +За прошедшие полсотни лет сложность цифровых схем выросла коллосально. Современные процессоры для настольных компьютеров состоят из десятков миллиардов транзисторов. Диаграмма выше при печати в оригинальном размере займет прямоугольник размером 115х140см с площадью около 1.6м2 . Предполагая, что площадь печати имеет прямопропорциональную зависимость от количества транзисторов, получим что печать диаграммы современных процессоров потребует площадь в 16млн. м2, что эквивалентно квадрату со стороной в 4км. + +Старый город + +Как вы можете догадаться в какой-то момент между 1971-ым и 2022-ым годами инженеры перестали разрабатывать цифровые схемы, рисуя их на бумаге. +Разумеется, разрабатывая устройство, не обязательно вырисовывать на схеме каждый транзистор — можно управлять сложностью, переходя с одного уровня абстракции на другой. Например начинать разработку схемы с соединения функциональных блоков, а затем рисовать схему для каждого отдельного блока. +К примеру, схему intel 4004 можно представить в следующем виде: + +../.pic/Introduction/What%20is%20HDL/4004_arch.png + +Однако несмотря на это, даже отдельные блоки порой бывают довольно сложны. Возьмем блок аппаратного шифрования по алгоритму AES на рисунке ниже: + +![../.pic/Introduction/What%20is%20HDL/aes_enc_sml.png](../.pic/Introduction/What%20is%20HDL/aes_enc_sml.png) + +Заметьте, что даже этот блок не является атомарным. Каждая операция Исключающего ИЛИ, умножения, мультиплексирования сигнала и таблицы подстановки — это отдельные блоки, функционал которых еще надо реализовать. +В какой-то момент, инженеры поняли что проще описать цифровую схему в тексовом представлении, нежели в графическом. +Как можно описать цифровую схему текстом? Рассмотрим цифровую схему полусумматора: + +![Схема полусумматора](../.pic/Labs/lab_01_adder/fig_01.drawio.png) + +Это **устройство** (_полусумматор_) имеет два **входа**: _a_ и _b_, а так же два **выхода**: _S_ и _P_. +Выход _S_ является **результатом** логической операции **Исключающее ИЛИ** от операндов _a_ и _b_. +Выход _P_ является **результатом** логической операции **И** от операндов _a_ и _b_. + +Текст выше и является тем описанием, по которому можно воссоздать эту цифровую схему. Если стандартизировать описание схемы, то в нем можно будет оставить только слова, выделенные жирным и курсивом. Пример того, как можно было бы описать эту схему по стандарту IEEE 1364-2005 (язык описания аппаратуры (Hardware Description Language — HDL) Verilog): + +``` Verilog +module half_sum( // устройство полусумматор cо + input a, // входом a, + input b, // входом b, + output S, // выходом S и + output P // выходом P. +); + +assign S = a ^ b; // Где выход S является результатом Исключающего ИЛИ от a и b, +assign P = a & b; // а выход P является результатом логического И от a и b. + +endmodule +``` + +На первый взгляд кажется, что такое описание даже больше, чем записанное естественным языком, однако так кажется только из-за переноса строк и некоторой избыточности в описании входов и выходов, которая была добавлена для повышения читаемости. То же самое описание можно было записать и в виде: + +``` Verilog +module half_sum(input a, b, output S, P); + assign S = a ^ b; + assign P = a & b; +endmodule +``` + +Обратите внимание, что код на языке Verilog описывает устройство целиком, одномоментно. Это описание схемы выше, а не построчное выполнение программы. +Может показаться, что описывать устройство текстом сложнее, чем рисовать схему, тем более, что сперва мы **уже нарисовали схему**, а затем её описали. Однако, с практикой описание схемы в текстовом виде становится намного проще и не требует диаграммы. Для описания достаточно только спецификации: формальной записи того, что должно делать устройство, по которой разрабатывается алгоритм, который затем претворяется в описание на HDL. + +Занятный факт: ранее было высказано предположение о том, что инженеры перестали разрабатывать устройства, рисуя цифровые схемы в промежуток времени между 1971-ым и 2022-ым годами. Так вот, первая конференция, посвященная языкам описания аппаратуры состоялась в 1973-ем году. Таким образом, Intel 4004 можно считать одним из последних цифровых устройств, разработанных без использования языков описания аппаратуры. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..795087c --- /dev/null +++ b/LICENSE @@ -0,0 +1,427 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public licenses. +Notwithstanding, Creative Commons may elect to apply one of its public +licenses to material it publishes and in those instances will be +considered the “Licensor.” The text of the Creative Commons public +licenses is dedicated to the public domain under the CC0 Public Domain +Dedication. Except for the limited purpose of indicating that material +is shared under a Creative Commons public license or as otherwise +permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the public +licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/Labs/01. Adder/README.md b/Labs/01. Adder/README.md new file mode 100644 index 0000000..841dd7c --- /dev/null +++ b/Labs/01. Adder/README.md @@ -0,0 +1,297 @@ +# Лабораторная работа 1 "Сумматор" + +## Цель + +Познакомиться с САПР Vivado и научиться реализовывать в нём простейшие схемотехнические модули с помощью конструкций языка SystemVerilog. + +## Допуск к лабораторной работе + +Изучить [описание модулей на языке SystemVerilog](../../Basic%20Verilog%20structures/Modules.md). + +## Ход работы + +1. [Тренинг по созданию проекта в Vivado](../../Vivado%20Basics/Vivado%20trainer.md); +2. Изучение, реализация и проверка полного однобитного сумматора; +3. Изучение реализации полного четырехбитного сумматора; +4. Реализация полного четырехбитного сумматора; +5. Реализация 32-битного сумматора. + +## Теория + +Итогом лабораторной работы будет создание устройства, способного складывать два числа. Но перед тем, как учиться создавать подобное устройство, необходимо немного освоиться в самом процессе складывания чисел. + +Давайте начнем с примера и сложим в столбик какую-нибудь пару чисел, например 42 и 79: + +![../../.pic/Labs/lab_01_adder/column_add_dec.drawio.png](../../.pic/Labs/lab_01_adder/column_add_dec.drawio.png) + +```text +2 + 9 = 11 ➨ 1 пишем, 1 "в уме" +4 + 7 + "1 в уме" = 12 ➨ 2 пишем, 1 "в уме" +0 + 0 + "1 в уме" = 1 +``` + +Итого, 121. + +Назовём то, что мы звали "1 в уме", переносом разряда. + +Теперь попробуем сделать то же самое, только в двоичной системе исчисления. К примеру, над числами 3 и 5. Три в двоичной системе записывается как 011. Пять записывается как 101. + +![../../.pic/Labs/lab_01_adder/column_add_bin.drawio.png](../../.pic/Labs/lab_01_adder/column_add_bin.drawio.png) + +Поскольку в двоичной системе всего две цифры: 0 и 1, один разряд не может превысить 1. Складывая числа 1 и 1, вы получаете 2, что не умещается в один разряд, поэтому мы пишем 0 и держим 1 "в уме". Это снова перенос разряда. Поскольку в двоичной арифметике разряд называют битом, перенос разряда называют переносом бита, а сам разряд, который перенесли — битом переноса. + +### Полный однобитный сумматор + +Полный однобитный сумматор — это цифровое устройство с тремя входными сигналами: операндами a, b и входным битом переноса, которое складывает их между собой, возвращая два выходных сигнала: однобитный результат суммы и выходной бит переноса. Что такое входной бит переноса? Давайте вспомним второй этап сложения чисел 42 и 79: + +```text +4 + 7 + "1 в уме" = 12 ➨ 2 пишем, 1 "в уме" +``` + +**+ "1 в уме"** — это прибавление разряда, перенесённого с предыдущего этапа сложения. + +Входной бит переноса — это разряд, перенесённый с предыдущего этапа сложения двоичных чисел. Имея этот сигнал, мы можем складывать многоразрядные двоичные числа путём последовательного соединения нескольких однобитных сумматоров: выходной бит переноса сумматора младшего разряда передастся на входной бит переноса сумматора старшего разряда. + +### Реализация одноразрядного сложения + +Можно ли как-то описать сложение двух одноразрядных двоичных чисел с помощью логических операций? Давайте посмотрим на таблицу истинности подобной операции + +![../../.pic/Labs/lab_01_adder/tt1.png](../../.pic/Labs/lab_01_adder/tt1.png) + +*Таблица истинности одноразрядного сложения* + +`S` — это цифра, записываемая в столбце сложения под числами `a` и `b`. `C` (*carry*, перенос) — это цифра, записываемая левее, если произошел перенос разряда. Как мы видим, перенос разряда происходит только в случае, когда оба числа одновременно равны единице. При этом в этот момент значение `S` обращается в `0`, и результат записывается как `10`, что в двоичной системе означает `2`. Кроме того, `S = 0` и в случае, когда оба операнда одновременно равны нулю. Вы можете заметить, что `S` равно нулю в тех случаях, когда `а` и `b` равны, и не равно нулю в противоположном случае. Подобным свойством обладает логическая операция **Исключающее ИЛИ** (**eXclusive OR**, **XOR**): + +![../../.pic/Labs/lab_01_adder/tt2.png](../../.pic/Labs/lab_01_adder/tt2.png) + +*Таблица истинности операции Исключающее ИЛИ (XOR)* + +Для бита переноса всё ещё проще — он описывается операцией логическое И: + +![../../.pic/Labs/lab_01_adder/tt3.png](../../.pic/Labs/lab_01_adder/tt3.png) + +*Таблица истинности операции И* + +Давайте нарисуем цифровую схему, связывающую входные и выходные сигналы с помощью логических элементов, соответствующих ожидаемому поведению: + +![../../.pic/Labs/lab_01_adder/fig_01.drawio.png](../../.pic/Labs/lab_01_adder/fig_01.drawio.png) + +*Рисунок 1. Цифровая схема устройства, складывающего два операнда с сохранением переноса (полусумматора)* + +Вроде все замечательно, но есть проблема. В описании полного однобитного сумматора сказано, что у него есть три входа, а в наших таблицах истинности и на схеме выше их только два. На самом деле, на каждом этапе сложения в столбик мы всегда складывали три числа: цифру верхнего числа, цифру нижнего числа, и единицу в случае переноса разряда из предыдущего столбца (если с предыдущего разряда не было переноса, прибавление нуля неявно опускалось). + +Таким образом, таблицы истинности немного усложняются: + +![../../.pic/Labs/lab_01_adder/tt4.png](../../.pic/Labs/lab_01_adder/tt4.png) + +*Таблица истинности сигналов полного однобитного сумматора* + +Поскольку теперь у нас есть и входной и выходной биты переноса, для их различия добавлены индексы “in” и “out”. + +Как в таком случае описать S? Например, как `а ^ b ^ Cіn`, где `^` — операция исключающего ИЛИ. Давайте сравним такую операцию с таблицей истинности. Сперва вспомним, что Исключающее ИЛИ — ассоциативная операция [`(a^b)^c = a^(b^с)`], т.е. нам не важен порядок вычисления. Предположим, что Cin равен нулю. Исключающее ИЛИ с нулем дает второй операнд (`a^0=a`), значит `(a^b)^0 = a^b`. Это соответствует верхней половине таблицы истинности для сигнала S, когда Cin равен нулю. + +Предположим, что Cin равен единице. Исключающее ИЛИ с единицей дает нам отрицание второго операнда (`a^1=!a`), значит `(a^b)^1=!(a^b)`. Это соответствует нижней половине таблицы истинности, когда Cin равен единице. + +Для выходного бита переноса всё гораздо проще. Он равен единице, когда хотя бы два из трех операндов равны единице, это значит что необходимо попарно сравнить все операнды, и если найдется хоть одна такая пара, он равен единице. Это утверждение можно записать следующим образом: + +`Cоut = (a&b) | (а&Cіn) | (b&Cіn)`, где `&` — логическое И, `|` — логическое ИЛИ. + +Цифровая схема устройства с описанным поведением выглядит следующим образом: + +![../../.pic/Labs/lab_01_adder/fig_02.drawio.png](../../.pic/Labs/lab_01_adder/fig_02.drawio.png) + +*Рисунок 2. Цифровая схема полного однобитного сумматора* + +## Практика + +Реализуем схему полусумматора (рис.1) в виде модуля, описанного на языке SystemVerilog. + +Модуль `half_adder` имеет два входных сигнала и два выходных. Входы `a_i` и `b_i` идут на два логических элемента: Исключающее ИЛИ и И, выходы которых подключены к выходам модуля `sum_o` и `carry_o` соответственно. + +
+ + Прочти меня перед использованием кода из примера. + +### Во все примеры кода намеренно вставлены неподдерживаемые символы. Не копируй, одумайся! + + Важной частью изучения языка является практика по написанию кода. Даже если перепечатывая пример, вы не до конца его понимаете, вы запоминаете структуру кода и его конструкции. Вы изучаете этот пример для себя, а не для оценки, так что будьте честны с собой и воспроизведите пример самостоятельно. + +
+ + — Но мне очень надо. + + ![../../.pic/Labs/lab_01_adder/im_watching_you.jpg](../../.pic/Labs/lab_01_adder/im_watching_you.jpg) + +
+ +
+ + — Я переписал пример точь-в-точь, а он все равно не работает! + + Позови преподавателя, он тебе поможет. + +
+ +
+ +```systemverilog +module half_adder( + inрut logic a_i, // Входные сигналы + inрut logic b_i, + + outрut logic sum_o, // Выходной сигнал + outрut logic carry_o + + ); + + assign sum_o = a_i ^ b_i; + assign carry_o = a_i & b_i; + + endmodule +``` + +*Листинг 1. SystemVerilog-код модуля half_adder* + +По данному коду, САПР может реализовать следующую схему: + +![../../.pic/Labs/lab_01_adder/fig_03.png](../../.pic/Labs/lab_01_adder/fig_03.png) + +*Рисунок 3. Цифровая схема модуля half_adder, сгенерированная САПР Vivado* + +Схема похожа на рис. 1, но как проверить, что эта схема не содержит ошибок и делает именно то, что от нее ожидается? + +Для этого необходимо провести моделирование этой схемы. Во время моделирования на вход схемы подаются входные воздействия. Каждое изменение входных сигналов схемы приводит к каскадному изменению состояния внутренних цепей, которые в итоге меняют выходные сигналы. + +Подаваемые на схему входные воздействия формируются верификационным окружением. Верификационное окружение (или тестбенч) — это особый несинтезируемый модуль, который не имеет входных или выходных сигналов. Ему не нужны входные сигналы, поскольку он сам является генератором всех своих внутренних сигналов, и ему не нужны выходные сигналы, поскольку этот модуль ничего не вычисляет, только подает входные воздействия на проверяемый модуль. Внутри тестбенча можно использовать конструкции из несинтезируемого подмножества языка SystemVerilog, в частности программный блок `initial`, в котором команды выполняются последовательно, что делает этот блок чем-то отдаленно похожим на проверяющую программу. Поскольку изменение внутренних цепей происходит с некоторой задержкой относительно изменений входных сигналов, при моделировании есть возможность делать паузы между командами. Это делается с помощью специального символа #, за которым указывается количество отсчётов времени симуляции, которое нужно пропустить перед следующей командой. + +Перед тем как писать верификационное окружение, необходимо составить план того, как будет проводиться проверка устройства (составить верификационный план). + +Поскольку устройство настолько простое, что число всех его возможных входных наборов воздействий равно четырем, и не имеет памяти (т.е. каждый раз, когда модулю подаются на вход одни и те же значения, оно вернет тот же результат), мы можем проверить его работу, перебрав все возможные комбинации его входных сигналов. + +```SystemVerilog +module testbench(); // <- Не имеет ни входов, ни выходов! + logic a, b, carry, sum; + + half_adder DUT( // <- Подключаем проверяемый модуль + .a_i (a), + .b_i (b), + .carry_o(p), + .sum_o (s) +); + + initial begin + a = 1'b0; b = 1'b0; // <- Подаём на входы модуля тестовые + #10; // воздействия + a = 1'b0; b = 1'b1; + #10; // <- Делаем паузу в десять отсчётов + a = 1'b1; b = 1'b0; // времени симуляции перед очередным + #10; // изменением входных сигналов + a = 1'b1; b = 1'b1; + end +endmodule +``` + +*Листинг 2. SystemVerilog-код тестбенча для модуля example* + +![../../.pic/Labs/lab_01_adder/fig_04.png](../../.pic/Labs/lab_01_adder/fig_04.png) + +*Рисунок 4. Временная диаграмма, моделирующая работу схемы с рис.3* + +В данной лабораторной работе вам предстоит реализовать схему полного однобитного сумматора (*рис. 2*). + +### Полный четырехбитный сумматор + +Складывать несколько однобитных чисел не сильно впечатляет, поэтому сейчас мы займемся по-настоящему крутыми вещами — будем складывать пары четырехбитных чисел! Четырехбитные числа — это сила, они позволяют выбрать любое число от 0 до 15, а если сложить два числа с сохранением переноса, то вы получите диапазон результатов вплоть до 31! И вся эта вычислительная мощь будет у вас прямо под рукой — бери и пользуйся! + +До этого мы реализовали только сложение одного столбца в столбик, теперь мы хотим реализовать всю операцию сложения в столбик. Как это сделать? Сделать ровно то, что делается при сложении в столбик: сначала сложить младший столбец, получить бит переноса для следующего столбца, сложить следующий и т.д. + +Давайте посмотрим, как это будет выглядеть на схеме (для простоты, внутренняя логика однобитного сумматора скрыта, но вы должны помнить, что каждый прямоугольник — это та же самая схема с рис. 2). + +![../../.pic/Labs/lab_01_adder/fig_05.drawio.png](../../.pic/Labs/lab_01_adder/fig_05.drawio.png) +*Рисунок 5. Схема четырехбитного сумматора* + +Фиолетовой линией на схеме показаны провода, соединяющие выходной бит переноса сумматора предыдущего разряда, с входным битом переноса сумматора следующего разряда. + +Как же реализовать модуль, состоящий из цепочки других модулей? Половину этой задачи мы уже сделали, когда писали тестбенч к однобитному полусумматору в *Листинге 2* — мы создавали модуль внутри другого модуля и подключали к нему провода. Теперь надо сделать то же самое, только с чуть большим числом модулей. + +Для того, чтобы описать четырехбитный сумматор, необходимо подключить четыре однобитных подобно тому, как было описано в [`документе`](../../Basic%20Verilog%20structures/Modules.md#иерархия-модулей), который вы изучали перед лабораторной работой. + +![../../.pic/Labs/lab_01_adder/fig_06.drawio.png](../../.pic/Labs/lab_01_adder/fig_06.drawio.png) + +*Рисунок 6. Схема четырехбитного сумматора, сгенерированная САПР Vivado* + +Схема может показаться запутанной, но если присмотреться, вы увидите, как от шин A, B и S отходят линии к каждому из сумматоров, а бит переноса передается от предыдущего сумматора к следующему. + +## Задание + +Вам необходимо реализовать полный 32-разрядный сумматор. Соединять вручную 32 однотипных модуля чревато усталостью и ошибками, поэтому можно сначала создать 4-разрядный сумматор (либо другой разрядности), а затем из набора 4-разрядных сумматоров сделать 32-битный. + +Модуль должен быть описан в соответствии со следующим прототипом: + +```SystemVerilog +module fulladder4( + input logic [3:0] a_i, + input logic [3:0] b_i, + input logic carry_i, + output logic [3:0] sum_o, + output logic carry_o +); +``` + +Либо же можно воспользоваться конструкцией `generate for`, пример использования которой вы можете увидеть на изображении ниже (так же существуют конструкции `generate if`, `generate case`). + +![../../.pic/Labs/lab_01_adder/fig_07.png](../../.pic/Labs/lab_01_adder/fig_07.png) + +*Рисунок 7. Пример использования конструкции generate for* + +Как вы можете догадаться, в этом примере создано 3 модуля, имена которых оканчиваются на значение итератора, по которому шел цикл, а к самим модулям подключены соответствующие итератору провода из шин. Разумеется, для своих целей вы можете использовать и **i+1** и двойные циклы. + +Обратите внимание на `: newgen` стоящий после ключевого слова `begin`. В некоторых САПР, код может не собраться, если у конструкции `generate for` нет названия (**лейбла**) с помощью подобной записи (двоеточия и названия). + +**Обратите внимание**, что данный рисунок не является решением вашей задачи, поскольку у вашего сумматора три входа и два выхода, а у сумматора в примере нет бита переноса. + +Несмотря на то, что конструкция выглядит как [~~утка, плавает как утка и крякает как утка~~](https://ru.wikipedia.org/wiki/Утиный_тест) цикл и ведет себя как цикл, нужно понимать, что это не цикл в привычном вам понимании этого слова. Это по-прежнему не программа. Вместо этого, вы выделяете общую закономерность по размещению однотипных модулей на схеме и описываете эту закономерность в виде цикла. + +Если вы захотите воспользоваться этой конструкцией, вам будет нужно продумать как вы будете: + +1. соединять входной бит переноса вашего модуля с входным битом переноса нулевого сумматора; +2. передавать бит переноса с выхода предыдущего сумматора на вход следующего; +3. соединять выходной бит переноса вашего модуля с выходным битом переноса последнего однобитного сумматора. + +Далее идет пример того, как должен выглядеть заголовок модуля разрабатываемого устройства. + +```systemverilog +module fulladder32( + іnput logic [31:0] a_i, + іnput logic [31:0] b_i, + іnput logic carry_i, + оutput logic [31:0] sum_o, + оutput logic carry_o +); +``` + +### Порядок выполнения задания + +1. Согласно [руководству по созданию проекта в Vivado](../../Vivado%20Basics/Vivado%20trainer.md): + 1. Создайте проект; + 2. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder`. +2. Опишите в файле модуль `fulladder`, схема которого представлена на *[Рис. 2](../../.pic/Labs/lab_01_adder/fig_02.drawio.png)*. +3. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder`. +4. Вставьте содержимое файла [`tb_fulladder.sv`](tb_fulladder.sv), расположенного рядом с данным документом. +5. Запустите моделирование. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). +6. Убедитесь по сигналам временной диаграммы, что модуль работает корректно. +7. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder4`. +8. Опишите модуль `fulladder4`, схема которого представлена на *Рис. 5 и 6*, используя [`иерархию модулей`](../../Basic%20Verilog%20structures/Modules.md#%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9), чтобы в нем выполнялось поразрядное сложение двух 4-разрядных чисел и входного бита переноса. Некоторые входы и выходы модуля будет необходимо описать в виде `векторов`. +9. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 4-го разряда. +10. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder4`. +11. Вставьте содержимое файла [`tb_fulladder4.sv`](tb_fulladder4.sv). Нажмите по нему в окне `Sources` ПКМ и выберите `Set as Top`. +12. Запустите моделирование. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). +13. Убедитесь, что модуль работает корректно и в консоль вывелось сообщение: `fulladder4 SUCCESS!!!`. +14. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder32`. +15. Опишите модуль `fulladder32` так, чтобы в нем выполнялось поразрядное сложение двух 32-разрядных чисел и входного бита переноса. Его можно реализовать через последовательное соединение восьми 4-битных сумматоров, либо же можно соединить 32 однобитных сумматора (как вручную, так и с помощью конструкции `generate for`). +16. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 31-го разряда. +17. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder32`. +18. Вставьте содержимое файла [`tb_fulladder32.sv`](tb_fulladder32.sv). Нажмите по нему в окне `Sources` ПКМ и выберите `Set as Top`. +19. Запустите моделирование. +20. Убедитесь, что модуль работает корректно. +21. Следующим шагом вы можете проверить работоспособность вашей цифровой схемы в ПЛИС [здесь](board%20files). diff --git a/Labs/01. Adder/board files/README.md b/Labs/01. Adder/board files/README.md new file mode 100644 index 0000000..e67ef71 --- /dev/null +++ b/Labs/01. Adder/board files/README.md @@ -0,0 +1,23 @@ +# Проверка работы арифметико-логического устройство на ПЛИС + +После того, как вы создали свой сумматор и проверили его на прохождение тестирующего модуля, вы можете использовать предложенный модуль окружения [`nexys_adder.sv`](nexys_adder.sv), который позволяет связать вашу логику с периферией, расположенной на плате `Nexys-A7`. Для его подключения, скачайте и добавьте файл в проект, либо скопируйте содержимое в новый `.sv` файл вашего проекта. В окне `Sources` нажмите на него ПКМ и выберите `Set as Top`, после чего в иерархии он станет главным, подключив ваш собственный модуль сумматора. Для того, чтобы дизайн мог физически подключиться к периферии, нужно в проекте выбрать `Add or create constraints` и подключить файл [`nexys_a7_100t.xdc`](nexys_a7_100t.xdc). + +После этого наше устройство будет выглядеть так: + +![../../../.pic/Labs/board%20files/board%20files/nexys_adder1.png](../../../.pic/Labs/board%20files/board%20files/nexys_adder1.png) + +Подключенное окружение позволяет производить ввод входных значений (А, В и Pin) с помощью переключателей (номер переключателя отображен на самом краю платы), расположенных на плате. Операнд А задается переключателями 15-8, В: 7-0, Pin: тактовая кнопка BTND (нижняя из 5-ти, расположенных вместе в форме крестовины). Семисегментные индикаторы в шестнадцатиричном формате отображают на левом блоке слагаемые А и В, а на правом - результат сложения. На светодиодах, расположенных над переключателями отображается результат в двоичном формате. + +Управление сумматором через плату + +![../../../.pic/Labs/board%20files/board%20files/nexys_adder2.png](../../../.pic/Labs/board%20files/board%20files/nexys_adder2.png) + +Для прошивки ПЛИС подключите утройство через USB, включите питание переключателем, выполните синтез и имплементацию вашего дизайна и сгенерируйте битстрим. Если на этом этапе у вас возникают ошибки, постарайтесь исправить из с помощью [`инструкции по работе с ошибками синтеза`](../../../Vivado%20Basics/Elaboration%20failed.md). После этого выберите в левом меню `Open Target` - `Auto Connect`, затем `Program Device` и ваше устройство прошьется. + +Генерация битстрима +![../../../.pic/Labs/board%20files/board%20files/Program_Device1.png](../../../.pic/Labs/board%20files/board%20files/Program_Device1.png) + +Прошивка ПЛИС +![../../../.pic/Labs/board%20files/board%20files/Program_Device2.png](../../../.pic/Labs/board%20files/board%20files/Program_Device2.png) + +Попробуйте выставить на переключателях различные слагаемые, убедитесь, что все работает исправно и сдавайте работу. diff --git a/Labs/01. Adder/board files/nexys_a7_100t.xdc b/Labs/01. Adder/board files/nexys_a7_100t.xdc new file mode 100644 index 0000000..3a443b5 --- /dev/null +++ b/Labs/01. Adder/board files/nexys_a7_100t.xdc @@ -0,0 +1,211 @@ +## This file is a general .xdc for the Nexys A7-100T +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +# Clock signal +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100 }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK100}]; + + +#Switches +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { SW[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { SW[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { SW[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { SW[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { SW[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { SW[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { SW[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { SW[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { SW[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { SW[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { SW[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { SW[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { SW[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { SW[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + +### LEDs +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { LED[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { LED[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { LED[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { LED[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { LED[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { LED[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { LED[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { LED[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { LED[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { LED[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { LED[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { LED[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +## RGB LEDs +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { LED17_B }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { LED17_G }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED17_R }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + +##7 segment display +set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { CA }]; #IO_L24N_T3_A00_D16_14 Sch=ca +set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { CB }]; #IO_25_14 Sch=cb +set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { CC }]; #IO_25_15 Sch=cc +set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { CD }]; #IO_L17P_T2_A26_15 Sch=cd +set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { CE }]; #IO_L13P_T2_MRCC_14 Sch=ce +set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { CF }]; #IO_L19P_T3_A10_D26_14 Sch=cf +set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { CG }]; #IO_L4P_T0_D04_14 Sch=cg +set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp +set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { AN[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { AN[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { AN[6] }]; #IO_L23P_T3_35 Sch=an[6] +set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + +##Buttons +set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn +#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc +#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu +#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl +#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { BTNR }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers +##Pmod Header JA +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { JA[1] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { JA[2] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { JA[3] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { JA[4] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { JA[7] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { JA[8] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { JA[9] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { JA[10] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + +##Pmod Header JB +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { JB[1] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { JB[2] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { JB[3] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { JB[4] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { JB[7] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { JB[8] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { JB[9] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { JB[10] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + +##Pmod Header JC +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { JC[1] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { JC[2] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { JC[3] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { JC[4] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { JC[7] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { JC[8] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { JC[9] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { JC[10] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + +##Pmod Header JD +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { JD[1] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { JD[2] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { JD[3] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { JD[4] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { JD[7] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { JD[8] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { JD[9] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { JD[10] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + +##Pmod Header JXADC +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVCMOS33 } [get_ports { XA_N[1] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVCMOS33 } [get_ports { XA_P[1] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { XA_N[2] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { XA_P[2] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { XA_N[3] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVCMOS33 } [get_ports { XA_P[3] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { XA_N[4] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { XA_P[4] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + +##VGA Connector +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { VGA_HS }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { VGA_VS }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { SD_RESET }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { SD_CD }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { SD_SCK }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { SD_CMD }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + +##Accelerometer +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { ACL_MISO }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { ACL_MOSI }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { ACL_SCLK }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { ACL_CSN }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + +##Temperature Sensor +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { TMP_SCL }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { TMP_SDA }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { TMP_INT }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { TMP_CT }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { M_CLK }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { M_DATA }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel + +##PWM Audio Amplifier +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { AUD_SD }]; #IO_L6P_T0_15 Sch=aud_sd + +##USB-RS232 Interface +#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { UART_TXD_IN }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { UART_RXD_OUT }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { UART_CTS }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { UART_RTS }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { PS2_CLK }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { PS2_DATA }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + +##SMSC Ethernet PHY +#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDC }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDIO }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { ETH_RSTN }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { ETH_CRSDV }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv +#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXERR }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXEN }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { ETH_REFCLK }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { ETH_INTN }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + +##Quad SPI Flash +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn \ No newline at end of file diff --git a/Labs/01. Adder/board files/nexys_adder.sv b/Labs/01. Adder/board files/nexys_adder.sv new file mode 100644 index 0000000..f4c69ac --- /dev/null +++ b/Labs/01. Adder/board files/nexys_adder.sv @@ -0,0 +1,130 @@ +`timescale 1ns / 1ps + +module nexys_adder( + input CLK100, + input resetn, + input BTND, + input [15:0] SW, + output [15:0] LED, + + output CA, CB, CC, CD, CE, CF, CG, DP, + + output [7:0] AN + ); + +wire [31:0] A; +wire [31:0] B; +wire Pin; + +wire [31:0] S; +wire Pout; + +localparam pwm = 1000; +reg [9:0] counter; +reg [3:0] semseg; +reg [7:0] ANreg; + +reg CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr; + +reg [15:0] LEDr; + +fulladder32 DUT +( + .A (A), + .B (B), + .Pin (Pin), + + .S (S), + .Pout (Pout) +); + +assign B = {24'b0,SW[7:0]}; +assign A = {24'b0,SW[15:8]}; +assign Pin = BTND; + +assign LED[15:0] = LEDr[15:0]; + +assign AN[7:0] = ANreg[7:0]; +assign {CA, CB, CC, CD, CE, CF, CG, DP} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr}; + + +initial ANreg[7:0] = 8'b11111110; + +always @(posedge CLK100) begin + if (!resetn) begin + LEDr[15:0] <= 'b0; + counter <= 'b0; + ANreg[7:0] <= 8'b11111111; + {CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr} <= 8'b11111111; + end + else begin + LEDr[15:0] <= S[15:0]; + if (counter < pwm) counter = counter + 'b1; + else begin + counter = 'b0; + ANreg[1] <= ANreg[0]; + ANreg[2] <= ANreg[1]; + //ANreg[3] <= ANreg[2]; + ANreg[4] <= ANreg[2]; + ANreg[5] <= ANreg[4]; + ANreg[6] <= ANreg[5]; + ANreg[7] <= ANreg[6]; + ANreg[0] <= !(ANreg[6:0] == 7'b1111111); + end + case (1'b0) + ANreg[0]: begin + semseg <= (S) % 5'h10; + DPr <= 1'b1; + end + ANreg[1]: begin + semseg <= (S / 'h10) % 5'h10; + DPr <= 1'b1; + end + ANreg[2]: begin + semseg <= (S / 'h100) % 5'h10; + DPr <= 1'b1; + end + ANreg[3]: begin + semseg <= (S / 'h1000) % 5'h10; + DPr <= 1'b1; + end + ANreg[4]: begin + semseg <= (B) % 5'h10; + DPr <= 1'b1; + end + ANreg[5]: begin + semseg <= (B / 'h10) % 5'h10; + DPr <= 1'b1; + end + ANreg[6]: begin + semseg <= (A) % 5'h10; + DPr <= 1'b0; + end + ANreg[7]: begin + semseg <= (A / 'h10) % 5'h10; + DPr <= 1'b1; + end + + endcase + case (semseg) + 4'h0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; + 4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001111; + 4'h2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010; + 4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110; + 4'h4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100; + 4'h5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100; + 4'h6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000; + 4'h7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111; + 4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000; + 4'h9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100; + 4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; + 4'hB: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000; + 4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001; + 4'hD: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010; + 4'hE: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000; + 4'hF: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0111000; + endcase + end +end + +endmodule \ No newline at end of file diff --git a/Labs/01. Adder/tb_fulladder.sv b/Labs/01. Adder/tb_fulladder.sv new file mode 100644 index 0000000..a8abf92 --- /dev/null +++ b/Labs/01. Adder/tb_fulladder.sv @@ -0,0 +1,80 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_fulladder +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for 1-bit fulladder +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_fulladder(); + +parameter TIME_OPERATION = 100; +parameter TEST_VALUES = 8; + + wire tb_a_i; + wire tb_b_i; + wire tb_carry_i; + wire tb_carry_o; + wire tb_sum_o; + + + fulladder DUT ( + .a_i(tb_a_i), + .b_i(tb_b_i), + .sum_o(tb_sum_o), + .carry_i(tb_carry_i), + .carry_o(tb_carry_o) + ); + + integer i, err_count = 0; + reg [4:0] running_line; + + wire sum_dump; + wire carry_o_dump; + + assign tb_a_i = running_line[4]; + assign tb_b_i = running_line[3]; + assign tb_carry_i = running_line[2]; + assign sum_dump = running_line[1]; + assign carry_o_dump = running_line[0]; + + initial begin + $display( "Start test: "); + for ( i = 0; i < TEST_VALUES; i = i + 1 ) + begin + running_line = line_dump[i*5+:5]; + #TIME_OPERATION; + if( (tb_carry_o !== carry_o_dump) || (tb_sum_o !== sum_dump) ) begin + $display("ERROR! carry_i = %b; (a)%b + (b)%b = ", tb_carry_i, tb_a_i, tb_b_i, "(carry_o)%b (sum_o)%b;", tb_carry_o, tb_sum_o, " carry_o_dump: %b, sum_dump: %b", carry_o_dump, sum_dump); + err_count = err_count + 1'b1; + end + end + $display("Number of errors: %d", err_count); + if( !err_count ) $display("\nfulladder SUCCESS!!!\n"); + $finish(); + end + + reg [5*8-1:0] line_dump = { + 5'b00000, + 5'b10010, + 5'b01010, + 5'b11001, + 5'b00110, + 5'b10101, + 5'b01101, + 5'b11111}; + +endmodule diff --git a/Labs/01. Adder/tb_fulladder32.sv b/Labs/01. Adder/tb_fulladder32.sv new file mode 100644 index 0000000..9cb1693 --- /dev/null +++ b/Labs/01. Adder/tb_fulladder32.sv @@ -0,0 +1,3081 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_fulladder32 +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for 32-bit fulladder +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_fulladder32(); + +parameter TIME_OPERATION = 100; +parameter TEST_VALUES = 3000; + + wire [31:0] tb_a_i; + wire [31:0] tb_b_i; + wire tb_carry_i; + wire tb_carry_o; + wire [31:0] tb_sum_o; + + fulladder32 DUT ( + .a_i(tb_a_i), + .b_i(tb_b_i), + .sum_o(tb_sum_o), + .carry_i(tb_carry_i), + .carry_o(tb_carry_o) + ); + + integer i, err_count = 0; + reg [97:0] running_line; + + wire [31:0] sum_dump; + wire carry_o_dump; + + assign tb_a_i = running_line[97:66]; + assign tb_b_i = running_line[65:34]; + assign tb_carry_i = running_line[33]; + assign sum_dump = running_line[31:0]; + assign carry_o_dump = running_line[32]; + +`ifdef __debug__ + initial begin + $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); + for ( i = 0; i < TEST_VALUES; i = i + 1 ) + begin + running_line = line_dump[i*98+:98]; + #TIME_OPERATION; + if( (tb_carry_o !== carry_o_dump) || (tb_sum_o !== sum_dump) ) begin + $display("ERROR! carry_i = %b; (a)%h + (b)%h = ", tb_carry_i, tb_a_i, tb_b_i, "(carry_o)%b (sum_o)%h;", tb_carry_o, tb_sum_o, " carry_o_dump: %b, sum_dump: %h", carry_o_dump, sum_dump); + err_count = err_count + 1'b1; + end + end + $display("Number of errors: %d", err_count); + if( !err_count ) $display("\nfulladder32 SUCCESS!!!\n"); + $finish(); + end +`else + initial begin + for ( i = 0; i < TEST_VALUES; i = i + 1 ) + begin + #TIME_OPERATION; + running_line = line_dump[i*98+:98]; + end + $finish(); + end +`endif +reg [98*3000:0] line_dump = { +98'h04854d49302257a06d29e93a6, +98'h2c7c1598c1ae5ec36b8a9d171, +98'h2cb0a119624dd484b3bf9d678, +98'h01b5f3434ec8fc5da41fbbe84, +98'h1db515fb518b7de32bd024f7a, +98'h38cdc931b8bde1315c62ea98b, +98'h1cabfdf96ef49c9dd2e826a5c, +98'h11fb36e3de4c1a7c8c11d4581, +98'h3d001eba38b293b15d6cac9ad, +98'h37a38a2f65aad60b7753980eb, +98'h2c7bd898c15ce1c28b762e96d, +98'h04190848155e116aa65dc66cb, +98'h32c80fa5a260ee04f54a3f6aa, +98'h2a69f594cd67f75aedf47b3bf, +98'h2045d280b5d58fabb586d88b1, +98'h39f15cb3c4611248cf949bbf2, +98'h395cc2b2a78c530f183a45706, +98'h114b986288312cd0465f314cb, +98'h0f083cde312284a2700ab0602, +98'h16c0996d98d2fe718be4e5f7c, +98'h379d40af0543f74aaf384dfe7, +98'h2e25ef9c50bc90616fb89fff7, +98'h2773180ec7418cce8bad29375, +98'h02aa92c55e3666fc68383e707, +98'h0c48c1d8898d7ed32575902af, +98'h11ee6863df1b6a7e2c4274b88, +98'h33f115a7eb9f651737e41eafc, +98'h11378de2692b8c924e98c69d2, +98'h3affb035ea31ff14594c6bd28, +98'h01875fc3384b33b08e74a4dce, +98'h2ee0969dc7bcbb4f4da7547b4, +98'h2fc1401f8db9605b6f5ea81ec, +98'h03f4a3c7fa7afdb4ef9be85f3, +98'h2f05221e0b769656ee9eee1d4, +98'h27fcab8fc5432bca8b4ff5d69, +98'h30cfce21b1c6832398a594514, +98'h1f4d667ea4df6f09b10b35621, +98'h3462ed28e5e66a0bf69255cd3, +98'h2bf61597c88a43512d20163a4, +98'h3966cdb2fcc246b99d8a451b1, +98'h0533f04a7da0b8bb50b52a416, +98'h2ca7ed9976a2b8ad78d2a991b, +98'h0f3c465e488c7fd105f2318bd, +98'h054242ca957dab6ac6affb8d5, +98'h1b976b773357af26b3bbc6a77, +98'h387c40b0cac3bb5590cfff019, +98'h2cf65d99e14c4d029390aaa71, +98'h2703a28e0f3461de4d8e011b1, +98'h129d2fe512719764c943b1d27, +98'h2b2df2965b72da76f1a833435, +98'h1b2c2df66da9099b52354de46, +98'h194ed27296c5cb6dac0527781, +98'h28c1c691809d26c12a57bb54b, +98'h0d2601da769baead10f06c21d, +98'h051f364a25a4010b6ab0cdd56, +98'h25d7270ba11df90211bd48036, +98'h3fa9e9bf452781ca51345ae26, +98'h10cd59e1bb4d0236b30697061, +98'h0cd3a9d9ae15711c2eba46bd7, +98'h175c666e8bceacd788cac4d18, +98'h1aa3817563493d86af7b2fbf0, +98'h06e1d84dd2c9cde5866ae98cd, +98'h04c967c9b6d186adaee6bb9dd, +98'h1b97c3f710d855e18b1c06762, +98'h0fd6a6dfbb636036f2ce81c5a, +98'h0f3b4ade7f4a393eb3a161074, +98'h02e50245f43d5e284dc8981b8, +98'h2a18e5941ea3167d722eff046, +98'h2526a28a582c5d706f54bffeb, +98'h33006d26096c9ed2ef1b42fe4, +98'h3d88b9bb315405a29bb72fd76, +98'h3512e02a1527bf6a728ea7e52, +98'h01c2ee43bccd19b9afa401ff5, +98'h054bed4a8556874aa2a89d255, +98'h13dd7fe7a71b798e2ebe3e5d7, +98'h191938f21948d172ac9882993, +98'h0d68325af8edebb1d19587832, +98'h1741676e9885aaf12bf1c497f, +98'h124bf4e4b689a6ad323566e47, +98'h30cce4219f5b7d7e940a18680, +98'h0651484cb7b397af4f8137fef, +98'h3c9269391950f3f2b578d74af, +98'h34256a2851d96a63b17fb5230, +98'h21794782fde0a43bf7d67aefb, +98'h06d8394daeac521d6d6122dac, +98'h0d736fdad11979e207a33a6f3, +98'h137ce066d24f916489731c72d, +98'h25a1380b496dd7d2cbc3c3f78, +98'h23c73d8781acc143495cffb2b, +98'h0300e7461a2b86f4474b1b8e9, +98'h28300910676fd90ed3e7f887c, +98'h0a7bfa54eac65895ad5094baa, +98'h3c59beb8a09cf881373dadce7, +98'h3b142d36024f93448f58f01ea, +98'h2720448e7ca1edb978f08c91f, +98'h056243cad0241760456196cac, +98'h04ed5549d4357e686648b4ec9, +98'h20888e810b0b48d60ae4f5d5c, +98'h029ba4c522466d04893884726, +98'h362b38ac4ab0b5557036fb807, +98'h0562cacadeac46fd6903c4721, +98'h24f04889d0927fe12d60b21ac, +98'h3cf5e9b9f73be42e7d0c737a1, +98'h1b796ef6d92e83f26d29fcba5, +98'h342f17a84551b74a8e6033bcb, +98'h28b9881150684160ce48725c8, +98'h2e51851cbfd3cf3f9b8955170, +98'h2df7ea9bd0d183618fb25b7f5, +98'h071c65ce081da45003ce82878, +98'h1ec36a7db8afc6b155dccc4bb, +98'h0e9897dd07379c4e45740d0ad, +98'h078721cf054864ca8333e1a66, +98'h02bb0d457c2c53b86fb9d83f7, +98'h2862fb90d92d78f250641d20c, +98'h04a5f2c9583da7706738e68e7, +98'h2b59f89680f589c1cb13e0961, +98'h018297432e2b799c6beb8437e, +98'h16d8396dbef7f0bdd5740a8ad, +98'h2b9e16170aae3dd54d9314fb1, +98'h3402c4a80e58025c9096b1c12, +98'h1ba2bd7761b73c036f567e5eb, +98'h2f33109e73d8f6a7b8c301d18, +98'h2f78349ed1f89ce3f05c3460b, +98'h1c704a78c3a490c7680536d01, +98'h088467d132a72f254ecae5bd9, +98'h3da85e3b4a5e85549201b8e3f, +98'h11b72de36a57f1148f03c7bdf, +98'h08dabf51b18ea4a30e9a58fd2, +98'h02fab045cd4b585a841182281, +98'h3556ef2a8f9bc3df113cacc26, +98'h1752936eb1685822d22ebae45, +98'h24a0c789464160cc8ab88a157, +98'h2923df1262992c0532ef42c5e, +98'h097c80d2eb9a0c172d45a33a8, +98'h10cfa5e1a72bde8e4dfee11bf, +98'h1a1479742588940b0fe7435fc, +98'h00fa6dc1ed48901aab90bf772, +98'h1d1abffa2979e792f1a529e34, +98'h1d8a56fb047f8148c8827610f, +98'h193859726729c10e701886a03, +98'h3a9605350ce0d959f1ddb7a3c, +98'h160c496c10440e60a99415f33, +98'h3b2e46b644002dc80fcb9d1f9, +98'h126c5be4dc6d1878cbb65d176, +98'h391c7e322bb5cb97593492725, +98'h1089aa61256a6a0aed7d051b0, +98'h225fc704aa5fc014b32fe1c65, +98'h3a0ae5b42dd67a9bb9f85813f, +98'h1b62e1f6d4d49de9ac0ddff82, +98'h201e5f0021f91303f085dc810, +98'h2194d8830b2a06566b2fb7b66, +98'h19f5cd73d20e79642b0111b60, +98'h2d3e691a4ee0f35dcf07d71e0, +98'h3b0dd63613775366d3a14a673, +98'h171e2c6e36f9bcadd385fa46f, +98'h2613568c0efb54dded43aada8, +98'h1a857d7500e1e1c1c6d9d7cdb, +98'h1d286b7a5178a2e2eba843975, +98'h1b6022f6f01d90a012df6ce5b, +98'h38bb36b16609fe8c37b14d4f6, +98'h2cc0b69995feee6bf0afe9416, +98'h1f106bfe20ddab01affb85bff, +98'h1c3bcdf872ad1f2553ba3b476, +98'h0c1393583ca717b9522eaac45, +98'h0c8bdf59052d0dca646e3b48e, +98'h2eef149dcdc5455baf2d167e6, +98'h1aa7ee754d0df55a09ed78f3d, +98'h355e002a81e7f0c3edd17c3ba, +98'h2fa6ef1f51cba563905ca520b, +98'h0799934f352d79aa6f31c33e6, +98'h2b79f416f5e88f2bd858a0d0a, +98'h1734836e42638b44e66603acd, +98'h0cb710594a3189d465ba268b7, +98'h332604266744820eb69aa18d4, +98'h0c5f01d8bc8d5ab9123b17246, +98'h2fb6911f4b3b97d66ebc8a3d7, +98'h1db79afb792a003275b866cb7, +98'h15f0746bfb69c736f4568ee8b, +98'h0e04e7dc20c9b5018bb3a7376, +98'h17a60f6f6d55779a913ee1c27, +98'h2a1b17942f61bd1ef65f352cc, +98'h2f0fe11e1edee27d937bb0e6e, +98'h047326c8cf2ceade44e80469c, +98'h377451aee1c33b83b64de34ca, +98'h019c40c339c3e6338ed809bda, +98'h2b3b371657289bee7098f4c13, +98'h1e93effd2ebd389d53544a269, +98'h273f1e8e405ca4c0a9e6f0d3c, +98'h00befe4149c710d382a183c53, +98'h171e546e211fec822e0f903c1, +98'h35ed23abdd1ccc7a14c27c097, +98'h1ebdaafd69882413321173c42, +98'h2801699004aa40c96b2aea966, +98'h2e1f041c05b2fe4b6cf48099e, +98'h1789546f261ec20c0f6a059ec, +98'h0a1d9a543433daa86f945d3f2, +98'h3ebccbbd5ea1ebfd7757adeeb, +98'h329204a52d56299a97fa0b8fe, +98'h3710c22e33cc27279ab73a556, +98'h08d002d1a0fe9901ea73a6f4e, +98'h2ab69d1556f4f6edf06ae500d, +98'h2c600298eb24f81655e13eabc, +98'h2d125d9a23d8f907943ad5a86, +98'h0b4669568390e14723b5d2a77, +98'h156187eada09b6742bdacf97c, +98'h1b1a9b7628b3221170f36f61e, +98'h117cc8e2df89247f0c417b587, +98'h349fc2a90325e3466df1697be, +98'h27ce638fbe62f03cd98c54f31, +98'h18815af10b8d90d70903baf20, +98'h33475426830586462d93369b3, +98'h1545746a834480c6a6227d4c5, +98'h164d3a6c818cd8c325f684cbf, +98'h1876bf70dd6b5cfacd78871ae, +98'h1e4b00fc9120eb626bdafb17c, +98'h037852c6f5a84a2b4e48273c8, +98'h24be448959fa15f3efae169f5, +98'h23653486f00ecfa034dd0109c, +98'h104b7f60a08d10812c3623f87, +98'h06cda2cd865a80cca34a08e69, +98'h3c92ebb922d0bb0597d8e9afa, +98'h1814197025d6620b8f7a9edee, +98'h2e30309c5f7fa3fed36bf526c, +98'h3b9c1a3702fb15c5efa5cbff4, +98'h1d7ec87ad6a74eed6d0985da1, +98'h31ecb8a3f7fdbdafda7a9d94e, +98'h3a6d26b4fac740b59d4d19da9, +98'h0358dd468e39a9dc6464a1c8c, +98'h21d8a383be31c53c78029a300, +98'h00af50c1438ebac7010f82e21, +98'h3d9c223b2550758ab8bb25f17, +98'h06e4814de07e8d80c9d8c3b3a, +98'h3fab773f67de838f99e27eb3b, +98'h2e980e1d1602626c11269c224, +98'h02459344ad1abf1a2bd81497b, +98'h3fc80bbf86c3c34db1a2f3c35, +98'h1f776afeed635f1af336b2867, +98'h21f40d83e291ed8511217ec23, +98'h34d99ba9ba9d89b53bddc957b, +98'h2d61f09ac09dfac10b7ffad6f, +98'h11a2d8637c3a9c3873775d26f, +98'h37265d2e7937c5b25c1788b82, +98'h28d90c91879d32cf2c1d8fd83, +98'h0b0315560e7595dcc65e2accb, +98'h1b9b48f7060ff0cc086ace70c, +98'h001cf940086083d0c21f5f443, +98'h342e66a84a7007d4cfa79b9f4, +98'h0bfbcf57f0efa4a1cf3adcfe6, +98'h05a6744b6e1d809c2cf0fd39e, +98'h2635ce0c624bf00492206f843, +98'h01b6dac342b344c5411a87e22, +98'h1298e3650a86e8d50747f30e8, +98'h02634544f878e1b0eeb709bd7, +98'h3b93b9b72f1e041e3aac6f755, +98'h2bfb4997c47016c8ec1ad8183, +98'h071085ce0454d348a2d95645b, +98'h38fad331f05018a09a52baf49, +98'h38e388b1e49fe9093760dc6ec, +98'h211945020eb09bdd6bf27837e, +98'h235f5c86870a84ce0a9a78552, +98'h2b0168162a169a94354600aa9, +98'h1490f8e90cb0f7d948507c309, +98'h00dc0e41aa84e0152ad83b95b, +98'h39157c320919ce52308bd2a11, +98'h1f077cfe36a24cad756a726ae, +98'h106bb560d367b8e6e8f4db91f, +98'h160594ec3f77e0bef55f5d6ac, +98'h2613698c230e3106324866a49, +98'h28daba118c3883d86d44cf7a8, +98'h0abc5cd545e2e5cbe427d0a85, +98'h3bc77ab7ba748b34dd8f017b1, +98'h1d371a7a4b15de562a133e342, +98'h1876f970da8b04f50cc07f997, +98'h0fc97bdf9aca6775aaa4f8d55, +98'h306c1120d41abbe81121b3423, +98'h17f8f2efc8bab6d1682cea705, +98'h08a742d16ea5041d4dd311bba, +98'h18cc8ef18d80565b099339532, +98'h062f58cc73843fa70e6ce61cd, +98'h35f8c7abe1cb4b03b5f104abe, +98'h3656d02cbbc827b7bc87bdf91, +98'h155703ea8501fc4a0696400d2, +98'h134802669a79d474cb7075b6d, +98'h3f7adf3ef173dca2dc3baef86, +98'h39920a330e3984dc51f2e3c3d, +98'h0c2736d86f78d21eeee8023dd, +98'h32206f24781826303a8e25552, +98'h2fd4ed1f8a875cd52e97127d3, +98'h29378a125cfe9f79d18d8a630, +98'h106d7560eb7b8016eefa3d5df, +98'h12bfafe56ee4d29df06920a0d, +98'h1ccb17f9b5f86babd4b0e0e95, +98'h225918049f8a6cff3078e140f, +98'h3880fc3107fee04fd01ff7203, +98'h0e62865ccb5366d6866d7b4cd, +98'h3fdcf2bf8e825add3397d3673, +98'h1c4caef8bc5a5238b629c04c5, +98'h3304f8a613f6fb67d1befd037, +98'h1e44627c97ba5eef6d7fb05b0, +98'h168283ed2a822b1530412bc09, +98'h226d7504d583246b2dfc265c0, +98'h077d87cee6a8090d6b8964371, +98'h0698664d2ab828954c5423b89, +98'h3e593fbcb4ff8da9fcd63359a, +98'h3c8cc5b9282e2890792ebb926, +98'h3f54b63eb9a774337e3f0a9c8, +98'h36b261ad7d0820ba3ceea099e, +98'h22410b8486e5e3cdca49bbd49, +98'h3f13293e2406138818c64f318, +98'h244f80889d8cd57b10771580e, +98'h0f5fd6de83c79447a4c9dac99, +98'h3d693cbac16d3dc2cfb59e9f6, +98'h2bd157978f940b5f2ed958bdb, +98'h3172d522c252f4c4acf17279e, +98'h3070f5a0fc2ac0385b26ed764, +98'h294d97129ab35cf571003d020, +98'h3c813bb93e8ca33d1ec377bd8, +98'h03588fc6bc68cbb8cff056dfd, +98'h1e71a07cc5a1d1cb4904dc920, +98'h1ba351777d84b23b364a00eca, +98'h1ff6ecffcf0ce15e2bc0f3978, +98'h04f47dc9df7283fee919c0723, +98'h019266c3176de5eec640132c7, +98'h29360e924d555eda8da2db5b3, +98'h2301b48612c73a65ad723bbaf, +98'h05c95c4bb7ba752f4f60f45eb, +98'h2ec18a1d8ea6095d6f59e4dec, +98'h12b4e5654f6a335ec887c6310, +98'h2dfd0c1bf920933279c767d39, +98'h168dd86d1b522976ac780078f, +98'h1bf3fc77c1ac38c347680d4ec, +98'h106f59e0ea31b1144ea842bd4, +98'h30119ca03f3d413e5bd3b7779, +98'h39418eb2bbe35937fd4939faa, +98'h109e5d613612622c31ac2fe35, +98'h020261441bcd09778773daaee, +98'h01263ec25afe08f5e70911ee1, +98'h21b20c835230ede46cf8be99f, +98'h135dfe6685ef61cbc653580c9, +98'h16f560edf8c91cb1b3ef9f67e, +98'h3380fb2705ed1fcbce5b86bcb, +98'h336fcea6ec480018b7edf3afe, +98'h05d1e0cbb1a404a34ddd795bb, +98'h35472d2ab4077c283a53aa54b, +98'h3e180bbc3d1b2a3a3ecccd7d9, +98'h1a3342745760d8eeec6506d8d, +98'h0fa3b55f4b10085626acef6d6, +98'h12eb0be5e0d76881acf09d19e, +98'h1892d8f13aec3db5f4dfc5a9c, +98'h09b1c4d34e6ff1dce6086dac1, +98'h29c0dd139737196e503dfda07, +98'h2735b08e503ed3e06ddd211bb, +98'h11fafbe3dfd4df7fac73f6d8e, +98'h21e2a203c666f2ccea1265343, +98'h0ac36955b355d4a68f864f7f0, +98'h093a41d25a735df4c8eb67f1c, +98'h1b1d3d762f07039e328910451, +98'h24b418096125b58251767362e, +98'h258b1a0b3a66c734d7fc784ff, +98'h00175440158357eb0566ab0ac, +98'h2d9a961b340f1028386a6990d, +98'h1a3053f4401b43c00692e5ed1, +98'h1b0661f618176ef00cc774398, +98'h3a33ec346a2ec3147918abd23, +98'h28a92f915660d9eccfc2825f8, +98'h301271a01f96d4ff13ea51a7c, +98'h302b6020662d370c759625cb3, +98'h106c7f60e7f0508fce1733fc2, +98'h2c8563190fd4a4dfaf1681fe3, +98'h11cb7ee393c8d36789651492c, +98'h0920e6d2615a7e82aa9ed9554, +98'h2a2ff2146936619274d994e9b, +98'h2d92b99b2b1427161629b82c4, +98'h25f7788bf073d6a0f59ad3cb3, +98'h1a9776f5328391251346c2068, +98'h078c99cf08cc06d1a41628283, +98'h282ceb905ef7857dd1c91c438, +98'h0e424bdc944da968a8a3fd515, +98'h325240a4b973ac32daf17b35d, +98'h262d3b8c597200f2efe7cf1fd, +98'h0e28e25c4bd254d7a67ecdcd0, +98'h36bcd5ad411043420df3463bd, +98'h27e0260ff601fcac177888aef, +98'h26460c0c80a7c14149bb73537, +98'h3705b62e0fb099df51ad94035, +98'h31a1e2a3593ace7272b72c457, +98'h3684b7ad1ca69ff954cad5e99, +98'h0471b148c5a468cb628586851, +98'h0bcdb1579683c9ed08945ed12, +98'h0c8b30590c82a2d9064374cc8, +98'h31513622937fa1e6f13436026, +98'h2d7e3e9ad57fc8eaf0bf81e17, +98'h17a74bef7b3fc93654b9c5496, +98'h3c166b382bf44997fa02ad340, +98'h326d9324c4c600c9adcce4fba, +98'h212a3a026d8b611b33ad66c76, +98'h16162f6c3ee7ee3df53f876a8, +98'h2afa3015cec47cddae6fab3ce, +98'h16916f6d23b2a8876e9105fd2, +98'h08d198d18cdb64d9856b3f6ac, +98'h07ec344fca8bfd55049e0c693, +98'h298b0d1320d1240192970c452, +98'h05ad1b4b70d377218da0249b3, +98'h170abf6e3dffb2bbd5429c8a7, +98'h07ea63cfe1352a824a47e3948, +98'h2ab07e9563d2598793a0b6073, +98'h39c298b3bad039b5bd24b49a5, +98'h353382aa79ecdd33fbc817f79, +98'h0811f75016c31ceda7b5450f7, +98'h2b49f1169c3b65f871e155c3c, +98'h24ee9809c89fac512b639116c, +98'h33ee27a7d51524ea3240d3248, +98'h10a5576150b8e76168578fb0b, +98'h1103c26212cbc16588f3e0f1e, +98'h07a17b4f4a2c7c5464737de8f, +98'h238e640717b17aef4ecff7bd9, +98'h09d91d5385fa0fcbe3f4cb47e, +98'h3d9c3f3b03d01547b05b1520b, +98'h380852301c6a4678d51ca62a3, +98'h29765c12d23a7fe44eec36fdc, +98'h093511d262778b04eaeb2735d, +98'h0398a44705133b4a022af7e44, +98'h0ba5de575dda987b8a601db4b, +98'h1763a56eef11851e119d4aa33, +98'h0ba52dd763ccbe878bdc7b17b, +98'h196a1e72db7f3c76cd3a56ba6, +98'h041b90c80081eec121275fe25, +98'h39ac443372598b24bb0173d60, +98'h353a9aaa73cc7f27ba41c6748, +98'h1802cb70296e5092f05c4700c, +98'h10228a60764cb62cb19bd0234, +98'h016bae42c9004452229afca54, +98'h1f9cb17f35fe112bd566b0aab, +98'h01dab7c38eabe1dd6421a6684, +98'h21b49b8344e44c49c9a639f34, +98'h1f9fc87f37f70faff5e5b60bc, +98'h3029fa206d0a2a9a174d092e9, +98'h3f64e03ec325884650a29a214, +98'h0a6546d4fdf3fdbbf21651243, +98'h1635e76c6c9bff9930b479c16, +98'h1ec92f7d8d17efda0af847d5e, +98'h2df4329be54c0d8a94d010099, +98'h3eeabbbdc8de07d1b1f230e3e, +98'h3407d0281f52d4fe94d6a949a, +98'h066a38ccc019f5c001a10ba33, +98'h0e108b5c25246a8a6ccd3d79a, +98'h12d6dc659ae09775eb6ddcf6e, +98'h20c8b781a94e00129285ade50, +98'h08372fd0510b41e226509c6ca, +98'h0e3bb75c6508c88a2cd11ff9a, +98'h2d80389b2aaac915560ac06c1, +98'h0de2435bde87a2fd2b1a79964, +98'h3a755db4e31c48863764698ec, +98'h1f2673fe591980722e0ffd1c2, +98'h291b12121c61aaf8d15f2f42b, +98'h11418862acea8d99cf8b057f1, +98'h0c163bd809cfefd3a5798aeaf, +98'h2e556d9c9e5e1a7c932ce2064, +98'h3d025a3a131538661405e4a80, +98'h1f140afe31ab4123742fd3086, +98'h35f871abc7088bce0f403f5e7, +98'h143642687296502531b324a36, +98'h0430b14844a55fc9623584447, +98'h0774c04ee5d0ef8b8b516bf69, +98'h02d8d9c5a404e10809b76eb36, +98'h32a47e2565bb0a8b7617e22c3, +98'h20e96801dd16fd7a0f80195ef, +98'h0d090dda32ee78a5effde1a00, +98'h26f37c8dca4d2654ac5028b8a, +98'h30de9e218e2f635c4fc3805f7, +98'h2e91809d2e58de1c973a97ae6, +98'h198dc7f3310b6e2212a64d854, +98'h105492e0b18ffea310792460e, +98'h31eb1023f8a1a2317aa32c955, +98'h22b8ab055978bff2cf0c5abe0, +98'h0554344abebd10bd710451420, +98'h08d985d1a76f800ecc1241781, +98'h126d3064fc9c40b913c25c477, +98'h2e52491c8e484edcaf26a5fe5, +98'h16af076d546f51e8cac796558, +98'h32e1eea5e63e300c564807ac8, +98'h2aea4b95cec6e85d8e6c4cfcd, +98'h201e6b002e72281cf3a424c74, +98'h0e4f66dca3ddd187ac8b4e191, +98'h19b096735fac02ff6e57265cb, +98'h037e9fc6d9d771738755844e9, +98'h3942d23290fed961f2906ae52, +98'h0591e6cb04bce2494293b2451, +98'h3e7c753cd0635ce0f3b7f4877, +98'h1602596c1732e4ee4b4d4f969, +98'h1513efea1349de668a1773942, +98'h13bb8ce75f9283ff2cd38439a, +98'h3b31b536619614031731f24e5, +98'h2b9e9517103e7c606ef7445de, +98'h350de42a1466a568d25d2264b, +98'h1f26cdfe77bf672f55b98d4b6, +98'h03e2aec7cd7a6ddae4574728b, +98'h12d260e5a160a002ed0cc03a2, +98'h31fd80a3e7f58a0fd67cc2ace, +98'h2f608e9ee5b7ed8b75461f0a9, +98'h3fe8eabfebb81d975ae84215c, +98'h1ae7b875c7b1e9cf68a668915, +98'h035946c6bd68dabad03088605, +98'h053524ca426d28c4c1e89363c, +98'h23b622877ac54a35979edb2f3, +98'h31d889a3b25e2224b90daaf21, +98'h3dca66bba8b9d39159a10e933, +98'h2dad541b74e5d929d8a4cb514, +98'h24553f08ab33871653e23187b, +98'h31a3b12340b542416c963cd93, +98'h19e5c273e98da21330dcd921c, +98'h34fb5329c3076f462e00b09c0, +98'h0d9b59db21ecda03ebe20cf7c, +98'h1a11fc7405ec734be7ff9bf00, +98'h0414e9c83dca633bb077d340f, +98'h0e57c5dcb68f0cad1139b4a26, +98'h3408ba281660b86cf29a5ca54, +98'h23eb2787db8f0df70fde8d5fb, +98'h26af1e0d7c9c233918d2d0519, +98'h35cec12b973a82ee534251067, +98'h2b59db16a1a10603533eb8467, +98'h0a9ae0d53b9f9ab7318e9ee31, +98'h0f42515ea6e9e00ded8b0c5b2, +98'h00fccac1eb2151964b0787160, +98'h1ac86475836f18c6e78ddf4f2, +98'h1945c4728b68d3d6c92ba6125, +98'h000c23400a3a86544291aa651, +98'h03bbd7475e3daafc687e6090f, +98'h37fc2f2fd238b5e4728d39451, +98'h384e5eb0affea11fda133ff41, +98'h2ea2e51d4309f3462c6b3618e, +98'h1dc04bfba2256e846ff96ea00, +98'h21ac45037b0511b6372c55ae6, +98'h284a2e10b56f1caad76e52aed, +98'h20ce98819b8df3772f1722fe3, +98'h3625fd2c46f32f4dcf464b1e8, +98'h02efde45e651d10c8a506bd49, +98'h07669ecec1a38ec342428b648, +98'h0891ee5133eb43a7cf1f4c7e3, +98'h19ed3073fe5f2d3c9613176c1, +98'h183f64f046e009cde7c7dbaf9, +98'h2e3e0e1c7bf17037da8bdf950, +98'h30634720d0da91e1904f76409, +98'h22679a84ea085894131bfcc63, +98'h1f25707e4771404ec9a5ac334, +98'h211cc882025b6ac4a8de0cd1b, +98'h3895b4311dbd7a7b7594cbab2, +98'h389560b105ed53cbefa0ad1f4, +98'h299fca933c7469b8f9850d130, +98'h02b60bc5758256ab0e0e189c1, +98'h16f1f66ddf2389fe4d85601b0, +98'h3a721834f0156f203aa1e1d54, +98'h3e306cbc6ea2eb1d7b34d5f67, +98'h2549040a94463d688e63d05cc, +98'h397f7eb2c2bf3e456f0faf3e1, +98'h3731c52e7e69abbcdd66dc3ac, +98'h1d9e7ffb038d99c7084b06708, +98'h0735cf4e501757e005d349cb9, +98'h1d7d6e7ae9cb039391d21c839, +98'h276ddd0ec3bdba474acae5d58, +98'h37675c2ef919b9b23c2045784, +98'h3802793032f70ea5dabe61f57, +98'h1b8b96773ade3835959a73ab2, +98'h364244ac9508fbea32d2d025b, +98'h05df8b4b98ee0171c7b3632f5, +98'h12d00065a028fb004cbe3ed97, +98'h1a0376f4383227b0748d67a92, +98'h205a51808fcf81dfac0a74d81, +98'h3b03c63638cf94319cf4d699e, +98'h2b3f50166893e69114f4cda9d, +98'h0681424d07570fce83761486e, +98'h1dedc8fbd2bb0d654c2a35984, +98'h16f9f5edccef0859c8fa3f91e, +98'h39c646b39bd2ca779566444ac, +98'h279cd80f07591d4e8bbd7d576, +98'h3cadde3949640e52d1847b230, +98'h31423322812562c26c99e5794, +98'h0474b148eef5cd9dccda9fb9a, +98'h07d2cacf82556cc4828a0de50, +98'h3ea2383d5c4aa6f8b6bb37cd8, +98'h2d97c71b3e2117bc7aee37b5e, +98'h31294ba241f34b43ecc725b99, +98'h2a9d5a15377f0c2ed8871990f, +98'h02f5eac5c5ffa7cbe23d64a47, +98'h05822acb2f830c1f2d414dba9, +98'h1e36c3fc7cc8cbb9b6bfe3ed8, +98'h2cbd78196a93f81515d45c0b9, +98'h2db47b1b7e7d91bcdb0c83360, +98'h3f9606bf0feb965fd3e06747b, +98'h0e78b5dced4c071aaef12f3de, +98'h20b3c50155c21d6bad9d789b4, +98'h3376dea6ddb195fb744a1d289, +98'h1d6634faeff77a1ff3576bc6b, +98'h25d8af8bbeabe83d792125f24, +98'h28699290cafc58d5ecd97ad9b, +98'h1e007a7c063494cc690d43d22, +98'h3924bdb25d2cecfa55946aab2, +98'h23432e0693a186676db92d1b8, +98'h3d09e0ba01bf77c36fb2561f6, +98'h0ecc22dd993420724a0010d3f, +98'h3bf3da37fdd893bbbe731b7ce, +98'h350c9daa3c512b389c577238a, +98'h060a61cc3e4737bc911466622, +98'h34891ca9248b79093645256c9, +98'h05e6f34be6da830dab305d966, +98'h34c65ba9b0db4fa1b9686ad2d, +98'h10647560ef33441e6fe5ee5fd, +98'h18881e712c0c8f9811252b824, +98'h10b3a1e160634080ec45b8989, +98'h0783b54f299d9d130c4854988, +98'h26fe2d0dce9c3bdd2d669a3ac, +98'h19184b721ef905fdee04545c0, +98'h0612af4c3ea0c13d712cdc226, +98'h0f8ee75f1e23ec7c6b6cb4f6e, +98'h3d434a3a8398aac71036fd406, +98'h15d4396bbaab2c35541fd9683, +98'h32d11425a35b6986958b1f6b0, +98'h0c8e1ed923c945878c15d9182, +98'h0cee3dd9f1320da26f8812df1, +98'h02deed458b6f03d6e3937c472, +98'h2f90fa1f2d830e9b3745022e9, +98'h371878ae1508e36a130857060, +98'h380128300fc9d2dfb1f2bec3f, +98'h0810dc502c8b3d190d27065a4, +98'h083ab9d04babf65764f9ac09f, +98'h14bb02695a7f2d74ebce8bf79, +98'h2feedb1fddee55fbf3774c46f, +98'h0114eb42187a3a70c663c96cb, +98'h1b1ddbf6167bd46cec666c18c, +98'h316db7a2de9abd7d14021d47f, +98'h12f3d6e5e59fe40b0e24eebc3, +98'h23756f06ca530ad48b721e76d, +98'h18c219f18806ced008323a306, +98'h1b788776e4fd5b09f01d78a03, +98'h209f4d010305bb4628e94211d, +98'h3f992cbf21627102f83ee7708, +98'h3d685c3ad51c79ea34a135894, +98'h2ec84c9dae8d019d1755538ea, +98'h168c1e6d099307d32807c9901, +98'h01b059c367f3dd0fea690db4d, +98'h0d3bbcda5d84dafb0ab025f55, +98'h2cb3d5994334d8466bfa2b77f, +98'h3649dbac949be6e912b970a56, +98'h07919a4f0e4a715c857702eae, +98'h0c3283d8582d66f04917fab22, +98'h0d30df5a6a5638948de1c5fbb, +98'h2575c60ac05a654089740ad2d, +98'h108703e11ac9fcf58ad44035a, +98'h1a9f2a75104602e0aab94b557, +98'h2679160ccae9ac55ec58b098b, +98'h0903cf5238637fb0d059d3c0b, +98'h3c0b1bb8005001c08f16c75e2, +98'h0f7159def84e03b0b1efd763e, +98'h381f17b01c4feaf8b51bc0aa3, +98'h2cb79719788c24311950eed29, +98'h3c75d638fbbcb0b75e0ca1bc0, +98'h1926eaf248112e50284e0650a, +98'h169370ed00d2dec1a5d993ebb, +98'h37cd6faf8d3e2eda5142e7a27, +98'h1299986509abeb53471160ee1, +98'h1e6ce67cca94b8550a4067b47, +98'h24199d8812d69fe58dbc0f5b6, +98'h1fd3597f903d6ce06c0431980, +98'h175037eeb55e41aa932b9e664, +98'h077085cef0f445a1ee1932dc3, +98'h342d0ca85dba77fb7479e128f, +98'h3ab204b54edc9b5d9263a804b, +98'h07f7f94ff1d1f523ae727b9ce, +98'h08e031d1ef2eec1e6e03c77c1, +98'h2656198cab69df16f46ffe28e, +98'h00e5d341f6a2672d4de20e9bc, +98'h3ae09135de0bf77c163b222c7, +98'h399c833317e430eff4602d08c, +98'h356f122aff9d7fbf1d43247a7, +98'h00e7d641d55e6dea8591910b1, +98'h10a825e14590e84b058e438b1, +98'h2c1943981c010878320693041, +98'h2859331089cc31d3ac8959391, +98'h34c6cea9a9ae3b93579d428f3, +98'h27884a8f1e0e197c11659902c, +98'h346e6ba8c35cd7c6adf2d0dbe, +98'h0121a9c246cbfe4da1fb6a040, +98'h1af02cf5f0f24da1f2f89ea5f, +98'h059305cb33328ba66e31645c6, +98'h341924a82346740695d7e62ba, +98'h379692af3b231eb67cae6c596, +98'h232912064fb3115f6cb708d97, +98'h1edfcbfda1b7f0035025ef003, +98'h346cc728c80122d02f1b7a7e4, +98'h3c4bfab89f08fbfe16d53dada, +98'h30b750216175e382d48b4ce90, +98'h0ca881d9729ba8252fd10a7fa, +98'h08b3dc51763197ac6fb95cff7, +98'h3110dfa205172eca0d8a039b0, +98'h22ba67056d02111a33ef1e07e, +98'h3a567c349787c46f34779028f, +98'h21011d02193af8f24e8f057d1, +98'h33d42da7b4aa80295a1fab743, +98'h03b488476a15d7140b7297d6d, +98'h3d7f813af96c0532fdbae19b7, +98'h26b0728d638bdb07328f13652, +98'h08f9c2d1e0f3e901ca7b6af4e, +98'h31439422b58b62ab19b3bdb36, +98'h3dd2c53bba46dcb4be06687c1, +98'h2b97f61715db436b905cce60a, +98'h221f6a8415b992eb4df63f5bd, +98'h3d0a1cba00edd0c1cf7dfb5ef, +98'h01f5ecc3fb1e6b360f4515fe7, +98'h24e8f009d255a6648dcfa59b9, +98'h2e51e31ca2c7d605b4466e489, +98'h37c862afba7e2db4dc91a4191, +98'h26520d0ca729818e535ee3a6b, +98'h1ac0d9f590b9e9616adeb0d5c, +98'h10b1d9617f123cbe13f10587d, +98'h07a5564f5aa877f5689373913, +98'h32d0aba5b528a1aa79fe53540, +98'h256a5c0af86660b0d7742f2ee, +98'h0a88e9d50c847ed905c35a2b8, +98'h1aa7997573e89aa7f3a40d075, +98'h3488bd293feefbbffd1dee3a4, +98'h014e50429555d2ea85a908cb4, +98'h15cea16b9583856b2ad489b5b, +98'h365e7cac921f74e4121f7c642, +98'h305ba6a0871b714e0dddc5fba, +98'h3294bea50d0c735a0fe84c7fc, +98'h1d1d7dfa0d1e695a0a8ef9d50, +98'h15bb016b6657d18c8f04b4bdf, +98'h33823d27190192f21320f4064, +98'h2175e102e874e810d27ab244e, +98'h2e17eb1c0aef7455ee41d7dc8, +98'h3618d7ac2bfb6f17d88511b0f, +98'h3709c52e16c2a16d937319a6e, +98'h083b205077ad45af4ffa197fe, +98'h333d47a66bad1e9777ba998f7, +98'h24776108e477fa08d23bd6c46, +98'h3b40f4b6b3968e271bb5e0b76, +98'h3bf014b7c4c41149b02d09806, +98'h322edf246f6b121ef8667c50d, +98'h0be2af57f6540f2c908dafa11, +98'h3014efa00044fa408c167a782, +98'h08c38851ba653fb4d0ca32019, +98'h3b64ef36de8b277d367c05ad0, +98'h360c82ac2cb43c1978b02fb16, +98'h2f5e4b9e83ce3647accb20799, +98'h0b1873d613773666e7a3ea8f4, +98'h2853a490ae5e669c95ac82cb4, +98'h1f154bfe044ffdc8a8d95271b, +98'h3e1e0e3c124443e4941894882, +98'h1e46ff7c98a7c9f16dbbb25b8, +98'h35001c2a0e760a5cd0dd89a1b, +98'h2d852c1b22d6c0059416fb082, +98'h39aaab3342d3d345af1f9f9e4, +98'h2a0d849420e93e81d2bdb0c57, +98'h320563a437a47a2f5a6a7774d, +98'h0f74f55ec5c4e14b854e75aa9, +98'h05cd07cb95fd466be6f2938de, +98'h07b18d4f79df4b33b0643620c, +98'h3c0977b805ae504b506df200d, +98'h2de7271be5a8ae0b74e3f549d, +98'h00cd79c18cfdad59c372c9c6d, +98'h27d0d08f8d3c135a4d4338fa7, +98'h15a244eb54ab54e94a9366752, +98'h1750f36ebad76335948a15a90, +98'h3270c5a4e367c906d57623aae, +98'h11e239e3c80d2c50267bd98d0, +98'h30aaa8214b1780d60ef08a3dd, +98'h32533a2480922d410cb959d96, +98'h1ae52075cbed0bd7c9b48b136, +98'h0666dfccf8f89b31efd7debfb, +98'h24076f082993fd933366db26d, +98'h39a38db3439b2a470f4fadfe9, +98'h369f2f2d015695428dfd711be, +98'h3ccb0cb98a69d554d1cd38839, +98'h3adc5735a9582412b90d1ed21, +98'h32252ea4793a66b27ad7e555b, +98'h3c2706b86cae36997a354f547, +98'h25f7390bedaebf1b74e97e09d, +98'h3a310bb462527d04b720e22e4, +98'h3c320d384bb2df5751f93b23e, +98'h08d52c51919771e3069b278d2, +98'h0c910ed93c04ae3812256f444, +98'h2a062b1421f9c203f2fffb460, +98'h1113cb62392781b2728ed3452, +98'h217f9482e1d87683b0d602c1a, +98'h1bec65f7c295674507a0734f3, +98'h1eda427d8bcddbd7aaaa07955, +98'h2dacb99b51f02a63cfe738ffc, +98'h1c16a57809132752294a73329, +98'h06ac474d5e641efce94419929, +98'h309ecd210c88e2d90f49ebfe8, +98'h1b50d976935ea666ababdff75, +98'h3732322e71ae13a35a3811746, +98'h3613ecac3d2a7a3a7ccf99b9a, +98'h3c1d3a38190020f2354756ca9, +98'h37cedaaf8bf3b2d7f0f0a361e, +98'h148e81e933ed7d27d21effc43, +98'h1b07bef608258f5048cb53919, +98'h3bcbe537a1b50e8377603ceec, +98'h0da91fdb6603fc8c2ceb4719e, +98'h3b7947b6d03c556052ed6745c, +98'h29be56936dd2e19bb5e44e0bc, +98'h35131baa141654e8324a5c249, +98'h3d7eb83ae5cd210bb8d2f651a, +98'h382eaa3045a53c4b4f74f99ee, +98'h39217cb26f9d671f1a2fb8f45, +98'h27021a8e3270cca4d65cb9ccb, +98'h29a4669357faad6ff067c500d, +98'h1d263d7a457b834ae8a870315, +98'h2edf2b1d887a84d0cdd66bfb9, +98'h17740f6efb907fb734c123c98, +98'h04ed9ac9dd9b1d7b08a22e113, +98'h1b500676b5342baa54210c883, +98'h112a89e271770ea2f0a866215, +98'h0ba516574b11a5d625adaf0b6, +98'h15a576eb7284df25120a95841, +98'h16417a6c9f6ee67eed6c183ae, +98'h072cf24e79344b3250184f602, +98'h29373c924b61a8d6ed26395a5, +98'h2db7ca1b7b2b4f367a38c6547, +98'h09527e52a52f140a6ba064974, +98'h0126edc25354ee66851ef70a3, +98'h2ca77f19427021c4ebc5e8379, +98'h090a175216e3baede7fb74900, +98'h02aa67457044c6208cbbcb597, +98'h31413422b4da1da9b986d4731, +98'h1232cbe4720fd9241110a9421, +98'h33048e26239a5e8715a7bb2b4, +98'h293cf99257e5bd6ff048adc09, +98'h2e0db01c02706dc4cc1f87783, +98'h3e2afe3c7507c82a3cccb199a, +98'h044b10c88ff7685fe5109e4a2, +98'h32b76ba558766af0f2cb75a59, +98'h07b8794f45ace3cb43595746a, +98'h21bbe40371d41823b4e3ff09c, +98'h39a62f3348f3f451f0a688e15, +98'h1e5d617caf82ef1f33781426f, +98'h08e8d951ce39f4dc45c8b38b8, +98'h09203ad26c1721980d4dd71a9, +98'h151c2aea3fdf0fbfb53eceaa7, +98'h39d5efb39ce81bf9f5af82eb6, +98'h0c5248d893f485e7e811b3b02, +98'h3046aea0adba6d9b7780470f0, +98'h2a39f49475d2b72b98032aeff, +98'h24e89c09fa2c71b477c5436f9, +98'h3ff5713fdef8ebfdd7bb974f6, +98'h2ae6dd15f0bfb5a176e9a4add, +98'h268c2d8d2998d893340941881, +98'h392a5bb2490921d2308cdf612, +98'h1f112b7e2a9feb15126c45a4c, +98'h1d06537a22c1e205aff20d5ff, +98'h174826eeb500502a33121dc63, +98'h2a9a93150a230d546d2f681a6, +98'h1bc37ff7a86bba10d10bce821, +98'h30ed8d21cb260cd64f04e67e0, +98'h1d24e17a56a1eb6d4cf1b339e, +98'h2630178c5cf3c4f9d0c8f7218, +98'h215aa802b7e4fcaff64fe92ca, +98'h278cf88f0cfc7d59ed225d7a4, +98'h2f640d9ed51566ea111e5d223, +98'h23562e0699e28973ef4e2ddea, +98'h08560d509867c870e82f75706, +98'h1051f360ad91ae1b0f78e85ee, +98'h3f0b0dbe18966ff115e85f6bc, +98'h0d598b5a878d4c4f2539b5ea7, +98'h0517484a09e0a1d3e3bdfa878, +98'h256bc88af8af47315786c3ef0, +98'h3b4bf1b68819a35030d96541b, +98'h19c55473bc41ae38b581c0ab1, +98'h0a4321d481797e42c2ef2805d, +98'h3980b6b30b8d2257314376429, +98'h281e7a9026d18d8db3bc02077, +98'h10b01ee16ca600196f5587beb, +98'h07d292cf8736c2ce43c255677, +98'h13d2ea67bf72483ef4d14ca9a, +98'h28091a101f23ad7e51cb31e39, +98'h3bf8eeb7d89243f13522ccaa4, +98'h1fd3c47f8184444308560230a, +98'h07d5804f9d05f17a2936dc727, +98'h0a19f0d4180d6df02889d7b11, +98'h22743984f719292e366358acc, +98'h19db0ff3a3b247074f6355beb, +98'h0531854a715087a2ada0833b4, +98'h1d0fcf7a21f92d03cfc23f1f7, +98'h2408e48832c1122595b27dab6, +98'h0e23fe5c64628188eca19ff95, +98'h0d3af75a4d6ca35ac6a9e6ad4, +98'h38b33731780337b01c2d9bb85, +98'h3bbd443776ed0f2ddcaa94d94, +98'h31624822d0e517e1d091d8012, +98'h2ad5c215a9e80d93f52f73ea6, +98'h1e5f597c82aecac5684389108, +98'h1cb41e797f75e13ef70a7fee1, +98'h1a42d6f482859f4507321d8e6, +98'h39cac43396d4bfedb427e1085, +98'h01bb16c3790b13322eb18a7d6, +98'h0f19a6de0b72f9d6e6a3282d4, +98'h099cc2d32ac81c15ad1937ba3, +98'h3a8cc9351189e2e31305ab060, +98'h3aa200356d482e1ab9fa8b940, +98'h2200838404337948698cff332, +98'h2e52559c9b960477127a1684e, +98'h1f6d8efec914cf520a2097943, +98'h113d56e241bc284344be5fc96, +98'h372ec92e59673172d4257ea84, +98'h0de2085be05b3b808b8f50f71, +98'h3042c1a08a5a0e54aea733fd5, +98'h054d0bcab357ff268e2942bc4, +98'h1ddafcfb8377a1c6e854a7b0a, +98'h2aa783956d13189a35eea70be, +98'h117afee2fce65939f39856073, +98'h21a0bf83568c9f6d2e0b57bc2, +98'h215913028d10fd5a2b9a84173, +98'h30cca0a198455ff0924480248, +98'h2ba2d397496f98d2ed449b1a9, +98'h1cc0c3f9939fe5e72c182a783, +98'h20b7718174db23299564a52ab, +98'h22ea6805c4f34549e9f76b53f, +98'h2059bd00b305e62634d7e8c9b, +98'h37c7192f9f71a07ef5ce2e6ba, +98'h344bed28a862a590f72ba4ae6, +98'h2f5a139e91746f62f033a0c06, +98'h29b727935bf48a77d16aec82c, +98'h3c6870b8ddb08afb76863eed1, +98'h1630ca6c4931c55247d8a3efa, +98'h07360bce5043f1e085de7f6bb, +98'h311f70a21f52fdfeb41c9ba83, +98'h2b2d2b96497f52d2ed2b1f9a5, +98'h32b1bea55d19737a33f2cc87e, +98'h000ae9c03fbd523f6ff20effe, +98'h1a88e5f51845e9f08cb3b3f96, +98'h1ada5af5b18994a33318fbe63, +98'h35a8eeab7aaa50357c14cfb83, +98'h3938763265c9858b97c07eef7, +98'h3130c2a25ff027ffd4483aa88, +98'h3a0abeb40488dec92fa4e75f5, +98'h19cbeff3b2ddada5932a67664, +98'h2e02aa1c247bf108d49fa6c93, +98'h12c034e5bb13c0b63374fd66f, +98'h13f7c967db39ad766bcc5db79, +98'h2ee8c69de8ee8b91d5f5d48be, +98'h0d52af5a8c9f69d9267c864cf, +98'h25e1598be062ed00d19111a32, +98'h29729a92dcc06cf9918cc1e31, +98'h3c12e8b839629cb2fd5d615ac, +98'h2027dd806333338670d6c441b, +98'h19443e72b081162112715524e, +98'h1f0d047e0a7e7ad4ca62dfd4b, +98'h12c03ae581434042a500deca1, +98'h37b8beaf7ed8053d9da430fb3, +98'h1813def028b3d4917031ece06, +98'h31728722f057242098726ad0d, +98'h17d611ef8686884d2797268f3, +98'h0c440bd8922d0264479c438f3, +98'h10db29618943f252a687c6ed1, +98'h10f15461e664a60ccdd57e9ba, +98'h37a632af72a835255a9399f52, +98'h2591ad0b281cc010136b9b46c, +98'h1bd9f9f7988e67712d1a185a3, +98'h35334caa411d2dc20d941e9b1, +98'h29dbd2138072b8c0ca93a2b51, +98'h1623bc6c471a444e074f802e9, +98'h3dca1dbb9bc55d77b663deccd, +98'h2a2701147ce7d7b9f9c3b6339, +98'h1a5895f4adf8331bf21432442, +98'h02178244204e0300a89961513, +98'h341452280e612cdcd09d5fc13, +98'h0718b2ce2221b1044a4e98f49, +98'h3c0192b833bb76277bef4237e, +98'h1ab678755fb2e27f4e9a56bd2, +98'h2775440ed1415ee28e2da8bc5, +98'h30fb52a1ce92b6dd2fe3825fc, +98'h3a7c4d34f20901a41b2153b63, +98'h27b7460f6223360452769f04e, +98'h121290e43a7dacb4f3240f664, +98'h38e181b1c152d6428e8d15fd1, +98'h2fdbba9fb580082b3956f0b2b, +98'h272ec60e4655c3cc8b612276b, +98'h15ffc4ebdee6ff7dcd39b11a6, +98'h17a690ef761eebac33715f26e, +98'h333d402663cb690795c22a4b7, +98'h3d31013a7dcac0bb9ebef07d7, +98'h31335ca25e386ffc73daf327b, +98'h37c7812f8d1dc4da313951827, +98'h0555b24a918ab6e325b81a4b7, +98'h1c222f7872a8d12573b2c0277, +98'h2bebc697eaf84695f5b9034b7, +98'h2e6c039cec151e1816a0486d3, +98'h0fee56dff26b3124d09662012, +98'h3eb7ba3d478a0acf119071431, +98'h0e845edd3708fd2e31635702d, +98'h349f79a9360ea52c3aab87b55, +98'h1d51e1fa8470ca48e870ab10e, +98'h3ca93b396638f28c78b88b717, +98'h1bba72775dea3cfbee692bdcd, +98'h21b9f383666cf68cf209ba841, +98'h1ca97979476f224ec90626f20, +98'h33117aa6025d7d44ad5bbdfab, +98'h3c623e38d5a9ddeb548307090, +98'h17f932efcc709fd8c91a74b22, +98'h3849b13081b28ac34e7f0efcf, +98'h297f7192e51a0f0a13a660273, +98'h398befb31f84e97f3644364c9, +98'h0449a848942d1ce8661db14c4, +98'h32ef8f25c2d90445ad7224dae, +98'h0cb749d946987ecd04d3f2299, +98'h1218a3e4213898826cd44f19a, +98'h023f74c479eddbb3ef0b541e1, +98'h30ed8821c5db3fcb8db231fb5, +98'h08235b506a8710150caa9ad95, +98'h28bf6711400354c00a30aef45, +98'h253f690a750b38aa1692a86d1, +98'h0248814483459e46a16387e2d, +98'h36f52f2de485780916dea9cdb, +98'h378236af0655b64c8f75fb3ee, +98'h17d8076f972f816e4bc1e2377, +98'h32c4cf25b4a1312979d98013c, +98'h15f67f6bd981dcf32bde1717c, +98'h2593000b0d3386da6cb1a1b96, +98'h324a7f248d0bf25a2fd59c5fb, +98'h14e336e9fa0cb9b413bbfc277, +98'h0f0a33de0305d1c6248401691, +98'h0ca89fd95244bee4a7bb57af8, +98'h1943b2f29d7db8facdb05afb5, +98'h2ccded998305a7c62bf4e557f, +98'h275d660ea9735c92d43430a85, +98'h2ac3e295939687e72f969a9f3, +98'h25c5320bb422f1a8567a08ecf, +98'h103598604b611d56e6e5ad6dd, +98'h09485ed2ba31f2b470de9461c, +98'h2d64861afa0c3a3419dc3013b, +98'h073e3ece745fa9a8aee77a1dc, +98'h001e4bc02d74eb1aeb64cdb6c, +98'h12df97e58ecb78dda86ac430d, +98'h332e37264b805f570faba59f5, +98'h00d4c9c181d2dec3a0a9ea215, +98'h319c8d233a709234db0347d5f, +98'h0234b8c469f94313eb0b7ef61, +98'h10fd92e1cd95b05b27a4d0cf4, +98'h12de73e59b3b7cf66b867c370, +98'h2a82519539e64333f91a25324, +98'h08479bd09fa1187f69fa2d140, +98'h176d256ef23815a472694ec4d, +98'h11898de314cd61e9a995bbf33, +98'h06fbfe4de183df030a1ff7543, +98'h3ba749b74cc22c59b21a5d844, +98'h05ca6ccb96cda96da726058e5, +98'h19b619736ef6599df22b1cc45, +98'h2d1d679a05fbf7cbecc657d98, +98'h13c2fae7b45223a8920547a40, +98'h077ad54ecf17b35e25a4a22b4, +98'h04fec6c9f693222d2ee47a3dc, +98'h235ed286b61ecdac365f680cb, +98'h05eb194bc60a144c22fd4b660, +98'h08d0bcd1a4c3ac89ab651a56d, +98'h2df1f79bcb9468570e6197fcb, +98'h2f09f51e21235102540b51881, +98'h0d023cda042382c864496fe8a, +98'h20506f00a4ac3f09713f2b828, +98'h057abccadb13c8f60823a1703, +98'h0f96f35f192024726a2dc5f46, +98'h14de2f69ad05641a3078e4e0f, +98'h39652a32c2ca4345af0bdb5e2, +98'h2a79d694c9d8d0538d14a9ba1, +98'h1bf962f7f2b497a573ab7ea75, +98'h3258e924bde11dbbdc0e81b81, +98'h1d861afb0dd5c1db8ad6f735a, +98'h248eb7093c4dfcb8b8372cf07, +98'h36dd47adb2e1ac25fa6fbcf4e, +98'h01119442133f84666514462a2, +98'h28cb5d919b96f477311894823, +98'h13107ee618e5ba71cafd8e55f, +98'h3ed417bdac1312981ab9ca956, +98'h2fdd889f9c7ddc78f316d9462, +98'h26f2ff8dc6e7434dcb7690b6e, +98'h1136fee251ef66e3e8c999719, +98'h0f71b75edb582c768ab278f55, +98'h34e94fa9c73adbce6f090ade1, +98'h05d5fecb886247d0c38e11a71, +98'h0073b740f3dc4e27ad14015a2, +98'h18597c7086cd0a4d87c9a1af8, +98'h1289a2e537b3a6af728f52652, +98'h3a4d46b4a2c6cb05b745046e9, +98'h19fadaf3e4f4ae09cfbbe23f6, +98'h3f3b2b3e4e336ddc535ba646a, +98'h05bc6a4b5310d2e606334f4c5, +98'h2486b5090c07c6d80c239ef84, +98'h187c48f0f37cb3a6d2fe3f25e, +98'h31bff8a34ebbc6dd501eefe02, +98'h2759bf8e90a365616dff493c0, +98'h30ca17a1ac0d62181735de6e6, +98'h3b0c93363f497b3e9e95839d2, +98'h3c678ab8eafe3715d9d97073a, +98'h38f4ebb1f711d22e3c01af780, +98'h21ae2a037a25f7b456f5086de, +98'h123dfae47bc612b793810366f, +98'h2b54f516b823903078de2151c, +98'h066d674cda74fef4c83899906, +98'h20bd9a017227102474b92a897, +98'h386970b0f76876aefbf479d7f, +98'h2a0bbd94013e52426ad283f5a, +98'h352fdb2a60654080f56546ead, +98'h228c04050a3e63d46b3299f66, +98'h062795cc459693cb02ef8a65d, +98'h071cd94e01d3ae43823c21e46, +98'h0a2721547ef75cbdd2479f848, +98'h1b3af6764272dcc4e76b74ced, +98'h03f9bb47d7fb476fe6fd40adf, +98'h30c3aca1a894851136560c6cb, +98'h1f5d427e9ba987776ec1b27d8, +98'h306eeca0d6d592edb1d11fe3a, +98'h0a22e154444b5e48839b8fe73, +98'h2f730d1ee3466886b4ae5d696, +98'h324c76a49f40667eb4633748d, +98'h05b4544b4d62cfdac4c5c9098, +98'h2fb0ba1f637a9606d4cad4098, +98'h13523f66a4dc99898e0bb63c0, +98'h23e02787c3940dc709dd0d53b, +98'h30548a2088930c512e39e59c7, +98'h19b4a5f367609a8ef04550209, +98'h39a9f8b346c1084db01ac0404, +98'h3325ee26504d0360b0dcbc61c, +98'h0f9adbdf379bf1af11cdb3638, +98'h2bacb59773ce0a2797deafefb, +98'h3f415dbe964d566c9563ad0ac, +98'h2bae93976b913b9735cff3cba, +98'h368985ad2d61589ad8fab791f, +98'h0a1caad438117130308b87011, +98'h24ab03894f73d4deed07b61a1, +98'h309f10a113a11c6771100b422, +98'h03feb547d7164a6e26c53fed8, +98'h1056f660b5ec4c2bd190d0a31, +98'h1981eff33598842b33c69d079, +98'h3d718ebac664794cd0f58201e, +98'h3649872cbb8dffb73c75e1b8f, +98'h0a75b8d4d2f80965e75b708eb, +98'h139696e72b9a15972fcc2b1f9, +98'h2566660acbe798d7ec537fb8b, +98'h372f08ae5c3ce1f874dafaa9b, +98'h3483c3a9017b0442cd7fb1faf, +98'h070bddce1c0aeaf828c5b2319, +98'h0aa5205548c82ed1a4db53c9c, +98'h0d5f365a80e989c1c39230071, +98'h2fd5971fbdad8abb7b60c876c, +98'h046419c8f29a13250dbf8b3b7, +98'h360d762c2d92611b18e7f5d1c, +98'h1059fde0a70dbf8e2dd9ef5bb, +98'h0f9265df0c6ed9d8e7004fee0, +98'h317e0f22d7ac51ef524a98448, +98'h28b85091480dc4502c3185386, +98'h2bc43b17bde77e3bda6aee54d, +98'h0d6d0edad86a1e70c975cb52e, +98'h0281f4450f2515de4469c288d, +98'h3028c9206b7a5d16d6e8c98dc, +98'h2f2cbc1e4839ecd04dd9aa3ba, +98'h278d240f3aab7535788e26512, +98'h07be6ccf4b5f81d684c77ba97, +98'h362d282c54bda16952bab2656, +98'h17413deeacbe651950ffe8c1f, +98'h18a7e6f16ba4eb97511334a22, +98'h15758e6af557652a92b33ce55, +98'h356fe6aadf7f757ef53bd70a7, +98'h2d736c9aee45709cb6ee374de, +98'h0b4947d689a37e53653b318a8, +98'h3a99de351b0242761567082ac, +98'h2bb8ae1751372e624f3bf71e6, +98'h0b0de6563487c7290fe56b5fc, +98'h194ce7f291b41ae34ac040b57, +98'h2b7b5096e4d84909b414e6682, +98'h12dd5765af28909e70817a010, +98'h3cb937397ea7533d7ed8229db, +98'h1887187117f89d6fcc1fed783, +98'h35644aaae38d5b87163c698c7, +98'h1962eaf2c450d2c8876cef6ed, +98'h3370dc26c8602c50cef4421de, +98'h259dd98b3c6cd338f882ab310, +98'h0026a24076fa0a2dedc82b1b9, +98'h03cea247ac439818ac048e981, +98'h1fe8437fdae99c75eeb477fd7, +98'h0e11dd5c091b79d225cb55cb9, +98'h12989be53f3495be54734c68d, +98'h0fa6e65f67f7f68fcde7b73bc, +98'h055fc84ab2871ba52df9b8fbf, +98'h2a778394d6c33dedb04eb060a, +98'h3f01ebbe38d9efb1bdf6f6dbf, +98'h21244f827185732334aa70a96, +98'h00e9b8c1d1c95463a4acc3496, +98'h29dfde9384ebbc49ebb2e6b76, +98'h0c78b858d586b8eb087fdc50f, +98'h3492a82933d102a7ba18eab43, +98'h321f51a40b7f1e56cf679bfeb, +98'h3f71af3ec26a8244d0770c60e, +98'h222e9504518041e30cebb5b9d, +98'h3c61e838fb2a0a365de2fc9bc, +98'h2245c004bc5682b897a710af4, +98'h1332656653580c66a9a29c734, +98'h29ad8813778d8c2f384ec510a, +98'h04e73949e3d75e878a2fa5f45, +98'h36e3212ddd2dbb7a7504372a1, +98'h06ff22cdf174c7a2ee1cfa9c3, +98'h0d05065a340048a8304153c09, +98'h26cdf38dbb94453718988e312, +98'h2cc381198714304e2cf5ec59f, +98'h10b5b8e153fe1267e92cf2d25, +98'h25e6f40bc7edd8cfcb753336e, +98'h0138a0c27afd7235cf0d84be0, +98'h086dde50f1fb7b23ee9a565d3, +98'h1a8da7f51bf337f7cda037fb3, +98'h22b4a6855d984cfb10133ce01, +98'h2491f9892bee0b17f42001284, +98'h190924722718648e300862401, +98'h0aa120d551ca75e3871ae5ae3, +98'h167be3ecef07659e1160d262b, +98'h070de74e01cca5c38236a3446, +98'h1ab131754ff3e5dfcaa945d54, +98'h02a604c55195f963250eff8a2, +98'h18e3dff1dfd1957fae2d5d5c6, +98'h0bda82d798c845f18928b2324, +98'h353bd12a7b2c27365c19fe182, +98'h18d6e571b298df2512dbf125a, +98'h0b0a3f561b14fbf62987ced31, +98'h160114ec010560c205c19d6b8, +98'h046dc1c8dfe582ffe914d1323, +98'h3b0c0336274c340e98960dd12, +98'h065017ccb6a06a2d6f3c207e8, +98'h0ff7165feabadb954eac7c7d4, +98'h069fafcd18eb8171c7e2cc4fb, +98'h1d044efa02d3f645a7f6114ff, +98'h2a16ee140c4c62588d98d41b2, +98'h00df30c1b83f0b306e478efc8, +98'h3ed3383d8081db412fd544dfb, +98'h02de69c580e41141e0f09ec1e, +98'h2d6db79aea84141515fc72ebf, +98'h387a3cb0eb04b51638dfbc71c, +98'h0737e7ce45e579cbc34758668, +98'h28c1a5119d15637a3175c222f, +98'h09add9536cfe6199edab0ebb5, +98'h0ac8435590880de106d4144da, +98'h01203c42457d75cac1a76c834, +98'h38b701b176aab82d7bd86e77b, +98'h030827c63ea6db3d506bc0c0d, +98'h04597dc8842bbac842214e243, +98'h3f66a1bedcbc18f97708aeae1, +98'h2fb2301f6dc5cd9bb75dff6ec, +98'h0401e7c835b6c1ab6e6e2a5ce, +98'h304f54a08b05d0562ed5493db, +98'h38427630a2afdb0576bc944d8, +98'h02ca91c5970c50ee0675b8ace, +98'h30e1cf21eafe0695d6f7f56de, +98'h390d61323e9cd3bd1dea8d3bc, +98'h3b8d05b71e4466fcb6745b2cf, +98'h05a437cb52bcdde56618456c3, +98'h080d02501d5c4afa895a5352a, +98'h1c9a6cf92b94ba17120bc9c40, +98'h1a768df4c33393c6476a886ec, +98'h0308e346043402c841cf39839, +98'h14541668a269de84edaf7d3b6, +98'h1db1707b794be8b295bf564b7, +98'h1dab3b7b6ea66b1d731469a63, +98'h28b1041156e13c6defe4901fd, +98'h2630108c5550c46a8ee0353db, +98'h0a8293d51f68347eea7ab2150, +98'h16e82aedcc8626d928db9471c, +98'h173cbcee6dabf69b513a2ce26, +98'h38ef65b1e4d5ab89b771444ee, +98'h222431045e53e17cb01e04a04, +98'h0b006a563e7d2ebcd25f6644b, +98'h175cddee89c88fd388495b708, +98'h18d2fa719190f6e32a98fc553, +98'h11b3d1e35faaa5ff6c579df8b, +98'h2151f6028da81cdb6bbe84b78, +98'h252be78a65fd548bf2ca4f059, +98'h0f1b245e1d57b5fa8b1cb6962, +98'h32272d245396a5e7116f74c2d, +98'h35aabb2b5ff6b97fd5685d2ac, +98'h32b70ba5735781a6b983a3530, +98'h0904a8521cd4a9f9a9765492f, +98'h1fcd2e7f901d76e00bfaa957e, +98'h199d96f31a3cfd746cf6a519e, +98'h32b72aa5545043e8b1c1dba38, +98'h1eb5bafd4c514458aac1bfd58, +98'h347eec28e75d1d8e96f7026dd, +98'h024755c487f4124fe28eda052, +98'h2c79d618e361b886d3f6e3a7e, +98'h0f1b01de38aea5b171f269e3e, +98'h1d80b17b19b90ff36dce705ba, +98'h0f83b5df11ab50e3484bc1b09, +98'h09fa4f53c20bed4403018f25f, +98'h35b4912b7d8e9f3b3cd0cc19a, +98'h3612f5ac38f731b1dbc289d77, +98'h099262533b2941b6512ee9025, +98'h012a85c25d49ddfaa79d18ef4, +98'h2f52ee9e89acb2534e3fe83c7, +98'h3fb3633f414cd8c2b0400f008, +98'h222bf984523c9ee46d1a261a3, +98'h296c1b92c4767848eb78a4f6f, +98'h12c40f658a670f54e74ac7aea, +98'h010dd2421d5bc9faa79a670f3, +98'h360708ac273d500e5751162e9, +98'h3e39623c5fa198ff7776becef, +98'h127057e4cf7797dec879fbf0e, +98'h049d4bc93a1f39342faf213f5, +98'h3bcd0bb7983d6f7055029ec9f, +98'h3ffe59bfc2550cc4b094d9a12, +98'h0be79cd7e7dcdc0facf11e39e, +98'h1ffd097fffc8ccbf97f1758fd, +98'h3d7f70bae7ea450ff95a6d72b, +98'h1421b36847c9914fa6fad12e0, +98'h3a5e2434a8f31d91f8d45071a, +98'h1ce97379f48d99a9345dc348c, +98'h294c9392891d4b520c9a77b92, +98'h353dd02a558bd36b12b268e55, +98'h3119a22200bd4dc16c75bbf8e, +98'h0cf12359fe63243cd2d511e5a, +98'h36d4c22db81d29301bbc7ad76, +98'h3489c0a911916fe33186cc231, +98'h32ce3ca5a45e0c8895cb124b8, +98'h00d5e141a8ac61914a6090b4b, +98'h0ddf395baa8eb9150e1b7c9c2, +98'h3d72473ac8bdf3d1518c0ec30, +98'h2aeb8795dbc0abf7b1ab0ce36, +98'h0c9da7d902d6b745a3dd17c7b, +98'h0b7f25d6cf16045e06a54a8d3, +98'h3c62d338f2d7dba5bbceabb7a, +98'h3dd988bb9b722c76f652ed4ca, +98'h31539e229ce6f979f38ea5e72, +98'h32a8a4a545a7424b6e13f9bc3, +98'h39be873370ed95a1faab07355, +98'h1525b4ea4daa3edb68b3fcf17, +98'h35791eaad6f66dedd31be3262, +98'h0535c34a6987dd132baf68176, +98'h2a093294132a7de66f4cec1ea, +98'h3c9ff0b91b8444f716090d6c0, +98'h2526b20a689fc89113719ea6d, +98'h325b7da4b5ff6e2bda16baf41, +98'h24405788a31be10611d70e23a, +98'h156791eaf7684eaef333f8267, +98'h22dd1085b55c302a960e502c0, +98'h378ec22f3eb8bdbd7d91dffb2, +98'h1f6426fedf65fd7ecfb2891f6, +98'h13e85c67d9a41df36b631e96d, +98'h2206248432d038259535972a6, +98'h00d96cc1a4d2c489896b0c52c, +98'h0830815045e8fecbc38660070, +98'h2dc7861b903423606f7eea5f0, +98'h142605e85608e66c0a8bbb151, +98'h059f4acb21a1ac8349d03dd39, +98'h3005f7a0395602b2ba56fe94b, +98'h0cc0b3d9b2bc7fa54fdf4cdfb, +98'h01bbfdc36ca8af196b992b373, +98'h0ed3195db01fce200fbcb9df6, +98'h0602cb4c3f34163e514db8629, +98'h0b72fa56fbb2043771c93fa39, +98'h37d3852fb704782e1bb5ff576, +98'h039b85470e0eb25c046a8de8c, +98'h3b4bed36835535c6afa848bf5, +98'h311ddea237b3322f5a3444345, +98'h23454586883096504add76f5b, +98'h09682bd2fdc8123b91cc0f839, +98'h2385fe073dbb4f3b78505350a, +98'h114e5662ac113a182f57e41eb, +98'h22a8178560fdcd81d0e97941c, +98'h347699a8e1bed683758d5c0b1, +98'h127e4f64c7ed3ecfc69ae38d2, +98'h247bc588c588fdcb0a8130d4f, +98'h07f2044feae65495ccb616396, +98'h35c74babbab019355c1dd9383, +98'h2803e1901ebbd1fd51afece35, +98'h1e95027d102c0d604bb043f75, +98'h32c944a5a7eacf0fd6ad04ed5, +98'h2382af07018421c32941b4329, +98'h2af06615fd76c53ada19cad42, +98'h387d50b0e979a992f87dbe90f, +98'h1c8541f91c5f52f8ae39253c7, +98'h28ce219185df6acb8bab63174, +98'h04613e48ef91c61f2cfcc11a0, +98'h117965e2cda7c4db47c84aaf8, +98'h1edf94fda7a8640f51a1fe433, +98'h1a10ef742a639b94d11d22c23, +98'h1c207a7865b9718b50767b00e, +98'h3d8c66bb111bfee213aa19674, +98'h2e55061cb0e7f8a1d7cf3faf9, +98'h1aa9557547a08ecf689279113, +98'h073ddb4e4b585456a4a58be94, +98'h05c4e94b8714a8ce033664866, +98'h31368f227c9a75393b744116e, +98'h311180a22eb54c9d77f1b34fe, +98'h29d7d293898bebd32cd8ef99b, +98'h0f79f15ec681c44d257eed6b0, +98'h0c6a58d8f023aea04f2381de4, +98'h16748eecf4a10da952c567258, +98'h1d14817a1489a4692c678978d, +98'h0f77f45eee0e019c0f617d7eb, +98'h2edcbc1db84be9b0b9ca29739, +98'h3eb38bbd5f443c7eb77df20f0, +98'h1a4ab7f49073dbe0eaafa4f56, +98'h1e1dd77c3857c2b0b59d668b3, +98'h14a142e977acdc2f531387c62, +98'h05da75cbbd116fba30baf9617, +98'h1c5af7f88a9ede5509be75936, +98'h3169eea2e15a178294b101895, +98'h2ac3a495920eaa640f3493be6, +98'h20053880206e7200f01ceaa04, +98'h183871f07445e928b31f96c64, +98'h31f700a3ce05c1dc0fff309ff, +98'h2cc8cb1999b4e9f3719f6d434, +98'h18b4b2f167c53c0f901e7bc03, +98'h1da2077b7bb029b756548c4ca, +98'h0fe9415fd70a326e29bcdcf38, +98'h04dfcf49939b9ee7261edb8c3, +98'h1e93affd2b44f716b27629c4f, +98'h210b488210c5bce1ac744158f, +98'h2ccb561987ce89cfad2677fa5, +98'h27c2fa0fb7a43eaf77d9ce2fc, +98'h08abed515952fbf2a87fba510, +98'h1fb5777f5214aee40c728998d, +98'h1f5b53fe929a99e50c7d7b78e, +98'h1548c4ea81b2ae4365bedccb8, +98'h320b18243aabd2b57b2dbab66, +98'h3ef8843dcf45fdde938fa0871, +98'h0647bf4caaefe215ec4de858a, +98'h16a4d86d58ba43716bd7c6f7b, +98'h38d7cd31873435ce500300bff, +98'h37bc102f7e0295bc3d6fa97ae, +98'h0edc8ddda712958e2d7bc8daf, +98'h03590d4680bac2414104f3e1f, +98'h1dd69a7ba47a0d08f09429e12, +98'h0f206c5e6e48541caf5a301ec, +98'h04a0244979c293b38f98adff3, +98'h05d66ccbbcad5fb950a0f3213, +98'h315efba296e572edd2111ba41, +98'h0d5799dabb2f06b65221a8243, +98'h2ee0579dc5246e4a4d01317a0, +98'h08ce3051b561c1aaef8bfc7f2, +98'h2ac05e159e99aefd32568344b, +98'h13ae4967651d690a2e32ec9c6, +98'h312f6ca277da65afba4274948, +98'h2632c00c6a4afc14941f6f083, +98'h37171f2e29063a12180756500, +98'h22c4dc05b26e2924d54cc14a9, +98'h13d11967954d6beaaa47a1549, +98'h20e8b601e13c9482508952a10, +98'h3c918c393027be207b2e52966, +98'h11f86363e384e3070d5f519ab, +98'h091781523a2620b470cf6881a, +98'h2227da847a178034170fd6ae1, +98'h3f24e13e50791460f3e77d67d, +98'h28fb9f11f753252eb813b1102, +98'h34b03a295df5d67bf4a984295, +98'h238c26873b6723b6d7bcd28f7, +98'h03b24b474e94455d0491a4291, +98'h3ca001b96d4d6b9aba7b5b550, +98'h29e14913c30f8c462b3c35568, +98'h1ed6c3fd9cee5479cef1461dd, +98'h3e9be83d358389ab1d07dc7a0, +98'h1fceab7fa1d02303b067b3a0d, +98'h05b6234b7590f52b0ed1c61d9, +98'h0c5f0a588524564a4460d828b, +98'h0ac9c4d5a6c24a8dac6303d8d, +98'h29b16c9351f4a963cee9857dc, +98'h3a1cad342a9b7095192e07724, +98'h293383125ea1dffd51f558c3e, +98'h161edd6c24ee2109eec33f9d8, +98'h020bc7c403d64ac7817884a2e, +98'h0ef23c5dc0bd10c143ebd347c, +98'h2deae81bda7e14f4f21a3f443, +98'h205e1f809227d6e44ca17d993, +98'h14c3ece9804744c08542cc6a8, +98'h0e00955c128995e528228ad05, +98'h0f2521de649b8a892cf02b19e, +98'h197f6872cb2463d64928f3124, +98'h3d9bbd3b3af5c435fe24605c4, +98'h3eeaecbdfc637138fed3977db, +98'h10bc48e17ee546bdd3e863e7c, +98'h1c748478f7edf1afd5189d8a2, +98'h2d19c99a3600e62c38c6abf19, +98'h080ae8502674c38ccb9feaf73, +98'h24a5a689687bbd90d34859068, +98'h335e30a69b54d976b3acc2875, +98'h37a2532f5dfdb7fbf56802cad, +98'h393d9d3253d85ee793457f067, +98'h3e82b4bd25d1d48b991522522, +98'h02311ac45a10a37407106f8e1, +98'h2fc04b1f8b6c3556cecb201d9, +98'h35a08fab67f2c20ff764d46ed, +98'h34e21aa9eeb9e09d78e6fed1d, +98'h24cadf09a291090531d6fa03b, +98'h1c9e5279069c4ccd28cea7d19, +98'h213eb50242fb20c5c90e75720, +98'h3930b2b27762a62efc24d6385, +98'h3d770b3ace7ef3dcf2fd7fc5f, +98'h0dafb95b5b02da760a2ca4f45, +98'h27ad728f46b459cd4b9873172, +98'h1f5a85feb9445b329627b84c4, +98'h20e41b01c6ed7c4dc9f465d3e, +98'h3c8981b936feab2dfce20b39c, +98'h20999c810455ff48a93be6f27, +98'h1e1bcbfc10fda3e1cbc65bf77, +98'h3c887d39243aeb087830da106, +98'h1deb5c7bc50d7cca28be36518, +98'h0744794e84a551c942fa72c5f, +98'h2101ee823620952c75c8a0eba, +98'h04778d48f2a1b9a54dc651bb8, +98'h32f8aa25db70fbf6d39a69872, +98'h29f0bc13cb3e42d64d4bbfba8, +98'h351c87aa01efb543edc30f3b8, +98'h25a6988b74799128f6880a6d1, +98'h1ba17c774f43c55eaab950758, +98'h263f8b8c660c728c3312ff862, +98'h095e5f52aa0af7940cda55b9a, +98'h29a1dc936b284a16553289aa6, +98'h1b3b937667fe660ff0ce7e619, +98'h377d7baec9f43353f05c6bc0b, +98'h2bae6e17440cc1c82beecbf7e, +98'h28b186115fc2edff921d1d043, +98'h304b60a0a06c5b00f42deee86, +98'h0bdf91d7adab849b4e62c59cb, +98'h1ba8de775716e96e2caff1f96, +98'h176eb26ed45eb5688af359f5d, +98'h107d0560d211126408a385f13, +98'h05b042cb43c31847825cd6c4b, +98'h3c1007b8304fb2a0bb17ee963, +98'h2cc86d99b712092e18f69db1e, +98'h09cd51d397fce76fe8728e50e, +98'h3d6c73bae4df4e89b892f0912, +98'h1bed73f7df4ed2feaecf11bda, +98'h0d78b55adfa582ff4b478e168, +98'h39e2c7b3e612278c17fd3bcff, +98'h09d079d3ab2139966d3c6cda8, +98'h0062dbc0ef7a6f1eebf752b7f, +98'h19e976f3d0f4eb61eab798957, +98'h3c9697b901ba10c34f942a1f1, +98'h02d51945afbf9a1f6ca52cd94, +98'h082b285063541c06aadfd115c, +98'h2b898e1727003b0e34a272495, +98'h22ada3057909cf3216eddc8dd, +98'h249c88090bcfe057ac1b1a183, +98'h31cb72a3a6b5df0d7620546c4, +98'h3e91c93d0aac9c55724f9964a, +98'h31c17aa3a557800ab5c63eab9, +98'h274f6a8ead3f2d9a5523a60a3, +98'h3d74033adcff2d79d69ccc2d2, +98'h3539e4aa743566a85a5bd2d4a, +98'h1e595f7cb63f302c552623ea3, +98'h10e9d661c0fb53c1c4794a88e, +98'h139154672031eb004cf0cfd9d, +98'h115d8de2b54d23aa91aaac634, +98'h213342027217dd2414d2c7c99, +98'h35f84fabe34bd286b651088ca, +98'h090d0d5235ff6dabcfc31ebf7, +98'h3191612333ee8ca7d95ffb72b, +98'h38bcc43148d8735190654de0b, +98'h0e44cc5cb75adbae9167ea02c, +98'h0a3f08546fc57a9fae8120bd0, +98'h0ea7ebdd6edd8a1d8f615d7eb, +98'h17bc366f466cd04cc78a41af0, +98'h3273b0a4f6ee4fadda588014a, +98'h258e4e0b1a7b46f4d002653ff, +98'h26a6ab0d54d835e98edfb83db, +98'h322999a4617ac002f4e91669d, +98'h0790d24f3b50c03690b864a16, +98'h1ec2177d938e76670c9423792, +98'h322b0ba46777d78ed668b8ccc, +98'h09379f52539700e70733a80e5, +98'h0d8c755b306a6e20cf7db8def, +98'h2402cd8807b01ecf6aecbb15e, +98'h313f6b2252c1e96591005521f, +98'h078ca84f17ea3eefe7ddb9cfc, +98'h35a84fab530a49e6122ca6645, +98'h2d8b091b1091c5610f87339f0, +98'h0ca015d9526913e4e7c24a6f9, +98'h2eabc51d5d46177a92fc7725f, +98'h15d485eb8b5ef4d6a84cdeb09, +98'h010893c216925eed05e6bcabc, +98'h387048b0edbe2f9b598b9e130, +98'h068db74d28aa16916bcdf377a, +98'h3dfcad3be49fc00918a71b513, +98'h01ad65c34b5b5056a3422d868, +98'h355f312a83514646ae2c1ddc5, +98'h3069efa0d538bb6a5168aac2c, +98'h2444ca0892e5ace5edca9dbba, +98'h25f0a88bc26d6ec4ca1785d42, +98'h3d3cec3a4d4290da929fdf453, +98'h2daf8f1b4e9c70dd0f12fffe1, +98'h0d36525a68346b104d5aaf5aa, +98'h1bffb577dc9dfef92e276d1c4, +98'h17ff866ff74377ae93d0bf879, +98'h1c2e677852dc9565abc2bf378, +98'h04dd29c989b35cd343a421a73, +98'h15df146bab83b6171058b2a0a, +98'h0637fd4c4f47945e855fe46ab, +98'h186ff7f0f8a274b154449b288, +98'h2dd4a69ba616928c34face49f, +98'h263b7f0c61d3b9039203ce03f, +98'h1df73d7bc9e5afd3c9f73b53e, +98'h2740730ea6ee4c8dd38bafe71, +98'h1b448df69e37ce7c6e5f171cc, +98'h06eadecdd5ae9d6b47265f0e4, +98'h2723238e4368c346caa2f9b54, +98'h3767b92edb3c4a7654a900e94, +98'h1ace137580df7f4186eb64adc, +98'h121d4c6409dd67d386fead0de, +98'h343b7e285690f6ed32b31d456, +98'h3c925bb90b1989d631eaf963d, +98'h0368dd46eabdc7954b89a9370, +98'h273e100e62fe8c85f28f27251, +98'h248f08891204a4642da4eb3b5, +98'h146a9b68de29197c6ca4ed395, +98'h0e2fffdc4b9378d72670de2ce, +98'h2484a3891da2f17b7089e5412, +98'h2ce07099c57154cacc9471592, +98'h16e1696ded98f51b311e97a24, +98'h2e1f001c018b12c32bea84b7d, +98'h0e35afdc4a5aeb54862426cc3, +98'h337b52a6cf5cc05eb0b604c16, +98'h22a7660566070a0c322b9c046, +98'h0bbed3d76bc1c697ade0269bc, +98'h2c940d9904b33f494c51d3389, +98'h3cb93cb944a5d1495057c380a, +98'h26d5e38d98d635f1afeb065fd, +98'h39c2df33850075ca0fb0d53f6, +98'h1981c6f30a2221d448e8fa31d, +98'h14f6ab69fab59f3553eb12a7c, +98'h1ac7e1f5b9f344b3d52ec9aa5, +98'h2795f78f07a4b14f4bceaa379, +98'h26d1130d85e438cbcb2d52f65, +98'h14f80ae9ed60741ad0961fc12, +98'h052312ca7709f4ae0f0b41de1, +98'h06d761cd8bb9ba5744a447093, +98'h36455c2c96c9986d9343bd268, +98'h0dbeb8db6976c892cdcd605b8, +98'h2310d6060529f14a4a0eb1d41, +98'h08c7d351804180c0a24255049, +98'h0c443ad883f2c5c7c40dc0281, +98'h18ce02719506466a2b751236f, +98'h30a73e2171dbd8a3b8a0c5b14, +98'h08a6705150ada6e1465505cca, +98'h1636786c457db64ac6ed0badc, +98'h39e02433de4ac57c960aba6c1, +98'h03820b4734a637a94e0a10bc1, +98'h27fdce0ff7887d2f17e192cfb, +98'h0d990d5b3622ceac70eef701e, +98'h2f0b4b9e0a4f4ed48e56a69ca, +98'h188baef12e028a9c11a38e634, +98'h11e0f263ef4e049e904bbdc09, +98'h10be236172c1e3a590e001c1b, +98'h3c5695b88c3f1c5872256c844, +98'h25f6490bf0c23fa1b5ae222b6, +98'h0a1851542274ee04eb234fd64, +98'h3a3e12b45cdf3b79b5c7538b8, +98'h2fbf0f1f7e66963cdb8969570, +98'h3264ac24e2e3b285f55217aab, +98'h1d3ed07a6ba79b1752399ae46, +98'h301864a02510890a354a3b6a9, +98'h0aacb4d545e4564be42442c85, +98'h22435784b2d73125b546a22a9, +98'h36cec42da72d1b8e577ef7eef, +98'h1384d2e73259f3a49177b1a2e, +98'h2dd7741b9a0a247431f86623f, +98'h1c517e788e33f85c4aa15db53, +98'h121ef1e40682324d2628490c5, +98'h2a744514eb7b0e96d57bd4eae, +98'h149c29e9186dfaf0eb4289368, +98'h1659ff6cb6dd34adb34dcd069, +98'h2b4f8e9687224e4e6c9c77394, +98'h0bc1d5d7972bdfee48bb6d717, +98'h1cc1a2f9beab013d76db290dc, +98'h0b1c6cd6039703c703acdc274, +98'h05273f4a5d80927b08a9f4715, +98'h0713ccce3849dbb08fd76a1fa, +98'h07ad9c4f52d291e5a6a00b8d4, +98'h0a660754c90b725204dc5e69b, +98'h08e018d1d530cdea478439af0, +98'h316ca322faf4e7b5db1862b62, +98'h1209c364338d35271165be22c, +98'h045ac048983f7cf047268f4e3, +98'h34e4a0a9d74082eeb30948e62, +98'h2f6c029ef79c58af19c216d37, +98'h2ed8b49db8eba3b1f9f11613e, +98'h20ee3801ef78111ed41992482, +98'h3f7ccb3ef7bfe1af5dcf2b3b8, +98'h063fc3cc40fbf341e1ceedc39, +98'h22fafd85fee7c7bdd878b150e, +98'h248cc0892a8f0b9513c6f3078, +98'h026afd44db7acc76e779726ef, +98'h2c44ef18a208ed04139377072, +98'h2e241a9c6295b885142e74c85, +98'h12f45a65efb8399f70ab25015, +98'h34790ca8f6e1d2addad6b7d5a, +98'h0258bec4a0ceea81a8c9ea519, +98'h1e3f79fc6b04c09612510ea49, +98'h313db5a245b6584b4dbd037b6, +98'h25f53e0bd723366e4f461d1e8, +98'h0ed99add8b3d01564685a70cf, +98'h1a4576f486d0584da84573d09, +98'h38153430308014211a2552144, +98'h251f460a1673e86ccee4cb9db, +98'h03581c4682e2b5c5e18eb4832, +98'h21805f03376128aed63861ec7, +98'h3723e72e61550a82961e3c6c3, +98'h1f854aff0c8889590b0375160, +98'h05f80ccbec9cfd190ca542793, +98'h2c417018b2de0aa597c7deaf8, +98'h1aa88ff57742c8aeb47ad6290, +98'h0550dfcabc3e6a387063d280c, +98'h2781648f19333cf2702d28606, +98'h0b05d6d635cd072bb034b7807, +98'h34409da8bd19caba3c569a18b, +98'h23840a872f748c9ef4be25c98, +98'h1f214dfe6be44917d2c165c58, +98'h110bafe22d64579acf9c01df3, +98'h17e1336fc1d27e43a66cec6ce, +98'h1a2640f46214a1042f0eb87e2, +98'h14db2069b3e367a7f22fa2046, +98'h075707ce938b64e706b89b2d6, +98'h0e00215c186240f0c99898933, +98'h036166c6cd4c095aa42b5c086, +98'h33a965275dc54cfbb45bac88c, +98'h1526dcea458bc7cb26aca92d6, +98'h0bece857fc005e3811fb51a3f, +98'h108ed16113f4d567e920e9b24, +98'h2c4ed61891dd1de38f8afcff0, +98'h3ada1ab58e72495cf2531904a, +98'h1359b96685db144ba64d336c9, +98'h12344664412ec64264d8c329b, +98'h01d75bc384897049019833032, +98'h2c449f988e1fe25c2e99207d3, +98'h0a147554113c8fe266d4414da, +98'h0ff0fa5ffa284db4728652051, +98'h28c90f11ad71481af58e95cb2, +98'h077437ced60abbec075fbceeb, +98'h0aefadd5db1fedf62983e6f30, +98'h055a91cab4178c280e5c877ca, +98'h320539240ab11b554f2d951e5, +98'h14e5a069c4af2f49666533ecd, +98'h20dba3819a363af44ec4779d7, +98'h08ca2251af63529ece0b5d3c1, +98'h2a59529484f7ce49ebd44837a, +98'h2e29861c58b0c5f171b693037, +98'h0d2f475a7c5b74b89262af04b, +98'h111930e228fc2291ce8554dcf, +98'h07c0054fb993b5b33054eec0b, +98'h17f986efe4ab37896f292f9e5, +98'h2a213a14667b878cf42730685, +98'h3f4eb23ea2e52c85d88cf7b11, +98'h2d52291a9f6f97fed33070465, +98'h0cbd2e597cb36e39725c2724b, +98'h2a70cd94c3e751c7eb9607d73, +98'h013c0bc254ed5269c58a578b0, +98'h3ee7c7bdebffa817fab9dbf57, +98'h247efa88e688820d12c1df257, +98'h273f020e62199e8432562824a, +98'h120a1264069823cd26288d8c5, +98'h2d691a1acd1e8d5a2ea1e9dd4, +98'h3751582e8574bd4aef31855e6, +98'h1d1788fa05ec2c4be8c0ed518, +98'h0db60a5b4336e246643b3b287, +98'h14cf8969bcda5ab9b46a7908d, +98'h0723a4ce6ade9795ac808f190, +98'h2929c212573ca76e50199a602, +98'h3c7ea9b8c9317f52716c0a42d, +98'h34d6ada9a4319608564210ec7, +98'h2e072c1c2489bb0914a439c94, +98'h07b1c04f7001ac200decdb1bd, +98'h2b411496857f9b4aec302bf86, +98'h3d5d513ab1c034a39bc761778, +98'h3de42c3bd188006333db0b27c, +98'h049143c90bcfc957a41843483, +98'h15c5e0eb9c518778ac85da191, +98'h17766ceef95c9b32b434c2086, +98'h2e9ed19d36da6fad995e5052a, +98'h3f18bcbe04ce7ac9b0f9cde1f, +98'h17fe136fefe9449fd1f9d603e, +98'h042a284861a49e836973b1b2f, +98'h27ac390f7cc24339991b9f123, +98'h12004d643b1d2d3633475ea69, +98'h0b30205646a3844d6474e928f, +98'h19e6ddf3d47a83e8eb9858773, +98'h221770842dc1e31bb3f654e7f, +98'h2090c60133a83e27550e410a1, +98'h2414ec882130a702515164e29, +98'h19a216735772006eec4505b89, +98'h0ff674dfc04de940841117881, +98'h39fca833eb6dfb16d95aa8d2a, +98'h16e4ceedc1fdbe43e638a34c7, +98'h04a989c9612d38024975b072e, +98'h264f318ca42e1d88529f53c53, +98'h33e92427cc33a058700731201, +98'h36548aac96cd8a6d934885468, +98'h0c2422d870a9c1216f3378fe7, +98'h166c856cfc8e79b934bebfc98, +98'h0d271b5a5faa5a7f6b345d767, +98'h3282552525817c8b1600f46c0, +98'h2342f8869b7da076efb0263f6, +98'h33a33c275fc026ff94d8d8c9b, +98'h199c1ef30e04475c29e81993d, +98'h0cd2d4598d12b65a067962ace, +98'h2d22559a78044a303949a7f2a, +98'h3287142525aa7d0b760c644c2, +98'h285b6f90a4f97389d35538c69, +98'h05be1bcb5bbb07f7485e48f0a, +98'h2f5ab21eb87ba430f9f59593e, +98'h1e8fb8fd3dec063bd71eefce3, +98'h04eefe49d43cdc68664af6ac9, +98'h398cb1332b4df2969936a8f26, +98'h2241b784bc1103383794aeaf3, +98'h132dc86676ab7b2d727650e4f, +98'h24d06c09bc616eb8d84c76b09, +98'h110489e224c1a789ad718c5af, +98'h27db3e8f8ade2c55acae5ab95, +98'h354fcf2a8d18c4da309a25013, +98'h02120ac41d2f077a47d0448f9, +98'h1b060a763be80837d5bb84ab7, +98'h227a5004e1d65383911428e21, +98'h1a574a74909dfbe12abd51957, +98'h1437da6860677300cd27d35a4, +98'h141907682457a488ae1c2afc3, +98'h141225e823a31f076ded513be, +98'h397da732d1c069e392cf84459, +98'h08408bd0adfb6f9bed8efedb2, +98'h10e9c6e1f084be21305ba140c, +98'h1f3727fe7371a426d4aa33094, +98'h34a9422945b187cb4e96b27d2, +98'h08de80d1a6afa98d6be38a97c, +98'h30b5fca17c0a46383b3010b66, +98'h32cfefa5aeaf669d785fd590c, +98'h35b268ab778ffdaf3b509996a, +98'h17e0c96fd231be644a84a1f50, +98'h2ca9cf197222dd2457b32b0f6, +98'h197645f2eab75c15510b68820, +98'h0d1857da1058a5e0a75c3f6eb, +98'h29cc2793bd9d3a3b39da5873b, +98'h092cd2527151d422ae9fa99d4, +98'h1588246b0b6ee9d6e83dc3908, +98'h2f263c1e6e87889d376b712ee, +98'h24a40b8977709a2ef705296e1, +98'h1e1f0b7c3d3c2cba56d6ce0d9, +98'h22e8b285f7d2e3af96aee58d5, +98'h1c8833793668deacf4bc44898, +98'h12e397e5c5f24c4be635790c7, +98'h1b05ef761fb1977f4eade1bd5, +98'h27714b0ee1749002d23976c46, +98'h335049a6b41a11a839da96d3b, +98'h0ba69b576505ac0a0c2b11d85, +98'h1c29637849e57553c983b6330, +98'h0b1276d603e6a347e3be46878, +98'h156b7c6ad83abaf06b698dd6d, +98'h01029842087007d0e25ca804c, +98'h15a0bc6b76d7d72db31e24e64, +98'h20a4ed01711a42a2346fcbe8e, +98'h0186b8c3084da250827516c4e, +98'h158fbf6b0f8d9bdf294756d29, +98'h094fbed2bfee7e3ff24f8f44a, +98'h386a9930efac029f5a05a6f40, +98'h2b63db16ebc9c117b5cb670ba, +98'h0a21f1d44776954ec46621c8c, +98'h2cd3a09984bddbc94c645f18b, +98'h253f920a6020e88071581ea2b, +98'h109eb1610edb415da7de7cafb, +98'h04b1c04948941151035174669, +98'h14600668f702102e32d885a5c, +98'h2d7b221ace1369dc2ee3a2fdc, +98'h36e1f7ade3d47a87b6ad9c8d6, +98'h21756b82eca51c997386a2071, +98'h278c048f0bc7ecd78cd4fc59a, +98'h1080c1e102506ac4a4b44b297, +98'h308c5ba11c4ef6f89336d4a66, +98'h2f29e59e4a33b4544e57667ca, +98'h150f216a02c5f2c5a5f5450bf, +98'h3a011a341ae440f5d53956ca7, +98'h34c57a2982fc6ec5edf07a3be, +98'h278bce8f1279c5e4ce81651cf, +98'h2a6e5094e4e55289d3d4e8c7a, +98'h2beb0417de17b07c3280ad250, +98'h0802e0502f27cb1e6dcaaadba, +98'h2500778a1eb62d7d50eda941d, +98'h2498f8090afaee55ebe4f997c, +98'h180c88f02d5cef1a915a5e02a, +98'h21fd0a03dae625f5ef38cbfe7, +98'h066ee24ce9f1b813ec1826983, +98'h3e75ecbcedb0559b7b0990961, +98'h1263e164ed2ca19a6fe420bfd, +98'h2e14659c14f7c669f0c30b018, +98'h2248be84a4342388519f38833, +98'h32607324ef9cca1f387f4f510, +98'h3520762a66d2dd0db6fcd4ce0, +98'h332650267759272eba9fddd54, +98'h19c36ef3bc291cb8557b22eaf, +98'h13954067028e3d452588df6b1, +98'h3f53e13e992c26f27620020c4, +98'h1fd215ffbb83f03736d5818db, +98'h0d4102daac3540186e5d90bcc, +98'h148f796939024f3213647226c, +98'h2752ea8e9d52737a912957824, +98'h282df390755ffb2ab7637baec, +98'h22e93b85c7fb1acfcab915956, +98'h3f55b3be84cf5149910941420, +98'h09c68bd3b43a27a86f802cdf0, +98'h11ec1763ede4511bcff41a1fe, +98'h00728b40f7502a2e8df0ad5bd, +98'h14b6f3e953fd44e7ea2d0e345, +98'h0e6ced5cc23f1944642b01a85, +98'h3bef9d37c6682a4cd095f1e12, +98'h091b11d23ba1dab7512f3b225, +98'h3777aeaeecceda19b911a2322, +98'h0b8a68d72da18c1b6e4afd3ca, +98'h1e51927cbda3f0bb56fd60cdf, +98'h20d1a0018cca8a59ab670a96d, +98'h386ec9b0d9fa7373f49a4f493, +98'h210a870204f336c9c97f6f72f, +98'h2fd5f41f9f623c7ef3ce0c27a, +98'h258eb80b0a5684d4abf94f37f, +98'h08929951281320102c296e585, +98'h3451012882743cc4cdb14f7b5, +98'h0dd0af5b97e0d6efe96c6192e, +98'h3fdd8a3fae39079c7b85a4770, +98'h05f5e34be521a20a4ac5e1558, +98'h25babf8b71603422f5c6bceb9, +98'h337aa126d3e1b8e7f1d71683b, +98'h1b94f7f71df1407bce618e1cb, +98'h08b4dbd1436d6ac6c30891a60, +98'h08cedbd1aa2b21144cbe7f397, +98'h3db6963b466c0bccd108a8820, +98'h09c09153a71f4b0e0c37f7186, +98'h04d228c9b0759a20cd51f0ba9, +98'h181f9ef00aae795568b386116, +98'h28464b909d3d287a7160dd02c, +98'h3cb997b9648935093850b330a, +98'h0603de4c211a020229c778139, +98'h0ddb815bbf4620be934868868, +98'h216f6e82dce99779cf96417f2, +98'h3f6ffcbef88ffc313dfffe3c0, +98'h3a7081b4c3f422c7ef99291f3, +98'h3a0e2cb421dd6d83b6fae68df, +98'h01109bc20dae125b43afab875, +98'h38e360b1fa148c343cbdfb398, +98'h315c0822bae02e35db0f0d961, +98'h1f9179ff23ec2487d0df67a1b, +98'h2026608051f081e3ec85b8991, +98'h3ccc14b9a0ccc281976635cec, +98'h22c4d685acb6041973deb6a7c, +98'h10ae716168637a10ee447adc9, +98'h3dc03a3baf70ff1efb4c4e56a, +98'h1a741a74ee086d1c121f21e43, +98'h04f0c249f03236a06d48be3a9, +98'h346e4ca8e28b140535be582b8, +98'h0e6594dcc42ad34864a41a095, +98'h0ac021d5bee647bdd2699a64d, +98'h24ea0f09c10f0642097e4552f, +98'h0d9b74db3ece06bdb31a5ee63, +98'h02eacdc5cfe576dfe4b411297, +98'h0e688cdce4f8ff89ccd86319a, +98'h26ec738de04d640091ce75e39, +98'h0c7282d8ca77d754c5ba968b6, +98'h03b632c76b759296cbcaf1578, +98'h3d626bbad25c31e493efa767d, +98'h03c213c7b0adf1214d1c013a3, +98'h24033f083f617abef8d92e71c, +98'h0d74ffdaf6ae00ad5108c0220, +98'h38787fb0d6396bec73ac7ae75, +98'h081084d01059fee0a61aa0ec3, +98'h0c41a358888e56512533fe6a7, +98'h0c4061d8b600c9ac30904ae13, +98'h1e143a7c16bd2a6d4d34593a5, +98'h0a95cbd520bc8c814ad496159, +98'h09c6d85384b93ec963a005c74, +98'h023276c448d0265182c0a7457, +98'h1336bbe6657bd98aee2ca55c5, +98'h3e555dbc9d8b4dfb16f82aede, +98'h044236c8bbd178b7b004ebe01, +98'h366b4b2cd16f7f62d1f6b2a3e, +98'h21a1d5037b46d7b6973a2b2e7, +98'h35b51fab53ffa167f26d3044d, +98'h249a47892c67ba18d44080687, +98'h1985dbf317d46def8c569278a, +98'h1c31087858717170cd289e7a4, +98'h1b8a66f73b3f993675b2800b6, +98'h23bdc487460b274c0a723af4d, +98'h3c7d1638dff7bb7ff71d346e3, +98'h2a628514f685e32d383a1a108, +98'h1716f7ee1ef6f67ded837b9b0, +98'h232496065596556b0e2ebadc5, +98'h2700d68e1ce66079d0f9cdc1f, +98'h0c102dd8286a5a90ed1ea21a4, +98'h3ff6073ffd2029ba7f458c3e9, +98'h1800d570186c4970cc1b47b83, +98'h0a3aead45982867308ef5c51d, +98'h1658926cb5f5f4abf313a1c62, +98'h36f93aade7fd540ff7bda3af7, +98'h021fcb441ba57877677150eee, +98'h3d040f3a1ff485ffd73e254e7, +98'h1ab7f3f56ff5be1fd2ab6c854, +98'h28f5a791ed41471ab58dbbab2, +98'h177af16efc2cc73854e9ee29c, +98'h1e88f17d18cbe7f1add5365bb, +98'h195143f2a9a1b39350bcbde17, +98'h3080d221336882a6d8fa5531f, +98'h3d78ef3acccc8b5992915ea51, +98'h2c5f2d988ad065d58dcbe4db8, +98'h0f6722def481c32930fa39820, +98'h3b9dafb72e42391cba77fa34f, +98'h18de9f71972b88ee4c028a17f, +98'h090a51d21482e86927634e8ed, +98'h2304e1862bc2c897b3b1ea877, +98'h0a59a554bba94a377180bbe30, +98'h2d700a1adcb9f5f9528a80050, +98'h1ff0d9ffe84e8890b20fd8a42, +98'h1cd782798bfb91d7ea34c5146, +98'h0b598756a96d4792ed31b3ba6, +98'h3641682cac8e761938b3f7917, +98'h03c133c784698fc8c20ab0e41, +98'h1136b4e24461db48c566240ac, +98'h0b569bd6956b726ac83083905, +98'h0fb8235f53331fe648bad0d16, +98'h1446bbe88f66765ee8eb4c91e, +98'h095ddad29e6f527ce9f34b53e, +98'h1c8b96f908d7bb518958d492a, +98'h3c3bd438596277f2f567930ad, +98'h28aebf117274e5a4d6c8e92d8, +98'h2dd5049b88f693d1edb2e61b6, +98'h0b119e561fb5c37f4ab1d8755, +98'h3c9743b936b4722d5cd2ed799, +98'h2b3d7b167a52b6b4b9640c72c, +98'h2309f38603a82cc769ac88136, +98'h232d46067d81dbbb382bc8706, +98'h25096a8a0d3b745a6c9137b92, +98'h03731cc6f7ecf22feed803bdb, +98'h39191932180799f034482cc89, +98'h3e8b943d000a05400fa5665f4, +98'h080672d0331153a62ec5f19d9, +98'h1ba0c0f749b0d1d3495464b2a, +98'h3fc695bfbcd048b9bf25b79e5, +98'h3d6efd3ad176f0e2d3b97b876, +98'h3fa8b43f7ed4553dbf9f425f4, +98'h3eed743de68cbd8d395e8c72c, +98'h3fa73a3f70ca95a1bc1c73f84, +98'h00cc6641aa84ff150ad45955a, +98'h0ed1b85dbc142d3812b979656, +98'h3ccb33b9b3a14f275c1b20b83, +98'h09798852ca10ce5424e295a9c, +98'h2a58241485ed424bec1159982, +98'h02fb3845dcaf01f967ea8e8fd, +98'h2edbed1d9da24ffb531f8f463, +98'h3caeb03966c42f0d98dcb7d1b, +98'h1782fbef35fe7aabf3605da6c, +98'h2fb81c9f6c1e669836f5a0cde, +98'h2e467c9c9ee7b7fdd34b8d269, +98'h162393ec5c31e5f84c955e792, +98'h3c6722b8fd6618bade734edce, +98'h0ce57f59f9b461b351a678434, +98'h357bafaacb2eb0d6702a98205, +98'h0809c35031680ea2ee5c747cc, +98'h33a53d277c293e385bf39ed7e, +98'h308ba7a11ec867fdb3d503e7b, +98'h1b6b4376ea0a9314315d75a2c, +98'h0c007fd8223ab6844b8ecd971, +98'h083160d071cdbc23ae7fc73d0, +98'h0d6f10daf5d45dabb0d0dba1a, +98'h0528e44a5905e872078bb32f1, +98'h105dbae097b8dbef6a05a5b40, +98'h2e10121c05b3134b4cf0c959d, +98'h0f5161de8781984f25b4be8b7, +98'h1b012ff61e73697cce5d265cb, +98'h11a714e3731169a6312e1fa26, +98'h0f0346de369b742d3167aec2d, +98'h1de274fbe2a5dd05502214804, +98'h3dfeb23bc5eefecbf0fb6c41f, +98'h213ade8277e83eaff648c74c9, +98'h002763404264c044c0a308e14, +98'h3f6152bec430614870e46d01d, +98'h2adee9958f8ec25f0e9b6afd2, +98'h0a291a54531b26e60751104e9, +98'h25803c8b06f188cdeb1c71564, +98'h03ed33c7e406c88809fcff13f, +98'h2777420eeac3fc15948ecf891, +98'h353c77aa6af6df15f80cd5b01, +98'h387617b0cd420edab16e09a2e, +98'h128682652bd22917af962adf3, +98'h078a19cf25ec258bcb5d8fd6b, +98'h1d3358fa55dc156bacc3db998, +98'h1642aa6c9fbd427f4d7ffb3af, +98'h20bfd5814cbc07d94b5ef756a, +98'h060bbc4c2b91e8172c676918d, +98'h1428cde8445465c8861f4cec3, +98'h2b4e1816bca9c53979fdf7540, +98'h0e1ef85c191b597209ce94738, +98'h1fd7677f965e1c6c8d8d60fb0, +98'h0b2d97d65b975d7709b13d535, +98'h007bf7c0e5d6e88b8994b8131, +98'h0c2de258771182ae30cfd941a, +98'h0cd447d994b8cae9486344b0b, +98'h3d11283a2d7f799afaa428754, +98'h1f684cfefe75ad3cd7777e8ee, +98'h2c3bbd18711759221754c58e9, +98'h248a7a89051a2d4a2a6929f4d, +98'h0d5a9fdaaaef2715ce1271bc1, +98'h32948ca51821c3f052ad94255, +98'h1bcde1f7997a2172ed5200daa, +98'h2b280c96640bac0813ccee279, +98'h1c71cff8dda5c3fb6e85e4fd1, +98'h36849c2d001a8d400da7ca5b4, +98'h08c0d8d1a5c8908b8ba25a574, +98'h33f5fba7d4d8e0e99233b7245, +98'h01f83843e6849b0d0a1f34d43, +98'h00cbd1418dac1b5b439dfb273, +98'h16195bec172fcbee6b5249f6a, +98'h363d33ac7df0943bdd0b71fa0, +98'h0e520bdcad43eb1aaee57dbdd, +98'h1209f06422c82e85ad3487ba7, +98'h3a85533534c867a9bbd36eb7b, +98'h219b920321f5bf83d0e45461b, +98'h245f29889e97e0fd10bdc2a16, +98'h17d82defbfcf37bfb5e9d96bd, +98'h118cd8e30cd36a59a79810cf3, +98'h2ec8e49d8e808b5d0f525bfea, +98'h2c642418c5c5984bac8a6f192, +98'h33a62fa77b8958373bcbe1f7a, +98'h187334f0e1e74703ce969efd2, +98'h19cbe773a98f509330d6ce01b, +98'h11233be27ea81fbd53f2d6e7e, +98'h0b870a57204f6100aaf59ad5f, +98'h3fc7e03f990ce3f21635310c6, +98'h229f470516a7996d4e51b81c9, +98'h282561906d25739a7552b54ab, +98'h19ee42f3df63d37eee54859cb, +98'h2aa784156dcc959bb61d066c4, +98'h2146a1029ca71cf96f7b6f7f0, +98'h163336ec571380ee2b51adf6a, +98'h215cce02bb7bdf36f7362b4e6, +98'h24acfa09612b2182517606e2e, +98'h2a538314a544c58a93e61227c, +98'h30fe0c21ed8d241b17a2cc0f3, +98'h18fe11f1fb786636d51d9e0a2, +98'h07924b4f0896bc51040a41e80, +98'h30da69a19f41abfe940705680, +98'h0ef8e25dc2b72b45446c0368c, +98'h1734e26e664ef98c8f60f6feb, +98'h3981afb311c40b6392d16ec5a, +98'h02d7c145bc4a18b88fc8767f8, +98'h26616b0cd8f55371efd5af9fb, +98'h2f18841e3922dab25a0ed7b41, +98'h1d1690fa007b22c0e7646ceec, +98'h2d04e71a338685271822db104, +98'h0c7906d8e88f47910d42139a7, +98'h25e1ad8bf88df931179be9af3, +98'h3c0e87381b54887695d8c3eba, +98'h031d28c621dc9a83893e70d26, +98'h15edc6ebe8c5a7118facdb7f5, +98'h154782eaae19f71c10d85e81a, +98'h25aa5c8b6c663098f48423491, +98'h3992c2b310e031e1f29cbd254, +98'h09736bd2d956fe72a8b29a916, +98'h3fcc98bf92e925e5d4ad6fa95, +98'h29bf09936ae08115f527e2aa5, +98'h2db3e21b5d74537af2ca0d659, +98'h058c674b3974c932efc04c1f8, +98'h0bfbf4d7d88f85710922de923, +98'h0976b7d2d29b4e650704818df, +98'h293fa412671c388e3416f7282, +98'h2a82d995092876524cead3f9d, +98'h0b960bd7311bc6a20f2c749e4, +98'h26c1bf0d9e92ddfd11552742a, +98'h1e6b15fce0fc4a81cfd9d81fa, +98'h099194d3222861044aee7d75d, +98'h23adc28767504b8e92bf83857, +98'h2b77a916cb54e3d68db3233b5, +98'h095633528d8b22db25b8558b7, +98'h0a3d1854651cd78a2bd67bf7a, +98'h1ab56ef5480c245008b064d15, +98'h11282f62765d862c91e16d63b, +98'h13f0eae7ddf288fbec78dcf8f, +98'h26dc968da8551690b3cc6b479, +98'h017bd442cde412dbe3d7f9c7b, +98'h229c39851f64597ef08024c10, +98'h095018529e20777c69dc23f3c, +98'h1152efe284ec4b49e58fcecb2, +98'h1c1929782feb869ff3012c060, +98'h0006e24000996241002811204, +98'h1572896ac68815cd26fea7ce0, +98'h00f7b541cf5e925ea41591e82, +98'h1fcc11ffa4ada289511e6d223, +98'h1ee6717de2d21605b06e21e0e, +98'h3e75fabcfc92be391ec22e3d7, +98'h1ab027f5788df8b134cf8829a, +98'h0ac6a3559a563674894736728, +98'h2e955f9d02a65a454c4eee789, +98'h343c19a87ac0f9b59bbf44d77, +98'h143838e844377b48461bed0c2, +98'h0aeb6355d50ac36a27fd89b00, +98'h3a8b57350b7d8356f18236a30, +98'h037f8346c97b8052e33ec0e67, +98'h239b888731d807a3b55ce40ab, +98'h187a45f0d4737a68eb3b70167, +98'h134e30669d8b55fb0c3661986, +98'h2958c412a1943c0312bb40056, +98'h3bde6937a5017a0a1837f8d06, +98'h19adaff351743ce2eac87b359, +98'h3712f3ae03bd07c76eb3fedd6, +98'h3433592841774542cd6aa79ac, +98'h07d6dacf8a1fa054247d9ec8f, +98'h1447776895159b6a2a5744b4b, +98'h230edb062e963d1d34694608d, +98'h0f32b05e6e0be51c2f4fa55ea, +98'h04358e4864ad36894a38b1346, +98'h220de084199dd6f32eeaedddd, +98'h26784f0cf8fe0bb1f7dd96afb, +98'h0507254a084594d0a3532e86b, +98'h09bee4d363d8ea87ab65f3d6c, +98'h0d38a0da56d9e0ed8904a071f, +98'h0037e8c06bfbf817cb0cf8360, +98'h373305ae5064fd60f1e600c3d, +98'h08b3efd14a9a595504d392499, +98'h29cddd138a9659d52d190dba3, +98'h00497140a664f78ce9ab9a336, +98'h36bf8ead5fe8f77fd5aa218b4, +98'h266b700ce8370f1053a89fc74, +98'h30ef2a21fe4892bc9bcdef379, +98'h15cce16bbd786f3af4d15429a, +98'h1b61ed76d32f8be64ba45e574, +98'h1e1ad67c0e37895c6b1497f62, +98'h13168d663ae78d35d37f86a6f, +98'h22c762059b6d33f6cf8d257f1, +98'h26103e0c0bc6f457ac75cc98f, +98'h35cf43aba0cc3481b5a6de0b5, +98'h26437b0c8bf4f9d7cc8e1d391, +98'h1e944cfd10ee8a61cbe0b5d7b, +98'h2c068e18246e9908f41d49c84, +98'h089689d10ea26f5d45ce3e4b9, +98'h0517d94a22b6398569f384b3e, +98'h000629c03e89273d0fa3d43f4, +98'h373bdb2e5fc8147f95c0fbeb7, +98'h16d828edad29849a71006b620, +98'h23e4fb87da9d5df50fa0965f3, +98'h1837b2f06b08301630cff8c1a, +98'h394711328ab82dd550ffcfc1f, +98'h3dde51bba647b28cb90981121, +98'h10a8a8e14fe226dfe822b3f05, +98'h370cd02e0bc23ad790b3c2c16, +98'h1db40e7b7b77deb6f64afb4c9, +98'h278ee58f147f2668ef0382fe0, +98'h02fa14c5e94b0612ab1146b62, +98'h22639b84f3d64aa7958e798b1, +98'h38c89e318655504c8fc77b9f8, +98'h335476269a82fc753375dca6f, +98'h10e6e461e6261c8c4dc3403b8, +98'h18f55df1cf58d5de8a138cf41, +98'h3fb97ebf7124dba27c3796987, +98'h09374452733c41266f1ce15e3, +98'h0dc02cdbb1723b22cfcc99ff9, +98'h09e78f53ff70c0bed2561404a, +98'h274f5c8e9e620a7cf16c59c2e, +98'h38263fb0673ef30e77d94cafb, +98'h07d7734fab37e3166cc3d5998, +98'h1a0cd9f41c646078ed9c4e9b4, +98'h35fbd52bd900947213bf1a677, +98'h30700aa0c4aefe496d47c23a9, +98'h0a2bacd44912455224cf7c89a, +98'h3fd615bf92967a65349b24093, +98'h065e74cc99ed62f3e812f5f02, +98'h1b6bf676e695400d10804da0f, +98'h37063e2e1ee842fdf57ba04b0, +98'h2ef34c1dff7342befb99a3b73, +98'h2739b90e503f8ee04dde51fba, +98'h015302c288a48551427de204f, +98'h0087fcc110d56c61a4575a48b, +98'h3ca4b6b9634d5f86b7fc85900, +98'h35d80eaba519618a16bc5c0d6, +98'h1e48e17c946e8ae8ecaddb196, +98'h34262ca85f4302fe94da4be9b, +98'h15bbbdeb6d2ae51a70b9a8c17, +98'h3fe0d33fe4395408590689d20, +98'h3794f2af0508fdca2f277c1e5, +98'h3e17843c2e30f79c5b121ef61, +98'h0f4bfa5e958258eb293394d27, +98'h299d5293223b0f8452f61885d, +98'h320b48a42e227a9c580b70d01, +98'h39b1273358aeebf1749804c93, +98'h0b0c35d62ce7af19edfcf93c0, +98'h05adcacb69886c930bcd8dd79, +98'h1aa5a47563878f872f8b4cff2, +98'h13b3ab6751852fe3294e36d2a, +98'h18676970f3a94da773042dc61, +98'h3b2e683666fa740df88a37111, +98'h024c7544ae17b91c2c190b983, +98'h338815a7020dc5440d6576bac, +98'h2b3dbc967f5d093e9aa6b1753, +98'h074c47cebf2a5fbe519da9e33, +98'h3dcfddbbab2a63965a3e90547, +98'h106cdae0c83d5cd0662a8dec5, +98'h31558a22a35d2606b52cac0a5, +98'h174a776ea572978acf2f43be5, +98'h0b10aed62363ec86eb9d26d74, +98'h0792df4f24dc57898b1bcdb62, +98'h3f7c5abec1355ac2702c6d605, +98'h27f6f30ffd9fb5bb1965aa32b, +98'h0c5968d895faa1ebe89502b12, +98'h382a79305aefc6f5f4c690099, +98'h3f57e63e95ffcaebf555ec4aa, +98'h078fa84f01518242a2384aa47, +98'h3ae73cb5e56bbe8af814bed03, +98'h1a606d74f1526aa2b2ecb605e, +98'h36e7172dc9b20bd3502648c04, +98'h071773ce120bf6640648da8c8, +98'h21a30b8342a070c56910df123, +98'h364aefacb77db52efb722936e, +98'h32b30525755a22aaba0349f40, +98'h181b22f010f83b61ca44d7947, +98'h210a67022382d58731234f225, +98'h0fc6a6df9e82c6fd2b925b773, +98'h0baffa57454b84caa43edfc88, +98'h03e672c7c555a9caa24f0724a, +98'h2d48901a8202fa440bd2e297a, +98'h0c43a658a733700e6cddc599c, +98'h31ce6ea38c3c16d84f82a15ef, +98'h19290f724a9acad528f0f691e, +98'h277f768ed08bdae10e02d45bf, +98'h078273cf167b336cc77f69cef, +98'h143c0c684c512dd888234e903, +98'h1d0b96fa2f46579e93147ba62, +98'h2340bc8680e86541e90a48722, +98'h3c41043890e84061d34a51269, +98'h3054ab20ab1c8e9616dc4e6da, +98'h3cb495b95d60397ad68533cd0, +98'h1936b3726a98759530f3ca41e, +98'h15d7bcebae64789cf10f0d622, +98'h004354c0b5896e2b2d7330baf, +98'h2c3d889855aa886b707a0440f, +98'h37fd5aafcd95d9db3164cd22c, +98'h2fc6719f871e6d4e0db937bb6, +98'h3253422488b971d16ec32cfd8, +98'h1017dde036828e2d31a69b035, +98'h342b64285e894e7d14ad2ca95, +98'h383169306aa25e9558b4f1f16, +98'h01f0dc43e4d1ae8989b0a2b35, +98'h3de1f0bbf771c42edd54ed3aa, +98'h288b3111396f8032f87eac510, +98'h1a4e5774a2233e844f1c657e3, +98'h3b5abc369eb7a97d7684996d0, +98'h11ac0f63726ed224f106b8621, +98'h0783d1cf07ae0ccf43cc77a79, +98'h05c161cb8ef3adddc52d43ea5, +98'h2302aa0615be56eb6e30403c6, +98'h04ad764943ce9247a21f02244, +98'h0eb2085d569880ed0952a2529, +98'h17ea1cefe62efc8c4f86465f0, +98'h299ea09302431c44aaf86f35f, +98'h22695284f9e50d33d71397ee2, +98'h1db1447b4b6558d6ca45a7548, +98'h1c208df87a922d3535acaecb6, +98'h05e9c74be23ace046a0925541, +98'h2943c192bd567b3ab9a68f335, +98'h0114a842119302e324a9eac95, +98'h07e229cff584efab0f59c65eb, +98'h3d1577ba38aeb2b17d710a9ae, +98'h1386d0670b18465627a7c5af5, +98'h329003a510bcdae150d337a19, +98'h07eed5cfd052a5e086105eec1, +98'h12ea3b65c5297dca4604ee4c0, +98'h35d77aab892207524fbe607f7, +98'h3f50d8bea6e02e0df98c41b32, +98'h2355e6868e935fdd0c7a5198e, +98'h0a98c9d50814555024ab47c95, +98'h101aaf602ece869d8fba4d7f6, +98'h358757ab14113a6812662484c, +98'h29732112eac4de95950dffea1, +98'h113b0de25903cd722a8fb6d52, +98'h1dca49fba9ecbd93f1edc1e3e, +98'h2a1f621434a02ba957afe36f5, +98'h0fdbbb5f9613946c097bd3f2e, +98'h1b051ef603f4eb47c7be828f7, +98'h22ba17855980d5f30f0ebb5e1, +98'h17a988ef56ae1fed6b95ea373, +98'h153b58ea5c53a0f88c63be78b, +98'h2c264698527a2464efa81abf5, +98'h214cd602a735270e72207f444, +98'h07740c4ee83223106be98bd7d, +98'h2e210f1c6d29d51a76d2b90db, +98'h3659fe2c95d85d6bb30c96e61, +98'h1719326e387b3b30f3e51b67c, +98'h25d3de0baa6e3294d41084281, +98'h30bc63a17b64b336db0845b60, +98'h2428ee887713eb2e36cf366da, +98'h0cfec8d9e05ccb008b56e4f69, +98'h129d9f6507d43c4fa69c76ed3, +98'h248a4b0913856b672e03ed9c1, +98'h1ad9f0f581ed92c3c731e0ee5, +98'h37ab26af6afcbf95d8a9f9914, +98'h2ecea01d995b1bf2b20a6f041, +98'h0af22ad5fa78deb4d15ac262a, +98'h2c130d180fcf89dfaef8a5bdf, +98'h158ec8eb0bc832578855bed0a, +98'h1865e2f0d8439ef0ac2a60786, +98'h25d2d70b95809e6b2ed4dd5db, +98'h202a7d8067aa740f71f53c63f, +98'h27421c0ea7576a8e93a661a74, +98'h356d172ae94d8212b7aea64f6, +98'h30ff95a1cc4bead88f52e01e9, +98'h3227aaa457c267ef927a84a4f, +98'h0f5a7edea1fee383ec565898a, +98'h1f319f7e5e5c737c8f6384beb, +98'h33ad1aa74640b5ccae7b741d0, +98'h06742dccfe6be93cf13805c27, +98'h16af3c6d4c1044d828afe0516, +98'h2ead8b1d7b8d0eb71a8ea6751, +98'h3ece8bbd93f49fe7f4b0cae96, +98'h153ccf6a66b8ed8d4efd6f3de, +98'h020e924434cb67a98db67e7b6, +98'h1b209c767cb9e13975f69f6bf, +98'h1d627e7ac5d5f9cba8ce1e11a, +98'h318288230e15da5c2fe6189fd, +98'h1662adecdcff55f9ccd880f9a, +98'h0bd943d7887068d0c5126b2a1, +98'h2baff6176104c502332d2ec66, +98'h05db81cb97d683efa76c816ed, +98'h1846abf0b25b46a4b2a87ca55, +98'h2e2da21c6d56111ab6e0eccdc, +98'h3a736934d35bb2e6b373c706e, +98'h0fe4155fe3b32e874ce5d0f9c, +98'h040b98c82c6fa518cc1ecf783, +98'h10a488e176fd38adf1e87063d, +98'h12fbbc65f7a923af72a938055, +98'h135fcbe6ac3591186fe5573fc, +98'h2b2d7296545f08e88fe31edfb, +98'h344e78a8972a2b6e52de2905b, +98'h213743826b1828961313db061, +98'h2e0a5d9c0215cf442c080b381, +98'h143825e8703f3b20511dd8422, +98'h354ea2aa908826611175b242e, +98'h38b0c5b164c98289b75e920ec, +98'h2518b40a29877e9333a80ca75, +98'h2a1c8f943b2a35365951b1329, +98'h1b93e8773fce56bfb6d88fcdb, +98'h197c7672f09ca321328646650, +98'h3569e82ace76a3dcd0f82301e, +98'h37f57cafc2ff2045cebd273d6, +98'h14c1d9e99054d9e0a945acf29, +98'h0a14fb541e28aafc6a0f69942, +98'h1f68437ef4b4b3a955073dca0, +98'h1e3caa7c74d354a9b4c3ffc98, +98'h0849b8509919bbf22858dd10b, +98'h0b2868d664e56a89cc0374d80, +98'h179a3def39159332342bf4485, +98'h1e6fc57cd1135be20be0c857b, +98'h26b3750d4f35fade4d7a5bfae, +98'h1a554474ae84631d323669e47, +98'h34e38129e87c9810d758064ea, +98'h0a256a547053eea08e9e563d3, +98'h0516b14a2ac28295abf64cf7f, +98'h28d78291a879c690d45452489, +98'h2575e60ae1d98703b1d3db43a, +98'h1292276531d2f623b11947623, +98'h05c3bd4b8b2d3156643c3ba88, +98'h1b2589766db5749b5236bf846, +98'h23727586e815949032e20285c, +98'h257d788adca88bf9508981210, +98'h3f1c9abe17fdd3efd5c69bab7, +98'h167d2cecc98bff5308024b0ff, +98'h123a696478f066b1d2cab4058, +98'h34a6cb296ca7f7995853b0b0a, +98'h019dfa430b0b2656232a48265, +98'h1160b1e2c4cfa6c9a58c162b2, +98'h1d70297aedcd111bb2cf4ea5a, +98'h349a7c2933f0b327fa22cbd44, +98'h0e183d5c011fd64203ce04e78, +98'h0c03ce581e195cfc0a874ad50, +98'h22a84f055b6f19f6ef85da3f1, +98'h0ff6d95fea2f67146e89901d1, +98'h3d18743a1e0f807c16c9fd2d8, +98'h05a8a64b7e41c1bc90fa9a01f, +98'h1ecaa3fd95a7756b6d1c865a4, +98'h3c211e38728eed253bac02d76, +98'h08816051013bb242426f44a4d, +98'h33eccf27ea0a2714177dbd8ef, +98'h08231fd06bf18897ed052a1a1, +98'h0c6a7858d1594e628770f1aed, +98'h185472f0b788e8af33f756e7f, +98'h31064e2221f58d03f4bef6c98, +98'h2e22ec9c640029083488c5692, +98'h10a505617a48c2b4b2bb72058, +98'h23aacc0747c3904faadb9715c, +98'h05f0984bd151a66285d08fab9, +98'h27d1630fa73a9b0e53c2ff877, +98'h3c28d1b85088b3e1332c61666, +98'h26de3d8da675060cf354d0e6a, +98'h2589920b1d6fd1faf0be59018, +98'h09ed0c53c82994d04485a8490, +98'h0248da44a166ba02c8ebe511d, +98'h1fe248ffce2897dc6b82b8371, +98'h1d9e917b160e21ec0ceb2cd9c, +98'h0dbca15b74d439a990a436c13, +98'h05380cca52b39fe565faeb2bf, +98'h31cd1da3a920819256bb67cd7, +98'h32e95a25f7f056afdab66c356, +98'h01900ac31b0d1ff627274aae5, +98'h245e4508add45c9bb48ca8691, +98'h00909e41297af112ca82e3d4f, +98'h0cfd21d9e2a8e2054be980f7c, +98'h0bf161d7f3af4ba74fe82b5fc, +98'h271d510e20831a8111e81ae3c, +98'h05e35acbdcc7037988aa97915, +98'h07238d4e5291e4e5066d5c8cd, +98'h3a85efb519cb32f3b51448aa3, +98'h3105eda23c403238bb5187f6b, +98'h10599460b809c4b03218d6443, +98'h2b29b2165ff62fffd2c7f8858, +98'h059f2dcb02c3b9c5a218b9e43, +98'h1c7cc7f8ed732c1af27bfd04f, +98'h0dae3c5b4933325265b85bab7, +98'h0b1d14d6346a4328efe1d5ffc, +98'h217bc382dc5b35f8af75be5ee, +98'h08cf7c51933bc2664702cfadf, +98'h313bf3226b033996170fcb2e1, +98'h1ef8aa7dd75551ee8d937f1b1, +98'h26388b8c45b06b4b6afa3db5f, +98'h18b9987150f2dce1ca6b1d54c, +98'h37a60a2f485eb750b00130600, +98'h3b41d7b6a2aa3a85777b048f0, +98'h07718ecec82b905063e747c7d, +98'h0e59985ca25b95048c2d4b584, +98'h38b182b16c14781819317eb25, +98'h2595718b20d09001b19980633, +98'h049304c9255b488aaa7b9354f, +98'h2195ea032b843417134687868, +98'h284e0d108a1239d42c9811b93, +98'h3c24be3844bd92c9703894407, +98'h2ada5795bec1aa3dba670074d, +98'h1df1ea7bed57329a92d247459, +98'h17cf0b6f9f09a8fe0db62d1b6, +98'h1522716a5d3d33fa6c97e9593, +98'h320720a40c913a590fa616bf4, +98'h04d2e5c9b7dc3a2f8f2bc7fe4, +98'h38548d30b38562271af67bd5e, +98'h2b1fb096146b13e8cfe2b11fb, +98'h2cbc28194859ecd08d45853a7, +98'h213519826329230671178f223, +98'h0f64545eff6df33ef3b491e77, +98'h1b5910f6bc5b843895ed254bc, +98'h3590672b20a62681758da36b2, +98'h29d0b3138802f6d00c74ea78e, +98'h3eb2d1bd5afed875d66c6a8cc, +98'h2af39695d9f485f3d13a07226, +98'h31d00723ba87be353b15f1563, +98'h3eaecf3d612eee0277f76f4ff, +98'h301c26201a2b7f745291e9651, +98'h3829b7b04ef6c95df1c820439, +98'h32ed60a5f614f7ac3a4096148, +98'h3f2e7abe6e73721cfb687b36d, +98'h26cd228d9f74447ef19059c32, +98'h2c685898f436afa85827c2104, +98'h2fa1fc9f5ad587f5b29de1254, +98'h2579b20ae2491b8491f0b363d, +98'h269c488d232b74867271ef44e, +98'h345bcea8a5054a8a1658464ca, +98'h3dbf94bb411f94420fb7ca3f5, +98'h046a63c8d33bb46645e9860bc, +98'h1292c8e51c2a4df84baf45b75, +98'h32ecde25ecc95b1997ed8e4fd, +98'h25b1110b7d64b13ad8c570918, +98'h34df6b2999fb3473d3b6a7e75, +98'h13a5846766f5fc0dcea6e01d4, +98'h142dbd6877c8512fb2fd83a60, +98'h18ab8bf1426ee444c6c69c0d8, +98'h2f81961f351cc52a192796d24, +98'h089e0bd138549d30903caa406, +98'h15370fea581f4ef02b5597b6a, +98'h028f4c451f8da27f08873bb10, +98'h3ff8a1bffb8bbfb73ee1185dc, +98'h3033a02058523d70b22177644, +98'h05f4eb4bdfec24ffc9784412e, +98'h2078cd00efb2d01f540ae7480, +98'h2e903a9d16aaaced714eb9e2a, +98'h2e54331c92b5da65704283608, +98'h39e3d4b3c1a653c36ee28a1dd, +98'h3501b62a3e7fc2bcfce05e39c, +98'h2d4cfe1aad24459a769c50ed4, +98'h3d9d653b39e66033dde0f15bb, +98'h0cbdc15957a80cef491973922, +98'h2331e10658423ff08edd083db, +98'h057178cad76c736ec7377b0e6, +98'h0e05875c093fad5245d14d2b9, +98'h101715e023e73087ccff9199f, +98'h2920571269e17b93d4c074a98, +98'h32732824e6f14e8df6591dacb, +98'h01b49ac363d78d07a96309f2c, +98'h26eba70dc8de51518bf27e17d, +98'h2344500685bb1b4b6a3fdad48, +98'h075f78ceb8fc20b1f016e6602, +98'h290d50121cb2bdf971700382e, +98'h041bba482ca5af194c305a585, +98'h317636a2d27033e4d0f99aa1e, +98'h2bb0c8177e42623cba7cca950, +98'h0ee6095de569eb8aed13fd3a3, +98'h30d904a1a73c3a8e56054fcbf, +98'h06a0a24d58a24a7147d0bb2fa, +98'h2c9362991026bce06f2e87de6, +98'h15f1d66bf03eb420718c22a31, +98'h3003aaa00d0095da2f41101e9, +98'h1c215cf854a053e96c306c387, +98'h0f9a85df1caa08f96b1123b62, +98'h1859787082a0a3c546be870d7, +98'h03774246d65a116c867454ecd, +98'h31da5ea3a103b50234b784e97, +98'h03e55e47e20c4f04297c6b530, +98'h2a8460952522380a73e9a627e, +98'h0847cf509591adeb07765f4ee, +98'h33f2d1a7ff3d43be5ccc05598, +98'h3eb4093d631dc986387474b0e, +98'h1211b0640ddddddb87fbe38fe, +98'h0eeec75ddbdb1c778ab278f55, +98'h0f480e5eb31243a6309694813, +98'h006c9340ed3fe09a4b6b1cf6c, +98'h32013824124af26491130aa22, +98'h04680ec8de8dbdfd08bd73317, +98'h2d8e9d1b16096b6c30e60221d, +98'h2f0ffa1e39162d321a0989d40, +98'h1d0c78fa1d82c1fb0ea3cebd4, +98'h313efba25d8da3fb33b327e76, +98'h0223384477c7de2fae7ac59d0, +98'h231f2a061ee778fdf081a8c10, +98'h2f2fa41e57f589eff1c94b839, +98'h038b52c73be48f37cfdbf87fb, +98'h008bc7c1105e3260a43a7e887, +98'h33f000a7c7aebc4f6ee7af3dd, +98'h3f629a3edd8f777b373c846e8, +98'h08de4851ab8af0170d1a4e1a2, +98'h05a8654b79856cb30fcb747f9, +98'h00724b40f3dc1fa7ad139aba2, +98'h2a81ec950f4da6de8e73e4dce, +98'h2d1f821a3d60e8badaa01ab53, +98'h2c94591913cc01e7b01816c03, +98'h2164c582e0c5fd01908ab0a11, +98'h2867dc10fd43263ab96ac092e, +98'h035a14c6965749ec866c57acc, +98'h38371cb06cb2d619593a7cb26, +98'h21fa1d83c5c9ddcba9f0fed3e, +98'h0c355a58560df26c2890d3312, +98'h0d79855afac893b5b21086442, +98'h2a8558952aba4015754fe62aa, +98'h0bedefd7d21d79642782da4f0, +98'h00cb0741b8bbf7314e61bf9cb, +98'h27f6c88fd101f7e20e3e301c7, +98'h1271e6e4f45f042891b43ac35, +98'h0409c9c8044fba48821661042, +98'h027234c4f62012ac4e2491dc4, +98'h2e75441cebfc5697f69c66ad3, +98'h098ecfd3370756ae102589a04, +98'h241a28082479b808d224f8043, +98'h06b5e2cd7e9711bd11533d229, +98'h1e4fccfc9f45427e8f6543dec, +98'h0a5e4c54a2dfdd85ab4f8a769, +98'h2f53779e9a1fbd74325ccd44b, +98'h336bc3a6e93cb192572a1d4e4, +98'h2c15a6980d17fb5a0e4b687c8, +98'h3853c530a0a8ad01763f1c8c8, +98'h2e27159c46c241cdad3a55da8, +98'h35ed372bf1909e2319df7553b, +98'h30f78821cfa671df50277e804, +98'h2284d38536724aacf63dc78c8, +98'h2e884f1d3e1eef3c1b29cf964, +98'h3b804f37388b75b13d02f13a1, +98'h0524954a4e9247dd04edb749d, +98'h3a0a4134004aab408e953b1d2, +98'h15a1616b65219e0a4eb0bfdd6, +98'h3bf0cc37c623c4cc508524410, +98'h0c1763580195ce43236b4c66d, +98'h2511060a11da33e3adbace7b7, +98'h1ff878fff08557a1141f74283, +98'h37591faeb84307b09be709d7c, +98'h27d2f70f915d05e2ae4bff3c9, +98'h079b4c4f05f0b8cbc3630146b, +98'h1d04b2fa2c255518724a8204a, +98'h381b6a303c2aacb85d1185ba1, +98'h380fc630378e9f2f3be79957d, +98'h0af16bd5f10280222efcfafe0, +98'h23331c0663fdff07d1cc46c38, +98'h1a0a7d741f490ffe8e54e35ca, +98'h3a58b534af04fc1e1a576c54a, +98'h1cc2edf99b953e772e160b1c3, +98'h295bb192b7ddef2f984e68308, +98'h07c2d8cfb47e7e28cf1055be1, +98'h1018196035372caa7153d182a, +98'h0ef78bddd99d18f32a2529344, +98'h22a6610552c6ed658d5b539ab, +98'h0f33af5e7ad23535b28179250, +98'h1f94b6ff0dd1f35b8b59aa96a, +98'h31302e2243c9a3c78d3e747a7, +98'h29e00693eefef39dd637be8c6, +98'h1e57e07ca2976185103bd0806, +98'h34dec3a9a980bf131797e0af2, +98'h2cf7ee99c7c2e4cfad2eb4da6, +98'h393f6fb27fd12a3f9e44267c7, +98'h291efd923e0220bc19c847938, +98'h37ace42f40e6b341ce24e5dc4, +98'h1da515fb745650a8947ed9a8f, +98'h1b9a597709feead3e9665112c, +98'h298648131a2c7f7470ecb1e1e, +98'h3b292db664c79e89b7fc33100, +98'h0cea1c59d693cced28df7a51c, +98'h340a702823e0be07f5facb8c0, +98'h1ae1b175ed8b799b321b4ac44, +98'h1cae25f9746103a8d443ca688, +98'h2d16ab9a2cdaad99967c564ce, +98'h2902519206375ccc4bce6b979, +98'h0154d942b8d3fe31ae8a35dd1, +98'h1673c06cdaf312f5cc59b4d8a, +98'h1a089cf424d6b809afb7d53f7, +98'h2fd28a9f86acb0cd4d9fcedb3, +98'h3e7c11bce74fe88e9972fe92d, +98'h1b2c62766579ad0af02983e05, +98'h19ccf873896d2252e8ce86b1a, +98'h259e978b0504d1ca0aa8da554, +98'h24455b08aba3069773fa18680, +98'h3f91e1bf319563a33c49d1589, +98'h05f0f7cbf5998fab0ee2a1ddb, +98'h12c1e6e583ff09c7e5b03c2b6, +98'h26f9668dc600154c2b3e5ef68, +98'h26e2830de6a4770d7361be86d, +98'h368303ad113b166251ef8683d, +98'h25a4d38b56e6d16dcf22e93e4, +98'h3f74953ed0cdc161941095a81, +98'h174dfb6e9a0bd9740c567538a, +98'h37c3b52f8cd13ad9b1253c025, +98'h2201ac043cd4d1b9b7b59f6f7, +98'h3e8ff83d20bba78177d2e7efa, +98'h0b526fd6afb02a1f6ec0a67d8, +98'h0386d5c70128f242412bf2025, +98'h3199ad23329fe3a5190e64320, +98'h02ba50c5754755aaae00699c0, +98'h050974ca379ebb2f0f2a0bfe4, +98'h27445d8e87f9a1cfebcf7fd7a, +98'h335a03a6b47e1028f9f604f3e, +98'h30c10ea1a6b1478d55dc958bb, +98'h18650ff0f9e68db3f492e7693, +98'h2fd9769f92721e64f092e5412, +98'h15f0ccebd85590f08b9197771, +98'h00c95441ae61eb1ccbcacfd79, +98'h115cb5e291a1526348bf82117, +98'h23f97907f2b5aca555abc96b4, +98'h3ad214b599bdcdf35523f8aa3, +98'h2078f200d6be9ded6dcde3fb9, +98'h0b0a4bd6282c6a104ccdad799, +98'h064eee4cbd4901ba90e5fc01c, +98'h0eacd9dd60b060816bd74e97b, +98'h1b4f69768f6eab5eeaaf85356, +98'h3cb726395191e663139243271, +98'h084c8f50976f42eee7eef48fe, +98'h345007a8bbea1237dc0e86781, +98'h2a2eea14531051662f4fcedea, +98'h31d90b23bb2187367b3ea4968, +98'h06ae44cd7777052eef89527f1, +98'h0eff7cddf7fbdb2ff1bed6037, +98'h3b1556363b5dbcb69d9cc4bb2, +98'h11ff2f63cd39beda67ce3b8f9, +98'h18aa28714bf74d57c9285d724, +98'h293904926c0be49815513a4a9, +98'h32053ea410c20ae1b0b1d2617, +98'h0daf36db5140ad62a7bbf90f8, +98'h2ad18215aefc901df673848ce, +98'h24e95d09c546884aaa8bf9552, +98'h141ee4e8125e47e4899f4b332, +98'h3532372a5ccd23f9b47fd6c90, +98'h0ea1cbdd7a25b3345231dfc46, +98'h1211336409ff4ed3c704208df, +98'h3de9383be37e7186f859ea70b, +98'h2e51b59cb2ffa3a5f8545650a, +98'h17c5ae6f80b10ac1661dae4c4, +98'h38da23b1bd81f0bb1d97051b2, +98'h35cadb2bbb7e74b6dc5253f89, +98'h2e04a71c3d0b5dba3ac401359, +98'h1006026024795c88cd1fd7ba3, +98'h141bbb683d93573b146bc4a8c, +98'h1bb31ef7651f2e8a103493605, +98'h0b0c70d62aef3315ed7ee8fb0, +98'h3aead0b5eae2dd15d9736b72e, +98'h29507792a2a29b0572fcc4a60, +98'h26f3030dca4b6bd4ac4f9bb8a, +98'h2e81e71d3d5eb4ba9af826f5e, +98'h120c536426b8320d6e31215c6, +98'h1afac575dbaa06774da932fb4, +98'h134639e6b94ce9329324c8c64, +98'h17524f6ea9db2313b04b5ca09, +98'h1313f2663bf76fb7d3c2d8877, +98'h027a01c4eec0109d8c4e84989, +98'h0e0c235c00715440c39f5de73, +98'h15ac5eeb79fc7033f3ea33c7d, +98'h286d4690f28f1b2516bf186d7, +98'h0e4f795cb758642e9169f762c, +98'h24b0d1096d1f491a34740688e, +98'h135d39e6b6ea3c2df291dd852, +98'h25a71a0b7d0b29ba18ac90f15, +98'h11d36963ab34d9164f42109e7, +98'h2546048aab5b5616942856a84, +98'h2e1d759c2204d804340893681, +98'h008465c108320050622d99846, +98'h2359fe869f0678fe10981de12, +98'h124c2de4b2bcf7a5714249628, +98'h18ce1871abbe4597712317824, +98'h1fbd517f589173f12e13b15c2, +98'h15c8566bb3be7c277261b4a4c, +98'h3aab6e355dd39a7b961fc22c3, +98'h28a5951149a335536c9232993, +98'h087036d0eafbc895ecdaffd9b, +98'h0a997dd5058f4c4b040a32880, +98'h36dc972db8fb9b31dbf60c97d, +98'h234cd186bc94083917f8366fe, +98'h23429f06bcf4b539f80dd5102, +98'h095371d2a59d820b0bbc3cf76, +98'h3c42293885a3484b70795c610, +98'h12ec23e5c82dcf5046c67ccd8, +98'h023242c4520e5d640510280a1, +98'h396c1eb2d760e6eef43341687, +98'h27b1550f5effdd7df1ac4ca35, +98'h15284fea4c634b58c862e6d0c, +98'h00160bc03b3656364ed3187d9, +98'h0b9e62573ab572b55194f5431, +98'h102afc605d32877a4b5760f6a, +98'h0a0f8a542245ed84ab155df63, +98'h02cf11c594f2a569e5f06dcbe, +98'h0faf095f7b9c4fb732d2d645a, +98'h22c4af8583dd6447a9a884f35, +98'h37f6792fccfed759d13d54226, +98'h19299ef2618ebf032eae177d6, +98'h23a1d10750acd6614d13a9da2, +98'h38c1b0b1b92880b27c7a8c590, +98'h29453092bff7d8bfda4f42549, +98'h1d6e2b7ad43889684c69ad38c, +98'h195e65f281358f4266a4fd4d4, +98'h08dbef51b236d9246ec4b21d8, +98'h393436326b347396791a2a723, +98'h35a260ab520d586411ebee43d, +98'h1fc5657f9c0d34780ef4a67de, +98'h04bd0d49720b5ba42db21a3b6, +98'h34797ea8eedad89d98d515d19, +98'h3a7a17b4de16f17c1624424c3, +98'h2c355c187813adb0391242722, +98'h23a75b8767dde40f92e14fe5b, +98'h22e56f05c6ece94dea749614f, +98'h3df8593bd53888ea74cc38899, +98'h117fc762c76314cec638b70c6, +98'h0b4edb56a9e04013ed4bc6daa, +98'h3eefdc3df03135a07bc844779, +98'h1ac05ef58f0bc45e0a7308d4e, +98'h214e1402b630b2ac75dfb1abc, +98'h37e23caff9732cb2fc555a58b, +98'h10350be0774bff2e91e042c3b, +98'h2516908a28adb91153711266d, +98'h24f69f09fe5e00bc98d527f19, +98'h3443e1a8adcb569b9883ce110, +98'h0de2b1dbd3083766083aba507, +98'h069188cd2e7beb9ccd435d1a7, +98'h2ac1b59588b9a6d16cded719c, +98'h2372da06d2065b642d5e4d5ac, +98'h1e14f47c1ad07e758e395cbc6, +98'h3d7b0ebac9c15153b1cf1803a, +98'h149e94e924f07e89ce63c4dcb, +98'h0c23e8d873afc7276ff4ebfff, +98'h3723672e5a582574945ee328b, +98'h28e11d11c7534eceac0d1af82, +98'h0548694a912e91e2659dbecb4, +98'h078a7ccf0eb6175d6590250b2, +98'h17de106fb3742da6f2d48f85a, +98'h3a56dbb4bc1eb8b81d9d651b2, +98'h38db5031ba7017b4dcd2d9f99, +98'h2451b888b3cfb92796085c6c0, +98'h3bba64376f24481e5ab7ab156, +98'h1665a46cfca4d53974c29e699, +98'h05d956cb8e827add2516f46a3, +98'h3ec56c3db650092c9d455d5a8, +98'h1ff0487fcecbd65d8baf07b75, +98'h1cadfff94c685858ea4596149, +98'h339f792728b553917715332e2, +98'h3f2b193e5e6c54fcd765db8ec, +98'h1e87117d1e9ae87d2f487e7e9, +98'h00b8a6415a4a67f4a6c0c38d8, +98'h034aa5c6923b6b646561844ac, +98'h1f4af07e8cf0d8d9eb0ef2562, +98'h145283e8ba273f34739e70c74, +98'h0c778258ced797dd86d3c68d9, +98'h380cb8303f3bba3e5dd21c9b9, +98'h0828d2d06d65c21aed63a53ad, +98'h36dfd5ada4354c8876c5488d8, +98'h1576ab6ae184ed830dbee63b7, +98'h1bf17e77e1926a032f60fa1ec, +98'h08ed5151c3a42e4763245fe65, +98'h2f52ab1e82b131454c80f718f, +98'h1dbd6b7b59dcdef3ade6929bc, +98'h2e13b49c1a41d3f4921562242, +98'h17feacefd1db29e38a7675b4d, +98'h3f3219be7fd7bdbf9fc275df7, +98'h095f3ad2919c4fe306bee2ad6, +98'h174208ee82937fc52675622cf, +98'h3f49d6be8404b14810d3a201a, +98'h2425a608418f73c3096d4672d, +98'h01bcc3437cbf95b94f9f163f2, +98'h3214172435e927abf9ff4fb40, +98'h04bb6fc97dcab2bb90a188a13, +98'h1fa245ff57f183efcde4f27bc, +98'h0f74dd5eec7f7518cefd149de, +98'h236f6d06f53db42a562b484c4, +98'h0fe8c8dfd7dc0a6f89f134d3d, +98'h37875d2f3402cf283ae28b15d, +98'h24059188323e24247590ed6b2, +98'h307c8720ed563e9ab774b16ee, +98'h3de8e33bc9b1855371e69a23d, +98'h34abc1a9679ce68f17122a0e1, +98'h3c1d1a38376446aedce05839b, +98'h2f0bd29e18a30f7151ebb883d, +98'h045d6fc8acc2e099ac4814189, +98'h145ab8689f870b7f0cf870f9e, +98'h339adf270f2df25e70b234616, +98'h1d6aad7ae5d0a00bb0ced361a, +98'h34abcfa9762bc9ac7ab5e6557, +98'h11c0f563b8bf2e3152a008e53, +98'h14407a68b767abaef2ea0985e, +98'h1ea862fd7c08993816ac3f0d5, +98'h20661380f3c0dd279509bc2a1, +98'h1c499e7881f2f043e78f23af2, +98'h1812b3f02d1b681a314b87029, +98'h084b30d0a5e2d40bcb8b81371, +98'h0fe3fcdfc994a7d3265e292cc, +98'h3feb48bfea28a2147a84fab51, +98'h086a84d0ea2d8c946ca604595, +98'h1e75447cdc065a782e9ee7bd4, +98'h2c0bfc181ceca779f23e28e48, +98'h3464f8a8cd9845db107f4fa0f, +98'h12b6166550e9ee61c8e80131c, +98'h0b79ba56d87a6370e8fd0771f, +98'h2c4c329889a647d36d7c9e9b0, +98'h386b23b0c1b48b434e87ebbd0, +98'h1be9c1f7fa80d135159aa4cb3, +98'h0fe19f5fcba759d746e23e4dc, +98'h09c37153af0be71e0e33d61c6, +98'h0dc4aedbb163d422efca20bfa, +98'h0ba110574d73ebdac6453f0c8, +98'h17e0f16ffc07d53814fa31a9f, +98'h289a39111119d1e22e6d02bcd, +98'h1b57ee768a693154e97047f2e, +98'h37efba2ff0f361a1da38c6f46, +98'h133b9c6649899fd307314f0e5, +98'h188bbb713b3344b674efc009e, +98'h2a27a8146cfd6319d5c942cb8, +98'h0ae2a8d5e22ac9046b435c769, +98'h1c9a7e793d9eb1bb368e4c0d1, +98'h3d9ed8bb01476d428fb9917f6, +98'h22401084be97dbbd3835fb107, +98'h2ab0f495607e2600d2cbc6a58, +98'h2d50631a80fe34c1eb93a5f72, +98'h220f22042c666818d39d62873, +98'h1c93cdf930e7bb21d35ee246b, +98'h1d9ce7fb15b6ee6b4cd4f5999, +98'h0a8f08d50015814022a922855, +98'h2265d884cfc6425fac8b06b92, +98'h0ec8f35dbdfcd33bf33171a66, +98'h1284fa650f2105de68698010e, +98'h090c1bd23729202e700d4f002, +98'h14c2ede9b337f92651feb9c3f, +98'h05f606cbcaa0a3d54425aaa84, +98'h2724d58e4c97c2d92cef2619e, +98'h341638a80f25cb5e50cf01019, +98'h3c5601b8b00c79203b189eb63, +98'h154efd6a8fdf5f5fa94b97329, +98'h350652aa1a82e9f513e24f27c, +98'h1519edea24216a886e4ed61ca, +98'h0a0765d40d699fdae5dc416bc, +98'h0dc23bdb9cc0e579aaa0c8555, +98'h1e227a7c5bc3af77ae798a7d0, +98'h0896b7513e8c183d31c8b3e39, +98'h1b511b76990f3a722d18157a3, +98'h038597473131c7a26d2dd7ba6, +98'h023285c45891b97126b10fcd6, +98'h3d8401bb38111c301d65477ac, +98'h1847d2f0a98c04933074f5e0f, +98'h1693546d231c47062e6be6dcd, +98'h35b0ddab57481bee933e3e667, +98'h2c262a987527efaa58538690a, +98'h01d3edc3a6e2ac8dca2da6945, +98'h231728862eb1551d54721f68d, +98'h038a1bc734225c286deb1dfbe, +98'h01537fc28c553bd8a36a2ee6d, +98'h311a7ca2269ece8d15ee52cbc, +98'h2ecb389d82e19245cc6b32b8d, +98'h327e0824dce96ff9d3d9de07a, +98'h2b293c96641bd98813d145879, +98'h391640b21859f8f0b45c0e68b, +98'h184519f08b064fd608d2da71a, +98'h37309c2e4590bb4b0f3055de5, +98'h24308e88409dd2c1293398526, +98'h0b60ab56efb0a71f6ec4549d9, +98'h3d32d0ba66ba8d8d58fb5791e, +98'h2beb0117dac313f5b1ab85436, +98'h09f393d3e9ed5f13ecf83cb9f, +98'h312adca268a74691767488ccf, +98'h3c87d2b930e3fea1db5af456b, +98'h170c8fee275fbd8e8f9b135f2, +98'h3c025838040de848300410201, +98'h1966a672f37f34a6f33976c67, +98'h299a049326ec020df42181a84, +98'h392bd0b251e76f63f2c4d0059, +98'h3067d8a0e1a50683548337c90, +98'h2d1f891a04fbbe49ec86d1d90, +98'h352ebbaa7128aa227995d9733}; + +endmodule diff --git a/Labs/01. Adder/tb_fulladder4.sv b/Labs/01. Adder/tb_fulladder4.sv new file mode 100644 index 0000000..f0bb6f1 --- /dev/null +++ b/Labs/01. Adder/tb_fulladder4.sv @@ -0,0 +1,482 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_fulladder4 +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for 4-bit fulladder +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_fulladder4(); + + parameter TIME_OPERATION = 100; + parameter TEST_VALUES = 400; + + wire [3:0] tb_a_i; + wire [3:0] tb_b_i; + wire tb_carry_i; + wire tb_carry_o; + wire [3:0] tb_sum_o; + + fulladder4 DUT ( + .a_i(tb_a_i), + .b_i(tb_b_i), + .sum_o(tb_sum_o), + .carry_i(tb_carry_i), + .carry_o(tb_carry_o) + ); + + integer i, err_count = 0; + reg [13:0] running_line; + + wire [3:0] sum_dump; + wire carry_o_dump; + + assign tb_a_i = running_line[13:10]; + assign tb_b_i = running_line[9:6]; + assign tb_carry_i = running_line[5]; + assign sum_dump = running_line[4:1]; + assign carry_o_dump = running_line[0]; + +`ifdef __debug__ + initial begin + $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); + for ( i = 0; i < TEST_VALUES; i = i + 1 ) + begin + running_line = line_dump[i*14+:14]; + #TIME_OPERATION; + if( (tb_carry_o !== carry_o_dump) || (tb_sum_o !== sum_dump) ) begin + $display("ERROR! carry_i = %b; (a)%h + (b)%h = ", tb_carry_i, tb_a_i, tb_b_i, "(carry_o)%b (sum_o)%h;", tb_carry_o, tb_sum_o, " carry_o_dump: %b, sum_dump: %h", carry_o_dump, sum_dump); + err_count = err_count + 1'b1; + end + end + $display("Number of errors: %d", err_count); + if( !err_count ) $display("\nfulladder4 SUCCESS!!!\n"); + $finish(); + end +`else + initial begin + for ( i = TEST_VALUES-1; i >=0 ; i = i - 1 ) + begin + running_line = line_dump[i*14+:14]; + #TIME_OPERATION; + end + $finish(); + end +`endif + + reg [14*400:0] line_dump = { + 14'h1787, + 14'h1787, + 14'h1f8b, + 14'h0318, + 14'h0c8a, + 14'h0b1c, + 14'h1110, + 14'h0d0e, + 14'h1914, + 14'h0402, + 14'h050a, + 14'h1914, + 14'h1008, + 14'h0402, + 14'h0108, + 14'h050a, + 14'h1218, + 14'h1d16, + 14'h090c, + 14'h090c, + 14'h1c0e, + 14'h0804, + 14'h0318, + 14'h1008, + 14'h1008, + 14'h1a1c, + 14'h1008, + 14'h0e16, + 14'h0210, + 14'h1a1c, + 14'h1a1c, + 14'h0e16, + 14'h0804, + 14'h0612, + 14'h0e16, + 14'h180c, + 14'h163c, + 14'h0826, + 14'h0c06, + 14'h182e, + 14'h102a, + 14'h0804, + 14'h1c0e, + 14'h1008, + 14'h0402, + 14'h0c28, + 14'h0022, + 14'h0000, + 14'h1c0e, + 14'h142c, + 14'h0846, + 14'h0000, + 14'h0064, + 14'h0022, + 14'h0064, + 14'h0804, + 14'h0022, + 14'h0804, + 14'h106c, + 14'h0868, + 14'h0826, + 14'h0804, + 14'h0804, + 14'h180c, + 14'h1008, + 14'h180c, + 14'h0000, + 14'h0804, + 14'h0000, + 14'h00a6, + 14'h1008, + 14'h00c6, + 14'h0022, + 14'h0042, + 14'h102a, + 14'h0064, + 14'h10ce, + 14'h0000, + 14'h104a, + 14'h0022, + 14'h00a6, + 14'h01ae, + 14'h1194, + 14'h014a, + 14'h00a6, + 14'h014a, + 14'h012a, + 14'h0000, + 14'h0064, + 14'h0064, + 14'h00c6, + 14'h012a, + 14'h0108, + 14'h00e8, + 14'h0042, + 14'h014a, + 14'h0318, + 14'h0000, + 14'h0022, + 14'h039c, + 14'h0294, + 14'h033a, + 14'h014a, + 14'h018c, + 14'h0294, + 14'h0210, + 14'h035a, + 14'h0000, + 14'h00c6, + 14'h012a, + 14'h073c, + 14'h00a6, + 14'h0042, + 14'h014a, + 14'h06fa, + 14'h079e, + 14'h0402, + 14'h014a, + 14'h06d8, + 14'h052c, + 14'h0210, + 14'h0084, + 14'h0444, + 14'h0084, + 14'h00a6, + 14'h0108, + 14'h04ea, + 14'h0846, + 14'h0210, + 14'h07e3, + 14'h05f2, + 14'h0846, + 14'h0ccc, + 14'h0b3e, + 14'h0e16, + 14'h0c6a, + 14'h052c, + 14'h0804, + 14'h0696, + 14'h0612, + 14'h1dfe, + 14'h077e, + 14'h018c, + 14'h13a7, + 14'h182e, + 14'h1fad, + 14'h1f49, + 14'h1aa3, + 14'h0b61, + 14'h184e, + 14'h00c6, + 14'h11b6, + 14'h14f2, + 14'h0a78, + 14'h0676, + 14'h1323, + 14'h1f29, + 14'h1dfe, + 14'h0ba3, + 14'h1936, + 14'h161a, + 14'h0e16, + 14'h0e58, + 14'h0888, + 14'h0db4, + 14'h0970, + 14'h058e, + 14'h0990, + 14'h19da, + 14'h146e, + 14'h04ea, + 14'h165c, + 14'h19da, + 14'h033a, + 14'h0210, + 14'h0990, + 14'h144c, + 14'h0c06, + 14'h0108, + 14'h090c, + 14'h039c, + 14'h0b1c, + 14'h0696, + 14'h014a, + 14'h1d58, + 14'h0c48, + 14'h0c48, + 14'h1c50, + 14'h02d6, + 14'h1110, + 14'h0108, + 14'h0e9a, + 14'h0804, + 14'h1914, + 14'h0084, + 14'h0318, + 14'h1c0e, + 14'h1914, + 14'h1110, + 14'h1914, + 14'h1e1e, + 14'h1008, + 14'h0084, + 14'h1a81, + 14'h050a, + 14'h0a14, + 14'h1c0e, + 14'h1b05, + 14'h1008, + 14'h0c06, + 14'h0210, + 14'h071a, + 14'h1e1e, + 14'h1e1e, + 14'h1e1e, + 14'h090c, + 14'h0108, + 14'h0210, + 14'h1c0e, + 14'h0a14, + 14'h0804, + 14'h180c, + 14'h1008, + 14'h0612, + 14'h180c, + 14'h161a, + 14'h0e16, + 14'h1008, + 14'h1e1e, + 14'h0210, + 14'h1a1c, + 14'h140a, + 14'h0634, + 14'h0c06, + 14'h0402, + 14'h0804, + 14'h0424, + 14'h0c06, + 14'h0424, + 14'h0424, + 14'h0826, + 14'h0c06, + 14'h102a, + 14'h0402, + 14'h180c, + 14'h0804, + 14'h0042, + 14'h106c, + 14'h0c48, + 14'h1870, + 14'h1008, + 14'h0868, + 14'h182e, + 14'h0042, + 14'h0042, + 14'h1870, + 14'h1008, + 14'h102a, + 14'h1008, + 14'h102a, + 14'h0022, + 14'h00a6, + 14'h1870, + 14'h0868, + 14'h10f0, + 14'h00c6, + 14'h104a, + 14'h00e8, + 14'h102a, + 14'h108c, + 14'h00a6, + 14'h0064, + 14'h0042, + 14'h0000, + 14'h0022, + 14'h10ae, + 14'h1194, + 14'h102a, + 14'h1132, + 14'h012a, + 14'h0022, + 14'h0042, + 14'h0000, + 14'h00a6, + 14'h00a6, + 14'h01ae, + 14'h0084, + 14'h012a, + 14'h0042, + 14'h0042, + 14'h0022, + 14'h014a, + 14'h0000, + 14'h00a6, + 14'h0000, + 14'h0274, + 14'h012a, + 14'h0274, + 14'h0022, + 14'h00e8, + 14'h014a, + 14'h0000, + 14'h0274, + 14'h0232, + 14'h00a6, + 14'h012a, + 14'h02f8, + 14'h0042, + 14'h079e, + 14'h071a, + 14'h06b8, + 14'h0232, + 14'h0612, + 14'h05b0, + 14'h014a, + 14'h0232, + 14'h0108, + 14'h0084, + 14'h01f0, + 14'h012a, + 14'h018c, + 14'h0990, + 14'h09b2, + 14'h0612, + 14'h0252, + 14'h056e, + 14'h0d72, + 14'h0000, + 14'h04c8, + 14'h0c06, + 14'h0c6a, + 14'h0edc, + 14'h09b2, + 14'h0042, + 14'h00a6, + 14'h0e58, + 14'h13c7, + 14'h094e, + 14'h165c, + 14'h182e, + 14'h0232, + 14'h0dd4, + 14'h0612, + 14'h18b2, + 14'h1f29, + 14'h1a61, + 14'h016c, + 14'h0afc, + 14'h140a, + 14'h05d0, + 14'h1110, + 14'h06b8, + 14'h05f2, + 14'h1e1e, + 14'h184e, + 14'h1301, + 14'h0e9a, + 14'h1787, + 14'h094e, + 14'h02d6, + 14'h08ca, + 14'h11b6, + 14'h06fa, + 14'h0f21, + 14'h0424, + 14'h16e3, + 14'h1aa3, + 14'h039c, + 14'h1194, + 14'h073c, + 14'h108c, + 14'h108c, + 14'h1b05, + 14'h108c, + 14'h1512, + 14'h184e, + 14'h0210, + 14'h0b5e, + 14'h0804, + 14'h180c, + 14'h090c, + 14'h1fcd, + 14'h148e, + 14'h0dd4, + 14'h129c, + 14'h079e, + 14'h0000, + 14'h0888, + 14'h108c, + 14'h1194, + 14'h1787, + 14'h0b1c, + 14'h0f83, + 14'h1f07, + 14'h0084, + 14'h0402, + 14'h0000, + 14'h1110, + 14'h108c, + 14'h1512}; + +endmodule \ No newline at end of file diff --git a/Labs/02. Arithmetic-logic unit/README.md b/Labs/02. Arithmetic-logic unit/README.md new file mode 100644 index 0000000..4ef7d13 --- /dev/null +++ b/Labs/02. Arithmetic-logic unit/README.md @@ -0,0 +1,292 @@ +# Лабораторная работа 2. Арифметико-логическое устройство + +Так как основной задачей процессора является обработка цифровых данных, одним из его основных блоков является арифметико-логическое устройство (АЛУ). Задача АЛУ производить над входными данным арифметические и поразрядно логические операции. + +## Цель + +Используя навыки по описанию мультиплексоров, писать блок арифметико-логического устройства (АЛУ) на языке SystemVerilog. + +## Допуск к лабораторной работе + +Освоить [описание мультиплексора на языке SystemVerilog](../../Basic%20Verilog%20structures/Multiplexors.md). + +## Общий ход выполнения работы + +1. Изучить устройство и принцип работы АЛУ (раздел [#теория](#теория)) +2. Изучить языковые конструкции SystemVerilog для реализации АЛУ (раздел [#инструменты](#инструменты)) +3. Внимательно ознакомиться с заданием (раздел [#задание](#задание)) +4. Описать модуль АЛУ, проверить его предоставленным верификационным окружением. +5. Проверить работу АЛУ в ПЛИС. + +## Теория + +Арифметико-логическое устройство (АЛУ, Arithmetic Logic Unit – ALU) – это блок процессора, выполняющий арифметические и поразрядно логические операции. Разница между арифметическими и логическими операциями в отсутствии у последних бита переноса, так как логические операции происходят между однобитными числами и дают однобитный результат, а в случае АЛУ (в рамках данной лабораторной работы) одновременно между 32-мя однобитными парами чисел. В логических операциях результаты значений отдельных битов друг с другом никак не связаны. + +Также, кроме результата операций, АЛУ формирует флаги, которые показывают выполняется ли заданное условие. Например, выведет `1`, если один операнд меньше другого. + +Обычно АЛУ представляет собой комбинационную схему (то есть без элементов памяти), на входы которой поступают информационные (операнды) и управляющие (код операции) сигналы, в ответ на что на выходе появляется результат заданной операции. АЛУ бывает не комбинационной схемой, но это скорее исключение. + +![../../.pic/Labs/lab_02_alu/fig_01.png](../../.pic/Labs/lab_02_alu/fig_01.png) + +*Рисунок 1. Структурное обозначение элемента АЛУ* + +На рис. 1 изображен пример АЛУ, используемый в книге "Цифровая схемотехника и архитектура компьютера" Харрис и Харрис. На входы `A` и `B` поступают операнды с разрядностью *N*. На трехбитный вход `F` подается код операции. Например, если туда подать `000`, то на выходе `Y` появится результат операции *логическое И* между битами операндов `A` и `B`. Если на `F` подать `010`, то на выходе появится результат сложения. Это лишь пример, разрядность и коды могут отличаться в зависимости от количества выполняемых операций и архитектуры. + +Существует несколько подходов к реализации АЛУ, отличающиеся внутренней организацией. Некоторые из подходов освещаются на [`лекции 3`](../../Lectures/03.%20Digital%20arithmetics.md). В лабораторных работах применяется повсеместно используемый подход мультиплексирования операций, то есть подключения нескольких операционных устройств (которые выполняют какие-то операции, например сложения, логическое И и т.п.) к мультиплексору, который будет передавать результат нужного операционного устройства на выходы АЛУ. + +Рассмотрим на примере все того же АЛУ MIPS из книги Харрисов. На рис. 2, в левой его части, изображена внутренняя организация этого АЛУ, справа – таблица соответствия кодов операциям. На выходе схемы (внизу) стоит четырехвходовый мультиплексор, управляемый двумя из трех битов `F`. К его входам подключены *N* логических И (побитовое И *N*-разрядных операндов), *N* логических ИЛИ, *N*-разрядный сумматор и Zero Extend – устройство делающее из однобитного числа *N*-битное число, дополняя нулями слева. + +К одному из входов этих операционных устройств подключен `A` без изменений, а ко второму подключен выход двухвходового мультиплексора, управляемого оставшимся битом *F*. То есть `F[2]` определяет, что будет вторым операндом: `B` или `~B`. Вдобавок `F[2]` подается на входной перенос сумматора, то есть, когда `F[2] == 1` на выходе сумматора появляется результат операции `A + ~B + 1`, что (с учетом [дополнительного кода](https://ru.wikipedia.org/wiki/Дополнительный_код)) эквивалентно `A – B` (о сумматорах, входных переносах и вычитании на [`лекции 3`](../../Lectures/03.%20Digital%20arithmetics.md)). + +![../../.pic/Labs/lab_02_alu/fig_02.png](../../.pic/Labs/lab_02_alu/fig_02.png) + +*Рисунок 2. Структурная схема АЛУ MIPS* + +Посмотрим, что произойдет, если на вход `F` такого АЛУ подать `111`. Будет выполняться операция `SLT`(сокращение от `Set Less Then`) – выдать `1`, если `A` меньше `B`, в противном случае — выдать `0`. Биты `F[1:0]` переключат мультиплексор на выход блока Zero Extend. На вход Zero Extend поступает старший бит выхода сумматора, этот бит отвечает за знак результата. Так как `F[2] == 1`, сумматор вычисляет `A + ~B + 1`, то есть `A – B`, значит, если `A < B`, то результат вычитания будет отрицательный, а старший бит `Y[N-1] == 1`. Если `A` не меньше `B`, то разность будет неотрицательна, а `Y[N-1] == 0`, как и требуется от этой операции. + +![../../.pic/Labs/lab_02_alu/fig_03.png](../../.pic/Labs/lab_02_alu/fig_03.png) + +*Рисунок 3. Пример исполнения операции АЛУ* + +Преимущество такой организации АЛУ в его простой модификации, настройке под нужные коды операций, читаемости кода и масштабируемости. Можно легко добавить или убрать требуемые операции. Подумайте, как бы вы обновили данную схему, если бы от вас потребовалось расширить её функционал операциями XOR (Исключающее ИЛИ) и (SGE операция "больше либо равно")? + +## Инструменты + +Как было сказано выше, АЛУ можно реализовать, [мультиплексируя](../../Basic%20Verilog%20structures/Multiplexors.md) результаты нескольких операционных устройств. + +При описании очередной комбинации управляющего сигнала, выходу мультиплексора можно сразу присваивать необходимое логическое выражение (например результат побитового ИЛИ можно подать на выход сразу в виде выражения: `a | b`, однако в некоторых случаях выражения будут сложнее из-за различных особенностей реализации, о которых будет рассказано в задании). + +### Параметры + +Очень удобным на практике оказывается использование параметров. Параметры добавляют модулю гибкости, позволяя убрать "магические" константы из описания модулей, подставляя вместо них выразительное символьное имя. Параметры отдаленно схожи с макросами `#define` в языке Си, однако стоит понимать, параметры используются на этапе синтеза схемы, в отличие от макросов в языке Си, которые заменяются препроцессором еще до этапа компиляции. + +Допустим, ваше устройство должно включить тостер, если на вход ему придет сигнал `32'haf3c5bd0`. Человек, не знакомый с устройством, при прочтении этого кода будет недоумевать, что это за число и почему используется именно оно. Однако, скрыв его за параметром `TOASTER_EN`, читающий поймет, что это код включения тостера. Кроме того, если некоторая константа должна использоваться в нескольких местах кода, то определив её через в виде параметра, можно будет менять её в одном месте, и она тут же поменяется везде. + +Параметры позволяют влиять на структуру модуля. К примеру, описывая сумматор, можно параметризовать его разрядность и использовать этот параметр при описании модуля (например в блоке `generate for`). В этом случае вы сможете создавать множество сумматоров различных разрядностей, подставляя при создании нужное вам значение параметра. + +Параметр может быть объявлен в модуле двумя способами: + +- в прототипе модуля; +- в теле описания модуля. + +В первом случае для указания параметра после имени модуля ставится символ `#`, за которым в круглых скобках пишется ключевое слово `parameter` затем указывается тип параметра (по умолчанию знаковое 32-битное число), после чего указывается имя и (опционально) значение по умолчанию. + +Пример: + +```SystemVerilog +module overflow #(parameter WIDTH = 32)( + input logic [WIDTH-1 : 0] a, b, + output logic overflow +); + +logic [WIDТН : 0] sum; + +ass𝚒gn sum = a + b; +ass𝚒gn overflow = sum[WIDTH]; + +endmodule +``` + +Только таким способом объявления параметр может влиять на разрядность портов модуля. + +В случае, если параметр не влияет на разрядность портов, его можно объявить в теле модуля: + +```SystemVerilog +module toaster( + input logic [31:0] command, + output logic power +) + +parameter TOASTER_EN = 32'haf3c5bd0; + +assign power = command == TOASTER_EN; + +endmodule +``` + +В случае АЛУ будет удобно использовать параметры для обозначения кодов команд. Во-первых, для того чтобы в `case` не допустить ошибок, а во-вторых – чтобы можно было легко менять управляющие коды для повторного использования АЛУ в других проектах. + +Сравните сами: + +```SystemVerilog +//parameter SLT = 5'b00011; +//parameter BEQ = 5'b11000; + +//... + +always_comb + case(ALUOp) + //... + 5'b00011: //... // вообще же ничего не понятно + 5'b11000: //... // никуда не годится +``` + +и + +```SystemVerilog +parameter SLT = 5'b00011; +parameter BEQ = 5'b11000; + +//... + +аlwауs_comb + case(ALUOp) + //... + SLT: //... // очень понятно + BEQ: //... // так лаконично и красиво +``` + +С параметрами гораздо взрослее, серьезнее и понятнее смотрится. Кстати, сразу на заметку: в SystemVerilog можно объединять группу параметров в **пакет**(package), а затем импортировать его внутрь модуля, позволяя переиспользовать параметры без повторного их прописывания для других модулей. + +Делается это следующим образом. + +Сперва создается SystemVerilog-файл, который будет содержать пакет (к примеру содержимое файла может быть таким): + +```SystemVerilog +package riscv_params_pkg; + parameter ISA_WIDTH = 32; + parameter ANOTHER_EX = 15; +endpackage +``` + +Далее, внутри модуля, которому нужны параметры из этого пакета, необходимо сделать соответствующий импорт этих параметров. Это можно сделать либо для каждого параметра отдельно, либо импортировать все параметры сразу: + +```SystemVerilog +module riscv_processor( + //...Порты +); + +import riscv_params_pkg::ISA_WIDTH; // Если необходимо импортировать +import riscv_params_pkg::ANOTHER_EX; // все параметры в пакете,эти две строчки + // могут быть заменены закомментированной + // ниже строкой: +//import riscv_params_pkg::*; + +endmodule +``` + +--- + +При реализации АЛУ, вам также потребуется использовать [операции сдвига](https://ru.wikipedia.org/wiki/Битовый_сдвиг), к которым относятся: + +- `<<` — логический сдвиг влево +- `>>` — логический сдвиг вправо +- `>>>` — арифметический сдвиг вправо + +




+ +--- + +### Особенности реализации сдвига + +**Для ВСЕХ операций сдвига вы должны брать только 5 младших бит операнда B.** + +Сами посмотрите: пятью битами можно описать 32 комбинации [0-31], а у операнда А будет использоваться ровно 32 бита. **Это обязательное требование**, поскольку старшие биты в дальнейшем будут использоваться по другому назначению и если вы упустите это, ваш будущий процессор станет работать неправильно. + +--- + +




+ +## Задание + +Необходимо на языке SystemVerilog реализовать АЛУ в соответствии со следующим прототипом: + +```SystemVerilog + +module аlu_r𝚒sсv ( + 𝚒nput logic [31:0] a_i, + 𝚒nput logic [31:0] b_i, + 𝚒nput logic [4:0] alu_op_i, + оutput logic flag_o, + оutput logic [31:0] result_o +); + +import alu_opcodes_pkg::*; // импорт параметров, содержащих + // коды операций для АЛУ + +endmodule +``` + +Для стандартного набора целочисленных операций архитектуры RISC-V требуется выполнять 16 различных операций. Для кодирования 16 операций было бы достаточно 4 бит, но в лабораторной работе предлагается использовать 5-битный код, что связано с особенностями кодирования инструкций (будет рассмотрено в лекциях 6 и 7). Видно, что старший бит кода операции указывает на то, является ли операция вычислительной или это операция сравнения. + +|ALUOp|={flag, add/sub, aluop}|Result |Flag |Операция | +|-----|-----------------------|-----------------------------------|-----------------------------------|---------------------------------------------------| +| ADD | 0 0 000 |Result = А + В | Flаg = 0 | Сложение | +| SUB | 0 1 000 |Result = А – В | Flаg = 0 | Вычитание | +| SLL | 0 0 001 |Result = А << В | Flаg = 0 | Сдвиг влево | +| SLTS| 0 0 010 |Result = А < В (знаковое сравнение)| Flаg = 0 | Знаковое сравнение | +| SLTU| 0 0 011 |Result = А < В | Flаg = 0 | Беззнаковое сравнение | +| XOR | 0 0 100 |Result = А ^ В | Flаg = 0 | Побитовое исключающее **ИЛИ** | +| SRL | 0 0 101 |Result = А >> В | Flаg = 0 | Сдвиг вправо | +| SRA | 0 1 101 |Result = А >>> В | Flаg = 0 | Арифметический сдвиг вправо (операнд А — знаковый)| +| OR | 0 0 110 |Result = А \| В | Flаg = 0 | Побитовое логическое **ИЛИ** | +| AND | 0 0 111 |Result = А & В | Flаg = 0 | Побитовое логическое **И** | +| EQ | 1 1 000 |Result = 0 | Flаg = (А == В) | Выставить флаг, если **равны** | +| NE | 1 1 001 |Result = 0 | Flаg = (А != В) | Выставить флаг, если **не равны** | +| LTS | 1 1 100 |Result = 0 | Flаg = А < В (знаковое сравнение) | Знаковое сравнение **<** | +| GES | 1 1 101 |Result = 0 | Flаg = А ≥ В (знаковое сравнение) | Знаковое сравнение **≥** | +| LTU | 1 1 110 |Result = 0 | Flаg = А < В | Беззнаковое сравнение **<** | +| GEU | 1 1 111 |Result = 0 | Flаg = А ≥ В | Беззнаковое сравнение **≥** | + +**Выражения в этой таблице приведены для примера. Не все из них можно просто переписать — часть этих выражений надо дополнить. Чтобы вы не копировали выражения, в них вставлены неподдерживаемые символы.** + +Обратите внимание на инструкции сравнения. У нас есть две похожие пары инструкций: + +- `LTS` +- `LTU` +- `SLTS` +- `SLTU` + +Первая пара инструкций вычисляет "ветвительный" результат. Результат операции будет подан на выходной сигнал `Flag` и использован непосредственно при ветвлении. + +Вторые две инструкции используются для получения "вычислительного" результата. Т.е. результат сравнения будет подан на выходной сигнал `Result` так же, как подается результат операции `ADD`, и будет использован в неких вычислениях, избегая при этом условного перехода. + +К примеру, нам необходимо пройтись по массиву из миллиона элементов и убедиться, что все они были неотрицательны. Об этом будет сигнализировать переменная `num_of_err`, значение которой должно быть равно числу элементов массива, меньших нуля. Вычислить значение этой переменной можно двумя способами: + +1. В каждой итерации цикла сделать ветвление: в одном случае инкрементировать переменную, в другом случае — нет (для ветвления использовать "ветвительную" операцию `LTS`). +2. В каждой итерации цикла складывать текущее значение переменной с результатом "вычислительной" операции `SLTS`. + +Операции ветвления очень сильно влияют (в худшую сторону) на производительность конвейерного процессора. В первом случае мы получим миллион операций ветвления, во втором — ни одной! Разумеется потом переменную `num_of_err` скорее всего сравнят с нулем что приведет к ветвлению, но при вычислении значения этой переменной ветвления можно будет избежать. + +Различие между `SLTS` и `SLTU` (или `LTS` и `LTU`) заключается в том, как мы интерпретируем операнды: как знаковые числа (операции `STLS` и `LTS`) или как беззнаковые (операциии `SLTU` и `LTU`). + +Предположим, мы сравниваем два двоичных числа: `1011` и `0100`. Если интерпретировать эти числа как беззнаковые, то это `11` и `4`, результат: `11 > 4`. Однако если интерпретировать эти числа как знаковые, то теперь это числа `-5` и `4` и в этом случае `-5 < 4`. + +Как мы видим, результат одной и той же операции над одними и теми же двоичными числами может зависеть от того, каким образом мы интерпретируем эти двоичные числа. Для большинства операций в АЛУ это не важно: например, сложение будет работать одинаково в обоих случаях, благодаря свойствам дополнительного кода, а побитовые операции работают с отдельными битами двоичного числа. А вот для операции арифметического сдвига это важно — **операнд А в арифметическом сдвиге должен интерпретироваться как знаковый**. + +По умолчанию SystemVerilog интерпретирует все сигналы как беззнаковые, если мы хотим изменить это поведение, необходимо воспользоваться конструкцией `$signed`. + +Конструкция `$signed` говорит САПР интерпретировать число, переданное в качестве операнда, как знаковое. + +```SystemVerilog + аss𝚒gn Rеsult = $s𝚒gnеd(А) >>> В[4:0]; +``` + +В этом примере некоторому сигналу `Result` присваивают результат сдвига знакового числа `A` на значение количества бит получаемых из младших 5 бит сигнала `B`. + +Так как используются не все возможные комбинации управляющего сигнала АЛУ, то **при описании через `case` не забывайте использовать `default`**. Если описать АЛУ как задумано, то получится что-то похожее на картинку ниже. Но не обязательно, зависит от вашего описания. + +![../../.pic/Labs/lab_02_alu/fig_04.png](../../.pic/Labs/lab_02_alu/fig_04.png) + +### Порядок выполнения задания + +1. Добавьте в проект файл [`alu_opcodes_pkg.sv`](alu_opcodes_pkg.sv). Этот файл содержит объявление пакета `alu_opcodes_pkg`, в котором прописаны все опкоды АЛУ. +2. В `Design Sources` проекта создайте `SystemVerilog`-файл `аlu_r𝚒sсv.sv`. +3. Опишите в нем модуль АЛУ с таким же именем и портами, как указано в [задании](#задание). + 1. Поскольку у вас два выходных сигнала, зависящих от сигнала `alu_op_i`, вам потребуется описать два разных [мультиплексора](../../Basic%20Verilog%20structures/Multiplexors.md) (их лучше всего описывать через два отдельных блока `case`). При описании, используйте `default` на оставшиеся комбинации сигнала `alu_op_i`. + 2. Следите за разрядностью ваших сигналов. + 3. Для реализации АЛУ, руководствуйтесь таблицей с операциями, а не схемой в конце задания, которая приведена в качестве референса. Обратите внимание, в одной половине операций `flag_o` должен быть равен нулю, в другой `result_o` (т.е. всегда либо один, либо другой сигнал должен быть равен нулю). Именно поэтому удобней всего будет описывать АЛУ в двух разных блоках `case`. + 4. Вам не нужно переписывать опкоды из таблицы в качестве вариантов для блока `case`. Вместо этого используйте символьные имена с помощью параметров, импортированных из пакета `alu_opcodes_pkg`. + 5. При операции сложения вы **должны** использовать ваш 32-битный сумматор из первой лабораторной (описывая вычитание сумматор использовать не надо, можно использовать `-`). + 1. При подключении сумматора, на входной бит переноса необходимо подать значение `1'b0`. Если не подать значение на входной бит переноса, результат суммы будет не определен (т.к. не определено одно из слагаемых). + 2. Выходной бит переноса при подключении сумматора можно не указывать, т.к. он использоваться не будет. + 6. При реализации операций сдвига, руководствуйтесь [особенностями реализации сдвигов](#особенности-реализации-сдвига). +4. После реализации модуля АЛУ его нужно будет проверить с помощью тестового окружения. + 1. Добавьте файл [`tb_miriscv_alu.sv`](tb_miriscv_alu.sv) в `Simulation sources`. + 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). + 3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран модуль `tb_miriscv_alu`. + 4. Убедитесь, что симуляция завершена (об этом будет соответствующее сообщение в консоли). По завершению симуляции, в случае отсутствия ошибок, будет выведено сообщение "SUCCESS", в противном случае будут выведены сообщения об этих ошибках. + 5. В случае, если были найдены ошибки, вы должны найти и исправить их. Для этого руководствуйтесь [документом](../../Vivado%20Basics/Debug%20manual.md). +5. Добавьте в проект модуль верхнего уровня ([nexys_alu.sv](board%20files/nexys_alu.sv)), соединяющий АЛУ с периферией в ПЛИС. Описание модуля находится [здесь](board%20files) +6. Подключите к проекту файл ограничений ([nexys_a7_100t.xdc](board%20files/nexys_a7_100t.xdc), файл ограничений, добавленный в первой лабораторной содержит другие данные, вам необходимо вставить содержимое файла для текущей лабы). +7. Проверьте работу АЛУ в ПЛИС. diff --git a/Labs/02. Arithmetic-logic unit/alu_opcodes_pkg.sv b/Labs/02. Arithmetic-logic unit/alu_opcodes_pkg.sv new file mode 100644 index 0000000..5089af6 --- /dev/null +++ b/Labs/02. Arithmetic-logic unit/alu_opcodes_pkg.sv @@ -0,0 +1,28 @@ +package alu_opcodes_pkg; +parameter ALU_OP_WIDTH = 5; + +parameter ALU_ADD = 5'b00000; +parameter ALU_SUB = 5'b01000; + +parameter ALU_XOR = 5'b00100; +parameter ALU_OR = 5'b00110; +parameter ALU_AND = 5'b00111; + +// shifts +parameter ALU_SRA = 5'b01101; +parameter ALU_SRL = 5'b00101; +parameter ALU_SLL = 5'b00001; + +// comparisons +parameter ALU_LTS = 5'b11100; +parameter ALU_LTU = 5'b11110; +parameter ALU_GES = 5'b11101; +parameter ALU_GEU = 5'b11111; +parameter ALU_EQ = 5'b11000; +parameter ALU_NE = 5'b11001; + +// set lower than operations +parameter ALU_SLTS = 5'b00010; +parameter ALU_SLTU = 5'b00011; + +endpackage diff --git a/Labs/02. Arithmetic-logic unit/board files/README.md b/Labs/02. Arithmetic-logic unit/board files/README.md new file mode 100644 index 0000000..6a404b8 --- /dev/null +++ b/Labs/02. Arithmetic-logic unit/board files/README.md @@ -0,0 +1,23 @@ +# Проверка работы арифметико-логического устройства в ПЛИС + +После того, как вы создали свое АЛУ и проверили его на прохождение тестирующего модуля, вы можете использовать предложенный модуль окружения [`nexys_alu.v`](nexys_alu.v), который позволяет связать вашу логику с периферией, расположенной на плате `Nexys-A7`. Для его подключения, скачайте и добавьте файл в проект, либо скопируйте содержимое в новый `.v` файл вашего проекта. В окне `Sources` нажмите на него ПКМ и выберите `Set as Top`, после чего в иерархии он станет главным, подключив ваш собственный модуль АЛУ. Для того, чтобы дизайн мог физически подключиться к периферии, нужно в проекте выбрать `Add Sources`, `Add or create constraints` и подключить файл [`nexys_a7_100t.xdc`](nexys_a7_100t.xdc). Если у вас уже подключен этот файл, необходимо заменить данные на те, которые предложены в текущей лабе. + +После этого наше устройство будет выглядеть так: + +![../../../.pic/Labs/board%20files/board%20files/alu_9.png](../../../.pic/Labs/board%20files/board%20files/alu_9.png) + +Подключенное окружение позволяет производить ввод входных значений (А и В) и управляющего сигнала (ALUOp) с помощью переключателей (номер переключателя отображен на самом краю платы), расположенных на плате. А: 15-11, В: 10-6, ALUOp: 4-0, а переключатель №5 активирует семисегментные индикаторы, на которых отображается на левом блоке операнды А и В, а на правом - ALUOp. На светодиодах, расположенных над переключателями отображается выходное значение в двоичном формате, а 15-й светодиод отвечает за сигнал `Flag` + +Управление АЛУ через плату + +![../../../.pic/Labs/board%20files/board%20files/nexys_alu.png](../../../.pic/Labs/board%20files/board%20files/nexys_alu.png) + +Для прошивки ПЛИС подключите утройство через USB, включите питание переключателем, выполните синтез и имплементацию вашего дизайна и сгенерируйте битстрим. Если на этом этапе у вас возникают ошибки, постарайтесь исправить из с помощью [`инструкции по работе с ошибками синтеза`](../../../Vivado%20Basics/Synthesis%20failed.md). После этого выберите в левом меню `Open Target` - `Auto Connect`, затем `Program Device` и ваше устройство прошьется. + +Генерация битстрима +![../../../.pic/Labs/board%20files/board%20files/Program_Device1.png](../../../.pic/Labs/board%20files/board%20files/Program_Device1.png) + +Прошивка ПЛИС +![../../../.pic/Labs/board%20files/board%20files/Program_Device2.png](../../../.pic/Labs/board%20files/board%20files/Program_Device2.png) + +Попробуйте выставить на переключателях различные опкоды, такие как сложение, вычитание, сдвиг и сравнения, убедитесь, что все работает исправно и сдавайте работу. diff --git a/Labs/02. Arithmetic-logic unit/board files/nexys_a7_100t.xdc b/Labs/02. Arithmetic-logic unit/board files/nexys_a7_100t.xdc new file mode 100644 index 0000000..4838c49 --- /dev/null +++ b/Labs/02. Arithmetic-logic unit/board files/nexys_a7_100t.xdc @@ -0,0 +1,211 @@ +## This file is a general .xdc for the Nexys A7-100T +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +# Clock signal +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100 }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK100}]; + + +#Switches +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { SW[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { SW[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { SW[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { SW[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { SW[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { SW[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { SW[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { SW[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { SW[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { SW[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { SW[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { SW[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { SW[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { SW[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + +### LEDs +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { LED[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { LED[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { LED[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { LED[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { LED[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { LED[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { LED[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { LED[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { LED[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { LED[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { LED[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { LED[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +## RGB LEDs +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { LED17_B }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { LED17_G }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED17_R }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + +##7 segment display +set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { CA }]; #IO_L24N_T3_A00_D16_14 Sch=ca +set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { CB }]; #IO_25_14 Sch=cb +set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { CC }]; #IO_25_15 Sch=cc +set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { CD }]; #IO_L17P_T2_A26_15 Sch=cd +set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { CE }]; #IO_L13P_T2_MRCC_14 Sch=ce +set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { CF }]; #IO_L19P_T3_A10_D26_14 Sch=cf +set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { CG }]; #IO_L4P_T0_D04_14 Sch=cg +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp +set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { AN[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { AN[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { AN[6] }]; #IO_L23P_T3_35 Sch=an[6] +set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + +##Buttons +set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn +#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc +#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu +#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl +#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { BTNR }]; #IO_L10N_T1_D15_14 Sch=btnr +#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers +##Pmod Header JA +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { JA[1] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { JA[2] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { JA[3] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { JA[4] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { JA[7] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { JA[8] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { JA[9] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { JA[10] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + +##Pmod Header JB +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { JB[1] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { JB[2] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { JB[3] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { JB[4] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { JB[7] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { JB[8] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { JB[9] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { JB[10] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + +##Pmod Header JC +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { JC[1] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { JC[2] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { JC[3] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { JC[4] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { JC[7] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { JC[8] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { JC[9] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { JC[10] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + +##Pmod Header JD +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { JD[1] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { JD[2] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { JD[3] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { JD[4] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { JD[7] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { JD[8] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { JD[9] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { JD[10] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + +##Pmod Header JXADC +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVCMOS33 } [get_ports { XA_N[1] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVCMOS33 } [get_ports { XA_P[1] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { XA_N[2] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { XA_P[2] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { XA_N[3] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVCMOS33 } [get_ports { XA_P[3] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { XA_N[4] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { XA_P[4] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + +##VGA Connector +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { VGA_HS }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { VGA_VS }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { SD_RESET }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { SD_CD }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { SD_SCK }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { SD_CMD }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + +##Accelerometer +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { ACL_MISO }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { ACL_MOSI }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { ACL_SCLK }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { ACL_CSN }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + +##Temperature Sensor +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { TMP_SCL }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { TMP_SDA }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { TMP_INT }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { TMP_CT }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { M_CLK }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { M_DATA }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel + +##PWM Audio Amplifier +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { AUD_SD }]; #IO_L6P_T0_15 Sch=aud_sd + +##USB-RS232 Interface +#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { UART_TXD_IN }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { UART_RXD_OUT }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { UART_CTS }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { UART_RTS }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { PS2_CLK }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { PS2_DATA }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + +##SMSC Ethernet PHY +#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDC }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDIO }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { ETH_RSTN }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { ETH_CRSDV }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv +#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXERR }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXEN }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { ETH_REFCLK }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { ETH_INTN }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + +##Quad SPI Flash +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn \ No newline at end of file diff --git a/Labs/02. Arithmetic-logic unit/board files/nexys_alu.sv b/Labs/02. Arithmetic-logic unit/board files/nexys_alu.sv new file mode 100644 index 0000000..85a2bf6 --- /dev/null +++ b/Labs/02. Arithmetic-logic unit/board files/nexys_alu.sv @@ -0,0 +1,96 @@ +`timescale 1ns / 1ps + +module nexys_alu( + input CLK100, + input resetn, + input [15:0] SW, + output [15:0] LED, + output CA, CB, CC, CD, CE, CF, CG, + output [7:0] AN + ); +import alu_opcodes_pkg::*; +wire [4:0] operator_i; +wire [31:0] operand_a_i; +wire [31:0] operand_b_i; + +wire [31:0] result_o; +wire comparison_result_o; + +localparam pwm = 1000; +reg [9:0] counter; +reg [3:0] semseg; +reg [7:0] ANreg; +reg CAr, CBr, CCr, CDr, CEr, CFr, CGr; +reg [15:0] LEDr; +reg minus; + +alu_riscv DUT +( + .ALUOp (operator_i), + .A (operand_a_i), + .B (operand_b_i), + + .Result (result_o), + .Flag (comparison_result_o) +); + +assign operator_i = SW[4:0]; +assign operand_b_i = {{28{SW[10]}},SW[9:6]}; +assign operand_a_i = {{28{SW[15]}},SW[14:11]}; + +assign LED[15:0] = LEDr[15:0]; + +assign AN[7:0] = ANreg[7:0]; +assign {CA, CB, CC, CD, CE, CF, CG} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr}; + +initial ANreg[7:0] = 8'b11111110; + +always @(posedge CLK100) begin + if (!resetn) begin + LEDr[15:0] <= 'b0; + counter <= 'b0; + ANreg[7:0] <= 8'b11111111; + {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; + end + else begin + LEDr[14:0] <= result_o[14:0]; + LEDr[15] <= comparison_result_o; + if (counter < pwm) counter = counter + 'b1; + else begin + counter = 'b0; + ANreg[1] <= ANreg[0]; + ANreg[2] <= ANreg[1]; + ANreg[3] <= ANreg[2]; + ANreg[4] <= ANreg[3]; + ANreg[5] <= ANreg[4]; + ANreg[6] <= ANreg[5]; + ANreg[7] <= ANreg[6]; + ANreg[0] <= !(SW[5] && (ANreg[6:0] == 7'b1111111)); + end + case (1'b0) + ANreg[0]: semseg <= result_o[31] ? ( ~result_o + 1 ) % 4'd10: (result_o ) % 4'd10; + ANreg[1]: semseg <= result_o[31] ? ((~result_o + 1) / 'd10 ) % 4'd10: (result_o / 'd10 ) % 4'd10; + ANreg[2]: semseg <= result_o[31] ? ((~result_o + 1) / 'd100 ) % 4'd10: (result_o / 'd100 ) % 4'd10; + ANreg[3]: semseg <= result_o[31] ? ((~result_o + 1) / 'd1000) % 4'd10: (result_o / 'd1000) % 4'd10; + ANreg[4]: semseg <= operand_b_i[31] ? ( ~operand_b_i + 1 ) % 4'd10: (operand_b_i ) % 4'd10; + ANreg[5]: semseg <= operand_b_i[31] ? ((~operand_b_i + 1) / 'd10) % 4'd10: (operand_b_i / 'd10) % 4'd10; + ANreg[6]: semseg <= operand_a_i[31] ? ( ~operand_a_i + 1 ) % 4'd10: (operand_a_i ) % 4'd10; + ANreg[7]: semseg <= operand_a_i[31] ? ((~operand_a_i + 1) / 'd10) % 4'd10: (operand_a_i / 'd10) % 4'd10; + endcase + minus <= (operator_i == ALU_ADD || operator_i == ALU_SUB || operator_i == ALU_SLTS || operator_i == ALU_SRA || operator_i == ALU_LTS || operator_i == ALU_GES); + case (semseg) + 4'd0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= (((!ANreg[5] & operand_b_i[31]) || (!ANreg[7] & operand_a_i[31]) || (!ANreg[3] & result_o[31])) && minus) ? 7'b1111110: 7'b0000001; + 4'd1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= (((!ANreg[5] & operand_b_i[31]) || (!ANreg[7] & operand_a_i[31]) || (!ANreg[3] & result_o[31])) && minus) ? 7'b1001110: 7'b1001111; + 4'd2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010; + 4'd3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110; + 4'd4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100; + 4'd5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100; + 4'd6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000; + 4'd7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111; + 4'd8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000; + 4'd9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100; + endcase + end +end + +endmodule \ No newline at end of file diff --git a/Labs/02. Arithmetic-logic unit/tb_miriscv_alu.sv b/Labs/02. Arithmetic-logic unit/tb_miriscv_alu.sv new file mode 100644 index 0000000..2341738 --- /dev/null +++ b/Labs/02. Arithmetic-logic unit/tb_miriscv_alu.sv @@ -0,0 +1,10104 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_miriscv_alu +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for miriscv alu +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_miriscv_alu(); + +import alu_opcodes_pkg::*; + +parameter TEST_VALUES = 10000; +parameter TIME_OPERATION = 100; + + +wire [4:0] operator_i; +wire [31:0] operand_a_i; +wire [31:0] operand_b_i; + +wire [31:0] result_o; +wire comparison_result_o; + +alu_riscv DUT +( + .alu_op_i (operator_i ), + .a_i (operand_a_i ), + .b_i (operand_b_i ), + + .result_o (result_o ), + .flag_o (comparison_result_o) +); + +integer i, err_count = 0; +reg [8*9:1] operator_type; + +wire [31:0] result_dump; +wire comparison_result_dump; + +reg [102:0] running_line; + + assign operator_i = running_line[102:97]; + assign operand_a_i = running_line[96:65]; + assign operand_b_i = running_line[64:33]; + assign comparison_result_dump = running_line[32]; + assign result_dump = running_line[31:0]; + +initial + begin + $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); + for ( i = 0; i < TEST_VALUES; i = i + 1 ) + begin + running_line = line_dump[i*103+:103]; + #TIME_OPERATION; + if( (result_dump !== result_o) || (comparison_result_dump !== comparison_result_o) ) begin + $display("ERROR Operator: %s", operator_type, " operand_A: %h", operand_a_i, " operand_B: %h", operand_b_i, " your_Result: %h", result_o, " Result_dump: %h", result_dump, " your_Flag: %h", comparison_result_o, " Flag_dump: %h", comparison_result_dump); + err_count = err_count + 1'b1; + end + end + + $display("Number of errors: %d", err_count); + if( !err_count ) $display("\nALU SUCCESS!!!\n"); + $finish(); + end + +always @(*) begin + case(operator_i) + ALU_ADD : operator_type = "ALU_ADD "; + ALU_SUB : operator_type = "ALU_SUB "; + ALU_XOR : operator_type = "ALU_XOR "; + ALU_OR : operator_type = "ALU_OR "; + ALU_AND : operator_type = "ALU_AND "; + ALU_SRA : operator_type = "ALU_SRA "; + ALU_SRL : operator_type = "ALU_SRL "; + ALU_SLL : operator_type = "ALU_SLL "; + ALU_LTS : operator_type = "ALU_LTS "; + ALU_LTU : operator_type = "ALU_LTU "; + ALU_GES : operator_type = "ALU_GES "; + ALU_GEU : operator_type = "ALU_GEU "; + ALU_EQ : operator_type = "ALU_EQ "; + ALU_NE : operator_type = "ALU_NE "; + ALU_SLTS : operator_type = "ALU_SLTS "; + ALU_SLTU : operator_type = "ALU_SLTU "; + default : operator_type = "NOP "; + endcase +end + +reg [103*10000:0] line_dump = { +103'h1e88592d984c690cac00000000, +103'h18f51e266e7dff015e00000000, +103'h22fd89520d06582ef800000000, +103'h0e6a324c64fb76556635192232, +103'h2eb6654386f8ffa77200000000, +103'h274f0147566331f3d600000000, +103'h0d659c4c851997375ebecfbfef, +103'h3e828f80ab68987eb400000000, +103'h149af90a36ce34cb3800000000, +103'h32ac623b3550c44be300000000, +103'h2620fd6008ebbd561800000000, +103'h1eaf2fbc3c981f914c00000000, +103'h00a5fa9722b91cf154af8bc43b, +103'h196afa3d42684cad9000000000, +103'h2480be2f430e4744b400000000, +103'h3a823f775d794181f700000000, +103'h0a1be050c0f9ffb13800000000, +103'h3e6e9e1b7a7c3f289400000000, +103'h3529a893c6981f795600000000, +103'h2ef2fa50c406bd94d000000000, +103'h03358d8fba30662896363ee800, +103'h1972207fe92360795c00000000, +103'h2a2af298ab58ee091600000000, +103'h017be42ac4cb0e88fe237959e1, +103'h1cd39351aef60121a800000000, +103'h325ba8a12e71e54c6d00000000, +103'h31071e6a0c45789e1a00000000, +103'h1a0b823bfea1213f4a002e08ef, +103'h06daf496f0a83fa95600000000, +103'h22a068138ab3c1e55400000000, +103'h2cd7c0dc908eb67c4400000000, +103'h02549243b22f1e8fce2490ec80, +103'h167284ea1f06df6c6000000000, +103'h1c38b739e05b71b01200000000, +103'h2ab2ab6ef8cdf69a3200000000, +103'h0abb56205406add412002ed588, +103'h1ef31f617eb959430a00000000, +103'h1131c80f0a74af635e5e8c55d6, +103'h22cbe26ca967cec4de00000000, +103'h2f33f364789996d3e800000000, +103'h0ca2b2305b65794090f3fdb86d, +103'h2acaca3f48996ca50800000000, +103'h136791b1963c1ed56200000000, +103'h226c27e8c106e914ac00000000, +103'h2b0a54f3d56e7ac64200000000, +103'h0e0dfb3f76daa2af0204511781, +103'h3aab0e3022e4f7a2d600000000, +103'h3c843ff630f2f2e24f00000000, +103'h3f645ad0ea9e01127100000000, +103'h16b2f071e7224108a000000000, +103'h24dc28c1e4869bd98a00000000, +103'h14ea58b4bb398c4b7000000000, +103'h34eb7b89de15b50d5400000000, +103'h3e8a9f7173000dc21000000000, +103'h2e4c0461a6eb894bee00000000, +103'h0294052b657628bd622b640000, +103'h1215924092c22d1f0800000000, +103'h02acd4631756324a6ec5800000, +103'h24442447a86bc48b0000000000, +103'h2cc6fd782a1898ee1600000000, +103'h1abfff660f5cbd35c05fffb307, +103'h1d7b2e72fc23baadea00000000, +103'h328c8fca56e3ba13fb00000000, +103'h3209b5acb35ee886f700000000, +103'h1e9f747d26eb78514c00000000, +103'h1891f08358f52dfe0000000000, +103'h0ea827377694a27b2640111993, +103'h1aa217ff8e2692fe7e00000000, +103'h1afaf14e9cceba35f60000000f, +103'h013f42eef870d23584d80a923e, +103'h0078c28d536bc38422f24308ba, +103'h3746e4a6d4ab06731a00000000, +103'h3b3b99bed423c9006c00000000, +103'h1cff090cca6aada74000000000, +103'h36334a9044a647661400000000, +103'h24d34f97e2a55072de00000000, +103'h241e5b1298d89b032400000000, +103'h3a8d2f8dbcabea9b0600000000, +103'h1966b1b022ca45ad9e00000000, +103'h3ce67b389d57753b5d00000000, +103'h020b9533f4be26eb7e00000000, +103'h23094a3272a4a2241a00000000, +103'h3eb2e9cbf4b037580f00000000, +103'h3c26cf1316b9818a8100000000, +103'h16f22995956c6b567600000000, +103'h247bab0390933a698c00000000, +103'h26a9ce95a68563ff2200000000, +103'h1c88297fcc010f02b200000000, +103'h292005f472aadd985a00000000, +103'h0b244dbf8f3307182600001244, +103'h3ebbcff437530d0c9800000000, +103'h18d8b62803775acc2600000000, +103'h3ef6ab5e80332ac05d00000000, +103'h16bf7e2d580be0e85e00000000, +103'h3cbb581456028c46de00000000, +103'h190a3f07ecc20a743600000000, +103'h38d080c7a87d62888c00000000, +103'h16c9ed47c087a1907800000000, +103'h0ecf3ab0385822582024110810, +103'h1ad7145f91220f9fe2000035c5, +103'h14a0f8831ef14a501a00000000, +103'h34e83f2f38c85eafaa00000000, +103'h16b7276bcc695732c800000000, +103'h32de3200835196620300000000, +103'h1c274c351808bdcdce00000000, +103'h2661b0b9cae6efce5000000000, +103'h296473ee290e3c036a00000000, +103'h36d08e554e6fecbd3400000000, +103'h088e3f1e76d460ab5c2d2fda95, +103'h3254adb56ca4ef00ab00000000, +103'h26020c1ab4332e1f2000000000, +103'h04bda6836687dbd48e00000000, +103'h2ee92da94e89e7ef4200000000, +103'h10e9157a93478e72aad0c383f4, +103'h1e8dec4c8130bc1bf800000000, +103'h2065f13d9119d1968a00000000, +103'h0ac5d2032ea7bde30a0317480c, +103'h02af9ab8110daf209c57020000, +103'h0ce0f1df9ad38123ca79f8ffed, +103'h194305231e831bdbda00000000, +103'h34bee9fd2b640dbb7600000000, +103'h3ee28cba42a712de9500000000, +103'h1a13de97f665fcdbbe00000000, +103'h1118b1997748899602e81401ba, +103'h24a0a076d05c682df800000000, +103'h228c9d0fa07519c76e00000000, +103'h251fac870415ba3e3e00000000, +103'h1e18b8da26a2574dde00000000, +103'h0d5a4ec34cc203d4e2ed27ebf7, +103'h0cf84cda6adabcaf0a7d7e7fb5, +103'h2a0b64b8f7350b725600000000, +103'h0e3436d5c32d584cc012082260, +103'h18ff60406e38bd05b600000000, +103'h2e8c8d7ffd6cf3db7a00000000, +103'h2ef4776e956c541be800000000, +103'h24916ccf82f8e19be400000000, +103'h1f5bba7d30ed590a7800000000, +103'h065ec530957ec5d9fa00000001, +103'h2acec3bf74da80572a00000000, +103'h22ab166a3a394587be00000000, +103'h1c804ab0e60809473200000000, +103'h0642d80208b31fb16e00000001, +103'h06842b2d27336a625400000001, +103'h389ffeaf6c7642645c00000000, +103'h26f517b972fa6d918200000000, +103'h3b523a0aac9a6c40f000000000, +103'h18627c0d528f83fa6200000000, +103'h1aa628724ee1be050e00a62872, +103'h0b60173ba7443a126200005805, +103'h2e14739680ea6284b000000000, +103'h3d633c324d4a79c05600000000, +103'h1f4188c87a5eed56d600000000, +103'h0e019363b6c229892200008091, +103'h2505d8115603b2519c00000000, +103'h3cf47f43a50545b55500000000, +103'h1f2da0364b0b1dc6aa00000000, +103'h3cc5ae7fc6ff9d0a4f00000000, +103'h101fe652642d3d4098f95488e6, +103'h3a7dd076a0f2ebc05e00000000, +103'h08e100503112d212c4f9e9217a, +103'h224f4df06a90a2896400000000, +103'h00bd389af571a2d996176dba45, +103'h0558608616c0f0ca0000000001, +103'h2ae67431967e2964f400000000, +103'h008759efdcd689eb0aaef1ed73, +103'h00b8e23786bcfe1ca2baf02a14, +103'h375c0d58c744580c7e00000000, +103'h00c0294406fd3a4404deb1c405, +103'h22a26e943d59479cca00000000, +103'h215b3dcf7e1970e0d000000000, +103'h24d10b2760bbdf750e00000000, +103'h2e8b308bc3171d448c00000000, +103'h0042903426e8286bec955c5009, +103'h0f533779567358f7ae29883883, +103'h1b7d4f9f56b5e92bd6fff7d4f9, +103'h0763473a650920a52c00000000, +103'h37605c19fe8670448200000000, +103'h0c45996584e9b77ee676dfbff3, +103'h389e2fa8bb4a1398e400000000, +103'h3aacaf17c68facfe6900000000, +103'h20c44f2bff2ddca72400000000, +103'h04625f84b8da8bbeea00000001, +103'h2cea275c589edaeaea00000000, +103'h10bc02ccdc013a6fa25d642e9d, +103'h3d1d8b3bcaeb61cbfc00000000, +103'h26acf051daa76498d800000000, +103'h0816e126d6c4efd4a26907793a, +103'h041face6bd71e0267e00000000, +103'h1f29b3164688c14d5400000000, +103'h001f1b11caa86e341263c4a2ee, +103'h3ebbe7a628d2214a5800000000, +103'h151da40f2af13c5c2200000000, +103'h26f1409ea8ad24024c00000000, +103'h3e4d9e7b7ccac8117600000000, +103'h20526a8c62bc08b01e00000000, +103'h2c2957e7a109a72b9c00000000, +103'h22f1819f025c11b7fe00000000, +103'h0266cf58ae85699fa0ac570000, +103'h1ea6e523d376eb3ea200000000, +103'h1ca3039f14ddba975000000000, +103'h3ca8c945f2849fbb2200000000, +103'h1e0aa0a4ce27a35a3600000000, +103'h30f1e1a34cd06ca02800000000, +103'h12500de06adb0d44f800000000, +103'h0a8bf4b4dacceee844117e969b, +103'h334c7b446e1cfcc8af00000000, +103'h2b34a52e38a8f17d8a00000000, +103'h2eed3bb82af56cc1f800000000, +103'h1e80df87172a11f03000000000, +103'h28e1723e44174da85a00000000, +103'h205f01be22982d2f7000000000, +103'h108582bb8b799f6db685f1a6ea, +103'h2aa1707aead8a12bd800000000, +103'h1ce7702a7b5e23e76400000000, +103'h1344bd8266ff94624e00000000, +103'h2b3a3809c2e7048cca00000000, +103'h0ea951fed52bc20f3014a00708, +103'h1ef10d1fbf65fa18f200000000, +103'h2896ec280f0f4c17c600000000, +103'h193c5f92ac0059378400000000, +103'h0ac8d78a1497455f92003235e2, +103'h10811190acd3a4f23ed6b64f37, +103'h149f45b0369c7c7c5200000000, +103'h28ccc5e7861d8e0cfe00000000, +103'h26fa9f565abcd3bd3400000000, +103'h3abfbe24c28999a4bb00000000, +103'h395881e56a8438fb1700000000, +103'h2e8dc2226443f71fd800000000, +103'h28e0906c5c9c79054200000000, +103'h3ef032738a2a3b27a700000000, +103'h18896e1f750acb940400000000, +103'h1aa6e2c672fafe078e00a6e2c6, +103'h02084e8d4a846c2702084e8d4a, +103'h07063359672b4eed7600000001, +103'h152e534d28339d7ac000000000, +103'h19613ed4ee39d0d42600000000, +103'h0e8f2864426824214e04101021, +103'h0e417e1a9ac962f63c20b1090c, +103'h361f22be69588b5a8000000000, +103'h053064dcf89a09751a00000001, +103'h037b77cfaeb92c3384f6ef9f5c, +103'h022eaee3b2e991107c40000000, +103'h1cab48edf56508e02a00000000, +103'h20806e52b693b7c3dc00000000, +103'h1cef9d2c953f00b1d200000000, +103'h0617f839f4bf6f048800000001, +103'h2529e457d2af0c311c00000000, +103'h36a0d955d8c7046b1200000000, +103'h3eab8617bcf0e8c2e400000000, +103'h1cf5338b7291c218bc00000000, +103'h2efe5003b33d48307a00000000, +103'h12b678ad0e327bbbec00000000, +103'h0f35a5c17c30cbbf9e1840c08e, +103'h08a5bb98cee7446cac217ffa31, +103'h36a79388dc1cea2e2800000000, +103'h14e6b3a966c2a5c6f600000000, +103'h03584f85dd6a394fd49f0bb800, +103'h2afab721f150ecf93a00000000, +103'h2284632ab2a93c7f1600000000, +103'h372af9619ea3f3a10600000000, +103'h3094355f812856cbba00000000, +103'h0767aaad3753502d5800000000, +103'h0c8c0cf426e7858cd877c6fe7f, +103'h0759abba2d4f303a0e00000000, +103'h1ecb3e2138db3d2e3400000000, +103'h376527540134e8e86000000000, +103'h045260b41e0027099800000000, +103'h39271fa116654e5d9900000000, +103'h184b0ec81ab7af11b800000000, +103'h334a3b1d54deceb2cf00000000, +103'h0a7e505aec29dd7ae8000003f2, +103'h02b28ca21e7418983cc0000000, +103'h114c1746eaf268f32a2cd729e0, +103'h3a9d50fd6ca4f5954800000000, +103'h36cd5966bef10cdc3200000000, +103'h21273f4af88e5dd9a000000000, +103'h2af53dc76f5bb7405e00000000, +103'h1cb5a5371082f68b5600000000, +103'h3d1b023bfa783452c400000000, +103'h1a716c1d162dd989d4000e2d83, +103'h315633d7d448dbc5ce00000000, +103'h3696b2d2eeba47e2e600000000, +103'h0b5a285961107bbaba00000005, +103'h1a95d23296a72e8da8000004ae, +103'h00ff5595a00156e70880563e54, +103'h3ab1b4be7a9729199f00000000, +103'h221e5bca3a967eaf4000000000, +103'h2c9b7e90b448336dba00000000, +103'h0abfcfe4d9668f37f60000000b, +103'h0ae5782004020dc8aa00000395, +103'h06a24974cec1ddad8200000001, +103'h3cf59978daa755cd8600000000, +103'h26911ceaa1499f425600000000, +103'h2a932f945d3f38bb3000000000, +103'h30975006c2d055a5d000000000, +103'h065d4e26ad63853a2c00000001, +103'h36caa2141efad540ee00000000, +103'h06819543e55823679c00000001, +103'h3377c12edd22c57bbb00000000, +103'h223e42bfa2a45abf9e00000000, +103'h3f68498a961c1bee7b00000000, +103'h388d2596795a5eae1e00000000, +103'h170a2509f6c2a838b400000000, +103'h12a9e9f92f4fcdcf2c00000000, +103'h30ee09a80559f2d92200000000, +103'h244e45455703dcd25000000000, +103'h1008df90c6f1e67a548b7c8b39, +103'h32862214eb402bbfad00000000, +103'h025332683a490b50723a000000, +103'h167a3594accf2d655e00000000, +103'h02a515936e225fcd98ac9b7000, +103'h36c1dc0c869c95624600000000, +103'h141ece454841aaf5b400000000, +103'h2cc4cbce7e0387023a00000000, +103'h3239f6bd132255478500000000, +103'h28d1817940e721160200000000, +103'h2205a197b32117d31600000000, +103'h267b6cabdaf2994c5600000000, +103'h2af4bec23ef83ae40800000000, +103'h009066202573a78fe40206d804, +103'h16132e940f6866522200000000, +103'h1eb70edb0ef8cc724600000000, +103'h024d886e650bfb065621b99000, +103'h24dc3ce5c4c309e16400000000, +103'h2cde98ed0710924fca00000000, +103'h03495b466ceccf358e56d19b00, +103'h26acea1218cb68229400000000, +103'h311c73e41a14c3690000000000, +103'h3e4f079780c1ad7b1800000000, +103'h14922d9ab2de215f3200000000, +103'h14c222d3712d28f6b400000000, +103'h2ebd802ec4bf56916600000000, +103'h20cda0f31a817964d600000000, +103'h149f6f32893ef9939c00000000, +103'h3a4f5ed1290c9a86b700000000, +103'h132c77667eac09b93e00000000, +103'h2ec8e68d38fb688a6600000000, +103'h24e6cf18ca27dff0e400000000, +103'h2243b137f8f0c67e1e00000000, +103'h08ad2ddddcd79596e83d5c259a, +103'h2ec2b43cff1b46cee200000000, +103'h0cd3a32688c874acbe6dfbd75f, +103'h350c7200f68b28e9be00000000, +103'h17360759835ecc104600000000, +103'h16373248f76b3e113c00000000, +103'h1553a4074ea1456abe00000000, +103'h1b388a7264d877b3b4ffffffe7, +103'h16a899c7382c1bbb0200000000, +103'h1577752c5264a62d6600000000, +103'h08b18ea2a80d3ff49e5e58ab1b, +103'h0c8ced83bc84b520f0467ed1fe, +103'h3240c418843643c39900000000, +103'h1220b66850c331475400000000, +103'h03654ee58503f55fdaee584000, +103'h1cb727575624abc82a00000000, +103'h308db4ea1889faadae00000000, +103'h0a9a864074412205041350c80e, +103'h376a88de26ced6ef1e00000000, +103'h243e80dbb0695d2f9200000000, +103'h2a3724a166d3e60db800000000, +103'h08b9c314cd1266e96ad5d2fed3, +103'h1b7d838d36498b8ad0ffbec1c6, +103'h15101af4be034e9f9c00000000, +103'h3e0c0f8bd880d22cd200000000, +103'h0edbea30ac90ed219048741040, +103'h2cbe2bbeea9cfcad6a00000000, +103'h3ee9f8d7fa78e6de1700000000, +103'h11191490a737129d02f100f9d2, +103'h3ac9027625210b74fd00000000, +103'h1009dd7d353a2005a267debbc9, +103'h12e7b531ae03227bc600000000, +103'h0f3e73c4410cfff8fc8639e020, +103'h30cc44f3d2f4b52aaa00000000, +103'h397b2198623328eeeb00000000, +103'h34641e4292ff6de2be00000000, +103'h1e503d688b7a8f7b2000000000, +103'h0a495c877edeadbdb200000012, +103'h093730d11f2eeb263e0cedfb90, +103'h29582e09a87847adbc00000000, +103'h1b789924f0af787edafffde264, +103'h191393bb5807a6888200000000, +103'h168d3c0f72803fad7200000000, +103'h3135cf89cc93d368ca00000000, +103'h3556aab1e3210f783e00000000, +103'h2626fe58d356df020a00000000, +103'h32fef88846ad89b3ed00000000, +103'h315732652ed4880cbe00000000, +103'h3b433faae0d380950600000000, +103'h27505c68d12ab2fa3400000000, +103'h24b45828cb6df2a51400000000, +103'h2ac5dd9cb0be4f0de400000000, +103'h1eabeb1d5572a736ae00000000, +103'h33657933013884d35f00000000, +103'h1649ba42dee46ff0b200000000, +103'h049bedf7d249e923b200000000, +103'h22ac70baa893a3669200000000, +103'h172f9ab42f2f915e6400000000, +103'h08eb498110dc02190c1ba5cc0e, +103'h1a8b683ea60b9ccd3a00000002, +103'h3f75701ff0f6e64e4d00000000, +103'h0cf31b67ca824e8cf279aff7fd, +103'h06a0580e0af7beace200000001, +103'h132996cd56eada14ae00000000, +103'h06be7259dc8b3222b800000000, +103'h294a3434b0b4c8f00e00000000, +103'h1758449c76733b49ea00000000, +103'h0e5e13b11ebd6f7e9a0e01980d, +103'h1d4ebcda7615b41b1000000000, +103'h08ca98268573c7cc30dcaff55a, +103'h22fb3c62a2c284a6a600000000, +103'h349f1be8aa8d1ccd2a00000000, +103'h24006aed4c88592fcc00000000, +103'h0a776e0d002775187600000007, +103'h346238f8e527e005c400000000, +103'h020f888b6e9f4e12c41f1116dc, +103'h3949f4eb2501870baa00000000, +103'h3d0cba7aa6110f971800000000, +103'h02f6f5229e5b04823cc0000000, +103'h2d090fd05c67befce200000000, +103'h04ba7890df5eb41f8200000000, +103'h036d685d0b67c3efde17428000, +103'h243167c04f223c80bc00000000, +103'h26506ba5d08fa4ddc600000000, +103'h04d72e8836c10c9e1400000000, +103'h00bca58a1d117843e6e70ee701, +103'h0709e07be2e8a6cc1c00000000, +103'h1c7957ee62a54c563800000000, +103'h0378743eaaaf2cd21a43eaa000, +103'h1f389d2d072884c07e00000000, +103'h170a3e5f48a0f8ff2800000000, +103'h32c4865da6d9962c2f00000000, +103'h30241ab23ce3d48b7600000000, +103'h1832dbd8eea85ae91c00000000, +103'h066a21c01ecc759b5800000001, +103'h3c4260a676ff51744900000000, +103'h18f435b8fc6973346600000000, +103'h3089df56f8abd3dade00000000, +103'h38c7e3de10a00993da00000000, +103'h20d25e008329e8ead400000000, +103'h3edc29973af1ccc8e400000000, +103'h184f68625ac42ac96600000000, +103'h2c6e7b0858a05460a200000000, +103'h132d974232efbcc2fc00000000, +103'h38169c66df5e37cb5600000000, +103'h1af16e54708bcf0d88078b72a3, +103'h18906b0b6aa26b746600000000, +103'h2ecfbc230493d9c8d800000000, +103'h36fec9fd9d2444d44200000000, +103'h1c8c0fa38af400f74600000000, +103'h34a5245700f2caf4e400000000, +103'h3760a47ede7eda986e00000000, +103'h3eaffe6f9323feef7000000000, +103'h23239d348a84a36e4e00000000, +103'h108b3cf0c834a1dde02b4d8974, +103'h00e5a7a1ea583f126a9ef35a2a, +103'h0ebeeceb7ae37c033251360199, +103'h30bc31247cc923a51c00000000, +103'h1a3e18cbca881090980001f0c6, +103'h0ef4a250fb4441b51422000808, +103'h2b036ae896825a80de00000000, +103'h02f5af836576fcd1daf8364000, +103'h16b117c34f7a67ba7000000000, +103'h36f49093d370173dd400000000, +103'h107c4b1968212f01222d8e0c23, +103'h0086601fde15bf94f44e0fda69, +103'h140771f82e920aae5e00000000, +103'h3602eb8aee186ace3c00000000, +103'h2c6e7c5b831fdcc66c00000000, +103'h0afb3c2d3a22c8515a0003ecf0, +103'h069dbb93e69144acde00000000, +103'h32d245a8f08c80da1900000000, +103'h0e1f3a8c372a3c6dfe051c061b, +103'h2c8c0c35eafc8216ee00000000, +103'h051ba630f81bbca32400000001, +103'h033c84d8e4a7c8d90e21363900, +103'h30e9e45ae8c36f0a0600000000, +103'h14c1804aeafff3e2ea00000000, +103'h24959e51dae9d83dd200000000, +103'h2a8578fbeeab5888bc00000000, +103'h161d1c7f1240f6da9600000000, +103'h29782f0c3ec66fd68600000000, +103'h26d3357c54e38c559800000000, +103'h3c18142a3c5bbb61d700000000, +103'h02084b60e22ef0de2a0e200000, +103'h1d397972214705086800000000, +103'h32311759e24f50694b00000000, +103'h1e0c41973e88c9db6a00000000, +103'h0743273672b9e1354e00000000, +103'h10a8fdb3d0c622cc8cf16d73a2, +103'h3d55d93996094a02fe00000000, +103'h0a520528a6b247b6ce00520528, +103'h16d6faf3220820f06400000000, +103'h1615d1f2ed5a26190c00000000, +103'h251acbbf4431210c2e00000000, +103'h0b290f8e9b46f2ff1c0002521f, +103'h16e99b14bf61bebe6000000000, +103'h04b2478b488ace4cfa00000000, +103'h20d51a1ade746961b800000000, +103'h01290db6a526b0ed0227df51d3, +103'h3ac3f45184fbcb07e000000000, +103'h34c099aac624d8be8400000000, +103'h36480d5100e8cd100a00000000, +103'h1643ea58f4a966bad000000000, +103'h1c66784deaf1740bd000000000, +103'h2684d14ac3355e64c600000000, +103'h36c803061e9bd6b2b000000000, +103'h06f401d18420a7fd7200000000, +103'h0cc96757bae8ab039074f7abdd, +103'h3e9040e9c0dcacd51400000000, +103'h308c78e08ea6142cce00000000, +103'h0324878a0d3655169043c50600, +103'h16dd3e30fcc2cdf71e00000000, +103'h267e9fdb7ee755812a00000000, +103'h36fcae5b16c493b22600000000, +103'h1520d1077d43338da600000000, +103'h3f7b48ca733fe1e8bd00000000, +103'h24988e848760b2f03800000000, +103'h0a9d29bfc4dbfbbaaa00000274, +103'h066658ad29748a3f3000000001, +103'h3f72bb283511b3fef500000000, +103'h28beff8bfa780cac1c00000000, +103'h196bf6dffaeac7d45000000000, +103'h0cf4e9eea2a9c7604c7ef7f777, +103'h2af2673c7d15be404600000000, +103'h3a019889480aa82ee800000000, +103'h0688d68232fd0f6b6400000001, +103'h0cfadc4f6efea7f4ae7f7ffff7, +103'h3616a97cf4877e76e000000000, +103'h1b4834eac2825ac64eff4834ea, +103'h0884688778990443440eb6621e, +103'h2abdab8f92e1392e0600000000, +103'h38f5968c5d65a1b57e00000000, +103'h3cb5000006234d451000000000, +103'h02f6c439fe18e3d16c3fc00000, +103'h00d18cb73ccde3d172cfb84457, +103'h128d8e627ec4a80b7200000000, +103'h3eaf31c3409634c2af00000000, +103'h32f422691223c3252d00000000, +103'h2451f6e050d2f4e86c00000000, +103'h127daf2902c717517e00000000, +103'h3e6e0f7d27190e31d000000000, +103'h2cf4a493f896bd5ad200000000, +103'h2a9efccff904ccd7fa00000000, +103'h3b1c49f464f9716bf200000000, +103'h0e60ae6a4e986e3bea00171525, +103'h08be21120ab4b8304e054c9122, +103'h3ab251149915669a9f00000000, +103'h26ab4def20d387aca800000000, +103'h349dbc359a85d8c14000000000, +103'h122898b8013126b06000000000, +103'h3b682d6ab6cee2e5fa00000000, +103'h3abd28b808f77b9dfc00000000, +103'h1ae5abb2055fa908b200000039, +103'h1694076d3e1cd1c0ba00000000, +103'h137389d8da027d72be00000000, +103'h0521ef2a709684dffe00000001, +103'h3ec7d01a030a0eb8d800000000, +103'h3ecd5a12472bfde34800000000, +103'h3cefb5cb44f3cdfd4b00000000, +103'h14148ef702c1280f9000000000, +103'h1ccfed02beb0dddad400000000, +103'h269559c752c56cd1d800000000, +103'h3686c46f2e9559d49600000000, +103'h0a6bfd14552ab39bea000001af, +103'h22125dc90ab1780b1800000000, +103'h3b699c58971d751f6f00000000, +103'h248647b9f82fd2e87800000000, +103'h3c384ceff2996f410f00000000, +103'h2a1505c1d71fb6fb0800000000, +103'h24a3369ed45803eafa00000000, +103'h324edc9b3f6d09acd300000000, +103'h3a2a55802310404ba700000000, +103'h369f3da6165f1ce6e400000000, +103'h0833dcc710897267085d57500c, +103'h2e207fd30728b00d1e00000000, +103'h127a2c8bce5c8cd42e00000000, +103'h1ae419903d7d0ca7360000000e, +103'h38ad237b90f739330500000000, +103'h28ff9fcdeadb52c34200000000, +103'h1f7acc2d6488763ed200000000, +103'h235285610c88160cbc00000000, +103'h24a74b3bea02e23a2000000000, +103'h36f34a49cc55679b2c00000000, +103'h351a9c1af2fcb2d71600000000, +103'h14ca642ae8effd20e400000000, +103'h020242479d0a993bd6091e7000, +103'h193d029e72d4fd66be00000000, +103'h3ccd2a9074d73fae5d00000000, +103'h125a05598d14424cce00000000, +103'h12d6dd438ae16cdd4200000000, +103'h2e5e4e695c3b7236ce00000000, +103'h3cbabcf5ee124f7a5800000000, +103'h3eee6b30dd709de3b600000000, +103'h0c365bb8982b5ad9a41fadfcde, +103'h265fb91d9719c60a8200000000, +103'h1cc488b9645021c31a00000000, +103'h013ba7cf8aafdae0b2f5c1581e, +103'h032364c96774639a1693259800, +103'h1e367c9ce6b00b69a000000000, +103'h11635a7aead370330647f523f2, +103'h26e05a1c0809eccfec00000000, +103'h070d349dd86d474ad600000000, +103'h0cae72b9be4da166de77f9ffff, +103'h38ffbc3f445ad604b600000000, +103'h112475f7d00948be748d969cae, +103'h2e531c80480904fdb800000000, +103'h26ef0a53982d7af58800000000, +103'h1ad8998dc8809775d200362663, +103'h151cfeccae6fa1c96a00000000, +103'h1c6aacca08483b573200000000, +103'h2ec15fc51c653a23e000000000, +103'h1b458db5bacfe6edeafffffd16, +103'h0c4a531c289146b3066dabdf97, +103'h2ebeba4c02d6d468c000000000, +103'h197b5cd311212784ea00000000, +103'h1e9d397dfedfe1d0ec00000000, +103'h208efd16d65b3ea3fc00000000, +103'h0a120762b4f87821fa00000000, +103'h366be61754877538d000000000, +103'h34e6ec50de997c9b8600000000, +103'h2f41d45b560562b2da00000000, +103'h00f7fb09caec4f03baf22506c2, +103'h06a699da392e235f1000000001, +103'h20dcade379261e68da00000000, +103'h1aac3e883eccb84312002b0fa2, +103'h2a8131dfe0a966268c00000000, +103'h0442743b3a55a4aeca00000001, +103'h1931d9f5a6d6d68eaa00000000, +103'h24475e18eb194ac9e600000000, +103'h2e299a7f434b24bf8c00000000, +103'h1ab53d0c269282d8760000000b, +103'h00968447d6bc1d57baa950cfc8, +103'h0d4ea21230715a63e0bffd39f8, +103'h03200aa67007deabb6c0000000, +103'h3d3c97fa3c5680bde600000000, +103'h1eeba8267e768b645600000000, +103'h1556d5aa7cb3235e9200000000, +103'h3d335d925a9ecb851200000000, +103'h1217c425eef5a12f8e00000000, +103'h2652ab776b28fec1e800000000, +103'h39041e2d3e40c2e7d700000000, +103'h0768b441a4936e5f4200000000, +103'h2f6c15db1c978c8c8000000000, +103'h056518a4230040ce2400000000, +103'h06871a2f116c56a94000000001, +103'h06e9dea1d4d16f4d6200000000, +103'h2ae01173dd58897c7200000000, +103'h2a6dd0d26242681e4600000000, +103'h0cfbd0ff0e227992227dfcff97, +103'h3ef627d4f8904a648700000000, +103'h06c1edf8468c1b639400000000, +103'h28e63d98048243388c00000000, +103'h2e4cf5560a443130d200000000, +103'h02d626a6352a6ec8d83531a000, +103'h10efa25ae277641ee23c1f1e00, +103'h22953973264d8ac51600000000, +103'h3abd13c3f73d2d1ffb00000000, +103'h1e291f4598d266932000000000, +103'h34bf9990148f7a571600000000, +103'h2ecd77f972b8999cae00000000, +103'h0e28e127e678332cc214109261, +103'h24c177765645ab263400000000, +103'h142c7457e56e8c4e1c00000000, +103'h1726eb908b3003c47200000000, +103'h0cd9fc65de5c781c566efe3eef, +103'h28054067f48363ace000000000, +103'h1a762f90405d6012be00000000, +103'h3055ab06a962a07ab400000000, +103'h12652a4182d8d00af400000000, +103'h10d12198b52e7b119ed153438b, +103'h04c07c9cc693a5532000000000, +103'h3a0d37b39664c6ebd400000000, +103'h18bc93451c2543889a00000000, +103'h3944bee197327b3c3200000000, +103'h0efb658faeef0e814e75824087, +103'h2845b190e733cd62e400000000, +103'h1af4c47df52f32f292003d311f, +103'h28c91af39e74e4837800000000, +103'h0ccfeca57969a9016ef7f6d2bf, +103'h1ec5ccd8a332c3f50c00000000, +103'h18ef7a6eae02b09a8400000000, +103'h07485af74ec87d732600000000, +103'h1316200366b7f7e1d600000000, +103'h174d8e10ed0052d92400000000, +103'h3eb7c0137f1672dc8a00000000, +103'h1424a2b0956400ed7600000000, +103'h385a02c0d31bc100f400000000, +103'h02475ab2e64063b1883ad59730, +103'h3835057e1e9a66725d00000000, +103'h2c392325e0e1c1254200000000, +103'h34a141bb1916c6a36200000000, +103'h10252151444fe9c942ea9bc401, +103'h14e96498faf12b845c00000000, +103'h36480e530a164cd5a000000000, +103'h388879325effb16e9b00000000, +103'h14dfaab51547bfc1a600000000, +103'h3686c6010ed038f40400000000, +103'h101f0cd162afe3a91ab7949424, +103'h36cda0775936a9aa2800000000, +103'h3d7be58bea55b67b8a00000000, +103'h1671ea62212356f2e400000000, +103'h3e38282c5c9f3c7ece00000000, +103'h08ae499fb21126e0ee5fb7bfae, +103'h2c5b14bd31494f0d4c00000000, +103'h3b5d96563af798acfe00000000, +103'h2a836ee22752ad6a3000000000, +103'h374883ece2b043c06a00000000, +103'h351ebfd88c33b2a29000000000, +103'h253e4ad1827c368f7200000000, +103'h0e556e77769af667fe083333bb, +103'h20bf3f879cd941398000000000, +103'h12d954582b2eafb0f800000000, +103'h12271bcb4aedef389400000000, +103'h12f119cddec74390be00000000, +103'h0b560e3870ee5f5c0a055838e1, +103'h1e9443dc82df7929e800000000, +103'h1f0129318f3587625800000000, +103'h285bfdbf2cc9cb3eda00000000, +103'h107e15dd8acaf47068d990b691, +103'h288e8d57f326f22f9600000000, +103'h027e7dfc42a5080d20fe210000, +103'h2ca3f602eb3395651400000000, +103'h029339486eb2136156e521b800, +103'h234d70fe5b5609644200000000, +103'h372e9ae3dce942acb000000000, +103'h0eb4ccd67f36b3ab0a1a404105, +103'h116e942e37654e8ee604a2cfa8, +103'h00da6ee7441a1b65647a452654, +103'h0a9c53049488af939a0002714c, +103'h314779ce94631e7ade00000000, +103'h152954439eff717f7200000000, +103'h31707d478e46eb4e0600000000, +103'h0ed1c1b0e2703f91a42800c850, +103'h02bbb5add2e0bcd932d2000000, +103'h0908c825a2b27e8a16dd5b57da, +103'h2f554c1ce46e3437e800000000, +103'h20e8bb622c76fc5d8a00000000, +103'h36ec6a391acc487a6e00000000, +103'h20d0d5e93cb503dc9c00000000, +103'h2a67c02372a16e15b600000000, +103'h1a6cde95927243fef20000001b, +103'h36e8f9653eda04226600000000, +103'h2d315caf5846e2b7f800000000, +103'h212ec3d60e2fdc1d3600000000, +103'h06cd99127a6138cc8e00000000, +103'h3edeb24dda8ffca29d00000000, +103'h36c9cfaba15d95b51800000000, +103'h04fbcfc1603c4802f200000000, +103'h235dabf4570617ae9400000000, +103'h3a20c0f3db01e76ff500000000, +103'h2c73d295fd5f93644a00000000, +103'h002479ed3680545824526722ad, +103'h3511694764f426ee2200000000, +103'h3e0470502418a0db5800000000, +103'h24f95ec8da2a0a22bc00000000, +103'h064de0a5d92e7a72e200000001, +103'h1e22b6dafd27d93bbc00000000, +103'h1cebb3fe4275b9e19400000000, +103'h3ecd51fce29870bc9300000000, +103'h3ad8fa1e3e8424bad500000000, +103'h0f131cb27c5176b7b6088a591a, +103'h21751882762a70d5f400000000, +103'h364cce34043d8d887000000000, +103'h2cbcf4a226b2a60ae600000000, +103'h22b13fcb1cff743eec00000000, +103'h12f701abc8bc68e11200000000, +103'h3a6734626b6da8ac2f00000000, +103'h2714f4a17e64aa57f600000000, +103'h39755aeb78cbdeba6300000000, +103'h26d535745ee0d35be000000000, +103'h1cf178de57562e475800000000, +103'h3f7b64f47d2b63bbb700000000, +103'h1e69fb62991cdc9a0c00000000, +103'h3724708b1898418e8800000000, +103'h2cbfb90f76023cf12000000000, +103'h38b12fdb2e26ad7c3800000000, +103'h00ce0a629ae6668bb0da387725, +103'h2307c18414979666de00000000, +103'h1ad9ba341465a0c97800000006, +103'h0aadefd5366d624d8c015bdfaa, +103'h28a8d2f293471c81a200000000, +103'h228a1c9b9cf50c56d800000000, +103'h2f02fcab869ddf496a00000000, +103'h10e17d84e927fbe508dcc0cff0, +103'h2a2d60abd72af8908e00000000, +103'h14c06054690c76157600000000, +103'h1d486c53d239d6c14c00000000, +103'h2a6e579ca6fa3715b400000000, +103'h20bc3eca8442a3698600000000, +103'h2e351e88eeb0fb062e00000000, +103'h22ba745cd16d39d0b200000000, +103'h2b79a0f1fea25859a000000000, +103'h1833049ce05cccb67000000000, +103'h0a2f0bb14ad66da86e0000002f, +103'h2adc0dcbe30972455000000000, +103'h1cf649b72c387df69a00000000, +103'h0ab2ddfc19148bc27e00000000, +103'h1acc3ef7740ad579aa00000330, +103'h36bc0d9b3ebdb375c200000000, +103'h34b54e845a89f26d3600000000, +103'h1ee70d64114600087600000000, +103'h232d580644fb4e8cd000000000, +103'h187e782222e25bf0e000000000, +103'h0e8d4bb3c50fb3f7240681d982, +103'h1f2611b29e8e2c194600000000, +103'h3e04d7b9ed1b77cd0c00000000, +103'h22deec4e0d41897faa00000000, +103'h2a9b5cd30a4661399600000000, +103'h3767814f2e254d87a200000000, +103'h20c1d1e498c0aa5aae00000000, +103'h37379a470f282ba9dc00000000, +103'h1aeeec292ee9fd8e740000001d, +103'h08ec9f44e52197d582e68448b3, +103'h240f9fe83f1083feb000000000, +103'h18f34ae646fd23439400000000, +103'h1aff218e2b0cc32bd4001fe431, +103'h0af4f5c482000e121a0003d3d7, +103'h1e0c61d05cff2fa04600000000, +103'h323451dae6f42564c900000000, +103'h0f596529070087352680029083, +103'h148b3ba2f834d9100c00000000, +103'h1cbd202f068e3e391200000000, +103'h02ee345b5b1979dc0cc68b6b40, +103'h11136dec78d69a0b121e69f0b3, +103'h22392eb2bac4ce666e00000000, +103'h2e93c8890ad83c52e600000000, +103'h037ca0986e116b05a04c370000, +103'h307ef283dca5338eac00000000, +103'h1657de7a5f21d4271a00000000, +103'h36f598d74ea0c6aaf600000000, +103'h226b8f8724f8a5255600000000, +103'h3cf2f13c9cee3dfca400000000, +103'h341f8680bf59cd83ca00000000, +103'h0b6defebfd4cbec066000016de, +103'h2f5d2002306c45412400000000, +103'h3944f53dbada352d2100000000, +103'h1e1b0875e837552f5000000000, +103'h054ae931e27c4a6d0a00000001, +103'h24c788ae409752e2f400000000, +103'h36b06d6bc4e23c14d600000000, +103'h017387566aa9c4c3160ea60cc0, +103'h356df670615a322edc00000000, +103'h0ae4aff760cdb985460e4aff76, +103'h22f2bc61573baff5a600000000, +103'h3ee304e020205fed0700000000, +103'h047d122202131c4e5c00000000, +103'h2a715192c0f6212e7e00000000, +103'h30334a88c47333508000000000, +103'h0e30f3746ee484e34210403021, +103'h0d4efc4d2017cf6c06afffb693, +103'h0c8021742f48c2e076e471fa3f, +103'h0ea767c9ba97bf2d96439384c9, +103'h1641e16fc717e0a1c400000000, +103'h0cc0dff916bf486b7e7feffdbf, +103'h2357adee6c0129db4400000000, +103'h27373ec438c209d45a00000000, +103'h24ae8ec79a19b7c2c600000000, +103'h293dbf6cc050f686fe00000000, +103'h048c387d64ff854e9800000001, +103'h0adbdb694c3d44bb580006dedb, +103'h0aed882990c97d38bc00000001, +103'h2318ecac9ca558a20a00000000, +103'h3c9547b6a692e0cb9a00000000, +103'h3811280f48abcd783700000000, +103'h02ca4d234441152edca4688000, +103'h1f4cef6fff523d3e2600000000, +103'h1474ea5ec01c8a616a00000000, +103'h322fc6191e6979d16900000000, +103'h18966f4bb4de64302a00000000, +103'h033e2dad260e2a4948f16d6930, +103'h2d38294cbea49994fc00000000, +103'h164eaf4dc0e2c7422200000000, +103'h1eceaf202c1af08ee000000000, +103'h1c2d1322c3699fdca200000000, +103'h3e99a16ea2384efccf00000000, +103'h20aac94f7f65621f9200000000, +103'h029eb8727cff038e34f8000000, +103'h10ad98245ca9ccddb201e5a355, +103'h222617b2de4885502e00000000, +103'h16d6e63e30f61d748c00000000, +103'h08ed16e9121c35276a7891e73c, +103'h39024b222af31b659b00000000, +103'h04c14c38f2e0324eae00000001, +103'h2ec8d29feae27d70d800000000, +103'h0ac6767b6ea3c9a9ca0319d9ed, +103'h38e04f7e5f6c9c49b600000000, +103'h10ed43e6e83312c5245d1890e2, +103'h1ada6a9e2013624382369aa788, +103'h10aa0ec63000a62a6a54b44de3, +103'h361d7c980adb10c88a00000000, +103'h38fd86b39c851f8eba00000000, +103'h2510a39452a29c26c600000000, +103'h2e3722b88aa022da6200000000, +103'h2a5e48072eb0c66eb400000000, +103'h31607e1e5ee7e9273e00000000, +103'h12e7d3c44946312e6e00000000, +103'h0711c590f8a6af4ccc00000000, +103'h04dbda380a8e83111400000000, +103'h3356b54dd0a048a20d00000000, +103'h3eb9798ad57c22da1600000000, +103'h13626ef648d2d827e600000000, +103'h1eb213ae868c51b2ba00000000, +103'h34903b77daeec0a90200000000, +103'h1a0eabe338a0d4578a003aaf8c, +103'h17093f28af310fcf6400000000, +103'h18d6aa96083fbbb29c00000000, +103'h223067b61e48fadb4a00000000, +103'h0778e57f391fa5715400000000, +103'h2462379fda500d277200000000, +103'h2f7c998fe2c8f2a6aa00000000, +103'h02d6b732872b2a46865adcca18, +103'h3679cfb074a7c3d66800000000, +103'h213c8d9fb97e7b08ee00000000, +103'h274f58b66ef84ab96200000000, +103'h0e2b1673ce34d8591a10082885, +103'h3d31fe77b684310f8800000000, +103'h20e0aa5204af47835800000000, +103'h3b0dd13542e145fb0e00000000, +103'h053342d1e2c1f04d1200000001, +103'h1c8d8cc79ccfc1825400000000, +103'h2a6c07cce00304543600000000, +103'h3cf9ca557c90911bd400000000, +103'h1268d2d926fc98e8b400000000, +103'h0899cba9e4f6633e3237d44beb, +103'h1c9a85fcf65f36175800000000, +103'h129e44a43ef901c13c00000000, +103'h053294675c9387be3200000001, +103'h1cc37d132f31cc627200000000, +103'h1b4ac8fd336460c9ceff4ac8fd, +103'h0c314afe8f27dddcfc9befff7f, +103'h3e10cec12972a6da2e00000000, +103'h0c83da41f6a3f1d8bc51fdecff, +103'h0828b22534b4c099e64e395e69, +103'h3731ead243389adbdc00000000, +103'h3463015c4a614d011000000000, +103'h1b06bec0829337d352ffc1afb0, +103'h374e6dfd76f6392f9e00000000, +103'h074addd450fcf7f02000000000, +103'h1b7fe887074b65ed96fff7fe88, +103'h3816403acc9643c1e700000000, +103'h183fcfc1e7162c48ec00000000, +103'h2e5f98789e2c6c83b800000000, +103'h147c591f776c3c45a000000000, +103'h00e47fb3e4cbd4be3ed82a3911, +103'h38e2ea0a39482dddb600000000, +103'h18f780a9782cad919a00000000, +103'h193883cc730f979bd400000000, +103'h0ee5c3350a0718454c02800284, +103'h285ed75be23f9c11be00000000, +103'h3c20196071255f46cb00000000, +103'h0b0e08f69a8436a2ac0000021c, +103'h080b902896a450031e57e015c4, +103'h12102f9fe0b258f9b800000000, +103'h01546b28eabde9224e092a259c, +103'h1ebe05f8bcce18c23000000000, +103'h16abd76b3d2283eb1a00000000, +103'h243df8e0dae089e3d600000000, +103'h14827350308c614f1400000000, +103'h2e84d6e1d6ca5a2fee00000000, +103'h06555335ab4ccd802000000001, +103'h1b4853749ad1a461f6fffffff4, +103'h091bdd976026f797a09e950060, +103'h297bc9093a6f4b0c3a00000000, +103'h1ea60eab028b28a39a00000000, +103'h011d21ccec06f1acd49209bce0, +103'h3a65d950caad0057d800000000, +103'h16d5886c4aca2224c400000000, +103'h2ab48294062ffb758e00000000, +103'h031ea55f5d0583e1da55f5c000, +103'h068fb9d786ba0675e000000001, +103'h16adcea78ad8abd53c00000000, +103'h3096059c506865acc200000000, +103'h10ae3806a61634544c4c01d92d, +103'h0ccbee52d6ac39f09e77fff96f, +103'h0ea3ab14e65a71f74401108a22, +103'h1c5413ac3326604a1c00000000, +103'h3b6ce1f042ca0b5f0200000000, +103'h3e9be4889f1e1f0b3600000000, +103'h1b772111988b00fb78fffffffb, +103'h1eaccf91d726e5841600000000, +103'h1508de5c329e0695ae00000000, +103'h0d2ef885904ad62784b77f53ca, +103'h237331ba2453b483b600000000, +103'h11426bea3082ad09465fdf7075, +103'h15388b9e52f5dec36a00000000, +103'h0cccb1e822384aad9a7e7df6dd, +103'h12abae597670d64bec00000000, +103'h3ede5f4e823d88340f00000000, +103'h1893bd4cd6e9368d8600000000, +103'h073efa0e94c795dc0800000000, +103'h1422817dec5b5328de00000000, +103'h1a76df39329a4d37720000001d, +103'h2508c52888bcceb56000000000, +103'h0283e1a56233adee92e1a56200, +103'h36c693fe463c73171a00000000, +103'h176499800ac054bc7e00000000, +103'h289cec394086e8bac400000000, +103'h04920da7d6eb823ace00000001, +103'h02badd04fe886e740eb7413f80, +103'h06201f79421a7c1be400000000, +103'h1645b6aa04d55920e400000000, +103'h24f236958cf5789a2600000000, +103'h0a8a38bbe33b2f442c00000114, +103'h2eaaa956472d65d9b800000000, +103'h14e5960c90b79e959a00000000, +103'h00f5dbe3be6247ebe0ac11e7cf, +103'h38fb9a551547ddf87200000000, +103'h123c880a943db9dc3000000000, +103'h34aadb99ce3954314400000000, +103'h26d0cdbea175dc3bda00000000, +103'h165907cf5520b7d5a800000000, +103'h1c291fd87af185944800000000, +103'h3736f1bdd34a8d639e00000000, +103'h1f7e17d46e73ad3c1800000000, +103'h273b1a26e4aa9ef9ea00000000, +103'h0518d44f0228b6ce5800000001, +103'h1ee8140b6863d0f53c00000000, +103'h0901e12b6e7ca5443ebea237a8, +103'h228f5b878d64b94fa800000000, +103'h1ec774dd95669a7b1600000000, +103'h1e284501f6f5f602a200000000, +103'h06ece61b96bd6ae03600000000, +103'h1d2e2c7974e5afe22e00000000, +103'h3ed42c26fad295fdc500000000, +103'h34e0c64f9700c2773800000000, +103'h22e3567ad4d4ee9e3200000000, +103'h26a3518648b5b4edc800000000, +103'h1f48fc73ec990b689c00000000, +103'h10c13d5f523c5ceee442703837, +103'h193a40c1f2855962d000000000, +103'h348832c2c34696c22400000000, +103'h1a8bd9b15c80d784160008bd9b, +103'h2a288c0890090a46d800000000, +103'h0e019b4eaa94e3f8340041a410, +103'h256003f796bd7000c600000000, +103'h3e050362a4bf0b4f7000000000, +103'h332ada51ca1f0f470700000000, +103'h3959bb87c92412a9ac00000000, +103'h2a1d80b5fb4eecfb7600000000, +103'h309eb5e4f4a8a8833e00000000, +103'h1cdef6635ec629393800000000, +103'h123e4628ce64df1e2c00000000, +103'h10c1a897ec43d5818a3ee98b31, +103'h0a93f8027e821baa5a00024fe0, +103'h370eeff05143c4424600000000, +103'h035011175ad7bc44c4a0222eb4, +103'h1cf6115c90e6ac351400000000, +103'h22dfe7235236bd4c6e00000000, +103'h264bd8946f2ccea90000000000, +103'h3cfb8e47d00cb5cc5200000000, +103'h2a83003ff9588e60c200000000, +103'h2af11e6d34541ca89200000000, +103'h3e95f9e6ded71ce88a00000000, +103'h0167a4098ac83b55be17efafa4, +103'h134603f8895e353c9e00000000, +103'h1f7cf24848c5d9462800000000, +103'h1c07fd409b0bdd3eb000000000, +103'h3a6a25217888cf86f800000000, +103'h229488581690ccc79200000000, +103'h121d20cb50faf1e90c00000000, +103'h0b6b9284b48f7a412200005ae4, +103'h1ec5e17cc6ac9b0c7200000000, +103'h2aa8fffbd2182d912600000000, +103'h0d1ceb4270de0f0deeef77a7ff, +103'h3e8bc8721a870f09c100000000, +103'h268a1fe2e6a3fa4c3000000000, +103'h14351260252fc2be4a00000000, +103'h14f8326e8ab9e2a13000000000, +103'h0499618adeeef5015400000001, +103'h0ec19fb0f2e7276fe060839070, +103'h3e8dd823368088fabf00000000, +103'h1289d353c54228abb200000000, +103'h323fb12582d000cee900000000, +103'h32e483f89759d422af00000000, +103'h24707e3b889985483000000000, +103'h0c7d01793a7e0940c63f84bcff, +103'h3acbad629eee877c5000000000, +103'h2cea5a1aec6b88f58a00000000, +103'h3262daf5e73736582b00000000, +103'h0274e119132190731684644800, +103'h0f04f07d06846b68fc02303402, +103'h3883875d48f94c821100000000, +103'h0e6da73316fe3cff163612198b, +103'h0a8efd610e81c45c5e00008efd, +103'h1ad1e4021cef6b8f760000000d, +103'h3099360c287e68f08400000000, +103'h1059d49843504cf2a284c3d2d0, +103'h0718b02374e982feca00000000, +103'h0b59500b044357970c02b2a016, +103'h2c895b820a5c07ba8000000000, +103'h3637cfe994b557c58400000000, +103'h05369143c23eb3478e00000001, +103'h041ed59cb97683312400000000, +103'h0a4a718cbcad1474e6000004a7, +103'h18d2153742cbea119e00000000, +103'h3d0f10a74d165b9e5d00000000, +103'h228abf5ee4e870d59e00000000, +103'h037cf147a2f7817cea7a200000, +103'h1e1c37a5448240dbce00000000, +103'h3c87681486ff32237100000000, +103'h2608f422251b69c8b600000000, +103'h3472f10560a2d1dd3c00000000, +103'h26d46f6586abc5ff6200000000, +103'h1cb82ea17c1eb704c200000000, +103'h189b2000e2f3266a4a00000000, +103'h3a997b28feab550bc600000000, +103'h3e3aa82e5746750ca800000000, +103'h08879b3312dff035a62c35835a, +103'h0ef3453c901a9863fc09001048, +103'h375215b058a233970e00000000, +103'h1d5c3b2fe69578d39e00000000, +103'h18acd5bc1ce78e83f600000000, +103'h28dd607df843c9b3dc00000000, +103'h062883a3d0f09f6ff800000001, +103'h3e15da60b8cdffedf000000000, +103'h1a98a9f140f68391c2262a7c50, +103'h15030805be0c5df27a00000000, +103'h04b12fce18a507e3ba00000000, +103'h064ff7066ca80fe97800000001, +103'h02bcbe2cb3593fb792be2cb200, +103'h3c2008e4b8a936bdff00000000, +103'h368fb18f3a65f4eab000000000, +103'h08a4621d7885fdcf6a10cfe909, +103'h076122952e15af5ea400000000, +103'h397722c476ba117c1d00000000, +103'h223659b1bc1b34114a00000000, +103'h065b8589b49256d5c000000001, +103'h2406af3116c8b0877e00000000, +103'h2ec788371e2436113200000000, +103'h314272b9432ae5424a00000000, +103'h2ed8914cb0f26d796800000000, +103'h200106b5e134e032aa00000000, +103'h2af22ca68e0d717f5a00000000, +103'h130788a8710e78353c00000000, +103'h3c47c9ec9a00a4dbca00000000, +103'h197a78aa2e082d843a00000000, +103'h14e2079a6b4ff770d600000000, +103'h1e57080a02ca701b0400000000, +103'h1ada80aed6ac77b56e000000da, +103'h315e9e2f77037fbf7200000000, +103'h34eae93450de006e4800000000, +103'h22c72baa003c9e9dbe00000000, +103'h156dde3ab42787d20e00000000, +103'h1ec10880d6eeb37c0e00000000, +103'h1d17b2866c5c91b6c200000000, +103'h2d4c5cfa4b1d9a379a00000000, +103'h3abda60be7354cbe0700000000, +103'h3e5676ef9281a9b85000000000, +103'h18ddfb4f4e3f4fc43600000000, +103'h1ec21165cc95c6b3ca00000000, +103'h2ec3c1b3e573c2031800000000, +103'h24fabec00335d368e400000000, +103'h2eb3658470f9951cc800000000, +103'h06ab5c0d14f453dcca00000001, +103'h2b39194984a7b9613a00000000, +103'h323a98890a53156e4f00000000, +103'h3d71eb31768c2eb7d200000000, +103'h36a2d2f6a8c6c740de00000000, +103'h06c80e98a738b2725400000001, +103'h1895039bdcdb8568fc00000000, +103'h36b50e0d62a39401a200000000, +103'h0b614736bd38979d80b0a39b5e, +103'h08d447a0f2eda5aae21cf10508, +103'h2b7ffa7d7e4eece19e00000000, +103'h2b0732c3072334829200000000, +103'h0e31ff0a30a32f001010978008, +103'h2c9562eedcaa61c31600000000, +103'h3ee66c7e6adc60cd4700000000, +103'h0e8662ef9671c3bc2200215601, +103'h25498de35658303a8c00000000, +103'h2cafe7d724de932a2400000000, +103'h0ec0a38e0b28210d7a00108605, +103'h1cadc01236d808e49e00000000, +103'h000ca0528498ac72a852a66296, +103'h3ac3b0cd60466c84df00000000, +103'h1859547261530cd76400000000, +103'h02171924da16bda4c42e3249b4, +103'h20ace6bbf57012172600000000, +103'h04db60c5b6872b3c0000000000, +103'h0a504754563411f7f40000000a, +103'h31183aba5c0f72bdaa00000000, +103'h30f6ebc5275fba120200000000, +103'h2745aee71777f4cc5e00000000, +103'h101b9d45076ee09184565e59c1, +103'h12259d9aecb48f789a00000000, +103'h313f10ae7ed02cbda000000000, +103'h34b83dd410f5ca588e00000000, +103'h0ea95fc60334db070c102d8300, +103'h3009624976ed18db1c00000000, +103'h3f1df445869678a11f00000000, +103'h0b02b2ff369fdaea9600102b2f, +103'h26dd3c1174bdcf301c00000000, +103'h06eca02abec0822f5200000000, +103'h1ce91d1f249dbe40c600000000, +103'h387c12b4aa8a5e6b8500000000, +103'h0aaee334c6737b8aa800000577, +103'h109f82e4feef8e3f54d7fa52d5, +103'h1450a4c4889e71741a00000000, +103'h3c9f84e4d93df4591b00000000, +103'h1078c370ac8e991da2f5152985, +103'h2cc57d872b2e1e027c00000000, +103'h0601c5dcfaa6e1732800000001, +103'h28dc7fa6e66c5efa5200000000, +103'h24f52dc9ed6e24d74e00000000, +103'h0e9c750a964aa47e340412050a, +103'h2071da4dbb3fd2482200000000, +103'h2eee210408dc4752b800000000, +103'h24d6c6b4aa4e21a07200000000, +103'h062d913c993c42a47c00000001, +103'h3ecf0042bd1309592600000000, +103'h30b0419102409a95be00000000, +103'h2c6dca32010f9ad87c00000000, +103'h1379747372bfdc697e00000000, +103'h12c161595f2da69b8000000000, +103'h0f1c579872a71b0ef202098439, +103'h0cb7e86d44687c68507ffe36aa, +103'h0d63141a9284d400c2f3ea0d69, +103'h3ece1c315e3cbc6e0700000000, +103'h1166cae3ac9fd08898637d2d8a, +103'h12a694a4eb6decb9f800000000, +103'h1a4edace7ad4b79da4000009db, +103'h337bf4f8ce7b4c428f00000000, +103'h2ae5cb9128ca27110a00000000, +103'h0eef72b21b461c09d82308000c, +103'h1f67068d072be79b0000000000, +103'h28b35205941b5a4d1a00000000, +103'h007ae9c0b28260da207ea54d69, +103'h000ca88cdb35b2dfb6a12db648, +103'h1ae48362dab09ca06800000724, +103'h3ce845d3dabd452d4400000000, +103'h33076291f6a1c8901f00000000, +103'h1aa8e02a328a0e63fa00000002, +103'h1e8010a2249170f5f000000000, +103'h3e07ddba7f3a51202200000000, +103'h394cf0001eba61c24700000000, +103'h2933cad5dcc23f7cc400000000, +103'h0aa4b40f940f2f7ce20000292d, +103'h10a70e3f3c42fa52be3209f63f, +103'h14e3b98f06e7ae625200000000, +103'h38dac6a1168ebca18e00000000, +103'h3694132fea7276309400000000, +103'h0a5c8f3ba24d3cd1aa00000172, +103'h1968059a1ae150019600000000, +103'h2f5b2a5ae43ddf3d3800000000, +103'h18dd0bbd3ca5e4d75200000000, +103'h2ed163502a010f323600000000, +103'h2912f7b4c4de1aef7400000000, +103'h3a35dc1af2af7e3f9e00000000, +103'h32969fbe5ac275f46300000000, +103'h269d483916f8520f5600000000, +103'h04a4ffe6088ef1cdb000000000, +103'h288ad2826e2c3a06c600000000, +103'h3e20235e72d139ecce00000000, +103'h2e77ea2eda5c0c6f3c00000000, +103'h36c8030e997c2fcdb000000000, +103'h04a70dbc08f419fc8a00000001, +103'h02b252703ebc1d0b24e07c0000, +103'h328ed11143632ac72d00000000, +103'h3cc75c2185157d376b00000000, +103'h207c16ff76a44e48ac00000000, +103'h0d24ebd9f56baa6a32b7f5fdfb, +103'h3689ddbf94e7c169a800000000, +103'h2551fa6c620cad439c00000000, +103'h162f945098968b033200000000, +103'h3eb17c7d7ce8856f9400000000, +103'h1c9f0f14921819c02c00000000, +103'h0f74631552c9963daa20010a81, +103'h23566459ae68a5523c00000000, +103'h0ecef0a13cdd08678e66001086, +103'h393002585e336cc13d00000000, +103'h36a92dcfac025d627800000000, +103'h04ebef84a6325fbad600000000, +103'h0297568bdcdb8d8a842ead17b8, +103'h3a1fc5faa0c77d0f2a00000000, +103'h12dba22aa35ed39b0600000000, +103'h1699dbbd1e7e9995a600000000, +103'h008a750a715a3bc04af258655d, +103'h07569be246f4177d6800000000, +103'h2cea3fc9477e8c87d800000000, +103'h36dcb74b4cd5286a1e00000000, +103'h1e4dc862f8bf68336400000000, +103'h3719153af09c1f7eb000000000, +103'h14d879904ee9e7e1a800000000, +103'h39166a6d8602fd1c9900000000, +103'h282983b4dadb76ace800000000, +103'h12fc052f94f1e11a6e00000000, +103'h2a6aa628fc1b64cf4800000000, +103'h12c32f040e1769fedc00000000, +103'h011eb4fbba821027dad06291ca, +103'h0a55b1a04c453f2be8000002ad, +103'h277e8f5f4e63f427a200000000, +103'h00c2d1ed98b9a5c7f0be3bdac4, +103'h2a1e7e7abf3835273e00000000, +103'h0cfc3b2fc0fb0714d67f9f9feb, +103'h3d1f3710aa19858f9400000000, +103'h3aa627193615c0bf5500000000, +103'h10e6bce9b434f7cffe58e28cdb, +103'h265f87e16edb1ee93600000000, +103'h3ad359ee00c1dbd2eb00000000, +103'h3b60b18a262163b45800000000, +103'h3003c9e5a0f4bda25800000000, +103'h1adbda111a556f2c7e00000000, +103'h328f0925cb5939122100000000, +103'h0c04140d643513233a1a8b97bf, +103'h0a9a82a958c41c490609a82a95, +103'h2b25aee7a4c830566a00000000, +103'h26064a526e62b2ffc200000000, +103'h2d401ecf5a8861e76600000000, +103'h16af066f808eac39d600000000, +103'h1ae20a58accecb093000000071, +103'h00dd3e98437dd178b02d880879, +103'h163b25d79d5fdbd15c00000000, +103'h07216efe5e3d1a699e00000000, +103'h3696645ef57840413c00000000, +103'h12da24c8bc99af3f9a00000000, +103'h329bb6ab3230139e8f00000000, +103'h2ebd245f060a38674a00000000, +103'h091bac7c78a5ef127edf21b703, +103'h16f274db276313718400000000, +103'h2362ec796f7ebfedfc00000000, +103'h200377b6457134c92200000000, +103'h24ae3b5a66d421429000000000, +103'h20feee1106d798f8d400000000, +103'h02b2b4392a85d4533c40000000, +103'h12e53a4f4a84c2644200000000, +103'h2688f52e8d37769d6e00000000, +103'h2200d1505e1cb0ecb800000000, +103'h2750466b06a5a61b4600000000, +103'h14258fd8e8a6776ba400000000, +103'h0c7f9bab0ef6bdd6aa7fdfffd7, +103'h12111e1aa31c4daf9400000000, +103'h38bf5176f09be95aa200000000, +103'h22132aee82ad07754600000000, +103'h360d7bd1bb6c58ec3600000000, +103'h1afe8a8b9e7f83dab800000007, +103'h200be6f5148cffac7400000000, +103'h16b52cb92e8b8a381200000000, +103'h0e0b79f28e97712d2601b89003, +103'h02ce2018254c9de65680609000, +103'h15104a18745817d8e400000000, +103'h3cdf73c5372637f10b00000000, +103'h133a27aa0d3682097e00000000, +103'h372c4cbc0815f5ceb400000000, +103'h016b0fb45a501d78c0dd96968d, +103'h3e01ea85907c6a34c800000000, +103'h34befd47d2e779e92200000000, +103'h34b2921390e9646eb400000000, +103'h3ebc1cae04a861b68700000000, +103'h2115c4c13a5af3ca1600000000, +103'h14ebd709391710781c00000000, +103'h1aa9633a592cd53956000a9633, +103'h335053da2f18ac428f00000000, +103'h0e9fa63088c20f7ce641031840, +103'h2449ec50fa1263571400000000, +103'h320b42e988b209879f00000000, +103'h18f96ebb6cfbf5d89800000000, +103'h2e0046cfdf0738c22200000000, +103'h0cc92e613800a77d8e64d7bedf, +103'h24a47949a700ee4d6e00000000, +103'h0731cdb9b2ca1caea600000000, +103'h16bb1802576e95f84c00000000, +103'h054b9b0d1ea063b1fe00000001, +103'h2adcc595745b7bb45400000000, +103'h376ede6b38a716c17200000000, +103'h34cb13efa283dc56e600000000, +103'h0895df6c58f2bac21e33b2d723, +103'h3d010e9b0cbdceb1c000000000, +103'h22c7b97e1453ae1e1800000000, +103'h02357b229054bcb92445200000, +103'h0327191df51c76373a40000000, +103'h1d0b71db7651f159ca00000000, +103'h00ad994ab8790a77be9351e13b, +103'h3aa36ed814847c533500000000, +103'h06ee011e9732159dee00000001, +103'h0455099c50d584760200000001, +103'h3a0e0373d6c385949800000000, +103'h294007c31d188f30ea00000000, +103'h2af68865962692a4c000000000, +103'h04df1ea5fe669a67dc00000000, +103'h2e9d395c685d22cd7200000000, +103'h2e1ed9a76c3c41737000000000, +103'h0cb909235ad97acfda7cbdf7ed, +103'h3f79cb440af854774700000000, +103'h30a127cc96b15d9aa200000000, +103'h0a25a722952b28deac0000004b, +103'h10e667ec04cc50ab420d0ba061, +103'h3280a3854ef1f7cdd700000000, +103'h1f133395e0d85fb9dc00000000, +103'h205721411259033f2a00000000, +103'h38c637caf26c36d50a00000000, +103'h14019f0012c358161e00000000, +103'h3e2efe030a898fe11000000000, +103'h0a34bcbfde8b2ee12200000d2f, +103'h28937ebbdeba2ce42e00000000, +103'h395e778ce8eee9a40d00000000, +103'h1aecc8741082685fea000003b3, +103'h0904a93c48e0dfecd2f23b684d, +103'h16a7b8e5a2cda860e200000000, +103'h0104f5732cd2519d2aeba3882b, +103'h15511ba4c37a0a82ce00000000, +103'h361faa36437efff5fa00000000, +103'h22cf18b496d01b9abc00000000, +103'h314c2f93ceefc5d0fe00000000, +103'h2a9b981030bede859600000000, +103'h27650b0f610b0e196400000000, +103'h24ad7e048aa6a6299400000000, +103'h3ac60c94710bb138f500000000, +103'h1ece60f554b92f3d7e00000000, +103'h329593dbd17f3bd1ef00000000, +103'h2667d4dbae4d9cc74200000000, +103'h24e0bc0522e330a31200000000, +103'h12655467894b057ec200000000, +103'h16a31c076f2bc183e400000000, +103'h28601f79409115eb6c00000000, +103'h2a6abfb2563431f2da00000000, +103'h0f58908e8094516c1c08080600, +103'h3c9166e96aff111e7300000000, +103'h16f5fec83a57a1acf200000000, +103'h32ebac9276e908965f00000000, +103'h26158c4f8cdf075e9800000000, +103'h18d3bd78c0cab3f10e00000000, +103'h3690ffc066e040409a00000000, +103'h0ea5e3b4feb3fdb95a50f0d82d, +103'h1ca3d03ff644fd79c000000000, +103'h3880c42984eae12ec100000000, +103'h13286c04228eb16eb600000000, +103'h14b0541f5a0f75983a00000000, +103'h14ec39f3ec37e19c5c00000000, +103'h0a6d1d4240e835bbb600000006, +103'h04d8e1bf54d46fafa400000000, +103'h22d357ab1e418cf1e400000000, +103'h18dd432f251a6eb13a00000000, +103'h3d1f104f86edc65c5800000000, +103'h2249132b9ecb098b7c00000000, +103'h1d4785b75cea19db0200000000, +103'h34878534ff332d06a200000000, +103'h32e1f363db7ab2bdff00000000, +103'h342a27ef0f0237f2fc00000000, +103'h163d6605c0e42b56d600000000, +103'h153abdf7760e5345e400000000, +103'h106b42efcd4bb94ba68fc4d213, +103'h27167aa6228677431c00000000, +103'h0cc3ea4f72f1ba32e879fd3ffd, +103'h3355854f9a0834d90b00000000, +103'h0ef57395a6cc1f287e62098013, +103'h36e11b275921a4781800000000, +103'h035339fc2717180dbe80000000, +103'h00b71303dcf8333516d7a31c79, +103'h182320e49f4b6d313c00000000, +103'h165b4dedde0280351800000000, +103'h2cb51f6f3725a119b800000000, +103'h282608fe4c80ef079600000000, +103'h008f25c279360e76cee29a1ca3, +103'h3843afb7e05c17751b00000000, +103'h10fab9e262eb3d379407be5567, +103'h1ed765269a2eecef7400000000, +103'h3834ff726a29a6d1d600000000, +103'h0cc8a83509010bf872e4d5febd, +103'h02b8686cc2360b6adc0d984000, +103'h189365dc0efeb39fe600000000, +103'h0a9d503ad0b71c0ca8000004ea, +103'h28d0e16b6a4a81e8b600000000, +103'h0e057e9474e7d2238802a90000, +103'h367027285cb8b38ef200000000, +103'h2cd9835c2abe32236600000000, +103'h34f9fb9ca12e594bc400000000, +103'h2764f5c5ce07dca7ee00000000, +103'h0eb7c2128301d8449000e00040, +103'h12c341ee2b66ce0a5e00000000, +103'h008cf3ed381e901ce055c2050c, +103'h1084ff380ae1d20b0ad1969680, +103'h2e84e72aca6ec5f84200000000, +103'h1086a7621cf3c5304cc97118e8, +103'h1aef35a3cb78ac5b18000779ad, +103'h1e7654025aff53bd3400000000, +103'h2adf446bf6ee8960fe00000000, +103'h02b6facdd564dd635aacdd4000, +103'h3682765fff4421cf5000000000, +103'h36c69e4d42fb1c9d2400000000, +103'h100a19f7b87d92fd22c6437d4b, +103'h203c1f032e44314a6400000000, +103'h04d30171ff4e4b421e00000000, +103'h26ae05b01e8a6a454c00000000, +103'h0c84268b635d6bb74ceeb7dfb7, +103'h2ad7da63ca0b71676a00000000, +103'h376fbf86968f97f2ce00000000, +103'h0355efeb81677256987f5c0000, +103'h2ec68a95b6d731dd2e00000000, +103'h3c9490f73b2d21c8af00000000, +103'h156e08c028f3ac5e6400000000, +103'h02d7187be4883d559e1ef90000, +103'h30a79a8e38f64615c600000000, +103'h154f4e7dbacd5e91aa00000000, +103'h35242435ea74f91fe200000000, +103'h3aeca64c7ec4479d9d00000000, +103'h263d65b8b2e86bd38600000000, +103'h08846b3aaed512200628bc8d54, +103'h2698cf4e541277d8b800000000, +103'h2c222c81dc96e3136600000000, +103'h326fd153022fb261bb00000000, +103'h2ca5e1f7b151dee39800000000, +103'h12b104bc62c1b0369a00000000, +103'h0ece9f59ce67922e4a23490425, +103'h26831d0aa31896eaae00000000, +103'h01674d1d30e736447c2741b0d6, +103'h0c9d5c13566a534f1e7fafafaf, +103'h3a951b4016d1a06c4e00000000, +103'h36f46c9b226efc7fa400000000, +103'h166c54e0dd0417bfbc00000000, +103'h24cb736b14f8845ade00000000, +103'h0a94e5446b64d93bbc00000001, +103'h062ff78a0f304ca6d000000001, +103'h243a064f58c531eb3a00000000, +103'h20482cd45ef529754800000000, +103'h314ed7b4452f2fc4a200000000, +103'h2aba5bcfe4775c990000000000, +103'h35562c9256c6344d4400000000, +103'h16b72f400080901d2a00000000, +103'h160d5b62f4d6bcaf8000000000, +103'h1c92b74a8a8debef8000000000, +103'h068f6fcb229b47527600000001, +103'h07525c98fe2dfe9d0000000000, +103'h0695d98404bd6e682200000001, +103'h3cb0131e8a0fcb012000000000, +103'h3e5838a890a5a4852400000000, +103'h209ba5850e55b7a3ae00000000, +103'h030d10fe8cadf04c4086887f46, +103'h263beae02d4995d14e00000000, +103'h167a8fc2ef56a6cfda00000000, +103'h175ed92ad69291b00600000000, +103'h2498da366d0d2172f600000000, +103'h3e80cb8e436bfa9dcc00000000, +103'h04b252b76704d4d43800000000, +103'h3b3a80b06485a0627a00000000, +103'h065540596937f319e000000001, +103'h3f7d2175657273ca4500000000, +103'h3810fd2f2ac7b423ad00000000, +103'h18a9adbd2a44d5991000000000, +103'h1cc7feada355d2c83c00000000, +103'h0b1e42b7fcff808566000011e4, +103'h1ae6fa8c98c77f33080737d464, +103'h16776684e2e5c1eb0400000000, +103'h3d4ca8163eccbc779e00000000, +103'h0677bc6fd44422fc8000000000, +103'h0aa2514ed290cb12be00000000, +103'h28946560d90887829400000000, +103'h2a6c3b5de2aad8d16600000000, +103'h2910cdd28d3f3e323e00000000, +103'h3cf98343b6ab79902000000000, +103'h227303c79ebc4762ac00000000, +103'h20f50bce1cb5caa66200000000, +103'h0221eca5ff28ce6e0221eca5fe, +103'h2e8e0bb0211dda3c1e00000000, +103'h12a5a44a623fc6e21c00000000, +103'h1479844750cdd2923c00000000, +103'h32032eeaa27376dc9f00000000, +103'h0eb5a7fbf6ecfb23f0525191f8, +103'h0c85fb4968f02a0e927afda7fd, +103'h2a961578f8a5d20a8a00000000, +103'h1b74023ac42bcd53f2ffffffdd, +103'h2ec565d92ec1e2ccea00000000, +103'h3903c49b8a35e507af00000000, +103'h2b324d6c78fb4ae0de00000000, +103'h1706a847f0ff0f7c6800000000, +103'h0406d0775b315ce8e000000000, +103'h22c8db73b1380530d000000000, +103'h0ac0cb77b63ed5a82a00000303, +103'h2ab4065c9907b11bdc00000000, +103'h3aa650bde4c87c939200000000, +103'h26c9f8080e7c82f02a00000000, +103'h0325a4830a22d3ae0e6920c280, +103'h14c026a630eccbb61e00000000, +103'h3f6259e5331270392900000000, +103'h0ecd09b7c6d296df5860004ba0, +103'h2cb43c7a8534f0c48a00000000, +103'h14be42eb5301fa7c5000000000, +103'h2cb515123eb636f6d400000000, +103'h36be5772537479e22800000000, +103'h069a30b1be298ef46600000000, +103'h1aaafab5b4e7e666ba00000002, +103'h02bdbf35fa82171878d0000000, +103'h2a86baad172d11ce2e00000000, +103'h24c4300658ead1042800000000, +103'h1c2b345402718bb13e00000000, +103'h0a7a1f086735bbb7980003d0f8, +103'h354b20d54460f00b9a00000000, +103'h324934704edb0f140300000000, +103'h0a32190f83262fe946032190f8, +103'h268c895ff66f64599400000000, +103'h281cb56800a17d691800000000, +103'h2e0dd17ba72e06c90e00000000, +103'h02d9fca34e4abc310e7f28d380, +103'h1acc57b43d588dacb60000000c, +103'h292e171ec0328a500400000000, +103'h383153f25afee2044300000000, +103'h2f62978f052cf9230200000000, +103'h32de975cbc5e4d155d00000000, +103'h34b324d72ac0e4a46000000000, +103'h36ba3ca19c9f7c011c00000000, +103'h14c036705252a0d84600000000, +103'h34f32962090cdd79e400000000, +103'h128469691ccd13ea3600000000, +103'h18d68e1492c03d4c3e00000000, +103'h3cc82ec12544a6b55d00000000, +103'h320c7045fd1b34c9ef00000000, +103'h335d8f44bae3638b1300000000, +103'h0e7bc22dacefd3d10e35e10086, +103'h3c5a3262de4d6315c800000000, +103'h0e7d494d6cc92543762480a0b2, +103'h1cbb9501e82357a65400000000, +103'h26dd444176a0a0f3c200000000, +103'h1ceec752145c35f5aa00000000, +103'h314dad787b397a372200000000, +103'h3375b8e2572841893700000000, +103'h1ec11bf28775ef01b000000000, +103'h00ad1ff67aeba7e406cc63ed40, +103'h36f559f018acc3d68c00000000, +103'h27770e20d859e3cd0600000000, +103'h2d2103dace4f3dbd1e00000000, +103'h3940e89674c64bddf700000000, +103'h014c753620e74fb8c419e27772, +103'h1e04c5ac5828384f3800000000, +103'h1616f9ef9874ad855800000000, +103'h1b786beff9797331b2ffffffde, +103'h14a029ce4e906d214a00000000, +103'h2caf37656808d9114200000000, +103'h1ee67d4bbca902df9000000000, +103'h2a9270b76b583a44fa00000000, +103'h2cb7d754c83eb790b600000000, +103'h3e6dab1372d128482000000000, +103'h392c57e36088ff9ceb00000000, +103'h2e940792def6aab05c00000000, +103'h1153f18756230293bc987779cd, +103'h3a52930c84b70a269a00000000, +103'h16225cd9d40afbadf000000000, +103'h147b26440f5d8eba7600000000, +103'h2eca9a5ea67feb944a00000000, +103'h213d110cfafb11d85a00000000, +103'h166691e1e8c5ac370000000000, +103'h209b0e64c902bd43fa00000000, +103'h3a2d19a21e694f25e200000000, +103'h3b3f1073c1045d8aad00000000, +103'h344c191dba31772cca00000000, +103'h191ecdfeb67087a08a00000000, +103'h04f44023aabca0be4600000000, +103'h0e33016e82db6ebcfc09801640, +103'h1a76204406cfaee0a600000762, +103'h20eab6465702b04f2a00000000, +103'h1ccfd3e93078d0933000000000, +103'h0371924a506386d986c6492940, +103'h2ceebf686c335ac2b600000000, +103'h1e3b9b672ea4ed0d0600000000, +103'h248b27b51c93ac757200000000, +103'h1d5384963acf47dca200000000, +103'h227f6850df5a6f91be00000000, +103'h16dea6ce3aadf427f800000000, +103'h38e2d2589e2d5c78d600000000, +103'h377aaa58750c03471200000000, +103'h2ee1ca34eceed59fb000000000, +103'h04a359a323697ff82400000000, +103'h1712dd39514b4a2d1000000000, +103'h06afbd4854eea3d03200000001, +103'h2b58a09e6d0181098200000000, +103'h3af0599432b13e51d700000000, +103'h2cf192821e09def04200000000, +103'h2e3e159d18fa38847600000000, +103'h07793c8846ebcb069400000000, +103'h08b5e47cf429e0a3ac4e026fac, +103'h3ea3cac37aa31d2bf300000000, +103'h129b8ffa455901a8e800000000, +103'h008d8db582fccc6c62c52d10f2, +103'h336b567756985c66a700000000, +103'h1b72ffdcd725ea1c2afffffdcb, +103'h3e1dc66e489140938000000000, +103'h25218ea8a50440705600000000, +103'h0f22234f622206de9e11012701, +103'h0ebb145cc643958742018a0221, +103'h2579ef865665b8d6a400000000, +103'h04ca0b436520cd336c00000000, +103'h071e6770ca9abcb9c200000000, +103'h2c94ca7cce64c7fd2600000000, +103'h184ec31014832f6df000000000, +103'h1a6e747a0017f9eabe00000000, +103'h00aef3175966bcfad40ad80916, +103'h328a2e6e72d53174d500000000, +103'h30ca31c2b484248c2e00000000, +103'h048d6484e60e52faa000000000, +103'h1a689131d6d884bd54000d1226, +103'h08aa7ad99c65e9423a67c9cdd3, +103'h28c195f636ce7a741200000000, +103'h3f5cd59eff78f54dae00000000, +103'h38066842673a8b43e400000000, +103'h0a887fa3249760e2e20000221f, +103'h397080461e9dc9254900000000, +103'h1c26fb5d292648c86e00000000, +103'h3f566bc1e296c90e8d00000000, +103'h08c0676a7ebdc46bb43ed180e5, +103'h36c1c3f5fe14302d9600000000, +103'h0360e9a6c6d4979816a69b1800, +103'h3726581ffc965b8e1400000000, +103'h0e828fa7bef74534da4102924d, +103'h249c8b9b351d9d54d600000000, +103'h38cab7bc42a02cfc9400000000, +103'h12cd7b75663cb897c800000000, +103'h28669abc9f0770540c00000000, +103'h3cf6ff38b0d4ebc97200000000, +103'h04a50109993b86861200000000, +103'h10f32fd7143285bec260550c29, +103'h057e173c5ad786c85c00000001, +103'h16106ef5aacab69f7000000000, +103'h1877b2786e48cddbca00000000, +103'h341a7c8145593cd17600000000, +103'h26efcc48ded0ef49e400000000, +103'h309ca2d8d2eb6bcb2a00000000, +103'h2614300838db38140800000000, +103'h0cd48b136a77daecda7bedfffd, +103'h36ee22f0108c0af51400000000, +103'h3ed8aa169d6096087e00000000, +103'h18ae9d08524eb8f88e00000000, +103'h2c5fc80e1127630f2c00000000, +103'h2a88ce00aad600177e00000000, +103'h3a3ddee85735c8259100000000, +103'h275385d882be96263a00000000, +103'h24b7e5c13cfc750e9000000000, +103'h3543a8b9224ffae71200000000, +103'h2ea56bc88607e0a84e00000000, +103'h013cf6fd7c4b896170c4402f76, +103'h12931858aaf0f529f800000000, +103'h22e5aec26b2dec277400000000, +103'h128840133ec104801e00000000, +103'h0b32b20c60a6b3428a04cac831, +103'h3e28ad66f32ef355c800000000, +103'h1f0f9deb7f61a5622800000000, +103'h28247a977c8a52c91a00000000, +103'h30fa5bc39a99f0b49800000000, +103'h1876f03242be6b4c1600000000, +103'h322277f6b2b8c70fb100000000, +103'h0c2fa51d4b2fb741f497dbaeff, +103'h22c7250cfe522f38a600000000, +103'h12f895b14a81d455f200000000, +103'h06e871a1ad48f962f000000001, +103'h2e9114a1bf418f143a00000000, +103'h21696ee3c72a00b5e600000000, +103'h1093f85e74bb1557a4ec718368, +103'h0b40562f1424843b6a00000501, +103'h3135ad62a4b87c99de00000000, +103'h156c93aa6ef8d2c8f200000000, +103'h00cd7aa81e2e802b967dfd69da, +103'h1ee976fd729b13d60400000000, +103'h1229f78e32688e7e2200000000, +103'h2922f4b8d352057b9600000000, +103'h2f14c4ac647bfd09c800000000, +103'h103514cb8c9ef1c29acb118479, +103'h26f078c0bab3b66efe00000000, +103'h31146b340ce8cb3a8c00000000, +103'h0a8a6322f2d943fb4608a6322f, +103'h0a7c581ba2edaf2f52001f1606, +103'h170d3ed6ef7812524600000000, +103'h1d51dc0138f46a6de800000000, +103'h317f44660e01a944d600000000, +103'h3685f0c62a5385460e00000000, +103'h1e7a4c559ad2c9ac1c00000000, +103'h36e6ba375158ba724800000000, +103'h05479286f0d306c7e200000001, +103'h22aa141b66b9c0ff3400000000, +103'h2a601af5eb0153862400000000, +103'h0ce8eb7c8cab67a18a75f7fec7, +103'h00ca7675760b8297746afc8675, +103'h257f083644f46e140200000000, +103'h2eed5af644bee4897800000000, +103'h255d013c6a3decbfbc00000000, +103'h26780f24192b47b60200000000, +103'h1e9e9fa33c8848f26c00000000, +103'h1cb99e36620058168400000000, +103'h1e938153029ef7b9c200000000, +103'h0aab512f5e5895f0240000156a, +103'h0eee68c1bcec17432676002092, +103'h10b9c946869768728411306a01, +103'h368581e1d485d1344000000000, +103'h1cf03236e63f9a7ac600000000, +103'h22b3787c1cc51c5c9c00000000, +103'h2262d60478b54e938200000000, +103'h2aa99bff5b68c70f9e00000000, +103'h0776332e7ecb9d141600000000, +103'h088264d86975391372fbaee58d, +103'h2753b2deeeeb6c41f000000000, +103'h3cda4f78f76dd11a5900000000, +103'h2ec9b3229cc183f94600000000, +103'h1e84b3e0589bd3723c00000000, +103'h36b4edb189658694d800000000, +103'h3cd093c4a6ea3a753100000000, +103'h395a0af21e9f2826b900000000, +103'h10a50618db6fbbeb609aa516bd, +103'h028bd4b1d4c9c6dd7e00000000, +103'h3ad829dfa46eccf65900000000, +103'h1a0eb982a6faa1a82c0000001d, +103'h18e4714c62d2cb87d200000000, +103'h3229e5017ce1850a7900000000, +103'h1f391f9416c5f656da00000000, +103'h30b7271d08efdb585800000000, +103'h2a2fd04e2728faec6e00000000, +103'h057b450718e022097600000001, +103'h1ca83eca820ff2579c00000000, +103'h0a9b2ee4c68b375eb400000013, +103'h017dfa576433762936d8b8404d, +103'h1e89c0b66ecea50dfe00000000, +103'h1375a91ef14c9f656200000000, +103'h0b7183df0ed6601bd000b8c1ef, +103'h08f895fde04c093ac05a4e6390, +103'h2ab31e45eabd8d19ce00000000, +103'h3a3c4b9bf2b62317b000000000, +103'h3c1218575c69415d9b00000000, +103'h0abe452e98a58cf98e00be452e, +103'h3ab67b4094b7a550ea00000000, +103'h166c3e6c5e75ea7f8200000000, +103'h24d824afda2c65c01600000000, +103'h0ead4c50f098a42c7644020038, +103'h132800eb9570c8dc5000000000, +103'h285a5ad7231e152d4000000000, +103'h1e029f4235461618d400000000, +103'h2ed7496d5ea070eff600000000, +103'h2e4497c4fca310322c00000000, +103'h0322aef8ed7a599f8a2aef8ec0, +103'h3a1edb5a1abef1648600000000, +103'h27611dd41ee1a05d7200000000, +103'h3143d13e19007bb78e00000000, +103'h36c994da3f61998bac00000000, +103'h2ac9b215eea56ac9c400000000, +103'h3888c0b6256effa40200000000, +103'h24296fb3cf38b1b9f000000000, +103'h28ca9a6906c172701400000000, +103'h2acd5ea9eaeae223e400000000, +103'h1a758db492b57c8cea000001d6, +103'h2e8cbc633c82db36d600000000, +103'h12dc9ccbd6f868eb6800000000, +103'h3eedefa48685254ea700000000, +103'h14ea24a11861c21a7c00000000, +103'h3c9bd62a964fb1bf0200000000, +103'h22d062eaeb39d6601c00000000, +103'h20fd5896a8d5ac8ab200000000, +103'h22af73910aa60f759e00000000, +103'h3ec350a5eaa3680c4700000000, +103'h3326df79ce52db9d5100000000, +103'h10c444adcd162c433cd70c3548, +103'h1637566c7f3d0bbd0a00000000, +103'h265077a0ce01506ad600000000, +103'h220d00e16538a6d75600000000, +103'h2d1c65bf4c891e782400000000, +103'h0441f6e06e961f598a00000001, +103'h1aa493be9cb28518d6000a493b, +103'h3f088107a0f47bf94500000000, +103'h08a51527fa990fb7e01e0d480d, +103'h1ecac7c078a190bf8000000000, +103'h248699b28246a5e77a00000000, +103'h04f4f0bd61116da7f400000000, +103'h0657c3c18498075a7600000001, +103'h0153a67d8a8cf817d6f04f4ab0, +103'h34f119f910e4bbd95c00000000, +103'h2ad5335c11386256e600000000, +103'h02caba6707297c4ff618000000, +103'h1e5848cc70feafac0600000000, +103'h0472cf49b2c96a130c00000001, +103'h3a7211a05121b2df7f00000000, +103'h00a9b64dd4948229309f1c3b82, +103'h0e0ad74b4f0693c9820149a481, +103'h0d6aa7f4d0b04a1756fd77fbeb, +103'h3c93e2b15ebb2162a700000000, +103'h3eded04d6b25c9577600000000, +103'h16be4012a6b9ac08d400000000, +103'h3ca443a166987c563e00000000, +103'h333a91477c56bc68e500000000, +103'h068c005038fb000a4a00000001, +103'h050338b06a359151c600000001, +103'h29341d1970c191a1fe00000000, +103'h34fd7dd8b4c4ca526800000000, +103'h3a1d9b00dcf8e76bd800000000, +103'h3a38b83350f665448c00000000, +103'h228966b78d1400456a00000000, +103'h3c9ba6ddc64cb878ba00000000, +103'h0872b15668d61f304652573317, +103'h3242a33ae471c60e0d00000000, +103'h2f08fa63eee477647600000000, +103'h34e351d260271a9f5a00000000, +103'h020a61b98e30150348530dcc70, +103'h390790d1051366d5ab00000000, +103'h137685f6861dc88f3800000000, +103'h1cc9f2807e2559603c00000000, +103'h064479a9d09bdf56c200000001, +103'h3eef15d66c65d1d74100000000, +103'h3cad18d8b2aa4b811200000000, +103'h3e88e46a329961577e00000000, +103'h008a095bef467a3032e841c610, +103'h12270da46ccf5e9a6400000000, +103'h1029e3c42d5967f652683de6ed, +103'h02d70564fe80759abe80000000, +103'h271d885d50aa595eec00000000, +103'h38aa8585d2815ec3ea00000000, +103'h3906e148ba9ee7213b00000000, +103'h24bca501f3496ca70e00000000, +103'h0ef2de55eb504defc8282622e4, +103'h0ad37108ce0cf2f1ba00000003, +103'h1935627f9effd147a600000000, +103'h21363b17a8d342507400000000, +103'h1a808056c008a4d01200202015, +103'h011b1385a03edfe7baacf9b6ad, +103'h36c299a63abf603e7a00000000, +103'h0969f10e7cda73c41ad9c16533, +103'h04e48ac7329d0d6a5600000000, +103'h3e67c94ffb06fe78d200000000, +103'h1a29e7c07eeb894004053cf80f, +103'h30ab666f7e53528ffe00000000, +103'h030758e2997d3a507e00000000, +103'h070058c00928a0bffc00000001, +103'h050057164b2ff9a29400000001, +103'h02ebdeac913052629cd5920000, +103'h3e2ab8d2d530a978e600000000, +103'h12e6cd49991c88257600000000, +103'h2ecb8280564740f84a00000000, +103'h14e03159aa2e0e41e200000000, +103'h0a25329598f990c23a00000000, +103'h169add4a6ed9c21be400000000, +103'h382d1024b8fef4b17d00000000, +103'h320683f74e99d1fbeb00000000, +103'h170e060bc8c6e220a400000000, +103'h140f18e27acd6617f200000000, +103'h3ee9edd512db6c23bb00000000, +103'h22c3b77926ea85063600000000, +103'h1637531924d472db4800000000, +103'h1171d0d9c8982a546e6cd342ad, +103'h0779b4b25ecf7d6d9200000000, +103'h0e5d04aeae414e475a20820305, +103'h3d2ad9b136bb02f9b800000000, +103'h10cd218f051807a868da8cf34e, +103'h2b0793c14342e1599e00000000, +103'h25118361121002e8a200000000, +103'h0c5cc1483c1796a9e42febf4fe, +103'h2a63022920291a0af600000000, +103'h0c814ab26c85db533442edf9be, +103'h32e2749556e8dd7c5500000000, +103'h2953a160e56a282ec200000000, +103'h1cdc64d6564c9cc41800000000, +103'h328e4256bea03e24fd00000000, +103'h34c5fb2a5c7ca2fb5200000000, +103'h0ce6917a4f0ae55212f77abd2f, +103'h0b714ff902d0e07c6e00000171, +103'h1c48ab3bceb771f6bc00000000, +103'h2ec044a39928c1efbe00000000, +103'h1cb48106b6716d2b8c00000000, +103'h18b3a2bbe531b1cf2600000000, +103'h1683a4ed82e632d5dc00000000, +103'h240b1915da99d591c000000000, +103'h0abb4f2df21d7a7f422ed3cb7c, +103'h26dcf271972893951e00000000, +103'h2730478460e3e2c31000000000, +103'h2b69cf6d06c0d534a600000000, +103'h083d2ce76cf11cb90666182f35, +103'h182e04e1175aec260c00000000, +103'h3e47706fde98190d7800000000, +103'h0444bec1b6c61dee9000000001, +103'h1002e248340d8e5e6efaa9f4e3, +103'h08b22287b9524d2026f037d3cf, +103'h18bc4eed48552f685a00000000, +103'h095e9460530751f0142ce2c823, +103'h2ec6f7c1eac3a0dd5c00000000, +103'h083ce981f222353dae0f6e5e2e, +103'h1c05286220e92cff9a00000000, +103'h3b2296aaaa2616818c00000000, +103'h284756e3472b3ee3ae00000000, +103'h022fb7f9414dd58e58bfca0000, +103'h113a4e4cea952c719e5290eda6, +103'h3e2e11a02cc4e46ae000000000, +103'h1647eb74fcff32b7ca00000000, +103'h348d042d7a2d4457f600000000, +103'h141ff27451752fccf400000000, +103'h1f480d2cc60233fa6e00000000, +103'h16350c501b22266ec000000000, +103'h0b213e2b3b6a339b861213e2b3, +103'h393ab45e509f3feba100000000, +103'h38c95a5e5ac07e16da00000000, +103'h3e5a3458d2fb32752a00000000, +103'h210d34c20cc48cd38400000000, +103'h3a2a68c6cb1ec12c5900000000, +103'h26e6dcb72b2bf5ee6400000000, +103'h2b63cebe66565eb52e00000000, +103'h02dbf33acd3d3b6c5a33acc000, +103'h2618a48ab6a10a2ac000000000, +103'h17741706fb7cfd658c00000000, +103'h30fb7f71a095a1f04200000000, +103'h30d946917609b8f73c00000000, +103'h3cf4491da7053868df00000000, +103'h3eb055d496de7efa5400000000, +103'h3ce95ff112d2c817fc00000000, +103'h1ab80bfdd2831dec92002e02ff, +103'h2e907101cf6c7ddda600000000, +103'h2b6e0e6ea92489db7800000000, +103'h3e2a2ad5d6b4fadd4600000000, +103'h24b90f550323094bee00000000, +103'h1ccb11c0c04d3421c400000000, +103'h2349920a24064376c600000000, +103'h10ec9c2f00d15537860da37bbd, +103'h1544a131221ae741aa00000000, +103'h1cbfaf7f32078370aa00000000, +103'h2287f1ef064c24a1cc00000000, +103'h0e5677d5a20bd420fe012a0051, +103'h38f652f3c693c6100600000000, +103'h06b1155394ea3de5a800000001, +103'h04735b240ce090d96e00000001, +103'h0a81c5965291a62d0220716594, +103'h349c0429990501511000000000, +103'h224a08cce286c6e76200000000, +103'h26e24b55d622cb10fa00000000, +103'h375b1eb83b6cd3ddde00000000, +103'h19659847a04f1f33b400000000, +103'h1575132816aa3debee00000000, +103'h320b54efee0fd6338f00000000, +103'h26c461c8c284e95ba400000000, +103'h16ea427f74903e4b9400000000, +103'h255f4269dc54a0145600000000, +103'h0b7e8040333ee293cc02fd0080, +103'h1ead944a169e24fda800000000, +103'h346191afa11ca53dda00000000, +103'h00a5cd60beca3987f0b8037457, +103'h293ea926352bcb379200000000, +103'h0216677f74d198985033bfba00, +103'h348c4ad65e1041be8400000000, +103'h061ed36b2126a93dfa00000001, +103'h167b9587d4b2f4145800000000, +103'h1c0422dc1ad1c77f7800000000, +103'h175e48c8b34d5d074e00000000, +103'h2ec8b073ce517fe36800000000, +103'h2759c15ce4afc8ac1a00000000, +103'h349dc65a5278791fe800000000, +103'h1eb392d738d23a7ccc00000000, +103'h3916bc5b6e7000d71f00000000, +103'h22cb65c30d2393ae5800000000, +103'h2e2fd7d6c53a5009c600000000, +103'h0e0cc30a6705b5ccd202408421, +103'h26bbe8bad6358da39600000000, +103'h2cdb0f42654250adfe00000000, +103'h3f1dc9784afe3968d500000000, +103'h149ad3b7f6d948ab3800000000, +103'h131d93c474f712238200000000, +103'h26d5e1748891e5db7800000000, +103'h1ed07fd29caf799fec00000000, +103'h20c9579982855b147400000000, +103'h189b780ba255dae71000000000, +103'h0464aaa1431f32809400000000, +103'h3abfc3125cbaaa8c3700000000, +103'h0aca5523601f552d7800000006, +103'h1e5a4248dadf183fd400000000, +103'h15400a5566a96d633600000000, +103'h0e4504e28403afac1000825000, +103'h2304a9fbda43ba017600000000, +103'h18e3a442a888bee3fc00000000, +103'h2aa1b6c94a8d68dfd600000000, +103'h210936b325710d227e00000000, +103'h1d7466490e12c3ebc800000000, +103'h32234fe06e1bfa9eed00000000, +103'h315af85bcc9060e7fa00000000, +103'h3a2009b6feb3b0c86a00000000, +103'h27562834b10ea9243600000000, +103'h229f0a9e2a2eb2db3400000000, +103'h0c03e7a69084db0fe443ffd7fa, +103'h02f92596f223e5ae0e4965bc80, +103'h36a2144fbf27cd54a000000000, +103'h1c59ac2cc020f2eb9200000000, +103'h2b3ff6e4f8c3073b5200000000, +103'h0aab1cad141cb36812002ac72b, +103'h1e3a28233e5caa4d0a00000000, +103'h30f100ee0a07c6fa1e00000000, +103'h02c8cca46941ef1d5e291a0000, +103'h0f639f961932f00b6891480104, +103'h2c1b25efdafbbcafd000000000, +103'h0a2f5696a95f5c45e80000017a, +103'h334b4e37967a8235c300000000, +103'h02a934f5e0a9d8cc6cbc000000, +103'h2b3a0bbf94f527040200000000, +103'h2ec69f39169e5bf9e200000000, +103'h1ab28ef882d867b9760000000b, +103'h1d1900edb09f06f28e00000000, +103'h3f294baf4b5195eb1000000000, +103'h372ebd74e76a96d8c000000000, +103'h04d28b346493e2880a00000000, +103'h144ec0ad5ac29ffcf000000000, +103'h1469fd18de952b315400000000, +103'h1ed6cf6f72e3ebdeb000000000, +103'h0eae389ec64de8f78e06144b43, +103'h221984562524b8670200000000, +103'h1247700a72d2f105c800000000, +103'h230a86f016ec755bee00000000, +103'h24b189b46833e5666000000000, +103'h2ca675704a3e6c567600000000, +103'h1ac019932eeff60ae00000600c, +103'h3cacaebbdc966b7b2a00000000, +103'h3285b9407756850e5b00000000, +103'h1292a92b730333ca3600000000, +103'h3ede056ce688ed0aad00000000, +103'h181957b9391b96362000000000, +103'h0eeb1580b6f99ba3067488c003, +103'h3a1358568e12f35c3f00000000, +103'h1a3ecef69cfe08dcf600000003, +103'h20f332a1581161338400000000, +103'h20c32c823350302a2200000000, +103'h168cc206154362cb7a00000000, +103'h1b694ae634068f4dacfffffed2, +103'h3d43dca34a935153c000000000, +103'h362fcf93e4fc9c39f400000000, +103'h256bf2aea24078dd3e00000000, +103'h24eb7894d97048712400000000, +103'h1a718dc8bcdc3b1fc60718dc8b, +103'h188af45062c7b3b49e00000000, +103'h3ca0f711fd39417d5d00000000, +103'h02f772b0d4c435cdbe00000000, +103'h22be36c0d3652cdfba00000000, +103'h3e6135f0945c9f908f00000000, +103'h3ccbe8d4f61ad6516000000000, +103'h366fdd36b57c0c41f600000000, +103'h04d807663047f516ec00000000, +103'h26a55e7566b7d24da200000000, +103'h1ccf55152c8fd9b3d200000000, +103'h09142206533538293a108d17b4, +103'h2ad4fb396f048d3e6600000000, +103'h3eddc9837718af44b800000000, +103'h389e6a1b22edaa7e2700000000, +103'h1eeee466a0cb74019c00000000, +103'h177496db5869de1cbe00000000, +103'h3cfed68e7658c2835e00000000, +103'h18a1c5864ccd595eb600000000, +103'h19325efc48cc2fed2c00000000, +103'h368e6c73e06df5737800000000, +103'h2e54580838a0546fc000000000, +103'h1b73061ff12ec0e3a2ffffdcc1, +103'h155f0d965e8318ebda00000000, +103'h141744f9f8f61f0bca00000000, +103'h363d71d10c552ca22800000000, +103'h1303f317e36c719c2200000000, +103'h1cf9354258a9e36d2e00000000, +103'h06719058aaadd6851000000001, +103'h28e00a7ac8a70bc76a00000000, +103'h16a3b13f0e189c201400000000, +103'h28d3c99f76f8a69adc00000000, +103'h12adc56d0c9c57d9ea00000000, +103'h263597bfb47021796000000000, +103'h046475d9c71de6e66e00000000, +103'h2eabf013ee537ea62200000000, +103'h10ec10e8f2b7f47fea1a0e3484, +103'h3ec88997e163e493d800000000, +103'h201523c0314ff57cca00000000, +103'h0a7fa4ceee187f14aa000001fe, +103'h233da483d12da2d4dc00000000, +103'h2cb398b89aad47a3ca00000000, +103'h188d71813eeaec279a00000000, +103'h34b73fc6aa9e84e03600000000, +103'h3ef98d20c32bf6617400000000, +103'h1a697d4fb6e336281e0000697d, +103'h1086b52276dcc348e2d4f8ecca, +103'h048ed91cd04640989800000000, +103'h233581f760ccf5bb0e00000000, +103'h05082133645bced7de00000001, +103'h1ebdf697869150cf3e00000000, +103'h2d508f448c997202a200000000, +103'h0d29688a2b57689a2abfb44d15, +103'h0acf378ad6a7f7deb60000000c, +103'h2ed0d56362d16068e000000000, +103'h1963c40b2ea097f3b600000000, +103'h0e9024b59d716d571a08120a8c, +103'h2f13edfa34d531624800000000, +103'h253faf1d83655617e400000000, +103'h3f3cd0a9b17944121800000000, +103'h06da8a2994b8f32f9a00000000, +103'h2ae9b10094f5c3d94a00000000, +103'h02ce0939dad04e02de4e768000, +103'h1d17b78b06b9ff037200000000, +103'h26daa9ee4888083d4e00000000, +103'h07568f81269fbfc85400000000, +103'h38c838ed4c7a69b69c00000000, +103'h060a305c52d0f937c200000001, +103'h1b0626cecc99322510ff831367, +103'h388a257e92a362816300000000, +103'h3aade3f6aea989502f00000000, +103'h0b4c0c256733aecec253030959, +103'h2ebb2d8be0e192c57000000000, +103'h1cc381176d2d9eead600000000, +103'h1f6f37245ae8cc76b600000000, +103'h0ec4768176ac4d8e2242224011, +103'h254d64ad561b84b27c00000000, +103'h1cb7e59ea4dffb33f400000000, +103'h3f50057acb2d5fe14b00000000, +103'h3cd0f1cda6e5457fef00000000, +103'h30fe2baea4354afab800000000, +103'h3a46ea4220063cc85f00000000, +103'h286fa409910468770400000000, +103'h22c5bdb24a4b52b92400000000, +103'h01011cdaf4baf6c2b6de09ced5, +103'h0571c6fe5680b4750000000001, +103'h2ae8adea1681d14ff400000000, +103'h2163fd4cdcf3984e4a00000000, +103'h212a9f68c6dc46386200000000, +103'h16ac3847674043853e00000000, +103'h20ae859b076ae2ee0400000000, +103'h0232a43e9d171b356ae9c00000, +103'h00aa5b307ec5a0d070b7fe0077, +103'h04fe585ac0f8450f0e00000000, +103'h2e92990a42a2a03f8c00000000, +103'h2091bca7c6a0f89a4c00000000, +103'h2ea7fb7ab63391a48e00000000, +103'h3a83db1e16c54e4c5600000000, +103'h0757ffd0856d49c70c00000001, +103'h16cec4c27ef124e52200000000, +103'h2ce6824ec54924b5a600000000, +103'h3831d17f9b17e9782400000000, +103'h1a426efcc6fe6bc6e800000213, +103'h00c05640ff303d4684f849c3c1, +103'h242f626a5872ac434a00000000, +103'h0ce79349593302844afbc9e6ad, +103'h10b7ada07c6264eea22aa458ed, +103'h1c8633be8b49f837fc00000000, +103'h2684f7231a01a5d87800000000, +103'h08f666caf687d9970238dfaefa, +103'h049ad8f71d0cd0ba1e00000000, +103'h3ea1b011e60337851500000000, +103'h00f27f64aa9e107c32c847f06e, +103'h1e44f48fe93fc08e1800000000, +103'h351f43522a323ff2c200000000, +103'h260662ce89773482ac00000000, +103'h3ef0b9cffc9677d4d700000000, +103'h0079214da29cdaa35e8afdf880, +103'h2c414959608d94735c00000000, +103'h033bb157e206b5c0fe80000000, +103'h22ad4dd90f47ff1a6000000000, +103'h3eb5622f1283b0724300000000, +103'h3d5a51287430fe4b5000000000, +103'h1c8cd49532e6607a6200000000, +103'h1ec60dc2ee40b1a2d600000000, +103'h3147460b0ccd86380800000000, +103'h124c2ec56a9393faf800000000, +103'h2a8215cb1adada060400000000, +103'h329e5d4b2e2708cb6f00000000, +103'h2afb566e18a91e968a00000000, +103'h2e25d5c90b477be1b800000000, +103'h1ee3e91ef742d24fd000000000, +103'h287cd67ae468a818da00000000, +103'h203ccca2424c9137d000000000, +103'h30a5e1602ac967b2b600000000, +103'h0a5671ffca063454f800000002, +103'h1c49d4ef3aac15b52400000000, +103'h12a5dff7860287b4ee00000000, +103'h0b4e7c37a34c5ca42a00000539, +103'h2ec0802a74f23c9bb000000000, +103'h1e38b8723f40b8d35200000000, +103'h095d066f2f0138fdc62e1f4974, +103'h3883dc210c39f1700400000000, +103'h0af70e771496f7df320000003d, +103'h115c7d68cc1ad4003ea0d4b447, +103'h1502a52dd611e2775200000000, +103'h08aa05f0a66e5fe01e622d085c, +103'h068b58237a71050df400000000, +103'h1a03a235821b0afe9a00000e88, +103'h3896c047caa663221700000000, +103'h2f3bc0d164aa05579800000000, +103'h084f213b1c40c59f6207f2523f, +103'h1ed386b2ca7c8670c600000000, +103'h3972f72914cba7abe500000000, +103'h1ab8cac1729f2e5eae000000b8, +103'h22a8a3b16a122587c200000000, +103'h06d94240c6caf0493600000000, +103'h34866740e87393faa000000000, +103'h38ff33ecee4cd63b6600000000, +103'h2e172ef7a2d33d7c4e00000000, +103'h0e414f8a1ad271693c2020840c, +103'h36366065c8e9a060e000000000, +103'h049f053c182aefeafa00000000, +103'h0354804dcf615050c4a9009b9c, +103'h22dd38dbd300558cdc00000000, +103'h1c3862d31554d5daaa00000000, +103'h207d2d2b36320eb67c00000000, +103'h3cece76e556a71899300000000, +103'h26bdf20234e79eb4c800000000, +103'h248f5222f2d486231c00000000, +103'h36b5881e589278255200000000, +103'h3e0dccd03d21ca484400000000, +103'h1cd0830bb2d752669c00000000, +103'h2f7ad7fbf2e51f36da00000000, +103'h32f9b30f4eb5a2428d00000000, +103'h0f0b0647fc307a3e7e0001033e, +103'h293e23c8ee2a2d4dcc00000000, +103'h364893b07c353395c800000000, +103'h353822cee673575eb600000000, +103'h02dd542fdcbbeb0f34b8000000, +103'h0ab2ffcf50f40dde1a0002cbff, +103'h02b2d8bc92d1620df648000000, +103'h36e7e53f9e8461dd4600000000, +103'h1090492161373a99daac8743c3, +103'h06f49812571f1fd97800000001, +103'h0d4cf4e166af68fad8f7fe7dff, +103'h2776b3be6ca4010d2e00000000, +103'h1e24d478b8f0f5ee9400000000, +103'h370a2fcce167a9ad0000000000, +103'h240eaafa7e8c7e25b800000000, +103'h38c28f22f696adf29800000000, +103'h381a74589aa558ed1900000000, +103'h33634f7cd567e8100f00000000, +103'h0a13d44e0c825c68a80000009e, +103'h2250d744fee5abe57c00000000, +103'h3124882e8af980338a00000000, +103'h1a9d92052c4a57788804ec9029, +103'h177e83ebde6edfa71200000000, +103'h20e1d23b390c71ac4000000000, +103'h2a2acc700e8af5981e00000000, +103'h3d6d46d8716cc7d35600000000, +103'h3cfa18b95a9794436400000000, +103'h1af5ca415604db1bd4001eb948, +103'h30fded7594fef3d52e00000000, +103'h16910641eef4be168600000000, +103'h2a90e6e1a0f2ab8c1a00000000, +103'h1b285bc4b683b1ce08f942de25, +103'h20c4abc3a01498afa800000000, +103'h3a5fef97ba3cf4745f00000000, +103'h02eff1825b01a0380077f8c12d, +103'h2c729ef914618fcfba00000000, +103'h0b78fe3dd95181521600178fe3, +103'h0a93f63244c4204b2a0000024f, +103'h06ebe29b0e3d1e890200000000, +103'h1d456f3bdad114bb4600000000, +103'h07008bac60bcf7565600000000, +103'h0b0d296efd0266923000000086, +103'h10dde77cc302f23e90ed7a9f19, +103'h26ebc4138d101bad8c00000000, +103'h16cab5659eee032a4e00000000, +103'h26669e0e04d9c73ddc00000000, +103'h3304ed489ca47ca37b00000000, +103'h02a62ec1c20b1ab17e80000000, +103'h1f578be8761007fa1a00000000, +103'h18f6ec3978b636bbde00000000, +103'h177013c8570dc2a45400000000, +103'h328db7faaf04aeddcd00000000, +103'h10b676de8574c2a622a0da1c31, +103'h24ef3dbc77027aa0d000000000, +103'h30de3b5646b8f17f5400000000, +103'h12dafb946aa82f3bcc00000000, +103'h22dc6ab05a866a921200000000, +103'h36529c726d6166267e00000000, +103'h02cb48d54e3dd0d6d846aa7000, +103'h16fce6b786906d494600000000, +103'h14d6b3d5885bb61e9400000000, +103'h2c36eb859e589cd61a00000000, +103'h32f8895c332f50aba500000000, +103'h08f7f809a0663c314248e21c71, +103'h2287d400535ec58d7600000000, +103'h067366159b56bd971600000001, +103'h0ab79500fede919768000005bc, +103'h002b14980551f7ad04be862284, +103'h1604d0604f098cae0200000000, +103'h3e3d51b60e34a1460700000000, +103'h02cc90a2e53971a656428b9000, +103'h053a61272476c35c6400000001, +103'h0cfa2958674353ff4afdbdffb7, +103'h22c37e37ad7db5266e00000000, +103'h06c1745cf877de7ed400000000, +103'h10f8dc289a3b5cb6805ebfb90d, +103'h3ea70750a0fcd1137800000000, +103'h14988677f2f5ad3c1200000000, +103'h1407bac5b09cb48cb400000000, +103'h0eeecd9245353b04a612048002, +103'h21113d155a3cf5ca5600000000, +103'h15307dabe92bc35c9c00000000, +103'h3a456b7e893d0071f700000000, +103'h12f70ddddf6d7e1dde00000000, +103'h2eddeb41d8b2e99c6600000000, +103'h2401be702aa9f77a4400000000, +103'h025154fb1887e2bc1e3ec60000, +103'h28ddebf7fc89a12c4800000000, +103'h2ed80112bedaf6276200000000, +103'h0c84ffc9e8b8e21f5e5e7fefff, +103'h14dbf5fb5690e3321e00000000, +103'h36bacee8e315e2fc0600000000, +103'h16234902b6f1d8f75c00000000, +103'h3566b943eeaca7e03e00000000, +103'h3b630ba484cff0e2f400000000, +103'h16f041373836aa26e200000000, +103'h149359c5f299b5cb6600000000, +103'h09284b4c0889f7029ed0de274b, +103'h2d69e4b25c1d50c89000000000, +103'h127b6efba4459c149800000000, +103'h32c3a36bd0af80c6f500000000, +103'h02a58da7652aefc29ada764000, +103'h1d116ee596ee932e6a00000000, +103'h109aa0ec589420d5ce03400b45, +103'h2a696f07b4a58fbb6400000000, +103'h16e7bdea074030a7be00000000, +103'h2490fc8ef0a99faf7200000000, +103'h0a28ce6246915d997800000001, +103'h0954c10b6d225a286a3b4d9183, +103'h3b26436ff64b288ab000000000, +103'h3537f67c3e9fe9961c00000000, +103'h1ef34937f8c62d061200000000, +103'h0e3ff98d2cfe2382501f10c000, +103'h2caf040acaf16cba4a00000000, +103'h3f6937131a3166477700000000, +103'h10c353b186e06a5242f174afa2, +103'h1ae39d560549a1655c0001c73a, +103'h10020a7cd50cf516e27a8ab2f9, +103'h1211e45deef0926ce600000000, +103'h2f53248680f29ce9bc00000000, +103'h1074cf0152048147aa3826dcd4, +103'h38e01ae18257a5ce2a00000000, +103'h34585bd892cc74cf7e00000000, +103'h1ec12f3c8aac8fb10000000000, +103'h0a1c9f8a3e04eb8992000727e2, +103'h097c911f9ec61ac61edd45ecc0, +103'h0934288328e2ba505ceb4969ba, +103'h1ab834b6305f4b6ffa00000002, +103'h38e8d09a389373f32200000000, +103'h161e5807d24ba8a95200000000, +103'h1119fa3b8c3479438a72c07c01, +103'h34f856bfa352d14b5e00000000, +103'h0635feb3b36ccb86ea00000001, +103'h12071a9ae76522468c00000000, +103'h3123df2b6e9b20fa3e00000000, +103'h1b751cff80a23b9526fffff751, +103'h27192c1ef0c61ac09400000000, +103'h252a06c54b3b37c01400000000, +103'h0aa003b2315463df0414007646, +103'h1eb12199557e6aa44e00000000, +103'h33647b15a11e6e567f00000000, +103'h36ddef527ecf8fefd200000000, +103'h04929b4f72340b057200000000, +103'h029bab2b6911fa57f268000000, +103'h172325abaea495a76400000000, +103'h08c90e82704040d2cc44a7285e, +103'h3a3e87490663667e7a00000000, +103'h1ee80b15112c7500ec00000000, +103'h2ca389390a6afc49f200000000, +103'h27039d046a53075f0200000000, +103'h12a3f1a296f690980e00000000, +103'h06a7acbf3cfa2d9c7800000001, +103'h08d7dcdcd09e1f3f0e24e1f1ef, +103'h177309445645cbfe4a00000000, +103'h0e613d0ade1da8db1a0094050d, +103'h1d4601697690b21f7000000000, +103'h2824f36484f1ef2a5000000000, +103'h02a2049ea337f093c688127a88, +103'h3564e1d70a5ce3f84a00000000, +103'h044567ea8cfee896ec00000001, +103'h0ab6a01d8063ca6df60000000b, +103'h1419c77ac4a932588400000000, +103'h02b4df6bce5fd2760469bed79c, +103'h38acdb55257999f0ca00000000, +103'h3ca3bfd5662e795c9800000000, +103'h02fe6ec39edb54b1bcc0000000, +103'h0d02500a5c7f148722bfaa47bf, +103'h256603c71f7d834ac200000000, +103'h23435174ab7fd3551e00000000, +103'h044f187ecee5d71c3c00000001, +103'h0636343ab1292890e600000001, +103'h249c647db678410fb400000000, +103'h2080180b7cae754a6600000000, +103'h06e39eee634ad9c81c00000001, +103'h3c2cfced82caf1d39900000000, +103'h229f837d8aae90c1fa00000000, +103'h3e8a4b1d46db8daf7e00000000, +103'h17238807697b112d0800000000, +103'h13079eb9a7055c4a4e00000000, +103'h10b6a73f7d28e451b6c6e176e3, +103'h181440874f30830b5c00000000, +103'h264d677e9ee72a4ad800000000, +103'h1c019fa2f6fb6ad22800000000, +103'h38bb34119c48d250c600000000, +103'h109dacd1f94a71f3bea99d6f1d, +103'h38b0a89db005a6055a00000000, +103'h00aaceb442a352d754a710c5cb, +103'h3ea05f9cfa53fb750500000000, +103'h18dec2d67afeca294600000000, +103'h2c679803b89f29c64200000000, +103'h32f61336527dec9cbd00000000, +103'h3827e1403ee584a07700000000, +103'h3aadaabf30db97d6c800000000, +103'h39323e676a0379170700000000, +103'h2e55fbd5e4b123d63800000000, +103'h36f7a5e11ce3623da200000000, +103'h3c7ed48cca395e138600000000, +103'h34e19b0f413103f4a400000000, +103'h1747daa8beafd8816e00000000, +103'h1e5f3e1872917390b000000000, +103'h035a03c5cad94e396e72800000, +103'h308e2786a8388c51e000000000, +103'h20f34f3c2a929017aa00000000, +103'h0e084f731a20b79e5200038909, +103'h30aec33abc1406da7c00000000, +103'h1a2e853bcb1c564d9800017429, +103'h2ee6d38ebacb19885400000000, +103'h2b31b1f956f99ec41e00000000, +103'h029d480244e07252da80244000, +103'h161ce4e5af12244c3000000000, +103'h36b8d816b2af6c4e7400000000, +103'h101fe4d008cc513422a9c9cdf3, +103'h0080904d7e85294ad482dccc29, +103'h34c1ae1dcea50e1ade00000000, +103'h1614f03a4e259e685c00000000, +103'h2c179ea542e74c862c00000000, +103'h0ae69e445afc3cc07a00000003, +103'h273ac72e4713db65be00000000, +103'h1333fe3310fa79aa1800000000, +103'h0e52d3a0373540d85e0820400b, +103'h0d58f5938b693f0b6ebcffcdf7, +103'h255b544758bc12aba400000000, +103'h03718e60e415083f2e39000000, +103'h3082422488705c868600000000, +103'h14c836c08ae1eae76a00000000, +103'h05776a67fa642d0bf200000001, +103'h0ae2b0bb0e2c63cc7c00000001, +103'h3662ff4d52a3ce347600000000, +103'h2953aa661e867eef8600000000, +103'h2726406654e97e3cd800000000, +103'h1c5d03727c3d28a2f600000000, +103'h22c02a4b226369094a00000000, +103'h3cc71f5840c06c7bc800000000, +103'h32549354e28096c6eb00000000, +103'h3ecb858e5e47b61f2b00000000, +103'h077fa06ad29c49740e00000000, +103'h309724509067cf026c00000000, +103'h1d6f14b216e76f6d3e00000000, +103'h2ac79bda867e93bdce00000000, +103'h1667d92222eda86fe400000000, +103'h16a45fddccb5444a6c00000000, +103'h2548b59be41d1d6c8e00000000, +103'h0ad47ac73ac17d4a5c0001a8f5, +103'h36ded3b05f0a32e64000000000, +103'h04d6d50968deadad7a00000001, +103'h20841aacdebd815dd800000000, +103'h214e7dbce49456674200000000, +103'h1ada5e17441871142000006d2f, +103'h35707157e666eed10400000000, +103'h36e5324601414ce84a00000000, +103'h16177491f4b1be403000000000, +103'h1cde0d452a96f0863000000000, +103'h26bd170c82ae65182600000000, +103'h17030fa4de8c725d5000000000, +103'h068a552584498969d200000000, +103'h2cc358e65a4c990eb000000000, +103'h3e934d2d60d6ee343400000000, +103'h1111a68c8e9a471a8e3bafb900, +103'h031c72490d2d9447f086000000, +103'h3670c76f5d3f3ad47e00000000, +103'h0611b5a45f5bad1d8a00000001, +103'h3689920d96cc748ce600000000, +103'h349bb5915cde2a314600000000, +103'h3edb6d5d1367bc3edc00000000, +103'h255a5ffd470371d03800000000, +103'h2b34ffbb04dedf2d4a00000000, +103'h06dc1405a9393f2a9000000001, +103'h3f615281956e3ee59400000000, +103'h084e4d3c5a4a52eb3c020febb3, +103'h193eb9c75aaba56cd000000000, +103'h2c0e057fa2f9f2a92c00000000, +103'h2b1690627d38ac708600000000, +103'h3a8d5a2ae846b1f02900000000, +103'h264e76de925d4252a400000000, +103'h2cbb38ff0eea9c7d8e00000000, +103'h1621edc8b439135c2000000000, +103'h3ac14f02e2f44c5b2e00000000, +103'h08a7622d39163a23e4d8ac076e, +103'h2aeab7aa32d78926c600000000, +103'h1918a9a4bd7eeb53fe00000000, +103'h3d7faefb6669a2fe3000000000, +103'h02db00ad3e824ca2eca7c00000, +103'h014c8c82fc01fb9e52a74410a7, +103'h3295a17f7edcfc4b9300000000, +103'h1f5da1d0012988ce8e00000000, +103'h328f451eb2bf2a4e0d00000000, +103'h04433510501ccc1e0c00000000, +103'h12f920a042ac113cbe00000000, +103'h1e8c087bc6ef464d1000000000, +103'h2c487925d8e866ed5200000000, +103'h2ac4141df9746f691a00000000, +103'h3b5c7b3424bce88ef200000000, +103'h0ea0f3870e80fcacea40784205, +103'h28d4b2270add77e10e00000000, +103'h1af0d7b4597e6b681e0000f0d7, +103'h06816caac1531d8f2800000001, +103'h14ceea301b43f5438000000000, +103'h329d646260c561ee4100000000, +103'h1b495675b6944c1e5afffd2559, +103'h1a73b3f12931b080bc00000000, +103'h1af12efbc57b06f6720000003c, +103'h36b29f49deeebae79a00000000, +103'h333971863adfe9e35f00000000, +103'h25548fe0f092892d3e00000000, +103'h3ea15ebc62cbfab37800000000, +103'h1f69348e47208a946800000000, +103'h1c1fc547c4c1e950ca00000000, +103'h14b63fe4a32b1ddf1000000000, +103'h3cdf43aebe4ae326d400000000, +103'h06d4422c5301230b7800000001, +103'h16e9cb3e4ee066ba3600000000, +103'h2ac13da114b4a8e68a00000000, +103'h22c3cde2ea9e7424d800000000, +103'h1b11414b975fb1c5eeffffff11, +103'h245fd7bfb8237fa8d800000000, +103'h3c8ed4ee1234c0f46e00000000, +103'h2a727b02f69498b42800000000, +103'h04f4953cb4236da23a00000000, +103'h32d6613c5e95e8a53300000000, +103'h1adbace4e28a7de1e600000dba, +103'h1715b981d660df1e4400000000, +103'h08e45ed2f13c8c0328ec6968ec, +103'h2ed671c647524584fe00000000, +103'h325e6d5ece36a457ef00000000, +103'h1a70e6d93d0d161e3600000007, +103'h18e43f71f06b837d0400000000, +103'h0894240dcadc6a564224272dc4, +103'h3e964e2ea4c0a9c83200000000, +103'h02cf1ca76c54cdd5fc80000000, +103'h0515013e6aeb1c04a000000001, +103'h36c669526cba38ac0c00000000, +103'h35543bbcb2cf39ea7600000000, +103'h14a2b7ef2895a33ce400000000, +103'h224601f79ce9def99600000000, +103'h18d46804b28c96e8be00000000, +103'h3d1d06bdd4d298e05c00000000, +103'h1234df616ca700e50e00000000, +103'h12e25b41eac407a2e200000000, +103'h2e79b61bfcf8e7044e00000000, +103'h3c9da7decedb42463900000000, +103'h1e943281fd54f8623600000000, +103'h2c31be0a38f2a0410400000000, +103'h269351355686d2c30200000000, +103'h1cedcb64c4b890cd3a00000000, +103'h212387da6b4be2029200000000, +103'h22ae3cb24739ad675600000000, +103'h1e2b91cb275d3541c000000000, +103'h312fb9a70b0b71f40600000000, +103'h06ec7250283703bf2c00000000, +103'h06f50cfbd866bd663600000000, +103'h0d37550ede532fb65ebbbfdf6f, +103'h38d6d263a4483cb23600000000, +103'h3081c1ac707f91c11400000000, +103'h0e63b4b468566424b821121214, +103'h06ac652298d825d12800000001, +103'h1b484547293bda8592ffd21151, +103'h152c621deee83fa82a00000000, +103'h3c9010b5c83084ef5200000000, +103'h0e4a23725c5ce70d4024118020, +103'h3adc5c001aecf7c30a00000000, +103'h0caa6f1368371b35665fbf9bb7, +103'h0e60c1cee21377358000208240, +103'h19479979b0bde648ea00000000, +103'h3e8b5831be1ea817cd00000000, +103'h00bc0eacd66641917c91281f29, +103'h2a23e05d54f199c33a00000000, +103'h369f294354ada8701000000000, +103'h34d858723ed188cd6600000000, +103'h2f302fb8f670b210ba00000000, +103'h00ee48912b490a82fa1ba98a12, +103'h269dfb2c99793a3bf000000000, +103'h20fb5638196782cd1a00000000, +103'h1a2a3a10fe057df9b20000000a, +103'h0ac9cffaa100d431cc01939ff5, +103'h24b270673a2b0e42ca00000000, +103'h19144b0fc6f4de3d6a00000000, +103'h24dda8856aa74ea4a600000000, +103'h2eac83f4c2bb99b46c00000000, +103'h1a7c3395e6994239d60007c339, +103'h0176f179d745c62e9a5e5bd438, +103'h2d668d9b30c1f9c48000000000, +103'h02fd78613038eb3e56e184c000, +103'h1d4ffcdb9c9f78d98600000000, +103'h1e3bc38fde9cf13ab600000000, +103'h356d5072bcecee165200000000, +103'h3d60d71a1b28b1a63200000000, +103'h328d48ffce960218ef00000000, +103'h065933bf0af6d9330800000001, +103'h38c20fb8fe842232d600000000, +103'h2717d9c944dd55f1e200000000, +103'h2e96557fbc9f65aae000000000, +103'h04aad34f22b73f742400000001, +103'h26b62a51914d94f3e000000000, +103'h0645a386d4f868430200000001, +103'h2ab272adfcae92949200000000, +103'h0abea78002f4361b6600000bea, +103'h0c821bc62ea6a8c962535de7b7, +103'h1e932500396550496600000000, +103'h069c967d46e76c0f9400000001, +103'h28549a8ee47a910fcc00000000, +103'h0e00d4bbea17278d1200024481, +103'h2353b7b2556bc21bf800000000, +103'h300beaf2226c96d7e200000000, +103'h02ab8a4186c04e8a3618000000, +103'h3ac5baa0b6cc397c5a00000000, +103'h1ef7128cf977c3bde000000000, +103'h14942c95353d7e5e9600000000, +103'h2e9ddd75523490eb8e00000000, +103'h0e67dcdfa6c8bd80c2204e4041, +103'h24fe15c656669af61400000000, +103'h340c126ae4ce77d5bc00000000, +103'h37578d6e0acc8d9c1200000000, +103'h0cd7995cbed8a006f66fdcaf7f, +103'h082062cc34302d75000827dc9a, +103'h1acfc731c007c6d1be00000000, +103'h104da36d0928299df492bce78a, +103'h12980d4462f7f0cfb400000000, +103'h10bb1722b545943cbebac172fb, +103'h050e4e7606dda1812000000001, +103'h3a694c9b1698b8a3d400000000, +103'h38ec745e1ca70719da00000000, +103'h19678cf0d71053b4f200000000, +103'h2f2839c04efcc8130e00000000, +103'h08c68810e7645503e4d16e8981, +103'h3afd8f05548c8ec43300000000, +103'h08db9d139e5316d5184445e343, +103'h2cc9fed6d950a5da6e00000000, +103'h1eb528ad232c42ee0c00000000, +103'h3804a7874ef641c4e500000000, +103'h26e0b525aeab6a720600000000, +103'h330fd99926b011f95700000000, +103'h168fa3e70c90c71f0400000000, +103'h1f3bb122fea0a0b82a00000000, +103'h34de0023d530449f3600000000, +103'h382bb996b36bf5c23400000000, +103'h22298502e649f5e60800000000, +103'h18b8178e1f75af7cbc00000000, +103'h0ce74ad1809f347fa27fbf7fd1, +103'h1446c2b419574c0dc200000000, +103'h10123058e43e96df42e9ccbcd1, +103'h352793e3ba8559935c00000000, +103'h36b2a6eb4a9789ec4000000000, +103'h38dcee727ebf1dcffa00000000, +103'h145e82077571c4bb4600000000, +103'h171eac7bae4eb32dc400000000, +103'h1064308342ad35353adb7da704, +103'h16413e7718cbe1b0e800000000, +103'h1cdd6a3aea3012342a00000000, +103'h16eb5aba017150ab4400000000, +103'h3e47fe66dd4ebae62e00000000, +103'h2851d748f23a15a02e00000000, +103'h2c2791dbf08214070c00000000, +103'h1b2d5ea31ad3eb4ffeffffffff, +103'h0aa47c1586fb7d2bf000000052, +103'h176a546e2328dbcf0a00000000, +103'h156a4266eccd57e49000000000, +103'h04ec4466c237ac52b200000000, +103'h0e4231b696a1eeb99e0010584b, +103'h20939c325c8e33206000000000, +103'h120de27d2ad064d6f800000000, +103'h325580ac8b6401095500000000, +103'h12d4cb2e9e71e3867e00000000, +103'h0af6046a50c764330a03d811a9, +103'h1ea570c6629c2f61a800000000, +103'h1f2541f96e9233cbf800000000, +103'h28091435cc37a4925a00000000, +103'h105ec9f8aa5ce68bc800f1b671, +103'h087be3ee9365fac1968f0c9782, +103'h22352d4622c4c4ba4000000000, +103'h2c80aa69ab40a8a8d400000000, +103'h0303cc1f8e75d5eef638000000, +103'h02e3d4613af68058a2613a0000, +103'h1729d7647cfa4c783000000000, +103'h0e349f21fede20d96a0a0000b5, +103'h30800f885707f83de600000000, +103'h214155dda43c975fe400000000, +103'h0af91c8b94bca6e83a00000003, +103'h30ab2fb1b4fdfcc5de00000000, +103'h153b63b13ef719517200000000, +103'h10d38feeaea249032618a375c4, +103'h2ea8538c02ddacb46400000000, +103'h2239be1192b13ca31200000000, +103'h08c9255d0359902f16c85ab90a, +103'h2f4fa5f9e4934e40a800000000, +103'h00786f99ec5c739daa6a719bcb, +103'h167ee5ee5aac19978e00000000, +103'h013698e5dd2489317c2d910bac, +103'h2a47dc0c72a36f1fd600000000, +103'h3aec6d73b2da0805b300000000, +103'h36ed72789f21e4122600000000, +103'h0c9a9115180e5185d84f68caec, +103'h016c38e30efbc3fe7633fe70c2, +103'h26e14fd0da9655138e00000000, +103'h3e306ec45a028df69d00000000, +103'h36a171ca00e3ddc77800000000, +103'h0520c65580144c8bd200000001, +103'h229bdedf76b5be55d400000000, +103'h1aad4c7cfad684ab540015a98f, +103'h2cc148111d72638aca00000000, +103'h00b9216cb61fb007c46c68ba3d, +103'h14c5475424e0f818e200000000, +103'h1e872b91649a19859800000000, +103'h251f9479fa5f60d9bc00000000, +103'h062a60ed58e68c6b2200000001, +103'h1e54dd687d0620e51c00000000, +103'h1c6051fc823081d27400000000, +103'h3f05e01622855f3af300000000, +103'h1b0acf097ee5b13774ffffffe1, +103'h0ef64a67fceb914d96710022ca, +103'h00e7e6ab96f6605714ef238155, +103'h360a04c1a4ecaabf1000000000, +103'h0cb18212a6d4916aa67ac9bd53, +103'h233eb09b1cde962c4c00000000, +103'h32b770712890183ef300000000, +103'h1a26909e4acec8da0e0026909e, +103'h26825b8a7e86394b3600000000, +103'h18b2b7e158acc9e98200000000, +103'h26c1aa647f2f25740000000000, +103'h1d60b52696e1dd555800000000, +103'h1ece88c2bca387b9d600000000, +103'h1ec295aa19043ce06c00000000, +103'h37636c7af8d2c5a32800000000, +103'h0c3368bfd6955b4d405bbdffeb, +103'h38e5425a0ef8c7c83900000000, +103'h203aa3ae1b2c30881000000000, +103'h229441e2951172e21e00000000, +103'h1ac0a5ba344c16903800000006, +103'h2a8264df16e05872cc00000000, +103'h093cebcc32a0fe2d02ce0af098, +103'h0223a3415c23630c181a0ae000, +103'h0f1bcd98a6604ed84a00264c01, +103'h11600e802883f219a86e0e3340, +103'h2a84a7da769fbfb24e00000000, +103'h354a3f61c8ffce327600000000, +103'h1d3339f53284760cec00000000, +103'h2a7c8360e6ceb56eb400000000, +103'h2149bee64401ef63e600000000, +103'h0eb6ba1def7e72c4ce1b190267, +103'h0323838810c831ab1283881000, +103'h2b14c2ff1e7eebc90000000000, +103'h38d4b7e4e0a26f511000000000, +103'h0a969c2e8ab732502e00000096, +103'h0ad6f33d028bea3510006b799e, +103'h1cdf7bf68c2286639a00000000, +103'h0b66f07918f979a09e000166f0, +103'h1a90d44cb4d8f5972a00000243, +103'h3671ea707e3fe6104200000000, +103'h14deeac95ad0ba5cf600000000, +103'h3f6e7185d142a4cd7700000000, +103'h02f771e2e5218f96d0b8f17200, +103'h385967d72290011ca100000000, +103'h2efb43dba48772ff8400000000, +103'h3f6dda3d1ee0dad6a700000000, +103'h1e23156c0cdc1eb24c00000000, +103'h22f9e031cd49f8ef6a00000000, +103'h0a60ac142a6d0e5b7600000006, +103'h174eeaf60e66ee8d4200000000, +103'h011e04ae98c79aa16ef2cfa803, +103'h36c93d196f1685977c00000000, +103'h3abe6e73af348a461500000000, +103'h2820ae2964fdc75f8200000000, +103'h24e9dc6c5ebc35d33000000000, +103'h387aa550c6dce3fc9500000000, +103'h3a21f3ccaac6c068f400000000, +103'h2afdcc8ea24165b9ba00000000, +103'h3ed76cb01d6359866600000000, +103'h326d42a4c66126150900000000, +103'h2edffc96073892c52600000000, +103'h141976f038a5d569ec00000000, +103'h1c9457042685d1fff200000000, +103'h0272909e7a9f48f02ccf400000, +103'h30b1f04dd8339ff45200000000, +103'h2229e2c25aa63092ce00000000, +103'h0e47aaa0cb5820e0a620105041, +103'h22eb447f2e8203a30000000000, +103'h302e274dbcc9ae43cc00000000, +103'h16a4aa109eb4f2c2fa00000000, +103'h16c15d664ee31a10b600000000, +103'h2236319ca487c4215600000000, +103'h1d2d0975fc492187a400000000, +103'h14ed8f931f7f53244a00000000, +103'h2b6308733cac5c9a4600000000, +103'h0ebb9b641099ec2d644cc41200, +103'h189bf2763afcf4a0a000000000, +103'h1ec56b1008b89004b000000000, +103'h056e36ce2254827aea00000001, +103'h24c35f268119ed8af400000000, +103'h16b273ac448824591600000000, +103'h009e7cd2aa4b837f9675002920, +103'h354315fdc0fdf72bdc00000000, +103'h0a3c31a3c09c73fe8603c31a3c, +103'h234f3ad4b6df89fc4600000000, +103'h3eea685ec01bbba00700000000, +103'h04d11968626af674bc00000000, +103'h0ab5c19de1555ed37e00000000, +103'h1036ddd1e426783be00832cb02, +103'h0e9784022edc39d9c24a000001, +103'h0d13e5d2801317aba689fbfdd3, +103'h2cfb3e178eaa9badd600000000, +103'h2f37f5301abe81805600000000, +103'h169b248486b9bf97e400000000, +103'h2cda8db2b6f1b4c7fe00000000, +103'h032d0e8c8c8cd94c845a1d1918, +103'h272a2b14386766ff3a00000000, +103'h24e5c91c3a94758bc600000000, +103'h295b26bc20bea09ffe00000000, +103'h24c2392404a469bc3800000000, +103'h2ab624d86cff90785800000000, +103'h2a11778c10c1c99c5c00000000, +103'h23013fcb7d77ee74ca00000000, +103'h3cafa8aae6896600da00000000, +103'h18027b46888aa5cc5600000000, +103'h2254de5a843a4e773c00000000, +103'h3f690b0adf3cc9bdc700000000, +103'h14f526300091a8184a00000000, +103'h120aa755fefab3232800000000, +103'h18aace4854efd9532a00000000, +103'h228543b1e6fa80a92800000000, +103'h0c9c82d93ea54ef17c5ee77cbf, +103'h36456a18e02a92a36200000000, +103'h1ee9047bacc7157ca000000000, +103'h1c7c7831a30c7f958200000000, +103'h3f0a6c90c2f584112f00000000, +103'h213dafe15f71fc42d200000000, +103'h229b85d55d7c68d39400000000, +103'h10c07145fcba18b4f2032c4885, +103'h22f1dc4c1e559e8a4e00000000, +103'h3718cb6371160fd04c00000000, +103'h28b1b6bd9207ec1c6a00000000, +103'h38c70aeb4a20b77fda00000000, +103'h049677cdf2d26e3d6e00000001, +103'h2ebb833aea997928b800000000, +103'h0af69e782e2ff0f6aa000003da, +103'h3939a5d1deeb74319700000000, +103'h309d64ab68e212a9c400000000, +103'h1ad391c2601bb87ba2000034e4, +103'h30a3380210b91d270a00000000, +103'h36a2cf386a8caee96a00000000, +103'h188ddaa05c2fe6eb7a00000000, +103'h255af8b212d2b623e600000000, +103'h0e43cf3f6b6090c44220400221, +103'h0ae5c2f3cebb897654001cb85e, +103'h311465919eff58b5be00000000, +103'h3372ef1ae8e51ba98f00000000, +103'h06a42ec818f9813b2c00000001, +103'h0535ff398b6c70561400000001, +103'h1283592151109f1e2c00000000, +103'h3ed00bbed5469e57b600000000, +103'h1301da05e8c9f7790600000000, +103'h3e2d2988269a0337da00000000, +103'h34c4e9607a9bdd3dc200000000, +103'h3a6d4856f8c906c5ea00000000, +103'h175c45a52e8df0266400000000, +103'h18153a6c68fb387d5c00000000, +103'h0268326b7e577e228a8326b7e0, +103'h275707a8596cb88ef400000000, +103'h040ee3ab1ad4eafa7200000001, +103'h0f54afd4422bf2a2ca00514021, +103'h0295b47ac73ad64de6eb180000, +103'h362e3743d48f86222800000000, +103'h0133729bd9253a9cee2c569c63, +103'h270d98ee4e5371e0c200000000, +103'h0e13b1e38e86e47c9a01503045, +103'h3d54a126b6947d6ae800000000, +103'h0025168c04a82f4e7866a2ed3e, +103'h1b1ac68e42fcd0752effffff1a, +103'h0563e8714221e7013200000001, +103'h3c33eed0dc3cad8f7500000000, +103'h2a98729b60a09600b600000000, +103'h1ca525b45cd484d19400000000, +103'h12aea942866cf76cf400000000, +103'h08da13d1e5121d2152e407785b, +103'h1d422bf0b6c0c663d800000000, +103'h124ada103e9ada35bc00000000, +103'h25280d015cdd06267200000000, +103'h3d72375f6f27e036b200000000, +103'h3ace7eded34fed380f00000000, +103'h2ceb8cc20ec224977c00000000, +103'h1ea374db0890a3764e00000000, +103'h2d38631a767c30385c00000000, +103'h28f53190951fa5136600000000, +103'h3701ed3ec358082ddc00000000, +103'h14d0cd846a4d39be7000000000, +103'h3b305140624f26fd3200000000, +103'h170c0534b71ff4819e00000000, +103'h07075e3c715045c20000000001, +103'h3b5abf72075c4af6b600000000, +103'h18fb5a660d63a9332600000000, +103'h18eb1c5746be68a52c00000000, +103'h0efad2ca1eb9c30b385c61050c, +103'h345acefef6a4df628000000000, +103'h2017162a849fb22c9e00000000, +103'h1837068938fa812b9600000000, +103'h18155f8d181197561a00000000, +103'h38ad7b9c33489ddf5400000000, +103'h0eea770dca5dfd6c6c243a8624, +103'h28c724ac020b79089e00000000, +103'h3c9e5375d0f5f0166b00000000, +103'h2a871995babd14c26c00000000, +103'h08b87d94f75b68383ef18ad664, +103'h3247df00a0e281cdf900000000, +103'h20e2b974ea9aff62ee00000000, +103'h1e7383ff9ce2de639000000000, +103'h16c1634cbcc597d87a00000000, +103'h046aaad21a391bd81600000000, +103'h14f6742570fa7f24d400000000, +103'h0f1d3cdbb66529f6ee02946953, +103'h2626e3f58b5b9e1c6000000000, +103'h3af622e7db78daf81700000000, +103'h28fe7db2409fbeeda000000000, +103'h090157a17a95e1d57aca5b3a00, +103'h1e695b87a2945f87ba00000000, +103'h012cfd8a2c95b72934e15a59b0, +103'h3a697a84caff12b0d800000000, +103'h3645b66d0b2c103b0400000000, +103'h2ab7d42ac6958abfce00000000, +103'h02be51703cdb412cda1703c000, +103'h065a85dee6931557a000000001, +103'h16f5ccfe6b5166c7dc00000000, +103'h30bd2458f0abeca6c200000000, +103'h101a067346a1b9a52cbc26670d, +103'h2c5229ba775eddfe1e00000000, +103'h2e1d62594678e4716400000000, +103'h1c3a01bff2cb0e2bdc00000000, +103'h3b028dcd62e870852200000000, +103'h1f6cd37fff2272451600000000, +103'h3b35f730b92500127900000000, +103'h1e77ff52d691d3927600000000, +103'h348515a0d2c7cac32e00000000, +103'h2d7a9c73f03fca160400000000, +103'h2292958c24c4dfb6d600000000, +103'h10cf8eb6d03f7c2ac648094605, +103'h149e5b73f2d211b6ea00000000, +103'h2d34f2f442a1a06dba00000000, +103'h320b548a963ffbe1ad00000000, +103'h1ea695d7c274eed5ee00000000, +103'h1881534fb68043608600000000, +103'h072e227e9426d9384800000000, +103'h347c921b2ca82c87fe00000000, +103'h3a0afd9972d64f069200000000, +103'h050e57eda952e121c000000001, +103'h0291f5a2625ddebb3262000000, +103'h163c6c8f666c36a8da00000000, +103'h168f10046afe2c4b3e00000000, +103'h08b80280003a98daa4414d2d52, +103'h2533d61d56c9a8df0e00000000, +103'h220d8875de81ab5f0e00000000, +103'h0653717742b5817c6400000001, +103'h169786c3e4c309f24400000000, +103'h251634eb2c167b698600000000, +103'h0b5e8bf182ae022d6c000002bd, +103'h0e288e56e6c437189800030840, +103'h14a81238b122c30a1a00000000, +103'h00eaa00cbe4b5161009af8b6df, +103'h1943a94a54f36399b200000000, +103'h324ab4b554de03a67100000000, +103'h3515f738ee21acf0c400000000, +103'h2603fcc6a16c61a61a00000000, +103'h163d53b5548258df0800000000, +103'h1c6a0e3dba8655a5a800000000, +103'h3774cc6c92c3a95afe00000000, +103'h3ea1378c2e2db798b900000000, +103'h273a0451e4a284054a00000000, +103'h255529f6a243bb917800000000, +103'h1ef6a541087dbfe35c00000000, +103'h295bc9e66ed2e9d9fe00000000, +103'h22eea6248cc98f1b0800000000, +103'h3e240667f52559017600000000, +103'h3e9d223cd713ff260200000000, +103'h0693fdf51638058df600000000, +103'h3d5dc38754d527cace00000000, +103'h3ef118349b6925bfe400000000, +103'h34a9c5e356c6e9473800000000, +103'h037672b814b8017bd272b81400, +103'h267b251ac961c75f2800000000, +103'h1f54ff484cd83a173c00000000, +103'h3097ff35b2535f320400000000, +103'h18a1e86a52a85e7a5000000000, +103'h1463d31ac3405db00400000000, +103'h1a87852a5ce2461a5600087852, +103'h2a837151304619351800000000, +103'h2ed2bcaa0acd9e5f7400000000, +103'h04ca667d37510fb0a600000000, +103'h1e026e006423cc5ab000000000, +103'h131cbb9deaee32d7e600000000, +103'h397d227088f0a0d84d00000000, +103'h2aab27a29b0d5c763600000000, +103'h112a3c85548a7ee6be4fdecf4b, +103'h1ccd1dc2be35a6895800000000, +103'h125e31d80e5fe30eac00000000, +103'h10dfe6c5ac2d00d16a5972fa21, +103'h2a6ef8297e8b32a97a00000000, +103'h16888874116b196f2600000000, +103'h02d7bf47fada1198a48ff40000, +103'h3c86d92a90629a0cb400000000, +103'h2262f3de923a5954ae00000000, +103'h06ca413c0ec1327f4000000000, +103'h3c9ca808b024265dd200000000, +103'h2b49206df8ee6799e200000000, +103'h2b5832dff48b0fa29200000000, +103'h3ea19ea69ed430108a00000000, +103'h20ac3cec8a2c62f07e00000000, +103'h32db019048ce01971f00000000, +103'h3ef82dcde97a3e83a800000000, +103'h3ca069ae1b554013f100000000, +103'h1a1cd59ed94d6de1d80000e6ac, +103'h02c5a48016edd78ff216000000, +103'h323c74f8710aad2ecd00000000, +103'h0b2d83f474d051aee200004b60, +103'h3e73d304660cc6a75300000000, +103'h0b078ff6323a4a9bc61078ff63, +103'h2c892477f0ae1da02e00000000, +103'h3f1566287ab5ad966100000000, +103'h0771f987e73ed20e5000000000, +103'h34db538ea5543836ca00000000, +103'h147ef8312ac631beb000000000, +103'h24d0ba73dea1854d5400000000, +103'h2ed82a4cf3207d7e8000000000, +103'h1e1e6c3456f137f25e00000000, +103'h32b8e65284c9623f5300000000, +103'h3219922f62e7ce73a900000000, +103'h131bc35996a0b4c62e00000000, +103'h243e720248ba46f59000000000, +103'h0c52589d5ad60a4f266b2d6fbf, +103'h3a2fa177bf147c517100000000, +103'h0cf4b8c5cc66d4eeca7b7e77e7, +103'h325a84da069676668b00000000, +103'h227a97e3d28b2f2c5600000000, +103'h2f70b53cc6e5b4065c00000000, +103'h387b4ee729604bea3000000000, +103'h0eecbd8056d10126f66000802b, +103'h2af4a2800e4c500e1e00000000, +103'h1a87b6ac1d390d8e7600000008, +103'h11007ede882db00e8469676802, +103'h30d992fb22b566baa200000000, +103'h2683a83eb4b5e5992a00000000, +103'h2b7a0d90648f78944c00000000, +103'h0ca980708a1320d3005dd079c5, +103'h3606a35f348d2e636400000000, +103'h05192d088236aed3ee00000001, +103'h04e19c4af93d52332400000000, +103'h2a398421bd567f3ba600000000, +103'h18a48ccb82381b869e00000000, +103'h3c9cc3d8ad719fa85d00000000, +103'h22cba9b9c5162c73de00000000, +103'h0337e1ce02b2f04c8a7e1ce020, +103'h1efa991de47e9a064e00000000, +103'h3cf56bf466b67bd45000000000, +103'h0661de7344b114f23600000001, +103'h14e47d6600a680e69c00000000, +103'h261a0ca547085f59e200000000, +103'h1cce35eadcecdcbfe200000000, +103'h3938db04c306e9652a00000000, +103'h1b549510ded51f5006f549510d, +103'h3e16d003970dfa54c800000000, +103'h28e16a5033628f65a600000000, +103'h2e98e15cb0795f693c00000000, +103'h375741ce585ac9b96e00000000, +103'h1ceac19006f3ab161e00000000, +103'h188c3ba67c4aece47600000000, +103'h089045229835ae747c52f5ab72, +103'h260dae07f0c1ea1af800000000, +103'h1ee5e0a6b8522f3d9000000000, +103'h1ab1be5ba15fdd45822c6f96e8, +103'h14c888f4fe45bdec3a00000000, +103'h24150202d8f77c47da00000000, +103'h2623652bacc0053cd800000000, +103'h2283f79212d5073fb200000000, +103'h3c44673df8f86c6b5f00000000, +103'h164a94d61a7c63fd7000000000, +103'h09483eb618c0cb3b6ac47ac6b9, +103'h2705edd2ee0b60118400000000, +103'h1898a42f76539ec79c00000000, +103'h0223c6f75c598c9a8a3c6f75c0, +103'h062b4dbcb4f230ca0000000001, +103'h24f39fbd7715f7c15e00000000, +103'h2ec751cfbe41457e1200000000, +103'h30eea2a9a334e53b8a00000000, +103'h0e6f801e10fc370b4836000500, +103'h20e28e5c80ead9b4ea00000000, +103'h2a6b945c4e5a59d2fa00000000, +103'h3335dfda313ce82f7d00000000, +103'h1c3510939aa87c8bca00000000, +103'h193078584ede5c65fa00000000, +103'h1416b9d1eb136cf99600000000, +103'h1e57551e8343e551e400000000, +103'h1ad4d89a965a9f23ce00d4d89a, +103'h30fad8a276b1f4425200000000, +103'h14ff35105086ccdce800000000, +103'h2316fe77c081a57f5e00000000, +103'h3572ad311480da8fae00000000, +103'h1e28fb0e3697d9076e00000000, +103'h3c913d2dac0a86388200000000, +103'h2c804c2a0b338146ba00000000, +103'h1af100a5c6c4be746600000f10, +103'h1ee28fb133450a9e7000000000, +103'h196bf7c40e360b443600000000, +103'h3effe60f6d189af56a00000000, +103'h2ec755a1848492b97800000000, +103'h255383a8028478c8e400000000, +103'h0f24bc4cf14bce6a6880462430, +103'h062c0036149f52126a00000001, +103'h2b4bdf14a4c40e5f5a00000000, +103'h12f050acaaf00e956e00000000, +103'h3d193b0d963bedaa1200000000, +103'h168df3d8e92c3e56be00000000, +103'h06a1feb6a74579645400000001, +103'h187a17f3bcd36d3d3c00000000, +103'h16423fc642756bf3e200000000, +103'h2b465542dcef83e7a000000000, +103'h2876a9163231c3ade200000000, +103'h0aec764dde7818f0be00000000, +103'h2b35b0c2c6eec206f200000000, +103'h0ef4572b90db3854d068080048, +103'h0ca2817bfd10e91796d974bfff, +103'h3e826f7a4a0540432700000000, +103'h0eda766956a7c1bf2241201481, +103'h25213f5f562a31396c00000000, +103'h0c4340aa2504a7a2c4a3f3d572, +103'h2f762b0c8b25e7021a00000000, +103'h1cae55b2166927ac3e00000000, +103'h208e4216c4df52b8c800000000, +103'h3a985fb4e08da86adf00000000, +103'h38a724f5c11bea81a400000000, +103'h02dbd138bab44a3684b7a27174, +103'h2179a527f55b6f2c4600000000, +103'h04f6cbcff63740650000000000, +103'h0a019ae2d6b0e58cf400000000, +103'h112854775ca7b15cea40518d39, +103'h1103584266a94c3fc22d060152, +103'h0739cb39b6d1a0b71e00000000, +103'h30a77e9606d4f8f98400000000, +103'h32c6177f4d0ec4333b00000000, +103'h108c61c57eb642c940eb0f7e1f, +103'h14fbf84b717c5a488e00000000, +103'h0f3d2f888308bc0e0c84160400, +103'h10535fbf1604b4597c2755b2cd, +103'h1f785428e641e3e1fe00000000, +103'h2b538b5bf69543a11600000000, +103'h26ab1cd7950d97c9fc00000000, +103'h270b6a613f612325f200000000, +103'h3c706c44650c3ffd8700000000, +103'h381752098b17aa5ec400000000, +103'h2a537b6fc68816a32800000000, +103'h309d3c9ffe9f68acb400000000, +103'h344820f628f2e41c7a00000000, +103'h1cff4549d89020bc7a00000000, +103'h10ce13fc4cd841b2a2fae924d5, +103'h0d24f951ead786fc7cfbfffeff, +103'h061b47543aa59af8c800000001, +103'h2804797306ca944ab200000000, +103'h247dcc4e4ce5db9eee00000000, +103'h2ecf60dc36ea5511f400000000, +103'h20f87c669b6821604200000000, +103'h0ec732e9c937823c7803811424, +103'h05607db7aa2ffea31200000001, +103'h06dfa42478f7318cdc00000001, +103'h3e491fa33d57af448600000000, +103'h101abc8242375368fef1b48ca2, +103'h2c23db9dc080730c3c00000000, +103'h335cf95c529b2f8e7f00000000, +103'h328d48a7bebf0b2c4100000000, +103'h2f154737b31c04889200000000, +103'h2cd49930a4a94d305000000000, +103'h2d145e35d2be94680200000000, +103'h3eef52c97e932d98a700000000, +103'h108952896ca78bce78f0e35d7a, +103'h123f56d1ea96de97f800000000, +103'h3a9ea84abb2031216500000000, +103'h32bc8e2b8e5f87f34f00000000, +103'h2b6da1a508fe303e0a00000000, +103'h0ec640ecfababe69984100344c, +103'h1eb5becce728600ea000000000, +103'h28c56dce34eea0fb9a00000000, +103'h0034a4c2d2a45fc8806c8245a9, +103'h20a20bf57b69cd96b600000000, +103'h3aca3191ba9e72598900000000, +103'h3c1ab73c9b407e4f0500000000, +103'h3359dde3160aafe0bf00000000, +103'h3b3d64521325671d5b00000000, +103'h3e8ab857c57f45007000000000, +103'h3e767eb6febca9528200000000, +103'h18a2c3653f4761aa4600000000, +103'h08d9b7f43cbde06144322bcabc, +103'h0b3613a09460a3c6824d84e825, +103'h1111b44d5c3a5bbabe6bac494f, +103'h14a9fe4ca6706f5b5200000000, +103'h1889a9f6368223a8ae00000000, +103'h162736010a2c21f55400000000, +103'h2a2565d262b5cbeb8a00000000, +103'h195df15e7add01ec9600000000, +103'h2f06ec45e40267bef800000000, +103'h38320ad5fc60591d7300000000, +103'h0e894b5b6a6745635600a0a1a1, +103'h089657cc64995039540783fa98, +103'h3a806629f2229b94bf00000000, +103'h126cdc467ab8f3612200000000, +103'h26b9ab807739598b1600000000, +103'h256dc01dc8a635d19000000000, +103'h08bb24f46e5fe152067262d334, +103'h1e2b255fd2cda16fce00000000, +103'h2e54192c5a88c6643c00000000, +103'h36b66683f8b3ebc41000000000, +103'h04bee9ad280804f06a00000000, +103'h03274e285ebe6b746450bc0000, +103'h125d5413637d55218c00000000, +103'h3c1c2062a4a4a349eb00000000, +103'h208ed875f601f75d4c00000000, +103'h2d099579b51e17bff200000000, +103'h1642bdf1d4acf035e800000000, +103'h24f93b8b82b685af9c00000000, +103'h16545c6f18f943a17200000000, +103'h3eb174affcf27f2cf400000000, +103'h1c2ca4b0d246db9c0c00000000, +103'h0f54c4e792f8504c0a28202201, +103'h03336acdee24f4fcdc59bdc000, +103'h0f0b5455bc79b9e46e04882216, +103'h18d5bd0a7ead24b25c00000000, +103'h36e7015b4cb879081800000000, +103'h24f095f8268e36129600000000, +103'h031f1f91dd75376de423b80000, +103'h1ac763100165cd660a031d8c40, +103'h321ccb408284ecf7e700000000, +103'h172aac791e4c5007e600000000, +103'h20c6c3c451691b486a00000000, +103'h06d8127d6693c7c18800000000, +103'h2d4f2e9c875a8b85d800000000, +103'h174b37b38d329e033e00000000, +103'h1e9390d27881cc9fc400000000, +103'h37450539d0cd04535000000000, +103'h348a4162ae609525c800000000, +103'h392a091166a59a5f9900000000, +103'h08fc6ec35b2fdbc248e9da8089, +103'h1350a1151559e4d3ae00000000, +103'h2a71d7ba1c5653970800000000, +103'h32f3a384eea6f4ac1d00000000, +103'h211b09af5b18cc663a00000000, +103'h2a724b9c0c0c6feb2800000000, +103'h0723725c6e27799a8200000000, +103'h012aecb3d899c53690e258f534, +103'h2ad95bb75ebd3792fe00000000, +103'h2ca0972120e82446d600000000, +103'h3d7442760ac17ffe3400000000, +103'h3a6f67657662171f5500000000, +103'h1104518b74d659955e16fbfb0b, +103'h065673446f45c0fad600000001, +103'h1a90b944414a12864a0242e511, +103'h3a8c7f4246a085cab800000000, +103'h10ea5c5fa0313f0ef85c8ea854, +103'h1a1e93125abdbe513e00000000, +103'h12988abfeaa81ab0e000000000, +103'h0c5c94f3c4c6adc33a6f5ef9ff, +103'h0ac124f2595f38832600000c12, +103'h2b56f3ffe4bbcd76ea00000000, +103'h26aa815eae7cf2694200000000, +103'h0ca6296e5ad3e669267bf7b7bf, +103'h37687f41417e67c7d600000000, +103'h3a8a0d974d2491363100000000, +103'h20676964428d10777000000000, +103'h36c1b79a7d171e0ebc00000000, +103'h26efec39de7e8772fe00000000, +103'h169c88a115403f0d7c00000000, +103'h136db63e7d302b475a00000000, +103'h12cbf45352ccb3e86e00000000, +103'h0f415076e63a6a26ea00201371, +103'h2935340d79065e7a3e00000000, +103'h176956b18747aef12400000000, +103'h02cda49cef7ce2fe9c939dc000, +103'h00fea670c4e639b022f2701073, +103'h246a126b86b3de4d1000000000, +103'h00dbdce086b284bdd4c730cf2d, +103'h22955646ab1c97295c00000000, +103'h32cbb2ab6af87409e300000000, +103'h06e848c04c8dca508e00000000, +103'h22b8bd223e597cfbf800000000, +103'h073bb6420741c5bc4600000001, +103'h14db468b28fa82de8400000000, +103'h0c734ade2e3639208a3bbdff57, +103'h12991981c3117fabb400000000, +103'h191865215084ca89e200000000, +103'h22d9767d231de40ba600000000, +103'h16950ab77b36492cf600000000, +103'h3a86d8125e0fbfaa1900000000, +103'h208a2518f4a4ca619400000000, +103'h16123ca96f2ba273f200000000, +103'h2eb838458eb5c78ce600000000, +103'h02947d0ea4c8043656f43a9000, +103'h34808181d4803c7be400000000, +103'h1c1150569714b98a8a00000000, +103'h32cdc19f4c953b0c5f00000000, +103'h173ffa74e8a68b62f400000000, +103'h217a3780da744d024000000000, +103'h3e34b108b0b447772800000000, +103'h3503e41b122e7ef80200000000, +103'h34685239d1633000b400000000, +103'h1e734bbb8567141bc600000000, +103'h20f2923f7acf66559600000000, +103'h1526203a9942b2111c00000000, +103'h1a882d2db935445096000882d2, +103'h334d6a218f5b648b2f00000000, +103'h0e79bb3128e391b8e630c89810, +103'h247572965a30fbda7400000000, +103'h12b3dc0ca8aab70b9e00000000, +103'h382789d38c2029a1f800000000, +103'h2ef69c259ed405aea200000000, +103'h0ca9403098fb8f822e7de7d95f, +103'h048ce01606f22ba7ce00000001, +103'h271b3707129b6bd86600000000, +103'h16c9b79a17284bee6c00000000, +103'h254c3ddbbf4382f57e00000000, +103'h0aca539f940d3a8f9400194a73, +103'h373a950b3859786b5200000000, +103'h3546424f4223cc0ae600000000, +103'h097a3b81b85e61161e922d4bd3, +103'h1cf1b7a9aca4a3656000000000, +103'h02766e61341edee7187309a000, +103'h22549d8410109690c400000000, +103'h035698b1d48704f1fa40000000, +103'h1cb6f4f5b6dba2760a00000000, +103'h20bbf49ef8323b27de00000000, +103'h1adfd32f54e9301d94001bfa65, +103'h2714485076a524bc8e00000000, +103'h04cfc2639084f7ebe200000000, +103'h1a66deecb699403c58000336f7, +103'h2930369dbd69029fea00000000, +103'h0ae2be6c56cfe18ca00000715f, +103'h253a6af77e00182a5c00000000, +103'h0e170f6e88e2d696b201030340, +103'h2e8cf421ec1d418e3000000000, +103'h0c6bdb753b3450fcbabfedfedd, +103'h3f1aa4552ac1451ea700000000, +103'h30c9855f772d2093e200000000, +103'h2a5b3d007547c4e90c00000000, +103'h100a362fa5114a48827c75f391, +103'h32ed805b8e6c8748f700000000, +103'h3e920fa62176bd789c00000000, +103'h0063bf8492643dd42a63feac5e, +103'h397d344c12f64d7a4b00000000, +103'h14a7f35c135a0cfede00000000, +103'h3e3f39b50ad7414af000000000, +103'h0a4d3d869e7f34a702134f61a7, +103'h28bf7f2c5ebe6e5c0e00000000, +103'h19280e4c680babe2ac00000000, +103'h1aeaaa6b50cb2b0f0a03aaa9ad, +103'h288487d528f3395b7200000000, +103'h169d99e602dde3c6c200000000, +103'h21751a52ec626b9bea00000000, +103'h155846a283000581ee00000000, +103'h16069e0123751fd4da00000000, +103'h02a82ebb36cd66775cd766c000, +103'h3127a33c0ed404787e00000000, +103'h0b098358d17c3333b600000010, +103'h26eb68f780a3d66fc400000000, +103'h25426e6b0aad59c89400000000, +103'h1b66da55f098c2c014ffecdb4a, +103'h1e5f4ab954db312b1e00000000, +103'h32d3ee5071420b810f00000000, +103'h06ec68574ea1563a6200000000, +103'h24b23c26c275448ad200000000, +103'h3210d2b64961ace22300000000, +103'h174a9a70ef13e908e400000000, +103'h28c66daca024bbbf2c00000000, +103'h0ae39722b66f56301a00038e5c, +103'h2f760523a135c3dcbc00000000, +103'h1c6a2006aa195aff7200000000, +103'h377223f29a8f60231200000000, +103'h329ee39db6f98029bf00000000, +103'h263af978ed6ba41c5800000000, +103'h390cd330e10a87ba0e00000000, +103'h36f807e846458132fa00000000, +103'h0e729cc2be525463da290a214d, +103'h1ce6b1c6f64a5c4c2000000000, +103'h18c66ae784bcf90ee000000000, +103'h32b0abc222a3aad5d700000000, +103'h14e06dcfba6a15bd5a00000000, +103'h346284412c1ac17f7c00000000, +103'h0a2ef6fec0fb2f4f3600000002, +103'h24b862cb355db3906400000000, +103'h22e5796d7e8caa8f2400000000, +103'h197ca5cd25450d5a5a00000000, +103'h3d2e93ac462a86c7d800000000, +103'h22dbb0da9ea72c94fc00000000, +103'h3ce681995cd5c0414200000000, +103'h157dfce73eb1711be200000000, +103'h135a858f7a97f2b53e00000000, +103'h146194ff8f15ef9c7c00000000, +103'h360fd104a170752bf600000000, +103'h3493cd4af6d20a2b8400000000, +103'h30c93aad2ce1db302600000000, +103'h26969ac4a375a87b1c00000000, +103'h2c79ea78923ee3284800000000, +103'h12cdaf587ad57decea00000000, +103'h2ef37e63e74f68657e00000000, +103'h36fb289f791d17bdf800000000, +103'h23787b5627109621de00000000, +103'h2034b1351d0bbec15600000000, +103'h18c66500fe843a177c00000000, +103'h36a781325eb8eb4c9800000000, +103'h0ca5b521b77f504d98fffab6df, +103'h08b47f32ec26d17ff64957268d, +103'h20cf080578cc86a1ae00000000, +103'h386dcaef808105d49b00000000, +103'h30c5792623500dda1400000000, +103'h1e9c77aa5abdd8c99400000000, +103'h389a47ae8a8351efb600000000, +103'h0c649e54691fc99a12bfefef3d, +103'h22affacee2ba11489c00000000, +103'h184b65236f1eaf9d0600000000, +103'h2aa4a84190ceaa6be800000000, +103'h08813d4f6a1a0f8f564d99601e, +103'h0e7d9bf754beb7d0e81e49e820, +103'h36340be7dd3ff5205200000000, +103'h0c092b756abd9117a65eddbbf7, +103'h34acf56ee0f19cff8400000000, +103'h076acef7aefac874ee00000000, +103'h2ee7605162a7bde3d000000000, +103'h32a3e6cb6b128cdb7f00000000, +103'h211dfe5d18f9ed2ce000000000, +103'h3089b2ee4a9dd3f84a00000000, +103'h2ef02ff46abbd2556200000000, +103'h10fe6ade5c458543ac5c72cd58, +103'h1a1f32a3cb35b538180000f995, +103'h3e39e7961b3420167400000000, +103'h2af27080b65352ba3e00000000, +103'h0366cbc0b48d3a505abc0b4000, +103'h3620ac445f7faad11000000000, +103'h3710420022e67691c400000000, +103'h1033f7d2580722d622166a7e1b, +103'h20ab005ece1764d64400000000, +103'h24af433b9f4b5ca89e00000000, +103'h063330e97ef65d076c00000001, +103'h0c9d952922a5a0430c5edab597, +103'h2b0f1c3eead8d12c8a00000000, +103'h1698082af7766655ae00000000, +103'h236c50bfa08582949800000000, +103'h2e36f65bb71d8abf8e00000000, +103'h1ca73c3ada89db7f2e00000000, +103'h34f0534688c0d1dae400000000, +103'h02afd0a7e4680e15be00000000, +103'h30f4d09dd858615c4600000000, +103'h15575b535a0832042a00000000, +103'h1543c1880afd02a20200000000, +103'h1af0f9979e545df55c0001e1f3, +103'h06063fbcf2981f7d6600000001, +103'h0973e73e8e89191506fd7f15c4, +103'h26e9c0c4548f58d1f800000000, +103'h0c5c9cec1c034010862fee7e4f, +103'h1223d70942ed00d4da00000000, +103'h0c8330a3d1499dc0f8e5def1fc, +103'h126ba353626d74ca3a00000000, +103'h2ee36ed4eef0a56e0a00000000, +103'h275e7a67035c48c16e00000000, +103'h20c686cdf03fb7965c00000000, +103'h2d7830f5d69e31fd5e00000000, +103'h1a974fe7f664b8cb4e00974fe7, +103'h36a7144822dce9c12400000000, +103'h16132169bd7439a91c00000000, +103'h24bee621b41b4df13e00000000, +103'h0b08dcd70b2e6f5afc00000002, +103'h26b78c57aeed557cb000000000, +103'h2443259978f63253ba00000000, +103'h2042f8845eadbeab6800000000, +103'h115e196084f0e444e2369a8dd1, +103'h0aa7a997a433dcc94053d4cbd2, +103'h34de8f4b7691f629c400000000, +103'h160ba75301399fc16a00000000, +103'h16e67e05f5182f0ce000000000, +103'h1cb238fdca23d65fe000000000, +103'h06b1d0bee30a5465d600000001, +103'h27435ea9bebc8d63a000000000, +103'h070e8c56046e5e228200000000, +103'h1cf1e90f2ab1bccc4000000000, +103'h3ef91c2830c049224500000000, +103'h010aa3a70eb232316ede6aec3e, +103'h02d8b8898cab4e59a044c60000, +103'h06152b8e8cb5f200ae00000001, +103'h36035b5fce8eaa8a3a00000000, +103'h16b1d45356a3d618c600000000, +103'h05127f784ca731789600000001, +103'h3f1e78f6e35905cbec00000000, +103'h04e06476276b85443800000000, +103'h1b30fa7fa489fe3b1afffcc3e9, +103'h062566a1e96a62b14000000001, +103'h3ec1043cc49b5d30e500000000, +103'h18b5a7a38ac0c3d2cc00000000, +103'h1915d04e8a81c80f9000000000, +103'h3cfff734a3376fb31d00000000, +103'h0b5480cbfd4d4001a600001548, +103'h1a446794384d37364802233ca1, +103'h36f5122f42a1b8024400000000, +103'h1d2784d9dee61f967e00000000, +103'h2691673794db31c5c000000000, +103'h2b488996f202b69f9e00000000, +103'h294ce32c98941dd73400000000, +103'h2af2f4c482dca76e2600000000, +103'h097f25f2ed298a9abe2b57b429, +103'h3ce688e7161c7f5f4000000000, +103'h2250a27ade9ba5522c00000000, +103'h214ed9e5dc822e394200000000, +103'h2229b8befed2d0b42200000000, +103'h0f2e2232e121aa99fe90110870, +103'h134f0b06024b6358fc00000000, +103'h340b992b5079858bdc00000000, +103'h324a5589e2c89091df00000000, +103'h2e5be29c96d429bd3000000000, +103'h0c8f1a49481e7f47124fbfa7ad, +103'h2b0db54ef97a61e3aa00000000, +103'h1b05d5e084097c2cf2ffffffc1, +103'h2ec68703ee17317bea00000000, +103'h195b61e48a1d075c6e00000000, +103'h0b0ebc0c38e38e605e00010ebc, +103'h373c7817913ef044e800000000, +103'h2473b04fdb4dac512000000000, +103'h02c21a04108a2468b008000000, +103'h2b2d8b14b6fdd4b88a00000000, +103'h0a7c8a85b8bfeebc9c0000f915, +103'h3b0a7a3ba4ed79d15200000000, +103'h06e61642ae6a04570a00000000, +103'h234bd6b26a747e92ae00000000, +103'h34af6bdab15a94d55e00000000, +103'h3ed2efbf92a66b87c900000000, +103'h2ee3ed75c755d7627800000000, +103'h0c5eef830528c7220abf77d187, +103'h144e7022f30cb497d000000000, +103'h0c9885983e6ba41ad47dd2cd7f, +103'h1689069552ba143dc800000000, +103'h26cf5ef4de5299d60600000000, +103'h3a3e7e7674dba06b5a00000000, +103'h02ba528fdaaaff6038d0000000, +103'h0aa1cac416e97dd6ae000000a1, +103'h2443573618a3d0668800000000, +103'h1c377d7e22459b2a9e00000000, +103'h0a0744318688f260b800000000, +103'h14820a4524c06fdeda00000000, +103'h32e64e2f6ec7b4106300000000, +103'h2aee62804349be558600000000, +103'h073c11fbb6300c84f400000000, +103'h2812b3d7e11e6f053800000000, +103'h2ea9c592e75a8100ee00000000, +103'h22088b5e4e6d34d8ce00000000, +103'h1ab10f7f3d16fa6bb60000000b, +103'h0889a025201f85ca044b12f792, +103'h18809fd03ad095494200000000, +103'h0ed2207c455a356e6229103620, +103'h1290d6011cdad53e9c00000000, +103'h156685f1aaacf5bae000000000, +103'h365bbbac3c3dcbbbfc00000000, +103'h152186b012a451ada600000000, +103'h3441872249000d59e400000000, +103'h323c5cd31d219409f700000000, +103'h18e4283ed2631b2c3e00000000, +103'h3cc9bf66849f77ff5c00000000, +103'h3253a83bdc83a03e2f00000000, +103'h32dd9e6b1b4d5fa4b300000000, +103'h0e8928a44ca107e08e40805006, +103'h3c97ce09be7ea64ba800000000, +103'h2e45eb6e8d07ceeff600000000, +103'h3c77a911889f9cf9b500000000, +103'h26f6c65936e588684200000000, +103'h1d16eb81745d3179ca00000000, +103'h10b5b6f55b53f7d302b0df912c, +103'h135c5159376ae3547600000000, +103'h1ea288b6c7209a49d000000000, +103'h20ce487c9b7ceba30600000000, +103'h175739bc381f7459cc00000000, +103'h273422ced8edbcd66600000000, +103'h2d7bef35ee44f6929e00000000, +103'h38e455e6d47919617600000000, +103'h20c9a83ac0f508976400000000, +103'h3ece6ee878d95e7e3800000000, +103'h36c0f26c98a306b8f800000000, +103'h1af86c83597175a1720000003e, +103'h14a8fffb8e32680e0a00000000, +103'h0c4e9c0b282ad49162376e4db5, +103'h3ecd9698fcd3d48cf000000000, +103'h0aef97dfcb2270981a0003be5f, +103'h2c830ec808f007311600000000, +103'h1e48edbe52df9f10e000000000, +103'h3939a1460162add8eb00000000, +103'h0efe295a9eab9b973c5504890e, +103'h30e5220756e53cdd3c00000000, +103'h1abc21e524e36637da0002f087, +103'h1672c0d3d4c8883f3000000000, +103'h148c0d9b6e84aa245600000000, +103'h2f50f5fa46f76af82a00000000, +103'h20fb1b365a8378939a00000000, +103'h3688a6aa48d46e8de000000000, +103'h20deba5d68cf89c43a00000000, +103'h3ab97834de58306e8300000000, +103'h1a8ba1048136eacbec00000117, +103'h14e14267baf06300ca00000000, +103'h190b5258d67c04054a00000000, +103'h0404ec0e2b5d466d0600000000, +103'h0e56b632036898c5dc20480000, +103'h1adf6b21c66d84d4060df6b21c, +103'h2158831256c43b060a00000000, +103'h3d4d9f0830a3a627d000000000, +103'h02a0016b10fc293a26ac400000, +103'h0d5afc93cc49c84256adfe69ef, +103'h1e837c908ee9c9ad6600000000, +103'h057037935c44c6413200000001, +103'h1d0098bdfac842d1c200000000, +103'h028d2322bf387a651ec8af8000, +103'h366375c9db3913231800000000, +103'h3923921e5ec63645d700000000, +103'h172874b41529ac0fb200000000, +103'h2ef59a1b8d4d3e2e1000000000, +103'h04fb39e82375b2e22400000000, +103'h3739ecd7d16b4cfdb000000000, +103'h063ed60d556686e5d200000001, +103'h2b6d6b528ca073bda200000000, +103'h1ae93ec5d2df49caf60000000e, +103'h2cdac51b3e4cb51d8200000000, +103'h0e37986e5935f3e3561ac83128, +103'h06faf2a74710b8fe9400000001, +103'h085ec09dd448516cec0b48f89c, +103'h1ea1d85f5a4344143200000000, +103'h3331a53e64a204b20900000000, +103'h20f76600c243dd116200000000, +103'h12cddfc1b675824fc600000000, +103'h1aecaaef976ce8508a03b2abbe, +103'h3e4eba31a93ac8124000000000, +103'h0552ce25c5277301d600000000, +103'h0e9abf2b42762d337e091691a1, +103'h0e58328086c8fb594224190001, +103'h24828e265663ba848400000000, +103'h24e7b1de64bbed050c00000000, +103'h277448984b3e7b2b6200000000, +103'h2d770c85ae262d09c600000000, +103'h3842cbcc549a75a21100000000, +103'h1a72459780118227be00000000, +103'h205dac67b9544df41400000000, +103'h32878e6352c6938b9500000000, +103'h30d79d68b5243ff34e00000000, +103'h04c2221026abce56a000000000, +103'h1abe28df56836bbf540017c51b, +103'h290e7da29c458dcf7a00000000, +103'h092565f17703b6aed21369afd2, +103'h1f608e339f1234516e00000000, +103'h184784cc67379a42e400000000, +103'h2ab1e724849828768200000000, +103'h1961d74c1edfad42e800000000, +103'h3c157e22889194676f00000000, +103'h3edb594a62f36bb38c00000000, +103'h28d8ceb51e08e9d61400000000, +103'h176e6c965ee443207600000000, +103'h22e3b7ba86bd11d59600000000, +103'h36ea97461d2b7e6bf400000000, +103'h2ee4e2853f0f36267a00000000, +103'h04e8179a74f9cd6c9600000001, +103'h38cf8fd022deaff1d500000000, +103'h327419db66c6c78c4900000000, +103'h084422529e96575c6c693a8779, +103'h1c2360f0500a7137d200000000, +103'h24fc6cfa994e938a7200000000, +103'h10b428f6b471f47ac2211a3df9, +103'h2532ac7f1b6e61755c00000000, +103'h16478763ea228a6c1000000000, +103'h1866d3808e5536eb2a00000000, +103'h34d4b327a49cbe4f1600000000, +103'h06b487497e0391cfa400000000, +103'h3002bce0b2d844f74a00000000, +103'h06737ce3f88ccc40c800000001, +103'h2d3973d26a8f89217a00000000, +103'h369c290ff10306057400000000, +103'h3e02701d1d3c79d7de00000000, +103'h3840fc2192d8a2e7cf00000000, +103'h2c0c5466d0db1304ec00000000, +103'h0b6735cd8a1c0f267e00000001, +103'h1ac51d39b728638d5000628e9c, +103'h075f7e7dc28f995ada00000000, +103'h04d282a99c54b6949000000000, +103'h152099da62b435125200000000, +103'h2e8ac031a686b7bbee00000000, +103'h011d4a163ca7519650e24dd646, +103'h123f6d55ab3211c7f800000000, +103'h02b64729ab4f5bde3454000000, +103'h12e1560ffe8ec933de00000000, +103'h0a931cb24145105d8a024c72c9, +103'h3eec34ead326666d8800000000, +103'h1f775eeb5eb9831fc800000000, +103'h2851e4ca1ca5b80a9a00000000, +103'h30bb33dcba1d16f5f800000000, +103'h3869934ce36efbc01600000000, +103'h123e592a922a2f9cd000000000, +103'h0ccca2280a93c2e9b46ff174df, +103'h2300a3301ed21c144600000000, +103'h3351bb2e2a9ebe3c5300000000, +103'h2711ceec4c9f616c7000000000, +103'h2efc12473ef11c9a9a00000000, +103'h017a188be702eb86e63e820966, +103'h30ca3ae4d4fefdce2400000000, +103'h0ab91b7a1479165a0a02e46de8, +103'h31475d7bc443513ede00000000, +103'h14c6bc180efc6cb8f200000000, +103'h2149063b3e43ca34b600000000, +103'h3eca4e2c920a864cc500000000, +103'h32c4ac77f2538c880300000000, +103'h29025c02331ddab49600000000, +103'h2f3c784564e2872c8800000000, +103'h30ba5ebd4ce4e32eba00000000, +103'h0642cb81fa215b741e00000000, +103'h111ec4ceacdbba316c21854ea0, +103'h0a1898cff21e85b36600000189, +103'h2af4f3fdc23d4a821200000000, +103'h16b6325a4f55e3520600000000, +103'h3c98cc2af84ad74fc800000000, +103'h1157202d0e0109aa16ab0b417c, +103'h1633f9e28a99d5d50e00000000, +103'h1e4e1e1a1af0f6021c00000000, +103'h36be25a3b124efe4a800000000, +103'h0579047d10730dfec200000001, +103'h2334ed00873133a27400000000, +103'h0a8aab590aaa381f8411556b21, +103'h0cd15fb3acdf25200a6fbfd9d7, +103'h003d03f2f669d07914536a3605, +103'h051bb631053b302cc200000001, +103'h0e2b9c118478341fb8140a08c0, +103'h24e5ba118a93ea50bc00000000, +103'h267efd3198bf86624200000000, +103'h1e8210cabca54073cc00000000, +103'h1cc05490a2243da56400000000, +103'h1f76cc7642a64e702200000000, +103'h2ac12eac9e66a300c400000000, +103'h0ecb17453cdd6f77066483a282, +103'h317a4051a69e9e23a400000000, +103'h364da7037469b568e000000000, +103'h3cc75c2566e3f5ba8700000000, +103'h22a7b4481d319cbdfc00000000, +103'h02657be1d8f8f8e362e1d80000, +103'h0ac1e19f3aa0ad2b7e00000000, +103'h0687fcc57e06290d5600000000, +103'h29320da648c80aac9200000000, +103'h270dbb450f5007721000000000, +103'h3ce261c7368215185800000000, +103'h0f57b574dc8fd05d6603c82a22, +103'h1ed3322fd97232249c00000000, +103'h3716b99768c9e7997800000000, +103'h1caa4871069d19c95000000000, +103'h38bfec62feb3d360b800000000, +103'h306560b25b5e1bd1c000000000, +103'h037d0726551e0834be00000000, +103'h3a5e9533c48368e71800000000, +103'h3add3d0a8600700d6d00000000, +103'h390fb842035f05413300000000, +103'h12a04f4b3c3c424bb800000000, +103'h3f4eee89364bfa8dbb00000000, +103'h3080f6ae48ec49d8f800000000, +103'h2ab36ee0c73b38622e00000000, +103'h2544ec5478bc2f107600000000, +103'h1d12ac13e26f9df13c00000000, +103'h0a2c666106b48a45b400000005, +103'h01326a8724c7365996fcd0705d, +103'h3e73a70f6ef39cba9e00000000, +103'h337112a831260741c300000000, +103'h0ade1c322e99ae51300000006f, +103'h28ffb001e00ac0f96000000000, +103'h2ae87a2b2ae8dd2b8e00000000, +103'h1ac4e10f12e88d2d7000000062, +103'h3cc74f34bcd107589b00000000, +103'h0b636bab9895e867ae00000163, +103'h3b0a491bd45d379c6a00000000, +103'h169a03b79ec0a3480200000000, +103'h05124b80dacaec63d600000001, +103'h2f5b9aa2b164f01b7600000000, +103'h333ad22c35773b9c5100000000, +103'h0877415222d2d63f0052cbb691, +103'h3e7453c0150da86b3400000000, +103'h0f3c5291de84e9bd56022048ab, +103'h0e69417f1cf93d7d6c3480be86, +103'h030d6c08ad35900f4ad6c08ac0, +103'h1a846cd13a9ed18e6600000846, +103'h07091604feac3d971200000000, +103'h1112a8f61930aa684ef0ff46e5, +103'h371579649f39c06d4c00000000, +103'h0b4dd9e26f4c696364000029bb, +103'h18250beea561e2c80200000000, +103'h24a87b91eeafbcaa7000000000, +103'h085c959d86d4c89914442e8249, +103'h0a4a70166b7d442b04094e02cd, +103'h3a84b3f2b2d9d9c88a00000000, +103'h0e20da96fd2449def610244b7a, +103'h126cbde5b6a8fdd1a800000000, +103'h1e8d69cd86c9d868a600000000, +103'h142b59e05836964e5c00000000, +103'h3ca323bbb6c4001be300000000, +103'h223f37760aef59fc3c00000000, +103'h0084490208927db7f28b635cfd, +103'h229332f6aad1b52dfe00000000, +103'h1ed8b339ab55fe300600000000, +103'h12e233988ee93126b000000000, +103'h10db0df3acc1e4605c0c94c9a8, +103'h16666606bea417f8ea00000000, +103'h06c37347ce7f25ec9600000000, +103'h22767eb8e4e58bf35600000000, +103'h0d12bb50aca8ff3b24dd7fbdd6, +103'h2470dc48cf1f7df40a00000000, +103'h3b731539dd323944b700000000, +103'h1ef4741780a3158d8400000000, +103'h295b5ee87a162ac76000000000, +103'h1e6b48f4980a9edee000000000, +103'h249ab0f4c265fdc75a00000000, +103'h04fc5239a0d146bbf400000000, +103'h2601090c056bf7b0b600000000, +103'h011beaa5ca6849ea56c21a4810, +103'h35416b1e716952f65c00000000, +103'h2acce95e70853d9c2600000000, +103'h0329ae5a66c6a8ba96b9699800, +103'h1ef26b07109392190600000000, +103'h0423719e12bd40736c00000001, +103'h1abdcb2b70afab7a7e00000000, +103'h20dd6254f4d31d189000000000, +103'h0ec3a2390e90e8440240500001, +103'h0d3d7436306e4a98f6bfbf5f7b, +103'h1d7486a6bf31ecd20600000000, +103'h1f5b4491cb6f61083600000000, +103'h16151f9566e3e7aef400000000, +103'h1d5fe2dd073f2c40be00000000, +103'h1318f0bd9c544bd62400000000, +103'h0703eb7038b42eb32a00000000, +103'h055e472b0acd1f70c600000001, +103'h289c8a94d0d10ae0fe00000000, +103'h1519fa3f542f520c0800000000, +103'h1aebb5bffccbdca0d800075dad, +103'h1a719ff3d0e5d6e02c000000e3, +103'h22c4a9986cd18ca02a00000000, +103'h3ce8be1e06432c93fa00000000, +103'h283c24afa807d62c6600000000, +103'h125b67e224f0944a6c00000000, +103'h0f6081f4cf2cb8fa1690407803, +103'h343728a7a08820dc3a00000000, +103'h2250fbee6ee8a2d10800000000, +103'h3972a561a51fcb78aa00000000, +103'h3284e31f4670c7671900000000, +103'h3cc3d9d6fee36cc8bd00000000, +103'h268af16af0684fe80200000000, +103'h3e3aabcfec2c29bf0100000000, +103'h3c0a31ad92b71b29f300000000, +103'h3f4a7ef252f1c6f9df00000000, +103'h016e38ffcefbf8a7723518d3a0, +103'h32fa42f54d467799c500000000, +103'h10b276a9ccb4b09992fee3081d, +103'h0221c5883eaef38ede620f8000, +103'h0682db6091616a38ac00000001, +103'h18dfe9e052832fc0ea00000000, +103'h38836ff9da060b217a00000000, +103'h24dba6acf2e5f501ce00000000, +103'h0ee2d0eeeb6964fba830207554, +103'h0a4b65698e450ba89a00012d95, +103'h193729a51f27dc978600000000, +103'h0128f9022873420114ce1d819e, +103'h1b00bd6100aa6ba632ffffffc0, +103'h2141e6bb80d364a85a00000000, +103'h36c81bbe9ad422095a00000000, +103'h29762d593c1608c4da00000000, +103'h049780f4f2de24837600000001, +103'h1e634036db5451dcb200000000, +103'h3a0264211eebd2d1a400000000, +103'h3175aa14be4f13087e00000000, +103'h22fef8cd395177299e00000000, +103'h07666c0928c7213e5c00000000, +103'h05223121cac61a0b9400000001, +103'h22c9c90c112c8614bc00000000, +103'h3ec073fed54eb7368600000000, +103'h1308961b391880429600000000, +103'h0e17d975f6d8f4416a086820b1, +103'h14ed36dc4ae18a5ca200000000, +103'h2aef1a5758f963d29a00000000, +103'h173fb508eee69aaee400000000, +103'h38a8cffd18d5b5063d00000000, +103'h12eadf32ae156a0f2a00000000, +103'h370e78c4e8be3a0c4400000000, +103'h342b7629baa9193ef200000000, +103'h1f2f0e3d72b79203da00000000, +103'h23085b5766e3082d9600000000, +103'h16f712808512166b0800000000, +103'h30a403b5e91a71c26e00000000, +103'h06fa0e2a3e118442f200000000, +103'h0e07aaa26eb587f8da02c15025, +103'h3cf84f4836af96231800000000, +103'h30fb0a5904b740c58800000000, +103'h0b18372c42af900dbe00000001, +103'h2546e84272aa9a66c200000000, +103'h2c2b21517cc2d1930400000000, +103'h2abef083a009b9d57600000000, +103'h2c0a007b4d34db26f400000000, +103'h3204a080b6f3cbaa9500000000, +103'h28a9daece4fdcc25e200000000, +103'h1d11e6ec16026ca69800000000, +103'h3283acc0beac47937d00000000, +103'h152a4dbc5cbe2e7f9200000000, +103'h2cc4ba628f41db405200000000, +103'h2b5cf32ea36c28fcae00000000, +103'h3cf798a14f30e35f3d00000000, +103'h0e3e85a7788dd68dde064242ac, +103'h3d43a12d36856f2f2c00000000, +103'h388a97f344c3f4d6a700000000, +103'h173db7b603079603dc00000000, +103'h0421bad7fa922df72000000001, +103'h2a939487d2cfe5ad2200000000, +103'h068add66d6f1a0851e00000001, +103'h27461b1c8085350cf000000000, +103'h0b08eed607101273c6108eed60, +103'h285df086ad562d904600000000, +103'h1882d7e4775f1c664c00000000, +103'h1e995fc75ebd0cecf800000000, +103'h24351cb7373fe4d17000000000, +103'h30e0ec1ad4d94498ce00000000, +103'h28e2e90eb90e61500600000000, +103'h18440268e8ef4d6ada00000000, +103'h296228b012d236799400000000, +103'h2ec033c8aa1638e27c00000000, +103'h08f7837a127861928e47f1744e, +103'h1c3d347b8138955b3a00000000, +103'h1b7232e7ca3018d54cfee465cf, +103'h287967cda76d4d50ce00000000, +103'h2296d59600df80389800000000, +103'h312ca4f0ea58e8063e00000000, +103'h3efb09a70cefbd9c4100000000, +103'h16f987327d1c628d2a00000000, +103'h1465520eba176c343600000000, +103'h14b09d239110f366b400000000, +103'h3f54d03ea67645756f00000000, +103'h36e8c0f5fb26e2990000000000, +103'h2a99143a7b7bb2d7a600000000, +103'h1960d3b3306473cda000000000, +103'h193986929afd88081a00000000, +103'h3e887ee7725e5bbb4b00000000, +103'h20fe59d54c97e24de400000000, +103'h3aefe79acb2061355900000000, +103'h0645e92deb1ebb0aa400000001, +103'h2a9972c9260ea2a56e00000000, +103'h034b581fad548bd35a81fac000, +103'h26951fc416edfe9c8000000000, +103'h16ff489ddb3956bc2c00000000, +103'h30882c8240ce76804200000000, +103'h301fb30c16cdbf1e1c00000000, +103'h1c0bc5694755eba05e00000000, +103'h1ee5d662f6759eac7400000000, +103'h3cf93e18d2816415bc00000000, +103'h1adb1c4ef2673a78b200000036, +103'h0e8ab9a32f60789186001c4083, +103'h0a904297c93b94e07800000004, +103'h3e0b6a38d6c64e83a600000000, +103'h0507f5efa356911b6e00000001, +103'h3d6bbc1f2061fb544400000000, +103'h232ffae02469f143e600000000, +103'h112fce81a0d5ad63062d108f4d, +103'h14f5f0a6c205a8432a00000000, +103'h3d12a3e7523576c4ca00000000, +103'h0291527c262b676b8c2a4f84c0, +103'h2e79f254e23e0b52de00000000, +103'h39383f90a6cf5dcf0700000000, +103'h06fc350f94495023e800000000, +103'h24f5a1534c818fb48e00000000, +103'h2a1a7502927dc4c42200000000, +103'h157d5404b97366177000000000, +103'h22af90d5e28ddb1a0200000000, +103'h062b1dcaf60b2f1eba00000000, +103'h37283a749ababff49e00000000, +103'h38a31be260e5ddbf9500000000, +103'h34916367960e18342e00000000, +103'h120d8606ceb134168e00000000, +103'h2694d7c4c242977e2400000000, +103'h16d6e97755501d84f400000000, +103'h24fed8e97ce4f549b600000000, +103'h0b34e08fd2bbdec10c0269c11f, +103'h3e1c1c4cb6bab7aa8800000000, +103'h3445ef87c0ef983a5a00000000, +103'h00bfe047be0bb4871065ca6767, +103'h091ec6517551a40ed227b12fd3, +103'h22398b1c341184569000000000, +103'h350f07917e304aa80400000000, +103'h06d41c412169d5c43a00000001, +103'h16a4e577d578dd55b800000000, +103'h1cc752bd5a4cf996d800000000, +103'h16fb445972f1df0eae00000000, +103'h0f5f809d8eb931cc080c804604, +103'h272d92a5e4b476257a00000000, +103'h15748203f213f6c30800000000, +103'h1e086af8d8418968ec00000000, +103'h188e32fc6eb60b6cde00000000, +103'h22cd2ccc0cbe7665b800000000, +103'h0ec09cc1254ca9622620442012, +103'h2ec803794719d62e3200000000, +103'h2710f39a56da72ef5600000000, +103'h0d0fef2844a276689ed7ffb46f, +103'h3ecd611beab36a02f500000000, +103'h14d77c71b6c3592b3800000000, +103'h32fb6df5b490ba472300000000, +103'h26f9d269096836b8d800000000, +103'h1e9aad44fd63a4ae8c00000000, +103'h00eef223e25d771794a6349dbb, +103'h1906902e02f8245c9000000000, +103'h24aee87f42e716807400000000, +103'h3abf77895ceda6ae7600000000, +103'h0a33ab42009c8f2db800000001, +103'h3e0556123a5c06b71400000000, +103'h34cf253f068fb1f91600000000, +103'h2e800aec4495080b5000000000, +103'h031e9747fa642d4a565d1fe800, +103'h1959b2d168e438369c00000000, +103'h2af0d511eb02cf7e9600000000, +103'h0117a94b855c824ffe3a15cdc1, +103'h1cd385906e4d5761e800000000, +103'h32f38f1fae6500ad6d00000000, +103'h30f7d0e58c38863dda00000000, +103'h1afee229ff2c155d8a03fb88a7, +103'h076275be7123e6431600000000, +103'h231360b4ca22c86d1400000000, +103'h2c294c5890853e2b8400000000, +103'h0277be3a32989ee04eef8e8c80, +103'h16f245795ec1eb38e000000000, +103'h1c90b2fba039a9731200000000, +103'h2b51e8eaf92beeec7200000000, +103'h0a985d05d4bca1e81200261741, +103'h1e777000fe0e8ad30a00000000, +103'h11186e350aa6e7d8de38c32e16, +103'h22f315dc291e57d9de00000000, +103'h2ef9ac6fb936c60ee800000000, +103'h0cbce4eb5b29dbeb10defff5ad, +103'h2a8ea83a0923885ac800000000, +103'h1307536196e06d462200000000, +103'h229e5663016f15802c00000000, +103'h2b6c1f73557668e1c200000000, +103'h0e63c46eb614bf44c200422241, +103'h3b7ef1c4e280deb81600000000, +103'h3d7a8c6130e4a326ce00000000, +103'h3ee53c7dab6394ebb000000000, +103'h16c6557be6de214ce000000000, +103'h24bc2dbee4c35dca8a00000000, +103'h1432e4b9fa89b3467000000000, +103'h348e3edbde45e1055400000000, +103'h3e4d2de97378c5bf5000000000, +103'h2eea3e43e607049b2e00000000, +103'h024aac68e5543284a268e40000, +103'h1234cdd4523e70c88800000000, +103'h0364d04516891d316e45800000, +103'h240d987528bdeb05c000000000, +103'h2cbd65406a22bb4ad600000000, +103'h1ac164904f3053c00060b24827, +103'h1d03d4a8bcedb9006a00000000, +103'h32cf61f296af1d90bb00000000, +103'h3258da4232b2f2397700000000, +103'h1f050ddca682542c0c00000000, +103'h18e1953718db2e6e4000000000, +103'h0eabd591f6e03c4ae6500a0073, +103'h1a25337d8ec1d181fe00000000, +103'h1a5183a29d6da713f600000005, +103'h010027f3b892da9184c981429e, +103'h0089fab312e45e3422b72c739a, +103'h36f409bd54e48627da00000000, +103'h3b1fea49946e80daec00000000, +103'h1cb971e9ca628a984000000000, +103'h36e5d41b848274e1d400000000, +103'h24f69481623be6cb9e00000000, +103'h24ebdb0f1921bae72400000000, +103'h3a4fa277bd184f688700000000, +103'h1915f478a2042a779e00000000, +103'h3d5ebb5b5d53ccef5c00000000, +103'h02e36909b569c167fe00000000, +103'h2289d19f32c87cc35a00000000, +103'h3e48899d34abe5cd0e00000000, +103'h3c0b6c12d635b76c4100000000, +103'h16221b77d57e41097600000000, +103'h24a28c44d089ad1c4c00000000, +103'h26eb79d526abc8942200000000, +103'h1ce04d328c4e54d8f200000000, +103'h290ad7fc3339ceae1a00000000, +103'h0ab3a3cf4f1a1be0a600000b3a, +103'h3ee61cbeb724f3dcd800000000, +103'h18c45e4242d897ac2600000000, +103'h3ef0f49ec0beb46add00000000, +103'h175759a9588312ad1e00000000, +103'h3cd7da949674074bde00000000, +103'h197d4f5caccb60f53600000000, +103'h38fb5bd0e8a33b89cc00000000, +103'h16381cb000208ae67800000000, +103'h0ef7f03c381be6b76009f01a10, +103'h1b2bcb145154036762ffffcaf2, +103'h152b06e19e4bf3a39a00000000, +103'h34cd7e38b877beb7ea00000000, +103'h169080764ca2c5998800000000, +103'h336f696b437043d24300000000, +103'h1ca255c79800c4488e00000000, +103'h262135c78a702db3d000000000, +103'h2917d47f6912837b6a00000000, +103'h36b138d0ce33b942f400000000, +103'h08bae0f4764b8dc25c78b69b15, +103'h32c54d60acfcc6932b00000000, +103'h263fe780b4b7a787a000000000, +103'h04cd051c277cf4e84e00000000, +103'h2e8ddbfa8ebcdc690200000000, +103'h109a409b5289e1852a082f8b14, +103'h1ea36bcf4117bd7fb800000000, +103'h20643e8ad0b1fe1b0a00000000, +103'h0aa2062eae5569ea4a028818ba, +103'h029caa3b90b9a8751c47720000, +103'h0c212fcd9a5baea3ca3dd7f7ed, +103'h18bd72df5ef858df5a00000000, +103'h340bb40c2b1988acf600000000, +103'h3eaf5f2342d6fb8c5400000000, +103'h1a0cb2af76e2af987e00000000, +103'h10c5b4df76920ebbc219d311da, +103'h25770feed09ec16b3800000000, +103'h2341f3ab2064764aae00000000, +103'h24e3d2f3c4db86397e00000000, +103'h1e6861d4e61d79e49e00000000, +103'h0d7eff71cc014cd862bffffcf7, +103'h0d345e79eb69aead4abeff7ef5, +103'h2a4e33ccb6e8ae1f1600000000, +103'h0e438f59031d0c990000860c80, +103'h195664c9ee6b4065b600000000, +103'h2f6a87133caecfbeba00000000, +103'h2ee85809d5053488a800000000, +103'h254ed71f836fbb9be400000000, +103'h1ed262ce315813a5b800000000, +103'h06c12ee294a6eac53a00000000, +103'h2b5ecab5b5794d936a00000000, +103'h22019b117a3a7c75fe00000000, +103'h1d1427092699472bb200000000, +103'h067ec6a6889ae23d2e00000001, +103'h0690510926af09465400000001, +103'h381b28ff2c2dcfecdd00000000, +103'h26e07d6b32be20f60200000000, +103'h3b3f1902ecd949f53000000000, +103'h183896d7d2b9c7606200000000, +103'h1ae11df30ef8e0634e00e11df3, +103'h0ab774fb2731773b2200002ddd, +103'h2e4becf94112952e3000000000, +103'h3cb9aeec8cca0a295700000000, +103'h1ee138403a15f7229600000000, +103'h0e01a1f736cfa60f2200d00391, +103'h255382e956b0de4f5c00000000, +103'h3cb7f909a4b280469400000000, +103'h1ee679534b06032fea00000000, +103'h3d2af0bf86bdfc398e00000000, +103'h103f0e3ae4a4758cd8cd4c5706, +103'h3a040a05a0cf664c5e00000000, +103'h087b8616f10e748744baf948da, +103'h22f905582a127e8ce400000000, +103'h013480d2f48e04a3d6e142bb65, +103'h051471da968709fc0000000001, +103'h2ac3c92e96bb8acef400000000, +103'h00819509dccffca98aa8c8d9b3, +103'h0151df720693c5d822f2d2a514, +103'h36b02e7e07155ae1fe00000000, +103'h0095878607673a5404fe60ed05, +103'h22366b5cfd1768d20a00000000, +103'h20a74bdd7eacf0581000000000, +103'h24abf23620e35bb50e00000000, +103'h2ec5f370c28aa7928c00000000, +103'h00472eff663699c8ac3ee46409, +103'h0edfd36016fc8d396e6e409003, +103'h1b256818d743bc38d6fff25681, +103'h074e5886a5238f98ec00000000, +103'h3701f086ff48f7b1c200000000, +103'h0cec225004975038667fb93c33, +103'h38d2e1527a9940bf6400000000, +103'h3afd5c8dc685630f6900000000, +103'h204b6761ff584461e400000000, +103'h04e269e7f855a0efaa00000000, +103'h2c10bca658a10851aa00000000, +103'h10d850241c837239a22a6ef53d, +103'h3d2546b14a942edffc00000000, +103'h26ca81a05a6c7f041800000000, +103'h08c55d7f1691c5b5622a4c653a, +103'h046141af7d5c4755be00000000, +103'h1e8098198621a4d4d400000000, +103'h00341d638a82e684525b81f3ee, +103'h3e5421b1a9037e9dd800000000, +103'h1505ebb52a379c016200000000, +103'h2613fd0e688bbdb30c00000000, +103'h3e43b33c7c91a9683600000000, +103'h20f64feee2a5a6769e00000000, +103'h2cac6b3f20e959b31c00000000, +103'h229a2290c2dfa9a1fe00000000, +103'h021397956e8c14e120cab70000, +103'h1f1eb60253263771e200000000, +103'h1ccf7ae5d439cf075000000000, +103'h3d69997c72588509a200000000, +103'h1ee361b50e27ffef7600000000, +103'h30e93ececc91996be800000000, +103'h1215535a6b74fb20f800000000, +103'h0a7b36ed5b5e39efc40f66ddab, +103'h33399f89ee738d4a2f00000000, +103'h2b200815f8eec4378a00000000, +103'h2e980a0deb2863c17800000000, +103'h1e850726d7486bd77000000000, +103'h28d03e2f84e075e55a00000000, +103'h208f028262657d0c3000000000, +103'h103c8b0ccb35bb3bb68367e88a, +103'h2a127758aac4bdbe1800000000, +103'h1c30cf7bfb0148cae400000000, +103'h132f9d84a613c0238e00000000, +103'h2a93e89983448f9f8a00000000, +103'h0f2deeea15742d243092161008, +103'h1e8cb2f8bf0815bdb200000000, +103'h28ecbfd24f3604a7c600000000, +103'h19608ccf6cc2b7a08400000000, +103'h0b18e96c14af7772d200463a5b, +103'h1145732cec1004423e9ab77557, +103'h157a12ab7628edae5200000000, +103'h28e4b6d1c66e60db3e00000000, +103'h261212989ae87386b400000000, +103'h3aeee5d242cd2a587b00000000, +103'h38dbbd4e2adf3cf11700000000, +103'h2ef1827864ce22c35800000000, +103'h2875a87ddca9e0118200000000, +103'h3ee2420a0a9b6289e700000000, +103'h191c05eeb5110b07c400000000, +103'h1a3506c472f34d11ce003506c4, +103'h021c2a5d8a0f5300821c2a5d8a, +103'h06ad2e08274459c4f600000001, +103'h14d9943ca86084228000000000, +103'h19170578ee0db22aa600000000, +103'h0e47c3c702e746674e23a12381, +103'h0e87d5159afe4be03c4320800c, +103'h360c402929460fa74000000000, +103'h04f12f5f38cde4bcda00000000, +103'h02e3d0bfeeda24e604c7a17fdc, +103'h02bdb887f2cb54453c40000000, +103'h1c95ec3034af25052a00000000, +103'h20b42f7fb66cdd8d1c00000000, +103'h1ca0578c1502c9bd5200000000, +103'h0666a47e74b6f93d0800000001, +103'h24f845b6125750c91c00000000, +103'h36390bf2d8bdf5479200000000, +103'h3ee6afbcbcb63afda500000000, +103'h1c971d43f2ef46f07c00000000, +103'h2efe840832d5f6ad3a00000000, +103'h12bd3b958e6d13f12c00000000, +103'h0f39e86a7c6b97f95e14c0342e, +103'h096cd03d0e28d38eeca201d9f1, +103'h368eff001c62bbf96800000000, +103'h1487247066cf8c367600000000, +103'h02ec5dd1dd5e8b3694bba3b800, +103'h2abd2f2cb0e5afa6fa00000000, +103'h22b6d41672d20d78d600000000, +103'h371334f99e8f3ca58600000000, +103'h313f2213414610bbfa00000000, +103'h06c99a63775945b59800000001, +103'h0d39c25aa69867c8d8dcf3ed7f, +103'h077bf7caad62022c4e00000000, +103'h1e4d69e0389bc486f400000000, +103'h3764ecb1c117bc51a000000000, +103'h04d5b538de652631d800000000, +103'h38dee588d6ca12e39800000000, +103'h184a18051a9fc81c7800000000, +103'h33510f08557eada54f00000000, +103'h0a6fc25d2cc8c5aa680000037e, +103'h02f39be3de19d4b2bcc0000000, +103'h1141884e2a89970fea5bf89f20, +103'h3a2f3cd4ec7d32f3c800000000, +103'h369b9f00febebb41f200000000, +103'h20d0c6d778edf816e000000000, +103'h2a1fc360ae899717de00000000, +103'h1cf856f9d15a5def5600000000, +103'h3d4e1d86ba7a21500400000000, +103'h1a629f5596727849d4000c53ea, +103'h3165193b54c095d08e00000000, +103'h36f12a38ef2335262600000000, +103'h0ad79925e0884e617a00000003, +103'h1b382962d679789a68fffff9c1, +103'h000b31e9a05111c0482e21d4f4, +103'h3a9ed040fa893b231f00000000, +103'h2255a3be7a946d0cc000000000, +103'h2c94c59d74333d4dba00000000, +103'h0b4d6016d888e10c3600000014, +103'h0b570c50841da6a9aa0000055c, +103'h06e9f3ad4e6b06c08200000000, +103'h3d114816dac213110600000000, +103'h276bd9ce20ac06be5600000000, +103'h2b4f4c919cbd4ed53000000000, +103'h305065fec32928a35000000000, +103'h06bc862c6d787534ec00000001, +103'h36eab96b1ec8db33ae00000000, +103'h06c4f368248561601c00000000, +103'h335c7c3a5d701acb3b00000000, +103'h221d2dafe2350e335e00000000, +103'h3f56545a56918a6dbb00000000, +103'h3958563878aeb81d9f00000000, +103'h16dfb976b7050c77f400000000, +103'h12d737802f5d62b06c00000000, +103'h3003c3bd053d1c272200000000, +103'h24c1da67971453a75000000000, +103'h102ea92fc6181764540b48e5b9, +103'h32a0846fead9f1cbed00000000, +103'h026fc2607a089afbb27a000000, +103'h167c1c782ca91f6b9e00000000, +103'h029cca372e18e1cc1851b97000, +103'h36d58f5a8694fe444600000000, +103'h14e84649c831c87b7400000000, +103'h2c039834be0757d5fa00000000, +103'h32c8098b52ef9e1fc500000000, +103'h28a55cae00f336548200000000, +103'h2217ae14f2bb3fdfd600000000, +103'h26bbc7f75b609c8dd600000000, +103'h2b6739afbe784aa2c800000000, +103'h00024987e534129a249b2e1104, +103'h16908fb48e9b4c49e200000000, +103'h1eda15c10e9d95d1c600000000, +103'h0284385b652e258656e16d9000, +103'h24a6a59884083b476400000000, +103'h2cfd256fc68c73a2ca00000000, +103'h02eef190ed33193b4ebc643b00, +103'h277e5383d8303eab1400000000, +103'h313bdafd1a1f303c0000000000, +103'h3e019dbdc09d83bfd800000000, +103'h1553d42132d95ebcf200000000, +103'h14d923bff0dafc7ab400000000, +103'h2e8eb209c52ed09be600000000, +103'h2163708f9a07f45bd600000000, +103'h14d5b2d54896a6659c00000000, +103'h3a2153d7e8fa16f53600000000, +103'h1347f1553ecfc9ca7e00000000, +103'h2e9d5f6e78f11da26600000000, +103'h24fac1e38a390ef7a400000000, +103'h22eecabe38d66e661e00000000, +103'h08dcea8e1cd13049a806ed63da, +103'h2e9ad4287ebffb07e200000000, +103'h0d49db65489ce595feeefffaff, +103'h3531f199b737b9be7e00000000, +103'h16f0763442819523c600000000, +103'h16802b1876b386bd7c00000000, +103'h14cfdb048ea3fcf1be00000000, +103'h1abc7086a424280a3400000017, +103'h16e0bfc738f4030ec200000000, +103'h1486a42b92b073956600000000, +103'h08e00f4d6891335c9e389e08fb, +103'h0cdd7760fc17d788306ffbf47e, +103'h32ff077ec4f7e6d59900000000, +103'h12149aab50d55e369400000000, +103'h02daa16d44d465b55a16d44000, +103'h1d31db8bd6e90060aa00000000, +103'h30a0ed3298c3a1cdee00000000, +103'h0a07e5aef4f57d59c400fcb5de, +103'h37443c61e6966a8c5e00000000, +103'h2454f8ca309e503b5200000000, +103'h2a4eb59326e28c9d3800000000, +103'h090c142a0d3785676a1dc8a6b3, +103'h1abef01ab6863afa90005f780d, +103'h15083697be924f249c00000000, +103'h3eefcd5018513f3f5300000000, +103'h0eb9f0a5ac5975d7100cb84280, +103'h2cbb9962ab4943272a00000000, +103'h3f437d1a3a0333ccd700000000, +103'h115daff666becd2f824f716372, +103'h3ac92211e5024a49bd00000000, +103'h108e0a04755ffa40229707e229, +103'h129c351e2e291c520600000000, +103'h0ead9404c0b726567c52820220, +103'h307dc01ad2535b74aa00000000, +103'h3950367aa200ef796b00000000, +103'h3482a71a937eaf943e00000000, +103'h1ede340c8acee60ee000000000, +103'h0af0e754fe518d29720000003c, +103'h0956f6121f2fc135fe3c9b93f0, +103'h28bdf448a820a88afc00000000, +103'h1aa3a21370779e9d1a00028e88, +103'h195835ed183592e5c200000000, +103'h165e56f032d934f93200000000, +103'h309439294c316ae64a00000000, +103'h34eac3ed628fc1d67e00000000, +103'h26b8ed4e9323faffca00000000, +103'h32bca995870ebeed2d00000000, +103'h30999ad5aec7ac3bbe00000000, +103'h3aa7f6fc208455d14700000000, +103'h274614f9111df0a6f400000000, +103'h25082df5cac5e7a31400000000, +103'h2ad905dfb10bfc9c2400000000, +103'h1e718a0555142a91ee00000000, +103'h328e63fc40ed30719f00000000, +103'h16c92e9a1e5eba76f200000000, +103'h04c9e0db12ed1e733200000001, +103'h22d68fb828b64d0d5200000000, +103'h16f769272e802de86400000000, +103'h08057307d056bda08c29e753ae, +103'h1a72375f664e26c7ba00000001, +103'h3ecc1a2a315399cf8c00000000, +103'h0cdc4a024ac5d12ef26eed977d, +103'h076ca7c2ca91eb592200000000, +103'h1353c323d76e355b6e00000000, +103'h0689054c9cdadd1e3800000001, +103'h2911e144f12ea0420e00000000, +103'h17608e6c36b7a58eaa00000000, +103'h0e4126ec9ec986d39a2083604d, +103'h1c8ff4c8762a153fd000000000, +103'h08b99fc2856b3c2c70e951f77a, +103'h2311eafea2fb30f4e600000000, +103'h3521dbc96ab4d0b76a00000000, +103'h24fb5367ccc6bbb60c00000000, +103'h0afee04600e8977f760000000f, +103'h346da950a4e3eae74400000000, +103'h02d7a3502ee2cb2d44af46a05c, +103'h38f66e072550747dea00000000, +103'h3cdbf474262817ce1800000000, +103'h02aa12609e1e85d53cc0000000, +103'h2d5c1b345cfa7a496200000000, +103'h04f0ef355ea48caa0200000000, +103'h02d637b44b00a7de5eed128000, +103'h24e398014ef19713bc00000000, +103'h260f7e2390c7cec80600000000, +103'h0535de8f36ab66c95400000001, +103'h0000cba4dcbae4ece65dd848e1, +103'h06cc6098e2f0c37c1c00000001, +103'h1c898ca0a2f18f20f800000000, +103'h030e87706abdefb9da7706a000, +103'h1f3ee90987477c5a7e00000000, +103'h172a2f8f895603cae800000000, +103'h33063991a694ecd46f00000000, +103'h30d3d2b4bcbf1c63f600000000, +103'h185f5b91aec555f59c00000000, +103'h063260c91e9928aa5800000001, +103'h3c5b69cb76f8843c0900000000, +103'h18195fa23c2ae5052600000000, +103'h309671dcf8864ed09e00000000, +103'h38d8da0d509fae72da00000000, +103'h20b46ae80336204fd400000000, +103'h3e887ffeba0efa5d2500000000, +103'h18877a1a9ac365452600000000, +103'h2c0cc307194be543e200000000, +103'h1331ba6672d35f5e7c00000000, +103'h388cd2159ee022659700000000, +103'h1af6e421f111dccc0807b7210f, +103'h19245b736a9eaee1a600000000, +103'h2e9db808c49593039800000000, +103'h36ea73fc9cb9ee770200000000, +103'h1c1752560a57a67fc600000000, +103'h34560d7b81421a7c6400000000, +103'h373377829e596cd26e00000000, +103'h3ea6748d52af7a4df000000000, +103'h22d3600f0ae2f1d08e00000000, +103'h1157f2108889665de06745d954, +103'h011e9e8e6a5cc66ceabdb27daa, +103'h0e3eb7debab4b87d721a582e19, +103'h310e4b7cfcd3570bdc00000000, +103'h1ac0d0ebcb120eea9800060687, +103'h0efcbcb87b205a6794100c1008, +103'h2a956ef216e12b535e00000000, +103'h02e2d9a924dde80bda9a924000, +103'h16039b6c0f7356fdf000000000, +103'h37366c19935630a71400000000, +103'h1089972ea859cc132217e58dc3, +103'h00bded971e90382cb4a712e1e9, +103'h14d02c0b6f19cf5b5e00000000, +103'h3655c17daed7bcf27c00000000, +103'h2c31879702a7e8fdec00000000, +103'h0b6719c37afdaa7b9a00059c67, +103'h072ce41ca72f32129e00000001, +103'h330c7dd130964bd61900000000, +103'h0ec3d47836c32ff2be6182381b, +103'h2d23141d2acfadc3ee00000000, +103'h057ffe3db893823c2400000001, +103'h030c1a70e4b696594e069c3900, +103'h312e827a283694970600000000, +103'h15141a762a42af07ea00000000, +103'h24c960361a7131821200000000, +103'h2a1228322e854bf83c00000000, +103'h16118687924eac2e5600000000, +103'h29477973ff60d4608600000000, +103'h26c01b6854725ae81800000000, +103'h3ca9eedebcb9d45c1700000000, +103'h02190e4d6279efc46ad6200000, +103'h1cd6d9ea6123dea32800000000, +103'h32f579e7e23cecf08b00000000, +103'h1e8674cd7e13c6daea00000000, +103'h06d1440f330940c2ce00000001, +103'h10960315508fb5904c0326c282, +103'h3d7ea0be9660f99f7e00000000, +103'h0aa42b5866f6fcb4ce00a42b58, +103'h16dd7ccd22759d736400000000, +103'h16200f04ad19c8cbcc00000000, +103'h24f256cc84f74598ee00000000, +103'h0b259833db17549d9c00024b30, +103'h164fd64fff09ab6a2000000000, +103'h04efb1df892f439dfa00000000, +103'h20a9563ade7f19edf800000000, +103'h015a402f256ecbcd826485fe53, +103'h3a227ec1041822086100000000, +103'h34f468bd067262378400000000, +103'h36f596570094e0f88a00000000, +103'h1675dddef48949b59000000000, +103'h1c64f1346a7ee00c9000000000, +103'h276c269242f4bdeb8600000000, +103'h36e5be279e59af1ff000000000, +103'h06f436b584c5d5b23200000000, +103'h0c8bf8f8faab93d9d055fdfcfd, +103'h3ea29b49009fca8f5500000000, +103'h30adfb848e2bc3884e00000000, +103'h03130ae00cce5ed15085700600, +103'h163defedbd7c5a55de00000000, +103'h261468d53e8f6535ea00000000, +103'h368aac4c16cd5523a600000000, +103'h152cb34b3ce1bdf8e600000000, +103'h3e9d191bb36c6a44fc00000000, +103'h2489d94206991d903800000000, +103'h0b05fe9e453636abea00000417, +103'h064f791e28c00fedf000000001, +103'h3f7ab196f4c60e8c3500000000, +103'h28125454ba1587aa5c00000000, +103'h194314a2ba9039415000000000, +103'h0caa0b9ca2a28d960c5547cf57, +103'h2ad112847ce5a238c600000000, +103'h3abe27f8888fadd56900000000, +103'h06c0c516f260c059e400000000, +103'h0d539b76af1ee8526eaffdbb77, +103'h3688ff6c74dfad696000000000, +103'h1aa4059b023348e00e00a4059b, +103'h094eb99ef8bc484c84f978e93e, +103'h2a5a2dfcd3604de78600000000, +103'h38848aad1caf07867f00000000, +103'h3c8e94c6c60935835000000000, +103'h02cbe7c07e8dc0306c0fc00000, +103'h00c58306bc1c54f73270ebfef7, +103'h121f6c347ee83cb7b200000000, +103'h3f285ce8c0adbfbe6f00000000, +103'h333a832052cd2bf2ed00000000, +103'h24da698850f588dbac00000000, +103'h1296a4e782300bfbfe00000000, +103'h3e3b1cfe670a75845000000000, +103'h2c8d54d3b8a11a6bd200000000, +103'h2aacb89bf8dc376a3a00000000, +103'h3ac1a53fe4698c3df300000000, +103'h0e069ddfce1644d9ea03026ce5, +103'h09560c040ad7ea19cec0f30ee2, +103'h3b46949418de87f99e00000000, +103'h2713548e613493fda800000000, +103'h3449a0c69b7b2891c000000000, +103'h129631d8c08e7d202000000000, +103'h3abaad04b6d81de6ba00000000, +103'h3abdb02a496e4fbf7d00000000, +103'h1af5474d8528fcc4320000003d, +103'h16a807027ee6acee7a00000000, +103'h12e943d79adbf43bfe00000000, +103'h05029e937083fb3e7e00000001, +103'h3e8a490ec36d3f161800000000, +103'h3f3af04e476fdda98800000000, +103'h3cd2447c44fa26b84b00000000, +103'h14458ce6433517069000000000, +103'h1c3cd08ebe075b82d400000000, +103'h26a1534d534ce8691800000000, +103'h3675b3b56e89b8f7d600000000, +103'h0a443ad5d52b0c452a00000110, +103'h2247d8fccaa0bffa9800000000, +103'h3b52d2a696e4fad06e00000000, +103'h24aab4b9782cd3cd3800000000, +103'h3c8c4fc4327fa673ce00000000, +103'h2a98f714172a5b2d4800000000, +103'h25465e5e94b6aaf17a00000000, +103'h32d8c0797f4fa2059300000000, +103'h3a97f661a29600642700000000, +103'h36d6d2bd966ec0dda400000000, +103'h08400a46d106b73f48a35ebccc, +103'h2e5fecc186dd89fcde00000000, +103'h12cf7141ce1d9443ae00000000, +103'h1ad4f6263d7d8105360000000d, +103'h39493be8504cf2470500000000, +103'h28c438e9ab21e86d4200000000, +103'h1f1cbfe7e56b24559200000000, +103'h2292db29cc2f5d3f3c00000000, +103'h24867770ea4c1d272000000000, +103'h36c705ff0cdef850ec00000000, +103'h35297cfa72656fc1d600000000, +103'h14f7184b692c75c0e400000000, +103'h02f410db9d55f2bb56436e7000, +103'h193d2692f24d0b06be00000000, +103'h3d65349b35411be25c00000000, +103'h12f2b2654d7e42754e00000000, +103'h12aca5f04ae377108200000000, +103'h2ebc8c369cd62975ce00000000, +103'h3c197d83ae82cf661900000000, +103'h3eb78ab31d3f5b9cb600000000, +103'h0cd3da57d858d920646dedbbfe, +103'h26d3a10d171063d38200000000, +103'h1ca9913824e43e2b5a00000000, +103'h010250c94ab7df3872dd1800de, +103'h029a6bf72761707096afdc9800, +103'h1e8b60456763c139e000000000, +103'h108cb8672afe2d3106c7459b12, +103'h27724eb448898d766c00000000, +103'h070fc439d81645dd9600000000, +103'h0d0eaa2ffe889491dec75f5fff, +103'h39715160049858cbb700000000, +103'h10d225c110a702fbb4159162ae, +103'h2ebc87988818545bb800000000, +103'h26bd2f4d98ea7a1cc800000000, +103'h1b466b9488a701b552ffd19ae5, +103'h156800a72e643102ea00000000, +103'h1c3098b588aa9c977200000000, +103'h2e11851f9c129d3ea000000000, +103'h1adceba67b4335f42a00000373, +103'h0c4f53e2a854bb13c62ffdf9f7, +103'h2e25ed21c231a6ba4000000000, +103'h18a722f85080fa9cea00000000, +103'h1f3af60d7ea6e7beac00000000, +103'h2111ff16d64e0ab6fc00000000, +103'h0a3dc333f48900c47a00000000, +103'h369b2e0b549affdb5000000000, +103'h3479937f9ed8c30f4600000000, +103'h2efee0b29673f11a9a00000000, +103'h00d2389c8aed849a3adfde9b62, +103'h062e914af8ec654cd000000001, +103'h2025e9d4b8be9de95a00000000, +103'h1af6056dbeed2f3452003d815b, +103'h2b3a1221611319090c00000000, +103'h046ba36f3a091e76ca00000000, +103'h18899a09e64330982a00000000, +103'h24662e8deaaed4076600000000, +103'h2e2ff24643386e114c00000000, +103'h1a0ccf07a69e9c9f3600000000, +103'h00f2ca3fd6ce8ee57ae0ac92a8, +103'h0d1bf61030db5ded20edfffe98, +103'h02f3f5e7f0ce282cf6c0000000, +103'h3d0463d0fcea1e3d2600000000, +103'h1eb36e593ede14251600000000, +103'h153107c6fce277f61200000000, +103'h3c89ff21da95e64f5300000000, +103'h12b11ea9aec6ee164e00000000, +103'h26c25c6eab50ed382800000000, +103'h38b1ae58be020be1d600000000, +103'h06837838e4c468508200000001, +103'h2eeb28685d7616a94000000000, +103'h0519c6ae22f98ee22400000001, +103'h0699522c10e4b74a8000000001, +103'h061ae98bd4fe7df8a200000001, +103'h2b60e93c1c97d024b200000000, +103'h2a1cff95a2b2b9b08600000000, +103'h0cd2a4d14e13a2eca269d37ef7, +103'h3e6d01577930a2824600000000, +103'h0705dbd6470347539400000000, +103'h28368679c47048ab0c00000000, +103'h2e19eacdca7624815200000000, +103'h0310f20e74acaafb189073a000, +103'h10389bd162c695c8e2b9030440, +103'h23638ce7e6d787d75600000000, +103'h3afec6a9771023a8bb00000000, +103'h1e1024ec5973b090a000000000, +103'h34ce2e2a5572773a1600000000, +103'h2f52cd3132829c266e00000000, +103'h0eaef40f6650ca50c200600021, +103'h251b3e9656a39781f400000000, +103'h14fb39ade5528b915c00000000, +103'h174dabff8b6dca27b200000000, +103'h0d22ba779e6903d596b5ddfbcf, +103'h2848934074b6afd52000000000, +103'h1a12038b40d96a4cbe00000000, +103'h302dff676921fd8d3400000000, +103'h12b7c56b423401187400000000, +103'h10aa8f44b562007fdea447626b, +103'h055408f34619c5eb2000000001, +103'h3ad6ecee96c4552fd500000000, +103'h197bce771c185e231a00000000, +103'h3954b11816ef4b11b300000000, +103'h0e8f9438ef6b1988ce05880467, +103'h28e43d44e6bfcaa0e400000000, +103'h1afd3b80b54f5ed9d2003f4ee0, +103'h292e97df9e339c1eb800000000, +103'h0c4f3f503930d79f6ebfffefbf, +103'h1edb0049a35f6f7f0c00000000, +103'h18268be3eeaeaecf4400000000, +103'h06c176580e89af18e600000000, +103'h128ffceae6b03afcd600000000, +103'h168f5b1d2d71b154e400000000, +103'h3eee28ce7f01ae3fca00000000, +103'h14fba54f1491095cf600000000, +103'h3892d0e8937f322b7400000000, +103'h02da377ee67ad77a88d1bbf730, +103'h38934f6a1f0da8631c00000000, +103'h2c4e159520e7dfe20200000000, +103'h3499e51d197b2f4c2200000000, +103'h1064e6d084c944e142cdd0f7a1, +103'h14aabffe7b6329fe5c00000000, +103'h36fe418f8ac810cee000000000, +103'h3839a3029e72d0cd5b00000000, +103'h14f033c1d571125ce600000000, +103'h377009624eaab55f8400000000, +103'h10530901229ae9215adc0fefe4, +103'h36fe196ed90af283a800000000, +103'h3d1bfaa9ea5dfb84ca00000000, +103'h16aaee41e15c14f3a400000000, +103'h3ee497395d780f9d8e00000000, +103'h08b929523222fddf6e4dea46ae, +103'h2c98adeeb1079518cc00000000, +103'h3ad62e0ffac0be6aff00000000, +103'h2a6fc324e7596c59b000000000, +103'h368167d7632f9a69aa00000000, +103'h34b60a694c9f5d8e9000000000, +103'h24f242140220c565f200000000, +103'h0eef3829b6d6cfcf3e6304049b, +103'h21459a991cc911e34000000000, +103'h12cb97722ab84a0cf800000000, +103'h12f0f1d9cafde4a61400000000, +103'h133711a75ec97c183e00000000, +103'h0b54014430ba6df20a05500510, +103'h1e3a02c442f17f996800000000, +103'h1ed84e514f4580dd9800000000, +103'h28747e846c7f83a1da00000000, +103'h10da2acfca57d1f328412c6e51, +103'h28fa450d32cc50779600000000, +103'h020bdee402a67b476072010000, +103'h2c62f9986aa0c0549400000000, +103'h033997eeaeac9f38965fbab800, +103'h236808381b0f98d10200000000, +103'h3762c8f91d4930bfb000000000, +103'h0e0405017eb138f7ca000000a5, +103'h1146015e771401f0e618ffb6c8, +103'h01349cf4041806f264a651f334, +103'h0b32d15a945e0850da0004cb45, +103'h317a3680d492a544de00000000, +103'h1572d49edec5769f7200000000, +103'h317f74adce3fad204600000000, +103'h0ea41baf22b281bf245000d790, +103'h0226cb015231f66cf252000000, +103'h093c1f9862d6121c16f506c23a, +103'h2f16eacee4fcdd1d6800000000, +103'h20316325ac38fcb5ca00000000, +103'h36fe5d3b9a4fe784ae00000000, +103'h20fd4dbe7c814aaa5c00000000, +103'h2ad2505d727fa7e5f600000000, +103'h1aa43019d27cf5a47200000029, +103'h36af0c8bff4f4601e600000000, +103'h2d09d082d8f3761bb800000000, +103'h20e5df240ea282a7b600000000, +103'h064195ab3aac532a8e00000001, +103'h3e1a41d6da92324e9c00000000, +103'h3642340460d3c7f9d800000000, +103'h055d9c4da0ee09d0b200000001, +103'h231b873e97303dd51400000000, +103'h3a85c55a1a8dda22b400000000, +103'h2c8235c43ca961614a00000000, +103'h00526e28362f26bb6440ca71cd, +103'h3510b05ce4b15c7fa200000000, +103'h3eff3066a403caa7d900000000, +103'h257b8a931a147b04bc00000000, +103'h06a14620d913ab6b6200000001, +103'h1ef62869fc8f35fe7c00000000, +103'h1cfc6732c2307c1f5400000000, +103'h3f0670a36326a4895200000000, +103'h3b24f518be230bbc1400000000, +103'h0f5724f97c297c5f7600922cba, +103'h21188ad8b64e71783400000000, +103'h360a6cd744a59671b000000000, +103'h2d22f35f26be214a6600000000, +103'h235e85a31cc88e21ac00000000, +103'h12c3944688eb8180d200000000, +103'h3a7714622b4a0723ef00000000, +103'h26d02aef7e0d9b6a7600000000, +103'h38e762c73884afcca200000000, +103'h26c728c09f54dabc2000000000, +103'h1c92703ad73c3d835800000000, +103'h3ea7bed8fd036643f600000000, +103'h1ecaa8e19895d67ecc00000000, +103'h377242b6d93d9557c800000000, +103'h2c6eb74836083e396000000000, +103'h38a7695cee7a80f03800000000, +103'h00e381b59ae9383870e65cf705, +103'h22b5708d1490a1955e00000000, +103'h1ac4f4bc5474234af800000006, +103'h0adcb724f62993d80c01b96e49, +103'h296efa7dd2ee88946200000000, +103'h22ea760f1ccb3fb95800000000, +103'h2ef69335c63a3a372a00000000, +103'h1176d3a76924b046482911b090, +103'h2a20a7f1171b437c0e00000000, +103'h14b904cf289217237600000000, +103'h1d1ca16692b2bf148c00000000, +103'h2aba7835266bc3e3b400000000, +103'h217cff4a0488654a4600000000, +103'h2e5ac9daef42dd7f6e00000000, +103'h22caab8f50bfdcc97200000000, +103'h2aed4c583e1aa6a46000000000, +103'h187bb104e0e55233b000000000, +103'h0a927afbcad29e8bee00000092, +103'h2aec2272234e4f90d000000000, +103'h1c05a6b1ece0ca8c9a00000000, +103'h0b39d19618ccecfebe00000001, +103'h1b534eadf4d293b0aafffffd4d, +103'h363f6a51be0c6546c200000000, +103'h3579d5865a5fb3f4b600000000, +103'h1e950b47909f1e467600000000, +103'h237d2e078518f3ccd000000000, +103'h1837e47822adff146000000000, +103'h0eff002f852b2d1be4158005c2, +103'h1f25cfdb9e6311940600000000, +103'h3eebbdce2d6211c38c00000000, +103'h22ca9f8d8c87e19f2a00000000, +103'h2a5780614a739f6d5600000000, +103'h370f8e50ee3e3efae200000000, +103'h212aadd49895bf5c2e00000000, +103'h36a7df1bcea54dad1c00000000, +103'h1aacf2022ecffb81b400000015, +103'h0825a455e577da9d82a93f6433, +103'h24dc95a47f24cc9fb000000000, +103'h1829464f464a70f59400000000, +103'h1a1b44a72b27069a1400036894, +103'h0add3e80c2504ce95a000374fa, +103'h1e1712f7dd6b91908600000000, +103'h3275b40ea648d0114900000000, +103'h0f1ec61b075fe309268f610483, +103'h14eedec178d59717cc00000000, +103'h1c0f445146f45d32d200000000, +103'h029b3b719ae33bf44c676e3340, +103'h117002a338f28045923ec12ed3, +103'h22a4acddfa8dbbb72e00000000, +103'h2eaeee308afdbe5a6600000000, +103'h02ad8cb5eea26b38605af70000, +103'h308f672f9d515968ec00000000, +103'h1663c1eedefee61eda00000000, +103'h36c5d8654e8e4d4e7600000000, +103'h2225ad3624f20f3d5600000000, +103'h3d27ed3f5cb7e7a2a400000000, +103'h347b86b17edd94d8ca00000000, +103'h0ace06427d0582182600000ce0, +103'h2eaed321f08108c9a400000000, +103'h3881af3eba4f0f0c2000000000, +103'h1e0c72fe28fde22e1000000000, +103'h0574cb96627f916cca00000001, +103'h24e2a646c08c046af400000000, +103'h36d189c0c500d0015600000000, +103'h010f7c46eae3764816f9794780, +103'h354b50fb20b50008dc00000000, +103'h0a06b71c20c47c4fc6006b71c2, +103'h234e21a8170fcd4ae600000000, +103'h3e965c35601684670700000000, +103'h04c20d0ac264a60f1c00000000, +103'h2aa2bde900fb02447e00000000, +103'h3047eb1704bd0f4f4000000000, +103'h0efce58fef5fcd38422e628421, +103'h0cc8646fe0a7b84f4677fe37f3, +103'h0cf8895eeea49ddf367e4eefff, +103'h0f23b0927b6d024f1690800109, +103'h160be71547658bae0400000000, +103'h0d53ead056893c407eedff683f, +103'h2343a6daac952355c400000000, +103'h26d800c438e90e261a00000000, +103'h24d95cfcda2cb500c600000000, +103'h294044e38004b5c4fe00000000, +103'h0530690aa4de12c1d800000001, +103'h0ab5b0878c1e57a5580005ad84, +103'h0a24062a904ec0affc00000000, +103'h22bf10ce5d0471378a00000000, +103'h3d5ed137262877621a00000000, +103'h38dca461c8e788307700000000, +103'h0278cf31c44659679ce6388000, +103'h1f63bab1bf22fdc96600000000, +103'h14531769409bccfb2a00000000, +103'h326aeb82deff87ace900000000, +103'h196a47ccf5529f162a00000000, +103'h02affd7ea6bd8a99087febf530, +103'h2d18b0f9be27d265fc00000000, +103'h161d317000d7cfe4a200000000, +103'h1e2139932cf080de6000000000, +103'h1c77e0cc830db24e6200000000, +103'h3e8c129ee22eebe18f00000000, +103'h20c816d73ea6ccae1200000000, +103'h02dbeaf43d32df4cf478000000, +103'h10e03fef9cfaf62432f2a4e5b5, +103'h22f247395ed6e1186e00000000, +103'h17333a64b0b721080c00000000, +103'h081afa3e12a968416a59c93fbc, +103'h393599646adca2a61b00000000, +103'h044b2eaef2f79ce42e00000001, +103'h2e37a511eb2d36489800000000, +103'h0adb3c7cee7864f78a036cf1f3, +103'h39283c295eb00a097700000000, +103'h1151de7be88b468664634bfac2, +103'h1b731db2a0b382afc2dcc76ca8, +103'h10c19331f005612baa5e190323, +103'h36886da8ca787ede4a00000000, +103'h38ff52291c3a12103a00000000, +103'h25017d2fd2c27fb90600000000, +103'h2eb72ae64ac1d1e22200000000, +103'h2a7239c86ec34f11f400000000, +103'h30a5c788de7a79f83e00000000, +103'h1313675988ecb3c0ae00000000, +103'h074386e338927b498c00000000, +103'h0535784f0aa5e2a31400000001, +103'h32eab8ccd0e969864d00000000, +103'h3e1a7342d51ee1d55600000000, +103'h1336e17989099aa22600000000, +103'h1ee5caf9c6240de4fa00000000, +103'h353a971d1a5aef5e8200000000, +103'h1a78ccc6b940ba584a01e3331a, +103'h16d5e445af7b51756400000000, +103'h183c9666c8f41e3c1c00000000, +103'h22c7566cdeca0281ca00000000, +103'h06ad05d1790698e89400000001, +103'h24d36f8e5acdef557200000000, +103'h2f752ac0a27af526ea00000000, +103'h030b042f074e64b5462c10bc18, +103'h366ae01f34c38f75e800000000, +103'h20d154f7f8ce93a4ee00000000, +103'h2705b9262e3973c42200000000, +103'h0eb5127b4e0ac8bc1a00001c05, +103'h3cb2d085b61081e24800000000, +103'h20741e0604c5945d9800000000, +103'h3b03ff2b437864e34e00000000, +103'h04cd5414a2ec82e95200000001, +103'h1ca171ba1cf082149400000000, +103'h2a861141e0bdd6293600000000, +103'h3c3045273d5f47e35500000000, +103'h1252ddefe6e559253400000000, +103'h0961f9a1e5159e4c723a33f6cb, +103'h1d61976876687c3c5800000000, +103'h121f0b583eca75de3c00000000, +103'h053bc72b5c2c0d46b200000001, +103'h1d3ddc23af4b189ef200000000, +103'h1b558f687286dfca4eff558f68, +103'h0cd5bee98ec4bbedfc6adff6ff, +103'h3e206448e91a4b566e00000000, +103'h0c9716eef6f00a3ffc7b8f7fff, +103'h0858e233f5106e88e6a4465d89, +103'h36a18d4342a78577dc00000000, +103'h34aef4408a0067abd000000000, +103'h1ad6a69442a1f4ef120035a9a5, +103'h36ee6327f750e92f9e00000000, +103'h07168e4491278fc3e000000001, +103'h1ae63ed90715f2ebd6000e63ed, +103'h38b657194d2c81306600000000, +103'h18286448a712c0096c00000000, +103'h2eeb5aa79ec91722b800000000, +103'h14d5e0ca76f17b6b6000000000, +103'h00d659d924dcd612fed997f611, +103'h3803541838b2b6dd7700000000, +103'h18430e60b88910b69a00000000, +103'h194bdfcbf28c64ced400000000, +103'h0e462ca28acf732f8c23101144, +103'h281d4f8c221b52fb7e00000000, +103'h3ca7295331617f9e0b00000000, +103'h0aba13d0da7ecf2a2c00000174, +103'h0859631d5725f87d5ebe4db004, +103'h12c8259960e00c4e3800000000, +103'h01523b10ea396f6b8ec5d53e3c, +103'h1e3dd0267d019504f000000000, +103'h16a834663d53d015da00000000, +103'h243891235a91a03c5600000000, +103'h14a8fa2eb139d4a29400000000, +103'h2f52d2a5967265c5ee00000000, +103'h06fe40216b1b5ff4a000000001, +103'h1afd7db31b6e329a360000000f, +103'h088e5b81206c72bba071149d40, +103'h29590df1ba69f06eba00000000, +103'h1e96262842f84befda00000000, +103'h00ee9e536c5159e1949ffc1a80, +103'h3ab54918cae78009d800000000, +103'h16e86699cad61e5d4400000000, +103'h2a857489868b67760e00000000, +103'h031ace691d73ce0fdae691c000, +103'h0601822a46f942996000000001, +103'h16cfb5f54b1411027c00000000, +103'h3074081d9015932cc200000000, +103'h10a3c1bbe6e549220cdf3c4ced, +103'h0c47496a1759513f9eafacbfcf, +103'h0ee413b1a6fd12fb84720958c2, +103'h1c94eefbb3445c659c00000000, +103'h3b5b5d72822870174200000000, +103'h3f07150b5ebd5f12f700000000, +103'h1b0c1de3d918bc8578fffffff8, +103'h1e0e39b7d71fd190d600000000, +103'h1554b1f1732bef74ae00000000, +103'h0cc39a42503a292c847dddb76a, +103'h22efe1a6248edb1df600000000, +103'h1134e58f705275604671381795, +103'h1499bb09924257066a00000000, +103'h0d2a7ff862773c95dabfbffefd, +103'h12f56e13b610f79f6c00000000, +103'h3e4f374d023b7797cf00000000, +103'h18fb75e69730e5ab8600000000, +103'h06ea0b8694801cf88800000000, +103'h144fddbc6c7b92df1e00000000, +103'h1ac6a791b2659e65b200000031, +103'h2578e8fec8b57c222000000000, +103'h025c1017627c23b3d210176200, +103'h36bf542886f50cb29a00000000, +103'h169e2b18cb511cc9fe00000000, +103'h28e2a06ec01070f28400000000, +103'h04dc91e6d6ae9c0b4e00000000, +103'h0252a712be913c7a0ea9c4af80, +103'h06bdc8f1426dce60e400000000, +103'h167a0799c4c07573a400000000, +103'h2546b734cc7e3e64e600000000, +103'h0ac202db22f845feac00000184, +103'h2ece8afb873efd337800000000, +103'h1448e17cd101000e9a00000000, +103'h0083ad71becf8b0a20a99c3def, +103'h393cb7cb95186c86f200000000, +103'h12ee0824149c19f8b000000000, +103'h34de55b00ed8d1c44400000000, +103'h26cfa34aa0c6d9e85a00000000, +103'h16907bef54a52f986800000000, +103'h1c69c11afa74d2e30800000000, +103'h36df203f53054ed25e00000000, +103'h1f2d5127ee6f0fed5800000000, +103'h27425bf8e44e302caa00000000, +103'h04fc9662427b81549800000000, +103'h1e2ba3aea8bddd4d7c00000000, +103'h095fffcd6eba73afbef2c63168, +103'h23036bd98ce6175e6800000000, +103'h1ef508125546172bd600000000, +103'h1e62259fb74983056200000000, +103'h068d207a963e8b17b600000000, +103'h1d728f0534a0b0b76e00000000, +103'h3f3e14ee3b2dd1320500000000, +103'h354fb20316a060373800000000, +103'h22aad21d54de75257200000000, +103'h26447d4f492e27288800000000, +103'h1f7ed938acd8f945dc00000000, +103'h10e70654121d76952464c7df77, +103'h18ef93a6b29c4fcdd000000000, +103'h34d6961ec2835621e400000000, +103'h1aebbfbf5d72e9c896000ebbfb, +103'h2ad9e2a5d0497fe75800000000, +103'h0ee57c216a353fa6b4129e1010, +103'h248d656ad70f224c8600000000, +103'h3eb8a4d624f49e6df000000000, +103'h3356ce0a0a8203d8c700000000, +103'h393e7725493aa8aeec00000000, +103'h2a5b5fe73a9176b8f600000000, +103'h30876af5b4cfedde3e00000000, +103'h1ca814721e2b4dc57800000000, +103'h124ac1c74eb2b8bb2c00000000, +103'h112817cb6c5acd2d4a66a54f11, +103'h0a96e4887ea58ef49a00025b92, +103'h36d59f23d0cda6c00600000000, +103'h033fa7849a648b48847f4f0934, +103'h1c5c68a0903a2a6c5400000000, +103'h22d3f6e9d279d1f0ee00000000, +103'h26f11427aed63a918000000000, +103'h3cdbd82590aa317b5200000000, +103'h2b2b276bf89b45a30200000000, +103'h2ab4a11eb4771dc89200000000, +103'h3eb7ecc25ea245348b00000000, +103'h009172f78a56e6533e742ca564, +103'h13152aa8090ed3159e00000000, +103'h1f3427fb88a0460d2800000000, +103'h1cca43179ab570b53000000000, +103'h3a02a36838e998b0b800000000, +103'h2291ea0c16b3dbc85200000000, +103'h123003c590b67f308c00000000, +103'h0b6e638c3548693ca200005b98, +103'h1e62340806786d023200000000, +103'h2b3f9d3492e6d08e6600000000, +103'h0cd0e229714904966eecf35fbf, +103'h3f18a64eda88a1cb0100000000, +103'h26a8d3b0e75983f47000000000, +103'h14b16e1525722a434a00000000, +103'h14a0d907cb1afdf43000000000, +103'h04d94890decc6c095400000000, +103'h0e9a59e4f36d45112004208010, +103'h3eb4ef2d76468da1ff00000000, +103'h1241aeb944e0e786f200000000, +103'h32e96c394295d6b46900000000, +103'h335d95c296d7856daf00000000, +103'h243f045d08c0f1a6f000000000, +103'h0c6700997a1e8769863fc3fcff, +103'h3a6fe45cdf5d8bc69100000000, +103'h2d0e9ed4acc48c600a00000000, +103'h3284deba273470bceb00000000, +103'h02bc104693430f9196411a4800, +103'h0f11c93c86c7ee4bbc00e40442, +103'h38c50df90883fe925000000000, +103'h0e3cdf159695c7ced60a63824b, +103'h0ae920ef0e5ad5c7de0000e920, +103'h1ad8725a1c97b4dd760000000d, +103'h308fb210e880d5cc8400000000, +103'h10caf05a03594826a2b8d419b0, +103'h069bf671f4e8fa378a00000001, +103'h0ac7d251c4b3ea918c018fa4a3, +103'h2c8b630f0a4fe1038000000000, +103'h36cfc998d417b3554400000000, +103'h056d784942a316644e00000001, +103'h04f421313972dffd2400000000, +103'h0a2eb4aabce0584666000002eb, +103'h18b92927c2d479779e00000000, +103'h3d5b50fa0d032e225c00000000, +103'h22a08f30a4bc574a1e00000000, +103'h0358ad646317a8442a46200000, +103'h1ef123de84b83774ce00000000, +103'h3c5e13d04610e4d93000000000, +103'h26ce31e4650208b7b600000000, +103'h34faa742a0601c87fc00000000, +103'h263ec4e5072e4e6c6200000000, +103'h1d3b19fc3c28f5af0200000000, +103'h194853eca367ba940a00000000, +103'h3b579694bea2d4904600000000, +103'h3ec6f5c4d6eb287ce800000000, +103'h0964a3615342bf11a6130e387a, +103'h0f2b46acd009b4d67c04824228, +103'h3759a48c586e5837ce00000000, +103'h1d2ad6fc26999ee49e00000000, +103'h18e731e8dcf34370f600000000, +103'h28e64be7381e1a6d1c00000000, +103'h06ef1abc10054c55f800000000, +103'h3e6641c8b8eb983d3000000000, +103'h1b7707ba00dab2f942ddc1ee80, +103'h157b111c3e40f4c1fa00000000, +103'h049d34eb98b7fc7bfa00000001, +103'h06c4a510ec330d983800000000, +103'h02d7ad7372d04283d2ad737200, +103'h3cc568cf3894e794be00000000, +103'h36f418ecfa6c95083000000000, +103'h08dac586b931fdd76af59c28e9, +103'h06f47fb8ae2616c46400000000, +103'h38de7c6e7600dc4b1c00000000, +103'h225d60b8fcf55c03ca00000000, +103'h0648da0bb4d3d8724000000001, +103'h24665135d731392b3e00000000, +103'h2ea9df245e7a1336f200000000, +103'h30ee495e02e0646cca00000000, +103'h2e280f9b708a43912800000000, +103'h2035ae4b21788cef2a00000000, +103'h2a7486260ea09c8a9a00000000, +103'h132d7137f0d64ad5bc00000000, +103'h3cc6c0b69a4ad0fbca00000000, +103'h18ea53c66e784233ba00000000, +103'h148673c56b3f02ea5600000000, +103'h1ec3304f032956b0c400000000, +103'h1ad637ae56afca762e000000d6, +103'h313410097772fac53200000000, +103'h350a2a98504932738800000000, +103'h231f4811807d427cfe00000000, +103'h155dbc3b74876d154e00000000, +103'h1e4bfadb96a6b526ce00000000, +103'h1cad3440ec0471624200000000, +103'h2d57a019cb506c3dda00000000, +103'h3a7f4e6fa6fda07ec600000000, +103'h3e2e69dad35540989000000000, +103'h18843a6cced48f083600000000, +103'h1ede7c610d02f8e30a00000000, +103'h2e892a932487334fd800000000, +103'h253179440365afb0e400000000, +103'h2f2f088d70eeda440800000000, +103'h060126df152053880a00000001, +103'h2ad63e13c54f5c157a00000000, +103'h323288984a5082f48f00000000, +103'h3cf482cdb626c1085200000000, +103'h36a55747295949a09e00000000, +103'h07767f48a74dcc6e5400000000, +103'h1897035f9cf323b57c00000000, +103'h36080a6b2269a2fe2200000000, +103'h0a9fd27efd00a65dc04fe93f7e, +103'h0890e4337208b0c8e24c2a7dc8, +103'h2acfc2563ea88347de00000000, +103'h2b01c42e8739677b5200000000, +103'h0e9d6904f10929d19004948048, +103'h2d39b4391d0aee001600000000, +103'h3edeb0362aa857050700000000, +103'h0e2c2f7b16e20b3e2210059d01, +103'h24b3163b56c0bb744c00000000, +103'h2c4326cd24eceaef6400000000, +103'h0ede255f0aa0012aba40008505, +103'h1d217af5f6e327f7de00000000, +103'h0046dbcb04c14d56e8841490f6, +103'h3a2cf81460e2c84cde00000000, +103'h18ffff4d2129a417e400000000, +103'h027307b09a569c2c44e60f6134, +103'h20c9380bf5569b796600000000, +103'h04e0b5be36c9a32a0000000000, +103'h0adafbbd5692db35f40000001b, +103'h30fee5d45c7390f42a00000000, +103'h31796c17a74e8cb18200000000, +103'h274a8dd4574d7285de00000000, +103'h10e552bb06c6de9d840f3a0ec1, +103'h1212f2d7ad116c71da00000000, +103'h30b423e87ef6bf2ce000000000, +103'h34a3e1aad109b2048e00000000, +103'h0ee111f302bdd5ed0c5088f080, +103'h30e520d8b661b797dc00000000, +103'h3efa9c304642c98adf00000000, +103'h0b06d6b4b727ea639600106d6b, +103'h271cc33db5228693dc00000000, +103'h06f085b3bf295d489200000001, +103'h1c25ffc1a54620864600000000, +103'h389e435a6b36a63a0400000000, +103'h0a3e7156c65ca5fba8000001f3, +103'h100125e6fefae95614831e4875, +103'h14ed37bfc8395aacda00000000, +103'h3c1f6a1ed93a8093db00000000, +103'h108842b7ec27b853a230453225, +103'h2d4dc14cab4722727c00000000, +103'h060e29377acf652a6800000001, +103'h2807ebcf261d26771200000000, +103'h243c2efaad2b4fae8e00000000, +103'h0e982a79d6333b7db408153cca, +103'h203b486b7b6f6a786200000000, +103'h2eadcb87890794f23800000000, +103'h253d751aaa42dd5db200000000, +103'h06f86e5c58f0a8e53c00000000, +103'h3ee6a31bbd2e1dffe600000000, +103'h3044425382268c5c3e00000000, +103'h2ca9767d810d2f77fc00000000, +103'h13518805325171cb7e00000000, +103'h12ea42721efae8490000000000, +103'h0eb11adef34c704e3200082719, +103'h0c9e7fa80436b2c0505f7ff42a, +103'h0c9913e912e7cd9f427fefffa9, +103'h3ee519f59e864d474700000000, +103'h112c084b2c1f61305886538d6a, +103'h12bf66eeeb047b25f800000000, +103'h1a897852fb308371240000112f, +103'h333b57564eefea600f00000000, +103'h2b7383a0e97962b30a00000000, +103'h0ecb111bdab4ba0958400804ac, +103'h1f2719bcc7283daa4000000000, +103'h28b3a5ced4f34ec61a00000000, +103'h00301c40f21a6882e0254261e9, +103'h0025f5661ace0e51b67a01dbe8, +103'h1ad088949afe2a92a800000684, +103'h3ca3596d5b241ff8c500000000, +103'h3369790c36f4a88d5f00000000, +103'h1b4a012df29801fabafffffffd, +103'h1ef897a165017b06f000000000, +103'h3ea558a77f4b7c34e200000000, +103'h397639a65f4413d64600000000, +103'h293bc3329ce96c7dc400000000, +103'h0a994eb9945fa6242200002653, +103'h10f855477c9b6956be2e75f85f, +103'h14a2d80a4634b8105200000000, +103'h38916ea3562d0d57ce00000000, +103'h366971ba2acfe5621400000000, +103'h0aa11af5226154056a00000284, +103'h19742d86dacac5bf9600000000, +103'h2f7bf828e46be0b4b800000000, +103'h18b0d022bce00e3b9200000000, +103'h2eb58d7eaa5c06647600000000, +103'h291b9ee0050cd6873400000000, +103'h3a4c7600f2c26405de00000000, +103'h32e92dd69ade02e5e300000000, +103'h2765f3e7d72a78e6d600000000, +103'h053ec05d8813a6bd7000000001, +103'h2924635a6e799aa54600000000, +103'h3ecc6a5d32b85b02cf00000000, +103'h2e527445dadcbe5d3c00000000, +103'h3602f71558a928ba7000000000, +103'h04c720a248fb9d004a00000001, +103'h0304e4d47efe9415a4a8fc0000, +103'h32fb040982c5b4b7ed00000000, +103'h3ccde19bc4ca998c6a00000000, +103'h2049e7e876c59d95ec00000000, +103'h0cc18b3574937f31b269ff9afb, +103'h3637c29814dd671a2800000000, +103'h2573aeb2a29ef24f9c00000000, +103'h167a345998d6b4e7b200000000, +103'h3e4657967d4a639a5400000000, +103'h1ca5fa0512c497f3ec00000000, +103'h0ee3038dd30aef8a6a0101c421, +103'h22beff662eb0e98f7c00000000, +103'h0f71b0263c93ed1d4e08d00206, +103'h396ec4809e52ec837d00000000, +103'h363070ceecc49ca9b800000000, +103'h04fd0ca7a633612a5600000000, +103'h037a920fdd63d1f944f5241fb8, +103'h3a8c04956160dea0eb00000000, +103'h12f0639e62db70b0c600000000, +103'h17195f511e6775462600000000, +103'h0175bc2e3157d8e48a66ca895d, +103'h0735eb0487713835a800000001, +103'h2d56f87bc6e6f463d800000000, +103'h375376a3cd1cdf685e00000000, +103'h1eb76a11f973d7e42400000000, +103'h37733664b0c74e87f000000000, +103'h14a03aed0e7eb899e800000000, +103'h38b433d946f1eefe9900000000, +103'h28e50c2dda9229eba800000000, +103'h1289bc6695465dc4ee00000000, +103'h2af5bb273c2b69f2c800000000, +103'h12e07281ceb526595c00000000, +103'h00bd18dafaaae1809ab3fd2dca, +103'h0a2be91fcc8b5402680000015f, +103'h26e117298e486cdd6200000000, +103'h00c1af26197455fd301b0291a4, +103'h2a576d7bff556d26be00000000, +103'h0c980d5281171c4cd6cf8eaf6b, +103'h3d64012b6a6e89c8d400000000, +103'h3a7861e1b606971b5500000000, +103'h11011895346a9846be4b40273b, +103'h26df3c6f6ee2fa287600000000, +103'h3ad47c9680e412bdaa00000000, +103'h3b38468666c34f2d1800000000, +103'h30a2a791a097cbc39800000000, +103'h1a77a0e39ad01249fe00000000, +103'h322f945e0b72b9dba100000000, +103'h0ccb9a9624ea5abf3a75ed5f9f, +103'h0b2aeffb5919ef1d4612aeffb5, +103'h2b22112424e589b36a00000000, +103'h26e94496ee1079aec200000000, +103'h2d2331e55a328ad2e600000000, +103'h174779f3011bcf69d600000000, +103'h1a85b11ded3f014f3000000042, +103'h00a971fc42867b423097f69f39, +103'h16ddac895d0c2c601c00000000, +103'h074471e95eb59e5c5e00000000, +103'h36c706b334934ae5bc00000000, +103'h12889ccc3cd7bccf1a00000000, +103'h32d0ae27729ec3824f00000000, +103'h2f24ebe2c627604e8a00000000, +103'h092ec7fa78f80e75feeb64c7c3, +103'h16cbeef7e71cfa58c400000000, +103'h2340d2c46f4bc2533c00000000, +103'h20547a134517b14b2200000000, +103'h248f81b0a758840f9000000000, +103'h20c297c406acfe22d400000000, +103'h0212a8302b3c7fd37c40000000, +103'h12ae7aef8aff17978200000000, +103'h2661fefa0d11bfc7ae00000000, +103'h226e07141ec03ab73800000000, +103'h27270d51072239b14600000000, +103'h141c9361689040c56400000000, +103'h0c1131094eb74e166a5bbf8fb7, +103'h12178e78e2d3e177d400000000, +103'h38de269fb0e512812300000000, +103'h22c6f877c2fca0fa0600000000, +103'h36400b153adac799b600000000, +103'h1b706bc91ea1c01178fffffffb, +103'h2074adf4d4e1cb26b400000000, +103'h165e02a1af5236efd200000000, +103'h0e43f8488ec6e4e4a621702043, +103'h0204b5892524e78656d6249000, +103'h156732db3468dfcee400000000, +103'h3cab7b53f76d95580b00000000, +103'h1341fabc8cd4c8333e00000000, +103'h369f5f09c88043873400000000, +103'h0121aadd5ac23e43c0f1f4908d, +103'h3e0cd67fd0619d4d8800000000, +103'h3565977a5283482ae200000000, +103'h349320a810901eaab400000000, +103'h3e40ed5d04f5b6250600000000, +103'h20b0f855ba88d6cd1600000000, +103'h1482a09bf8c9c42a1c00000000, +103'h1ad7910d197abc7fd6000d7910, +103'h32bca028eefd5d1bcf00000000, +103'h0e976569c8d4ee28e64a321460, +103'h24fb0177ba918e51d400000000, +103'h322861afc928f3bb9f00000000, +103'h18d07e67ac23f5335800000000, +103'h2e75f83b5f4c56e32200000000, +103'h0cf06037f81cd54ace7e7abfff, +103'h24fc56866692cd862e00000000, +103'h0731409072832dbe2600000000, +103'h168a1fcdd77f84448c00000000, +103'h052f55ee5eb0c4d4fe00000001, +103'h2af16159b43ae4a2d400000000, +103'h37463a4b386a3a913200000000, +103'h351e40fae25b9beae600000000, +103'h0975cbef18a1d6361eea0eec83, +103'h3d7e1bb84cc017310000000000, +103'h22c150245435e3201800000000, +103'h026ebf2190b3fed86443200000, +103'h0377ca09b5754efcba40000000, +103'h1d22ab27f6e40e1e4a00000000, +103'h008da377385bd827fe74bdcf9b, +103'h3a2e7ee6947e834ff400000000, +103'h0683592e570c26c72e00000001, +103'h044d8272d03aa5adc200000000, +103'h3afbb9d596bdfedc1900000000, +103'h2905c9605d0b814eea00000000, +103'h2a8e5c3b16073b248000000000, +103'h052315dcfe0d0484dc00000001, +103'h2ef2752ca89b60bff200000000, +103'h2e7fd3586cbe769cf000000000, +103'h0c18b2d31ab0ebc99a5c7dedcd, +103'h3eb8cd724a30bf220700000000, +103'h3165ec96574971f52200000000, +103'h0aae6c7a55023f676c0000015c, +103'h10b562fb45682bfdc2a69b7ec1, +103'h326d4545ce1698781700000000, +103'h1f55e6b260cbfb735c00000000, +103'h2087fa14123940b92a00000000, +103'h38bc4cdd328f276b8a00000000, +103'h1458cba41317217f9e00000000, +103'h3e0be2e30ad36e5cd000000000, +103'h0a8af5955e2c3a00e2000022bd, +103'h29434900df381ce3ee00000000, +103'h388ac3d7e8c312794d00000000, +103'h1ae9602e90065b7a2a000003a5, +103'h091b6ae208911f5212c53ad80d, +103'h1679af96627a7f80a200000000, +103'h0110112eac95ea62aad2fdc8ab, +103'h15698540430f99f90e00000000, +103'h36c954cc031fab27ba00000000, +103'h22ba43a9d6893067fc00000000, +103'h3125b2084e528533fe00000000, +103'h2b270ac9710cc8ddd600000000, +103'h2737fd83a1327ae62400000000, +103'h25689b658b5985af9400000000, +103'h3b2269af709183333400000000, +103'h1e2ebd2d54fa1e98be00000000, +103'h3347d989111c88482f00000000, +103'h269370caee4b45758200000000, +103'h25388dbc62931efe9200000000, +103'h126f2de109268fc98200000000, +103'h169fec9e6f5f1d85e400000000, +103'h28ed33a400ce4b66ec00000000, +103'h2a85c01f166e38055a00000000, +103'h0eb16b98c15b6ba95c08b5c420, +103'h3c03a6dbeae12bc87300000000, +103'h16b4ffa4fa9297613200000000, +103'h3334a3d4f6963e3d1f00000000, +103'h2622800a4d4b3de21800000000, +103'h196bc7e9017fe1b70e00000000, +103'h36963b9026a261c15a00000000, +103'h0e5346987e0e29aa5a0100442d, +103'h1ca68fddf6a4653a8000000000, +103'h3845170584f7abd30100000000, +103'h13637fe4229e3bb0f600000000, +103'h15244a841ae352b67a00000000, +103'h14f33ece6c46d29a9c00000000, +103'h0a669853406b1d1eb600000006, +103'h04d19dab155e5bed2400000000, +103'h22dadeb3dec4f4406400000000, +103'h18c77273249691eb7a00000000, +103'h3cfad8cd0671709f5800000000, +103'h22995c459e38e3127c00000000, +103'h1c963bab5c33bbdf8200000000, +103'h35580f517ecd18252200000000, +103'h32b074e31b6353d07f00000000, +103'h347a4b140ebb6321fc00000000, +103'h167d0457816bd8051600000000, +103'h14b3797a76e623192400000000, +103'h10b706c28d632770a6a9efa8f3, +103'h271de7db2316a0eb1c00000000, +103'h0c402c15b2cda7ada866d7dedd, +103'h32ce48555aeb8f88cb00000000, +103'h0f4287ae272bbb9e7e8141c713, +103'h3719ee7798fa03f3d800000000, +103'h0307f62c273c8ba1fe80000000, +103'h00c3a58e5d567a19960d0fd3f9, +103'h186ae4795f5e7045bc00000000, +103'h163ddf02de2215d41800000000, +103'h2c0add80368cfa4d7800000000, +103'h2814679f8ccad9505600000000, +103'h00746bd878d5b6d08ea5115483, +103'h3832e05720ea1e701b00000000, +103'h11136aa9e35e8a4894da7030a7, +103'h1e80ef4a1a916a9fb400000000, +103'h38b94d3aaaa4d5499600000000, +103'h0cc761fbc925c493b2f3f2fdfd, +103'h02bf952d02df11ce5ca5a04000, +103'h181652a6cea673ca2600000000, +103'h0afe7ac0516608f728000007f3, +103'h288b78236a7c5b9df600000000, +103'h0e3e3a1a357ad65e481d090d00, +103'h36d00ddf5d064e81b200000000, +103'h2c08556eaa44889be600000000, +103'h34a6a5f52114967b4400000000, +103'h26c152198e1cebe9ee00000000, +103'h0e56d49c42c391df1021484e00, +103'h12f2a5a0aa84e3f89e00000000, +103'h00d2ff40f8dbb894e0d75beaec, +103'h10c7ef5c8ace5e358afcc89380, +103'h2ed9cb620aa15d768200000000, +103'h10af39469c694cd30c22f639c8, +103'h1a098b23cb4318351800004c59, +103'h1e3f9595daf2517bb400000000, +103'h2b43fe3d76fbdc9f7e00000000, +103'h02e9c45b953b72355a45b94000, +103'h36f8d74cbf7f7072d000000000, +103'h374b0273036934ce6400000000, +103'h108f7f14f8620c1b2216b97ceb, +103'h20cfd8566ead0e8e2400000000, +103'h044ba3cd3f3c8da31e00000000, +103'h2646dfb6de0c65f98c00000000, +103'h0cab506ee35809c6ccfdacf777, +103'h2b71cd420a9ee97daa00000000, +103'h36e558a3574a39ec8e00000000, +103'h029571a7c0bc072e988d3e0000, +103'h2e51f0a5b6a15fd1ee00000000, +103'h3d66796a7b36d179ae00000000, +103'h1519ebace888c21f6400000000, +103'h031797dbe4ef3b89def6f90000, +103'h30d14b3978092736c600000000, +103'h152c5e68fa20bf12aa00000000, +103'h34be43122af20a4c2200000000, +103'h3ad8e9dabe1e68b51d00000000, +103'h26e2cc2d32dcabc74600000000, +103'h08f5d5b66eb595a20620200a34, +103'h27299e52549861cf3800000000, +103'h2c4f713a5c8e3785a600000000, +103'h3293acd782b7d5d7fb00000000, +103'h2cb4943bf10747125800000000, +103'h128b1142629af3e9da00000000, +103'h0ef9f0180e4f8825ca24c00005, +103'h26f7067362da99682e00000000, +103'h00abf2a6b0d489803cc03e1376, +103'h0d6825ec56cb8ff39ef5d7ffef, +103'h3abf4d1bd677829a4f00000000, +103'h3665fc7122dfa886a400000000, +103'h16e7452e9c9ef5a27c00000000, +103'h253d176c5404f2139e00000000, +103'h0b5e799daaec37423c00000002, +103'h06f75e694f294eae9000000001, +103'h246febbb9887c84c3a00000000, +103'h20876eb05e7f26b58800000000, +103'h30a3e3b8c4ef12712200000000, +103'h2aac9003647681218000000000, +103'h34de8afc961a64da4400000000, +103'h16984e4200c6f4ddaa00000000, +103'h16d1383cf4a57fda4000000000, +103'h1cf934a90a3dce1c4000000000, +103'h0697b236a30f06593600000001, +103'h0750949e7e083b024000000000, +103'h06d06be4049fed38e200000000, +103'h3cf5c303caf081d76000000000, +103'h3e58e83fd0c0edbb6400000000, +103'h20cb13d50eb6b0bf2e00000000, +103'h03457a6c8d0f98ff00a2bd3646, +103'h265fce3cecdaacd40e00000000, +103'h166aa3e4af2027409a00000000, +103'h17366747d67ff57d8600000000, +103'h24b8db6a2cea99623600000000, +103'h3f4ae88b832100aa0d00000000, +103'h04b7a280e6d9dc143800000001, +103'h3b4483b6e524c49fbb00000000, +103'h06515a6a68dc6720a000000001, +103'h3f48ca802520ead78500000000, +103'h38613b3fea724541ed00000000, +103'h19538813eabb0fc21000000000, +103'h1c6a9987a31c4b01fc00000000, +103'h0b5e121bfd6fd315e6000015e1, +103'h1a727587d8da6c9d880393ac3e, +103'h16f91e35a2387eb98400000000, +103'h3d3ad6a57eaaf4415e00000000, +103'h0698da1754a412770000000001, +103'h0b66b09f12dee91c7e00000001, +103'h290ef3c45977c333d400000000, +103'h2aefb5a322de73d2e600000000, +103'h297b6bc34ced67973e00000000, +103'h3cab345a76dd1d3a6100000000, +103'h22b9e60e1e5888fdac00000000, +103'h21405af59c03bd582200000000, +103'h02a543affebda36642a543affe, +103'h2ef79401a0fdfe5bde00000000, +103'h1327018da2a3420bdc00000000, +103'h14aef817509ad60d7c00000000, +103'h323aabf922c1d79b1f00000000, +103'h0e8403413770cfb27000018018, +103'h0ccb58e528ab7bab9275bdf7dd, +103'h2ab5f094f92f7eecca00000000, +103'h1b3b5e5244fad7d1f2ffffffce, +103'h2e82a3aaaeb0c866ea00000000, +103'h393ab8b58aec26b92f00000000, +103'h2a9e496bf96eca63de00000000, +103'h1731590f30a983196800000000, +103'h04bf40845b47cc856000000000, +103'h22fdf060717925949000000000, +103'h0b28c6f5b6386618ea000004a3, +103'h2ac267eed93656795c00000000, +103'h3b058c01655f1d6f1200000000, +103'h26907c994e21855dea00000000, +103'h029492c5ca27115f4e24b17280, +103'h14d10f0b30b78df89e00000000, +103'h3f43e1c9f34c20be6800000000, +103'h0f15d1f7c71d2fc9988a80e0c0, +103'h2c094783856111938a00000000, +103'h1423ce6e9376e38b5000000000, +103'h2cf5e3523e802b0ed400000000, +103'h361418f452a3f97d6800000000, +103'h064f7e5ffe99dccfa600000001, +103'h1aebf55f34adf5c3fa00000003, +103'h02ff4fe9bafd7423f8d0000000, +103'h2a92d58316e969832e00000000, +103'h24ca5499d8e8b96ce800000000, +103'h1c9bb080427b8eeffe00000000, +103'h0a1b022aa745e389d80000d811, +103'h3497c7f904e1940a1a00000000, +103'h32fdf74a8efc9634c300000000, +103'h0a4ce00902945e2dc604ce0090, +103'h271757b7769255785400000000, +103'h2827b2efc0df35815800000000, +103'h2e19a23226f68d38ce00000000, +103'h020827a94e1e40288e09ea5380, +103'h1a8b0b4e3d37e25ab600000008, +103'h28a0446b80400a040400000000, +103'h3894b30a1acb15524300000000, +103'h2f7faee1856b59bdc200000000, +103'h3288eae17c000cc7dd00000000, +103'h34ca093c2a7fbba96000000000, +103'h364b319adc08a68adc00000000, +103'h14976f4bd2d2afc70600000000, +103'h344f06ba891de161e400000000, +103'h1206aaf11cb550adb600000000, +103'h193e0ad1120457683e00000000, +103'h3d7e113be50b02595c00000000, +103'h3290c76dbd490d2a6f00000000, +103'h32c15f017ac71e665300000000, +103'h0ea74742ec57e5d40e03a2a006, +103'h3c9186ec9e1944d58800000000, +103'h0e86c8efacc08c187640440412, +103'h1cc5181d285213051400000000, +103'h26ca85b0f6d8dbf4c200000000, +103'h1d27d918d49df411ea00000000, +103'h309e71563b6879c2e200000000, +103'h32d595ac169052dbb700000000, +103'h1e5ecd07072ec431f000000000, +103'h00c0e056bb0459de06e29d1a60, +103'h36c0e7b8586326e50c00000000, +103'h272968dcd824073bc600000000, +103'h2d223cdd0ee4eef41e00000000, +103'h3949d50f340e57d0f700000000, +103'h0175c71f603094ae04d32de6b2, +103'h1e04e014987a69bd3800000000, +103'h16b8004598f030dc9800000000, +103'h1b500f6ab8f510f132ffffffd4, +103'h14f67660cead1136ca00000000, +103'h2ccd7204e8fd20a18200000000, +103'h1e1ed7663cf397025000000000, +103'h2b606da42ac109073a00000000, +103'h2c9714d348dfe06d7600000000, +103'h3e7acd3932404e11a100000000, +103'h395ba640a0d762e4eb00000000, +103'h2f30164a5e52301e1c00000000, +103'h10c58f5b56add65ebc0bdc7e4d, +103'h3a3ae8d9c4ddeca91a00000000, +103'h16f09069d4a37c047000000000, +103'h147d9adecede64de3600000000, +103'h2f5cd571e6cef5480a00000000, +103'h20e9e663bb4c9026da00000000, +103'h1654e3fea8a96598c000000000, +103'h20635d9e08934bfc7a00000000, +103'h3a503c1b9ee82ffb2200000000, +103'h3b0c0fe1414b8d992c00000000, +103'h341473cdba9bc9b4ca00000000, +103'h18c63d52f6a7d9960a00000000, +103'h040b52d4aabc4d63c600000001, +103'h0e38985182828ab6bc00440840, +103'h1ab16b67868ddd8b6600000b16, +103'h20c6083256c675dcea00000000, +103'h1c827e933077e1447000000000, +103'h02fb4257d03de976c6ed095f40, +103'h2cf690d32cc06809f600000000, +103'h1e7fbcd9eebbaa61c600000000, +103'h24cf5ebd9cb23b34f200000000, +103'h1c96e1e5bb31f80ee200000000, +103'h229c4e849f0156cc7e00000000, +103'h1662232d7a9838b23800000000, +103'h38e3a2381e348736d600000000, +103'h37175c77b496aa645200000000, +103'h2f7d0ec62d7a4c9c7000000000, +103'h04e417e12291a9142400000000, +103'h16e359ae510eb7da5000000000, +103'h061722b254f2cfbb7200000001, +103'h2ae1961aacd62969c200000000, +103'h3a26561f72ed4c1c1600000000, +103'h2cfcbf385ecee236c200000000, +103'h2ee1e02b98f538563600000000, +103'h06b9d0da46f1f78e9400000001, +103'h0867eaf2b4d3d7ba2c5a1ea44c, +103'h3e0351273a8da8947200000000, +103'h136d999284f593872800000000, +103'h00cd1a5402f8e4ae62e2ff8132, +103'h331e92a416667e40e700000000, +103'h1b43e2ae57339894eafffffd0f, +103'h3ef6db4d09522b390000000000, +103'h249f6772e4960de75600000000, +103'h0f40d847228ce9345e00640201, +103'h0e48c75c462c50a74204200221, +103'h24844f06566d28ee6400000000, +103'h041201e964b5f04aac00000001, +103'h0735c2b3cb3a3f510200000001, +103'h2ce66cb28e4c413a6600000000, +103'h18c36758948203ee3000000000, +103'h1a0d8aed006870a0be00000000, +103'h000d9ecc192bd7f9549cbb62b6, +103'h3247f1fc323962e65500000000, +103'h30ce8666b54701b26e00000000, +103'h04d71ebf668ef3aea000000000, +103'h1a4827b8d65d7a1554000904f7, +103'h08e508ab9c3498d4ba68c83f93, +103'h28bb4c84b77cc08d9200000000, +103'h3ed892103f61c9392e00000000, +103'h3884cb4a671d15bde400000000, +103'h0a8e7e99e4f5a7ce220000239f, +103'h38cccabe1e7a73188800000000, +103'h1c87d76fe908f1b26e00000000, +103'h3ea4ad5ae2d5bc708c00000000, +103'h08de9903be5d93e074418571e5, +103'h370e2c7abe02413b5600000000, +103'h02b8330a46e0da3f16cc291800, +103'h376b2b4c3cef06b9d400000000, +103'h0ef3dffebea739c41a518ce20d, +103'h24da2891b51265105600000000, +103'h38c2b2600306450f1400000000, +103'h128c166d66e06da0c800000000, +103'h284481349ea32000cc00000000, +103'h3ca425bff02f366e3200000000, +103'h04162f5b9973b7a2d200000000, +103'h108e7e065417dd62c23b5051c9, +103'h04e73a51db2e0cbe5c00000000, +103'h16e3169e2abc8ac4b000000000, +103'h180e2958aea3c5168a00000000, +103'h34acf3b60486dbb4b600000000, +103'h27639b761e95050d6400000000, +103'h30484ff49341f8c36a00000000, +103'h26e98f37b8a594398800000000, +103'h0d2e93916aede42e1af7fbdfbd, +103'h36fa739fd0d77365d400000000, +103'h3e5b58bb9d0606f73e00000000, +103'h18fe369ad2007a970e00000000, +103'h2c46a8b3915bd352ac00000000, +103'h2b7cfefa6a5a09ed7e00000000, +103'h3a8ac8a716a0b2a11000000000, +103'h269e994b031db19b7a00000000, +103'h24b2e485fca87a429000000000, +103'h35230313a247138d9200000000, +103'h2eed2b8ec6f9f8138e00000000, +103'h015806aafc1cfb2730ba80e916, +103'h12e09362ab0a26b5f800000000, +103'h22119a5ceb622d60f400000000, +103'h1289b4e4be42c0c39e00000000, +103'h0afbc78021545b208a03ef1e00, +103'h3e8ad542b2de10054800000000, +103'h1f2409bb3ed9d7856800000000, +103'h281f6b94bc64acc81a00000000, +103'h305d8e31da88b6835800000000, +103'h18f00bef82a822181600000000, +103'h326099b27205b049f100000000, +103'h0caafefacaf5bc39747fff7dff, +103'h235a110b3e5655ebe600000000, +103'h1291d99f0b0154e6b200000000, +103'h0771c44aed5b65f1f000000000, +103'h2e575f40beed3f90fa00000000, +103'h2132b670075f03dbe600000000, +103'h1164638b34b6631ca457003748, +103'h0a97658d14e9198caa0000025d, +103'h3125cd80e44d7d17de00000000, +103'h14a17505aee4e2a4f200000000, +103'h017c20665e0ab025d6c368461a, +103'h1e0d2ee3b2ac252b8400000000, +103'h128756edb2284591e200000000, +103'h294efc0f933574759600000000, +103'h2efb83d664bccb634800000000, +103'h10b2bbc30c0bc772da537a2819, +103'h261618db3a074b493e00000000, +103'h30a1bb854cba070c4c00000000, +103'h0a62d2a4f2d01fe786062d2a4f, +103'h0ae0b527e271db6cd200382d49, +103'h176a5f1daed4ae11c600000000, +103'h1cfb545cb8b56339a800000000, +103'h314650a80e1fc2575600000000, +103'h36616cdaea1b16b40e00000000, +103'h1eee647a9a61675c1c00000000, +103'h36500a2c10c2d4370800000000, +103'h0567131730b138b1a200000001, +103'h229dde59a70142ddb400000000, +103'h2aefc0502b6855f4e400000000, +103'h0ca309a2cd06344e8ad39ef767, +103'h0019272c76f5f49eb4878de595, +103'h25407d67c498fe418200000000, +103'h2e691680c4b2256df800000000, +103'h24fa058eaaf2a2d5bc00000000, +103'h269128eb195bb9568200000000, +103'h1e1e40e63d55bee52c00000000, +103'h1c445722e2e6e7d04400000000, +103'h1f1c92cd830528b68200000000, +103'h0ae7714dde497fd96400001cee, +103'h0f0e0924bc6612a6e603001252, +103'h108a5fe0c64d83f4c41e6df601, +103'h36ed9e6d145b8d198000000000, +103'h1d5605afe6e5ecfa4600000000, +103'h2307eccc1cd38b675c00000000, +103'h221fe68f392991174200000000, +103'h2a8564471b317de35e00000000, +103'h07466f187e5164729600000000, +103'h08ed66e428d6c8b9b21dd72ecd, +103'h2767ea172f1d37d23000000000, +103'h3d0bfe61770a9eb65800000000, +103'h2ee1908f1d7288cd8600000000, +103'h1e08872f597e872efc00000000, +103'h37064689496017be1800000000, +103'h3c213db566689eed7100000000, +103'h3946d397de6ee576b900000000, +103'h10def247da90232c2027678ddd, +103'h02f59826d4d6f6c3fe00000000, +103'h3a6c55c3e4b5e90bd800000000, +103'h1a4bb24e66ab8132ac00000097, +103'h1899f44fa317d6f69200000000, +103'h3278597cfc638944f900000000, +103'h1f2db56e56fd7d949a00000000, +103'h3098fa6b8975d7119800000000, +103'h2aafc09b66a38c7fee00000000, +103'h04de5dc1d93c86eb7600000000, +103'h1d70842d42ec4786dc00000000, +103'h0a00282d46caa548b400000000, +103'h0105a33ee43b2975f6a0665a6d, +103'h1eaeaad06f3b51a33e00000000, +103'h1294394d7140f4e22200000000, +103'h0b660f514eef9fb29000b307a8, +103'h08028a9de083d9000040a9cef0, +103'h2ada2f606ae9e8514e00000000, +103'h3aed25c632ec72ef3100000000, +103'h3c41110e1cc6a24f9b00000000, +103'h0a849c0898b3c815ce00849c08, +103'h3b4c000314f4d923ea00000000, +103'h16fd4c4ede79752c8200000000, +103'h249b0b89dac5752f9600000000, +103'h0eff6d1470c2c17e7661208a38, +103'h131796b4d55dcd085000000000, +103'h28249979235d3a1cc000000000, +103'h1eab1169f574d0d19400000000, +103'h2ef6fe8a5e996a4ab600000000, +103'h2e05ad293d447bb4ac00000000, +103'h037228d06d3b7a3f0a228d06c0, +103'h3a3bde945a4127684600000000, +103'h277a6529deb35038b200000000, +103'h3152560a18ef2ecd0e00000000, +103'h376ec29eff6993f6ec00000000, +103'h2ac6a972eebbea010400000000, +103'h385fb7af252aaca00200000000, +103'h24ac16240ef15612f000000000, +103'h28e7a36606510dc21400000000, +103'h2a8cc49eeafd23e62400000000, +103'h1aedcfd8d2e4c74c2a000003b7, +103'h2e7987b2bd718beb1600000000, +103'h12f6959f965f5bc3e800000000, +103'h3ec4b14e86d8e376a600000000, +103'h148ff0e398cf79163c00000000, +103'h3c3ff7c4d6942a64c300000000, +103'h22618a912b241b485c00000000, +103'h20e279216864130d3200000000, +103'h223c4b284ac59d9e5e00000000, +103'h3e6596456aa816bfc600000000, +103'h33230bc74ee461e81100000000, +103'h10049c918d49f82d7c5d523208, +103'h164a4068ff6d03f4ca00000000, +103'h265581dece71a0865600000000, +103'h2208da1464bbe0ef5600000000, +103'h2ca094320c1162ce2400000000, +103'h0482467d2f1a3ce28a00000000, +103'h1ad0fcbd1cbad11496000d0fcb, +103'h3e915383603d1791c500000000, +103'h090d8b38fa0e144ee081cfbb0d, +103'h1e9b25bcb89f67d24000000000, +103'h2542fd2302acf30b3a00000000, +103'h04a5a59de14818c7f400000000, +103'h064565aa848b15eaf600000001, +103'h00f33a060a30bb88d691fac770, +103'h35407633d17621335c00000000, +103'h2a3aa56cd1695b396600000000, +103'h037ced6dc6a9d16d3618000000, +103'h1e4a4b59b0e476da0600000000, +103'h044864ce72616447cc00000001, +103'h3abc9f7690abafa17f00000000, +103'h009a355814f4146ff0c724e402, +103'h0e219ca6ceb0b3e68210485341, +103'h0c8d7acf904ae93e9667fdffcb, +103'h3d5abd401f6c85e56700000000, +103'h3ed3af522afa00b4f600000000, +103'h1640b5d42754bdf51400000000, +103'h3d5e703ca7286d473e00000000, +103'h32c713e3bc69231b6500000000, +103'h069c3d7038c793580a00000001, +103'h056b67b1aa8ea73bc600000001, +103'h288f4fe8302ae4abfe00000000, +103'h34dba565f4964c5da800000000, +103'h3a911dff1c259c45d900000000, +103'h3a0e29f0500141abcd00000000, +103'h2319dd1d4c925faaea00000000, +103'h3d5074f646a0899b3a00000000, +103'h081d592ce8ba66b886539fca37, +103'h320fd9a9640adbaecd00000000, +103'h2f039bd1af2834dbb600000000, +103'h3489bda4e0380e851a00000000, +103'h02b069134e3baa56c883489a70, +103'h38917b3a44c567fbab00000000, +103'h137d69100675d10ef800000000, +103'h1c918bc17e074c493c00000000, +103'h06ddbcf81084b5594200000000, +103'h3e6598856c16411ac100000000, +103'h3cb2dc0e72f3fe12d300000000, +103'h3f75f0a6725996983f00000000, +103'h01405187af0c72a6b226621730, +103'h128f67c22c82634d2400000000, +103'h10f4bf176cc2b4d4d21905214d, +103'h024e147f7e521c96fe80000000, +103'h2701007fd146dbae6c00000000, +103'h38c05f26d294f02dea00000000, +103'h3902211afa95f0adbb00000000, +103'h240697e3f3564fd48e00000000, +103'h0e5d2b43eb5870ef882c1021c4, +103'h0afa9a524e5f08d37a00000003, +103'h192cf98e9ebc34176600000000, +103'h20f54978a8b6ce69b400000000, +103'h1b13e93740e3c7f852ffc4fa4d, +103'h008af9e560d91170fab205ab2d, +103'h36611366faecfaa83a00000000, +103'h08f360fffc77f48d9a424a3933, +103'h053c7d02b2d907f49600000001, +103'h3e6960fdbacc68f49200000000, +103'h1a6f5669bf08e5f7440deacd37, +103'h3162467dfe7246f4fe00000000, +103'h02cd2b1fd8e19d5ebe00000000, +103'h071117b64943e3dcbc00000001, +103'h05216d414b110efc9400000000, +103'h033aa8c3912226b2dc18720000, +103'h3ec62b3ad54393f42600000000, +103'h13334b10d97e3cb7b600000000, +103'h2ee44ec3964467f28a00000000, +103'h14a66172ea77b3036200000000, +103'h0a8a9ad5195c01c6fa00000002, +103'h16b2682b6f026339e400000000, +103'h38587239788cfe0efd00000000, +103'h3242e43a0e3f663a6b00000000, +103'h16a5093e0897d873e400000000, +103'h14633008fadabcadf200000000, +103'h3f23ba0dd27fc5ebfb00000000, +103'h23714221a6e2f5f4f600000000, +103'h16fe306fe506b002c800000000, +103'h1122f7320977f2246ed58286cd, +103'h07227aa21e7622945200000000, +103'h0ea1c3fe2e9919c65a4080e305, +103'h3d04034f36bb94687800000000, +103'h106cf2a3055d5866a887cd1e2e, +103'h2b4dd41b43615bb5de00000000, +103'h24a4d827d2ce4e58e200000000, +103'h0c94f5fabc1c2274244e7bff5e, +103'h2a40a83620c0fa9bf600000000, +103'h0c49b2d82d55f096b4aef96f5e, +103'h32b41930169698ccd500000000, +103'h28eccde0e4e04ba50200000000, +103'h1d41a505d69464d51800000000, +103'h325776c6be8132b5fd00000000, +103'h34c3391e5cc2d7bbd200000000, +103'h0cc59442cf1a4e8292efef616f, +103'h0aa83b0c42dd87a0ee000000a8, +103'h1c1f46aacea31be3bc00000000, +103'h2e1784ff594b56effe00000000, +103'h1cd29b0fb66a9d9acc00000000, +103'h18a7ffa2a482229a2600000000, +103'h175aebd68354bda9dc00000000, +103'h24b0f3ee1afcbd4c8000000000, +103'h0b5252f5b257a923025494bd6c, +103'h275e4f9817089d111e00000000, +103'h26ec6ed4a15af006d000000000, +103'h2acf4bbb06b93f9ee600000000, +103'h08aee5edeca5ae738605a5cf35, +103'h18e62943d774fa2e8c00000000, +103'h3e2609aade23e01c7900000000, +103'h04c0da18b70a09605000000000, +103'h1014ea257430130b2ef26b8d23, +103'h080ea8a5b8f0ed23e67f22c32f, +103'h187d61548805d7495a00000000, +103'h090ffa1fd3147fef140dc2f863, +103'h2eac9c4b6a91e1439c00000000, +103'h0879518232a1db636e6c4570ae, +103'h1c36f3dce14e77aeda00000000, +103'h3afa6d80eac7c9310d00000000, +103'h28d2671406febd0dee00000000, +103'h023c41eac0f92a8ed80f560000, +103'h1147f824eacb91a2de3e334106, +103'h3ea2260ded07d38da000000000, +103'h16c41d27fd4fcbb28a00000000, +103'h34e4d14ffaf1f1c07600000000, +103'h14feb006d0b60ee87400000000, +103'h1ee42060869ae0386e00000000, +103'h16d16447da99903f4000000000, +103'h0b0e73e1bb7db09fc610e73e1b, +103'h393d753c104f14e7a100000000, +103'h3922857eda5d88c95b00000000, +103'h3ea275fa129afe056b00000000, +103'h20bbf6b48cbd83844400000000, +103'h3a53280ecb5ff97e5900000000, +103'h26396e50ab1bf032e400000000, +103'h2b7d3d5be66f1841ae00000000, +103'h035c0a6c8ca886925aa6c8c000, +103'h26f85b017725c3ee4000000000, +103'h16f4a514ba81ce5acc00000000, +103'h300cdf5ae07a295c4200000000, +103'h309431e2b66ece70fc00000000, +103'h3cc40afce77badcbdf00000000, +103'h3e19a805560fdfae9500000000, +103'h3cf1136892d3eaab7c00000000, +103'h1b42a82812ed92b0d2ffd0aa0a, +103'h2f030b588edea6196600000000, +103'h2b3f1c54e9214e417800000000, +103'h3e8b0cffd724599a0600000000, +103'h24aae856436375eeee00000000, +103'h1cb8565d80ee82eec400000000, +103'h22a46a7e24996b450600000000, +103'h10b1cce04051c1a28630059edd, +103'h14e388dc62f62c20aa00000000, +103'h1d78bac772a7f900ea00000000, +103'h22fc6fa1468b81dd4c00000000, +103'h0e198fc022043ca4be00064011, +103'h388871818700ac460600000000, +103'h06ed7f63941a3c062800000000, +103'h04fa86468ca2ad87ae00000000, +103'h0a930f06d2902ceb4224c3c1b4, +103'h352fd46bd88ab331d000000000, +103'h22cd4616e21dc238a200000000, +103'h2684f3c8164d96a47a00000000, +103'h36df4f00fb1adcbb5e00000000, +103'h18c9d725209fd0837400000000, +103'h153f127b167f1f846e00000000, +103'h32d21009ae48f6a98f00000000, +103'h26b2a43cc2880924a400000000, +103'h16ae152b355a192e5400000000, +103'h2549569d1c0cbd6b1600000000, +103'h0b63b79372bad2964c02c76f26, +103'h1ec70f33570429336800000000, +103'h34b26ff7e167e0c6da00000000, +103'h00f7e9eabe2eeffa30936cf277, +103'h294a2148b4e15ff21200000000, +103'h02572b3cf4d949dcd0959e7a00, +103'h35685e649e236b258400000000, +103'h06e17253217a96627a00000001, +103'h1689763bd4e2f4c71800000000, +103'h1c12da169ac4671a3800000000, +103'h177587ce334ddd560e00000000, +103'h2efba0ab4e60b76ca800000000, +103'h26fc4feae4d63f3ada00000000, +103'h34dff3f192d1dfe62800000000, +103'h1e87ff1278ce2fd10c00000000, +103'h397de7896eae23c29f00000000, +103'h22d4876d0d3622d51800000000, +103'h2e01668b84b40a5e8600000000, +103'h0e002590268891cb920000c001, +103'h26cd1465d689f8571600000000, +103'h2d4826fe248a1de73e00000000, +103'h3ef95c6b8b57324d1400000000, +103'h155e9c37769f594b3800000000, +103'h134c6dcef498b5b6c200000000, +103'h26c437bd88f751ee3800000000, +103'h1ec61f935d43bfbd2c00000000, +103'h201f39b64207f77ab400000000, +103'h1917ad2462ce170e1000000000, +103'h04a8d64942ed50c45400000001, +103'h3b31515c5d04fde8b700000000, +103'h0afd8c2ca0add431f800000007, +103'h1ed1be779adf258e5400000000, +103'h157407d0a6dcb1baf600000000, +103'h0e03a1ee04ae70329001101100, +103'h229839f41a2278033600000000, +103'h18daa62c292619f13c00000000, +103'h2afc37f28abe53e55600000000, +103'h20fa7b73e498fa117e00000000, +103'h1ca72f27ce9532040800000000, +103'h32765adeee8fad77ed00000000, +103'h316ba0874c36dc9fba00000000, +103'h3a1f3a14fead377eaa00000000, +103'h276bcdb43118d805f600000000, +103'h234d93576a38121af400000000, +103'h0cbf067290a3dfcf245fefffda, +103'h0267562d72f173268ed58b5c80, +103'h36bcdd66feb079992000000000, +103'h1c2b3ca68017cfc69200000000, +103'h2ad1ae00f8d4ad2d9200000000, +103'h0b1bff2a94ffe9d4120046ffca, +103'h1e57c37abed197d50a00000000, +103'h314401640aed96ff9e00000000, +103'h03480f13e9455a7a5ec4fa0000, +103'h0f20c9f158895bde680024e824, +103'h2cf96ea2dad16af25000000000, +103'h0aa3ab2968f234e3a80000051d, +103'h333b7eaf96eba3868300000000, +103'h0218acb0208f4eafec04000000, +103'h2b7f368f14cacd5f8200000000, +103'h2eb72b6056e37a0fa200000000, +103'h1ae155154262b09eb60000000e, +103'h1cf72250b119dbff0e00000000, +103'h3e9c3e3c0afb31145000000000, +103'h370c2786e6f253650000000000, +103'h045f8ae1648e91a10a00000001, +103'h14159eda9a9ab927f000000000, +103'h14e58ed2defa44095400000000, +103'h1eb0afdf730fe2e3f000000000, +103'h0e6e245106f571b6ce32100803, +103'h22ba2a63a4a621964200000000, +103'h12a0e99e321445e74800000000, +103'h2281ece216ce704aee00000000, +103'h2472d309e86f59e92000000000, +103'h2c592ae88af146cb3600000000, +103'h1ae5a45d6f6419d520000072d2, +103'h3c8663b99cbd44bdab00000000, +103'h32f59360b6a2e91b1b00000000, +103'h12d41cf0f3294cd4b600000000, +103'h3ea3ed4c661ee0356d00000000, +103'h18d7d77cf8f2fd266000000000, +103'h0ec9066b3696ea72c640013103, +103'h3a5d1e748e6ec1efbe00000000, +103'h1a1a83529d37c85af600000001, +103'h20f6c8661894e6cf8400000000, +103'h20c60a9ff2af6a222200000000, +103'h172c374c94a632883a00000000, +103'h1b0125e8f46c3d282cfffffe02, +103'h3d0ddce04a987474c000000000, +103'h36af7aa724999a5db400000000, +103'h2500829022a7773dfe00000000, +103'h24f7bd015956f1e52400000000, +103'h1a5b349abd5774754605b349ab, +103'h195720a8e24f31769e00000000, +103'h3ceca714bcaa66115c00000000, +103'h0229a4be950186ba3e00000000, +103'h22bd944d92ee2dcefa00000000, +103'h3ea8f851d417d28d8f00000000, +103'h3ce38dccb6d566db2000000000, +103'h36c88958f57e5f2cf600000000, +103'h04af0b9f7061ecf9ac00000000, +103'h2683bbb4e72a7652a200000000, +103'h1d703e57ecd981f21200000000, +103'h093227d6135d3da6fa378d3874, +103'h2b7270812ecd7bfee600000000, +103'h3e14a625f6ffa3d4f800000000, +103'h38e1521d637214562600000000, +103'h1e878006e086ba7c1c00000000, +103'h168aeb9758680c997e00000000, +103'h3d5bd326b6ef8ca05e00000000, +103'h192c5e8b0c7a7837b600000000, +103'h196efe4588d64b5e6c00000000, +103'h3638587c2002a9e97800000000, +103'h2e69bf4c3871a82f0000000000, +103'h1a8ab2bcb0aa00ab22000022ac, +103'h15261e64de13bff75a00000000, +103'h1497d56b789e72b40a00000000, +103'h360c365b8cc49118e800000000, +103'h12f23f7aa35c66846200000000, +103'h1c824944d8689cdfee00000000, +103'h062613066a5adc5a9000000001, +103'h29684f7c08dd259f6a00000000, +103'h176f1d0a8e0338a5d400000000, +103'h28d2511d766b8821dc00000000, +103'h129e22104cdaa52c6a00000000, +103'h26c4cf5db4acf649e000000000, +103'h04c8a24a874b185a2e00000000, +103'h2ecfaddd2e0fe7b7e200000000, +103'h11424191b2d88a026a34dbc7a4, +103'h3e8f7a72a0a837df9800000000, +103'h2089a99d70ea79714a00000000, +103'h0acef1226e79f3e3ea0000033b, +103'h2324205f51039d815c00000000, +103'h2c51d99e9ad28ea3ca00000000, +103'h1927cabd7ef6af031a00000000, +103'h34e8354dab4888a1b600000000, +103'h3e2293c1c370535f3400000000, +103'h1a608fb7365888acde0000608f, +103'h11711a50777b1c6ea2fafef0ea, +103'h057853ecd0dbac25d800000001, +103'h22c8162ae04cc6764e00000000, +103'h04882bc824c51a631e00000001, +103'h1ea0ca12468d308dfe00000000, +103'h2d3484cb0c155c562200000000, +103'h0ca3eba9aab626686a5bf7f4f5, +103'h0a6018fe96eaab337600000006, +103'h2ee160b6a28e96dd2000000000, +103'h18efd8fcaeeeafdbb600000000, +103'h0f13ad98dcd010925a0800482c, +103'h2eeda89d74bfe98f0800000000, +103'h24b24ed582d39727e400000000, +103'h3f058beab0c13fc55900000000, +103'h064778db95738e9ada00000001, +103'h2b59765ed5791a858a00000000, +103'h022b5d711ac093611e5c468000, +103'h1cd0dbab461a09bff200000000, +103'h263799aac94567310e00000000, +103'h0711e645271642dc5400000001, +103'h38654d650c4ddc871c00000000, +103'h067947e6125fc2cc4200000000, +103'h1aa74c270cc51031500053a613, +103'h381ab799123e58176300000000, +103'h3aa465e76ee5a43e6e00000000, +103'h0b7bf0bce7005bd7825efc2f39, +103'h2eb33e5ea0a4c1bef000000000, +103'h1caf9c31ad20b27bd600000000, +103'h1eea521c1ad3f0da7600000000, +103'h0e0aac44f6838d0c2201460211, +103'h252b6245566ddf283c00000000, +103'h1cf0da04a5788b6d3400000000, +103'h3ed7043fcaa3edb28b00000000, +103'h3c911f556694c7b72f00000000, +103'h30cec777246bcbf6f800000000, +103'h3a7a4ec120fceb4c5e00000000, +103'h289e617850cbb2c38400000000, +103'h226661e20a460184a400000000, +103'h00c32a02f4e462fcf6d3c67ff5, +103'h048bbe1ad64ac4df0000000000, +103'h2a513d7f160deee1f400000000, +103'h20e26fa6dc99acfcca00000000, +103'h20b9a35346eaea7be200000000, +103'h177539fca6cd5a22be00000000, +103'h207b95850686fd760400000000, +103'h028fdfef5cfc3772aaf5c00000, +103'h013dd7567e77ccf7b0dad22717, +103'h04d6b9398107ace70e00000000, +103'h2f3cf53f4345843d8c00000000, +103'h202a2ebb061c3d770c00000000, +103'h2f139fa9765932b64e00000000, +103'h3b74dd8f968361715600000000, +103'h06ddc85cc497011acc00000000, +103'h168c37677f0bdeaa6200000000, +103'h2c56e3e944e9a7072600000000, +103'h387ac3215b75de6ea400000000, +103'h1a2203cac6ccc257e800000110, +103'h0060458eff47857944d3e58421, +103'h24aa65fd986989440a00000000, +103'h0cde2d7358c9ced30a6ff7f9ad, +103'h1087d357bc7434d0a209cf438d, +103'h1cfe3b940b526243fc00000000, +103'h26bc29499ada359bb800000000, +103'h08e3a04336d8712fc21de8b67a, +103'h04d4e60fdc949a795e00000000, +103'h3f3a60ad26783abc9500000000, +103'h00f23d8e6b4d20cc721faf2d6e, +103'h1e84500b688781799800000000, +103'h34eed3b82a79bf080200000000, +103'h26edf1de48fe0f136c00000000, +103'h3e654ac0fcece2cb9600000000, +103'h0029c47022dad4a9de824c8d00, +103'h2c75bf98e1401f6adc00000000, +103'h033b79c9a269e3dafe80000000, +103'h22ff430dcedfa373e000000000, +103'h3eafef1d931b1d3d8200000000, +103'h3d3b6fd7341a604b5000000000, +103'h1d070ffbb2ca4f68e200000000, +103'h1e3c93fb2e05bf401600000000, +103'h3151bb6e8c0ccf3bc800000000, +103'h1282001f6b496336f800000000, +103'h2acca51b9a9b1ea58400000000, +103'h32e19980ae1d1ec4ef00000000, +103'h2afc4d25d8e9c3e08a00000000, +103'h2e23d006cacb5d613800000000, +103'h1e94b61eb6c7aa871000000000, +103'h28a0badc24eb7a8dda00000000, +103'h20c9de5e828030ac9000000000, +103'h30dcc5c16b20eb88b600000000, +103'h0abb0a858aeac9e73800000005, +103'h1c60f9d0bac78fa8a400000000, +103'h12f263a9c6829a2e2e00000000, +103'h0b03fe2f62e393feea0000040f, +103'h2f36843db4d5f7a8b000000000, +103'h1e53d4333ed9f5d81200000000, +103'h0938b3d16f107a15c61464e254, +103'h38a02d9dcc644e490400000000, +103'h0aeb3b69149d021a720000003a, +103'h110c40dd0c3d2fb83e67889267, +103'h15073c2916286b215200000000, +103'h0912b18ae634abfe5e930d3a5c, +103'h06827535ba3be8277400000000, +103'h1a8f3afb024e99b25a00023ceb, +103'h38d930788ad10ee81600000000, +103'h2f4b9117646049e31800000000, +103'h08f29db49c397a5ba265f3f79f, +103'h1ed592794a850b730600000000, +103'h390720f05577a927a500000000, +103'h1a09be4f724d3ba0ee00000009, +103'h226ca591aa545c914200000000, +103'h0709072f875e1ae0b600000001, +103'h352a744068cac0726000000000, +103'h38c38a78eed3c7a1e700000000, +103'h2ea9dc5262fe3be24e00000000, +103'h0ee48abd1ac1c65b3c60410c8c, +103'h367d5408896ba2ada000000000, +103'h04e0ddc658502d6aba00000000, +103'h03182f260ecd817344305e4c1c, +103'h224dbc6812ae5f399c00000000, +103'h1c45100554c68e5faa00000000, +103'h20a8065036144ac7bc00000000, +103'h3d5b2a05d5595acd1200000000, +103'h26dbcf2eb401611d4800000000, +103'h250ad391325c8b231c00000000, +103'h3600665359385a51d200000000, +103'h3e0a43dd3d432de30400000000, +103'h1c6d7c34324394365c00000000, +103'h2ed215a8734dd8139a00000000, +103'h32933a3fcebb5447cd00000000, +103'h0e8cb928fc8d69f03e4614901e, +103'h28c965f52e20a4300c00000000, +103'h3649a6f7bcad5d590800000000, +103'h3517c00de676c34e3600000000, +103'h02a12d6bdcc06a45f4b8000000, +103'h0ab804ba10d82a53da0002e012, +103'h02ef8038537957bfb648000000, +103'h36d4590f9e315c79c600000000, +103'h112ff5352120dcb21a078c4183, +103'h074bfba096f535c1b800000000, +103'h0d402c5fe7252af6d8b2977fff, +103'h26adb4deed7126976e00000000, +103'h1e4c99d7b8b152f75400000000, +103'h370c5b82a15f07d64000000000, +103'h24c152ef3eaba1adf800000000, +103'h389b7552b6b7fd309900000000, +103'h38e6be4d9b79501fd800000000, +103'h32e35a3fd514c5728f00000000, +103'h0a3efe084cfb83c028000001f7, +103'h2246437ebededdfffc00000000, +103'h31058625cb1ddc084a00000000, +103'h1a3e18ecac641f870801f0c765, +103'h168b71261e69a5acd200000000, +103'h20d44d1fb8a7be998000000000, +103'h2afc07194f332fbf9e00000000, +103'h3d419d1b31077cdf5600000000, +103'h3ceb52a41a0383f8a400000000, +103'h1afeadd9d6452113d4001fd5bb, +103'h30b9c7a9143073b7ee00000000, +103'h16a81137ef2f2191c600000000, +103'h2a9dd7a620e8e93ada00000000, +103'h1a97220cf690fa72c804b91067, +103'h20d58d87a02ed218e800000000, +103'h3a446cba3ac5f425de00000000, +103'h02e26d7e9a9b81ad807136bf4d, +103'h2c69577dd4dfee67ba00000000, +103'h0a813befd8c25be656000813be, +103'h0ac7f27ac42bb3642a0000031f, +103'h06d49d2b8eacef540200000000, +103'h1d7cc989da74e1cec600000000, +103'h0704e44fe1497efa5600000001, +103'h0b4f5afc3cc6488430000000a7, +103'h10c5850cc2cb2cd410fd2c1c59, +103'h26e89e714d1a87d04c00000000, +103'h168099a49ee00cdd0e00000000, +103'h266213d244c8ab4e5c00000000, +103'h3309d6841d4944f2fb00000000, +103'h027cc60a02ab58c53e80000000, +103'h1f0a3d6036b52f495a00000000, +103'h1977c1937931f5535e00000000, +103'h16adf115173c32b39400000000, +103'h332d6589aeb3f4470d00000000, +103'h105832c38561e55c227b26b3b1, +103'h24382f46b68f4ae5d000000000, +103'h304a211d46e77da95400000000, +103'h129845a76b1facf00c00000000, +103'h229a5e789a69ce0d5200000000, +103'h36fe5ca5ed0213b4be00000000, +103'h02f1a5b90e9c722d582dc87000, +103'h16cc6c75869aced34600000000, +103'h14c6e022088c748c5400000000, +103'h2c2b21dbde58e101da00000000, +103'h3291774a731fc123e500000000, +103'h08943ee6604ae2ffc26f6e0cd1, +103'h2231d55592dc5a4a3600000000, +103'h065be0511b7099309600000001, +103'h0adecc4e7ea26e8628000006f6, +103'h0081796fc4fe4ed744bfe42384, +103'h166f0990cedd1b25c200000000, +103'h3e38f3fc0e5e94958600000000, +103'h02737797e4cd9e2656de5f9000, +103'h055069b9e40692226400000001, +103'h0c2baab3277a09ba4abdd5ddb7, +103'h22e406d22cca73742e00000000, +103'h06faf786b8f61e275400000000, +103'h10df86619ada24f98002b0b40d, +103'h3ecaa75ee0d51c803800000000, +103'h152fd21672b4a2e1d200000000, +103'h145f7042317f4a40b400000000, +103'h0e852c9544af1c572642860a82, +103'h20850de1da0e8c995600000000, +103'h155a0baea893b92e9c00000000, +103'h3ae3ac5d4918c7107700000000, +103'h12ec974c9f72d2bf1e00000000, +103'h2ea49e9318567f1c6600000000, +103'h246b3272ea4316690400000000, +103'h02c57f8158e7b4fc1ee0560000, +103'h283893a03c52e76f0800000000, +103'h2e1e7a7e3f1866f06200000000, +103'h0d5ae078a850fa909ead7d7c5f, +103'h14da5cdc176f750ede00000000, +103'h37418e3ba2ca55878600000000, +103'h16fba70a36a4b2639c00000000, +103'h34ce26c92ee6409f3e00000000, +103'h3af1a118c4e1e7a97500000000, +103'h1684907738b00e72a200000000, +103'h14e1d55d32a1af8b6600000000, +103'h08e3cca6c82640029e62c6522b, +103'h2ccc048f9c08155fd000000000, +103'h12962421e4ebe2069800000000, +103'h32105226d0b7e6963500000000, +103'h032c2fb7254e0ab81afb724000, +103'h1d6e4d4a165e5cdeea00000000, +103'h10b8803cd88a8c960e16f9d365, +103'h2aee953634f8d9e02400000000, +103'h16dc90c5c6b15a1cfe00000000, +103'h2418970d709fef533200000000, +103'h0ab2fa34067c8018f800000005, +103'h08d7e9f0ac9517266a217f6b63, +103'h3af5b38d7648115a7100000000, +103'h34c4d7473e1ffb4b1c00000000, +103'h1e33ea543815aed89200000000, +103'h0e1f7d7a2cda861fd00d020d00, +103'h2ca027c68b0e70740a00000000, +103'h3f68e36d5a2dedee3700000000, +103'h11519a5f46ce15b4c241c25542, +103'h1a500029c536f9221c0000a000, +103'h1028ec141488938162d02c4959, +103'h121048726ed893ab2600000000, +103'h2f2592bf01017fbf3c00000000, +103'h1008f2c05211c831aafb954754, +103'h39234be3c2375af0ab00000000, +103'h34c6388893404db0fe00000000, +103'h1e41b8d88b639994c000000000, +103'h0abeb8e7be29d21d52002fae39, +103'h094d81289f6b8af5de1305eea0, +103'h0913a45a282a43dd9c9cf3c3da, +103'h1b1a153cb077c5063afffffffc, +103'h38841fb3f88b69606300000000, +103'h1617fc4892a57e9d1200000000, +103'h111763d30c299e510a76e2c101, +103'h35410f3b23419a999e00000000, +103'h06e27fa97358fe6caa00000001, +103'h120f5978269a0da7cc00000000, +103'h30e1b1e3ee7c8d513e00000000, +103'h1adda8a0c08be6c96600000dda, +103'h271b39f7316d98ad5400000000, +103'h24b1c9ba4b4b414e1400000000, +103'h0ae2672531667b45441c4ce4a6, +103'h1e8f91e1551844ff8e00000000, +103'h32c8a366e0faac24bf00000000, +103'h366f4d99be8a3e061200000000, +103'h0561391ab252e16cf200000001, +103'h02b99fe0e8c22f06b2e8000000, +103'h172a4ba6af2368216400000000, +103'h0895a39130dd08024c2455c9be, +103'h3a8b3981c60753a8fb00000000, +103'h1ed3b0df509cf73a2c00000000, +103'h2cde57438a2830bbf200000000, +103'h270c65c92afbe19b4200000000, +103'h13177c5116da38dece00000000, +103'h0629e681fce69ea7f800000001, +103'h08d947ed10fe1af90e13ae8a0f, +103'h16b0da141628017b0a00000000, +103'h0e844dd65e0149681a0024a00d, +103'h1d31fa7776b2237c3000000000, +103'h28c645c0853671529000000000, +103'h0358ac02a3686bca0662b00a88, +103'h351313bfca2eb18a8a00000000, +103'h04cec4e50c875d8d2c00000000, +103'h0a3c9986809a714cf600000003, +103'h14e0df7a856936320400000000, +103'h02ed91388ea5cfb884db22711c, +103'h3928f4812486af330b00000000, +103'h3cebb556e674406b9800000000, +103'h0248e7799e9d34ecbcc0000000, +103'h0d0f4fce5c88ea43a2c7f7e7ff, +103'h257b87db9ed1d1bd4200000000, +103'h236e6f1beae1218b9e00000000, +103'h04d596c7cf5ca9673c00000000, +103'h06d9f36070cb18832600000000, +103'h25673a3cb6a0af4af400000000, +103'h20c652d63d7aa2ab6600000000, +103'h07068cfb62e1dce81c00000000, +103'h3ca37087c2a82fbe5900000000, +103'h230b6c974aaebcb9ba00000000, +103'h3f1417f1c7522d417e00000000, +103'h169765f7a95d99d8c800000000, +103'h12fc90e5a771b1ca8e00000000, +103'h1009eb91fd0917c2368069e7e3, +103'h18c602f80f05a8a7dc00000000, +103'h26d4479f9e0f9439d800000000, +103'h1c40261ff6d59731e800000000, +103'h381db66adca9ded18700000000, +103'h10045e77f8ea04f17e8d2cc33d, +103'h38f0af2cf007bb5c5a00000000, +103'h00ec941bc30c19d454fc56f80b, +103'h3ebe103c7afcc9014400000000, +103'h18396b2ebae95d1d0600000000, +103'h2c9ecb1278a76d598200000000, +103'h330be65292e0d8883d00000000, +103'h38851b66ff7fa39ab600000000, +103'h3afb197cb08b89ed4900000000, +103'h395a74af6a10a5544700000000, +103'h2e613d3ba50bbed0f800000000, +103'h3648de501d6633806200000000, +103'h3cb022ff4ac770bc0700000000, +103'h34a2f19bc1104f0c2400000000, +103'h16a6658c7ec0720b6e00000000, +103'h1eb5984e336363a73000000000, +103'h032afe904b09c933ae12800000, +103'h3167d58e68bf6181e000000000, +103'h20b4fb98aaea60122a00000000, +103'h0ec293ae5a5235a0922108d009, +103'h31338f6b3c0731393c00000000, +103'h1aae545bcac9c4e798000572a2, +103'h2ee87ace3afd5452d400000000, +103'h2b0d0152d6aba8ae9e00000000, +103'h0283bd780494237cdad7804000, +103'h1601aad66ea124cfb000000000, +103'h37495d1c7324e247b400000000, +103'h108e63b548268d1e2233eb4b93, +103'h007f12fcbe6fea3a94777e9ba9, +103'h3403e5c10efe4defde00000000, +103'h1629dd550e7d60ec9c00000000, +103'h2c74b730c28146adac00000000, +103'h0ae61e2a9aab2402ba00000003, +103'h26c76f5f071fdb337e00000000, +103'h12a70e835105f95e1800000000, +103'h0e040e9436cd68bd1e02044a0b, +103'h0ce25552cb7477406efb3ba977, +103'h256bc014187885d4a400000000, +103'h03150608e45adb276e39000000, +103'h30c4455bc8c69b3b8600000000, +103'h1540ed6bcadba1446a00000000, +103'h05320cbc3a9fe6a03200000001, +103'h0a9bb1e14ee0d40bfc00000001, +103'h3660322dd212e0c83600000000, +103'h28eb4db5deae92a98600000000, +103'h27520a82540ec4d75800000000, +103'h1c58adeefcfa128d3600000000, +103'h22402567a24c1d0f8a00000000, +103'h3d3a7da880a4cafe8800000000, +103'h32e36892e2e4f0662b00000000, +103'h3e9b18549e1f6e0eab00000000, +103'h074cdaa39302d6a18e00000000, +103'h314aba02109deef62c00000000, +103'h1ced645f16eac999be00000000, +103'h2a74ff224635839bce00000000, +103'h161c07f42222e7fae400000000, +103'h16c5e7678c97e71d2c00000000, +103'h250db5d124b3ef114e00000000, +103'h0b404dd47b79d678dc0002809b, +103'h36a869739e878c4a0000000000, +103'h04336d0da8c7da1e7a00000001, +103'h205657c4de7043921800000000, +103'h212d318d64a3b09fc200000000, +103'h1a7de1cec4fa0864a000003ef0, +103'h35561e5a262739f20400000000, +103'h36f6350400a51bc0ca00000000, +103'h16068f3ff4fb3a1af000000000, +103'h1cba9a1baaf16f1ef000000000, +103'h2768ad5c02f7fe5ee600000000, +103'h173dfa8e5eb2987a9000000000, +103'h06b86381841b45d69200000000, +103'h2d2e068f9a594064f000000000, +103'h3e9518bca011a3e67500000000, +103'h10f429488e3faa760e5a3f6940, +103'h0305d24f0cd4c332b086000000, +103'h3632c12c1cc8ec7b3e00000000, +103'h06b8f06e1ecebeca4a00000001, +103'h3750c39696017ff66600000000, +103'h352841351cba70648600000000, +103'h3ed48206530b33fb1c00000000, +103'h2549af52c73375303800000000, +103'h2a8d9b698507f7368a00000000, +103'h06d30776a951a6895000000001, +103'h3ed2e3e854df41f2d400000000, +103'h08ddf4551ab249697c37de9e33, +103'h191c79f21a852d51d000000000, +103'h2c62f6c5a36321a6ec00000000, +103'h2afb1a227d7f9b990600000000, +103'h3a727f7228e2925ea800000000, +103'h269c2e2b52ddac812400000000, +103'h2d4b0a364f502bf34e00000000, +103'h165d07e834ec5a1ea000000000, +103'h3aeea13322376454ef00000000, +103'h0962ccdcb8946c3d24fb5070ce, +103'h2ab4a50772830d704600000000, +103'h1956a9257ce5da4cfe00000000, +103'h3ce50762269a7f547000000000, +103'h02aac9f3bef12879ec77c00000, +103'h0104f8c27cd62fdc12ed944f47, +103'h32e235017e80f9cfd300000000, +103'h1ea54b8d8085f2924e00000000, +103'h3302e16df2682793cd00000000, +103'h04519fc8500d73214c00000000, +103'h12768dfec210548f3e00000000, +103'h1e1c76050761f4579000000000, +103'h2c48509d98d882565200000000, +103'h2adc52c9f8f4f85b5a00000000, +103'h3b7dc817a43d48f8f200000000, +103'h0e2f91f48e199bc2ea04c8e045, +103'h294350290a9763da8e00000000, +103'h1b2f90b3d8c6f5cf1effff2f90, +103'h0710c99a010a45f82800000000, +103'h142f4b791b39d6ac0000000000, +103'h3267691b214aa0460100000000, +103'h1b36ea97b679ebbf1afffcdbaa, +103'h1acd61e368e154da3c00000001, +103'h1b6e1f2745183f71f2ffffffdb, +103'h3648b3171ee5a1555a00000000, +103'h336de74cfa53c07c9f00000000, +103'h250d0741f09c7393be00000000, +103'h3e8d7c11230a5ae0b800000000, +103'h1f26305247176222a800000000, +103'h1ca485e8c4a4de33ca00000000, +103'h14769bfbe2cb0e861000000000, +103'h3ce525a2be6f946ed400000000, +103'h065e0a2a52e6306ab800000001, +103'h16ee50d48ecb560d7600000000, +103'h2a2375b295296037ca00000000, +103'h2223a916aa17b10c5800000000, +103'h1a9370e9973b26beee00000093, +103'h24e96927385ecfd59800000000, +103'h3c0ab77252f240bf2f00000000, +103'h2a5565f536dba9e66800000000, +103'h04b7c58474e66158ba00000001, +103'h32554bd29f3bc74df300000000, +103'h1a51a1f662f38cd2660000051a, +103'h174038d95648d8a50400000000, +103'h080a79a2b09a7a9b6848019cec, +103'h2ebb1bc4c6dab374be00000000, +103'h32a78534cee52d176f00000000, +103'h1a877b773ca048dc3600000008, +103'h18b04a5eb047ce110400000000, +103'h087393e18acf4988425e6d34e4, +103'h3f1190d9257f93e6f200000000, +103'h0294bae82cf327c87c80000000, +103'h04b82dd36a04b8a1a000000000, +103'h36236ecfac997389cc00000000, +103'h355df9543251a15d3600000000, +103'h141817bfa975102ce400000000, +103'h22c55df39cd309811600000000, +103'h19775cc932eb2140be00000000, +103'h3cc2cf2894b07f345c00000000, +103'h125fe2e52d27dbfd8e00000000, +103'h137206ceaaeaab262200000000, +103'h2e5734393c4a8e0b4e00000000, +103'h3c2782e48ebc94d9f900000000, +103'h1ea850c43d13c9133600000000, +103'h2c50faa1783b4bf7c400000000, +103'h26e44fa4d6e39cbc0200000000, +103'h1cc232b38434975d7a00000000, +103'h215caa9c2b18e7025200000000, +103'h230aeb9806db19b5d600000000, +103'h1ef4788ba737c4520000000000, +103'h30c1a23b4b42afea0600000000, +103'h06c3634868372875ac00000000, +103'h06de0b57d8f8cab0f600000001, +103'h0cd3cd1d1ebc2df95e7ff6feaf, +103'h39015334649a39513700000000, +103'h31718935b06e066e5400000000, +103'h0e18e7aca86f59a2b80420d054, +103'h06b910d498e0e2d86800000001, +103'h1b1567f5e8f9ca8512ffc559fd, +103'h150bf8686eb2db59aa00000000, +103'h3c708f4948c8434f9300000000, +103'h0e447fccdcd43bb800221dc400, +103'h3af95328db44cb014b00000000, +103'h0ca7f109e8894ace2657fde7f7, +103'h0e096a44a2829df70000042200, +103'h193326cef12a8f00ea00000000, +103'h3f311f113e33f9458d00000000, +103'h0173e254d66720147ced8134a9, +103'h2a3ff06694983f25ba00000000, +103'h368e9c6f540c217a9000000000, +103'h3407d778ff4c11e12600000000, +103'h2eb50bc836daae507a00000000, +103'h00c9602beae285c97ad5f2fab2, +103'h2675f3b558979191b000000000, +103'h202ea8b95960f1bd9a00000000, +103'h1a336f9e7ed6e572f20000000c, +103'h0b12e4d421058e2c4c0225c9a8, +103'h24d4dfd33a38fdcaca00000000, +103'h192e6c64064be29eea00000000, +103'h24e8eab26b20c2722600000000, +103'h2e7a4e73c34f2ed62c00000000, +103'h1a114061663819889600011406, +103'h00e13019d6b267fc5ac9cc0b18, +103'h2cfd027130c3a85dc000000000, +103'h0339973ab0a4d877965ceac000, +103'h1cc55ada5ca1dae8c600000000, +103'h1e8938029edb72237600000000, +103'h34ff7d273ca0ccfdd200000000, +103'h3d396aa99b2a05007200000000, +103'h321830a38f298227af00000000, +103'h0698d1864b62ecd14800000001, +103'h38f4e48c7e7b1d74d600000000, +103'h26f1c4908513eefb2200000000, +103'h2f18a994fd08d387a000000000, +103'h056910c122fa98182400000001, +103'h271c64be911341ad2000000000, +103'h064ad630d57c526e4200000001, +103'h2a8d369e3c98b72cd200000000, +103'h0ad86a9342e38d5da600000d86, +103'h0d1e36a06e70c3fbe2bf7bfdf7, +103'h1e77445ab9492e8f2600000000, +103'h074ca4834767652f9400000001, +103'h28babbd8a4dea98a4c00000000, +103'h0e0c608baa2b4e0d92042004c1, +103'h22cec93a94e609e63800000000, +103'h30da6078a2f26a71e200000000, +103'h034d5ce646c133ac7618000000, +103'h3a9f02de369b94251b00000000, +103'h1e1bf6e3b8e8f10b6000000000, +103'h157ef4cf7487f3e99600000000, +103'h2ed45d2d12a3eacd4e00000000, +103'h0eeaf9372622df9cc2116c8a01, +103'h249d296656f73cc9d400000000, +103'h34384aa0e4e23600fc00000000, +103'h375b5fc50b7f5f675200000000, +103'h0d225fb67eb7aa0836dbffdf3f, +103'h080c3f44b41309cd400f9b44fa, +103'h1aed5b9cc0356983be00000000, +103'h10b0adf5c941a8c874b78296aa, +103'h12f35fb6222f04653400000000, +103'h10edbb7eb4dfb25afe070491db, +103'h04fb211486d312112000000000, +103'h3a3df02e16c0cd8fd400000000, +103'h38c268101cbbeea45a00000000, +103'h1975e45756f9ded27200000000, +103'h2f0912f98ebc46e28e00000000, +103'h086f53ace7322b39e4aebc4a81, +103'h3a9661f0153b3e337300000000, +103'h09795ed79eaa91e058e9e79be3, +103'h2c563a919940f3d06e00000000, +103'h1eef5d2e22ba52a80c00000000, +103'h38baab048e108d39a400000000, +103'h26c1370e6effea67c600000000, +103'h337254f8a6ba956c5700000000, +103'h176466b34d7bcc7ac400000000, +103'h1f10cb15feee21736a00000000, +103'h34cdbcb255528826b600000000, +103'h388a98b67363533cb400000000, +103'h22020a26e6310fef0800000000, +103'h18f548121ebba8a57c00000000, +103'h0cd6a770c0bdb2cc627fdbfe71, +103'h140a8ef618b2fade8200000000, +103'h10a1c9b82489a24f420c13b471, +103'h356a14693a9431455c00000000, +103'h36ee07bfca35fafd8000000000, +103'h382fade2bea00f66bb00000000, +103'h14244ee4348e17268600000000, +103'h16a29234eebdc5094400000000, +103'h10b506cb02e213ed7ae9796ec4, +103'h16fd765e9884a6226800000000, +103'h1ce5f558ea39aced6a00000000, +103'h165c8b79c137234c0400000000, +103'h3e90e6a3dd1d18a4ee00000000, +103'h28a755bb7279a41eae00000000, +103'h2c426af5710a8ac28c00000000, +103'h1b172d1cdab1e07dfeffffffff, +103'h0a23129046f44b737000000011, +103'h174c10a8a30b78904a00000000, +103'h14eeb2dfac2e8b209000000000, +103'h049bdfd9427a9bc93200000000, +103'h0efaed50d6694ea8de3426006b, +103'h214e463bdc052e822000000000, +103'h12ad17b72b001bd2f800000000, +103'h323a74530b4e620ed500000000, +103'h13426cb81efb79c5fe00000000, +103'h0ab3b3c61135ee190a02cecf18, +103'h1e2a295623785ad12800000000, +103'h1ea0bab92f2c0e973800000000, +103'h2865ae2b0c5637ed5a00000000, +103'h10261b62eaf6f2a68897945e31, +103'h081c76b3d35ca0d196a06b3122, +103'h228b2cd5e282bc348000000000, +103'h2c25f18f2a9f32e85400000000, +103'h0316ee35ce2a5fbe3638000000, +103'h02fedd82fb50514d6282fa0000, +103'h17436da1bd673f833000000000, +103'h0e0ab9f4ff661d062a010c8215, +103'h3171393096a98aa7e600000000, +103'h2102182a64b4449ce400000000, +103'h0ae3487194257dcd7a00000003, +103'h312bb83bf42795f7de00000000, +103'h14da450c7e0ade697200000000, +103'h11325c84ee3696a5667de2efc4, +103'h2e3eb89a4210dbb1e400000000, +103'h2270927d12433836d200000000, +103'h08ca0257c281f0d11625f9436a, +103'h2f2e509be4f2834e2800000000, +103'h00c935856cbc85a5eac2dd95ab, +103'h1674f620daead641ce00000000, +103'h0163eef31cb40bc73c0bfd5d2c, +103'h2ad4d896722901e81600000000, +103'h3a384587f28cf0db3200000000, +103'h3758381f5f61c971a600000000, +103'h0d6300f8989a0ef998fd877ccc, +103'h0121d5990ef24718f60a0e5902, +103'h2609ac219a5548118e00000000, +103'h3e7e73855a771daa9d00000000, +103'h3655045ac080c9cc3800000000, +103'h04c5a429c0ff3d519200000001, +103'h23288b11b75441ac5400000000, +103'h1ae0ba0b3b19e5d614001c1741, +103'h2c1006af5d4270e7ca00000000, +103'h00c01d1fb6232af30471a4095d, +103'h156f70e1a53331a26200000000, +103'h1e73064fe4f34ec21800000000, +103'h249081943a62bfa3bc00000000, +103'h06f06dc058d5c5f3a200000000, +103'h1e7384df7d664787dc00000000, +103'h1c29cda10256b5483400000000, +103'h3ed36524a2ca3a27b300000000, +103'h1adfbc4bfef407c8b40000001b, +103'h0ec1d966fcc76ced5660a4322a, +103'h010a3e09d6a7293954d8b3a195, +103'h36a957f4e46902a05000000000, +103'h0d12ac07a67340aa26b9f657d3, +103'h237007e31d1c989f0c00000000, +103'h3294d0abe92f44a6b300000000, +103'h1a60c2ae0a9f4c89ce0060c2ae, +103'h2695b7507e341d35b600000000, +103'h193dec9d1894dfe3c200000000, +103'h2702ba88bf2a97344000000000, +103'h1cf6cd1b176883d15800000000, +103'h1e8a2c373d6b3e5a1600000000, +103'h1e51a88919620b752c00000000, +103'h36ae04beb8ec37ac6800000000, +103'h0c34f828963de035801efc1ecb, +103'h39246f63ceebe4f43900000000, +103'h207f24f91b20dd1cd000000000, +103'h233be60395454c809e00000000, +103'h1ae4deba74c47179b800000007, +103'h2acbb7a6d600577d4c00000000, +103'h089e758772e53637c23da1d858, +103'h02921084dcb0edde988426e000, +103'h0ecaf802e64f63660a25300101, +103'h10c850faa8e173eae8f36e87e0, +103'h2ac6016fb6ac6bedce00000000, +103'h34a8e81c8974bce87600000000, +103'h1d3cbca7f23abe582c00000000, +103'h2a1ff49966e3a674b400000000, +103'h20e4a075c420631ca600000000, +103'h0e55b83fef4057b60e20081b07, +103'h033b8cf29124f82bd28cf29000, +103'h2b5c1ffd5e7ab06bc000000000, +103'h3860597ce0b63d5e5100000000, +103'h0a84f6190a125d5bae00000084, +103'h0ae9ea6b4372b6d8900074f535, +103'h1c73d6e94cf7acf19a00000000, +103'h0b7873d318e1975cde00017873, +103'h1b334e1b34556e462afffffccd, +103'h360085befecde2194200000000, +103'h1540743b5a0130347600000000, +103'h3f780fa95101b5f37700000000, +103'h0291427425422a2ed0a13a1200, +103'h38ffe38522ba39d82000000000, +103'h2e3c66af654b7c4c4400000000, +103'h3f7a1a0e1e4b5fd16700000000, +103'h1eb983604c87c680cc00000000, +103'h233b16e14d01e08eea00000000, +103'h0a76e43a6abb63ef3600000007, +103'h16fe2ddfcef67ad08200000000, +103'h00d0d756996d5f0aee1f1b30c3, +103'h372b474e2f6b8ceabc00000000, +103'h3a8797d4af3c64415500000000, +103'h289f4c4a6567ab8f8200000000, +103'h24ad7b909eef43643000000000, +103'h382909e1c68e8fae9500000000, +103'h3a10251dab3c0b3f3500000000, +103'h2a33a49ae2651520fa00000000, +103'h3ebecfa79d753a3ea600000000, +103'h32393e1886a8ded98900000000, +103'h2f423c380767ae812600000000, +103'h14874596b8a0ec99ac00000000, +103'h1c31641666e328d1b200000000, +103'h0250bcd4bb6a6e686c97400000, +103'h3118f46c989bd27ed200000000, +103'h2248da859aec8f538e00000000, +103'h0e19ad384b0583c02600c08001, +103'h22cda8bcae4e5e45c000000000, +103'h30ec12a97d680b7e0c00000000, +103'h16a64f151f35b43aba00000000, +103'h164d1ad44e21c6e43600000000, +103'h22f96a53a4c815f95600000000, +103'h1cf41818bc1530cda400000000, +103'h1456d15bdf0e9b214a00000000, +103'h2aef3ed9bd02b33a0600000000, +103'h0ea9733bd0598495e4048008e0, +103'h192bbd973a48c36fa000000000, +103'h1ec338c048f236ab7000000000, +103'h05694f0aa21df442aa00000001, +103'h2412188f00e12d02f400000000, +103'h161466a9454a7c0d9600000000, +103'h015f78332a5c949c96de0667e0, +103'h349cc0688170fb45dc00000000, +103'h0af7fce080d07379060f7fce08, +103'h2334665b776d33e18600000000, +103'h3ebb4be4006530c20700000000, +103'h049ec6092299971d7c00000000, +103'h0af33b742154e3017e00000000, +103'h1018245824f3a90aa0923da6c2, +103'h0eaa411daee6e47ec251200e41, +103'h0ca18ea540ff08d6e67fc77bf3, +103'h2d32734a4ea949f49600000000, +103'h2f183af0db4ad899d600000000, +103'h16f1aba2077d4be42400000000, +103'h2cb200d1f69586d4fe00000000, +103'h03715ed8cc87327704e2bdb198, +103'h26da06d438393348fa00000000, +103'h248d87697aaa9221c600000000, +103'h28be53e2e08498f5fe00000000, +103'h2484a7314412205f7800000000, +103'h2ad22cf6acd074425800000000, +103'h2a58e60510551b739c00000000, +103'h228a31353d27486a4a00000000, +103'h3d40155b66802e6f5a00000000, +103'h180819e1080a5fa49600000000, +103'h22a092a9044a74fffc00000000, +103'h3e8e26e49f528ee10600000000, +103'h14a3038a80f3218a0a00000000, +103'h12380e9fbe81486ea800000000, +103'h18d7795995244bf92a00000000, +103'h22c15913665c5a98e800000000, +103'h0cfdc7ae3e33d3f27c7febff3f, +103'h362d57d320f52d05e200000000, +103'h1ede3066acf2f4b42000000000, +103'h1cb354f363204c874200000000, +103'h3ee4d41902fe7cedee00000000, +103'h214a27311eb1d1e15200000000, +103'h22a4a74f1c96a5fa5400000000, +103'h10f21c213ce0cd2b7208a77ae5, +103'h225fdd7a9e85747a8e00000000, +103'h36cc1bc1f177909bcc00000000, +103'h28ea2bea92d76e166a00000000, +103'h389ee20d8aa389d85b00000000, +103'h0434655bf28db5c2ee00000001, +103'h2e4f5d24eb2c97d07800000000, +103'h0ae1e589ae60fd2c6a00000387, +103'h394bdc04deb05a515700000000, +103'h31595c5868923fdb0400000000, +103'h1af4926ee0de1bdfe200003d24, +103'h30bc6055d03778384a00000000, +103'h36e52b692a2c0aa72a00000000, +103'h18be50cddce86afcfa00000000, +103'h2529b60d92cd96662600000000, +103'h0e73372d2a8be7340201939201, +103'h0af430850eb59d4194001e8610, +103'h30a134841e28d46ebe00000000, +103'h3336a380291d04f3cf00000000, +103'h0699a8e258be3977ec00000001, +103'h048895788af4dcf81400000001, +103'h132d1f50508e85da6c00000000, +103'h3efa7d96d5171b52f600000000, +103'h12e4e0d129443aa34600000000, +103'h3e8d7d83663eb83a1b00000000, +103'h352af72dba23990b4200000000, +103'h3a56f6b278b1168eaa00000000, +103'h169a118a2edc0dbc6400000000, +103'h182167052833046edc00000000, +103'h02e774ba3ecd15f90a774ba3e0, +103'h26d11b7a98ee7cfe3400000000, +103'h046bd8c99ad5f1b87200000001, +103'h0ee2a3d502a70d330a51008881, +103'h028c734f4712e5fca63d180000, +103'h360358c294f589d1a800000000, +103'h0168bb341881fd20eef55c2a83, +103'h26a40f5e0e8555e38200000000, +103'h0e8670bb0eee11179a43080985, +103'h3d7bb814b6922075a800000000, +103'h0066894005189130b8bf8d385e, +103'h1ad3578c429449456e000000d3, +103'h04c57bbc02fad2857200000001, +103'h3ca5b1035cce2a11b500000000, +103'h2a1806c06093a5cdb600000000, +103'h1ca2edae1d3956d11400000000, +103'h12c21de146515d917400000000, +103'h08dc2099e4f44b3f921435d33b, +103'h1cc44d6436b66920d800000000, +103'h12401ffc3e9289babc00000000, +103'h24f549655c56d71ef200000000, +103'h3cfbd05fee96f71b3200000000, +103'h3af6a29a128c40808f00000000, +103'h2ca7ddf50e8810e07c00000000, +103'h1eeba30ac97eb37a8e00000000, +103'h2c863f3f7626916f9c00000000, +103'h28b7d28f5512347a6600000000, +103'h3775a65fc29873b9dc00000000, +103'h14bb8b10aa5046493000000000, +103'h3a80233c22c5eca8f200000000, +103'h176b4cd7368177b99e00000000, +103'h0768aaecb1019af5c000000000, +103'h3afe7cbc076ce7ccf700000000, +103'h18e494d48cd592b9a600000000, +103'h1890999606d40f75ac00000000, +103'h0ebe16111eb8a44a385c02000c, +103'h34ed2d81f7493de04000000000, +103'h20892cbfc40753f15e00000000, +103'h18fabeb738f481735600000000, +103'h18406024587dae331a00000000, +103'h393ea5dbb3786cea5500000000, +103'h0e8629734ab8cd0eac40048104, +103'h28d500fc42f772ea5e00000000, +103'h3c1859f8917d9c5dab00000000, +103'h2ad96127fa529d59ec00000000, +103'h0812d541b76af7527ebc1109e4, +103'h3205166a2144587a7900000000, +103'h20eeca7cea572dbc2e00000000, +103'h1e561aed5d5c44265000000000, +103'h161008b7bd4b0ea33a00000000, +103'h0434edd49aa129909600000001, +103'h149e2b6bf0b132485400000000, +103'h0f5e96bf76e6201cee23000e33, +103'h267b46394a844b88e000000000, +103'h3ae304565ae2e2485700000000, +103'h28ebec04005e2881a000000000, +103'h08a605f9fa412cd7fa73949700, +103'h1e46400ce22d18dbfa00000000, +103'h016ac5a8acd31ed5f41ef23f50, +103'h3a722d8ccb195ee2d900000000, +103'h36d7bdf28a84248b8400000000, +103'h2b7e7b3046f652184e00000000, +103'h03525149fcce100ada149fc000, +103'h06f94639a74c8b3b2000000001, +103'h16b99a0c2a9edc851c00000000, +103'h30fe126a309822bec200000000, +103'h1038dce08651bccaecf3900acd, +103'h2c41b761b74fcf351e00000000, +103'h2e971d1e0688ac15a400000000, +103'h1c8b5f5f72ca63775c00000000, +103'h3b17c45fa26180956200000000, +103'h1ef5e62abeecdff4d600000000, +103'h3b23d72af904a4547900000000, +103'h1eda7440d6fa8a7f3600000000, +103'h355b74ce131e61aa2e00000000, +103'h2d3df5f0b0f8d5eb0400000000, +103'h230d570824544ab91600000000, +103'h10e15c74109240a9c6278de525, +103'h14afec5f329f97b1ea00000000, +103'h2c9cddf48280f425fa00000000, +103'h3282a574d630e0852d00000000, +103'h1ebcb7ae42cdbe79ae00000000, +103'h18890a91775063ee8600000000, +103'h06f4f526940d1b9cc800000000, +103'h34e1d3e1ac96262e3e00000000, +103'h3aff9321f28b1b54d300000000, +103'h04eb10dbe96cef368000000000, +103'h0226f284626c82587262000000, +103'h166fefc9a65793345a00000000, +103'h174f133d2b7e85b8be00000000, +103'h08b9520580ee7582642b93c3f2, +103'h24908004563d88bf8e00000000, +103'h22d4305b9ef6dac50e00000000, +103'h066f73e742875ac96400000001, +103'h16893d2ba55b8b250400000000, +103'h24917bf26ccaff0c4600000000, +103'h0ad74378c3543c37ec000001ae, +103'h0e13e5c426e5b82a5800d00000, +103'h14d7e2d8f0bcfba31a00000000, +103'h00f76b12bed0e16740e4263cff, +103'h18e1f258d4a8c4403200000000, +103'h3220b5d6d4a02f52f100000000, +103'h3545317f2e8221abc400000000, +103'h2626a8caa0a2d7829a00000000, +103'h16d9017d54e80901c800000000, +103'h1c341e703a0eb1cc6800000000, +103'h372f6ab612e7b349be00000000, +103'h3eacd8a7ae1bd1b9f900000000, +103'h26cd1e1be44b3c700a00000000, +103'h24d56c91e2f81517b800000000, +103'h1eec6cd448c533339c00000000, +103'h28eb20606e9a9fc57e00000000, +103'h2305a5a68c870c99c800000000, +103'h3e6b675cb5722cfa3600000000, +103'h3ec93e2a9777d2a0c200000000, +103'h06ec482c16e339fd7600000000, +103'h3ca9f1f314ac78280f00000000, +103'h3eeea853da98c0542500000000, +103'h34a58baed742b2473800000000, +103'h02d441aa95315a9b1241aa9400, +103'h26e631a3c8d6e649e800000000, +103'h1ea499c50cab27f47c00000000, +103'h30fbc23a729159984400000000, +103'h18959cf71235f35d5000000000, +103'h1460d24ec331b597c400000000, +103'h1b02edf05cc7528ed6fff02edf, +103'h2a503186702824dd9800000000, +103'h2e2eceb4ca2b12cdf400000000, +103'h05435f40777b44546600000001, +103'h1e89a563e4aa13093000000000, +103'h12973e162aed7249a600000000, +103'h38ccfba6097717ad8c00000000, +103'h2a2dcc03db0e55c3b600000000, +103'h1109e0b614db5169be1747a62b, +103'h1c9008717e091d6d9800000000, +103'h1203a2768e12fe23ac00000000, +103'h10ee54292ca306952a25a6ca01, +103'h2ae75b9f7ea6a90bba00000000, +103'h16bbb47f9094fd34e600000000, +103'h02992acd3a7c58d4649a740000, +103'h3c899f3e90380d53f400000000, +103'h221d1a4512d138212e00000000, +103'h06573e574f5ad75fc000000001, +103'h3c265f9e7077f1a4d300000000, +103'h2b71d9b9f8cf2ffc2200000000, +103'h2af5612974f58f9a9200000000, +103'h3e4a20ba1e6769548a00000000, +103'h20f9b7aa8a5cca7dfe00000000, +103'h3321403fc8a6eb381f00000000, +103'h3f17f8d128a0a2e2a900000000, +103'h3c0440fd1ac1e3227100000000, +103'h1a57f27d98d9dbf3980002bf93, +103'h03086e7c16de1cf0b216000000, +103'h325fd5b2b1360f6e4d00000000, +103'h0b57dfcbf53e7dea62000055f7, +103'h3e11cd07a69e539d1200000000, +103'h0aa59636f2f63369060a59636f, +103'h2d177c56f1080070ae00000000, +103'h3ebf71e53aad96a7a100000000, +103'h06a5e55de6c512fe9000000001, +103'h342aac73a48484e3ca00000000, +103'h14a5a6f26b2a6a41b000000000, +103'h2428a1e1de5516b55400000000, +103'h2e593378f2fabda7c000000000, +103'h1e4ed80e96235f899e00000000, +103'h32c90188057c93029300000000, +103'h326d954322cb6b112900000000, +103'h13673fb396946c992e00000000, +103'h245ba7cbc80201dc5000000000, +103'h0c736f6d9a69418fe63db7f7ff, +103'h3a07ca11fec4e95bb000000000, +103'h0d678fc78c3858c94abfefe7e7, +103'h325bc216474022db4b00000000, +103'h2251f64152a7b2a2d600000000, +103'h2eb16bfc460374b91c00000000, +103'h38d5cb12e9556afa7000000000, +103'h0e3282f2d706d6f6b60141794b, +103'h2acf5dae0edca2099e00000000, +103'h1a13eb0c1d0f24fc7600000001, +103'h115bed2348de82aa843eb53c62, +103'h30f95a34e2f26db6a200000000, +103'h269d9e3d354e5ad9ea00000000, +103'h2b1e844f2447b50ecc00000000, +103'h0cae8f5d8ae5534c0077efaec5, +103'h361d1d167403d79b2400000000, +103'h057e188602b266f8ae00000001, +103'h042d6ecf78cf840f2400000001, +103'h2a247a27bd4d9c952600000000, +103'h1900d8cc027b0b649e00000000, +103'h3ce10f0b6c9f858c5c00000000, +103'h2273ac4384a05e585e00000000, +103'h02d5cd8ac2816d63ca5cd8ac20, +103'h1e858b6724f519a74e00000000, +103'h3cb054a826cae7321100000000, +103'h067aa375855072993600000001, +103'h14e5509b4000c7415c00000000, +103'h26d16b24c77b6ab6e200000000, +103'h1cb29f559c60bb522200000000, +103'h395ebab883322676ea00000000, +103'h1b5b48b49ee4c5cc86f5b48b49, +103'h3e589df2174380850800000000, +103'h28d15de6729ec939a600000000, +103'h2eaad92cf0f7672bbc00000000, +103'h36b67aea58c8c5122e00000000, +103'h1ca6e27446739e3f1e00000000, +103'h18daca833c2a19297600000000, +103'h08ad7bcbd8d0fb9dbc3ec02b32, +103'h2677944030abc620f800000000, +103'h1e0a71c6b85941ecd000000000, +103'h1b10ed8c60d0d62d02c43b6318, +103'h1541827b7edb47f3ba00000000, +103'h2443130858ec35801a00000000, +103'h26f069b62c2db7fb9800000000, +103'h22f70250d370cb03f200000000, +103'h3cce7118786134ba1e00000000, +103'h168127d3da58370af000000000, +103'h0920140f5926a8236a035e1619, +103'h26ecb8466ea7cff74400000000, +103'h192a278176c7e4069c00000000, +103'h02c8cb769cb49c4d0a8cb769c0, +103'h06bfa676b4dec3ce8000000001, +103'h24dd299a36a78f451e00000000, +103'h2ea27cb4fe6735bbd200000000, +103'h312fb3d663445f560a00000000, +103'h0e718744d0e6dc0b0830420000, +103'h20921e81c1168fe16a00000000, +103'h2a5a4503ce8817263a00000000, +103'h3289a141b11a35a7fd00000000, +103'h1cfd5cd59a747aabca00000000, +103'h1957f4748efe1bed7a00000000, +103'h14c91bf4eafb78c31600000000, +103'h1ec25a9b83536d37a400000000, +103'h1ad5ceea161c892c8e00d5ceea, +103'h315dbde476dee3c81200000000, +103'h14e3c8cc50b4b2b22800000000, +103'h23654c77401270969e00000000, +103'h353a3d59d4f63962ee00000000, +103'h1e2bb768f65b85da2e00000000, +103'h3cfc15402c95c3340200000000, +103'h2c8125c98ac17a9cfa00000000, +103'h1a18a6e986bd8fdd260000018a, +103'h1ea6616c733eb5a6b000000000, +103'h188fa1c98e575c903600000000, +103'h3f0ea55aacfdbdfcab00000000, +103'h2f4f2388c48d5fc63800000000, +103'h254d3194029c0520e400000000, +103'h0e89f545f0eb28a9a8449000d0, +103'h061e158815385a3daa00000001, +103'h2aaff3c6e4c24f839a00000000, +103'h12cf31cbeae0650bae00000000, +103'h3c8a74f1d69058d29300000000, +103'h1630e0c1695f8a9e7e00000000, +103'h070fa6cea6e9ff905400000000, +103'h18b0bc5f7c1ae051bc00000000, +103'h163236fc022a87206200000000, +103'h2b440a6b1cdb437fe000000000, +103'h28b56878b20d7a7be200000000, +103'h0b10c6169e5184e6fe00000001, +103'h2a8704064706ed5fb200000000, +103'h0e27c9165117b3765003c08b28, +103'h0ca3d1a63c9eb77c965ffbff5f, +103'h3f2d54b20ac68092e700000000, +103'h0e085ca4d66a52392204281001, +103'h24ea51f75697a6eb2c00000000, +103'h0ce3fac024a003900471fde812, +103'h2f7c5b058a8a55875a00000000, +103'h1cdb3bddd66e50477e00000000, +103'h20a46eef44eaab4d0800000000, +103'h3a0548ebe0c5e72ade00000000, +103'h38062678816a561a2400000000, +103'h0291598c7a6f9f060422b318f4, +103'h208adce7f575c57e8600000000, +103'h056f0b9076071f0b0000000001, +103'h0a192163d691fbf2f400000003, +103'h112d8d515c0107836a9642e6f9, +103'h10b19844e71a28e742cbb7aed2, +103'h06ab68b6f747b6389e00000001, +103'h30ac583406f94e7d8400000000, +103'h323f43a40ca4b7347b00000000, +103'h10d336977e510f68804113977f, +103'h148152723090530c8e00000000, +103'h0f772485836389a40cb1804200, +103'h1066451656e4dc163cc0b4800d, +103'h1efa1cdba65c009bbe00000000, +103'h2adf040976c245b21600000000, +103'h27543e43d4bc628dbc00000000, +103'h272d02223e9b66973200000000, +103'h3ceaa216e4efa4db0700000000, +103'h380442a74b1ca6fd4400000000, +103'h2ae028e9c60749142800000000, +103'h307871b9ff0b8bbb7400000000, +103'h34ac212168ebb4a53a00000000, +103'h1ccf7563d964265f3a00000000, +103'h100f70a38c104780a2ff949175, +103'h0d56b4f76adfbce47cefde7bbf, +103'h06a98506baef2d880800000001, +103'h28e809bb4645e27f7200000000, +103'h248ab4cf0cef67862e00000000, +103'h2f3da76376d771417400000000, +103'h20d056dc5b6226108200000000, +103'h0e5233dd489fcd73f80900a8a4, +103'h0519f35daa7024505200000001, +103'h06d11a6438c2582d9c00000000, +103'h3e5fb2ac3cdc4b8b4600000000, +103'h10507104c2ad65ef7ed1858aa2, +103'h2ce0fcd1410d189bbc00000000, +103'h32e1acee125d89a07f00000000, +103'h32a4b5387f3e8671c100000000, +103'h2f44090e3320335fd200000000, +103'h2c90c2d364c4e8985000000000, +103'h2cea95345208f1a68200000000, +103'h3ea1f135be99b479e700000000, +103'h1097d3a8ec8449ae3809c4fd5a, +103'h12ade97beb263ae3f800000000, +103'h3a88e7e73abe0e8ce400000000, +103'h336cd7f90e6bf808cf00000000, +103'h2aea7c84c8f4dff00a00000000, +103'h0eec6abebb61b7e9183011540c, +103'h1f1493dca74c346de000000000, +103'h28facb8774389f2c9a00000000, +103'h004cfb3b124d3309404d172229, +103'h20940adebb47fe90b600000000, +103'h3a3cd26b7a94f9cbc800000000, +103'h3c31ce661b2904aa8500000000, +103'h335f698d5665d715ff00000000, +103'h3ada37bdd297a57c1b00000000, +103'h3e9d047f04f70f097000000000, +103'h3ef4cb0bfed146c74300000000, +103'h197596437f6e4b464600000000, +103'h095c3890fc631652449f97615c, +103'h0ada805a94d8ac95c236a016a5, +103'h114fd72d9c34e526be8d79036f, +103'h149674c7e60f65815200000000, +103'h194b5da8765f3caeee00000000, +103'h16635cdb4af5b176d400000000, +103'h2a5408a3e2410f1f4a00000000, +103'h197999933aa46bfa9600000000, +103'h2eae9003e4f8749e7800000000, +103'h3842c3237c720e31b300000000, +103'h0ecca7b9ea209e3596004318c1, +103'h08979b6fa563615914fa7d1b58, +103'h3a06fb1ff2300912fe00000000, +103'h126ecf6ebac7a482a200000000, +103'h2748b1ef36ce9fa29600000000, +103'h254332a5483d6f115000000000, +103'h08a114b46e86210086139ada74, +103'h1e2effd692c953a5ce00000000, +103'h2e848f7b5a6a685a3c00000000, +103'h36a8bec2b8996830d000000000, +103'h050a5d1b681df7ac2a00000001, +103'h02f21c749ec6b66ee4e93c0000, +103'h12a32f73a2d1138a4c00000000, +103'h3cbeaacce4c32ffeeb00000000, +103'h20738e56f6665f728c00000000, +103'h2d46698d35250a3f7200000000, +103'h16dffb32549898966800000000, +103'h254aa061c2df02239c00000000, +103'h1678759018befd55f200000000, +103'h3e0caa30fd099db7b400000000, +103'h1cc5e91152821347cc00000000, +103'h0f17c088128ebd78ca03400401, +103'h03489a226e54a68a1c444dc000, +103'h0f387112bc6c67122e14308916, +103'h1931e5babeb501349c00000000, +103'h36ad6daa8ced72475800000000, +103'h24b7b313261f58021600000000, +103'h03169f05dcccc5aca40bb80000, +103'h1ae1f20ac08478bfca0387c82b, +103'h32624644429b17c5a700000000, +103'h16d00cc51e7d09d06600000000, +103'h215d2b4810df5014aa00000000, +103'h06b70f77a6af5cd9c800000000, +103'h2c956c67070c8821d800000000, +103'h170ee11c0cc397997e00000000, +103'h1e055fa1795904008400000000, +103'h36db2e3b9167e51c9000000000, +103'h346059af6e6d44be0800000000, +103'h38f20d45264872f99800000000, +103'h084758745aa8cca90877ca6ea9, +103'h12f5a7a4149ad9ee2e00000000, +103'h2a0bdbf05ce232628800000000, +103'h328f54faaed7da069d00000000, +103'h215b40fe9ae3b5f6fa00000000, +103'h2acff9ab8c730af1a800000000, +103'h06df8c46aece4bf04200000000, +103'h00d15144589e459bd0b7cb7014, +103'h2a9af0489f7dd1e27e00000000, +103'h2d484543e14f2326d600000000, +103'h3d68a530caea136f7400000000, +103'h3a57510df63258b35500000000, +103'h10e44286f49afde41e24a2516b, +103'h06ef05e26ef24ef21600000001, +103'h1b48ec64c0d691790afd23b193, +103'h3a8ce65686c5975b7800000000, +103'h100338fba00e83c038fa5a9db4, +103'h1a148984da9b6a16be00000000, +103'h121829002a9ea3126000000000, +103'h0cf259f484b32c973a79befbdf, +103'h0a92224458cb55976600000922, +103'h2b406e5464bdaf8bea00000000, +103'h268a247b2e4fd1d04200000000, +103'h0d727db45a904024a6f93eda7f, +103'h370e0384c11a649fd600000000, +103'h3b74deec8c8ce2543000000000, +103'h209969e0429ae5d8f000000000, +103'h360dc6a43d0fc4c57c00000000, +103'h2712638cdea92ea5be00000000, +103'h1631651554b6f549fc00000000, +103'h12dd48f1fcc958d6da00000000, +103'h122412a792fabdec2e00000000, +103'h0f7aa122a6d806de2a2c000111, +103'h297a5e4378fc1985be00000000, +103'h173110ae4776baa86400000000, +103'h02b11befeef118ebdc7dfdc000, +103'h002be51dc522299a22a7075bf3, +103'h247eb529c6d3458a1000000000, +103'h00cd9ebb86ff2aa7d4e664b1ad, +103'h229342f5ab7ddfd19c00000000, +103'h324a001baa4b7e8d2300000000, +103'h0622e6dbccdec182ce00000001, +103'h22cf1325fe28c19e7800000000, +103'h077a6a18074ba87a4600000000, +103'h14a3a0dba81abba04400000000, +103'h0c18562c6e9525b84a4ebbde37, +103'h126bcd000338c693f400000000, +103'h18e8057210511cc06200000000, +103'h22afe65e62bce9c06600000000, +103'h169282eafaa4ef327600000000, +103'h3b0a452fde54d590d800000000, +103'h20bace08b4e7587bd400000000, +103'h16bc73a1eef19dabb200000000, +103'h2e7b02fb8eac6bb46600000000, +103'h02de8187a568df5656061e9000, +103'h3496d5a494e3e251e400000000, +103'h1c36823d56c263d98a00000000, +103'h32c7cc81cd59397e1f00000000, +103'h1705827aa88fbbbb7400000000, +103'h20ac17c9da57883d4000000000, +103'h3e368f6af05d0ab7e800000000, +103'h34836ae592092281c200000000, +103'h34297fde513fb1ecb400000000, +103'h1e5f509284c31cd24600000000, +103'h20eca983faec9cb09600000000, +103'h14d70d2d594bed431c00000000, +103'h1aca9358793896c716000ca935, +103'h32fdcb704f0fa3f46f00000000, +103'h0ef4205a68da374ce668102430, +103'h24d711f51ad802bd3400000000, +103'h1205f0d2e8cc23179e00000000, +103'h386d6677cca3350cb900000000, +103'h2ee480111ea925dfa200000000, +103'h0d35d0f758168c576e9bee7bbf, +103'h055f249ac6fb0c688e00000001, +103'h27549b55d330dd5fe600000000, +103'h16ed471d969001faac00000000, +103'h252f18c4fee49d507e00000000, +103'h0a8776c3d4d1e46e140010eed8, +103'h36dae12b3800fd331200000000, +103'h355f28f2828873f6e600000000, +103'h097372b4786355221e8813cb33, +103'h1d6c59c6ecc27e14a000000000, +103'h023725477435f0c9182a3ba000, +103'h2202edfb10a24a900400000000, +103'h03572aa594d96fd77a40000000, +103'h1d0ebc7236dc5dd28a00000000, +103'h2088cc53783388781e00000000, +103'h1a38ccfdd44244ea540007199f, +103'h268b183836cb113dce00000000, +103'h04b6d34a1003de3ba200000000, +103'h1abeec2e768ef673d80005f761, +103'h28fa8d8afd45c9bdea00000000, +103'h0b7873d1d604b5ec600000bc39, +103'h24c16b567eff43775c00000000, +103'h0e0e4116c877b7493203008000, +103'h2eea0d4aec39229fb000000000, +103'h0c0ba33cfb4763b67aa7f1df7d, +103'h3f31ef1b6a3171016700000000, +103'h31577e71373d143e6200000000, +103'h2af4c510356f0359cc00000000, +103'h10cb2e4ee4c681cb02025641f1, +103'h32e8fb440ebb46db3700000000, +103'h3f38393aa086752a1d00000000, +103'h00c48b6f926f706e2a99fdeede, +103'h38bfe0fe52a7a9a8ca00000000, +103'h1481b858136c35185e00000000, +103'h3efed68d0b2c1616b000000000, +103'h0a0269ec1eadce6ec2009a7b07, +103'h29756db95eaca4fbce00000000, +103'h18901b2f68af0ee7ec00000000, +103'h1b16fdbdd0247ca14afc5bf6f7, +103'h28c9f662e8b497d0b200000000, +103'h162abd76c2cb958e8200000000, +103'h213829866c958bf16a00000000, +103'h14f4a47e02c049682e00000000, +103'h16d59c16e2f872ee9a00000000, +103'h026b2b8076ed176c9c700ec000, +103'h30cc50788ec2b3837e00000000, +103'h0ac30162112ddf03f60000000c, +103'h2779fbb3c0fa2f7c8400000000, +103'h252968f40abd30de9400000000, +103'h1ac5eda0f1372c92540018bdb4, +103'h1e2525d1556095865e00000000, +103'h32b23d05b12683274f00000000, +103'h063983b68e4ba8f8a200000001, +103'h257dfb4602fde5fe5200000000, +103'h32f99f67c93769b4e300000000, +103'h16d5d90feeb564fae400000000, +103'h28d895df60af0462ac00000000, +103'h0a26fba77684dd729a00009bee, +103'h2f73476de15d7351fc00000000, +103'h1cf6fce92a846ef97200000000, +103'h3730175f5af7b6675200000000, +103'h3318363836eeb3507f00000000, +103'h26853283ad1ecaafd800000000, +103'h394fa221213700e80e00000000, +103'h369e80b806bc336bba00000000, +103'h0ee515b63e0bd58cda008ac20d, +103'h1d1a5e04f6aa5644e000000000, +103'h186e7103848f6bfb2000000000, +103'h32f984ea22a9ca001700000000, +103'h1540cc3c7a183b039a00000000, +103'h3493e91bac11bfedbc00000000, +103'h0a915c3fc0528c2a3600000009, +103'h241e3b5ef4e67545e400000000, +103'h2254e47e3e77d185a400000000, +103'h18a3c8a124960ce49a00000000, +103'h3d046cb1c6eaf162d800000000, +103'h22b79cec9e8eba03fc00000000, +103'h3d51426d5c9326b5c200000000, +103'h1562b973bf4ac3a26200000000, +103'h130a3d5eba9c060fbe00000000, +103'h149cb2ac8efebf837c00000000, +103'h36bde1fe6108fce23600000000, +103'h35723805f6a5af8ec400000000, +103'h307151afed63918d2600000000, +103'h270c7169a2d5c9931c00000000, +103'h2ca650a6d2471b430800000000, +103'h13492cc63a538cacaa00000000, +103'h2e91b87466f9dd537e00000000, +103'h373dd5afb9430a19b800000000, +103'h22bfbc7e26d4c28e1e00000000, +103'h2088be8f9d12983dd600000000, +103'h18a54d4dbed254bbfc00000000, +103'h36bbb95f5e5b134b9800000000, +103'h0c152f8ab7006099588ab7cdff, +103'h084368442cbc19f8b67fb8de4d, +103'h2084393b78d149836e00000000, +103'h38975eeec014b1c79a00000000, +103'h310597eda298eb031400000000, +103'h1e743185da3049f1d400000000, +103'h389ee516ca35e1df7600000000, +103'h0c9ae22b28aa1365525d79b7bd, +103'h22ab91072248f87c1c00000000, +103'h18552ae62ee3daa74600000000, +103'h2a2f0eb7108f6bae6800000000, +103'h093ed4676ae4969496ed2179fe, +103'h0ef8ad7d1513a54ba80852a480, +103'h36fb7f0edd5279b31200000000, +103'h0ce22b47ea4b2730267597bbf7, +103'h3458432f6146a63f0400000000, +103'h06b2f1ab6e28d186ee00000000, +103'h2e214573228114b65000000000, +103'h32e212edeb340661bf00000000, +103'h20ee0798d8554bd4e000000000, +103'h3140a282ca375ec2ca00000000, +103'h2ebc0ef3aa25665ba200000000, +103'h10b8901adc6608de6c29439e38, +103'h1ae917a3cb2217d218000748bd, +103'h3e6eeb019adaa7ecf400000000, +103'h2b2c1d2236c3bf90be00000000, +103'h030eb59e7532aa925a59e74000, +103'h365756f91f5ec7b49000000000, +103'h36c21025e36d7d530400000000, +103'h1007713f98c4d44c22a14e79bb, +103'h201091ea0e86e4720400000000, +103'h244c5d26de8e55b19e00000000, +103'h06e6f0183e9ee79bac00000000, +103'h0cef005ca2eb44c28c77a26f57, +103'h2abbe4ed2ad234daca00000000, +103'h170fadefb6c135376e00000000, +103'h22f1cca3e17d1a249800000000, +103'h2e72d2f3b68cc8144e00000000, +103'h1cdf1e061b7e94b82e00000000, +103'h351d9df348f167abe400000000, +103'h031d5317e4d085b1fe00000000, +103'h309a226118ee23a54600000000, +103'h14a3b9be9a0b76bd2a00000000, +103'h152be5d44aa5991e4200000000, +103'h1aa57995de4952dcdc00014af3, +103'h06ef9309727538b12600000000, +103'h0927d0224f1ab247061eb132a4, +103'h276b83f8540a45507800000000, +103'h0c54d0ec9c321572c63b6aff6f, +103'h128770bdc29d996b1a00000000, +103'h0d2f494010f26a57b8ffb5abdc, +103'h12f1d4096279db157a00000000, +103'h2ebea4232ea924558a00000000, +103'h26bd89afc29af85eee00000000, +103'h215a08a770599c821c00000000, +103'h2ce8f1f6d6172631de00000000, +103'h1af1b65bb6712ed94e00f1b65b, +103'h36a39f16225a20d02400000000, +103'h16f0802f7d4bd72bdc00000000, +103'h2496fdcaf4ef7641fe00000000, +103'h0b54a1984adff6717c00000002, +103'h2683743eef76f43c7000000000, +103'h240c67b5b8cb95d4ba00000000, +103'h20e132585e4f0a13a800000000, +103'h10a5733d055b71c962a500b9d1, +103'h0a49aa93243ca421c024d54992, +103'h3564d625b6e2175ec400000000, +103'h164b978d012bc1f1ea00000000, +103'h16816307f4909817a000000000, +103'h1c12a04c4adc2fa4a000000000, +103'h06e081b2635d92ac9600000001, +103'h26907a773e7032f8e000000000, +103'h076c352e0450b4ab4200000000, +103'h1cd887fc6ae12f228000000000, +103'h3e210a6f704d64508400000000, +103'h00c71f8f0e25ec4cee7685edfe, +103'h02dd67a78d46f6bc60d3c60000, +103'h0644646b4d0e164b6e00000001, +103'h368c90518eeb7df2fa00000000, +103'h17222088562fe25e4600000000, +103'h04dd9d0c0cbc72afd600000000, +103'h3ee0104c22de93382d00000000, +103'h04f099d7a6bc30443800000000, +103'h1aeca156249c40905a0003b285, +103'h06188b32e88cda680000000001, +103'h3f00e7bf85797bbe2400000000, +103'h18c7d7844a9206f10c00000000, +103'h194af78d4a92eeb09000000000, +103'h3c6a5826a35ac634dd00000000, +103'h0b169327fca5bdc22600001169, +103'h1a3c49e7781015e8c801e24f3b, +103'h36f407980226a910c400000000, +103'h1d3eb3f91f62f2f83e00000000, +103'h26e4268f1456fa904000000000, +103'h2b2f56e73295ae895e00000000, +103'h288a9d281979d5187400000000, +103'h2a0c8c79c2a92bffa600000000, +103'h08f16ec3ad33c927bee153f209, +103'h3d2d4b9dd64055a18000000000, +103'h22fed7015e31c4652c00000000, +103'h214a377d5c5f10030200000000, +103'h223ec3f8ff5de7046200000000, +103'h0f67199c60a81e81be100c4010, +103'h12cfc4e142e6e27abc00000000, +103'h346a348b504dfc171c00000000, +103'h3263b438621dc0f85f00000000, +103'h2ebb1ae9d687f583b000000000, +103'h0cbaa01d08eba9bc127dd4de8d, +103'h2aa107caf8a6c4a5ea00000000, +103'h1ad56b90046164c2f200000035, +103'h2e27904d6e026c8dea00000000, +103'h1901aa8e8ad7d81dee00000000, +103'h0ac76e8bb8ff686b5e0000c76e, +103'h3733f72ed10112f9e800000000, +103'h2401e494dac88185a000000000, +103'h02d23e88d0fc78b47068000000, +103'h2b7a709ab6fe5d494a00000000, +103'h0a220b17f8d09bd21c00004416, +103'h3acab88f254b0c6cd300000000, +103'h063be78bee6d1784ca00000001, +103'h22a98f3d2a37d013ee00000000, +103'h35159437b173b79fde00000000, +103'h3f523504531d46dd0900000000, +103'h2ed9e23dc732db14b800000000, +103'h0ccea6fc048510190a67db7e87, +103'h14fb3bce335ef256d000000000, +103'h0c9b88403e2d9952d45fcca97f, +103'h16591b8f5328d5210800000000, +103'h264989f31ec45d614600000000, +103'h3abf086ff51d78f09b00000000, +103'h029379439a6702e3b8d0000000, +103'h0a95836a17260b53ae00000095, +103'h24c062b198b984974800000000, +103'h1caf9f5a624f08015e00000000, +103'h0abc54f3c70f6ab2f800000005, +103'h15300d70e4bf0a0d5a00000000, +103'h32c9d141af7b5f012300000000, +103'h2a1d19a9c2ab6c720600000000, +103'h06bf6a1336753db3b400000000, +103'h2871252fa092575d7800000000, +103'h2ee1ea596751c170ae00000000, +103'h22ce0e844ec2e6a04e00000000, +103'h1a659f213ca4d0f9b600000006, +103'h09726d71e072df7e04805907f2, +103'h1811931ffad87e9f4200000000, +103'h0f027a3ec54aec112281340800, +103'h12b647fddc5c7f311c00000000, +103'h150ee6b6aa5ef96fe000000000, +103'h36da64ed7c15416dbc00000000, +103'h157e61c3922428246600000000, +103'h346d4aaac8fe8d11e400000000, +103'h32b8b2c31d7ceed57700000000, +103'h1963144b52ea39803e00000000, +103'h3d22b74144a2ec435c00000000, +103'h3206825b9d06008eaf00000000, +103'h32e8da87db28b7cff300000000, +103'h0e4821898c2f3a2b8e041004c6, +103'h3c91a20b7e1814b36800000000, +103'h2e7e0ed0cd60363cf600000000, +103'h3c707c24c8f1d8487500000000, +103'h268ba148b76fe7194200000000, +103'h1cd6009834e0633e0a00000000, +103'h1138749b1b6c0486c2e6380a2c, +103'h12fb1edaf742051ef600000000, +103'h1eafa163477a79ba1000000000, +103'h20d40b04db7598950600000000, +103'h16d8d7e4782539f84c00000000, +103'h2749a94ad8f944fd2600000000, +103'h2cfc7fd02ed21ce19e00000000, +103'h3929d00f941bc62c7700000000, +103'h20ccb8e4001845fca400000000, +103'h3e94dbb0b842160c3900000000, +103'h3656437a980ecef03800000000, +103'h1ae9c82618a3aaa0f20000003a, +103'h149912fe0ef9ee1b8a00000000, +103'h0c60a3d2a8e3b641a271dbe9d5, +103'h3e6a4ab37c7cc93fb000000000, +103'h0a82c0848add6d125a00020b02, +103'h2c3ee0f68847b7c5d600000000, +103'h1ef4ef8412ca784a6000000000, +103'h388eb45341095940ea00000000, +103'h0ea542621efe48c4fc5220200e, +103'h30993d83568cfd183c00000000, +103'h1ad4f06a64323f7a5a000353c1, +103'h16db1b9bd4cb7cfdb000000000, +103'h14eaa00e2ea06d681600000000, +103'h2ef86d45867b8903ea00000000, +103'h209337951b6629121a00000000, +103'h3660415f095e9657a000000000, +103'h20f8c826a8f1cdecba00000000, +103'h3a31bc565e520f4bc200000000, +103'h1ae6398a014ad7726c000001cc, +103'h1400dfcfba7c93c8ca00000000, +103'h197a1c6d1662cd52ca00000000, +103'h04e526f72b63ad228600000000, +103'h0ea240cd02ddc98f9c40204680, +103'h1aaa321546c2f086c60aa32154, +103'h212eb72657653153ca00000000, +103'h3d16098a300f63691000000000, +103'h03610910903e1a8f6642400000, +103'h0c89d2268c542419966efb1fcf, +103'h1e758bc34eb52d2a2600000000, +103'h04c676b3dc3eff50b200000000, +103'h1d26c50d7ab48b140200000000, +103'h02c52df67f7b01c7de7d9f8000, +103'h36b7baf91aa1c6d55800000000, +103'h395f7525de66f4cbd700000000, +103'h17462ea3551eafc4f200000000, +103'h2ee17334cd7e24ead000000000, +103'h04f7b98e22c4538e2400000000, +103'h36afc6bcd0a5c6c2f000000000, +103'h06cec8b7549d80511200000000, +103'h2b0c7a76cd4d470de200000000, +103'h1ac85121121c0fc5360000000c, +103'h2d487b597e288a3c0200000000, +103'h0e6e6c54d8f0db5d1630242a08, +103'h0731dda1473956b69400000001, +103'h084295fb94a7c30b6c72ab787c, +103'h1e6f5e1b1ad9a0acb200000000, +103'h32c4b076a51c36a84900000000, +103'h200ade2f428b94c36200000000, +103'h128a629e7650453a0600000000, +103'h1ab1aa19175b23694a02c6a864, +103'h3eb2924068e58607c000000000, +103'h04cfb11004973020d600000000, +103'h0f7864a30249c2613e24201081, +103'h0e715d70061973714208a8b801, +103'h24c579a65691d8144400000000, +103'h24ff1be4650335844c00000000, +103'h26cfee434ac8af2aa200000000, +103'h2cea83036ec7cb0f0600000000, +103'h381e8b34d497b9525100000000, +103'h1ae46b7a80823c55be00000000, +103'h20ad814478a0c78a9400000000, +103'h323f4639128533051500000000, +103'h3098d63cb532b4498e00000000, +103'h048a1f92a671fa82a000000000, +103'h1afda53e560ad0bf54001fb4a7, +103'h2911f2749c94f051fa00000000, +103'h08ab72aff6929590521cf39fd2, +103'h1f77a734dea48804ee00000000, +103'h18b5d63c674ffab4e400000000, +103'h2afed60344c7a1e9c200000000, +103'h18dcc61c1e7d78262800000000, +103'h3c4d4bc5497c4e296f00000000, +103'h3f625973635914458d00000000, +103'h28c761d65ea6600ad400000000, +103'h16f40c231e08b97e3600000000, +103'h229e2e9606d01b549600000000, +103'h36c49f325cc42777b400000000, +103'h2f4424143f62560dba00000000, +103'h046a0900f526f5401600000000, +103'h3898a76be36b19545400000000, +103'h3297612b66d522554900000000, +103'h085a42629f6dc9c12c9bc5d1d9, +103'h1c7f79a790052aec9200000000, +103'h24cba62c995f6d4f3200000000, +103'h1082ec05f4dee6f6c2d2028799, +103'h250f54349aaa8d235c00000000, +103'h160986246a2d79295000000000, +103'h1808e300ce3ccd5dea00000000, +103'h3467ad2c654653825600000000, +103'h06a55e4ebe4f36832400000000, +103'h308d9c9472b6e3af8a00000000, +103'h06a35403795c41fe4800000001, +103'h2cf5d8d06ae9de92ba00000000, +103'h368eb11fb08d32963400000000, +103'h3e76bff21c830b669e00000000, +103'h3815b2741211bc864e00000000, +103'h2c10e6f450887c786c00000000, +103'h0af5fa074a9e2eec7e00000000, +103'h1a683fb076af15e0d000341fd8, +103'h075d90c042a50fe81a00000000, +103'h05649e565c0d4f989000000001, +103'h14f42864e26ae058d200000000, +103'h2e21e15fe6cf7eaf2e00000000, +103'h00feb03bbcc3a71410e12ba7e6, +103'h12808effaae58873f800000000, +103'h020fbd5c2ae438afb454000000, +103'h1309cc117e64c7af5e00000000, +103'h0ad359760174850b8a034d65d8, +103'h3e608dee937e511d0800000000, +103'h1ed34adb1f51aa930800000000, +103'h282a40775cb238819a00000000, +103'h30e5fdc2fa85835cb800000000, +103'h3816401a22afc3d41700000000, +103'h12c4d38e5295c1971000000000, +103'h0cc511958aac01b1347688dadf, +103'h2377881e5e70d53f8600000000, +103'h32af8203eb35e6d51300000000, +103'h26973fbd8cad6ef37000000000, +103'h2e14bf0e3f5cf0f75a00000000, +103'h013e401026f430b4e619386286, +103'h30d896519408efc32400000000, +103'h0aa8d36814472fd34a02a34da0, +103'h31267f72041fc624de00000000, +103'h15011c734ec8998cf200000000, +103'h20cfea297eef18fef600000000, +103'h3ea7a7a2d2f035724400000000, +103'h32c694ef72c01f9bc300000000, +103'h29054860f367c73e9600000000, +103'h2f0c955f642e5c2e0800000000, +103'h3002fb5ccc33a48efa00000000, +103'h06e996cc7a4039ee5e00000000, +103'h109051d7ed43354b2ca68e4660, +103'h0a9ed421f22ccc17a6000009ed, +103'h2adbb29a02bd1def9200000000, +103'h174c35a10f5bf2118600000000, +103'h3cfcf2967837a4ab8800000000, +103'h10f0e4d70e83da4c963685453c, +103'h1611a32f4a80cce30e00000000, +103'h1eef7f771a71b1ba1c00000000, +103'h36294dd0708354e96800000000, +103'h049ac0d55072d4608200000000, +103'h22900e26c69c2230f400000000, +103'h0a06285b4b36e3064400c50b69, +103'h0cedf449ecc6f12d0a77fab6f7, +103'h00591521f6cd19885493175525, +103'h05370a5a84bb0dd24200000001, +103'h0eb121c4041422f43808106200, +103'h25621c33ca4b2d4ebc00000000, +103'h26da07d098fc4f12c200000000, +103'h1e1f0cf5bd5e6b468c00000000, +103'h1c1f1fed223873172400000000, +103'h1f3355d8c357800ce200000000, +103'h2a92b9131e769ffa0400000000, +103'h0eee6b603ca9f5d2c65430a002, +103'h30a888f3e63caee5e400000000, +103'h369b199eb42b1a462000000000, +103'h3ce52a5666d3a33a0600000000, +103'h22a5db081d6ebcd8bc00000000, +103'h0210818c9953e72f228c980000, +103'h0ab7d6f6faf9c2373e00000000, +103'h068a46a77e0a43c3d600000000, +103'h2930599208c21abad200000000, +103'h274529554f4c61625000000000, +103'h3cade047b77cbaf45900000000, +103'h0f1059715cc1e449a600202082, +103'h1e7d165ed96fc4915c00000000, +103'h36abee0728801e02b800000000, +103'h1c272711c6fd34619000000000, +103'h391f1b10bea92268b900000000, +103'h30d8f3595ad0497a8000000000, +103'h0302903354ef648b3e00000000, +103'h3aac4b1004c857e49800000000, +103'h3a533a4e46cae817ec00000000, +103'h38a34bf543773327f200000000, +103'h12c3a716bcca6d763800000000, +103'h3ed366c3766db96b7b00000000, +103'h30ab7e54c93160823800000000, +103'h2a4e7dfe0704c745ae00000000, +103'h2568b0cf38b0459a7600000000, +103'h1d4d5116a2fec3987c00000000, +103'h0a9faac986677467b400000013, +103'h012364fea4b4c57e56ec153e7d, +103'h3eabe6796f547047de00000000, +103'h32e4ad8eb177d5468300000000, +103'h0b1c383c6e23bbbff00000008e, +103'h28bb3751e008694ea000000000, +103'h2a0efbe5aa24a18b0e00000000, +103'h1ab730c152dfd8dcf00000005b, +103'h3cd73ae37ceed4c29b00000000, +103'h0b1b00c598a60583ee0000011b, +103'h3b672ff6547d40676a00000000, +103'h16d800b21e98412d0200000000, +103'h0528aa4adaff71235600000001, +103'h2f6828a630d771d57600000000, +103'h334dac8575001c205100000000, +103'h08b070cc236844c680ec1a0551, +103'h3eab763fd4b5f14bf400000000, +103'h0ea5ecd6de666218161230080b, +103'h0e77d5435d11d857ec08e821a6, +103'h0349d9d02cb7c52eca9d9d02c0, +103'h1a8423237a2f9a722600000842, +103'h07745dc2be7974425200000000, +103'h10cafa7a18fd9765cee6b18a25, +103'h37336f895f71f5288c00000000, +103'h0b53a9c76f3cefa2a400002a75, +103'h18a37e77a5705f2c0200000000, +103'h246cc76a2ec408f37000000000, +103'h0833a7c28667876b142a1054c9, +103'h0a6c7d436ad44ed5440d8fa86d, +103'h3ae24266f207f697cb00000000, +103'h0ec866b67d7473db362031491a, +103'h127293f97656b6422800000000, +103'h1e8448a7871f1cf8a600000000, +103'h146a4c2ad891b0f21c00000000, +103'h3c584645f615f999a200000000, +103'h22bab43c4a8045c47c00000000, +103'h0173d874c8d88c0a7226323f9d, +103'h224c19a5ea934046be00000000, +103'h1eb60bc92b0718bb8600000000, +103'h1335f7860e5332617000000000, +103'h103629076d093e2a9c96756e68, +103'h160ee6933f3f35b0aa00000000, +103'h067ae465ce755eb81600000000, +103'h22edfaf3e484454b5600000000, +103'h0cb443e36cff29b1247fb5f9b6, +103'h2483cafd8eed24a50a00000000, +103'h3a9287c85ca168887600000000, +103'h1f16a34b402533860400000000, +103'h291f04197ab7bb4e6000000000, +103'h1e268e98d8ce5e99a000000000, +103'h251b3dbd42ed62b31a00000000, +103'h04b1556a2113f14bf400000000, +103'h266ca09d052f2f093600000000, +103'h00dfa71e4ae0847356e015c8d0, +103'h35210c39314d25105c00000000, +103'h2a4fd407312ccc2ea600000000, +103'h02928d21274dd867d634849800, +103'h1e047544509dac6f0600000000, +103'h0456e1dad23039902c00000000, +103'h1af67381b134aed47e00000000, +103'h20c2d157348b90af5000000000, +103'h0edd07948e8204310240020801, +103'h0c94ea40f044d588366a7fe47b, +103'h1d7d067d7f21dd1cc600000000, +103'h1e99d18e8ab6c75db600000000, +103'h16422d4ee733cddb3400000000, +103'h1d6c8d4046cd9f69be00000000, +103'h12dbc2b9dc0fccb8a400000000, +103'h076cd550387c59f8ea00000000, +103'h04b4af444a581cb2c600000000, +103'h2930571390c4f202fe00000000, +103'h15799e4c9479a1474800000000, +103'h1ad2b23e3ca9f85ad800069591, +103'h1aa82028d02396a76c00000150, +103'h22d5aac62cf648e5aa00000000, +103'h3cc82766869e690e7a00000000, +103'h2834454e287413d4a600000000, +103'h124a5b90a43c3b3b2c00000000, +103'h0e84087a8f7080895600000403, +103'h34b3fe4a20badc19fa00000000, +103'h22825d282e3ee4948800000000, +103'h38c4cfdae4f2e2deab00000000, +103'h33437dc8c6754006d900000000, +103'h3d32ac3ffe3a0fe1bc00000000, +103'h26dcb6d1307d8daa8200000000, +103'h3ec5a5f6ecb039ea8100000000, +103'h3ca177fb528cf0bbb200000000, +103'h3ef28a06925296b29f00000000, +103'h017dabf38ef40eadf238dd50c0, +103'h32865b8b0ce698b48500000000, +103'h103f450d0d6444a8126d80327d, +103'h02851f4abeeaa0331ed2af8000, +103'h071d903b1129e5402c00000001, +103'h18aa0fd952af048aea00000000, +103'h391d282c1acc94c5fb00000000, +103'h24f48526f376a49f4e00000000, +103'h0eb68254ea93cccb6849402034, +103'h0aa264c30e8851f25a00028993, +103'h193d4bbc1f3ed4474600000000, +103'h00a4c77b28e1390a54c30042be, +103'h1a82e7d9801e84c67200000020, +103'h20f4d50340c34c419a00000000, +103'h36ef141f5a46341b1a00000000, +103'h29282782bc3b091e5a00000000, +103'h054273f0732a1d3db600000000, +103'h1e7b45249b5244c07200000000, +103'h3a77629a5e94b8b0e400000000, +103'h30b9b42b3e0ffdd57e00000000, +103'h23370eda7887606fde00000000, +103'h06de86c76941149b1c00000001, +103'h04d84374cb7823759400000000, +103'h2366b8d31156aa3cfc00000000, +103'h3e052c06d52eedb1c600000000, +103'h132affaa7895a684d600000000, +103'h0e91e7e9369ad28baa48614491, +103'h1570f39d8ac5d2362200000000, +103'h2aa6a98ed957ba1f5a00000000, +103'h170b4d31eec8adbce400000000, +103'h38059759d86f574bbd00000000, +103'h129ab40d6e7aa47daa00000000, +103'h36f5a2f728803bd78400000000, +103'h34a84c003a1aefe4f200000000, +103'h1f23a2c6321092dc1a00000000, +103'h230e50d7e6b8dedc5600000000, +103'h1673a36744dc81a28800000000, +103'h315931ce28ead27a6e00000000, +103'h0759b019fe5e75e1b200000000, +103'h0e6ac141eeb7a7afda114080e5, +103'h3d34b146361157c9d800000000, +103'h30db22ed057c190bc800000000, +103'h0b6c670e42b0ca51fe00000001, +103'h255c2111328bed3f0200000000, +103'h2c0382c3fcf8544d4400000000, +103'h2abc3c40a054755e7600000000, +103'h2cf10ec90d57f8227400000000, +103'h32d6aba3761434631500000000, +103'h294835bce505432c2200000000, +103'h1cb2142396dbeecf9800000000, +103'h327067e8be24248c7d00000000, +103'h1486b3d05cd638b01200000000, +103'h2cb1341b0f46a098d200000000, +103'h2ae0f791e2cd54692e00000000, +103'h3ceca9d84f7e88843d00000000, +103'h0e1c80ab395f80161e0e40010c, +103'h3d22902e364c29ee6c00000000, +103'h386f404a0568aa99a600000000, +103'h168944cf028b3ac7dc00000000, +103'h0421d1d83afa7b11e000000001, +103'h2b19def79283bfe0e200000000, +103'h075e160556a591b91e00000000, +103'h270af7acc0bf70b0b000000000, +103'h0b43141c071d86b606143141c0, +103'h2875ab9d2d287e62c600000000, +103'h182c02ff376b927ecc00000000, +103'h1e87ec1a5ee13e1bf800000000, +103'h24a345e6370d411b3000000000, +103'h30dc266814952d358e00000000, +103'h283d854cb938731bc600000000, +103'h180a76b028149983da00000000, +103'h28b8a62f93521ed09400000000, +103'h2e7416ca2a5c9580bc00000000, +103'h08c4b49a52153bb04e68c7950e, +103'h1c4dc5864089527a7a00000000, +103'h1aeb6ff60a4e0714cc01d6dfec, +103'h28db3936669bcc9b0e00000000, +103'h222797f780873c911800000000, +103'h30893268ea6275c77e00000000, +103'h3e741f54cc8a0dbf0000000000, +103'h16ad13557d134027ea00000000, +103'h1481d3f13a875f7cb600000000, +103'h14ddd11e113472d23400000000, +103'h3e9c441266b646c36e00000000, +103'h36e4c4c5ba9417e18000000000, +103'h2b4085a0fb305bf3e600000000, +103'h1923a5f8f01520b9a000000000, +103'h193b39231a55a65a9a00000000, +103'h3e091310b2794c538a00000000, +103'h216b04dfccb48576a400000000, +103'h3afd52a2cabd98875900000000, +103'h06a4c11f6b289d672400000001, +103'h2aa1d5f6a625f009ee00000000, +103'h031837216ccab1295a7216c000, +103'h26431dc2d76c87200000000000, +103'h172b9ceb9a84be416c00000000, +103'h303cb97b80c7dc044200000000, +103'h3073c61556f378efdc00000000, +103'h1c7583d88730326b5e00000000, +103'h1ee3c8bbb6a3f880b400000000, +103'h3cd6cbe053197c593d00000000, +103'h1a91ab0932fd4514f200000024, +103'h0f400321eed410f546200010a3, +103'h0b1e8da60965bbfe7800000008, +103'h3ea110aad6a5bf206600000000, +103'h053d1008e2c44cc66e00000001, +103'h3cd6547be0655d714400000000, +103'h2343a9e424a26d7a2600000000, +103'h1116bb4ae078c1f6064efcaa6d, +103'h148f8bd202bc6bda2a00000000, +103'h3ccca91f92d327250b00000000, +103'h026f23de6662b2f70ce47bccc0, +103'h2eb40c17622f5c169e00000000, +103'h3971b646669e7ff50700000000, +103'h06ebcc4f94528c0c6800000000, +103'h2439097dccc44252ce00000000, +103'h2ae8f9a312b00ea26200000000, +103'h14c845def8e918203000000000, +103'h2246120fe2d211c34200000000, +103'h06166a4d369a57a23a00000001, +103'h36ab04dd5ae069b21e00000000, +103'h38efae0fe0f6d3ff5500000000, +103'h351d6f6296a1d8dcae00000000, +103'h121d42788e9186ec8e00000000, +103'h26b76d30c2aef64f2400000000, +103'h1632019b14cc38c7b400000000, +103'h24a36a04bc83a5f87600000000, +103'h0ab6ab4b12b5a7938c016d5696, +103'h3e5b737df75911984800000000, +103'h34af3200010fbce35a00000000, +103'h00cf2949be6b3061509d2cd587, +103'h0972c68bf51a62615234527553, +103'h22cc0b61b4e98bab1000000000, +103'h357e61cfbe5c52370400000000, +103'h0640752121285d98ba00000001, +103'h166db8d3d4a6bf687800000000, +103'h1cb55ee7dae734899800000000, +103'h16e690a6f354ed5d6e00000000, +103'h0f74149d0e0a4c454800020284, +103'h2729f62be4f0dcec3a00000000, +103'h148697233264f1894800000000, +103'h1eca6ca4188ee7b52c00000000, +103'h19632f826e157ed85e00000000, +103'h23063ea60cdfeb7c7800000000, +103'h0e9a2ab5e5431afee601055a72, +103'h2e93084f074959a4f200000000, +103'h271acd9d56e3845ad600000000, +103'h0cb811c405768ca9deff4ef6ef, +103'h3f3541672a915a473500000000, +103'h14f58c0937496c0b3800000000, +103'h32ff3050357ead726300000000, +103'h26ec58f20974397b9800000000, +103'h1f500e3dbd7369cbcc00000000, +103'h00451dd0a25fc2bdd45270473b, +103'h1883996ec2afd0fb9000000000, +103'h2440c27f42f4eecc3400000000, +103'h3b72250b5d78883af600000000, +103'h0a16f16340b94aba3800000000, +103'h3e1b8078fa2b6fc59400000000, +103'h34cfe08a47426128d600000000, +103'h2e792f67c45de1a1d000000000, +103'h029b06803a2dc22c161a00e800, +103'h19762852e8a6f193dc00000000, +103'h2a7cb9eb2b41f8141600000000, +103'h00c5acac44b82066febee689a1, +103'h1d6c810f2e34da522800000000, +103'h3241179e2efa86fe6d00000000, +103'h30bc9fc10c67080d9a00000000, +103'h1a7a1ff7fea81fabca01e87fdf, +103'h06efc095f164bf6cd600000001, +103'h229a3b860adedf64d400000000, +103'h2c3f3d7490ce9ffac400000000, +103'h024b4770b268db80ced1dc2c80, +103'h16ff71189ea818f56000000000, +103'h1c185a2d60f360661200000000, +103'h2b1022a6f8f2d17eb200000000, +103'h0ad68b1b540b2bac120035a2c6, +103'h1e05cf107e1b4e530a00000000, +103'h10dd2bfb0af1d96e5ef5a94656, +103'h22a7e94ba8f7a87ede00000000, +103'h2f65781af8d4d479e800000000, +103'h0c2e32965b7cbdc590bf5febed, +103'h2a123b64c8e235e08800000000, +103'h12e81da196106876e200000000, +103'h22b5a85d4122a3dbac00000000, +103'h2b580792d50ac17d4200000000, +103'h0e77248df6c069da8220104441, +103'h3b787769a218716d5600000000, +103'h3c8a32bc308f95fb4f00000000, +103'h3ebe91ea6b080d64f000000000, +103'h16fdb295e69240212000000000, +103'h24fd3d1be550d20b8a00000000, +103'h1415390f3b4e84a17000000000, +103'h34bccafdde4bc1bd5400000000, +103'h3e6c6a517360facc9000000000, +103'h2eae49c6261dc5ca6e00000000, +103'h0240fb46648a301be246640000, +103'h12223168123879e20800000000, +103'h034f2947177975286ec5800000, +103'h24dd1bf2a89ba6908000000000, +103'h2c88d468aaeacfd79600000000, +103'h1abebcfa8ec7ebca405f5e7d47, +103'h1d2d1f6e7c50c032ea00000000, +103'h3214f70ad70f7d2d7b00000000, +103'h32987537b33c9c9bf700000000, +103'h1f06c33c265193a6cc00000000, +103'h183cfd0ad8ea08de8000000000, +103'h0ec3f70c76f0cc1aa660620413, +103'h1a5a6e3b8e2dc9257e00000000, +103'h1a2d82069cf1c031f600000002, +103'h01522978784c2e6d84cf2bf2fe, +103'h0060d9c8d379b07422ed451e7a, +103'h37605633d4cbd9ec9a00000000, +103'h3a8d9bc4542cb3b56d00000000, +103'h1caca186ca8d09e94000000000, +103'h3617d5b6c41aa5ad9400000000, +103'h24fcba5ae2c747345e00000000, +103'h24ad78eb98df1ceb2400000000, +103'h3a8aeb31bcdbd7460600000000, +103'h18f56761228950319e00000000, +103'h3d7a893e1d143b635c00000000, +103'h02c6f24f7509a2c47e00000000, +103'h22f2784bf2842c029a00000000, +103'h3ef9d58e744b1e520f00000000, +103'h3c8a8302963d969e0000000000, +103'h162f6bda15376c2c7600000000, +103'h24ddf77610c1ef2f0c00000000, +103'h2610af14a6f15b092200000000, +103'h1c8e85054ccf527f3200000000, +103'h2949f193f2e00193da00000000, +103'h0b3cca4f0f6e869926000013cc, +103'h3ef1923936b8782d1900000000, +103'h1897b52c82f5427c2600000000, +103'h3f0d2a9f00e6d4b55d00000000, +103'h1762a1a5587e89e1de00000000, +103'h3d269f44d68bb480de00000000, +103'h18a315116cee56263600000000, +103'h3914cd5a2814f56b0d00000000, +103'h166d5a5840b80a7c7800000000, +103'h0e44713838ccd7d6a022288810, +103'h1aa73c99113a322ee2000029cf, +103'h14f85e201e7ea3671a00000000, +103'h345e75123825e0002a00000000, +103'h167c9680cc1e3e204800000000, +103'h33678fc6037cb3328300000000, +103'h1c8cbb3a18f949b34e00000000, +103'h26308a154a60d9795000000000, +103'h28fa38f0a8ed94b36a00000000, +103'h36e225ec4e1e1ec8b400000000, +103'h0946c61a761857b95caf48d195, +103'h32a4affbecfa7da5ab00000000, +103'h26637356b44143c02000000000, +103'h040fcb64e6e5f3bc0e00000001, +103'h2eda423bce496712c200000000, +103'h10bd10cc13593277aab1ef2a34, +103'h1e9a5d02013374b37800000000, +103'h20b8ecf810f0857f8a00000000, +103'h0abd70aa2e8ae2818a02f5c2a8, +103'h030b5b6f1143cf799c6de20000, +103'h0cb278ab9a014023ca59bc55ed, +103'h188d0a9b9e0c9b92da00000000, +103'h3458220b2abf143e7600000000, +103'h3eae1bfc434c1eda1400000000, +103'h1a47e566f6a440e53e00000000, +103'h10e2eef577525ce182c84909fa, +103'h248a9416d09a42487800000000, +103'h22f14d76a07d313dee00000000, +103'h24a425b08407c554be00000000, +103'h1efb3ecfa6f912cb5e00000000, +103'h0ca4b4d04c9d387be25ede7df7, +103'h0ce86d196a98774b8a7c3fadf5, +103'h2aa956a0773d2c1bd600000000, +103'h0e72057c432599354010009a20, +103'h1933c7236eceefd5b600000000, +103'h2e92c1467d40f551fa00000000, +103'h2e8a32b51574bc756800000000, +103'h24bed03f83077dbbe400000000, +103'h1f1906ff3091b070f800000000, +103'h06422d94955080b07a00000001, +103'h2aac497bf56987afaa00000000, +103'h228b21d8baabb5443e00000000, +103'h1d7177f16657fec03200000000, +103'h06e97e7b08e32098ee00000000, +103'h06b205b52754988a5400000001, +103'h38e4149eec3e17055c00000000, +103'h26c1d8ccf2f01cba8200000000, +103'h3af79bbb2cd431597100000000, +103'h18107f4252960a266200000000, +103'h1b7dfb53ce8da5e18eff7dfb53, +103'h0b298e6aa69e2523e200004a63, +103'h2ec53e3c011c2077b000000000, +103'h3d351f66cd45aee25700000000, +103'h1f3b0ab7fa0aed1e5600000000, +103'h0ece9beab6400c852220044011, +103'h25005241567b173d1c00000000, +103'h3c4e290fa549b327d500000000, +103'h1ee1aec04b4a05692a00000000, +103'h3c80218f46982e78cf00000000, +103'h105ea0e36479dd3918f261d526, +103'h3ab83774a0f9fec85e00000000, +103'h085b812db1589fabc4818f433a, +103'h2248d04fea10d7206400000000, +103'h00ce4deaf56c584e161d531c85, +103'h04cda8bf16b5289e0000000000, +103'h2ac7025b96837688f400000000, +103'h0118fba3dc511f480ab50d75f3, +103'h017bcc0c871821a3a249f6d814, +103'h374af4c347311d477e00000000, +103'h00cf461806ace95404be17b605, +103'h22d70df5bcf7de174a00000000, +103'h212ff51b7ec7242f5000000000, +103'h24a0fde4e09e32250e00000000, +103'h2f4323f5c2ce27408c00000000, +103'h0092335aa66f25256c80ac4009, +103'h0ed920d6d6b2491b2e48000903, +103'h1ae7328257447c75d6000e7328, +103'h06937652e51d9d4cac00000001, +103'h370de163ff04cfcf0200000000, +103'h0cf7719a84984621e67fbbddf3, +103'h38934aec3aa62785e500000000, +103'h3a73a0b3c69d99206800000000, +103'h207193c7ff30e40ca400000000, +103'h047456ab38a484c06a00000001, +103'h2c0f5fb0591618886a00000000, +103'h1050903b5c8a6f33a2e31083dd, +103'h3d2f59e6ca99cee3fc00000000, +103'h263f079edaea5f1f5800000000, +103'h08f33a175619b90622754188ba, +103'h04bd85183d58c0a4fe00000000, +103'h1f123f4cc64bfabc5400000000, +103'h0000c8654b097fd49285241cee, +103'h3ed9b09d291bbf215800000000, +103'h14cc51db2a1c8786a200000000, +103'h2617b3be28f63823cc00000000, +103'h3eaf105d7cc289fef600000000, +103'h204fecd162da3dbd1e00000000, +103'h2c0c8866a0894e1a9c00000000, +103'h22e5ab8282d93aebfe00000000, +103'h02b506c22ee5c352a061170000, +103'h1f46ec00d2cb6ed52200000000, +103'h1cb30efc948075975000000000, +103'h3ca88012f2c761982300000000, +103'h1e772c154e7a7094b600000000, +103'h312b9b6a4c22f0a7a800000000, +103'h12ab79946a9a1cbcf800000000, +103'h0aabcd55dac5b827441579aabb, +103'h337382af6e7131bbaf00000000, +103'h2ab5a89db91cff118a00000000, +103'h2e1abf33aa9081c0f800000000, +103'h1f19f28697462a5eb000000000, +103'h28dede00c460e9925a00000000, +103'h2014fb36a27adc18f000000000, +103'h1068177e0b59ba19b6872eb22a, +103'h2a4bb5866a6eb5505800000000, +103'h1c757ded7ad6ccce6400000000, +103'h13002fe6e6228254ce00000000, +103'h2b05bdf9429800424a00000000, +103'h0f650625549830293000001088, +103'h1e3303a1be9dee227200000000, +103'h28d7cdec8f02f447c600000000, +103'h189f1a8c2c35f7e98400000000, +103'h0afe676e140dc5d612003f99db, +103'h10f5e4792cace0623e24820b77, +103'h148b4fa6b6ab47d05200000000, +103'h2923af1c06a12c497e00000000, +103'h26f2067ada2c7bf03400000000, +103'h3ace23afc2502b0c3b00000000, +103'h39572146eb4231871600000000, +103'h2e8b66ae64105536d800000000, +103'h2860d85f5c67767dc200000000, +103'h3e62c6008af2dd2c2600000000, +103'h18b4deadf553b58b8400000000, +103'h1a4928e272b67b8c0e004928e2, +103'h02edc84dca6b5a3a02edc84dca, +103'h06f9de36e6b4831c7600000000, +103'h14f8d14c28a24b6a4000000000, +103'h194b79ecee9c29a12600000000, +103'h0e549e19c294faed4e0a4d04a1, +103'h0ec91c809ae074da3c600a400c, +103'h36f21e03e93512f40000000000, +103'h04bd6af178fe2f749a00000001, +103'h0324e1802ef04d788449c3005c, +103'h022152fc32adb869fc40000000, +103'h1cfe395274d299ea2a00000000, +103'h2010329cb6f3ece65c00000000, +103'h1d205b5b94f22638d200000000, +103'h0620d192f40258d58800000000, +103'h24cf00345222b4311c00000000, +103'h364fc8bfd94385c41200000000, +103'h3ec47e31bd1285f86400000000, +103'h1c2b59dc72624eb83c00000000, +103'h2e948e5cb326cce9fa00000000, +103'h1320770e0e5226c66c00000000, +103'h0eefe5837ce6b5231e7352818e, +103'h08d1d9f14e072c312c6b7ae031, +103'h36161d175cf711b4a800000000, +103'h14812d2766c8eba5f600000000, +103'h033e63fddcdf08bd54c7fbb800, +103'h2ae24ff7716035e4ba00000000, +103'h228d6822329e99e29600000000, +103'h372f92019e80e9da0600000000, +103'h309aa787010e51fc3a00000000, +103'h06e4c5c9b73de3fdd800000001, +103'h0c8f19f126d88b84d86fcdfaff, +103'h06d807fb2cbd514e8e00000000, +103'h1ea1dfdf394c6b3fb400000000, +103'h377a09bf8124733ae000000000, +103'h0490179d9ec6531a1800000001, +103'h397eb10096405cd99900000000, +103'h182a9bb21ad074773800000000, +103'h3322f1a3554f2577cf00000000, +103'h0a3fbacf6c79c129e8000001fd, +103'h0222d7159e9cb2cd3cc0000000, +103'h114650356adc6d9caa34f14c60, +103'h3a3a3dcc6cff44b24800000000, +103'h377d50db3e4594e7b200000000, +103'h213a2513f97fd2b42000000000, +103'h2a93ac19eefd238f5e00000000, +103'h1cc9a0bc913748a35600000000, +103'h3cfeda117acaf4bd4400000000, +103'h1a79a84e16949579d4000f3509, +103'h3174493ed4936f8b4e00000000, +103'h366c0dbeef0d17d96600000000, +103'h0a9b1ae2608161183a00000002, +103'h1a951cc316ed6ed728000004a8, +103'h0023b41da08889b988561eeb94, +103'h3a45bb037a1da67c9f00000000, +103'h2274d9c2bb415a9a4000000000, +103'h2c25599a3487159dba00000000, +103'h0ac34848d8fbef60760000000c, +103'h0ae9c0b1042148faaa000003a7, +103'h062ddf95cee491438200000001, +103'h3cb35914dace51f48700000000, +103'h26bfe831a0fc318a5600000000, +103'h2ac866aedcaf8a9f3000000000, +103'h30f22e26c36f72d0d000000000, +103'h060086e22d37d97fac00000001, +103'h36dd31921e2a07a66e00000000, +103'h06b60dcc652a8e889c00000001, +103'h333e74a5dd07c01abb00000000, +103'h22364e5022bdcde71e00000000, +103'h3f66017a16fc428cfb00000000, +103'h38bfbc4a793290dd1e00000000, +103'h174405a3769892573400000000, +103'h12d00f172f584ea1ac00000000, +103'h3019e672049c54452200000000, +103'h24600059d76c635c5000000000, +103'h10d8ab1ec68649ce542930a839, +103'h32e9e83aeae64a282d00000000, +103'h025373f8babef546f2ba000000, +103'h165953fbaca8dd81de00000000, +103'h02cb975aeefc517a98bad77000, +103'h36c424888755a5764600000000, +103'h14a2fbde48213cd13400000000, +103'h2c40c87afee56159ba00000000, +103'h3287729992885d380500000000, +103'h28ca6e32c0c925b30200000000, +103'h22630f423350984c9600000000, +103'h261ced22db1b067f5600000000, +103'h2abc2c5d3e7e15c18800000000, +103'h00e3c8cfa49b02e464bf65da04, +103'h16d48af50f572f41a200000000, +103'h1e15e5670e3af8114600000000, +103'h02724658650f83065619619000, +103'h254cbd0b4425686d6400000000, +103'h2cc236a28697aec5ca00000000, +103'h028edf7b6ce46bd10eb7dedb00, +103'h2696806598a6a2739400000000, +103'h30ada4561a3581ef0000000000, +103'h3eea30b400cc02549900000000, +103'h14be6bd7b279a6aab200000000, +103'h147712cc7163d75eb400000000, +103'h2ed65c34c52243366600000000, +103'h216b278c1a995602d600000000, +103'h14cbf538096fb2379c00000000, +103'h3aa6698ea8dad9c3b600000000, +103'h12e4b543fea6cefbbe00000000, +103'h2e45442fb84d388a6600000000, +103'h243f291e4a31edce6400000000, +103'h22a8c044797731fe1e00000000, +103'h08ed312e5cb65b1c682db5191a, +103'h2ed87113ff5f1b60e200000000, +103'h0d10e984084c4c8f3eae76c79f, +103'h357b4fc27724bda33e00000000, +103'h175ce7ff0335a7274600000000, +103'h16f4db57f6b0f6e9bc00000000, +103'h14ebea11cf0ddee8be00000000, +103'h1b2f455ae402ba40b4ffffffe5, +103'h16975e4738eea4528200000000, +103'h15351e5ad21de9ad6600000000, +103'h0883d55828b547f49e1b49565b, +103'h0ce06b3e3cea664f707537bfbe, +103'h323fbb65046e3ba79900000000, +103'h128dafde504ea6e5d400000000, +103'h02f98e05048e624adae0504000, +103'h1d1ab420561c12292a00000000, +103'h3026408b1815a02e2e00000000, +103'h0aa0089d7430544e84140113ae, +103'h37687795a75694d99e00000000, +103'h24bf48d8b0f69d771200000000, +103'h2a322c44e65f150cb800000000, +103'h08baafdf4d1e5de56ad2791d13, +103'h1b7387c836508a2a50ffb9c3e4, +103'h1482f48abe0b3a099c00000000, +103'h3e88fec4587ec1d1d300000000, +103'h0eee1e0aac01b65c90000b0440, +103'h2c719b366a8ab520ea00000000, +103'h3f45a28c7a78d32b9700000000, +103'h1124e3ec26ea6e62021d3ac512, +103'h3a82e71da53010ee7d00000000, +103'h10e2a0abb554f4daa2c6d5e889, +103'h12cd0f5aaed7dbf84600000000, +103'h0f30513540ba7ca3fc182810a0, +103'h307e0171d2878bfeaa00000000, +103'h38fbc29ce2b7dd33ea00000000, +103'h34ce78a29335dea5be00000000, +103'h1e790aa08b31a142a000000000, +103'h0ade19427e0019e53200000037, +103'h08cab3e31f792485bed9cbb350, +103'h296f2bb7a8573dc83c00000000, +103'h1b498231f021f1ab5afffd2608, +103'h195579eed8911d630200000000, +103'h16618b90f2da9f94f200000000, +103'h30e6c1b8cc301983ca00000000, +103'h34c335a8e291a514be00000000, +103'h26c19b44537866cd8a00000000, +103'h32511e42c73b9c766d00000000, +103'h30bb40d62efd37babe00000000, +103'h3b557ced614e55fd8700000000, +103'h26815e19510996d3b400000000, +103'h2525a612cb5f13c11400000000, +103'h2b058a82b0e071da6400000000, +103'h1ee2a6ad550617ed2e00000000, +103'h330e18d5810ba26fdf00000000, +103'h164321d15eee491d3200000000, +103'h04d73e8e52fc61f2b200000001, +103'h224bcd25a93f83c41200000000, +103'h16c673aa2f16c2526400000000, +103'h084cbc9e90628f780c1719f34e, +103'h1ac14eb0262903223a00000003, +103'h3f3242b47175bfc0cc00000000, +103'h0ce2ba7cca370e70f27bdf3e7d, +103'h06a9f4978a6951256200000000, +103'h12d3be2a574c0ba22e00000000, +103'h06268adf5cf60039b800000001, +103'h28ef175530c9be640e00000000, +103'h16eeb23bf6f049436a00000000, +103'h0e579e481edf60989a2b80040d, +103'h1d0c95f676ce12d49000000000, +103'h08b78dde8525b11cb0c91e611a, +103'h232c442aa33247132600000000, +103'h349143ba2ae9d4f1aa00000000, +103'h24d5a3e24c16191c4c00000000, +103'h0ae816df00a75cd6760000000e, +103'h34203af8657d00b8c400000000, +103'h028aa624ee651797c4154c49dc, +103'h38dee643248552902a00000000, +103'h3d493f7da60ff8b51800000000, +103'h025af58e9eeedef83cc0000000, +103'h2ce9ac585c381e75e200000000, +103'h04dd7ab9de9314048200000000, +103'h03569bab8b7cc05cdeeae28000, +103'h24dfb5524f5a3b16bc00000000, +103'h2657adf150b0d6c24600000000, +103'h0507c50636908c149400000001, +103'h004af01f9ce83a05e6999512c1, +103'h070adb95e2efff0c1c00000000, +103'h1c250222e23aef2bb800000000, +103'h02efff722a45cac19af722a000, +103'h1f4b88d6076acce47e00000000, +103'h168f4c3fc95acc56a800000000, +103'h32c30eb5a6a6552caf00000000, +103'h3031c0573d35a16c7600000000, +103'h18e63cba6ef8b0221c00000000, +103'h060586021e2a70795800000001, +103'h3c7f9ba07710ad33c900000000, +103'h18a0066b7c163335e600000000, +103'h30f612a2f895ced65e00000000, +103'h3844cefc9035d541da00000000, +103'h20bdfbcf832be7e4d400000000, +103'h3e47d5d63a70b6e16400000000, +103'h18e7e312da2eb2b0e600000000, +103'h2c1dbf25d97688872200000000, +103'h1289707ab25e6b99fc00000000, +103'h382109b45f7c2abfd600000000, +103'h1a2959cf71059b3a88014ace7b, +103'h19605c9b6a26a4eee600000000, +103'h2e0de7ee854ffebe5800000000, +103'h3619dedb9cb05b59c200000000, +103'h1ca200888abe43484600000000, +103'h342fbd7000d82223e400000000, +103'h36e41f465e7a22ac6e00000000, +103'h3ee87fdb12a9e01c7100000000, +103'h229d3bc98a8dff62ce00000000, +103'h11103b0048767f3de04cdde134, +103'h015b5c5aea13bb076ab78bb12a, +103'h0e20a061fa23f607b2105000d9, +103'h308fc4857c7f52629c00000000, +103'h1a8ce80bca9ff2c49800046740, +103'h0e008acffb2fb74a1400412508, +103'h2a87e89b96bc9f55de00000000, +103'h03333c6ee4bd2a25dac6ee4000, +103'h165de2a4cf4512c17000000000, +103'h37287b9f53784f305400000000, +103'h1022cbe3e8d631d522a64d0763, +103'h00d9bb7e5efead7474ec347969, +103'h144dd53eaf2179585e00000000, +103'h360701c06efb34d6bc00000000, +103'h2c387d7283490a156c00000000, +103'h0b402af9ba500bd5da000500ab, +103'h074685f5668889485e00000000, +103'h336e5a4970c8b4421900000000, +103'h0e916374370f3a377e00911a1b, +103'h2cfd76b46b7d9480ee00000000, +103'h04b995ca780ef7f52400000000, +103'h02fe3e28e40c6ea98e8f8a3900, +103'h310b9ac968c604740600000000, +103'h152831a16ac4429cea00000000, +103'h24c25cfa5acfdd665200000000, +103'h2a6b80486ef80f07bc00000000, +103'h1621124012ba6c021600000000, +103'h289ca8abbf25ec4a8600000000, +103'h26dc81b45446fe8a9800000000, +103'h3cec38233ce3a7365600000000, +103'h02f3fd99e2c028eaaa9e200000, +103'h1cb62f12a0ac610de800000000, +103'h329e4cd5e2a05ea7cb00000000, +103'h1ecd6923be568dba6a00000000, +103'h06e02ca7f2f4da904e00000001, +103'h10b31916d0c243b40cf86ab162, +103'h3d32669396a2705bfe00000000, +103'h0a5212b826558972ce005212b8, +103'h16c84c972287f0066400000000, +103'h163361066cda02be8c00000000, +103'h2560b929c4a24f55ae00000000, +103'h0b3081a91ad5b05c1c00026103, +103'h1655d39b3f366985e000000000, +103'h04031593c966eb2efa00000000, +103'h208a5a4adebcbeca3800000000, +103'h00b3ee57a4bfd45e02b9e15ad3, +103'h3ab332c0844a2ea8e100000000, +103'h34e8e0af46fe1d008400000000, +103'h368579cd00b14fc10a00000000, +103'h16ded1b4f49a30705000000000, +103'h1cf7fdfaea1faa3d5000000000, +103'h275b58e9c2fe7bf24600000000, +103'h36bcd0d91ef679ed3000000000, +103'h06cf98898451d2d6f200000000, +103'h0d7c90aa3a0ea3b010bf59dd1d, +103'h3e49330840de3c399400000000, +103'h311451588e5acce3ce00000000, +103'h02d5e9960ca3ffec10f4cb0600, +103'h16e954aa7cb851449e00000000, +103'h260b636efe8e3adaaa00000000, +103'h370bae6d16778f852600000000, +103'h1566c64efc82f2f42600000000, +103'h3f65de1cf28ea1613d00000000, +103'h251d472f86f567b03800000000, +103'h0b62eb1cc55b45cd2a0000058b, +103'h06201e8f29788cfcb000000001, +103'h3f6044f5b4db78197500000000, +103'h282f0cbd7afb96a89c00000000, +103'h18f33c357a5bdb9e5000000000, +103'h0c12b17aa28ae85bcc4d7cbdf7, +103'h2aaab3bc7d7e24914600000000, +103'h3a1e2e17c890d60be800000000, +103'h068d3f1bb23b89c86400000000, +103'h0d582bbdef59b7e02eacdffef7, +103'h36ae00bbf4e6f6fbe000000000, +103'h1a81fa4b423f22b9ce0081fa4b, +103'h08e6c9e678ed2375c405f549de, +103'h2a87234a136f1dc10600000000, +103'h3881348ddd55e7a77e00000000, +103'h3d623ccd86dd0af19000000000, +103'h028267c6fe5e3f7f6cdfc00000, +103'h008fb6363cc07c4cf2a8194197, +103'h120c22667f42e413f200000000, +103'h3ede763e40d29a4a2f00000000, +103'h328dd50792debcb0ad00000000, +103'h249b735050bd32eeec00000000, +103'h12698de6024b07f67e00000000, +103'h3e7a8c8fa6e67b46d000000000, +103'h2c5e25837850092cd200000000, +103'h2b207b27f8ca95bc7a00000000, +103'h3aa003bb6428bb3ff300000000, +103'h0e6a94454e493667ea240a22a5, +103'h091ba0160ae93a234ef94d1aa2, +103'h3b1cb5139953ce689e00000000, +103'h26e85fcda16f6e7ea800000000, +103'h34dcc5c79a8c23924000000000, +103'h121a62298174835fe000000000, +103'h3b4138aeb65149277a00000000, +103'h3abbdd9c896bab50fd00000000, +103'h1aa5f10904ace3ffb200000029, +103'h161c2807be68c19c3a00000000, +103'h1306e2665a0eb2a53e00000000, +103'h0542e5ec712adaacfe00000000, +103'h3eea94c38331bd135800000000, +103'h3f3f279a4774a2ffc800000000, +103'h3cfc7c0d455f37c34b00000000, +103'h14c88325829e5f5d9000000000, +103'h1cbf64eabe9adb6ad400000000, +103'h26e803c353635e905800000000, +103'h3685459bae22c37b1600000000, +103'h0a81bf37550ac73e6a00000206, +103'h221c98308a900cda1800000000, +103'h3b524c949711cc116f00000000, +103'h24eb5f88f82e6441f800000000, +103'h3ca735f87280b0d68e00000000, +103'h2a6dd3a6576c105f8800000000, +103'h24c47e2e54134657fa00000000, +103'h322cf4c7be8119fe5300000000, +103'h3ac3cfa32345982ca700000000, +103'h36db5b5516728cf46400000000, +103'h085ef76691365c9788b455f88c, +103'h2ef5d9d00711b7ec9e00000000, +103'h120dd637ce70af532e00000000, +103'h1a6b6acc3d6689233600000006, +103'h393b8c5510745f5b0500000000, +103'h28420a756adfca274200000000, +103'h1f5a4082651b567c5200000000, +103'h22e325e28c5d60f1bc00000000, +103'h24d29465eab7a1742000000000, +103'h363662444c9ac756ac00000000, +103'h3579fa49f26d5bbc9600000000, +103'h14d8e8cbe8a3be00e400000000, +103'h0295383f9d1db84ad6e0fe7000, +103'h1909292772f6a116be00000000, +103'h3d17e165f48bd9565c00000000, +103'h1293f5610c95027dce00000000, +103'h12b3c75d0aace3e3c200000000, +103'h2ef151a3dc40d944ce00000000, +103'h3c257d016ef4a0a1d900000000, +103'h3ee581b55ce5f245b600000000, +103'h0c3a88e7180b6f47241df7f39e, +103'h263c73fc96f0f0fc8200000000, +103'h1d7f3856e42b79e39a00000000, +103'h00b69d530b67ede0320f45999e, +103'h02d3f494e6e7263716d2539800, +103'h1efcbb1de69dc38a2000000000, +103'h111672a36b71b81f06d25d4232, +103'h275ba40c886e733cec00000000, +103'h0708c355d884e5e05600000000, +103'h0c9d08d63ee089ecde7ec4ff7f, +103'h38cf11e0c4e94d42b700000000, +103'h1172d30a50865618f4763e78ae, +103'h2e850770c85567f9b800000000, +103'h261c21b798c83b040800000000, +103'h1a93c5eb494d4274d20024f17a, +103'h14f4b761ae69642c6a00000000, +103'h1cdbfef108fd2a17b200000000, +103'h2e18ae7a1cf1e1796000000000, +103'h1b1d99073acde06a6afffffc76, +103'h0c6fc60928e68ee48677e776d7, +103'h2e2b5737820427ebc000000000, +103'h18e4127d9173edf4ea00000000, +103'h1e8eaf3cfe9f452c6c00000000, +103'h21072c66d68357a9fc00000000, +103'h0a663875341206e6fa00000001, +103'h36c96c6f5419334dd000000000, +103'h34a08e5e5f7f6bc30600000000, +103'h2f16f579d648d8325a00000000, +103'h0110b43f4ae96690bafd0d6802, +103'h061c79ebb9005c0a9000000001, +103'h204172e5f9111049da00000000, +103'h1ae5d7a33e2d8a3592003975e8, +103'h2ad31492e16efd1b8c00000000, +103'h04a9b8133a54d4beca00000000, +103'h1880b79e2627e951aa00000000, +103'h2468c772ead1a164e600000000, +103'h2e7e617d435259030c00000000, +103'h1a02f8a326bb2075f600000000, +103'h00dc6487d73981f33a0af33d88, +103'h0cddb9be303c7a96607efddf38, +103'h02b0b0597018df1e36c0000000, +103'h3cd5fff7bcf698dc6700000000, +103'h1eb6700bfea74935d600000000, +103'h14d062137c7d492d9200000000, +103'h3d26ceb15b33b9399300000000, +103'h12961a6d6f041b4d0e00000000, +103'h26fbff05eb2ae9fe6800000000, +103'h39092cd43ec1046bd700000000, +103'h0693a3d024bd0371c200000001, +103'h2f51d4059cc630460000000000, +103'h05141f882359d4162400000001, +103'h0701550910aba81bc000000000, +103'h06af8ef5d4bfc7a3e200000001, +103'h2b1acc545cc11cacf200000000, +103'h2a4c39f8e270aba2c600000000, +103'h0cd77bb38e8b77f7226fbffbd7, +103'h3e0e6589f8d7b1f00600000000, +103'h0705170446af2da39400000000, +103'h28bce52b84bd932d8c00000000, +103'h2ee55ef58ac2aa31d200000000, +103'h029950b6b57f8f5d5885b5a000, +103'h1024f467e264ee52e2e0030a80, +103'h235fc5bca6fe3f099600000000, +103'h3b582a3ef72333717b00000000, +103'h1e1338f31882f92e2000000000, +103'h354dd70494db236d1600000000, +103'h2eed6368f2ee5c602e00000000, +103'h0e8b2ed6e63c3364c204112261, +103'h254c2db6562996cdb400000000, +103'h149025c3e4b4c5a49c00000000, +103'h16af413e8b00f35af200000000, +103'h0cbcb9195e91191ed65edc8fef, +103'h28066458f4405a5d6000000000, +103'h1a79a66640fd1376be00000000, +103'h30a1ae18290377cfb400000000, +103'h12caa925027d1e35f400000000, +103'h1084bd50b51ecc4e1eb2f8814b, +103'h057f2bd9c6e975732000000001, +103'h3a76add9966e32c3d500000000, +103'h1971a7a91ced5e9d9a00000000, +103'h38e9bfae97640c773200000000, +103'h0e80a4022ed5b4204e40520007, +103'h2800fdc8e6bf73cee400000000, +103'h1aef8a53754017d112003be294, +103'h28cb757b9e411599f800000000, +103'h0c0b6d1af9309fed6e9dffffff, +103'h1f2118daa2fc15690c00000000, +103'h18f638692e0782840400000000, +103'h070b6fc8ce289b5ea600000000, +103'h1361bcc2671ed3c7d600000000, +103'h16e8a9a96d2a4390a400000000, +103'h3f6babf97e8c00530b00000000, +103'h14f630cd9574a9fc7600000000, +103'h38a9510052e055f5f500000000, +103'h027b44fae6d686c388da27d730, +103'h38777c861f7fd7c3dc00000000, +103'h2cffb46460fb1cbec200000000, +103'h34fc963f19729944e200000000, +103'h10d9ce0fc4724da94233c03341, +103'h148d8ca3fb6ee3e85c00000000, +103'h36c122fc0a48b1f82000000000, +103'h38efd612ded63e9c1a00000000, +103'h1491226e949761982600000000, +103'h36a4bc738e8737ab0400000000, +103'h10273a60e3185a199a877023a4, +103'h36f26a4658bd168d2800000000, +103'h3c93d8c7eae450ee0b00000000, +103'h16cca8e1a0d6bb346400000000, +103'h3e8cb0a65d6a93fc4e00000000, +103'h08651284b2373cddee29172cae, +103'h2cfa8af030c3ed844c00000000, +103'h3b745449ba290008fe00000000, +103'h2ac4d8d7a7238af93000000000, +103'h377ff161e297df42ea00000000, +103'h357246ca0c5cb81a9000000000, +103'h252889b682dca97c7200000000, +103'h0e07ccabf64ef0467e0360013b, +103'h210a9a9a9c7779fd0000000000, +103'h12a547cc2b7f46a8f800000000, +103'h129cad184a89e1439400000000, +103'h1370bbe0de2f290fbe00000000, +103'h0a93baeff0cbd6280a024eebbf, +103'h1e2e33fc033c9208e800000000, +103'h1f47f3b10ed04cf8d800000000, +103'h28eb94a9acfe80f4da00000000, +103'h10be5eb20a4674a5e83bf50611, +103'h285cfee27332094f9600000000, +103'h0238311bc2f06801a08de10000, +103'h2ce3b04deb4d66e41400000000, +103'h028db074ee8597ffd6c1d3b800, +103'h237e2541db69484dc200000000, +103'h36a0a35e5cf6f8c2b000000000, +103'h0eb3897c7f751e048a18840205, +103'h1113d67eb715c162e6ff0a8de8, +103'h00f9bb80c4c94adf64e1833014, +103'h0b48e8d094dd215e1a000523a3, +103'h308f0ee314d6dcdede00000000, +103'h154a52fa1e1fc5af7200000000, +103'h311b58740eaed4928600000000, +103'h0eb5a8cd62f9278ca458904610, +103'h022d1a84d2148000b2d2000000, +103'h097b691b22ca28ce16d8a0ea9a, +103'h2ee97d60e4f74352e800000000, +103'h200666392c72ac6e0a00000000, +103'h361c769e1a5c29ceee00000000, +103'h21470703bd6290081c00000000, +103'h2a3bc037727f06a63600000000, +103'h1a27bcbe12c60da9f200000009, +103'h368665b2bf01cde16600000000, +103'h2d41387658298a9f7800000000, +103'h215e9b420eaff0523600000000, +103'h06fb04b3faf128c88e00000000, +103'h3e5d7bcfda4fc40a9d00000000, +103'h36c1c0cd214ac8be9800000000, +103'h054f9069e0a8448e7200000001, +103'h228d5058d76a055b9400000000, +103'h3abc39105ab995c57500000000, +103'h2c3ae5d27d46e61e4a00000000, +103'h00045b5336031f2ea403bd40ed, +103'h35761562653e05012200000000, +103'h3e51d4cd244260545900000000, +103'h24e729fd5ab875b6bc00000000, +103'h06c3654bd90a4a83e200000001, +103'h1ea2bfc8fcf174813c00000000, +103'h1cc01f4742b4d9cd1400000000, +103'h3f1fdf19e35799961200000000, +103'h3b3814a33e17b8dd5400000000, +103'h0f5a94b07c3797f736094a581a, +103'h216e893ef66fac9a7400000000, +103'h3637579a84ca414af000000000, +103'h2d57bf8c2638ca89e600000000, +103'h228fe05b1d7022246c00000000, +103'h12ff992148c7e1b09200000000, +103'h3adefe81eb57c20baf00000000, +103'h2688a52d7e575b2cf600000000, +103'h396b1662f93659aee200000000, +103'h26bda9bcdebefedc6000000000, +103'h1cd81ec7572a153f5800000000, +103'h3f4a55dd7ce7befc3700000000, +103'h1e13e82098bfddc38c00000000, +103'h3713d412990a33a10800000000, +103'h2cd2bee0f61e1bc1a000000000, +103'h38bbbeeeae31efd43800000000, +103'h008c7df89b04aeb530c89656e5, +103'h231d1ac614c06da3de00000000, +103'h1ab7eb34944ceb9c7800000005, +103'h0a70d764b66a06628c00e1aec9, +103'h295bb3691321f1972200000000, +103'h224b3e229c92c8fbd800000000, +103'h2efb368006ee7c64ea00000000, +103'h10f81a79e939ba8788df2ff930, +103'h2a5f04d65734f1078e00000000, +103'h14e7e0c9e92d0b817600000000, +103'h1d0385b9528c1057cc00000000, +103'h2a0da70da673f121b400000000, +103'h215182e9847776db0600000000, +103'h2eca4fccee851de8ae00000000, +103'h23702831d0d6a0d23200000000, +103'h2aa210ee7ea0f09f2000000000, +103'h1847eacce01118d0f000000000, +103'h0a653b864ab329bf6e00000065, +103'h2a07aa2862fb148c5000000000, +103'h1c80b99cac6050129a00000000, +103'h0a9ab9b01967fa3afe00000000, +103'h1ac5d29474e8b3d7aa00000317, +103'h36a415383e836d87c200000000, +103'h357d6c685a49401c3600000000, +103'h1eb713ab10ed55547600000000, +103'h2358b528c56ac1bcd000000000, +103'h18e30a7e2321d567e000000000, +103'h0ef0cd5b457a8a90a438440802, +103'h1f47d0549e5d950ec600000000, +103'h3e8c28a26d4e626a0c00000000, +103'h233b42ad0c9632beaa00000000, +103'h2a0c321f8a225b611600000000, +103'h3757ac22ae5d9e0e2200000000, +103'h2100bb349969d02dae00000000, +103'h36f82cb08ec17c505c00000000, +103'h1a85d0eb2ec23784f400000010, +103'h0835d086e4ba64358247da59b3, +103'h24436e30bf403520b000000000, +103'h18badc08467605a79400000000, +103'h1af3c6302ab973d854001e78c6, +103'h0aeee7dd02744fe09a0003bb9f, +103'h1ea46dbf5d681610c600000000, +103'h329a28c26656fdedc900000000, +103'h0f05e96d06fb6bad2600b49683, +103'h142b1deff895946f8c00000000, +103'h1cc4a253869b7ddc9200000000, +103'h02c63cc7dac69bcc8cc798fb40, +103'h111ed529f88b3e201249cb84f3, +103'h2272d9393b517ae7ee00000000, +103'h2e5c71b80b705011e600000000, +103'h02e188136ee3294b2009b70000, +103'h302d3a3b5d3f9b032c00000000, +103'h16042a835f2123169a00000000, +103'h362c95b34e4e5d51f600000000, +103'h22c550f5255287d55600000000, +103'h3d4135821c7f1d88a400000000, +103'h34fcb5123f446e7dca00000000, +103'h0ad957b8fc85a3ffe600000d95, +103'h2f0457b1b08259122400000000, +103'h3881df7fba5bb0cb2000000000, +103'h1e7e84d66860087cd000000000, +103'h04bf98aae2e1e7fc8a00000001, +103'h2486507f41606cd2f400000000, +103'h36cf6165c520057dd600000000, +103'h017423176aa655fd160d3c8a40, +103'h3578ed45e175b762dc00000000, +103'h0a5f9f70e0e9da7a4605f9f70e, +103'h22a6be6ed762c7c02600000000, +103'h3e0de2eaa0c267310600000000, +103'h041b5d638269259fdc00000001, +103'h2a9e8f3f4177088a7e00000000, +103'h300b9b95449265ee0000000000, +103'h0edb6fab6f30f52d42083294a1, +103'h0d6daaf2a03c90c286bedd7953, +103'h0d690bd9af18006df6bc85feff, +103'h0edb754b3a85ab60964090a009, +103'h16e044aac6eeb73a4400000000, +103'h0d16093796ca2c857eef16dbff, +103'h22885e86ecaa71304400000000, +103'h2712b44438c07a67da00000000, +103'h2522b5621a48d8eec600000000, +103'h29216dba405b8d32fe00000000, +103'h04ea5297e47e42951800000000, +103'h0a5da8a5cc9fb04f580002ed45, +103'h0a91791b908a02e73c00000001, +103'h230e22801ce7ab8d0a00000000, +103'h3ce65917a67924a89a00000000, +103'h383cd24448874728b700000000, +103'h0232fbc0446da0405c78088000, +103'h1eb328237eaa7284a600000000, +103'h141b0013c0dd6e44ea00000000, +103'h32fbfcac9e9096686900000000, +103'h1964406e34ab967c2a00000000, +103'h033a247026a79328c8d1238130, +103'h2cba7af6be0bd396fc00000000, +103'h16183fc24045f8072200000000, +103'h1e069af62c0072fde000000000, +103'h1ca08ca64318b2c02200000000, +103'h3ee2117f221f4db64f00000000, +103'h212f69eefebfda5c9200000000, +103'h02c2ba65fca1ebdbb4f8000000, +103'h10567ddadcd155cab2c2940815, +103'h2202f40fde941030ae00000000, +103'h16ceb7fb30ea8e0b8c00000000, +103'h085a564312ed821b6a5bea2c3c, +103'h3887e066aabc3a169b00000000, +103'h0486c054f3169059ae00000000, +103'h2e19b073ea9e70c05800000000, +103'h0a972e9e6e2531154a025cba79, +103'h39022ee45f3ee1893700000000, +103'h11296940e8d61027a429ac8ca2, +103'h1b6733f720d83f0c02d9ccfdc8, +103'h11436f6db001a84ceaa0e39063, +103'h3644dbf98a68dc440a00000000, +103'h38852a0e9cac4bb1bb00000000, +103'h249b884b52f127ab4600000000, +103'h2e8a25940b7651b9e200000000, +103'h2a7a6b29af11da053400000000, +103'h30d38d035e9bff993e00000000, +103'h12d8fa8ec9166ac2ee00000000, +103'h06cf8fc578e9f7c64c00000001, +103'h053c76b60ac2f2551400000001, +103'h32bb37abd092821a8d00000000, +103'h3ed5f83ad4cef8d09700000000, +103'h1307238cc88a307c6600000000, +103'h1e2246a5066028b73a00000000, +103'h35005c125a674c440200000000, +103'h1a70f39a388992e90a01c3ce68, +103'h16b083f2ae89eefb6400000000, +103'h187a44c788fae2959c00000000, +103'h22a42e539eab66884a00000000, +103'h07356423b925ab4fd400000000, +103'h24502cdcdac9d9a37200000000, +103'h2ef4e49162ff3dc72a00000000, +103'h02947edb874f6aa40651fb6e18, +103'h36df7fadf5444f356800000000, +103'h21502bd038d8ce10ee00000000, +103'h268ab195eeb84dbee200000000, +103'h0ec47522ce08798f1a00388105, +103'h3d4da353b6932b250800000000, +103'h201b20ba0557a047d800000000, +103'h3ac16c3142a5439b8f00000000, +103'h0520056762c064559200000001, +103'h1c87182c9c81d086d400000000, +103'h2a815616e0a1d5ee3600000000, +103'h3cd33448fd28ee1ad500000000, +103'h12ca5616a6aa4431b400000000, +103'h0881dc39e57d787ab2fe5221ab, +103'h1cbb32e3f647ce915800000000, +103'h12965f7c3ec9aacb3c00000000, +103'h049a7a2f5c84ddaf3200000000, +103'h1d48d9142f1b3d2b7200000000, +103'h1b74b073b2b5b75aceff74b073, +103'h0ce856648efe906efc7f6b377f, +103'h3e25a720a97340e2ae00000000, +103'h0ce7d58bf65b97473c7febe7ff, +103'h08c54122b4813e67e6223fa2a9, +103'h37586414436913f3dc00000000, +103'h34ea1774ca2e55169000000000, +103'h1aef0bb80286b92ad2003bc2ee, +103'h374f97427770d09f9e00000000, +103'h07316134d15fdc57a000000001, +103'h1b7c3f1b06af739a16fff7c3f1, +103'h38f57217cce0d4cee600000000, +103'h18f55e3f675d13e9ec00000000, +103'h2e661b069e528601b800000000, +103'h1436b4257747e4412000000000, +103'h00b6c0de64adff47beb2601311, +103'h3817a26638e4b36d3700000000, +103'h18d597d7f89b744b9a00000000, +103'h18e6134b72b316b1d400000000, +103'h0e3e73000a88ae89cc04110004, +103'h2844d1fc626ec1d53e00000000, +103'h3c2fe465f0ad34d54b00000000, +103'h0ab66b1b1af206d1ac0000016c, +103'h08f008821721eb379ee8f1dac4, +103'h12b25472e0d85652b800000000, +103'h00e36238eac85ed4ced5e086dc, +103'h1ec1a4d43d7ab347b000000000, +103'h1691ee413d5e15809a00000000, +103'h248422e5da1fba54d600000000, +103'h144eaddd30b1a8961400000000, +103'h2ee197a95635cb7bee00000000, +103'h06ef34bd2a8479592000000000, +103'h1b5ae7519b66110276fffffff5, +103'h08e6543ae05545bfa05988c2a0, +103'h292369ba3ab02d113a00000000, +103'h1e964ab58296814c1a00000000, +103'h008da509ecb9eb0654a3c80820, +103'h3aeb1060cb5035bbd900000000, +103'h169dc1774adddac5c400000000, +103'h2b009f9f06c8eb268e00000000, +103'h02f9ff12dd66ac9ddaf12dc000, +103'h06ad498d07674c3ce000000001, +103'h16b0c9c30b614b4fbc00000000, +103'h309224bed00e94dcc200000000, +103'h103c6ae126bf5e9fccbe8620ad, +103'h0c4d5da15751835e9eaeefffef, +103'h0ec59c9e668dee3fc442c60f22, +103'h1c9f26eb32db4be11c00000000, +103'h3a874614c2a0e87f8200000000, +103'h3f2ec3de1f400f6ab600000000, +103'h1b27c50618c7557f78fffffff9, +103'h1eaeb46dd6f6195d9600000000, +103'h1510efb6b31dde63ae00000000, +103'h0d14137f10cc92d184ee49ffca, +103'h235746b224dd82883600000000, +103'h1161cf64b0f1960746381caeb5, +103'h15627174d248dcb96a00000000, +103'h0c80f1e8a2aaac1e1a557eff5d, +103'h126c052df60d1d92ec00000000, +103'h3e349afb828e0f7b8e00000000, +103'h18eec6d056fa14a98600000000, +103'h06f1cf5e942eafa50800000000, +103'h149f840aec1d76755e00000000, +103'h1a5a564a320f45d3f200000016, +103'h24a3380508aec9dee000000000, +103'h02e62e6962092029122e696200, +103'h3657d472c6ac582e1a00000000, +103'h16e6f0f18a9286977e00000000, +103'h2885534440ea5b0a4400000000, +103'h04d27f75d6d14bfbce00000000, +103'h0228cbd07e569f400e32f41f80, +103'h062b705942291eb5e400000000, +103'h16c09b798551ea866400000000, +103'h254021a40c7d5adfa600000000, +103'h0a90f3ca633df6592c00000121, +103'h2e386530c77e17fd3800000000, +103'h1408f54d110f0bc79a00000000, +103'h002b6fefbe4770f8603970740f, +103'h38cb4572155066457200000000, +103'h12a9114d947bd6353000000000, +103'h3504f5264e471ba74400000000, +103'h266fe4c6a0f02cf4da00000000, +103'h1622455f54f5221b2800000000, +103'h1c250c3d7a6506e1c800000000, +103'h36a3a950d2874c411e00000000, +103'h1f69620b6eac587e9800000000, +103'h271f47bae45001cf6a00000000, +103'h04ca4f8582b963dad800000000, +103'h1eda5e31e8d8ab95bc00000000, +103'h0971b91f6ea2fb1b3ee9a10228, +103'h22b56c8b8d7d594d2800000000, +103'h1e4921c714ef126c9600000000, +103'h1e963add76a47ef82200000000, +103'h06bbff8996eda0bf3600000001, +103'h1c84bf50f483db9cae00000000, +103'h3ecad8657b3fdb264400000000, +103'h350003e696c49a773800000000, +103'h22d9ae5fd48f72dcb200000000, +103'h26a0f998488f76c34800000000, +103'h1eec206d6d6925231c00000000, +103'h10772268d20a1ebb643681d6b7, +103'h18c6bedb72f63f28d000000000, +103'h34a5ce2ac36d6191a400000000, +103'h1b14543d5d34206d16fff14543, +103'h2aebff7310d9ee97d800000000, +103'h0ecdc9642aee42d53466202210, +103'h24a5d27e16da42484600000000, +103'h3eeb3d29a4a80bac7100000000, +103'h3364c8424a4dde2a8700000000, +103'h38b841f2c9391b542c00000000, +103'h2af9fe787a9de3967600000000, +103'h3115fd46755625893e00000000, +103'h1cda07c0de502401b800000000, +103'h12ebf065ce6621482c00000000, +103'h1136f45eec4029090a7b65aaf1, +103'h0a1fdbee7f2c196eda00007f6f, +103'h375ee90751630dcdc600000000, +103'h02ee1a21da82e9bc44dc3443b4, +103'h1ce36c8490e1d2c39400000000, +103'h2218e7f052cfece56e00000000, +103'h267a7ccaeeb3596a0000000000, +103'h3c3f1f7350cc415a5300000000, +103'h2a86abd7f946be254200000000, +103'h2ab00b003485dd989200000000, +103'h3ea9570dde0c89708b00000000, +103'h0155fc858abc9470be09487b24, +103'h12cee3578965eb7e9e00000000, +103'h1e8e884ec8bbe8042800000000, +103'h1cd40ade9a8acb5bb000000000, +103'h3a2616def91953aa7900000000, +103'h2334b75016ed5e891200000000, +103'h12a9433fd11375680c00000000, +103'h0ad9b733b5482cb8220000366d, +103'h1e94f68346f16ff7f200000000, +103'h2b69897d52cb272ba600000000, +103'h0d2b7b0071601daeeeb5bfd77f, +103'h3f00e1eb9ac9a72c4100000000, +103'h271e758ee6f5222cb000000000, +103'h142d792a24f604184a00000000, +103'h1407a3f10b1479a73000000000, +103'h0441ec66de41f2d15400000001, +103'h0e45dc08f34996c26020ca0030, +103'h3e3eedd7b68b83293e00000000, +103'h122e03bec4d15f323200000000, +103'h3231934d02104d09e900000000, +103'h337715ac973e50c8af00000000, +103'h24062ece886fe415b000000000, +103'h0c20cb19bae6f9c246737dedff, +103'h3a0cc6971eed2890d000000000, +103'h2d090f1e6c0df3aa8a00000000, +103'h3243a86e671aba41ab00000000, +103'h02ee25d41323c9601697504800, +103'h0f7f9cfc066771ce7c33886602, +103'h38fe3cb4c95597a29000000000, +103'h0e8ad01816d5349e9640080c0b, +103'h0a321dbd0ed371535e0000321d, +103'h1afd34c21d5e416b760000000f, +103'h312fbd95a8905f288400000000, +103'h10b7de0bc28d93eaa215251090, +103'h0715332074bd51804a00000000, +103'h0b45f98884752f8c0c028bf311, +103'h2cd5015c0a8a62ac8000000000, +103'h36f4685814d05c350400000000, +103'h04a1633ec2a55d910e00000001, +103'h040bafa5b899c5e92400000001, +103'h0aeb2b98bd3b2927e600000eb2, +103'h19550a384246d8cd9e00000000, +103'h3c8f450ccd3204665d00000000, +103'h226edd7264870e9e9e00000000, +103'h02e83bc1231653ab6a12200000, +103'h1e9cc337c485311dce00000000, +103'h3c98237c066d6cdef000000000, +103'h26c58826a50a3016b600000000, +103'h3479fb6fe0a25392bc00000000, +103'h2644c2648767dbb96200000000, +103'h1c94ba76fce1d7294200000000, +103'h19521f686326998dca00000000, +103'h3b19b4707ebb5404c600000000, +103'h3e839d0b570d736d2800000000, +103'h0955615f932727dda63923411a, +103'h0f08fcdd10aac4e8fc04626408, +103'h36e331e8580026488e00000000, +103'h1d78baf8660923259e00000000, +103'h191bb7759cec550df600000000, +103'h28e5dbd0786510065c00000000, +103'h065ac5145080c77bf800000001, +103'h3ecfd4a0b866a34c7100000000, +103'h1b4e0752c0c16860c2d381d4b0, +103'h14b88f12be913d017a00000000, +103'h048826d918df44543a00000001, +103'h06d8861b6c97d366f800000000, +103'h028f88aa331ffa401288aa3200, +103'h3c07f399b8f8805b7f00000000, +103'h36119b8aba880905b000000000, +103'h08fa87cff88ffc9f6a3abda849, +103'h077b477c2ea1982a2400000000, +103'h391c0168769c1ffa1d00000000, +103'h22b53bb03c1767764a00000000, +103'h06d67efdb43368dec000000000, +103'h2487beea96e8a48efe00000000, +103'h2eda97019ebf238cb200000000, +103'h30c98f12c346e2774a00000000, +103'h2ecfee9a31217978e800000000, +103'h2009b70060eb088baa00000000, +103'h2a2c23f58ebaf725da00000000, +103'h130db47770c4ae263c00000000, +103'h3c3627709af0d21bcb00000000, +103'h188013e2aefe86933a00000000, +103'h14b508e06b34ae03d600000000, +103'h1ea4f50402b4c1e68400000000, +103'h1a598f4dd669cac6ee00000059, +103'h30fefbb3770ebfcaf200000000, +103'h34a2eeac50684f18c800000000, +103'h237b8fa900674acc3e00000000, +103'h1508f28c340a39788e00000000, +103'h1e0020365685c9218e00000000, +103'h1d060dab6c8ebbadc200000000, +103'h2d744a394a8edbe41a00000000, +103'h3a49d1936694e98f8600000000, +103'h3e299266130933c8d000000000, +103'h188f1c5a4e53055c3600000000, +103'h1e8361fc4d7c97c24a00000000, +103'h2f068382650bb41c9800000000, +103'h251e8e98028f1618e400000000, +103'h2f3fcd767095999b4800000000, +103'h06b411b114b428334a00000001, +103'h2aa4edae04f3f5a9ba00000000, +103'h32a17dc78aa8075acf00000000, +103'h3d2d23f9f64cf508d200000000, +103'h364e63c7a8ee72d05e00000000, +103'h0723cbc8a71b96ca5400000000, +103'h18ed29735c69fa91fc00000000, +103'h365e8e78e28dc65aa200000000, +103'h0b1ce8873d7aefce008e74439e, +103'h08c9b565f2d97e46e208659188, +103'h2a92190efef666ce1e00000000, +103'h2ac4774a06c01c341200000000, +103'h0e849bdfb1523543100008a188, +103'h2cbfb0435d16ac8d1600000000, +103'h3ed442edea9b486cc700000000, +103'h0edf3c66965af8b0222d1c1001, +103'h24aa5213562f3b9e0c00000000, +103'h2cc79d03250e7804a400000000, +103'h0efb94800ab8ca17fa5c400005, +103'h1ccad469b680671b1e00000000, +103'h00f50d03847bfb9b28b8844f56, +103'h3a4e813b6046d004df00000000, +103'h18b66d77e13bdd086400000000, +103'h02d723cc5a8a5e43c4ae4798b4, +103'h2178413bf540cbbba600000000, +103'h04955a46b617ef880000000000, +103'h0af94356569030c3f40000001f, +103'h3099096e5c258b0aaa00000000, +103'h30c32dca271ece610200000000, +103'h272e1de196b7d7cf5e00000000, +103'h10b0fd81077b0599849afbf3c1, +103'h12c40de46ca9237b1a00000000, +103'h30fca9527e5a20fc2000000000, +103'h34541321911e2ee08e00000000, +103'h0f6354c0031ad8330c81280000, +103'h30ed9bf7f66eeb549c00000000, +103'h3f2106ab06d240149f00000000, +103'h0aae925a36bfdc0c96000ae925, +103'h275a4ce9f4e0e2b79c00000000, +103'h0720dfacbe8f7511d200000000, +103'h1c565dc424e9c1fbc600000000, +103'h385e1bf02b0aa1a88400000000, +103'h0a25b628c660ff6ca80000012d, +103'h10ce3318febf1b5cd4078bde15, +103'h1406251b08e4d1859a00000000, +103'h3c27d918d8b3049e9b00000000, +103'h10542ebf2cb929b9a2cd8282c5, +103'h2ce183d22ae102d27c00000000, +103'h062df441fa353191a800000001, +103'h285f36376616b563d200000000, +103'h24437ccb6d44a9a5ce00000000, +103'h0ee0ed1916a3dfdd3450668c8a, +103'h205f60393ae75ca8a200000000, +103'h2e1304eb08c849c1b800000000, +103'h24dd5f00aa27a9faf200000000, +103'h06ec62bc193aaee5fc00000001, +103'h3e9f4654bd180de6a600000000, +103'h30398696020470a2be00000000, +103'h2c9c109900a3b6f77c00000000, +103'h13264496f2dd3d8d7e00000000, +103'h12eb277adf794e268000000000, +103'h0ec81845729f92bd72440802b9, +103'h0ca979b2c48aba385055fddd6a, +103'h0d2e92179252d27dc2bf693fe9, +103'h3e90e809defc4c308600000000, +103'h116c8c22ac2ade4818a0d6ed4a, +103'h12e7c2f8eabbc651f800000000, +103'h1aedb4077b285274a400001db6, +103'h33467793ce10156d8f00000000, +103'h2a9b8750a8fdc9750a00000000, +103'h0e1b75559b444108d80020804c, +103'h1f5729ac86dfc8598000000000, +103'h28bb307814fb3daf1a00000000, +103'h002f4cb13252675ba040da0669, +103'h00a1325f5b0d97d3b6d7651988, +103'h1a5759165a3ce484e8000002ba, +103'h3ced4826dade16e44400000000, +103'h337e74e676356ffa9f00000000, +103'h1b620901b322b8217afffffffd, +103'h1f5334f0a4a12d07f000000000, +103'h3e8145647f033609a200000000, +103'h388d6cbc9f566afa4600000000, +103'h28cf040f5cd7b05ec400000000, +103'h0b33538394651d1b6200004cd4, +103'h1138cfffbc34212abe82576a7f, +103'h15418285866774ae5200000000, +103'h38a0a00596a044ae0e00000000, +103'h36d76de46ae1c7339400000000, +103'h0a7358dea28267392a000001cd, +103'h194365039b59d51d9600000000, +103'h2f7ae5d6e4cd2dfc3800000000, +103'h1852ab583c1092ffd200000000, +103'h2e0c380d2a8b78d6b600000000, +103'h29482bfb44de242ef400000000, +103'h3addf506f2ea5c3c1e00000000, +103'h3240ec0eda3288376300000000, +103'h26b4761697107d3e5600000000, +103'h04b378f50851694d3000000000, +103'h2890a0026e05df63c600000000, +103'h3e58234bf2b95858ce00000000, +103'h2e522eccda49f85b3c00000000, +103'h365cb78c18a21ba73000000000, +103'h04b8a99888f44a740a00000001, +103'h031a7b08bf51020024117c0000, +103'h3235a4d1c309ab98ad00000000, +103'h3c9ac6f6052426a16b00000000, +103'h20a204c17659cb732c00000000, +103'h0c9d8d00f4f49269327ecfb4fb, +103'h36ea17409496972aa800000000, +103'h25404d18e234242b9c00000000, +103'h16baa992991e3b6c3200000000, +103'h3e8ed17f7d5e88851400000000, +103'h1c578bd592193217ac00000000, +103'h0eb6dd5652a803972a50008b01, +103'h234a5302aeff8f6cbc00000000, +103'h0efc041b3cb66cc30e5a020186, +103'h390c3db8de00bfc5bd00000000, +103'h3635a96e2cfcc3e0f800000000, +103'h050718baa6090199d600000001, +103'h02d81773dd3eab0804b02ee7b8, +103'h3a5f82f02145c3c2ab00000000, +103'h12e7ae32231ddb368600000000, +103'h176c9d551e7d5e26a600000000, +103'h00fa8e11f1650c58ca2fcd355d, +103'h06c729d6c6d1a9ade800000001, +103'h2cd9895e46cc37bfd800000000, +103'h3709c41c4c9361969e00000000, +103'h1eb75d00f96ceaf4e400000000, +103'h36ca023e7176af113000000000, +103'h14ae5129ce2e0c122800000000, +103'h395ed7d506f80e509900000000, +103'h28a2c016daa65f7a6800000000, +103'h1353934d9505374f6e00000000, +103'h2a7b15957ca7f7664800000000, +103'h12d0a3ef8efb8ab3dc00000000, +103'h011e409a3b76a0495a4a7071ca, +103'h0a123cbf4c474438e800000091, +103'h270b7033ce6584d32200000000, +103'h00ac9b0e9977c19270122e5084, +103'h2a49509d3e8331c63e00000000, +103'h0d5ca675412fccd4d6bff77aeb, +103'h3cb740862a791d721400000000, +103'h3a775f6a36d5c3e75400000000, +103'h10af3fe0b48d046d7e111db99b, +103'h266a521d6f0463d7b600000000, +103'h3b55312f00b3a3b86a00000000, +103'h3ab92db2a61df5d5d900000000, +103'h30f2ee1da0732704d800000000, +103'h1ab9b2f61a2c54b77e00000000, +103'h3284dba64b1f42d52100000000, +103'h0c03a80ee4d8f5cb3a6dfee7ff, +103'h0aa06a4d595dd171860a06a4d5, +103'h2ab05390a46179806a00000000, +103'h26ec918b6e01e3cdc200000000, +103'h2d48125b5ab2375e6600000000, +103'h177c88f6809ec8e9d600000000, +103'h1b0ed1032ce6db4530ffffff87, +103'h000292904363643bb0b2fb65f9, +103'h16f837eb1d72353edc00000000, +103'h06a014a45e74c7cf1e00000000, +103'h36e6ba47756cffba3c00000000, +103'h13143b2fbd0d145e9a00000000, +103'h32a52053b2f3cea60f00000000, +103'h2ea83ab6860809d5ca00000000, +103'h09201ce878ad2a297ec69b6083, +103'h1704fed4a75564e00400000000, +103'h22f6f51f6f7581c87c00000000, +103'h20dcba10457a809d2200000000, +103'h24ca88d6e77175bc9000000000, +103'h206581c7064e2fccd400000000, +103'h0255df972b18b8a3bc40000000, +103'h12bbbf2fca7e3a6ac200000000, +103'h269c1f658cd41a01ee00000000, +103'h22edf557de8fd931b800000000, +103'h268dfb17072bf8974600000000, +103'h1446b979e819edef2400000000, +103'h0c7db2478ea7e9062a7ffda3d7, +103'h1288c51722eea2801400000000, +103'h3923b118706c54c7a300000000, +103'h22ea95b102f519dec600000000, +103'h36cb6838bb18caf73600000000, +103'h1b5423c69e0360a838fffffffa, +103'h20cb81d494cec8e0f400000000, +103'h16af34aa2f22eca79200000000, +103'h0e88015e8eee6e7c2644002e03, +103'h0279990a249da3265664289000, +103'h156e915df425a484e400000000, +103'h3c325292b69f3d8f0b00000000, +103'h1319006f0d0dceecfe00000000, +103'h36ee1cc78840217fb400000000, +103'h0160dc465a5921eec0dcff1a8d, +103'h3ef9404a10473eb64900000000, +103'h3530e1dcd2a81afca200000000, +103'h3476525c90a15b46b400000000, +103'h3efbe45c04d23d238700000000, +103'h20da984a3a488f801600000000, +103'h15008aeeb94473dc1c00000000, +103'h1ace988fd91f0c2656000ce988, +103'h333e0177af1f97150f00000000, +103'h0e7fa78308ee2fa4e63713c000, +103'h2409dd0e7a2c311c9400000000, +103'h32d8867608abd89f9f00000000, +103'h18c63c03ecb5b5ae1800000000, +103'h2ed388a6de8e3c242200000000, +103'h0ccf04eeb85478280e6fbe775f, +103'h24f6b253272800ceee00000000, +103'h06ca385732f705bda600000001, +103'h1653740956edb810cc00000000, +103'h056aebdf9eb7f067fe00000001, +103'h2ad6dbddf40b64715400000000, +103'h376accab38765050f200000000, +103'h34f5c336224d2c2ee600000000, +103'h096e71d1d8b7f8da1eecc485e3, +103'h3c9f10d58cadbc104100000000, +103'h22db144a941c2de21800000000, +103'h028d681090bb3eb7a421200000, +103'h028ce805749653023a40000000, +103'h1d4460d47623bb12ca00000000, +103'h00a995b3b8b0a3183ead1c65fb, +103'h3a2af87514f503ecb400000000, +103'h076799ee169e99a06e00000000, +103'h043a8e6950c992158200000001, +103'h3a313df756312c039900000000, +103'h28d8909d9d6bba6cea00000000, +103'h2b74e730969cf8644000000000, +103'h04afd763fe758901dc00000000, +103'h2eb459ace8ea70327200000000, +103'h2eea07f96c9a47967000000000, +103'h0c8b70b2db4ea1435ae7f8f9ed, +103'h3ec9d1d08a38a93cc700000000, +103'h317dbbf016c419efa200000000, +103'h0a1c1642148debc02c00000038, +103'h1054b82a850ba7b042a4883d21, +103'h32dbfb564e27bdf25700000000, +103'h1e9be7bee17c761cdc00000000, +103'h201fee17125871732a00000000, +103'h3931e02f72f459320b00000000, +103'h144f79f8131447491e00000000, +103'h3e94d1b30b4627789000000000, +103'h0a569f8ade95a170a2000015a7, +103'h2970ded5df2a7323ae00000000, +103'h397f7752e88112ae8d00000000, +103'h1aa2571910f1f1846a00000289, +103'h090b5e57c87168d752bd1b404d, +103'h160a07072213bff06200000000, +103'h013322da2c1f1e482aa920912b, +103'h14dd515bc329254f4e00000000, +103'h36797161c35c48297a00000000, +103'h2286fa3f173999853c00000000, +103'h30a8430cceb30ae6fe00000000, +103'h2ae8aa22b13a05261600000000, +103'h27523687e0e24832e400000000, +103'h25180b168acaf2559400000000, +103'h3b17792a711d28dd7400000000, +103'h1ec9f225553533f3fe00000000, +103'h32b67046514cad1e6f00000000, +103'h2685369a2e169f43c200000000, +103'h251eef43a2cd0f8a1200000000, +103'h12d5d0ca895246244200000000, +103'h16c1e6456f713567e400000000, +103'h28faa8dec04706326c00000000, +103'h2a4a0abbd608ec77da00000000, +103'h0f667c23010395569c810a0100, +103'h3cd533ae6a4da0127200000000, +103'h16b520a1bab41c357200000000, +103'h32dc13c776894fe3df00000000, +103'h260bf3650d3e70859800000000, +103'h193f6859411a844d0e00000000, +103'h36c07d5fe62677b21a00000000, +103'h0ef5ae9bfe65e00b5a32d005ad, +103'h1cb42fbbf6265d6b4000000000, +103'h38b12161851c0c074000000000, +103'h12c8975422d03bc33600000000, +103'h150684f8da815d24ba00000000, +103'h14aa52a8ec49f478dc00000000, +103'h0a747dc440507971b600000007, +103'h045ab4e6d4facc1aa400000001, +103'h221127cc9e6f49dee400000000, +103'h1948f7d724c9fec5ba00000000, +103'h3ccabc5a86db26925900000000, +103'h229cfa4f9e241e697c00000000, +103'h1d6a045f5ceedac40200000000, +103'h34a6584dfe8bd513a200000000, +103'h32acab025af5d972ff00000000, +103'h348e24490e9c31c0fc00000000, +103'h1693bbf94148dcc35600000000, +103'h14882e6d76d7010c6400000000, +103'h100875f54d6abd05a64edc77d3, +103'h277e96f022f2eb731c00000000, +103'h0c90e9abf2fb6168687df4f5fd, +103'h32ec192b1a79f8588b00000000, +103'h0f1e49b6a70ae2047e85200213, +103'h36bb3747d8f6fb2f9800000000, +103'h034b104c271544e63e80000000, +103'h00d64ab8dcd07c2e16d3637379, +103'h18db7d7e1f1b8c7a3c00000000, +103'h16eb9247def1d7331800000000, +103'h2cf2a24136cd54b13800000000, +103'h280ef720ccb8e6f91600000000, +103'h00fbc82e78ab893a4ed3a8b463, +103'h380425b660ba805b1b00000000, +103'h10fe5a7162b64889942408f3e7, +103'h1ec5e3dd9aba6e3ff400000000, +103'h38465442eab8c8b15700000000, +103'h0c724de2897eac8ef2bf76f77d, +103'h0358c7dd42c500d1dcfba84000, +103'h18f58a618f374eb46600000000, +103'h0a4cbb25d0901691a800000265, +103'h295cb49b6a85a0f33600000000, +103'h0eeb5a9ff4d25c1908612c0c80, +103'h363f01765d2f10b47200000000, +103'h2cc9f7012a1a6b546600000000, +103'h34e5031da1596ccac400000000, +103'h2685b02d4e2363cbee00000000, +103'h0ef8b956030866e99004102000, +103'h129ad3332a8e1716de00000000, +103'h01575864b886d06ce0ef1468cc, +103'h116d4a610a21a3a00aa5d36080, +103'h2ea6a0294a78fc04c200000000, +103'h10e85cdb1ce64665cc010b3aa8, +103'h1ab830a3ca8ce68f180005c185, +103'h1e0ed4d95b75436a3400000000, +103'h2a871caef62d740dfe00000000, +103'h03786089553c48e75a08954000, +103'h364feac97ec365965000000000, +103'h36b45b98c33bc61fa400000000, +103'h108e0fd2388bb0e922012f748b, +103'h20953819ae400c81e400000000, +103'h04d8a9487ece1c541e00000000, +103'h26df800d9e63546dcc00000000, +103'h0c221cf2633bfdb64c9dfefb37, +103'h2af06ac04a1b7dc3ea00000000, +103'h36fec510173d9ab64e00000000, +103'h02db3bb4012e057698dda00000, +103'h2e1b06c5b72cca86ae00000000, +103'h3c96cf8dbb08063aaf00000000, +103'h152e1619a8230d006400000000, +103'h0302f75be4b9dc8e1ed6f90000, +103'h3105de14b8e7f2a7c600000000, +103'h15358f543aeaea03aa00000000, +103'h356d46ce6af0c8186200000000, +103'h3ac80b48fe26576c9d00000000, +103'h26dcac51b2939e3b0600000000, +103'h08d940022f5ba98406c174c314, +103'h26c0bdb6543855d5b800000000, +103'h2c990382dc1195d7e600000000, +103'h3297a0bc02d2538e3b00000000, +103'h2d29dc30316b57111800000000, +103'h1217c1286202f7cd1a00000000, +103'h0e3dfbf64e2cd3fd4a1669fa25, +103'h2775cc9c23449525ae00000000, +103'h017ff0d03082911bfc0140f616, +103'h0cf56c1556f85db81e7ebedeaf, +103'h3a6ddf2796784e884e00000000, +103'h36132637226dba9da400000000, +103'h16fd026c5cdb99c53c00000000, +103'h25696fbd94eebffc5e00000000, +103'h0ace3ac6eaebc268bc00000001, +103'h06ab54588f5532265000000001, +103'h24f62887d9236ced3a00000000, +103'h201c967c5ecec145c800000000, +103'h3131c46d44c4e9cda200000000, +103'h2a32b4c6e4e1804a0000000000, +103'h3488d746d61344b74400000000, +103'h160266b40145f97e2a00000000, +103'h164ab766f4ced0c50000000000, +103'h1c57f1e78ad137790000000000, +103'h0746acb2231beedff600000000, +103'h0748ac33fe73e0c78000000000, +103'h0690a53404ba8d79a200000001, +103'h3ca76ef90a0339ada000000000, +103'h3e8f70371093dee1a400000000, +103'h209360550e3b4ddaae00000000, +103'h030b313a8ccabe11c085989d46, +103'h263d8f99ad5e1e66ce00000000, +103'h167327a66f694fa15a00000000, +103'h173c9e94d6a6df3b0600000000, +103'h2541635ded1a06e17600000000, +103'h3f10e638c356a5764c00000000, +103'h053e877a669808d43800000001, +103'h3ad5785d64a8ef0cfb00000000, +103'h0613487b68e776876000000001, +103'h3f6b1f7ae4bceee4c500000000, +103'h38199bf0aad037602d00000000, +103'h1960213aaa3b56db1000000000, +103'h1c4f9591a354f2cbbc00000000, +103'h0b26806ffcb514066600001268, +103'h1aba5a331804a9980805d2d198, +103'h161e6b56622b2a080400000000, +103'h3cbdd354bee5843b1f00000000, +103'h06b22e1ed403ef918000000000, +103'h0b5b9cef52c1c2e63e00000001, +103'h2909b557d973f1051400000000, +103'h2ae2f7c862cf8df46600000000, +103'h28a1be740cd9434c3e00000000, +103'h3d6474b136bc3b14a000000000, +103'h22e8edd49e5df988ac00000000, +103'h20e157fd1cc26e39e200000000, +103'h02a95019feab5c0e82a95019fe, +103'h2f4a8b83208cb40b9e00000000, +103'h12a80200e23604259c00000000, +103'h1463720750808fa8bc00000000, +103'h32e15047a22891a99f00000000, +103'h0e0a8a96768c03b0f004014838, +103'h0cc078f0e86d53f89276bdfc7d, +103'h2aac6b70f977de8f0a00000000, +103'h1b18ed99c438577ff2ffffffc6, +103'h2eae016c2ee4c2f0ea00000000, +103'h38cf18ef8afdb08aaf00000000, +103'h2b5d846b78abb1f6de00000000, +103'h1763ce76717acae66800000000, +103'h04a270015ad84f51e000000001, +103'h22c5d47d313c1dc85000000000, +103'h0ae6e983b6de8dc9aa0000039b, +103'h2ab3b08118a46246dc00000000, +103'h3afb4264e48b4bca9300000000, +103'h261b239a8e3efc4baa00000000, +103'h037722988a3a3eb08ec8a62280, +103'h14b1af603155624b1e00000000, +103'h3e909e6eb2cc84e3a800000000, +103'h0efad947c77e3443d83d0821e0, +103'h2ca4106c850ed2b28a00000000, +103'h14878641d309abfa5000000000, +103'h2cc05e623eadbc66d400000000, +103'h36c5bb66533542a8a800000000, +103'h06494cae3ef5a10ae600000001, +103'h1adbb0a8b4bb5c713a00000003, +103'h0277c09d7a04a91f78d0000000, +103'h2ac18cf916e059c82e00000000, +103'h24409bfd58581a65a800000000, +103'h1cb54c0c8219a75ebe00000000, +103'h0ae5588ce75a435c1800072ac4, +103'h351a0e2cc40f8f689a00000000, +103'h322f1d94cef4e7f58300000000, +103'h0a9c4762830ef6224609c47628, +103'h2723188ef63e13b71400000000, +103'h28042d1780da5b199800000000, +103'h2ef4d108a6fd73a88e00000000, +103'h02da5cef4e01a0c00e973bd380, +103'h1acedef83cf671c8b60000000c, +103'h290174b840d0ceb80400000000, +103'h380e6591da9fadb04300000000, +103'h2f18ca1404a122688200000000, +103'h3324cf563caf87fa5d00000000, +103'h352746612ac8520e6000000000, +103'h36fa8c241ced21649c00000000, +103'h156d7f97521467c5c600000000, +103'h34819573090ef3e9e400000000, +103'h124533491d7c73813600000000, +103'h18d1232d92fe08f43e00000000, +103'h3d4a3476a5433c3d5c00000000, +103'h32d7ad857d145f6aef00000000, +103'h33741a7e3b5e93e19300000000, +103'h0e8cfaf82c3641670e02203006, +103'h3ca3e4665eaa5be54900000000, +103'h0efe0a11ed3756dd761b0108b2, +103'h1c6c8f2868db3b43d400000000, +103'h2639a82076d94555c200000000, +103'h1d3d027f9445d47e2a00000000, +103'h30eab8c3fb7f7c9ea200000000, +103'h32cfc5e5d6bc7f1e3700000000, +103'h1e900e4b86a737e23000000000, +103'h01299c06fb76fdc806504ce780, +103'h3708fe4098070c138c00000000, +103'h2767dd18d830a81a8600000000, +103'h2c833b0f4e39a65b1e00000000, +103'h3945d0e7f4a18373f700000000, +103'h017f6488a024be8344d21185f2, +103'h1ec0043cd86a8f6b3800000000, +103'h16314c0b98e9f3f3d800000000, +103'h1adc3a3578a9f830b200000037, +103'h1528abd34edb443c4a00000000, +103'h2c99dbf468b77e71c200000000, +103'h1e759b80bce02a451000000000, +103'h2b3b4f00eb7a06397a00000000, +103'h2caafab1c8efa1ba3600000000, +103'h3ef5ea9ef22af0bb2100000000, +103'h38f858fde0d5eb6cea00000000, +103'h2edaf1a1decbd60bdc00000000, +103'h1137907f56c42f09bc39b0bacd, +103'h3a83d117049f20ab9a00000000, +103'h16fb0269d4d6b12af000000000, +103'h14481f298f5a8241f600000000, +103'h2f6111f5265584abca00000000, +103'h213e33ca7a9da3d55a00000000, +103'h16ba764b68feb5ca8000000000, +103'h200d69f7493ce994fa00000000, +103'h3abadfe51ef75fe06200000000, +103'h3abdda7ec104c9d7ad00000000, +103'h345e78edbabfa9bcca00000000, +103'h18fdcd27367d843b8a00000000, +103'h04da0af5aadbfd294600000001, +103'h0eada8a482d9ca507c44c40000, +103'h1a86102b06b3d5462600000861, +103'h211e216e57617deaaa00000000, +103'h1d33b6ed30e78e15b000000000, +103'h032549955005af840695265540, +103'h2cf0a68dec3966713600000000, +103'h1e6fd8ccae5eb0068600000000, +103'h255088f61c4f56947200000000, +103'h1d18c7353abf2f612200000000, +103'h22e6b4f85f0fb8573e00000000, +103'h16ee092cbb287f8c7800000000, +103'h39540d679e0f3484d700000000, +103'h37096836f4fd3db19200000000, +103'h2f7df2676d514b193000000000, +103'h050234ef235ab3502400000001, +103'h16aef70350d8a5b79000000000, +103'h066aed9c54dadaa6b200000001, +103'h2b2421e6ec89d1aa0200000000, +103'h3a2ea14ab2f4bf465600000000, +103'h2c93d3fe9e18e12d4200000000, +103'h2ed1ac6a19478277f600000000, +103'h06ea5f7c46db56769400000000, +103'h088ce43874ad02e0ac10f36c6c, +103'h3e24283afa97625cf200000000, +103'h12d44d6ac52446956800000000, +103'h00cbf51282486ed0628a31f172, +103'h329ef330d61cbc3b2700000000, +103'h1b1ef42fd6e8b14daafffffc7b, +103'h3e36578bc887a47e8000000000, +103'h2572017d24a698ae5600000000, +103'h0ef61a3ee2dcf03a1e6a081d01, +103'h0e96ef3bc64ef1b742037099a1, +103'h2520758656450bf62400000000, +103'h0431a04f64dbfb31ec00000001, +103'h06e963c6cafc70b84200000001, +103'h2d7e17784e2e1107a600000000, +103'h1861bce1141774ce7000000000, +103'h1a8a6e4000958c46be00000000, +103'h008f1ad0d8f74927d4c331fc56, +103'h32903819f281b767d500000000, +103'h30bf666ab510d238ae00000000, +103'h05060989e6a10a52a000000001, +103'h1ae238efd66070bd54001c471d, +103'h08b5b17d9c667a473a69e59d53, +103'h290ae1733748b3371200000000, +103'h3f70e3a17efe64b4af00000000, +103'h3877f02267094627e400000000, +103'h0adf6d60a57a29c962000037db, +103'h38ad64e61ef219ebc900000000, +103'h1cc40fa2a8d1874c6e00000000, +103'h3ed91f13e37eec328c00000000, +103'h08f774acfe42fbd5345ac7bce5, +103'h368ff40f7e1c1ae91600000000, +103'h031a8d5dc7138f961635771800, +103'h3776adf87ca383a59400000000, +103'h0f51bac5bebe11035a0808008d, +103'h246fc3683534befbd600000000, +103'h38a9e6f3c28679c19400000000, +103'h12f79a1566f63d29c800000000, +103'h28e8d0dc9ea0241d8c00000000, +103'h3c9818a73097be32f200000000, +103'h047c1f6d98808f0f9200000001, +103'h10e69ff59418a7b6c266fc1f69, +103'h05475da75a94c7245c00000001, +103'h16483f76aa7b6719f000000000, +103'h18e0df78eec2c4c14a00000000, +103'h34fa0e8ac50b0437f600000000, +103'h272be5535eebe3b0e400000000, +103'h30f2834052e5f23baa00000000, +103'h263488473911d78f0800000000, +103'h0d39520f6a045acf5a9ead67bd, +103'h3649200f9138e3169400000000, +103'h3e44d1c09d723525fe00000000, +103'h182675ad52bb55358e00000000, +103'h2c19f129110026f62c00000000, +103'h2b11c7742a269ca37e00000000, +103'h3a4280d5d7408dcc9100000000, +103'h26e56f5d83525540ba00000000, +103'h2543b31abc94d6169000000000, +103'h34a21dce227a45741200000000, +103'h2e27252506bdf88ece00000000, +103'h00ecba487c60165cf0a66852b6, +103'h1204a4acaa873b81f800000000, +103'h22b165276b73f5ca7400000000, +103'h12d86b163e789a771e00000000, +103'h0abd6993e129ff9e8a02f5a64f, +103'h3e027e6e73026ab4c800000000, +103'h1ecececafebfd448a800000000, +103'h280f14f1fcc252b71a00000000, +103'h30c7f5901a9121821800000000, +103'h18aad5ccc2a036741600000000, +103'h329020be32682c043100000000, +103'h0c353ff84b1301d0f49b9ffc7f, +103'h229cb1e97ea3228f2600000000, +103'h1295455ccad862877200000000, +103'h072e0f442d751470f000000001, +103'h2e2f052fbf0a59cdba00000000, +103'h2142fcec47386911e600000000, +103'h10fa1737f4676e41a449547b28, +103'h0a89940b14aa6b2dea00000226, +103'h308e254f24a48265de00000000, +103'h149d1060ee2e1670f200000000, +103'h00e464849ebc3bc016d050225a, +103'h1e9326e9f2594c210400000000, +103'h12ec547d323db0a5a200000000, +103'h28ea047652d0d78f9600000000, +103'h2f15cae064bd2c0cc800000000, +103'h10fdcd0a8ca730831a2b4e43b9, +103'h263f1b55babcfb637e00000000, +103'h30be1a468cbac86e0c00000000, +103'h0a0df0c6f2f9e3c3c600df0c6f, +103'h0a1af35422b7fe0a520006bcd5, +103'h16cf26646ec5eed14600000000, +103'h1d4054d838e0e2256800000000, +103'h316c4bba0eb00889d600000000, +103'h3692265faaf05d620e00000000, +103'h1e6fff0f9a5ca91c1c00000000, +103'h3613c690d0eecf7bc800000000, +103'h04987037705ece8b6200000000, +103'h22cd2267e772951c3400000000, +103'h2af231fa6b0b0553a400000000, +103'h0c73eaa90cd827bb8a7df7ddc7, +103'h00e472d376ca59b5f4d76644b5, +103'h24b3c989453e445f0200000000, +103'h2ef5b55b4422b7327800000000, +103'h2542a680ead680bbbc00000000, +103'h2667bf6218cc36170200000000, +103'h1e5731f93d0edc97ec00000000, +103'h1c84e8ef62769bfa0400000000, +103'h1ed5571802cdcdf34200000000, +103'h0afc45fc5e52b6e2a400001f88, +103'h0eef6af7bc280dfaa614047952, +103'h10f16c8b062453f704668c4a01, +103'h366a0a185413beeec000000000, +103'h1cb07598e6052b79c600000000, +103'h234997fc1d6f35921c00000000, +103'h220ac859f91fab2b0200000000, +103'h2af04caedb6943271e00000000, +103'h06e98ff27e740b811600000000, +103'h08e7feafe964582ff2c1d3400d, +103'h2755a2ff6f4de8227000000000, +103'h3ce2f279f735e6d25900000000, +103'h2ed9851b9c8b89d1c600000000, +103'h1e44233e596e7c4bbc00000000, +103'h37131991094801675800000000, +103'h3c2ff806268c24a5b100000000, +103'h3882bd4d9e9f3e36b900000000, +103'h10610c66dacf363ce0c8eb14fd, +103'h02add7cbd551f38a7e00000000, +103'h3a42a49824b2fff15800000000, +103'h1a63960a2660d7bd2c000000c7, +103'h1923c5b2e2a37c555200000000, +103'h32b32b987c07125f7900000000, +103'h1e948508962ad8125a00000000, +103'h3128de6a08de03aad800000000, +103'h2a1e0f88a77288b36e00000000, +103'h04b6bcfc989b671d7600000000, +103'h1d567cd002b976a61c00000000, +103'h0a2114b5c67033a2b400000004, +103'h00c9b04664c6b072b6c8305c8d, +103'h1ee4d48a6ee7c5287e00000000, +103'h129b5febf0b1756ee200000000, +103'h0b0b61f38e9649f9500085b0f9, +103'h08eb979de031a9e5406d1f3c50, +103'h2a927dbaea3d0bd8ce00000000, +103'h3a2129007328a376b100000000, +103'h3c6149b4dcbb21319b00000000, +103'h0b37b46298dc4a320e0137b462, +103'h3b3fc8f5943d93e6ea00000000, +103'h1684e9615e7548498200000000, +103'h24f2ad43dab5113f1600000000, +103'h0f1b9257f139faa0768cc90038, +103'h1320c19e152ca7e45000000000, +103'h286384cb23483a3c4000000000, +103'h1e1b9041b568fbda5400000000, +103'h2e88acf75ecc80a57600000000, +103'h2e2fc44d7ce810e72c00000000, +103'h03038387ed70bdde8a38387ec0, +103'h3a1f7cfe9aa0822c0600000000, +103'h26a4724f9ea405b3f200000000, +103'h30f5e84618c382b28e00000000, +103'h372f6f23bf67f5022c00000000, +103'h2ad9b3dfef5ddd484400000000, +103'h38247ac8248d4c6c0300000000, +103'h241347644f67004bf000000000, +103'h28c596b3068b7b141400000000, +103'h2adfdb03ea9ec2786400000000, +103'h1a57fc9d1264592b6a0000015f, +103'h2e5d6aa23d44342f5600000000, +103'h12c9d8f3569c30cc6800000000, +103'h3ec1c25886f99b6ea600000000, +103'h14586e3618c37461fc00000000, +103'h3c53733f168536ba8300000000, +103'h2292ac776adda4f09c00000000, +103'h216e167c2831182fb200000000, +103'h22431bef8ac3c4a71e00000000, +103'h3edb95c4eb31db234600000000, +103'h32f94654ce74f712d100000000, +103'h10f49bd54d508cd7bcd2077ec8, +103'h162109857f49d32c8a00000000, +103'h26113bdcce3e6f01d600000000, +103'h22334957655f78875600000000, +103'h2cca4de4cc70b4642400000000, +103'h04b1df49eea3fdbb8a00000000, +103'h1ae343db9d6e4ba056000e343d, +103'h3f53176f20202aea4500000000, +103'h09226389fa036ec5e09086a60d, +103'h1e626408f85686350000000000, +103'h254662438278e9befa00000000, +103'h0498ac1e60db4dc7f400000001, +103'h060b20e38521b00b7600000001, +103'h0081046e8aba5c29d69db04c30, +103'h354d6e2e90c57d0d5c00000000, +103'h2a92c1ad9146817be600000000, +103'h02b362f48693efaa7618000000, +103'h1ef5b446f026b1580600000000, +103'h04f261c332da144c8c00000000, +103'h3ab48c4cd0cfc8937e00000000, +103'h00bd385254c22a56b0bfb15482, +103'h0e59d4024f76b6a382284a0101, +103'h0d1d210a5033eef5d69ff7ffeb, +103'h3cba825ede8dc2f82600000000, +103'h3f27ac46eaaae4027700000000, +103'h16570085a76566615400000000, +103'h3cfd0b67e68d12a83e00000000, +103'h32d7053ffce4132de500000000, +103'h073ec21038e11e95ca00000000 +}; + +endmodule diff --git a/Labs/03. Register file and memory/README.md b/Labs/03. Register file and memory/README.md new file mode 100644 index 0000000..33aae38 --- /dev/null +++ b/Labs/03. Register file and memory/README.md @@ -0,0 +1,379 @@ +# Лабораторная работа 3 "Регистровый файл и внешняя память" + +Процессор — это программно-управляемое устройство выполняющее обработку информации и управление этим процессом. Очевидно, программа, которая управляет процессором, должна где-то храниться. Данные, с которыми процессор работает, тоже должны быть в доступном месте. Нужна память! + +## Цель + +Описать на языке SystemVerilog элементы памяти для будущего процессора: + +- память команд (Instruction Memory); +- память данных (Data Memory); +- регистровый файл (Register File). + +## Допуск к лабораторной работе + +Для успешного выполнения лабораторной работы, вам необходимо освоить: + +- приведенные способы описания [мультиплексоров](../../Basic%20Verilog%20structures/Multiplexors.md) +- способы описания [регистров](../../Basic%20Verilog%20structures/Registers.md) +- [конкатенацию](../../Basic%20Verilog%20structures/Concatenation.md). + +## Ход работы + +1. Изучить способы организации памяти (раздел [#теория про память](#теория-про-память)). +2. Изучить конструкции SystemVerilog для реализации запоминающих элементов (раздел [#инструменты](#инструменты-для-реализации-памяти)). +3. В проекте с прошлой лабораторной реализовать модули: Instruction Memory, Data Memory и Register File ([#задание](#задание-по-реализации-памяти)). +4. Проверить с помощью тестового окружения корректность их работы. +5. Проверить работу регистрового файла в ПЛИС. + +## Теория про память + +Память — это устройство для упорядоченного хранения и выдачи информации. Различные запоминающие устройства отличаются способом и организацией хранения данных. Базовыми характеристиками памяти являются: + +- V — объем (количество бит данных, которые единовременно может хранить память); +- a — разрядность адреса (ширина шины адреса, определяет адресное пространство — количество адресов отдельных ячеек памяти); +- d — разрядность хранимых данных (разрядность ячейки памяти, как правило совпадает с разрядностью входных/выходных данных). + +В общем случае `V = 2^a * d`. + +Для объема памяти в 1 KiB ([кибибайт](https://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D0%B1%D0%B8%D0%B1%D0%B0%D0%B9%D1%82), 1024 байта или 8192 бита) разрядность адреса может быть, например, 10 бит (что покрывает 2^10 = 1024 адреса), тогда разрядность хранимых данных должна быть 8 бит. 1024 * 8 = 8192, то есть 1 кибибайт. Если разрядность адреса, например, 8 бит (что покрывает 2^8 = 256 адресов), то разрядность данных `d = V / 2^a` это 8192 / 256 = 32 бита. + +Однако, может быть такое, что не все ячейки памяти реально реализованы на кристалле микросхемы, то есть некоторые адреса существуют, но по ним не имеет смысла обращаться, а объем памяти, соответственно, не равен `V ≠ 2^a * d` — он меньше. Подобные случаи будут рассмотрены отдельно. + +Память можно разделить на категории: ПЗУ (постоянное запоминающее устройство) и ОЗУ (оперативное запоминающее устройство). Из ПЗУ можно только считывать информацию, которая попадает в ПЗУ до начала использования памяти и не может изменяться в процессе работы. Из ОЗУ можно считывать и записывать информацию. В самом простом случае ПЗУ имеет один вход адреса `addr` и один выход считываемых данных `read_data`. На вход `addr` подается адрес требуемой ячейки памяти, на выходе `read_data` появляются данные, которые хранятся по этому адресу. + +Для ОЗУ требуется больше сигналов. Кроме входного `addr` и выходного `read_data` добавляются: входные данные для записи `write_data`, сигнал синхронизации `clk`, который определяет момент записи данных и сигнал разрешения на запись `write_enable`, который контролирует нужно ли записывать данные или только считывать. Для того, чтобы записать информацию в такую память необходимо: + +- выставить адрес `addr` в который планируется запись данных, +- выставить сами данные для записи на вход `write_data`, +- установить сигнал `write_enable` в состояние разрешения записи (как правило это 1) и +- дождаться нужного фронта `clk` — в этот момент данные будут записаны по указанному адресу. При этом, на выходе `read_data` будут старые данные, хранящиеся по адресу `addr`. На одном такте происходит одновременное считывание информации и запись новой. + +Так же возможна реализация, в которой вход `read_data` и выход `write_data` объединены в единый вход/выход `data`. В этом случае операции чтения и записи разделены во времени и используют для этого один единый порт ввода-вывода (`inout`, двунаправленный порт) `data`. + +![../../.pic/Labs/lab_03_memory/fig_01.drawio.png](../../.pic/Labs/lab_03_memory/fig_01.drawio.png) + +*Рисунок 1. Примеры блоков ПЗУ и ОЗУ* + +Кроме того, различают память с **синхронным** и **асинхронным** чтением. В первом случае, перед выходным сигналом шины данных ставится дополнительный регистр, в который по тактовому синхроимпульсу записываются запрашиваемые данные. Такой способ может очень сильно сократить **критический путь** цифровой схемы, но требует дополнительный такт на доступ в память. В свою очередь, асинхронное чтение позволяет получить данные не дожидаясь очередного синхроимпульса, но такой способ увеличивает критический путь. + +Еще одной характеристикой памяти является количество доступных портов. Количество портов определяет к скольким ячейкам памяти можно обратиться одновременно. Проще говоря, сколько входов адреса существует. Все примеры памяти рассмотренные выше являются **однопортовыми**, то есть у них один порт. Например, если у памяти 2 входа адреса `addr1` и `addr2` — это **двухпортовая память**. При этом не важно, можно ли по этим адресам только читать/писать или выполнять обе операции. + +Регистровый файл, который будет реализован в рамках данной работы, является **трехпортовым**, и имеет 2 порта на чтение и 1 порт на запись. + +С точки зрения аппаратной реализации память в ПЛИС может быть **блочной**, **распределенной** или **регистровой**. **Блочная память** — это аппаратный блок памяти, который можно сконфигурировать под свои нужды. **Распределенная** и **регистровая** память (в отличие от блочной) реализуется на **конфигурируемых логических блоках** (см. [как работает ПЛИС](../../Introduction/How%20FPGA%20works.md)). Такая память привязана к расположению конфигурируемых логических блоков ПЛИС и как бы равномерно распределена по всему кристаллу. Вместо реализации логики конфигурируемые логические блоки используются для нужд памяти. Чтобы понять почему это возможно, рассмотрим структуру логического блока: + +![../../.pic/Labs/lab_03_memory/fig_02.png](../../.pic/Labs/lab_03_memory/fig_02.png) + +*Рисунок 2. Структурная схема логического блока в ПЛИС* + +В логическом блоке есть **таблицы подстановки**(Look Up Table, LUT), которые представляют собой не что иное как память, которая переконфигурируется под нужды хранения, а не реализацию логики. Таким образом, трехвходовой LUT может выступать в роли восьмиразрядной памяти. + +Однако LUT будет сложно приспособить под многопортовую память: посмотрим на схему еще раз: три входа LUT формируют адрес одной из восьми ячеек. Это означает, что среди этих восьми ячеек нельзя обратиться к двум из них одновременно. + +Для реализации многопортовой памяти небольшого размера лучше воспользоваться расположенным в логическом блоке D-триггере (**DFF** на *рис. 2*). Не смотря на то, что D-триггер позволяет воспроизвести только 1 разряд элемента памяти, он не ограничивает реализацию по портам. + +Таким образом, плюс распределенной памяти относительно регистровой заключается в лучшей утилизации ресурсов: на восемь разрядов памяти у нас уйдет один трехвходовой LUT, в то время как для восьми разрядов регистровой памяти у нас уйдет 8 D-триггеров. + +Минусом является ограниченность в реализации многопортовой памяти. + +Сравним блочную память с распределенной/регистровой: поскольку большой объем памяти съест много логических блоков при реализации распределенной/регистровой памяти, такую память лучше делать в виде блочной. + +В то же время, к плюсам распределенной/регистровой памяти можно отнести возможность синтезировать память с асинхронным портом на чтение, чем мы и воспользуемся при реализации однотактного процессора (если бы порт чтения памяти был синхронным, нам потребовалось ждать один такт, чтобы получить инструкцию из памяти инструкций или данные из регистрового файла, что затруднило бы реализацию однотактного процессора, где каждая инструкция должна выполняться ровно за один такт). + +Обычно синтезатор сам понимает, какой вид памяти подходит под описанную схему на языке SystemVerilog. + +В случае, если под описанную схему подходит несколько видов памяти, есть возможность выбрать конкретную вручную, причем способы могут различаться от производителя к производителю, поэтому за подробностями лучше обращаться к документации. Например у Xilinx за это отвечает [следующий раздел](https://docs.xilinx.com/r/en-US/ug901-vivado-synthesis/RAM-HDL-Coding-Techniques) документации по синтезу. + +## Инструменты для реализации памяти + +### Описание памяти на языке SystemVerilog + +Память на языке SystemVerilog объявляется [подобно регистрам](../../Basic%20Verilog%20structures/Registers.md), используя ключевое слово `logic`. Но, кроме разрядности (разрядности ячеек памяти, в данном случае) после имени регистра (памяти, в данном случае) указывается количество создаваемых ячеек либо в виде натурального числа, либо в виде диапазона адресов этих ячеек.: + +```SystemVerilog +logic [19:0] memory1 [16]; // memory1 и memory2 являются полностью +logic [19:0] memory2 [0:15]; // идентичными памятями. + +logic [19:0] memory3 [15:0]; // memory3 будет такой же памятью, что и + // предыдущие, но на временной диаграмме + // Vivado при ее отображении сперва будут + // идти ячейки, начинающиеся со старших + // адресов (что в рамках данного курса + // лабораторных работ будет скорее минусом). + + +logic [19:0] memory3 [1:16]; // А вот memory3 хоть и совпадает по + // размеру с предыдущими реализациями, + // но отличается по адресному пространству + // обращение по нулевому адресу выдаст + // недетерминированный результат. Это не + // значит что память будет плохой или + // дефектной, просто надо учитывать эту её + // особенность. +``` + +В приведенном листинге `logic [19:0] memory1 [16];` создается память с шестнадцатью (от 0-го до 15-го адреса) 20-битными ячейками памяти. В таком случае говорят, что ширина памяти 20 бит, а глубина 16. Для адресации такой памяти потребуется адрес с разрядностью ceil(log2(16)) = 4 бита (`ceil` — операция округления вверх). Это однопортовая память. + +Для обращения к конкретной ячейке памяти используются квадратные скобки с указанием нужного адреса `memory[addr]`. Грубо говоря, то, что указывается в квадратных скобках будет подключено ко входу адреса памяти `memory`. + +Реализация асинхронного подключения к выходу памяти осуществляется оператором `assign`. А, если требуется создать память с синхронным чтением, то присваивание выходу требуется описать внутри блока`always_ff`. + +Так как запись в память является синхронным событием, то описывается она в конструкции `always_ff`. При этом, как и при описании регистра, можно реализовать управляющий сигнал разрешения на запись через блок вида `if(write_enable)`. + +```SystemVerilog +module mem16_20 ( // создать блок с именем mem16_20 + input logic clk, // вход синхронизации + input logic [3:0] addr, // адресный вход + input logic [19:0] write_data, // вход данных для записи + input logic write_enable, // сигнал разрешения на запись + output logic [19:0] async_read_data// асинхронный выход считанных данных + output logic [19:0] sync_read_data // синхронный выход считанных данных +); + + logic [19:0] memory [0:15]; // создать память с 16-ю + // 20-битными ячейками + + // асинхронное чтение + assign read_data = memory[addr]; // подключить к выходу async_read_data + // ячейку памяти по адресу addr + // (асинхронное чтение) + + // синхронное чтение + always_ff(@posedge clk) begin // поставить перед выходом sync_read_data + sync_read_data <= memory[addr]; // регистр, в который каждый такт будут + end // записываться считываемые данные + + // запись + always_ff @ (posedge clk) begin // каждый раз по фронту clk + if(write_enable) begin // если сигнал write_enable == 1, то + memory[addr] <= write_data; // в ячейку по адресу addr будут записаны + // данные сигнала write_data + end + end +endmodule +``` + +В случае реализации ПЗУ нет необходимости в описании входов для записи. В таком случае описание памяти занимает всего пару строк. Чтобы инициализировать такую память (то есть поместить в нее начальные значения, чтобы было что из нее читать), требуемое содержимое нужно добавить к прошивке, вместе с которой данные попадут в ПЛИС. Для этого в проект добавляется текстовый файл с содержимым памяти (более подробно об этом в [`Как добавить файл с содержимым памяти в проект`](../../Vivado%20Basics/How%20to%20add%20a%20mem-file.md)). Для того, чтобы отметить данный файл в качестве инициализирующего память, необходимо использовать одну из двух системных функций: `$readmemh` и `$readmemb`. `$readmemh` используется для файлов, описывающих содержимое памяти 16-ричными цифрами, в то время как `$readmemb` используется для файлов, описывающих содержимое памяти двоичными цифрами. Любую из этих системных функций необходимо поместить внутрь блока `initial`. У этих системных функций есть два обязательных аргумента: + +- имя инициализирующего файла +- имя инициализируемой памяти + +и два опциональных: + +- стартовый адрес, начиная с которого память будет проинициализирована данным файлом (по-умолчанию равен нулю) +- конечный адрес, на котором инициализация закончится (даже если в файле были ещё какие-то данные). + +Пример полного вызова одной из этих системных функций выглядит так: + +`$readmemb("",,,);` + +Однако на деле обычно используются только обязательные аргументы: + +`$readmemb("",);` + +Пример описанной выше памяти: + +```SystemVerilog +module rom16_8 ( + input logic [3:0] addr1, // первый 4-битный адресный вход + input logic [3:0] addr2, // второй 4-битный адресный вход + output logic [7:0] read_data1, // первый 8-битный выход считанных данных + output logic [7:0] read_data2 // второй 8-битный выход считанных данных +); + + logic [7:0] ROM [0:15]; // создать память с 16-ю 8-битными ячейками + + initial begin + $readmemh("mem.txt", ROM); // поместить в память RAM содержимое + end // файла mem.txt + + + assign read_data1 = R0M[addr1]; // реализация первого порта на чтение + assign read_data2 = R0M[addr2] // реализация второго порта на чтение + +endmodule +``` + +Содержимое файла `mem.txt`, к примеру может быть таким (каждая строка соответствует значению отдельной ячейки памяти, начиная со стартового адреса): + +```hex + FA + E6 + 0D + 15 + A7 +``` + +## Задание по реализации памяти + +Необходимо описать на языке SystemVerilog следующие три вида памяти: + +### 1. Память инструкций + +У данной памяти будет два порта: + +- 32-битный вход адреса +- 32-битный выход данных (асинхронное чтение) + +```SystemVerilog +mоdulе instr_mеm( + inрut logic [31:0] addr_i, + оutрut logic [31:0] rеаd_dаtа_o +); + +``` + +Из [теории про память](#теория-про-память) вы могли догадаться, что такой модуль описывает память ёмкостью `4 GiB`. Однако в реальности, наша память будет куда меньше (в ПЛИС попросту не хватит ресурсов на реализацию памяти подобного объёма). + +На практике, внутри данного модуля вы должны будете реализовать память с 1024-мя 8-битными ячейками. + +Как так вышло, что разрядность ячеек отличается от разрядности выходного сигнала? +Дело в том, что по спецификации процессор RISC-V должен работать с памятью с побайтовой адресацией. Байтовая адресация означает, что процессор способен обращаться к отдельным байтам в памяти (за каждым байтом памяти закреплен свой индивидуальный адрес). + +Именно поэтому, ячейки памяти должны быть восьмибитными. + +Однако в то же время, инструкции процессора будут 32-битными (состоящими из 4 подряд идущих байт), поэтому выходной сигнал данной памяти будет 32-разрядным. +Как сделать так, чтобы подавать на выход 4 подряд идущих байта? С помощью [конкатенации](../../Basic%20Verilog%20structures/Concatenation.md). + +На вход реализуемого вами модуля приходит адрес младшего байта инструкции, которую вы должны вернуть (этот адрес всегда будет кратен четырем, поскольку в наших лабах инструкции всегда будут состоять из 4 байт). + +На выход необходимо подать 32-разрядную склейку: + +![../../.pic/Labs/lab_03_memory/fig_03.drawio.png](../../.pic/Labs/lab_03_memory/fig_03.drawio.png) + +*Рисунок 3. Пример склейки для чтения* + +Обращение в эту память по адресам, превышающим `1020` должны выдавать значение `32'd0`. Почему именно `1020`? Если обратиться по адресу `1021` (чего произойти не может, т.к. адрес всегда будет кратен четырем, но предположим что такое обращение все-таки произошло), то вы должны будете вернуть данные из ячеек памяти по адресам: `1021`, `1022`, `1023` и `1024`. При этом ячейки по адресу 1024 уже не будет (ведь 1024 ячейки расположатся по адресам `[0:1023]`). + +Как реализовать подобный функционал? Разумеется, с помощью [мультиплексора](../../Basic%20Verilog%20structures/Multiplexors.md). + +В данном случае, вы можете либо воспользоваться конструкцией `if-else` в блоке `always_comb`, либо **тернарным условным оператором** во время реализации **непрерывного присваивания**. В любом из случаев, вам нужно будет реализовать условие того, что пришедшее значение на шине адреса попадает в диапазон допустимых адресов. Если это так, вернуть склейку данных из памяти, начинающихся с этого адреса, в противном случае — вернуть 0. + +### 2. Память данных + +У данной памяти будет 6 портов: + +- вход тактового синхроимпульса +- вход запроса на работу с памятью +- вход сигнала разрешения записи +- 32-битный вход адреса +- 32-битный вход данных записи +- 32-битный выход данных синхронного чтения + +```SystemVerilog +mоdulе data_mеm( + inрut logic clk_i, + input logic mem_req_i, + inрut logic write_enable_i, + inрut logic [31:0] addr_i, + inрut logic [31:0] write_data_i, + оutрut logic [31:0] rеаd_dаtа_o +); + +``` + +Идея этой памяти повторяет идею памяти инструкций: несмотря на разрядность адреса и данных, внутри будет память, состоящая из 4096-и 8-битных ячеек. + +Однако в отличие от памяти инструкций, в память данных добавлено два управляющих сигнала (`mem_req_i`и `write_enable_i`). Сигнал `mem_req_i` является сигналом запроса на работу с памятью. Без этого сигнала память не должна выполнять операции чтения/записи (вне зависимости от сигнала `write_enable`, определяющего происходит сейчас запись или чтение). Как сделать так, чтобы не происходило чтение без запроса? Например возвращать на шину чтения специальное "магическое число". + +- В случае `mem_req_i == 0` или `write_enable_i == 1` (т.е. когда не выполняется операция), на выходе `read_data_o` должно оказаться значение `32'hfa11_1eaf` (поскольку `1` схожа с латинским символом `l`, это выражение можно прочесть как `fall_leaf`). +- В случае, если `mem_req_i == 1` и значение `addr_i` **попадает** в диапазон [0:4095], на выходе `read_data_o` должна оказаться склейка из 4 значений ячеек памяти, начиная ячейки, размещенной по пришедшему адресу (обратите внимание, что в отличие от памяти инструкций, мы **не уменьшаем** диапазон допустимых значений до `[0:4092]`, поскольку архитектура RISC-V допускает обращение в одну отдельную ячейку памяти). +- В случае, если `mem_req_i == 1` и значение `addr_i` **не попадает** в диапазон [0:4095], на выходе `read_data_o` должно оказаться магическое число `32'hdead_beef`. + +Зачем нужны эти магические числа `32'hfa11_1eaf` и `32'hdead_beef`? У этих чисел легко узнаваемая сигнатура, позволяющая обратить на них внимание. В случае, если при чтении из памяти в регистровый файл попадут эти значения, увидев их вы сможете почувствовать что "что-то не то", и проверить: а было ли в памяти по указанному адресу действительно такое значение (в отличие от значения `32'h0000_0000`, которое не вызовет у вас никаких вопросов). Вероятность того, что такие числа возникнут в естественном ходе работы программы достаточно мала, а значит скорее всего если вы встретите эти числа — это сигнал того, что что-то в вашем процессоре работает неправильно (например, произошло обращение за пределы памяти, или неправильно формируется сигнал `mem_req_i`). + +Если `mem_req_i == 1` и `write_enable_i == 1` происходит запрос на запись в память. В этом случае, необходимо по положительному фронту `clk_i` записать в четыре подряд идущие ячейки, начиная с той, что расположена по адресу `addr_i` соответствующие байты с шины `write_data_i`. Во всех других случаях (любой из сигналов `mem_req_i`, `write_enable_i` равен нулю), запись в память не производится. + +![../../.pic/Labs/lab_03_memory/fig_04.drawio.png](../../.pic/Labs/lab_03_memory/fig_04.drawio.png) + +*Рисунок 4. Пример склейки для записи* + +### 3. Регистровый файл + +У данного модуля будет 8 портов: + +- вход тактового синхроимпульса +- вход сигнала разрешения записи +- 5-битный вход первого адреса чтения +- 5-битный вход второго адреса чтения +- 5-битный вход адреса записи +- 32-битный вход данных записи +- 32-битный выход данных асинхронного чтения по первому адресу +- 32-битный выход данных асинхронного чтения по второму адресу + +```SystemVerilog +mоdulе rf_r𝚒sсv( + inрut logic сlk_i, + inрut logic write_enable_i, + + inрut logic [ 4:0] write_addr_i, + inрut logic [ 4:0] read_addr1_i, + inрut logic [ 4:0] read_addr2_i, + + inрut logic [31:0] write_data_i, + оutрut logic [31:0] read_data1_o, + оutрut logic [31:0] read_data2_o +); + +``` + +На языке SystemVerilog необходимо реализовать модуль регистрового файла (`rf_r𝚒sсv`) для процессора с архитектурой RISC-V, представляющего собой трехпортовую ОЗУ с двумя портами на чтение и одним портом на запись и состоящей из 32-х 32-битных регистров с именем `rf_mem`. + +При этом по адресу `0` должно всегда считываться значение `0` вне зависимости от того, какое значение в этой ячейке памяти, и есть ли она вообще. Такая особенность обусловлена тем, что при выполнении операций очень часто используется ноль (сравнение с нулем, инициализация переменных нулевым значением, копирование значения одного регистра в другой посредством сложения с нулем и записи результата и т.п.). + +Как и в случае реализации [памяти инструкций](#1-память-инструкций), вы можете решить эту задачу с помощью мультиплексора, управляющим сигналом которого является сигнал сравнения адреса на чтение с нулем. + +Либо же можно проинициализировать нулевую ячейку памяти нулем с запретом записи в неё каких-либо значений. В этом случае в ячейке всегда будет ноль, а значит и считываться с нулевого адреса будет только он. + +### 4. Проверка в ПЛИС + +Последним этапом будет проверка работоспособности вашего регистрового файла в ПЛИС (файлы для прошивки как обычно расположены в папке [board files](board%20files)). + +Разработанные блоки будут использованы при реализации процессора `CYBERcobra 3000 Pro 2.0` и последующих лабораторных для реализации системы с процессором с архитектурой RISC-V. + +## Порядок выполнения работы + +1. Внимательно ознакомьтесь с заданием. В случае возникновения вопросов, проконсультируйтесь с преподавателем. +2. Реализуйте память инструкций. Для этого: + 1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `instr_mem.sv`. + 2. Опишите в нем модуль памяти инструкций с таким же именем и портами, как указано в задании. + 1. Сперва необходимо создать память (массив регистров). Как это сделать, сказано в разделе [описание памяти на языке SystemVerilog](#описание-памяти-на-языке-systemverilog). Разрядность ячеек памяти должна быть 8 бит, количество ячеек — 1024. + 2. Добавить в проект [`файл с содержимым памяти инструкций`](program.txt)([`как добавить файл, инициализирующий память`](../../Vivado%20Basics/How%20to%20add%20a%20mem-file.md)). Данный файл будет использоваться при вызове системной функции `$readmemh` в описании памяти инструкций. + 3. К созданной памяти необходимо подключить выход модуля `read_data_o`. При подключении должен быть использован вход модуля `addr_i` и оператор [конкатенации](../../Basic%20Verilog%20structures/Concatenation.md). + 4. При подключении выхода `read_data_o` помните, что чтение по адресам, превышающим `1020` должно возвращать `0`. + 3. После описания памяти инструкций, её необходимо проверить с помощью тестового окружения. + 1. Тестовое окружение находится [`здесь`](tb_instr_mem.sv). + 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). + 3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_instr_mem`). + 4. **Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста!** +3. Реализуйте память данных. Для этого: + 1. В `Design Sources` проекта создайте `SystemVerilog`-файл `data_mem.sv`. + 2. Опишите в нем модуль памяти данных с таким же именем и портами, как указано в задании. + 1. Описание модуля будет схожим с описанием модуля памяти инструкций, однако порт чтения в этот раз будет **синхронным** (запись в него будет происходить в блоке `always_ff`). Кроме того необходимо будет описать логику записи данных в память. + 2. Запись в ячейки памяти описывается подобно записи данных в [регистры](../../Basic%20Verilog%20structures/Registers.md), только при этом, происходит доступ к конкретной ячейке памяти с помощью входа `addr_i` (как осуществляется доступ к ячейкам памяти сказано в разделе [описание памяти на языке SystemVerilog](#описание-памяти-на-языке-systemverilog)). + 3. Необходимо помнить, что запись будет вестись в 4 ячейки памяти одновременно: ту, на которую указывает адрес и следующие за ней три ячейки. + 4. Обратите внимание что работа с памятью должна осуществляться только когда сигнал `mem_req_i == 1`, в противном случае запись не должна производиться, а на шину `read_data_o` должно возвращаться магическое число `32'hfall_leaf`. + 5. Как и в памяти инструкций, при чтении по адресам вне допустимого диапазона (только в этот раз старше адреса `1023`), на шине `read_data_o` должно выставляться значение `32'hdead_beaf`. + 3. После описания памяти данных, её необходимо проверить с помощью тестового окружения. + 1. Тестовое окружение находится [`здесь`](tb_data_mem.sv). + 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). + 3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_data_mem`). + 4. **Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста!** +4. Реализуйте регистровый файл. Для этого: + 1. В `Design Sources` проекта создайте `SystemVerilog`-файл `rf_riscv.sv`. + 2. Опишите в нем модуль регистрового файла с таким же именем и портами, как указано в задании. + 1. В отличии от памяти инструкций и данных, ячейки памяти регистрового файла должны быть 32-битными (а на 8-битными). Это означает, что реализация портов чтения и записи будет проще. + 2. Не забывайте, что у вас 2 порта на чтение и 1 порт на запись, при этом каждый порт не зависит от остальных (в модуле 3 независимых входа адреса). + 3. Чтение из нулевого регистра (чтение по адресу 0) всегда должно возвращать нулевое значение. Этого можно добиться двумя путями: + 1. Путем добавления мультиплексора перед выходным сигналом чтения (мультиплексор будет определять, пойдут ли на выход данные из ячейки регистрового файла, либо в случае если адрес равен нулю, на выход пойдет константа ноль). + 2. Путем инициализации нулевого регистра нулевым значением и запретом записи в этот регистр (при записи и проверки write_enable добавить дополнительную проверку на адрес). + 4. Каким образом будет реализована эта особенность регистрового файла не важно, выберите сами. + 3. После описания регистрового файла, его необходимо проверить с помощью [`тестового окружения`](../../Basic%20Verilog%20structures/Testbench.md). + 1. Тестовое окружение находится [`здесь`](tb_rf_riscv.sv). + 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). + 3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_rf_riscv`). + 4. **Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста!** +5. Добавьте в проект модуль верхнего уровня ([nexys_rf_riscv.sv](board%20files/nexys_rf_riscv.v)), соединяющий регистровый файл с периферией в ПЛИС. Описание модуля находится [здесь](board%20files) +6. Подключите к проекту файл ограничений ([nexys_a7_100t.xdc](board%20files/nexys_a7_100t.xdc)), если тот еще не был подключен, либо замените его содержимое данными из файла к этой лабораторной работе. +7. Проверьте работу регистрового файла в ПЛИС. diff --git a/Labs/03. Register file and memory/board files/README.md b/Labs/03. Register file and memory/board files/README.md new file mode 100644 index 0000000..67f0b56 --- /dev/null +++ b/Labs/03. Register file and memory/board files/README.md @@ -0,0 +1,39 @@ +# Проверка работы регистрового файла на ПЛИС + +Если вы не понимаете, что лежит в этой папке, или если надо вспомнить, как прошить ПЛИС, можно воспользоваться [`этой инструкцией`](../../../Vivado%20Basics/Program%20nexys%20a7.md) + +Для работы с регистровым файлом, необходимо выставлять сигналы адресов и данных. +У платы недостаточно переключателей, для такого количества входов регистрового файла, поэтому подача сигналов на вход происходит в несколько этапов. +Сперва можно ввести один из адресов регистрового файла (`A1`/`A2`/`A3`). Ввод осуществляется через `SW[4:0]`. Для того, чтобы выставить введенный адрес на какой-то из входов адреса, необходимо нажать одну из следующих кнопок: + +1. `BTNL` чтобы выставить значение с `SW[4:0]` на `A1` +2. `BTNC` чтобы выставить значение с `SW[4:0]` на `A2` +3. `BTNR` чтобы выставить значение с `SW[4:0]` на `A3` + +(расположение кнопок смотри на изображениях ниже). + +После выставления адресов, переключатели можно использовать в качестве ввода первых шестнадцати бит данных. Для записи введенных данных по адресу `A3` используется кнопка `BTND`, для чтения данных по адресам `A1`, `A2` (с выводом результатов чтения на семисегментные индикаторы) используется кнопка `BTNU`. + +Управление регистровым файлом. + +![../../../.pic/Labs/board%20files/nexys_rf1.jpg](../../../.pic/Labs/board%20files/nexys_rf1.jpg) + +Ниже показан пример последовательности действий для работы с платой. + +Установка значения `5'b10101` на входы `A1`,`A2`,`A3`. + +![../../../.pic/Labs/board%20files/nexys_rf2.jpg](../../../.pic/Labs/board%20files/nexys_rf2.jpg) + +Запись информации по адресу А3. + +![../../../.pic/Labs/board%20files/nexys_rf3.jpg](../../../.pic/Labs/board%20files/nexys_rf3.jpg) + +Чтение по адресам А1 и А2. + +![../../../.pic/Labs/board%20files/nexys_rf4.jpg](../../../.pic/Labs/board%20files/nexys_rf4.jpg) + +Для того чтобы считать информацию по любому адресу, достаточно установить желаемый адрес на один из портов чтения и нажать на кнопку чтения. + +![../../../.pic/Labs/board%20files/nexys_rf5.jpg](../../../.pic/Labs/board%20files/nexys_rf5.jpg) + +Попробуйте записать информацию в нулевой регистр, затем по другим адресам, после чего считайте записанную информацию и убедитесь, что она соответствует той, которую вы записывали (с учетом особенностей регистрового файла RISC-V). diff --git a/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc b/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc new file mode 100644 index 0000000..a27cb13 --- /dev/null +++ b/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc @@ -0,0 +1,211 @@ +## This file is a general .xdc for the Nexys A7-100T +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +# Clock signal +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100 }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK100}]; + + +#Switches +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { SW[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { SW[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { SW[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { SW[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { SW[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { SW[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { SW[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { SW[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { SW[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { SW[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { SW[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { SW[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { SW[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { SW[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + +### LEDs +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { LED[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { LED[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { LED[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { LED[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { LED[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { LED[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { LED[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { LED[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { LED[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { LED[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { LED[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { LED[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +## RGB LEDs +set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b +set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g +set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { LED17_B }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { LED17_G }]; #IO_0_14 Sch=led17_g +set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED17_R }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + +##7 segment display +set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { CA }]; #IO_L24N_T3_A00_D16_14 Sch=ca +set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { CB }]; #IO_25_14 Sch=cb +set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { CC }]; #IO_25_15 Sch=cc +set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { CD }]; #IO_L17P_T2_A26_15 Sch=cd +set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { CE }]; #IO_L13P_T2_MRCC_14 Sch=ce +set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { CF }]; #IO_L19P_T3_A10_D26_14 Sch=cf +set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { CG }]; #IO_L4P_T0_D04_14 Sch=cg +set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp +set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { AN[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { AN[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { AN[6] }]; #IO_L23P_T3_35 Sch=an[6] +set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + +##Buttons +set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn +set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc +set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu +set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl +set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { BTNR }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers +##Pmod Header JA +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { JA[1] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { JA[2] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { JA[3] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { JA[4] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { JA[7] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { JA[8] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { JA[9] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { JA[10] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + +##Pmod Header JB +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { JB[1] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { JB[2] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { JB[3] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { JB[4] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { JB[7] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { JB[8] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { JB[9] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { JB[10] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + +##Pmod Header JC +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { JC[1] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { JC[2] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { JC[3] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { JC[4] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { JC[7] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { JC[8] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { JC[9] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { JC[10] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + +##Pmod Header JD +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { JD[1] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { JD[2] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { JD[3] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { JD[4] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { JD[7] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { JD[8] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { JD[9] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { JD[10] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + +##Pmod Header JXADC +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVCMOS33 } [get_ports { XA_N[1] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVCMOS33 } [get_ports { XA_P[1] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { XA_N[2] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { XA_P[2] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { XA_N[3] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVCMOS33 } [get_ports { XA_P[3] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { XA_N[4] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { XA_P[4] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + +##VGA Connector +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { VGA_HS }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { VGA_VS }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { SD_RESET }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { SD_CD }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { SD_SCK }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { SD_CMD }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + +##Accelerometer +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { ACL_MISO }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { ACL_MOSI }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { ACL_SCLK }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { ACL_CSN }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + +##Temperature Sensor +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { TMP_SCL }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { TMP_SDA }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { TMP_INT }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { TMP_CT }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { M_CLK }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { M_DATA }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel + +##PWM Audio Amplifier +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { AUD_SD }]; #IO_L6P_T0_15 Sch=aud_sd + +##USB-RS232 Interface +#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { UART_TXD_IN }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { UART_RXD_OUT }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { UART_CTS }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { UART_RTS }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { PS2_CLK }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { PS2_DATA }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + +##SMSC Ethernet PHY +#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDC }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDIO }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { ETH_RSTN }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { ETH_CRSDV }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv +#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXERR }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXEN }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { ETH_REFCLK }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { ETH_INTN }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + +##Quad SPI Flash +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn \ No newline at end of file diff --git a/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv b/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv new file mode 100644 index 0000000..2e12e57 --- /dev/null +++ b/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv @@ -0,0 +1,141 @@ +`timescale 1ns / 1ps + +module nexys_rf_riscv( + input CLK100, + input resetn, + input BTND, BTNU, BTNL, BTNR, BTNC, + input [15:0] SW, + output [15:0] LED, + output CA, CB, CC, CD, CE, CF, CG, DP, + output [7:0] AN, + output LED16_B, LED16_G, LED16_R, LED17_B, LED17_G, LED17_R + ); + +wire [31:0] WD3; +wire WE; +wire [31:0] RD1; +wire [31:0] RD2; + +localparam pwm = 1000; +reg [9:0] counter; +reg [3:0] semseg; +reg [7:0] ANreg; +reg CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr; +reg [15:0] LEDr; + +reg [4:0] a1; +reg [4:0] a2; +reg [4:0] a3; +reg [31:0] rd1; +reg [31:0] rd2; + +rf_riscv DUT +( + .clk (CLK100), + .A1 (a1), + .A2 (a2), + .A3 (a3), + .WD3 (WD3), + .WE (WE), + + .RD1 (RD1), + .RD2 (RD2) +); + +assign LED = {1'b0, a1, a2, a3}; +assign AN[7:0] = ANreg[7:0]; +assign {CA, CB, CC, CD, CE, CF, CG, DP} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr}; +assign LED16_G = BTNC | BTNR; +assign LED17_G = BTNL | BTNR; +assign {LED16_R, LED17_R} = {2{BTND}}; +assign {LED16_B, LED17_B} = {2{BTNU}}; + +assign WD3 = 32'b0 | SW[15:0]; +assign WE = BTND; + + +always @(posedge CLK100) begin + if (!resetn) begin + counter <= 'b0; + ANreg[7:0] <= 8'b11111111; + {CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr} <= 8'b11111111; + {a1, a2, a3} <= 'b0; + {rd1, rd2} <= 'b0; + end + else begin + if (counter < pwm) counter = counter + 'b1; + else begin + counter = 'b0; + ANreg[1] <= ANreg[0]; + ANreg[2] <= ANreg[1]; + ANreg[3] <= ANreg[2]; + ANreg[4] <= ANreg[3]; + ANreg[5] <= ANreg[4]; + ANreg[6] <= ANreg[5]; + ANreg[7] <= ANreg[6]; + ANreg[0] <= !(ANreg[6:0] == 7'b1111111); + end + a1 <= BTNL? SW[4:0]: a1; + a2 <= BTNC? SW[4:0]: a2; + a3 <= BTNR? SW[4:0]: a3; + + rd1 <= BTNU? RD1: rd1; + rd2 <= BTNU? RD2: rd2; + + case (1'b0) + ANreg[0]: begin + semseg <= (rd2) % 5'h10; + //DPr <= 1'b1; + end + ANreg[1]: begin + semseg <= (rd2 / 'h10) % 5'h10; + //DPr <= 1'b1; + end + ANreg[2]: begin + semseg <= (rd2 / 'h100) % 5'h10; + //DPr <= 1'b1; + end + ANreg[3]: begin + semseg <= (rd2 / 'h1000) % 5'h10; + //DPr <= 1'b1; + end + ANreg[4]: begin + semseg <= (rd1) % 5'h10; + //DPr <= 1'b1; + end + ANreg[5]: begin + semseg <= (rd1 / 'h10) % 5'h10; + //DPr <= 1'b1; + end + ANreg[6]: begin + semseg <= (rd1 / 'h100) % 5'h10; + //DPr <= 1'b1; + end + ANreg[7]: begin + semseg <= (rd1 / 'h1000) % 5'h10; + //DPr <= 1'b1; + end + endcase + case (semseg) + 4'h0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; + 4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001111; + 4'h2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010; + 4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110; + 4'h4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100; + 4'h5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100; + 4'h6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000; + 4'h7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111; + 4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000; + 4'h9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100; + 4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; + 4'hB: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000; + 4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001; + 4'hD: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010; + 4'hE: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000; + 4'hF: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0111000; + default: {CAr,CBr,CCr,CDr, CEr, CFr, CGr} <= 7'b0111111; + endcase + end + end + +endmodule diff --git a/Labs/03. Register file and memory/program.txt b/Labs/03. Register file and memory/program.txt new file mode 100644 index 0000000..402227d --- /dev/null +++ b/Labs/03. Register file and memory/program.txt @@ -0,0 +1,1024 @@ +52 +60 +b0 +46 +30 +17 +7e +9f +4c +7e +61 +9f +ae +95 +82 +26 +28 +5a +e9 +80 +d6 +a0 +91 +92 +ac +df +34 +37 +de +9c +2b +a0 +18 +03 +27 +bf +76 +59 +9f +69 +05 +24 +0d +f9 +ec +a7 +b1 +16 +f1 +f8 +95 +e3 +35 +c8 +9f +77 +82 +65 +df +ae +12 +cd +2b +97 +cd +da +dd +2f +d5 +66 +9b +77 +f9 +c0 +9d +7d +27 +db +a4 +1f +ab +92 +0c +40 +6f +01 +8d +76 +47 +35 +5d +0b +79 +f2 +37 +78 +b7 +6c +4f +91 +18 +9f +a2 +4c +b4 +6e +14 +da +90 +09 +d2 +f9 +87 +5c +96 +db +bc +39 +b7 +5f +13 +d8 +fc +8a +af +0e +53 +68 +78 +19 +f2 +f4 +61 +de +bd +44 +9d +25 +ae +37 +d1 +23 +ca +d8 +52 +e1 +35 +31 +09 +55 +b2 +3a +f8 +6e +64 +fc +ea +5f +58 +47 +26 +d8 +73 +62 +ac +f7 +ab +32 +51 +d1 +3c +b2 +28 +70 +d0 +c3 +2f +85 +a2 +97 +5d +94 +a9 +27 +a0 +31 +f4 +4e +55 +78 +78 +28 +11 +78 +f7 +db +ea +33 +c4 +03 +05 +78 +ab +02 +70 +91 +e4 +be +fa +43 +4d +19 +98 +ad +c1 +1e +8c +d3 +82 +c1 +95 +a6 +7d +3b +c0 +20 +9c +59 +46 +54 +d9 +1b +e8 +37 +5d +77 +b8 +bd +fc +a3 +a6 +ee +c0 +7e +ee +ee +d6 +ee +56 +9d +1f +30 +c7 +ce +6a +05 +b4 +d1 +16 +ab +83 +76 +d2 +f5 +be +c4 +cd +f7 +0a +e6 +e5 +82 +9f +b2 +5c +e0 +30 +1d +fb +ff +10 +30 +90 +90 +20 +ea +99 +04 +64 +60 +92 +1b +dc +aa +ef +c5 +66 +8b +6f +40 +45 +14 +05 +66 +49 +51 +fa +56 +84 +38 +fd +d1 +e3 +c5 +35 +09 +6c +31 +9b +ee +3e +3f +36 +8a +22 +da +e8 +d8 +55 +33 +ee +ca +82 +27 +1b +71 +1e +e8 +6b +ad +c8 +77 +e0 +dc +b1 +8e +a6 +60 +cf +4e +9b +d1 +0c +d3 +bf +f1 +61 +ea +0c +b0 +18 +d8 +6c +24 +f3 +77 +3d +5d +f4 +aa +f9 +28 +12 +86 +01 +b0 +74 +35 +51 +ee +07 +65 +ba +d2 +cc +7c +42 +40 +db +33 +05 +aa +f6 +90 +05 +94 +3f +95 +39 +3b +b4 +41 +84 +85 +72 +ad +12 +95 +5c +da +dd +48 +48 +b4 +b4 +af +96 +33 +cb +c0 +0b +48 +12 +99 +ab +28 +8c +19 +87 +c9 +35 +35 +84 +f2 +05 +f9 +af +ea +01 +8a +13 +97 +4a +b7 +be +cd +d9 +9f +7a +c5 +41 +33 +43 +93 +2b +6a +6e +c6 +0c +6b +c4 +f3 +4f +0d +5e +b7 +ae +70 +e5 +14 +31 +68 +fc +3d +ee +3e +ee +1f +d5 +8e +3f +9a +ff +b0 +ae +b6 +21 +60 +4b +87 +a8 +d7 +06 +0c +5d +1d +17 +45 +28 +d0 +4d +58 +3e +5d +b0 +f6 +79 +99 +34 +2c +c9 +64 +06 +32 +7c +0a +ef +cc +3b +57 +09 +20 +3c +45 +77 +44 +4e +f8 +f8 +05 +b3 +55 +95 +7d +5d +53 +60 +82 +f1 +fa +86 +51 +f0 +7d +c4 +c5 +e4 +67 +3f +08 +5a +23 +c6 +ff +d9 +b4 +b5 +64 +66 +c5 +a8 +bd +49 +b4 +e4 +81 +5a +29 +56 +3c +97 +6c +d0 +83 +fa +50 +8b +80 +9c +eb +93 +32 +55 +30 +b6 +88 +4c +3a +fb +8c +65 +c9 +60 +46 +db +1a +37 +db +58 +36 +13 +f5 +00 +d2 +36 +ae +f3 +2a +61 +2c +02 +4c +d4 +4f +7e +02 +67 +3a +d8 +87 +59 +d3 +81 +bb +54 +15 +51 +8c +66 +f9 +74 +0b +d2 +95 +bc +47 +75 +d7 +1d +32 +27 +c9 +aa +bd +24 +98 +7b +14 +5f +ea +77 +e0 +97 +eb +88 +8f +11 +b5 +ee +e6 +df +01 +62 +ef +a3 +3f +33 +bd +a2 +19 +12 +04 +f4 +8c +22 +26 +7f +bf +6d +fa +1c +84 +fd +66 +f6 +3c +9f +8e +f9 +48 +6a +5e +09 +52 +6e +e2 +71 +ec +a2 +00 +09 +29 +23 +f8 +d7 +27 +af +88 +b8 +ef +8c +c1 +d3 +2f +74 +ce +2e +47 +a5 +7a +a9 +0b +17 +c0 +42 +61 +9c +dd +5c +8c +42 +92 +4f +73 +3b +fa +98 +ff +4d +1c +18 +0a +88 +cb +b1 +e7 +00 +28 +70 +62 +af +6c +73 +b1 +9d +31 +a1 +bf +89 +ae +1f +4a +c2 +ee +90 +9c +3c +d1 +76 +95 +d2 +72 +42 +2b +8a +b6 +7d +83 +9c +bb +c5 +a0 +ad +57 +44 +65 +1d +ae +f5 +d0 +a7 +bf +cb +e6 +47 +47 +e1 +a1 +40 +da +2a +20 +4c +d3 +91 +63 +b0 +94 +34 +4f +3c +05 +0d +c8 +c4 +25 +1f +0a +b1 +0c +44 +f2 +a4 +8d +aa +9b +f3 +c8 +2f +f4 +5a +ac +e3 +ef +fe +41 +f8 +9e +b5 +91 +0b +f0 +a9 +9d +42 +fa +d2 +36 +c0 +bd +29 +77 +8d +3e +a4 +93 +7d +59 +7b +33 +9d +03 +52 +94 +c8 +89 +67 +b3 +20 +be +c6 +72 +d0 +85 +28 +f2 +b2 +2f +ee +06 +b9 +6f +af +f6 +c6 +40 +c2 +7e +3e +e9 +0f +a4 +ca +33 +6c +98 +99 +2e +1b +1c +8d +fc +ce +73 +a9 +42 +d2 +4c +e8 +58 +e5 +e6 +78 +0c +44 +43 +3e +7f +d3 +58 +1f +8e +96 +0d +09 +7e +61 +76 +4e +f5 +87 +84 +da +0c +cb +46 +74 +f4 +5d +c7 +43 +9c +fd +ff +5f +b9 +c1 +b5 +7c +ba +c2 +40 +c8 +40 +0e +79 +67 +9b +84 +43 +36 +8e +11 +eb +18 +57 +f6 +38 +25 +82 +d2 +3d +9d +bc +15 +d4 +0a +70 +77 +37 +be +c6 +f4 +2d +bc +f1 +b0 +eb +a8 +d4 +9f +4f +f9 +5f +b5 +6a +73 +60 +fe +2d +0a +48 +74 +9b +c5 +d0 +03 +df +cc +04 +ef +90 +1a +12 +e6 +11 +74 +aa +2a +5f +ea +ef +93 +3d \ No newline at end of file diff --git a/Labs/03. Register file and memory/tb_data_mem.sv b/Labs/03. Register file and memory/tb_data_mem.sv new file mode 100644 index 0000000..7ed55ff --- /dev/null +++ b/Labs/03. Register file and memory/tb_data_mem.sv @@ -0,0 +1,130 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_data_mem +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for data memory +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_data_mem(); + +parameter ADDR_SIZE = 4096; +parameter TIME_OPERATION = 50; + + logic CLK; + logic REQ; + logic WE; + logic [31:0] A; + logic [31:0] WD; + logic [31:0] RD; + + data_mem DUT ( + .clk_i (CLK), + .mem_req_i (REQ), + .write_enable_i (WE ), + .addr_i (A ), + .write_data_i (WD), + .read_data_o (RD) + ); + + logic [31:0] RDa; + + integer i, err_count = 0; + + assign A = i; + + parameter CLK_FREQ_MHz = 100; + parameter CLK_SEMI_PERIOD= 1e3/CLK_FREQ_MHz/2; + + initial CLK <= 0; + always #CLK_SEMI_PERIOD CLK = ~CLK; + + initial begin + $timeformat(-9, 2, " ns", 3); + $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); + REQ = 1; + WE = 0; + i = 1; #10; + if (RD !== 32'hx) begin + $display("The data memory should not be initialized by the $readmemh function"); + err_count = err_count + 1; + end + for (i = 0; i < ADDR_SIZE; i = i + 4) begin + @(posedge CLK); + WE = 1; + WD = $urandom; + end + for (i = 0; i < (ADDR_SIZE+1); i = i + 1) begin + if (i != (ADDR_SIZE+1)) begin + REQ = |($urandom %10); + WE = 0; + #TIME_OPERATION; + RDa = RD; + WD = $urandom; + #TIME_OPERATION; + WE = $urandom % 2; + #TIME_OPERATION; + if ((WE && REQ || !REQ) && RD !== 32'd4195425967) begin + $display("When writing (write_enable_i = %h) read_data_o should be equal to fa11_1eaf, your data: %h_%h, time: %t", WE, RD[31:16],RD[15:0], $time); + err_count = err_count + 1; + end + if ((!WE && REQ) && RD !== RDa) begin + $display("When reading (write_enable_i = %h), the data %h is overwritten with data %h at address %h, time: %t", WE, RDa, RD, A, $time); + err_count = err_count + 1; + end + end + else begin + REQ = 1; + #TIME_OPERATION; + if (RD !== 32'd3735928559) begin + $display("When reading (write_enable_i = %h) at an address greater than 4095, it should return dead_beef yor data: %h_%h, time: %t", WE, RD[31:16],RD[15:0], $time); + err_count = err_count + 1; + end + end + #TIME_OPERATION; + end + #TIME_OPERATION; + REQ = 1; + WE = 1; + #TIME_OPERATION; + for (i = 0; i < 8; i = i + 4) begin + WD = i? 32'hfecd_ba98: 32'h7654_3210; + #TIME_OPERATION; + end + WE = 0; + i = 2; + #TIME_OPERATION; + if (RD !== 32'hba98_7654) begin + $display("data is being written to the cell incorrectly. RAM [0:7] must be 0x0123456789abcdef, time: %t", $time); + err_count = err_count + 1; + end + @(posedge CLK) + i = 0; + @(negedge CLK); + if (RD !== 32'hba98_7654) begin + $display("reading from data memory must be synchronous, time: %t", $time); + err_count = err_count + 1; + end + @(posedge CLK); #5; + if (RD !== 32'h7654_3210) begin + $display("synchronous data memory read error, time: %t", $time); + err_count = err_count + 1; + end + $display("Number of errors: %d", err_count); + if( !err_count ) $display("\ndata_mem SUCCESS!!!\n"); + $finish(); + end +endmodule diff --git a/Labs/03. Register file and memory/tb_instr_mem.sv b/Labs/03. Register file and memory/tb_instr_mem.sv new file mode 100644 index 0000000..4a7ba63 --- /dev/null +++ b/Labs/03. Register file and memory/tb_instr_mem.sv @@ -0,0 +1,8355 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_instr_mem +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for instruction memory +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_instr_mem(); + +parameter ADDR_SIZE = 1021; +parameter TIME_OPERATION = 100; + + wire [31:0] A; + wire [31:0] RD; + wire [31:0] RDref; + + instr_mem_ref8 DUTref( + .A(A), + .RD(RDref) + ); + + instr_mem DUT ( + .addr_i(A), + .read_data_o(RD) + ); + + integer i, err_count = 0; + + assign A = i; + + initial begin + $timeformat (-9, 2, "ns"); + $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); + for (i = 0; i < ADDR_SIZE; i = i + 1) begin + #TIME_OPERATION; + if ( RD !== RDref) begin + $display("time = %0t, address %h. Invalid data %h, correct data %h", $time, A, RD, RDref); + err_count = err_count + 1; + end + end + for (i = 1021; i < 1024; i = i + 1) begin + #TIME_OPERATION; + if ( RD !== 32'b0) begin + $display("time = %0t, ERROR! Addr = %d", $time, A, " %h != 0", RD); + err_count = err_count + 1; + end + end + $display("Number of errors: %d", err_count); + if( !err_count ) $display("\n instr_mem SUCCESS!!!\n"); + $finish(); + end + +endmodule + + +(* STRUCTURAL_NETLIST = "yes" *) +module instr_mem_ref8 + (A, + RD); + input [31:0]A; + output [31:0]RD; + + wire [31:0]A; + wire [9:0]A_IBUF; + wire [31:0]RD; + wire [31:0]RD_OBUF; + wire \RD_OBUF[0]_inst_i_10_n_0 ; + wire \RD_OBUF[0]_inst_i_11_n_0 ; + wire \RD_OBUF[0]_inst_i_12_n_0 ; + wire \RD_OBUF[0]_inst_i_13_n_0 ; + wire \RD_OBUF[0]_inst_i_2_n_0 ; + wire \RD_OBUF[0]_inst_i_3_n_0 ; + wire \RD_OBUF[0]_inst_i_4_n_0 ; + wire \RD_OBUF[0]_inst_i_5_n_0 ; + wire \RD_OBUF[0]_inst_i_6_n_0 ; + wire \RD_OBUF[0]_inst_i_7_n_0 ; + wire \RD_OBUF[0]_inst_i_8_n_0 ; + wire \RD_OBUF[0]_inst_i_9_n_0 ; + wire \RD_OBUF[10]_inst_i_10_n_0 ; + wire \RD_OBUF[10]_inst_i_11_n_0 ; + wire \RD_OBUF[10]_inst_i_2_n_0 ; + wire \RD_OBUF[10]_inst_i_3_n_0 ; + wire \RD_OBUF[10]_inst_i_4_n_0 ; + wire \RD_OBUF[10]_inst_i_5_n_0 ; + wire \RD_OBUF[10]_inst_i_6_n_0 ; + wire \RD_OBUF[10]_inst_i_7_n_0 ; + wire \RD_OBUF[10]_inst_i_8_n_0 ; + wire \RD_OBUF[10]_inst_i_9_n_0 ; + wire \RD_OBUF[11]_inst_i_10_n_0 ; + wire \RD_OBUF[11]_inst_i_11_n_0 ; + wire \RD_OBUF[11]_inst_i_2_n_0 ; + wire \RD_OBUF[11]_inst_i_3_n_0 ; + wire \RD_OBUF[11]_inst_i_4_n_0 ; + wire \RD_OBUF[11]_inst_i_5_n_0 ; + wire \RD_OBUF[11]_inst_i_6_n_0 ; + wire \RD_OBUF[11]_inst_i_7_n_0 ; + wire \RD_OBUF[11]_inst_i_8_n_0 ; + wire \RD_OBUF[11]_inst_i_9_n_0 ; + wire \RD_OBUF[12]_inst_i_10_n_0 ; + wire \RD_OBUF[12]_inst_i_11_n_0 ; + wire \RD_OBUF[12]_inst_i_2_n_0 ; + wire \RD_OBUF[12]_inst_i_3_n_0 ; + wire \RD_OBUF[12]_inst_i_4_n_0 ; + wire \RD_OBUF[12]_inst_i_5_n_0 ; + wire \RD_OBUF[12]_inst_i_6_n_0 ; + wire \RD_OBUF[12]_inst_i_7_n_0 ; + wire \RD_OBUF[12]_inst_i_8_n_0 ; + wire \RD_OBUF[12]_inst_i_9_n_0 ; + wire \RD_OBUF[13]_inst_i_2_n_0 ; + wire \RD_OBUF[13]_inst_i_3_n_0 ; + wire \RD_OBUF[13]_inst_i_4_n_0 ; + wire \RD_OBUF[13]_inst_i_5_n_0 ; + wire \RD_OBUF[13]_inst_i_6_n_0 ; + wire \RD_OBUF[13]_inst_i_7_n_0 ; + wire \RD_OBUF[13]_inst_i_8_n_0 ; + wire \RD_OBUF[14]_inst_i_10_n_0 ; + wire \RD_OBUF[14]_inst_i_11_n_0 ; + wire \RD_OBUF[14]_inst_i_2_n_0 ; + wire \RD_OBUF[14]_inst_i_3_n_0 ; + wire \RD_OBUF[14]_inst_i_4_n_0 ; + wire \RD_OBUF[14]_inst_i_5_n_0 ; + wire \RD_OBUF[14]_inst_i_6_n_0 ; + wire \RD_OBUF[14]_inst_i_7_n_0 ; + wire \RD_OBUF[14]_inst_i_8_n_0 ; + wire \RD_OBUF[14]_inst_i_9_n_0 ; + wire \RD_OBUF[15]_inst_i_10_n_0 ; + wire \RD_OBUF[15]_inst_i_11_n_0 ; + wire \RD_OBUF[15]_inst_i_12_n_0 ; + wire \RD_OBUF[15]_inst_i_13_n_0 ; + wire \RD_OBUF[15]_inst_i_2_n_0 ; + wire \RD_OBUF[15]_inst_i_3_n_0 ; + wire \RD_OBUF[15]_inst_i_4_n_0 ; + wire \RD_OBUF[15]_inst_i_5_n_0 ; + wire \RD_OBUF[15]_inst_i_6_n_0 ; + wire \RD_OBUF[15]_inst_i_7_n_0 ; + wire \RD_OBUF[15]_inst_i_8_n_0 ; + wire \RD_OBUF[15]_inst_i_9_n_0 ; + wire \RD_OBUF[16]_inst_i_10_n_0 ; + wire \RD_OBUF[16]_inst_i_11_n_0 ; + wire \RD_OBUF[16]_inst_i_2_n_0 ; + wire \RD_OBUF[16]_inst_i_3_n_0 ; + wire \RD_OBUF[16]_inst_i_4_n_0 ; + wire \RD_OBUF[16]_inst_i_5_n_0 ; + wire \RD_OBUF[16]_inst_i_6_n_0 ; + wire \RD_OBUF[16]_inst_i_7_n_0 ; + wire \RD_OBUF[16]_inst_i_8_n_0 ; + wire \RD_OBUF[16]_inst_i_9_n_0 ; + wire \RD_OBUF[17]_inst_i_10_n_0 ; + wire \RD_OBUF[17]_inst_i_11_n_0 ; + wire \RD_OBUF[17]_inst_i_2_n_0 ; + wire \RD_OBUF[17]_inst_i_3_n_0 ; + wire \RD_OBUF[17]_inst_i_4_n_0 ; + wire \RD_OBUF[17]_inst_i_5_n_0 ; + wire \RD_OBUF[17]_inst_i_6_n_0 ; + wire \RD_OBUF[17]_inst_i_7_n_0 ; + wire \RD_OBUF[17]_inst_i_8_n_0 ; + wire \RD_OBUF[17]_inst_i_9_n_0 ; + wire \RD_OBUF[18]_inst_i_10_n_0 ; + wire \RD_OBUF[18]_inst_i_11_n_0 ; + wire \RD_OBUF[18]_inst_i_2_n_0 ; + wire \RD_OBUF[18]_inst_i_3_n_0 ; + wire \RD_OBUF[18]_inst_i_4_n_0 ; + wire \RD_OBUF[18]_inst_i_5_n_0 ; + wire \RD_OBUF[18]_inst_i_6_n_0 ; + wire \RD_OBUF[18]_inst_i_7_n_0 ; + wire \RD_OBUF[18]_inst_i_8_n_0 ; + wire \RD_OBUF[18]_inst_i_9_n_0 ; + wire \RD_OBUF[19]_inst_i_10_n_0 ; + wire \RD_OBUF[19]_inst_i_11_n_0 ; + wire \RD_OBUF[19]_inst_i_2_n_0 ; + wire \RD_OBUF[19]_inst_i_3_n_0 ; + wire \RD_OBUF[19]_inst_i_4_n_0 ; + wire \RD_OBUF[19]_inst_i_5_n_0 ; + wire \RD_OBUF[19]_inst_i_6_n_0 ; + wire \RD_OBUF[19]_inst_i_7_n_0 ; + wire \RD_OBUF[19]_inst_i_8_n_0 ; + wire \RD_OBUF[19]_inst_i_9_n_0 ; + wire \RD_OBUF[1]_inst_i_10_n_0 ; + wire \RD_OBUF[1]_inst_i_11_n_0 ; + wire \RD_OBUF[1]_inst_i_12_n_0 ; + wire \RD_OBUF[1]_inst_i_13_n_0 ; + wire \RD_OBUF[1]_inst_i_2_n_0 ; + wire \RD_OBUF[1]_inst_i_3_n_0 ; + wire \RD_OBUF[1]_inst_i_4_n_0 ; + wire \RD_OBUF[1]_inst_i_5_n_0 ; + wire \RD_OBUF[1]_inst_i_6_n_0 ; + wire \RD_OBUF[1]_inst_i_7_n_0 ; + wire \RD_OBUF[1]_inst_i_8_n_0 ; + wire \RD_OBUF[1]_inst_i_9_n_0 ; + wire \RD_OBUF[20]_inst_i_10_n_0 ; + wire \RD_OBUF[20]_inst_i_11_n_0 ; + wire \RD_OBUF[20]_inst_i_2_n_0 ; + wire \RD_OBUF[20]_inst_i_3_n_0 ; + wire \RD_OBUF[20]_inst_i_4_n_0 ; + wire \RD_OBUF[20]_inst_i_5_n_0 ; + wire \RD_OBUF[20]_inst_i_6_n_0 ; + wire \RD_OBUF[20]_inst_i_7_n_0 ; + wire \RD_OBUF[20]_inst_i_8_n_0 ; + wire \RD_OBUF[20]_inst_i_9_n_0 ; + wire \RD_OBUF[21]_inst_i_2_n_0 ; + wire \RD_OBUF[21]_inst_i_3_n_0 ; + wire \RD_OBUF[21]_inst_i_4_n_0 ; + wire \RD_OBUF[21]_inst_i_5_n_0 ; + wire \RD_OBUF[21]_inst_i_6_n_0 ; + wire \RD_OBUF[21]_inst_i_7_n_0 ; + wire \RD_OBUF[21]_inst_i_8_n_0 ; + wire \RD_OBUF[22]_inst_i_10_n_0 ; + wire \RD_OBUF[22]_inst_i_11_n_0 ; + wire \RD_OBUF[22]_inst_i_2_n_0 ; + wire \RD_OBUF[22]_inst_i_3_n_0 ; + wire \RD_OBUF[22]_inst_i_4_n_0 ; + wire \RD_OBUF[22]_inst_i_5_n_0 ; + wire \RD_OBUF[22]_inst_i_6_n_0 ; + wire \RD_OBUF[22]_inst_i_7_n_0 ; + wire \RD_OBUF[22]_inst_i_8_n_0 ; + wire \RD_OBUF[22]_inst_i_9_n_0 ; + wire \RD_OBUF[23]_inst_i_10_n_0 ; + wire \RD_OBUF[23]_inst_i_11_n_0 ; + wire \RD_OBUF[23]_inst_i_12_n_0 ; + wire \RD_OBUF[23]_inst_i_13_n_0 ; + wire \RD_OBUF[23]_inst_i_2_n_0 ; + wire \RD_OBUF[23]_inst_i_3_n_0 ; + wire \RD_OBUF[23]_inst_i_4_n_0 ; + wire \RD_OBUF[23]_inst_i_5_n_0 ; + wire \RD_OBUF[23]_inst_i_6_n_0 ; + wire \RD_OBUF[23]_inst_i_7_n_0 ; + wire \RD_OBUF[23]_inst_i_8_n_0 ; + wire \RD_OBUF[23]_inst_i_9_n_0 ; + wire \RD_OBUF[24]_inst_i_10_n_0 ; + wire \RD_OBUF[24]_inst_i_11_n_0 ; + wire \RD_OBUF[24]_inst_i_2_n_0 ; + wire \RD_OBUF[24]_inst_i_3_n_0 ; + wire \RD_OBUF[24]_inst_i_4_n_0 ; + wire \RD_OBUF[24]_inst_i_5_n_0 ; + wire \RD_OBUF[24]_inst_i_6_n_0 ; + wire \RD_OBUF[24]_inst_i_7_n_0 ; + wire \RD_OBUF[24]_inst_i_8_n_0 ; + wire \RD_OBUF[24]_inst_i_9_n_0 ; + wire \RD_OBUF[25]_inst_i_10_n_0 ; + wire \RD_OBUF[25]_inst_i_11_n_0 ; + wire \RD_OBUF[25]_inst_i_2_n_0 ; + wire \RD_OBUF[25]_inst_i_3_n_0 ; + wire \RD_OBUF[25]_inst_i_4_n_0 ; + wire \RD_OBUF[25]_inst_i_5_n_0 ; + wire \RD_OBUF[25]_inst_i_6_n_0 ; + wire \RD_OBUF[25]_inst_i_7_n_0 ; + wire \RD_OBUF[25]_inst_i_8_n_0 ; + wire \RD_OBUF[25]_inst_i_9_n_0 ; + wire \RD_OBUF[26]_inst_i_10_n_0 ; + wire \RD_OBUF[26]_inst_i_11_n_0 ; + wire \RD_OBUF[26]_inst_i_2_n_0 ; + wire \RD_OBUF[26]_inst_i_3_n_0 ; + wire \RD_OBUF[26]_inst_i_4_n_0 ; + wire \RD_OBUF[26]_inst_i_5_n_0 ; + wire \RD_OBUF[26]_inst_i_6_n_0 ; + wire \RD_OBUF[26]_inst_i_7_n_0 ; + wire \RD_OBUF[26]_inst_i_8_n_0 ; + wire \RD_OBUF[26]_inst_i_9_n_0 ; + wire \RD_OBUF[27]_inst_i_10_n_0 ; + wire \RD_OBUF[27]_inst_i_11_n_0 ; + wire \RD_OBUF[27]_inst_i_2_n_0 ; + wire \RD_OBUF[27]_inst_i_3_n_0 ; + wire \RD_OBUF[27]_inst_i_4_n_0 ; + wire \RD_OBUF[27]_inst_i_5_n_0 ; + wire \RD_OBUF[27]_inst_i_6_n_0 ; + wire \RD_OBUF[27]_inst_i_7_n_0 ; + wire \RD_OBUF[27]_inst_i_8_n_0 ; + wire \RD_OBUF[27]_inst_i_9_n_0 ; + wire \RD_OBUF[28]_inst_i_10_n_0 ; + wire \RD_OBUF[28]_inst_i_11_n_0 ; + wire \RD_OBUF[28]_inst_i_2_n_0 ; + wire \RD_OBUF[28]_inst_i_3_n_0 ; + wire \RD_OBUF[28]_inst_i_4_n_0 ; + wire \RD_OBUF[28]_inst_i_5_n_0 ; + wire \RD_OBUF[28]_inst_i_6_n_0 ; + wire \RD_OBUF[28]_inst_i_7_n_0 ; + wire \RD_OBUF[28]_inst_i_8_n_0 ; + wire \RD_OBUF[28]_inst_i_9_n_0 ; + wire \RD_OBUF[29]_inst_i_2_n_0 ; + wire \RD_OBUF[29]_inst_i_3_n_0 ; + wire \RD_OBUF[29]_inst_i_5_n_0 ; + wire \RD_OBUF[29]_inst_i_7_n_0 ; + wire \RD_OBUF[2]_inst_i_10_n_0 ; + wire \RD_OBUF[2]_inst_i_11_n_0 ; + wire \RD_OBUF[2]_inst_i_12_n_0 ; + wire \RD_OBUF[2]_inst_i_13_n_0 ; + wire \RD_OBUF[2]_inst_i_2_n_0 ; + wire \RD_OBUF[2]_inst_i_3_n_0 ; + wire \RD_OBUF[2]_inst_i_4_n_0 ; + wire \RD_OBUF[2]_inst_i_5_n_0 ; + wire \RD_OBUF[2]_inst_i_6_n_0 ; + wire \RD_OBUF[2]_inst_i_7_n_0 ; + wire \RD_OBUF[2]_inst_i_8_n_0 ; + wire \RD_OBUF[2]_inst_i_9_n_0 ; + wire \RD_OBUF[30]_inst_i_10_n_0 ; + wire \RD_OBUF[30]_inst_i_11_n_0 ; + wire \RD_OBUF[30]_inst_i_2_n_0 ; + wire \RD_OBUF[30]_inst_i_3_n_0 ; + wire \RD_OBUF[30]_inst_i_4_n_0 ; + wire \RD_OBUF[30]_inst_i_5_n_0 ; + wire \RD_OBUF[30]_inst_i_6_n_0 ; + wire \RD_OBUF[30]_inst_i_7_n_0 ; + wire \RD_OBUF[30]_inst_i_8_n_0 ; + wire \RD_OBUF[30]_inst_i_9_n_0 ; + wire \RD_OBUF[31]_inst_i_10_n_0 ; + wire \RD_OBUF[31]_inst_i_11_n_0 ; + wire \RD_OBUF[31]_inst_i_12_n_0 ; + wire \RD_OBUF[31]_inst_i_13_n_0 ; + wire \RD_OBUF[31]_inst_i_3_n_0 ; + wire \RD_OBUF[31]_inst_i_4_n_0 ; + wire \RD_OBUF[31]_inst_i_5_n_0 ; + wire \RD_OBUF[31]_inst_i_6_n_0 ; + wire \RD_OBUF[31]_inst_i_7_n_0 ; + wire \RD_OBUF[31]_inst_i_8_n_0 ; + wire \RD_OBUF[31]_inst_i_9_n_0 ; + wire \RD_OBUF[3]_inst_i_10_n_0 ; + wire \RD_OBUF[3]_inst_i_11_n_0 ; + wire \RD_OBUF[3]_inst_i_12_n_0 ; + wire \RD_OBUF[3]_inst_i_13_n_0 ; + wire \RD_OBUF[3]_inst_i_2_n_0 ; + wire \RD_OBUF[3]_inst_i_3_n_0 ; + wire \RD_OBUF[3]_inst_i_4_n_0 ; + wire \RD_OBUF[3]_inst_i_5_n_0 ; + wire \RD_OBUF[3]_inst_i_6_n_0 ; + wire \RD_OBUF[3]_inst_i_7_n_0 ; + wire \RD_OBUF[3]_inst_i_8_n_0 ; + wire \RD_OBUF[3]_inst_i_9_n_0 ; + wire \RD_OBUF[4]_inst_i_10_n_0 ; + wire \RD_OBUF[4]_inst_i_11_n_0 ; + wire \RD_OBUF[4]_inst_i_12_n_0 ; + wire \RD_OBUF[4]_inst_i_13_n_0 ; + wire \RD_OBUF[4]_inst_i_2_n_0 ; + wire \RD_OBUF[4]_inst_i_3_n_0 ; + wire \RD_OBUF[4]_inst_i_4_n_0 ; + wire \RD_OBUF[4]_inst_i_5_n_0 ; + wire \RD_OBUF[4]_inst_i_6_n_0 ; + wire \RD_OBUF[4]_inst_i_7_n_0 ; + wire \RD_OBUF[4]_inst_i_8_n_0 ; + wire \RD_OBUF[4]_inst_i_9_n_0 ; + wire \RD_OBUF[5]_inst_i_2_n_0 ; + wire \RD_OBUF[5]_inst_i_3_n_0 ; + wire \RD_OBUF[5]_inst_i_4_n_0 ; + wire \RD_OBUF[5]_inst_i_5_n_0 ; + wire \RD_OBUF[6]_inst_i_10_n_0 ; + wire \RD_OBUF[6]_inst_i_11_n_0 ; + wire \RD_OBUF[6]_inst_i_12_n_0 ; + wire \RD_OBUF[6]_inst_i_13_n_0 ; + wire \RD_OBUF[6]_inst_i_2_n_0 ; + wire \RD_OBUF[6]_inst_i_3_n_0 ; + wire \RD_OBUF[6]_inst_i_4_n_0 ; + wire \RD_OBUF[6]_inst_i_5_n_0 ; + wire \RD_OBUF[6]_inst_i_6_n_0 ; + wire \RD_OBUF[6]_inst_i_7_n_0 ; + wire \RD_OBUF[6]_inst_i_8_n_0 ; + wire \RD_OBUF[6]_inst_i_9_n_0 ; + wire \RD_OBUF[7]_inst_i_10_n_0 ; + wire \RD_OBUF[7]_inst_i_11_n_0 ; + wire \RD_OBUF[7]_inst_i_12_n_0 ; + wire \RD_OBUF[7]_inst_i_13_n_0 ; + wire \RD_OBUF[7]_inst_i_2_n_0 ; + wire \RD_OBUF[7]_inst_i_3_n_0 ; + wire \RD_OBUF[7]_inst_i_4_n_0 ; + wire \RD_OBUF[7]_inst_i_5_n_0 ; + wire \RD_OBUF[7]_inst_i_6_n_0 ; + wire \RD_OBUF[7]_inst_i_7_n_0 ; + wire \RD_OBUF[7]_inst_i_8_n_0 ; + wire \RD_OBUF[7]_inst_i_9_n_0 ; + wire \RD_OBUF[8]_inst_i_10_n_0 ; + wire \RD_OBUF[8]_inst_i_11_n_0 ; + wire \RD_OBUF[8]_inst_i_2_n_0 ; + wire \RD_OBUF[8]_inst_i_3_n_0 ; + wire \RD_OBUF[8]_inst_i_4_n_0 ; + wire \RD_OBUF[8]_inst_i_5_n_0 ; + wire \RD_OBUF[8]_inst_i_6_n_0 ; + wire \RD_OBUF[8]_inst_i_7_n_0 ; + wire \RD_OBUF[8]_inst_i_8_n_0 ; + wire \RD_OBUF[8]_inst_i_9_n_0 ; + wire \RD_OBUF[9]_inst_i_10_n_0 ; + wire \RD_OBUF[9]_inst_i_11_n_0 ; + wire \RD_OBUF[9]_inst_i_2_n_0 ; + wire \RD_OBUF[9]_inst_i_3_n_0 ; + wire \RD_OBUF[9]_inst_i_4_n_0 ; + wire \RD_OBUF[9]_inst_i_5_n_0 ; + wire \RD_OBUF[9]_inst_i_6_n_0 ; + wire \RD_OBUF[9]_inst_i_7_n_0 ; + wire \RD_OBUF[9]_inst_i_8_n_0 ; + wire \RD_OBUF[9]_inst_i_9_n_0 ; + wire g0_b0__0_n_0; + wire g0_b0__1_n_0; + wire g0_b0__2_n_0; + wire g0_b0_n_0; + wire g0_b1__0_n_0; + wire g0_b1__1_n_0; + wire g0_b1__2_n_0; + wire g0_b1_n_0; + wire g0_b2__0_n_0; + wire g0_b2__1_n_0; + wire g0_b2__2_n_0; + wire g0_b2_n_0; + wire g0_b3__0_n_0; + wire g0_b3__1_n_0; + wire g0_b3__2_n_0; + wire g0_b3_n_0; + wire g0_b4__0_n_0; + wire g0_b4__1_n_0; + wire g0_b4__2_n_0; + wire g0_b4_n_0; + wire g0_b5__0_n_0; + wire g0_b5__1_n_0; + wire g0_b5__2_n_0; + wire g0_b5_n_0; + wire g0_b6__0_n_0; + wire g0_b6__1_n_0; + wire g0_b6__2_n_0; + wire g0_b6_n_0; + wire g0_b7__0_n_0; + wire g0_b7__1_n_0; + wire g0_b7__2_n_0; + wire g0_b7_n_0; + wire g10_b0__0_n_0; + wire g10_b0__1_n_0; + wire g10_b0__2_n_0; + wire g10_b0_n_0; + wire g10_b1__0_n_0; + wire g10_b1__1_n_0; + wire g10_b1__2_n_0; + wire g10_b1_n_0; + wire g10_b2__0_n_0; + wire g10_b2__1_n_0; + wire g10_b2__2_n_0; + wire g10_b2_n_0; + wire g10_b3__0_n_0; + wire g10_b3__1_n_0; + wire g10_b3__2_n_0; + wire g10_b3_n_0; + wire g10_b4__0_n_0; + wire g10_b4__1_n_0; + wire g10_b4__2_n_0; + wire g10_b4_n_0; + wire g10_b6__0_n_0; + wire g10_b6__1_n_0; + wire g10_b6__2_n_0; + wire g10_b6_n_0; + wire g10_b7__0_n_0; + wire g10_b7__1_n_0; + wire g10_b7__2_n_0; + wire g10_b7_n_0; + wire g11_b0__0_n_0; + wire g11_b0__1_n_0; + wire g11_b0__2_n_0; + wire g11_b0_n_0; + wire g11_b1__0_n_0; + wire g11_b1__1_n_0; + wire g11_b1__2_n_0; + wire g11_b1_n_0; + wire g11_b2__0_n_0; + wire g11_b2__1_n_0; + wire g11_b2__2_n_0; + wire g11_b2_n_0; + wire g11_b3__0_n_0; + wire g11_b3__1_n_0; + wire g11_b3__2_n_0; + wire g11_b3_n_0; + wire g11_b4__0_n_0; + wire g11_b4__1_n_0; + wire g11_b4__2_n_0; + wire g11_b4_n_0; + wire g11_b6__0_n_0; + wire g11_b6__1_n_0; + wire g11_b6__2_n_0; + wire g11_b6_n_0; + wire g11_b7__0_n_0; + wire g11_b7__1_n_0; + wire g11_b7__2_n_0; + wire g11_b7_n_0; + wire g12_b0__0_n_0; + wire g12_b0__1_n_0; + wire g12_b0__2_n_0; + wire g12_b0_n_0; + wire g12_b1__0_n_0; + wire g12_b1__1_n_0; + wire g12_b1__2_n_0; + wire g12_b1_n_0; + wire g12_b2__0_n_0; + wire g12_b2__1_n_0; + wire g12_b2__2_n_0; + wire g12_b2_n_0; + wire g12_b3__0_n_0; + wire g12_b3__1_n_0; + wire g12_b3__2_n_0; + wire g12_b3_n_0; + wire g12_b4__0_n_0; + wire g12_b4__1_n_0; + wire g12_b4__2_n_0; + wire g12_b4_n_0; + wire g12_b6__0_n_0; + wire g12_b6__1_n_0; + wire g12_b6__2_n_0; + wire g12_b6_n_0; + wire g12_b7__0_n_0; + wire g12_b7__1_n_0; + wire g12_b7__2_n_0; + wire g12_b7_n_0; + wire g13_b0__0_n_0; + wire g13_b0__1_n_0; + wire g13_b0__2_n_0; + wire g13_b0_n_0; + wire g13_b1__0_n_0; + wire g13_b1__1_n_0; + wire g13_b1__2_n_0; + wire g13_b1_n_0; + wire g13_b2__0_n_0; + wire g13_b2__1_n_0; + wire g13_b2__2_n_0; + wire g13_b2_n_0; + wire g13_b3__0_n_0; + wire g13_b3__1_n_0; + wire g13_b3__2_n_0; + wire g13_b3_n_0; + wire g13_b4__0_n_0; + wire g13_b4__1_n_0; + wire g13_b4__2_n_0; + wire g13_b4_n_0; + wire g13_b6__0_n_0; + wire g13_b6__1_n_0; + wire g13_b6__2_n_0; + wire g13_b6_n_0; + wire g13_b7__0_n_0; + wire g13_b7__1_n_0; + wire g13_b7__2_n_0; + wire g13_b7_n_0; + wire g14_b0__0_n_0; + wire g14_b0__1_n_0; + wire g14_b0__2_n_0; + wire g14_b0_n_0; + wire g14_b1__0_n_0; + wire g14_b1__1_n_0; + wire g14_b1__2_n_0; + wire g14_b1_n_0; + wire g14_b2__0_n_0; + wire g14_b2__1_n_0; + wire g14_b2__2_n_0; + wire g14_b2_n_0; + wire g14_b3__0_n_0; + wire g14_b3__1_n_0; + wire g14_b3__2_n_0; + wire g14_b3_n_0; + wire g14_b4__0_n_0; + wire g14_b4__1_n_0; + wire g14_b4__2_n_0; + wire g14_b4_n_0; + wire g14_b6__0_n_0; + wire g14_b6__1_n_0; + wire g14_b6__2_n_0; + wire g14_b6_n_0; + wire g14_b7__0_n_0; + wire g14_b7__1_n_0; + wire g14_b7__2_n_0; + wire g14_b7_n_0; + wire g15_b0__0_n_0; + wire g15_b0__1_n_0; + wire g15_b0__2_n_0; + wire g15_b0_n_0; + wire g15_b1__0_n_0; + wire g15_b1__1_n_0; + wire g15_b1__2_n_0; + wire g15_b1_n_0; + wire g15_b2__0_n_0; + wire g15_b2__1_n_0; + wire g15_b2__2_n_0; + wire g15_b2_n_0; + wire g15_b3__0_n_0; + wire g15_b3__1_n_0; + wire g15_b3__2_n_0; + wire g15_b3_n_0; + wire g15_b4__0_n_0; + wire g15_b4__1_n_0; + wire g15_b4__2_n_0; + wire g15_b4_n_0; + wire g15_b6__0_n_0; + wire g15_b6__1_n_0; + wire g15_b6__2_n_0; + wire g15_b6_n_0; + wire g15_b7__0_n_0; + wire g15_b7__1_n_0; + wire g15_b7__2_n_0; + wire g15_b7_i_1__0_n_0; + wire g15_b7_i_1__1_n_0; + wire g15_b7_i_2__0_n_0; + wire g15_b7_i_2_n_0; + wire g15_b7_i_3_n_0; + wire g15_b7_i_4_n_0; + wire g15_b7_i_5_n_0; + wire g15_b7_n_0; + wire g1_b0__0_n_0; + wire g1_b0__1_n_0; + wire g1_b0__2_n_0; + wire g1_b0_n_0; + wire g1_b1__0_n_0; + wire g1_b1__1_n_0; + wire g1_b1__2_n_0; + wire g1_b1_n_0; + wire g1_b2__0_n_0; + wire g1_b2__1_n_0; + wire g1_b2__2_n_0; + wire g1_b2_n_0; + wire g1_b3__0_n_0; + wire g1_b3__1_n_0; + wire g1_b3__2_n_0; + wire g1_b3_n_0; + wire g1_b4__0_n_0; + wire g1_b4__1_n_0; + wire g1_b4__2_n_0; + wire g1_b4_n_0; + wire g1_b5__0_n_0; + wire g1_b5__1_n_0; + wire g1_b5__2_n_0; + wire g1_b5_n_0; + wire g1_b6__0_n_0; + wire g1_b6__1_n_0; + wire g1_b6__2_n_0; + wire g1_b6_n_0; + wire g1_b7__0_n_0; + wire g1_b7__1_n_0; + wire g1_b7__2_n_0; + wire g1_b7_n_0; + wire g2_b0__0_n_0; + wire g2_b0__1_n_0; + wire g2_b0__2_n_0; + wire g2_b0_n_0; + wire g2_b1__0_n_0; + wire g2_b1__1_n_0; + wire g2_b1__2_n_0; + wire g2_b1_n_0; + wire g2_b2__0_n_0; + wire g2_b2__1_n_0; + wire g2_b2__2_n_0; + wire g2_b2_n_0; + wire g2_b3__0_n_0; + wire g2_b3__1_n_0; + wire g2_b3__2_n_0; + wire g2_b3_n_0; + wire g2_b4__0_n_0; + wire g2_b4__1_n_0; + wire g2_b4__2_n_0; + wire g2_b4_n_0; + wire g2_b5__0_n_0; + wire g2_b5__1_n_0; + wire g2_b5__2_n_0; + wire g2_b5_n_0; + wire g2_b6__0_n_0; + wire g2_b6__1_n_0; + wire g2_b6__2_n_0; + wire g2_b6_n_0; + wire g2_b7__0_n_0; + wire g2_b7__1_n_0; + wire g2_b7__2_n_0; + wire g2_b7_n_0; + wire g3_b0__0_n_0; + wire g3_b0__1_n_0; + wire g3_b0__2_n_0; + wire g3_b0_n_0; + wire g3_b1__0_n_0; + wire g3_b1__1_n_0; + wire g3_b1__2_n_0; + wire g3_b1_n_0; + wire g3_b2__0_n_0; + wire g3_b2__1_n_0; + wire g3_b2__2_n_0; + wire g3_b2_n_0; + wire g3_b3__0_n_0; + wire g3_b3__1_n_0; + wire g3_b3__2_n_0; + wire g3_b3_n_0; + wire g3_b4__0_n_0; + wire g3_b4__1_n_0; + wire g3_b4__2_n_0; + wire g3_b4_n_0; + wire g3_b5__0_n_0; + wire g3_b5__1_n_0; + wire g3_b5__2_n_0; + wire g3_b5_n_0; + wire g3_b6__0_n_0; + wire g3_b6__1_n_0; + wire g3_b6__2_n_0; + wire g3_b6_n_0; + wire g3_b7__0_n_0; + wire g3_b7__1_n_0; + wire g3_b7__2_n_0; + wire g3_b7_n_0; + wire g4_b0__0_n_0; + wire g4_b0__1_n_0; + wire g4_b0__2_n_0; + wire g4_b0_n_0; + wire g4_b1__0_n_0; + wire g4_b1__1_n_0; + wire g4_b1__2_n_0; + wire g4_b1_n_0; + wire g4_b2__0_n_0; + wire g4_b2__1_n_0; + wire g4_b2__2_n_0; + wire g4_b2_n_0; + wire g4_b3__0_n_0; + wire g4_b3__1_n_0; + wire g4_b3__2_n_0; + wire g4_b3_n_0; + wire g4_b4__0_n_0; + wire g4_b4__1_n_0; + wire g4_b4__2_n_0; + wire g4_b4_n_0; + wire g4_b5__0_n_0; + wire g4_b5__1_n_0; + wire g4_b5__2_n_0; + wire g4_b5_n_0; + wire g4_b6__0_n_0; + wire g4_b6__1_n_0; + wire g4_b6__2_n_0; + wire g4_b6_n_0; + wire g4_b7__0_n_0; + wire g4_b7__1_n_0; + wire g4_b7__2_n_0; + wire g4_b7_n_0; + wire g5_b0__0_n_0; + wire g5_b0__1_n_0; + wire g5_b0__2_n_0; + wire g5_b0_n_0; + wire g5_b1__0_n_0; + wire g5_b1__1_n_0; + wire g5_b1__2_n_0; + wire g5_b1_n_0; + wire g5_b2__0_n_0; + wire g5_b2__1_n_0; + wire g5_b2__2_n_0; + wire g5_b2_n_0; + wire g5_b3__0_n_0; + wire g5_b3__1_n_0; + wire g5_b3__2_n_0; + wire g5_b3_n_0; + wire g5_b4__0_n_0; + wire g5_b4__1_n_0; + wire g5_b4__2_n_0; + wire g5_b4_n_0; + wire g5_b5__0_n_0; + wire g5_b5__1_n_0; + wire g5_b5__2_n_0; + wire g5_b5_n_0; + wire g5_b6__0_n_0; + wire g5_b6__1_n_0; + wire g5_b6__2_n_0; + wire g5_b6_n_0; + wire g5_b7__0_n_0; + wire g5_b7__1_n_0; + wire g5_b7__2_n_0; + wire g5_b7_n_0; + wire g6_b0__0_n_0; + wire g6_b0__1_n_0; + wire g6_b0__2_n_0; + wire g6_b0_n_0; + wire g6_b1__0_n_0; + wire g6_b1__1_n_0; + wire g6_b1__2_n_0; + wire g6_b1_n_0; + wire g6_b2__0_n_0; + wire g6_b2__1_n_0; + wire g6_b2__2_n_0; + wire g6_b2_n_0; + wire g6_b3__0_n_0; + wire g6_b3__1_n_0; + wire g6_b3__2_n_0; + wire g6_b3_n_0; + wire g6_b4__0_n_0; + wire g6_b4__1_n_0; + wire g6_b4__2_n_0; + wire g6_b4_n_0; + wire g6_b5__0_n_0; + wire g6_b5__1_n_0; + wire g6_b5__2_n_0; + wire g6_b5_n_0; + wire g6_b6__0_n_0; + wire g6_b6__1_n_0; + wire g6_b6__2_n_0; + wire g6_b6_n_0; + wire g6_b7__0_n_0; + wire g6_b7__1_n_0; + wire g6_b7__2_n_0; + wire g6_b7_n_0; + wire g7_b0__0_n_0; + wire g7_b0__1_n_0; + wire g7_b0__2_n_0; + wire g7_b0_n_0; + wire g7_b1__0_n_0; + wire g7_b1__1_n_0; + wire g7_b1__2_n_0; + wire g7_b1_n_0; + wire g7_b2__0_n_0; + wire g7_b2__1_n_0; + wire g7_b2__2_n_0; + wire g7_b2_n_0; + wire g7_b3__0_n_0; + wire g7_b3__1_n_0; + wire g7_b3__2_n_0; + wire g7_b3_n_0; + wire g7_b4__0_n_0; + wire g7_b4__1_n_0; + wire g7_b4__2_n_0; + wire g7_b4_n_0; + wire g7_b5__0_n_0; + wire g7_b5__1_n_0; + wire g7_b5__2_n_0; + wire g7_b5_n_0; + wire g7_b6__0_n_0; + wire g7_b6__1_n_0; + wire g7_b6__2_n_0; + wire g7_b6_n_0; + wire g7_b7__0_n_0; + wire g7_b7__1_n_0; + wire g7_b7__2_n_0; + wire g7_b7_n_0; + wire g8_b0__0_n_0; + wire g8_b0__1_n_0; + wire g8_b0__2_n_0; + wire g8_b0_n_0; + wire g8_b1__0_n_0; + wire g8_b1__1_n_0; + wire g8_b1__2_n_0; + wire g8_b1_n_0; + wire g8_b2__0_n_0; + wire g8_b2__1_n_0; + wire g8_b2__2_n_0; + wire g8_b2_n_0; + wire g8_b3__0_n_0; + wire g8_b3__1_n_0; + wire g8_b3__2_n_0; + wire g8_b3_n_0; + wire g8_b4__0_n_0; + wire g8_b4__1_n_0; + wire g8_b4__2_n_0; + wire g8_b4_n_0; + wire g8_b6__0_n_0; + wire g8_b6__1_n_0; + wire g8_b6__2_n_0; + wire g8_b6_n_0; + wire g8_b7__0_n_0; + wire g8_b7__1_n_0; + wire g8_b7__2_n_0; + wire g8_b7_n_0; + wire g9_b0__0_n_0; + wire g9_b0__1_n_0; + wire g9_b0__2_n_0; + wire g9_b0_n_0; + wire g9_b1__0_n_0; + wire g9_b1__1_n_0; + wire g9_b1__2_n_0; + wire g9_b1_n_0; + wire g9_b2__0_n_0; + wire g9_b2__1_n_0; + wire g9_b2__2_n_0; + wire g9_b2_n_0; + wire g9_b3__0_n_0; + wire g9_b3__1_n_0; + wire g9_b3__2_n_0; + wire g9_b3_n_0; + wire g9_b4__0_n_0; + wire g9_b4__1_n_0; + wire g9_b4__2_n_0; + wire g9_b4_n_0; + wire g9_b6__0_n_0; + wire g9_b6__1_n_0; + wire g9_b6__2_n_0; + wire g9_b6_n_0; + wire g9_b7__0_n_0; + wire g9_b7__1_n_0; + wire g9_b7__2_n_0; + wire g9_b7_n_0; + wire [9:1]sel; + + IBUF \A_IBUF[0]_inst + (.I(A[0]), + .O(A_IBUF[0])); + IBUF \A_IBUF[1]_inst + (.I(A[1]), + .O(A_IBUF[1])); + IBUF \A_IBUF[2]_inst + (.I(A[2]), + .O(A_IBUF[2])); + IBUF \A_IBUF[3]_inst + (.I(A[3]), + .O(A_IBUF[3])); + IBUF \A_IBUF[4]_inst + (.I(A[4]), + .O(A_IBUF[4])); + IBUF \A_IBUF[5]_inst + (.I(A[5]), + .O(A_IBUF[5])); + IBUF \A_IBUF[6]_inst + (.I(A[6]), + .O(A_IBUF[6])); + IBUF \A_IBUF[7]_inst + (.I(A[7]), + .O(A_IBUF[7])); + IBUF \A_IBUF[8]_inst + (.I(A[8]), + .O(A_IBUF[8])); + IBUF \A_IBUF[9]_inst + (.I(A[9]), + .O(A_IBUF[9])); + OBUF \RD_OBUF[0]_inst + (.I(RD_OBUF[0]), + .O(RD[0])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[0]_inst_i_1 + (.I0(\RD_OBUF[0]_inst_i_2_n_0 ), + .I1(\RD_OBUF[0]_inst_i_3_n_0 ), + .I2(A_IBUF[9]), + .I3(\RD_OBUF[0]_inst_i_4_n_0 ), + .I4(A_IBUF[8]), + .I5(\RD_OBUF[0]_inst_i_5_n_0 ), + .O(RD_OBUF[0])); + MUXF7 \RD_OBUF[0]_inst_i_10 + (.I0(g4_b0_n_0), + .I1(g5_b0_n_0), + .O(\RD_OBUF[0]_inst_i_10_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[0]_inst_i_11 + (.I0(g6_b0_n_0), + .I1(g7_b0_n_0), + .O(\RD_OBUF[0]_inst_i_11_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[0]_inst_i_12 + (.I0(g0_b0_n_0), + .I1(g1_b0_n_0), + .O(\RD_OBUF[0]_inst_i_12_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[0]_inst_i_13 + (.I0(g2_b0_n_0), + .I1(g3_b0_n_0), + .O(\RD_OBUF[0]_inst_i_13_n_0 ), + .S(A_IBUF[6])); + MUXF8 \RD_OBUF[0]_inst_i_2 + (.I0(\RD_OBUF[0]_inst_i_6_n_0 ), + .I1(\RD_OBUF[0]_inst_i_7_n_0 ), + .O(\RD_OBUF[0]_inst_i_2_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[0]_inst_i_3 + (.I0(\RD_OBUF[0]_inst_i_8_n_0 ), + .I1(\RD_OBUF[0]_inst_i_9_n_0 ), + .O(\RD_OBUF[0]_inst_i_3_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[0]_inst_i_4 + (.I0(\RD_OBUF[0]_inst_i_10_n_0 ), + .I1(\RD_OBUF[0]_inst_i_11_n_0 ), + .O(\RD_OBUF[0]_inst_i_4_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[0]_inst_i_5 + (.I0(\RD_OBUF[0]_inst_i_12_n_0 ), + .I1(\RD_OBUF[0]_inst_i_13_n_0 ), + .O(\RD_OBUF[0]_inst_i_5_n_0 ), + .S(A_IBUF[7])); + MUXF7 \RD_OBUF[0]_inst_i_6 + (.I0(g12_b0_n_0), + .I1(g13_b0_n_0), + .O(\RD_OBUF[0]_inst_i_6_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[0]_inst_i_7 + (.I0(g14_b0_n_0), + .I1(g15_b0_n_0), + .O(\RD_OBUF[0]_inst_i_7_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[0]_inst_i_8 + (.I0(g8_b0_n_0), + .I1(g9_b0_n_0), + .O(\RD_OBUF[0]_inst_i_8_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[0]_inst_i_9 + (.I0(g10_b0_n_0), + .I1(g11_b0_n_0), + .O(\RD_OBUF[0]_inst_i_9_n_0 ), + .S(A_IBUF[6])); + OBUF \RD_OBUF[10]_inst + (.I(RD_OBUF[10]), + .O(RD[10])); + MUXF7 \RD_OBUF[10]_inst_i_1 + (.I0(\RD_OBUF[10]_inst_i_2_n_0 ), + .I1(\RD_OBUF[10]_inst_i_3_n_0 ), + .O(RD_OBUF[10]), + .S(\RD_OBUF[15]_inst_i_2_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[10]_inst_i_10 + (.I0(g11_b2__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b2__2_n_0), + .O(\RD_OBUF[10]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[10]_inst_i_11 + (.I0(g9_b2__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b2__2_n_0), + .O(\RD_OBUF[10]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[10]_inst_i_2 + (.I0(\RD_OBUF[10]_inst_i_4_n_0 ), + .I1(\RD_OBUF[10]_inst_i_5_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[10]_inst_i_6_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[10]_inst_i_7_n_0 ), + .O(\RD_OBUF[10]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[10]_inst_i_3 + (.I0(\RD_OBUF[10]_inst_i_8_n_0 ), + .I1(\RD_OBUF[10]_inst_i_9_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[10]_inst_i_10_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[10]_inst_i_11_n_0 ), + .O(\RD_OBUF[10]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[10]_inst_i_4 + (.I0(g7_b2__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b2__2_n_0), + .O(\RD_OBUF[10]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[10]_inst_i_5 + (.I0(g5_b2__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b2__2_n_0), + .O(\RD_OBUF[10]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[10]_inst_i_6 + (.I0(g3_b2__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b2__2_n_0), + .O(\RD_OBUF[10]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[10]_inst_i_7 + (.I0(g1_b2__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b2__2_n_0), + .O(\RD_OBUF[10]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[10]_inst_i_8 + (.I0(g15_b2__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b2__2_n_0), + .O(\RD_OBUF[10]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[10]_inst_i_9 + (.I0(g13_b2__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b2__2_n_0), + .O(\RD_OBUF[10]_inst_i_9_n_0 )); + OBUF \RD_OBUF[11]_inst + (.I(RD_OBUF[11]), + .O(RD[11])); + MUXF7 \RD_OBUF[11]_inst_i_1 + (.I0(\RD_OBUF[11]_inst_i_2_n_0 ), + .I1(\RD_OBUF[11]_inst_i_3_n_0 ), + .O(RD_OBUF[11]), + .S(\RD_OBUF[15]_inst_i_2_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[11]_inst_i_10 + (.I0(g11_b3__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b3__2_n_0), + .O(\RD_OBUF[11]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[11]_inst_i_11 + (.I0(g9_b3__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b3__2_n_0), + .O(\RD_OBUF[11]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[11]_inst_i_2 + (.I0(\RD_OBUF[11]_inst_i_4_n_0 ), + .I1(\RD_OBUF[11]_inst_i_5_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[11]_inst_i_6_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[11]_inst_i_7_n_0 ), + .O(\RD_OBUF[11]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[11]_inst_i_3 + (.I0(\RD_OBUF[11]_inst_i_8_n_0 ), + .I1(\RD_OBUF[11]_inst_i_9_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[11]_inst_i_10_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[11]_inst_i_11_n_0 ), + .O(\RD_OBUF[11]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[11]_inst_i_4 + (.I0(g7_b3__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b3__2_n_0), + .O(\RD_OBUF[11]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[11]_inst_i_5 + (.I0(g5_b3__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b3__2_n_0), + .O(\RD_OBUF[11]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[11]_inst_i_6 + (.I0(g3_b3__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b3__2_n_0), + .O(\RD_OBUF[11]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[11]_inst_i_7 + (.I0(g1_b3__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b3__2_n_0), + .O(\RD_OBUF[11]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[11]_inst_i_8 + (.I0(g15_b3__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b3__2_n_0), + .O(\RD_OBUF[11]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[11]_inst_i_9 + (.I0(g13_b3__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b3__2_n_0), + .O(\RD_OBUF[11]_inst_i_9_n_0 )); + OBUF \RD_OBUF[12]_inst + (.I(RD_OBUF[12]), + .O(RD[12])); + MUXF7 \RD_OBUF[12]_inst_i_1 + (.I0(\RD_OBUF[12]_inst_i_2_n_0 ), + .I1(\RD_OBUF[12]_inst_i_3_n_0 ), + .O(RD_OBUF[12]), + .S(\RD_OBUF[15]_inst_i_2_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[12]_inst_i_10 + (.I0(g11_b4__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b4__2_n_0), + .O(\RD_OBUF[12]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[12]_inst_i_11 + (.I0(g9_b4__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b4__2_n_0), + .O(\RD_OBUF[12]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[12]_inst_i_2 + (.I0(\RD_OBUF[12]_inst_i_4_n_0 ), + .I1(\RD_OBUF[12]_inst_i_5_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[12]_inst_i_6_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[12]_inst_i_7_n_0 ), + .O(\RD_OBUF[12]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[12]_inst_i_3 + (.I0(\RD_OBUF[12]_inst_i_8_n_0 ), + .I1(\RD_OBUF[12]_inst_i_9_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[12]_inst_i_10_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[12]_inst_i_11_n_0 ), + .O(\RD_OBUF[12]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[12]_inst_i_4 + (.I0(g7_b4__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b4__2_n_0), + .O(\RD_OBUF[12]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[12]_inst_i_5 + (.I0(g5_b4__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b4__2_n_0), + .O(\RD_OBUF[12]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[12]_inst_i_6 + (.I0(g3_b4__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b4__2_n_0), + .O(\RD_OBUF[12]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[12]_inst_i_7 + (.I0(g1_b4__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b4__2_n_0), + .O(\RD_OBUF[12]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[12]_inst_i_8 + (.I0(g15_b4__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b4__2_n_0), + .O(\RD_OBUF[12]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[12]_inst_i_9 + (.I0(g13_b4__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b4__2_n_0), + .O(\RD_OBUF[12]_inst_i_9_n_0 )); + OBUF \RD_OBUF[13]_inst + (.I(RD_OBUF[13]), + .O(RD[13])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[13]_inst_i_1 + (.I0(\RD_OBUF[13]_inst_i_2_n_0 ), + .I1(\RD_OBUF[13]_inst_i_3_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[13]_inst_i_5_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[13]_inst_i_7_n_0 ), + .O(RD_OBUF[13])); + MUXF7 \RD_OBUF[13]_inst_i_2 + (.I0(g6_b5__2_n_0), + .I1(g7_b5__2_n_0), + .O(\RD_OBUF[13]_inst_i_2_n_0 ), + .S(\RD_OBUF[13]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[13]_inst_i_3 + (.I0(g4_b5__2_n_0), + .I1(g5_b5__2_n_0), + .O(\RD_OBUF[13]_inst_i_3_n_0 ), + .S(\RD_OBUF[13]_inst_i_8_n_0 )); + (* SOFT_HLUTNM = "soft_lutpair2" *) + LUT4 #( + .INIT(16'h7F80)) + \RD_OBUF[13]_inst_i_4 + (.I0(A_IBUF[6]), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[7]), + .I3(A_IBUF[8]), + .O(\RD_OBUF[13]_inst_i_4_n_0 )); + MUXF7 \RD_OBUF[13]_inst_i_5 + (.I0(g2_b5__2_n_0), + .I1(g3_b5__2_n_0), + .O(\RD_OBUF[13]_inst_i_5_n_0 ), + .S(\RD_OBUF[13]_inst_i_8_n_0 )); + (* SOFT_HLUTNM = "soft_lutpair0" *) + LUT3 #( + .INIT(8'h78)) + \RD_OBUF[13]_inst_i_6 + (.I0(\RD_OBUF[15]_inst_i_5_n_0 ), + .I1(A_IBUF[6]), + .I2(A_IBUF[7]), + .O(\RD_OBUF[13]_inst_i_6_n_0 )); + MUXF7 \RD_OBUF[13]_inst_i_7 + (.I0(g0_b5__2_n_0), + .I1(g1_b5__2_n_0), + .O(\RD_OBUF[13]_inst_i_7_n_0 ), + .S(\RD_OBUF[13]_inst_i_8_n_0 )); + LUT2 #( + .INIT(4'h6)) + \RD_OBUF[13]_inst_i_8 + (.I0(\RD_OBUF[15]_inst_i_5_n_0 ), + .I1(A_IBUF[6]), + .O(\RD_OBUF[13]_inst_i_8_n_0 )); + OBUF \RD_OBUF[14]_inst + (.I(RD_OBUF[14]), + .O(RD[14])); + MUXF7 \RD_OBUF[14]_inst_i_1 + (.I0(\RD_OBUF[14]_inst_i_2_n_0 ), + .I1(\RD_OBUF[14]_inst_i_3_n_0 ), + .O(RD_OBUF[14]), + .S(\RD_OBUF[15]_inst_i_2_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[14]_inst_i_10 + (.I0(g11_b6__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b6__2_n_0), + .O(\RD_OBUF[14]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[14]_inst_i_11 + (.I0(g9_b6__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b6__2_n_0), + .O(\RD_OBUF[14]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[14]_inst_i_2 + (.I0(\RD_OBUF[14]_inst_i_4_n_0 ), + .I1(\RD_OBUF[14]_inst_i_5_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[14]_inst_i_6_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[14]_inst_i_7_n_0 ), + .O(\RD_OBUF[14]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[14]_inst_i_3 + (.I0(\RD_OBUF[14]_inst_i_8_n_0 ), + .I1(\RD_OBUF[14]_inst_i_9_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[14]_inst_i_10_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[14]_inst_i_11_n_0 ), + .O(\RD_OBUF[14]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[14]_inst_i_4 + (.I0(g7_b6__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b6__2_n_0), + .O(\RD_OBUF[14]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[14]_inst_i_5 + (.I0(g5_b6__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b6__2_n_0), + .O(\RD_OBUF[14]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[14]_inst_i_6 + (.I0(g3_b6__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b6__2_n_0), + .O(\RD_OBUF[14]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[14]_inst_i_7 + (.I0(g1_b6__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b6__2_n_0), + .O(\RD_OBUF[14]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[14]_inst_i_8 + (.I0(g15_b6__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b6__2_n_0), + .O(\RD_OBUF[14]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[14]_inst_i_9 + (.I0(g13_b6__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b6__2_n_0), + .O(\RD_OBUF[14]_inst_i_9_n_0 )); + OBUF \RD_OBUF[15]_inst + (.I(RD_OBUF[15]), + .O(RD[15])); + MUXF7 \RD_OBUF[15]_inst_i_1 + (.I0(\RD_OBUF[15]_inst_i_3_n_0 ), + .I1(\RD_OBUF[15]_inst_i_4_n_0 ), + .O(RD_OBUF[15]), + .S(\RD_OBUF[15]_inst_i_2_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[15]_inst_i_10 + (.I0(g15_b7__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b7__2_n_0), + .O(\RD_OBUF[15]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[15]_inst_i_11 + (.I0(g13_b7__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b7__2_n_0), + .O(\RD_OBUF[15]_inst_i_11_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[15]_inst_i_12 + (.I0(g11_b7__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b7__2_n_0), + .O(\RD_OBUF[15]_inst_i_12_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[15]_inst_i_13 + (.I0(g9_b7__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b7__2_n_0), + .O(\RD_OBUF[15]_inst_i_13_n_0 )); + LUT5 #( + .INIT(32'h7FFF8000)) + \RD_OBUF[15]_inst_i_2 + (.I0(A_IBUF[7]), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(A_IBUF[8]), + .I4(A_IBUF[9]), + .O(\RD_OBUF[15]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[15]_inst_i_3 + (.I0(\RD_OBUF[15]_inst_i_6_n_0 ), + .I1(\RD_OBUF[15]_inst_i_7_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[15]_inst_i_8_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[15]_inst_i_9_n_0 ), + .O(\RD_OBUF[15]_inst_i_3_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[15]_inst_i_4 + (.I0(\RD_OBUF[15]_inst_i_10_n_0 ), + .I1(\RD_OBUF[15]_inst_i_11_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[15]_inst_i_12_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[15]_inst_i_13_n_0 ), + .O(\RD_OBUF[15]_inst_i_4_n_0 )); + LUT6 #( + .INIT(64'h8000000000000000)) + \RD_OBUF[15]_inst_i_5 + (.I0(A_IBUF[5]), + .I1(A_IBUF[3]), + .I2(A_IBUF[1]), + .I3(A_IBUF[0]), + .I4(A_IBUF[2]), + .I5(A_IBUF[4]), + .O(\RD_OBUF[15]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[15]_inst_i_6 + (.I0(g7_b7__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b7__2_n_0), + .O(\RD_OBUF[15]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[15]_inst_i_7 + (.I0(g5_b7__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b7__2_n_0), + .O(\RD_OBUF[15]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[15]_inst_i_8 + (.I0(g3_b7__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b7__2_n_0), + .O(\RD_OBUF[15]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[15]_inst_i_9 + (.I0(g1_b7__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b7__2_n_0), + .O(\RD_OBUF[15]_inst_i_9_n_0 )); + OBUF \RD_OBUF[16]_inst + (.I(RD_OBUF[16]), + .O(RD[16])); + MUXF7 \RD_OBUF[16]_inst_i_1 + (.I0(\RD_OBUF[16]_inst_i_2_n_0 ), + .I1(\RD_OBUF[16]_inst_i_3_n_0 ), + .O(RD_OBUF[16]), + .S(\RD_OBUF[23]_inst_i_2_n_0 )); + MUXF7 \RD_OBUF[16]_inst_i_10 + (.I0(g10_b0__0_n_0), + .I1(g11_b0__0_n_0), + .O(\RD_OBUF[16]_inst_i_10_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[16]_inst_i_11 + (.I0(g8_b0__0_n_0), + .I1(g9_b0__0_n_0), + .O(\RD_OBUF[16]_inst_i_11_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[16]_inst_i_2 + (.I0(\RD_OBUF[16]_inst_i_4_n_0 ), + .I1(\RD_OBUF[16]_inst_i_5_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[16]_inst_i_6_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[16]_inst_i_7_n_0 ), + .O(\RD_OBUF[16]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[16]_inst_i_3 + (.I0(\RD_OBUF[16]_inst_i_8_n_0 ), + .I1(\RD_OBUF[16]_inst_i_9_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[16]_inst_i_10_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[16]_inst_i_11_n_0 ), + .O(\RD_OBUF[16]_inst_i_3_n_0 )); + MUXF7 \RD_OBUF[16]_inst_i_4 + (.I0(g6_b0__0_n_0), + .I1(g7_b0__0_n_0), + .O(\RD_OBUF[16]_inst_i_4_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[16]_inst_i_5 + (.I0(g4_b0__0_n_0), + .I1(g5_b0__0_n_0), + .O(\RD_OBUF[16]_inst_i_5_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[16]_inst_i_6 + (.I0(g2_b0__0_n_0), + .I1(g3_b0__0_n_0), + .O(\RD_OBUF[16]_inst_i_6_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[16]_inst_i_7 + (.I0(g0_b0__0_n_0), + .I1(g1_b0__0_n_0), + .O(\RD_OBUF[16]_inst_i_7_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[16]_inst_i_8 + (.I0(g14_b0__0_n_0), + .I1(g15_b0__0_n_0), + .O(\RD_OBUF[16]_inst_i_8_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[16]_inst_i_9 + (.I0(g12_b0__0_n_0), + .I1(g13_b0__0_n_0), + .O(\RD_OBUF[16]_inst_i_9_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + OBUF \RD_OBUF[17]_inst + (.I(RD_OBUF[17]), + .O(RD[17])); + MUXF7 \RD_OBUF[17]_inst_i_1 + (.I0(\RD_OBUF[17]_inst_i_2_n_0 ), + .I1(\RD_OBUF[17]_inst_i_3_n_0 ), + .O(RD_OBUF[17]), + .S(\RD_OBUF[23]_inst_i_2_n_0 )); + MUXF7 \RD_OBUF[17]_inst_i_10 + (.I0(g10_b1__0_n_0), + .I1(g11_b1__0_n_0), + .O(\RD_OBUF[17]_inst_i_10_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[17]_inst_i_11 + (.I0(g8_b1__0_n_0), + .I1(g9_b1__0_n_0), + .O(\RD_OBUF[17]_inst_i_11_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[17]_inst_i_2 + (.I0(\RD_OBUF[17]_inst_i_4_n_0 ), + .I1(\RD_OBUF[17]_inst_i_5_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[17]_inst_i_6_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[17]_inst_i_7_n_0 ), + .O(\RD_OBUF[17]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[17]_inst_i_3 + (.I0(\RD_OBUF[17]_inst_i_8_n_0 ), + .I1(\RD_OBUF[17]_inst_i_9_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[17]_inst_i_10_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[17]_inst_i_11_n_0 ), + .O(\RD_OBUF[17]_inst_i_3_n_0 )); + MUXF7 \RD_OBUF[17]_inst_i_4 + (.I0(g6_b1__0_n_0), + .I1(g7_b1__0_n_0), + .O(\RD_OBUF[17]_inst_i_4_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[17]_inst_i_5 + (.I0(g4_b1__0_n_0), + .I1(g5_b1__0_n_0), + .O(\RD_OBUF[17]_inst_i_5_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[17]_inst_i_6 + (.I0(g2_b1__0_n_0), + .I1(g3_b1__0_n_0), + .O(\RD_OBUF[17]_inst_i_6_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[17]_inst_i_7 + (.I0(g0_b1__0_n_0), + .I1(g1_b1__0_n_0), + .O(\RD_OBUF[17]_inst_i_7_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[17]_inst_i_8 + (.I0(g14_b1__0_n_0), + .I1(g15_b1__0_n_0), + .O(\RD_OBUF[17]_inst_i_8_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[17]_inst_i_9 + (.I0(g12_b1__0_n_0), + .I1(g13_b1__0_n_0), + .O(\RD_OBUF[17]_inst_i_9_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + OBUF \RD_OBUF[18]_inst + (.I(RD_OBUF[18]), + .O(RD[18])); + MUXF7 \RD_OBUF[18]_inst_i_1 + (.I0(\RD_OBUF[18]_inst_i_2_n_0 ), + .I1(\RD_OBUF[18]_inst_i_3_n_0 ), + .O(RD_OBUF[18]), + .S(\RD_OBUF[23]_inst_i_2_n_0 )); + MUXF7 \RD_OBUF[18]_inst_i_10 + (.I0(g10_b2__0_n_0), + .I1(g11_b2__0_n_0), + .O(\RD_OBUF[18]_inst_i_10_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[18]_inst_i_11 + (.I0(g8_b2__0_n_0), + .I1(g9_b2__0_n_0), + .O(\RD_OBUF[18]_inst_i_11_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[18]_inst_i_2 + (.I0(\RD_OBUF[18]_inst_i_4_n_0 ), + .I1(\RD_OBUF[18]_inst_i_5_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[18]_inst_i_6_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[18]_inst_i_7_n_0 ), + .O(\RD_OBUF[18]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[18]_inst_i_3 + (.I0(\RD_OBUF[18]_inst_i_8_n_0 ), + .I1(\RD_OBUF[18]_inst_i_9_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[18]_inst_i_10_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[18]_inst_i_11_n_0 ), + .O(\RD_OBUF[18]_inst_i_3_n_0 )); + MUXF7 \RD_OBUF[18]_inst_i_4 + (.I0(g6_b2__0_n_0), + .I1(g7_b2__0_n_0), + .O(\RD_OBUF[18]_inst_i_4_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[18]_inst_i_5 + (.I0(g4_b2__0_n_0), + .I1(g5_b2__0_n_0), + .O(\RD_OBUF[18]_inst_i_5_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[18]_inst_i_6 + (.I0(g2_b2__0_n_0), + .I1(g3_b2__0_n_0), + .O(\RD_OBUF[18]_inst_i_6_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[18]_inst_i_7 + (.I0(g0_b2__0_n_0), + .I1(g1_b2__0_n_0), + .O(\RD_OBUF[18]_inst_i_7_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[18]_inst_i_8 + (.I0(g14_b2__0_n_0), + .I1(g15_b2__0_n_0), + .O(\RD_OBUF[18]_inst_i_8_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[18]_inst_i_9 + (.I0(g12_b2__0_n_0), + .I1(g13_b2__0_n_0), + .O(\RD_OBUF[18]_inst_i_9_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + OBUF \RD_OBUF[19]_inst + (.I(RD_OBUF[19]), + .O(RD[19])); + MUXF7 \RD_OBUF[19]_inst_i_1 + (.I0(\RD_OBUF[19]_inst_i_2_n_0 ), + .I1(\RD_OBUF[19]_inst_i_3_n_0 ), + .O(RD_OBUF[19]), + .S(\RD_OBUF[23]_inst_i_2_n_0 )); + MUXF7 \RD_OBUF[19]_inst_i_10 + (.I0(g10_b3__0_n_0), + .I1(g11_b3__0_n_0), + .O(\RD_OBUF[19]_inst_i_10_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[19]_inst_i_11 + (.I0(g8_b3__0_n_0), + .I1(g9_b3__0_n_0), + .O(\RD_OBUF[19]_inst_i_11_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[19]_inst_i_2 + (.I0(\RD_OBUF[19]_inst_i_4_n_0 ), + .I1(\RD_OBUF[19]_inst_i_5_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[19]_inst_i_6_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[19]_inst_i_7_n_0 ), + .O(\RD_OBUF[19]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[19]_inst_i_3 + (.I0(\RD_OBUF[19]_inst_i_8_n_0 ), + .I1(\RD_OBUF[19]_inst_i_9_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[19]_inst_i_10_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[19]_inst_i_11_n_0 ), + .O(\RD_OBUF[19]_inst_i_3_n_0 )); + MUXF7 \RD_OBUF[19]_inst_i_4 + (.I0(g6_b3__0_n_0), + .I1(g7_b3__0_n_0), + .O(\RD_OBUF[19]_inst_i_4_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[19]_inst_i_5 + (.I0(g4_b3__0_n_0), + .I1(g5_b3__0_n_0), + .O(\RD_OBUF[19]_inst_i_5_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[19]_inst_i_6 + (.I0(g2_b3__0_n_0), + .I1(g3_b3__0_n_0), + .O(\RD_OBUF[19]_inst_i_6_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[19]_inst_i_7 + (.I0(g0_b3__0_n_0), + .I1(g1_b3__0_n_0), + .O(\RD_OBUF[19]_inst_i_7_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[19]_inst_i_8 + (.I0(g14_b3__0_n_0), + .I1(g15_b3__0_n_0), + .O(\RD_OBUF[19]_inst_i_8_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[19]_inst_i_9 + (.I0(g12_b3__0_n_0), + .I1(g13_b3__0_n_0), + .O(\RD_OBUF[19]_inst_i_9_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + OBUF \RD_OBUF[1]_inst + (.I(RD_OBUF[1]), + .O(RD[1])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[1]_inst_i_1 + (.I0(\RD_OBUF[1]_inst_i_2_n_0 ), + .I1(\RD_OBUF[1]_inst_i_3_n_0 ), + .I2(A_IBUF[9]), + .I3(\RD_OBUF[1]_inst_i_4_n_0 ), + .I4(A_IBUF[8]), + .I5(\RD_OBUF[1]_inst_i_5_n_0 ), + .O(RD_OBUF[1])); + MUXF7 \RD_OBUF[1]_inst_i_10 + (.I0(g4_b1_n_0), + .I1(g5_b1_n_0), + .O(\RD_OBUF[1]_inst_i_10_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[1]_inst_i_11 + (.I0(g6_b1_n_0), + .I1(g7_b1_n_0), + .O(\RD_OBUF[1]_inst_i_11_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[1]_inst_i_12 + (.I0(g0_b1_n_0), + .I1(g1_b1_n_0), + .O(\RD_OBUF[1]_inst_i_12_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[1]_inst_i_13 + (.I0(g2_b1_n_0), + .I1(g3_b1_n_0), + .O(\RD_OBUF[1]_inst_i_13_n_0 ), + .S(A_IBUF[6])); + MUXF8 \RD_OBUF[1]_inst_i_2 + (.I0(\RD_OBUF[1]_inst_i_6_n_0 ), + .I1(\RD_OBUF[1]_inst_i_7_n_0 ), + .O(\RD_OBUF[1]_inst_i_2_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[1]_inst_i_3 + (.I0(\RD_OBUF[1]_inst_i_8_n_0 ), + .I1(\RD_OBUF[1]_inst_i_9_n_0 ), + .O(\RD_OBUF[1]_inst_i_3_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[1]_inst_i_4 + (.I0(\RD_OBUF[1]_inst_i_10_n_0 ), + .I1(\RD_OBUF[1]_inst_i_11_n_0 ), + .O(\RD_OBUF[1]_inst_i_4_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[1]_inst_i_5 + (.I0(\RD_OBUF[1]_inst_i_12_n_0 ), + .I1(\RD_OBUF[1]_inst_i_13_n_0 ), + .O(\RD_OBUF[1]_inst_i_5_n_0 ), + .S(A_IBUF[7])); + MUXF7 \RD_OBUF[1]_inst_i_6 + (.I0(g12_b1_n_0), + .I1(g13_b1_n_0), + .O(\RD_OBUF[1]_inst_i_6_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[1]_inst_i_7 + (.I0(g14_b1_n_0), + .I1(g15_b1_n_0), + .O(\RD_OBUF[1]_inst_i_7_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[1]_inst_i_8 + (.I0(g8_b1_n_0), + .I1(g9_b1_n_0), + .O(\RD_OBUF[1]_inst_i_8_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[1]_inst_i_9 + (.I0(g10_b1_n_0), + .I1(g11_b1_n_0), + .O(\RD_OBUF[1]_inst_i_9_n_0 ), + .S(A_IBUF[6])); + OBUF \RD_OBUF[20]_inst + (.I(RD_OBUF[20]), + .O(RD[20])); + MUXF7 \RD_OBUF[20]_inst_i_1 + (.I0(\RD_OBUF[20]_inst_i_2_n_0 ), + .I1(\RD_OBUF[20]_inst_i_3_n_0 ), + .O(RD_OBUF[20]), + .S(\RD_OBUF[23]_inst_i_2_n_0 )); + MUXF7 \RD_OBUF[20]_inst_i_10 + (.I0(g10_b4__0_n_0), + .I1(g11_b4__0_n_0), + .O(\RD_OBUF[20]_inst_i_10_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[20]_inst_i_11 + (.I0(g8_b4__0_n_0), + .I1(g9_b4__0_n_0), + .O(\RD_OBUF[20]_inst_i_11_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[20]_inst_i_2 + (.I0(\RD_OBUF[20]_inst_i_4_n_0 ), + .I1(\RD_OBUF[20]_inst_i_5_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[20]_inst_i_6_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[20]_inst_i_7_n_0 ), + .O(\RD_OBUF[20]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[20]_inst_i_3 + (.I0(\RD_OBUF[20]_inst_i_8_n_0 ), + .I1(\RD_OBUF[20]_inst_i_9_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[20]_inst_i_10_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[20]_inst_i_11_n_0 ), + .O(\RD_OBUF[20]_inst_i_3_n_0 )); + MUXF7 \RD_OBUF[20]_inst_i_4 + (.I0(g6_b4__0_n_0), + .I1(g7_b4__0_n_0), + .O(\RD_OBUF[20]_inst_i_4_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[20]_inst_i_5 + (.I0(g4_b4__0_n_0), + .I1(g5_b4__0_n_0), + .O(\RD_OBUF[20]_inst_i_5_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[20]_inst_i_6 + (.I0(g2_b4__0_n_0), + .I1(g3_b4__0_n_0), + .O(\RD_OBUF[20]_inst_i_6_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[20]_inst_i_7 + (.I0(g0_b4__0_n_0), + .I1(g1_b4__0_n_0), + .O(\RD_OBUF[20]_inst_i_7_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[20]_inst_i_8 + (.I0(g14_b4__0_n_0), + .I1(g15_b4__0_n_0), + .O(\RD_OBUF[20]_inst_i_8_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[20]_inst_i_9 + (.I0(g12_b4__0_n_0), + .I1(g13_b4__0_n_0), + .O(\RD_OBUF[20]_inst_i_9_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + OBUF \RD_OBUF[21]_inst + (.I(RD_OBUF[21]), + .O(RD[21])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[21]_inst_i_1 + (.I0(\RD_OBUF[21]_inst_i_2_n_0 ), + .I1(\RD_OBUF[21]_inst_i_3_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[21]_inst_i_5_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[21]_inst_i_7_n_0 ), + .O(RD_OBUF[21])); + MUXF7 \RD_OBUF[21]_inst_i_2 + (.I0(g6_b5__0_n_0), + .I1(g7_b5__0_n_0), + .O(\RD_OBUF[21]_inst_i_2_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[21]_inst_i_3 + (.I0(g4_b5__0_n_0), + .I1(g5_b5__0_n_0), + .O(\RD_OBUF[21]_inst_i_3_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + (* SOFT_HLUTNM = "soft_lutpair3" *) + LUT3 #( + .INIT(8'h78)) + \RD_OBUF[21]_inst_i_4 + (.I0(\RD_OBUF[23]_inst_i_5_n_0 ), + .I1(A_IBUF[7]), + .I2(A_IBUF[8]), + .O(\RD_OBUF[21]_inst_i_4_n_0 )); + MUXF7 \RD_OBUF[21]_inst_i_5 + (.I0(g2_b5__0_n_0), + .I1(g3_b5__0_n_0), + .O(\RD_OBUF[21]_inst_i_5_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + (* SOFT_HLUTNM = "soft_lutpair3" *) + LUT2 #( + .INIT(4'h6)) + \RD_OBUF[21]_inst_i_6 + (.I0(\RD_OBUF[23]_inst_i_5_n_0 ), + .I1(A_IBUF[7]), + .O(\RD_OBUF[21]_inst_i_6_n_0 )); + MUXF7 \RD_OBUF[21]_inst_i_7 + (.I0(g0_b5__0_n_0), + .I1(g1_b5__0_n_0), + .O(\RD_OBUF[21]_inst_i_7_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + LUT6 #( + .INIT(64'h7FFFFFFF80000000)) + \RD_OBUF[21]_inst_i_8 + (.I0(A_IBUF[4]), + .I1(A_IBUF[2]), + .I2(A_IBUF[1]), + .I3(A_IBUF[3]), + .I4(A_IBUF[5]), + .I5(A_IBUF[6]), + .O(\RD_OBUF[21]_inst_i_8_n_0 )); + OBUF \RD_OBUF[22]_inst + (.I(RD_OBUF[22]), + .O(RD[22])); + MUXF7 \RD_OBUF[22]_inst_i_1 + (.I0(\RD_OBUF[22]_inst_i_2_n_0 ), + .I1(\RD_OBUF[22]_inst_i_3_n_0 ), + .O(RD_OBUF[22]), + .S(\RD_OBUF[23]_inst_i_2_n_0 )); + MUXF7 \RD_OBUF[22]_inst_i_10 + (.I0(g10_b6__0_n_0), + .I1(g11_b6__0_n_0), + .O(\RD_OBUF[22]_inst_i_10_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[22]_inst_i_11 + (.I0(g8_b6__0_n_0), + .I1(g9_b6__0_n_0), + .O(\RD_OBUF[22]_inst_i_11_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[22]_inst_i_2 + (.I0(\RD_OBUF[22]_inst_i_4_n_0 ), + .I1(\RD_OBUF[22]_inst_i_5_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[22]_inst_i_6_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[22]_inst_i_7_n_0 ), + .O(\RD_OBUF[22]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[22]_inst_i_3 + (.I0(\RD_OBUF[22]_inst_i_8_n_0 ), + .I1(\RD_OBUF[22]_inst_i_9_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[22]_inst_i_10_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[22]_inst_i_11_n_0 ), + .O(\RD_OBUF[22]_inst_i_3_n_0 )); + MUXF7 \RD_OBUF[22]_inst_i_4 + (.I0(g6_b6__0_n_0), + .I1(g7_b6__0_n_0), + .O(\RD_OBUF[22]_inst_i_4_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[22]_inst_i_5 + (.I0(g4_b6__0_n_0), + .I1(g5_b6__0_n_0), + .O(\RD_OBUF[22]_inst_i_5_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[22]_inst_i_6 + (.I0(g2_b6__0_n_0), + .I1(g3_b6__0_n_0), + .O(\RD_OBUF[22]_inst_i_6_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[22]_inst_i_7 + (.I0(g0_b6__0_n_0), + .I1(g1_b6__0_n_0), + .O(\RD_OBUF[22]_inst_i_7_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[22]_inst_i_8 + (.I0(g14_b6__0_n_0), + .I1(g15_b6__0_n_0), + .O(\RD_OBUF[22]_inst_i_8_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[22]_inst_i_9 + (.I0(g12_b6__0_n_0), + .I1(g13_b6__0_n_0), + .O(\RD_OBUF[22]_inst_i_9_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + OBUF \RD_OBUF[23]_inst + (.I(RD_OBUF[23]), + .O(RD[23])); + MUXF7 \RD_OBUF[23]_inst_i_1 + (.I0(\RD_OBUF[23]_inst_i_3_n_0 ), + .I1(\RD_OBUF[23]_inst_i_4_n_0 ), + .O(RD_OBUF[23]), + .S(\RD_OBUF[23]_inst_i_2_n_0 )); + MUXF7 \RD_OBUF[23]_inst_i_10 + (.I0(g14_b7__0_n_0), + .I1(g15_b7__0_n_0), + .O(\RD_OBUF[23]_inst_i_10_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[23]_inst_i_11 + (.I0(g12_b7__0_n_0), + .I1(g13_b7__0_n_0), + .O(\RD_OBUF[23]_inst_i_11_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[23]_inst_i_12 + (.I0(g10_b7__0_n_0), + .I1(g11_b7__0_n_0), + .O(\RD_OBUF[23]_inst_i_12_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[23]_inst_i_13 + (.I0(g8_b7__0_n_0), + .I1(g9_b7__0_n_0), + .O(\RD_OBUF[23]_inst_i_13_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'h7F80)) + \RD_OBUF[23]_inst_i_2 + (.I0(A_IBUF[7]), + .I1(\RD_OBUF[23]_inst_i_5_n_0 ), + .I2(A_IBUF[8]), + .I3(A_IBUF[9]), + .O(\RD_OBUF[23]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[23]_inst_i_3 + (.I0(\RD_OBUF[23]_inst_i_6_n_0 ), + .I1(\RD_OBUF[23]_inst_i_7_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[23]_inst_i_8_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[23]_inst_i_9_n_0 ), + .O(\RD_OBUF[23]_inst_i_3_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[23]_inst_i_4 + (.I0(\RD_OBUF[23]_inst_i_10_n_0 ), + .I1(\RD_OBUF[23]_inst_i_11_n_0 ), + .I2(\RD_OBUF[21]_inst_i_4_n_0 ), + .I3(\RD_OBUF[23]_inst_i_12_n_0 ), + .I4(\RD_OBUF[21]_inst_i_6_n_0 ), + .I5(\RD_OBUF[23]_inst_i_13_n_0 ), + .O(\RD_OBUF[23]_inst_i_4_n_0 )); + LUT6 #( + .INIT(64'h8000000000000000)) + \RD_OBUF[23]_inst_i_5 + (.I0(A_IBUF[6]), + .I1(A_IBUF[4]), + .I2(A_IBUF[2]), + .I3(A_IBUF[1]), + .I4(A_IBUF[3]), + .I5(A_IBUF[5]), + .O(\RD_OBUF[23]_inst_i_5_n_0 )); + MUXF7 \RD_OBUF[23]_inst_i_6 + (.I0(g6_b7__0_n_0), + .I1(g7_b7__0_n_0), + .O(\RD_OBUF[23]_inst_i_6_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[23]_inst_i_7 + (.I0(g4_b7__0_n_0), + .I1(g5_b7__0_n_0), + .O(\RD_OBUF[23]_inst_i_7_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[23]_inst_i_8 + (.I0(g2_b7__0_n_0), + .I1(g3_b7__0_n_0), + .O(\RD_OBUF[23]_inst_i_8_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + MUXF7 \RD_OBUF[23]_inst_i_9 + (.I0(g0_b7__0_n_0), + .I1(g1_b7__0_n_0), + .O(\RD_OBUF[23]_inst_i_9_n_0 ), + .S(\RD_OBUF[21]_inst_i_8_n_0 )); + OBUF \RD_OBUF[24]_inst + (.I(RD_OBUF[24]), + .O(RD[24])); + MUXF7 \RD_OBUF[24]_inst_i_1 + (.I0(\RD_OBUF[24]_inst_i_2_n_0 ), + .I1(\RD_OBUF[24]_inst_i_3_n_0 ), + .O(RD_OBUF[24]), + .S(sel[9])); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[24]_inst_i_10 + (.I0(g11_b0__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b0__1_n_0), + .O(\RD_OBUF[24]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[24]_inst_i_11 + (.I0(g9_b0__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b0__1_n_0), + .O(\RD_OBUF[24]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[24]_inst_i_2 + (.I0(\RD_OBUF[24]_inst_i_4_n_0 ), + .I1(\RD_OBUF[24]_inst_i_5_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[24]_inst_i_6_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[24]_inst_i_7_n_0 ), + .O(\RD_OBUF[24]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[24]_inst_i_3 + (.I0(\RD_OBUF[24]_inst_i_8_n_0 ), + .I1(\RD_OBUF[24]_inst_i_9_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[24]_inst_i_10_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[24]_inst_i_11_n_0 ), + .O(\RD_OBUF[24]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[24]_inst_i_4 + (.I0(g7_b0__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b0__1_n_0), + .O(\RD_OBUF[24]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[24]_inst_i_5 + (.I0(g5_b0__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b0__1_n_0), + .O(\RD_OBUF[24]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[24]_inst_i_6 + (.I0(g3_b0__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b0__1_n_0), + .O(\RD_OBUF[24]_inst_i_6_n_0 )); + (* SOFT_HLUTNM = "soft_lutpair1" *) + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[24]_inst_i_7 + (.I0(g1_b0__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b0__1_n_0), + .O(\RD_OBUF[24]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[24]_inst_i_8 + (.I0(g15_b0__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b0__1_n_0), + .O(\RD_OBUF[24]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[24]_inst_i_9 + (.I0(g13_b0__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b0__1_n_0), + .O(\RD_OBUF[24]_inst_i_9_n_0 )); + OBUF \RD_OBUF[25]_inst + (.I(RD_OBUF[25]), + .O(RD[25])); + MUXF7 \RD_OBUF[25]_inst_i_1 + (.I0(\RD_OBUF[25]_inst_i_2_n_0 ), + .I1(\RD_OBUF[25]_inst_i_3_n_0 ), + .O(RD_OBUF[25]), + .S(sel[9])); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[25]_inst_i_10 + (.I0(g11_b1__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b1__1_n_0), + .O(\RD_OBUF[25]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[25]_inst_i_11 + (.I0(g9_b1__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b1__1_n_0), + .O(\RD_OBUF[25]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[25]_inst_i_2 + (.I0(\RD_OBUF[25]_inst_i_4_n_0 ), + .I1(\RD_OBUF[25]_inst_i_5_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[25]_inst_i_6_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[25]_inst_i_7_n_0 ), + .O(\RD_OBUF[25]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[25]_inst_i_3 + (.I0(\RD_OBUF[25]_inst_i_8_n_0 ), + .I1(\RD_OBUF[25]_inst_i_9_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[25]_inst_i_10_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[25]_inst_i_11_n_0 ), + .O(\RD_OBUF[25]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[25]_inst_i_4 + (.I0(g7_b1__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b1__1_n_0), + .O(\RD_OBUF[25]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[25]_inst_i_5 + (.I0(g5_b1__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b1__1_n_0), + .O(\RD_OBUF[25]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[25]_inst_i_6 + (.I0(g3_b1__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b1__1_n_0), + .O(\RD_OBUF[25]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[25]_inst_i_7 + (.I0(g1_b1__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b1__1_n_0), + .O(\RD_OBUF[25]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[25]_inst_i_8 + (.I0(g15_b1__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b1__1_n_0), + .O(\RD_OBUF[25]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[25]_inst_i_9 + (.I0(g13_b1__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b1__1_n_0), + .O(\RD_OBUF[25]_inst_i_9_n_0 )); + OBUF \RD_OBUF[26]_inst + (.I(RD_OBUF[26]), + .O(RD[26])); + MUXF7 \RD_OBUF[26]_inst_i_1 + (.I0(\RD_OBUF[26]_inst_i_2_n_0 ), + .I1(\RD_OBUF[26]_inst_i_3_n_0 ), + .O(RD_OBUF[26]), + .S(sel[9])); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[26]_inst_i_10 + (.I0(g11_b2__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b2__1_n_0), + .O(\RD_OBUF[26]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[26]_inst_i_11 + (.I0(g9_b2__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b2__1_n_0), + .O(\RD_OBUF[26]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[26]_inst_i_2 + (.I0(\RD_OBUF[26]_inst_i_4_n_0 ), + .I1(\RD_OBUF[26]_inst_i_5_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[26]_inst_i_6_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[26]_inst_i_7_n_0 ), + .O(\RD_OBUF[26]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[26]_inst_i_3 + (.I0(\RD_OBUF[26]_inst_i_8_n_0 ), + .I1(\RD_OBUF[26]_inst_i_9_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[26]_inst_i_10_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[26]_inst_i_11_n_0 ), + .O(\RD_OBUF[26]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[26]_inst_i_4 + (.I0(g7_b2__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b2__1_n_0), + .O(\RD_OBUF[26]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[26]_inst_i_5 + (.I0(g5_b2__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b2__1_n_0), + .O(\RD_OBUF[26]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[26]_inst_i_6 + (.I0(g3_b2__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b2__1_n_0), + .O(\RD_OBUF[26]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[26]_inst_i_7 + (.I0(g1_b2__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b2__1_n_0), + .O(\RD_OBUF[26]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[26]_inst_i_8 + (.I0(g15_b2__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b2__1_n_0), + .O(\RD_OBUF[26]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[26]_inst_i_9 + (.I0(g13_b2__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b2__1_n_0), + .O(\RD_OBUF[26]_inst_i_9_n_0 )); + OBUF \RD_OBUF[27]_inst + (.I(RD_OBUF[27]), + .O(RD[27])); + MUXF7 \RD_OBUF[27]_inst_i_1 + (.I0(\RD_OBUF[27]_inst_i_2_n_0 ), + .I1(\RD_OBUF[27]_inst_i_3_n_0 ), + .O(RD_OBUF[27]), + .S(sel[9])); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[27]_inst_i_10 + (.I0(g11_b3__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b3__1_n_0), + .O(\RD_OBUF[27]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[27]_inst_i_11 + (.I0(g9_b3__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b3__1_n_0), + .O(\RD_OBUF[27]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[27]_inst_i_2 + (.I0(\RD_OBUF[27]_inst_i_4_n_0 ), + .I1(\RD_OBUF[27]_inst_i_5_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[27]_inst_i_6_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[27]_inst_i_7_n_0 ), + .O(\RD_OBUF[27]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[27]_inst_i_3 + (.I0(\RD_OBUF[27]_inst_i_8_n_0 ), + .I1(\RD_OBUF[27]_inst_i_9_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[27]_inst_i_10_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[27]_inst_i_11_n_0 ), + .O(\RD_OBUF[27]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[27]_inst_i_4 + (.I0(g7_b3__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b3__1_n_0), + .O(\RD_OBUF[27]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[27]_inst_i_5 + (.I0(g5_b3__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b3__1_n_0), + .O(\RD_OBUF[27]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[27]_inst_i_6 + (.I0(g3_b3__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b3__1_n_0), + .O(\RD_OBUF[27]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[27]_inst_i_7 + (.I0(g1_b3__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b3__1_n_0), + .O(\RD_OBUF[27]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[27]_inst_i_8 + (.I0(g15_b3__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b3__1_n_0), + .O(\RD_OBUF[27]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[27]_inst_i_9 + (.I0(g13_b3__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b3__1_n_0), + .O(\RD_OBUF[27]_inst_i_9_n_0 )); + OBUF \RD_OBUF[28]_inst + (.I(RD_OBUF[28]), + .O(RD[28])); + MUXF7 \RD_OBUF[28]_inst_i_1 + (.I0(\RD_OBUF[28]_inst_i_2_n_0 ), + .I1(\RD_OBUF[28]_inst_i_3_n_0 ), + .O(RD_OBUF[28]), + .S(sel[9])); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[28]_inst_i_10 + (.I0(g11_b4__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b4__1_n_0), + .O(\RD_OBUF[28]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[28]_inst_i_11 + (.I0(g9_b4__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b4__1_n_0), + .O(\RD_OBUF[28]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[28]_inst_i_2 + (.I0(\RD_OBUF[28]_inst_i_4_n_0 ), + .I1(\RD_OBUF[28]_inst_i_5_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[28]_inst_i_6_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[28]_inst_i_7_n_0 ), + .O(\RD_OBUF[28]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[28]_inst_i_3 + (.I0(\RD_OBUF[28]_inst_i_8_n_0 ), + .I1(\RD_OBUF[28]_inst_i_9_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[28]_inst_i_10_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[28]_inst_i_11_n_0 ), + .O(\RD_OBUF[28]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[28]_inst_i_4 + (.I0(g7_b4__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b4__1_n_0), + .O(\RD_OBUF[28]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[28]_inst_i_5 + (.I0(g5_b4__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b4__1_n_0), + .O(\RD_OBUF[28]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[28]_inst_i_6 + (.I0(g3_b4__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b4__1_n_0), + .O(\RD_OBUF[28]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[28]_inst_i_7 + (.I0(g1_b4__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b4__1_n_0), + .O(\RD_OBUF[28]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[28]_inst_i_8 + (.I0(g15_b4__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b4__1_n_0), + .O(\RD_OBUF[28]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[28]_inst_i_9 + (.I0(g13_b4__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b4__1_n_0), + .O(\RD_OBUF[28]_inst_i_9_n_0 )); + OBUF \RD_OBUF[29]_inst + (.I(RD_OBUF[29]), + .O(RD[29])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[29]_inst_i_1 + (.I0(\RD_OBUF[29]_inst_i_2_n_0 ), + .I1(\RD_OBUF[29]_inst_i_3_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[29]_inst_i_5_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[29]_inst_i_7_n_0 ), + .O(RD_OBUF[29])); + MUXF7 \RD_OBUF[29]_inst_i_2 + (.I0(g6_b5__1_n_0), + .I1(g7_b5__1_n_0), + .O(\RD_OBUF[29]_inst_i_2_n_0 ), + .S(sel[6])); + MUXF7 \RD_OBUF[29]_inst_i_3 + (.I0(g4_b5__1_n_0), + .I1(g5_b5__1_n_0), + .O(\RD_OBUF[29]_inst_i_3_n_0 ), + .S(sel[6])); + (* SOFT_HLUTNM = "soft_lutpair2" *) + LUT4 #( + .INIT(16'h7F80)) + \RD_OBUF[29]_inst_i_4 + (.I0(A_IBUF[6]), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[7]), + .I3(A_IBUF[8]), + .O(sel[8])); + MUXF7 \RD_OBUF[29]_inst_i_5 + (.I0(g2_b5__1_n_0), + .I1(g3_b5__1_n_0), + .O(\RD_OBUF[29]_inst_i_5_n_0 ), + .S(sel[6])); + (* SOFT_HLUTNM = "soft_lutpair1" *) + LUT3 #( + .INIT(8'h78)) + \RD_OBUF[29]_inst_i_6 + (.I0(\RD_OBUF[31]_inst_i_5_n_0 ), + .I1(A_IBUF[6]), + .I2(A_IBUF[7]), + .O(sel[7])); + MUXF7 \RD_OBUF[29]_inst_i_7 + (.I0(g0_b5__1_n_0), + .I1(g1_b5__1_n_0), + .O(\RD_OBUF[29]_inst_i_7_n_0 ), + .S(sel[6])); + LUT2 #( + .INIT(4'h6)) + \RD_OBUF[29]_inst_i_8 + (.I0(\RD_OBUF[31]_inst_i_5_n_0 ), + .I1(A_IBUF[6]), + .O(sel[6])); + OBUF \RD_OBUF[2]_inst + (.I(RD_OBUF[2]), + .O(RD[2])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[2]_inst_i_1 + (.I0(\RD_OBUF[2]_inst_i_2_n_0 ), + .I1(\RD_OBUF[2]_inst_i_3_n_0 ), + .I2(A_IBUF[9]), + .I3(\RD_OBUF[2]_inst_i_4_n_0 ), + .I4(A_IBUF[8]), + .I5(\RD_OBUF[2]_inst_i_5_n_0 ), + .O(RD_OBUF[2])); + MUXF7 \RD_OBUF[2]_inst_i_10 + (.I0(g4_b2_n_0), + .I1(g5_b2_n_0), + .O(\RD_OBUF[2]_inst_i_10_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[2]_inst_i_11 + (.I0(g6_b2_n_0), + .I1(g7_b2_n_0), + .O(\RD_OBUF[2]_inst_i_11_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[2]_inst_i_12 + (.I0(g0_b2_n_0), + .I1(g1_b2_n_0), + .O(\RD_OBUF[2]_inst_i_12_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[2]_inst_i_13 + (.I0(g2_b2_n_0), + .I1(g3_b2_n_0), + .O(\RD_OBUF[2]_inst_i_13_n_0 ), + .S(A_IBUF[6])); + MUXF8 \RD_OBUF[2]_inst_i_2 + (.I0(\RD_OBUF[2]_inst_i_6_n_0 ), + .I1(\RD_OBUF[2]_inst_i_7_n_0 ), + .O(\RD_OBUF[2]_inst_i_2_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[2]_inst_i_3 + (.I0(\RD_OBUF[2]_inst_i_8_n_0 ), + .I1(\RD_OBUF[2]_inst_i_9_n_0 ), + .O(\RD_OBUF[2]_inst_i_3_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[2]_inst_i_4 + (.I0(\RD_OBUF[2]_inst_i_10_n_0 ), + .I1(\RD_OBUF[2]_inst_i_11_n_0 ), + .O(\RD_OBUF[2]_inst_i_4_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[2]_inst_i_5 + (.I0(\RD_OBUF[2]_inst_i_12_n_0 ), + .I1(\RD_OBUF[2]_inst_i_13_n_0 ), + .O(\RD_OBUF[2]_inst_i_5_n_0 ), + .S(A_IBUF[7])); + MUXF7 \RD_OBUF[2]_inst_i_6 + (.I0(g12_b2_n_0), + .I1(g13_b2_n_0), + .O(\RD_OBUF[2]_inst_i_6_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[2]_inst_i_7 + (.I0(g14_b2_n_0), + .I1(g15_b2_n_0), + .O(\RD_OBUF[2]_inst_i_7_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[2]_inst_i_8 + (.I0(g8_b2_n_0), + .I1(g9_b2_n_0), + .O(\RD_OBUF[2]_inst_i_8_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[2]_inst_i_9 + (.I0(g10_b2_n_0), + .I1(g11_b2_n_0), + .O(\RD_OBUF[2]_inst_i_9_n_0 ), + .S(A_IBUF[6])); + OBUF \RD_OBUF[30]_inst + (.I(RD_OBUF[30]), + .O(RD[30])); + MUXF7 \RD_OBUF[30]_inst_i_1 + (.I0(\RD_OBUF[30]_inst_i_2_n_0 ), + .I1(\RD_OBUF[30]_inst_i_3_n_0 ), + .O(RD_OBUF[30]), + .S(sel[9])); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[30]_inst_i_10 + (.I0(g11_b6__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b6__1_n_0), + .O(\RD_OBUF[30]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[30]_inst_i_11 + (.I0(g9_b6__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b6__1_n_0), + .O(\RD_OBUF[30]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[30]_inst_i_2 + (.I0(\RD_OBUF[30]_inst_i_4_n_0 ), + .I1(\RD_OBUF[30]_inst_i_5_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[30]_inst_i_6_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[30]_inst_i_7_n_0 ), + .O(\RD_OBUF[30]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[30]_inst_i_3 + (.I0(\RD_OBUF[30]_inst_i_8_n_0 ), + .I1(\RD_OBUF[30]_inst_i_9_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[30]_inst_i_10_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[30]_inst_i_11_n_0 ), + .O(\RD_OBUF[30]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[30]_inst_i_4 + (.I0(g7_b6__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b6__1_n_0), + .O(\RD_OBUF[30]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[30]_inst_i_5 + (.I0(g5_b6__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b6__1_n_0), + .O(\RD_OBUF[30]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[30]_inst_i_6 + (.I0(g3_b6__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b6__1_n_0), + .O(\RD_OBUF[30]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[30]_inst_i_7 + (.I0(g1_b6__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b6__1_n_0), + .O(\RD_OBUF[30]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[30]_inst_i_8 + (.I0(g15_b6__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b6__1_n_0), + .O(\RD_OBUF[30]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[30]_inst_i_9 + (.I0(g13_b6__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b6__1_n_0), + .O(\RD_OBUF[30]_inst_i_9_n_0 )); + OBUF \RD_OBUF[31]_inst + (.I(RD_OBUF[31]), + .O(RD[31])); + MUXF7 \RD_OBUF[31]_inst_i_1 + (.I0(\RD_OBUF[31]_inst_i_3_n_0 ), + .I1(\RD_OBUF[31]_inst_i_4_n_0 ), + .O(RD_OBUF[31]), + .S(sel[9])); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[31]_inst_i_10 + (.I0(g15_b7__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b7__1_n_0), + .O(\RD_OBUF[31]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[31]_inst_i_11 + (.I0(g13_b7__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b7__1_n_0), + .O(\RD_OBUF[31]_inst_i_11_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[31]_inst_i_12 + (.I0(g11_b7__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b7__1_n_0), + .O(\RD_OBUF[31]_inst_i_12_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[31]_inst_i_13 + (.I0(g9_b7__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b7__1_n_0), + .O(\RD_OBUF[31]_inst_i_13_n_0 )); + LUT5 #( + .INIT(32'h7FFF8000)) + \RD_OBUF[31]_inst_i_2 + (.I0(A_IBUF[7]), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(A_IBUF[8]), + .I4(A_IBUF[9]), + .O(sel[9])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[31]_inst_i_3 + (.I0(\RD_OBUF[31]_inst_i_6_n_0 ), + .I1(\RD_OBUF[31]_inst_i_7_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[31]_inst_i_8_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[31]_inst_i_9_n_0 ), + .O(\RD_OBUF[31]_inst_i_3_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[31]_inst_i_4 + (.I0(\RD_OBUF[31]_inst_i_10_n_0 ), + .I1(\RD_OBUF[31]_inst_i_11_n_0 ), + .I2(sel[8]), + .I3(\RD_OBUF[31]_inst_i_12_n_0 ), + .I4(sel[7]), + .I5(\RD_OBUF[31]_inst_i_13_n_0 ), + .O(\RD_OBUF[31]_inst_i_4_n_0 )); + LUT6 #( + .INIT(64'h8880000000000000)) + \RD_OBUF[31]_inst_i_5 + (.I0(A_IBUF[5]), + .I1(A_IBUF[3]), + .I2(A_IBUF[0]), + .I3(A_IBUF[1]), + .I4(A_IBUF[2]), + .I5(A_IBUF[4]), + .O(\RD_OBUF[31]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[31]_inst_i_6 + (.I0(g7_b7__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b7__1_n_0), + .O(\RD_OBUF[31]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[31]_inst_i_7 + (.I0(g5_b7__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b7__1_n_0), + .O(\RD_OBUF[31]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[31]_inst_i_8 + (.I0(g3_b7__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b7__1_n_0), + .O(\RD_OBUF[31]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[31]_inst_i_9 + (.I0(g1_b7__1_n_0), + .I1(\RD_OBUF[31]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b7__1_n_0), + .O(\RD_OBUF[31]_inst_i_9_n_0 )); + OBUF \RD_OBUF[3]_inst + (.I(RD_OBUF[3]), + .O(RD[3])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[3]_inst_i_1 + (.I0(\RD_OBUF[3]_inst_i_2_n_0 ), + .I1(\RD_OBUF[3]_inst_i_3_n_0 ), + .I2(A_IBUF[9]), + .I3(\RD_OBUF[3]_inst_i_4_n_0 ), + .I4(A_IBUF[8]), + .I5(\RD_OBUF[3]_inst_i_5_n_0 ), + .O(RD_OBUF[3])); + MUXF7 \RD_OBUF[3]_inst_i_10 + (.I0(g4_b3_n_0), + .I1(g5_b3_n_0), + .O(\RD_OBUF[3]_inst_i_10_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[3]_inst_i_11 + (.I0(g6_b3_n_0), + .I1(g7_b3_n_0), + .O(\RD_OBUF[3]_inst_i_11_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[3]_inst_i_12 + (.I0(g0_b3_n_0), + .I1(g1_b3_n_0), + .O(\RD_OBUF[3]_inst_i_12_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[3]_inst_i_13 + (.I0(g2_b3_n_0), + .I1(g3_b3_n_0), + .O(\RD_OBUF[3]_inst_i_13_n_0 ), + .S(A_IBUF[6])); + MUXF8 \RD_OBUF[3]_inst_i_2 + (.I0(\RD_OBUF[3]_inst_i_6_n_0 ), + .I1(\RD_OBUF[3]_inst_i_7_n_0 ), + .O(\RD_OBUF[3]_inst_i_2_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[3]_inst_i_3 + (.I0(\RD_OBUF[3]_inst_i_8_n_0 ), + .I1(\RD_OBUF[3]_inst_i_9_n_0 ), + .O(\RD_OBUF[3]_inst_i_3_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[3]_inst_i_4 + (.I0(\RD_OBUF[3]_inst_i_10_n_0 ), + .I1(\RD_OBUF[3]_inst_i_11_n_0 ), + .O(\RD_OBUF[3]_inst_i_4_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[3]_inst_i_5 + (.I0(\RD_OBUF[3]_inst_i_12_n_0 ), + .I1(\RD_OBUF[3]_inst_i_13_n_0 ), + .O(\RD_OBUF[3]_inst_i_5_n_0 ), + .S(A_IBUF[7])); + MUXF7 \RD_OBUF[3]_inst_i_6 + (.I0(g12_b3_n_0), + .I1(g13_b3_n_0), + .O(\RD_OBUF[3]_inst_i_6_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[3]_inst_i_7 + (.I0(g14_b3_n_0), + .I1(g15_b3_n_0), + .O(\RD_OBUF[3]_inst_i_7_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[3]_inst_i_8 + (.I0(g8_b3_n_0), + .I1(g9_b3_n_0), + .O(\RD_OBUF[3]_inst_i_8_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[3]_inst_i_9 + (.I0(g10_b3_n_0), + .I1(g11_b3_n_0), + .O(\RD_OBUF[3]_inst_i_9_n_0 ), + .S(A_IBUF[6])); + OBUF \RD_OBUF[4]_inst + (.I(RD_OBUF[4]), + .O(RD[4])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[4]_inst_i_1 + (.I0(\RD_OBUF[4]_inst_i_2_n_0 ), + .I1(\RD_OBUF[4]_inst_i_3_n_0 ), + .I2(A_IBUF[9]), + .I3(\RD_OBUF[4]_inst_i_4_n_0 ), + .I4(A_IBUF[8]), + .I5(\RD_OBUF[4]_inst_i_5_n_0 ), + .O(RD_OBUF[4])); + MUXF7 \RD_OBUF[4]_inst_i_10 + (.I0(g4_b4_n_0), + .I1(g5_b4_n_0), + .O(\RD_OBUF[4]_inst_i_10_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[4]_inst_i_11 + (.I0(g6_b4_n_0), + .I1(g7_b4_n_0), + .O(\RD_OBUF[4]_inst_i_11_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[4]_inst_i_12 + (.I0(g0_b4_n_0), + .I1(g1_b4_n_0), + .O(\RD_OBUF[4]_inst_i_12_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[4]_inst_i_13 + (.I0(g2_b4_n_0), + .I1(g3_b4_n_0), + .O(\RD_OBUF[4]_inst_i_13_n_0 ), + .S(A_IBUF[6])); + MUXF8 \RD_OBUF[4]_inst_i_2 + (.I0(\RD_OBUF[4]_inst_i_6_n_0 ), + .I1(\RD_OBUF[4]_inst_i_7_n_0 ), + .O(\RD_OBUF[4]_inst_i_2_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[4]_inst_i_3 + (.I0(\RD_OBUF[4]_inst_i_8_n_0 ), + .I1(\RD_OBUF[4]_inst_i_9_n_0 ), + .O(\RD_OBUF[4]_inst_i_3_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[4]_inst_i_4 + (.I0(\RD_OBUF[4]_inst_i_10_n_0 ), + .I1(\RD_OBUF[4]_inst_i_11_n_0 ), + .O(\RD_OBUF[4]_inst_i_4_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[4]_inst_i_5 + (.I0(\RD_OBUF[4]_inst_i_12_n_0 ), + .I1(\RD_OBUF[4]_inst_i_13_n_0 ), + .O(\RD_OBUF[4]_inst_i_5_n_0 ), + .S(A_IBUF[7])); + MUXF7 \RD_OBUF[4]_inst_i_6 + (.I0(g12_b4_n_0), + .I1(g13_b4_n_0), + .O(\RD_OBUF[4]_inst_i_6_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[4]_inst_i_7 + (.I0(g14_b4_n_0), + .I1(g15_b4_n_0), + .O(\RD_OBUF[4]_inst_i_7_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[4]_inst_i_8 + (.I0(g8_b4_n_0), + .I1(g9_b4_n_0), + .O(\RD_OBUF[4]_inst_i_8_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[4]_inst_i_9 + (.I0(g10_b4_n_0), + .I1(g11_b4_n_0), + .O(\RD_OBUF[4]_inst_i_9_n_0 ), + .S(A_IBUF[6])); + OBUF \RD_OBUF[5]_inst + (.I(RD_OBUF[5]), + .O(RD[5])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[5]_inst_i_1 + (.I0(\RD_OBUF[5]_inst_i_2_n_0 ), + .I1(\RD_OBUF[5]_inst_i_3_n_0 ), + .I2(A_IBUF[8]), + .I3(\RD_OBUF[5]_inst_i_4_n_0 ), + .I4(A_IBUF[7]), + .I5(\RD_OBUF[5]_inst_i_5_n_0 ), + .O(RD_OBUF[5])); + MUXF7 \RD_OBUF[5]_inst_i_2 + (.I0(g6_b5_n_0), + .I1(g7_b5_n_0), + .O(\RD_OBUF[5]_inst_i_2_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[5]_inst_i_3 + (.I0(g4_b5_n_0), + .I1(g5_b5_n_0), + .O(\RD_OBUF[5]_inst_i_3_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[5]_inst_i_4 + (.I0(g2_b5_n_0), + .I1(g3_b5_n_0), + .O(\RD_OBUF[5]_inst_i_4_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[5]_inst_i_5 + (.I0(g0_b5_n_0), + .I1(g1_b5_n_0), + .O(\RD_OBUF[5]_inst_i_5_n_0 ), + .S(A_IBUF[6])); + OBUF \RD_OBUF[6]_inst + (.I(RD_OBUF[6]), + .O(RD[6])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[6]_inst_i_1 + (.I0(\RD_OBUF[6]_inst_i_2_n_0 ), + .I1(\RD_OBUF[6]_inst_i_3_n_0 ), + .I2(A_IBUF[9]), + .I3(\RD_OBUF[6]_inst_i_4_n_0 ), + .I4(A_IBUF[8]), + .I5(\RD_OBUF[6]_inst_i_5_n_0 ), + .O(RD_OBUF[6])); + MUXF7 \RD_OBUF[6]_inst_i_10 + (.I0(g4_b6_n_0), + .I1(g5_b6_n_0), + .O(\RD_OBUF[6]_inst_i_10_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[6]_inst_i_11 + (.I0(g6_b6_n_0), + .I1(g7_b6_n_0), + .O(\RD_OBUF[6]_inst_i_11_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[6]_inst_i_12 + (.I0(g0_b6_n_0), + .I1(g1_b6_n_0), + .O(\RD_OBUF[6]_inst_i_12_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[6]_inst_i_13 + (.I0(g2_b6_n_0), + .I1(g3_b6_n_0), + .O(\RD_OBUF[6]_inst_i_13_n_0 ), + .S(A_IBUF[6])); + MUXF8 \RD_OBUF[6]_inst_i_2 + (.I0(\RD_OBUF[6]_inst_i_6_n_0 ), + .I1(\RD_OBUF[6]_inst_i_7_n_0 ), + .O(\RD_OBUF[6]_inst_i_2_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[6]_inst_i_3 + (.I0(\RD_OBUF[6]_inst_i_8_n_0 ), + .I1(\RD_OBUF[6]_inst_i_9_n_0 ), + .O(\RD_OBUF[6]_inst_i_3_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[6]_inst_i_4 + (.I0(\RD_OBUF[6]_inst_i_10_n_0 ), + .I1(\RD_OBUF[6]_inst_i_11_n_0 ), + .O(\RD_OBUF[6]_inst_i_4_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[6]_inst_i_5 + (.I0(\RD_OBUF[6]_inst_i_12_n_0 ), + .I1(\RD_OBUF[6]_inst_i_13_n_0 ), + .O(\RD_OBUF[6]_inst_i_5_n_0 ), + .S(A_IBUF[7])); + MUXF7 \RD_OBUF[6]_inst_i_6 + (.I0(g12_b6_n_0), + .I1(g13_b6_n_0), + .O(\RD_OBUF[6]_inst_i_6_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[6]_inst_i_7 + (.I0(g14_b6_n_0), + .I1(g15_b6_n_0), + .O(\RD_OBUF[6]_inst_i_7_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[6]_inst_i_8 + (.I0(g8_b6_n_0), + .I1(g9_b6_n_0), + .O(\RD_OBUF[6]_inst_i_8_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[6]_inst_i_9 + (.I0(g10_b6_n_0), + .I1(g11_b6_n_0), + .O(\RD_OBUF[6]_inst_i_9_n_0 ), + .S(A_IBUF[6])); + OBUF \RD_OBUF[7]_inst + (.I(RD_OBUF[7]), + .O(RD[7])); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[7]_inst_i_1 + (.I0(\RD_OBUF[7]_inst_i_2_n_0 ), + .I1(\RD_OBUF[7]_inst_i_3_n_0 ), + .I2(A_IBUF[9]), + .I3(\RD_OBUF[7]_inst_i_4_n_0 ), + .I4(A_IBUF[8]), + .I5(\RD_OBUF[7]_inst_i_5_n_0 ), + .O(RD_OBUF[7])); + MUXF7 \RD_OBUF[7]_inst_i_10 + (.I0(g4_b7_n_0), + .I1(g5_b7_n_0), + .O(\RD_OBUF[7]_inst_i_10_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[7]_inst_i_11 + (.I0(g6_b7_n_0), + .I1(g7_b7_n_0), + .O(\RD_OBUF[7]_inst_i_11_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[7]_inst_i_12 + (.I0(g0_b7_n_0), + .I1(g1_b7_n_0), + .O(\RD_OBUF[7]_inst_i_12_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[7]_inst_i_13 + (.I0(g2_b7_n_0), + .I1(g3_b7_n_0), + .O(\RD_OBUF[7]_inst_i_13_n_0 ), + .S(A_IBUF[6])); + MUXF8 \RD_OBUF[7]_inst_i_2 + (.I0(\RD_OBUF[7]_inst_i_6_n_0 ), + .I1(\RD_OBUF[7]_inst_i_7_n_0 ), + .O(\RD_OBUF[7]_inst_i_2_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[7]_inst_i_3 + (.I0(\RD_OBUF[7]_inst_i_8_n_0 ), + .I1(\RD_OBUF[7]_inst_i_9_n_0 ), + .O(\RD_OBUF[7]_inst_i_3_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[7]_inst_i_4 + (.I0(\RD_OBUF[7]_inst_i_10_n_0 ), + .I1(\RD_OBUF[7]_inst_i_11_n_0 ), + .O(\RD_OBUF[7]_inst_i_4_n_0 ), + .S(A_IBUF[7])); + MUXF8 \RD_OBUF[7]_inst_i_5 + (.I0(\RD_OBUF[7]_inst_i_12_n_0 ), + .I1(\RD_OBUF[7]_inst_i_13_n_0 ), + .O(\RD_OBUF[7]_inst_i_5_n_0 ), + .S(A_IBUF[7])); + MUXF7 \RD_OBUF[7]_inst_i_6 + (.I0(g12_b7_n_0), + .I1(g13_b7_n_0), + .O(\RD_OBUF[7]_inst_i_6_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[7]_inst_i_7 + (.I0(g14_b7_n_0), + .I1(g15_b7_n_0), + .O(\RD_OBUF[7]_inst_i_7_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[7]_inst_i_8 + (.I0(g8_b7_n_0), + .I1(g9_b7_n_0), + .O(\RD_OBUF[7]_inst_i_8_n_0 ), + .S(A_IBUF[6])); + MUXF7 \RD_OBUF[7]_inst_i_9 + (.I0(g10_b7_n_0), + .I1(g11_b7_n_0), + .O(\RD_OBUF[7]_inst_i_9_n_0 ), + .S(A_IBUF[6])); + OBUF \RD_OBUF[8]_inst + (.I(RD_OBUF[8]), + .O(RD[8])); + MUXF7 \RD_OBUF[8]_inst_i_1 + (.I0(\RD_OBUF[8]_inst_i_2_n_0 ), + .I1(\RD_OBUF[8]_inst_i_3_n_0 ), + .O(RD_OBUF[8]), + .S(\RD_OBUF[15]_inst_i_2_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[8]_inst_i_10 + (.I0(g11_b0__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b0__2_n_0), + .O(\RD_OBUF[8]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[8]_inst_i_11 + (.I0(g9_b0__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b0__2_n_0), + .O(\RD_OBUF[8]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[8]_inst_i_2 + (.I0(\RD_OBUF[8]_inst_i_4_n_0 ), + .I1(\RD_OBUF[8]_inst_i_5_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[8]_inst_i_6_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[8]_inst_i_7_n_0 ), + .O(\RD_OBUF[8]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[8]_inst_i_3 + (.I0(\RD_OBUF[8]_inst_i_8_n_0 ), + .I1(\RD_OBUF[8]_inst_i_9_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[8]_inst_i_10_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[8]_inst_i_11_n_0 ), + .O(\RD_OBUF[8]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[8]_inst_i_4 + (.I0(g7_b0__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b0__2_n_0), + .O(\RD_OBUF[8]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[8]_inst_i_5 + (.I0(g5_b0__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b0__2_n_0), + .O(\RD_OBUF[8]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[8]_inst_i_6 + (.I0(g3_b0__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b0__2_n_0), + .O(\RD_OBUF[8]_inst_i_6_n_0 )); + (* SOFT_HLUTNM = "soft_lutpair0" *) + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[8]_inst_i_7 + (.I0(g1_b0__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b0__2_n_0), + .O(\RD_OBUF[8]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[8]_inst_i_8 + (.I0(g15_b0__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b0__2_n_0), + .O(\RD_OBUF[8]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[8]_inst_i_9 + (.I0(g13_b0__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b0__2_n_0), + .O(\RD_OBUF[8]_inst_i_9_n_0 )); + OBUF \RD_OBUF[9]_inst + (.I(RD_OBUF[9]), + .O(RD[9])); + MUXF7 \RD_OBUF[9]_inst_i_1 + (.I0(\RD_OBUF[9]_inst_i_2_n_0 ), + .I1(\RD_OBUF[9]_inst_i_3_n_0 ), + .O(RD_OBUF[9]), + .S(\RD_OBUF[15]_inst_i_2_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[9]_inst_i_10 + (.I0(g11_b1__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g10_b1__2_n_0), + .O(\RD_OBUF[9]_inst_i_10_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[9]_inst_i_11 + (.I0(g9_b1__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g8_b1__2_n_0), + .O(\RD_OBUF[9]_inst_i_11_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[9]_inst_i_2 + (.I0(\RD_OBUF[9]_inst_i_4_n_0 ), + .I1(\RD_OBUF[9]_inst_i_5_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[9]_inst_i_6_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[9]_inst_i_7_n_0 ), + .O(\RD_OBUF[9]_inst_i_2_n_0 )); + LUT6 #( + .INIT(64'hAFA0CFCFAFA0C0C0)) + \RD_OBUF[9]_inst_i_3 + (.I0(\RD_OBUF[9]_inst_i_8_n_0 ), + .I1(\RD_OBUF[9]_inst_i_9_n_0 ), + .I2(\RD_OBUF[13]_inst_i_4_n_0 ), + .I3(\RD_OBUF[9]_inst_i_10_n_0 ), + .I4(\RD_OBUF[13]_inst_i_6_n_0 ), + .I5(\RD_OBUF[9]_inst_i_11_n_0 ), + .O(\RD_OBUF[9]_inst_i_3_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[9]_inst_i_4 + (.I0(g7_b1__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g6_b1__2_n_0), + .O(\RD_OBUF[9]_inst_i_4_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[9]_inst_i_5 + (.I0(g5_b1__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g4_b1__2_n_0), + .O(\RD_OBUF[9]_inst_i_5_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[9]_inst_i_6 + (.I0(g3_b1__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g2_b1__2_n_0), + .O(\RD_OBUF[9]_inst_i_6_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[9]_inst_i_7 + (.I0(g1_b1__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g0_b1__2_n_0), + .O(\RD_OBUF[9]_inst_i_7_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[9]_inst_i_8 + (.I0(g15_b1__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g14_b1__2_n_0), + .O(\RD_OBUF[9]_inst_i_8_n_0 )); + LUT4 #( + .INIT(16'hEB28)) + \RD_OBUF[9]_inst_i_9 + (.I0(g13_b1__2_n_0), + .I1(\RD_OBUF[15]_inst_i_5_n_0 ), + .I2(A_IBUF[6]), + .I3(g12_b1__2_n_0), + .O(\RD_OBUF[9]_inst_i_9_n_0 )); + LUT6 #( + .INIT(64'hE6DD6DEE4A442CA0)) + g0_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g0_b0_n_0)); + LUT6 #( + .INIT(64'h6DD7B75D18453610)) + g0_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g0_b0__0_n_0)); + LUT6 #( + .INIT(64'hD9EE9EDD85881C50)) + g0_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g0_b0__1_n_0)); + LUT6 #( + .INIT(64'hD9EE9EDD85881C50)) + g0_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g0_b0__2_n_0)); + LUT6 #( + .INIT(64'hDDC8A05E5A92DAE9)) + g0_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g0_b1_n_0)); + LUT6 #( + .INIT(64'h557CE1079C625FE4)) + g0_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g0_b1__0_n_0)); + LUT6 #( + .INIT(64'hEEC450ADA561E5D6)) + g0_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g0_b1__1_n_0)); + LUT6 #( + .INIT(64'hEEC450ADA561E5D6)) + g0_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g0_b1__2_n_0)); + LUT6 #( + .INIT(64'hAED4B75C3F10BBE8)) + g0_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g0_b2_n_0)); + LUT6 #( + .INIT(64'h7C17693F383A7F2C)) + g0_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g0_b2__0_n_0)); + LUT6 #( + .INIT(64'h5DE87BAC3F2077D4)) + g0_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g0_b2__1_n_0)); + LUT6 #( + .INIT(64'h5DE87BAC3F2077D4)) + g0_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g0_b2__2_n_0)); + LUT6 #( + .INIT(64'h6C621CE973071BC0)) + g0_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g0_b3_n_0)); + LUT6 #( + .INIT(64'hB25417B4A8E91C2C)) + g0_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g0_b3__0_n_0)); + LUT6 #( + .INIT(64'h9C912CD6B30B27C0)) + g0_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g0_b3__1_n_0)); + LUT6 #( + .INIT(64'h9C912CD6B30B27C0)) + g0_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g0_b3__2_n_0)); + LUT6 #( + .INIT(64'h94D7C8793ED22AF5)) + g0_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g0_b4_n_0)); + LUT6 #( + .INIT(64'hC4B753C6BC363E87)) + g0_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g0_b4__0_n_0)); + LUT6 #( + .INIT(64'h68EBC4B63DE115FA)) + g0_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g0_b4__1_n_0)); + LUT6 #( + .INIT(64'h68EBC4B63DE115FA)) + g0_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g0_b4__2_n_0)); + LUT6 #( + .INIT(64'h4A9B7A9CCD259656)) + g0_b5 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g0_b5_n_0)); + LUT6 #( + .INIT(64'h9DC23D6352D9C837)) + g0_b5__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g0_b5__0_n_0)); + LUT6 #( + .INIT(64'h8567B56CCE1A69A9)) + g0_b5__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g0_b5__1_n_0)); + LUT6 #( + .INIT(64'h8567B56CCE1A69A9)) + g0_b5__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g0_b5__2_n_0)); + LUT6 #( + .INIT(64'h26AB18B01216074B)) + g0_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g0_b6_n_0)); + LUT6 #( + .INIT(64'hAF9016228823899C)) + g0_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g0_b6__0_n_0)); + LUT6 #( + .INIT(64'h1957247021290B87)) + g0_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g0_b6__1_n_0)); + LUT6 #( + .INIT(64'h1957247021290B87)) + g0_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g0_b6__2_n_0)); + LUT6 #( + .INIT(64'hAD6F7848B3FC7884)) + g0_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g0_b7_n_0)); + LUT6 #( + .INIT(64'hF39D31646F2F3461)) + g0_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g0_b7__0_n_0)); + LUT6 #( + .INIT(64'h5E9FB48473FCB448)) + g0_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g0_b7__1_n_0)); + LUT6 #( + .INIT(64'h5E9FB48473FCB448)) + g0_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g0_b7__2_n_0)); + LUT6 #( + .INIT(64'h711144702FB3B54B)) + g10_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g10_b0_n_0)); + LUT6 #( + .INIT(64'h20EA0256BE9AE1BC)) + g10_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g10_b0__0_n_0)); + LUT6 #( + .INIT(64'hB22288B01F737A87)) + g10_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g10_b0__1_n_0)); + LUT6 #( + .INIT(64'hB22288B01F737A87)) + g10_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g10_b0__2_n_0)); + LUT6 #( + .INIT(64'h44ECD8BC57DCB745)) + g10_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g10_b1_n_0)); + LUT6 #( + .INIT(64'h075557630D7F68BD)) + g10_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g10_b1__0_n_0)); + LUT6 #( + .INIT(64'h88DCE47CABEC7B8A)) + g10_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g10_b1__1_n_0)); + LUT6 #( + .INIT(64'h88DCE47CABEC7B8A)) + g10_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g10_b1__2_n_0)); + LUT6 #( + .INIT(64'h0248FF7B8A9E9599)) + g10_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g10_b2_n_0)); + LUT6 #( + .INIT(64'h0904FBFEDD0345BA)) + g10_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g10_b2__0_n_0)); + LUT6 #( + .INIT(64'h0184FFB7456D6A66)) + g10_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g10_b2__1_n_0)); + LUT6 #( + .INIT(64'h0184FFB7456D6A66)) + g10_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g10_b2__2_n_0)); + LUT6 #( + .INIT(64'hB25FE5F22A94E36E)) + g10_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g10_b3_n_0)); + LUT6 #( + .INIT(64'hE9A7E65E3C03EB4D)) + g10_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g10_b3__0_n_0)); + LUT6 #( + .INIT(64'h71AFDAF11568D39D)) + g10_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g10_b3__1_n_0)); + LUT6 #( + .INIT(64'h71AFDAF11568D39D)) + g10_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g10_b3__2_n_0)); + LUT6 #( + .INIT(64'h812975B16E1315E8)) + g10_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g10_b4_n_0)); + LUT6 #( + .INIT(64'h438826FAB8D2073C)) + g10_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g10_b4__0_n_0)); + LUT6 #( + .INIT(64'h4216BA729D232AD4)) + g10_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g10_b4__1_n_0)); + LUT6 #( + .INIT(64'h4216BA729D232AD4)) + g10_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g10_b4__2_n_0)); + LUT6 #( + .INIT(64'h83EF1CD100DC2F42)) + g10_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g10_b6_n_0)); + LUT6 #( + .INIT(64'hCF8D14B60507B81C)) + g10_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g10_b6__0_n_0)); + LUT6 #( + .INIT(64'h43DF2CE200EC1F81)) + g10_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g10_b6__1_n_0)); + LUT6 #( + .INIT(64'h43DF2CE200EC1F81)) + g10_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g10_b6__2_n_0)); + LUT6 #( + .INIT(64'h8681D6A3199EFA2E)) + g10_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g10_b7_n_0)); + LUT6 #( + .INIT(64'h4C90CEF0952BFB61)) + g10_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g10_b7__0_n_0)); + LUT6 #( + .INIT(64'h4942E953266DF51D)) + g10_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g10_b7__1_n_0)); + LUT6 #( + .INIT(64'h4942E953266DF51D)) + g10_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g10_b7__2_n_0)); + LUT6 #( + .INIT(64'h817F438670A763A7)) + g11_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g11_b0_n_0)); + LUT6 #( + .INIT(64'hC38F8C49A6E1AEC9)) + g11_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g11_b0__0_n_0)); + LUT6 #( + .INIT(64'h42BF8349B05B935B)) + g11_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g11_b0__1_n_0)); + LUT6 #( + .INIT(64'h42BF8349B05B935B)) + g11_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g11_b0__2_n_0)); + LUT6 #( + .INIT(64'h0FA162A2FC16BB27)) + g11_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g11_b1_n_0)); + LUT6 #( + .INIT(64'h1E98AE40F073FAA9)) + g11_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g11_b1__0_n_0)); + LUT6 #( + .INIT(64'h0F529151FC29771B)) + g11_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g11_b1__1_n_0)); + LUT6 #( + .INIT(64'h0F529151FC29771B)) + g11_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g11_b1__2_n_0)); + LUT6 #( + .INIT(64'h69A4C20E13C47E67)) + g11_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g11_b2_n_0)); + LUT6 #( + .INIT(64'h3649C9410C2DBAF5)) + g11_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g11_b2__0_n_0)); + LUT6 #( + .INIT(64'h9658C10D23C8BD9B)) + g11_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g11_b2__1_n_0)); + LUT6 #( + .INIT(64'h9658C10D23C8BD9B)) + g11_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g11_b2__2_n_0)); + LUT6 #( + .INIT(64'h6BE4C8FFD3C39A7C)) + g11_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g11_b3_n_0)); + LUT6 #( + .INIT(64'h3E4DD7C7CCEC5B27)) + g11_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g11_b3__0_n_0)); + LUT6 #( + .INIT(64'h97D8C4FFE3C365BC)) + g11_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g11_b3__1_n_0)); + LUT6 #( + .INIT(64'h97D8C4FFE3C365BC)) + g11_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g11_b3__2_n_0)); + LUT6 #( + .INIT(64'hF12F111BE9C48511)) + g11_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g11_b4_n_0)); + LUT6 #( + .INIT(64'hE3E981AA744D409A)) + g11_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g11_b4__0_n_0)); + LUT6 #( + .INIT(64'hF21F2227D6C84A22)) + g11_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g11_b4__1_n_0)); + LUT6 #( + .INIT(64'hF21F2227D6C84A22)) + g11_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g11_b4__2_n_0)); + LUT6 #( + .INIT(64'h8E01B286B5B8ADA1)) + g11_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g11_b6_n_0)); + LUT6 #( + .INIT(64'h5890EC21673A7698)) + g11_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g11_b6__0_n_0)); + LUT6 #( + .INIT(64'h4D0271497A745E52)) + g11_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g11_b6__1_n_0)); + LUT6 #( + .INIT(64'h4D0271497A745E52)) + g11_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g11_b6__2_n_0)); + LUT6 #( + .INIT(64'hBCF643C38AC949FD)) + g11_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g11_b7_n_0)); + LUT6 #( + .INIT(64'hF6378CCC5D8417CF)) + g11_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g11_b7__0_n_0)); + LUT6 #( + .INIT(64'h7CF983C345C686FE)) + g11_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g11_b7__1_n_0)); + LUT6 #( + .INIT(64'h7CF983C345C686FE)) + g11_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g11_b7__2_n_0)); + LUT6 #( + .INIT(64'h16859A383DD6DB22)) + g12_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g12_b0_n_0)); + LUT6 #( + .INIT(64'h0CB15B22B43FDA68)) + g12_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g12_b0__0_n_0)); + LUT6 #( + .INIT(64'h294A65343EE9E711)) + g12_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g12_b0__1_n_0)); + LUT6 #( + .INIT(64'h294A65343EE9E711)) + g12_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g12_b0__2_n_0)); + LUT6 #( + .INIT(64'h572302298FC88AFD)) + g12_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g12_b1_n_0)); + LUT6 #( + .INIT(64'h8AF80B805D1C5F87)) + g12_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g12_b1__0_n_0)); + LUT6 #( + .INIT(64'hAB1301164FC445FE)) + g12_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g12_b1__1_n_0)); + LUT6 #( + .INIT(64'hAB1301164FC445FE)) + g12_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g12_b1__2_n_0)); + LUT6 #( + .INIT(64'hB0D9DF840EDFD583)) + g12_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g12_b2_n_0)); + LUT6 #( + .INIT(64'h65A65C799D97C4F8)) + g12_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g12_b2__0_n_0)); + LUT6 #( + .INIT(64'h70E6EF480DEFEA43)) + g12_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g12_b2__1_n_0)); + LUT6 #( + .INIT(64'h70E6EF480DEFEA43)) + g12_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g12_b2__2_n_0)); + LUT6 #( + .INIT(64'hDB8B3605818C4D60)) + g12_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g12_b3_n_0)); + LUT6 #( + .INIT(64'hDDE828B14509125C)) + g12_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g12_b3__0_n_0)); + LUT6 #( + .INIT(64'hE747390A424C8E90)) + g12_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g12_b3__1_n_0)); + LUT6 #( + .INIT(64'hE747390A424C8E90)) + g12_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g12_b3__2_n_0)); + LUT6 #( + .INIT(64'h662505D880B48D8F)) + g12_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g12_b4_n_0)); + LUT6 #( + .INIT(64'h2AD1051E4603D599)) + g12_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g12_b4__0_n_0)); + LUT6 #( + .INIT(64'h991A0AE440784E4F)) + g12_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g12_b4__1_n_0)); + LUT6 #( + .INIT(64'h991A0AE440784E4F)) + g12_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g12_b4__2_n_0)); + LUT6 #( + .INIT(64'h6C30622CDF33911D)) + g12_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g12_b6_n_0)); + LUT6 #( + .INIT(64'h32522B41DAFA41AB)) + g12_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g12_b6__0_n_0)); + LUT6 #( + .INIT(64'h9C30911CEF33622E)) + g12_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g12_b6__1_n_0)); + LUT6 #( + .INIT(64'h9C30911CEF33622E)) + g12_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g12_b6__2_n_0)); + LUT6 #( + .INIT(64'hAFE460D8B3F87EC6)) + g12_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g12_b7_n_0)); + LUT6 #( + .INIT(64'h7E1D25466F2EBC75)) + g12_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g12_b7__0_n_0)); + LUT6 #( + .INIT(64'h5FD890E473F4BDC9)) + g12_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g12_b7__1_n_0)); + LUT6 #( + .INIT(64'h5FD890E473F4BDC9)) + g12_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g12_b7__2_n_0)); + LUT6 #( + .INIT(64'h2607220E3F9E0DCB)) + g13_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g13_b0_n_0)); + LUT6 #( + .INIT(64'hA891A901BD3B959C)) + g13_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g13_b0__0_n_0)); + LUT6 #( + .INIT(64'h190B110D3F6D0EC7)) + g13_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g13_b0__1_n_0)); + LUT6 #( + .INIT(64'h190B110D3F6D0EC7)) + g13_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g13_b0__2_n_0)); + LUT6 #( + .INIT(64'h35DEF8EC6CA8F127)) + g13_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g13_b1_n_0)); + LUT6 #( + .INIT(64'hA53F77653750E2E9)) + g13_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g13_b1__0_n_0)); + LUT6 #( + .INIT(64'h3AEDF4DC9C54F21B)) + g13_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g13_b1__1_n_0)); + LUT6 #( + .INIT(64'h3AEDF4DC9C54F21B)) + g13_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g13_b1__2_n_0)); + LUT6 #( + .INIT(64'h4D9EE264917A8866)) + g13_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g13_b2_n_0)); + LUT6 #( + .INIT(64'h955B6A45C32ED205)) + g13_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g13_b2__0_n_0)); + LUT6 #( + .INIT(64'h8E6DD19862B54499)) + g13_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g13_b2__1_n_0)); + LUT6 #( + .INIT(64'h8E6DD19862B54499)) + g13_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g13_b2__2_n_0)); + LUT6 #( + .INIT(64'hD787642317362D36)) + g13_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g13_b3_n_0)); + LUT6 #( + .INIT(64'hCCF9A2D08A3BB21B)) + g13_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g13_b3__0_n_0)); + LUT6 #( + .INIT(64'hEB4B98132B391E39)) + g13_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g13_b3__1_n_0)); + LUT6 #( + .INIT(64'hEB4B98132B391E39)) + g13_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g13_b3__2_n_0)); + LUT6 #( + .INIT(64'hA18919A8DFAAEAF4)) + g13_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g13_b4_n_0)); + LUT6 #( + .INIT(64'h65881728DF787E47)) + g13_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g13_b4__0_n_0)); + LUT6 #( + .INIT(64'h52462654EF55D5F8)) + g13_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g13_b4__1_n_0)); + LUT6 #( + .INIT(64'h52462654EF55D5F8)) + g13_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g13_b4__2_n_0)); + LUT6 #( + .INIT(64'h52FA49C54709721F)) + g13_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g13_b6_n_0)); + LUT6 #( + .INIT(64'h8F6614CD09D8A9E3)) + g13_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g13_b6__0_n_0)); + LUT6 #( + .INIT(64'hA1F586CA8B06B12F)) + g13_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g13_b6__1_n_0)); + LUT6 #( + .INIT(64'hA1F586CA8B06B12F)) + g13_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g13_b6__2_n_0)); + LUT6 #( + .INIT(64'h9A5D5B6B90D36EF7)) + g13_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g13_b7_n_0)); + LUT6 #( + .INIT(64'h59A79BECC4A6BED7)) + g13_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g13_b7__0_n_0)); + LUT6 #( + .INIT(64'h65AEA79760E39DFB)) + g13_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g13_b7__1_n_0)); + LUT6 #( + .INIT(64'h65AEA79760E39DFB)) + g13_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g13_b7__2_n_0)); + LUT6 #( + .INIT(64'hB80FDC4659684195)) + g14_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g14_b0_n_0)); + LUT6 #( + .INIT(64'hF1A1D075136C04CB)) + g14_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g14_b0__0_n_0)); + LUT6 #( + .INIT(64'h740FEC89A694826A)) + g14_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g14_b0__1_n_0)); + LUT6 #( + .INIT(64'h740FEC89A694826A)) + g14_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g14_b0__2_n_0)); + LUT6 #( + .INIT(64'hB46198D5A77886C6)) + g14_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g14_b1_n_0)); + LUT6 #( + .INIT(64'h62B454A76B1ECC15)) + g14_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g14_b1__0_n_0)); + LUT6 #( + .INIT(64'h789264EA5BB449C9)) + g14_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g14_b1__1_n_0)); + LUT6 #( + .INIT(64'h789264EA5BB449C9)) + g14_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g14_b1__2_n_0)); + LUT6 #( + .INIT(64'h5419EFAFAF36C87A)) + g14_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g14_b2_n_0)); + LUT6 #( + .INIT(64'h01F2FFD9FA1BD346)) + g14_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g14_b2__0_n_0)); + LUT6 #( + .INIT(64'hA826DF5F5F39C4B5)) + g14_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g14_b2__1_n_0)); + LUT6 #( + .INIT(64'hA826DF5F5F39C4B5)) + g14_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g14_b2__2_n_0)); + LUT6 #( + .INIT(64'h2D33E4713BB3397F)) + g14_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g14_b3_n_0)); + LUT6 #( + .INIT(64'hB29A62D6BEAAB3AF)) + g14_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g14_b3__0_n_0)); + LUT6 #( + .INIT(64'h1E33D8B2377336BF)) + g14_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g14_b3__1_n_0)); + LUT6 #( + .INIT(64'h1E33D8B2377336BF)) + g14_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g14_b3__2_n_0)); + LUT6 #( + .INIT(64'h283BE712A5F124AD)) + g14_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g14_b4_n_0)); + LUT6 #( + .INIT(64'hB382E85A669E2791)) + g14_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g14_b4__0_n_0)); + LUT6 #( + .INIT(64'h1437DB215AF2185E)) + g14_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g14_b4__1_n_0)); + LUT6 #( + .INIT(64'h1437DB215AF2185E)) + g14_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g14_b4__2_n_0)); + LUT6 #( + .INIT(64'h9BD5DFD3E0EDFEE0)) + g14_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g14_b6_n_0)); + LUT6 #( + .INIT(64'h5CAFDCFE67C57E74)) + g14_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g14_b6__0_n_0)); + LUT6 #( + .INIT(64'h67EAEFE3D0DEFDD0)) + g14_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g14_b6__1_n_0)); + LUT6 #( + .INIT(64'h67EAEFE3D0DEFDD0)) + g14_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g14_b6__2_n_0)); + LUT6 #( + .INIT(64'h616EEA5E0640D571)) + g14_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g14_b7_n_0)); + LUT6 #( + .INIT(64'hA34DF947081442FE)) + g14_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g14_b7__0_n_0)); + LUT6 #( + .INIT(64'h929DD5AD0980EAB2)) + g14_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g14_b7__1_n_0)); + LUT6 #( + .INIT(64'h929DD5AD0980EAB2)) + g14_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g14_b7__2_n_0)); + LUT6 #( + .INIT(64'hE884D897CA8C592C)) + g15_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g15_b0_n_0)); + LUT6 #( + .INIT(64'h7441D4E35D411369)) + g15_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g15_b0__0_n_0)); + LUT6 #( + .INIT(64'hD448E46BC54CA61C)) + g15_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g15_b0__1_n_0)); + LUT6 #( + .INIT(64'hD448E46BC54CA61C)) + g15_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g15_b0__2_n_0)); + LUT6 #( + .INIT(64'h7E74C95AC83D066B)) + g15_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g15_b1_n_0)); + LUT6 #( + .INIT(64'h3A77D14E53C38B94)) + g15_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g15_b1__0_n_0)); + LUT6 #( + .INIT(64'hBDB8C6A5C43E0997)) + g15_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g15_b1__1_n_0)); + LUT6 #( + .INIT(64'hBDB8C6A5C43E0997)) + g15_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g15_b1__2_n_0)); + LUT6 #( + .INIT(64'hA94794C6E1FCF963)) + g15_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g15_b2_n_0)); + LUT6 #( + .INIT(64'hF08DC435674FF2EC)) + g15_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g15_b2__0_n_0)); + LUT6 #( + .INIT(64'h568B68C9D2FCF693)) + g15_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g15_b2__1_n_0)); + LUT6 #( + .INIT(64'h568B68C9D2FCF693)) + g15_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g15_b2__2_n_0)); + LUT6 #( + .INIT(64'hBE158BCBD991389A)) + g15_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g15_b3_n_0)); + LUT6 #( + .INIT(64'h78B3DD8C54EAB522)) + g15_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g15_b3__0_n_0)); + LUT6 #( + .INIT(64'h7D2A47C7E6623465)) + g15_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g15_b3__1_n_0)); + LUT6 #( + .INIT(64'h7D2A47C7E6623465)) + g15_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g15_b3__2_n_0)); + LUT6 #( + .INIT(64'hC9B8AC57675EFCF5)) + g15_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g15_b4_n_0)); + LUT6 #( + .INIT(64'h574AF097A95F76F7)) + g15_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g15_b4__0_n_0)); + LUT6 #( + .INIT(64'hC6745CAB9BADFCFA)) + g15_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g15_b4__1_n_0)); + LUT6 #( + .INIT(64'hC6745CAB9BADFCFA)) + g15_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g15_b4__2_n_0)); + LUT6 #( + .INIT(64'h3945B67BAA668468)) + g15_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g15_b6_n_0)); + LUT6 #( + .INIT(64'h30ADEBB6FA054314)) + g15_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g15_b6__0_n_0)); + LUT6 #( + .INIT(64'h368A79B755994894)) + g15_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g15_b6__1_n_0)); + LUT6 #( + .INIT(64'h368A79B755994894)) + g15_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g15_b6__2_n_0)); + LUT6 #( + .INIT(64'h724DB8457F70B64A)) + g15_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g15_b7_n_0)); + LUT6 #( + .INIT(64'h29E570A53A7EE934)) + g15_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g15_b7__0_n_0)); + LUT6 #( + .INIT(64'hB18E748ABFB07985)) + g15_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g15_b7__1_n_0)); + LUT6 #( + .INIT(64'hB18E748ABFB07985)) + g15_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g15_b7__2_n_0)); + LUT2 #( + .INIT(4'h9)) + g15_b7_i_1 + (.I0(A_IBUF[1]), + .I1(A_IBUF[0]), + .O(sel[1])); + LUT2 #( + .INIT(4'h6)) + g15_b7_i_1__0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .O(g15_b7_i_1__0_n_0)); + LUT4 #( + .INIT(16'h7F80)) + g15_b7_i_1__1 + (.I0(A_IBUF[2]), + .I1(A_IBUF[1]), + .I2(A_IBUF[3]), + .I3(A_IBUF[4]), + .O(g15_b7_i_1__1_n_0)); + LUT3 #( + .INIT(8'h78)) + g15_b7_i_2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .O(g15_b7_i_2_n_0)); + LUT5 #( + .INIT(32'h7FFF8000)) + g15_b7_i_2__0 + (.I0(A_IBUF[3]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[4]), + .I4(A_IBUF[5]), + .O(g15_b7_i_2__0_n_0)); + LUT3 #( + .INIT(8'h1E)) + g15_b7_i_2__1 + (.I0(A_IBUF[1]), + .I1(A_IBUF[0]), + .I2(A_IBUF[2]), + .O(sel[2])); + LUT4 #( + .INIT(16'h7F80)) + g15_b7_i_3 + (.I0(A_IBUF[1]), + .I1(A_IBUF[0]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .O(g15_b7_i_3_n_0)); + LUT4 #( + .INIT(16'h1FE0)) + g15_b7_i_3__0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .O(sel[3])); + LUT5 #( + .INIT(32'h7FFF8000)) + g15_b7_i_4 + (.I0(A_IBUF[2]), + .I1(A_IBUF[0]), + .I2(A_IBUF[1]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .O(g15_b7_i_4_n_0)); + LUT5 #( + .INIT(32'h57FFA800)) + g15_b7_i_4__0 + (.I0(A_IBUF[2]), + .I1(A_IBUF[1]), + .I2(A_IBUF[0]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .O(sel[4])); + LUT6 #( + .INIT(64'h7FFFFFFF80000000)) + g15_b7_i_5 + (.I0(A_IBUF[3]), + .I1(A_IBUF[1]), + .I2(A_IBUF[0]), + .I3(A_IBUF[2]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g15_b7_i_5_n_0)); + LUT6 #( + .INIT(64'h57FFFFFFA8000000)) + g15_b7_i_5__0 + (.I0(A_IBUF[3]), + .I1(A_IBUF[0]), + .I2(A_IBUF[1]), + .I3(A_IBUF[2]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(sel[5])); + LUT6 #( + .INIT(64'h51E9A02D5F71BDDD)) + g1_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g1_b0_n_0)); + LUT6 #( + .INIT(64'h07EC63811AFE75BF)) + g1_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g1_b0__0_n_0)); + LUT6 #( + .INIT(64'hA2D6501EAFB27EEE)) + g1_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g1_b0__1_n_0)); + LUT6 #( + .INIT(64'hA2D6501EAFB27EEE)) + g1_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g1_b0__2_n_0)); + LUT6 #( + .INIT(64'h79CD4A656993B0EA)) + g1_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g1_b1_n_0)); + LUT6 #( + .INIT(64'h35ED1AC5B4CAE724)) + g1_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g1_b1__0_n_0)); + LUT6 #( + .INIT(64'hB6CE859A966370D5)) + g1_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g1_b1__1_n_0)); + LUT6 #( + .INIT(64'hB6CE859A966370D5)) + g1_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g1_b1__2_n_0)); + LUT6 #( + .INIT(64'h34D707A747D4DCBD)) + g1_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g1_b2_n_0)); + LUT6 #( + .INIT(64'hA4B78E990C5F57F3)) + g1_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g1_b2__0_n_0)); + LUT6 #( + .INIT(64'h38EB0B5B8BE8EC7E)) + g1_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g1_b2__1_n_0)); + LUT6 #( + .INIT(64'h38EB0B5B8BE8EC7E)) + g1_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g1_b2__2_n_0)); + LUT6 #( + .INIT(64'hBEBAAAB69C55AD4F)) + g1_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g1_b3_n_0)); + LUT6 #( + .INIT(64'hFF32FE0350B7F19D)) + g1_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g1_b3__0_n_0)); + LUT6 #( + .INIT(64'h7D7555796CAA5E8F)) + g1_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g1_b3__1_n_0)); + LUT6 #( + .INIT(64'h7D7555796CAA5E8F)) + g1_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g1_b3__2_n_0)); + LUT6 #( + .INIT(64'h47FEDD39F682ADD6)) + g1_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g1_b4_n_0)); + LUT6 #( + .INIT(64'h8F5F53FAEC70F41F)) + g1_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g1_b4__0_n_0)); + LUT6 #( + .INIT(64'h8BFDEE36F9415EE9)) + g1_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g1_b4__1_n_0)); + LUT6 #( + .INIT(64'h8BFDEE36F9415EE9)) + g1_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g1_b4__2_n_0)); + LUT6 #( + .INIT(64'h94708343F29159A8)) + g1_b5 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g1_b5_n_0)); + LUT6 #( + .INIT(64'h4236C88C6CE21768)) + g1_b5__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g1_b5__0_n_0)); + LUT6 #( + .INIT(64'h68B04383F162A654)) + g1_b5__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g1_b5__1_n_0)); + LUT6 #( + .INIT(64'h68B04383F162A654)) + g1_b5__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g1_b5__2_n_0)); + LUT6 #( + .INIT(64'hC68ACA86B5982BB7)) + g1_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g1_b6_n_0)); + LUT6 #( + .INIT(64'hCD50DC41653ABE8B)) + g1_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g1_b6__0_n_0)); + LUT6 #( + .INIT(64'hC945C5497A64177B)) + g1_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g1_b6__1_n_0)); + LUT6 #( + .INIT(64'hC945C5497A64177B)) + g1_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g1_b6__2_n_0)); + LUT6 #( + .INIT(64'h1E5DD96920436757)) + g1_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g1_b7_n_0)); + LUT6 #( + .INIT(64'h19B753ECA084A8DF)) + g1_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g1_b7__0_n_0)); + LUT6 #( + .INIT(64'h2DAEE69610839BAB)) + g1_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g1_b7__1_n_0)); + LUT6 #( + .INIT(64'h2DAEE69610839BAB)) + g1_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g1_b7__2_n_0)); + LUT6 #( + .INIT(64'h12DB8364A03E3B52)) + g2_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g2_b0_n_0)); + LUT6 #( + .INIT(64'h8DA64A0DE303B82E)) + g2_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g2_b0__0_n_0)); + LUT6 #( + .INIT(64'h21E74398503D37A1)) + g2_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g2_b0__1_n_0)); + LUT6 #( + .INIT(64'h21E74398503D37A1)) + g2_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g2_b0__2_n_0)); + LUT6 #( + .INIT(64'h088D88EDB2C16C24)) + g2_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g2_b1_n_0)); + LUT6 #( + .INIT(64'h158157856CA43251)) + g2_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g2_b1__0_n_0)); + LUT6 #( + .INIT(64'h044E44DE71C29C18)) + g2_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g2_b1__1_n_0)); + LUT6 #( + .INIT(64'h044E44DE71C29C18)) + g2_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g2_b1__2_n_0)); + LUT6 #( + .INIT(64'h1CBB0431AE240FE8)) + g2_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g2_b2_n_0)); + LUT6 #( + .INIT(64'h97B202927A111F1C)) + g2_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g2_b2__0_n_0)); + LUT6 #( + .INIT(64'h2C7708325D180FD4)) + g2_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g2_b2__1_n_0)); + LUT6 #( + .INIT(64'h2C7708325D180FD4)) + g2_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g2_b2__2_n_0)); + LUT6 #( + .INIT(64'hE85114527B90C563)) + g2_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g2_b3_n_0)); + LUT6 #( + .INIT(64'h70C680363C6AC2DC)) + g2_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g2_b3__0_n_0)); + LUT6 #( + .INIT(64'hD4A228A1B760CA93)) + g2_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g2_b3__1_n_0)); + LUT6 #( + .INIT(64'hD4A228A1B760CA93)) + g2_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g2_b3__2_n_0)); + LUT6 #( + .INIT(64'h76386FA669ED996F)) + g2_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g2_b4_n_0)); + LUT6 #( + .INIT(64'h2B72BE5937CDD3AD)) + g2_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g2_b4__0_n_0)); + LUT6 #( + .INIT(64'hB9349F5996DE669F)) + g2_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g2_b4__1_n_0)); + LUT6 #( + .INIT(64'hB9349F5996DE669F)) + g2_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g2_b4__2_n_0)); + LUT6 #( + .INIT(64'hE7C53CFD1FCE2E5D)) + g2_b5 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g2_b5_n_0)); + LUT6 #( + .INIT(64'h6CDD37B79D3D3997)) + g2_b5__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g2_b5__0_n_0)); + LUT6 #( + .INIT(64'hDBCA3CFE2FCD1DAE)) + g2_b5__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g2_b5__1_n_0)); + LUT6 #( + .INIT(64'hDBCA3CFE2FCD1DAE)) + g2_b5__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g2_b5__2_n_0)); + LUT6 #( + .INIT(64'h7C10E32EFF23D0BD)) + g2_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g2_b6_n_0)); + LUT6 #( + .INIT(64'h3072EB49FAF847E3)) + g2_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g2_b6__0_n_0)); + LUT6 #( + .INIT(64'hBC20D31DFF13E07E)) + g2_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g2_b6__1_n_0)); + LUT6 #( + .INIT(64'hBC20D31DFF13E07E)) + g2_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g2_b6__2_n_0)); + LUT6 #( + .INIT(64'h056ECA721942D56C)) + g2_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g2_b7_n_0)); + LUT6 #( + .INIT(64'h831DDA46902C437D)) + g2_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g2_b7__0_n_0)); + LUT6 #( + .INIT(64'h0A9DC5B12681EA9C)) + g2_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g2_b7__1_n_0)); + LUT6 #( + .INIT(64'h0A9DC5B12681EA9C)) + g2_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g2_b7__2_n_0)); + LUT6 #( + .INIT(64'h9600AEC8DA6E25AD)) + g3_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g3_b0_n_0)); + LUT6 #( + .INIT(64'h48307D14DB652799)) + g3_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g3_b0__0_n_0)); + LUT6 #( + .INIT(64'h69005DC4E59D1A5E)) + g3_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g3_b0__1_n_0)); + LUT6 #( + .INIT(64'h69005DC4E59D1A5E)) + g3_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g3_b0__2_n_0)); + LUT6 #( + .INIT(64'h75FB8A90A6838CBC)) + g3_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g3_b1_n_0)); + LUT6 #( + .INIT(64'hA7FE5C02EC905713)) + g3_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g3_b1__0_n_0)); + LUT6 #( + .INIT(64'hBAF7456059434C7C)) + g3_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g3_b1__1_n_0)); + LUT6 #( + .INIT(64'hBAF7456059434C7C)) + g3_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g3_b1__2_n_0)); + LUT6 #( + .INIT(64'hB7FB6E3471A4C144)) + g3_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g3_b2_n_0)); + LUT6 #( + .INIT(64'hEFBE3A532669404D)) + g3_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g3_b2__0_n_0)); + LUT6 #( + .INIT(64'h7BF79D38B258C288)) + g3_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g3_b2__1_n_0)); + LUT6 #( + .INIT(64'h7BF79D38B258C288)) + g3_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g3_b2__2_n_0)); + LUT6 #( + .INIT(64'h66BA75CCC1BD861A)) + g3_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g3_b3_n_0)); + LUT6 #( + .INIT(64'hAF52257D47CBC912)) + g3_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g3_b3__0_n_0)); + LUT6 #( + .INIT(64'h9975BACCC27E4925)) + g3_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g3_b3__1_n_0)); + LUT6 #( + .INIT(64'h9975BACCC27E4925)) + g3_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g3_b3__2_n_0)); + LUT6 #( + .INIT(64'h0F487EECD299B22F)) + g3_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g3_b4_n_0)); + LUT6 #( + .INIT(64'h191C3F754DE2EBA1)) + g3_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g3_b4__0_n_0)); + LUT6 #( + .INIT(64'h0F84BDDCE166711F)) + g3_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g3_b4__1_n_0)); + LUT6 #( + .INIT(64'h0F84BDDCE166711F)) + g3_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g3_b4__2_n_0)); + LUT6 #( + .INIT(64'h48BBFB02E021D636)) + g3_b5 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g3_b5_n_0)); + LUT6 #( + .INIT(64'h97C2F86862C0CA73)) + g3_b5__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g3_b5__0_n_0)); + LUT6 #( + .INIT(64'h8477F701D012E939)) + g3_b5__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g3_b5__1_n_0)); + LUT6 #( + .INIT(64'h8477F701D012E939)) + g3_b5__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g3_b5__2_n_0)); + LUT6 #( + .INIT(64'h71FE4D794A47525E)) + g3_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g3_b6_n_0)); + LUT6 #( + .INIT(64'hA76F13DE98C58967)) + g3_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g3_b6__0_n_0)); + LUT6 #( + .INIT(64'hB2FD8EB6858BA1AD)) + g3_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g3_b6__1_n_0)); + LUT6 #( + .INIT(64'hB2FD8EB6858BA1AD)) + g3_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g3_b6__2_n_0)); + LUT6 #( + .INIT(64'h32F7F1453F71E45C)) + g3_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g3_b7_n_0)); + LUT6 #( + .INIT(64'hAEA760ED3ABE6157)) + g3_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g3_b7__0_n_0)); + LUT6 #( + .INIT(64'h31FBF28A3FB2D8AC)) + g3_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g3_b7__1_n_0)); + LUT6 #( + .INIT(64'h31FBF28A3FB2D8AC)) + g3_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g3_b7__2_n_0)); + LUT6 #( + .INIT(64'h6FC356C840E14C9A)) + g4_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g4_b0_n_0)); + LUT6 #( + .INIT(64'hBCDC0D7406C49552)) + g4_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g4_b0__0_n_0)); + LUT6 #( + .INIT(64'h9FC3A9C480D28C65)) + g4_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g4_b0__1_n_0)); + LUT6 #( + .INIT(64'h9FC3A9C480D28C65)) + g4_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g4_b0__2_n_0)); + LUT6 #( + .INIT(64'hC10C876C20C3B97C)) + g4_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g4_b1_n_0)); + LUT6 #( + .INIT(64'h41494B1DA484732F)) + g4_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g4_b1__0_n_0)); + LUT6 #( + .INIT(64'hC20C4B9C10C376BC)) + g4_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g4_b1__1_n_0)); + LUT6 #( + .INIT(64'hC20C4B9C10C376BC)) + g4_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g4_b1__2_n_0)); + LUT6 #( + .INIT(64'h9658F5D180A56FA5)) + g4_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g4_b2_n_0)); + LUT6 #( + .INIT(64'h493664FE46813ED9)) + g4_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g4_b2__0_n_0)); + LUT6 #( + .INIT(64'h69A4FAE2405A9F5A)) + g4_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g4_b2__1_n_0)); + LUT6 #( + .INIT(64'h69A4FAE2405A9F5A)) + g4_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g4_b2__2_n_0)); + LUT6 #( + .INIT(64'hD865067860E51508)) + g4_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g4_b3_n_0)); + LUT6 #( + .INIT(64'h52E50B1626C50138)) + g4_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g4_b3__0_n_0)); + LUT6 #( + .INIT(64'hE49A09B490DA2A04)) + g4_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g4_b3__1_n_0)); + LUT6 #( + .INIT(64'hE49A09B490DA2A04)) + g4_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g4_b3__2_n_0)); + LUT6 #( + .INIT(64'h64EE201C4FF709E7)) + g4_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g4_b4_n_0)); + LUT6 #( + .INIT(64'hA75521039EDF968D)) + g4_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g4_b4__0_n_0)); + LUT6 #( + .INIT(64'h98DD102C8FFB06DB)) + g4_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g4_b4__1_n_0)); + LUT6 #( + .INIT(64'h98DD102C8FFB06DB)) + g4_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g4_b4__2_n_0)); + LUT6 #( + .INIT(64'hB564856332DA69A9)) + g4_b5 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g4_b5_n_0)); + LUT6 #( + .INIT(64'h623DC29CAD2637C8)) + g4_b5__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g4_b5__0_n_0)); + LUT6 #( + .INIT(64'h7A984A9331E59656)) + g4_b5__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g4_b5__1_n_0)); + LUT6 #( + .INIT(64'h7A984A9331E59656)) + g4_b5__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g4_b5__2_n_0)); + LUT6 #( + .INIT(64'h93CF9DD320CC6EE2)) + g4_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g4_b6_n_0)); + LUT6 #( + .INIT(64'hCDADD4BE2505BE54)) + g4_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g4_b6__0_n_0)); + LUT6 #( + .INIT(64'h63CF6EE310CC9DD1)) + g4_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g4_b6__1_n_0)); + LUT6 #( + .INIT(64'h63CF6EE310CC9DD1)) + g4_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g4_b6__2_n_0)); + LUT6 #( + .INIT(64'hC3D402F46CCBEFDB)) + g4_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g4_b7_n_0)); + LUT6 #( + .INIT(64'h4C4F0E07B5D4FDDE)) + g4_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g4_b7__0_n_0)); + LUT6 #( + .INIT(64'hC3E801F89CC7DFE7)) + g4_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g4_b7__1_n_0)); + LUT6 #( + .INIT(64'hC3E801F89CC7DFE7)) + g4_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g4_b7__2_n_0)); + LUT6 #( + .INIT(64'h3644F01ED12CE302)) + g5_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g5_b0_n_0)); + LUT6 #( + .INIT(64'h2835E1634369E848)) + g5_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g5_b0__0_n_0)); + LUT6 #( + .INIT(64'h3988F02DE21CD301)) + g5_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g5_b0__1_n_0)); + LUT6 #( + .INIT(64'h3988F02DE21CD301)) + g5_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g5_b0__2_n_0)); + LUT6 #( + .INIT(64'hD832302676257E3F)) + g5_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g5_b1_n_0)); + LUT6 #( + .INIT(64'hD262A2212AF1BBF3)) + g5_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g5_b1__0_n_0)); + LUT6 #( + .INIT(64'hE4313019B91ABD3F)) + g5_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g5_b1__1_n_0)); + LUT6 #( + .INIT(64'hE4313019B91ABD3F)) + g5_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g5_b1__2_n_0)); + LUT6 #( + .INIT(64'h3B21EC4536A92507)) + g5_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g5_b2_n_0)); + LUT6 #( + .INIT(64'h3AA870D52FB0A099)) + g5_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g5_b2__0_n_0)); + LUT6 #( + .INIT(64'h3712DC8A39561A0B)) + g5_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g5_b2__1_n_0)); + LUT6 #( + .INIT(64'h3712DC8A39561A0B)) + g5_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g5_b2__2_n_0)); + LUT6 #( + .INIT(64'h480EC765729F4CEB)) + g5_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g5_b3_n_0)); + LUT6 #( + .INIT(64'h91414ADDADE397D4)) + g5_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g5_b3__0_n_0)); + LUT6 #( + .INIT(64'h840DCB9AB16F8CD7)) + g5_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g5_b3__1_n_0)); + LUT6 #( + .INIT(64'h840DCB9AB16F8CD7)) + g5_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g5_b3__2_n_0)); + LUT6 #( + .INIT(64'hC795F38EC1A1C3A7)) + g5_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g5_b4_n_0)); + LUT6 #( + .INIT(64'h4CDBED6946C8CEC9)) + g5_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g5_b4__0_n_0)); + LUT6 #( + .INIT(64'hCB6AF34DC252C35B)) + g5_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g5_b4__1_n_0)); + LUT6 #( + .INIT(64'hCB6AF34DC252C35B)) + g5_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g5_b4__2_n_0)); + LUT6 #( + .INIT(64'h6B8F7CBC0D6EA657)) + g5_b5 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g5_b5_n_0)); + LUT6 #( + .INIT(64'hBDC93773931DE897)) + g5_b5__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g5_b5__0_n_0)); + LUT6 #( + .INIT(64'h974FBC7C0E9D59AB)) + g5_b5__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g5_b5__1_n_0)); + LUT6 #( + .INIT(64'h974FBC7C0E9D59AB)) + g5_b5__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g5_b5__2_n_0)); + LUT6 #( + .INIT(64'hAD05B63AB8F68DE0)) + g5_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g5_b6_n_0)); + LUT6 #( + .INIT(64'h7099EB32F627561C)) + g5_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g5_b6__0_n_0)); + LUT6 #( + .INIT(64'h5E0A793574F94ED0)) + g5_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g5_b6__1_n_0)); + LUT6 #( + .INIT(64'h5E0A793574F94ED0)) + g5_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g5_b6__2_n_0)); + LUT6 #( + .INIT(64'hC8A712AED7DA1CE8)) + g5_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g5_b7_n_0)); + LUT6 #( + .INIT(64'hD6C18F21CD7E1734)) + g5_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g5_b7__0_n_0)); + LUT6 #( + .INIT(64'hC45B215DEBE52CD4)) + g5_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g5_b7__1_n_0)); + LUT6 #( + .INIT(64'hC45B215DEBE52CD4)) + g5_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g5_b7__2_n_0)); + LUT6 #( + .INIT(64'hEB5CF99684AAF470)) + g6_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g6_b0_n_0)); + LUT6 #( + .INIT(64'h794FF46BC7106276)) + g6_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g6_b0__0_n_0)); + LUT6 #( + .INIT(64'hD7ACF6694855F8B0)) + g6_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g6_b0__1_n_0)); + LUT6 #( + .INIT(64'hD7ACF6694855F8B0)) + g6_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g6_b0__2_n_0)); + LUT6 #( + .INIT(64'h9FB21157825091B4)) + g6_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g6_b1_n_0)); + LUT6 #( + .INIT(64'hDE3A80AF4806462B)) + g6_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g6_b1__0_n_0)); + LUT6 #( + .INIT(64'h6F7122AB41A06278)) + g6_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g6_b1__1_n_0)); + LUT6 #( + .INIT(64'h6F7122AB41A06278)) + g6_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g6_b1__2_n_0)); + LUT6 #( + .INIT(64'hBA15D401E5AD3D43)) + g6_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g6_b2_n_0)); + LUT6 #( + .INIT(64'h78A340F067D9B0BC)) + g6_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g6_b2__0_n_0)); + LUT6 #( + .INIT(64'h752AE802DA5E3E83)) + g6_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g6_b2__1_n_0)); + LUT6 #( + .INIT(64'h752AE802DA5E3E83)) + g6_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g6_b2__2_n_0)); + LUT6 #( + .INIT(64'hF4B82FB49F20D093)) + g6_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g6_b3_n_0)); + LUT6 #( + .INIT(64'h67723E1B5A38C4E2)) + g6_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g6_b3__0_n_0)); + LUT6 #( + .INIT(64'hF8741F786F10E063)) + g6_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g6_b3__1_n_0)); + LUT6 #( + .INIT(64'hF8741F786F10E063)) + g6_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g6_b3__2_n_0)); + LUT6 #( + .INIT(64'hDB0AC8C367D1FB32)) + g6_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g6_b4_n_0)); + LUT6 #( + .INIT(64'hD968D4C42CDEFA6A)) + g6_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g6_b4__0_n_0)); + LUT6 #( + .INIT(64'hE705C4C39BE2F731)) + g6_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g6_b4__1_n_0)); + LUT6 #( + .INIT(64'hE705C4C39BE2F731)) + g6_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g6_b4__2_n_0)); + LUT6 #( + .INIT(64'h183AC302E031D1A2)) + g6_b5 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g6_b5_n_0)); + LUT6 #( + .INIT(64'h9322C84862C2C668)) + g6_b5__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g6_b5__0_n_0)); + LUT6 #( + .INIT(64'h2435C301D032E251)) + g6_b5__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g6_b5__1_n_0)); + LUT6 #( + .INIT(64'h2435C301D032E251)) + g6_b5__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g6_b5__2_n_0)); + LUT6 #( + .INIT(64'h642A202C1F12011F)) + g6_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g6_b6_n_0)); + LUT6 #( + .INIT(64'hA3502301983A818B)) + g6_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g6_b6__0_n_0)); + LUT6 #( + .INIT(64'h9815101C2F21022F)) + g6_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g6_b6__1_n_0)); + LUT6 #( + .INIT(64'h9815101C2F21022F)) + g6_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g6_b6__2_n_0)); + LUT6 #( + .INIT(64'hFABB358DE6AD2B91)) + g6_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g6_b7_n_0)); + LUT6 #( + .INIT(64'hFFE225B96FD13C8A)) + g6_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g6_b7__0_n_0)); + LUT6 #( + .INIT(64'hF5773A4ED95E1762)) + g6_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g6_b7__1_n_0)); + LUT6 #( + .INIT(64'hF5773A4ED95E1762)) + g6_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g6_b7__2_n_0)); + LUT6 #( + .INIT(64'h4C93CB456252E87E)) + g7_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g7_b0_n_0)); + LUT6 #( + .INIT(64'h94D258CDA846F347)) + g7_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g7_b0__0_n_0)); + LUT6 #( + .INIT(64'h8C63C78A91A1D4BD)) + g7_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g7_b0__1_n_0)); + LUT6 #( + .INIT(64'h8C63C78A91A1D4BD)) + g7_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g7_b0__2_n_0)); + LUT6 #( + .INIT(64'h02411B37BC076BF9)) + g7_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g7_b1_n_0)); + LUT6 #( + .INIT(64'h08849AABF0B13FCE)) + g7_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g7_b1__0_n_0)); + LUT6 #( + .INIT(64'h0182273B7C0B97F6)) + g7_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g7_b1__1_n_0)); + LUT6 #( + .INIT(64'h0182273B7C0B97F6)) + g7_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g7_b1__2_n_0)); + LUT6 #( + .INIT(64'hB2D3FA35FF37D702)) + g7_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g7_b2_n_0)); + LUT6 #( + .INIT(64'hECA67AE3FAFBC878)) + g7_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g7_b2__0_n_0)); + LUT6 #( + .INIT(64'h71E3F53AFF3BEB01)) + g7_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g7_b2__1_n_0)); + LUT6 #( + .INIT(64'h71E3F53AFF3BEB01)) + g7_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g7_b2__2_n_0)); + LUT6 #( + .INIT(64'h6CF4E517BF85CDC1)) + g7_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g7_b3_n_0)); + LUT6 #( + .INIT(64'h3657E0DB7CB954DC)) + g7_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g7_b3__0_n_0)); + LUT6 #( + .INIT(64'h9CF8DA2B7F4ACEC2)) + g7_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g7_b3__1_n_0)); + LUT6 #( + .INIT(64'h9CF8DA2B7F4ACEC2)) + g7_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g7_b3__2_n_0)); + LUT6 #( + .INIT(64'h1FE9C82F6B6B2029)) + g7_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g7_b4_n_0)); + LUT6 #( + .INIT(64'h1FBCD3C1BBCC2380)) + g7_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g7_b4__0_n_0)); + LUT6 #( + .INIT(64'h2FD6C41F97971016)) + g7_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g7_b4__1_n_0)); + LUT6 #( + .INIT(64'h2FD6C41F97971016)) + g7_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g7_b4__2_n_0)); + LUT6 #( + .INIT(64'hB74404FD1FDE29C9)) + g7_b5 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g7_b5_n_0)); + LUT6 #( + .INIT(64'h683D07979D3F358C)) + g7_b5__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g7_b5__0_n_0)); + LUT6 #( + .INIT(64'h7B8808FE2FED16C6)) + g7_b5__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g7_b5__1_n_0)); + LUT6 #( + .INIT(64'h7B8808FE2FED16C6)) + g7_b5__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g7_b5__2_n_0)); + LUT6 #( + .INIT(64'hC6BA498455997B97)) + g7_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g7_b6_n_0)); + LUT6 #( + .INIT(64'hCF52144905FABCEB)) + g7_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g7_b6__0_n_0)); + LUT6 #( + .INIT(64'hC9758648AA66B76B)) + g7_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g7_b6__1_n_0)); + LUT6 #( + .INIT(64'hC9758648AA66B76B)) + g7_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g7_b6__2_n_0)); + LUT6 #( + .INIT(64'h4B080E3ED5163222)) + g7_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g7_b7_n_0)); + LUT6 #( + .INIT(64'h19489B13C07BAA20)) + g7_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g7_b7__0_n_0)); + LUT6 #( + .INIT(64'h87040D3DEA293111)) + g7_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g7_b7__1_n_0)); + LUT6 #( + .INIT(64'h87040D3DEA293111)) + g7_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g7_b7__2_n_0)); + LUT6 #( + .INIT(64'h24A6969AA4FE19D0)) + g8_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g8_b0_n_0)); + LUT6 #( + .INIT(64'hA611CD32E717142E)) + g8_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g8_b0__0_n_0)); + LUT6 #( + .INIT(64'h1859696558FD26E0)) + g8_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g8_b0__1_n_0)); + LUT6 #( + .INIT(64'h1859696558FD26E0)) + g8_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g8_b0__2_n_0)); + LUT6 #( + .INIT(64'h654043D81A8450DB)) + g8_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g8_b1_n_0)); + LUT6 #( + .INIT(64'h205C0D4E1C2185E6)) + g8_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g8_b1__0_n_0)); + LUT6 #( + .INIT(64'h9A8083E42548A0E7)) + g8_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g8_b1__1_n_0)); + LUT6 #( + .INIT(64'h9A8083E42548A0E7)) + g8_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g8_b1__2_n_0)); + LUT6 #( + .INIT(64'h0F1AFB1F907A7CB5)) + g8_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g8_b2_n_0)); + LUT6 #( + .INIT(64'h991AF9EBC32636F3)) + g8_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g8_b2__0_n_0)); + LUT6 #( + .INIT(64'h0F25F72F60B5BC7A)) + g8_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g8_b2__1_n_0)); + LUT6 #( + .INIT(64'h0F25F72F60B5BC7A)) + g8_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g8_b2__2_n_0)); + LUT6 #( + .INIT(64'h4AC706708861C57C)) + g8_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g8_b3_n_0)); + LUT6 #( + .INIT(64'h9CC50A165284435F)) + g8_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g8_b3__0_n_0)); + LUT6 #( + .INIT(64'h85CB09B04492CABC)) + g8_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g8_b3__1_n_0)); + LUT6 #( + .INIT(64'h85CB09B04492CABC)) + g8_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g8_b3__2_n_0)); + LUT6 #( + .INIT(64'hD74A1E50ECFD94C6)) + g8_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g8_b4_n_0)); + LUT6 #( + .INIT(64'hC97C183677D7C435)) + g8_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g8_b4__0_n_0)); + LUT6 #( + .INIT(64'hEB852DA0DCFE68C9)) + g8_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g8_b4__1_n_0)); + LUT6 #( + .INIT(64'hEB852DA0DCFE68C9)) + g8_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g8_b4__2_n_0)); + LUT6 #( + .INIT(64'hD954E74FEDE9F8B4)) + g8_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g8_b6_n_0)); + LUT6 #( + .INIT(64'h506FE9DD77DC7663)) + g8_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g8_b6__0_n_0)); + LUT6 #( + .INIT(64'hE6A8DB8FDED6F478)) + g8_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g8_b6__1_n_0)); + LUT6 #( + .INIT(64'hE6A8DB8FDED6F478)) + g8_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g8_b6__2_n_0)); + LUT6 #( + .INIT(64'h743B9F075E158030)) + g8_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g8_b7_n_0)); + LUT6 #( + .INIT(64'hA3F2D8B918F34202)) + g8_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g8_b7__0_n_0)); + LUT6 #( + .INIT(64'hB8376F0BAD2A4030)) + g8_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g8_b7__1_n_0)); + LUT6 #( + .INIT(64'hB8376F0BAD2A4030)) + g8_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g8_b7__2_n_0)); + LUT6 #( + .INIT(64'h7AA6F9214334D059)) + g9_b0 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g9_b0_n_0)); + LUT6 #( + .INIT(64'hBE6172E80A4B41E6)) + g9_b0__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g9_b0__0_n_0)); + LUT6 #( + .INIT(64'hB559F6128338E0A6)) + g9_b0__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g9_b0__1_n_0)); + LUT6 #( + .INIT(64'hB559F6128338E0A6)) + g9_b0__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g9_b0__2_n_0)); + LUT6 #( + .INIT(64'hA990ABE4F9BE1939)) + g9_b1 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g9_b1_n_0)); + LUT6 #( + .INIT(64'h740A7E0DF76B13AA)) + g9_b1__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g9_b1__0_n_0)); + LUT6 #( + .INIT(64'h566057D8F67D2636)) + g9_b1__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g9_b1__1_n_0)); + LUT6 #( + .INIT(64'h566057D8F67D2636)) + g9_b1__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g9_b1__2_n_0)); + LUT6 #( + .INIT(64'h7E5B097A32926544)) + g9_b2 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g9_b2_n_0)); + LUT6 #( + .INIT(64'hB9F6930EAC22205D)) + g9_b2__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g9_b2__0_n_0)); + LUT6 #( + .INIT(64'hBDA706B531619A88)) + g9_b2__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g9_b2__1_n_0)); + LUT6 #( + .INIT(64'hBDA706B531619A88)) + g9_b2__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g9_b2__2_n_0)); + LUT6 #( + .INIT(64'h44A8966AA06CBE0D)) + g9_b3 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g9_b3_n_0)); + LUT6 #( + .INIT(64'h0750CB34630579B1)) + g9_b3__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g9_b3__0_n_0)); + LUT6 #( + .INIT(64'h88546995509C7D0E)) + g9_b3__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g9_b3__1_n_0)); + LUT6 #( + .INIT(64'h88546995509C7D0E)) + g9_b3__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g9_b3__2_n_0)); + LUT6 #( + .INIT(64'hF767B6505BFC19F4)) + g9_b4 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g9_b4_n_0)); + LUT6 #( + .INIT(64'hEAFD68361F6F162F)) + g9_b4__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g9_b4__0_n_0)); + LUT6 #( + .INIT(64'hFB9B79A0A7FC26F8)) + g9_b4__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g9_b4__1_n_0)); + LUT6 #( + .INIT(64'hFB9B79A0A7FC26F8)) + g9_b4__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g9_b4__2_n_0)); + LUT6 #( + .INIT(64'h397535794A67D448)) + g9_b6 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g9_b6_n_0)); + LUT6 #( + .INIT(64'h32AF23BE9AC54174)) + g9_b6__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g9_b6__0_n_0)); + LUT6 #( + .INIT(64'h36BA3AB6859BE884)) + g9_b6__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g9_b6__1_n_0)); + LUT6 #( + .INIT(64'h36BA3AB6859BE884)) + g9_b6__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g9_b6__2_n_0)); + LUT6 #( + .INIT(64'h2728EC106A24B31F)) + g9_b7 + (.I0(A_IBUF[0]), + .I1(A_IBUF[1]), + .I2(A_IBUF[2]), + .I3(A_IBUF[3]), + .I4(A_IBUF[4]), + .I5(A_IBUF[5]), + .O(g9_b7_n_0)); + LUT6 #( + .INIT(64'h2B1870523A41E9AB)) + g9_b7__0 + (.I0(A_IBUF[1]), + .I1(A_IBUF[2]), + .I2(A_IBUF[3]), + .I3(A_IBUF[0]), + .I4(g15_b7_i_1__1_n_0), + .I5(g15_b7_i_2__0_n_0), + .O(g9_b7__0_n_0)); + LUT6 #( + .INIT(64'h1B14DC209518732F)) + g9_b7__1 + (.I0(A_IBUF[0]), + .I1(sel[1]), + .I2(sel[2]), + .I3(sel[3]), + .I4(sel[4]), + .I5(sel[5]), + .O(g9_b7__1_n_0)); + LUT6 #( + .INIT(64'h1B14DC209518732F)) + g9_b7__2 + (.I0(A_IBUF[0]), + .I1(g15_b7_i_1__0_n_0), + .I2(g15_b7_i_2_n_0), + .I3(g15_b7_i_3_n_0), + .I4(g15_b7_i_4_n_0), + .I5(g15_b7_i_5_n_0), + .O(g9_b7__2_n_0)); +endmodule + diff --git a/Labs/03. Register file and memory/tb_rf_riscv.sv b/Labs/03. Register file and memory/tb_rf_riscv.sv new file mode 100644 index 0000000..a2940b0 --- /dev/null +++ b/Labs/03. Register file and memory/tb_rf_riscv.sv @@ -0,0 +1,1212 @@ +`timescale 1ns/1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_rf_riscv +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for RISC-V register file +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_rf_riscv(); + + logic CLK; + logic [ 4:0] RA1; + logic [ 4:0] RA2; + logic [ 4:0] WA; + logic [31:0] WD; + logic WE; + + logic [31:0] RD1; + logic [31:0] RD2; + logic [31:0] RD1ref; + logic [31:0] RD2ref; + + rf_riscv DUT( + .clk_i (CLK), + .read_addr1_i (RA1), + .read_addr2_i (RA2), + .write_addr_i (WA ), + .write_data_i (WD ), + .write_enable_i(WE ), + .read_data1_o (RD1), + .read_data2_o (RD2) + ); + + rf_riscv_ref DUTref( + .clk(CLK ), + .A1 (RA1 ), + .A2 (RA2 ), + .A3 (WA ), + .WD3(WD ), + .WE (WE ), + .RD1(RD1ref), + .RD2(RD2ref) + ); + + integer i, err_count = 0; + + parameter CLK_FREQ_MHz = 100; + parameter CLK_SEMI_PERIOD= 1e3/CLK_FREQ_MHz/2; + + parameter address_length = 32; + + initial CLK <= 0; + always begin + #CLK_SEMI_PERIOD CLK = ~CLK; + if (err_count >= 10) begin + $display("\n\nThe test was stopped due to errors"); $stop(); + end + end + + initial begin + $timeformat (-9, 2, "ns"); + $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); + RA1 = 'b1; + @(posedge CLK); + if (32'hx !== RD1) begin + $display("The register file should not be initialized by the $readmemh function"); + err_count = err_count + 1; + end + @(posedge CLK); + DUT.rf_mem[32] = 32'd1; + if(DUT.rf_mem[32]=== 32'd1) begin + $display("invalid memory size"); + err_count = err_count + 1; + end + @(posedge CLK); + DUT.rf_mem[0] = 32'd1; + @(posedge CLK); + WE <= 'b0; + RA1 <= 'b0; + @(posedge CLK); + if( RD1 !== 'b0 ) begin + $display("time = %0t. invalid data when reading at address 0: RD1 = %h", $time, RD1); + err_count = err_count + 1; + end + @(posedge CLK); + //------initial + CLK <= 'b0; + RA1 <= 'b0; + RA2 <= 'b0; + WA <= 'b0; + WD <= 'b0; + WE <= 'b0; + @(posedge CLK); + //----- reset + for( i = 1; i < address_length; i = i + 1) begin + @(posedge CLK); + WA <= i; + WD <= 'b0; + WE <= 'b1; + end + @(posedge CLK); + WA <= 'b0; + WD <= 'b1; + WE <= 'b1; + @(posedge CLK); + WE <= 'b0; + RA2 <= 'b0; + @(posedge CLK); + if( RD2 !== 'b0 )begin + $display("time = %0t. invalid data when reading at address 0: RD1 = %h", $time, RD2); + err_count = err_count + 1; + end + @(posedge CLK); + for( i = 1; i < address_length; i = i + 1) begin + @(posedge CLK); + WA <= i; + WD <= $urandom; + WE <= $urandom % 2; + end + @(posedge CLK); + WE <= 'b0; + for( i = 0; i < address_length; i = i + 1) begin + @(posedge CLK); + RA1 <= i; + RA2 <= address_length - (i + 1); + @(posedge CLK); + if(RD1ref !== RD1) begin + $display("time = %0t, address %h, RD1. Invalid data %h, correct data %h", $time, RA1, RD1, RD1ref); + err_count = err_count + 1; + end + if(RD2ref !== RD2) begin + $display("time = %0t, address %h, RD2. Invalid data %h, correct data %h", $time, RA2, RD2, RD2ref); + err_count = err_count + 1; + end + end + if( !err_count ) $display("\nregister file SUCCESS!!!\n"); + $finish(); + end +endmodule + + +(* STRUCTURAL_NETLIST = "yes" *) +module rf_riscv_ref + (clk, + A1, + A2, + A3, + WD3, + WE, + RD1, + RD2); + input clk; + input [4:0]A1; + input [4:0]A2; + input [4:0]A3; + input [31:0]WD3; + input WE; + output [31:0]RD1; + output [31:0]RD2; + + wire \ ; + wire [4:0]A1; + wire [4:0]A2; + wire [4:0]A3; + wire [31:0]RD1; + wire [31:0]RD11; + wire [31:0]RD2; + wire [31:0]RD21; + wire [31:0]WD3; + wire WE; + wire clk; + + GND GND + (.G(\ )); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "0" *) + (* ram_slice_end = "5" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r1_0_31_0_5 + (.ADDRA(A1), + .ADDRB(A1), + .ADDRC(A1), + .ADDRD(A3), + .DIA(WD3[1:0]), + .DIB(WD3[3:2]), + .DIC(WD3[5:4]), + .DID({\ ,\ }), + .DOA(RD11[1:0]), + .DOB(RD11[3:2]), + .DOC(RD11[5:4]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "12" *) + (* ram_slice_end = "17" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r1_0_31_12_17 + (.ADDRA(A1), + .ADDRB(A1), + .ADDRC(A1), + .ADDRD(A3), + .DIA(WD3[13:12]), + .DIB(WD3[15:14]), + .DIC(WD3[17:16]), + .DID({\ ,\ }), + .DOA(RD11[13:12]), + .DOB(RD11[15:14]), + .DOC(RD11[17:16]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "18" *) + (* ram_slice_end = "23" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r1_0_31_18_23 + (.ADDRA(A1), + .ADDRB(A1), + .ADDRC(A1), + .ADDRD(A3), + .DIA(WD3[19:18]), + .DIB(WD3[21:20]), + .DIC(WD3[23:22]), + .DID({\ ,\ }), + .DOA(RD11[19:18]), + .DOB(RD11[21:20]), + .DOC(RD11[23:22]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "24" *) + (* ram_slice_end = "29" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r1_0_31_24_29 + (.ADDRA(A1), + .ADDRB(A1), + .ADDRC(A1), + .ADDRD(A3), + .DIA(WD3[25:24]), + .DIB(WD3[27:26]), + .DIC(WD3[29:28]), + .DID({\ ,\ }), + .DOA(RD11[25:24]), + .DOB(RD11[27:26]), + .DOC(RD11[29:28]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "30" *) + (* ram_slice_end = "31" *) + RAM32X1D #( + .INIT(32'h00000000)) + RAM_reg_r1_0_31_30_31 + (.A0(A3[0]), + .A1(A3[1]), + .A2(A3[2]), + .A3(A3[3]), + .A4(A3[4]), + .D(WD3[30]), + .DPO(RD11[30]), + .DPRA0(A1[0]), + .DPRA1(A1[1]), + .DPRA2(A1[2]), + .DPRA3(A1[3]), + .DPRA4(A1[4]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "30" *) + (* ram_slice_end = "31" *) + RAM32X1D #( + .INIT(32'h00000000)) + RAM_reg_r1_0_31_30_31__0 + (.A0(A3[0]), + .A1(A3[1]), + .A2(A3[2]), + .A3(A3[3]), + .A4(A3[4]), + .D(WD3[31]), + .DPO(RD11[31]), + .DPRA0(A1[0]), + .DPRA1(A1[1]), + .DPRA2(A1[2]), + .DPRA3(A1[3]), + .DPRA4(A1[4]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "6" *) + (* ram_slice_end = "11" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r1_0_31_6_11 + (.ADDRA(A1), + .ADDRB(A1), + .ADDRC(A1), + .ADDRD(A3), + .DIA(WD3[7:6]), + .DIB(WD3[9:8]), + .DIC(WD3[11:10]), + .DID({\ ,\ }), + .DOA(RD11[7:6]), + .DOB(RD11[9:8]), + .DOC(RD11[11:10]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "0" *) + (* ram_slice_end = "5" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r2_0_31_0_5 + (.ADDRA(A2), + .ADDRB(A2), + .ADDRC(A2), + .ADDRD(A3), + .DIA(WD3[1:0]), + .DIB(WD3[3:2]), + .DIC(WD3[5:4]), + .DID({\ ,\ }), + .DOA(RD21[1:0]), + .DOB(RD21[3:2]), + .DOC(RD21[5:4]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "12" *) + (* ram_slice_end = "17" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r2_0_31_12_17 + (.ADDRA(A2), + .ADDRB(A2), + .ADDRC(A2), + .ADDRD(A3), + .DIA(WD3[13:12]), + .DIB(WD3[15:14]), + .DIC(WD3[17:16]), + .DID({\ ,\ }), + .DOA(RD21[13:12]), + .DOB(RD21[15:14]), + .DOC(RD21[17:16]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "18" *) + (* ram_slice_end = "23" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r2_0_31_18_23 + (.ADDRA(A2), + .ADDRB(A2), + .ADDRC(A2), + .ADDRD(A3), + .DIA(WD3[19:18]), + .DIB(WD3[21:20]), + .DIC(WD3[23:22]), + .DID({\ ,\ }), + .DOA(RD21[19:18]), + .DOB(RD21[21:20]), + .DOC(RD21[23:22]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "24" *) + (* ram_slice_end = "29" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r2_0_31_24_29 + (.ADDRA(A2), + .ADDRB(A2), + .ADDRC(A2), + .ADDRD(A3), + .DIA(WD3[25:24]), + .DIB(WD3[27:26]), + .DIC(WD3[29:28]), + .DID({\ ,\ }), + .DOA(RD21[25:24]), + .DOB(RD21[27:26]), + .DOC(RD21[29:28]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "30" *) + (* ram_slice_end = "31" *) + RAM32X1D #( + .INIT(32'h00000000)) + RAM_reg_r2_0_31_30_31 + (.A0(A3[0]), + .A1(A3[1]), + .A2(A3[2]), + .A3(A3[3]), + .A4(A3[4]), + .D(WD3[30]), + .DPO(RD21[30]), + .DPRA0(A2[0]), + .DPRA1(A2[1]), + .DPRA2(A2[2]), + .DPRA3(A2[3]), + .DPRA4(A2[4]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "30" *) + (* ram_slice_end = "31" *) + RAM32X1D #( + .INIT(32'h00000000)) + RAM_reg_r2_0_31_30_31__0 + (.A0(A3[0]), + .A1(A3[1]), + .A2(A3[2]), + .A3(A3[3]), + .A4(A3[4]), + .D(WD3[31]), + .DPO(RD21[31]), + .DPRA0(A2[0]), + .DPRA1(A2[1]), + .DPRA2(A2[2]), + .DPRA3(A2[3]), + .DPRA4(A2[4]), + .WCLK(clk), + .WE(WE)); + (* METHODOLOGY_DRC_VIOS = "" *) + (* RTL_RAM_BITS = "1024" *) + (* RTL_RAM_NAME = "RAM" *) + (* RTL_RAM_TYPE = "RAM_SDP" *) + (* ram_addr_begin = "0" *) + (* ram_addr_end = "31" *) + (* ram_offset = "0" *) + (* ram_slice_begin = "6" *) + (* ram_slice_end = "11" *) + RAM32M #( + .INIT_A(64'h0000000000000000), + .INIT_B(64'h0000000000000000), + .INIT_C(64'h0000000000000000), + .INIT_D(64'h0000000000000000)) + RAM_reg_r2_0_31_6_11 + (.ADDRA(A2), + .ADDRB(A2), + .ADDRC(A2), + .ADDRD(A3), + .DIA(WD3[7:6]), + .DIB(WD3[9:8]), + .DIC(WD3[11:10]), + .DID({\ ,\ }), + .DOA(RD21[7:6]), + .DOB(RD21[9:8]), + .DOC(RD21[11:10]), + .WCLK(clk), + .WE(WE)); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[0]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[0]), + .O(RD1[0])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[10]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[10]), + .O(RD1[10])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[11]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[11]), + .O(RD1[11])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[12]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[12]), + .O(RD1[12])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[13]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[13]), + .O(RD1[13])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[14]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[14]), + .O(RD1[14])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[15]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[15]), + .O(RD1[15])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[16]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[16]), + .O(RD1[16])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[17]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[17]), + .O(RD1[17])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[18]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[18]), + .O(RD1[18])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[19]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[19]), + .O(RD1[19])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[1]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[1]), + .O(RD1[1])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[20]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[20]), + .O(RD1[20])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[21]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[21]), + .O(RD1[21])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[22]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[22]), + .O(RD1[22])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[23]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[23]), + .O(RD1[23])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[24]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[24]), + .O(RD1[24])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[25]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[25]), + .O(RD1[25])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[26]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[26]), + .O(RD1[26])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[27]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[27]), + .O(RD1[27])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[28]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[28]), + .O(RD1[28])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[29]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[29]), + .O(RD1[29])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[2]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[2]), + .O(RD1[2])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[30]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[30]), + .O(RD1[30])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[31]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[31]), + .O(RD1[31])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[3]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[3]), + .O(RD1[3])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[4]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[4]), + .O(RD1[4])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[5]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[5]), + .O(RD1[5])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[6]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[6]), + .O(RD1[6])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[7]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[7]), + .O(RD1[7])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[8]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[8]), + .O(RD1[8])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD1[9]_INST_0 + (.I0(A1[2]), + .I1(A1[1]), + .I2(A1[4]), + .I3(A1[3]), + .I4(A1[0]), + .I5(RD11[9]), + .O(RD1[9])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[0]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[0]), + .O(RD2[0])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[10]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[10]), + .O(RD2[10])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[11]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[11]), + .O(RD2[11])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[12]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[12]), + .O(RD2[12])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[13]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[13]), + .O(RD2[13])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[14]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[14]), + .O(RD2[14])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[15]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[15]), + .O(RD2[15])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[16]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[16]), + .O(RD2[16])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[17]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[17]), + .O(RD2[17])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[18]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[18]), + .O(RD2[18])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[19]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[19]), + .O(RD2[19])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[1]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[1]), + .O(RD2[1])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[20]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[20]), + .O(RD2[20])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[21]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[21]), + .O(RD2[21])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[22]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[22]), + .O(RD2[22])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[23]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[23]), + .O(RD2[23])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[24]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[24]), + .O(RD2[24])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[25]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[25]), + .O(RD2[25])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[26]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[26]), + .O(RD2[26])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[27]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[27]), + .O(RD2[27])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[28]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[28]), + .O(RD2[28])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[29]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[29]), + .O(RD2[29])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[2]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[2]), + .O(RD2[2])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[30]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[30]), + .O(RD2[30])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[31]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[31]), + .O(RD2[31])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[3]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[3]), + .O(RD2[3])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[4]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[4]), + .O(RD2[4])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[5]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[5]), + .O(RD2[5])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[6]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[6]), + .O(RD2[6])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[7]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[7]), + .O(RD2[7])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[8]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[8]), + .O(RD2[8])); + LUT6 #( + .INIT(64'hFFFFFFFE00000000)) + \RD2[9]_INST_0 + (.I0(A2[2]), + .I1(A2[1]), + .I2(A2[4]), + .I3(A2[3]), + .I4(A2[0]), + .I5(RD21[9]), + .O(RD2[9])); +endmodule diff --git a/Labs/04. Primitive programmable device/README.md b/Labs/04. Primitive programmable device/README.md new file mode 100644 index 0000000..e1054c7 --- /dev/null +++ b/Labs/04. Primitive programmable device/README.md @@ -0,0 +1,351 @@ +# Лабораторная работа 4 "Примитивное программируемое устройство" + +В этой лабораторной работе на основе ранее разработанных блоков памяти и АЛУ ты соберешь простой учебный процессор с архитектурой `CYBERcobra 3000 Pro 2.1`. Это нужно для более глубокого понимания принципов работы программируемых устройств, чтобы проще было понять архитектуру RISC-V в будущем. + +## Допуск к лабораторной работе + +Для выполнения этой лабораторной работы, необходимо в полной мере освоить следующие элементы синтаксиса языка verilog: + +1. Описание модулей, их создание внутри других модулей и оператор непрерывного присваивания `assign` ([Modules.md](../../Basic%20Verilog%20structures/Modules.md)). +2. Описание мультиплексоров: с помощью `тернарного оператора`, блоков `case` и `if/else`. Знать особенности использования этих блоков и особенности синтеза комбинационной логики внутри блока `always` ([Multiplexors.md](../../Basic%20Verilog%20structures/Multiplexors.md)). +3. Описание регистров ([Registers.md](../../Basic%20Verilog%20structures/Registers.md)). +4. Оператор конкатенации ([Concatenation.md](../../Basic%20Verilog%20structures/Concatenation.md)). +5. Отладку проекта по временной диаграмме ([Debug manual.md](../../Vivado%20Basics/Debug%20manual.md)). + +## Цель + +Реализовать простейшее программируемое устройство с архитектурой `CYBERcobra 3000 Pro 2.1` + +## Ход работы + +1. Изучить принцип работы процессоров (соответствующий раздел [#теории](#теория-про-программируемое-устройство)) +2. Познакомиться с архитектурой и микроархитектурой `CYBERcobra 3000 Pro 2.1` (раздел про эту [#архитектуру](#архитектура-cybercobra-3000-pro-21-и-ее-микроархитектура)) +3. Изучить необходимые для описания процессора конструкции verilog (раздел [#инструменты](#инструменты-для-реализации-процессора)) +4. Реализовать процессор с архитектурой `CYBERcobra 3000 Pro 2.1` ([#задание по разработке аппаратуры](#задание-по-реализации-процессора)) +5. Проверить работу процессора в ПЛИС. + +Доп. задание, выполняемое дома: + +6. Написать программу для процессора и на модели убедиться в корректности ее выполнения ([#задание по разработке программы](#задание-по-проверке-процессора)) + +## Теория про программируемое устройство + +В обобщенном виде, процессор включает в себя память, АЛУ, устройство управления и интерфейсную логику для организации ввода/вывода. Также, в процессоре есть специальный регистр `PC` (**Program Counter** – счетчик команд), который хранит в себе число – адрес ячейки памяти, в которой лежит инструкция, которую нужно выполнить. Инструкция тоже представляет собой число, в котором закодировано `что нужно сделать` и `с чем это нужно сделать`. + +Алгоритм работы процессора следующий: + +1. Из памяти считывается инструкция по адресу `PC` +2. Устройство управления дешифрует полученную инструкцию (то есть определяет какую операцию нужно сделать, где взять операнды и куда разместить результат) +3. Декодировав инструкцию, устройство управления выдает всем блокам процессора (АЛУ, регистровый файл, мультиплексоры) соответствующие управляющие сигналы, тем самым выполняя эту инструкцию. +4. Изменяется значение `PC`. +5. Цикл повторяется с `п.1`. + +Любая инструкция приводит к изменению состояния памяти. В случае процессора с архитектурой `CYBERcobra 3000 Pro 2.1` есть два класса инструкций: одни изменяют содержимое регистрового файла — это инструкции записи. Другие изменяют значение `PC` — это инструкции перехода. В первом случае используются вычислительные инструкции и инструкции загрузки данных из других источников. Во-втором случае используются инструкции перехода. + +Если процессор обрабатывает вычислительную инструкцию, то `PC` перейдет к следующей по порядку инструкции. На лабораторной работе, посвященной памяти, мы сделали память инструкций с [побайтовой адресацией](../03.%20Register%20file%20and%20memory/README.md#1-память-инструкций). Это означает, что каждый байт памяти имеет свой собственный адрес. Поскольку длина инструкции составляет `4 байта`, для перехода к следующей инструкции `PC` должен быть увеличен на `4` (`PC = PC + 4`). При этом, регистровый файл сохранит результат некоторой операции на АЛУ или данные со входного порта. + +Если же обрабатывается инструкция перехода, то возможно два варианта. В случае безусловного или успешного условного перехода, значение `PC` увеличится на значение константы закодированной внутри инструкции `PC = PC + const*4` (иными словами, `const` говорит о том, через сколько инструкций перепрыгнет `PC`, `const` может быть и отрицательной). В случае же неуспешного условного перехода `PC`, как и после вычислительных команд, просто перейдет к следующей инструкции, то есть `PC = PC + 4`. + +> Строго говоря `PC` меняется при выполнении любой инструкции (кроме случая `const = 0`, то есть перехода инструкции на саму себя `PC = PC + 0*4`). Разница в том, на какое значение `PC` изменится. В вычислительных инструкциях это всегда адрес следующей инструкции, программа не управляет `PC`, он "сам знает", что ему делать. В инструкциях перехода программа и контекст определяют, что произойдет с `PC`. + +## Архитектура CYBERcobra 3000 Pro 2.1 и ее микроархитектура + +В качестве первого разрабатываемого программируемого устройства предлагается использовать архитектуру специального назначения `CYBERcobra 3000 Pro 2.1`, которая была разработана в **МИЭТ**. Главным достоинством данной архитектуры является простота ее понимания и реализации. Главным ее минусом является неоптимальность ввиду неэффективной реализации кодирования инструкций, что приводит к наличию неиспользуемых битов в программах. Но это неважно, так как основная цель разработки процессора с архитектурой `CYBERcobra 3000 Pro 2.1` — это более глубокое понимание принципов работы программируемых устройства, которое поможет при разработке более сложного процессора с архитектурой **RISC-V**. + +![../../.pic/Labs/lab_04_cybercobra/logoCC3000.svg](../../.pic/Labs/lab_04_cybercobra/logoCC3000.svg) + +Простота архитектуры `CYBERcobra 3000 Pro 2.1` проявляется, в том числе, за счет отсутствия памяти данных. Это значит, что данные c которыми работает программа могут храниться только в регистровом файле. Также в таком процессоре почти полностью отсутствует устройство управления (формально оно существует, но состоит только из проводов и пары логических вентилей). + +Архитектурой предусмотрена поддержка 19 инструкций (5 типов команд): + +Первые два типа содержат 16 инструкций, которые выполняются на АЛУ: + +- 10 вычислительных +- 6 операций сравнения для условного перехода + +Кроме того, есть инструкции: + +- безусловного перехода +- загрузки константы +- загрузки данных с внешнего устройства. + +К классу инструкций записи, то есть тех, которые меняют значение регистрового файла, можно отнести: 10 вычислительных, загрузки константы и загрузки данных с внешнего устройства. К классу инструкций перехода: 6 операций сравнения для условного перехода и безусловный переход. + +### Последовательное считывание инструкций + +Будем рассматривать архитектуру (функции процессора) и микроархитектуру (реализация процессора) одновременно, прослеживая рассуждения их разработчика. + +Для начала реализуем базовый функционал, подключив счетчик команд `PC` к памяти инструкций `instr_mem` и сумматору, прибавляющему 4 к `PC`. Выход сумматора подключим ко входу `PC`. + +Каждый раз, когда будет происходить тактовый импульс (переключение `clk_i` из 0 в 1), значение `PC` будет увеличиваться на `4`, тем самым указывая на следующую инструкцию. Последовательное считывание программы из памяти готово. + +Так как операции будут выполняться только над данными в регистровом файле, то его можно сразу подключить к АЛУ, соединив порты чтения `read_data1_o` и `read_data2_o` со входами операндов АЛУ, а результат операции АЛУ подключив к порту на запись `write_data_i`. Полученный результат изображен на картинке ниже. + +![../../.pic/Labs/lab_04_cybercobra/ppd_1.drawio.png](../../.pic/Labs/lab_04_cybercobra/ppd_1.drawio.png) + +Для компактности схемы, названия портов регистрового файла сокращено (`RA1` обозначает `read_addr1_i` и т.п.). + +### Кодирование вычислительных инструкций + +Чтобы добавить поддержку каких-либо инструкций, необходимо договориться **как** они будут кодироваться (эта часть относится к вопросам архитектуры). Вычислительные инструкции требуют следующую информацию: + +1. по каким адресам регистрового файла лежат операнды? +2. по какому адресу будет сохранен результат? +3. какая операция должна быть выполнена? + +Для этого в инструкции были выбраны следующие поля: 5 бит (`[27:23]`) для кодирования операции на АЛУ, два раза по 5 бит для кодирования адресов операндов в регистровом файле (`[22:18]` и `[17:13]`) и 5 бит для кодирования адреса результата (`[4:0]`). Ниже демонстрируется деление 32-битной инструкции на поля `alu_op`, `RA1`, `RA2` и `WA`. + +![../../.pic/Labs/lab_04_cybercobra/ppd_code_1.png](../../.pic/Labs/lab_04_cybercobra/ppd_code_1.png) + +``` C + reg_file[WA] ← reg_file[RA1] {alu_op} reg_file[RA2] +``` + +Запись выше является некоторой формализацией выполняемой функции, которая как бы отвечает на вопрос "а что, собственно, будет сделано?". В регистр по адресу WA (`reg_file[WA]`) будет записан (`←`) результат операции alu_op (`{alu_op}`) между регистрами по адресам RA1 (`reg_file[RA1]`) и RA2 (`reg_file[RA1]`). + +### Реализация вычислительных инструкций + +Чтобы процессор правильно реагировал на эти инструкции, требуется подключить ко входам адреса регистрового файла и управляющему входу АЛУ соответствующие биты выхода `read_data` памяти инструкции (**Instruction Memory**). В таком случае, когда `PC` будет указывать на ячейку памяти, в которой лежит, например, следующая 32-битная инструкция: + +```text +0000 00111 00100 01000 00000000 11100 + |alu_op| RA1 | RA2 | | WA +``` + +будет выполнена операция `reg_file[28] = reg_file[4] | reg_file[8]`, потому что `alu_op = 00111`, что соответствует операции **логического ИЛИ**, `WA = 11100`, то есть 28-ой регистр, `RA1 = 00100` (4-ый регистр) и `RA2 = 01000` (8-ой регистр). Ниже иллюстрируется фрагмент микроархитектуры, поддерживающий вычислительные операции на АЛУ. Так как пока что другие инструкции не поддерживаются, то вход `WE` регистрового файла всегда равен `1` (это временно). + +![../../.pic/Labs/lab_04_cybercobra/ppd_2.drawio.png](../../.pic/Labs/lab_04_cybercobra/ppd_2.drawio.png) + +### Реализация загрузки константы в регистровый файл + +Информация как-то должна попадать в регистровый файл, для этого добавим инструкцию загрузки константы по адресу `WA`. Чтобы аппаратура могла различать, когда ей нужно выполнять операцию на АЛУ, а когда загружать константу, назначим один бит инструкции определяющим "что именно будет записано в регистровый файл": результат с АЛУ или константа из инструкции. За это будет отвечать 28-ой бит инструкции `WS` (**Write Source**). Если `WS == 1`, значит выполняется вычислительная инструкция, а если `WS == 0`, значит нужно загрузить константу в регистровый файл. + +Сама константа имеет разрядность **23 бита** ([27:5] биты инструкции) и должна быть **знакорасширена** до 32-х бит, то есть к 23-битной константе нужно приклеить слева 9 раз 23-ий знаковый бит константы (см. [оператор конкатенации](../../Basic%20Verilog%20structures/Concatenation.md)). + +Пример: если [27:5] биты инструкции равны: + +```text +10100000111100101110111 +``` + +то после знакорасширения константа примет вид: + +```text +11111111110100000111100101110111 +``` + +(если бы старший бит был равен нулю, то константа заполнилась бы слева нулями, а не единицами). + +Нет ничего страшного в том, что биты константы попадают на те же поля, что и `alu_op`, `RA1` и `RA2`, потому что когда выполняется инструкция загрузки константы не важно что будет выдавать АЛУ в этот момент (ведь благодаря мультиплексору на вход регистрового файла приходит константа). А значит не важно и что приходит в этот момент на АЛУ в качестве операндов и кода операции. Ниже демонстрируется деления 32-битной инструкции на поля `alu_op`, `RA1`, `RA2`, `WA`, `WS` и `const`, **с перекрытием полей**. + +![../../.pic/Labs/lab_04_cybercobra/ppd_code_2.png](../../.pic/Labs/lab_04_cybercobra/ppd_code_2.png) + +``` C + reg_file[WA] ← const +``` + +Так как вход записи уже занят результатом операции АЛУ, его потребуется мультиплексировать со значением константы из инструкции, которая предварительно **знакорасширяется** в блоке `SE`. На входе `WD` регистрового файла появляется мультиплексор, управляемый 28-м битом инструкции, который и определяет что будет записано: константа или результат вычисления на АЛУ. + +Например, в такой реализации следующая 32-битная инструкция поместит константу `-1` в регистр по адресу `5`: + +```text +000 0 11111111111111111111111 00101 + |WS| RF_const | WA | +``` + +Далее приводится фрагмент микроархитектуры, поддерживающий вычислительные операции на АЛУ и загрузку констант из инструкции в регистровый файл. + +![../../.pic/Labs/lab_04_cybercobra/ppd_3.drawio.png](../../.pic/Labs/lab_04_cybercobra/ppd_3.drawio.png) + +### Реализация загрузки в регистровый файл данных с внешних устройств + +Чтобы процессор мог взаимодействовать с внешним миром добавим возможность загрузки данных с внешних устройств в регистр по адресу `WA`. Появляется третий тип инструкции, который определяет третий источник ввода для регистрового файла. Одного бита `WS` для выбора одного из трех источников будет недостаточно, поэтому расширим это поле до 2 бит. Теперь, когда `WS == 0` будет загружаться константа, когда `WS == 1` – будет загружаться результат вычисления АЛУ, а при `WS == 2` будут загружаться данные с внешних устройств. Остальные поля в данной инструкции не используются. + +![../../.pic/Labs/lab_04_cybercobra/ppd_code_3.png](../../.pic/Labs/lab_04_cybercobra/ppd_code_3.png) + +``` C + reg_file[WA] ← sw_i +``` + +По аналогии с загрузкой констант увеличиваем входной мультиплексор до 4 входов и подключаем к нему управляющие сигналы – `[29:28]` биты инструкции. Последний вход используется, чтобы разрешить неопределенность на выходе при `WS == 3`(`default`-вход, см. [мультиплексор](../../Basic%20Verilog%20structures/Multiplexors.md)). + +Выход OUT подключается к первому порту на чтение регистрового файла. Значение на выходе OUT будет определяться содержимым ячейки памяти по адресу `RA1`. Ниже приводится фрагмент микроархитектуры, поддерживающий вычислительные операции на АЛУ, загрузку констант из инструкции в регистровый файл и загрузку данных с внешних устройств. + +![../../.pic/Labs/lab_04_cybercobra/ppd_4.drawio.png](../../.pic/Labs/lab_04_cybercobra/ppd_4.drawio.png) + +### Реализация условного перехода + +С реализованным набором инструкций полученное устройство нельзя назвать процессором – пока что это продвинутый калькулятор. Добавим поддержку инструкции условного перехода, при выполнении которой программа будет перепрыгивать через заданное количество команд. Чтобы аппаратура отличала эту инструкцию от других будем использовать 30-ый бит `B` (`branch`). Если `B == 1`, значит это инструкция условного перехода и, если условие перехода выполняется, к `PC` надо прибавить константу. Если `B == 0`, значит это какая-то другая инструкция и к `PC` надо прибавить четыре. + +![../../.pic/Labs/lab_04_cybercobra/ppd_code_4.png](../../.pic/Labs/lab_04_cybercobra/ppd_code_4.png) + +Для вычисления результата условного перехода, нам необходимо выполнить операцию на АЛУ и посмотреть на сигнал `flag`. Если он равен 1, переход выполняется, в противном случае — не выполняется. А значит, нам нужны операнды `A`, `B`, и `alu_op`. Кроме того, нам необходимо указать насколько мы сместимся относительно текущего значения `PC` (константу смещения, `offset`). Для передачи этой константы лучше всего подойдут незадействованные биты инструкции `[12:5]`. + +Обратим внимание на то, что `PC` 32-битный и должен быть всегда кратен четырем (`PC` не может указывать кроме как в начало инструкции, а каждая инструкция длиной в 32 бита). Чтобы константа смещения указывала на число инструкций, а не число байт, необходимо увеличить её в 4 раза. Это можно сделать, если приклеить к ней справа два нулевых бита (так же как в десятичной системе можно умножить число на 102=100 если дописать справа от него два нуля). Кроме того, чтобы разрядность константы совпадала с разрядностью `PC`, необходимо знакорасширить её до 32 бит. + +Приведенный ниже Си-подобный псевдо-код (далее мы назовем его псевдоассемблером) демонстрирует кодирование инструкций с новым полем `B`: + +``` C + if (reg_file[RA1] {alu_op} reg_file[RA2]) + PC ← PC + const * 4 + else + PC ← PC + 4 +``` + +Так как второй вход сумматора счетчика команд занят числом 4, то для реализации условного перехода этот вход надо мультиплексировать с константой. Мультиплексор при этом управляется 30-ым битом `B`, который и определяет, что будет прибавляться к `PC`. + +Сигнальные линии, которые управляют АЛУ и подают на его входы операнды уже существуют. Поэтому на схему необходимо добавить только логику управления мультиплексором на входе сумматора счетчика команд так. Эта логика работает следующим образом: + +1. Если сейчас инструкция условного перехода +2. И если условие перехода выполнилось + +то к `PC` прибавляется знакорасширенная константа, умноженная на 4. В противном случае, к `PC` прибавляется 4. + +Так как теперь не любая инструкция приводит к записи в регистровый файл, появляется необходимость управлять входом `WE` так, чтобы при операциях условного перехода запись в регистровый файл не производилась. Это можно сделать, подав на WE значение `!B` (запись происходит, если сейчас **не операция условного перехода**) + +![../../.pic/Labs/lab_04_cybercobra/ppd_5.drawio.png](../../.pic/Labs/lab_04_cybercobra/ppd_5.drawio.png) + +### Реализация безусловного перехода + +Осталось добавить поддержку инструкции безусловного перехода, для идентификации которой используется оставшийся 31-ый бит `J`(jump). Если бит `J == 1`, то это безусловный переход, и мы прибавляем к `PC` знакорасширенную константу смещения, умноженную на 4 (как это делали и в условном переходе). + +![../../.pic/Labs/lab_04_cybercobra/ppd_code_5.png](../../.pic/Labs/lab_04_cybercobra/ppd_code_5.png) + +``` C + PC ← PC + const*4 +``` + +Для реализации безусловного перехода, нам необходимо добавить дополнительную логику управления мультиплексором перед сумматором. Итоговая логика его работы звучит так: + +1. Если сейчас инструкция безусловного перехода +2. ИЛИ если сейчас инструкция условного перехода +3. И если условие перехода выполнилось + +Кроме того, при безусловном переходе в регистровый файл так же ничего не пишется. А значит, необходимо обновить логику работы сигнала разрешения записи `WE`, который будет равен 0 если сейчас инструкция условного или безусловного перехода. + +Ниже приводится итоговый вариант микроархитектуры процессора `CYBERcobra 3000 Pro 2.1` + +![../../.pic/Labs/lab_04_cybercobra/ppd_6.drawio.png](../../.pic/Labs/lab_04_cybercobra/ppd_6.drawio.png) + +### Финальный обзор + +Итого, архитектура `CYBERcobra 3000 Pro 2.1` поддерживает 5 типов инструкций, которые кодируются следующим образом (иксами помечены биты, которые не задействованы в данной инструкции): + +1. 10 вычислительных инструкций `0 0 01 alu_op RA1 RA2 xxxx xxxx WA` +2. Инструкция загрузки константы `0 0 00 const WA` +3. Инструкция загрузки из внешних устройств `0 0 10 xxx xxxx xxxx xxxx xxxx xxxx WA` +4. Безусловный переход `1 0 xx xxx xxxx xxxx xxxx const xxxxx` +5. 6 инструкций условного перехода `0 1 xx alu_op RA1 RA2 const x xxxx` + +При кодировании инструкций используются следующие поля: + +- J – однобитный сигнал указывающий на выполнение безусловного перехода +- B – однобитный сигнал указывающий на выполнение условного перехода +- WS – двухбитный сигнал указывающий источник данных для записи в регистровый файл: + - 0 – константа из инструкции + - 1 – результат с АЛУ + - 2 – внешние данные + - 3 – не используется +- alu_op – 5-битный сигнал кода операции АЛУ (в соответствии с таблицей из лабораторной по АЛУ) +- RA1 и RA2 – 5-битные адреса операндов из регистрового файла +- offset – 8-битная константа для условного / безусловного перехода +- const — 23-битная константа для загрузки в регистровый файл +- WA – 5-битный адрес регистра, в который будет записан результат + +Напишем простую программу для этого процессора, которая в бесконечном цикле увеличивает значение первого регистра на 1. Сначала напишем программу на псевдоассемблере (используя предложенную мнемонику): + +``` C + reg_file[1] ← -1 // загрузить константу `-1` регистр 1 + reg_file[2] ← sw_i // загрузить значение с входа sw_i в регистр 2 + reg_file[3] ← 1 // загрузить константу `1` регистр 3 + + reg_file[1] ← reg_file[1] + reg_file[3] // сложить регистр 1 с регистром 3 и + // поместить результат в регистр 1 + + if (reg_file[1] < reg_file[2]) // если значение в регистре 1 меньше + // значения в регистре 2, + PC ← PC – 1 // возврат на 1 инструкцию назад + + out_o = reg_file[1], PC ← PC + 0 // бесконечное повторение этой инструкции + // с выводом на out_o значения в регистре 1 +``` + +Теперь в соответствии с кодировкой инструкций переведем программу в машинные коды: + +```text + 0 0 00 11111111111111111111111 00001 + 0 0 10 00000000000000000000000 00010 + 0 0 00 00000000000000000000001 00011 + 0 0 01 00000 00001 00011 00000000 00001 + 0 1 00 11110 00001 00010 11111111 00000 + 1 0 00 00000 00001 00000 00000000 00000 +``` + +Полученную программу можно помещать в память программ и выполнять на процессоре. + +## Инструменты для реализации процессора + +Так как все модули процессора написаны, основная часть кода описания процессора будет связана с подключением этих модулей друг к другу. Подробнее о подключении модулей сказано в [Modules.md](../../Basic%20Verilog%20structures/Modules.md). + +Для реализации блоков знакорасширения с умножением на 4 подходит использование оператора конкатенации ([Concatenation.md](../../Basic%20Verilog%20structures/Modules.md)). + +## Задание по реализации процессора + +Разработать процессор `CYBERcobra`, объединив ранее разработанные модули: + +- Память инструкций (проинициализированную в двоичном формате файлом `example.txt`) +- Регистровый файл +- Арифметико-логическое устройство +- 32-битный сумматор + +Кроме того, необходимо описать регистр счетчика команд и логику его работы, в соответствии с ранее представленной микроархитектурой. + +```SystemVerilog +module CYВЕRcоbrа ( + inрut logic clk_i, + inрut logic rst_i, + inрut logic [15:0] sw_i, + оutрut logic [31:0] out_o +); + + // тут твой код, о котором говорится чуть выше + +endmodule +``` + +![../../.pic/Labs/lab_04_cybercobra/ppd_6.drawio.png](../../.pic/Labs/lab_04_cybercobra/ppd_6.drawio.png) + +## Порядок выполнения задания + +1. Внимательно ознакомьтесь с [заданием](#задание-по-реализации-процессора). В случае возникновения вопросов, проконсультируйтесь с преподавателем. +2. Реализуйте модуль `CYBERcobra`. Для этого: + 1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `cybercobra.sv`. + 2. Опишите в нем модуль процессора с таким же именем и портами, как указано в [задании](#задание-по-реализации-процессора) (обратите внимание на регистр имени модуля). + 1. В первую очередь, необходимо создать счетчик команд и все вспомогательные провода. При создании, **следите за разрядностью**. + 2. Затем, необходимо создать экземпляры модулей: памяти инструкции, АЛУ, регистрового файла и сумматора. При подключении сигналов сумматора, надо **обязательно** надо подать нулевое значение на входной бит переноса. Выходной бит переноса подключать не обязательно. + 3. После этого, необходимо описать оставшуюся логику: + 1. Программного счетчика + 2. Сигнала управления мультиплексором, выбирающим слагаемое для программного счетчика + 3. Сигнала разрешения записи в регистровый файл + 4. Мультиплексор, выбирающий слагаемое для программного счетчика + 5. Мультиплексор, выбирающий источник записи в регистровый файл. +3. После описания модуля, его необходимо проверить с помощью [`тестового окружения`](../../Basic%20Verilog%20structures/Testbench.md). + 1. Тестовое окружение находится [`здесь`](tb_cybercobra.sv). + 2. Программа, которой необходимо проинициализировать память инструкций находится [`здесь`](example.txt). Алгоритм работы программы приведен в разделе [`Финальный обзор`](#финальный-обзор). + 3. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). + 4. Перед запуском симуляции убедитесь, что выбран правильный модуль верхнего уровня. + 5. **Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста!** + 6. В этот раз, в конце не будет сообщения о том, работает ли ваше устройство или в нем есть ошибки. Вы должны самостоятельно проверить работу модуля, перенеся его внутренние сигналы на временную диаграмму, и [проверив](../../Vivado%20Basics/Debug%20manual.md) логику их работы. +4. Добавьте в проект модуль верхнего уровня ([nexys_cybercobra_demo.sv](board%20files/nexys_cybercobra_demo.sv)), соединяющий процессор с периферией в ПЛИС. Описание работы модуля находится [здесь](board%20files) +5. Замените содержимое файла, инициализирующего память инструкций новой программой, которая размещена [`здесь`](board%20files/demo.txt). +6. Убедитесь, что у файла, инициализирующего память инструкций выставлен тип `Memory Initialization Files`, а не `Memory File`. +7. Подключите к проекту файл ограничений ([nexys_a7_100t.xdc](board%20files/nexys_a7_100t.xdc)), если тот еще не был подключен, либо замените его содержимое данными из файла к этой лабораторной работе. +8. Проверьте работу процессора в ПЛИС. + +--- + +После выполнения задания по реализации процессора, необходимо также выполнить [индивидуальное задание](Индивидуальное%20задание) по написанию двоичной программы под созданный вами процессор. + +--- + +Дерзайте! diff --git a/Labs/04. Primitive programmable device/board files/README.md b/Labs/04. Primitive programmable device/board files/README.md new file mode 100644 index 0000000..b643e5b --- /dev/null +++ b/Labs/04. Primitive programmable device/board files/README.md @@ -0,0 +1,11 @@ +# Проверка работы CYBERcobra на ПЛИС + +Если вы не понимаете, что лежит в этой папке, или если надо вспомнить, как прошить ПЛИС, можно воспользоваться [`этой инструкцией`](../../../Vivado%20Basics/Program%20nexys%20a7.md) + +Файл [`nexys_cybercobra_demo.v`](nexys_cybercobra_demo.v), который нужно запускать с [`демонстрационным файлом инструкций`](demo.txt), является демонстрацией возможностей кобры, реализующий лишь декодирование выходных значений в формат для отображения на семисегментных индикаторах, а вся логика работы реализована инструкциями в текстовом файле. + +Сначала выводится приветствие `≡ALOHA≡`, меняя положение восьми правых переключателей, последовательно нажимая на кнопку `BTND` (на рисунке выделена синим цветом), можно включать или выключать `один` из выбранных сегментов. Кнопка `CPU RESET` (на рисунке выделена красным цветом) возвращает все исходное состояние. Попробуйте погасить все слово, а потом снова его зажечь. + +Файл [`nexys_cybercobra.v`](nexys_cybercobra.v), который нужно запускать с `вашим файлом инструкций`, так же реализует лишь декодирование выходных значений в формат для отображения на семисегментных индикаторах, но кнопка `BTND` задает тактирующий сигнал, следовательно, нажимая на нее, вы можете пошагово переходить по инструкциям, контролируя правильность работы устройства, для удобства можете в тестовом окружении выставить такое же входное значение, как переключатели sw[15:0] на плате. + +![кобра](../../../.pic/Labs/board%20files/nexys_cobra.jpg) diff --git a/Labs/04. Primitive programmable device/board files/demo.txt b/Labs/04. Primitive programmable device/board files/demo.txt new file mode 100644 index 0000000..ce6ec5f --- /dev/null +++ b/Labs/04. Primitive programmable device/board files/demo.txt @@ -0,0 +1,380 @@ +21 +42 +07 +00 +02 +02 +00 +00 +01 +40 +84 +10 +63 +94 +11 +00 +01 +60 +04 +10 +0c +00 +06 +00 +0d +40 +01 +00 +0e +02 +00 +00 +2f +00 +00 +00 +0c +40 +b0 +10 +0d +40 +b4 +10 +0e +40 +b8 +10 +0f +40 +bc +10 +10 +00 +10 +00 +11 +80 +01 +00 +12 +14 +00 +00 +73 +00 +00 +00 +22 +00 +00 +00 +43 +00 +00 +00 +84 +00 +00 +00 +05 +01 +00 +00 +06 +02 +00 +00 +07 +04 +00 +00 +08 +08 +00 +00 +09 +10 +00 +00 +ea +1f +00 +00 +0b +00 +04 +20 +00 +00 +04 +30 +00 +00 +04 +30 +00 +00 +04 +30 +00 +00 +04 +30 +00 +00 +04 +30 +00 +00 +04 +30 +00 +00 +04 +30 +00 +00 +04 +30 +00 +00 +04 +30 +c0 +7e +a9 +7e +0b +40 +ad +13 +20 +45 +2c +7c +40 +65 +2c +7c +60 +85 +2c +7c +80 +a5 +2c +7c +a0 +c5 +2c +7c +c0 +e5 +2c +7c +e0 +05 +2d +7c +00 +26 +2d +7c +14 +60 +86 +13 +00 +02 +50 +7c +14 +40 +86 +13 +00 +02 +50 +7c +14 +20 +86 +13 +00 +02 +50 +7c +14 +00 +86 +13 +00 +02 +50 +7c +14 +e0 +85 +13 +00 +02 +50 +7c +14 +c0 +85 +13 +00 +02 +50 +7c +14 +a0 +85 +13 +00 +02 +50 +7c +14 +80 +85 +13 +00 +02 +50 +7c +00 +04 +04 +bc +01 +60 +06 +13 +c0 +03 +04 +bc +01 +40 +06 +13 +80 +03 +04 +bc +01 +20 +06 +13 +40 +03 +04 +bc +01 +00 +06 +13 +00 +03 +04 +bc +01 +e0 +05 +13 +c0 +02 +04 +bc +01 +c0 +05 +13 +80 +02 +04 +bc +01 +a0 +05 +13 +40 +02 +04 +bc +01 +80 +05 +13 +00 +02 +04 +bc +01 +60 +06 +12 +c0 +01 +04 +bc +01 +40 +06 +12 +80 +01 +04 +bc +01 +20 +06 +12 +40 +01 +04 +bc +01 +00 +06 +12 +00 +01 +04 +bc +01 +e0 +05 +12 +c0 +00 +04 +bc +01 +c0 +05 +12 +80 +00 +04 +bc +01 +a0 +05 +12 +40 +00 +04 +bc +01 +80 +05 +12 +60 +17 +04 +bc diff --git a/Labs/04. Primitive programmable device/board files/nexys_a7_100t.xdc b/Labs/04. Primitive programmable device/board files/nexys_a7_100t.xdc new file mode 100644 index 0000000..7c1538a --- /dev/null +++ b/Labs/04. Primitive programmable device/board files/nexys_a7_100t.xdc @@ -0,0 +1,211 @@ +## This file is a general .xdc for the Nexys A7-100T +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +# Clock signal +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100 }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK100}]; + + +#Switches +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { SW[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { SW[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { SW[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { SW[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { SW[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { SW[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { SW[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { SW[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { SW[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { SW[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { SW[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { SW[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { SW[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { SW[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + +### LEDs +#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { LED[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { LED[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { LED[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { LED[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { LED[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { LED[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { LED[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { LED[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { LED[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { LED[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { LED[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { LED[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +### RGB LEDs +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { LED17_B }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { LED17_G }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED17_R }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + +##7 segment display +set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { CA }]; #IO_L24N_T3_A00_D16_14 Sch=ca +set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { CB }]; #IO_25_14 Sch=cb +set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { CC }]; #IO_25_15 Sch=cc +set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { CD }]; #IO_L17P_T2_A26_15 Sch=cd +set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { CE }]; #IO_L13P_T2_MRCC_14 Sch=ce +set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { CF }]; #IO_L19P_T3_A10_D26_14 Sch=cf +set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { CG }]; #IO_L4P_T0_D04_14 Sch=cg +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp +set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { AN[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { AN[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { AN[6] }]; #IO_L23P_T3_35 Sch=an[6] +set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + +##Buttons +set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn +#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc +#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu +#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl +#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { BTNR }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers +##Pmod Header JA +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { JA[1] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { JA[2] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { JA[3] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { JA[4] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { JA[7] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { JA[8] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { JA[9] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { JA[10] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + +##Pmod Header JB +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { JB[1] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { JB[2] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { JB[3] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { JB[4] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { JB[7] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { JB[8] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { JB[9] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { JB[10] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + +##Pmod Header JC +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { JC[1] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { JC[2] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { JC[3] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { JC[4] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { JC[7] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { JC[8] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { JC[9] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { JC[10] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + +##Pmod Header JD +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { JD[1] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { JD[2] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { JD[3] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { JD[4] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { JD[7] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { JD[8] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { JD[9] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { JD[10] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + +##Pmod Header JXADC +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVCMOS33 } [get_ports { XA_N[1] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVCMOS33 } [get_ports { XA_P[1] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { XA_N[2] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { XA_P[2] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { XA_N[3] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVCMOS33 } [get_ports { XA_P[3] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { XA_N[4] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { XA_P[4] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + +##VGA Connector +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { VGA_HS }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { VGA_VS }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { SD_RESET }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { SD_CD }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { SD_SCK }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { SD_CMD }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + +##Accelerometer +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { ACL_MISO }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { ACL_MOSI }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { ACL_SCLK }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { ACL_CSN }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + +##Temperature Sensor +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { TMP_SCL }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { TMP_SDA }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { TMP_INT }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { TMP_CT }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { M_CLK }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { M_DATA }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel + +##PWM Audio Amplifier +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { AUD_SD }]; #IO_L6P_T0_15 Sch=aud_sd + +##USB-RS232 Interface +#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { UART_TXD_IN }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { UART_RXD_OUT }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { UART_CTS }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { UART_RTS }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { PS2_CLK }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { PS2_DATA }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + +##SMSC Ethernet PHY +#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDC }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDIO }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { ETH_RSTN }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { ETH_CRSDV }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv +#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXERR }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXEN }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { ETH_REFCLK }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { ETH_INTN }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + +##Quad SPI Flash +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn \ No newline at end of file diff --git a/Labs/04. Primitive programmable device/board files/nexys_cybercobra.sv b/Labs/04. Primitive programmable device/board files/nexys_cybercobra.sv new file mode 100644 index 0000000..3e1b09f --- /dev/null +++ b/Labs/04. Primitive programmable device/board files/nexys_cybercobra.sv @@ -0,0 +1,84 @@ +`timescale 1ns / 1ps + +module nexys_CYBERcobra_dz( + input CLK100, + input resetn, + input BTND, + input [15:0] SW, + output CA, CB, CC, CD, CE, CF, CG, + output [7:0] AN + ); + + CYBERcobra dut( + .clk_i(btn), + .rst_i(!resetn), + .sw_i(SW[15:0]), + .out_o(out) + ); + +localparam pwm = 1000; +reg [9:0] counter; +reg [3:0] semseg; +reg [7:0] ANreg; +reg CAr, CBr, CCr, CDr, CEr, CFr, CGr; +reg btn; +wire [31:0] out; + +assign AN[7:0] = ANreg[7:0]; +assign {CA, CB, CC, CD, CE, CF, CG} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr}; + + +always @(posedge CLK100) begin + if (!resetn) begin + counter <= 'b0; + ANreg[7:0] <= 8'b11111111; + {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; + btn <= BTND; + end + else begin + btn <= BTND; + if (counter < pwm) counter = counter + 'b1; + else begin + counter = 'b0; + ANreg[1] <= ANreg[0]; + ANreg[2] <= ANreg[1]; + ANreg[3] <= ANreg[2]; + ANreg[4] <= ANreg[3]; + ANreg[5] <= ANreg[4]; + ANreg[6] <= ANreg[5]; + ANreg[7] <= ANreg[6]; + ANreg[0] <= !(ANreg[6:0] == 7'b1111111); + end + case (1'b0) + ANreg[0]: semseg <= out[3 : 0]; + ANreg[1]: semseg <= out[7 : 4]; + ANreg[2]: semseg <= out[11: 8]; + ANreg[3]: semseg <= out[15:12]; + ANreg[4]: semseg <= out[19:16]; + ANreg[5]: semseg <= out[23:20]; + ANreg[6]: semseg <= out[27:24]; + ANreg[7]: semseg <= out[31:28]; + endcase + case (semseg) + 4'h0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; + 4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001111; + 4'h2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010; + 4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110; + 4'h4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100; + 4'h5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100; + 4'h6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000; + 4'h7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111; + 4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000; + 4'h9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100; + 4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; + 4'hB: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000; + 4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001; + 4'hD: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010; + 4'hE: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000; + 4'hF: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0111000; + default: {CAr,CBr,CCr,CDr, CEr, CFr, CGr} <= 7'b0111111; + endcase + end + end + +endmodule diff --git a/Labs/04. Primitive programmable device/board files/nexys_cybercobra_demo.sv b/Labs/04. Primitive programmable device/board files/nexys_cybercobra_demo.sv new file mode 100644 index 0000000..dc3eedc --- /dev/null +++ b/Labs/04. Primitive programmable device/board files/nexys_cybercobra_demo.sv @@ -0,0 +1,77 @@ +`timescale 1ns / 1ps + +module nexys_CYBERcobra( + input CLK100, + input resetn, + input BTND, + input [15:0] SW, + output CA, CB, CC, CD, CE, CF, CG, + output [7:0] AN + ); + + CYBERcobra dut( + .clk_i(CLK100), + .rst_i(!resetn), + .sw_i({7'b0,splash,SW[7:0]}), + .out_o(out) + ); + +localparam pwm = 1000; +reg [9:0] counter; +reg [3:0] semseg; +reg [7:0] ANreg; +reg CAr, CBr, CCr, CDr, CEr, CFr, CGr; +reg [3:0] btn; +reg [10:0] btn_reg; +wire splash; +wire [31:0] out; + +assign AN[7:0] = ANreg[7:0]; +assign {CA, CB, CC, CD, CE, CF, CG} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr}; +assign splash = ((btn == 4'b1111) ^ btn_reg[10]) && (btn == 4'b1111); + +always @(posedge CLK100) begin + if (!resetn) begin + counter <= 'b0; + ANreg[7:0] <= 8'b11111111; + {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; + btn <= 4'b0; + btn_reg <= 0; + end + else begin + btn <= (btn << 1'b1) + BTND; + btn_reg <= (btn_reg << 1'b1) + (btn == 4'b1111); + if (counter < pwm) counter = counter + 'b1; + else begin + counter = 'b0; + ANreg[1] <= ANreg[0]; + ANreg[2] <= ANreg[1]; + ANreg[3] <= ANreg[2]; + ANreg[4] <= ANreg[3]; + ANreg[5] <= ANreg[4]; + ANreg[6] <= ANreg[5]; + ANreg[7] <= ANreg[6]; + ANreg[0] <= !(ANreg[6:0] == 7'b1111111); + end + case (1'b0) + ANreg[0]: semseg <= out[3 : 0]; + ANreg[1]: semseg <= out[7 : 4]; + ANreg[2]: semseg <= out[11: 8]; + ANreg[3]: semseg <= out[15:12]; + ANreg[4]: semseg <= out[19:16]; + ANreg[5]: semseg <= out[23:20]; + ANreg[6]: semseg <= out[27:24]; + ANreg[7]: semseg <= out[31:28]; + endcase + case (semseg) + 4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //L + 4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110110; //? + 4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //O + 4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //A + 4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001000; //H + default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; // + endcase + end + end + +endmodule diff --git a/Labs/04. Primitive programmable device/example.txt b/Labs/04. Primitive programmable device/example.txt new file mode 100644 index 0000000..88e8f2d --- /dev/null +++ b/Labs/04. Primitive programmable device/example.txt @@ -0,0 +1,24 @@ +E1 +FF +FF +0F +02 +00 +00 +20 +23 +00 +00 +00 +01 +60 +04 +10 +E0 +5F +04 +4F +00 +00 +04 +80 diff --git a/Labs/04. Primitive programmable device/tb_cybercobra.sv b/Labs/04. Primitive programmable device/tb_cybercobra.sv new file mode 100644 index 0000000..d73b836 --- /dev/null +++ b/Labs/04. Primitive programmable device/tb_cybercobra.sv @@ -0,0 +1,52 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_cybercobra +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for CYBERcobra 3000 Pro 2.1 +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_CYBERcobra(); + + CYBERcobra dut( + .clk_i(clk), + .rst_i(rstn), + .sw_i (sw_i ), + .out_o(OUT) + ); + + wire [31:0] OUT; + reg clk; + reg rstn; + reg [15:0] sw_i; + + initial clk <= 0; + always #5 clk = ~clk; + + initial begin + $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); + rstn = 1'b1; + #10; + rstn = 1'b0; + sw_i = 16'b100001000; //значение, до которого считает счетчик + //#260; + //sw_i = 15'b0; + #10000; + $display("\n The test is over \n See the internal signals of the CYBERcobra on the waveform \n"); + $finish; + end + +endmodule diff --git a/Labs/04. Primitive programmable device/Индивидуальное задание/README.md b/Labs/04. Primitive programmable device/Индивидуальное задание/README.md new file mode 100644 index 0000000..bab0550 --- /dev/null +++ b/Labs/04. Primitive programmable device/Индивидуальное задание/README.md @@ -0,0 +1,313 @@ +# Написание программы под процессор CYBERcobra + +Чтобы максимально "прочувствовать" принцип работы созданного вами процессора, вам необходимо написать один из [вариантов программ](#индивидуальные-задания). Вариант выдается преподавателем. + +Порядок выполнения задания следующий: + +1. В первую очередь необходимо ознакомиться с заданием и изучить пример, приведенный в конце задания. Если возникли вопросы по заданию или примеру, свяжитесь с преподавателем. Чем лучше вы понимаете что от вас ожидают, тем проще будет выполнить задание. +2. Составьте алгоритм работы программы (буквально возьмите листочек, и нарисуйте блок-схему). Прежде чем вы погрузитесь в увлекательное приключение с ноликами и единицами, вам нужно составить четкую карту вашего путешествия. +3. Проверьте вашу блок-схему на данных из примера. Если все сошлось, проверьте вашу блок-схему на других данных. Не забывайте про краевые случаи (отрицательные числа, деление на ноль, переполнения и прочее — для каждого задания они могут быть разными). +4. После того как вы убедились в работоспособности алгоритма на всех возможных данных, наступает время претворить его в виде двоичной программы. +5. Программа описывается в текстовом файле. Для удобства был написан специальный конвертер, который будет принимать на вход текстовый файл с комментариями и двоичным кодом, разделенным пробелами, а на выход выдавать текстовый файл, которым можно будет проинициализировать память инструкций. Подробнее о конвертере смотрите в разделе [cyberconverter](#cyberconverter). Пример текстового файла, который сможет принять конвертер: + + ```text + //J B WS ALUop RA1 RA2 const WA + 0 0 00 11111111111111111111111 00001 // загрузить константу -1 регистр 1 + 0 0 10 00000000000000000000000 00010 // загрузить значение с входа sw_i в регистр 2 + 0 0 00 00000000000000000000001 00011 // загрузить константу 1 регистр 3 + 0 0 01 00000 00001 00011 00000000 00001 // сложить регистр 1 с регистром 3 и поместить результат в регистр 1 + 0 1 00 11110 00001 00010 11111111 00000 // если значение в регистре 1 меньше значения в регистре 2, возврат на 1 инструкцию назад + 1 0 00 00000 00001 00000 00000000 00000 // бесконечное повторение этой инструкции с выводом на out_o значения в регистре 1 + ``` + +6. При реализации условных переходов следует иметь в виду пару правил: + 1. Блок ветвления (аналог `if/else`) состоит из двух наборов инструкций: + 1. инструкции блока `if` (если условие выполнилось) + 2. инструкции блока `else` (если условие не выполнилось) + + При этом сразу за инструкцией ветвления описываются инструкции блока `else` (т.к. в случае не выполнения условия перехода, `PC` перейдет к следующей инструкции). + Для того, чтобы после выполнения инструкций блока `else` не начались исполняться инструкции блока `if`, в конце блока этих инструкций необходимо добавить безусловный переход на инструкцию, следующую за инструкциями блока `if`. + 2. Если вы реализуете не ветвление (аналог блока `if/else`), а только проверку условия для выполнения какого-то блока инструкций (аналог блока `if` без блока `else`), вы должны помнить, что блок `else` все равно есть, просто в этом блоке нет инструкций. Однако вы, как и в прошлом правиле, должны добавить безусловный переход на инструкцию, следующую за инструкциями блока `if`. + Этого можно избежать, если инвертировать ваше условие. В этом случае, если ваше инвертированное условие выполнится, вы сможете сразу пропустить нужное количество инструкций и начать исполнять инструкцию за пределами вашего блока `if`. Если инвертированное условие не выполнится (т.е. выполнится исходное условие), `PC` перейдет к следующей инструкции, где и будут находиться ваши инструкции блока `if`. + Звучит достаточно запутанно, поэтому давайте рассмотрим пару примеров. Сначала мы запишем нашу идею на языке Си, а затем перенесем её в двоичный код под архитектуру CYBERcobra: + + ```C + if(reg[1]==reg[5]) + { + reg[2] = 10; + reg[3] = 15; + } + else + { + reg[2] = 7; + goto if_end; // Поскольку в памяти программы блок else будет идти + // сразу за инструкцией условного перехода, необходимо + // добавить в конце инструкцию безусловного перехода, + // чтобы не начать исполнять инструкции блока if. + } + if_end: + ``` + + Мы хотим проверить на равенство значения в регистровом файле по адресам `1` и `5`. Если это так, записать значения `10` и `15` по адресам `2` и `3` соответственно. В противном случае, записать значение `7` по адресу `2`. + Это можно реализовать следующей двоичной программой: + + ```text + //J B WS ALUop RA1 RA2 const WA + 0 1 00 11000 00010 00101 00000011 00000 // Если регистры 2 и 5 равны, + // перемести PC на 3 инструкции вперед + // (перешагни через две + // инструкции блока else) + //--------------------------------------- + // блок else + //--------------------------------------- + 0 0 00 00000000000000000000111 00010 // reg[2] = 7 + 1 0 00 00000 00000 00000 00000011 00000 // goto if_end + //--------------------------------------- + + + //--------------------------------------- + // блок if + //--------------------------------------- + 0 0 00 00000000000000000001010 00010 // reg[2] = 10 + 0 0 00 00000000000000000001111 00011 // reg[3] = 15 + //--------------------------------------- + + 0 0 00 00000000000000000000000 00000 // некая инструкция с меткой if_end + // куда будет перемещен PC после + // выполнения блока else + ``` + + Рассмотрим второй пример, где нет блока `else`: + + ```C + if(reg[1] == reg[5]) + { + reg[2] = 10; + reg[3] = 15; + } + ``` + + Как упоминалось ранее, можно реализовать этот условный переход по той же схеме (тогда пример программы на Си примет вид): + + ```C + if(reg[1] == reg[5]) + { + reg[2] = 10; + reg[3] = 15; + } + else + { + goto if_end; + } + if_end: + ``` + + А можно инвертировать условие: + + ```C + if(reg[1] != reg[5]) + { + + } + else + { + reg[2] = 10; + reg[3] = 15; + } + ``` + + В этом случае, нет нужды делать безусловный переход на инструкцию, следующую за инструкциями блока `if`, т.к. там нет никаких инструкций. + Такое условие можно реализовать следующей двоичной программой: + + ```text + //J B WS ALUop RA1 RA2 const WA + 0 1 00 11001 00010 00101 00000011 00000 // Если регистры 2 и 5 НЕ РАВНЫ, + // перемести PC на 3 инструкции вперед + // (перешагни через две + // инструкции блока else) + //--------------------------------------- + // блок else + //--------------------------------------- + 0 0 00 00000000000000000001010 00010 // reg[2] = 7 + 0 0 00 00000000000000000001111 00011 // reg[3] = 15 + //--------------------------------------- + ``` + +7. В двоичном программировании, реализация циклов лучше всего делается аналогом `do while` в Си (если вы уверены, что первая итерация цикла гарантированно пройдет условие выхода из цикла). В этом случае, вы сперва описываете тело цикла, а затем через условный переход возвращаетесь обратно к началу тела цикла. Если условие не выполнилось, вы автоматически выйдете из цикла. +8. Для того, чтобы в конце выполнения программы было легко увидеть результат выполнения, в конец программы необходимо добавить инструкцию безусловного перехода, поле `const` которой равно нулю. В этом случае, будет выполняться `PC=PC+0` что приведет к повторению этой инструкции снова и снова. При этом в поле `RA1` необходимо указать адрес регистра, где хранится результат. На временной диаграмме это отобразится так, что в какой-то момент все сигналы процессора "замрут", а на выходе `out_o` окажется результат, вычисленный вашей программой. +9. После того, как вы написали программу, её необходимо проверить. Для этого сперва необходимо преобразовать её к формату, принимаемому памятью инструкций с помощью программы [`cyberconverter`](#cyberconverter). При необходимости, заменить данные в файле, инициализирующем память инструкций актуальными данными. +10. Если ваша программа использует данные с внешних устройств, нужно выставить проверяемое вами значение в модуле `testbench` на вход `sw_i` в месте подключения модуля `CYBERcobra`. +11. Проверка работы программы осуществляется аналогично проверке модуля `CYBERcobra` — вы достаете внутренние сигналы модуля, и смотрите за поведением сигналов: `PC`, `read_data` памяти инструкций, `flag` АЛУ, содержимым регистрового файла. Проверяете, что в конце на выходе `out_o` размещено корректное значение. +12. В случае, если вы не успели довести свой процессор до работоспособного состояния, вы можете проверить программу на готовом процессоре из ветки [`Я-не-смог`](https://github.com/MPSU/APS/tree/%D0%AF-%D0%BD%D0%B5-%D1%81%D0%BC%D0%BE%D0%B3). + +## cyberconverter + +[cyberconverter](cyberconverter.cpp) — это программа, которая преобразует текстовый файл с инструкциями архитектуры CYBERcobra в текстовый файл, который сможет принять память инструкций. + +cyberconverter может обрабатывать файлы, содержащие комментарии (начинающиеся с `//`), пробелы и пустые строки, а так же наборы символов `0` и `1`. Комментарии, пробелы и пустые строки удаляются, после чего оставшиеся строки из 32 нулей и единиц нарезаются на четверки по 8 бит, конвертируются в шестнадцатиричные значения и записываются в выходной файл. + +cyberconverter принимает до двух аргументов. Порядок запуска следующий: + +1. Вызов справки: + + ```bash + cyberconverter -h + cyberconverter --help + ``` + +2. Преобразование программы, записанной в файле `test.txt`, с записью результата в файл `program.txt`: + + ```bash + cyberconverter test.txt program.txt + ``` + +3. Если не указан второй аргумент, результат будет записан в файл: + `<имя_исходного_файла>_converted.<расширение исходного файла>`: + + ```bash + cyberconverter test.txt + ``` + + Результат будет записан в файл `test_converted.txt`. + +4. Если программа будет запущена без аргументов, то исходным файлом будет считаться файл `program.txt`. + +В случае отсутствия исходного файла, наличия неподдерживаемых символов или неверной длины инструкции будет выведено сообщение об ошибке. + +## Индивидуальные задания + +1. Вычислить [циклический сдвиг](https://ru.wikipedia.org/wiki/Битовый_сдвиг#Циклический_сдвиг) вправо `a >> sw_i`. +Пример: `a = 0...01011`, `sw_i = 0...010`. +Результат вычислений: `out_o = 110...010`. + +2. Вычислить `a - sw_i` без использования операции вычитания. +Пример: `sw_i = 0...011`, `a = 0...0100`. +Результат вычислений: `out_o = 0...001`. + +3. Вычислить [циклический сдвиг](https://ru.wikipedia.org/wiki/Битовый_сдвиг#Циклический_сдвиг) влево `a << sw_i`. +Пример: `a = 10...01011`, `sw_i = 0...10`. +Результат вычислений: `out_o = 0...0101110`. + +4. Поменять местами `[7:0]` и `[15:8]` биты числа `sw_i`. Вывести результат в `out_o`. +Пример: `sw_i = 0...010100000_1110010`. +Результат вычислений: `out_o = 0...011100101_10100000`. + +5. Вычислить приблизительное значение длины вектора `(a;sw_i)`. Вычисляется как `max + min/2`, где `max` и `min` — это большее и меньшее из чисел `a` и `sw_i` соответственно. +Пример: `a = 0...011`, `sw_i = 0...0100`. +Результат вычислений: `out_o = 0...0101`. +--- + +6. Вычислить `a * sw_i` посредством суммы `sw_i` значений `a`. Вывести результат в `out_o`. +Пример: `a = 5`, `sw_i = 4`. `5 * 4 == 5 + 5 + 5 + 5 = 20`. +Результат вычислений: `out_o = 0...010100`. + +7. Если `sw_i[1:0] == 00`, то в `out_o` выводится `a`, если `sw_i[1:0] == 01`, то `b`, если `sw_i[1:0] == 10`, то `c`, если `sw_i[1:0] == 11`, то `d`. +Пример: `a = 0...00`, `b = 0...010`, `c = 0...011`, `d = 0...001`, `sw_i[1:0] = 01`. +Результат вычислений: `out_o = 0...010`. + +8. Посчитать длину окружности при заданном радиусе `sw_i`, считая, что `pi = 3`. Вывести результат в `out_o`. +Пример: `sw_i = 0...010`. +Результат вычислений: `out_o = 0...01100`. + +9. Если `sw_i` является степенью двойки, то вывести `out_o = 0...01`, в противном случае, `out_o = 0...0`. +Пример 1: `sw_i = 0...0100`. Результат вычислений: `out_o = 0...01`. +Пример 2: `sw_i = 0...0110`. Результат вычислений: `out_o = 0...00`. + +10. Найти количество нулей в двоичном представлении числа `sw_i`. Вывести результат в `out_o`. +Пример: `sw_i = 1...10110_0010`. +Результат вычислений: `out_o = 0...0101`. + +11. Найти наибольший двоичный разряд числа `sw_i`, значение которого равно `1`. Если такого нет, вывести `32`. Вывести результат в `out_o`. +Пример: `sw_i = 0...0110`. +Результат вычислений: `out_o = 0...010`. + +12. Сформировать число, состоящее из чётных двоичных разрядов числа `sw_i`. Вывести результат в `out_o`. +Пример: `sw_i = 0...011_1011_1000`. +Результат вычислений `out_o = 0...01_0100`. + +13. Найти количество единиц в двоичном представлении числа `sw_i` (обрати внимание, `sw_i` – знаковое число). Вывести результат в `out_o`. +Пример: `sw_i = 0...0101_0110`. +Результат вычислений: `out_o = 0...0100`. + +14. Найти количество двоичных разрядов, в которых различаются числа `sw_i` и `a`. Вывести результат в `out_o`. +Пример: `sw_i = 0...0110`, `a = 0...01110`. +Результат вычислений: `out_o = 0...01`. + +15. Вывести в `out_o` подряд все единицы входного числа `sw_i`. +Пример: `sw_i = 0...01011011011`. +Результат вычислений:`out_o` = `0...01111111`. + +16. Вывести в `out_o` значение выражения: `out = (k*a + b) + c`, где `k` — это `sw_i[15:12]`, `a` — это `sw_i[11:8]`, `b` — это `sw_i[7:4]`, `c` — это `sw_i[3:0]`. +Пример: `sw_i = 0...0001_0000_0100_0011`. +Результат вычислений: `out_o = 0...01010`. + +--- + +17. Найти остаток от деления `sw_i` на `a`. Вывести результат в `out_o`. +Пример: `sw_i = 0...0101`, `a = 0...010`. +Результат вычислений: `out_o = 0...01`. + +18. Найти и вывести в `out_o` количество вхождений `a[2:0]` в `sw_i` без пересечений. +Пример: `a[2:0] = 010`, `sw_i = 0...01101_0101`. +Результат вычислений: `out_o = 0...01`. + +19. Определить, сколько раз встречается `11` в двоичном представлении `sw_i` без пересечений. Вывести результат в `out_o`. +Пример: `sw_i = 0...01110`. +Результат вычислений: `out_o = 0...01`. + +20. Вывести в `out_o` результат целочисленного деления `a/sw_i`. +Пример: `sw_i = 0...010`, `a = 0...0111`. +Результат вычислений: `out_o = 0...011`. + +21. Вывести в `out_o` сумму `sw_i[3:0]` + `sw_i[7:4]` + `sw_i[11:8]` + `sw_i[15:12]`. +Пример: `sw_i[15:0] = 0001_0010_0011_0000`. +Результат вычислений: `out_o = 0...0110`. + +22. В числе `sw_i` заменить справа-налево каждое `00` на `11`. Вывести результат в `out_o`. +Пример: `sw_i = 1...101000`. +Результат вычислений: `out_o = 1...101011`. + +--- + +23. Поменять местами чётные биты числа `sw_i` с нечётными битами этого числа (то есть соседние биты поменять местами). Вывести результат в `out_o`. +Пример: `sw_i = 0...01010_0111`. +Результат вычислений: `out_o = 0...0101_1011`. + +24. Инвертировать первые `sw_i` бит числа `a`. Вывести результат в `out_o`. +Пример: `sw_i = 0...011`, `a = 0...01010_0011`. +Результат вычислений: `out_o = 0...01010_0100`. + +25. Вывести n-ый член [последовательности Фибоначчи](https://ru.wikipedia.org/wiki/Числа_Фибоначчи) Fn. n = `sw_i`. Вывести результат в `out_o`. +Пример: `sw_i = 0...0100`. +Результат вычислений: `out_o = 0...010`. + +26. Поменять в числе `a` разряды `i = sw_i[4:0]` и `j = sw_i[9:5]`. Вывести результат в `out_o`. +Пример: `a = 0...01001`, `sw_i[9:0] = 00000_00001`. Значит, в числе `а` необходимо поменять местами `а[0]` и `a[1]`. +Результат вычислений: `out_o = 0...01010`. + +--- + +27. Вычислить `a * sw_i` с использованием операций сложений и сдвига ("в столбик"). Вывести результат в `out_o`. +[Пример](https://en.wikipedia.org/wiki/Binary_multiplier#Binary_long_multiplication): `a = 0...01011`, `sw_i[9:0] = 0...01110`. +Результат вычислений: `out_o = 0...010011010`. +``` + 1011 (11 в двоичном виде) + x 1110 (14 в двоичном виде) + ====== + 0000 (это 1011 x 0) + 1011 (это 1011 x 1, сдвинутое на 1 влево) + 1011 (это 1011 x 1, сдвинутое на 2 влево) + + 1011 (это 1011 x 1, сдвинутое на 2 влево) + ========= + 10011010 (154 в двоичном виде) +``` + +28. Вывести в `out_o` n-ый член [арифметической прогрессии](https://ru.wikipedia.org/wiki/Арифметическая_прогрессия) aN, где `a1 = a`, `d = sw_i[15:8]`, `n = sw_i[7:0]` (d и n неотрицательные). +Пример: `sw_i[15:8] = 0000_0010`, `sw_i[7:0] = 0000_0011`, `a = 0...01`. +Результат вычислений: `out_o = 0...0101`. + + + +29. Удалить все вхождения `sw_i[2:0]` из `a` со сдвигом вправо (заполняя удаленные области). +Пример: `a = 0...010011010`, `sw_i[2:0] = 101`. +Результат вычислений: `out_o = 0...010010` diff --git a/Labs/04. Primitive programmable device/Индивидуальное задание/cyberconverter.cpp b/Labs/04. Primitive programmable device/Индивидуальное задание/cyberconverter.cpp new file mode 100644 index 0000000..dce2c1c --- /dev/null +++ b/Labs/04. Primitive programmable device/Индивидуальное задание/cyberconverter.cpp @@ -0,0 +1,137 @@ +#include +#include +#include +#include +#include + +void print_help(const std::string program_name) +{ + using namespace std; + cout << "Usage: " << program_name << " [input file] [output file]\n\n"; + cout << "Convert CYBERcobra program file into $readmemh acceptable file.\n"; + cout << "CYBERcobra program file may contain only comments (starting with \"//\"),\n"; + cout << "whitespaces and binary digits '0' or '1'.\n"; + cout << "This program will erase this parts from every line and then convert\n"; + cout << "32-bits binary strings into 4 little endian 8-bit strings in hex-format.\n\n"; + cout << "If output file omitted, the _converted.\n"; + cout << "will be produced.\n\n"; + cout << "If input file omitted, program.txt will be used.\n\n"; + cout << "Example:\n\n"; + cout << program_name << " open \"program.txt\" and produce \"program_converted.txt\"\n"; + cout << program_name << " test.txt open \"test.txt\" and produce \"test_converted.txt\"\n"; + cout << program_name << " test.txt myname.dat open \"test.txt\" and produce \"myname.dat\"\n"; + +} + +int main(int argc, char ** argv) +{ + using namespace std; + /* + Parse argument list and print help message if needed + */ + string ifname; + string ofname; + string start; + string end; + string filename = argv[0]; + size_t dot_pos; + filename = filename.substr(filename.find_last_of("/\\") + 1); + switch (argc) + { + case 1: + ifname = "program.txt"; + ofname = "program_converted.txt"; + break; + case 2: + if (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")) + { + print_help(filename); + return 0; + } + ifname = argv[1]; + dot_pos = ifname.find("."); + if(dot_pos != string::npos) + { + start = ifname.substr(0, dot_pos); + end = ifname.substr(dot_pos, ifname.size() - dot_pos); + ofname = start + "_converted" + end; + } + else + { + ofname = ifname + "_converted"; + } + break; + case 3: + ifname = argv[1]; + ofname = argv[2]; + break; + default: + print_help(filename); + return 0; + } + + + /* + Program body + */ + // Open input and output files + ifstream ifs(ifname); + if(!ifs) + { + cerr << "Unable to open file: \"" << ifname << "\"" << endl; + return -1; + } + ofstream ofs(ofname); + + if (!ofs.is_open()) + { + cerr << "Unable to open file: \"" << ofname << "\"" << endl; + return -1; + } + string str; + size_t line_counter = 0; + while (getline(ifs, str)) + { + line_counter++; + // trim line from comments and whitespaces, skip empty lines after trimming + auto comment_pos = str.find("//"); + if(comment_pos != string::npos) + { + str.erase(comment_pos); + } + str.erase(remove_if(str.begin(), str.end(), ::isspace), str.end()); + if(!str.size()) + { + continue; + } + if(str.size()!=32) + { + cerr << "line " << line_counter << " length is not equal 32 after trimming comments and whitespaces" << endl; + return -2; + } + // split 32-bits binary line into 4 little-endian hex lines and write them into file + for (size_t i = 0; i < 4; i++) + { + // For every 8-bit part of 32-bit line get int representation. + // If illegal character found, throw error. + size_t valid_char_num; + string byte_substr = str.substr(8*(3-i), 8); + int cur_byte = std::stoi(byte_substr, &valid_char_num, 2); + if(valid_char_num != 8) + { + cerr << "Illegal character '" << byte_substr.at(valid_char_num) << + "' found in line " << line_counter << ": \"" << str << "\"\n"; + cerr << "Should be only '0' or '1'." << endl; + return -3; + } + char hex_byte_str[3]; + // convert int representation into hex string + snprintf(hex_byte_str, 3, "%02x", cur_byte); + ofs << hex_byte_str << "\n"; + } + } + ifs.close(); + ofs.close(); + + return 0; +} diff --git a/Labs/04. Primitive programmable device/Индивидуальное задание/example.txt b/Labs/04. Primitive programmable device/Индивидуальное задание/example.txt new file mode 100644 index 0000000..3de4e23 --- /dev/null +++ b/Labs/04. Primitive programmable device/Индивидуальное задание/example.txt @@ -0,0 +1,7 @@ +//J B WS ALUop RA1 RA2 const WA + 0 0 00 11111111111111111111111 00001 // загрузить константу -1 регистр 1 + 0 0 10 00000000000000000000000 00010 // загрузить значение с входа sw_i в регистр 2 + 0 0 00 00000000000000000000001 00011 // загрузить константу 1 регистр 3 + 0 0 01 00000 00001 00011 00000000 00001 // сложить регистр 1 с регистром 3 и поместить результат в регистр 1 + 0 1 00 11110 00001 00010 11111111 00000 // если значение в регистре 1 меньше значения в регистре 2, возврат на 1 инструкцию назад + 1 0 00 00000 00001 00000 00000000 00000 // бесконечное повторение этой инструкции с выводом на out_o значения в регистре 1 \ No newline at end of file diff --git a/Labs/05. Main decoder/README.md b/Labs/05. Main decoder/README.md new file mode 100644 index 0000000..be107dd --- /dev/null +++ b/Labs/05. Main decoder/README.md @@ -0,0 +1,267 @@ +# Лабораторная работа 5 "Основной дешифратор команд" + +Устройство управления – один из базовых блоков процессора, функцией которого является декодирование инструкций и выдача управляющих сигналов для всех блоков процессора. + +## Цель + +Описать на языке **SystemVerilog** блок основного дешифратора команд (модуль **Main Decoder**) для однотактного процессора с архитектурой **RISC-V**. + +## Допуск к лабораторной работе + +- Изучить форматы кодирования инструкций базового набора команд [`RV32I`](../../Other/rv32i.md) + +## Ход работы + +1. Изучить особенности архитектуры **RISC-V** ([#теория](#архитектура-risc-v-и-предлагаемая-микроархитектура)) +2. Изучить конструкции **SystemVerilog**, с помощью которых будет описан дешифратор ([#инструменты](#инструменты)) +3. Реализовать на языке **SystemVerilog** модуль основного дешифратора команд – **Main Decoder** ([#задание](#задание)) +4. Верифицировать разработанное устройство с помощью предлагаемого **testbench** (в том же [#задании](#задание)) + +## Архитектура RISC-V и предлагаемая микроархитектура + +### Набор инструкций **RISC-V** и способы их кодирования + +Все инструкции архитектуры **RISC-V** можно условно разделить на три категории: + +- Вычислительные инструкции (операции выполняются на АЛУ) + - Использующие в качестве операндов два регистра + - Использующие в качестве операндов регистр и непосредственный операнд из инструкции (константу) +- Инструкции для доступа к памяти + - Загрузки из основной памяти в регистровый файл + - Сохранения данных из регистрового файла в основную память +- Инструкции управления программой (управляют тем, как изменится счетчик команд `PC`) + - Условные переходы + - Безусловные переходы + +На рисунке ниже приводится фрагмент из [`оригинальной спецификации RISC-V`](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf). В верхней его части приводится 6 форматов кодирования инструкций: **R**, **I**, **S**, **B**, **U** и **J**, затем идут конкретные значения полей внутри инструкции. Под `rd` подразумевается 5-битный адрес регистра назначения (**r**egister **d**estination), `rs1` и `rs2` —5-битные адреса регистров источников (**r**egister **s**ource), `imm` — константа (immediate), расположение и порядок битов которой указывается в квадратных скобках. Обратите внимание, что в разных форматах кодирования константы имеют различную разрядность, а их биты упакованы по-разному. Для знаковых операций константу предварительно знаково расширяют до 32 бит. Для беззнаковых расширяют нулями до 32 бит. + +![../../.pic/Labs/lab_05_decoder/rv32i_BIS.png](../../.pic/Labs/lab_05_decoder/rv32i_BIS.png) + +*Таблица 1. Базовый набор инструкций из [спецификации RISC-V](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf) (стр. 130)* + +| Кодирование | Описание | +|-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| +| R-тип | Арифметические и логические операции над двумя регистрами с записью результата в третий (регистр назначения может совпадать с одним из регистров-источников) | +| I-тип | Инструкции с 12-битным непосредственным операндом | +| S-тип | Инструкции записи в память (типа store) | +| B-тип | Инструкции ветвления | +| U-тип | Инструкции с 20-битным «длинным» непосредственным операндом, сдвинутым влево на 12 | +| J-тип | Единственная инструкция jal, осуществляющая безусловный переход по адресу относительно текущего счетчика команд | + +*Таблица 2. Описание типов форматов кодирования инструкций ISA RISC-V* + +### Неподдерживаемые инструкции + +В базовом наборе инструкций **RISC-V** к операциям `SYSTEM` относятся `ECALL` и `EBREAK`, к операциям `MISC-MEM` – операция `FENCE`. В реализуемом процессорном ядре эти инструкции не должны приводить ни к каким изменениям. Иначе говоря, они должны быть реализованы как инструкция `NOP` (**no operation**). +Инструкция `FENCE` в **RISC-V** необходима при работе с несколькими аппаратными потоками, или хартами (hart – «hardware thread»). В **RISC-V** используется расслабленная модель памяти (**relaxed memory model**): потоки «видят» все инструкции чтения и записи, которые исполняются другими потоками, однако видимый порядок этих инструкций может отличаться от реального. Инструкция `FENCE`, использованная между двумя инструкциями чтения и/или записи гарантирует, что остальные потоки увидят первую инструкцию перед второй. Реализация `FENCE` является опциональной в **RISC-V** и в данном случае в ней нет необходимости, так как в системе не предполагается наличия нескольких аппаратных потоков. +Инструкции `ECALL` и `EBREAK` должны вызывать исключение с последующим переходом в обработчик исключения (вызова операционной системы и перехода в привилегированный режим работы). Помимо этого, их вызов должен обновить содержимое некоторых управляющих регистров (**Control & Status Registers** – **CSR**). В рамках данного курса лабораторных работ эти инструкции не будут использоваться, а потому могут быть реализованы как `NOP`. + +Список инструкций с указанием их типов и функциональным назначением: + +![../../.pic/Labs/lab_05_decoder/rv32i_summary.png](../../.pic/Labs/lab_05_decoder/rv32i_summary.png) + +*Таблица 3. Инструкции набора RV32I с приведением их типов, функционального описания и примеров использования.* + +Обратите внимание на операции `slli`, `srli` и `srai` (операции сдвига на константную величину). У этих инструкций немного измененный формат кодирования **I\***. Формат кодирования **I** предоставляет 12-битную константу. Сдвиг 32-битного числа более, чем на 31 не имеет смысла. Для кодирования числа 31 требуется всего 5 бит. Выходит, что из 12 бит константы используется только 5 бит для операции сдвига, а оставшиеся 7 бит – не используются. А, главное (какое совпадение!), эти 7 бит находятся ровно в том же месте, где у других инструкций находится поле `func7`. Поэтому, чтобы у инструкций `slli`, `srli` и `srai` использующих формат **I** не пропадала эта часть поля, к ней относятся как к полю `func7`. + +### Предлагаемая микроархитектура процессора RISC-V + +Ниже приводится микроархитектура процессора RISC-V. Регистр `PC` (Program Counter – счетчик команд) подключен к адресному входу памяти инструкций. Считываемая инструкция декодируется основным дешифратором, после чего он выставляет управляющие сигналы для всех блоков процессора (мультиплексоры, АЛУ, интерфейс взаимодействия с памятью). + +Приведенная архитектура не является заданием для текущей лабораторной работы, лишь отражает то, как в дальнейшем будет подключаться и использоваться реализуемый в данной лабораторной основной дешифратор. + +![../../.pic/Labs/lab_06_dp/fig_01.drawio.png](../../.pic/Labs/lab_06_dp/fig_01.drawio.png) + +Предложенная микроархитектура процессора `CYBERcobra 3000 Pro 2.0` из прошлой лабораторной имеет схожую структуру, с некоторыми изменениями. + +В первую очередь изменились входы и выходы процессора: + +- память инструкций вынесена наружу процессора, таким образом, у процессора появляются входы и выходы: `instr_addr_o` и `instr_i`; +- помимо прочего, у модуля появились сигналы интерфейса памяти данных: + - `data_addr_o` — адрес внешней памяти; + - `mem_req_o` — запрос на обращение во внешнюю память; + - `mem_size_o` — размер данных при обращении в память; + - `mem_we_o` — сигнал разрешения записи во внешнюю память; + - `mem_write_data_o` — данные для записи во внешнюю память; + - `mem_read_data_i` — считанные из внешней памяти данные; +- так же, у процессора появился вход `stall_i`, отключающий программный счетчик. + +Так же добавились источники операндов АЛУ: программный счетчик, множество констант из инструкций и микроархитектурных констант. Выбор нужных операндов для АЛУ осуществляется с помощью двух мультиплексоров, управляемых сигналами декодера `src_a_op_sel_o` и `src_b_op_sel_o` (для краткости на схеме обозначены как `src_a_sel` и `src_b_sel`). + +Изменилось и число источников записи в регистровый файл: их осталось два: результат операции на АЛУ и данные, считанные с внешней памяти. Выборка осуществляется сигналом декодера `wb_sel_o`. + +### Интерфейс памяти + +Интерфейс памяти использует несколько сигналов для взаимодействия с памятью: `mem_req_o` (этот выход должен быть выставлен в 1 каждый раз, когда необходимо обратиться к памяти – считать или записать), `mem_we_o` (выставляется в 1, если необходимо записать данные в память, и 0 – если считать из памяти) и `mem_size_o` (указывающий размер порции данных необходимых для передачи; возможные значения указаны в таблице ниже). Перечисленных сигналов достаточно для того, чтобы основная память понимала: обращаются ли к ней в данный момент, нужно ли записывать или считывать данные, и о какой порции данных идет речь. + +|Название|Значение `mem_size_o`| Пояснение | +|--------|---------------------|------------------------------| +|LDST_B | 3'd0 |Знаковое 8-битное значение | +|LDST_H | 3'd1 |Знаковое 16-битное значение | +|LDST_W | 3'd2 |32-битное значение | +|LDST_BU | 3'd4 |Беззнаковое 8-битное значение | +|LDST_HU | 3'd5 |Беззнаковое 16-битное значение| + +### Main Decoder — Основной дешифратор команд RISC-V + +Как говорилось ранее, дешифратор инструкций в процессоре служит для преобразования инструкции в набор управляющих сигналов, необходимых для ее исполнения. + +Пример: для выполнения инструкции загрузки слова из памяти данных в регистровый файл `lw`, дешифратор должен: + +- направить в АЛУ два операнда (базовый адрес и смещение) вместе с кодом операции АЛУ (сложения) для вычисления адреса: + - `a_sel_o = 2'd0`; + - `b_sel_o = 3'd1`; + - `alu_op_o= ALU_ADD`; +- сформировать управляющие сигналы интерфейса памяти: + - `mem_req_o = 1'b1`; + - `mem_size_o= 3'd2`; + - `mem_we_o = 1'b1`. + +Несмотря на то, что для записи во внешнюю память ключевыми сигналами будут описанные выше, это не означает, что остальные выходные сигналы декодера могут быть абы какими. + +Поскольку операция `lw` не является операцией перехода, сигналы `jal_o`, `jalr_o` и `branch_o` должны быть равны нулю (иначе процессор совершит переход, а инструкция `lw` этого не подразумевает). Точно так же, поскольку во время записи во внешнюю память, в регистровый файл не должно быть ничего записано, сигнал `gpr_we_o` так же должен быть равен нулю. + +А вот сигнал `wb_sel` может принять любое значение (поскольку сигнал разрешения записи в регистровый файл равен нулю, не важно, каким будет источник данных для записи в регистровый файл, т.к. в него все равно ничего не будет записано). + +Управляющие сигналы на выходе декодера зависят от трех полей инструкции: `opcode`, `func3` и `func7`. Обратите внимание, что расположение этих полей одинаково для всех типов инструкций. Это сделано для удобства декодирования. При этом для некоторых инструкций поля `func3` и `func7` могут отсутствовать. + +|Название сигнала| Пояснение | +|----------------|------------------------------------------------------------------------------------------------| +|fetched_instr_i |Инструкция для декодирования, считанная из памяти инструкций | +|a_sel_o |Управляющий сигнал мультиплексора для выбора первого операнда АЛУ | +|b_sel_o |Управляющий сигнал мультиплексора для выбора второго операнда АЛУ | +|alu_op_o |Операция АЛУ | +|mem_req_o |Запрос на доступ к памяти (часть интерфейса памяти) | +|mem_we_o |Сигнал разрешения записи в память, «write enable» (при равенстве нулю происходит чтение) | +|mem_size_o |Управляющий сигнал для выбора размера слова при чтении-записи в память (часть интерфейса памяти)| +|gpr_we_o |Сигнал разрешения записи в регистровый файл | +|wb_sel_o |Управляющий сигнал мультиплексора для выбора данных, записываемых в регистровый файл | +|illegal_instr_o |Сигнал о некорректной инструкции (на схеме не отмечен) | +|branch_o |Сигнал об инструкции условного перехода | +|jal_o |Сигнал об инструкции безусловного перехода jal | +|jalr_o |Сигнал об инструкции безусловного перехода jalr | + +Единственным входным сигналом этого модуля является `fetched_instr_i`. + +В системе команд **RV32I** два младших бита поля opcode всегда равны `11`, таким образом декодер понимает, что будут исполняться именно 32-битные инструкции, а не 16-битные, например. **Main decoder** должен выдать единицу на выходе `illegal_instr_o` в случае: + +- неравенства двух младших битов opcode значению `11`; +- некорректного значения `func3` или `func7` для данной операции; +- если значение `opcode` не совпадает ни с одним из известных и следовательно операция не определена. + +При реализации декодера его удобнее описывать разбив все инструкции на однотипные группы, как это сделано ниже. Коды операций в таблице 5-битные потому, что 2 младших бита полноценного 7-битного кода операции должны отдельно проверяться и быть равны `11` + +|Операция|Opcode| Описание операции | Краткая запись | +|--------|------|----------------------------------------------------------------------------------------------|------------------------------------| +|OP |01100 |Записать в `rd` результат вычисления АЛУ над `rs1` и `rs2` |`rd = alu_op(rs1, rs2)` | +|OP_IMM |00100 |Записать в `rd` результат вычисления АЛУ над `rs1` и `imm` |`rd = alu_op(rs1, imm)` | +|LUI |01101 |Записать в `rd` значение непосредственного операнда U-типа `imm_u` |`rd = imm << 12` | +|LOAD |00000 |Записать в `rd` данные из памяти по адресу `rs1+imm` |`rd = Mem[rs1 + imm]` | +|STORE |01000 |Записать в память по адресу `rs1+imm` данные из `rs2` |`Mem[rs1 + imm] = rs2` | +|BRANCH |11000 |Увеличить счетчик команд на значение `imm`, если верен результат сравнения `rs1` и `rs2` |`if cmp_op(rs1, rs2) then PC += imm`| +|JAL |11011 |Записать в `rd` следующий адрес счетчика команд, увеличить счетчик команд на значение `imm` |`rd = PC + 4; PC += imm` | +|JALR |11001 |Записать в `rd` следующий адрес счетчика команд, в счетчик команд записать `rs1+imm` |`rd = PC + 4; PC = rs1+imm` | +|AUIPC |00101 |Записать в `rd` результат сложения непосредственного операнда U-типа `imm_u` и счетчика команд|`rd = PC + (imm << 12)` | +|MISC-MEM|00011 |Не производить операцию | `-` | +|SYSTEM |11100 |Не производить операцию | `-` | + +## Инструменты + +В первую очередь язык описания аппаратуры **SystemVerilog** – это язык. С помощью этого языка человек объясняет либо синтезатору какое он хочет получить устройство, либо симулятору – как он хочет это устройство проверить. Синтезатор – это программа, которая создает из логических элементов цифровое устройство по описанию предоставляемому человеком. Синтезатору внутри **Vivado** нужно объяснить что ты от него хочешь. Например, чтобы спросить дорогу у испанца, придется делать это на испанском языке, иначе он ничем не сможет помочь. Если ты знаешь испанский, то это можно сделать еще и разными способами. В **SystemVerilog** точно также – одно и то же устройство можно описать разным кодом, но результат синтеза будет одним и тем же. Однако, часто два разных кода одинаковые по смыслу могут синтезироваться в разную аппаратуру, хотя функционально они будут идентичны, но могут отличаться, например, скоростью работы. Или одни и те же специальные языковые конструкции могут применяться для синтезирования разных цифровых элементов. + +Основной дешифратор – это комбинационная схема, то есть, для каждой комбинации входных сигналов существует только одна комбинация выходных сигналов, потому что комбинационные схемы не содержат элементов памяти. + +Можно по-разному описывать комбинационные схемы, например, через конструкцию `assign`. Для основного дешифратора отлично подойдет конструкция `case`, которая превратится не в мультиплексор, а в комбинационную схему с оптимальными параметрами критического пути. В доверилоговую эпоху разработчикам пришлось бы строить гигантские таблицы истинности и какие-нибудь [карты Карно](https://ru.wikipedia.org/wiki/Карта_Карно), искать оптимальные схемы реализации. Сегодня эту задачу решает синтезатор, по описанию устройства сам находит наиболее эффективное решение. + +Разница с реализацией мультиплексора в том, что в этом случае справа от знака равно всегда стоит константа. Получается это такой способ описать таблицу истинности. В такой код легко вносить правки и искать интересующие фрагменты. + +Рассмотрим пример ниже. Внутри конструкции `always_comb`, перед конструкцией `case` указываются значения по-умолчанию. Благодаря этому пропадает необходимость указывать все сигналы внутри каждого обработчика `case`, достаточно указать только те, что имеют значение отличное от значения по-умолчанию. Представленный пример реализует комбинационную схему, которая при `cucumber == 4'b1100` будет выставлять сигнал `c == 1'b0`, то есть отличное, от значения по-умолчанию. Сигнал `a` никак не меняется, поэтому он не указан в соответствующем обработчике. Если сигнал `size == 1'b0`, то `b` будет равен 1, а `d` равен 0. Если сигнал `size == 1'b1`, то наоборот – `b` будет равен 0, а `d` равен 1. + +```SystemVerilog + + +// ... какие-то еще дефайны + +module tequila ( + input logic [3:0] cucumber; + input logic size; + output logic a, b, c, d; +); + parameter logic [3:0] PICKLE = 4'b1100; + always_comb begin + a <= 1'b0; // значения по-умолчанию + b <= 1'b0; + c <= 1'b1; + d <= 1'b0; + case(cucumber) + // ... какие-то еще комбинации + PICKLE: begin // если на cucumber значение PICKLE + c <= 1'b0; + case (size) + 1'b0: b <= 1'b1; // если на size значение 1'b0 + 1'b1: d <= 1'b1; // если на size значение 1'b1 + endcase + end + // ... какие-то еще обработчики + default: begin // так как описаны не все значения + a <= 1'b0; // cucumber, то чтобы case не было + b <= 1'b0; // защелки (latch) на выходе + c <= 1'b1; // нужно обязательно добавлять + d <= 1'b0; // default + end + endcase + end + +endmodule +``` + +## Задание + +Необходимо реализовать на языке **SystemVerilog** модуль основного дешифратора команд однотактного процессора RISC-V в соответствии с предложенной микроархитектурой. Далее приводится прототип разрабатываемого модуля. + +```SystemVerilog +module decoder_riscv ( + input logic [31:0] fetched_instr_i, + output logic [1:0] a_sel_o, + output logic [2:0] b_sel_o, + output logic [4:0] alu_op_o, + output logic mem_req_o, + output logic mem_we_o, + output logic [2:0] mem_size_o, + output logic gpr_we_o, + output logic wb_sel_o, //write back selector + output logic illegal_instr_o, + output logic branch_o, + output logic jal_o, + output logic jalr_o +); + import riscv_pkg::*; + +endmodule +``` + +В зависимости от стиля оформления, модуль может занимать больше сотни строк кода, но это не делает его реализацию сложной. По сути, дешифратор — это просто большой `case` с описанием того, в каком случае, какие сигналы и чему должны быть равны. Работа требует внимательности, немного усидчивости и понимания выполняемых действий. С огромной вероятностью в коде будут ошибки и их нужно будет исправлять. Ошибки это нормально — все ошибаются, а исправление ошибок дает бесценный опыт разработки. Возможно реализация этого модуля в какой-то момент покажется рутинной, но поверь, по окончании следующей лабораторной работы удовольствие от результата покажет, что оно того стоило. + +## Порядок выполнения задания + +1. Внимательно ознакомьтесь с выходными сигналами декодера и тем, за что они отвечают, а так же типами команд. В случае возникновения вопросов, проконсультируйтесь с преподавателем. +2. Реализуйте модуль `decoder_riscv`. Для этого: + 1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `decoder_riscv.sv`. + 2. Опишите в нем модуль основного дешифратора с таким же именем и портами, как указано в [задании](#задание). + 1. Для удобства дальнейшего описания модуля, рекомендуется сперва создать сигналы `opcode`, `func3`, `func7` и присвоить им соответствующие биты входного сигнала инструкции. + 2. При описании модуля вы можете воспользоваться параметрами, объявленными в файле **пакете** `riscv_pkg`, описанном в файле [riscv_pkg.sv](riscv_pkg.sv). + 3. Модуль может быть описан множеством способов: каждый выходной сигнал может быть описан через собственную комбинационную логику в отдельном блоке `case`, однако проще всего будет описать все сигналы через вложенные `case` внутри одного блока `always_comb`. + 4. Внутри блока `always_comb` до начала блока `case` можно указать базовые значения для всех выходных сигналов. Это не то же самое, что вариант `default` в блоке `case`. Здесь вы можете описать состояния, которые будут использованы чаще всего, и в этом случае, присваивание сигналу будет выполняться только в том месте, где появится инструкция, требующая значение этого сигнала, отличное от базового. + 5. Далее вы можете описать базовый блок `case`, где будет определен тип операции по ее коду. + 6. Определив тип операции, вы сможете определить какая конкретно операция по полям `func3` и `func7` (если данный тип имеет такие поля). + 7. Не забывайте, что в случае, если на каком-то из этапов (определения типа, или определения конкретной операции) вам приходит какое-то неправильное поле, необходимо выставить сигнал `illegal_instr_o`. + 8. В случае некорректной инструкции, вы должны гарантировать, что не произойдет условный/безусловный переход, а во внешнюю память и регистровый файл ничего не запишется. Не важно, что будет выполняться на АЛУ, не важно какие данные будут выбраны на мультиплексоре источника записи. Важно чтобы не произошел сам факт записи в любое из устройств (подумайте какие значения для каких сигналов необходимо для этого выставить). +3. После описания модуля, его необходимо проверить с помощью тестового окружения. + 1. Тестовое окружение находится [`здесь`](tb_decoder_riscv.sv). + 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). + 3. Перед запуском симуляции убедитесь, что выбран правильный модуль верхнего уровня. + 4. **Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста!** + 5. Вполне возможно, что после первого запуска вы столкнетесь с сообщениями о множестве ошибок. Вам необходимо [исследовать](../../Vivado%20Basics/Debug%20manual.md) эти ошибки на временной диаграмме и исправить их в вашем модуле. +4. Добавьте в проект модуль верхнего уровня ([nexys_decoder.v](board%20files/nexys_decoder.v)), соединяющий основной дешифратор с периферией в ПЛИС. Описание работы модуля находится [здесь](board%20files). +5. Подключите к проекту файл ограничений ([nexys_a7_100t.xdc](board%20files/nexys_a7_100t.xdc)), если тот еще не был подключен, либо замените его содержимое данными из файла к этой лабораторной работе. +6. Проверьте работу декодера в ПЛИС. diff --git a/Labs/05. Main decoder/riscv_pkg.sv b/Labs/05. Main decoder/riscv_pkg.sv new file mode 100644 index 0000000..ec80b81 --- /dev/null +++ b/Labs/05. Main decoder/riscv_pkg.sv @@ -0,0 +1,41 @@ +package riscv_pkg; + + import alu_opcodes_pkg::*; + +// opcodes +parameter LOAD_OPCODE = 5'b00_000; +parameter MISC_MEM_OPCODE = 5'b00_011; +parameter OP_IMM_OPCODE = 5'b00_100; +parameter AUIPC_OPCODE = 5'b00_101; +parameter STORE_OPCODE = 5'b01_000; +parameter OP_OPCODE = 5'b01_100; +parameter LUI_OPCODE = 5'b01_101; +parameter BRANCH_OPCODE = 5'b11_000; +parameter JALR_OPCODE = 5'b11_001; +parameter JAL_OPCODE = 5'b11_011; +parameter SYSTEM_OPCODE = 5'b11_100; + +// dmem type load store +parameter LDST_B = 3'b000; +parameter LDST_H = 3'b001; +parameter LDST_W = 3'b010; +parameter LDST_BU = 3'b100; +parameter LDST_HU = 3'b101; + +// operand a selection +parameter OP_A_RS1 = 2'b00; +parameter OP_A_CURR_PC = 2'b01; +parameter OP_A_ZERO = 2'b10; + +// operand b selection +parameter OP_B_RS2 = 3'b000; +parameter OP_B_IMM_I = 3'b001; +parameter OP_B_IMM_U = 3'b010; +parameter OP_B_IMM_S = 3'b011; +parameter OP_B_INCR = 3'b100; + +// writeback source selection +parameter WB_EX_RESULT = 1'b0; +parameter WB_LSU_DATA = 1'b1; + +endpackage \ No newline at end of file diff --git a/Labs/05. Main decoder/tb_decoder_riscv.sv b/Labs/05. Main decoder/tb_decoder_riscv.sv new file mode 100644 index 0000000..85bdab8 --- /dev/null +++ b/Labs/05. Main decoder/tb_decoder_riscv.sv @@ -0,0 +1,966 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_decoder_riscv +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for decoder riscv +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +import riscv_pkg::*; + +module tb_decoder_riscv(); + + parameter delay = 4; + parameter cycle = 200; // per one opcode + + reg [31:0] instr; + wire [1:0] a_sel; + wire [2:0] b_sel; + wire [ALU_OP_WIDTH-1:0] alu_op; + wire mem_req; + wire mem_we; + wire [2:0] mem_size; + wire gpr_we_a; + wire wb_src_sel; + wire illegal_instr; + wire branch; + wire jal; + wire jalr; + + reg [1:0] a_sel_miss; + reg [2:0] b_sel_miss; + reg [ALU_OP_WIDTH-1:0] alu_op_miss; + reg mem_req_miss; + reg mem_we_miss; + reg [2:0] mem_size_miss; + reg gpr_we_a_miss; + reg wb_src_sel_miss; + reg illegal_miss; + reg branch_miss; + reg jal_miss; + reg jalr_miss; + + string opcode_type; + string instr_type; + + decoder_riscv dut ( + .fetched_instr_i (instr), + .a_sel_o (a_sel), + .b_sel_o (b_sel), + .alu_op_o (alu_op), + .mem_req_o (mem_req), + .mem_we_o (mem_we), + .mem_size_o (mem_size), + .gpr_we_a_o (gpr_we_a), + .wb_src_sel_o (wb_src_sel), + .illegal_instr_o (illegal_instr), + .branch_o (branch), + .jal_o (jal), + .jalr_o (jalr) + ); + + decoder_riscv_ref grm(.fetched_instr_i (instr)); + + wire [4:0] opcode; + assign opcode = instr[6:2]; + + always @(*) begin + case (opcode) + LUI_OPCODE, AUIPC_OPCODE, JAL_OPCODE: + instr_type = $sformatf("%020b %05b %07b ", instr[31:12], instr[11:7], instr[6:0]); + JALR_OPCODE, LOAD_OPCODE, OP_IMM_OPCODE, SYSTEM_OPCODE: + instr_type = $sformatf("%012b %05b %03b %05b %07b ", instr[31:20], instr[19:15], instr[14:12], instr[11:7], instr[6:0]); + BRANCH_OPCODE, STORE_OPCODE, OP_OPCODE: + instr_type = $sformatf("%07b %05b %05b %03b %05b %07b", instr[31:25], instr[24:20], instr[19:15], instr[14:12], instr[11:7], instr[6:0]); + MISC_MEM_OPCODE: + instr_type = $sformatf("%017b %03b %05b %07b ", instr[31:15], instr[14:12], instr[11:7], instr[6:0]); + default: + instr_type = $sformatf("%032b ", instr); + endcase + end + + always @(*) begin + a_sel_miss = 'b0; + b_sel_miss = 'b0; + alu_op_miss = 'b0; + mem_req_miss = 'b0; + mem_we_miss = 'b0; + mem_size_miss = 'b0; + gpr_we_a_miss = 'b0; + wb_src_sel_miss = 'b0; + illegal_miss = 'b0; + branch_miss = 'b0; + jal_miss = 'b0; + jalr_miss = 'b0; + case (opcode) + LOAD_OPCODE, STORE_OPCODE: + begin + a_sel_miss = (grm.ex_op_a_sel_o !== a_sel) & !illegal_instr; + b_sel_miss = (grm.ex_op_b_sel_o !== b_sel) & !illegal_instr; + alu_op_miss = (grm.alu_op_o !== alu_op) & !illegal_instr; + mem_req_miss = grm.mem_req_o !== mem_req; + mem_we_miss = grm.mem_we_o !== mem_we; + mem_size_miss = (grm.mem_size_o !== mem_size) & !illegal_instr; + gpr_we_a_miss = grm.gpr_we_a_o !== gpr_we_a; + wb_src_sel_miss = (grm.wb_src_sel_o !== wb_src_sel) & !illegal_instr; + illegal_miss = grm.illegal_instr_o !== illegal_instr; + branch_miss = grm.branch_o !== branch; + jal_miss = grm.jal_o !== jal; + jalr_miss = grm.jalr_o !== jalr; + end + + JAL_OPCODE, JALR_OPCODE, + AUIPC_OPCODE, + OP_IMM_OPCODE, OP_OPCODE: + begin + a_sel_miss = (grm.ex_op_a_sel_o !== a_sel) & !illegal_instr; + b_sel_miss = (grm.ex_op_b_sel_o !== b_sel) & !illegal_instr; + alu_op_miss = (grm.alu_op_o !== alu_op) & !illegal_instr; + mem_req_miss = grm.mem_req_o !== mem_req; + mem_we_miss = grm.mem_we_o !== mem_we; + //mem_size_miss = (grm.mem_size_o !== mem_size) & !illegal_instr; + gpr_we_a_miss = grm.gpr_we_a_o !== gpr_we_a; + wb_src_sel_miss = (grm.wb_src_sel_o !== wb_src_sel) & !illegal_instr; + illegal_miss = grm.illegal_instr_o !== illegal_instr; + branch_miss = grm.branch_o !== branch; + jal_miss = grm.jal_o !== jal; + jalr_miss = grm.jalr_o !== jalr; + end + + BRANCH_OPCODE: + begin + a_sel_miss = (grm.ex_op_a_sel_o !== a_sel) & !illegal_instr; + b_sel_miss = (grm.ex_op_b_sel_o !== b_sel) & !illegal_instr; + alu_op_miss = (grm.alu_op_o !== alu_op) & !illegal_instr; + mem_req_miss = grm.mem_req_o !== mem_req; + mem_we_miss = grm.mem_we_o !== mem_we; + //mem_size_miss = (grm.mem_size_o !== mem_size) & !illegal_instr; + gpr_we_a_miss = grm.gpr_we_a_o !== gpr_we_a; + //wb_src_sel_miss = (grm.wb_src_sel_o !== wb_src_sel) & !illegal_instr; + illegal_miss = grm.illegal_instr_o !== illegal_instr; + branch_miss = grm.branch_o !== branch; + jal_miss = grm.jal_o !== jal; + jalr_miss = grm.jalr_o !== jalr; + end + + LUI_OPCODE: begin + a_sel_miss = (grm.ex_op_a_sel_o !== a_sel) & !illegal_instr; + b_sel_miss = (grm.ex_op_b_sel_o !== b_sel) & !illegal_instr; + alu_op_miss = ((alu_op !== ALU_ADD)&(alu_op !== ALU_XOR)&(alu_op !== ALU_OR)) & !illegal_instr; + mem_req_miss = grm.mem_req_o !== mem_req; + mem_we_miss = grm.mem_we_o !== mem_we; + //mem_size_miss = (grm.mem_size_o !== mem_size) & !illegal_instr; + gpr_we_a_miss = grm.gpr_we_a_o !== gpr_we_a; + wb_src_sel_miss = (grm.wb_src_sel_o !== wb_src_sel) & !illegal_instr; + illegal_miss = grm.illegal_instr_o !== illegal_instr; + branch_miss = grm.branch_o !== branch; + jal_miss = grm.jal_o !== jal; + jalr_miss = grm.jalr_o !== jalr; + end + + default: //MISC_MEM_OPCODE, SYSTEM_OPCODE and other + begin + //a_sel_miss = grm.ex_op_a_sel_o !== a_sel; + //b_sel_miss = grm.ex_op_b_sel_o !== b_sel; + //alu_op_miss = grm.alu_op_o !== alu_op; + mem_req_miss = grm.mem_req_o !== mem_req; + mem_we_miss = grm.mem_we_o !== mem_we; + //mem_size_miss = grm.mem_size_o !== mem_size; + gpr_we_a_miss = grm.gpr_we_a_o !== gpr_we_a; + //wb_src_sel_miss = grm.wb_src_sel_o !== wb_src_sel; + illegal_miss = grm.illegal_instr_o !== illegal_instr; + branch_miss = grm.branch_o !== branch; + jal_miss = grm.jal_o !== jal; + jalr_miss = grm.jalr_o !== jalr; + end + endcase + end + + reg [4:0] X; + reg [$clog2(cycle+1)-1:0] V; + integer error; + + initial begin + $timeformat(-9, 2, " ns", 3); + error = 0; + end + + initial begin + $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); + + for (V=0; V + Пример такого редактирования +В VSCode дополнительные курсоры создаются либо через `alt+ЛКМ`, либо через `alt+ctrl+UP`, `alt+ctrl+DOWN`. Vivado так же поддерживает множественные курсоры (проведя мышью с зажатой ЛКМ вдоль нужных строк при зажатой клавише `Ctrl`). + +![Пример создания и использования множественных курсоров](../../../technical/Other/Pic/multicursor_edit_example.gif) + + + +Напишем простую программу, которая использует все типы инструкций для проверки нашего процессора. Сначала напишем программу на ассемблере: + +```assembly +00: addi x1, x0, 0x75С +04: addi x2, x0, 0x8A7 +08: add x3, x1, x2 +0C: and x4, x1, x2 +10: sub x5, x4, x3 +14: mul x6, x3, x4 // неподдерживаемая инструкция +18: jal x15, jlr +1C: jalr x15, 0x0(x6) +20: slli x7, x5, 31 +24: srai x8, x7, 1 +28: srli x9, x8, 29 +2C: sw x1, 0x0(x5) +30: lw x10, 0x0(x5) +34: lui x11, 0xFFF80 +38: auipc x12, 0x00004 +3C: bne x3, x4, 0x04 +40: jal x13, 0x00004 +44: jalr x14, 0x0(x13) +48: jalr x15, 0x4(x15) +``` + +Теперь в соответствии с кодировкой инструкций переведем программу в машинные коды: + +```text +00: 011101011100 00000 000 00001 0010011 +04: 100010100111 00000 000 00010 0010011 +08: 0000000 00001 00010 000 00011 0110011 +0C: 0000000 00001 00010 111 00100 0110011 +10: 0100000 00011 00100 000 00101 0110011 +14: 0000001 00011 00100 000 00110 0110011 +18: 00000011000000000000 01111 1101111 +1C: 000000000000 00110 000 01111 1100111 +20: 0000000 11111 00101 001 00111 0010011 +24: 0100000 00001 00111 101 01000 0010011 +28: 0000000 11101 01000 101 01001 0010011 +2C: 0000000 00001 00101 010 00000 0100011 +30: 000000000000 00101 010 01010 0000011 +34: 11111111111110000000 01011 0110111 +38: 00000000000000000100 01100 0010111 +3C: 0000000 00011 00100 001 00100 1100011 +40: 00000000010000000000 01101 1101111 +44: 000000000000 01101 000 01110 1100111 +48: 000000000100 01111 000 01111 1100111 +``` + +Данная программа, представленная в шестнадцатиричном формате находится в файле [program.txt](program.txt). + +## Порядок выполнения задания + +1. Внимательно ознакомьтесь микроархитектурной реализацией. В случае возникновения вопросов, проконсультируйтесь с преподавателем. +2. Реализуйте модуль `riscv_core`. Для этого: + 1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemSystemVerilog`-файл `riscv_core.sv`. + 2. Опишите в нем модуль процессор `riscv_core` с таким же именем и портами, как указано в [задании](#задание). + 1. Процесс реализации модуля очень похож на процесс описания модуля cybercobra, однако теперь появляется: + 1. декодер + 2. дополнительные мультиплексоры и знакорасширители. + 3. Создайте в проекте новый `SystemSystemVerilog`-файл `riscv_unit.sv` и опишите в нем модуль `riscv_unit`, объединяющий ядро процессора (`riscv_core`) с памятями инструкция и данных. +3. После описания модуля, его необходимо проверить с помощью тестового окружения. + 1. Тестовое окружение находится [`здесь`](tb_riscv_unit.sv). + 2. Программа, которой необходимо проинициализировать память инструкций находится [`здесь`](program.txt). + 3. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). + 4. Перед запуском симуляции убедитесь, что выбран правильный модуль верхнего уровня. + 5. **Во время симуляции убедитесь, что в логе есть сообщение о завершении теста!** + 6. Вполне возможно, что после первого запуска вы столкнетесь с сообщениями о множестве ошибок. Вам необходимо [исследовать](../../Vivado%20Basics/Debug%20manual.md) эти ошибки на временной диаграмме и исправить их в вашем модуле. +4. Добавьте в проект модуль верхнего уровня ([nexys_riscv_unit.sv](board%20files/nexys_riscv_unit.sv)), соединяющий основной ваш процессор с периферией в ПЛИС. Описание работы модуля находится [здесь](board%20files). +5. Подключите к проекту файл ограничений ([nexys_a7_100t.xdc](board%20files/nexys_a7_100t.xdc)), если тот еще не был подключен, либо замените его содержимое данными из файла к этой лабораторной работе. +6. Проверьте работу процессора в ПЛИС. + +--- + +
+ Прочти меня, когда выполнишь. + Поздравляю, ты сделал(а) свой первый взрослый процессор! Теперь ты можешь говорить: + + >Я способен(на) на всё! Я сам(а) полностью, с нуля, сделал(а) процессор с архитектурой RISC-V! Что? Не знаешь, что такое архитектура? Пф, щегол! Подрастешь – узнаешь + +
diff --git a/Labs/06. Datapath/board files/README.md b/Labs/06. Datapath/board files/README.md new file mode 100644 index 0000000..a13334f --- /dev/null +++ b/Labs/06. Datapath/board files/README.md @@ -0,0 +1,5 @@ +# Проверка работы riscv_unit на ПЛИС + +Если вы не понимаете, что лежит в этой папке, или если надо вспомнить, как прошить ПЛИС, можно воспользоваться [`этой инструкцией`](../../../Vivado%20Basics/Program%20nexys%20a7.md) + +Файл [`nexys_riscv_unit.v`](nexys_riscv_unit.v), который нужно запускать с [`демонстрационным файлом инструкций`](../data_path.txt), является демонстрацией работы вашего ядра, каждое нажатие на BTND формирует тактовый импульс, впоследствии пошагово переходя по инструкциям, которые в свою очередь отображаются на семисегментных индикаторах. diff --git a/Labs/06. Datapath/board files/nexys_a7_100t.xdc b/Labs/06. Datapath/board files/nexys_a7_100t.xdc new file mode 100644 index 0000000..c5553ce --- /dev/null +++ b/Labs/06. Datapath/board files/nexys_a7_100t.xdc @@ -0,0 +1,211 @@ +## This file is a general .xdc for the Nexys A7-100T +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +# Clock signal +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100 }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK100}]; + + +#Switches +#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +#set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { SW[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +#set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { SW[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +#set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { SW[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +#set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { SW[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +#set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { SW[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +#set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { SW[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +#set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { SW[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +#set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { SW[8] }]; #IO_L24N_T3_34 Sch=sw[8] +#set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { SW[9] }]; #IO_25_34 Sch=sw[9] +#set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { SW[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +#set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { SW[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +#set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { SW[12] }]; #IO_L24P_T3_35 Sch=sw[12] +#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { SW[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +#set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { SW[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + +### LEDs +#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { LED[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { LED[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { LED[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { LED[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { LED[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { LED[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { LED[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { LED[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { LED[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { LED[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { LED[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { LED[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +### RGB LEDs +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { LED17_B }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { LED17_G }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED17_R }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + +##7 segment display +set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { CA }]; #IO_L24N_T3_A00_D16_14 Sch=ca +set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { CB }]; #IO_25_14 Sch=cb +set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { CC }]; #IO_25_15 Sch=cc +set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { CD }]; #IO_L17P_T2_A26_15 Sch=cd +set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { CE }]; #IO_L13P_T2_MRCC_14 Sch=ce +set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { CF }]; #IO_L19P_T3_A10_D26_14 Sch=cf +set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { CG }]; #IO_L4P_T0_D04_14 Sch=cg +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp +set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { AN[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { AN[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { AN[6] }]; #IO_L23P_T3_35 Sch=an[6] +set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + +##Buttons +set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn +#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc +#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu +#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl +#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { BTNR }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers +##Pmod Header JA +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { JA[1] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { JA[2] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { JA[3] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { JA[4] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { JA[7] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { JA[8] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { JA[9] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { JA[10] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + +##Pmod Header JB +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { JB[1] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { JB[2] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { JB[3] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { JB[4] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { JB[7] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { JB[8] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { JB[9] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { JB[10] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + +##Pmod Header JC +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { JC[1] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { JC[2] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { JC[3] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { JC[4] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { JC[7] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { JC[8] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { JC[9] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { JC[10] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + +##Pmod Header JD +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { JD[1] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { JD[2] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { JD[3] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { JD[4] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { JD[7] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { JD[8] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { JD[9] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { JD[10] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + +##Pmod Header JXADC +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVCMOS33 } [get_ports { XA_N[1] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVCMOS33 } [get_ports { XA_P[1] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { XA_N[2] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { XA_P[2] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { XA_N[3] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVCMOS33 } [get_ports { XA_P[3] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { XA_N[4] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { XA_P[4] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + +##VGA Connector +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { VGA_HS }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { VGA_VS }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { SD_RESET }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { SD_CD }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { SD_SCK }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { SD_CMD }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + +##Accelerometer +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { ACL_MISO }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { ACL_MOSI }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { ACL_SCLK }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { ACL_CSN }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + +##Temperature Sensor +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { TMP_SCL }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { TMP_SDA }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { TMP_INT }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { TMP_CT }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { M_CLK }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { M_DATA }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel + +##PWM Audio Amplifier +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { AUD_SD }]; #IO_L6P_T0_15 Sch=aud_sd + +##USB-RS232 Interface +#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { UART_TXD_IN }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { UART_RXD_OUT }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { UART_CTS }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { UART_RTS }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { PS2_CLK }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { PS2_DATA }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + +##SMSC Ethernet PHY +#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDC }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDIO }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { ETH_RSTN }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { ETH_CRSDV }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv +#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXERR }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXEN }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { ETH_REFCLK }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { ETH_INTN }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + +##Quad SPI Flash +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn \ No newline at end of file diff --git a/Labs/06. Datapath/board files/nexys_riscv_unit.sv b/Labs/06. Datapath/board files/nexys_riscv_unit.sv new file mode 100644 index 0000000..7049f9a --- /dev/null +++ b/Labs/06. Datapath/board files/nexys_riscv_unit.sv @@ -0,0 +1,148 @@ +`timescale 1ns / 1ps + +module nexys_riscv_unit( + input CLK100, + input resetn, + input BTND, + output CA, CB, CC, CD, CE, CF, CG, + output [7:0] AN + ); + + riscv_unit unit( + .clk_i(btn), + .rst_i(!resetn) + ); + + wire [31:0] instr_addr; + wire [31:0] instr; + reg btn; + + assign instr_addr = unit.instr_addr; + assign instr = unit.instr; + + localparam pwm = 1000; + reg [9:0] counter; + reg [7:0] semseg; + reg [7:0] ANreg; + reg CAr, CBr, CCr, CDr, CEr, CFr, CGr; + + assign AN[7:0] = ANreg[7:0]; + assign {CA, CB, CC, CD, CE, CF, CG} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr}; + + + always @(posedge CLK100) begin + if (!resetn) begin + counter <= 'b0; + ANreg[7:0] <= 8'b11111111; + {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; + btn <= BTND; + end + else begin + btn <= BTND; + if (counter < pwm) counter = counter + 'b1; + else begin + counter = 'b0; + ANreg[1] <= ANreg[0]; + ANreg[2] <= ANreg[1]; + ANreg[3] <= ANreg[2]; + ANreg[4] <= ANreg[3]; + ANreg[5] <= ANreg[4]; + ANreg[6] <= ANreg[5]; + ANreg[7] <= ANreg[6]; + ANreg[0] <= !(ANreg[6:0] == 7'b1111111); + end + if(|(~ANreg[5:4])) begin + case (1'b0) + ANreg[4]: semseg <= instr_addr[3:0]; + ANreg[5]: semseg <= instr_addr[7:4]; + endcase + case (semseg) + 4'h0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; + 4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001111; + 4'h2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010; + 4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110; + 4'h4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100; + 4'h5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100; + 4'h6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000; + 4'h7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111; + 4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000; + 4'h9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100; + 4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; + 4'hB: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000; + 4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001; + 4'hD: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010; + 4'hE: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000; + 4'hF: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0111000; + default: {CAr,CBr,CCr,CDr, CEr, CFr, CGr} <= 7'b0111111; + endcase + end else begin + case (1'b0) + ANreg[7]: begin + {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0011000; + end + ANreg[6]: begin + {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001; + end + ANreg[3]: begin + case(instr[6:2]) + 5'b01101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; //LUI - + 5'b00101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //AUIP A + 5'b11011:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; //JAL - + 5'b11001:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000111; //JALR J + 5'b11000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000; //brch b + 5'b00000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //LOAd L + 5'b01000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100; //STOr S + 5'b00100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //OPIM O + 5'b01100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; //OP - + default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111001; //ILLE I + endcase + end + ANreg[2]: begin + case(instr[6:2]) + 5'b01101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //LUI L + 5'b00101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000001; //AUIP U + 5'b11011:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000111; //JAL J + 5'b11001:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //JALR A + 5'b11000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111010; //brch r + 5'b00000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //LOAd O + 5'b01000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110000; //StOr t + 5'b00100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0011000; //OPIM P + 5'b01100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; //OP - + default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //ILLE L + endcase + end + ANreg[1]: begin + case(instr[6:2]) + 5'b01101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000001; //LUI U + 5'b00101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111001; //AUIP I + 5'b11011:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //JAL A + 5'b11001:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //JALR L + 5'b11000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110010; //brch c + 5'b00000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //LOAd A + 5'b01000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //STOr O + 5'b00100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111001; //OPIM I + 5'b01100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //OP O + default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //ILLE L + endcase + end + ANreg[0]: begin + case(instr[6:2]) + 5'b01101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111001; //LUI I + 5'b00101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0011000; //AUIP P + 5'b11011:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //JAL L + 5'b11001:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111010; //JALr r + 5'b11000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1101000; //brch h + 5'b00000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010; //LOAd d + 5'b01000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111010; //STOr r + 5'b00100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0101010; //OPIM M + 5'b01100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0011000; //OP P + default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000; //ILLE E + endcase + end + endcase + end + end + + end + +endmodule diff --git a/Labs/06. Datapath/program.txt b/Labs/06. Datapath/program.txt new file mode 100644 index 0000000..34e7d4b --- /dev/null +++ b/Labs/06. Datapath/program.txt @@ -0,0 +1,76 @@ +93 +00 +c0 +75 +13 +01 +70 +8a +b3 +01 +11 +00 +33 +72 +11 +00 +b3 +02 +32 +40 +33 +83 +41 +02 +ef +07 +00 +03 +e7 +07 +03 +00 +93 +93 +f2 +01 +13 +d4 +13 +40 +93 +54 +d4 +01 +23 +a0 +12 +00 +03 +a5 +02 +00 +b7 +05 +f8 +ff +17 +46 +00 +00 +63 +92 +41 +00 +ef +06 +40 +00 +67 +87 +06 +00 +e7 +87 +47 +00 diff --git a/Labs/06. Datapath/tb_riscv_unit.sv b/Labs/06. Datapath/tb_riscv_unit.sv new file mode 100644 index 0000000..0266a59 --- /dev/null +++ b/Labs/06. Datapath/tb_riscv_unit.sv @@ -0,0 +1,51 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_riscv_unit +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for datapath +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_riscv_unit(); + + reg clk; + reg rst; + + riscv_unit unit( + .clk_i(clk), + .rst_i(rst) + ); + + initial clk = 0; + always #10 clk = ~clk; + initial begin + $display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop(); + rst = 1; + #20; + rst = 0; + #500; + $display("\n The test is over \n See the internal signals of the module on the waveform \n"); + $finish; + end + +stall: assert property ( + @(posedge clk) + disable iff ( rst ) + (top.mem_req) |-> (top.stall) |-> ##1 (!top.stall & top.mem_req) + +)else $error("\n================================================\nThe realisation of the STALL signal is INCORRECT\n================================================\n"); + +endmodule diff --git a/Labs/07. Load-store unit/README.md b/Labs/07. Load-store unit/README.md new file mode 100644 index 0000000..124a35e --- /dev/null +++ b/Labs/07. Load-store unit/README.md @@ -0,0 +1,25 @@ +# Лабораторная работа 5 "Блок загрузки и сохранения" + +## Цель + +-- + +## Ход работы + +-- + +## Теория + +== + +## Практика + +-- + +## Задание + +-- + +### Порядок выполнения задания + +-- \ No newline at end of file diff --git a/Labs/07. Load-store unit/miriscv_ram.sv b/Labs/07. Load-store unit/miriscv_ram.sv new file mode 100644 index 0000000..edcf9a8 --- /dev/null +++ b/Labs/07. Load-store unit/miriscv_ram.sv @@ -0,0 +1,65 @@ +module miriscv_ram +#( + parameter RAM_SIZE = 256, // bytes + parameter RAM_INIT_FILE = "" +) +( + // clock, reset + input clk_i, + input rst_n_i, + + // instruction memory interface + output logic [31:0] instr_rdata_o, + input [31:0] instr_addr_i, + + // data memory interface + output logic [31:0] data_rdata_o, + input data_req_i, + input data_we_i, + input [3:0] data_be_i, + input [31:0] data_addr_i, + input [31:0] data_wdata_i +); + + reg [31:0] mem [0:RAM_SIZE/4-1]; + reg [31:0] data_int; + + //Init RAM + integer ram_index; + + initial begin + if(RAM_INIT_FILE != "") + $readmemh(RAM_INIT_FILE, mem); + else + for (ram_index = 0; ram_index < RAM_SIZE/4-1; ram_index = ram_index + 1) + mem[ram_index] = {32{1'b0}}; + end + + + //Instruction port + assign instr_rdata_o = mem[(instr_addr_i % RAM_SIZE) / 4]; + + always@(posedge clk_i) begin + if(!rst_n_i) begin + data_rdata_o <= 32'b0; + end + else if(data_req_i) begin + data_rdata_o <= mem[(data_addr_i % RAM_SIZE) / 4]; + + if(data_we_i && data_be_i[0]) + mem [data_addr_i[31:2]] [7:0] <= data_wdata_i[7:0]; + + if(data_we_i && data_be_i[1]) + mem [data_addr_i[31:2]] [15:8] <= data_wdata_i[15:8]; + + if(data_we_i && data_be_i[2]) + mem [data_addr_i[31:2]] [23:16] <= data_wdata_i[23:16]; + + if(data_we_i && data_be_i[3]) + mem [data_addr_i[31:2]] [31:24] <= data_wdata_i[31:24]; + + end + end + + +endmodule diff --git a/Labs/07. Load-store unit/miriscv_top.sv b/Labs/07. Load-store unit/miriscv_top.sv new file mode 100644 index 0000000..5b9aa01 --- /dev/null +++ b/Labs/07. Load-store unit/miriscv_top.sv @@ -0,0 +1,74 @@ +module miriscv_top +#( + parameter RAM_SIZE = 256, // bytes + parameter RAM_INIT_FILE = "" +) +( + // clock, reset + input clk_i, + input rst_n_i +); + + logic [31:0] instr_rdata_core; + logic [31:0] instr_addr_core; + + logic [31:0] data_rdata_core; + logic data_req_core; + logic data_we_core; + logic [3:0] data_be_core; + logic [31:0] data_addr_core; + logic [31:0] data_wdata_core; + + logic [31:0] data_rdata_ram; + logic data_req_ram; + logic data_we_ram; + logic [3:0] data_be_ram; + logic [31:0] data_addr_ram; + logic [31:0] data_wdata_ram; + + logic data_mem_valid; + assign data_mem_valid = (data_addr_core >= RAM_SIZE) ? 1'b0 : 1'b1; + + assign data_rdata_core = (data_mem_valid) ? data_rdata_ram : 1'b0; + assign data_req_ram = (data_mem_valid) ? data_req_core : 1'b0; + assign data_we_ram = data_we_core; + assign data_be_ram = data_be_core; + assign data_addr_ram = data_addr_core; + assign data_wdata_ram = data_wdata_core; + + miriscv_core core ( + .clk_i ( clk_i ), + .arstn_i ( rst_n_i ), + + .instr_rdata_i ( instr_rdata_core ), + .instr_addr_o ( instr_addr_core ), + + .data_rdata_i ( data_rdata_core ), + .data_req_o ( data_req_core ), + .data_we_o ( data_we_core ), + .data_be_o ( data_be_core ), + .data_addr_o ( data_addr_core ), + .data_wdata_o ( data_wdata_core ) + ); + + miriscv_ram + #( + .RAM_SIZE (RAM_SIZE), + .RAM_INIT_FILE (RAM_INIT_FILE) + ) ram ( + .clk_i ( clk_i ), + .rst_n_i ( rst_n_i ), + + .instr_rdata_o ( instr_rdata_core ), + .instr_addr_i ( instr_addr_core ), + + .data_rdata_o ( data_rdata_ram ), + .data_req_i ( data_req_ram ), + .data_we_i ( data_we_ram ), + .data_be_i ( data_be_ram ), + .data_addr_i ( data_addr_ram ), + .data_wdata_i ( data_wdata_ram ) + ); + + +endmodule diff --git a/Labs/07. Load-store unit/tb_miriscv_top.v b/Labs/07. Load-store unit/tb_miriscv_top.v new file mode 100644 index 0000000..810ec09 --- /dev/null +++ b/Labs/07. Load-store unit/tb_miriscv_top.v @@ -0,0 +1,33 @@ +`timescale 1ns / 1ps + +module tb_miriscv_top(); + + parameter HF_CYCLE = 2.5; // 200 MHz clock + parameter RST_WAIT = 10; // 10 ns reset + parameter RAM_SIZE = 512; // in 32-bit words + + // clock, reset + reg clk; + reg rst_n; + + miriscv_top #( + .RAM_SIZE ( RAM_SIZE ), + .RAM_INIT_FILE ( "program_sort.dat" ) + ) dut ( + .clk_i ( clk ), + .rst_n_i ( rst_n ) + ); + + initial begin + clk = 1'b0; + rst_n = 1'b0; + #RST_WAIT; + rst_n = 1'b1; + end + + always begin + #HF_CYCLE; + clk = ~clk; + end + +endmodule diff --git a/Labs/07. Load-store unit/ЛР5. Блок загрузки-сохранения.pdf b/Labs/07. Load-store unit/ЛР5. Блок загрузки-сохранения.pdf new file mode 100644 index 0000000..7ba33e2 Binary files /dev/null and b/Labs/07. Load-store unit/ЛР5. Блок загрузки-сохранения.pdf differ diff --git a/Labs/08. Interrupt subsystem/README.md b/Labs/08. Interrupt subsystem/README.md new file mode 100644 index 0000000..914329a --- /dev/null +++ b/Labs/08. Interrupt subsystem/README.md @@ -0,0 +1,25 @@ +# Лабораторная работа 6 "Подсистема прерывания" + +## Цель + +-- + +## Ход работы + +-- + +## Теория + +== + +## Практика + +-- + +## Задание + +-- + +### Порядок выполнения задания + +-- \ No newline at end of file diff --git a/Labs/08. Interrupt subsystem/ЛР6. Подсистема прерывания.pdf b/Labs/08. Interrupt subsystem/ЛР6. Подсистема прерывания.pdf new file mode 100644 index 0000000..b2aeaa0 Binary files /dev/null and b/Labs/08. Interrupt subsystem/ЛР6. Подсистема прерывания.pdf differ diff --git a/Labs/09. Peripheral units/PS2Receiver.v b/Labs/09. Peripheral units/PS2Receiver.v new file mode 100644 index 0000000..6137099 --- /dev/null +++ b/Labs/09. Peripheral units/PS2Receiver.v @@ -0,0 +1,95 @@ +`timescale 1ns / 1ps + +module PS2Receiver( + input clk, + input kclk, + input kdata, + output reg [15:0] keycodeout, + output keycode_valid + ); + + reg flag; + reg [3:0] flag_shift; + wire kclkf, kdataf; + reg [3:0]cnt; + + assign keycode_valid = flag_shift[0] && !flag_shift[2]; + + initial begin //for tb + cnt = 0; + keycodeout = 0; + flag_shift = 0; + flag = 0; + end + +debouncer debounce( + .clk(clk), + .I0(kclk), + .I1(kdata), + .O0(kclkf), + .O1(kdataf) +); +always@(posedge clk) begin + flag_shift <= (flag_shift << 1) + flag; +end + +always@(negedge(kclkf))begin + case(cnt) + 0:if(keycodeout != 16'hE000)keycodeout <= 0;//Start bit + 1:keycodeout[0]<=kdataf; + 2:keycodeout[1]<=kdataf; + 3:keycodeout[2]<=kdataf; + 4:keycodeout[3]<=kdataf; + 5:keycodeout[4]<=kdataf; + 6:keycodeout[5]<=kdataf; + 7:keycodeout[6]<=kdataf; + 8:keycodeout[7]<=kdataf; + //TODO ADD PARITY CHECK + 9:begin + flag<=1'b1; + if(keycodeout[7:0] == 8'hE0) begin + keycodeout <= {keycodeout[7:0], 8'd0}; + end + end + 10:flag<=1'b0; + default: cnt <= 0; + endcase + if(cnt<=9) cnt<=cnt+1; + else if(cnt==10) cnt<=0; +end + +endmodule + + +module debouncer( + input clk, + input I0, + input I1, + output reg O0, + output reg O1 + ); + + reg [4:0]cnt0, cnt1; + reg Iv0=0,Iv1=0; + reg out0, out1; + +always@(posedge(clk))begin + if (I0==Iv0)begin + if (cnt0==19)O0<=I0; + else cnt0<=cnt0+1; + end + else begin + cnt0<="00000"; + Iv0<=I0; + end + if (I1==Iv1)begin + if (cnt1==19)O1<=I1; + else cnt1<=cnt1+1; + end + else begin + cnt1<="00000"; + Iv1<=I1; + end + end + +endmodule diff --git a/Labs/09. Peripheral units/README.md b/Labs/09. Peripheral units/README.md new file mode 100644 index 0000000..68f98e3 --- /dev/null +++ b/Labs/09. Peripheral units/README.md @@ -0,0 +1,570 @@ +# Лабораторная работа 7 "Периферийные устройства" + +На прошлой лабораторной работе вы реализовали свой собственный RISC-V процессор. Однако пока что он находится "в вакууме" и никак не связан с внешним миром. Для исправления этого недостатка вами будет реализована системная шина, через которую к процессору смогут подключаться различные периферийные устройства. + +## Цель + +Интегрировать периферийные устройства в процессорную систему. + +--- + +## Допуск к лабораторной работе + +Для успешного выполнения лабораторной работы, вам необходимо: + +* ознакомиться с [примером описания модуля-контроллера](../../Basic%20Verilog%20structures/Controllers.md); +* ознакомиться с [описанием](#описание-контроллеров-периферийных-устройств) контроллеров периферийных устройств. + +## Ход работы + +1. Изучить теорию об адресном пространстве +2. Получить индивидуальный вариант со своим набором периферийных устройств +3. Интегрировать контроллеры периферийных устройств в адресное пространство вашей системы +4. Собрать финальную схему вашей системы +5. Проверить работу системы в ПЛИС с помощью демонстрационного ПО, загружаемого в память инструкций + +--- + +## Теория + +Помимо процессора и памяти, третьим ключевым элементом вычислительной системы является система ввода/вывода, обеспечивающая обмен информации между ядром вычислительной машины и периферийными устройствами. + +Любое периферийное устройство, со стороны вычислительной машины, представляется набором ячеек памяти (регистров). С помощью чтения и записи этих регистров происходит обмен информации с периферийным устройством, и управление им. Например, датчик температуры может быть реализован самыми разными способами, но для процессора он в любом случае ячейка памяти, из которой он считывает число – температуру. + +Система ввода/вывода может быть организована одним из двух способов: с **выделенным адресным пространством** устройств ввода/вывода, или с **совместным адресным пространством**. В первом случае система ввода/вывода имеет отдельную шину для подключения к процессору (и отдельные инструкции для обращения к периферии), во втором – шина для памяти и системы ввода/вывода общая (а обращение к периферии осуществляется теми же инструкциями, что и обращение к памяти). + +### Адресное пространство + +Архитектура RISC-V подразумевает использование совместного адресного пространства, это значит, что в лабораторной работе будет использована единая шина для подключения памяти и регистров управления периферийными устройствами. При обращении по одному диапазону адресов процессор будет +попадать в память, при обращении по другим – взаимодействовать с регистрами управления/статуса периферийного устройства. Например, можно разделить 32-битное адресное пространство на 256 частей, отдав старшие 8 бит адреса под указание конкретного периферийного устройства. Тогда каждое из периферийных устройств получит 24-битное адресное пространство (16 MiB). Допустим, мы распределили эти части адресного пространства в следующем порядке (от младшего диапазона адресов к старшему): + +0. Переключатели +1. Светодиоды +2. Клавиатура PS/2 +3. Семисегментные индикаторы +4. UART-приемник +5. UART-передатчик + +В таком случае, если мы захотим обратиться в четвертый регистр семисегментных индикаторов, мы должны будем использовать адрес `0x03000004`. Старшие 8 бит (`0x03`) определяют выбранное периферийное устройство, оставшиеся 24 бита определяют конкретный адрес в адресном пространстве этого устройства. + +На рисунке ниже представлен способ подключения процессора к памяти инструкций и данных, а так же 255 периферийным устройствам. + +![../../.pic/Labs/lab_09_periph/fig_01.drawio.png](../../.pic/Labs/lab_09_periph/fig_01.drawio.png) + +### Активация выбранного устройства + +В зависимости от интерфейса используемой шины, периферийные устройства либо знают какой диапазон адресов им выделен (например, в интерфейсе I²C), либо нет (интерфейс APB). В первом случае, устройство понимает что к нему обратились непосредственно по адресу в данном обращении, во втором случае — по специальному сигналу. + +На приведенной выше схеме используется второй вариант — устройство понимает, что к нему обратились по специальному сигналу `req_i`. Данный сигнал формируется из двух частей: сигнала `req` исходящего из процессорного ядра (сигнал о том, обращение в память вообще происходит) и специального сигнала-селектора исходящего из 256-разрядной шины. Формирование значения на этой шине происходит с помощью [унитарного](https://ru.wikipedia.org/wiki/Унитарный_код) ([one-hot](https://en.wikipedia.org/wiki/One-hot)) кодирования. Процесс кодирования достаточно прост. В любой момент времени на выходной шине должен быть **ровно один** бит, равный единице. Индекс этого бита совпадает со значением старших восьми бит адреса. Поскольку для восьмибитного значения существует 256 комбинаций значений, именно такая разрядность будет на выходе кодировщика. Это означает, что в данной системе можно связать процессор с 256 устройствами (одним из которых будет память данных). + +Реализация такого кодирования предельно проста: + +* Нулевой сигнал этой шины будет равен единице только если `data_addr_o[31:24] = 8'd0`. +* Первый бит этой шины будет равен единице только если `data_addr_o[31:24] = 8'd1`. +* ... +* Двести пятьдесят пятый бит шины будет равен единице только если `data_addr_o[31:24] = 8'd255`. + +Для реализации такого кодирования достаточно выполнить сдвиг влево `255'd1` на значение `data_addr_o[31:24]`. + +### Дополнительные правки модуля riscv_unit + +Ранее, для того чтобы ваши модули могли работать в ПЛИС, вам предоставлялся специальный модуль верхнего уровня, который выполнял всю работу по связи с периферией через входы и выходы ПЛИС. Поскольку в текущей лабораторной вы завершаете свою процессорную систему, она сама должна оказаться модулем верхнего уровня, а значит здесь вы должны и выполнить все подключение к периферии. + +Для этого необходимо добавить в модуль `riscv_unit` дополнительные входы и выходы, которые подключены посредством файла ограничений ([nexys_a7_100t.xdc](nexys_a7_100t.xdc)) к входам и выходам ПЛИС. + +```SystemVerilog +module riscv_unit( + input logic clk_i, + input logic resetn_i, + + // Входы и выходы периферии + input logic [15:0] sw_i, // Переключатели + output logic [15:0] led_o, // Светодиоды + input logic kclk_i, // Тактирующий сигнал клавиатуры + input logic kdata_i, // Сигнал данных клавиатуры + output logic [ 6:0] hex_led_o, // Вывод семисегментных индикаторов + output logic [ 7:0] hex_sel_o, // Селектор семисегментных индикаторов + input logic rx_i, // Линия приема по UART + output logic tx_o // Линия передачи по UART +); +//... +endmodule +``` + +Эти входы порты подключены к одноименным портам ваших контроллеров периферии (речь идет только о реализуемых вами контроллерах, остальные порты должны остаться неподключенными). + +Обратите внимание на то, что изменился сигнал сброса (`resetn_i`). Буква `n` на конце означает, что сброс работает по уровню `0` (когда сигнал равен нулю — это сброс, когда единице — не сброс). + +Помимо прочего, необходимо подключить к вашему модулю `блок делителя частоты`. Поскольку в данном курсе лабораторных работ вы выполняли реализацию однотактного процессора, инструкция должна пройти через все ваши блоки за один такт. Из-за этого критический путь вашей схемы не позволит использовать тактовый сигнал частотой в `100 МГц`, от которого работает отладочный стенд. Поэтому, необходимо создать отдельный сигнал с пониженной тактовой частотой, от которого будет работать ваша схема. + +Для этого необходимо: + +1. Подключить файл [`sys_clk_rst_gen.v`](sys_clk_rst_gen.v) в ваш проект. +2. Подключить этот модуль внутри `riscv_unit` следующим образом: + +```SystemVerilog +logic sysclk, rst; +sys_clk_rst_gen divider(.ex_clk_i(clk_i),.ex_areset_n_i(resetn_i),.div_i(10),.sys_clk_o(sysclk), .sys_reset_o(rst)); +``` + +3. После вставки данных строк в начало описания модуля `riscv_unit` вы получите тактовый сигнал `sysclk` с частотой в 10 МГц и сигнал сброса `rst` с активным уровнем `1` (как и в предыдущих лабораторных). Все ваши внутренние модули (`riscv_core`, `data_mem` и `контроллеры периферии`) должны работать от тактового сигнала `sysclk`. На модули, имеющие входной сигнал сброса (`rst_i`) необходимо подать ваш сигнал `rst`. + +--- + +## Задание + +В рамках данной лабораторной работы необходимо реализовать модули-контроллеры двух периферийных устройств, реализующих управление в соответствии с приведенной ниже картой памяти и встроить их в процессорную систему, используя используя схему приведенную выше. На карте приведено шесть периферийных устройств, вам необходимо взять только два из них в зависимости от вашего варианта индивидуального задания (ИЗ) по следующему правилу: + +1. Те кому достались варианты ИЗ 1-5 должны реализовать контроллеры переключателей и светодиодов. +2. Те кому достались варианты ИЗ 6-15 должны реализовать контроллеры клавиатуры PS/2 и семисегментных индикаторов. +3. Те кому достались варианты BP 16-29 должны реализовать контроллеры приемника и передатчика UART. + +![Карта памяти](../../.pic/Labs/riscv_periph_memory_map.png) + +Работа с картой осуществляется следующим образом. Под названием каждого периферийного устройства указана старшая часть адреса (чему должны быть равны старшие 8 бит адреса, чтобы было сформировано обращение к данному периферийному устройству). Например, для переключателей это значение равно `0x01`, для светодиодов `0x02` и т.п. +В самом левом столбце указаны используемые/неиспользуемые адреса в адресном пространстве данного периферийного устройства. Например для переключателей есть только один используемый адрес: `0x000000`. Его функциональное назначение и разрешения на доступ указаны в столбце соответствующего периферийного устройства. Возвращаясь к адресу `0x000000` для переключателей мы видим следующее: + +* (R) означает что разрешен доступ только на чтение (операция записи по этому адресу должна игнорироваться вашим контроллером). +* "Выставленное на переключателях значение" означает ровно то что и означает. Если процессор выполняет операцию чтения по адресу 0x01000000 (`0x01` (старшая часть адреса переключателей) + `0x000000` (младшая часть адреса для получения выставленного на переключателях значения) ), то контроллер должен выставить на выходной сигнал RD значение на переключателях (о том как получить это значение будет рассказано чуть позже). + +Рассмотрим еще один пример. При обращении по адресу `0x02000024` (`0x02` (старшая часть адреса контроллера светодиодов) + `0x000024` (младшая часть адреса для доступа на запись к регистру сброса) ) должна произойти запись в регистр сброса, который должен сбросить значения в регистре управления зажигаемых светодиодов и регистре управления режимом "моргания" светодиодов (подробнее о том как должны работать эти регистры будет ниже). + +Таким образом, каждый контроллер периферийного устройства должен выполнять две вещи: + +1. При получении сигнала `req_i`, записать в регистр или вернуть значение из регистра, ассоциированного с переданным адресом (адрес передается с обнуленной старшей частью). Если регистра, ассоциированного с таким адресом нет (например для переключателей не ассоциировано ни одного адреса кроме `0x000000`), игнорировать эту операцию. +2. Выполнять управление периферийным устройством с помощью управляющих регистров. + +Подробное описание периферийных устройств их управления и назначение управляющих регистров будет дано после порядка выполнения задания. + +--- + +## Порядок выполнения задания + +1. Внимательно ознакомьтесь с [примером описания модуля контроллера](../../Basic%20Verilog%20structures/Controllers.md). +2. Внимательно ознакомьтесь со спецификацией контроллеров периферии своего варианта. В случае возникновения вопросов, проконсультируйтесь с преподавателем. +3. Реализуйте модули контроллеров периферии. Имена модулей и их порты будут указаны в [описании контроллеров](#описание-контроллеров-периферийных-устройств). Пример разработки контроллера приведен [здесь](../../Basic%20Verilog%20structures/Controllers.md). +4. Обновите модуль `riscv_unit` в соответствии с разделом ["Дополнительные правки модуля riscv_unit"](#дополнительные-правки-модуля-riscv_unit). + 1. Подключите в проект файл `sys_clk_rst_gen.sv`. + 2. Добавьте в модуль `riscv_unit` входы и выходы периферии. + 3. Подключите к модулю `riscv_unit` модуль `sys_clk_rst_gen` скопировав приведенный фрагмент кода. + 4. Замените подключение тактового сигнала исходных подмодулей `riscv_unit` на появившийся сигнал `sysclk`. Убедитесь, что на модули имеющие сигнал сброса приходит сигнал `rst`. +5. Интегрируйте модули контроллеров периферии в процессорную систему по приведенной схеме руководствуясь старшими адресами контроллеров, представленными на карте памяти. Это означает, что если вы реализуете контроллер светодиодов, на его входов `req_i` должна подаваться единица в случае если `mem_req_o == 1` и старшие 8 бит адреса равны `0x02`. + 1. При интеграции вы должны подключить только модули-контроллеры вашего варианта. Контроллеры периферии других вариантов подключать не надо. + 2. При этом во время интеграции, вы должны использовать старшую часть адреса, представленную в карте памяти для формирования сигнала `req_i` для ваших модулей-контроллеров. + 3. Даже если вы не используете какие-то входные/выходные сигналы в модуле `riscv_unit` (например по варианту вам не достался контроллер клавиатуры и поэтому вы не используете сигналы `kclk_i` и `kdata_i`), вы все равно должны их описать во входах и выходах модуля `riscv_unit`. +6. Проинициализируйте память инструкций с помощью предоставленной для каждой пары контроллеров программы. +7. Подключите к проекту файл ограничений ([nexys_a7_100t.xdc](nexys_a7_100t.xdc)), если тот еще не был подключен, либо замените его содержимое данными из файла к этой лабораторной работе. +8. Проверьте работу вашей процессорной системы с помощью отладочного стенда с ПЛИС и (при соответствующем варианте) клавиатуры/рабочего компьютера. + 1. Обратите внимание, что в данной лабораторной уже не будет модуля верхнего уровня `nexys_...`, так как ваш модуль процессорной системы уже полностью самостоятелен и взаимодействует непосредственно с ножками ПЛИС через модули, управляемые контроллерами периферии. + +--- + +## Описание контроллеров периферийных устройств + +Для того, чтобы избежать избыточности в контексте описания контроллеров периферийных устройств будет использоваться два термина: + +1. Под "**запросом на запись** по адресу `0xАДРЕС`" будет пониматься совокупность следующих условий: + 1. Происходит восходящий фронт `clk_i`. + 2. На входе `req_i` выставлено значение `1`. + 3. На входе `write_enable_i` выставлено значение `1`. + 4. На входе `addr_i` выставлено значение `0xАДРЕС` +2. Под "**запросом на чтение** по адресу `0xАДРЕС`" будет пониматься совокупность следующих условий: + 1. На входе `req_i` выставлено значение `1`. + 2. На входе `write_enable_i` выставлено значение `0`. + 3. На входе `addr_i` выставлено значение `0xАДРЕС` + +Обратите внимание на то, что **запрос на чтение** должен обрабатываться **синхронно** (выходные данные должны выдаваться по положительному фронту `clk_i`). + +При описании поддерживаемых режимов доступа по данному адресу используется интуитивно понятное обозначение: + +* R — доступ **только на чтение**; +* W — доступ **только на запись**; +* RW — доступ на **чтение и запись**. + +В случае отсутствия **запроса на чтения**, на выход `read_data_o` должно подаваться значение `32'hfa11_1eaf`. Это никак не повлияет на работу процессора, но будет удобно в процессе отладки на временной диаграмме (тоже самое было сделано в процессе разработки памяти данных). + +Если пришел **запрос на запись** или **чтение**, это еще не значит, что контроллер должен его выполнить. В случае, если запрос происходит по адресу, не поддерживающему этот запрос (например **запрос на запись** по адресу поддерживающему только чтение или наоборот), данный запрос должен игнорироваться, а на выходе `read_data_o` должно появиться значение `32'hdead_beef`. + +К примеру, в случае запроса на чтение по адресу `0x0100004` (четвертый байт в адресном пространстве периферийного устройства "переключатели"), на выходе `read_data_o` должно оказаться значение `32'hdead_beef`. В случае отсутствия запроса на чтение (`req_i == 0` или `write_enable_i == 1`), на выходе `read_data_o` контроллера переключателей должно оказаться значение `32'hfa11_1eaf`. + +В случае осуществления записи по принятому запросу, необходимо записать данные с сигнала `write_data_i` в регистр, ассоциированный с адресом `addr_i` (если разрядность регистра меньше разрядности сигнала `write_data_i`, старшие биты записываемых данных отбрасываются). + +В случае осуществления чтения по принятому запросу, необходимо по положительному фронту `clk_i` выставить данные с сигнала, ассоциированного с адресом `addr_i` на выходной сигнал `read_data_o` (если разрядность сигнала меньше разрядности выходного сигнала `read_data_o`, возвращаемые данные должны дополниться нулями в старших битах). + +### Переключатели + +Переключатели являются простейшим устройством ввода на отладочном стенде `Nexys A7`. Соответственно и контроллер, осуществляющий доступ процессора к ним так же будет очень простым. Рассмотрим прототип модуля, который вам необходимо реализовать: + +```SystemVerilog +module sw_sb_ctrl( +/* + Часть интерфейса модуля, отвечающая за подключение к системной шине +*/ + input logic clk_i, + input logic rst_i + input logic req_i, + input logic write_enable_i, + input logic [31:0] addr_i, + input logic [31:0] write_data_i, // не используется, добавлен для + // совместимости с системной шиной + output logic [31:0] read_data_o, + +/* + Часть интерфейса модуля, отвечающая за подключение к периферии +*/ + input logic [15:0] sw_i +); + +endmodule +``` + +По сути, логика работы контроллера сводится к тому, выдавать на шину `read_data_o` данные со входа `sw_i` каждый раз, когда приходит **запрос на чтение** по нулевому адресу. Поскольку разрядность `sw_i` в два раза меньше разрядности выхода `read_data_o` его старшие биты необходимо дополнить нулями. + +Адресное пространство контроллера: + +|Адрес|Режим доступа| Функциональное назначение | +|-----|-------------|-------------------------------------------------| +|0x00 | R | Чтение значения, выставленного на переключателях| + +### Светодиоды + +Как и переключатели, светодиоды являются простейшим устройством вывода. Поэтому, чтобы задание было интересней, для их управления был добавлен регистр, управляющий режимом вывода данных на светодиоды. +Рассмотрим прототип модуля, который вам необходимо реализовать: + +```SystemVerilog +module led_sb_ctrl( +/* + Часть интерфейса модуля, отвечающая за подключение к системной шине +*/ + input logic clk_i, + input logic rst_i + input logic req_i, + input logic write_enable_i, + input logic [31:0] addr_i, + input logic [31:0] write_data_i, + output logic [31:0] read_data_o, + +/* + Часть интерфейса модуля, отвечающая за подключение к периферии +*/ + output logic [15:0] led_o +); + +logic [15:0] led_val; +logic led_mode; + +endmodule +``` + +Данный модуль должен выводить на выходной сигнал `led_o` данные с регистра `led_val`. Запись и чтение регистра `led_val` осуществляется по адресу `0x00`. Запись любого значения, превышающего `2¹⁶-1` должна игнорироваться. + +Регистр `led_mode` отвечает за режим вывода данных на светодиоды. Когда этот регистр равен единице, светодиоды должны "моргать" выводимым значением. Под морганием подразумевается вывод значения из регистра `led_val` на выход `led_o` на одну секунду (загорится часть светодиодов, соответствующие которым биты шины `led_o` равны единице), после чего на одну секунду выход `led_o` необходимо подать нули. Запись и чтение регистра `led_mode` осуществляется по адресу `0x04`. Запись любого значения, отличного от `0` и `1` должна игнорироваться. + +Отсчет времени можно реализовать простейшим счетчиком, каждый такт увеличивающимся на 1 и сбрасывающимся по достижении определенного значения, чтобы продолжить считать с нуля. Зная тактовую частоту, нетрудно определить до скольки должен считать счетчик. При тактовой частоте в 10 МГц происходит 10 миллионов тактов в секунду. Это означает, что при такой тактовой частоте через секунду счетчик будет равен `10⁷-1` (счет идет с нуля). + +Обратите внимание на то, что адрес `0x24` является адресом сброса. В случае записи по этому адресу единицы вы должны сбросить регистры `led_val`, `led_mode` и все вспомогательные регистры, которые вы создали. Для реализации сброса вы можете как создать отдельный регистр `led_rst`, в который будет происходить запись, а сам сброс будет происходить по появлению единицы в этом регистре (в этом случае необходимо не забыть сбрасывать и этот регистр), так и создать обычный провод, формирующий единицу в случае выполнения всех указанных условий (условий запроса на запись, адреса сброса и значения записываемых данных равному единице). + +Адресное пространство контроллера: + +|Адрес|Режим доступа|Допустимые значения| Функциональное назначение | +|-----|-------------|-------------------|-----------------------------------------------------------------------------------| +|0x00 | RW | [0:65535] | Чтение и запись в регистр `led_val` отвечающий за вывод данных на светодиоды | +|0x04 | RW | [0:1] | Чтение и запись в регистр `led_mode`, отвечающий за режим "моргания" светодиодами | +|0x24 | W | 1 | Запись сигнала сброса | + +### Клавиатура PS/2 + +Клавиатура [PS/2](https://ru.wikipedia.org/wiki/PS/2_(порт)) осуществляет передачу [скан-кодов](https://ru.wikipedia.org/wiki/Скан-код), нажатых на этой клавиатуре клавиш. + +В рамках данной лабораторной работы вам будет предоставлен модуль, осуществляющий прием данных с клавиатуры. Вам нужно написать лишь модуль, осуществляющий контроль предоставленным модулем. У предоставленного модуля будет следующий прототип: + +```SystemVerilog +module PS2Receiver( + input clk_i, // Сигнал тактирования процессора и вашего модуля-контроллера + input kclk_i, // Тактовый сигнал, приходящий с клавиатуры + input kdata_i, // Сигнал данных, приходящий с клавиатуры + output [15:0] keycode_o, // Сигнал полученного с клавиатуры скан-кода клавиши + output keycode_valid_o // Сигнал готовности данных на выходе keycodeout + ); +endmodule +``` + +Вам необходимо реализовать модуль-контроллер со следующим прототипом: + +```SystemVerilog +module ps2_sb_ctrl( +/* + Часть интерфейса модуля, отвечающая за подключение к системной шине +*/ + input logic clk_i, + input logic rst_i, + input logic [31:0] addr_i, + input logic req_i, + input logic [31:0] write_data_i, + input logic write_enable_i, + output logic [31:0] read_data_o, + +/* + Часть интерфейса модуля, отвечающая за подключение к модулю, + осуществляющему прием данных с клавиатуры +*/ + input logic kclk_i, + input logic kdata_i +); + +logic [7:0] scan_code; +logic scan_code_is_unread; + +endmodule +``` + +В первую очередь, вы должны инстанциировать модуль `PS2Receiver` внутри вашего модуля-контроллера, соединив соответствующие входы. Для подключения к выходам необходимо создать дополнительные провода. + +По каждому восходящему фронту сигнала `clk_i` вы должны проверять выход `keycode_valid_o` и если тот равен единице, записать значение с выхода `keycode_o` в регистр `scan_code`. При этом значение регистра `scan_code_is_unread` необходимо выставить в единицу. + +В случае, если произошел запрос на чтение по адресу `0x00`, необходимо выставить на выход `read_data_o` значение регистра `scan_code` (дополнив старшие биты нулями), при этом значение регистра `scan_code_is_unread` необходимо обнулить. + +В случае запроса на чтение по адресу `0x04` необходимо вернуть значение регистра `scan_code_is_unread`. + +В случае запроса на запись по адресу `0x24` со значением `1`, необходимо осуществить сброс регистров `scan_code` и `scan_code_is_unread` в `0`. + +Адресное пространство контроллера: + +|Адрес|Режим доступа|Допустимые значения| Функциональное назначение | +|-----|-------------|-------------------|-------------------------------------------------------------------------------------------------------------------| +|0x00 | R | [0:255] | Чтение из регистра `scan_code`, хранящего скан-код нажатой клавиши | +|0x04 | R | [0:1] | Чтение из регистра `scan_code_is_unread`, сообщающего о том, что есть непрочитанные данные в регистре `scan_code` | +|0x24 | W | 1 | Запись сигнала сброса | + +### Семисегментные индикаторы + +Семисегментные индикаторы позволяют выводить арабские цифры и первые шесть букв латинского алфавита, тем самым позволяя отображать шестнадцатиричные цифры. На отладочном стенде `Nexys A7` размещено восемь семисегментных индикаторов. Для вывода цифр на эти индикаторы, вам будет предоставлен модуль `hex_digits`, вам нужно лишь написать модуль, осуществляющий контроль над ним. Прототип модуля `hex_digits` следующий: + +```SystemVerilog +module hex_digits( + input logic clk_i, + input logic rst_i, + input logic [3:0] hex0_i, // Цифра, выводимой на нулевой (самый правый) индикатор + input logic [3:0] hex1_i, // Цифра, выводимая на первый индикатор + input logic [3:0] hex2_i, // Цифра, выводимая на второй индикатор + input logic [3:0] hex3_i, // Цифра, выводимая на третий индикатор + input logic [3:0] hex4_i, // Цифра, выводимая на четвертый индикатор + input logic [3:0] hex5_i, // Цифра, выводимая на пятый индикатор + input logic [3:0] hex6_i, // Цифра, выводимая на шестой индикатор + input logic [3:0] hex7_i, // Цифра, выводимая на седьмой индикатор + input logic [7:0] bitmask_i, // Битовая маска для включения/отключения + // отдельных индикаторов + + output logic [6:0] hex_led_o // Сигнал, контролирующий каждый отдельный + // светодиод индикатора + output logic [7:0] hex_sel_o // Сигнал, указывающий на какой индикатор + // выставляется hex_led +); +endmodule +``` + +Для того, чтобы вывести шестнадцатеричную цифру на любой из индикаторов, необходимо выставить двоичное представление этой цифры на соответствующий вход `hex0-hex7`. + +За включение/отключение индикаторов отвечает входной сигнал `bitmask_i`, состоящий из 8 бит, каждый из которых включает/отключает соответствующий индикатор. Например, при `bitmask_i == 8'b0000_0101`, включены будут нулевой и второй индикаторы, остальные будут погашены. + +Выходные сигналы `hex_led` и `hex_sel` необходимо просто подключить к соответствующим выходным сигналам модуля-контроллера. Они пойдут на выходы ПЛИС, соединенные с семисегментными индикаторами. + +Для управления данным модулем, необходимо написать модуль-контроллер со следующим прототипом: + +```SystemVerilog +module hex_sb_ctrl( +/* + Часть интерфейса модуля, отвечающая за подключение к системной шине +*/ + input logic clk_i, + input logic [31:0] addr_i, + input logic req_i, + input logic [31:0] write_data_i, + input logic write_enable_i, + output logic [31:0] read_data_o, + +/* + Часть интерфейса модуля, отвечающая за подключение к модулю, + осуществляющему вывод цифр на семисегментные индикаторы +*/ + output logic [6:0] hex_led, + output logic [7:0] hex_sel +); + + logic [3:0] hex0, hex1, hex2, hex3, hex4, hex5, hex6, hex7; + logic [7:0] bitmask; +endmodule +``` + +Регистры `hex0-hex7` отвечают за вывод цифры на соответствующий семисегментный индикатор. Регистр `bitmask` отвечает за включение/отключение семисегментных индикаторов. Когда в регистре `bitmask` бит, индекс которого совпадает с номером индикатора равен единице — тот включен и выводит число, совпадающее со значением в соответствующем регистре `hex0-hex7`. Когда бит равен нулю — этот индикатор гаснет. + +Доступ на чтение/запись регистров `hex0-hex7` осуществляется по адресам `0x00-0x1c` (см. таблицу адресного пространства). + +Доступ на чтение/запись регистра `bitmask` осуществляется по адресу `0x20`. + +При запросе на запись единицы по адресу `0x24` необходимо выполнить сброс всех регистров. При этом регистр `bitmask` должен сброситься в значение `0xFF`. + +Адресное пространство контроллера: + +|Адрес|Режим доступа|Допустимые значения| Функциональное назначение | +|-----|-------------|-------------------|---------------------------------------------------------| +|0x00 | RW | [0:31] | Регистр, хранящий значение, выводимое на hex0 | +|0x04 | RW | [0:31] | Регистр, хранящий значение, выводимое на hex1 | +|0x08 | RW | [0:31] | Регистр, хранящий значение, выводимое на hex2 | +|0x0C | RW | [0:31] | Регистр, хранящий значение, выводимое на hex3 | +|0x10 | RW | [0:31] | Регистр, хранящий значение, выводимое на hex4 | +|0x14 | RW | [0:31] | Регистр, хранящий значение, выводимое на hex5 | +|0x18 | RW | [0:31] | Регистр, хранящий значение, выводимое на hex6 | +|0x1C | RW | [0:31] | Регистр, хранящий значение, выводимое на hex7 | +|0x20 | RW | [0:255] | Регистр, управляющий включением/отключением индикаторов | +|0x24 | W | 1 | Запись сигнала сброса | + +### UART + +[UART](https://ru.wikipedia.org/wiki/Универсальный_асинхронный_приёмопередатчик) — это последовательный интерфейс, использующий для приема и передачи данных по одной независимой линии с поддержкой контроля целостности данных. + +Для того, чтобы передача данных была успешно осуществлена, приемник и передатчик на обоих концах одного провода должны договориться о параметрах передачи: + +* её скорости (бодрейт); +* контроля целостности данных (использование бита четности/нечетности/отсутствие контроля); +* длины стопового бита. + +Вам будут предоставлены модули, осуществляющие прием и передачу данных по этому интерфейсу, от вас лишь требуется написать модули, осуществляющие управление предоставленными модулями. + +```SystemVerilog +module uart_rx ( + input logic clk_i, // Тактирующий сигнал + input logic rst_i, // Сигнал сброса + input logic rx_i, // Сигнал линии, подключенной к выводу ПЛИС, + // по которой будут приниматься данные + output logic busy_o, // Сигнал о том, что модуль занят приемом данных + input logic [15:0] baudrate_i, // Настройка скорости передачи данных + input logic parity_en_i,// Настройка контроля целостности через бит четности + input logic stopbit_i, // Настройка длины стопового бита + output logic [7:0] rx_data_o, // Принятые данные + output logic rx_valid_o // Сигнал о том, что прием данных завершен + +); +endmodule +``` + +```SystemVerilog +module uart_tx ( + input logic clk_i, // Тактирующий сигнал + input logic rst_i, // Сигнал сброса + output logic tx_o, // Сигнал линии, подключенной к выводу ПЛИС, + // по которой будут отправляться данные + output logic busy_o, // Сигнал о том, что модуль занят передачей данных + input logic [15:0] baudrate_i, // Настройка скорости передачи данных + input logic parity_en_i,// Настройка контроля целостности через бит четности + input logic stopbit_i, // Настройка длины стопового бита + input logic [7:0] tx_data_i, // Отправляемые данные + input logic tx_valid_i // Сигнал о старте передачи данных +); +endmodule +``` + +Для управления этими модулями вам необходимо написать два модуля-контроллера со следующими прототипами + +```SystemVerilog +module uart_rx_sb_ctrl( +/* + Часть интерфейса модуля, отвечающая за подключение к системной шине +*/ + input logic clk_i, + input logic rst_i + input logic [31:0] addr_i, + input logic req_i, + input logic [31:0] write_data_i, + input logic write_enable_i, + output logic [31:0] read_data_o, + +/* + Часть интерфейса модуля, отвечающая за подключение передающему, + входные данные по UART +*/ + input logic rx_i +); + + logic busy; + logic [15:0] baudrate; + logic parity_en; + logic stopbit; + logic data; + logic valid; + +endmodule +``` + +```SystemVerilog +module uart_tx_sb_ctrl( +/* + Часть интерфейса модуля, отвечающая за подключение к системной шине +*/ + input logic clk_i, + input logic rst_i + input logic [31:0] addr_i, + input logic req_i, + input logic [31:0] write_data_i, + input logic write_enable_i, + output logic [31:0] read_data_o, + +/* + Часть интерфейса модуля, отвечающая за подключение передающему, + выходные данные по UART +*/ + output logic tx_o +); + + logic busy; + logic [15:0] baudrate; + logic parity_en; + logic stopbit; + +endmodule +``` + +У обоих предоставленных модулей схожий прототип, различия заключаются лишь в направлениях некоторых сигналов: + +Управление сигналами этого модуля достаточно просто. + +Сигналы `clk_i` и `rx_i`/`tx_i` подключаются напрямую к соответствующим сигналам модуля-контроллера. + +Сигнал `rst_i` модулей `uart_rx` / `uart_tx` должен быть равен единице при запросе на запись единицы по адресу `0x24`, а так же в случае когда сигнал `rst_i` модуля-контроллера равен единице. + +Выходной сигнал `busy_o` на каждом такте `clk_i` должен записываться в регистр `busy`, доступ на чтение к которому осуществляется по адресу `0x08`. + +Значение входных сигналов `baudrate_i`, `parity_en_i`, `stopbit_i` берутся из соответствующих регистров, доступ на запись к которым осуществляется по адресам `0x0C`, `0x10`, `0x14` соответственно, но только в моменты, когда выходной сигнал `busy_o` равен нулю. Иными словами, изменение настроек передачи возможно только в моменты, когда передача не происходит. Доступ на чтение этих регистров может осуществляться в любой момент времени. + +В регистр `data` модуля `uart_rx_sb_ctrl` записывается значение одноименного выхода модуля `uart_rx` в моменты положительного фронта `clk_i`, когда сигнал `rx_valid_o` равен единице. Доступ на чтение этого регистра осуществляется по адресу `0x00`. + +В регистр `valid` модуля `uart_rx_sb_ctrl` записывается единица по положительному фронту clk_i, когда выход `rx_valid_o` равен единице. Данный регистр сбрасывается в ноль при выполнении запроса на чтение по адресу `0x00`. Сам регистр доступен для чтения по адресу `0x04`. + +На вход `tx_data_i` модуля `uart_tx` подаются данные из регистра `data` модуля `uart_tx_sb_ctrl`. Доступ на запись в этот регистр происходит по адресу `0x00` в моменты положительного фронта `clk_i`, когда сигнал `busy_o` равен нулю. Доступ на чтение этого регистра может осуществляться в любой момент времени. + +На вход `tx_valid_i` модуля `uart_tx` подается единица в момент выполнения запроса на запись по адресу `0x00` (при сигнале `busy` равном нулю). В остальное время на вход этого сигнала подается `0`. + +В случае запроса на запись единицы по адресу `0x24` (адресу сброса), все регистры модуля-контроллера должны сброситься. При этом регистр `baudrate` должен принять значение `9600`, регистр `parity` должен принять значение `1`, регистр, `stopbit` должен принять значение `1`. Остальные регистры должны принять значение `0`. + +Адресное пространство контроллера `uart_rx_sb_ctrl`: + +|Адрес|Режим доступа|Допустимые значения| Функциональное назначение | +|-----|-------------|-------------------|---------------------------------------------------------------------------------------------------------| +|0x00 | R | [0:255] | Чтение из регистра `data`, хранящего значение принятых данных | +|0x04 | R | [0:1] | Чтение из регистра `valid`, сообщающего о том, что есть непрочитанные данные в регистре `data` | +|0x08 | R | [0:1] | Чтение из регистра `busy`, сообщающего о том, что модуль находится в процессе приема данных | +|0x0C | RW | [0:65535] | Чтение/запись регистра `baudrate`, отвечающего за скорость передачи данных | +|0x10 | RW | [0:1] | Чтение/запись регистра `parity`, отвечающего за включение отключение проверки данных через бит четности | +|0x14 | RW | [0:1] | Чтение/запись регистра `stopbit`, отвечающего за длину стопового бита | +|0x24 | W | 1 | Запись сигнала сброса | + +Адресное пространство контроллера `uart_tx_sb_ctrl`: + +|Адрес|Режим доступа|Допустимые значения| Функциональное назначение | +|-----|-------------|-------------------|---------------------------------------------------------------------------------------------------------| +|0x00 | RW | [0:255] | Чтение и запись регистра `data`, хранящего значение отправляемых данных | +|0x08 | R | [0:1] | Чтение из регистра `busy`, сообщающего о том, что модуль находится в процессе передачи данных | +|0x0C | RW | [0:65535] | Чтение/запись регистра `baudrate`, отвечающего за скорость передачи данных | +|0x10 | RW | [0:1] | Чтение/запись регистра `parity`, отвечающего за включение отключение проверки данных через бит четности | +|0x14 | RW | [0:1] | Чтение/запись регистра `stopbit`, отвечающего за длину стопового бита | +|0x24 | W | 1 | Запись сигнала сброса | diff --git a/Labs/09. Peripheral units/hex_digits.v b/Labs/09. Peripheral units/hex_digits.v new file mode 100644 index 0000000..2f51ed0 --- /dev/null +++ b/Labs/09. Peripheral units/hex_digits.v @@ -0,0 +1,78 @@ +`timescale 1ns / 1ps + +module hex_digits( + input clk_i, rst_i, + input [4:0] hex0, // Входной сигнал со значением цифры, выводимой на нулевой (самый правый) индикатор + input [4:0] hex1, // Входной сигнал со значением цифры, выводимой на первый индикатор + input [4:0] hex2, // Входной сигнал со значением цифры, выводимой на второй индикатор + input [4:0] hex3, // Входной сигнал со значением цифры, выводимой на третий индикатор + input [4:0] hex4, // Входной сигнал со значением цифры, выводимой на четвертый индикатор + input [4:0] hex5, // Входной сигнал со значением цифры, выводимой на пятый индикатор + input [4:0] hex6, // Входной сигнал со значением цифры, выводимой на шестой индикатор + input [4:0] hex7, // Входной сигнал со значением цифры, выводимой на седьмой индикатор + + output [6:0] hex_led, // Выходной сигнал, контролирующий каждый отдельный светодиод индикатора + output [7:0] hex_sel // Выходной сигнал, указывающий на какой индикатор выставляется hex_led + ); + `define pwm 1000 //шим сегментов + + reg [9:0] counter; + reg [4:0] semseg; + reg [7:0] ANreg; + reg [6:0] hex_ledr; + + assign hex_sel = ANreg; + assign hex_led = hex_ledr; + + always @(posedge clk_i) begin + if (rst_i) begin + counter <= 'b0; + ANreg[7:0] <= 8'b11111111; + hex_ledr <= 7'b1111111; + end + else begin + if (counter < `pwm) counter <= counter + 'b1; + else begin + counter <= 'b0; + ANreg[1] <= ANreg[0]; + ANreg[2] <= ANreg[1]; + ANreg[3] <= ANreg[2]; + ANreg[4] <= ANreg[3]; + ANreg[5] <= ANreg[4]; + ANreg[6] <= ANreg[5]; + ANreg[7] <= ANreg[6]; + ANreg[0] <= !(ANreg[6:0] == 7'b1111111); + end + case (1'b0) + ANreg[0]: semseg <= hex0; + ANreg[1]: semseg <= hex1; + ANreg[2]: semseg <= hex2; + ANreg[3]: semseg <= hex3; + ANreg[4]: semseg <= hex4; + ANreg[5]: semseg <= hex5; + ANreg[6]: semseg <= hex6; + ANreg[7]: semseg <= hex7; + endcase + case (semseg) + 5'h10: hex_ledr <= 7'b0000001; + 5'h11: hex_ledr <= 7'b1001111; + 5'h12: hex_ledr <= 7'b0010010; + 5'h13: hex_ledr <= 7'b0000110; + 5'h14: hex_ledr <= 7'b1001100; + 5'h15: hex_ledr <= 7'b0100100; + 5'h16: hex_ledr <= 7'b0100000; + 5'h17: hex_ledr <= 7'b0001111; + 5'h18: hex_ledr <= 7'b0000000; + 5'h19: hex_ledr <= 7'b0000100; + 5'h1A: hex_ledr <= 7'b0001000; + 5'h1B: hex_ledr <= 7'b1100000; + 5'h1C: hex_ledr <= 7'b0110001; + 5'h1D: hex_ledr <= 7'b1000010; + 5'h1E: hex_ledr <= 7'b0110000; + 5'h1F: hex_ledr <= 7'b0111000; + default: hex_ledr <= 7'b1111111; + endcase + end + end + +endmodule diff --git a/Labs/09. Peripheral units/nexys_a7_100t.xdc b/Labs/09. Peripheral units/nexys_a7_100t.xdc new file mode 100644 index 0000000..7584c9f --- /dev/null +++ b/Labs/09. Peripheral units/nexys_a7_100t.xdc @@ -0,0 +1,211 @@ +## This file is a general .xdc for the Nexys A7-100T +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +# Clock signal +set_property -dict {PACKAGE_PIN E3 IOSTANDARD LVCMOS33} [get_ports clk_i] +create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports clk_i] +create_generated_clock -name sys_clk10_pin -source [get_ports clk_i] -divide_by 10 [get_pins div/clkbuf/O] + +#Switches +set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports {sw_i[0]}] +set_property -dict {PACKAGE_PIN L16 IOSTANDARD LVCMOS33} [get_ports {sw_i[1]}] +set_property -dict {PACKAGE_PIN M13 IOSTANDARD LVCMOS33} [get_ports {sw_i[2]}] +set_property -dict {PACKAGE_PIN R15 IOSTANDARD LVCMOS33} [get_ports {sw_i[3]}] +set_property -dict {PACKAGE_PIN R17 IOSTANDARD LVCMOS33} [get_ports {sw_i[4]}] +set_property -dict {PACKAGE_PIN T18 IOSTANDARD LVCMOS33} [get_ports {sw_i[5]}] +set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports {sw_i[6]}] +set_property -dict {PACKAGE_PIN R13 IOSTANDARD LVCMOS33} [get_ports {sw_i[7]}] +set_property -dict {PACKAGE_PIN T8 IOSTANDARD LVCMOS18} [get_ports {sw_i[8]}] +set_property -dict {PACKAGE_PIN U8 IOSTANDARD LVCMOS18} [get_ports {sw_i[9]}] +set_property -dict {PACKAGE_PIN R16 IOSTANDARD LVCMOS33} [get_ports {sw_i[10]}] +set_property -dict {PACKAGE_PIN T13 IOSTANDARD LVCMOS33} [get_ports {sw_i[11]}] +set_property -dict {PACKAGE_PIN H6 IOSTANDARD LVCMOS33} [get_ports {sw_i[12]}] +set_property -dict {PACKAGE_PIN U12 IOSTANDARD LVCMOS33} [get_ports {sw_i[13]}] +set_property -dict {PACKAGE_PIN U11 IOSTANDARD LVCMOS33} [get_ports {sw_i[14]}] +set_property -dict {PACKAGE_PIN V10 IOSTANDARD LVCMOS33} [get_ports {sw_i[15]}] + +## LEDs +set_property -dict {PACKAGE_PIN H17 IOSTANDARD LVCMOS33} [get_ports {led_o[0]}] +set_property -dict {PACKAGE_PIN K15 IOSTANDARD LVCMOS33} [get_ports {led_o[1]}] +set_property -dict {PACKAGE_PIN J13 IOSTANDARD LVCMOS33} [get_ports {led_o[2]}] +set_property -dict {PACKAGE_PIN N14 IOSTANDARD LVCMOS33} [get_ports {led_o[3]}] +set_property -dict {PACKAGE_PIN R18 IOSTANDARD LVCMOS33} [get_ports {led_o[4]}] +set_property -dict {PACKAGE_PIN V17 IOSTANDARD LVCMOS33} [get_ports {led_o[5]}] +set_property -dict {PACKAGE_PIN U17 IOSTANDARD LVCMOS33} [get_ports {led_o[6]}] +set_property -dict {PACKAGE_PIN U16 IOSTANDARD LVCMOS33} [get_ports {led_o[7]}] +set_property -dict {PACKAGE_PIN V16 IOSTANDARD LVCMOS33} [get_ports {led_o[8]}] +set_property -dict {PACKAGE_PIN T15 IOSTANDARD LVCMOS33} [get_ports {led_o[9]}] +set_property -dict {PACKAGE_PIN U14 IOSTANDARD LVCMOS33} [get_ports {led_o[10]}] +set_property -dict {PACKAGE_PIN T16 IOSTANDARD LVCMOS33} [get_ports {led_o[11]}] +set_property -dict {PACKAGE_PIN V15 IOSTANDARD LVCMOS33} [get_ports {led_o[12]}] +set_property -dict {PACKAGE_PIN V14 IOSTANDARD LVCMOS33} [get_ports {led_o[13]}] +set_property -dict {PACKAGE_PIN V12 IOSTANDARD LVCMOS33} [get_ports {led_o[14]}] +set_property -dict {PACKAGE_PIN V11 IOSTANDARD LVCMOS33} [get_ports {led_o[15]}] + +### RGB LEDs +#set_property -dict {PACKAGE_PIN R12 IOSTANDARD LVCMOS33} [get_ports LED16_B] +#set_property -dict {PACKAGE_PIN M16 IOSTANDARD LVCMOS33} [get_ports LED16_G] +#set_property -dict {PACKAGE_PIN N15 IOSTANDARD LVCMOS33} [get_ports LED16_R] +#set_property -dict {PACKAGE_PIN G14 IOSTANDARD LVCMOS33} [get_ports LED17_B] +#set_property -dict {PACKAGE_PIN R11 IOSTANDARD LVCMOS33} [get_ports LED17_G] +#set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports LED17_R] + +##7 segment display +set_property -dict {PACKAGE_PIN T10 IOSTANDARD LVCMOS33} [get_ports hex_led[6]] +set_property -dict {PACKAGE_PIN R10 IOSTANDARD LVCMOS33} [get_ports hex_led[5]] +set_property -dict {PACKAGE_PIN K16 IOSTANDARD LVCMOS33} [get_ports hex_led[4]] +set_property -dict {PACKAGE_PIN K13 IOSTANDARD LVCMOS33} [get_ports hex_led[3]] +set_property -dict {PACKAGE_PIN P15 IOSTANDARD LVCMOS33} [get_ports hex_led[2]] +set_property -dict {PACKAGE_PIN T11 IOSTANDARD LVCMOS33} [get_ports hex_led[1]] +set_property -dict {PACKAGE_PIN L18 IOSTANDARD LVCMOS33} [get_ports hex_led[0]] +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp +set_property -dict {PACKAGE_PIN J17 IOSTANDARD LVCMOS33} [get_ports {hex_sel[0]}] +set_property -dict {PACKAGE_PIN J18 IOSTANDARD LVCMOS33} [get_ports {hex_sel[1]}] +set_property -dict {PACKAGE_PIN T9 IOSTANDARD LVCMOS33} [get_ports {hex_sel[2]}] +set_property -dict {PACKAGE_PIN J14 IOSTANDARD LVCMOS33} [get_ports {hex_sel[3]}] +set_property -dict {PACKAGE_PIN P14 IOSTANDARD LVCMOS33} [get_ports {hex_sel[4]}] +set_property -dict {PACKAGE_PIN T14 IOSTANDARD LVCMOS33} [get_ports {hex_sel[5]}] +set_property -dict {PACKAGE_PIN K2 IOSTANDARD LVCMOS33} [get_ports {hex_sel[6]}] +set_property -dict {PACKAGE_PIN U13 IOSTANDARD LVCMOS33} [get_ports {hex_sel[7]}] + +##Buttons +set_property -dict {PACKAGE_PIN C12 IOSTANDARD LVCMOS33} [get_ports resetn] +#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc +#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu +#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl +#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { BTNR }]; #IO_L10N_T1_D15_14 Sch=btnr +#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers +##Pmod Header JA +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { JA[1] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { JA[2] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { JA[3] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { JA[4] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { JA[7] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { JA[8] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { JA[9] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { JA[10] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + +##Pmod Header JB +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { JB[1] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { JB[2] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { JB[3] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { JB[4] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { JB[7] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { JB[8] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { JB[9] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { JB[10] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + +##Pmod Header JC +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { JC[1] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { JC[2] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { JC[3] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { JC[4] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { JC[7] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { JC[8] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { JC[9] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { JC[10] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + +##Pmod Header JD +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { JD[1] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { JD[2] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { JD[3] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { JD[4] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { JD[7] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { JD[8] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { JD[9] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { JD[10] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + +##Pmod Header JXADC +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVCMOS33 } [get_ports { XA_N[1] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVCMOS33 } [get_ports { XA_P[1] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { XA_N[2] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { XA_P[2] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { XA_N[3] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVCMOS33 } [get_ports { XA_P[3] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { XA_N[4] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { XA_P[4] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + +##VGA Connector +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { VGA_HS }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { VGA_VS }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { SD_RESET }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { SD_CD }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { SD_SCK }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { SD_CMD }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + +##Accelerometer +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { ACL_MISO }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { ACL_MOSI }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { ACL_SCLK }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { ACL_CSN }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + +##Temperature Sensor +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { TMP_SCL }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { TMP_SDA }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { TMP_INT }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { TMP_CT }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { M_CLK }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { M_DATA }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel + +##PWM Audio Amplifier +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { AUD_SD }]; #IO_L6P_T0_15 Sch=aud_sd + +##USB-RS232 Interface +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { rx_i }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { tx_o }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { UART_CTS }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { UART_RTS }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) +set_property -dict {PACKAGE_PIN F4 IOSTANDARD LVCMOS33} [get_ports kclk] +set_property -dict {PACKAGE_PIN B2 IOSTANDARD LVCMOS33} [get_ports kdata] + +##SMSC Ethernet PHY +#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDC }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDIO }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { ETH_RSTN }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { ETH_CRSDV }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv +#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXERR }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXEN }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { ETH_REFCLK }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { ETH_INTN }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + +##Quad SPI Flash +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn diff --git a/Labs/09. Peripheral units/ps2_hex.txt b/Labs/09. Peripheral units/ps2_hex.txt new file mode 100644 index 0000000..bdd72b3 --- /dev/null +++ b/Labs/09. Peripheral units/ps2_hex.txt @@ -0,0 +1,112 @@ +93 00 10 00 +13 01 d0 02 +93 01 00 08 +37 e2 00 00 +13 02 b2 06 +b7 e2 00 00 +93 82 42 07 +93 04 f0 0f +13 03 00 08 +13 04 50 05 +13 0a e0 04 +93 05 60 01 +13 06 e0 01 +93 06 60 02 +13 07 50 02 +93 07 e0 02 +13 08 60 03 +93 08 d0 03 +13 09 e0 03 +93 09 60 04 +13 05 50 04 +93 03 00 04 +93 0a 00 02 +13 0b 00 01 +93 0c 80 00 +13 0d 40 00 +93 0d 20 00 +37 0e 00 03 +13 0e 0e 00 +b7 0e 00 04 +93 8e 0e 00 +23 22 1e 02 +23 a2 1e 02 +83 2b 4e 00 +e3 8e 0b fe +03 2c 0e 00 +63 00 2c 04 +63 04 4c 04 +63 08 5c 04 +63 0c 8c 04 +63 00 4c 07 +63 06 ac 06 +63 08 bc 06 +63 0a cc 06 +63 0c dc 06 +63 0e ec 06 +63 00 fc 08 +63 02 0c 09 +63 04 1c 09 +63 06 2c 09 +63 08 3c 09 +6f ff 9f fb +23 22 1e 02 +23 a2 1e 02 +6f ff 9f f2 +e3 84 61 fa +b3 91 11 00 +6f ff 1f fa +e3 8e 11 f8 +b3 d1 11 00 +6f ff 5f f9 +b3 e4 91 00 +23 a0 9e 02 +6f ff 9f f8 +b3 e4 91 00 +b3 84 34 40 +23 a0 9e 02 +6f ff 9f f7 +b3 0f 00 00 +6f 0f c0 04 +b3 0f 10 00 +6f 0f 40 04 +93 0f 20 00 +6f 0f c0 03 +93 0f 30 00 +6f 0f 40 03 +93 0f 40 00 +6f 0f c0 02 +93 0f 50 00 +6f 0f 40 02 +93 0f 60 00 +6f 0f c0 01 +93 0f 70 00 +6f 0f 40 01 +93 0f 80 00 +6f 0f c0 00 +93 0f 90 00 +6f 0f 40 00 +63 96 61 00 +23 ae fe 01 +6f ff df f1 +63 96 71 00 +23 ac fe 01 +6f ff 1f f1 +63 96 51 01 +23 aa fe 01 +6f ff 5f f0 +63 96 61 01 +23 a8 fe 01 +6f ff 9f ef +63 96 91 01 +23 a6 fe 01 +6f ff df ee +63 96 a1 01 +23 a4 fe 01 +6f ff 1f ee +63 96 b1 01 +23 a2 fe 01 +6f ff 5f ed +e3 98 11 ec +23 a0 fe 01 +6f ff 9f ec diff --git a/Labs/09. Peripheral units/sw_led.txt b/Labs/09. Peripheral units/sw_led.txt new file mode 100644 index 0000000..4d7f32f --- /dev/null +++ b/Labs/09. Peripheral units/sw_led.txt @@ -0,0 +1,21 @@ +93 04 10 00 +13 09 a0 0a +93 02 a0 0a +13 19 89 00 +33 09 59 00 +93 09 50 55 +93 02 50 00 +93 99 49 00 +b3 89 59 00 +37 0e 00 01 +b7 0e 00 02 +03 2a 0e 00 +63 0a 2a 01 +63 0c 3a 01 +23 a0 4e 01 +23 a2 0e 00 +ef f2 df fe +23 a2 9e 02 +ef f2 5f fe +23 a2 9e 00 +ef f2 df fd diff --git a/Labs/09. Peripheral units/sys_clk_rst_gen.v b/Labs/09. Peripheral units/sys_clk_rst_gen.v new file mode 100644 index 0000000..5fad1d6 --- /dev/null +++ b/Labs/09. Peripheral units/sys_clk_rst_gen.v @@ -0,0 +1,54 @@ +module sys_clk_rst_gen#( + parameter DIV_WIDTH = 4 +)( + input ex_clk_i, + input ex_areset_n_i, + input [DIV_WIDTH-1:0] div_i, + + output sys_clk_o, + output sys_reset_o +); + +reg [1:0] ex_arstn_buf; +reg [1:0] sys_rstn_buf; + +wire ex_arstn_buffered; +assign ex_arstn_buffered = ex_arstn_buf[1]; +assign sys_reset_o = !sys_rstn_buf[1]; + +always @(posedge ex_clk_i or negedge ex_areset_n_i) begin + if(!ex_areset_n_i) begin + ex_arstn_buf <= 2'b0; + end + else begin + ex_arstn_buf <= {ex_arstn_buf[0], 1'b1}; + end +end + +reg [DIV_WIDTH-1:0] cnt; +reg clk_div; +always@( posedge ex_clk_i or negedge ex_arstn_buffered ) begin + if ( ~ex_arstn_buffered ) begin + cnt <= 0; + clk_div <= 0; + end else if ( cnt == 0 ) begin + cnt <= div_i; + clk_div <= !clk_div; + end else begin + cnt <= cnt - 1; + end +end + +BUFG clkbuf (.O(sys_clk_o),.I(clk_div)); + +always @(posedge sys_clk_o or negedge ex_arstn_buffered) begin + if(!ex_arstn_buffered) begin + sys_rstn_buf <= 2'b0; + end + else begin + sys_rstn_buf <= {sys_rstn_buf[0], 1'b1}; + end +end + + +endmodule diff --git a/Labs/09. Peripheral units/testbench.sv b/Labs/09. Peripheral units/testbench.sv new file mode 100644 index 0000000..aeb10ba --- /dev/null +++ b/Labs/09. Peripheral units/testbench.sv @@ -0,0 +1,108 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: MIET +// Engineer: Nikita Bulavin +// +// Create Date: +// Design Name: +// Module Name: tb_riscv_unit +// Project Name: RISCV_practicum +// Target Devices: Nexys A7-100T +// Tool Versions: +// Description: tb for peripheral units +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +module tb_riscv_unit(); + +localparam variant = 'd1; //1-SW_LED; 2-PS2_HEXLED; 3-UART; +localparam button = 8'h16; //keyboard key code + +logic clk; +logic ps2_clk; +logic ps2_dat; +logic resetn; +logic [15:0] sw_i; +logic [15:0] led_o; +logic parity; +logic starter; + +logic [ 6:0] hex_led_o; +logic [ 7:0] hex_sel_o; +logic rx_i; +logic tx_o; + +initial begin clk = 0; ps2_clk = 0; end + +always #50 clk = ~clk; +always #50000 if (variant == 2) if(starter || (cntr > 0)) ps2_clk = ~ps2_clk; else ps2_clk = 1; + +logic [11:0] data; + +initial begin + resetn = 1; + repeat(2)@(posedge clk); + resetn = 0; + repeat(2) @(posedge clk); + resetn = 1; +end + +riscv_unit dut( + .clk_i (clk ), + .resetn_i (resetn ), + .sw_i (sw_i ), + .led_o (led_o ), + .kclk_i (ps2_clk ), + .kdata_i (ps2_dat ), + .hex_led_o(hex_led_o), + .hex_sel_o(hex_sel_o), + .rx_i (rx_i ), + .tx_o (tx_o ) +); + +logic [3:0] cntr; + +always @(negedge ps2_clk) begin + if(starter || (cntr > 0)) + if(cntr == 10) + cntr <= 0; + else + cntr <= cntr + 1; +end +assign ps2_dat = cntr>0? data[cntr-1] : 1; + +initial begin + sw_i = 16'h0; + cntr = 0; + starter = 0; + parity = !(^button); + data = 0; + case (variant) + 1: begin + #10000; + sw_i = 16'h01AA; + #20000; + sw_i = 16'hFF00; + end + 2: begin + data = {2'b11, parity, button, 1'b0}; + #100000; + starter = 1; + @(posedge ps2_clk) + starter = 0; + end + 3: begin + + end + endcase + +end + + +endmodule diff --git a/Labs/10. Programming/README.md b/Labs/10. Programming/README.md new file mode 100644 index 0000000..327f9f5 --- /dev/null +++ b/Labs/10. Programming/README.md @@ -0,0 +1,393 @@ +# Лабораторная работа 8 "Высокоуровневое программирование" + +## Цель + +В соответствии с индивидуальным заданием, написать программу на языке программирования высокого уровня C, скомпилировать в машинные коды и запустить на ранее разработанном процессоре RISC-V. + +## Ход работы + +1. Изучить теорию: + 1. [Соглашение о вызовах](#соглашение-о-вызовах) + 2. [Скрипт для компоновки](#скрипт-для-компоновки-linker_scriptld) + 3. [Файл первичных команд](#файл-первичных-команд-при-загрузке-startups) +2. Подготовить набор инструментов для кросс-компиляции. +3. Изучить порядок компиляции и команды, её осуществляющую. +4. Написать и скомпилировать собственную программу. +5. Проверить исполнение программы вашим процессором в ПЛИС. + +## Теория + +В рамках данной лабораторной работы вы напишите полноценную программу, которая будет запущена на вашем процессоре. В процессе компиляции, вам потребуются файлы, лежащие в этой папке. + +> — Но зачем мне эти файлы? Мы ведь уже делали задания по программированию на предыдущих лабораторных работах и нам не были нужны никакие дополнительные файлы. + +Дело в том, что ранее вы писали небольшие программки на ассемблере. Однако, язык ассемблера архитектуры RISC-V, так же как и любой другой RISC архитектуры, недружелюбен к программисту, поскольку изначально создавался с прицелом на то, что будут созданы компиляторы и программы будут писаться на более удобных для человека языках высокого уровня. Ранее вы писали простенькие программы, которые можно было реализовать на ассемблере, теперь же вам будет предложено написать полноценную программу на языке Си. + +> — Но разве в процессе компиляции исходного кода на языке Си мы не получаем программу, написанную на языке ассемблера? Получится ведь тот же код, что мы могли написать и сами. + +Штука в том, что ассемблерный код который писали ранее вы отличается от ассемблерного кода, генерируемого компилятором. Код, написанный вами обладал, скажем так... более тонким микро-контролем хода программы. Когда вы писали программу, вы знали какой у вас размер памяти, где в памяти расположены инструкции, а где данные (ну, при написании программ вы почти не пользовались памятью данных, а когда пользовались — просто лупили по случайным адресам и все получалось). Вы пользовались всеми регистрами регистрового файла по своему усмотрению, без ограничений. Однако, представьте на секунду, что вы пишете проект на ассемблере вместе с коллегой: вы пишите одни функции, а он другие. Как в таком случае вы будете пользоваться регистрами регистрового файла? Поделите его напополам и будете пользоваться каждый своей половиной? Но что будет, если к проекту присоединится еще один коллега — придется делить регистровый файл уже на три части? Так от него уже ничего не останется. Для разрешения таких ситуаций было разработано [соглашение о вызовах](#соглашение-о-вызовах) (calling convention). + +Таким образом, генерируя ассемблерный код, компилятор не может так же, как это делали вы, использовать все ресурсы без каких-либо ограничений — он должен следовать ограничениям, накладываемым на него соглашением о вызовах, а так же ограничениям, связанным с тем, что он ничего не знает о памяти устройства, в котором будет исполняться программа — а потому он не может работать с памятью абы как. Работая с памятью, компилятор следует некоторым правилам, благодаря которым после компиляции компоновщик сможет собрать программу под ваше устройство с помощью специального скрипта. + +### Соглашение о вызовах + +Соглашение о вызовах [устанавливает](https://github.com/riscv-non-isa/riscv-elf-psabi-doc/releases/download/v1.0/riscv-abi.pdf) порядок вызова функций: где размещаются аргументы при вызове функций, где находятся указатель на стек и адрес возврата и т.п. + +Кроме того, соглашение делит регистры регистрового файла на две группы: оберегаемые и необерегаемые регистры. При работе с оберегаемыми регистрами, функция должна гарантировать, что перед возвратом в этих регистрах останется тоже самое значение, что было при вызове функции. То есть, если функция собирается записать что-то в оберегаемый регистр, она должна сохранить перед этим его значение на стек, а затем, перед возвратом, вернуть это значение со стека обратно в этот же регистр. Простая аналогия — в маленькой квартире двое делят один рабочий стол по времени. Каждый использует стол по полной, но после себя он должен оставить половину стола соседа (оберегаемые регистры) в том же виде, в котором ее получил, а со своей (необерегаемые регистры) делает что хочет. Кстати, вещи соседа, чтоб не потерять, убирают на стопку рядом (в основную память). С необерегаемыми регистрами функция может работать как ей угодно — не существует никаких гарантий, которые вызванная функция должна исполнить. При этом, если функция вызывает другую функцию, она точно так же не получает никаких гарантий, что вызванная функция оставит значения необерегаемых регистров без изменений, поэтому если там хранятся значения, которые потребуются по окончанию выполнения вызываемой функции, эти значения необходимо сохранить на стек. + +В таблице ниже приведено разделение регистров на оберегаемые (в правом столбце записано `Callee`, т.е. за их сохранение отвечает вызванная функция) и необерегаемые (`Caller` — за сохранение отвечает вызывающая функция). Кроме того, есть три регистра, для которых правый столбец не имеет значения: нулевой регистр (поскольку его невозможно изменить) и указатели на поток и глобальную область памяти. По соглашению о вызовах, эти регистры нельзя использовать для вычислений функций, они изменяются только по заранее оговоренным ситуациям. + +В столбце `ABI name` записывается синоним имени регистра, связанный с его функциональным назначением (см. описание регистра). Часто ассемблеры одинаково воспринимают обе формы написания имени регистров. + +|Register|ABI Name| Description | Saver | +|--------|--------|---------------------------------|-------| +| x0 | zero |Hard-wired zero | — | +| x1 | ra |Return address |Caller | +| x2 | sp |Stack pointer |Callee | +| x3 | gp |Global pointer | — | +| x4 | tp |Thread pointer | — | +| x5–7 | t0–2 |Temporaries |Caller | +| x8 | s0/fp |Saved register/frame pointer |Callee | +| x9 | s1 |Saved register |Callee | +| x10–11 | a0–1 |Function arguments/return values |Caller | +| x12–17 | a2–7 |Function arguments |Caller | +| x18–27 | s2–11 |Saved registers |Callee | +| x28–31 | t3–6 |Temporaries |Caller | + +Не смотря на то, что указатель на стек помечен как Callee-saved регистр, это не означает, вызываемая функция может записать в него что заблагорассудится, предварительно сохранив его значение на стек. Ведь как вы вернете значение указателя на стек со стека, если в регистре указателя на стек лежит что-то не то? Запись `Callee` означает, что к моменту возврата из вызываемой функции, значение Callee-saved регистров должно быть ровно таким же, каким было в момент вызова функций. Для s0-s11 регистров это осуществляется путем сохранения их значений на стек. При этом, перед каждым сохранением на стек, изменяется значение указателя на стек таким образом, чтобы он указывал на сохраняемое значение (обычно он декрементируется). Затем, перед возвратом из функций все сохраненные на стек значения восстанавливаются, попутно изменяя значение указателя на стек противоположным образом (инкрементируют его). Таким образом, не смотря на то, что значение указателя на стек менялось в процессе работы вызываемой функции, к моменту выхода из нее, его значение в итоге останется тем же. + +### Скрипт для компоновки (linker_script.ld) + +Скрипт для компоновки описывает то, как в вашей памяти будут храниться данные. Вы уже могли слышать о том, что исполняемый файл содержит секции `.text` и `.data` — инструкций и данных соответственно. Линковщик ничего не знает о том, какая у вас структура памяти: принстонская у вас архитектура или гарвардская, по каким адресам у вас должны храниться инструкции, а по каким данные. У вас может быть несколько типов памятей, под особые секции — и обо всем этом компоновщику можно сообщить в скрипте для компоновки. + +В самом простом виде скрипт компоновки состоит из одного раздела: раздела секций, в котором вы и описываете какие части программы куда и в каком порядке необходимо разместить. + +Для удобства этого описания существует вспомогательная переменная: счетчик адресов. В начале скрипта этот счетчик равен нулю. Размещая очередную секцию, этот счетчик увеличивается на размер этой секции. Допустим, у нас есть два файла `fourier.o` и `main.o`, в каждом из которых есть секции `.text` и `.data`. Мы хотим разместить их в памяти следующим образом: сперва разместить секции `.text` обоих файлов, а затем секции `.data`. + +В итоге по нулевом адресу будет размещена секция `.text` файла `fourier.o`. Она будет размещена именно там, поскольку счетчик адресов в начале скрипта равен нулю, а очередная секция размещается по адресу, куда указывает счетчик адресов. После этого, счетчик адресов будет увеличен на размер этой секции и секция `.text` файла `main.o` будет размещена сразу же за секцией `.text` файла `fourier.o`. После этого счетчик адресов будет увеличен на размер этой секции. То же самое произойдет и при размещении оставшихся секций. + +Кроме того, вы в любой момент можете изменить значение счетчика адресов. Например, у вас две раздельные памяти: память инструкций объемом 512 байт и память данных объемом 1024 байта. Эти памяти находятся в одном адресном пространстве. Диапазон адресов памяти инструкций: `[0:511]`, диапазон памяти данных: `[512:1535]`. При этом общий объем секций `.text` составляет 416 байт. В этом случае, вы можете сперва разместить секции `.text` так же, как было описано в предыдущем примере, а затем, выставив значение на счетчике адресов равное `512`, описываете размещение секций данных. Тогда, между секциями будет появится разрыв в 96 байт. А данные окажутся в диапазоне адресов, выделенном для памяти данных. + +Помимо прочего, в скрипте компоновщика необходимо прописать где будет находиться стек, и какое будет значение у указателя на глобальную область памяти. + +Все это с подробными комментариями описано в файле `linker_script.ld`. + +```ld +OUTPUT_FORMAT("elf32-littleriscv") +ENTRY(_start) + +SECTIONS +{ + PROVIDE( _start = 0x00000000 ); + PROVIDE( _memory_size = 1024); /* 1024 байта */ + + .text : {*(.boot) *(.text*)} + /* + В скриптах линковщика есть внутренняя переменная, записываемая как '.' + Эта переменная называется счетчиком адресов. Она хранит текущий адрес в + памяти. + В начале файла она инициализируется нулем. Добавляя новые секции, эта + переменная будет увеличиваться на размер каждой новой секции. + Если при размещении секций не указывается никакой адрес, они будут размещены + по текущему значению счетчика адресов. + Этой переменной можно присваивать значения, после этого, она будет + увеличиваться с этого значения. + Подробнее: + https://home.cs.colorado.edu/~main/cs1300/doc/gnu/ld_3.html#IDX338 + */ + . = ALIGN(4); + .data : {*(.data*)} + /* + Значение, присвоенное глобальному указателю (GP) выходит за границы RAM, + однако (для архитектуры RISC-V) общепринято присваивать GP значение равное + началу секции данных, смещенное на 2048 байт вперед. + Благодаря относительной адресации со смещением по 12-битному значению, можно + адресоваться на начало секции данных, а так же по всему адресному + пространству вплоть до 4096 байт от начала секции данных, что сокращает + объем требуемых для адресации инструкций (практически не используются + операции LUI, поскольку GP уже хранит базовый адрес и нужно только смещение). + Подробнее: + https://groups.google.com/a/groups.riscv.org/g/sw-dev/c/60IdaZj27dY/m/s1eJMlrUAQAJ + */ + _gbl_ptr = . + 0x800 ; + . = ALIGN(4); + /* + BSS (block started by symbol, неофициально его расшифровывают как + better save space) — это сегмент, в котором размещаются неинициализированные + статические переменные. В стандарте Си сказано, что такие переменные + инициализируются нулем (или NULL для указателей). Когда вы создаете + статический массив — он должен быть размещен в исполняемом файле. + Без bss-секции, этот массив должен был бы занимать такой же объем + исполняемого файла, какого объема он сам. Массив на 1000 байт занял бы + 1000 байт в секции .data. + Благодаря секции bss, начальные значения массива не задаются, вместо этого + здесь только записываются названия переменных и их адреса. + Однако на этапе загрузки исполняемого файла теперь необходимо принудительно + занулить участок памяти, занимаемый bss-секцией, поскольку статические + переменные должны быть проинициализированы нулем. + Таким образом, bss-секция значительным образом сокращает объем исполняемого + файла (в случае использования неинициализированных статических массивов) + ценой увеличения времени загрузки этого файла. + Для того, чтобы занулить bss-секцию, в скрипте заводятся две переменные, + указывающие на начало и конец bss-секции посредством счетчика адресов. + Подробнее: + https://en.wikipedia.org/wiki/.bss + */ + _bss_start = .; + .bss : {*(.bss*)} + _bss_end = .; + + + /*================================= + Секция аллоцированных данных завершена, остаток свободной памяти отводится + под программный стек и (возможно) кучу. В соглашении о + вызовах архитектуры RISC-V сказано, что стек растет снизу вверх, поэтому + наша цель разместить его в самых последних адресах памяти. + Однако перед этим, мы должны убедиться, что под программный стек останется + хотя бы 256 байт (ничем не обоснованное число, взятое с потолка). + Поскольку указатель стека (SP) должен быть выровнен до 16 байт, мы + обеспечиваем себе максимум 16 вложенных вызовов. + Подробнее: + https://riscv.org/wp-content/uploads/2015/01/riscv-calling.pdf + ================================= + */ + + /* Мы хотим гарантировать, что под стек останется как минимум 256 байт */ + ASSERT(. < (_memory_size - 256), + "Program size is too big") + + /* Перемещаем счетчик адресов в конец памяти (чтобы после мы могли + использовать его в вызове ALIGN) */ + . = _memory_size; + + /* + Размещаем указатель программного стека так близко к концу памяти, + насколько это можно с учетом требования о выравнивании адреса + стека до 16 байт. + */ + _stack_ptr = ALIGN(16) <= _memory_size ? + ALIGN(16) : ALIGN(16) - 16; + ASSERT(_stack_ptr <= _memory_size, "SP exceed memory size") + +} + +``` + +### Файл первичных команд при загрузке (startup.S) + +В стартап-файле хранятся инструкции, которые обязательно необходимо выполнить перед началом исполнения любой программы. Это инициализация регистров указателей на стек и глобальную область данных, регистра, хранящего адрес вектора прерываний и т.п. + +По завершению инициализации, стартап-файл выполняет процедуру передаче управления точке входа в запускаемую программу. + +```asm + .section .boot + + .global _start +_start: + la gp, _gbl_ptr # Инициализация глобального указателя + la sp, _stack_ptr # Инициализация указателя на стек + +# Инициализация (зануление) сегмента bss + la t0, _bss_start + la t1, _bss_end +_bss_init_loop: + beq t0, t1, _main_call + sw zero, 0(t0) + addi t0, t0, 4 + j _bss_init_loop + +# Вызов функции main +_main_call: + li a0, 0 # Передача аргументов argc и argv в main. Формально, argc должен + li a1, 0 # быть больше нуля, а argv должен указывать на массив строк, + # нулевой элемент которого является именем исполняемого файла, + # Но для простоты реализации оба аргумента всего лишь обнулены. + # Это сделано для детерминированного поведения программы в случае, + # если будет пытаться использовать эти аргументы. + call main +# Зацикливание после выхода из функции main +_endless_loop: + j _endless_loop +``` + +## Практика + +Для того, чтобы запустить симуляцию исполнения программы на вашем процессоре, сперва эту программу необходимо скомпилировать и преобразовать в текстовый файл, которым САПР сможет проинициализировать память процессора. Для компиляции программы, вам потребуется особый компилятор, называемый "кросскомпилятор". Он позволяет компилировать исходный код под архитектуру компьютера, отличную от компьютера, на котором ведется компиляция. В нашем случае, вы будете собирать код под архитектуру RISC-V на компьютере с архитектурой `x86_64`. + +Компилятор, который подойдет для данной задачи (для запуска в операционной системе Windows) вы можете скачать [отсюда](https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/latest/download/xpack-riscv-none-elf-gcc-12.2.0-3-win32-x64.zip). + +Вам потребуется скомпилировать файлы с исходным кодом в объектные. Это можно сделать следующей командой: + +```text +<исполняемый файл компилятора> -с <флаги компиляции> <входной файл с исходным кодом> -o <выходной объектный файл> +``` + +Вам потребуются следующие флаги компиляции: + +* `-march=rv32i` — указание разрядности и набора расширений в архитектуре, под которую идет компиляция +* `-mabi=ilp32` — указание двоичного интерфейса приложений + +С учетом названия исполняемого файла скачанного вами компилятора (при условии, что папку из архива вы переименовали в `riscv_cc` и скопировали в корень диска `C:`, а команду запускаете из терминала `git bash`), командой для компиляции файла [`startup.S`](startup.S) может быть: + +```bash +/c/riscv_cc/bin/riscv-none-elf-gcc -c -march=rv32i -mabi=ilp32 startup.S -o startup.o +``` + +Далее необходимо выполнить компоновку объектных файлов. Это можно выполнить командной следующего формата: + +```text +<исполняемый файл компилятора> <флаги компоновки> <входные объектные файлы> -o <выходной объектный файл> +``` + +Исполняемый файл компилятора тот же самый, флаги компоновки будут следующие: + +* `-march=rv32i -mabi=ilp32` — те же самые флаги, что были при компиляции (нам все еще нужно указывать архитектуру, иначе компоновщик может скомпоновать объектные файлы со стандартными библиотеками от другой архитектуры) +* `-Wl,--gc-sections` — указать компоновщику удалять неиспользуемые секции (сокращает объем итогового файла) +* `-nostartfiles` — указать компоновщику не использовать стартап-файлы стандартных библиотек (сокращает объем файла) +* `-T $(LINK_SCRIPT)` — передать компоновщику скрипт компоновки + +Пример команды компоновки: + +```bash +/c/riscv_cc/bin/riscv-none-elf-gcc -march=rv32i -mabi=ilp32 -Wl,--gc-sections -nostartfiles -T linker_script.ld startup.o main.o -o result.elf +``` + +В результате компоновки вы получите исполняемый файл формата `elf` ([Executable and Linkable Format](https://ru.wikipedia.org/wiki/Executable_and_Linkable_Format)). Это двоичный файл, однако это не просто набор двоичных инструкций и данных, которые будут загружены в память процессора. Данный файл содержит заголовки и специальную информацию, которая поможет загрузчику разместить этот файл в памяти компьютера. Поскольку роль загрузчика будете выполнять вы и САПР, на котором будет вестись моделирование, эти данные вам не понадобятся, поэтому вам потребуется экспортировать из данного файла только двоичные инструкции и данные, отбросив всю остальную информацию. Полученный файл уже можно будет использовать в функции `$readmemh`. + +Для экспорта используйте команду: + +```bash +/c/riscv_cc/bin/riscv-none-elf-objcopy -O verilog result.elf init.mem +``` + +ключ `-O verilog` говорит о том, что файл надо сохранить в формате, который сможет воспринять команда `$readmemh`. +Если память инструкций и данных у вас разделены, можно экспортировать отдельные секции в разные файлы: + +```bash +/c/riscv_cc/bin/riscv-none-elf-objcopy -O verilog -j .text result.elf init_instr.mem +/c/riscv_cc/bin/riscv-none-elf-objcopy -O verilog -j .data -j .bss result.elf init_data.mem +``` + +В процессе отладки лабораторной работы потребуется много раз смотреть на программный счетчик и текущую инструкцию. Довольно тяжело декодировать инструкцию самостоятельно, чтобы понять что сейчас выполняется. Для облегчения задачи можно дизасемблировать скомпилированный файл. Полученный файл на языке ассемблера будет хранить адреса инструкций, а так же их двоичное и ассемблерное представление. + +Пример дизасемблированного файла: + +```asm +Disassembly of section .text: + +00000000 <_start>: + 0: 00001197 auipc gp,0x1 + 4: adc18193 addi gp,gp,-1316 # adc <_gbl_ptr> + 8: 76000113 li sp,1888 + c: 2dc00293 li t0,732 + 10: 2dc00313 li t1,732 + +00000014 <_bss_init_loop>: + 14: 00628863 beq t0,t1,24 <_irq_config> + 18: 0002a023 sw zero,0(t0) + 1c: 00428293 addi t0,t0,4 +... + +00000164 : + 164: fd010113 addi sp,sp,-48 + 168: 02112623 sw ra,44(sp) + 16c: 02812423 sw s0,40(sp) + 170: 03010413 addi s0,sp,48 + 174: fca42e23 sw a0,-36(s0) + 178: fcb42c23 sw a1,-40(s0) + 17c: fe042623 sw zero,-20(s0) + 180: 09c0006f j 21c +... + +00000244
: + 244: ff010113 addi sp,sp,-16 + 248: 00112623 sw ra,12(sp) + 24c: 00812423 sw s0,8(sp) + 250: 01010413 addi s0,sp,16 + 254: 00a00593 li a1,10 + 258: 2b400513 li a0,692 + 25c: f09ff0ef jal ra,164 + 260: 2b400793 li a5,692 +... + +Disassembly of section .data: + +000002b4 : + 2b4: 00000003 lb zero,0(zero) # 0 <_start> + 2b8: 0005 c.nop 1 + 2ba: 0000 unimp + 2bc: 0010 0x10 + 2be: 0000 unimp +... +``` + +Числа в самом левом столбце, увеличивающиеся на 4 — это адреса в памяти. Отлаживая программу на временной диаграмме вы можете ориентироваться на эти числа, как на значения PC. + +Следующая за адресом строка, записанная в шестнадцатеричном виде — это та инструкция (или данные), которая размещена по этому адресу. С помощью этого столбца вы можете проверить, что стянутая инструкция на временной диаграмме (сигнал `instr`) корректна. + +В правом столбце находится ассемблерный (человекочитаемый) аналог инструкции из предыдущего столбца. Например, инструкция `00001197` — это операция `auipc gp,0x1`, где `gp` — это синоним (ABI name) регистра `x3` (см. раздел [Соглашение о вызовах](#соглашение-о-вызовах)). + +Обратите внимание на последнюю часть листинга: дизасм секции `.data`. В этой секции адреса могут увеличиваться на любое число, шестнадцатеричные данные могут быть любого размера, а на ассемблерные инструкции в правом столбце и вовсе не надо обращать внимание. + +Дело в том, что дизасемблер пытается декодировать вообще все двоичные данные, которые видит: не делая различий инструкции это или нет. В итоге, если у него получается как-то декодировать байты из секции данных (которые могут быть абсолютно любыми) — он это сделает. Причем получившиеся инструкции могут быть из совершенно не поддерживаемых текущим файлом расширений: сжатыми (по два байта вместо четырех), инструкциями операций над числами с плавающей точкой, атомарными и т.п. + +Это не значит, что секция данных в дизасме бесполезна — в приведенном выше листинге вы можете понять, что первыми элементами массива `array_to_sort` являются числа `3`, `5`, `10`, а так же то, по каким адресам они лежат (`0x2b4`, `0x2b8`, `0x2bc`, если непонятно почему первое число записано в одну 4-байтовую строку, а два других разделены на две двубайтовые — попробуйте перечитать предыдущий абзац). Просто разбирая дизасемблерный файл, обращайте внимание на то, какую именно секцию вы сейчас читаете. + +Для того, чтобы произвести дизасемблирование, необходимо выполнить следующую команду: + +```text +<исполняемый файл дизасемблера> -D (либо -d) <входной исполняемый файл> > <выходной файл на языке ассемблер> +``` + +Для нашего примера, командной будет + +```bash +/c/riscv_cc/bin/riscv-none-elf-objdump -D result.elf > disasmed_result.S +``` + +Опция `-D` говорит что дизасемблировать необходимо вообще все секции. Опция `-d` говорит дизасемблировать только исполняемые секции (секции с инструкциями). Таким образом, выполнив дизасемблирование с опцией `-d` мы избавимся от проблем с непонятными инструкциями, в которые декодировались данные из секции `.data`, однако в этом случае, мы не сможем проверить адреса и значения, которые хранятся в этих секциях. + +--- + +## Задание + +Вам необходимо написать программу для вашего индивидуального задания на языке C или C++ (в зависимости от выбранного языка необходимо использовать соответствующий компилятор: gcc для C, g++ для C++). + +Доступ к контрольным и статусным регистрам осуществляется через разыменование указателей. Скорее всего, вам будет удобно объявить дефайны с базовыми адресами периферийного устройства и смещения до конкретного регистра в контроллере этого устройства. + +При написании программы, помните что в C++ сильно ограничена арифметика указателей, поэтому при присваивании указателю целочисленного значения адреса, необходимо использовать оператор `reinterpret_cast`. + +Пример доступа к регистрам устройства: + +```C++ +#define SUPER_COLLIDER_BASE_ADDR 0x05000000 +#define SUPER_COLLIDER_IS_READY_OFFSET 0x00000000 +#define SUPER_COLLIDER_START_OFFSET 0x00000004 + +void main(int argc, char** argv) +{ + uint32_t* is_ready_ptr = reinterpret_cast(SUPER_COLLIDER_BASE_ADDR + SUPER_COLLIDER_IS_READY_OFFSET); + uint32_t* start_ptr = reinterpret_cast(SUPER_COLLIDER_BASE_ADDR + SUPER_COLLIDER_START_OFFSET); + while(1){ // В бесконечном цикле + while (*is_ready_ptr) // Ждем пока супер-коллайдер не сообщит о готовности + // путем выставления 1 в статусном регистре по нулевому адресу + *start_ptr = 1; // После чего начинаем испытания путем записи единицы + // в контрольный регистр по адресу 4. + } +} +``` + +--- + +### Порядок выполнения задания + +1. Написать программу для своего индивидуального задания на языке C или C++. +2. [Скомпилировать](#практика) программу и [стартап-файл](startup.S) в объектные файлы. +3. Скомпоновать объектные файлы исполняемый файл, передав компоновщику соответствующий [скрипт](linker_script.ld). +4. Экспортировать из объектного файла секции `.text` и `.data` в текстовые файлы `program.txt`, `data.txt`. Если вы не создавали инициализированных статических массивов, то файл `data.txt` может быть оказаться пустым. + 1. Если файл `data.txt` не пустой, необходимо добавить инициализацию памяти данных этим файлом добавлением системной функции `$readmemh` как это было сделано для памяти инструкций. +5. Добавить получившиеся текстовые файлы в проект Vivado. +6. Запустить моделирование исполнения программы вашим процессором. Для отладки во время моделирования будет удобно использовать дизасемблерный файл, ориентируясь на сигналы адреса и данных шины инструкций. +7. Проверить исполнение программы процессором в ПЛИС. + +--- diff --git a/Labs/10. Programming/linker_script.ld b/Labs/10. Programming/linker_script.ld new file mode 100644 index 0000000..1689d96 --- /dev/null +++ b/Labs/10. Programming/linker_script.ld @@ -0,0 +1,97 @@ +OUTPUT_FORMAT("elf32-littleriscv") +ENTRY(_start) + +SECTIONS +{ + PROVIDE( _start = 0x00000000 ); + PROVIDE( _memory_size = 1024); /* 1024 байта */ + + .text : {*(.boot) *(.text*)} + /* + В скриптах линковщика есть внутренняя переменная, записываемая как '.' + Эта переменная называется счетчиком адресов. Она хранит текущий адрес в + памяти. + В начале файла она инициализируется нулем. Добавляя новые секции, эта + переменная будет увеличиваться на размер каждой новой секции. + Если при размещении секций не указывается никакой адрес, они будут размещены + по текущему значению счетчика адресов. + Этой переменной можно присваивать значения, после этого, она будет + увеличиваться с этого значения. + Подробнее: + https://home.cs.colorado.edu/~main/cs1300/doc/gnu/ld_3.html#IDX338 + */ + . = ALIGN(4); + .data : {*(.data*)} + /* + Значение, присвоенное глобальному указателю (GP) выходит за границы RAM, + однако (для архитектуры RISC-V) общепринято присваивать GP значение равное + началу секции данных, смещенное на 2048 байт вперед. + Благодаря относительной адресации со смещением в 12 бит, можно адресоваться + на начало секции данных, а так же по всему адресному пространству вплоть до + 4096 байт от начала секции данных, что сокращает объем требуемых для + адресации инструкций (практически не используются операции LUI, поскольку GP + уже хранит базовый адрес и нужно только смещение). + Подробнее: + https://groups.google.com/a/groups.riscv.org/g/sw-dev/c/60IdaZj27dY/m/s1eJMlrUAQAJ + */ + _gbl_ptr = . + 0x800 ; + . = ALIGN(4); + /* + BSS (block started by symbol, неофициально его расшифровывают как + better save space) — это сегмент, в котором размещаются неинициализированные + статические переменные. В стандарте Си сказано, что такие переменные + инициализируются нулем (или NULL для указателей). Когда вы создаете + статический массив — он должен быть размещен в исполняемом файле. + Без bss-секции, этот массив должен был бы занимать такой же объем + исполняемого файла, какого объема он сам. Массив на 1000 байт занял бы + 1000 байт в секции .data. + Благодаря секции bss, начальные значения массива не задаются, вместо этого + здесь только записываются названия переменных и их адреса. + Однако на этапе загрузки исполняемого файла теперь необходимо принудительно + занулить участок памяти, занимаемый bss-секцией, поскольку статические + переменные должны быть проинициализированы нулем. + Таким образом, bss-секция значительным образом сокращает объем исполняемого + файла (в случае использования неинициализированных статических массивов) + ценой увеличения времени загрузки этого файла. + Для того, чтобы занулить bss-секцию, в скрипте заводятся две переменные, + указывающие на начало и конец bss-секции посредством счетчика адресов. + Подробнее: + https://en.wikipedia.org/wiki/.bss + */ + _bss_start = .; + .bss : {*(.bss*)} + _bss_end = .; + + + /*================================= + Секция аллоцированных данных завершена, остаток свободной памяти отводится + под программный стек и (возможно) кучу. В соглашении о + вызовах архитектуры RISC-V сказано, что стек растет снизу вверх, поэтому + наша цель разместить его в самых последних адресах памяти. + Однако перед этим, мы должны убедиться, что под программный стек останется + хотя бы 256 байт (ничем не обоснованное число, взятое с потолка). + Поскольку указатель стека (SP) должен быть выровнен до 16 байт, мы + обеспечиваем себе максимум 16 вложенных вызовов. + Подробнее: + https://riscv.org/wp-content/uploads/2015/01/riscv-calling.pdf + ================================= + */ + + /* Мы хотим гарантировать, что под стек останется как минимум 256 байт */ + ASSERT(. < (_memory_size - 256), + "Program size is too big") + + /* Перемещаем счетчик адресов в конец памяти (чтобы после мы могли + использовать его в вызове ALIGN) */ + . = _memory_size; + + /* + Размещаем указатель программного стека так близко к концу памяти, + насколько это можно с учетом требования о выравнивании адреса + стека до 16 байт. + */ + _stack_ptr = ALIGN(16) <= _memory_size ? + ALIGN(16) : ALIGN(16) - 16; + ASSERT(_stack_ptr <= _memory_size, "SP exceed memory size") + +} \ No newline at end of file diff --git a/Labs/10. Programming/startup.S b/Labs/10. Programming/startup.S new file mode 100644 index 0000000..a29a316 --- /dev/null +++ b/Labs/10. Programming/startup.S @@ -0,0 +1,28 @@ + .section .boot + + .global _start +_start: + la gp, _gbl_ptr # Инициализация глобального указателя + la sp, _stack_ptr # Инициализация указателя на стек + +# Инициализация (зануление) сегмента bss + la t0, _bss_start + la t1, _bss_end +_bss_init_loop: + beq t0, t1, _main_call + sw zero, 0(t0) + addi t0, t0, 4 + j _bss_init_loop + +# Вызов функции main +_main_call: + li a0, 0 # Передача аргументов argc и argv в main. Формально, argc должен + li a1, 0 # быть больше нуля, а argv должен указывать на массив строк, + # нулевой элемент которого является именем исполняемого файла, + # Но для простоты реализации оба аргумента всего лишь обнулены. + # Это сделано для детерминированного поведения программы в случае, + # если будет пытаться использовать эти аргументы. + call main +# Зацикливание после выхода из функции main +_endless_loop: + j _endless_loop diff --git a/Labs/README.md b/Labs/README.md new file mode 100644 index 0000000..6973e34 --- /dev/null +++ b/Labs/README.md @@ -0,0 +1,140 @@ +# Курс лабораторных работ + +## Содержание +- [Курс лабораторных работ](#курс-лабораторных-работ) + - [Содержание](#содержание) + - [Полезное](#полезное) + - [Порядок выполнения лабораторных работ для групп](#порядок-выполнения-лабораторных-работ-для-групп) + - [ИБ, ИКТ, КТ, РТ](#иб-икт-кт-рт) + - [ПИН, ПМ](#пин-пм) + - [ИВТ](#ивт) + - [Обзор лабораторных работ](#обзор-лабораторных-работ) + - [1. Сумматор. Verilog HDL (Adder)](#1-сумматор-verilog-hdl-adder) + - [2. Арифметико-логическое устройство (ALU)](#2-арифметико-логическое-устройство-alu) + - [3. Регистровый файл и память (RF)](#3-регистровый-файл-и-память-rf) + - [4. Простейшее программируемое устройство (PPD)](#4-простейшее-программируемое-устройство-ppd) + - [5. Основной дешифратор команд (MD)](#5-основной-дешифратор-команд-md) + - [6. Тракт данных (DP)](#6-тракт-данных-dp) + - [7. Блог загрузки и сохранения данных (LSU)](#7-блог-загрузки-и-сохранения-данных-lsu) + - [8. Подсистема прерывания (IC)](#8-подсистема-прерывания-ic) + - [9. Периферийные устройства (PU)](#9-периферийные-устройства-pu) + - [10. Программирование на языке высокого уровня](#10-программирование-на-языке-высокого-уровня) + +## Полезное + +- [Как установить Vivado](../Vivado%20Basics/Install%20Vivado.md) +- [Создание базового проекта с прошивкой ПЛИС в Vivado](../Vivado%20Basics/Vivado%20trainer.md) +- [Что такое язык описания аппаратуры HDL](../Introduction/What%20is%20HDL.md) +- [Как работает ПЛИС](../Introduction/How%20FPGA%20works.md) +- [Синтакс языка Verilog](../Basic%20Verilog%20structures/Verilog%20syntax.md) +- [Базовые конструкции Verilog](../Basic%20Verilog%20structures/) +- [Тестовое окружение](../Basic%20Verilog%20structures/Testbench.md) + +## Порядок выполнения лабораторных работ для групп + +### ИБ, ИКТ, КТ, РТ + +1. Сумматор ([01. Adder](01.%20Adder)) +2. АЛУ ([02. Arithmetic-logic unit](02.%20Arithmetic-logic%20unit)) +3. Регистровый файл и внешняя память ([03. Register file and memory](03.%20Register%20file%20and%20memory)) +4. Простейшее программируемое устройство ([04. Primitive programmable device](04.%20Primitive%20programmable%20device)) + +### ПИН, ПМ + +1. Сумматор ([01. Adder](01.%20Adder)) +2. АЛУ ([02. Arithmetic-logic unit](02.%20Arithmetic-logic%20unit)) +3. Регистровый файл и внешняя память ([03. Register file and memory](03.%20Register%20file%20and%20memory)) +4. Простейшее программируемое устройство ([04. Primitive programmable device](04.%20Primitive%20programmable%20device)) +5. Основной дешифратор ([05. Main decoder](05.%20Main%20decoder)) +6. Тракт данных ([06. Datapath](06.%20Datapath)) +7. Периферийные устройства ([09. Peripheral units](09.%20Peripheral%20units)) +8. Программирование ([10. Programming](10.%20Programming)) + +### ИВТ + +1. АЛУ ([02. Arithmetic-logic unit](02.%20Arithmetic-logic%20unit)) +2. + 1. Память ([03. Register file and memory](03.%20Register%20file%20and%20memory)), + 2. Простейшее программируемое устройство ([04. Primitive programmable device](04.%20Primitive%20programmable%20device)) +3. Основной дешифратор ([05. Main decoder](05.%20Main%20decoder)) +4. Тракт данных ([06. Datapath](06.%20Datapath)) +5. Модуль загрузки и сохранения (07. Load-store unit) +6. Контроллер прерываний () +7. Периферийные устройства ([09. Peripheral units](09.%20Peripheral%20units)) +8. Программирование ([10. Programming](10.%20Programming)) + +## Обзор лабораторных работ + +![../.pic/Labs/labs.png](../.pic/Labs/labs.png) + +Курс *Архитектур процессорных систем* включает в себя цикл из 10 лабораторных работ, в течение которых используя язык описания аппаратуры **Verilog HDL** на основе **FPGA** (ПЛИС, программируемая логическая интегральная схема), с нуля, последовательно, создается система, под управлением процессора с архитектурой **RISC-V**, управляющего периферийными устройствами и программируемого на языке высокого уровня **C++**. + +Создаваемая система на ПЛИС состоит из: процессора, памяти, контроллера прерываний и контроллеров периферийных устройств. + +![../.pic/Labs/ldone.png](../.pic/Labs/ldone.png) + +Выполнение лабораторных работ это последовательный процесс в результате которого будет освоен ряд различных инструментов и средств. В общих словах это: + +**Verilog HDL** - язык описания аппаратуры, благодаря которому схемы не рисуются, а описываются с помощью текста (кода). + +**Testbench** - тестовые окружения, которые представляют собой несинтезируемые (то есть не существующие в реальном физическом мире) блоки, созданные на языке Verilog HDL для автоматического тестирования разрабатываемых устройств и проверки их корректной работоспособности. + +**FPGA** - программируемая логическая интегральная схема (ПЛИС), изменяя внутреннюю конфигурацию которой можно создать любые цифровые устройства (в рамках предоставляемых ресурсов). + +**Vivado** - система автоматизированного проектирования, которая превращает Verilog-код в конфигурацию и прошивает ей ПЛИС на отладочной плате. + +**Архитектура RISC-V** - открытая и свободная система команд и процессорная архитектура на основе концепции RISC для микропроцессоров и микроконтроллеров. + +**Язык ассемблера RISC-V** - список основных команд и особенности их использования и написания программ. + +**Ассемблер RISC-V** - программа, которая превращает код, написанный на языке ассемблера RISC-V в машинные инструкции для процессора с архитектурой RISC-V. + +Далее приводится краткое описание и цель каждой отдельной лабораторной работы. + +## 1. Сумматор. Verilog HDL (Adder) + +![../.pic/Labs/l1.png](../.pic/Labs/l1.png) +На первой лабораторной работе изучаются базовые конструкции языка описания аппаратуры Verilog HDL, с помощью которого разрабатывается цифровой сумматор из примитивных логических вентилей, который, в последствии, конфигурируется в ПЛИС и его работа проверяется на отладочном стенде. + +## 2. Арифметико-логическое устройство (ALU) + +![../.pic/Labs/l2.png](../.pic/Labs/l2.png) +На второй лабораторной изучаются новые конструкции языка Verilog HDL, на основе которых разрабатывается блок арифметико-логического устройства (АЛУ). АЛУ - это устройство, на входы которого подаются операнды, над которыми нужно выполнить некоторую операцию (сложение, вычитание и тому подобное) и код операции, которую нужно выполнить, а на выходе появляется результат этой операции. Проще говоря АЛУ - это "калькулятор" процессора. + +Для проверки правильной работоспособности АЛУ в конце лабораторной работы, на языке Verilog HDL, пишется testbench (тестовое окружение), которое автоматически проверяет корректность его реализации. + +## 3. Регистровый файл и память (RF) + +![../.pic/Labs/l3.png](../.pic/Labs/l3.png) +На третьей лабораторной разрабатываются элементы памяти для будущего процессора: память команд, память данных и регистровый файл. В памяти команд будет храниться программа, которую будет выполнять процессор. В памяти данных хранятся данные, которые будут обрабатываться процессором. Регистровый файл - это маленькая память, тоже с данными, которые могут быть поданы непосредственно на АЛУ. Особенность RISC-архитектур в том, что данные перед обработкой необходимо перенести из памяти данных в регистровый файл, только после этого к ним можно применять различные операции. + +## 4. Простейшее программируемое устройство (PPD) + +![../.pic/Labs/l4.png](../.pic/Labs/l4.png) +Эта работа – небольшое отступление от реализации процессора с архитектурой RISC-V и нужна для более глубокого понимания принципов работы и организации программируемых устройств. В рамках четвертой лабораторной работы из реализованных блоков собирается примитивное программируемое устройство, для которого пишется программа в машинных кодах. + +## 5. Основной дешифратор команд (MD) + +![../.pic/Labs/l5.png](../.pic/Labs/l5.png) +Пятая лабораторная посвящена разработке устройства управления – основному дешифратору команд. Функция основного дешифратора - получать на вход коды выполняемых операций и преобразовывать их в управляющие сигналы для всех блоков процессора (АЛУ, память, регистровый файл, мультиплексоры). Работа требует внимательности в реализации, а ее результат проверяется заранее подготовленными автоматическими тестами. + +## 6. Тракт данных (DP) + +![../.pic/Labs/l6.png](../.pic/Labs/l6.png) +Разработанные блоки объединяются, образуя тракт данных, управляемый основным дешифратором команд. Результатом шестой лабораторной работы является однотактный процессор, с архитектурой RISC-V, поддерживающий стандартный набор целочисленных инструкций RV32I. В качестве проверки на процессоре запускаются программы, заранее написанные на языке ассемблера RISC-V. Сравнивается результат полученный на симуляторе и на разработанном процессоре. + +## 7. Блог загрузки и сохранения данных (LSU) +![../.pic/Labs/l7.png](../.pic/Labs/l7.png) +В современных компьютерах память является отдельным от процессора устройством. В пятой работе память программ и память данных выносится за пределы процессора, объединяются в одну общую память и подключается через общую шину. В процессоре для этого появляется блок Load/Store Unit. + +## 8. Подсистема прерывания (IC) +![../.pic/Labs/l8.png](../.pic/Labs/l8.png) +Одной из основных функций процессоров является возможность реагировать на внешние события (дернуть мышку, нажать кнопку и т.п.), автоматически запуская, при их возникновении, соответствующие программы. В шестой работе создается и подключается подсистема прерывания, к которой относятся контроллер прерываний с циклическим опросом и блок регистров статуса и управления. + +## 9. Периферийные устройства (PU) +![../.pic/Labs/l9.png](../.pic/Labs/l9.png) +На седьмой работе создаются и подключаются к общей шине и подсистеме прерывания контроллеры периферийных устройств, такие как контроллер клавиатуры и VGA-контроллер. + +## 10. Программирование на языке высокого уровня +![../.pic/Labs/l10.png](../.pic/Labs/l10.png) +В рамках восьмой работы настраивается компилятор GCC для RISC-V и для разработанной системы пишется программное обеспечение на языке программирования C++. diff --git a/Other/Basic definitions.md b/Other/Basic definitions.md new file mode 100644 index 0000000..42a9ec2 --- /dev/null +++ b/Other/Basic definitions.md @@ -0,0 +1,83 @@ +# Список основных терминов (must know!) + +Ниже приводится перечень основных терминов, понимание которых является обязательным, без чего нельзя заключить вывод о том, что акт передачи знаний студенту совершен! В противном случае, из непонимания какого-то термина следует непонимание тех разделов дисциплины, в которых на него опираются. Некоторые из них имеют критически высокий уровень значимости. К таковым, например, относятся *процессор*, *архитектура*, *система команд.* Непонимание выпускником технической специальности смысла этих слов сравнимо со врачом непонимающим, что такое иммунитет. Это неприемлемо! + +Главное не заучить определения, а именно понимать смысл. Если не ошибаюсь, это сказал Эйнштейн: «если ты не можешь что-то объяснить школьнику, значит ты сам это не понимаешь». На экзамене, в беседе, мы будем проверять понимание нижеизложенного. + +Отдельно подчеркну: нижеизложенное является необходимым, но недостаточным для успешной сдачи экзамена. + +**Процессор** – это программно-управляемое устройство, как правило, выполненное на одной интегральной схеме, осуществляющее цифровую обработку информации и управление этим процессом. + +**Микроконтроллер** – это устройство, конструктивно выполненное на базе одной интегральной схемы и содержащее в себе процессор, оперативное и постоянное запоминающие устройства, а также различные периферийные устройства (например: АЦП, ЦАП, контроллеры интерфейсов, таймеры, модули ШИМ и т.д.). + +**Интегрированный процессор** – это специализированный процессор, функциональные возможности которого отражают специфику решаемых с его помощью задач. + +**Процессор цифровой обработки сигналов** (ПЦОС, Digital Signal Processor, DSP) – это специализированный процессор, ориентированный на реализацию процедур, обеспечивающих преобразование аналоговых сигналов, представленных в цифровой форме. + +**Инструкция** (Команда) – это отдельная операция процессора, определенная системой команд и, которая, содержит в себе закодированную информацию о том, какое действие необходимо совершить и, если это требуется, над какими данными. + +**Программа** – это комбинация инструкций и данных, позволяющая аппаратному обеспечению вычислительной системы выполнять вычисления или функции управления. + +**Слово** – это определяемая архитектурой величина, измеряемая в битах или байтах и равная разрядности регистров процессора и\или шины данных. + +**Арифметико-логическое устройство** (АЛУ) – это устройство, предназначенное для выполнения арифметических и поразрядно-логических операций над многоразрядными словами. + +**Критический путь** – это самый длинный путь прохождения сигнала в комбинационной схеме (характеризует максимальное время распространения сигнала в этой комбинационной схеме: от начала изменений значений на входах, до момента, когда все выходы достигнут установившихся значений). + +**Архитектура** – абстрактная модель совокупности функциональных возможностей процессора. + +**Микроархитектура** – это структурная организация процессора, описывающая, как именно расположены и соединены друг с другом его функциональные узлы (регистры, АЛУ, конечные автоматы, блоки памяти и другие блоки, необходимые для реализации архитектуры). + +**Архитектура системы команд** (Instruction Set Architecture, ISA) – часть архитектуры, определяющая программируемую часть процессора, то есть средства вычислительной машины, которые видны и доступны программисту (система команд, поддерживаемые форматы данных, системы регистров, способы адресации, модели памяти и т.д.). + +**Система команд** – это совокупность команд (инструкций), выполнение которых на аппаратном уровне поддерживает процессор. + +**Устройство управления** – блок процессора, организующий последовательную выборку команд из памяти, их дешифрацию и формирование соответствующих управляющих сигналов для всех блоков процессора. + +**Конвейер команд** (Вычислительный конвейер) – это способ временного распараллеливания исполняемых команд, при котором выполнение команд разделяется на несколько более простых операций (называемых ступенями), под каждую из которых выделен свой блок аппаратуры и организована передача данных между ними, благодаря чему можно одновременно выполнять несколько команд на разных стадиях конвейера. + +**Конфликты конвейера** – это ситуации, которые препятствуют выполнению очередной команды из потока команд в предназначенном для нее такте, по причине нехватки ресурсов (структурный конфликт), зависимости от данных, получаемых в еще незавершенной команде (конфликт по данным) или из-за неопределенности – какую команду загружать после команды условного перехода, до того, как истинность условия стала известной (конфликт по управлению). + +**Прерывание** – это автоматическое изменение хода выполнения программы (запуск подпрограммы обработчика прерывания), вызванное событием (программным или аппаратным) или совокупностью событий, возникших в некоторой части вычислительной системы. + +**Вектор прерывания** – адрес начала подпрограммы обработчика прерывания, который загружается в счетчик команд (Program counter) при возникновении соответствующего прерывания. + +**Исключения** – это нештатные ситуации, возникающие при ошибках в работе процессора, либо ошибках при работе с памятью. + +**Стек** – способ организации памяти, при котором слово данных, записанное последним, при считывании будет доступно первым (Last In, First Out, LIFO). + +**Ассоциативная память** – это способ организации памяти, при котором поиск требуемых данных происходит не по адресу местоположения в памяти, а по уникальным признакам (тегам), хранящимся вместе с соответствующими данными. + +**Локальность по обращению** – это понятие, отражающее закономерность обращений программ к памяти и, с высокой вероятностью, проявляющееся в повторном использовании данных, к которым недавно уже обращались (временная локальность данных), и в использовании в ближайшем будущем данных, находящихся по соседним адресам (пространственная локальность программ и данных). + +**Кэш-память** – память малого объема, работающая значительно быстрее основной памяти – на частоте ядра процессора, и, храня в себе одновременно лишь малую часть основной памяти, призвана повысить скорость доступа к данным за счет их временной и пространственной локальности. + +**Виртуальная память** – это способ автоматического управления иерархической памятью, при котором для нескольких ее уровней организуется единое адресное пространство, благодаря чему можно создать для программиста видимость памяти большого объема, а перемещая данные между уровнями (согласно локальности по обращению) для большинства обращений к памяти обеспечивать скорость доступа, равную скорости более быстрых типов памяти. + +**Транзакция** – операция на шине. + +**Шина** – это группа сигнальных линий, предназначенных для выполнения определенной функции в программно-управляемом процессе передачи данных. + +**Интерфейс** – совокупность механических, электрических и программных средств, с помощью которых компоненты системы объединяются для решения задачи обмена информации. + +**Арбитр магистрали** – это устройство, контролирующее соблюдение правил предоставления общей шины одному из запросивших ее устройств, другими словами, арбитр выбирает какому устройству и на сколько время предоставить управление шиной для передачи информации, вместе с тем контролирует присутствие на общей шине строго не более одного ведущего устройства в любой момент времени. + +**Совмещенное адресное пространство** – это способ построения систем ввода\вывода, при котором определенная область адресов памяти отводится для адресации регистров устройств ввода\вывода. + +**Выделенное адресное пространство** – это способ построения систем ввода\вывода, при котором система памяти и система ввода\вывода имеют собственные, отдельные системы адресов, с изолированными, раздельными линиями адреса, в связи с чем, для управления вводом\выводом используются специальные инструкции. + +**Принстонская архитектура** – это способ организации памяти, при котором для хранения программ и данных используется единая (общая) память с разделенным по времени доступом (по очереди) к командам, либо данным, по общей шине процессор-память. + +**Гарвардская архитектура** – это способ организации памяти, при котором используют отдельную память для хранения программ, и отдельную память для данных, каждая из которых соединена с процессором собственной шиной. + +**CISC** (Complex Instruction Set Computer) – это архитектура с полным набором команд, изначально ориентированная на уменьшении рутины при программировании, она характеризуется наличием большого (около тысяча и более) количества разнообразных простых и сложных команд и множеством различных способов адресации операндов, благодаря чему коды инструкций имеют переменную длину, а в качестве операндов могут использоваться ячейки основной памяти. + +**RISC** (Reduced Instruction Set Computer) – это архитектура с сокращенным набором команд, которая ориентирована на простоту реализации, из-за чего поддерживает, в основном, не более сотни команд, кодируемых словами фиксированной длины, и использующей всего несколько способов адресации операндов, но выполнять операции можно только с данными из регистрового файла, в связи с чем необходимо применять специальные команды пересылки данных между основной памятью и процессором. + +**VLIW** (Very Long Instruction Word) – это архитектура со сверхдлинным командным словом, характеризующаяся увеличенным количеством исполнительных устройств, а сверхдлинная команда, является, по сути, склейкой нескольких выполняющихся одновременно RISC-инструкций, каждая из которых управляет определенным исполнительным устройством, что предоставляет программисту все возможности параллельной обработки. + +**Скалярный процессор** – это процессор, в каждый момент времени осуществляющий работу только над одной порцией данных. + +**Суперскалярный процессор** – это процессор, который одновременно выполняет более чем одну скалярную команду. + +**Суперскалярная архитектура** – это архитектура с увеличенным количеством исполнительных устройств, в которой параллельная обработка достигается за счет выборки сразу нескольких инструкций за раз, динамически распределяя между исполнительными устройствами с целью их максимальной загрузки. diff --git a/Other/FAQ.md b/Other/FAQ.md new file mode 100644 index 0000000..0f18b31 --- /dev/null +++ b/Other/FAQ.md @@ -0,0 +1,149 @@ +# Список типичных ошибок при работе с Vivado и Verilog + +## Содержание + +1. [Ошибки, связанные с САПР Vivado](#ошибки-связанные-с-сапр-vivado) +1.1 [Не запускается симуляция: FATAL_ERROR: PrivateChannel: Error creating client socket](#не-запускается-симуляция-fatal_error-privatechannel-error-creating-client-socket) +1.2 [Не запускается симуляция: boot::filesystem::remove: Процесс не может получить доступ к файлу, т.к. этот файл занят другим процессом](#не-запускается-симуляция-boot-filesystem-remove-процесс-не-может-получить-доступ-к-файлу) +1.3 [Вылетает Vivado при попытке открыть схему](#вылетает-vivado-при-попытке-открыть-схему) +1.4 [Не устанавливается Vivado: The following fatal error encountered while installing files: Unable to open archive](#не-устанавливается-vivado-unable-to-open-archive) + +2. [Ошибки синтаксиса языка Verilog](#ошибки-синтаксиса-языка-verilog) +2.1 [concurrent assignment to a non-net is not permitted](#concurrent-assignment-to-a-non-net-is-not-permitted) +2.2 [procedural assignment to a non-register test is not permitted, left-hand side should be reg/integer/time/genvar](#procedural-assignment-to-a-non-register-test-is-not-permitted-left-hand-side-should-be-reg) +2.3 ['имя сигнала' is not a type](#имя-сигнала-is-not-a-type) +2.4 [cannot find port on this module](#cannot-find-port-on-this-module) + +## Ошибки связанные с САПР Vivado + +### Не запускается симуляция FATAL_ERROR PrivateChannel Error creating client socket + +**Причина:** ошибка [связана с проблемами Win Sockets](https://support.xilinx.com/s/question/0D52E00006iI37SSAS/isim-124-m81d-fatal-error-privatechannel-error-creating-client-socket?language=en_US), из-за которых симуляция не может быть запущена на сетевых дисках. +**Способ воспроизведения ошибки:** создать проект на сетевом диске. +**Решение:** Скорее всего, вы создали проект на диске `H:/`. Создайте проект на локальном диске (например, на рабочем столе диске `C:/`) + +--- + +### Не запускается симуляция boot filesystem remove Процесс не может получить доступ к файлу + +
+ +Скриншот ошибки: + +![../.pic/Other/FAQ/boot_filesystem_remove.png](../.pic/Other/FAQ/boot_filesystem_remove.png) + +
+ +**Причина:** вы запустили симуляцию с другим `top level`-модулем, не закрыв предыдущую симуляцию. +Скорее всего, после создания тестбенча, вы слишком быстро запустили первую симуляцию. Из-за этого, Vivado не успел обновить иерархию модулей и сделать тестбенч `top-level`-модулем. На запущенной симуляции все сигналы находились в Z и X состояниях, после чего вы попробовали запустить ее снова. К моменту повторного запуска иерархия модулей обновилась, сменился `top-level`, что и привело к ошибке. +**Способ воспроизведения ошибки:** запустить симуляцию, создать новый файл симуляции, сделать его `top-level`-модулем, запустить симуляцию. +**Решение:** Закройте предыдущую симуляцию (правой кнопкой мыши по кнопки SIMULATION -> Close Simulation) затем запустите новую. + +
+ +Иллюстрация закрытия симуляции: + +![../.pic/Other/FAQ/close_sim.png](../.pic/Other/FAQ/close_sim.png) + +
+ +--- + +### Вылетает Vivado при попытке открыть схему + +**Причина:** кириллические символы (русские буквы) в пути рабочей папки Vivado. Скорее всего, причина в кириллице в имени пользователя (**НЕ В ПУТИ УСТАНОВКИ VIVADO**). +**Способ воспроизведения ошибки:** (см. решение, только для воспроизведение необходимо сделать обратно, дать папке имя с кириллицей) +**Решение:** Чтобы не создавать нового пользователя без кириллицы в имени, проще назначить Vivado новую рабочую папку. +Для этого: + +1. Создайте в корне диска `C:/` какую-нибудь папку (например Vivado_temp). +2. Откройте свойства ярлыка Vivado (правой кнопкой мыши по ярлыку -> свойства) +2.1 Если у вас нет ярлыка Vivado на рабочем столе, вместо этого вы запускаете его из меню пуск, кликните в меню пуск правой кнопкой мыши по значку Vivado -> открыть расположение файла. Если там будет ярлык выполните пункт 2, если там будет исполняемый файл — создайте ярлык для этого файла (правой кнопкой мыши по файлу -> создать ярлык) и выполните пункт 2. +3. В поле "Рабочая папка", укажите путь до созданной вами директории (в примере пункта 1 этот путь будет: `C:/Vivado_temp`). Нажмите "ОК". + +--- + +### Не устанавливается Vivado Unable to open archive + +
+ +Иллюстрация: + +![../.pic/Other/FAQ/unable_to_open_archive.jpg](../.pic/Other/FAQ/unable_to_open_archive.jpg) + +
+ +**Причина:** Скорее всего, проблема в том, что файлы установки (**НЕ ПУТЬ УСТАНОВКИ VIVADO**) расположены по пути с кириллическими символами (например, в какой-то личной папке "Загрузки"). +**Решение:** Переместите файлы установки в директорию, не содержащую кириллицу в пути. + +--- + +## Ошибки синтаксиса языка Verilog + +### concurrent assignment to a non-net is not permitted + +Запрещено выполнять непрерывное присваивание (`assign`) к объектам, не являющимися цепями. Скорее всего, вы пытались выполнить `assign b = a;`, где `b` является регистром. + +```Verilog +module alu(input a, input b, + input [3:0] alu_op, + output reg flag, + output reg result +); + +assign flag = alu_op[3] ? (a > b) : 1'b0; // ошибка +endmodule +``` + +--- + +### procedural assignment to a non-register test is not permitted left-hand side should be reg + +Запрещено использовать процедурное присваивание (присваивание в блоке `always` или `initial`) объектам, не являющимися регистрами. Скорее всего, вы пытались выполнить `b = a;` или `b <= a;` блоке `always`/`initial`, где `b` является проводом. + +```Verilog +module adder(input a, input b, output c); +always @(*) begin + c = a ^ b; // ошибка, процедурное присваивание + // к проводам запрещено +end +endmodule +``` + +--- + +### имя сигнала is not a type + +Скорее всего, компилятор не распознал присваивание, поскольку оно было записано с ошибками. Вне блоков `always` и `initial` можно выполнять только непрерывное присваивание (через `assign`). + +```Verilog +module adder(input a, input b, output c); +c = a ^ b; // ошибка, для непрерывного присваивания + // необходимо ключевое слово assign +endmodule +``` + +--- + +### cannot find port on this module + +Имя порта, указанного при подключении модуля (после точки) не соответствует ни одному имени сигналов подключаемого модуля + +Пример + +```Verilog +module adder(input a, input b, output c); + assign c = a ^ b; +endmodule + +module testbench(); +reg A, B; +wire C; +adder DUT( + .A(A), // <- здесь будет ошибка, + // т.к. в модуле adder нет порта 'A' + .b(B), + .c(C) +); +endmodule +``` diff --git a/Other/Students server.md b/Other/Students server.md new file mode 100644 index 0000000..ac1f780 --- /dev/null +++ b/Other/Students server.md @@ -0,0 +1,45 @@ +# Учебный сервер для студентов + +Данный сервер поднят для выполнения студентами их [индивидуального задания](../Labs/04.%20Primitive%20programmable%20device#индивидуальные-задания), а так же для тех студентов, кому не хватило места в учебной аудитории. На сервере установлены: `Vivado`, `VSCode`, `gcc`, `git`. Поскольку сервер имеет ограниченные ресурсы, а студенты не имеют привычки закрывать за собой программы при завершении сессии, тут не установлен браузер. Имейте в виду, что если вы закрыли сессию, не закрыв Vivado и там остались несохраненные файлы, то вы рискуете потерять свои изменения. + +## Порядок подключения к серверу + +За каждым студентом закреплена учетная запись на сервере и выданы её логин/пароль. + +Подключение осуществляется из миэтовской сети. Это значит, что для подключения нужно либо подключиться к общажной сети (которая является частью миэтовской), либо воспользоваться [миэтовским vpn](https://vpn.miet.ru/). + +Для подключения, необходимо скачать и установить программу [`X2Go client`](http://code.x2go.org/releases/X2GoClient_latest_mswin32-setup.exe). Во время установки можно оставить все опции без изменений. + +При первом запуске, появится окно настройки подключения (если окно не появилось, нажмите `Ctrl+N`). Вам необходимо заполнить поля: + +- Хост (вводим `82.179.178.13`) +- Пользователь (ввводим логин с листочка) +- SSH порт (вводим `2222`) +- Тип сессии (выбираем `XFCE`) + +Опционально можно настроить `имя сессии` и её `значок`. + +
+ Пример заполненных настроек + + ![../.pic/Other/Students%20server/x2goclient_config.png](../.pic/Other/Students%20server/x2goclient_config.png) + +
+ +После создания сессии, она отобразится в правой части программы. Двойной клик по сессии создаст подключение, в процессе которого от вас потребуется ввести пароль от выданной вам учетной записи. + +## Как работать на сервере + +Запуск `Vivado` осуществляется двумя путями: через `Applications->Development->Vivado`, либо через запуск команды `vivado` в терминале. + +Для копирования своего проекта на сервер можно воспользоваться несколькими путями: клонирование репозитория посредством git, использование утилиты scp, однако для простоты инструкции будет предложено воспользоваться программой с графическим интерфейсом `WinSCP`. + +WinSCP — это программа для Windows с графическим интерфейсом, реализующая передачу файлов между компьютерами поверх инструмента scp (secure copy). + +Руководство по установке и запуску схоже с установкой X2Go: + +1. Необходимо [скачать](https://winscp.net/eng/downloads.php) и установить программу (при установке можно выбрать рекомендованные настройки, можно их кастомизировать под себя). +2. При запуске вам предложат ввести данные для подключения. Заполняете поля аналогично тому, как вы делали для X2Go. Выпадающий список `File Protocol` можете оставить без изменений. +3. В данной программе вы можете сохранить так же и пароль. Вообще говоря это не безопасно и так делать обычно не рекомендуется. +4. Через `Advanced...->Advanced->Directories->Local Directory`, можно настроить папку на вашем компьютере с данными в которой вы сможете взаимодействовать через WinSCP. +5. Интерфейс перемещения данных предельно интуитивен: файлы и папки можно перетаскивать, копировать и вставлять, скачивать и загружать, удалять, перемещать и переименовывать. Делайте как вам удобно. В процессе могут появляться подтверждающие всплывающие окна. diff --git a/Other/Teachers.md b/Other/Teachers.md new file mode 100644 index 0000000..f204263 --- /dev/null +++ b/Other/Teachers.md @@ -0,0 +1,141 @@ +# Преподаватели АПС 2022 + +## Распределение по группам + +| Группа | Расписание лаб | Лектор | Преподаватель | Ассистент | +|------------|------------------------------|---------------------------------------------|---------------------------------------------|-------------------------------------------| +| **ИБ-31** |Ср. 09:00–12:10 — Числитель-II|[Силантьев](#силантьев-александр-михайлович) |[Солодовников](#солодовников-андрей-павлович)|[Демидов](#демидов-александр-александрович)| +| **ИВТ-31** |Пн. 10:40-13:50 — Знаменатель |[Орлов](#орлов-александр-николаевич) |[Солодовников](#солодовников-андрей-павлович)|[Демичев](#демичев-сергей-сергеевич) | +| **ИВТ-32** |Пн. 14:30-17:40 — Числитель |[Орлов](#орлов-александр-николаевич) |[Орлов](#орлов-александр-николаевич) | | +| **ИВТ-33** |Вт. 14:30-17:40 — Числитель |[Орлов](#орлов-александр-николаевич) |[Хисамов](#хисамов-василь-тагирович) |[Замтарадзе](#замтарадзе-артём-раульевич) | +| **ИКТ-31** |Чт. 14:30-17:40 — Числитель-I |[Силантьев](#силантьев-александр-михайлович) |[Хисамов](#хисамов-василь-тагирович) |[Замтарадзе](#замтарадзе-артём-раульевич) | +| **ИКТ-32** |Чт. 14:30-17:40 — Числитель-II|[Силантьев](#силантьев-александр-михайлович) |[Хисамов](#хисамов-василь-тагирович) |[Замтарадзе](#замтарадзе-артём-раульевич) | +| **ИКТ-33** |Пт. 16:10–19:20 — Числитель-I |[Силантьев](#силантьев-александр-михайлович) |[Солодовников](#солодовников-андрей-павлович)|[Демидов](#демидов-александр-александрович)| +| **КТ-31** |Вт. 09:00–12:10 — Знаменатель |[Силантьев](#силантьев-александр-михайлович) |[Солодовников](#солодовников-андрей-павлович)|[Чусов](#чусов-сергей-андреевич) | +| **ПИН-35** |Пн. 14:30-17:40 — Знаменатель |[Орлов](#орлов-александр-николаевич) |[Солодовников](#солодовников-андрей-павлович)|[Демичев](#демичев-сергей-сергеевич) | +| **ПМ-31** |Вт. 12:50–16:00 — Знаменатель |[Орлов](#орлов-александр-николаевич) |[Солодовников](#солодовников-андрей-павлович)|[Чусов](#чусов-сергей-андреевич) | +| **РТ-32** |Чт. 09:00–12:10 — Числитель |[Силантьев](#силантьев-александр-михайлович) |[Хисамов](#хисамов-василь-тагирович) |[Замтарадзе](#замтарадзе-артём-раульевич) | +| **РТ-33** |Чт. 09:00–12:10 — Знаменатель |[Силантьев](#силантьев-александр-михайлович) |[Орлов](#орлов-александр-николаевич) | | + + +## Преподаватели + + + + + +### Орлов Александр Николаевич + +![](../.pic/Other/Teachers/orlov.jpg) + +Старший преподаватель, инженер-электроник в НИИ ВСиСУ + + +--- + + + +### Силантьев Александр Михайлович + +![](../.pic/Other/Teachers/silantiev.jpg) + +Старший преподаватель Института МПСУ, инженер-электроник в НИИ ВСиСУ, руководитель группы + +***telegram***: [`@sam_sil`](http://t.me/sam_sil) + +***Консультации***: пока не определено + +--- + + +### Солодовников Андрей Павлович + +![](../.pic/Other/Teachers/solodovnikov.jpg) + +Аспирант НИУ МИЭТ, инженер-электроник в НИИ ВСиСУ + +***telegram***: [`@HepoH`](http://t.me/HepoH) + +***Консультации***: + +| День | Неделя | Время | Аудитория | +|------ |------------ |-----------|-----------| +|Четверг|Знаменатель-II|18:20-19:50| 4328 | +|Пятница|Числитель-II |18:20-19:50| 4338 | + +--- + +### Хисамов Василь Тагирович + +--- + +![](../.pic/Other/Teachers/hisamov.jpg) + +Старший преподаватель Института МПСУ, инженер-электроник в НИИ ВСиСУ + +***telegram***: [`@PascalVT`](http://t.me/PascalVT) + +***e-mail***: Xisamoffvasil[*собака*]mail.ru + +***Консультации***: пока не определено + +### Чусов Сергей Андреевич + +![](../.pic/Other/Teachers/chusov.jpg) + +Аспирант НИУ МИЭТ, инженер-электроник в НИИ ВСиСУ + +***telegram***: [`@srg_chs`](http://t.me/srg_chs) + +--- +## Ассистенты + +### Замтарадзе Артём Раульевич + +![](../.pic/Other/Teachers/zamtaradze.jpg) + +Магистрант ИВТ (IoT), инженер в НПК ТЦ, + +***telegram***: [`@gad_dam`](http://t.me/gad_dam) + +Почта: artyomzamtaradze[*собака*]yandex.ru + +--- + +### Демидов Александр Александрович + +![](../.pic/Other/Teachers/demidov.jpg) + +Магистрант ИВТ + +***telegram***: [`@AlexBee4`](http://t.me/AlexBee4) + +--- + +### Демичев Сергей Сергеевич + +![](../.pic/Other/Teachers/demichev.jpg) + +Магистрант ИВТ + +***telegram***: [`@darthajFox`](http://t.me/darthajFox) + +--- \ No newline at end of file diff --git a/Other/VSCode Verilog Simulation.md b/Other/VSCode Verilog Simulation.md new file mode 100644 index 0000000..2c5ce73 --- /dev/null +++ b/Other/VSCode Verilog Simulation.md @@ -0,0 +1,82 @@ +# Руководство по интеграции Icarus Verilog в VSCode + +Данное руководство позволяет интегрировать бесплатный Verilog-симулятор с редактором VSCode. После выполнения всех этапов, будет возможно запускать симуляцию прямо из редактора, а затем просматривать временную диаграмму (в ограниченном режиме, об этом ниже). + +Пример использования: + +![../.pic/Other/VSCode%20Verilog%20Simulation/icarus_verilog_integration.png](../.pic/Other/VSCode%20Verilog%20Simulation/icarus_verilog_integration.png) + +Для получения данного результата, необходимо выполнить следующие шаги: + +## Установка ПО + +1. Скачать и установить [Icarus Verilog](https://bleyer.org/icarus/) (при установке убедитесь, что стоят галочки `Install GTKWave (x64)`, `Add executable folder(s) to the user PATH`) +2. Скачать, установить и запустить [Visual Studio Code](https://code.visualstudio.com/Download) +3. После запуска VSCode, необходимо перейти на вкладку "Расширения" (можно открыть через `Ctrl+Shift+X`) +4. Устанавливаем следующие расширения: + 1. `Verilog-HDL/SystemVerilog/Bluespec SystemVerilog support for VS Code` + 2. `Verilog Testbench Runner` + 3. `WaveTrace` + +Расширение `Bluespec SystemVerilog support for VS Code` добавляет подсветку синтаксиса языка Verilog. +Расширение `Verilog Testbench Runner` добавляет на панель Verilog-файла кнопку `▶`, позволяющую запустить симуляцию без вызова команд `Icarus Verilog` в терминале. +Расширение `WaveTrace` позволяет просматривать временные диаграммы прямо в VSCode. + +На этом все настройки завершены. + +## Изменение Verilog-файлов + +Для того, чтобы при компиляции тестбенча, подхватывались файлы описанных модулей, необходимо в самый верх тестбенча дописать директиву (см. пример использования, 1): + +```Verilog +`include "имя файла, содержащего тестируемый модуль" +``` + +А внутрь модуля `testbench` необходимо добавить блок: + +```Verilog +initial begin + $dumpfile("tb.vcd"); + $dumpvars(0, fulladder32_tb); // fulladder32_tb <- имя модуля тестбенча +end +``` + +(см. пример использования, 2) + +--- + +Кроме того, необходимо убедиться, что в модуле тестбенча нет системных функций: `$stop` (проверьте через поиск, если есть — удалите). Если в процессе симуляции произойдет вызов этой системной функции, её не удастся продолжить (в отличие от Vivado). + +--- + +После этого нажимаем на зеленую кнопку `▶` (пример использования, 3), в логе будут либо сообщения об ошибках компиляции, либо результатах симуляции (пример использования, 4). +Если симуляция будет завершена успешно, в подпапке build появится файл с расширением `.vcd` (пример использования, 5). При открытии этого файла, появится вкладка расширения `WaveTrace` (вкладку можно расположить в соседней панели, перетянув ее). +Чтобы увидеть временную диаграмму, необходимо добавить отображаемые сигналы (пример использования, 6). Ограничение бесплатной версии `WaveTrace` заключается в том, что можно отобразить изменения только восьми сигналов одновременно (если понадобятся еще сигналы, придется сперва удалить какие-то предыдущие). +После всех этих действий вы сможете увидеть временную диаграмму (пример использования, 7). + +## Как запустить симуляцию с предоставленными мне файлами? + +Если вы пропустили, или не сделали какую-то из лаб, вам потребуется взять готовые модули из ветки [Я-не-смог](https://github.com/MPSU/APS/tree/%D0%AF-%D0%BD%D0%B5-%D1%81%D0%BC%D0%BE%D0%B3). Модули в этих ветках являются нетлистами (описанием модуля на языке Verilog, полученным [после этапа синтеза](../Vivado%20Basics/Implementation%20steps.md)). +Для того, чтобы симулятор Icarus Verilog мог работать с этим файлом, необходимо предоставить ему библиотеку примитивов из которых был собран нетлист. Для этого, необходимо выполнить следующие шаги: + +1. [Скачать](../../Я-не-смог/unisims.zip) библиотеку примитивов. +2. Распаковать её в папку вашего проекта. +3. Добавить еще одну директиву `ˋinclude` в тестбенч: `ˋinclude "glbl.v"` +4. Добавить в настройки расширения `Verilog Testbench Runner` указание использовать библиотеку `unisims`. Для этого: + 1. Откройте `Файл->Настройки->Параметры` (`File->Preferences->Settings`). + 2. В поле поиска введите: `verilog.icarusCompileArguments`. + 3. В поле найденной опции введите `-y unisims/`. + +### Что делать, если мне нужно отобразить больше, чем 8 сигналов? + +В этом случае, необходимо воспользоваться внешней программой по отображению временных диаграмм: `GTK Wave`. Она должна была быть установлена вами на этапе установке `Icarus Verilog` (см. [Установка ПО](#установка-по)). + +В теории, после завершения симуляции, расширение `Verilog Testbench Runner` +должно предлагать запустить GTK Wave. Если этого не происходит, выполните команду в терминале VSCode: + +```bash +gtkwave build/tb.vcd +``` + +где `tb.vcd` имя временной диаграммы, которое вы указали в блоке `initial` (см. [Изменение Verilog-файлов](#изменение-verilog-файлов)). +Откроется окно GTK Wave. Внутри этого окна, слева, есть вкладка `SST`, где будет расположен модуль вашего тестбенча. Нажав на кнопку `+` слева от имени модуля вы увидите объект `DUT` (имя сущности тестируемого модуля). Если нажать по этому объекту `ПКМ -> Recurse Import -> Append`, вы добавите все внутренние сигналы этого модуля в область просмотра временной диаграммы. diff --git a/Other/rv32i.md b/Other/rv32i.md new file mode 100644 index 0000000..fc63cd3 --- /dev/null +++ b/Other/rv32i.md @@ -0,0 +1,187 @@ +# RV32I - Стандартный набор целочисленных инструкций RISC-V + +Разделы статьи: + +- [Краткая справка по RISC-V и RV32I](#краткая-справка-по-risc-v-и-rv32i) +- [RV32I](#rv32i) +- [Псевдоинструкции](#псевдоинструкции) +- [Переведенные фрагменты спецификации RISC-V](#переведенные-фрагменты-спецификации-risc-v) + +## Краткая справка по RISC-V и RV32I + +RISC-V — открытая и свободная система набора команд (ISA) на основе концепции RISC. Чтобы понять архитектуру любого компьютера, нужно в первую очередь выучить его язык, понять, что он умеет делать. Слова в языке компьютера называются «инструкциями», или «командами», а словарный запас компьютера – «системой команд». + +В архитектуре RISC-V имеется обязательный для реализации минимальный список команд – набор инструкций **I** (Integer). В этот набор входят различные логические и арифметические операции с целыми числами, работа с памятью, и команды управления. Этого достаточно для обеспечения поддержки компиляторов, ассемблеров, компоновщиков и операционных систем (с дополнительными привилегированными инструкциями). Плюс, таким образом обеспечивается удобный "скелет" ISA и программного инструментария, вокруг которого могут быть построены более специализированные ISA процессоров путем добавления дополнительных инструкций. + +Строго говоря RISC-V - это семейство родственных ISA, из которых в настоящее время существует четыре базовые ISA. Каждый базовый целочисленный набор инструкций характеризуется `шириной целочисленных регистров` и соответствующим `размером адресного пространства`, а также `количеством целочисленных регистров`. Существует два основных базовых целочисленных варианта, `RV32I` и `RV64I`, которые, соответственно, обеспечивают 32- или 64-битное адресное пространство и соответствующие размеры регистров регистрового файла. На основе базового набора инструкций `RV32I` существует вариант подмножества `RV32E`, который был добавлен для поддержки небольших микроконтроллеров и имеет вдвое меньшее количество целочисленных регистров – 16, вместо 32. Разрабатывается вариант `RV128I` базового целочисленного набора инструкций, поддерживающий плоское 128-битное адресное пространство. Также, стоит подчеркнуть, что размеры регистров и адресного пространства, во всех перечисленных стандартных наборах инструкций, не влияют на размер инструкций – во всех случаях они кодируются 32-битными числами. То есть, и для `RV32I`, и для `RV64I` одна инструкция будет кодироваться 32 битами. Базовые целочисленные наборы команд используют представление знаковых целых чисел в дополнительном коде. + +В рамках дисциплины АПС затрагивается только `RV32I`, то есть стандартный набор целочисленных инструкций, предусматривающий в процессоре регистровый файл из 32-х 32-битных регистров, и использующий 32-битное адресное пространство памяти. + +Кроме обязательного подмножества целочисленных инструкций, RISC-V предусматривает несколько стандартных опциональных расширений. Вот некоторые из них: + +- **M** — Целочисленное умножение и деление (Integer Multiplication and Division) +- **A** — Атомарные операции (Atomic Instructions), инструкции для атомарного чтения-изменения-записи в память для межпроцессорной синхронизации +- **F** — Стандартное расширение для арифметических операций с плавающей точкой одинарной точности (Single-Precision Floating-Point) добавляет регистры с плавающей точкой, инструкции вычислений с одинарной точностью, а также инструкции загрузки и сохранения в регистровый файл для чисел с плавающей точкой +- **D** — Стандартное расширение с плавающей точкой двойной точности (Double-Precision Floating-Point) расширяет регистры с плавающей точкой до 64 бит и добавляет инструкции вычислений с двойной точностью, загрузку и сохранение +- **C** — Набор сжатых инструкций (Compressed Instructions), позволяющий кодировать инструкции 16-битными словами, что позволяет уплотнить программный код (если одну и ту же программу можно писать 16-битными словами вместо 32-битных, значит её размер сократится в 2 раза). Разумеется у такого уплотнения есть своя цена, иначе инструкции просто кодировали бы 16-ю битами вместо 32. У сжатых инструкций меньший диапазон адресов и констант. +- **Zicsr** — Инструкции для работы с контрольными и статусными регистрами (Control and Status Register (CSR) Instructions). Используется, например, при работе с прерываниями/исключениями и виртуальной памятью +- **Zifencei** — Инструкции синхронизации потоков команд и данных (Instruction-Fetch Fence) + +Поддерживаемые процессором команды отражаются в названии набора инструкций. Например, `RV64IMC` это архитектура RISC-V с 64-битными регистрами и 64-битным адресным пространством, поддерживающая кроме стандартных целочисленных операций умножение и деление **M**, и может выполнять сжатые инструкции **C**. + +Одной из целей проекта RISC-V является его использование в качестве стабильного объекта для разработки программного обеспечения. Для этого ее разработчики определили комбинацию базового ISA (`RV32I` или `RV64I`) и некоторых стандартных расширений (**IMAFD + Zicsr + Zifencei**) как "general-purpose" ISA (набор инструкций общего назначения), а для комбинации расширений набора команд **IMAFDZicsrZifencei** стали использовать аббревиатуру **G**. То есть `RV32G` это тоже самое, что и `RV32IMAFDZicsrZifencei`. + +> Чтобы устройство управления понимало когда оно имеет дело с набором сжатых команд **C**, то есть с 16-битными инструкциями, а когда с другими наборами команд, то есть с инструкциями длиной 32 бита, каждая 32-битная инструкция в младших битах имеет `11`. Если в двух младших битах что-то отличное от `11`, значит это 16-битная инструкция! + +На рисунке ниже показана видимая пользователю структура для основного подмножества команд для целочисленных вычислений `RV32I`. Она содержит `регистровый файл`, состоящий из 31 регистра общего назначения **x1** – **x31**, каждый из которых может содержать целочисленное значение, и регистра **x0**, жестко привязанного к константе 0. В случае `RV32`, регистры **xN**, и вообще все регистры, имеют длину в 32 бита. Также есть `АЛУ`, выполняющее операции над данными в регистровом файле (концепция RISC - load&store), и `память` с побайтовой адресацией и шириной адреса 32 бита. + +Также существует еще один дополнительный видимый пользователю регистр: счетчик команд – `pc` (program counter), который содержит адрес текущей инструкции. `pc` изменяется либо автоматически, указывая на следующую инструкцию, либо в результате использования инструкций управления (операции условного и безусловного переходов). + +![../.pic/Labs/rv_model.png](../.pic/Labs/rv_model.png) + +RISC-V является load&store архитектурой (все операции с числами выполняются над данными только в регистровом файле), поэтому глядя на рисунок выше можно легко заключить, что функционально все инструкции сводятся к трём типам: + +- Операции на АЛУ над числами в регистровом файле +- Операции обмена данными между регистровым файлом и памятью +- Манипуляции с `pc` (другими словами – управление программой) + +Как было сказано ранее, память имеет 32-битную шину адреса и имеет побайтовую адресацию. Это значит, что каждый из 232 байт памяти имеет свой уникальный адрес, по которому к нему можно обратиться, чтобы считать из него или записать в него новую информацию. Однако, инструкции кодируются 32-битными числами, а один байт это всего 8 бит, значит одна инструкция занимает сразу 4 адреса в памяти. Подразумевается, что из такой памяти можно читать одновременно из нескольких последовательных адресов, то есть устройство управления процессора сообщает памяти начальный адрес требуемой ячейки, и количество ячеек (одну, две или четыре), которые нужно прочитать или записать. + +Одна ячейка называется `байт` - 8 бит. Две последовательные 8-битные ячейки называются `полуслово` - 16 бит. Четыре последовательные 8-битные ячейки называются `словом` - 32 бита. Например, если процессор собирается выполнить инструкцию, которая занимает четыре байта по адресам `0x00000007 – 0x00000004`, то он обращается к памяти, сообщая, что "нужны 4 байта начиная с адреса 0x00000004", взамен процессор получает 32-битное число – инструкцию, которая была слеплена из байт, хранящихся в памяти по адресам: 4, 5, 6 и 7, для данного примера. К памяти также можно обратиться за полусловом или за байтом. Предполагается реализация выровненного доступа к памяти, то есть адреса слов и полуслов должны быть кратны 4 и 2, соответственно. + +Аппаратное обеспечение компьютера «понимает» только нули и единицы, поэтому инструкции закодированы двоичными числами в формате, который называется машинным языком. + +Инструкция компьютера кодирует в себе операцию, которую нужно исполнить, и данные, которые ей для этого потребуются. Такими данными могут быть адреса операндов и результата, различные константы. + +В архитектуре RISC-V каждая несжатая инструкция представлена 32-разрядным словом. Микропроцессоры – это цифровые системы, которые читают и выполняют команды машинного языка. Для людей чтение и разработка компьютерных программ на машинном языке представляются нудным и утомительным делом, поэтому мы предпочитаем представлять инструкции в символическом формате, который называется языком ассемблера. Ассемблер позволяет выполнить взаимооднозначный переход от машинного кода к тестовому и обратно. + +## RV32I + +В таблице ниже приводятся 40 команд стандартного набора целочисленных инструкций `RV32I`: мнемоники языка ассемблера, функции, описания, форматы кодирования и значения соответствующих полей при кодировании. В RISC-V предусмотрено несколько форматов кодирования инструкций (следующий рисунок, еще ниже), то есть договоренность какая информация в каком месте 32-битной инструкции хранится и как она представлена. У всех операций есть поле `opcode` (operation code - код операции), в котором закодировано "что нужно сделать". По полю `opcode` устройство управления понимает что требуется сделать процессору и каким именно способом закодирована инструкция (**R**, **I**, **S**, **B**, **U** или **J**). В 32-битных инструкциях два младших бита всегда равны `11`. + +Почти все инструкции имеют поле `Func3`, и некоторые – поле `Func7`. Их названия определены их разрядностью: 3 и 7 бит, соответственно. В этих полях, если они есть у инструкции, закодировано уточнение операции. Например, код операции 0010011 указывает на то, что будет выполняться некоторая операция на АЛУ между значением из регистрового файла и константой. Поле `Func3` уточняет операцию, для данного примера, если оно будет равно 0x0, то АЛУ выполнит операцию сложения между значением из регистра и константой из инструкции. Если `Func3` равно 0x6, то логическое ИЛИ. + +![../.pic/Labs/lab_05_decoder/rv32i_summary.png](../.pic/Labs/lab_05_decoder/rv32i_summary.png) + +На рисунке ниже приводится фрагмент из [`оригинальной спецификации RISC-V`](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf). Сверху приводятся 6 форматов кодирования инструкций: **R**, **I**, **S**, **B**, **U** и **J**, а ниже приводятся конкретные значения полей внутри инструкции. Под `rd` подразумевается 5-битный адрес регистра назначения, `rs1` и `rs2` - 5-битные адреса регистров источников, `imm` — константа, расположение и порядок битов которой указывается в квадратных скобках. Обратите внимание, что в разных форматах кодирования константы имеют различную разрядность, а их биты упакованы по-разному. Для знаковых операций константу предварительно знаково расширяют до 32 бит. Для беззнаковых расширяют нулями до 32 бит. + +Обратите внимание на операции `slli`, `srli` и `srai`, это операции сдвига на константную величину. У этих инструкций немного измененный формат кодирования **I\***. Формат кодирования **I** предоставляет 12-битную константу. Сдвиг 32-битного числа более, чем на 31 не имеет смысла. Для кодирования числа 31 требуется всего 5 бит. Выходит, что из 12 бит константы используется только 5 бит для операции сдвига, а оставшиеся 7 бит – не используются. А, главное (какое совпадение!), эти 7 бит находятся ровно в том же месте, где у других инструкций находится поле `Func7`. Поэтому, чтобы у инструкций `slli`, `srli` и `srai` использующих формат **I** не пропадала эта часть поля, к ней относятся как к полю `Func7`. + +![../.pic/Labs/lab_05_decoder/rv32i_BIS.png](../.pic/Labs/lab_05_decoder/rv32i_BIS.png) + +Ниже, для наглядности, приводится пример кодирования пары инструкций из книги Харриса и Харриса "Цифровая схемотехника и архитектура компьютера" из ассемблерных инструкций в 16-ричные цифры. + +![../.pic/Other/rv32i/example_instr_code.png](../.pic/Other/rv32i/example_instr_code.png) + +Примечание: `s2`, `s3`, `s4`, `to`, `t1`, `t2` — это синонимы регистров `x18`,`x19`,`x20`,`x5`,`x6`,`x7` соответственно. Введены **соглашением о вызовах** (calling convention) для того, чтобы стандартизировать функциональное назначение регистров. Подробнее об этом будет в лабораторной работе по программированию. + +## Псевдоинструкции + +В архитектуре RISC-V размер команд и сложность аппаратного обеспечения минимизированы путем использования лишь небольшого количества команд. Тем не менее RISC-V определяет псевдокоманды, которые на самом деле не являются частью набора команд, но часто используются программистами и компиляторами. При преобразовании в машинный код псевдокоманды транслируются в одну или несколько команд RISC-V. Например, псевдокоманда безусловного перехода `j`, преобразуется в инструкцию безусловного перехода с возвратом `jal` с регистром `x0` в качестве регистра-назначения, то есть адрес возврата не сохраняется. + +![../.pic/Other/rv32i/pseudo.png](../.pic/Other/rv32i/pseudo.png) + +## Переведенные фрагменты спецификации RISC-V + +Далее приводится переведенный фрагмент второй главы [`оригинальной спецификации RISC-V`](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf). + +### Основные типы команд + +В основе ISA лежит четыре основных типа команд (R/I/S/U), которые изображены на рисунке ниже. Все они имеют фиксированную длину в 32 бита и должны быть выровнены в памяти по четырехбайтовой границе. Если адрес перехода (в случае безусловного перехода, либо успешного условного перехода) не выровнен, генерируется исключение о невыровненном адресе инструкции. Исключение не генерируется в случае невыполненного условного перехода. + +![../.pic/Other/rv32i/RISU.png](../.pic/Other/rv32i/RISU.png) + +Для упрощения декодирования, архитектура команд RISC-V сохраняет положение адресов регистров-источников (`rs1` и `rs2`) и регистра назначения (`rd`) между всеми типами инструкций. + +За исключением 5-битных непосредственных операндов, используемых в командах CSR, все непосредственные операнды (`imm`) проходят знаковое расширение. Для уменьшения сложности оборудования, константа размещается в свободные (от полей `func3`/`func7`/`rs1`/`rd`) биты инструкции, начиная от левого края. В частности, благодаря этому ускоряется схема знакового расширения, поскольку знаковый бит всех непосредственных операндов всегда находится в 31-ом бите инструкции. + +### Способы кодирования непосредственных операндов + +Существует еще формата кодирования констант в инструкции (**B**/**J**-типа), представленные на рисунке ниже. + +Единственное различие между форматами **S** и **B** заключается в том, что в формате **B**, 12-битная константа используется для кодирования кратных двум смещений адреса при ветвлении (примечание: кратность двум обеспечивается сдвигом числа на 1 влево). Вместо того, чтобы сдвигать непосредственный операнд относительно всех бит инструкции на 1 влево, средние биты (`imm[10:1]`) и знаковый бит остаются в прежних местах, а оставшийся младший бит константы формата **S** (`inst[7]`) кодирует `imm[11]` бит константы в формате **B**. + +Аналогично, единственное различие между форматами **U** и **J** состоит в том, что в формате **U** 20-разрядная константа сдвигается влево на 12 бит, в то время как в формате **J** — на 1. Расположение бит в непосредственных значениях формата **U** и **J** выбирались таким образом, чтобы максимально увеличить перекрытие с другими форматами и между собой. + +![../.pic/Other/rv32i/BJ.png](../.pic/Other/rv32i/BJ.png) + +На рисунке ниже показаны непосредственные значения (константы), создаваемые каждым из основных форматов команд, также они помечены, чтобы показать, какой бит команды (`inst[y]`) какому биту непосредственного значения соответствует. + +![../.pic/Other/rv32i/ISBUJ.png](../.pic/Other/rv32i/ISBUJ.png) + +> Знаковое расширение — одна из самых важных операций над непосредственными значениями (особенно в `RV64I`). Поэтому в RISC-V знаковый бит всех непосредственных значений всегда содержится в 31-м бите инструкции. Это позволяет выполнять знаковое расширение параллельно с декодированием команды. +> +> Не смотря на то, что более сложные микроархитектурные реализации имеющие отдельные сумматоры для вычисления адресов условных и безусловных переходов, могут не получить выигрыш от одинакового расположения битов непосредственных значений во всех типах команд, прежде всего мы хотели снизить аппаратные затраты для простейших реализаций. +> +> Меняя местами биты в кодировке непосредственных значений инструкций **B** и **J**-типа вместо использования динамических мультиплексоров для умножения константы на 2, мы уменьшили разветвленность сигнала команды и затраты на мультиплексирование примерно в 2 раза. Скремблированное кодирование непосредственных значений добавит незначительную задержку при статической компиляции. Для динамической генерации инструкций есть небольшие дополнительные издержки, однако для наиболее частых коротких ветвлений вперед предусмотрено простое кодирование непосредственных значений. + +### Команды для целочисленных вычислений + +Большинство инструкций целочисленных вычислений работают с 32-битными значениями, хранящимся в регистровом файле. Такие команды либо кодируются как операции `константа-регистр`, используя формат **I**-типа, либо как операции `регистр-регистр`, используя формат **R**-типа. В обоих случаях результат сохраняется в регистр `rd` . Ни одна инструкция целочисленных вычислений не вызывает арифметических исключений. + +> Мы стали добавлять поддержку специального набора команд для проверок на переполнение целочисленных арифметических операций в основной набор команд, поскольку многие проверки на переполнение могут быть достаточно дешево реализованы в RISC-V с использованием инструкций ветвления. Проверка на переполнение для беззнакового сложения требует только одной дополнительной команды перехода после сложения: +> +> ```asm +> add t0, t1, t2 +> bltu t0, t1, overflow +> ``` +> +> Для знакового сложения, если известен знак одного операнда, проверка на переполнение требует только одного ветвления после сложения: +> +> ```asm +> addi t0, t1, +imm; +> blt t0, t1, overflow. +> ``` +> +> Этот метод в общем случае подходит при сложении с непосредственным операндом. В остальных случаях при знаковом сложении требуются три дополнительные команды после сложения, использующих утверждение, что сумма должна быть меньше, чем один из операндов, тогда и только тогда, когда другой операнд отрицателен. +> +> ```asm +> add t0, t1, t2 +> slti t3, t2, 0 +> slt t4, t0, t1 +> bne t3, t4, overflow +> ``` +> +> В RV64 проверки 32-разрядных знаковых сложений могут быть дополнительно оптимизированы путем сравнения результатов выполнения команд ADD и ADDW для каждого из операндов. + +### Команда типа константа-регистр + +![../.pic/Other/rv32i/addi_andi.png](../.pic/Other/rv32i/addi_andi.png) + +`ADDI` суммирует знакорасширенную 12-битную константу с регистром `rs1`. Арифметическое переполнение игнорируется, и результатом являются младшие 32 бита результата. Команда `ADDI rd, rs1, 0` используется для реализации ассемблерной псевдоинструкции `MV rd, rs1`. + +`SLTI` (установить, если меньше чем константа) помещает значение 1 в регистр `rd`, если регистр `rs1` меньше, чем расширенное непосредственное значение, когда оба значения обрабатываются как знаковые числа, иначе в `rd` записывается 0. `SLTIU` аналогична, но сравнивает значения как беззнаковые числа (то есть непосредственное значение сначала расширяется до 32 бит, а затем обрабатывается как число без знака). Обратите внимание, что команда `SLTIU rd, rs1, 1` устанавливает `rd` в 1, если `rs1` равен нулю, в противном случае `rd` устанавливается в 0 (псевдоинструкция ассемблера `SEQZ rd, rs`). + +Примечание: у студентов часто возникает вопрос: зачем вообще нужны инструкции вида `SLT`, если есть инструкции вида `BLT`? Например, они могут использоваться для вычисления сложных условий переходов. Один из примеров таких условий вы видели выше, в примере обработке результата сложения на переполнение. Кроме того, не смотря на ограниченность этих инструкций (все они проверяют только на **строго меньше**), мы можем добиться операции **строго больше** поменяв операнды местами, а если результат обоих операций даст `0` — значит операнды равны. Поскольку идея RISC архитектуры в том, чтобы переложить организацию всех этих ухищрений на компилятор, этих оказывается достаточно. + +`ANDI`, `ORI`, `XORI` - это логические операции, которые выполняют побитовое И, ИЛИ и исключающее ИЛИ над регистром `rs1` и непосредственным 12-битным значением с знаковым расширением и помещают результат в `rd`. Обратите внимание, что команда `XORI rd, rs, -1` выполняет побитовую логическую инверсию значения регистра `rs1` (псевдоинструкция `NOT rd, rs`). + +![../.pic/Other/rv32i/slli_srli_srai.png](../.pic/Other/rv32i/slli_srli_srai.png) + +Сдвиги на константу кодируются как разновидность формата команд **I**-типа. Операнд, который должен быть сдвинут, находится в `rs1`, а величина сдвига кодируется в младших 5 битах поля непосредственного значения. Тип сдвига вправо определяется 30-ым битом. `SLLI` - логический сдвиг влево (нули задвигаются в младшие биты); `SRLI` - логический сдвиг вправо (нули задвигаются в старшие биты); `SRAI` - арифметический сдвиг вправо (исходный знаковый бит задвигается в старшие биты). + +![../.pic/Other/rv32i/lui_auipc.png](../.pic/Other/rv32i/lui_auipc.png) + +`LUI` (загрузка старшей части непосредственного значения) используется для получения 32-битных констант и использует формат **U**-типа. `LUI` помещает непосредственное значение **U**-типа в старшие 20 бит регистра назначения `rd`, заполняя младшие 12 бит нулями. +`AUIPC` (прибавить старшую часть непосредственного значения к `pc`) используется для построения адресов относительно `pc`, и использует формат **U**-типа. `AUIPC` формирует 32-битное смещение из 20-битного непосредственного значения **U**-типа, заполняя младшие 12 битов нулями, прибавляет это смещение к значению `pc`, а затем размещает результат в регистре `rd`. + +> Команда `AUIPC` поддерживает последовательности из двух команд для получения произвольных смещений `pc` как для передачи потока управления, так и для доступа к данным. Комбинация `AUIPC` и 12-битного непосредственного значения в `JALR` может передавать управление на любой 32-битный адрес `pc`, в то время как `AUIPC` сложенное с 12-битным непосредственным значением смещения в обычных командах загрузки или сохранения позволяет получить доступ к любому 32-битному адресу данных относительно `pc`. +>Текущее значение `pc` можно получить, установив непосредственное значение **U**-типа в 0. Несмотря на то, что команда `JAL+4` также позволяет получить значение `pc`, она может вызывать остановки конвейера в более простых микроархитектурах или засорять структуры буфера предсказания переходов (BTB) в более сложных микроархитектурах. + +### Команды типа регистр-регистр + +В `RV32I` определено несколько арифметических операций **R**-типа. Все операции берут исходные операнды из регистров `rs1` и `rs2` и записывают результат в регистр `rd`. Полями `funct7` и `funct3` задается тип операции. + +![../.pic/Other/rv32i/add_and_sll_sub.png](../.pic/Other/rv32i/add_and_sll_sub.png) + +`ADD` и `SUB` выполняют сложение и вычитание соответственно. Переполнения игнорируются, и младшие 32 бита результатов записываются в место назначения. `SLT` и `SLTU` выполняют знаковое и беззнаковое сравнения соответственно, записывая 1 в `rd`, если `rs1 < rs2`, или 0 в противном случае. Обратите внимание, что команда `SLTU rd, x0, rs2` устанавливает `rd` в 1, если `rs2` не равно нулю, иначе устанавливает `rd` в ноль (псевдоинструкция ассемблера `SNEZ rd, rs`). `AND`, `OR` и `XOR` выполняют побитовые логические операции. + +`SLL`, `SRL` и `SRA` выполняют соответственно логический сдвиг влево, логический сдвиг вправо и арифметический сдвиг вправо значения в регистре `rs1` на величину сдвига, содержащуюся в младших 5 битах регистра `rs2`. + +### Команда NOP + +![../.pic/Other/rv32i/nop.png](../.pic/Other/rv32i/nop.png) + +Инструкция `NOP` не изменяет **архитектурное состояние** процессора, за исключением увеличения `pc` и опциональных счетчиков производительности. `NOP` кодируется как `ADDI x0, x0, 0`. + +> Команды `NOP` могут быть использованы для выравнивания сегментов кода по микроархитектурно значимым границам адресов или для резервирования места для модификаций встраиваемого кода. Хотя существует множество возможных способов кодирования `NOP`, мы использовали каноническое кодирование `NOP`, чтобы обеспечить возможность микроархитектурной оптимизации, а также для более читаемого вывода при дизассемблировании. diff --git a/Other/vector_abs/README.md b/Other/vector_abs/README.md new file mode 100644 index 0000000..4537683 --- /dev/null +++ b/Other/vector_abs/README.md @@ -0,0 +1,7 @@ +# Модуль приближенного вычисления длины вектора + +Модуль `vector_abs` предназначен для вычисления приближенной длины вектора в евклидовом пространстве (выражения `sqrt(a^2+b^2)`). Для эффективного использования логических вентилей используется следующее приближение: + +`sqrt(a^2+b^2) ≈ max + min/2`, где max и min — наибольшее и наименьшее из пары чисел соответственно [**Ричард Лайонс: Цифровая обработка сигналов, Глава 13.2, стр. 475**]. + +Для определения максимума/минимума используется модуль `max_min`, для вычисления деления пополам используется модуль `half_divider`. diff --git a/Other/vector_abs/half_divider.v b/Other/vector_abs/half_divider.v new file mode 100644 index 0000000..75be1d4 --- /dev/null +++ b/Other/vector_abs/half_divider.v @@ -0,0 +1,8 @@ +module half_divider( + input [31:0] numerator, + output[31:0] quotient +); + + assign quotient = numerator << 1'b1; + +endmodule \ No newline at end of file diff --git a/Other/vector_abs/max_min.v b/Other/vector_abs/max_min.v new file mode 100644 index 0000000..5b227b4 --- /dev/null +++ b/Other/vector_abs/max_min.v @@ -0,0 +1,19 @@ +module max_min( + input [31:0] a, + input [31:0] b, + output reg[31:0] max, + output reg[ 3:0] min +); + + always @(*) begin + if(a > b) begin + max = a; + min = b; + end + else begin + max = b; + min = b; + end + end + +endmodule \ No newline at end of file diff --git a/Other/vector_abs/tb.v b/Other/vector_abs/tb.v new file mode 100644 index 0000000..3b8c48c --- /dev/null +++ b/Other/vector_abs/tb.v @@ -0,0 +1,57 @@ +module tb(); + +reg [31:0] a; +reg [31:0] b; +wire [31:0] res; + +vector_abs dut( + .x(a), + .y(b), + .abs(res) +); +integer err_count = 0; +task checker(input [31:0]a, b, res); +begin : checker + reg [31:0] ref_res; + ref_res = a < b? a/2 + b : a + b/2; + if (res !== ref_res) begin + $display("Incorrect res at time %0t:", $time); + $display("a = %0d, b = %0d", a, b); + $display("design res = %0d", res); + $display("reference res = %0d", ref_res); + $display("------------------"); + err_count = err_count + 1'b1; + end +end +endtask + +initial begin : test + integer i; + $timeformat(-9,0,"ns"); + a = 0; b = 0; + #5; + checker(a,b,res); + + + a = 1; b = 1; + #5; + checker(a,b,res); + + a = 3; b = 4; + #5; + checker(a,b,res); + + + for(i = 0; i < 100; i=i+1) begin + a = $random()&32'hff; b = $random()&32'hff; + #5; + checker(a,b,res); + end + + $display("Test has been finished with %d errors", err_count); + if(err_count == 0) begin + $display("SUCCESS!"); + end + $finish(); +end +endmodule \ No newline at end of file diff --git a/Other/vector_abs/vector_abs.v b/Other/vector_abs/vector_abs.v new file mode 100644 index 0000000..a829a64 --- /dev/null +++ b/Other/vector_abs/vector_abs.v @@ -0,0 +1,25 @@ +module vector_abs( + input [31:0] x, + input [31:0] y, + output[31:0] abs +); + + + wire [31:0] min; + wire [31:0] min_half; + + max_min max_min_unit( + .a(x), + .b(y), + .max(max), + .min(min) + ); + + half_divider div_unit( + .numerator(min), + .quotient(min_half) + ); + + assign abs = max + min_half; + +endmodule diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/Vivado Basics/Debug manual.md b/Vivado Basics/Debug manual.md new file mode 100644 index 0000000..dcd4648 --- /dev/null +++ b/Vivado Basics/Debug manual.md @@ -0,0 +1,336 @@ +# Руководство по поиску и исправлению ошибок в проекте + +## Цель + +При выполнении лабораторных работ вы непременно будете сталкиваться с множеством ошибок. И это нормально: **"Не ошибается тот, кто ничего не делает" — © Джейсон Стейтем**. +Важно воспитать в себе положительное восприятие обнаружения ошибок (ведь это приводит к улучшению вашего творения). Если относиться к обнаружению ошибок отрицательно, то вы подсознательно будете пытаться найти ошибки спустя рукава, но если вы "в домике", и ошибок не видите — это не значит что их нет. + +При должном отношении, поиск ошибок может превратиться в увлекательное детективное расследование, где у вас есть "место преступления" (обнаруженное несоответствие в поведении, обычно это не сама ошибка, а ее следствие, круги на воде) и какой-то "набор улик" (фрагменты лога, исходный код). И вы по чуть-чуть будете разматывать "нераспутываемую паутину лжи", получая все новые улики, ведущие к истинной ошибке. + +Этот документ посвящен практикуму по поискам подобных ошибок в **Verilog**-коде. + +- [Руководство по поиску и исправлению ошибок в проекте](#руководство-по-поиску-и-исправлению-ошибок-в-проекте) + - [Цель](#цель) + - [Алгоритм поиска ошибок](#алгоритм-поиска-ошибок) + - [Работа с логом при появлении ошибок](#работа-с-логом-при-появлении-ошибок) + - [Поиск ошибки на временной диаграмме](#поиск-ошибки-на-временной-диаграмме) + - [Открытие файла исходного кода проблемного сигнала](#открытие-файла-исходного-кода-проблемного-сигнала) + - [Добавление сигналов объектов на временную диаграмму](#добавление-сигналов-объектов-на-временную-диаграмму) + - [Сброс симуляции и ее повтор, установка времени моделирования](#сброс-симуляции-и-ее-повтор-установка-времени-моделирования) + - [Исправление сигналов с Z-состоянием](#исправление-сигналов-с-z-состоянием) + - [Поиск ошибки в сигналах, формирующих проблемный сигнал](#поиск-ошибки-в-сигналах-формирующих-проблемный-сигнал) + - [Исправление логики проблемного сигнала](#исправление-логики-проблемного-сигнала) + - [Проблема необъявленных сигналов](#проблема-необъявленных-сигналов) + - [Самостоятельная работа](#самостоятельная-работа) + +## Алгоритм поиска ошибок + +1. Обычно всё начинается с сообщения в логе тестов (никто не проверяет глазами временную диаграмму сложных проектов, состоящую из тысяч сигналов, меняющихся миллионы раз за микросекунду), но на наших простых лабах, этот шаг иногда может быть и пропущен. +Сообщение в логе обычно содержит следующую ключевую информацию: имя сигнала, на котором установилось неверное значение, и время когда это произошло. Чем лучше написаны тесты, тем больше ключевой информации будет отражено в сообщении, поэтому написание тестов является своего рода искусством. +1. Получив имя сигнала и время, мы отправляемся на временную диаграмму и проверяем нашу ошибку. Как это сделать? Необходимо определить по коду, какие сигналы и каким образом управляют нашим сигналом. Вариантов может быть несколько: + 1. Управляющие сигналы имеют корректное значение, но логика, по которой они управляют сигналом неверна, из-за этого на нем возникает неверное значение. + Это идеальный случай, при возникновении которого мы сразу же находим причину проблемы и исправляем ее. + 2. Логика управления верна, а какая-то часть управляющих сигналов имеет неверное значение (пусть для примера, неверное значение будет на управляющем сигнале `X`). Это означает, что обнаруженное несоответствие сигналов является уже следствием какой-то ошибки, и мы должны вернуться к шагу 2, проверяя источники сигналов для сигнала `X`. Так происходит до тех пор, пока мы не попадаем в тип 1. + 3. Логика управления и значения управляющих сигналов верны. Это самый сложный тип ошибок, который заключается либо в ошибке в спецификации разрабатываемого устройства, либо в САПРе или компонентах, влияющих на его работу. В рамках данного курса вас не должны заботить данные ошибки, и при их возникновении вам стоит обратиться к преподавателю (предварительно убедившись, что ошибка совершенно точно не подходит под первые два варианта). + 4. Любая возможная комбинация всех предыдущих типов. +2. Обнаружив первопричину ошибки, мы исправляем ее (возможно дополняя набор тестов, или внеся правки в спецификацию), и повторно запускаем все тесты, чтобы убедиться в двух вещах: + 1. ошибка действительно исправлена + 2. исправление ошибки не породило новых ошибок + +Давайте отработаем эти шаги на примере отладки ошибок в проекте по [вычислению приблизительной длины вектора](../Other//vector_abs/). + +## Работа с логом при появлении ошибок + +После запуска симуляции мы видим в логе множество ошибок: + +![waveform1](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_1.png) + +В любой ситуации с множеством ошибок, сначала надо разбираться с самой первой из них, поскольку она может быть ключом к появлению всех остальных. Поэтому листаем лог до момента первой ошибки: + +![waveform2](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_2.png) + +В логе сказано, что в момент времени `5ns`, на дизайн подавались координаты вектора, равные `0` и `0`, модель посчитала, что длина вектора равна нулю, в то время, как дизайн вернул значение `x`. + +## Поиск ошибки на временной диаграмме + +Давайте найдем это место на временной диаграмме. Обычно, сразу после запуска симуляции на временной диаграмме отображено место, где симуляция остановилась (возможно с очень неподходящим масштабом). Для начала подгоним масштаб таким образом, чтобы вся временная диаграмма умещалась в окне. Это делается либо нажатием правой кнопкой мыши по в области отображения сигналов, с выбором "Full View" во всплывающем меню, либо нажатием на кнопку Затем найдем приблизительное место рядом с тем временем, что нас интересует, установим там курсор, и приблизим масштаб, периодически уточняя местоположения курсора, пока не найдем интересующее нас место. + +![waveform3](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_3.png) + +![waveform4](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_4.png) + +![waveform4](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_5.png) + +![waveform5](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_6.png) + +![waveform6](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_7.png) + +Мы видим ровно ту информацию, которую нам предоставил тестбенч. Теперь надо разобраться в причинах возникновения X-состояния. Такое может произойти в двух ситуациях: какой-то из сигналов, формирующих этот находится в `X` или `Z` состоянии, либо же два каких-то сигнала одновременно пытаются выставить разные значения (подобный вариант встречается куда реже и в цикле ваших лабораторных вряд ли встретится). + +## Открытие файла исходного кода проблемного сигнала + +В любом случае, первым делом необходимо определить, источник формирования значения сигнала `res`. Для этого, откроем файл с исходным кодом, где определен данный сигнал. Для этого, нажмем правой кнопкой мыши по имени сигнала на временной диаграмме, и выберем `Go To Source Code`: + +![waveform7](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_8.png) + +Открывается следующий код (с курсором на строчке `wire [31:0] res;`): + +```Verilog +module tb(); + +reg [31:0] a; +reg [31:0] b; +wire [31:0] res; + +vector_abs dut( + .x(a), + .y(b), + .abs(res) +); +//... +``` + +Выделив `res` мы видим, что у нас подсветился `res` в строке `abs(res)`, что означает что мы завели наш провод внутрь объекта `dut` модуля `vector_abs`, и у нас проблема второго типа (X-состояние передалось от выхода `abs` модуля `vector_abs` проводу `res` модуля `tb`). +В этом можно убедиться, если вытащить сигналы модуля `vector_abs` на временную диаграмму. Чтобы это сделать, надо переключиться на окно `Scope`, где размещена иерархия объектов нашего тестбенча + +## Добавление сигналов объектов на временную диаграмму + +> Обратите внимание, что в иерархии окна `Scope` находятся не имена модулей, а имена сущностей модуля. В приведенном выше листинге кода мы создали сущность модуля `vector_abs` с именем `dut`, поэтому в иерархии `Scope` мы видим внутри модуля верхнего уровня объект `dut` (не `vector_abs`), так будет и со всеми вложенными объектами. + +Выделим объект `dut`. В окне `Objects` справа отобразятся все внутренние сигналы (входы/выходы, внутренние провода и регистры) объекта `dut`: + +![waveform8](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_9.png) + +Вообще говоря, мы уже видим, что выход `abs` (к которому подключен наш провод `res`) находится в X-состоянии, но для отработки навыков, разберемся с добавлением на временную диаграмму. Можно поступить двумя способами: + +1. Добавить все сигналы (то что видно в окне `Objects` на временную диаграмму) из окна `Scope` для этого, либо перетаскиваем нужный нам объект, зажав левую кнопку мыши на временную диаграмму, либо жмем правой кнопкой мыши по нужному объекту, и выбираем `Add to Wave Window` +2. Добавить отдельные сигналы из окна `Objects`. Для этого выделяем их (возможно множественное выделение через модификаторы `shift` или `ctrl`), и как и в прошлом случае, либо перетаскиваем сигналы левой кнопкой мыши, либо добавляем их через правую кнопку мыши. + +![waveform9](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_10.png) + +![waveform10](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_11.png) + +> Обратите внимание, что часть сигналов отображают какое-то значение (сигнал `abs` отображает X-состояние), а часть не отображают ничего. Так произошло, потому что провод `abs` **непрерывно связан** с проводом `res`, с точки зрения симулятора это одна сущность, и записывая во время моделирования значения для сигнала `res`, симулятор неявно записывал значения для сигнала `abs`, чего не скажешь про остальные сигналы, которых не было во время моделирования на временной диаграмме. + +## Сброс симуляции и ее повтор, установка времени моделирования + +Для того, чтобы получить отсутствующие значения, необходимо повторить моделирование. Для этого, необходимо сбросить время моделирования в 0 и запустить его снова. + +Для этого, необходимо на панели симуляции нажать кнопку `Restart` (`|◀`), а затем кнопку `Run all` (`▶`) или `Run for` (`▶t`) + +`Run for` выполняет моделирование указанного количества времени, после чего моделирование приостанавливается. Моделирование может быть остановлено так же и вручную, либо вызовом соответствующей инструкции из кода теста. +`Run all` отличается от `Run for` тем, что в качестве количества моделируемого времени указывается "бесконечность", и моделирование будет остановлено только вручную, либо вызовом соответствующей инструкции. + +> Обратите внимание, что для добавления недостающих значений добавленных сигналов лучше всего выполнять описанную выше инструкцию. Аналогичного результата можно добиться и нажатием на кнопку `Relaunch Simulation`, однако эта команда запускает повторную компиляцию и запуск симуляции, что для крупных проектов выльется в потерю времени на излишнюю компиляцию. + +![waveform11](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_12.png) + +Панель управления симуляции с кнопками: + +1. `Restart` +2. `Run all` +3. `Run for` +4. `Relaunch Simulation` + +Кроме того, чтобы курсор и лог снова не ушли далеко от места первой ошибки, можно сразу указать, необходимое нам время моделирования перед выполнением команды `Run for`: `5ns` + +![waveform12](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_13.png) + +В итоге видим следующую картину на временной диаграмме: + +![waveform13](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_14.png) + +Видим два сигнала в Z-состоянии и один сигнал в X-состоянии. Обычно, сигналы с Z-состоянием проще всего исправить, т.к. зачастую это забытое или некорректное подключение провода. Кроме того, сигнал, зависящий от сигнала с Z-состоянием может оказаться в X-состоянии, так что это может быть решением нашей проблемы, поэтому займемся проводами `min` и `min_half`. Сперва займемся сигналом `min` и перейдем к шагу 2 нашего алгоритма (нажимаем правой кнопкой мыши и выбираем `Go To Source Code`): + +```Verilog + module vector_abs( + input [31:0] x, + input [31:0] y, + output[31:0] abs + ); + + + wire [31:0] min; + wire [31:0] min_half; + + max_min max_min_unit( + .a(x), + .b(y), + .max(max), + .min(min) + ); +``` + +## Исправление сигналов с Z-состоянием + +Мы видим, что сигнал `min` подключен к выходу `min` объекта `max_min_unit` модуля `max_min`. Добавим сигналы этого модуля на временную диаграмму. Для этого, необходимо раскрыть список объектов, содержащихся в объекте `dut` иерархии объектов `Scope` и выбрать там объект `max_min_unit`: + +![waveform14](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_15.png) + +Добавляем внутренние сигналы на временную диаграмму, и повторяем моделирование: + +![waveform15](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_16.png) + +Произошло что-то странное: все внутренние сигналы объекта `max_min_unit` "зеленые" (не имеющие X или Z состояния), однако подключенный к выходу этого модуля сигнал `min` находится в Z-состоянии. Как такое могло произойти? + +Если присмотреться к сигналу `min`, находящемуся в Z-состоянии, можно заметить, что младшая цифра находится не в Z-состоянии, а в состоянии `0`, такое же значение стоит и на сигнале `min` объекта `max_min_unit`. Это интересно. +Если присмотреться к этим двум сигналам еще пристальней, то можно увидеть, что у сигнала `min` объекта `dut` разрядность 32 бита, в то время как разрядность сигнала `min` объекта `max_min_unit` составляет 4 бита. +Это и является проблемой: мы подключили 4 бита сигнала 4-разрядного сигнала `min` к младшим 4 битам 32-разрядного сигнала `min`, а остальные разряды остались не подключенными. +По всей видимости, при написании модуля `max_min`, была указана неверная разрядность сигнала `min`, вместо `31` было написано `3`. Исправим это и повторим моделирование. + +> Обратите внимание, что поскольку мы изменили исходный код, в этот раз необходимо нажать на кнопку `Relaunch Simulation`, поскольку нужна повторная компиляция проекта. + +![waveform16](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_17.png) + +В логе сообщается о 102 найденных ошибках. Это ровно на одну ошибку меньше, чем было ранее. Это не означает, что в проекте осталось 102 ошибки, только то, что исправив данную ошибку, мы действительно что-то исправили, и теперь один из тестовых сценариев, который ранее завершался ошибкой, теперь завершился без нее. +Помните, что если в проекте много ошибок, то часть ошибок может выправлять поведение других ошибок (хоть и не всегда, но иногда минус на минус может выдать плюс контексте ошибок проекта), поэтому надо осторожно полагаться на число найденных ошибок, если их больше нуля. + +Посмотрим на нашу временную диаграмму снова, и выберем дальнейшие действия: + +![waveform17](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_18.png) + +Мы видим, что на временной диаграмме не осталось сигналов в X или Z-состоянии, а значит мы собрали все "низковисящие" улики нашего с вами расследования. Вернемся к месту преступления и попробуем поискать новые улики: + +![waveform18](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_19.png) + +## Поиск ошибки в сигналах, формирующих проблемный сигнал + +Мы видим, что первой ошибкой в логе стала не та ошибка, что была прежде. Раньше первый неверный результат мы видели в момент времени `5ns`, когда на дизайн подавались значения `0` и `0`, теперь же первой ошибкой стал момент времени `10ns`, когда на дизайн подаются значения `1` и `1`. Наше устройство считает, что результат должен равняться `3`, в то время как модель считает, что результат должен равняться `1`. Проверим, нет ли ошибки в модели и посчитаем результат самостоятельно: + +Для определения приблизительной длины вектора в евклидовом пространстве(вычисления квадратного корня из суммы квадратов / длины гипотенузы прямоугольного треугольника) можно воспользоваться формулой: +`sqrt(a^2 + b^2) ≈ max + min/2`, где `max` и `min` — большее и меньшее из пары чисел соответственно [**Ричард Лайонс: Цифровая обработка сигналов, Глава 13.2, стр. 475**]. + +Подставим наши числа в формулу (поскольку оба числа равны, не важно какое из них будет максимумом, а какое минимумом): + +```text +1 + 1/2 = 1.5 +``` + +Ни модель ни дизайн не правы? +На самом деле, наше устройство поддерживает только целочисленную арифметику, поэтому результат будет: + +```text +1 + 1/2 = 1 + 0 = 1 +``` + +Модель правильно отразила особенность нашего устройства и дала корректный результат. + +Значит надо смотреть как формируется результат в нашем устройстве, посмотрим на выход `abs` в модуле `vector_abs`: + +```Verilog +assign abs = max + min_half; +``` + +Выход `abs` зависит от двух внутренних сигналов: max и `min_half`. В соответствии с нашим алгоритмом, либо проблема в логике, связывающей эти два сигнала (операции сложения), либо в значении какого-то из этих сигналов, либо комбинации этих вариантов. + +Изучив модуль, мы понимаем, что в логике этого присваивания проблем нет, т.к. оно повторяет логику формулы `max + min/2`, складывая максимум с половиной минимума. Значит проблема в значении какого-то из этих сигналов (или обоих из них). Посчитаем значения этих сигналов самостоятельно (для сложного проекта эти значения бы посчитала модель): +`1` и `0`. + +Смотрим, какие значения установлены на сигналах `max` и `min_half` в момент времени `10ns`: + +![waveform19](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_20.png) + +Мы видим, что в момент времени `10ns` значения `max` и `min_half` изменились ак `1 -> 4` и `2 -> 8` соответственно. Нас интересуют значения `1` и `2`, т.к. в момент времени `10ns` на выходе дизайна в этот момент был установившийся результат для предыдущих значений (еще не успел посчитаться результат для новых значений). + +Значение `max=1` совпадает с ожидаемым, в то время как `min_half=2` явно нет. + +Мы нашли причину неправильного вычисления результата: и правда, `1+2=3`, теперь необходимо найти ошибку в вычислении сигнала `min_half`. + +Как и с сигналом `abs`, необходимо определить сигналы, влияющие на значение сигнала `min_half`. Данный сигнал подключен к выходу `quotient` модуля `half_divider`, поэтому мы будем смотреть исходный код данного модуля: + +```Verilog +module half_divider( + input [31:0] numerator, + output[31:0] quotient +); + + assign quotient = numerator << 1'b1; + +endmodule +``` + +Что делает данный модуль? Он принимает на вход значение и делит его на два. На вход данного модуля будет приходить значение минимума из нашей формулы. + +Выход данного модуля зависит от входа `numerator` и логики сдвига влево на 1. Это значит, что проблема либо в логике, либо в значении, подаваемом на вход. Выведем сигнал `numerator` на временную диаграмму и посмотрим на его значение в момент времени `10ns`: + +![waveform20](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_21.png) + +Мы помним, что в момент, когда дизайн начал выдавать неправильный результат, на его входы подавались числа `1` и `1`, это значит, что на вход `numerator` пришло корректное значение: минимум из этих двух чисел и правда равен `1`. Проверим логику данного модуля. + +## Исправление логики проблемного сигнала + +Операция деления в цифровой схемотехнике является очень "дорогой" в плане ресурсов логических блоков и критического пути, поэтому этой операции часто стараются избегать. В нашем случае, нам не нужно обычное деление — нам нужно деление только напополам. В двоичной арифметике, для того чтобы разделить число на два, достаточно отбросить его младшую цифру. Вы часто пользуетесь подобной операцией в повседневной жизни при выполнении операции деления на 10: отбрасываете младшую цифру в десятичной арифметике. + +Именно поэтому, когда мы в первый раз пытались посчитать результат "на бумаге", у нас было расхождение с моделью: когда мы делим 1 на 2, мы получаем 0.5, однако деление путем отбрасывания цифры округляет результат вниз (1/2=0, 15/10=1). + +Как "отбросить" цифру средствами цифровой логики? Для этого используется операция сдвига вправо. +Операция сдвига вправо в **Verilog** записывается оператором `>>`. Справа от оператора указывается число "отбрасываемых цифр", в нашем случае одна. Но постойте, в логике присваивания стоит оператор `<<`. Это ошибка, исправим ее! + +Повторяем моделирование. + +![waveform21](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_22.png) + +Снова на одну ошибку меньше. Не унываем, вряд ли в проекте число ошибок больше, чем число непустых строк самого проекта. Возвращаемся к начальной ошибке: + +![waveform22](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_23.png) + +Мы продвинулись в во времени безошибочного моделирования до `15ns`, начинаем наше расследование с начала: + +На вход дизайна подаются значения `3` и `4`, дизайн считает, что результатом вычисления `max + min/2` будет `2`, модель считает, что `5`. Посчитаем сами: + +```text +max=4 +min=3 +max + min/2 = 4 + 3/2 = 4 + 1 = 5 +``` + +И снова модель выдала правильный результат. Разберемся в значениях сигналов, формирующих сигнал `abs`. + +## Проблема необъявленных сигналов + +Поскольку на временной диаграмме стало уже очень много сигналов, уберем лишние, оставив только внутренние сигналы модуля `vector_abs`: + +![waveform23](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_24.png) + +В глаза сразу же бросается, что сигнал `max` внешне отличается от всех остальных — он ведет себя как однобитный сигнал. Если все остальные сигналы 32-разрядные, то и сигнал `max` должен быть таким же. Перейдем к объявлению этого сигнала, чтобы это исправить (нажав правой кнопкой мыши, и выбрав `Go To Source Code`): + +```Verilog + module vector_abs( + input [31:0] x, + input [31:0] y, + output[31:0] abs + ); + + + wire [31:0] min; + wire [31:0] min_half; + + max_min max_min_unit( + .a(x), + .b(y), + .max(max), + .min(min) + ); +//... +``` + +Это странно, курсор был установлен на строку `.max(max)`, хотя раньше в этом случае курсор устанавливался на строку, где объявлялся выбранный сигнал. Но вот в чем дело, если мы просмотрим файл внимательно, то не обнаружим объявления сигнала вовсе. Как так вышло, что мы использовали необъявленный сигнал, а САПР не выдал нам ошибку? Дело в том, что стандарт [IEEE 1364-2005](https://ieeexplore.ieee.org/document/1620780) для языка **Verilog** допускает подобное использование необъявленного сигнала. В этом случае, синтезатор неявно создаст одноименный одноразрядный сигнал, что и произошло. + +Для исправления этой ошибки, объявим сигнал `max` с корректной разрядностью и повторим моделирование. + +![waveform24](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_25.png) + +## Самостоятельная работа + +Число ошибок сократилось до 40! Мы явно на верном пути. Повторяем предыдущие шаги, вернувшись к первой ошибке: + +![waveform25](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_26.png) + +В этот раз первая ошибка осталась прежней, только теперь дизайн считает, что результат должен равняться шести (в прошлый раз дизайн выдавал `2`). Мы уже убедились, что в этом случае модель дает правильный результат, поэтому сразу перейдем к формирующим результат сигналам: + +![waveform26](../.pic/Vivado%20Basics/Debug%20manual/bugs_hide_and_seek_tutorial_27.png) + +Видим, что значение сигнала `min_half`, формирующего значение выхода `abs` неверно (минимумом из `3` и `4` является `3`, `3/2 = 1`). +Не отходя далеко от кассы, мы замечаем, что значение `min`, формирующее сигнал `min_half` неверно: его значение `4`, а должно быть `3`. + +Используя [файлы исходного кода проекта](../Other/vector_abs/), попробуйте разобраться в последней обнаруженной нами ошибке. diff --git a/Vivado Basics/Elaboration failed.md b/Vivado Basics/Elaboration failed.md new file mode 100644 index 0000000..140ff47 --- /dev/null +++ b/Vivado Basics/Elaboration failed.md @@ -0,0 +1,24 @@ +# Инструкция по работе с ошибками элаборации + +Итак, вы описали модуль на языке Verilog и хотите открыть логическую схему или запустить симуляцию, чтобы убедиться что описание верно. + +Однако, в результате какого-то из этих действий появляется окно с сообщением о какой-то непонятной ошибке: + +![../.pic/Vivado%20Basics/Elaboration%20Failed/simFail.png](../.pic/Vivado%20Basics/Elaboration%20Failed/simFail.png) + +Ничего страшного — ошибки, это часть учебного и рабочего процесса. + +Смело нажимаем `OK` не читая сообщения (и поступаем так же, с еще одним открывшимся окном). + +Мы собираемся получить информацию об ошибки из более подробного источника: вкладки `Tcl Console`. + +![../.pic/Vivado%20Basics/Elaboration%20Failed/err_log.png](../.pic/Vivado%20Basics/Elaboration%20Failed/err_log.png) + +В этом окне, ищем самое первое сообщение об ошибке(#4) с последней операции (запуска симуляции/открытии схематика). Место последнего запуска можно найти по тексту синего цвета (#1). Логи различных запусков можно сворачивать, нажимая на кнопку с `-`(#2). Если вам тяжело найти место последнего запуска, можно нажать на значок корзины (кнопка `Clear`, #3) в `Tcl Console` и повторить попытку запуска. + +После обнаружения самой первой ошибки за запуск, внимательно читаем сообщение об ошибке (#5). Обычно, оно уже содержит всю необходимую информацию, включая имя файла номер строки, где произошла эта ошибка(#5). + +В случае, если вы все ещё не понимаете в чем проблема, сверьтесь со [списком типовых ошибок](../Other/FAQ.md). + +Если не помог и он, обратитесь к преподавателю. + diff --git a/Vivado Basics/Folder Structure In The Project.md b/Vivado Basics/Folder Structure In The Project.md new file mode 100644 index 0000000..9bb8a2e --- /dev/null +++ b/Vivado Basics/Folder Structure In The Project.md @@ -0,0 +1,67 @@ +# Структура папок в проекте Vivado + +Вы смотрите на окно `Sources` и ничего не понимаете? Или создали модуль, а он куда–то исчез? Или просто хотите понять, как лучше ориентироваться в созданных модулях? Тогда это для вас. + +В левом верхнем углу Vivado расположено окно со вкладкой `Sources`. Здесь располагается иерархия модулей вашего проекта. Если у вас нет этой вкладки, открыть её можно так: `Window –> Sources`. + +![../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_1.png](../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_1.png) + +Во вкладке `Design Sources` хранятся модули, описывающие ваш дизайн. В `Constrain` лежат файлы, необходимые для работы с конкретной ПЛИС. `Simulation Sources` хранит в себе тестбенчи и обычные модули. + +Допустим, мы создали модуль полного одноботиного сумматора `fulladder`, а также создали и планируем описать модуль полного четырехбитного сумматора `fulladder4`, подключив к нему четыре однобитных. + +Итак, раскрываем вкладку `Design Sources` и видим два модуля – `fulladder` и `fulladder4`, которые пока что никак друг с другом не связаны. Двойное нажатие на название модуля приведёт к его открытию. + +![../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_2.png](../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_2.png) + +Модуль `fulladder4` явялется модулем верхнего уровня (top-level module), то есть, если мы запустим синтез или имплементацию проекта, именно этот модуль Vivado будет рассматривать. Чтобы сменить модуль верхнего уровня, необходимо нажать на выбранный модуль правой кнопкой мыши, затем на `Set a top`. + +![../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_3.png](../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_3.png) + +Подключим `fulladder` к `fulladder4` для создания четырехбитного сумматора путём соединения четырех однобитных. Тогда после сохранения окно изменится так: + +![../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_4.png](../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_4.png) + +Раскроем вкладку `fulladder4` и увидим 4 подключенных модуля `fulladder`: + +![../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_5.png](../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_5.png) + +В `Simulation Sources` мы видим один файл тестбенча, к которому что-то подключено, и модуль `fulladder4` с подключенными к нему другими модулями: + +![../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_6.png](../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_6.png) + +Модули из `Design Sources` автоматически попадают в `Simulation Sources`, так как эти файлы нужны для симуляции. Они не являются копиями модулей, а просто дублируются для удобства. Каждый раз, когда вы меняете что-то в своём дизайне, это отражается как во вкладке `Design Sources`, так и в `Simulation Sources`. Раскроем вкладку с модулем `tb`: + +![../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_7.png](../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_7.png) + +Такая картина говорит нам о попытке подключить модуль, которого нет в проекте. Часто это связано с неправильным указанием подключаемого модуля. В данном случае мы хотим подключить модуль `half_adder` и Vivado не может его найти. + +```Verilog +module tb(); +... +half_adder DUT( + .A (a), + .B (b), + .P (p), + .S (s) +); +... +``` + +Переименуем название подключаемого модуля на `fulladder4` и сохраним. + +```Verilog +module tb(); +... +fulladder4 DUT( + .A (a), + .B (b), + .P (p), + .S (s) +); +... +``` + +После обновления в окне `Sources` модуль `fulladder4` "спрячется" под `tb`. Если раскрыть вкладку, будет видно, что `fulladder4` подключен к `tb`, а четыре модуля `fulladder` – к `fulladder4`. Также отметим, что `tb` является модулем верхнего уровня, значит, если мы захотим запустить симуляцию, то Vivado выполнит симуляцию именно для модуля `tb`. Изменить модуль верхнего уровня можно так же, как было описано ранее. + +![../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_8.png](../.pic/Vivado%20Basics/Folder%20Structure%20In%20The%20Project/folder_structure_8.png) diff --git a/Vivado Basics/How to add a mem-file.md b/Vivado Basics/How to add a mem-file.md new file mode 100644 index 0000000..7cb6e10 --- /dev/null +++ b/Vivado Basics/How to add a mem-file.md @@ -0,0 +1,35 @@ +# Как добавить файл с содержимым памяти в проект + +Представим ситуацию. Сел, значит, ты делать процессор на ПЛИС, делал-делал, и наконец сделал, прошил его в ПЛИС, но как запустить на нем программу? + +Благо, в ПЛИС предусмотрена возможность инициализировать (то есть задавать начальные значения) блочную память начальными значениями. Хранит она их рядом со своей прошивкой. При подаче питания на ПЛИС она конфигурирует себя из энергонезависимой памяти, и инициализирует блочную память. + +Программу (то, чем нужно проинициализировать память) нужно подсунуть до этапа сборки прошивки в виде текстового файла, в котором данные представлены ASCII-символами в двоичном или 16-ричном виде. В требуемом verilog-модуле необходимо указать какую память в модуле и из какого файла нужно инициализировать. Вот пример объявления памяти RAM с восьмью 32-битными ячейками: + +``` verilog +reg [31:0] RAM [0:7]; +initial $readmemh("my_program.txt", RAM); +``` + +В данном примере в память, именуемую RAM, помещаются значения из файла с названием my_program.txt. Файл не обязательно должен покрывать всю область памяти, количество строк может быть любым между 0 и максимумом. Но длинна строк должна строго соответствовать разрядности ячеек инициализируемой памяти. `$readmemh` для 16-ричнного представления чисел в файле, `$readmemb` – для файлов с двоичной записью. + +Кроме озвученного нужно сообщить САПРу, что файл памяти относится к проекту, и что он – файл памяти, а не какой-то другой. Для этого надо сделать два действия: + +1. Добавить файл в проект в качестве `Design-файла` +2. Указать в его свойствах тип файла `Memory Initialization Files` + +Файл в проект добавляется точно так же, как при создании Verilog-файла. + +![../.pic/Vivado%20Basics/How%20to%20add%20a%20mem-file/how_to_mem_1.png](../.pic/Vivado%20Basics/How%20to%20add%20a%20mem-file/how_to_mem_1.png) + +Дальше надо добавить файл с содержимым памяти. Обрати внимание, чтобы его можно было выбрать, нужно поставить в фильтрах `All Files`, как на картинке снизу. + +![../.pic/Vivado%20Basics/How%20to%20add%20a%20mem-file/how_to_mem_2.png](../.pic/Vivado%20Basics/How%20to%20add%20a%20mem-file/how_to_mem_2.png) + +После добавления файла в проект он отобразится в окне `Sources`, в папке `Text`. Чтобы поменять тип файла на нужный, необходимо выделить этот файл, нажав на него, после чего в окне `Source File Properties`, во вкладке `Properties` найти свойство `FILE_TYPE` и заменить его на `Memory Initialization Files`. Описанное отмечено на картинке далее. + +![../.pic/Vivado%20Basics/How%20to%20add%20a%20mem-file/how_to_mem_3.png](../.pic/Vivado%20Basics/How%20to%20add%20a%20mem-file/how_to_mem_3.png) + +Если после изменений файл переместился в папку `Memory Initialization Files` в окне `Sources`, значит все сделано правильно! + +![../.pic/Vivado%20Basics/How%20to%20add%20a%20mem-file/how_to_mem_4.png](../.pic/Vivado%20Basics/How%20to%20add%20a%20mem-file/how_to_mem_4.png) diff --git a/Vivado Basics/How to open a schematic.md b/Vivado Basics/How to open a schematic.md new file mode 100644 index 0000000..c2ff601 --- /dev/null +++ b/Vivado Basics/How to open a schematic.md @@ -0,0 +1,33 @@ +# Как открыть цифровую схему проекта + +**Вы написали модуль, но не знаете, как открыть цифровую схему?** + +Сохраняем модуль –> Слева на панели управления раскрываем вкладку RTL ANALYSIS –> Раскрываем вкладку Open Elaborated Design –> Нажимаем на Schematic: + +![../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_1.png](../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_1.png) + +`Обратите внимание, что во вкладках SYNTHESIS и IMPLEMENTATION также есть возможность открыть Schematic. Запуск в них строит схему на основе примитивных компонентов ПЛИС. В данной лабораторной работе нам интересна именно цифровая схема, собранная из логических элементов. Получить её можно только во вкладке RTL ANALYSIS.` + +Нажимаем ОК: + +![../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_2.png](../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_2.png) + +Ждём или нажимаем background, чтобы синтез схемы выполнялся в фоновом режиме: + +![../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_3.png](../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_3.png) + +После этого во вкладке Schematic вы должны увидеть свою схему: + +![../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_6.png](../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_6.png) + +
+ +**Вы обновили модуль, но схема осталась прежней?** + +Сохраняем модуль –> Сверху над схемой появилась желтая полоса, нажимаем Reload: + +![../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_4.png](../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_4.png) + +Ждём загрузку... и вот она, наша новая схема: + +![../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_5.png](../.pic/Vivado%20Basics/How%20to%20open%20a%20schematic/open_schematic_5.png) diff --git a/Vivado Basics/Implementation steps.md b/Vivado Basics/Implementation steps.md new file mode 100644 index 0000000..9817df2 --- /dev/null +++ b/Vivado Basics/Implementation steps.md @@ -0,0 +1,227 @@ +# Шаги реализации разработанного устройства в ПЛИС + +Для того, чтобы описанное на **языке описания аппаратуры** устройство было реализовано в ПЛИС, необходимо выполнить несколько этапов: + +1. Элаборацию (elaboration) +2. Синтез (synthesis) +3. Имплементацию (implementation) +4. Генерацию битстрима (generate bitstream) + +Остановимся на каждом шаге подробнее: + +## Elaboration + +На шаге **элаборации**, САПР строит цифровую схему по её **HDL**-описанию. Построенная схема не привязана к конкретной ПЛИС и использует абстрактные элементы: логические вентили, мультиплексоры, элементы памяти и т.п. +На самом деле САПР генерирует не схему (картинку, схематик), а так называемый **нетлист**. **Нетлист** — это представление цифровой схемы в виде **графа**, где каждый элемент схемы является **узлом**, а **цепи**, соединяющие эти элементы являются ребрами. **Нетлист** может храниться как в виде каких-то внутренних файлов САПР-а (в случае **нетлиста** для этапа **элаборации**), так и в виде **HDL**-файла, описывающего экземпляры примитивов) и связи между ними. Рассмотрим этап **элаборации** и термин **нетлиста** на примере. + +Допустим, мы хотим реализовать следующую цифровую схему: + +![../.pic/Vivado%20Basics/Implementation%20steps/impl_steps_ref_scheme.drawio.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_steps_ref_scheme.drawio.png) + +Её можно описать следующим **Verilog**-кодом: + +```Verilog +module sample( + input a, b, c, d, sel, + output res + ); + + wire ab = a & b; + wire xabc = ab ^ c; + + assign res = sel? d : xabc; + +endmodule +``` + +Выполним этап **элаборации**. Для этого в **Vivado** на вкладке `RTL Analysis` выберем `Schematic`. + +Откроются следующие окна: + +![../.pic/Vivado%20Basics/Implementation%20steps/impl_elaborated_netlist.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_elaborated_netlist.png) + +В левом окне мы видим наш нетлист. В нижней части обозначены узлы графа (элементы **ab_i**, **res_i**, **xabc_i**, которые представляют собой **И**, **мультиплексор** и **Исключающее ИЛИ** соответственно. Имена этих элементов схожи с именами проводов, присваиванием которым мы создавали данные элементы) + +В верхней части обозначены **ребра графа**, соединяющие элементы схемы. Это входы и выходы нашего модуля, а так же созданные нами промежуточные цепи. + +Справа вы видите **схематик** — **графическую схему**, построенную на основе данного **графа** (**нетлиста**). + +## Synthesis + +На шаге синтеза, САПР берет сгенерированную ранее цифровую схему и реализует элементы этой схемы через примитивы конкретной ПЛИС — в основном через логические ячейки, содержащие таблицы подстановки, полный однобитный сумматор и `D-триггер` (см. [как работает ПЛИС](../Introduction/How%20FPGA%20works.md)). + +В рамках нашего примера, САПР смотрит на построенный на этапе **элаборации** **нетлист** и решает, какими средствами (**примитивами**) ПЛИС можно его реализовать. Поскольку схема чисто **комбинационная**, результат её работы можно рассчитать и выразить в виде **таблицы истинности**, а значит для её реализации лучше всего подойдут **Таблицы Подстановки** (**LUT**-ы). Более того, в ПЛИС `xc7a100tcsg324-1` есть пятивходовые LUT-ы, а у нашей схемы именно столько входов. Это означает, работу всей этой схемы можно заменить **всего одной таблицей подстановки** внутри ПЛИС. + +Итак, продолжим рассматривать наш пример и выполним этап синтеза. Для этого нажмем на кнопку `Run Synthesis`. + +После выполнения синтеза у нас появится возможность открыть новый схематик, сделаем это. + +![../.pic/Vivado%20Basics/Implementation%20steps/impl_synthesised_netlist.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_synthesised_netlist.png) + +Мы видим, что между входами/выходами схемы и её внутренней логикой появились новые примитивы — **буферы**. Они нужны, преобразовать уровень напряжения между ножками ПЛИС и внутренней логикой (условно говоря, на вход плис могут приходить сигналы с уровнем `3.3 В`, а внутри ПЛИС примитивы работают с сигналами уровня `1.2 В`). + +Сама же логика, как мы и предполагали, свернулась в одну пятивходовую таблицу подстановки. + +строка `EQN=32'hAAAA3CCC` означает, что таблица подстановки будет инициализирована следующим 32-битным значением: `0xAAAA3CCC`. +Поскольку у схемы 5 входов, у нас может быть 25=32 возможных комбинаций входных сигналов и для каждого нужно свое значение результата. + +Можно ли как-то проверить данное 32-битное значение без просчитывания всех 32 комбинаций сигналов "на бумажке"? +
+ +Да, можно. + +Сперва надо понять в каком именно порядке будут идти эти комбинации. Мы видим, что сигналы подключены к таблице подстановки в следующем порядке: `d, c, b, a, sel`. Это означает, что сама таблица примет вид: + +```ascii +|sel| a | b | c | d | |res| +|---|---|---|---|---| |---| +| 0 | 0 | 0 | 0 | 0 | | 0 | +| 0 | 0 | 0 | 0 | 1 | | 0 | +| 0 | 0 | 0 | 1 | 0 | | 1 | +| 0 | 0 | 0 | 1 | 1 | | 1 | +| 0 | 0 | 1 | 0 | 0 | | 0 | +.... +| 1 | 1 | 1 | 1 | 1 | | 1 | +``` + +Давайте посмотрим на логику исходной схемы и данную таблицу истинности: когда `sel==1`, на выход идет `d`, это означает, что мы знаем все значения для нижней половины таблицы истинности, в нижней половине таблице истинности самый левый входной сигнал (`sel`) равен только единице, значит результат будет совпадать с сигналом `d`, который непрерывно меняется с `0` на `1` и оканчивается значением `1`. Это означает, что если читать значения результатов снизу-вверх (от старших значений к младшим), то сначала у нас будет 16 цифр, представляющих 8 пар `10`:`101010101010`, что эквивалентно записи `AAAA` в шестнадцатиричной записи. + +Рассчитывать оставшиеся 16 вариантов тоже не обязательно, если посмотреть на схему, то можно заметить, что когда `sel!=1`, ни `sel`, ни `d` больше не участвуют в управлении выходом. Выход будет зависеть от операции xor, которая дает `1` только когда её входы не равны между собой. Верхний вход xor (выход И) , будет равен единице только когда входы `a` и `b` равны единице, причем в данный момент, нас интересуют только ситуации, когда `sel!=1`. Принимая во внимание, что в таблице истинности значения входов записываются чередующимися степенями двойки (единицами, парами, четверками, восьмерками) единиц и нулей, мы понимаем, что интересующая нас часть таблицы истинности будет выглядеть следующим образом: + +```ascii + ... + + | a | b | c | +. |---|---|---| . +. | 1 | 1 | 0 | . +. | 1 | 1 | 0 | . + | 1 | 1 | 1 | + | 1 | 1 | 1 | + + ... +``` + +Только в этой части таблицы истинности мы получим `1` на выходе **И**, при этом в старшей части, вход `c` так же равен `1`. Это значит, что входы **Исключающего ИЛИ** будут равны и на выходе будет `0`. Значит результат этой таблицы истинности будет равен `0011` или `3` в шестнадцатиричной записи. + +Ниже данной части таблицы истинности располагается та часть, где `sel==1`, выше та часть, где выход **И** будет равен `0`. Это означает, что оставшаяся младшая часть будет повторять значения `c`, которое сменяется парами нулей и единиц: `00-11-00-11..`. Эта оставшаяся последовательность будет записана в шестнадцатиричном виде как `0xCCC`. + +Таким образом, мы и получаем искомое выражение `EQN=32'hAAAA3CCC`. Если с этой частью возникли сложности, попробуйте составить данную таблицу истинности (без вычисления самих результатов, а затем просмотрите логику быстрого вычисления результата). +
+ +## Implementation + +После построения новой схемы, где в качестве элементов используются ресурсы конкретной ПЛИС, происходит расчёт размещения этой схемы внутри ПЛИС: выбираются конкретные логические ячейки, происходит маршрутизация сигнала между этими ячейками. Например, реализация 32-битного сумматора с ускоренным переносом может потребовать 32 LUT-а и 8 примитивов вычисления быстрого переноса (`CARRY4`). Будет неразумно использовать для этого примитивы, разбросанные по всему кристаллу ПЛИС, ведь тогда придется выполнять сложную маршрутизацию сигнала, да и временные характеристики устройства так же пострадают (сигналу идущему от предыдущего разряда к следующему придется проходить больший путь). Вместо этого, САПР будет пытаться разместить схему таким образом, чтобы использовались близлежащие примитивы ПЛИС, для получения оптимальных характеристик. + +Что именно считается "оптимальным" зависит от двух вещей: настроек САПР и **ограничений** (**constraints**), наложенных на имплементацию. Ограничения сужают область возможных решений по размещению примитивов внутри ПЛИС под определенные характеристики (временны́е и физические). Например, можно сказать, внутри ПЛИС схема должна быть размещена таким образом, чтобы время прохождения по **критическому пути** не превышало `20ns`. Это временно́е ограничение. Так же нужно сообщить САПР, к какой ножке ПЛИС необходимо подключить входы и выходы нашей схемы — это физическое ограничение. + +Ограничения описываются не на языке описания аппаратуры, вместо этого используются текстовые файлы специального формата, зависящего от конкретной САПР. + +
+ +Пример используемых ограничений для лабораторной по АЛУ. + + +Строки, начинающиеся с `#` являются комментариями. + +Строки, начинающиеся с `set_property` являются физическими ограничениями, связывающими входы и выходы нашей схемы с конкретными входами и выходами ПЛИС. + +Строка `create_clock...` задает временны́е ограничения, описывая целевую тактовую частоту тактового сигнала и его [скважность](https://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%B2%D0%B0%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C). + +```xdc +## This file is a general .xdc for the Nexys A7-100T + +# Clock signal + +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100 }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK100}]; + +# Switches +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { SW[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { SW[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { SW[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { SW[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { SW[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { SW[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { SW[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { SW[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { SW[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { SW[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { SW[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { SW[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { SW[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { SW[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + +### LEDs + +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { LED[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { LED[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { LED[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { LED[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { LED[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { LED[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { LED[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { LED[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { LED[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { LED[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { LED[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { LED[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +## 7 segment display +set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { CA }]; #IO_L24N_T3_A00_D16_14 Sch=ca +set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { CB }]; #IO_25_14 Sch=cb +set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { CC }]; #IO_25_15 Sch=cc +set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { CD }]; #IO_L17P_T2_A26_15 Sch=cd +set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { CE }]; #IO_L13P_T2_MRCC_14 Sch=ce +set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { CF }]; #IO_L19P_T3_A10_D26_14 Sch=cf +set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { CG }]; #IO_L4P_T0_D04_14 Sch=cg +# set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp +set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { AN[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { AN[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { AN[6] }]; #IO_L23P_T3_35 Sch=an[6] +set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + +## Buttons +set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn +``` + +
+ +После выполнения имплементации, нетлист и схема остаются неизменными, однако использованные для реализации схемы примитивы получают свой "адрес" внутри ПЛИС: + +![cell_add../.pic/Vivado%20Basics/Implementation%20steps/impl_cell_address.pngress](../.pic/Vivado%20Basics/Implementation%20steps/impl_cell_address.png) + +Теперь, мы можем посмотреть на "внутренности" нашей ПЛИС `xc7a100tcsg324-1` и то, как через её примитивы будет реализована наша схема. Для этого, необходимо отрыть имплементированное устройство: `Implementation -> Open implemented design`. Откроется следующее окно: + +![../.pic/Vivado%20Basics/Implementation%20steps/impl_fpga_device_full_view.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_fpga_device_full_view.png) + +Может показаться очень страшным и непонятным, но это содержимое ПЛИС. Просто из-за огромного количества содержащихся в ней примитивов, она показана в таком масштабе, что все сливается в один цветной ковер. Большая часть этого окна неактивна (показана в темно-синих тонах) и это нормально, ведь мы реализовали крошечную цифровую схему, она и не должна занимать значительное количество ресурсов ПЛИС. + +Нас интересует "[бледно-голубая точка](https://ru.wikipedia.org/wiki/Pale_Blue_Dot)", расположенная в нижнем левом углу прямоугольника `X0Y1` (выделено красным). Если отмасштабировать эту зону, мы найдем используемый нами LUT: + +![../.pic/Vivado%20Basics/Implementation%20steps/impl_fpga_device_zoomed_view.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_fpga_device_zoomed_view.png) + +Кроме того, если поиграться со свойствами этого примитива, мы сможем найти нашу таблицу истинности, инициализирующую этот примитив. + +## Generate Bitstream + +После того, как САПР определил конкретные примитивы, их режим работы, и пути сигнала между ними, необходимо создать двоичный файл (**bitstream**), который позволит сконфигурировать ПЛИС необходимым нам образом. +Получив этот файл, остается запрограммировать ПЛИС, после чего она воплотит разработанное устройство. + +## Выводы + +Таким образом, маршрут перехода от HDL-описания устройства до его реализации в ПЛИС выглядит следующим образом: + +1. Сперва происходит анализ HDL-описания. В ходе этого анализа выявляются простейшие структуры: регистры, мультиплексоры, вычислительные блоки (сложения/умножения/сдвига и т.п.). Строится граф схемы, построенной с помощью этих структур (**нетлист**). Данный нетлист платформонезависим, т.е. не привязан к конкретной ПЛИС. +2. После происходит этап синтеза нетлиста, полученного на предыдущем этапе в нетлист, использующий имеющиеся ресурсы конкретной ПЛИС. Все, использовавшиеся на предыдущем этапе структуры (регистры, мультиплексоры и прочие блоки) реализуются через примитивы ПЛИС (LUT-ы, D-триггеры, блоки сложения и т.п.). +3. Затем происходит этап размещения схемы внутри ПЛИС: если на предыдущем этапе часть схемы была реализована через LUT, то на этом этапе решается **какой именно** LUT будет использован. Область допустимых решений по этому вопросу сужается путем наложения **ограничений** (**constraints**). +4. После размещения остается только сгенерировать двоичный файл (**bitstream**), который во время прошивки сконфигурирует ПЛИС на реализацию нашей схемы. diff --git a/Vivado Basics/Install Vivado.md b/Vivado Basics/Install Vivado.md new file mode 100644 index 0000000..17b4698 --- /dev/null +++ b/Vivado Basics/Install Vivado.md @@ -0,0 +1,24 @@ +# Руководство по установке Vivado + +1) ~~Заводите учётную запись на сайте xilinx.com~~ +2) ~~Заходите переходите по адресу: https://www.xilinx.com/support/download.html~~ +3) ~~Скачиваете веб-установщик под свою ОС, запускаете его~~ +4) ~~Нажимаете "Далее", вводите свои учётные данные, нажимаете "Далее"~~ + +В связи с блокировкой IP-адресов РФ на серверах Xilinx, пункты 1-4 изменены: +1. Находясь в миэтовской локальной сети (через общажную сеть, или подключившись к [миэтовскому vpn](https://vpn.miet.ru/)), перейдите по [этой ссылке](https://nextcloud.borisblade.ru/s/g4YfWoimpYWH6fS); +2. Скачайте файл `Xilinx_Vivado_2019.2_1106_2127.tar.gz`, распакуйте его. Обратите внимание, что для скачанного архива, его распакованной версии и установленного пакета Vivado потребуется около 76.5Гб свободного места на диске (после установки Vivado скачанный архив и его распакованную версию размером в 53.5Гб можно будет удалить). +3. В открывшемся окне, откажитесь от предложения обновить установочный пакет до актуальной версии, нажав на кнопку "Continue" + +![../.pic/Vivado%20Basics/Install%20Vivado/update_suggetion.png](../.pic/Vivado%20Basics/Install%20Vivado/update_suggetion.png) + +4. Нажмите кнопку Next, проставьте галочки на всех соглашениях (разумеется желательно прочитав их), снова нажмите Next. +5. В списке вариантов установок, выбираете "Vivado HL WebPACK". +6. В настройках установки, в разделе Devices снимите галочки со всего что можно снять, нажмите Next. + +![../.pic/Vivado%20Basics/Install%20Vivado/installation_customization.png](../.pic/Vivado%20Basics/Install%20Vivado/installation_customization.png) + +7. Выберите место установки (либо оставьте место по умолчанию), нажмите Next. +8. На последней странице вам будет представлена информация о выбранных вами опциях, использование дискового пространства во время и после установки. Если вас все устраивает, нажмите Install + +![../.pic/Vivado%20Basics/Install%20Vivado/final_page.png](../.pic/Vivado%20Basics/Install%20Vivado/final_page.png) diff --git a/Vivado Basics/Program nexys a7.md b/Vivado Basics/Program nexys a7.md new file mode 100644 index 0000000..6c2349f --- /dev/null +++ b/Vivado Basics/Program nexys a7.md @@ -0,0 +1,13 @@ +# Как прошить ПЛИС + +После того, как вы создали свой модуль и проверили его на прохождение тестбенча, вы можете использовать предоставленный в папке `board files` модуль окружения, который позволяет связать вашу логику с периферией, расположенной на плате `Nexys-A7`. Для его подключения, скачайте и добавьте файл в проект, либо скопируйте содержимое в новый `.v` файл вашего проекта. В окне `Sources` нажмите на него ПКМ и выберите `Set as Top`, после чего в иерархии он станет главным, подключив ваш собственный модуль. Для того, чтобы дизайн мог физически подключиться к периферии, нужно в проекте выбрать `Add Sources`, `Add or create constraints` и подключить файл `nexys_a7_100t.xdc`. Если у вас уже подключен этот файл, необходимо заменить данные на те, которые предложены в текущей папке `board files`. + +Для прошивки ПЛИС подключите устройство через USB, включите питание переключателем, выполните синтез и имплементацию вашего дизайна и сгенерируйте битстрим. Если на этом этапе у вас возникают ошибки, постарайтесь исправить их с помощью [`инструкции по работе с ошибками`](Elaboration%20failed.md). + +Все этапы проходят достаточно медленно, подробнее о них можно узнать [`здесь`](Implementation%20steps.md). По завершению у вас всплывет окно, информирующее об окончании генерации битстрима, для следующего шага вы можете выбрать пункт `Open Hardware Manager` и нажать `OK`, либо нажать `Cancel` и выбрать в левом меню в самом низу `Open Hardware Manager`, `Open Target` - `Auto Connect`, затем `Program Device` и ваше устройство прошьется. + +Генерация битстрима +![../.pic/Labs/board%20files/Program_Device1.png](../.pic/Labs/board%20files/Program_Device1.png) + +Прошивка ПЛИС +![../.pic/Labs/board%20files/Program_Device2.png](../.pic/Labs/board%20files/Program_Device2.png) diff --git a/Vivado Basics/README.md b/Vivado Basics/README.md new file mode 100644 index 0000000..c12cd4f --- /dev/null +++ b/Vivado Basics/README.md @@ -0,0 +1,18 @@ +# Основа работы с Vivado + +Цикл лабораторных работ создан, чтобы вы могли на практике отработать полученные знания по архитектурам процессорных систем, увидеть "изнутри", как "бегают нолики и единицы", подобно тому, как они бегают и в ваших компьютерах. +Для эффективного погружения в лабораторные работы используется САПР **Vivado**. Это довольно сложный инструмент, на одно только осваивание которого требуется порядочное количество времени. +Дабы сократить порог вхождения в освоение этого инструмента, был написан ряд материалов по описанию базовых сценариев использования, который представлен в данной папке. +Здесь находятся инструкции о том как: + +1. [Установить Vivado](Install%20Vivado.md) +2. [Создать демо-проект под отладочный стенд Nexys-7](Vivado%20trainer.md) +3. [Загрузить сделанную лабу в ПЛИС](Program%20nexys%20a7.md) +4. [Понять структуру папок в проекте Vivado](Folder%20Structure%20In%20The%20Project.md) +5. [Открыть логическую схему написанного вами модуля](How%20to%20open%20a%20schematic.md) +6. [Запустить симуляцию](Run%20Simulation.md) +7. [Разобраться с ошибками, при попытке открыть схему / запустить симуляцию](Elaboration%20failed.md) +8. [Находить и исправлять ошибки дизайна, найденные тестовым окружением](Debug_manual.md) +9. [Добавить заголовочный файл в проект Vivado](Verilog%20Header.md) +10. [Добавить файл инициализации памяти в проект Vivado](How%20to%20add%20a%20mem-file.md) +11. [Понять как работают этапы элаборации/синтеза/имплементации](Implementation%20steps.md) diff --git a/Vivado Basics/Run Simulation.md b/Vivado Basics/Run Simulation.md new file mode 100644 index 0000000..3091e53 --- /dev/null +++ b/Vivado Basics/Run Simulation.md @@ -0,0 +1,25 @@ +# Как запустить симуляцию модуля в Vivado + +При добавлении `tb` модулей и подключении к ним `Design Sources`, мы видим, как в уровнях иерархии модуль симуляции становится самым верхним, включая в себя все модули вашего дизайна. Так называемый test bench (tb) — виртуальный стенд, куда мы поместили наш `top` модуль. Надо обратить внимание, что `tb` модуль не имеет портов ввода-вывода: подключенные сигналы для нашей схемы описываются непосредственно средствами языка Verilog. + +Иерархия модулей проекта. + +![../.pic/Vivado%20Basics/Run%20Simulation/Run_sim1.png](../.pic/Vivado%20Basics/Run%20Simulation/Run_sim1.png) + +Есть 2 способа запустить симуляцию + +1. На панели слева в разделе `SIMULATION` нажать `Run Simulation` - `Run Behavioral Simulation`. + +![../.pic/Vivado%20Basics/Run%20Simulation/Run_sim2.png](../.pic/Vivado%20Basics/Run%20Simulation/Run_sim2.png) + +2. В иерархии проекта нажать по папке `sim_1` ПКМ, далее выбрать `Run Simulation`. + +![../.pic/Vivado%20Basics/Run%20Simulation/Run_sim3.png](../.pic/Vivado%20Basics/Run%20Simulation/Run_sim3.png) + +Автоматически симуляция запускается на определенный промежуток времени, после чего останавливается, если этого времени не хватает для прохождения всех этапов симуляции, и в консоли вы не видите результат ее прохождения, тогда необходимо обратиться к появившимся вверху кнопкам управления и нажать на `Run All`(треугольный символ воспроизведения), после чего убедиться, что в консоли выдало информацию о достижении конца симуляции. + +Важное замечание: если вы изменили топ-модуль симуляции, то вам необходимо закрыть текущую симуляцию. Без этого новая не сможет запуститься и будет выдавать ошибку. Подробнее об этой ошибке можно узнать в [`списке типичных ошибок`](../Other/FAQ.md#%D0%BD%D0%B5-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D1%82%D1%81%D1%8F-%D1%81%D0%B8%D0%BC%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-boot-filesystem-remove-%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81-%D0%BD%D0%B5-%D0%BC%D0%BE%D0%B6%D0%B5%D1%82-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-%D1%84%D0%B0%D0%B9%D0%BB%D1%83). Это решается закрытием симуляции. Закрыть ее можно нажав ПКМ по шапке, расположенной сразу под кнопками управления симуляцией и выбрать `Close`, так же можно найти справа крестик этой шапки, либо нажать ПКМ по **разделу** `SIMULATION`, находящегося на панели слева, и выбрать `Close Simulation`, что так же закроет текущую симуляцию, + +![../.pic/Vivado%20Basics/Run%20Simulation/Run_sim4.png](../.pic/Vivado%20Basics/Run%20Simulation/Run_sim4.png) + +Для перезапуска симуляции не обязательно действовать так, как описано в двух способах запуска, можно воспользоваться иконкой закругленной стрелки, она это делает в один клик. diff --git a/Vivado Basics/Verilog Header.md b/Vivado Basics/Verilog Header.md new file mode 100644 index 0000000..bff574b --- /dev/null +++ b/Vivado Basics/Verilog Header.md @@ -0,0 +1,19 @@ +# Как добавить файл с define + + Директива `ˋinclude` позволяет вставлять код из одного файла, в код другого, подобно `#include` на языке `C`. Если вы описываете данную директиву, когда подключаемый файл не добавлен в качестве Verilog Header в проект, Vivado будет интерпретировать её как синтаксическую ошибку, поскольку не сможет найти подключаемый файл, и тогда ваш модуль будет находиться в папке `Syntax Error Files` иерархии вашего проекта. + +![../.pic/Vivado%20Basics/Verilog%20Header/Verilog_Header1.png](../.pic/Vivado%20Basics/Verilog%20Header/Verilog_Header1.png) + +Файл в проект добавляется точно так же, как при создании Verilog-файла, только вместо `Create File` нужно нажать `Add Files`, затем перейти к его расположению, выбрать его и нажать `OK` и `Finish`. + +После обновления иерархии вашего проекта, этот файл будет располагаться в папке `Non-module Files`. + +![../.pic/Vivado%20Basics/Verilog%20Header/Verilog_Header2.png](../.pic/Vivado%20Basics/Verilog%20Header/Verilog_Header2.png) + +Следующим шагом нужно нажать по этому файлу `ПКМ`, выделив его, убедившись, что в окне ниже выбран именно он, необходимо сменить его тип на `Verilog Header`. + +![../.pic/Vivado%20Basics/Verilog%20Header/Verilog_Header3.png](../.pic/Vivado%20Basics/Verilog%20Header/Verilog_Header3.png) + +После этого нужно убедиться, что наш файл появился в иерархии проекта в папке `Verilog Header`, а наш файл с модулем больше не лежит в папке `Syntax Error Files`. + +![../.pic/Vivado%20Basics/Verilog%20Header/Verilog_Header4.png](../.pic/Vivado%20Basics/Verilog%20Header/Verilog_Header4.png) diff --git a/Vivado Basics/Vivado trainer.md b/Vivado Basics/Vivado trainer.md new file mode 100644 index 0000000..dd92959 --- /dev/null +++ b/Vivado Basics/Vivado trainer.md @@ -0,0 +1,99 @@ +# Создание базового проекта с прошивкой ПЛИС в Vivado + +## Создание проекта в Системе Автоматизированного Проектирования (САПР) + +1. Запустить Vivado 2019.2 +2. Нажать `Create Project` +3. В открывшемся окне нажать Next +4. Ввести название проекта (никаких пробелов и кириллических символов) → Выбрать папку для проектов (создать каталок на D:/) → Поставить галку `Create project subdirectory` → Нажать `Next` +5. Выбрать RTL Project → Поставить галку `Do not specify sources at this time` → Нажать Next +6. Выставить фильтры, для сужения списка ПЛИС: + * Family: `Artix 7` + * Package: `CSG324`, + * Speed: `-1`. + +
+ Скриншот окна с выставленными фильтрами + + ![Скриншот окна с выставленными фильтрами](../.pic/Vivado%20Basics/Vivado%20trainer/fpga_filter.png) + +
+ +7. В списке выбрать ПЛИС `xc7a100tcsg324-1` → Нажать Next +8. Нажать Finish +9. Закрыть Vivado +10. Удалить папку +11. Повторить все действия самостоятельно + +## Создание модуля на Verilog + +1. Создать новый Verilog файл, для этого в окне `Sources` нажать на кнопку `+` +2. В открывшемся окне выбрать `Add or create design source` → Нажать `Next` +3. Нажать `Create File` → В открывшемся окне ввести имя модуля `top` → Нажать `OK` → В оставшемся окне нажать `Finish` +4. В открывшемся окне НЕ вводить названия портов и сразу нажать OK → После чего подтвердить выбор `Yes` +5. Двойным кликов в окне `Source` открыть файл `top.v` +6. Написать следующий код: + +```Verilog +module top ( + input clk, + input a, + input b, + output reg q +); + +wire c; + +assign c = a ^ b; + +always @ (posedge clk) begin + q <= c; +end + +endmodule +``` + +7. Сохранить изменения +8. Нажать `Open Elaborated Design` +9. Нажать `Schematic` в открывшемся списке +10. Проанализировать полученный результат (сопоставить с Verilog-описанием) +11. Закрыть проект + +## Реализация простого проекта на отладочном стенде + +1. Создать новый проект +2. Создать новый Verilog файл с названием basic +3. Написать следующий код: + +```Verilog +module basic ( + input [15:0] SW, + output [15:0] LED +); + +assign LED[0] = SW[0] & SW[1]; +assign LED[2] = SW[2] | SW[3]; +assign LED[4] = SW[4] ^ SW[5]; +assign LED[10:6] = ~SW[10:6]; +assign LED[13:11] = {SW[11], SW[12], SW[13]}; +assign LED[15:14] = { 2{SW[14]} }; + +endmodule + +``` + +4. Сохранить изменения +5. В окне Sources нажать на кнопку `+` +6. В открывшемся окне выбрать `Add or create constraints` → Нажать Next +7. Нажать `Create File` → В открывшемся окне ввести название → Нажать `OK` → `Finish` +8. В окне `Source` в открывающемся списке `Constraints` найти только что созданный файл и открыть его дя редактирования двойным щелчком +9. Скопировать содержимое файла констрейнов с [официального сайта](https://github.com/Digilent/digilent-xdc) и вставить в только что созданный → Найти строки посвященные SW и LED и раскомментировать их → Сохранить изменения +10. `Run Synthesis` +11. `Run Implementation` +12. После успешной имплементации нажимаем `Generate Bitstream` для генерации файла прошивки +13. Аккуратно достаем и подключаем стенд к компьютеру → Включаем питание на плате +14. Нажимаем `Open Hardware Manager` (под `Generate Bitstream`) +15. Вместо окна `Source` будет отображаться окно `Hardware`, в нем необходимо нажать кнопку `Auto Connect` (единственная активная кнопка) → В окне появится подключенное устройство +16. Нажать правой кнопкой на устройстве `xc7a100t_0` → Выбрать пункт меню `Program Device` +17. В открывшемся окне нажать `Program` +18. Сопоставить поведение отладочной платы с Verilog-описанием