From 8f5a684b102afdb3d81518d75fef4487f4eca89f Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 24 Apr 2020 20:21:32 -0600 Subject: [PATCH 001/180] removed redundant include files in all the verilog netlists except the top one --- openfpga/src/fpga_verilog/verilog_api.cpp | 13 +++++------- .../src/fpga_verilog/verilog_decoders.cpp | 3 --- openfpga/src/fpga_verilog/verilog_decoders.h | 1 - .../fpga_verilog/verilog_essential_gates.cpp | 3 --- .../fpga_verilog/verilog_essential_gates.h | 1 - .../verilog_formal_random_top_testbench.cpp | 6 ------ .../verilog_formal_random_top_testbench.h | 1 - openfpga/src/fpga_verilog/verilog_grid.cpp | 15 +++----------- openfpga/src/fpga_verilog/verilog_grid.h | 1 - openfpga/src/fpga_verilog/verilog_lut.cpp | 3 --- openfpga/src/fpga_verilog/verilog_lut.h | 1 - openfpga/src/fpga_verilog/verilog_memory.cpp | 3 --- openfpga/src/fpga_verilog/verilog_memory.h | 1 - openfpga/src/fpga_verilog/verilog_mux.cpp | 3 --- openfpga/src/fpga_verilog/verilog_mux.h | 1 - .../verilog_preconfig_top_module.cpp | 8 +------- .../verilog_preconfig_top_module.h | 3 +-- openfpga/src/fpga_verilog/verilog_routing.cpp | 20 ++----------------- openfpga/src/fpga_verilog/verilog_routing.h | 2 -- .../src/fpga_verilog/verilog_submodule.cpp | 14 ++++++------- openfpga/src/fpga_verilog/verilog_submodule.h | 1 - .../fpga_verilog/verilog_submodule_utils.cpp | 3 --- .../fpga_verilog/verilog_submodule_utils.h | 1 - .../src/fpga_verilog/verilog_top_module.cpp | 3 --- .../fpga_verilog/verilog_top_testbench.cpp | 4 ---- .../src/fpga_verilog/verilog_top_testbench.h | 1 - openfpga/src/fpga_verilog/verilog_wire.cpp | 3 --- openfpga/src/fpga_verilog/verilog_wire.h | 1 - 28 files changed, 18 insertions(+), 102 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_api.cpp b/openfpga/src/fpga_verilog/verilog_api.cpp index d2823df48..c8c7343ad 100644 --- a/openfpga/src/fpga_verilog/verilog_api.cpp +++ b/openfpga/src/fpga_verilog/verilog_api.cpp @@ -91,7 +91,7 @@ void fpga_fabric_verilog(ModuleManager& module_manager, */ print_verilog_submodule(module_manager, netlist_manager, mux_lib, circuit_lib, - src_dir_path, submodule_dir_path, + submodule_dir_path, options); /* Generate routing blocks */ @@ -99,14 +99,14 @@ void fpga_fabric_verilog(ModuleManager& module_manager, print_verilog_unique_routing_modules(netlist_manager, const_cast(module_manager), device_rr_gsb, - src_dir_path, rr_dir_path, + rr_dir_path, options.explicit_port_mapping()); } else { VTR_ASSERT(false == options.compress_routing()); print_verilog_flatten_routing_modules(netlist_manager, const_cast(module_manager), device_rr_gsb, - src_dir_path, rr_dir_path, + rr_dir_path, options.explicit_port_mapping()); } @@ -114,7 +114,7 @@ void fpga_fabric_verilog(ModuleManager& module_manager, print_verilog_grids(netlist_manager, const_cast(module_manager), device_ctx, device_annotation, - src_dir_path, lb_dir_path, + lb_dir_path, options.explicit_port_mapping(), options.verbose_output()); @@ -180,8 +180,7 @@ void fpga_verilog_testbench(const NetlistManager& netlist_manager, atom_ctx, place_ctx, io_location_map, netlist_annotation, netlist_name, - formal_verification_top_netlist_file_path, - src_dir_path); + formal_verification_top_netlist_file_path); } if (true == options.print_preconfig_top_testbench()) { @@ -190,7 +189,6 @@ void fpga_verilog_testbench(const NetlistManager& netlist_manager, + std::string(RANDOM_TOP_TESTBENCH_VERILOG_FILE_POSTFIX); print_verilog_random_top_testbench(netlist_name, random_top_testbench_file_path, - src_dir_path, atom_ctx, netlist_annotation, simulation_setting); @@ -208,7 +206,6 @@ void fpga_verilog_testbench(const NetlistManager& netlist_manager, netlist_annotation, netlist_name, top_testbench_file_path, - src_dir_path, simulation_setting); } diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 0e993a3d3..30789e36f 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -165,7 +165,6 @@ void print_verilog_submodule_mux_local_decoders(const ModuleManager& module_mana NetlistManager& netlist_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir) { std::string verilog_fname(submodule_dir + std::string(LOCAL_ENCODER_VERILOG_FILE_NAME)); @@ -181,8 +180,6 @@ void print_verilog_submodule_mux_local_decoders(const ModuleManager& module_mana print_verilog_file_header(fp, "Local Decoders for Multiplexers"); - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Create a library for local encoders with different sizes */ DecoderLibrary decoder_lib; diff --git a/openfpga/src/fpga_verilog/verilog_decoders.h b/openfpga/src/fpga_verilog/verilog_decoders.h index f8d559f4d..9b2bbb6b1 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.h +++ b/openfpga/src/fpga_verilog/verilog_decoders.h @@ -25,7 +25,6 @@ void print_verilog_submodule_mux_local_decoders(const ModuleManager& module_mana NetlistManager& netlist_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_verilog/verilog_essential_gates.cpp b/openfpga/src/fpga_verilog/verilog_essential_gates.cpp index 20be3e7e4..cb8eb9504 100644 --- a/openfpga/src/fpga_verilog/verilog_essential_gates.cpp +++ b/openfpga/src/fpga_verilog/verilog_essential_gates.cpp @@ -527,7 +527,6 @@ void print_verilog_constant_generator_module(const ModuleManager& module_manager ***********************************************/ void print_verilog_submodule_essentials(const ModuleManager& module_manager, NetlistManager& netlist_manager, - const std::string& verilog_dir, const std::string& submodule_dir, const CircuitLibrary& circuit_lib) { /* TODO: remove .bak when this part is completed and tested */ @@ -546,8 +545,6 @@ void print_verilog_submodule_essentials(const ModuleManager& module_manager, print_verilog_file_header(fp, "Essential gates"); - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Print constant generators */ /* VDD */ print_verilog_constant_generator_module(module_manager, fp, 0); diff --git a/openfpga/src/fpga_verilog/verilog_essential_gates.h b/openfpga/src/fpga_verilog/verilog_essential_gates.h index b267d0e6e..2510e6d3d 100644 --- a/openfpga/src/fpga_verilog/verilog_essential_gates.h +++ b/openfpga/src/fpga_verilog/verilog_essential_gates.h @@ -18,7 +18,6 @@ namespace openfpga { void print_verilog_submodule_essentials(const ModuleManager& module_manager, NetlistManager& netlist_manager, - const std::string& verilog_dir, const std::string& submodule_dir, const CircuitLibrary& circuit_lib); diff --git a/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.cpp index fa4f68938..8d4dab5c9 100644 --- a/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.cpp @@ -183,7 +183,6 @@ void print_verilog_random_testbench_fpga_instance(std::fstream& fp, ********************************************************************/ void print_verilog_random_top_testbench(const std::string& circuit_name, const std::string& verilog_fname, - const std::string& verilog_dir, const AtomContext& atom_ctx, const VprNetlistAnnotation& netlist_annotation, const SimulationSetting& simulation_parameters) { @@ -203,11 +202,6 @@ void print_verilog_random_top_testbench(const std::string& circuit_name, std::string title = std::string("FPGA Verilog Testbench for Formal Top-level netlist of Design: ") + circuit_name; print_verilog_file_header(fp, title); - /* Print preprocessing flags and external netlists */ - print_verilog_include_defines_preproc_file(fp, verilog_dir); - - print_verilog_include_netlist(fp, std::string(verilog_dir + std::string(DEFINES_VERILOG_SIMULATION_FILE_NAME))); - /* Preparation: find all the clock ports */ std::vector clock_port_names = find_atom_netlist_clock_port_names(atom_ctx.nlist, netlist_annotation); diff --git a/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.h b/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.h index 88692ae4f..b12072b70 100644 --- a/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.h +++ b/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.h @@ -17,7 +17,6 @@ namespace openfpga { void print_verilog_random_top_testbench(const std::string& circuit_name, const std::string& verilog_fname, - const std::string& verilog_dir, const AtomContext& atom_ctx, const VprNetlistAnnotation& netlist_annotation, const SimulationSetting& simulation_parameters); diff --git a/openfpga/src/fpga_verilog/verilog_grid.cpp b/openfpga/src/fpga_verilog/verilog_grid.cpp index 0cf509bde..d2917836b 100644 --- a/openfpga/src/fpga_verilog/verilog_grid.cpp +++ b/openfpga/src/fpga_verilog/verilog_grid.cpp @@ -197,7 +197,6 @@ static void print_verilog_logical_tile_netlist(NetlistManager& netlist_manager, const ModuleManager& module_manager, const VprDeviceAnnotation& device_annotation, - const std::string& verilog_dir, const std::string& subckt_dir, t_pb_graph_node* pb_graph_head, const bool& use_explicit_mapping, @@ -220,9 +219,6 @@ void print_verilog_logical_tile_netlist(NetlistManager& netlist_manager, print_verilog_file_header(fp, std::string("Verilog modules for logical tile: " + std::string(pb_graph_head->pb_type->name) + "]")); - /* Print preprocessing flags */ - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Print Verilog modules for all the pb_types/pb_graph_nodes * use a Depth-First Search Algorithm to print the sub-modules * Note: DFS is the right way. Do NOT use BFS. @@ -262,7 +258,6 @@ void print_verilog_logical_tile_netlist(NetlistManager& netlist_manager, static void print_verilog_physical_tile_netlist(NetlistManager& netlist_manager, const ModuleManager& module_manager, - const std::string& verilog_dir, const std::string& subckt_dir, t_physical_tile_type_ptr phy_block_type, const e_side& border_side, @@ -300,9 +295,6 @@ void print_verilog_physical_tile_netlist(NetlistManager& netlist_manager, print_verilog_file_header(fp, std::string("Verilog modules for physical tile: " + std::string(phy_block_type->name) + "]")); - /* Print preprocessing flags */ - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Create a Verilog Module for the top-level physical block, and add to module manager */ std::string grid_module_name = generate_grid_block_module_name(std::string(GRID_VERILOG_FILE_NAME_PREFIX), std::string(phy_block_type->name), is_io_type(phy_block_type), border_side); ModuleId grid_module = module_manager.find_module(grid_module_name); @@ -338,7 +330,6 @@ void print_verilog_grids(NetlistManager& netlist_manager, const ModuleManager& module_manager, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, - const std::string& verilog_dir, const std::string& subckt_dir, const bool& use_explicit_mapping, const bool& verbose) { @@ -362,7 +353,7 @@ void print_verilog_grids(NetlistManager& netlist_manager, print_verilog_logical_tile_netlist(netlist_manager, module_manager, device_annotation, - verilog_dir, subckt_dir, + subckt_dir, logical_tile.pb_graph_head, use_explicit_mapping, verbose); @@ -395,7 +386,7 @@ void print_verilog_grids(NetlistManager& netlist_manager, for (const e_side& io_type_side : io_type_sides) { print_verilog_physical_tile_netlist(netlist_manager, module_manager, - verilog_dir, subckt_dir, + subckt_dir, &physical_tile, io_type_side, use_explicit_mapping); @@ -405,7 +396,7 @@ void print_verilog_grids(NetlistManager& netlist_manager, /* For CLB and heterogenenous blocks */ print_verilog_physical_tile_netlist(netlist_manager, module_manager, - verilog_dir, subckt_dir, + subckt_dir, &physical_tile, NUM_SIDES, use_explicit_mapping); diff --git a/openfpga/src/fpga_verilog/verilog_grid.h b/openfpga/src/fpga_verilog/verilog_grid.h index 6d2843628..7603bd298 100644 --- a/openfpga/src/fpga_verilog/verilog_grid.h +++ b/openfpga/src/fpga_verilog/verilog_grid.h @@ -21,7 +21,6 @@ void print_verilog_grids(NetlistManager& netlist_manager, const ModuleManager& module_manager, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, - const std::string& verilog_dir, const std::string& subckt_dir, const bool& use_explicit_mapping, const bool& verbose); diff --git a/openfpga/src/fpga_verilog/verilog_lut.cpp b/openfpga/src/fpga_verilog/verilog_lut.cpp index fabe9340e..34767aff7 100644 --- a/openfpga/src/fpga_verilog/verilog_lut.cpp +++ b/openfpga/src/fpga_verilog/verilog_lut.cpp @@ -32,7 +32,6 @@ namespace openfpga { void print_verilog_submodule_luts(const ModuleManager& module_manager, NetlistManager& netlist_manager, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir, const bool& use_explicit_port_map) { std::string verilog_fname = submodule_dir + std::string(LUTS_VERILOG_FILE_NAME); @@ -50,8 +49,6 @@ void print_verilog_submodule_luts(const ModuleManager& module_manager, print_verilog_file_header(fp, "Look-Up Tables"); - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Search for each LUT circuit model */ for (const auto& lut_model : circuit_lib.models()) { /* Bypass user-defined and non-LUT modules */ diff --git a/openfpga/src/fpga_verilog/verilog_lut.h b/openfpga/src/fpga_verilog/verilog_lut.h index e9ba3465a..a102e6df0 100644 --- a/openfpga/src/fpga_verilog/verilog_lut.h +++ b/openfpga/src/fpga_verilog/verilog_lut.h @@ -21,7 +21,6 @@ namespace openfpga { void print_verilog_submodule_luts(const ModuleManager& module_manager, NetlistManager& netlist_manager, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir, const bool& use_explicit_port_map); diff --git a/openfpga/src/fpga_verilog/verilog_memory.cpp b/openfpga/src/fpga_verilog/verilog_memory.cpp index 53420a794..ad30eb337 100644 --- a/openfpga/src/fpga_verilog/verilog_memory.cpp +++ b/openfpga/src/fpga_verilog/verilog_memory.cpp @@ -100,7 +100,6 @@ void print_verilog_submodule_memories(const ModuleManager& module_manager, NetlistManager& netlist_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir, const bool& use_explicit_port_map) { /* Plug in with the mux subckt */ @@ -118,8 +117,6 @@ void print_verilog_submodule_memories(const ModuleManager& module_manager, print_verilog_file_header(fp, "Memories used in FPGA"); - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Create the memory circuits for the multiplexer */ for (auto mux : mux_lib.muxes()) { const MuxGraph& mux_graph = mux_lib.mux_graph(mux); diff --git a/openfpga/src/fpga_verilog/verilog_memory.h b/openfpga/src/fpga_verilog/verilog_memory.h index a331e5687..f489df2ad 100644 --- a/openfpga/src/fpga_verilog/verilog_memory.h +++ b/openfpga/src/fpga_verilog/verilog_memory.h @@ -23,7 +23,6 @@ void print_verilog_submodule_memories(const ModuleManager& module_manager, NetlistManager& netlist_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir, const bool& use_explicit_port_map); diff --git a/openfpga/src/fpga_verilog/verilog_mux.cpp b/openfpga/src/fpga_verilog/verilog_mux.cpp index c85978722..3b7d3300b 100644 --- a/openfpga/src/fpga_verilog/verilog_mux.cpp +++ b/openfpga/src/fpga_verilog/verilog_mux.cpp @@ -1227,7 +1227,6 @@ void print_verilog_submodule_muxes(ModuleManager& module_manager, NetlistManager& netlist_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir, const bool& use_explicit_port_map) { @@ -1245,8 +1244,6 @@ void print_verilog_submodule_muxes(ModuleManager& module_manager, print_verilog_file_header(fp, "Multiplexers"); - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Generate basis sub-circuit for unique branches shared by the multiplexers */ for (auto mux : mux_lib.muxes()) { const MuxGraph& mux_graph = mux_lib.mux_graph(mux); diff --git a/openfpga/src/fpga_verilog/verilog_mux.h b/openfpga/src/fpga_verilog/verilog_mux.h index c98fa77d0..361c394dc 100644 --- a/openfpga/src/fpga_verilog/verilog_mux.h +++ b/openfpga/src/fpga_verilog/verilog_mux.h @@ -24,7 +24,6 @@ void print_verilog_submodule_muxes(ModuleManager& module_manager, NetlistManager& netlist_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir, const bool& use_explicit_port_map); diff --git a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp index 695d9275f..8e1de5cfc 100644 --- a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp +++ b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp @@ -385,8 +385,7 @@ void print_verilog_preconfig_top_module(const ModuleManager& module_manager, const IoLocationMap& io_location_map, const VprNetlistAnnotation& netlist_annotation, const std::string& circuit_name, - const std::string& verilog_fname, - const std::string& verilog_dir) { + const std::string& verilog_fname) { std::string timer_message = std::string("Write pre-configured FPGA top-level Verilog netlist for design '") + circuit_name + std::string("'"); /* Start time count */ @@ -403,11 +402,6 @@ void print_verilog_preconfig_top_module(const ModuleManager& module_manager, std::string title = std::string("Verilog netlist for pre-configured FPGA fabric by design: ") + circuit_name; print_verilog_file_header(fp, title); - /* Print preprocessing flags and external netlists */ - print_verilog_include_defines_preproc_file(fp, verilog_dir); - - print_verilog_include_netlist(fp, std::string(verilog_dir + std::string(DEFINES_VERILOG_SIMULATION_FILE_NAME))); - /* Print module declaration and ports */ print_verilog_preconfig_top_module_ports(fp, circuit_name, atom_ctx, netlist_annotation); diff --git a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.h b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.h index 499cafea9..e8efe5f29 100644 --- a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.h +++ b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.h @@ -29,8 +29,7 @@ void print_verilog_preconfig_top_module(const ModuleManager& module_manager, const IoLocationMap& io_location_map, const VprNetlistAnnotation& netlist_annotation, const std::string& circuit_name, - const std::string& verilog_fname, - const std::string& verilog_dir); + const std::string& verilog_fname); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_verilog/verilog_routing.cpp b/openfpga/src/fpga_verilog/verilog_routing.cpp index 8f74c0074..e6df8e858 100644 --- a/openfpga/src/fpga_verilog/verilog_routing.cpp +++ b/openfpga/src/fpga_verilog/verilog_routing.cpp @@ -77,7 +77,6 @@ namespace openfpga { static void print_verilog_routing_connection_box_unique_module(NetlistManager& netlist_manager, const ModuleManager& module_manager, - const std::string& verilog_dir, const std::string& subckt_dir, const RRGSB& rr_gsb, const t_rr_type& cb_type, @@ -94,9 +93,6 @@ void print_verilog_routing_connection_box_unique_module(NetlistManager& netlist_ print_verilog_file_header(fp, std::string("Verilog modules for Unique Connection Blocks[" + std::to_string(rr_gsb.get_cb_x(cb_type)) + "]["+ std::to_string(rr_gsb.get_cb_y(cb_type)) + "]")); - /* Print preprocessing flags */ - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Create a Verilog Module based on the circuit model, and add to module manager */ ModuleId cb_module = module_manager.find_module(generate_connection_block_module_name(cb_type, gsb_coordinate)); VTR_ASSERT(true == module_manager.valid_module_id(cb_module)); @@ -182,7 +178,6 @@ void print_verilog_routing_connection_box_unique_module(NetlistManager& netlist_ static void print_verilog_routing_switch_box_unique_module(NetlistManager& netlist_manager, const ModuleManager& module_manager, - const std::string& verilog_dir, const std::string& subckt_dir, const RRGSB& rr_gsb, const bool& use_explicit_port_map) { @@ -198,9 +193,6 @@ void print_verilog_routing_switch_box_unique_module(NetlistManager& netlist_mana print_verilog_file_header(fp, std::string("Verilog modules for Unique Switch Blocks[" + std::to_string(rr_gsb.get_sb_x()) + "]["+ std::to_string(rr_gsb.get_sb_y()) + "]")); - /* Print preprocessing flags */ - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Create a Verilog Module based on the circuit model, and add to module manager */ ModuleId sb_module = module_manager.find_module(generate_switch_block_module_name(gsb_coordinate)); VTR_ASSERT(true == module_manager.valid_module_id(sb_module)); @@ -225,7 +217,6 @@ static void print_verilog_flatten_connection_block_modules(NetlistManager& netlist_manager, const ModuleManager& module_manager, const DeviceRRGSB& device_rr_gsb, - const std::string& verilog_dir, const std::string& subckt_dir, const t_rr_type& cb_type, const bool& use_explicit_port_map) { @@ -244,7 +235,6 @@ void print_verilog_flatten_connection_block_modules(NetlistManager& netlist_mana } print_verilog_routing_connection_box_unique_module(netlist_manager, module_manager, - verilog_dir, subckt_dir, rr_gsb, cb_type, use_explicit_port_map); @@ -264,7 +254,6 @@ void print_verilog_flatten_connection_block_modules(NetlistManager& netlist_mana void print_verilog_flatten_routing_modules(NetlistManager& netlist_manager, const ModuleManager& module_manager, const DeviceRRGSB& device_rr_gsb, - const std::string& verilog_dir, const std::string& subckt_dir, const bool& use_explicit_port_map) { /* Create a vector to contain all the Verilog netlist names that have been generated in this function */ @@ -281,16 +270,15 @@ void print_verilog_flatten_routing_modules(NetlistManager& netlist_manager, } print_verilog_routing_switch_box_unique_module(netlist_manager, module_manager, - verilog_dir, subckt_dir, rr_gsb, use_explicit_port_map); } } - print_verilog_flatten_connection_block_modules(netlist_manager, module_manager, device_rr_gsb, verilog_dir, subckt_dir, CHANX, use_explicit_port_map); + print_verilog_flatten_connection_block_modules(netlist_manager, module_manager, device_rr_gsb, subckt_dir, CHANX, use_explicit_port_map); - print_verilog_flatten_connection_block_modules(netlist_manager, module_manager, device_rr_gsb, verilog_dir, subckt_dir, CHANY, use_explicit_port_map); + print_verilog_flatten_connection_block_modules(netlist_manager, module_manager, device_rr_gsb, subckt_dir, CHANY, use_explicit_port_map); /* VTR_LOG("Writing header file for routing submodules '%s'...", @@ -317,7 +305,6 @@ void print_verilog_flatten_routing_modules(NetlistManager& netlist_manager, void print_verilog_unique_routing_modules(NetlistManager& netlist_manager, const ModuleManager& module_manager, const DeviceRRGSB& device_rr_gsb, - const std::string& verilog_dir, const std::string& subckt_dir, const bool& use_explicit_port_map) { /* Create a vector to contain all the Verilog netlist names that have been generated in this function */ @@ -328,7 +315,6 @@ void print_verilog_unique_routing_modules(NetlistManager& netlist_manager, const RRGSB& unique_mirror = device_rr_gsb.get_sb_unique_module(isb); print_verilog_routing_switch_box_unique_module(netlist_manager, module_manager, - verilog_dir, subckt_dir, unique_mirror, use_explicit_port_map); @@ -340,7 +326,6 @@ void print_verilog_unique_routing_modules(NetlistManager& netlist_manager, print_verilog_routing_connection_box_unique_module(netlist_manager, module_manager, - verilog_dir, subckt_dir, unique_mirror, CHANX, use_explicit_port_map); @@ -352,7 +337,6 @@ void print_verilog_unique_routing_modules(NetlistManager& netlist_manager, print_verilog_routing_connection_box_unique_module(netlist_manager, module_manager, - verilog_dir, subckt_dir, unique_mirror, CHANY, use_explicit_port_map); diff --git a/openfpga/src/fpga_verilog/verilog_routing.h b/openfpga/src/fpga_verilog/verilog_routing.h index a9f8fd6a1..9d439053a 100644 --- a/openfpga/src/fpga_verilog/verilog_routing.h +++ b/openfpga/src/fpga_verilog/verilog_routing.h @@ -20,14 +20,12 @@ namespace openfpga { void print_verilog_flatten_routing_modules(NetlistManager& netlist_manager, const ModuleManager& module_manager, const DeviceRRGSB& device_rr_gsb, - const std::string& verilog_dir, const std::string& subckt_dir, const bool& use_explicit_port_map); void print_verilog_unique_routing_modules(NetlistManager& netlist_manager, const ModuleManager& module_manager, const DeviceRRGSB& device_rr_gsb, - const std::string& verilog_dir, const std::string& subckt_dir, const bool& use_explicit_port_map); diff --git a/openfpga/src/fpga_verilog/verilog_submodule.cpp b/openfpga/src/fpga_verilog/verilog_submodule.cpp index b38750ab9..37df77c60 100644 --- a/openfpga/src/fpga_verilog/verilog_submodule.cpp +++ b/openfpga/src/fpga_verilog/verilog_submodule.cpp @@ -35,7 +35,6 @@ void print_verilog_submodule(ModuleManager& module_manager, NetlistManager& netlist_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir, const FabricVerilogOption& fpga_verilog_opts) { @@ -47,7 +46,6 @@ void print_verilog_submodule(ModuleManager& module_manager, print_verilog_submodule_essentials(const_cast(module_manager), netlist_manager, - verilog_dir, submodule_dir, circuit_lib); @@ -58,35 +56,35 @@ void print_verilog_submodule(ModuleManager& module_manager, print_verilog_submodule_mux_local_decoders(const_cast(module_manager), netlist_manager, mux_lib, circuit_lib, - verilog_dir, submodule_dir); + submodule_dir); print_verilog_submodule_muxes(module_manager, netlist_manager, mux_lib, circuit_lib, - verilog_dir, submodule_dir, + submodule_dir, fpga_verilog_opts.explicit_port_mapping()); /* LUTes */ print_verilog_submodule_luts(const_cast(module_manager), netlist_manager, circuit_lib, - verilog_dir, submodule_dir, + submodule_dir, fpga_verilog_opts.explicit_port_mapping()); /* Hard wires */ print_verilog_submodule_wires(const_cast(module_manager), netlist_manager, circuit_lib, - verilog_dir, submodule_dir); + submodule_dir); /* 4. Memories */ print_verilog_submodule_memories(const_cast(module_manager), netlist_manager, mux_lib, circuit_lib, - verilog_dir, submodule_dir, + submodule_dir, fpga_verilog_opts.explicit_port_mapping()); /* 5. Dump template for all the modules */ if (true == fpga_verilog_opts.print_user_defined_template()) { print_verilog_submodule_templates(const_cast(module_manager), circuit_lib, - verilog_dir, submodule_dir); + submodule_dir); } /* Create a header file to include all the subckts */ diff --git a/openfpga/src/fpga_verilog/verilog_submodule.h b/openfpga/src/fpga_verilog/verilog_submodule.h index d3de8b9d7..06bb7aeef 100644 --- a/openfpga/src/fpga_verilog/verilog_submodule.h +++ b/openfpga/src/fpga_verilog/verilog_submodule.h @@ -20,7 +20,6 @@ void print_verilog_submodule(ModuleManager& module_manager, NetlistManager& netlist_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir, const FabricVerilogOption& fpga_verilog_opts); diff --git a/openfpga/src/fpga_verilog/verilog_submodule_utils.cpp b/openfpga/src/fpga_verilog/verilog_submodule_utils.cpp index b4255b3e9..faf965068 100644 --- a/openfpga/src/fpga_verilog/verilog_submodule_utils.cpp +++ b/openfpga/src/fpga_verilog/verilog_submodule_utils.cpp @@ -207,7 +207,6 @@ void print_one_verilog_template_module(const ModuleManager& module_manager, ********************************************************************/ void print_verilog_submodule_templates(const ModuleManager& module_manager, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir) { std::string verilog_fname(submodule_dir + USER_DEFINED_TEMPLATE_VERILOG_FILE_NAME); @@ -223,8 +222,6 @@ void print_verilog_submodule_templates(const ModuleManager& module_manager, print_verilog_file_header(fp, "Template for user-defined Verilog modules"); - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Output essential models*/ for (const auto& model : circuit_lib.models()) { /* Focus on user-defined modules, which must have a Verilog netlist defined */ diff --git a/openfpga/src/fpga_verilog/verilog_submodule_utils.h b/openfpga/src/fpga_verilog/verilog_submodule_utils.h index fedcb63a8..3f0e1dadd 100644 --- a/openfpga/src/fpga_verilog/verilog_submodule_utils.h +++ b/openfpga/src/fpga_verilog/verilog_submodule_utils.h @@ -29,7 +29,6 @@ void add_user_defined_verilog_modules(ModuleManager& module_manager, void print_verilog_submodule_templates(const ModuleManager& module_manager, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_verilog/verilog_top_module.cpp b/openfpga/src/fpga_verilog/verilog_top_module.cpp index 9596f20a3..79c6ebebe 100644 --- a/openfpga/src/fpga_verilog/verilog_top_module.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_module.cpp @@ -58,9 +58,6 @@ void print_verilog_top_module(NetlistManager& netlist_manager, print_verilog_file_header(fp, std::string("Top-level Verilog module for FPGA")); - /* Print preprocessing flags */ - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Write the module content in Verilog format */ write_verilog_module_to_file(fp, module_manager, top_module, use_explicit_mapping); diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 25017d741..a477fa99e 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -799,7 +799,6 @@ void print_verilog_top_testbench(const ModuleManager& module_manager, const VprNetlistAnnotation& netlist_annotation, const std::string& circuit_name, const std::string& verilog_fname, - const std::string& verilog_dir, const SimulationSetting& simulation_parameters) { std::string timer_message = std::string("Write autocheck testbench for FPGA top-level Verilog netlist for '") + circuit_name + std::string("'"); @@ -818,9 +817,6 @@ void print_verilog_top_testbench(const ModuleManager& module_manager, std::string title = std::string("FPGA Verilog Testbench for Top-level netlist of Design: ") + circuit_name; print_verilog_file_header(fp, title); - /* Print preprocessing flags and external netlists */ - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Find the top_module */ ModuleId top_module = module_manager.find_module(generate_fpga_top_module_name()); VTR_ASSERT(true == module_manager.valid_module_id(top_module)); diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.h b/openfpga/src/fpga_verilog/verilog_top_testbench.h index 5684b37e2..c0ad77c51 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.h +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.h @@ -33,7 +33,6 @@ void print_verilog_top_testbench(const ModuleManager& module_manager, const VprNetlistAnnotation& netlist_annotation, const std::string& circuit_name, const std::string& verilog_fname, - const std::string& verilog_dir, const SimulationSetting& simulation_parameters); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_verilog/verilog_wire.cpp b/openfpga/src/fpga_verilog/verilog_wire.cpp index d28b26f81..bb8419edd 100644 --- a/openfpga/src/fpga_verilog/verilog_wire.cpp +++ b/openfpga/src/fpga_verilog/verilog_wire.cpp @@ -95,7 +95,6 @@ void print_verilog_wire_module(const ModuleManager& module_manager, void print_verilog_submodule_wires(const ModuleManager& module_manager, NetlistManager& netlist_manager, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir) { std::string verilog_fname(submodule_dir + std::string(WIRES_VERILOG_FILE_NAME)); @@ -111,8 +110,6 @@ void print_verilog_submodule_wires(const ModuleManager& module_manager, print_verilog_file_header(fp, "Wires"); - print_verilog_include_defines_preproc_file(fp, verilog_dir); - /* Print Verilog models for regular wires*/ print_verilog_comment(fp, std::string("----- BEGIN Verilog modules for regular wires -----")); for (const auto& model : circuit_lib.models_by_type(CIRCUIT_MODEL_WIRE)) { diff --git a/openfpga/src/fpga_verilog/verilog_wire.h b/openfpga/src/fpga_verilog/verilog_wire.h index 62331d8b9..d9996fbcf 100644 --- a/openfpga/src/fpga_verilog/verilog_wire.h +++ b/openfpga/src/fpga_verilog/verilog_wire.h @@ -21,7 +21,6 @@ namespace openfpga { void print_verilog_submodule_wires(const ModuleManager& module_manager, NetlistManager& netlist_manager, const CircuitLibrary& circuit_lib, - const std::string& verilog_dir, const std::string& submodule_dir); } /* end namespace openfpga */ From 890ead91b95ef1f6caea64157a5b38be3be07d8c Mon Sep 17 00:00:00 2001 From: ganeshgore Date: Fri, 24 Apr 2020 21:53:57 -0600 Subject: [PATCH 002/180] Fixed modelsim include references --- openfpga_flow/misc/modelsim_runsim.tcl | 12 +------ openfpga_flow/scripts/run_modelsim.py | 43 +++++++++++++++++++------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/openfpga_flow/misc/modelsim_runsim.tcl b/openfpga_flow/misc/modelsim_runsim.tcl index 64578d883..a7734bae0 100644 --- a/openfpga_flow/misc/modelsim_runsim.tcl +++ b/openfpga_flow/misc/modelsim_runsim.tcl @@ -11,27 +11,17 @@ set simtime ${SIMTIME} set unit ${UNIT} #Path were both tcl script are located -set verilog_path ${VERILOG_PATH} set project_path "${MODELSIM_PROJ_DIR}/msim_projects/" #Path were the verilog files are located -set verilog_path ${VERILOG_PATH} - -set verilog_files [list \ - ${VERILOG_PATH}${VERILOG_FILE1} \ - ${VERILOG_PATH}${VERILOG_FILE2} \ - ${VERILOG_PATH}fpga_defines.v - ] +set verilog_files ${VERILOG_PATH}/*_include_netlists_resolved.v #Source the tcl script source ${MODELSIM_PROJ_DIR}/${BENCHMARK}_autocheck_proc.tcl #Execute the top level procedure - try { top_create_new_project $$projectname $$verilog_files $$project_path $$simtime $$unit $$top_tb } finally { quit } - -#Relaunch simulation diff --git a/openfpga_flow/scripts/run_modelsim.py b/openfpga_flow/scripts/run_modelsim.py index 077b84e61..564ca504d 100644 --- a/openfpga_flow/scripts/run_modelsim.py +++ b/openfpga_flow/scripts/run_modelsim.py @@ -104,7 +104,7 @@ def main(): logfile_path = os.path.join(gc["task_dir"], taskname, task_run, "modelsim_run.log") resultfile_path = os.path.join(gc["task_dir"], - taskname, task_run, "modelsim_result.csv") + taskname, task_run, "modelsim_result.csv") logfilefh = logging.FileHandler(logfile_path, "w") logfilefh.setFormatter(logging.Formatter(FILE_LOG_FORMAT)) logger.addHandler(logfilefh) @@ -129,7 +129,8 @@ def main(): task_ini_files.append(INIfile) logger.info(f"Found {len(task_ini_files)} INI files") results = create_tcl_script(task_ini_files) - collect_result(resultfile_path, results) + if args.run_sim: + collect_result(resultfile_path, results) def clean_up_and_exit(msg): @@ -168,7 +169,21 @@ def create_tcl_script(files): config["MODELSIM_PROJ_NAME"] = args.modelsim_proj_name config["MODELSIM_INI"] = args.modelsim_ini - + config["VERILOG_PATH"] = os.path.join( + os.getcwd(), config["VERILOG_PATH"]) + IncludeFile = os.path.join( + os.getcwd(), + config["VERILOG_PATH"], + config["VERILOG_FILE2"]) + IncludeFileResolved = os.path.join( + os.getcwd(), + config["VERILOG_PATH"], + config["VERILOG_FILE2"].replace(".v", "_resolved.v")) + with open(IncludeFileResolved, "w") as fpw: + with open(IncludeFile, "r") as fp: + for eachline in fp.readlines(): + eachline = eachline.replace("./SRC", "../../../SRC/") + fpw.write(eachline) # Modify the variables in config file here config["TOP_TB"] = os.path.splitext(config["TOP_TB"])[0] @@ -193,13 +208,13 @@ def create_tcl_script(files): "ini_file": eachFile, "modelsim_run_dir": args.modelsim_run_dir, "runsim_filename": runsim_filename, - "run_complete" :False, + "run_complete": False, "status": False, - "finished" : True, - "starttime" : 0, - "endtime" : 0, + "finished": True, + "starttime": 0, + "endtime": 0, "Errors": 0, - "Warnings" : 0 + "Warnings": 0 }) # Execute modelsim if args.run_sim: @@ -229,7 +244,7 @@ def run_modelsim_thread(s, eachJob, job_list): thread_name = threading.currentThread().getName() eachJob["starttime"] = time.time() eachJob["Errors"] = 0 - eachJob["Warnings"]= 0 + eachJob["Warnings"] = 0 try: logfile = "%s_modelsim.log" % thread_name eachJob["logfile"] = "" + \ @@ -248,7 +263,8 @@ def run_modelsim_thread(s, eachJob, job_list): for line in process.stdout: if "Errors" in line: logger.info(line.strip()) - e,w = re.match("# .*: ([0-9].*), .*: ([0-9].*)", line).groups() + e, w = re.match( + "# .*: ([0-9].*), .*: ([0-9].*)", line).groups() eachJob["Errors"] += int(e) eachJob["Warnings"] += int(w) sys.stdout.buffer.flush() @@ -275,8 +291,10 @@ def run_modelsim_thread(s, eachJob, job_list): no_of_finished_job = sum([not eachJ["finished"] for eachJ in job_list]) logger.info("***** %d runs pending *****" % (no_of_finished_job)) + def collect_result(result_file, result_obj): - colnames = ["status", "Errors", "Warnings", "run_complete", "exectime", "finished", "logfile"] + colnames = ["status", "Errors", "Warnings", + "run_complete", "exectime", "finished", "logfile"] if len(result_obj): with open(result_file, 'w', newline='') as csvfile: writer = csv.DictWriter( @@ -285,11 +303,12 @@ def collect_result(result_file, result_obj): for eachResult in result_obj: writer.writerow(eachResult) logger.info("= = = ="*10) - passed_jobs = [ each["status"] for each in result_obj ] + passed_jobs = [each["status"] for each in result_obj] logger.info(f"Passed Jobs %d/%d", len(passed_jobs), len(result_obj)) logger.info(f"Result file stored at {result_file}") logger.info("= = = ="*10) + if __name__ == "__main__": if args.debug: logger.info("Setting loggger in debug mode") From 49edeb119c380e07c41bf19ea74089f92a579d58 Mon Sep 17 00:00:00 2001 From: ganeshgore Date: Sat, 25 Apr 2020 20:16:17 -0600 Subject: [PATCH 003/180] BugFix : Relative path for refrence benchmark fixed --- .../OpenFPGAShellScripts/mcnc_example_script.openfpga | 6 +++--- openfpga_flow/scripts/run_modelsim.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga index 9a4f577f8..ba086855e 100644 --- a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga @@ -40,8 +40,8 @@ build_fabric_bitstream --verbose write_fabric_verilog --file ./SRC \ --explicit_port_mapping \ --include_timing \ - --include_signal_init - #--support_icarus_simulator + --include_signal_init + #--support_icarus_simulator # Write the Verilog testbench for FPGA fabric # - We suggest the use of same output directory as fabric Verilog netlists @@ -49,7 +49,7 @@ write_fabric_verilog --file ./SRC \ # - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA # - Enable pre-configured top-level testbench which is a fast verification skipping programming phase # - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts -write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./simulation_deck_info.ini +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ./${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./simulation_deck_info.ini # Write the SDC files for PnR backend # - Turn on every options here diff --git a/openfpga_flow/scripts/run_modelsim.py b/openfpga_flow/scripts/run_modelsim.py index 564ca504d..4151ebd4b 100644 --- a/openfpga_flow/scripts/run_modelsim.py +++ b/openfpga_flow/scripts/run_modelsim.py @@ -182,7 +182,7 @@ def create_tcl_script(files): with open(IncludeFileResolved, "w") as fpw: with open(IncludeFile, "r") as fp: for eachline in fp.readlines(): - eachline = eachline.replace("./SRC", "../../../SRC/") + eachline = eachline.replace("\"./", "\"../../../") fpw.write(eachline) # Modify the variables in config file here config["TOP_TB"] = os.path.splitext(config["TOP_TB"])[0] From c31b20dc91cee0a333f4b5a6a3eea01ee1ff55e6 Mon Sep 17 00:00:00 2001 From: ganeshgore Date: Wed, 10 Jun 2020 23:12:30 -0600 Subject: [PATCH 004/180] Added support for simulation setting file in the task flow --- openfpga_flow/scripts/run_fpga_flow.py | 3 ++ openfpga_flow/scripts/run_fpga_task.py | 2 + .../mcnc_big20/config/task.conf | 47 ++++++++++--------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/openfpga_flow/scripts/run_fpga_flow.py b/openfpga_flow/scripts/run_fpga_flow.py index cee4ec2ce..fcf47ee44 100644 --- a/openfpga_flow/scripts/run_fpga_flow.py +++ b/openfpga_flow/scripts/run_fpga_flow.py @@ -83,6 +83,8 @@ parser.add_argument('--openfpga_shell_template', type=str, help="Sample openfpga shell script") parser.add_argument('--openfpga_arch_file', type=str, help="Openfpga architecture file for shell") +parser.add_argument('--openfpga_sim_setting_file', type=str, + help="Openfpga simulation file for shell") parser.add_argument('--yosys_tmpl', type=str, help="Alternate yosys template, generates top_module.blif") parser.add_argument('--disp', action="store_true", @@ -683,6 +685,7 @@ def run_openfpga_shell(): path_variables = script_env_vars["PATH"] path_variables["VPR_ARCH_FILE"] = args.arch_file path_variables["OPENFPGA_ARCH_FILE"] = args.openfpga_arch_file + path_variables["OPENFPGA_SIM_SETTING_FILE"] = args.openfpga_sim_setting_file path_variables["VPR_TESTBENCH_BLIF"] = args.top_module+".blif" path_variables["ACTIVITY_FILE"] = args.top_module+"_ace_out.act" path_variables["REFERENCE_VERILOG_TESTBENCH"] = args.top_module + \ diff --git a/openfpga_flow/scripts/run_fpga_task.py b/openfpga_flow/scripts/run_fpga_task.py index 9567c4fe5..3361a3082 100644 --- a/openfpga_flow/scripts/run_fpga_task.py +++ b/openfpga_flow/scripts/run_fpga_task.py @@ -355,6 +355,8 @@ def create_run_command(curr_job_dir, archfile, benchmark_obj, param, task_conf): task_gc.get("openfpga_shell_template")] command += ["--openfpga_arch_file", task_gc.get("openfpga_arch_file")] + command += ["--openfpga_sim_setting_file", + task_gc.get("openfpga_sim_setting_file")] if benchmark_obj.get("activity_file"): command += ["--activity_file", benchmark_obj.get("activity_file")] diff --git a/openfpga_flow/tasks/openfpga_shell/mcnc_big20/config/task.conf b/openfpga_flow/tasks/openfpga_shell/mcnc_big20/config/task.conf index 5028283fb..149c0695b 100644 --- a/openfpga_flow/tasks/openfpga_shell/mcnc_big20/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/mcnc_big20/config/task.conf @@ -16,12 +16,13 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_register_scan_chain_depop50_40nm.xml [BENCHMARKS] -#bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/alu4/alu4.blif +#bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/alu4/alu4.blif #bench1=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex2/apex2.blif #bench2=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex4/apex4.blif ## VPR remove buffers which are in act file and create a new net. Then VPR errors out by saying the new net does not exist in act file @@ -39,91 +40,91 @@ arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_ti #bench12=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/misex3/misex3.blif #bench13=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/pdc/pdc.blif ## Passed -bench14=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s298/s298.blif -#bench15=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38417/s38417.blif +bench14=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s298/s298.blif +# bench15=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38417/s38417.blif #bench16=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38584/s38584.blif #bench17=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/seq/seq.blif #bench18=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/spla/spla.blif #bench19=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/tseng/tseng.blif [SYNTHESIS_PARAM] -# Benchmark alu4 +# Benchmark alu4 bench0_top = alu4 bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/alu4/alu4.act bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/alu4/alu4.v -# Benchmark apex2 +# Benchmark apex2 bench1_top = apex2 bench1_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex2/apex2.act bench1_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex2/apex2.v -# Benchmark apex4 +# Benchmark apex4 bench2_top = apex4 bench2_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex4/apex4.act bench2_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex4/apex4.v -# Benchmark bigkey +# Benchmark bigkey bench3_top = bigkey bench3_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/bigkey/bigkey.act bench3_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/bigkey/bigkey.v -# Benchmark clma +# Benchmark clma bench4_top = clma bench4_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/clma/clma.act bench4_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/clma/clma.v -# Benchmark des +# Benchmark des bench5_top = des bench5_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/des/des.act bench5_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/des/des.v -# Benchmark diffeq +# Benchmark diffeq bench6_top = diffeq bench6_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/diffeq/diffeq.act bench6_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/diffeq/diffeq.v -# Benchmark dsip +# Benchmark dsip bench7_top = dsip bench7_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/dsip/dsip.act bench7_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/dsip/dsip.v -# Benchmark elliptic +# Benchmark elliptic bench8_top = elliptic bench8_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/elliptic/elliptic.act bench8_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/elliptic/elliptic.v -# Benchmark ex1010 +# Benchmark ex1010 bench9_top = ex1010 bench9_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/ex1010/ex1010.act bench9_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/ex1010/ex1010.v -# Benchmark ex5p +# Benchmark ex5p bench10_top = ex5p bench10_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/ex5p/ex5p.act bench10_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/ex5p/ex5p.v -# Benchmark frisc +# Benchmark frisc bench11_top = frisc bench11_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/frisc/frisc.act bench11_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/frisc/frisc.v -# Benchmark misex3 +# Benchmark misex3 bench12_top = misex3 bench12_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/misex3/misex3.act bench12_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/misex3/misex3.v -# Benchmark pdc +# Benchmark pdc bench13_top = pdc bench13_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/pdc/pdc.act bench13_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/pdc/pdc.v -# Benchmark s298 +# Benchmark s298 bench14_top = s298 bench14_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s298/s298.act bench14_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s298/s298.v -# Benchmark s38417 +# Benchmark s38417 bench15_top = s38417 bench15_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38417/s38417.act bench15_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38417/s38417.v -# Benchmark s38584 +# Benchmark s38584 bench16_top = s38584 bench16_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38584/s38584.act bench16_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38584/s38584.v -# Benchmark seq +# Benchmark seq bench17_top = seq bench17_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/seq/seq.act bench17_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/seq/seq.v -# Benchmark spla +# Benchmark spla bench18_top = spla bench18_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/spla/spla.act bench18_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/spla/spla.v -# Benchmark tseng +# Benchmark tseng bench19_top = tseng bench19_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/tseng/tseng.act bench19_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/tseng/tseng.v From 9bf91bd92a78b10823f0038653bf58c0a5c5f141 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 25 Apr 2020 20:18:10 -0600 Subject: [PATCH 005/180] start testing mcnc_big20 using OpenFPGA tasks --- .../mcnc_big20/config/task.conf | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/openfpga_flow/tasks/openfpga_shell/mcnc_big20/config/task.conf b/openfpga_flow/tasks/openfpga_shell/mcnc_big20/config/task.conf index 149c0695b..5532a0888 100644 --- a/openfpga_flow/tasks/openfpga_shell/mcnc_big20/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/mcnc_big20/config/task.conf @@ -22,30 +22,30 @@ openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulatio arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_register_scan_chain_depop50_40nm.xml [BENCHMARKS] -#bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/alu4/alu4.blif -#bench1=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex2/apex2.blif -#bench2=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex4/apex4.blif -## VPR remove buffers which are in act file and create a new net. Then VPR errors out by saying the new net does not exist in act file -#bench3=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/bigkey/bigkey.blif -## VPR remove buffers which are in act file and create a new net. Then VPR errors out by saying the new net does not exist in act file -#bench4=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/clma/clma.blif -#bench5=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/des/des.blif -#bench6=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/diffeq/diffeq.blif -## VPR remove buffers which are in act file and create a new net. Then VPR errors out by saying the new net does not exist in act file -#bench7=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/dsip/dsip.blif -#bench8=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/elliptic/elliptic.blif -#bench9=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/ex1010/ex1010.blif -#bench10=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/ex5p/ex5p.blif -#bench11=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/frisc/frisc.blif -#bench12=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/misex3/misex3.blif -#bench13=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/pdc/pdc.blif -## Passed -bench14=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s298/s298.blif -# bench15=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38417/s38417.blif -#bench16=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38584/s38584.blif -#bench17=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/seq/seq.blif -#bench18=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/spla/spla.blif -#bench19=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/tseng/tseng.blif +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/alu4/alu4.blif +bench1=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex2/apex2.blif +bench2=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/apex4/apex4.blif +# VPR remove buffers which are in act file and create a new net. Then VPR errors out by saying the new net does not exist in act file +bench3=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/bigkey/bigkey.blif +# VPR remove buffers which are in act file and create a new net. Then VPR errors out by saying the new net does not exist in act file +bench4=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/clma/clma.blif +bench5=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/des/des.blif +bench6=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/diffeq/diffeq.blif +# VPR remove buffers which are in act file and create a new net. Then VPR errors out by saying the new net does not exist in act file +bench7=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/dsip/dsip.blif +bench8=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/elliptic/elliptic.blif +bench9=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/ex1010/ex1010.blif +bench10=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/ex5p/ex5p.blif +bench11=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/frisc/frisc.blif +bench12=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/misex3/misex3.blif +bench13=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/pdc/pdc.blif +# Passed +bench14=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s298/s298.blif +bench15=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38417/s38417.blif +bench16=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/s38584/s38584.blif +bench17=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/seq/seq.blif +bench18=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/spla/spla.blif +bench19=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/mcnc_big20/tseng/tseng.blif [SYNTHESIS_PARAM] # Benchmark alu4 From a3fe6a9fcbfc5560ad8ffebde27c17d14bbd5db8 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 28 Apr 2020 18:16:52 -0600 Subject: [PATCH 006/180] update travis script with example run on MCNC big20 --- .travis/script.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis/script.sh b/.travis/script.sh index 231437e28..60c3d0715 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -105,4 +105,10 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/duplicated_grid_pi echo -e "Testing Verilog generation with spy output pads"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/spypad --debug --show_thread_logs +# Verify MCNC big20 benchmark suite with ModelSim +# Please make sure you have ModelSim installed in the environment +# Otherwise, it will fail +#python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/mcnc_big20 --debug --show_thread_logs --maxthreads 20 +#python3 openfpga_flow/scripts/run_modelsim.py openfpga_shell/mcnc_big20 --run_sim + end_section "OpenFPGA.TaskTun" From 42cede37fa4d3c432092d36ce4073ce99b9a8477 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 28 Apr 2020 18:22:41 -0600 Subject: [PATCH 007/180] add testcases on generate fabric/testbench only --- .../generate_fabric_example_script.openfpga | 32 +++++++++++ ...generate_testbench_example_script.openfpga | 53 +++++++++++++++++++ .../generate_fabric/config/task.conf | 31 +++++++++++ .../generate_testbench/config/task.conf | 31 +++++++++++ 4 files changed, 147 insertions(+) create mode 100644 openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga create mode 100644 openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga create mode 100644 openfpga_flow/tasks/openfpga_shell/generate_fabric/config/task.conf create mode 100644 openfpga_flow/tasks/openfpga_shell/generate_testbench/config/task.conf diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga new file mode 100644 index 000000000..23ed17f59 --- /dev/null +++ b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga @@ -0,0 +1,32 @@ +# Run VPR for the 'and' design +#--write_rr_graph example_rr_graph.xml +vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route + +# Read OpenFPGA architecture definition +read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} + +# Annotate the OpenFPGA architecture to VPR data base +# to debug use --verbose options +link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges + +# Check and correct any naming conflicts in the BLIF netlist +check_netlist_naming_conflict --fix --report ./netlist_renaming.xml + +# Build the module graph +# - Enabled compression on routing architecture modules +# - Enable pin duplication on grid modules +build_fabric --compress_routing #--verbose + +# Write the Verilog netlist for FPGA fabric +# - Enable the use of explicit port mapping in Verilog netlist +write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --include_signal_init --support_icarus_simulator --print_user_defined_template --verbose + +# Write the SDC files for PnR backend +# - Turn on every options here +write_pnr_sdc --file ./SDC + +# Finish and exit OpenFPGA +exit + +# Note : +# To run verification at the end of the flow maintain source in ./SRC directory diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga new file mode 100644 index 000000000..0926935e9 --- /dev/null +++ b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga @@ -0,0 +1,53 @@ +# Run VPR for the 'and' design +#--write_rr_graph example_rr_graph.xml +vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route + +# Read OpenFPGA architecture definition +read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} + +# Annotate the OpenFPGA architecture to VPR data base +# to debug use --verbose options +link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges + +# Check and correct any naming conflicts in the BLIF netlist +check_netlist_naming_conflict --fix --report ./netlist_renaming.xml + +# Apply fix-up to clustering nets based on routing results +pb_pin_fixup --verbose + +# Apply fix-up to Look-Up Table truth tables based on packing results +lut_truth_table_fixup + +# Build the module graph +# - Enabled compression on routing architecture modules +# - Enable pin duplication on grid modules +build_fabric --compress_routing #--verbose + +# Repack the netlist to physical pbs +# This must be done before bitstream generator and testbench generation +# Strongly recommend it is done after all the fix-up have been applied +repack #--verbose + +# Build the bitstream +# - Output the fabric-independent bitstream to a file +build_architecture_bitstream --verbose --file fabric_indepenent_bitstream.xml + +# Build fabric-dependent bitstream +build_fabric_bitstream --verbose + +# Write the Verilog testbench for FPGA fabric +# - We suggest the use of same output directory as fabric Verilog netlists +# - Must specify the reference benchmark file if you want to output any testbenches +# - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA +# - Enable pre-configured top-level testbench which is a fast verification skipping programming phase +# - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts +write_verilog_testbench --file ./TESTBENCH --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini + +# Write the SDC to run timing analysis for a mapped FPGA fabric +write_analysis_sdc --file ./SDC_analysis + +# Finish and exit OpenFPGA +exit + +# Note : +# To run verification at the end of the flow maintain source in ./SRC directory diff --git a/openfpga_flow/tasks/openfpga_shell/generate_fabric/config/task.conf b/openfpga_flow/tasks/openfpga_shell/generate_fabric/config/task.conf new file mode 100644 index 000000000..75bc6c703 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/generate_fabric/config/task.conf @@ -0,0 +1,31 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] diff --git a/openfpga_flow/tasks/openfpga_shell/generate_testbench/config/task.conf b/openfpga_flow/tasks/openfpga_shell/generate_testbench/config/task.conf new file mode 100644 index 000000000..9540b767f --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/generate_testbench/config/task.conf @@ -0,0 +1,31 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] From 5c851a84675b55549b2ee6db04ec4164a75127d1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 28 Apr 2020 18:24:20 -0600 Subject: [PATCH 008/180] deploy the fabric/testbench generation only cases to travis --- .travis/script.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis/script.sh b/.travis/script.sh index 60c3d0715..ac801729c 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -105,6 +105,12 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/duplicated_grid_pi echo -e "Testing Verilog generation with spy output pads"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/spypad --debug --show_thread_logs +echo -e "Testing fabric Verilog generation only"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/generate_fabric --debug --show_thread_logs + +echo -e "Testing Verilog testbench generation only"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/generate_testbench --debug --show_thread_logs + # Verify MCNC big20 benchmark suite with ModelSim # Please make sure you have ModelSim installed in the environment # Otherwise, it will fail From 69306faf22d3ea79bcf35439caa089193d00449d Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 28 Apr 2020 23:21:14 -0600 Subject: [PATCH 009/180] add a new include netlist for all the fabric-related netlists --- openfpga/src/fpga_verilog/verilog_api.cpp | 6 +- .../verilog_auxiliary_netlists.cpp | 69 ++++++++++++++++++- .../fpga_verilog/verilog_auxiliary_netlists.h | 4 ++ openfpga/src/fpga_verilog/verilog_constants.h | 1 + 4 files changed, 77 insertions(+), 3 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_api.cpp b/openfpga/src/fpga_verilog/verilog_api.cpp index c8c7343ad..2c2ea4e93 100644 --- a/openfpga/src/fpga_verilog/verilog_api.cpp +++ b/openfpga/src/fpga_verilog/verilog_api.cpp @@ -124,13 +124,17 @@ void fpga_fabric_verilog(ModuleManager& module_manager, src_dir_path, options.explicit_port_mapping()); + /* Generate an netlist including all the fabric-related netlists */ + print_fabric_include_netlist(const_cast(netlist_manager), + src_dir_path, + circuit_lib); + /* Given a brief stats on how many Verilog modules have been written to files */ VTR_LOGV(options.verbose_output(), "Written %lu Verilog modules in total\n", module_manager.num_modules()); } - /******************************************************************** * A top-level function of FPGA-Verilog which focuses on fabric Verilog generation * This function will generate diff --git a/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.cpp b/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.cpp index ba2483ca7..b69868d17 100644 --- a/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.cpp +++ b/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.cpp @@ -25,8 +25,73 @@ namespace openfpga { *******************************************************************/ /******************************************************************** - * Print a file that includes all the netlists that have been generated - * and user-defined. + * Print a file that includes all the fabric netlists + * that have been generated and user-defined. + * This does NOT include any testbenches! + * Some netlists are open to compile under specific preprocessing flags + *******************************************************************/ +void print_fabric_include_netlist(const NetlistManager& netlist_manager, + const std::string& src_dir, + const CircuitLibrary& circuit_lib) { + std::string verilog_fname = src_dir + std::string(FABRIC_INCLUDE_NETLIST_FILE_NAME); + + /* Create the file stream */ + std::fstream fp; + fp.open(verilog_fname, std::fstream::out | std::fstream::trunc); + + /* Validate the file stream */ + check_file_stream(verilog_fname.c_str(), fp); + + /* Print the title */ + print_verilog_file_header(fp, std::string("Fabric Netlist Summary")); + + /* Print preprocessing flags */ + print_verilog_comment(fp, std::string("------ Include defines: preproc flags -----")); + print_verilog_include_netlist(fp, std::string(src_dir + std::string(DEFINES_VERILOG_FILE_NAME))); + fp << std::endl; + + /* Include all the user-defined netlists */ + print_verilog_comment(fp, std::string("------ Include user-defined netlists -----")); + for (const std::string& user_defined_netlist : find_circuit_library_unique_verilog_netlists(circuit_lib)) { + print_verilog_include_netlist(fp, user_defined_netlist); + } + + /* Include all the primitive modules */ + print_verilog_comment(fp, std::string("------ Include primitive module netlists -----")); + for (const NetlistId& nlist_id : netlist_manager.netlists_by_type(NetlistManager::SUBMODULE_NETLIST)) { + print_verilog_include_netlist(fp, netlist_manager.netlist_name(nlist_id)); + } + fp << std::endl; + + /* Include all the CLB, heterogeneous block modules */ + print_verilog_comment(fp, std::string("------ Include logic block netlists -----")); + for (const NetlistId& nlist_id : netlist_manager.netlists_by_type(NetlistManager::LOGIC_BLOCK_NETLIST)) { + print_verilog_include_netlist(fp, netlist_manager.netlist_name(nlist_id)); + } + fp << std::endl; + + /* Include all the routing architecture modules */ + print_verilog_comment(fp, std::string("------ Include routing module netlists -----")); + for (const NetlistId& nlist_id : netlist_manager.netlists_by_type(NetlistManager::ROUTING_MODULE_NETLIST)) { + print_verilog_include_netlist(fp, netlist_manager.netlist_name(nlist_id)); + } + fp << std::endl; + + /* Include FPGA top module */ + print_verilog_comment(fp, std::string("------ Include fabric top-level netlists -----")); + for (const NetlistId& nlist_id : netlist_manager.netlists_by_type(NetlistManager::TOP_MODULE_NETLIST)) { + print_verilog_include_netlist(fp, netlist_manager.netlist_name(nlist_id)); + } + fp << std::endl; + + /* Close the file stream */ + fp.close(); +} + +/******************************************************************** + * Print a file that includes all the netlists + * including the fabric netlists and testbenches + * that have been generated and user-defined. * Some netlists are open to compile under specific preprocessing flags *******************************************************************/ void print_include_netlists(const NetlistManager& netlist_manager, diff --git a/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.h b/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.h index ed1317862..52292881a 100644 --- a/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.h +++ b/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.h @@ -17,6 +17,10 @@ /* begin namespace openfpga */ namespace openfpga { +void print_fabric_include_netlist(const NetlistManager& netlist_manager, + const std::string& src_dir, + const CircuitLibrary& circuit_lib); + void print_include_netlists(const NetlistManager& netlist_manager, const std::string& src_dir, const std::string& circuit_name, diff --git a/openfpga/src/fpga_verilog/verilog_constants.h b/openfpga/src/fpga_verilog/verilog_constants.h index 797a00574..4456a1048 100644 --- a/openfpga/src/fpga_verilog/verilog_constants.h +++ b/openfpga/src/fpga_verilog/verilog_constants.h @@ -22,6 +22,7 @@ constexpr char* MODELSIM_SIMULATION_TIME_UNIT = "ms"; constexpr char* ICARUS_SIMULATOR_FLAG = "ICARUS_SIMULATOR"; // the flag to enable specific Verilog code in testbenches // End of Icarus variables and flag +constexpr char* FABRIC_INCLUDE_NETLIST_FILE_NAME = "fabric_netlists.v"; constexpr char* TOP_INCLUDE_NETLIST_FILE_NAME_POSTFIX = "_include_netlists.v"; constexpr char* VERILOG_TOP_POSTFIX = "_top.v"; constexpr char* FORMAL_VERIFICATION_VERILOG_FILE_POSTFIX = "_top_formal_verification.v"; From 3c781b18d3b49e449be3e470fbb1b9f7930ff094 Mon Sep 17 00:00:00 2001 From: CHARAS SAMY Date: Fri, 1 May 2020 09:55:38 -0600 Subject: [PATCH 010/180] Added routing benchmark --- .../routing_test/routing_test.act | 10 ++++++++++ .../routing_test/routing_test.blif | 16 ++++++++++++++++ .../routing_test/routing_test.v | 19 +++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100755 openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.act create mode 100755 openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.blif create mode 100644 openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v diff --git a/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.act b/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.act new file mode 100755 index 000000000..19f52fdd9 --- /dev/null +++ b/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.act @@ -0,0 +1,10 @@ +IN0 0.505000 0.204400 +IN1 0.491000 0.206000 +IN2 0.472000 0.204400 +clk 0.500000 2.000000 +OUT1 0.491000 0.206000 +OUT0 0.505000 0.204400 +OUT2 0.472000 0.204400 +n15 0.491000 0.101146 +n18 0.505000 0.103222 +n21 0.472000 0.096477 diff --git a/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.blif b/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.blif new file mode 100755 index 000000000..bf85b04b3 --- /dev/null +++ b/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.blif @@ -0,0 +1,16 @@ +# Benchmark "routing_test" written by ABC on Tue Apr 21 18:25:21 2020 +.model routing_test +.inputs IN0 IN1 IN2 clk +.outputs OUT0 OUT1 OUT2 + +.latch n15 OUT1 re clk 2 +.latch n18 OUT0 re clk 2 +.latch n21 OUT2 re clk 2 + +.names IN1 n15 +1 1 +.names IN0 n18 +1 1 +.names IN2 n21 +1 1 +.end diff --git a/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v b/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v new file mode 100644 index 000000000..1cacf4857 --- /dev/null +++ b/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v @@ -0,0 +1,19 @@ + +module routing_test(IN0,IN1,IN2,OUT0,OUT1,OUT2,clk); + +input wire IN0,IN1,IN2,clk; + +output reg OUT0, OUT1, OUT2; + +always @(posedge clk) + begin + + OUT0 <= IN0; + OUT1 <= IN1; + OUT2 <= IN2; + + end + + + +endmodule From f6cea1e17c7b364e5c61908c993b947e5ad4713f Mon Sep 17 00:00:00 2001 From: CHARAS SAMY Date: Fri, 1 May 2020 10:55:23 -0600 Subject: [PATCH 011/180] Added test_mode_low benchmark --- .../test_mode_low/test_mode_low.act | 23 ++++++++ .../test_mode_low/test_mode_low.blif | 35 +++++++++++++ .../test_mode_low/test_mode_low.v | 52 +++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.act create mode 100644 openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.blif create mode 100644 openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.v diff --git a/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.act b/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.act new file mode 100644 index 000000000..44920c540 --- /dev/null +++ b/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.act @@ -0,0 +1,23 @@ +a 0.5 0.2 +b 0.5 0.2 +clk 0.5 0.2 +out_0 0.5 0.2 +out_1 0.5 0.2 +out_2 0.5 0.2 +out_3 0.5 0.2 +sum_0 0.5 0.2 +sum_1 0.5 0.2 +sum_2 0.5 0.2 +sum_3 0.5 0.2 +sum_4 0.5 0.2 +sum_5 0.5 0.2 +sum_6 0.5 0.2 +sum_7 0.5 0.2 +pipe_a_0 0.5 0.2 +pipe_a_1 0.5 0.2 +pipe_b_0 0.5 0.2 +pipe_b_1 0.5 0.2 +pipe_sum_0 0.5 0.2 +pipe_sum_1 0.5 0.2 +pipe_sum_2 0.5 0.2 +pipe_sum_3 0.5 0.2 diff --git a/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.blif b/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.blif new file mode 100644 index 000000000..fd6a62c17 --- /dev/null +++ b/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.blif @@ -0,0 +1,35 @@ +.model test_mode_low +.inputs a b clk +.outputs out_0 out_1 out_2 out_3 + +#.subckt shift D=a clk=clk Q=pipe_a_0 +#.subckt shift D=pipe_a_0 clk=clk Q=pipe_a_1 +#.subckt shift D=b clk=clk Q=pipe_b_0 +#.subckt shift D=pipe_b_0 clk=clk Q=pipe_b_1 + + +.latch a pipe_a_0 re clk 0 +.latch pipe_a_0 pipe_a_1 re clk 0 +.latch b pipe_b_0 re clk 0 +.latch pipe_b_0 pipe_b_1 re clk 0 + +.latch sum_0 pipe_sum_0 re clk 0 +.latch sum_2 pipe_sum_1 re clk 0 +.latch sum_4 pipe_sum_2 re clk 0 +.latch sum_6 pipe_sum_3 re clk 0 + +.subckt adder a=pipe_a_1 b=pipe_b_1 cin=pipe_sum_3 cout=sum_1 sumout=sum_0 +.subckt adder a=pipe_sum_0 b=pipe_sum_2 cin=sum_1 cout=sum_3 sumout=sum_2 +.subckt adder a=pipe_sum_1 b=pipe_sum_3 cin=sum_3 cout=sum_5 sumout=sum_4 +.subckt adder a=pipe_sum_2 b=pipe_sum_0 cin=sum_5 cout=sum_7 sumout=sum_6 + +.names pipe_sum_0 out_0 +1 1 +.names pipe_sum_1 out_1 +1 1 +.names pipe_sum_2 out_2 +1 1 +.names pipe_sum_3 out_3 +1 1 + +.end diff --git a/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.v b/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.v new file mode 100644 index 000000000..ac34e62f3 --- /dev/null +++ b/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.v @@ -0,0 +1,52 @@ +////////////////////////////////////// +// // +// 2x2 Test-modes Low density // +// // +////////////////////////////////////// + + +module test_mode_low ( + a, + b, + clk, + reset, + out ); + + input wire a; + input wire b; + input wire clk; + input wire reset; + output wire[3:0] out; + + reg[1:0] pipe_a; + reg[1:0] pipe_b; + reg[3:0] pipe_sum; + wire[7:0] sum; + + assign sum[1:0] = pipe_a[1] + pipe_b[1] + pipe_sum[3]; + assign sum[3:2] = pipe_sum[0] + sum[1] + pipe_sum[2]; + assign sum[5:4] = pipe_sum[1] + sum[3] + pipe_sum[3]; + assign sum[7:6] = pipe_sum[2] + sum[5] + pipe_sum[0]; + assign out = pipe_sum; + + initial begin + pipe_a <= 2'b00; + pipe_b <= 2'b00; + pipe_sum <= 4'b0000; + end + + always @(posedge clk or posedge reset) begin + if(reset) begin + pipe_a <= 2'b00; + pipe_b <= 2'b00; + pipe_sum <= 4'b0000; + end else begin + pipe_a[0] <= a; + pipe_a[1] <= pipe_a[0]; + pipe_b[0] <= b; + pipe_b[1] <= pipe_b[0]; + pipe_sum <= {sum[6], sum[4], sum[2], sum[0]}; + end + end + +endmodule From 6dd8d347e140d9aad6c8c72c02786240fc291166 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 1 May 2020 14:39:04 -0600 Subject: [PATCH 012/180] try to deploy microbenchmark test_mode_low but fail due to .v port mismatch with .blif --- openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf b/openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf index e093b2b53..b42e17287 100644 --- a/openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf @@ -22,11 +22,18 @@ arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_ti [BENCHMARKS] bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif +# Cannot pass automatically. Need change in .v file to match ports +# When passed, we can replace the and2 benchmark +#bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.blif [SYNTHESIS_PARAM] bench0_top = and2 bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v + +#bench0_top = test_mode_low +#bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.act +#bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.v bench0_chan_width = 300 [SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] From 98a658a01349f246f7f4118f348ed441719830b6 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 1 May 2020 14:47:08 -0600 Subject: [PATCH 013/180] bug fixed in routing_test.v. Deployed to regression tests --- .../micro_benchmark/routing_test/routing_test.v | 2 +- .../tasks/openfpga_shell/frac_lut/config/task.conf | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v b/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v index 1cacf4857..d9729c1c8 100644 --- a/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v +++ b/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v @@ -1,5 +1,5 @@ -module routing_test(IN0,IN1,IN2,OUT0,OUT1,OUT2,clk); +module routing_test(IN0,IN1,IN2, clk, OUT0,OUT1,OUT2); input wire IN0,IN1,IN2,clk; diff --git a/openfpga_flow/tasks/openfpga_shell/frac_lut/config/task.conf b/openfpga_flow/tasks/openfpga_shell/frac_lut/config/task.conf index a69c1107e..030c0d41e 100644 --- a/openfpga_flow/tasks/openfpga_shell/frac_lut/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/frac_lut/config/task.conf @@ -21,18 +21,24 @@ openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10 arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml [BENCHMARKS] +# bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif +bench1=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.blif # Modelsim is ok with this but icarus fails due to poor support on timing and looping -#bench1=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_latch/and2_latch.blif +#bench2=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_latch/and2_latch.blif [SYNTHESIS_PARAM] bench0_top = and2 bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v -bench1_top = and2_latch -bench1_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_latch/and2_latch.act -bench1_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_latch/and2_latch.v +bench1_top = routing_test +bench1_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.act +bench1_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v + +bench2_top = and2_latch +bench2_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_latch/and2_latch.act +bench2_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_latch/and2_latch.v [SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] end_flow_with_test= From 889f179ce779c7c5de4e8b9337f2c54b62eccf96 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 1 May 2020 14:54:57 -0600 Subject: [PATCH 014/180] add local encoder test case --- ...6_frac_N10_local_encoder_40nm_openfpga.xml | 260 ++++++++++++++++++ .../mux_design/local_encoder/config/task.conf | 34 +++ 2 files changed, 294 insertions(+) create mode 100644 openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml create mode 100644 openfpga_flow/tasks/openfpga_shell/mux_design/local_encoder/config/task.conf diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml new file mode 100644 index 000000000..201a4be58 --- /dev/null +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + + + + 10e-12 5e-12 + + + 10e-12 5e-12 + + + + + + + + + + + + 10e-12 5e-12 5e-12 + + + 10e-12 5e-12 5e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openfpga_flow/tasks/openfpga_shell/mux_design/local_encoder/config/task.conf b/openfpga_flow/tasks/openfpga_shell/mux_design/local_encoder/config/task.conf new file mode 100644 index 000000000..76cf4b589 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/mux_design/local_encoder/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +vpr_fpga_verilog_formal_verification_top_netlist= From 1d35ac8086f541acdeefe01ffe8d0fd071a69d85 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 1 May 2020 14:56:07 -0600 Subject: [PATCH 015/180] deploy local encoder to CI --- .travis/script.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis/script.sh b/.travis/script.sh index ac801729c..cb9601683 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -90,6 +90,9 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/mux_design/tree_st echo -e "Testing Verilog generation with routing mutliplexers implemented by standard cell MUX2"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/mux_design/stdcell_mux2 --debug --show_thread_logs +echo -e "Testing Verilog generation with routing mutliplexers implemented by local encoders"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/mux_design/local_encoder --debug --show_thread_logs + echo -e "Testing Verilog generation with behavioral description"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/behavioral_verilog --debug --show_thread_logs From 889bc8dbe82999372ce41dda188b7d55c1ceaa94 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 1 May 2020 15:05:59 -0600 Subject: [PATCH 016/180] add more test cases about LUT design and deploy to CI --- .travis/script.sh | 11 +- ..._N10_intermediate_buffer_40nm_openfpga.xml | 229 ++++++++++++++++++ .../frac_lut/config/task.conf | 0 .../intermediate_buffer/config/task.conf | 45 ++++ .../single_mode/config/task.conf | 0 5 files changed, 281 insertions(+), 4 deletions(-) create mode 100644 openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml rename openfpga_flow/tasks/openfpga_shell/{ => lut_design}/frac_lut/config/task.conf (100%) create mode 100644 openfpga_flow/tasks/openfpga_shell/lut_design/intermediate_buffer/config/task.conf rename openfpga_flow/tasks/openfpga_shell/{ => lut_design}/single_mode/config/task.conf (100%) diff --git a/.travis/script.sh b/.travis/script.sh index cb9601683..19da16b8b 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -51,11 +51,14 @@ echo -e "Testing OpenFPGA Shell"; echo -e "Testing configuration chain of a K4N4 FPGA"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/configuration_chain --debug --show_thread_logs -echo -e "Testing Verilog generation for a single mode LUT6 FPGA using micro benchmarks"; -python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/single_mode --debug --show_thread_logs +echo -e "Testing Verilog generation for LUTs: a single mode LUT6 FPGA using micro benchmarks"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/lut_design/single_mode --debug --show_thread_logs -echo -e "Testing Verilog generation with simple fracturable LUT6 "; -python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/frac_lut --debug --show_thread_logs +echo -e "Testing Verilog generation for LUTs: simple fracturable LUT6 "; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/lut_design/frac_lut --debug --show_thread_logs + +echo -e "Testing Verilog generation for LUTs: LUT6 with intermediate buffers"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/lut_design/intermediate_buffer --debug --show_thread_logs echo -e "Testing Verilog generation with VPR's untileable routing architecture "; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/untileable --debug --show_thread_logs diff --git a/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml new file mode 100644 index 000000000..ef1c60a80 --- /dev/null +++ b/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + + + + + 10e-12 5e-12 5e-12 + + + 10e-12 5e-12 5e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openfpga_flow/tasks/openfpga_shell/frac_lut/config/task.conf b/openfpga_flow/tasks/openfpga_shell/lut_design/frac_lut/config/task.conf similarity index 100% rename from openfpga_flow/tasks/openfpga_shell/frac_lut/config/task.conf rename to openfpga_flow/tasks/openfpga_shell/lut_design/frac_lut/config/task.conf diff --git a/openfpga_flow/tasks/openfpga_shell/lut_design/intermediate_buffer/config/task.conf b/openfpga_flow/tasks/openfpga_shell/lut_design/intermediate_buffer/config/task.conf new file mode 100644 index 000000000..b2535bd7c --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/lut_design/intermediate_buffer/config/task.conf @@ -0,0 +1,45 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_N10_tileable_40nm.xml + +[BENCHMARKS] +# +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif +bench1=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.blif +# Modelsim is ok with this but icarus fails due to poor support on timing and looping +#bench2=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_latch/and2_latch.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v + +bench1_top = routing_test +bench1_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.act +bench1_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/routing_test/routing_test.v + +bench2_top = and2_latch +bench2_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_latch/and2_latch.act +bench2_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_latch/and2_latch.v + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +vpr_fpga_verilog_formal_verification_top_netlist= diff --git a/openfpga_flow/tasks/openfpga_shell/single_mode/config/task.conf b/openfpga_flow/tasks/openfpga_shell/lut_design/single_mode/config/task.conf similarity index 100% rename from openfpga_flow/tasks/openfpga_shell/single_mode/config/task.conf rename to openfpga_flow/tasks/openfpga_shell/lut_design/single_mode/config/task.conf From 1e2226e1c3038e0c9a757800c69b6c793da87a10 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 1 May 2020 21:18:14 -0600 Subject: [PATCH 017/180] now use explicit port mapping in the verilog testbenches for reference benchmarks --- .../verilog_formal_random_top_testbench.cpp | 7 ++++++- .../src/fpga_verilog/verilog_testbench_utils.cpp | 16 +++++++++++++++- .../src/fpga_verilog/verilog_testbench_utils.h | 4 ++++ .../src/fpga_verilog/verilog_top_testbench.cpp | 6 +++++- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.cpp index 8d4dab5c9..a06f58188 100644 --- a/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.cpp @@ -108,13 +108,17 @@ void print_verilog_top_random_testbench_benchmark_instance(std::fstream& fp, /* Do NOT use explicit port mapping here: * VPR added a prefix of "out_" to the output ports of input benchmark */ + std::vector prefix_to_remove; + prefix_to_remove.push_back(std::string(VPR_BENCHMARK_OUT_PORT_PREFIX)); + prefix_to_remove.push_back(std::string(OPENFPGA_BENCHMARK_OUT_PORT_PREFIX)); print_verilog_testbench_benchmark_instance(fp, reference_verilog_top_name, std::string(BENCHMARK_INSTANCE_NAME), std::string(), std::string(), + prefix_to_remove, std::string(BENCHMARK_PORT_POSTFIX), atom_ctx, netlist_annotation, - false); + true); print_verilog_comment(fp, std::string("----- End reference Benchmark Instanication -------")); @@ -146,6 +150,7 @@ void print_verilog_random_testbench_fpga_instance(std::fstream& fp, std::string(FPGA_INSTANCE_NAME), std::string(FORMAL_VERIFICATION_TOP_MODULE_PORT_POSTFIX), std::string(FORMAL_VERIFICATION_TOP_MODULE_PORT_POSTFIX), + std::vector(), std::string(FPGA_PORT_POSTFIX), atom_ctx, netlist_annotation, true); diff --git a/openfpga/src/fpga_verilog/verilog_testbench_utils.cpp b/openfpga/src/fpga_verilog/verilog_testbench_utils.cpp index dae42f042..8b5c741f1 100644 --- a/openfpga/src/fpga_verilog/verilog_testbench_utils.cpp +++ b/openfpga/src/fpga_verilog/verilog_testbench_utils.cpp @@ -57,6 +57,7 @@ void print_verilog_testbench_benchmark_instance(std::fstream& fp, const std::string& instance_name, const std::string& module_input_port_postfix, const std::string& module_output_port_postfix, + const std::vector& output_port_prefix_to_remove, const std::string& output_port_postfix, const AtomContext& atom_ctx, const VprNetlistAnnotation& netlist_annotation, @@ -97,8 +98,21 @@ void print_verilog_testbench_benchmark_instance(std::fstream& fp, } else { VTR_ASSERT_SAFE(AtomBlockType::OUTPAD == atom_ctx.nlist.block_type(atom_blk)); fp << "\t\t"; + /* Note that VPR added a prefix "out_" or "out:" to the name of output blocks + * We can remove this when specified through input argument + */ + std::string output_block_name = block_name; + for (const std::string& prefix_to_remove : output_port_prefix_to_remove) { + if (!prefix_to_remove.empty()) { + if (0 == output_block_name.find(prefix_to_remove)) { + output_block_name.erase(0, prefix_to_remove.length()); + break; + } + } + } + if (true == use_explicit_port_map) { - fp << "." << block_name << module_output_port_postfix << "("; + fp << "." << output_block_name << module_output_port_postfix << "("; } fp << block_name << output_port_postfix; if (true == use_explicit_port_map) { diff --git a/openfpga/src/fpga_verilog/verilog_testbench_utils.h b/openfpga/src/fpga_verilog/verilog_testbench_utils.h index 5e0bd69f9..d51f3b7e8 100644 --- a/openfpga/src/fpga_verilog/verilog_testbench_utils.h +++ b/openfpga/src/fpga_verilog/verilog_testbench_utils.h @@ -20,6 +20,9 @@ /* begin namespace openfpga */ namespace openfpga { +constexpr char* VPR_BENCHMARK_OUT_PORT_PREFIX = "out:"; +constexpr char* OPENFPGA_BENCHMARK_OUT_PORT_PREFIX = "out_"; + void print_verilog_testbench_fpga_instance(std::fstream& fp, const ModuleManager& module_manager, const ModuleId& top_module, @@ -30,6 +33,7 @@ void print_verilog_testbench_benchmark_instance(std::fstream& fp, const std::string& instance_name, const std::string& module_input_port_postfix, const std::string& module_output_port_postfix, + const std::vector& output_port_prefix_to_remove, const std::string& output_port_postfix, const AtomContext& atom_ctx, const VprNetlistAnnotation& netlist_annotation, diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index a477fa99e..6a647de35 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -458,13 +458,17 @@ void print_verilog_top_testbench_benchmark_instance(std::fstream& fp, /* Do NOT use explicit port mapping here: * VPR added a prefix of "out_" to the output ports of input benchmark */ + std::vector prefix_to_remove; + prefix_to_remove.push_back(std::string(VPR_BENCHMARK_OUT_PORT_PREFIX)); + prefix_to_remove.push_back(std::string(OPENFPGA_BENCHMARK_OUT_PORT_PREFIX)); print_verilog_testbench_benchmark_instance(fp, reference_verilog_top_name, std::string(TOP_TESTBENCH_REFERENCE_INSTANCE_NAME), std::string(), std::string(), + prefix_to_remove, std::string(TOP_TESTBENCH_REFERENCE_OUTPUT_POSTFIX), atom_ctx, netlist_annotation, - false); + true); print_verilog_comment(fp, std::string("----- End reference Benchmark Instanication -------")); From facd87dafe5eec9bd0734836ddb1f80c5333bdce Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 1 May 2020 21:39:43 -0600 Subject: [PATCH 018/180] use wildcard in SDC generation for multiple-instanced-blocks --- openfpga/src/fpga_sdc/sdc_memory_utils.cpp | 18 +++++++++++++++++- openfpga/src/fpga_sdc/sdc_writer_utils.cpp | 20 +++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/openfpga/src/fpga_sdc/sdc_memory_utils.cpp b/openfpga/src/fpga_sdc/sdc_memory_utils.cpp index 1910b4197..61457b467 100644 --- a/openfpga/src/fpga_sdc/sdc_memory_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_memory_utils.cpp @@ -3,6 +3,9 @@ * fabric using SDC commands *******************************************************************/ +/* Headers from vtrutil library */ +#include "vtr_assert.h" + /* Headers from openfpgautil library */ #include "openfpga_digest.h" @@ -26,17 +29,30 @@ void rec_print_pnr_sdc_disable_configurable_memory_module_output(std::fstream& f const ModuleId& parent_module, const std::string& parent_module_path) { + /* Keep tracking multiple-instanced-blocks (MIB) + * if they should be skipped as the unique module has been visited already + */ + std::map skip_mib; /* For each configurable child, we will go one level down in priority */ for (size_t child_index = 0; child_index < module_manager.configurable_children(parent_module).size(); ++child_index) { std::string child_module_path = parent_module_path; ModuleId child_module_id = module_manager.configurable_children(parent_module)[child_index]; size_t child_instance_id = module_manager.configurable_child_instances(parent_module)[child_index]; if (true == module_manager.instance_name(parent_module, child_module_id, child_instance_id).empty()) { + if (0 < skip_mib.count(child_module_id)) { + VTR_ASSERT(skip_mib.at(child_module_id) = true); + continue; + } /* Give a default name __ */ child_module_path += module_manager.module_name(child_module_id); child_module_path += "_"; - child_module_path += std::to_string(child_instance_id); + child_module_path += "*"; + //child_module_path += std::to_string(child_instance_id); child_module_path += "_"; + /* If we use wild card to disable all the other instance + * So we can skip later if there is no specific instance name + */ + skip_mib[child_module_id] = true; } else { child_module_path += module_manager.instance_name(parent_module, child_module_id, child_instance_id); } diff --git a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp index 363d97e1c..4f021034c 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp @@ -5,6 +5,9 @@ #include #include +/* Headers from vtrutil library */ +#include "vtr_assert.h" + /* Headers from openfpgautil library */ #include "openfpga_digest.h" @@ -46,10 +49,21 @@ std::string generate_sdc_port(const BasicPort& port) { /* Only connection require a format of [:] * others require a format of [:] */ - /* When LSB == MSB, we can use a simplified format []*/ - if ( 1 == port.get_width()) { - size_str = "[" + std::to_string(port.get_lsb()) + "]"; + /* When LSB == MSB, we can use a simplified format + * If LSB != 0, we need to give explicit pin number + * [] + * Otherwise, we can keep a compact format + * + */ + if (1 == port.get_width()) { + if (0 != port.get_lsb()) { + size_str = "[" + std::to_string(port.get_lsb()) + "]"; + } else { + VTR_ASSERT(0 == port.get_lsb()); + size_str.clear(); + } } + sdc_line = port.get_name() + size_str; return sdc_line; From 8695c5ee78cb1b55e2e41aeac3021b6f6cf4b99a Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 2 May 2020 14:17:07 -0600 Subject: [PATCH 019/180] add options to use general-purpose wildcards in SDC generator --- .../src/openfpga_wildcard_string.cpp | 105 ++++++++++++++++++ .../src/openfpga_wildcard_string.h | 57 ++++++++++ openfpga/src/base/openfpga_naming.cpp | 14 +++ openfpga/src/base/openfpga_naming.h | 3 + openfpga/src/base/openfpga_sdc.cpp | 4 + openfpga/src/base/openfpga_sdc_command.cpp | 6 + openfpga/src/fpga_sdc/analysis_sdc_option.cpp | 9 ++ openfpga/src/fpga_sdc/analysis_sdc_option.h | 3 + openfpga/src/fpga_sdc/analysis_sdc_writer.cpp | 2 +- openfpga/src/fpga_sdc/pnr_sdc_option.cpp | 9 ++ openfpga/src/fpga_sdc/pnr_sdc_option.h | 3 + openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 6 +- openfpga/src/fpga_sdc/sdc_memory_utils.cpp | 61 +++++++--- openfpga/src/fpga_sdc/sdc_memory_utils.h | 1 + 14 files changed, 263 insertions(+), 20 deletions(-) create mode 100644 libopenfpga/libopenfpgautil/src/openfpga_wildcard_string.cpp create mode 100644 libopenfpga/libopenfpgautil/src/openfpga_wildcard_string.h diff --git a/libopenfpga/libopenfpgautil/src/openfpga_wildcard_string.cpp b/libopenfpga/libopenfpgautil/src/openfpga_wildcard_string.cpp new file mode 100644 index 000000000..67031a2a5 --- /dev/null +++ b/libopenfpga/libopenfpgautil/src/openfpga_wildcard_string.cpp @@ -0,0 +1,105 @@ +/************************************************************************ + * Member functions for WildCardString class + ***********************************************************************/ +#include + +/* Headers from vtrutil library */ +#include "vtr_assert.h" +#include "vtr_log.h" + +#include "openfpga_wildcard_string.h" + +/* namespace openfpga begins */ +namespace openfpga { + +/************************************************************************ + * Constructors + ***********************************************************************/ +WildCardString::WildCardString(const std::string& data) { + set_data(data); +} + +/************************************************************************ + * Public Accessors + ***********************************************************************/ +std::string WildCardString::data() const { + return data_; +} + +/************************************************************************ + * Public Mutators + ***********************************************************************/ +void WildCardString::set_data(const std::string& data) { + data_ = data; + + set_default_wildcard_char(); + set_default_sensitive_chars(); + apply_wildcard_char(); + compress(); +} + +/************************************************************************ + * Internal Mutators + ***********************************************************************/ +void WildCardString::set_default_wildcard_char() { + wildcard_char_ = '*'; +} + +void WildCardString::set_default_sensitive_chars() { + sensitive_chars_.clear(); + sensitive_chars_.reserve(10); + sensitive_chars_.push_back('0'); + sensitive_chars_.push_back('1'); + sensitive_chars_.push_back('2'); + sensitive_chars_.push_back('3'); + sensitive_chars_.push_back('4'); + sensitive_chars_.push_back('5'); + sensitive_chars_.push_back('6'); + sensitive_chars_.push_back('7'); + sensitive_chars_.push_back('8'); + sensitive_chars_.push_back('9'); +} + +void WildCardString::apply_wildcard_char() { + /* Step by step: + * For each sensitive character, + * replace all of its occurance in the string data_ with wildcard character + */ + for (const char& char_to_replace : sensitive_chars_) { + size_t cur_pos = 0; + std::string::size_type found; + while (std::string::npos != (found = data_.find_first_of(char_to_replace, cur_pos))) { + data_.replace(found, 1, 1, wildcard_char_); + cur_pos = found + 1; + } + } +} + +void WildCardString::compress() { + for (std::string::size_type i = 0; i < data_.size(); ++i) { + /* Care only wildcard character */ + if (wildcard_char_ != data_[i]) { + continue; + } + + /* Finish if this is the end of string */ + if (data_.size() - 1 == i) { + break; + } + + /* Try to find the next element and see if the same as wild card + * Keep erase the next element until we have a non-wildcard character + */ + while (data_[i] == data_[i + 1]) { + /* Erase the next element */ + data_.erase(i + 1, 1); + + /* Finish if this is the end of string */ + if (data_.size() - 1 == i) { + break; + } + } + } +} + +} /* namespace openfpga ends */ diff --git a/libopenfpga/libopenfpgautil/src/openfpga_wildcard_string.h b/libopenfpga/libopenfpgautil/src/openfpga_wildcard_string.h new file mode 100644 index 000000000..874641cf4 --- /dev/null +++ b/libopenfpga/libopenfpgautil/src/openfpga_wildcard_string.h @@ -0,0 +1,57 @@ +#ifndef OPENFPGA_WILDCARD_STRING_H +#define OPENFPGA_WILDCARD_STRING_H + +/******************************************************************** + * Include header files that are required by data structure declaration + *******************************************************************/ +#include +#include + +/* namespace openfpga begins */ +namespace openfpga { + +/************************************************************************ + * This file includes a object that can apply wildcard characters + * By default it will replace any digital numbers with a '*' character + * Users can set the wildcard character on their needs + * + * Example: + * std::string orig_str; + * WildCardString wc_str(orig_str); + * std::string output = wc_str.data(); + * + ***********************************************************************/ + +class WildCardString { + public : /* Constructors*/ + WildCardString (const std::string& data); + + public : /* Public Accessors */ + std::string data() const; + + public : /* Public Mutators */ + /* Give a string to apply wildcards */ + void set_data(const std::string& data); + + private : /* Private Mutators */ + /* Use default wildcard character '*' */ + void set_default_wildcard_char(); + + /* Use default sensitive words which are numbers */ + void set_default_sensitive_chars(); + + /* Replace sensitive words with wildcard characters */ + void apply_wildcard_char(); + + /* Remove redundant wildcard chars (which are next to each other) */ + void compress(); + + private : /* Internal data */ + std::string data_; /* Lines to be splited */ + std::vector sensitive_chars_; + char wildcard_char_; +}; + +} /* namespace openfpga ends */ + +#endif diff --git a/openfpga/src/base/openfpga_naming.cpp b/openfpga/src/base/openfpga_naming.cpp index 0796d4df1..74750fca5 100644 --- a/openfpga/src/base/openfpga_naming.cpp +++ b/openfpga/src/base/openfpga_naming.cpp @@ -30,6 +30,20 @@ std::string generate_instance_name(const std::string& instance_name, return instance_name + std::string("_") + std::to_string(instance_id) + std::string("_"); } +/************************************************ + * A generic function to generate the instance name + * in the following format: + * __ + * This is mainly used by module manager to give a default + * name for each instance when outputting the module + * in Verilog/SPICE format + ***********************************************/ +std::string generate_instance_wildcard_name(const std::string& instance_name, + const std::string& wildcard_str) { + return instance_name + std::string("_") + wildcard_str + std::string("_"); +} + + /************************************************ * Generate the node name for a multiplexing structure * Case 1 : If there is an intermediate buffer followed by, diff --git a/openfpga/src/base/openfpga_naming.h b/openfpga/src/base/openfpga_naming.h index d3307fe3c..9896dddd4 100644 --- a/openfpga/src/base/openfpga_naming.h +++ b/openfpga/src/base/openfpga_naming.h @@ -26,6 +26,9 @@ namespace openfpga { std::string generate_instance_name(const std::string& instance_name, const size_t& instance_id); +std::string generate_instance_wildcard_name(const std::string& instance_name, + const std::string& wildcard_str); + std::string generate_mux_node_name(const size_t& node_level, const bool& add_buffer_postfix); diff --git a/openfpga/src/base/openfpga_sdc.cpp b/openfpga/src/base/openfpga_sdc.cpp index 21a3ab8fb..c0c5b3f22 100644 --- a/openfpga/src/base/openfpga_sdc.cpp +++ b/openfpga/src/base/openfpga_sdc.cpp @@ -29,6 +29,7 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context) { CommandOptionId opt_output_dir = cmd.option("file"); + CommandOptionId opt_flatten_names = cmd.option("flatten_names"); CommandOptionId opt_constrain_global_port = cmd.option("constrain_global_port"); CommandOptionId opt_constrain_non_clock_global_port = cmd.option("constrain_non_clock_global_port"); CommandOptionId opt_constrain_grid = cmd.option("constrain_grid"); @@ -49,6 +50,7 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, PnrSdcOption options(sdc_dir_path); + options.set_flatten_names(cmd_context.option_enable(cmd, opt_flatten_names)); options.set_constrain_global_port(cmd_context.option_enable(cmd, opt_constrain_global_port)); options.set_constrain_non_clock_global_port(cmd_context.option_enable(cmd, opt_constrain_non_clock_global_port)); options.set_constrain_grid(cmd_context.option_enable(cmd, opt_constrain_grid)); @@ -95,6 +97,7 @@ int write_analysis_sdc(OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context) { CommandOptionId opt_output_dir = cmd.option("file"); + CommandOptionId opt_flatten_names = cmd.option("flatten_names"); /* This is an intermediate data structure which is designed to modularize the FPGA-SDC * Keep it independent from any other outside data structures @@ -106,6 +109,7 @@ int write_analysis_sdc(OpenfpgaContext& openfpga_ctx, AnalysisSdcOption options(sdc_dir_path); options.set_generate_sdc_analysis(true); + options.set_flatten_names(cmd_context.option_enable(cmd, opt_flatten_names)); /* Collect global ports from the circuit library: * TODO: should we place this in the OpenFPGA context? diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index 551b37d2b..02595a10c 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -26,6 +26,9 @@ ShellCommandId add_openfpga_write_pnr_sdc_command(openfpga::Shell skip_mib; + std::map> wildcard_names; + /* For each configurable child, we will go one level down in priority */ for (size_t child_index = 0; child_index < module_manager.configurable_children(parent_module).size(); ++child_index) { std::string child_module_path = parent_module_path; ModuleId child_module_id = module_manager.configurable_children(parent_module)[child_index]; size_t child_instance_id = module_manager.configurable_child_instances(parent_module)[child_index]; + std::string child_instance_name; if (true == module_manager.instance_name(parent_module, child_module_id, child_instance_id).empty()) { - if (0 < skip_mib.count(child_module_id)) { - VTR_ASSERT(skip_mib.at(child_module_id) = true); + child_instance_name = generate_instance_name(module_manager.module_name(child_module_id), child_instance_id); + } else { + child_instance_name = module_manager.instance_name(parent_module, child_module_id, child_instance_id); + } + + if (false == flatten_names) { + /* Try to adapt to a wildcard name: replace all the numbers with a wildcard character '*' */ + WildCardString wildcard_str(child_instance_name); + /* If the wildcard name is already in the list, we can skip this + * Otherwise, we have to + * - output this instance + * - record the wildcard name in the map + */ + if ( (0 < wildcard_names.count(child_module_id)) + && (wildcard_names.at(child_module_id).end() != std::find(wildcard_names.at(child_module_id).begin(), + wildcard_names.at(child_module_id).end(), + wildcard_str.data())) ) { continue; } - /* Give a default name __ */ - child_module_path += module_manager.module_name(child_module_id); - child_module_path += "_"; - child_module_path += "*"; - //child_module_path += std::to_string(child_instance_id); - child_module_path += "_"; - /* If we use wild card to disable all the other instance - * So we can skip later if there is no specific instance name - */ - skip_mib[child_module_id] = true; + + child_module_path += wildcard_str.data(); + + wildcard_names[child_module_id].push_back(wildcard_str.data()); } else { - child_module_path += module_manager.instance_name(parent_module, child_module_id, child_instance_id); + child_module_path += child_instance_name; } + child_module_path = format_dir_path(child_module_path); - rec_print_pnr_sdc_disable_configurable_memory_module_output(fp, module_manager, + rec_print_pnr_sdc_disable_configurable_memory_module_output(fp, flatten_names, + module_manager, child_module_id, child_module_path); } diff --git a/openfpga/src/fpga_sdc/sdc_memory_utils.h b/openfpga/src/fpga_sdc/sdc_memory_utils.h index 7fbf92294..576b3a36e 100644 --- a/openfpga/src/fpga_sdc/sdc_memory_utils.h +++ b/openfpga/src/fpga_sdc/sdc_memory_utils.h @@ -16,6 +16,7 @@ namespace openfpga { void rec_print_pnr_sdc_disable_configurable_memory_module_output(std::fstream& fp, + const bool& flatten_names, const ModuleManager& module_manager, const ModuleId& parent_module, const std::string& parent_module_path); From ecdbdcb59254ba3a79032ababe2f4bc29de74f4e Mon Sep 17 00:00:00 2001 From: Xifan Tang Date: Sat, 2 May 2020 14:23:20 -0600 Subject: [PATCH 020/180] update documentation on new SDC options --- docs/source/openfpga_shell/openfpga_commands.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/openfpga_shell/openfpga_commands.rst b/docs/source/openfpga_shell/openfpga_commands.rst index 543b87397..12a1d89c7 100644 --- a/docs/source/openfpga_shell/openfpga_commands.rst +++ b/docs/source/openfpga_shell/openfpga_commands.rst @@ -176,6 +176,8 @@ FPGA-SDC - ``--file`` or ``-f`` Specify the output directory for SDC files + - ``--flatten_names`` Use flatten names (no wildcards) in SDC files + - ``--constrain_global_port`` Constrain all the global ports of FPGA fabric. - ``--constrain_non_clock_global_port`` Constrain all the non-clock global ports as clocks ports of FPGA fabric @@ -205,3 +207,5 @@ FPGA-SDC Write the SDC to run timing analysis for a mapped FPGA fabric - ``--file`` or ``-f`` Specify the output directory for SDC files + + - ``--flatten_names`` Use flatten names (no wildcards) in SDC files From d0793d90298e8edb70a5b8a4ef7bda9116d3f77d Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 2 May 2020 15:52:17 -0600 Subject: [PATCH 021/180] now disable_sb_output support wildcard --- openfpga/src/base/openfpga_sdc_command.cpp | 4 +- openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 241 ++++++++++++++++----- 2 files changed, 186 insertions(+), 59 deletions(-) diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index 02595a10c..77c581da2 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -27,7 +27,7 @@ ShellCommandId add_openfpga_write_pnr_sdc_command(openfpga::Shell sb_range = device_rr_gsb.get_gsb_range(); - /* Go for each SB */ - for (size_t ix = 0; ix < sb_range.x(); ++ix) { - for (size_t iy = 0; iy < sb_range.y(); ++iy) { - const RRGSB& rr_gsb = device_rr_gsb.get_gsb(ix, iy); - - if (false == rr_gsb.is_sb_exist()) { - continue; - } - - vtr::Point gsb_coordinate(rr_gsb.get_sb_x(), rr_gsb.get_sb_y()); - std::string sb_instance_name = generate_switch_block_module_name(gsb_coordinate); - - ModuleId sb_module = module_manager.find_module(sb_instance_name); - VTR_ASSERT(true == module_manager.valid_module_id(sb_module)); - - /* Disable the outputs of the module */ - for (const BasicPort& output_port : module_manager.module_ports_by_type(sb_module, ModuleManager::MODULE_OUTPUT_PORT)) { - fp << "set_disable_timing " << sb_instance_name << "/" << output_port.get_name() << std::endl; - fp << std::endl; - } - } - } - - /* Close file handler */ - fp.close(); -} - -/******************************************************************** - * Break combinational loops in FPGA fabric, which mainly come from - * loops of multiplexers. - * To handle this, we disable the timing at outputs of Switch blocks - * This function is designed for compact routing hierarchy - *******************************************************************/ -static -void print_pnr_sdc_compact_routing_disable_switch_block_outputs(const std::string& sdc_dir, + const bool& flatten_names, const ModuleManager& module_manager, const ModuleId& top_module, const DeviceRRGSB& device_rr_gsb) { @@ -209,6 +156,131 @@ void print_pnr_sdc_compact_routing_disable_switch_block_outputs(const std::strin /* Generate the descriptions*/ print_sdc_file_header(fp, std::string("Disable Switch Block outputs for PnR")); + std::string root_path = format_dir_path(module_manager.module_name(top_module)); + + /* Build wildcard names for the instance names of multiple-instanced-blocks (MIB) + * We will find all the instance names and see there are common prefix + * If so, we can use wildcards + */ + std::map> wildcard_names; + + /* Get the range of SB array */ + vtr::Point sb_range = device_rr_gsb.get_gsb_range(); + /* Go for each SB */ + for (size_t ix = 0; ix < sb_range.x(); ++ix) { + for (size_t iy = 0; iy < sb_range.y(); ++iy) { + const RRGSB& rr_gsb = device_rr_gsb.get_gsb(ix, iy); + + if (false == rr_gsb.is_sb_exist()) { + continue; + } + + std::string module_path = root_path; + + vtr::Point gsb_coordinate(rr_gsb.get_sb_x(), rr_gsb.get_sb_y()); + std::string sb_instance_name = generate_switch_block_module_name(gsb_coordinate); + + ModuleId sb_module = module_manager.find_module(sb_instance_name); + VTR_ASSERT(true == module_manager.valid_module_id(sb_module)); + + if (false == flatten_names) { + /* Try to adapt to a wildcard name: replace all the numbers with a wildcard character '*' */ + WildCardString wildcard_str(sb_instance_name); + /* If the wildcard name is already in the list, we can skip this + * Otherwise, we have to + * - output this instance + * - record the wildcard name in the map + */ + if ( (0 < wildcard_names.count(sb_module)) + && (wildcard_names.at(sb_module).end() != std::find(wildcard_names.at(sb_module).begin(), + wildcard_names.at(sb_module).end(), + wildcard_str.data())) ) { + continue; + } + + module_path += wildcard_str.data(); + + wildcard_names[sb_module].push_back(wildcard_str.data()); + } else { + module_path += sb_instance_name; + } + + module_path = format_dir_path(module_path); + + std::vector port_wildcard_names; + + /* Disable the outputs of the module */ + for (const BasicPort& output_port : module_manager.module_ports_by_type(sb_module, ModuleManager::MODULE_OUTPUT_PORT)) { + std::string port_name = output_port.get_name(); + + if (false == flatten_names) { + /* Try to adapt to a wildcard name: replace all the numbers with a wildcard character '*' */ + WildCardString port_wildcard_str(output_port.get_name()); + /* If the wildcard name is already in the list, we can skip this + * Otherwise, we have to + * - output this port + * - record the wildcard name in the vector + */ + if (port_wildcard_names.end() != std::find(port_wildcard_names.begin(), + port_wildcard_names.end(), + port_wildcard_str.data())) { + continue; + } + + port_name = port_wildcard_str.data(); + + port_wildcard_names.push_back(port_wildcard_str.data()); + } + + fp << "set_disable_timing "; + fp << module_path; + fp << port_name << std::endl; + + fp << std::endl; + } + } + } + + /* Close file handler */ + fp.close(); +} + +/******************************************************************** + * Break combinational loops in FPGA fabric, which mainly come from + * loops of multiplexers. + * To handle this, we disable the timing at outputs of Switch blocks + * This function is designed for compact routing hierarchy + *******************************************************************/ +static +void print_pnr_sdc_compact_routing_disable_switch_block_outputs(const std::string& sdc_dir, + const bool& flatten_names, + const ModuleManager& module_manager, + const ModuleId& top_module, + const DeviceRRGSB& device_rr_gsb) { + /* Create the file name for Verilog netlist */ + std::string sdc_fname(sdc_dir + std::string(SDC_DISABLE_SB_OUTPUTS_FILE_NAME)); + + /* Start time count */ + std::string timer_message = std::string("Write SDC to disable switch block outputs for P&R flow '") + sdc_fname + std::string("'"); + vtr::ScopedStartFinishTimer timer(timer_message); + + /* Create the file stream */ + std::fstream fp; + fp.open(sdc_fname, std::fstream::out | std::fstream::trunc); + + check_file_stream(sdc_fname.c_str(), fp); + + /* Generate the descriptions*/ + print_sdc_file_header(fp, std::string("Disable Switch Block outputs for PnR")); + + std::string root_path = format_dir_path(module_manager.module_name(top_module)); + + /* Build wildcard names for the instance names of multiple-instanced-blocks (MIB) + * We will find all the instance names and see there are common prefix + * If so, we can use wildcards + */ + std::map> wildcard_names; + /* Build unique switch block modules */ for (size_t isb = 0; isb < device_rr_gsb.get_num_sb_unique_module(); ++isb) { const RRGSB& rr_gsb = device_rr_gsb.get_sb_unique_module(isb); @@ -217,13 +289,66 @@ void print_pnr_sdc_compact_routing_disable_switch_block_outputs(const std::strin ModuleId sb_module = module_manager.find_module(sb_module_name); VTR_ASSERT(true == module_manager.valid_module_id(sb_module)); + + std::string module_path = root_path; /* Find all the instances in the top-level module */ for (const size_t& instance_id : module_manager.child_module_instances(top_module, sb_module)) { std::string sb_instance_name = module_manager.instance_name(top_module, sb_module, instance_id); + + if (false == flatten_names) { + /* Try to adapt to a wildcard name: replace all the numbers with a wildcard character '*' */ + WildCardString wildcard_str(sb_instance_name); + /* If the wildcard name is already in the list, we can skip this + * Otherwise, we have to + * - output this instance + * - record the wildcard name in the map + */ + if ( (0 < wildcard_names.count(sb_module)) + && (wildcard_names.at(sb_module).end() != std::find(wildcard_names.at(sb_module).begin(), + wildcard_names.at(sb_module).end(), + wildcard_str.data())) ) { + continue; + } + + module_path += wildcard_str.data(); + + wildcard_names[sb_module].push_back(wildcard_str.data()); + } else { + module_path += sb_instance_name; + } + + module_path = format_dir_path(module_path); + + std::vector port_wildcard_names; + /* Disable the outputs of the module */ for (const BasicPort& output_port : module_manager.module_ports_by_type(sb_module, ModuleManager::MODULE_OUTPUT_PORT)) { - fp << "set_disable_timing " << sb_instance_name << "/" << output_port.get_name() << std::endl; + std::string port_name = output_port.get_name(); + + if (false == flatten_names) { + /* Try to adapt to a wildcard name: replace all the numbers with a wildcard character '*' */ + WildCardString port_wildcard_str(output_port.get_name()); + /* If the wildcard name is already in the list, we can skip this + * Otherwise, we have to + * - output this port + * - record the wildcard name in the vector + */ + if (port_wildcard_names.end() != std::find(port_wildcard_names.begin(), + port_wildcard_names.end(), + port_wildcard_str.data())) { + continue; + } + + port_name = port_wildcard_str.data(); + + port_wildcard_names.push_back(port_wildcard_str.data()); + } + + fp << "set_disable_timing "; + fp << module_path; + fp << port_name << std::endl; + fp << std::endl; } } @@ -282,12 +407,14 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, if (true == sdc_options.constrain_switch_block_outputs()) { if (true == compact_routing_hierarchy) { print_pnr_sdc_compact_routing_disable_switch_block_outputs(sdc_options.sdc_dir(), + sdc_options.flatten_names(), module_manager, top_module, device_rr_gsb); } else { VTR_ASSERT_SAFE (false == compact_routing_hierarchy); print_pnr_sdc_flatten_routing_disable_switch_block_outputs(sdc_options.sdc_dir(), - module_manager, + sdc_options.flatten_names(), + module_manager, top_module, device_rr_gsb); } } From 7503c58fb277c0a798bcd8f9f675d67f6d4f9e39 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 2 May 2020 16:33:43 -0600 Subject: [PATCH 022/180] small fix on SDC generator for SB which do not exist in FPGA --- openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp index e3c5625ef..a26b67a71 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp @@ -284,6 +284,11 @@ void print_pnr_sdc_compact_routing_disable_switch_block_outputs(const std::strin /* Build unique switch block modules */ for (size_t isb = 0; isb < device_rr_gsb.get_num_sb_unique_module(); ++isb) { const RRGSB& rr_gsb = device_rr_gsb.get_sb_unique_module(isb); + + if (false == rr_gsb.is_sb_exist()) { + continue; + } + vtr::Point gsb_coordinate(rr_gsb.get_sb_x(), rr_gsb.get_sb_y()); std::string sb_module_name = generate_switch_block_module_name(gsb_coordinate); From 7e82c23f52af2d351e8387ffbb451fc93a5c6d85 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 2 May 2020 18:31:37 -0600 Subject: [PATCH 023/180] now add SDC generator supports both hierarchical and flatten in writing timing constraints --- openfpga/src/base/openfpga_sdc.cpp | 2 + openfpga/src/base/openfpga_sdc_command.cpp | 5 +- openfpga/src/fpga_sdc/pnr_sdc_option.cpp | 9 +++ openfpga/src/fpga_sdc/pnr_sdc_option.h | 3 + .../src/fpga_sdc/pnr_sdc_routing_writer.cpp | 81 +++++++++++++++++-- .../src/fpga_sdc/pnr_sdc_routing_writer.h | 4 + openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 4 + openfpga/src/fpga_sdc/sdc_writer_utils.cpp | 40 +++++++++ openfpga/src/fpga_sdc/sdc_writer_utils.h | 7 ++ 9 files changed, 149 insertions(+), 6 deletions(-) diff --git a/openfpga/src/base/openfpga_sdc.cpp b/openfpga/src/base/openfpga_sdc.cpp index c0c5b3f22..9fa360cff 100644 --- a/openfpga/src/base/openfpga_sdc.cpp +++ b/openfpga/src/base/openfpga_sdc.cpp @@ -30,6 +30,7 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, CommandOptionId opt_output_dir = cmd.option("file"); CommandOptionId opt_flatten_names = cmd.option("flatten_names"); + CommandOptionId opt_hierarchical = cmd.option("hierarchical"); CommandOptionId opt_constrain_global_port = cmd.option("constrain_global_port"); CommandOptionId opt_constrain_non_clock_global_port = cmd.option("constrain_non_clock_global_port"); CommandOptionId opt_constrain_grid = cmd.option("constrain_grid"); @@ -51,6 +52,7 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, PnrSdcOption options(sdc_dir_path); options.set_flatten_names(cmd_context.option_enable(cmd, opt_flatten_names)); + options.set_hierarchical(cmd_context.option_enable(cmd, opt_hierarchical)); options.set_constrain_global_port(cmd_context.option_enable(cmd, opt_constrain_global_port)); options.set_constrain_non_clock_global_port(cmd_context.option_enable(cmd, opt_constrain_non_clock_global_port)); options.set_constrain_grid(cmd_context.option_enable(cmd, opt_constrain_grid)); diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index 77c581da2..479cb8de9 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -29,6 +29,9 @@ ShellCommandId add_openfpga_write_pnr_sdc_command(openfpga::Shell sb_range = device_rr_gsb.get_gsb_range(); /* Go for each SB */ @@ -186,7 +207,24 @@ void print_pnr_sdc_flatten_routing_constrain_sb_timing(const std::string& sdc_di if (false == rr_gsb.is_sb_exist()) { continue; } + + vtr::Point gsb_coordinate(rr_gsb.get_sb_x(), rr_gsb.get_sb_y()); + std::string sb_instance_name = generate_switch_block_module_name(gsb_coordinate); + + ModuleId sb_module = module_manager.find_module(sb_instance_name); + VTR_ASSERT(true == module_manager.valid_module_id(sb_module)); + + std::string module_path = root_path + + std::string("\\/") + + std::string("("); + + /* Find all the instances in the top-level module */ + module_path += sb_instance_name; + module_path += std::string(")") + std::string("\\"); + print_pnr_sdc_constrain_sb_timing(sdc_dir, + hierarchical, + module_path, module_manager, rr_graph, rr_gsb, @@ -200,7 +238,9 @@ void print_pnr_sdc_flatten_routing_constrain_sb_timing(const std::string& sdc_di * This function is designed for compact routing hierarchy *******************************************************************/ void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_dir, + const bool& hierarchical, const ModuleManager& module_manager, + const ModuleId& top_module, const RRGraph& rr_graph, const DeviceRRGSB& device_rr_gsb, const bool& constrain_zero_delay_paths) { @@ -208,12 +248,43 @@ void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_di /* Start time count */ vtr::ScopedStartFinishTimer timer("Write SDC for constrain Switch Block timing for P&R flow"); + std::string root_path = module_manager.module_name(top_module); + for (size_t isb = 0; isb < device_rr_gsb.get_num_sb_unique_module(); ++isb) { const RRGSB& rr_gsb = device_rr_gsb.get_sb_unique_module(isb); if (false == rr_gsb.is_sb_exist()) { continue; } + + /* Find all the sb instance under this module + * Create a regular expression to include these instance names + */ + vtr::Point gsb_coordinate(rr_gsb.get_sb_x(), rr_gsb.get_sb_y()); + std::string sb_module_name = generate_switch_block_module_name(gsb_coordinate); + + ModuleId sb_module = module_manager.find_module(sb_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(sb_module)); + + std::string module_path = root_path + + std::string("\\/") + + std::string("("); + + /* Find all the instances in the top-level module */ + bool first_element = true; + for (const size_t& instance_id : module_manager.child_module_instances(top_module, sb_module)) { + std::string sb_instance_name = module_manager.instance_name(top_module, sb_module, instance_id); + if (false == first_element) { + module_path += std::string("|"); + } + module_path += sb_instance_name; + first_element = false; + } + + module_path += std::string(")") + std::string("\\"); + print_pnr_sdc_constrain_sb_timing(sdc_dir, + hierarchical, + module_path, module_manager, rr_graph, rr_gsb, diff --git a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h index 0ced07938..aa0d04cbc 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h +++ b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h @@ -18,13 +18,17 @@ namespace openfpga { void print_pnr_sdc_flatten_routing_constrain_sb_timing(const std::string& sdc_dir, + const bool& hierarchical, const ModuleManager& module_manager, + const ModuleId& top_module, const RRGraph& rr_graph, const DeviceRRGSB& device_rr_gsb, const bool& constrain_zero_delay_paths); void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_dir, + const bool& hierarchical, const ModuleManager& module_manager, + const ModuleId& top_module, const RRGraph& rr_graph, const DeviceRRGSB& device_rr_gsb, const bool& constrain_zero_delay_paths); diff --git a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp index a26b67a71..4b363d7d7 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp @@ -428,14 +428,18 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, if (true == sdc_options.constrain_sb()) { if (true == compact_routing_hierarchy) { print_pnr_sdc_compact_routing_constrain_sb_timing(sdc_options.sdc_dir(), + sdc_options.hierarchical(), module_manager, + top_module, device_ctx.rr_graph, device_rr_gsb, sdc_options.constrain_zero_delay_paths()); } else { VTR_ASSERT_SAFE (false == compact_routing_hierarchy); print_pnr_sdc_flatten_routing_constrain_sb_timing(sdc_options.sdc_dir(), + sdc_options.hierarchical(), module_manager, + top_module, device_ctx.rr_graph, device_rr_gsb, sdc_options.constrain_zero_delay_paths()); diff --git a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp index 4f021034c..13b70fec4 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp @@ -101,6 +101,46 @@ void print_pnr_sdc_constrain_max_delay(std::fstream& fp, fp << std::endl; } +/******************************************************************** + * Constrain a path between two ports of a module with a given maximum timing value + * This function use regular expression and get_pins which are + * from open-source SDC 2.1 format + *******************************************************************/ +void print_pnr_sdc_regexp_constrain_max_delay(std::fstream& fp, + const std::string& src_instance_name, + const std::string& src_port_name, + const std::string& des_instance_name, + const std::string& des_port_name, + const float& delay) { + /* Validate file stream */ + valid_file_stream(fp); + + fp << "set_max_delay"; + + fp << " -from "; + fp << "[get_pins -regexp \""; + if (!src_instance_name.empty()) { + fp << src_instance_name << "/"; + } + fp << src_port_name; + + fp << "\"]"; + + fp << " -to "; + fp << "[get_pins -regexp \""; + + if (!des_instance_name.empty()) { + fp << des_instance_name << "/"; + } + fp << des_port_name; + + fp << "\"]"; + + fp << " " << std::setprecision(10) << delay; + + fp << std::endl; +} + /******************************************************************** * Constrain a path between two ports of a module with a given minimum timing value *******************************************************************/ diff --git a/openfpga/src/fpga_sdc/sdc_writer_utils.h b/openfpga/src/fpga_sdc/sdc_writer_utils.h index 80f6e97e9..c7a7cd3a1 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_utils.h +++ b/openfpga/src/fpga_sdc/sdc_writer_utils.h @@ -28,6 +28,13 @@ void print_pnr_sdc_constrain_max_delay(std::fstream& fp, const std::string& des_port_name, const float& delay); +void print_pnr_sdc_regexp_constrain_max_delay(std::fstream& fp, + const std::string& src_instance_name, + const std::string& src_port_name, + const std::string& des_instance_name, + const std::string& des_port_name, + const float& delay); + void print_pnr_sdc_constrain_min_delay(std::fstream& fp, const std::string& src_instance_name, const std::string& src_port_name, From d18e924a899e16eab1c279d1c9fd2e07b80d234c Mon Sep 17 00:00:00 2001 From: Xifan Tang Date: Sat, 2 May 2020 18:38:00 -0600 Subject: [PATCH 024/180] Update documentation on new fpga_sdc option --- docs/source/openfpga_shell/openfpga_commands.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/openfpga_shell/openfpga_commands.rst b/docs/source/openfpga_shell/openfpga_commands.rst index 12a1d89c7..d3020e9c1 100644 --- a/docs/source/openfpga_shell/openfpga_commands.rst +++ b/docs/source/openfpga_shell/openfpga_commands.rst @@ -176,6 +176,8 @@ FPGA-SDC - ``--file`` or ``-f`` Specify the output directory for SDC files + - ``--hierarchical`` Output SDC files without full path in hierarchy + - ``--flatten_names`` Use flatten names (no wildcards) in SDC files - ``--constrain_global_port`` Constrain all the global ports of FPGA fabric. From 609115e51f635c86eab258edad976250fa3baede Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 2 May 2020 19:02:35 -0600 Subject: [PATCH 025/180] now hierarchical SDC generation is applicable to CB timing constraints --- .../src/fpga_sdc/pnr_sdc_routing_writer.cpp | 137 ++++++++++++++++-- .../src/fpga_sdc/pnr_sdc_routing_writer.h | 4 + openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 4 + 3 files changed, 133 insertions(+), 12 deletions(-) diff --git a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp index 6f7d77c69..60e756839 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp @@ -298,6 +298,8 @@ void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_di *******************************************************************/ static void print_pnr_sdc_constrain_cb_mux_timing(std::fstream& fp, + const bool& hierarchical, + const std::string& module_path, const ModuleManager& module_manager, const ModuleId& cb_module, const RRGraph& rr_graph, @@ -366,11 +368,22 @@ void print_pnr_sdc_constrain_cb_mux_timing(std::fstream& fp, } /* Constrain a path */ - print_pnr_sdc_constrain_port2port_timing(fp, - module_manager, - cb_module, module_input_port, - cb_module, module_output_port, - switch_delays[module_input_port]); + if (true == hierarchical) { + print_pnr_sdc_constrain_port2port_timing(fp, + module_manager, + cb_module, module_input_port, + cb_module, module_output_port, + switch_delays[module_input_port]); + } else { + VTR_ASSERT_SAFE(false == hierarchical); + print_pnr_sdc_regexp_constrain_max_delay(fp, + std::string(module_path), + generate_sdc_port(module_manager.module_port(cb_module, module_input_port)), + std::string(module_path), + generate_sdc_port(module_manager.module_port(cb_module, module_output_port)), + switch_delays[module_input_port]); + + } } } @@ -380,6 +393,8 @@ void print_pnr_sdc_constrain_cb_mux_timing(std::fstream& fp, *******************************************************************/ static void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, + const bool& hierarchical, + const std::string& module_path, const ModuleManager& module_manager, const RRGraph& rr_graph, const RRGSB& rr_gsb, @@ -443,11 +458,21 @@ void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, } /* Constrain a path with routing segment delay */ - print_pnr_sdc_constrain_port2port_timing(fp, - module_manager, - cb_module, input_port_id, - cb_module, output_port_id, - routing_segment_delay); + if (true == hierarchical) { + print_pnr_sdc_constrain_port2port_timing(fp, + module_manager, + cb_module, input_port_id, + cb_module, output_port_id, + routing_segment_delay); + } else { + VTR_ASSERT_SAFE(false == hierarchical); + print_pnr_sdc_regexp_constrain_max_delay(fp, + std::string(module_path), + generate_sdc_port(module_manager.module_port(cb_module, input_port_id)), + std::string(module_path), + generate_sdc_port(module_manager.module_port(cb_module, output_port_id)), + routing_segment_delay); + } } /* Contrain each multiplexers inside the connection block */ @@ -459,6 +484,7 @@ void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, for (size_t inode = 0; inode < rr_gsb.get_num_ipin_nodes(cb_ipin_side); ++inode) { const RRNodeId& ipin_rr_node = rr_gsb.get_ipin_node(cb_ipin_side, inode); print_pnr_sdc_constrain_cb_mux_timing(fp, + hierarchical, module_path, module_manager, cb_module, rr_graph, rr_gsb, cb_type, ipin_rr_node, @@ -476,7 +502,9 @@ void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, *******************************************************************/ static void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_dir, + const bool& hierarchical, const ModuleManager& module_manager, + const ModuleId& top_module, const RRGraph& rr_graph, const DeviceRRGSB& device_rr_gsb, const t_rr_type& cb_type, @@ -484,6 +512,8 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di /* Build unique X-direction connection block modules */ vtr::Point cb_range = device_rr_gsb.get_gsb_range(); + std::string root_path = module_manager.module_name(top_module); + for (size_t ix = 0; ix < cb_range.x(); ++ix) { for (size_t iy = 0; iy < cb_range.y(); ++iy) { /* Check if the connection block exists in the device! @@ -494,7 +524,26 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di if (false == rr_gsb.is_cb_exist(cb_type)) { continue; } + + /* Find all the cb instance under this module + * Create a regular expression to include these instance names + */ + vtr::Point gsb_coordinate(rr_gsb.get_cb_x(cb_type), rr_gsb.get_cb_y(cb_type)); + std::string cb_instance_name = generate_connection_block_module_name(cb_type, gsb_coordinate); + ModuleId cb_module = module_manager.find_module(cb_instance_name); + VTR_ASSERT(true == module_manager.valid_module_id(cb_module)); + + std::string module_path = root_path + + std::string("\\/") + + std::string("("); + + /* Find all the instances in the top-level module */ + module_path += cb_instance_name; + module_path += std::string(")") + std::string("\\"); + print_pnr_sdc_constrain_cb_timing(sdc_dir, + hierarchical, + module_path, module_manager, rr_graph, rr_gsb, @@ -510,7 +559,9 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di * and print SDC file for each of them *******************************************************************/ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_dir, + const bool& hierarchical, const ModuleManager& module_manager, + const ModuleId& top_module, const RRGraph& rr_graph, const DeviceRRGSB& device_rr_gsb, const bool& constrain_zero_delay_paths) { @@ -518,13 +569,15 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di /* Start time count */ vtr::ScopedStartFinishTimer timer("Write SDC for constrain Connection Block timing for P&R flow"); - print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_dir, module_manager, + print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_dir, hierarchical, + module_manager, top_module, rr_graph, device_rr_gsb, CHANX, constrain_zero_delay_paths); - print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_dir, module_manager, + print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_dir, hierarchical, + module_manager, top_module, rr_graph, device_rr_gsb, CHANY, @@ -536,7 +589,9 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di * This function is designed for compact routing hierarchy *******************************************************************/ void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_dir, + const bool& hierarchical, const ModuleManager& module_manager, + const ModuleId& top_module, const RRGraph& rr_graph, const DeviceRRGSB& device_rr_gsb, const bool& constrain_zero_delay_paths) { @@ -544,10 +599,40 @@ void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_di /* Start time count */ vtr::ScopedStartFinishTimer timer("Write SDC for constrain Connection Block timing for P&R flow"); + std::string root_path = module_manager.module_name(top_module); + /* Print SDC for unique X-direction connection block modules */ for (size_t icb = 0; icb < device_rr_gsb.get_num_cb_unique_module(CHANX); ++icb) { const RRGSB& unique_mirror = device_rr_gsb.get_cb_unique_module(CHANX, icb); + + /* Find all the cb instance under this module + * Create a regular expression to include these instance names + */ + vtr::Point gsb_coordinate(unique_mirror.get_cb_x(CHANX), unique_mirror.get_cb_y(CHANX)); + std::string cb_module_name = generate_connection_block_module_name(CHANX, gsb_coordinate); + ModuleId cb_module = module_manager.find_module(cb_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(cb_module)); + + std::string module_path = root_path + + std::string("\\/") + + std::string("("); + + /* Find all the instances in the top-level module */ + bool first_element = true; + for (const size_t& instance_id : module_manager.child_module_instances(top_module, cb_module)) { + std::string cb_instance_name = module_manager.instance_name(top_module, cb_module, instance_id); + if (false == first_element) { + module_path += std::string("|"); + } + module_path += cb_instance_name; + first_element = false; + } + + module_path += std::string(")") + std::string("\\"); + print_pnr_sdc_constrain_cb_timing(sdc_dir, + hierarchical, + module_path, module_manager, rr_graph, unique_mirror, @@ -558,7 +643,35 @@ void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_di /* Print SDC for unique Y-direction connection block modules */ for (size_t icb = 0; icb < device_rr_gsb.get_num_cb_unique_module(CHANY); ++icb) { const RRGSB& unique_mirror = device_rr_gsb.get_cb_unique_module(CHANY, icb); + + /* Find all the cb instance under this module + * Create a regular expression to include these instance names + */ + vtr::Point gsb_coordinate(unique_mirror.get_cb_x(CHANY), unique_mirror.get_cb_y(CHANY)); + std::string cb_module_name = generate_connection_block_module_name(CHANY, gsb_coordinate); + ModuleId cb_module = module_manager.find_module(cb_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(cb_module)); + + std::string module_path = root_path + + std::string("\\/") + + std::string("("); + + /* Find all the instances in the top-level module */ + bool first_element = true; + for (const size_t& instance_id : module_manager.child_module_instances(top_module, cb_module)) { + std::string cb_instance_name = module_manager.instance_name(top_module, cb_module, instance_id); + if (false == first_element) { + module_path += std::string("|"); + } + module_path += cb_instance_name; + first_element = false; + } + + module_path += std::string(")") + std::string("\\"); + print_pnr_sdc_constrain_cb_timing(sdc_dir, + hierarchical, + module_path, module_manager, rr_graph, unique_mirror, diff --git a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h index aa0d04cbc..a29a7ac56 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h +++ b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h @@ -34,13 +34,17 @@ void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_di const bool& constrain_zero_delay_paths); void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_dir, + const bool& hierarchical, const ModuleManager& module_manager, + const ModuleId& top_module, const RRGraph& rr_graph, const DeviceRRGSB& device_rr_gsb, const bool& constrain_zero_delay_paths); void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_dir, + const bool& hierarchical, const ModuleManager& module_manager, + const ModuleId& top_module, const RRGraph& rr_graph, const DeviceRRGSB& device_rr_gsb, const bool& constrain_zero_delay_paths); diff --git a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp index 4b363d7d7..167ec497b 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp @@ -450,14 +450,18 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, if (true == sdc_options.constrain_cb()) { if (true == compact_routing_hierarchy) { print_pnr_sdc_compact_routing_constrain_cb_timing(sdc_options.sdc_dir(), + sdc_options.hierarchical(), module_manager, + top_module, device_ctx.rr_graph, device_rr_gsb, sdc_options.constrain_zero_delay_paths()); } else { VTR_ASSERT_SAFE (false == compact_routing_hierarchy); print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_options.sdc_dir(), + sdc_options.hierarchical(), module_manager, + top_module, device_ctx.rr_graph, device_rr_gsb, sdc_options.constrain_zero_delay_paths()); From 0e44cf3ea353b78c6d7108c1c867dbb0f26395bf Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 2 May 2020 21:09:00 -0600 Subject: [PATCH 026/180] now SDC to disable routing multiplexer outputs can use wildcards --- openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 34 +++++-- openfpga/src/fpga_sdc/sdc_mux_utils.cpp | 113 +++++++++++++++++++++++ openfpga/src/fpga_sdc/sdc_mux_utils.h | 28 ++++++ 3 files changed, 165 insertions(+), 10 deletions(-) create mode 100644 openfpga/src/fpga_sdc/sdc_mux_utils.cpp create mode 100644 openfpga/src/fpga_sdc/sdc_mux_utils.h diff --git a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp index 167ec497b..c88e3e2ef 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp @@ -29,6 +29,7 @@ #include "sdc_writer_naming.h" #include "sdc_writer_utils.h" #include "sdc_memory_utils.h" +#include "sdc_mux_utils.h" #include "pnr_sdc_global_port.h" #include "pnr_sdc_routing_writer.h" #include "pnr_sdc_grid_writer.h" @@ -80,9 +81,11 @@ void print_pnr_sdc_constrain_configurable_memory_outputs(const std::string& sdc_ *******************************************************************/ static void print_sdc_disable_routing_multiplexer_outputs(const std::string& sdc_dir, + const bool& flatten_names, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const ModuleManager& module_manager) { + const ModuleManager& module_manager, + const ModuleId& top_module) { /* Create the file name for Verilog netlist */ std::string sdc_fname(sdc_dir + std::string(SDC_DISABLE_MUX_OUTPUTS_FILE_NAME)); @@ -112,16 +115,22 @@ void print_sdc_disable_routing_multiplexer_outputs(const std::string& sdc_dir, std::string mux_module_name = generate_mux_subckt_name(circuit_lib, mux_model, find_mux_num_datapath_inputs(circuit_lib, mux_model, mux_graph.num_inputs()), std::string("")); + /* Find the module name in module manager */ ModuleId mux_module = module_manager.find_module(mux_module_name); VTR_ASSERT(true == module_manager.valid_module_id(mux_module)); - - /* Disable the timing for the output ports */ - for (const BasicPort& output_port : module_manager.module_ports_by_type(mux_module, ModuleManager::MODULE_OUTPUT_PORT)) { - fp << "set_disable_timing [get_pins -filter \"name =~ " << output_port.get_name() << "*\" "; - fp << "-of [get_cells -hier -filter \"ref_lib_cell_name == " << mux_module_name << "\"]]" << std::endl; - fp << std::endl; - } + + /* Go recursively in the module manager, + * starting from the top-level module: instance id of the top-level module is 0 by default + * Disable all the outputs of child modules that matches the mux_module id + */ + rec_print_pnr_sdc_disable_routing_multiplexer_outputs(fp, + flatten_names, + module_manager, + top_module, + mux_module, + format_dir_path(module_manager.module_name(top_module))); + } /* Close file handler */ @@ -398,14 +407,19 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, /* Output Design Constraints to disable outputs of memory cells */ if (true == sdc_options.constrain_configurable_memory_outputs()) { - print_pnr_sdc_constrain_configurable_memory_outputs(sdc_options.sdc_dir(), sdc_options.flatten_names(), module_manager, top_module); + print_pnr_sdc_constrain_configurable_memory_outputs(sdc_options.sdc_dir(), + sdc_options.flatten_names(), + module_manager, + top_module); } /* Break loops from Multiplexer Output */ if (true == sdc_options.constrain_routing_multiplexer_outputs()) { print_sdc_disable_routing_multiplexer_outputs(sdc_options.sdc_dir(), + sdc_options.flatten_names(), mux_lib, circuit_lib, - module_manager); + module_manager, + top_module); } /* Break loops from any SB output */ diff --git a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp new file mode 100644 index 000000000..ee30eae9b --- /dev/null +++ b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp @@ -0,0 +1,113 @@ +/******************************************************************** + * Most utilized function used to constrain routing multiplexers in FPGA + * fabric using SDC commands + *******************************************************************/ + +/* Headers from vtrutil library */ +#include "vtr_assert.h" +#include "vtr_log.h" + +/* Headers from openfpgautil library */ +#include "openfpga_wildcard_string.h" +#include "openfpga_digest.h" + +#include "openfpga_naming.h" + +#include "sdc_writer_utils.h" + +#include "sdc_mux_utils.h" + +/* begin namespace openfpga */ +namespace openfpga { + +/******************************************************************** + * Print SDC commands to disable outputs of routing multiplexer modules + * in a given module id + * This function will be executed in a recursive way, + * using a Depth-First Search (DFS) strategy + * It will iterate over all the configurable children under each module + * and print a SDC command to disable its outputs + * + * Note: + * - When flatten_names is true + * this function will not apply any wildcard to names + * - When flatten_names is false + * It will straightforwardly output the instance name and port name + * This function will try to apply wildcard to names + * so that SDC file size can be minimal + *******************************************************************/ +void rec_print_pnr_sdc_disable_routing_multiplexer_outputs(std::fstream& fp, + const bool& flatten_names, + const ModuleManager& module_manager, + const ModuleId& parent_module, + const ModuleId& mux_module, + const std::string& parent_module_path) { + + /* Build wildcard names for the instance names of multiple-instanced-blocks (MIB) + * We will find all the instance names and see there are common prefix + * If so, we can use wildcards + */ + std::map> wildcard_names; + + /* For each child, we will go one level down in priority */ + for (const ModuleId& child_module : module_manager.child_modules(parent_module)) { + + std::string child_module_path = parent_module_path; + + /* Iterate over the child instances*/ + for (const size_t& child_instance : module_manager.child_module_instances(parent_module, child_module)) { + std::string child_instance_name; + if (true == module_manager.instance_name(parent_module, child_module, child_instance).empty()) { + child_instance_name = generate_instance_name(module_manager.module_name(child_module), child_instance); + } else { + child_instance_name = module_manager.instance_name(parent_module, child_module, child_instance); + } + + if (false == flatten_names) { + /* Try to adapt to a wildcard name: replace all the numbers with a wildcard character '*' */ + WildCardString wildcard_str(child_instance_name); + /* If the wildcard name is already in the list, we can skip this + * Otherwise, we have to + * - output this instance + * - record the wildcard name in the map + */ + if ( (0 < wildcard_names.count(child_module)) + && (wildcard_names.at(child_module).end() != std::find(wildcard_names.at(child_module).begin(), + wildcard_names.at(child_module).end(), + wildcard_str.data())) ) { + continue; + } + + child_module_path += wildcard_str.data(); + + wildcard_names[child_module].push_back(wildcard_str.data()); + } else { + child_module_path += child_instance_name; + } + + child_module_path = format_dir_path(child_module_path); + + /* If this is NOT the MUX module we want, we go recursively */ + if (mux_module != child_module) { + rec_print_pnr_sdc_disable_routing_multiplexer_outputs(fp, flatten_names, + module_manager, + child_module, + mux_module, + child_module_path); + continue; + } + + /* Validate file stream */ + valid_file_stream(fp); + + /* Reach here, this is the MUX module we want, disable the outputs */ + for (const BasicPort& output_port : module_manager.module_ports_by_type(mux_module, ModuleManager::MODULE_OUTPUT_PORT)) { + fp << "set_disable_timing "; + fp << child_module_path << output_port.get_name(); + fp << std::endl; + } + } + } +} + +} /* end namespace openfpga */ diff --git a/openfpga/src/fpga_sdc/sdc_mux_utils.h b/openfpga/src/fpga_sdc/sdc_mux_utils.h new file mode 100644 index 000000000..70089aa93 --- /dev/null +++ b/openfpga/src/fpga_sdc/sdc_mux_utils.h @@ -0,0 +1,28 @@ +#ifndef SDC_MUX_UTILS_H +#define SDC_MUX_UTILS_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include +#include +#include "module_manager.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ + +/* begin namespace openfpga */ +namespace openfpga { + +void rec_print_pnr_sdc_disable_routing_multiplexer_outputs(std::fstream& fp, + const bool& flatten_names, + const ModuleManager& module_manager, + const ModuleId& parent_module, + const ModuleId& mux_module, + const std::string& parent_module_path); + + +} /* end namespace openfpga */ + +#endif From 2fbf9c2cfc0c053f8c484470c1a4f265036981a4 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 4 May 2020 12:28:47 -0600 Subject: [PATCH 027/180] change to a higher simulation clock speed to accelerate CI verification. Later, we should place simulation information in another XML so that we can reuse that easily --- openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml | 4 ++-- openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml | 4 ++-- .../k6_N10_intermediate_buffer_40nm_openfpga.xml | 4 ++-- openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml | 4 ++-- .../openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml | 6 +++--- .../k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml | 6 +++--- .../k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml | 6 +++--- .../k6_frac_N10_adder_column_chain_40nm_openfpga.xml | 6 +++--- .../k6_frac_N10_adder_register_chain_40nm_openfpga.xml | 6 +++--- .../k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml | 6 +++--- ..._N10_adder_register_scan_chain_depop50_40nm_openfpga.xml | 6 +++--- ...der_register_scan_chain_depop50_spypad_40nm_openfpga.xml | 6 +++--- .../openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml | 6 +++--- .../k6_frac_N10_local_encoder_40nm_openfpga.xml | 6 +++--- .../openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml | 6 +++--- .../openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml | 6 +++--- .../openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml | 6 +++--- 17 files changed, 47 insertions(+), 47 deletions(-) diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml index 1d48387ed..298e0c0c0 100644 --- a/openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml @@ -195,8 +195,8 @@ - - + + diff --git a/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml index c3385e96c..e6e53d9f6 100644 --- a/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml @@ -195,8 +195,8 @@ - - + + diff --git a/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml index ef1c60a80..b211bd040 100644 --- a/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml @@ -196,8 +196,8 @@ - - + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml index 51e250a8a..9b20ab2a2 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml @@ -227,8 +227,8 @@ - - + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml index ae08c8250..10051a9ca 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml @@ -251,9 +251,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml index eaacadd17..40a451b55 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml @@ -268,9 +268,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml index 441f10ee4..9e608ead9 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml @@ -280,9 +280,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml index 65117d199..79b82375f 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml @@ -251,9 +251,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml index 779880dea..33cfa9e61 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml @@ -254,9 +254,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml index e6f6bdb6c..460c8743e 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml @@ -260,9 +260,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml index 8d2aadaeb..4bb4a24a2 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml @@ -255,9 +255,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml index 4939b2dc0..e1dde16b6 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml @@ -339,9 +339,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml index e305bbc08..ebad2d203 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml @@ -226,9 +226,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml index 201a4be58..b32deb8a9 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml @@ -226,9 +226,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml index 159214507..c980065bb 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml @@ -230,9 +230,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml index 660e9f003..2b42cdced 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml @@ -218,9 +218,9 @@ - - - + + + diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml index d04318510..c26c30f31 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml @@ -217,9 +217,9 @@ - - - + + + From 4083fae41ac24d03d11c76dab940e95b90c8bb05 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 4 May 2020 12:34:54 -0600 Subject: [PATCH 028/180] add new test cases about user-defined simulation settings --- .../k4_N4_40nm_fixed_sim_openfpga.xml | 228 ++++++++++++++++++ .../config/task.conf | 34 +++ 2 files changed, 262 insertions(+) create mode 100644 openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml create mode 100644 openfpga_flow/tasks/openfpga_shell/fixed_simulation_settings/config/task.conf diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml new file mode 100644 index 000000000..677061785 --- /dev/null +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + + + + + 10e-12 5e-12 5e-12 + + + 10e-12 5e-12 5e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openfpga_flow/tasks/openfpga_shell/fixed_simulation_settings/config/task.conf b/openfpga_flow/tasks/openfpga_shell/fixed_simulation_settings/config/task.conf new file mode 100644 index 000000000..4875931e3 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/fixed_simulation_settings/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +#vpr_fpga_verilog_formal_verification_top_netlist= From 47f040822fee04dcc4e2d93639cac53215660014 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 4 May 2020 12:36:06 -0600 Subject: [PATCH 029/180] deploy the tests to CI --- .travis/script.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis/script.sh b/.travis/script.sh index 19da16b8b..675ab4996 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -51,6 +51,9 @@ echo -e "Testing OpenFPGA Shell"; echo -e "Testing configuration chain of a K4N4 FPGA"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/configuration_chain --debug --show_thread_logs +echo -e "Testing user-defined simulation settings: clock frequency and number of cycles"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/fixed_simulation_settings --debug --show_thread_logs + echo -e "Testing Verilog generation for LUTs: a single mode LUT6 FPGA using micro benchmarks"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/lut_design/single_mode --debug --show_thread_logs From 8726c618eb73cefb41bad3743ce1119ccf4a2115 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 12:31:11 -0600 Subject: [PATCH 030/180] add time unit support on SDC generator. Now users can define time_unit thru cmd-line options --- .../libopenfpgautil/src/openfpga_scale.cpp | 183 ++++++++++++++++++ .../libopenfpgautil/src/openfpga_scale.h | 29 +++ openfpga/src/base/openfpga_sdc.cpp | 12 ++ openfpga/src/base/openfpga_sdc_command.cpp | 8 + openfpga/src/fpga_sdc/analysis_sdc_option.cpp | 9 + openfpga/src/fpga_sdc/analysis_sdc_option.h | 3 + openfpga/src/fpga_sdc/analysis_sdc_writer.cpp | 11 +- openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp | 37 +++- openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h | 1 + openfpga/src/fpga_sdc/pnr_sdc_option.cpp | 9 + openfpga/src/fpga_sdc/pnr_sdc_option.h | 3 + .../src/fpga_sdc/pnr_sdc_routing_writer.cpp | 41 +++- .../src/fpga_sdc/pnr_sdc_routing_writer.h | 4 + openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 5 + openfpga/src/fpga_sdc/sdc_writer_utils.cpp | 15 ++ openfpga/src/fpga_sdc/sdc_writer_utils.h | 3 + 16 files changed, 353 insertions(+), 20 deletions(-) create mode 100644 libopenfpga/libopenfpgautil/src/openfpga_scale.cpp create mode 100644 libopenfpga/libopenfpgautil/src/openfpga_scale.h diff --git a/libopenfpga/libopenfpgautil/src/openfpga_scale.cpp b/libopenfpga/libopenfpgautil/src/openfpga_scale.cpp new file mode 100644 index 000000000..9baa753d1 --- /dev/null +++ b/libopenfpga/libopenfpgautil/src/openfpga_scale.cpp @@ -0,0 +1,183 @@ +/******************************************************************** + * This file includes functions that convert time/resistance/capacitance + * units to string or vice versa + *******************************************************************/ +#include + +/* Headers from vtrutil library */ +#include "vtr_assert.h" +#include "vtr_log.h" + +/* Headers from openfpgautil library */ +#include "openfpga_scale.h" + +namespace openfpga { + +/* A small ratio for float number comparison + * If the float number B is in the range of the referance A +/- epsilon + * we regard A == B + * A - A * EPSILON <= B <= A + A * EPSILON + */ +#define EPSILON_RATIO 1e-3 + +bool same_float_number(const float& a, + const float& b, + const float& epsilon) { + /* Always use a positive epsilon */ + if ( (a - a * std::abs(epsilon) <= b) + && (b <= a + a * std::abs(epsilon)) ) { + return true; + } + + return false; +} + +/******************************************************************** + * Convert numeric unit to string: + * - 1e12 -> T + * - 1e9 -> B + * - 1e6 -> M + * - 1e3 -> k + * - 1. -> + * - 1e-3 -> m + * - 1e-6 -> u + * - 1e-9 -> n + * - 1e-12 -> p + * - 1e-15 -> f + * - 1e-18 -> a + *******************************************************************/ +std::string unit_to_string(const float& unit) { + if (true == same_float_number(unit, 1., EPSILON_RATIO)) { + return std::string(); + /* Larger than 1 unit */ + } else if (true == same_float_number(unit, 1e3, EPSILON_RATIO)) { + return std::string("k"); + } else if (true == same_float_number(unit, 1e6, EPSILON_RATIO)) { + return std::string("M"); + } else if (true == same_float_number(unit, 1e9, EPSILON_RATIO)) { + return std::string("B"); + } else if (true == same_float_number(unit, 1e12, EPSILON_RATIO)) { + return std::string("T"); + /* Less than 1 unit */ + } else if (true == same_float_number(unit, 1e-3, EPSILON_RATIO)) { + return std::string("m"); + } else if (true == same_float_number(unit, 1e-6, EPSILON_RATIO)) { + return std::string("u"); + } else if (true == same_float_number(unit, 1e-9, EPSILON_RATIO)) { + return std::string("n"); + } else if (true == same_float_number(unit, 1e-12, EPSILON_RATIO)) { + return std::string("p"); + } else if (true == same_float_number(unit, 1e-15, EPSILON_RATIO)) { + return std::string("f"); + } else if (true == same_float_number(unit, 1e-18, EPSILON_RATIO)) { + return std::string("a"); + } + + /* Invalid unit report error */ + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid unit %g!\nAcceptable units are [1e12|1e9|1e6|1e3|1|1e-3|1e-6|1e-9|1e-12|1e-15|1e-18]\n", + unit); + exit(1); +} + +/******************************************************************** + * Convert numeric time unit to string + * e.g. 1e-12 -> ps + *******************************************************************/ +std::string time_unit_to_string(const float& unit) { + /* For larger than 1 unit, we do not accept */ + if (1e6 < unit) { + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid time unit %g!\nAcceptable units are [1e6|1e3|1|1e-3|1e-6|1e-9|1e-12|1e-15|1e-18]\n", + unit); + exit(1); + } + + return unit_to_string(unit) + std::string("s"); +} + +/******************************************************************** + * Convert string unit to numeric: + * - T -> 1e12 + * - B -> 1e9 + * - M -> 1e6 + * - k -> 1e3 + * - "" -> 1. + * - m -> 1e-3 + * - u -> 1e-6 + * - n -> 1e-9 + * - p -> 1e-12 + * - f -> 1e-15 + * - a -> 1e-18 + *******************************************************************/ +float string_to_unit(const std::string& scale) { + if (true == scale.empty()) { + return 1.; + /* Larger than 1 unit */ + } else if (std::string("T") == scale) { + return 1e12; + } else if (std::string("B") == scale) { + return 1e9; + } else if (std::string("M") == scale) { + return 1e6; + } else if (std::string("k") == scale) { + return 1e3; + /* Less than 1 unit */ + } else if (std::string("m") == scale) { + return 1e-3; + } else if (std::string("u") == scale) { + return 1e-6; + } else if (std::string("n") == scale) { + return 1e-9; + } else if (std::string("p") == scale) { + return 1e-12; + } else if (std::string("f") == scale) { + return 1e-15; + } else if (std::string("a") == scale) { + return 1e-18; + } + + /* Invalid unit report error */ + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid unit %s!\nAcceptable units are [a|f|p|n|u|k|M|B|T] or empty\n", + scale); + exit(1); +} + +/******************************************************************** + * Convert string time unit to numeric + * e.g. ps -> 1e-12 + *******************************************************************/ +float string_to_time_unit(const std::string& scale) { + if ( (1 != scale.length()) + && (2 != scale.length()) ) { + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Time unit (='%s') must contain only one or two characters!\n", + scale); + } + /* The last character must be 's' */ + if ('s' != scale.back()) { + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Time unit (='%s') must end with 's'!\n", + scale); + } + + float unit = 1.; + VTR_ASSERT ( (1 == scale.length()) + || (2 == scale.length()) ); + if (2 == scale.length()) { + unit = string_to_unit(scale.substr(0, 1)); + } + + /* For larger than 1 unit, we do not accept */ + if (1e6 < unit) { + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid time unit %g!\nAcceptable units are [1e6|1e3|1|1e-3|1e-6|1e-9|1e-12|1e-15|1e-18]\n", + unit); + exit(1); + } + + return unit; +} + +} /* namespace openfpga ends */ diff --git a/libopenfpga/libopenfpgautil/src/openfpga_scale.h b/libopenfpga/libopenfpgautil/src/openfpga_scale.h new file mode 100644 index 000000000..197923548 --- /dev/null +++ b/libopenfpga/libopenfpgautil/src/openfpga_scale.h @@ -0,0 +1,29 @@ +#ifndef OPENFPGA_SCALE_H +#define OPENFPGA_SCALE_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include + +/******************************************************************** + * Function declaration + *******************************************************************/ +/* namespace openfpga begins */ +namespace openfpga { + +bool same_float_number(const float& a, + const float& b, + const float& epsilon); + +std::string unit_to_string(const float& unit); + +std::string time_unit_to_string(const float& unit); + +float string_to_unit(const std::string& scale); + +float string_to_time_unit(const std::string& scale); + +} /* namespace openfpga ends */ + +#endif diff --git a/openfpga/src/base/openfpga_sdc.cpp b/openfpga/src/base/openfpga_sdc.cpp index 9fa360cff..d90376839 100644 --- a/openfpga/src/base/openfpga_sdc.cpp +++ b/openfpga/src/base/openfpga_sdc.cpp @@ -9,6 +9,7 @@ #include "command_exit_codes.h" /* Headers from openfpgautil library */ +#include "openfpga_scale.h" #include "openfpga_digest.h" #include "circuit_library_utils.h" @@ -31,6 +32,7 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, CommandOptionId opt_output_dir = cmd.option("file"); CommandOptionId opt_flatten_names = cmd.option("flatten_names"); CommandOptionId opt_hierarchical = cmd.option("hierarchical"); + CommandOptionId opt_time_unit = cmd.option("time_unit"); CommandOptionId opt_constrain_global_port = cmd.option("constrain_global_port"); CommandOptionId opt_constrain_non_clock_global_port = cmd.option("constrain_non_clock_global_port"); CommandOptionId opt_constrain_grid = cmd.option("constrain_grid"); @@ -53,6 +55,11 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, options.set_flatten_names(cmd_context.option_enable(cmd, opt_flatten_names)); options.set_hierarchical(cmd_context.option_enable(cmd, opt_hierarchical)); + + if (true == cmd_context.option_enable(cmd, opt_time_unit)) { + options.set_time_unit(string_to_time_unit(cmd_context.option_value(cmd, opt_time_unit))); + } + options.set_constrain_global_port(cmd_context.option_enable(cmd, opt_constrain_global_port)); options.set_constrain_non_clock_global_port(cmd_context.option_enable(cmd, opt_constrain_non_clock_global_port)); options.set_constrain_grid(cmd_context.option_enable(cmd, opt_constrain_grid)); @@ -100,6 +107,7 @@ int write_analysis_sdc(OpenfpgaContext& openfpga_ctx, CommandOptionId opt_output_dir = cmd.option("file"); CommandOptionId opt_flatten_names = cmd.option("flatten_names"); + CommandOptionId opt_time_unit = cmd.option("time_unit"); /* This is an intermediate data structure which is designed to modularize the FPGA-SDC * Keep it independent from any other outside data structures @@ -113,6 +121,10 @@ int write_analysis_sdc(OpenfpgaContext& openfpga_ctx, options.set_generate_sdc_analysis(true); options.set_flatten_names(cmd_context.option_enable(cmd, opt_flatten_names)); + if (true == cmd_context.option_enable(cmd, opt_time_unit)) { + options.set_time_unit(string_to_time_unit(cmd_context.option_value(cmd, opt_time_unit))); + } + /* Collect global ports from the circuit library: * TODO: should we place this in the OpenFPGA context? */ diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index 479cb8de9..bdf123e8b 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -32,6 +32,10 @@ ShellCommandId add_openfpga_write_pnr_sdc_command(openfpga::Shellinput_edges[iedge]->delay_max); + des_pb_graph_pin->input_edges[iedge]->delay_max / time_unit); } } @@ -161,6 +163,7 @@ void print_pnr_sdc_constrain_pb_pin_interc_timing(std::fstream& fp, *******************************************************************/ static void print_pnr_sdc_constrain_pb_interc_timing(std::fstream& fp, + const float& time_unit, const ModuleManager& module_manager, const ModuleId& parent_module, t_pb_graph_node* des_pb_graph_node, @@ -176,7 +179,8 @@ void print_pnr_sdc_constrain_pb_interc_timing(std::fstream& fp, for (int ipin = 0; ipin < des_pb_graph_node->num_input_pins[iport]; ++ipin) { /* If this is a idle block, we set 0 to the selected edge*/ /* Get the selected edge of current pin*/ - print_pnr_sdc_constrain_pb_pin_interc_timing(fp, + print_pnr_sdc_constrain_pb_pin_interc_timing(fp, + time_unit, module_manager, parent_module, &(des_pb_graph_node->input_pins[iport][ipin]), physical_mode, @@ -189,6 +193,7 @@ void print_pnr_sdc_constrain_pb_interc_timing(std::fstream& fp, for (int iport = 0; iport < des_pb_graph_node->num_output_ports; ++iport) { for (int ipin = 0; ipin < des_pb_graph_node->num_output_pins[iport]; ++ipin) { print_pnr_sdc_constrain_pb_pin_interc_timing(fp, + time_unit, module_manager, parent_module, &(des_pb_graph_node->output_pins[iport][ipin]), physical_mode, @@ -217,6 +222,7 @@ void print_pnr_sdc_constrain_pb_interc_timing(std::fstream& fp, *******************************************************************/ static void print_pnr_sdc_constrain_pb_graph_node_timing(const std::string& sdc_dir, + const float& time_unit, const ModuleManager& module_manager, t_pb_graph_node* parent_pb_graph_node, t_mode* physical_mode, @@ -242,6 +248,9 @@ void print_pnr_sdc_constrain_pb_graph_node_timing(const std::string& sdc_dir, /* Generate the descriptions*/ print_sdc_file_header(fp, std::string("Timing constraints for Grid " + pb_module_name + " in PnR")); + /* Print time unit for the SDC file */ + print_sdc_timescale(fp, time_unit_to_string(time_unit)); + /* We check output_pins of cur_pb_graph_node and its the input_edges * Built the interconnections between outputs of cur_pb_graph_node and outputs of child_pb_graph_node * child_pb_graph_node.output_pins -----------------> cur_pb_graph_node.outpins @@ -250,6 +259,7 @@ void print_pnr_sdc_constrain_pb_graph_node_timing(const std::string& sdc_dir, * input_pins, edges, output_pins */ print_pnr_sdc_constrain_pb_interc_timing(fp, + time_unit, module_manager, pb_module, parent_pb_graph_node, CIRCUIT_PB_PORT_OUTPUT, @@ -268,6 +278,7 @@ void print_pnr_sdc_constrain_pb_graph_node_timing(const std::string& sdc_dir, t_pb_graph_node* child_pb_graph_node = &(parent_pb_graph_node->child_pb_graph_nodes[physical_mode->index][ipb][jpb]); /* For each child_pb_graph_node input pins*/ print_pnr_sdc_constrain_pb_interc_timing(fp, + time_unit, module_manager, pb_module, child_pb_graph_node, CIRCUIT_PB_PORT_INPUT, @@ -291,6 +302,7 @@ void print_pnr_sdc_constrain_pb_graph_node_timing(const std::string& sdc_dir, *******************************************************************/ static void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, + const float& time_unit, const ModuleManager& module_manager, t_pb_graph_node* primitive_pb_graph_node, const bool& constrain_zero_delay_paths) { @@ -350,6 +362,9 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, /* Generate the descriptions*/ print_sdc_file_header(fp, std::string("Timing constraints for Grid " + pb_module_name + " in PnR")); + /* Print time unit for the SDC file */ + print_sdc_timescale(fp, time_unit_to_string(time_unit)); + /* We traverse the pb_graph pins where we can find pin-to-pin timing annotation * We walk through output pins here, build timing constraints by pair each output to input * Clock pins are not walked through because they will be handled by clock tree synthesis @@ -387,7 +402,7 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, generate_sdc_port(src_port), pb_module_name, generate_sdc_port(sink_port), - tmax); + tmax / time_unit); } /* Find min delay between src and sink pin */ @@ -400,7 +415,7 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, generate_sdc_port(src_port), pb_module_name, generate_sdc_port(sink_port), - tmin); + tmin / time_unit); } } } @@ -417,6 +432,7 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, *******************************************************************/ static void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, + const float& time_unit, const ModuleManager& module_manager, const VprDeviceAnnotation& device_annotation, t_pb_graph_node* parent_pb_graph_node, @@ -433,7 +449,9 @@ void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, /* Constrain the primitive node if a timing matrix is defined */ if (true == is_primitive_pb_type(parent_pb_type)) { - print_pnr_sdc_constrain_primitive_pb_graph_node(sdc_dir, module_manager, + print_pnr_sdc_constrain_primitive_pb_graph_node(sdc_dir, + time_unit, + module_manager, parent_pb_graph_node, constrain_zero_delay_paths); return; @@ -446,6 +464,7 @@ void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, /* Write a SDC file for this pb_type */ print_pnr_sdc_constrain_pb_graph_node_timing(sdc_dir, + time_unit, module_manager, parent_pb_graph_node, physical_mode, @@ -455,7 +474,9 @@ void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, * Note that we assume a full hierarchical P&R, we will only visit pb_graph_node of unique pb_type */ for (int ipb = 0; ipb < physical_mode->num_pb_type_children; ++ipb) { - rec_print_pnr_sdc_constrain_pb_graph_timing(sdc_dir, module_manager, + rec_print_pnr_sdc_constrain_pb_graph_timing(sdc_dir, + time_unit, + module_manager, device_annotation, &(parent_pb_graph_node->child_pb_graph_nodes[physical_mode->index][ipb][0]), constrain_zero_delay_paths); @@ -466,6 +487,7 @@ void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, * Top-level function to print timing constraints for pb_types *******************************************************************/ void print_pnr_sdc_constrain_grid_timing(const std::string& sdc_dir, + const float& time_unit, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const ModuleManager& module_manager, @@ -485,7 +507,8 @@ void print_pnr_sdc_constrain_grid_timing(const std::string& sdc_dir, continue; } /* Special for I/O block, generate one module for each border side */ - rec_print_pnr_sdc_constrain_pb_graph_timing(sdc_dir, module_manager, + rec_print_pnr_sdc_constrain_pb_graph_timing(sdc_dir, time_unit, + module_manager, device_annotation, pb_graph_head, constrain_zero_delay_paths); diff --git a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h index 400ca1616..909caff2a 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h +++ b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h @@ -18,6 +18,7 @@ namespace openfpga { void print_pnr_sdc_constrain_grid_timing(const std::string& sdc_dir, + const float& time_unit, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const ModuleManager& module_manager, diff --git a/openfpga/src/fpga_sdc/pnr_sdc_option.cpp b/openfpga/src/fpga_sdc/pnr_sdc_option.cpp index 3b7c417e0..f8ee429f3 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_option.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_option.cpp @@ -13,6 +13,7 @@ PnrSdcOption::PnrSdcOption(const std::string& sdc_dir) { sdc_dir_ = sdc_dir; hierarchical_ = false; flatten_names_ = false; + time_unit_ = 1.; constrain_global_port_ = false; constrain_non_clock_global_port_ = false; constrain_grid_ = false; @@ -39,6 +40,10 @@ bool PnrSdcOption::hierarchical() const { return hierarchical_; } +float PnrSdcOption::time_unit() const { + return time_unit_; +} + bool PnrSdcOption::generate_sdc_pnr() const { return constrain_global_port_ || constrain_grid_ @@ -100,6 +105,10 @@ void PnrSdcOption::set_hierarchical(const bool& hierarchical) { hierarchical_ = hierarchical; } +void PnrSdcOption::set_time_unit(const float& time_unit) { + time_unit_ = time_unit; +} + void PnrSdcOption::set_generate_sdc_pnr(const bool& generate_sdc_pnr) { constrain_global_port_ = generate_sdc_pnr; constrain_grid_ = generate_sdc_pnr; diff --git a/openfpga/src/fpga_sdc/pnr_sdc_option.h b/openfpga/src/fpga_sdc/pnr_sdc_option.h index ff52a75fd..4fe997321 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_option.h +++ b/openfpga/src/fpga_sdc/pnr_sdc_option.h @@ -18,6 +18,7 @@ class PnrSdcOption { std::string sdc_dir() const; bool flatten_names() const; bool hierarchical() const; + float time_unit() const; bool generate_sdc_pnr() const; bool constrain_global_port() const; bool constrain_non_clock_global_port() const; @@ -32,6 +33,7 @@ class PnrSdcOption { void set_sdc_dir(const std::string& sdc_dir); void set_flatten_names(const bool& flatten_names); void set_hierarchical(const bool& hierarchical); + void set_time_unit(const float& time_unit); void set_generate_sdc_pnr(const bool& generate_sdc_pnr); void set_constrain_global_port(const bool& constrain_global_port); void set_constrain_non_clock_global_port(const bool& constrain_non_clock_global_port); @@ -46,6 +48,7 @@ class PnrSdcOption { std::string sdc_dir_; bool flatten_names_; bool hierarchical_; + float time_unit_; bool constrain_global_port_; bool constrain_non_clock_global_port_; bool constrain_grid_; diff --git a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp index 60e756839..e530e7903 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp @@ -16,6 +16,7 @@ #include "vtr_time.h" /* Headers from openfpgautil library */ +#include "openfpga_scale.h" #include "openfpga_port.h" #include "openfpga_side_manager.h" #include "openfpga_digest.h" @@ -49,6 +50,7 @@ float find_pnr_sdc_switch_tmax(const t_rr_switch_inf& switch_inf) { *******************************************************************/ static void print_pnr_sdc_constrain_sb_mux_timing(std::fstream& fp, + const float& time_unit, const bool& hierarchical, const std::string& module_path, const ModuleManager& module_manager, @@ -104,7 +106,7 @@ void print_pnr_sdc_constrain_sb_mux_timing(std::fstream& fp, generate_sdc_port(module_manager.module_port(sb_module, module_input_port)), module_path, generate_sdc_port(module_manager.module_port(sb_module, module_output_port)), - switch_delays[module_input_port]); + switch_delays[module_input_port] / time_unit); } else { VTR_ASSERT_SAFE(true == hierarchical); @@ -112,7 +114,7 @@ void print_pnr_sdc_constrain_sb_mux_timing(std::fstream& fp, module_manager, sb_module, module_input_port, sb_module, module_output_port, - switch_delays[module_input_port]); + switch_delays[module_input_port] / time_unit); } } } @@ -127,6 +129,7 @@ void print_pnr_sdc_constrain_sb_mux_timing(std::fstream& fp, *******************************************************************/ static void print_pnr_sdc_constrain_sb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const std::string& module_path, const ModuleManager& module_manager, @@ -152,6 +155,9 @@ void print_pnr_sdc_constrain_sb_timing(const std::string& sdc_dir, /* Generate the descriptions*/ print_sdc_file_header(fp, std::string("Constrain timing of Switch Block " + sb_module_name + " for PnR")); + /* Print time unit for the SDC file */ + print_sdc_timescale(fp, time_unit_to_string(time_unit)); + for (size_t side = 0; side < rr_gsb.get_num_sides(); ++side) { SideManager side_manager(side); for (size_t itrack = 0; itrack < rr_gsb.get_chan_width(side_manager.get_side()); ++itrack) { @@ -166,6 +172,7 @@ void print_pnr_sdc_constrain_sb_timing(const std::string& sdc_dir, } /* This is a MUX, constrain all the paths from an input to an output */ print_pnr_sdc_constrain_sb_mux_timing(fp, + time_unit, hierarchical, module_path, module_manager, sb_module, @@ -186,6 +193,7 @@ void print_pnr_sdc_constrain_sb_timing(const std::string& sdc_dir, * This function is designed for flatten routing hierarchy *******************************************************************/ void print_pnr_sdc_flatten_routing_constrain_sb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const ModuleManager& module_manager, const ModuleId& top_module, @@ -223,6 +231,7 @@ void print_pnr_sdc_flatten_routing_constrain_sb_timing(const std::string& sdc_di module_path += std::string(")") + std::string("\\"); print_pnr_sdc_constrain_sb_timing(sdc_dir, + time_unit, hierarchical, module_path, module_manager, @@ -238,6 +247,7 @@ void print_pnr_sdc_flatten_routing_constrain_sb_timing(const std::string& sdc_di * This function is designed for compact routing hierarchy *******************************************************************/ void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const ModuleManager& module_manager, const ModuleId& top_module, @@ -283,6 +293,7 @@ void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_di module_path += std::string(")") + std::string("\\"); print_pnr_sdc_constrain_sb_timing(sdc_dir, + time_unit, hierarchical, module_path, module_manager, @@ -298,6 +309,7 @@ void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_di *******************************************************************/ static void print_pnr_sdc_constrain_cb_mux_timing(std::fstream& fp, + const float& time_unit, const bool& hierarchical, const std::string& module_path, const ModuleManager& module_manager, @@ -373,7 +385,7 @@ void print_pnr_sdc_constrain_cb_mux_timing(std::fstream& fp, module_manager, cb_module, module_input_port, cb_module, module_output_port, - switch_delays[module_input_port]); + switch_delays[module_input_port] / time_unit); } else { VTR_ASSERT_SAFE(false == hierarchical); print_pnr_sdc_regexp_constrain_max_delay(fp, @@ -381,7 +393,7 @@ void print_pnr_sdc_constrain_cb_mux_timing(std::fstream& fp, generate_sdc_port(module_manager.module_port(cb_module, module_input_port)), std::string(module_path), generate_sdc_port(module_manager.module_port(cb_module, module_output_port)), - switch_delays[module_input_port]); + switch_delays[module_input_port] / time_unit); } } @@ -393,6 +405,7 @@ void print_pnr_sdc_constrain_cb_mux_timing(std::fstream& fp, *******************************************************************/ static void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const std::string& module_path, const ModuleManager& module_manager, @@ -420,6 +433,9 @@ void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, /* Generate the descriptions*/ print_sdc_file_header(fp, std::string("Constrain timing of Connection Block " + cb_module_name + " for PnR")); + /* Print time unit for the SDC file */ + print_sdc_timescale(fp, time_unit_to_string(time_unit)); + /* Contrain each routing track inside the connection block */ for (size_t itrack = 0; itrack < rr_gsb.get_cb_chan_width(cb_type); ++itrack) { /* Create a port description for the input */ @@ -463,7 +479,7 @@ void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, module_manager, cb_module, input_port_id, cb_module, output_port_id, - routing_segment_delay); + routing_segment_delay / time_unit); } else { VTR_ASSERT_SAFE(false == hierarchical); print_pnr_sdc_regexp_constrain_max_delay(fp, @@ -471,7 +487,7 @@ void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, generate_sdc_port(module_manager.module_port(cb_module, input_port_id)), std::string(module_path), generate_sdc_port(module_manager.module_port(cb_module, output_port_id)), - routing_segment_delay); + routing_segment_delay / time_unit); } } @@ -484,6 +500,7 @@ void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, for (size_t inode = 0; inode < rr_gsb.get_num_ipin_nodes(cb_ipin_side); ++inode) { const RRNodeId& ipin_rr_node = rr_gsb.get_ipin_node(cb_ipin_side, inode); print_pnr_sdc_constrain_cb_mux_timing(fp, + time_unit, hierarchical, module_path, module_manager, cb_module, rr_graph, rr_gsb, cb_type, @@ -502,6 +519,7 @@ void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, *******************************************************************/ static void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const ModuleManager& module_manager, const ModuleId& top_module, @@ -542,6 +560,7 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di module_path += std::string(")") + std::string("\\"); print_pnr_sdc_constrain_cb_timing(sdc_dir, + time_unit, hierarchical, module_path, module_manager, @@ -559,6 +578,7 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di * and print SDC file for each of them *******************************************************************/ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const ModuleManager& module_manager, const ModuleId& top_module, @@ -569,14 +589,16 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di /* Start time count */ vtr::ScopedStartFinishTimer timer("Write SDC for constrain Connection Block timing for P&R flow"); - print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_dir, hierarchical, + print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_dir, time_unit, + hierarchical, module_manager, top_module, rr_graph, device_rr_gsb, CHANX, constrain_zero_delay_paths); - print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_dir, hierarchical, + print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_dir, time_unit, + hierarchical, module_manager, top_module, rr_graph, device_rr_gsb, @@ -589,6 +611,7 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di * This function is designed for compact routing hierarchy *******************************************************************/ void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const ModuleManager& module_manager, const ModuleId& top_module, @@ -631,6 +654,7 @@ void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_di module_path += std::string(")") + std::string("\\"); print_pnr_sdc_constrain_cb_timing(sdc_dir, + time_unit, hierarchical, module_path, module_manager, @@ -670,6 +694,7 @@ void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_di module_path += std::string(")") + std::string("\\"); print_pnr_sdc_constrain_cb_timing(sdc_dir, + time_unit, hierarchical, module_path, module_manager, diff --git a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h index a29a7ac56..d95c03a00 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h +++ b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.h @@ -18,6 +18,7 @@ namespace openfpga { void print_pnr_sdc_flatten_routing_constrain_sb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const ModuleManager& module_manager, const ModuleId& top_module, @@ -26,6 +27,7 @@ void print_pnr_sdc_flatten_routing_constrain_sb_timing(const std::string& sdc_di const bool& constrain_zero_delay_paths); void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const ModuleManager& module_manager, const ModuleId& top_module, @@ -34,6 +36,7 @@ void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_di const bool& constrain_zero_delay_paths); void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const ModuleManager& module_manager, const ModuleId& top_module, @@ -42,6 +45,7 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di const bool& constrain_zero_delay_paths); void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_dir, + const float& time_unit, const bool& hierarchical, const ModuleManager& module_manager, const ModuleId& top_module, diff --git a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp index c88e3e2ef..ae6d3a4b8 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp @@ -442,6 +442,7 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, if (true == sdc_options.constrain_sb()) { if (true == compact_routing_hierarchy) { print_pnr_sdc_compact_routing_constrain_sb_timing(sdc_options.sdc_dir(), + sdc_options.time_unit(), sdc_options.hierarchical(), module_manager, top_module, @@ -451,6 +452,7 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, } else { VTR_ASSERT_SAFE (false == compact_routing_hierarchy); print_pnr_sdc_flatten_routing_constrain_sb_timing(sdc_options.sdc_dir(), + sdc_options.time_unit(), sdc_options.hierarchical(), module_manager, top_module, @@ -464,6 +466,7 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, if (true == sdc_options.constrain_cb()) { if (true == compact_routing_hierarchy) { print_pnr_sdc_compact_routing_constrain_cb_timing(sdc_options.sdc_dir(), + sdc_options.time_unit(), sdc_options.hierarchical(), module_manager, top_module, @@ -473,6 +476,7 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, } else { VTR_ASSERT_SAFE (false == compact_routing_hierarchy); print_pnr_sdc_flatten_routing_constrain_cb_timing(sdc_options.sdc_dir(), + sdc_options.time_unit(), sdc_options.hierarchical(), module_manager, top_module, @@ -485,6 +489,7 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, /* Output Timing constraints for Programmable blocks */ if (true == sdc_options.constrain_grid()) { print_pnr_sdc_constrain_grid_timing(sdc_options.sdc_dir(), + sdc_options.time_unit(), device_ctx, device_annotation, module_manager, diff --git a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp index 13b70fec4..0fcf450ad 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp @@ -38,6 +38,21 @@ void print_sdc_file_header(std::fstream& fp, fp << std::endl; } +/******************************************************************** + * Write a timescale definition in SDC file + *******************************************************************/ +void print_sdc_timescale(std::fstream& fp, + const std::string& timescale) { + + valid_file_stream(fp); + + fp << "#############################################" << std::endl; + fp << "#\tDefine time unit " << std::endl; + fp << "#############################################" << std::endl; + fp << "set_units -time " << timescale << std::endl; + fp << std::endl; +} + /******************************************************************** * Write a port in SDC format *******************************************************************/ diff --git a/openfpga/src/fpga_sdc/sdc_writer_utils.h b/openfpga/src/fpga_sdc/sdc_writer_utils.h index c7a7cd3a1..4b353045b 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_utils.h +++ b/openfpga/src/fpga_sdc/sdc_writer_utils.h @@ -19,6 +19,9 @@ namespace openfpga { void print_sdc_file_header(std::fstream& fp, const std::string& usage); +void print_sdc_timescale(std::fstream& fp, + const std::string& timescale); + std::string generate_sdc_port(const BasicPort& port); void print_pnr_sdc_constrain_max_delay(std::fstream& fp, From ac378febef3c582782db8e307caf091b54c44b25 Mon Sep 17 00:00:00 2001 From: Xifan Tang Date: Tue, 5 May 2020 12:36:01 -0600 Subject: [PATCH 031/180] update doc about time units in SDC generator --- docs/source/openfpga_shell/openfpga_commands.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/openfpga_shell/openfpga_commands.rst b/docs/source/openfpga_shell/openfpga_commands.rst index d3020e9c1..987e8b981 100644 --- a/docs/source/openfpga_shell/openfpga_commands.rst +++ b/docs/source/openfpga_shell/openfpga_commands.rst @@ -180,6 +180,8 @@ FPGA-SDC - ``--flatten_names`` Use flatten names (no wildcards) in SDC files + - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). + - ``--constrain_global_port`` Constrain all the global ports of FPGA fabric. - ``--constrain_non_clock_global_port`` Constrain all the non-clock global ports as clocks ports of FPGA fabric @@ -211,3 +213,5 @@ FPGA-SDC - ``--file`` or ``-f`` Specify the output directory for SDC files - ``--flatten_names`` Use flatten names (no wildcards) in SDC files + + - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). From 98fbcb5410c8c8ccc9d7f60e714c770254d364c5 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 12:43:49 -0600 Subject: [PATCH 032/180] add time unit test for SDC generation to CI --- .travis/script.sh | 3 + .../sdc_time_unit_example_script.openfpga | 61 +++++++++++++++++++ .../sdc_time_unit/config/task.conf | 34 +++++++++++ 3 files changed, 98 insertions(+) create mode 100644 openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga create mode 100644 openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf diff --git a/.travis/script.sh b/.travis/script.sh index 675ab4996..ba4c209a1 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -120,6 +120,9 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/generate_fabric -- echo -e "Testing Verilog testbench generation only"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/generate_testbench --debug --show_thread_logs +echo -e "Testing SDC generation with time units"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/sdc_time_unit --debug --show_thread_logs + # Verify MCNC big20 benchmark suite with ModelSim # Please make sure you have ModelSim installed in the environment # Otherwise, it will fail diff --git a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga new file mode 100644 index 000000000..1d153a4e9 --- /dev/null +++ b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga @@ -0,0 +1,61 @@ +# Run VPR for the 'and' design +#--write_rr_graph example_rr_graph.xml +vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route + +# Read OpenFPGA architecture definition +read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} + +# Annotate the OpenFPGA architecture to VPR data base +# to debug use --verbose options +link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges + +# Check and correct any naming conflicts in the BLIF netlist +check_netlist_naming_conflict --fix --report ./netlist_renaming.xml + +# Apply fix-up to clustering nets based on routing results +pb_pin_fixup --verbose + +# Apply fix-up to Look-Up Table truth tables based on packing results +lut_truth_table_fixup + +# Build the module graph +# - Enabled compression on routing architecture modules +# - Enable pin duplication on grid modules +build_fabric --compress_routing #--verbose + +# Repack the netlist to physical pbs +# This must be done before bitstream generator and testbench generation +# Strongly recommend it is done after all the fix-up have been applied +repack #--verbose + +# Build the bitstream +# - Output the fabric-independent bitstream to a file +build_architecture_bitstream --verbose --file fabric_indepenent_bitstream.xml + +# Build fabric-dependent bitstream +build_fabric_bitstream --verbose + +# Write the Verilog netlist for FPGA fabric +# - Enable the use of explicit port mapping in Verilog netlist +write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --include_signal_init --support_icarus_simulator --print_user_defined_template --verbose + +# Write the Verilog testbench for FPGA fabric +# - We suggest the use of same output directory as fabric Verilog netlists +# - Must specify the reference benchmark file if you want to output any testbenches +# - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA +# - Enable pre-configured top-level testbench which is a fast verification skipping programming phase +# - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini + +# Write the SDC files for PnR backend +# - Turn on every options here +write_pnr_sdc --time_unit ps --file ./SDC + +# Write the SDC to run timing analysis for a mapped FPGA fabric +write_analysis_sdc --time_unit ps --file ./SDC_analysis + +# Finish and exit OpenFPGA +exit + +# Note : +# To run verification at the end of the flow maintain source in ./SRC directory diff --git a/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf b/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf new file mode 100644 index 000000000..1aeaa036f --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +#end_flow_with_test= +#vpr_fpga_verilog_formal_verification_top_netlist= From 0985c720e92381c9456060a6eabc8d2d4aba8b7b Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 13:40:18 -0600 Subject: [PATCH 033/180] remove regexp in SDC generation. --- .../src/fpga_sdc/pnr_sdc_routing_writer.cpp | 103 ++++-------------- 1 file changed, 23 insertions(+), 80 deletions(-) diff --git a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp index e530e7903..de43b7803 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_routing_writer.cpp @@ -101,12 +101,12 @@ void print_pnr_sdc_constrain_sb_mux_timing(std::fstream& fp, } /* Constrain a path */ if (false == hierarchical) { - print_pnr_sdc_regexp_constrain_max_delay(fp, - module_path, - generate_sdc_port(module_manager.module_port(sb_module, module_input_port)), - module_path, - generate_sdc_port(module_manager.module_port(sb_module, module_output_port)), - switch_delays[module_input_port] / time_unit); + print_pnr_sdc_constrain_max_delay(fp, + module_path, + generate_sdc_port(module_manager.module_port(sb_module, module_input_port)), + module_path, + generate_sdc_port(module_manager.module_port(sb_module, module_output_port)), + switch_delays[module_input_port] / time_unit); } else { VTR_ASSERT_SAFE(true == hierarchical); @@ -222,13 +222,7 @@ void print_pnr_sdc_flatten_routing_constrain_sb_timing(const std::string& sdc_di ModuleId sb_module = module_manager.find_module(sb_instance_name); VTR_ASSERT(true == module_manager.valid_module_id(sb_module)); - std::string module_path = root_path - + std::string("\\/") - + std::string("("); - - /* Find all the instances in the top-level module */ - module_path += sb_instance_name; - module_path += std::string(")") + std::string("\\"); + std::string module_path = format_dir_path(root_path) + sb_instance_name; print_pnr_sdc_constrain_sb_timing(sdc_dir, time_unit, @@ -275,22 +269,7 @@ void print_pnr_sdc_compact_routing_constrain_sb_timing(const std::string& sdc_di ModuleId sb_module = module_manager.find_module(sb_module_name); VTR_ASSERT(true == module_manager.valid_module_id(sb_module)); - std::string module_path = root_path - + std::string("\\/") - + std::string("("); - - /* Find all the instances in the top-level module */ - bool first_element = true; - for (const size_t& instance_id : module_manager.child_module_instances(top_module, sb_module)) { - std::string sb_instance_name = module_manager.instance_name(top_module, sb_module, instance_id); - if (false == first_element) { - module_path += std::string("|"); - } - module_path += sb_instance_name; - first_element = false; - } - - module_path += std::string(")") + std::string("\\"); + std::string module_path = format_dir_path(root_path) + sb_module_name; print_pnr_sdc_constrain_sb_timing(sdc_dir, time_unit, @@ -388,12 +367,12 @@ void print_pnr_sdc_constrain_cb_mux_timing(std::fstream& fp, switch_delays[module_input_port] / time_unit); } else { VTR_ASSERT_SAFE(false == hierarchical); - print_pnr_sdc_regexp_constrain_max_delay(fp, - std::string(module_path), - generate_sdc_port(module_manager.module_port(cb_module, module_input_port)), - std::string(module_path), - generate_sdc_port(module_manager.module_port(cb_module, module_output_port)), - switch_delays[module_input_port] / time_unit); + print_pnr_sdc_constrain_max_delay(fp, + std::string(module_path), + generate_sdc_port(module_manager.module_port(cb_module, module_input_port)), + std::string(module_path), + generate_sdc_port(module_manager.module_port(cb_module, module_output_port)), + switch_delays[module_input_port] / time_unit); } } @@ -482,12 +461,12 @@ void print_pnr_sdc_constrain_cb_timing(const std::string& sdc_dir, routing_segment_delay / time_unit); } else { VTR_ASSERT_SAFE(false == hierarchical); - print_pnr_sdc_regexp_constrain_max_delay(fp, - std::string(module_path), - generate_sdc_port(module_manager.module_port(cb_module, input_port_id)), - std::string(module_path), - generate_sdc_port(module_manager.module_port(cb_module, output_port_id)), - routing_segment_delay / time_unit); + print_pnr_sdc_constrain_max_delay(fp, + std::string(module_path), + generate_sdc_port(module_manager.module_port(cb_module, input_port_id)), + std::string(module_path), + generate_sdc_port(module_manager.module_port(cb_module, output_port_id)), + routing_segment_delay / time_unit); } } @@ -551,13 +530,7 @@ void print_pnr_sdc_flatten_routing_constrain_cb_timing(const std::string& sdc_di ModuleId cb_module = module_manager.find_module(cb_instance_name); VTR_ASSERT(true == module_manager.valid_module_id(cb_module)); - std::string module_path = root_path - + std::string("\\/") - + std::string("("); - - /* Find all the instances in the top-level module */ - module_path += cb_instance_name; - module_path += std::string(")") + std::string("\\"); + std::string module_path = format_dir_path(root_path) + cb_instance_name; print_pnr_sdc_constrain_cb_timing(sdc_dir, time_unit, @@ -636,22 +609,7 @@ void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_di ModuleId cb_module = module_manager.find_module(cb_module_name); VTR_ASSERT(true == module_manager.valid_module_id(cb_module)); - std::string module_path = root_path - + std::string("\\/") - + std::string("("); - - /* Find all the instances in the top-level module */ - bool first_element = true; - for (const size_t& instance_id : module_manager.child_module_instances(top_module, cb_module)) { - std::string cb_instance_name = module_manager.instance_name(top_module, cb_module, instance_id); - if (false == first_element) { - module_path += std::string("|"); - } - module_path += cb_instance_name; - first_element = false; - } - - module_path += std::string(")") + std::string("\\"); + std::string module_path = format_dir_path(root_path) + cb_module_name; print_pnr_sdc_constrain_cb_timing(sdc_dir, time_unit, @@ -676,22 +634,7 @@ void print_pnr_sdc_compact_routing_constrain_cb_timing(const std::string& sdc_di ModuleId cb_module = module_manager.find_module(cb_module_name); VTR_ASSERT(true == module_manager.valid_module_id(cb_module)); - std::string module_path = root_path - + std::string("\\/") - + std::string("("); - - /* Find all the instances in the top-level module */ - bool first_element = true; - for (const size_t& instance_id : module_manager.child_module_instances(top_module, cb_module)) { - std::string cb_instance_name = module_manager.instance_name(top_module, cb_module, instance_id); - if (false == first_element) { - module_path += std::string("|"); - } - module_path += cb_instance_name; - first_element = false; - } - - module_path += std::string(")") + std::string("\\"); + std::string module_path = format_dir_path(root_path) + cb_module_name; print_pnr_sdc_constrain_cb_timing(sdc_dir, time_unit, From 6aff33dd35ecc23d258ddfc043c1cac2f8df1a05 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 14:36:27 -0600 Subject: [PATCH 034/180] add fabric hierarchy writer --- .../libopenfpgautil/src/openfpga_digest.cpp | 16 +++ .../libopenfpgautil/src/openfpga_digest.h | 3 + openfpga/src/base/openfpga_build_fabric.cpp | 25 ++++ openfpga/src/base/openfpga_build_fabric.h | 3 + openfpga/src/base/openfpga_setup_command.cpp | 47 ++++++- .../src/fabric/fabric_hierarchy_writer.cpp | 129 ++++++++++++++++++ openfpga/src/fabric/fabric_hierarchy_writer.h | 23 ++++ openfpga/test_script/and_k6_frac.openfpga | 2 + 8 files changed, 245 insertions(+), 3 deletions(-) create mode 100644 openfpga/src/fabric/fabric_hierarchy_writer.cpp create mode 100644 openfpga/src/fabric/fabric_hierarchy_writer.h diff --git a/libopenfpga/libopenfpgautil/src/openfpga_digest.cpp b/libopenfpga/libopenfpgautil/src/openfpga_digest.cpp index 3ae2083df..00cbbe1e3 100644 --- a/libopenfpga/libopenfpgautil/src/openfpga_digest.cpp +++ b/libopenfpga/libopenfpgautil/src/openfpga_digest.cpp @@ -235,4 +235,20 @@ void create_directory(const std::string& dir_path, const bool& recursive) { } } +/******************************************************************** + * Write a number of space to a file + ********************************************************************/ +bool write_space_to_file(std::fstream& fp, + const size_t& num_space) { + if (false == valid_file_stream(fp)) { + return false; + } + + for (size_t i = 0; i < num_space; ++i) { + fp << " "; + } + + return true; +} + } /* namespace openfpga ends */ diff --git a/libopenfpga/libopenfpgautil/src/openfpga_digest.h b/libopenfpga/libopenfpgautil/src/openfpga_digest.h index 0e1cd5d76..a28b2c4d0 100644 --- a/libopenfpga/libopenfpgautil/src/openfpga_digest.h +++ b/libopenfpga/libopenfpgautil/src/openfpga_digest.h @@ -25,6 +25,9 @@ std::string find_path_dir_name(const std::string& file_name); void create_directory(const std::string& dir_path, const bool& recursive = true); +bool write_space_to_file(std::fstream& fp, + const size_t& num_space); + } /* namespace openfpga ends */ #endif diff --git a/openfpga/src/base/openfpga_build_fabric.cpp b/openfpga/src/base/openfpga_build_fabric.cpp index 67203216a..e013ab267 100644 --- a/openfpga/src/base/openfpga_build_fabric.cpp +++ b/openfpga/src/base/openfpga_build_fabric.cpp @@ -11,6 +11,7 @@ #include "device_rr_gsb.h" #include "device_rr_gsb_utils.h" #include "build_device_module.h" +#include "fabric_hierarchy_writer.h" #include "openfpga_build_fabric.h" /* Include global variables of VPR */ @@ -85,4 +86,28 @@ int build_fabric(OpenfpgaContext& openfpga_ctx, return CMD_EXEC_SUCCESS; } +/******************************************************************** + * Build the module graph for FPGA device + *******************************************************************/ +int write_fabric_hierarchy(const OpenfpgaContext& openfpga_ctx, + const Command& cmd, const CommandContext& cmd_context) { + + CommandOptionId opt_verbose = cmd.option("verbose"); + + /* Check the option '--file' is enabled or not + * Actually, it must be enabled as the shell interface will check + * before reaching this fuction + */ + CommandOptionId opt_file = cmd.option("file"); + VTR_ASSERT(true == cmd_context.option_enable(cmd, opt_file)); + VTR_ASSERT(false == cmd_context.option_value(cmd, opt_file).empty()); + + std::string hie_file_name = cmd_context.option_value(cmd, opt_file); + + /* Write hierarchy to a file */ + return write_fabric_hierarchy_to_text_file(openfpga_ctx.module_graph(), + hie_file_name, + cmd_context.option_enable(cmd, opt_verbose)); +} + } /* end namespace openfpga */ diff --git a/openfpga/src/base/openfpga_build_fabric.h b/openfpga/src/base/openfpga_build_fabric.h index 3b63c7ab2..6a090397d 100644 --- a/openfpga/src/base/openfpga_build_fabric.h +++ b/openfpga/src/base/openfpga_build_fabric.h @@ -18,6 +18,9 @@ namespace openfpga { int build_fabric(OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context); +int write_fabric_hierarchy(const OpenfpgaContext& openfpga_ctx, + const Command& cmd, const CommandContext& cmd_context); + } /* end namespace openfpga */ #endif diff --git a/openfpga/src/base/openfpga_setup_command.cpp b/openfpga/src/base/openfpga_setup_command.cpp index 8f4b0cec3..2a3b11227 100644 --- a/openfpga/src/base/openfpga_setup_command.cpp +++ b/openfpga/src/base/openfpga_setup_command.cpp @@ -238,6 +238,37 @@ ShellCommandId add_openfpga_build_fabric_command(openfpga::Shell& shell, + const ShellCommandClassId& cmd_class_id, + const std::vector& dependent_cmds) { + + Command shell_cmd("write_fabric_hierarchy"); + + /* Add an option '--file' */ + CommandOptionId opt_file = shell_cmd.add_option("file", true, "Specify the file name to write the hierarchy to"); + shell_cmd.set_option_short_name(opt_file, "f"); + shell_cmd.set_option_require_value(opt_file, openfpga::OPT_STRING); + + /* Add an option '--verbose' */ + shell_cmd.add_option("verbose", false, "Show verbose outputs"); + + /* Add command 'write_fabric_hierarchy' to the Shell */ + ShellCommandId shell_cmd_id = shell.add_command(shell_cmd, "Write the hierarchy of FPGA fabric graph to a plain-text file"); + shell.set_command_class(shell_cmd_id, cmd_class_id); + shell.set_command_const_execute_function(shell_cmd_id, write_fabric_hierarchy); + + /* Add command dependency to the Shell */ + shell.set_command_dependency(shell_cmd_id, dependent_cmds); + + return shell_cmd_id; +} + void add_openfpga_setup_commands(openfpga::Shell& shell) { /* Get the unique id of 'vpr' command which is to be used in creating the dependency graph */ const ShellCommandId& vpr_cmd_id = shell.command(std::string("vpr")); @@ -317,9 +348,19 @@ void add_openfpga_setup_commands(openfpga::Shell& shell) { /* The 'build_fabric' command should NOT be executed before 'link_openfpga_arch' */ std::vector build_fabric_dependent_cmds; build_fabric_dependent_cmds.push_back(link_arch_cmd_id); - add_openfpga_build_fabric_command(shell, - openfpga_setup_cmd_class, - build_fabric_dependent_cmds); + ShellCommandId build_fabric_cmd_id = add_openfpga_build_fabric_command(shell, + openfpga_setup_cmd_class, + build_fabric_dependent_cmds); + + /******************************** + * Command 'write_fabric_hierarchy' + */ + /* The 'write_fabric_hierarchy' command should NOT be executed before 'build_fabric' */ + std::vector write_fabric_hie_dependent_cmds; + write_fabric_hie_dependent_cmds.push_back(build_fabric_cmd_id); + add_openfpga_write_fabric_hierarchy_command(shell, + openfpga_setup_cmd_class, + write_fabric_hie_dependent_cmds); } } /* end namespace openfpga */ diff --git a/openfpga/src/fabric/fabric_hierarchy_writer.cpp b/openfpga/src/fabric/fabric_hierarchy_writer.cpp new file mode 100644 index 000000000..7b752f015 --- /dev/null +++ b/openfpga/src/fabric/fabric_hierarchy_writer.cpp @@ -0,0 +1,129 @@ +/*************************************************************************************** + * Output internal structure of Module Graph hierarchy to file formats + ***************************************************************************************/ +/* Headers from vtrutil library */ +#include "vtr_log.h" +#include "vtr_assert.h" +#include "vtr_time.h" + +/* Headers from openfpgautil library */ +#include "openfpga_digest.h" + +#include "openfpga_naming.h" + +#include "fabric_hierarchy_writer.h" + +/* begin namespace openfpga */ +namespace openfpga { + +/*************************************************************************************** + * Recursively output child module of the parent_module to a text file + * We use Depth-First Search (DFS) here so that we can output a tree down to leaf first + * Add space (indent) based on the depth in hierarchy + * e.g. depth = 1 means a space as indent + ***************************************************************************************/ +static +int rec_output_module_hierarchy_to_text_file(std::fstream& fp, + const size_t& hie_depth, + const ModuleManager& module_manager, + const ModuleId& parent_module, + const bool& verbose) { + if (false == valid_file_stream(fp)) { + return 2; + } + + /* Iterate over all the child module */ + for (const ModuleId& child_module : module_manager.child_modules(parent_module)) { + if (false == write_space_to_file(fp, hie_depth)) { + return 2; + } + + if (true != module_manager.valid_module_id(child_module)) { + VTR_LOGV_ERROR(verbose, + "Unable to find the child module '%u'!\n", + size_t(child_module)); + return 1; + } + + fp << module_manager.module_name(child_module); + fp << "\n"; + + /* Go to next level */ + int status = rec_output_module_hierarchy_to_text_file(fp, + hie_depth + 1, /* Increment the depth for the next level */ + module_manager, + child_module, + verbose); + if (0 != status) { + return status; + } + } + + return 0; +} + +/*************************************************************************************** + * Write the hierarchy of modules to a plain text file + * e.g., + * + * + * ... + * This file is mainly used by hierarchical P&R flow + * + * Return 0 if successful + * Return 1 if there are more serious bugs in the architecture + * Return 2 if fail when creating files + ***************************************************************************************/ +int write_fabric_hierarchy_to_text_file(const ModuleManager& module_manager, + const std::string& fname, + const bool& verbose) { + std::string timer_message = std::string("Write fabric hierarchy to plain-text file '") + fname + std::string("'"); + + std::string dir_path = format_dir_path(find_path_dir_name(fname)); + + /* Create directories */ + create_directory(dir_path); + + /* Start time count */ + vtr::ScopedStartFinishTimer timer(timer_message); + + /* Use default name if user does not provide one */ + VTR_ASSERT(true != fname.empty()); + + /* Create a file handler*/ + std::fstream fp; + /* Open a file */ + fp.open(fname, std::fstream::out | std::fstream::trunc); + + /* Validate the file stream */ + check_file_stream(fname.c_str(), fp); + + /* Find top-level module */ + std::string top_module_name = generate_fpga_top_module_name(); + ModuleId top_module = module_manager.find_module(top_module_name); + if (true != module_manager.valid_module_id(top_module)) { + VTR_LOGV_ERROR(verbose, + "Unable to find the top-level module '%s'!\n", + top_module_name.c_str()); + return 1; + } + + /* Record current depth of module: top module is the root with 0 depth */ + size_t hie_depth = 0; + + fp << top_module_name << "\n"; + + /* Visit child module recursively and output the hierarchy */ + int err_code = rec_output_module_hierarchy_to_text_file(fp, + hie_depth + 1, /* Start with level 1 */ + module_manager, + top_module, + verbose); + + /* close a file */ + fp.close(); + + return err_code; +} + +} /* end namespace openfpga */ diff --git a/openfpga/src/fabric/fabric_hierarchy_writer.h b/openfpga/src/fabric/fabric_hierarchy_writer.h new file mode 100644 index 000000000..48e112c76 --- /dev/null +++ b/openfpga/src/fabric/fabric_hierarchy_writer.h @@ -0,0 +1,23 @@ +#ifndef FABRIC_HIERARCHY_WRITER_H +#define FABRIC_HIERARCHY_WRITER_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include "vpr_context.h" +#include "openfpga_context.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ + +/* begin namespace openfpga */ +namespace openfpga { + +int write_fabric_hierarchy_to_text_file(const ModuleManager& module_manager, + const std::string& fname, + const bool& verbose); + +} /* end namespace openfpga */ + +#endif diff --git a/openfpga/test_script/and_k6_frac.openfpga b/openfpga/test_script/and_k6_frac.openfpga index 20a75a661..014142fb1 100644 --- a/openfpga/test_script/and_k6_frac.openfpga +++ b/openfpga/test_script/and_k6_frac.openfpga @@ -24,6 +24,8 @@ lut_truth_table_fixup #--verbose # - Enable pin duplication on grid modules build_fabric --compress_routing --duplicate_grid_pin #--verbose +write_fabric_hierarchy --file ./fabric_hierarchy.txt + # Repack the netlist to physical pbs # This must be done before bitstream generator and testbench generation # Strongly recommend it is done after all the fix-up have been applied From 1943929353ad5a70355f62a131f705e5c11ff29b Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 14:38:46 -0600 Subject: [PATCH 035/180] add write_fabric_hierarchy to regression tests --- .../duplicated_grid_pin_example_script.openfpga | 4 ++++ openfpga_flow/OpenFPGAShellScripts/example_script.openfpga | 4 ++++ .../flatten_routing_example_script.openfpga | 4 ++++ .../generate_fabric_example_script.openfpga | 4 ++++ .../generate_testbench_example_script.openfpga | 4 ++++ .../implicit_verilog_example_script.openfpga | 4 ++++ .../OpenFPGAShellScripts/mcnc_example_script.openfpga | 4 ++++ .../sdc_time_unit_example_script.openfpga | 4 ++++ 8 files changed, 32 insertions(+) diff --git a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga index ac808a9a6..1ccd8418d 100644 --- a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga @@ -23,6 +23,10 @@ lut_truth_table_fixup # - Enable pin duplication on grid modules build_fabric --compress_routing #--verbose +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + # Repack the netlist to physical pbs # This must be done before bitstream generator and testbench generation # Strongly recommend it is done after all the fix-up have been applied diff --git a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga index ac808a9a6..1ccd8418d 100644 --- a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga @@ -23,6 +23,10 @@ lut_truth_table_fixup # - Enable pin duplication on grid modules build_fabric --compress_routing #--verbose +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + # Repack the netlist to physical pbs # This must be done before bitstream generator and testbench generation # Strongly recommend it is done after all the fix-up have been applied diff --git a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga index 06a89a4f5..529fc19ae 100644 --- a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga @@ -23,6 +23,10 @@ lut_truth_table_fixup # - Enable pin duplication on grid modules build_fabric #--verbose +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + # Repack the netlist to physical pbs # This must be done before bitstream generator and testbench generation # Strongly recommend it is done after all the fix-up have been applied diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga index 23ed17f59..6514f36b4 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga @@ -17,6 +17,10 @@ check_netlist_naming_conflict --fix --report ./netlist_renaming.xml # - Enable pin duplication on grid modules build_fabric --compress_routing #--verbose +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + # Write the Verilog netlist for FPGA fabric # - Enable the use of explicit port mapping in Verilog netlist write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --include_signal_init --support_icarus_simulator --print_user_defined_template --verbose diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga index 0926935e9..5f7be9ffa 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga @@ -23,6 +23,10 @@ lut_truth_table_fixup # - Enable pin duplication on grid modules build_fabric --compress_routing #--verbose +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + # Repack the netlist to physical pbs # This must be done before bitstream generator and testbench generation # Strongly recommend it is done after all the fix-up have been applied diff --git a/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga index d23534cbe..aa4ea30ad 100644 --- a/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga @@ -23,6 +23,10 @@ lut_truth_table_fixup # - Enable pin duplication on grid modules build_fabric --compress_routing --duplicate_grid_pin #--verbose +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + # Repack the netlist to physical pbs # This must be done before bitstream generator and testbench generation # Strongly recommend it is done after all the fix-up have been applied diff --git a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga index ba086855e..71d3ee294 100644 --- a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga @@ -23,6 +23,10 @@ lut_truth_table_fixup # - Enable pin duplication on grid modules build_fabric --compress_routing #--verbose +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + # Repack the netlist to physical pbs # This must be done before bitstream generator and testbench generation # Strongly recommend it is done after all the fix-up have been applied diff --git a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga index 1d153a4e9..39c4d1c70 100644 --- a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga @@ -23,6 +23,10 @@ lut_truth_table_fixup # - Enable pin duplication on grid modules build_fabric --compress_routing #--verbose +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + # Repack the netlist to physical pbs # This must be done before bitstream generator and testbench generation # Strongly recommend it is done after all the fix-up have been applied From c651df64218961058d03213dcbca9451bd926672 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 15:35:41 -0600 Subject: [PATCH 036/180] add hierarchy writer to SDC generator --- openfpga/src/base/openfpga_sdc.cpp | 3 + openfpga/src/base/openfpga_sdc_command.cpp | 3 + openfpga/src/fpga_sdc/pnr_sdc_option.cpp | 8 + openfpga/src/fpga_sdc/pnr_sdc_option.h | 3 + openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 26 +++ .../src/fpga_sdc/sdc_hierarchy_writer.cpp | 173 ++++++++++++++++++ 6 files changed, 216 insertions(+) create mode 100644 openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp diff --git a/openfpga/src/base/openfpga_sdc.cpp b/openfpga/src/base/openfpga_sdc.cpp index d90376839..d492e653a 100644 --- a/openfpga/src/base/openfpga_sdc.cpp +++ b/openfpga/src/base/openfpga_sdc.cpp @@ -33,6 +33,7 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, CommandOptionId opt_flatten_names = cmd.option("flatten_names"); CommandOptionId opt_hierarchical = cmd.option("hierarchical"); CommandOptionId opt_time_unit = cmd.option("time_unit"); + CommandOptionId opt_output_hierarchy = cmd.option("output_hierarchy"); CommandOptionId opt_constrain_global_port = cmd.option("constrain_global_port"); CommandOptionId opt_constrain_non_clock_global_port = cmd.option("constrain_non_clock_global_port"); CommandOptionId opt_constrain_grid = cmd.option("constrain_grid"); @@ -60,6 +61,8 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, options.set_time_unit(string_to_time_unit(cmd_context.option_value(cmd, opt_time_unit))); } + options.set_output_hierarchy(cmd_context.option_enable(cmd, opt_output_hierarchy)); + options.set_constrain_global_port(cmd_context.option_enable(cmd, opt_constrain_global_port)); options.set_constrain_non_clock_global_port(cmd_context.option_enable(cmd, opt_constrain_non_clock_global_port)); options.set_constrain_grid(cmd_context.option_enable(cmd, opt_constrain_grid)); diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index bdf123e8b..6d58d4ac1 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -32,6 +32,9 @@ ShellCommandId add_openfpga_write_pnr_sdc_command(openfpga::Shell + * / + * ... + * This file is mainly used by hierarchical P&R flow + * + * Return 0 if successful + * Return 1 if there are more serious bugs in the architecture + * Return 2 if fail when creating files + ***************************************************************************************/ +void print_pnr_sdc_routing_sb_hierarchy(const std::string& sdc_dir, + const ModuleManager& module_manager, + const ModuleId& top_module, + const DeviceRRGSB& device_rr_gsb) { + + std::string fname(sdc_dir + std::string("sb_hierarchy.txt")); + + std::string timer_message = std::string("Write Switch Block hierarchy to plain-text file '") + fname + std::string("'"); + + std::string dir_path = format_dir_path(find_path_dir_name(fname)); + + /* Create directories */ + create_directory(dir_path); + + /* Start time count */ + vtr::ScopedStartFinishTimer timer(timer_message); + + /* Use default name if user does not provide one */ + VTR_ASSERT(true != fname.empty()); + + /* Create a file handler*/ + std::fstream fp; + /* Open a file */ + fp.open(fname, std::fstream::out | std::fstream::trunc); + + /* Validate the file stream */ + check_file_stream(fname.c_str(), fp); + + for (size_t isb = 0; isb < device_rr_gsb.get_num_sb_unique_module(); ++isb) { + const RRGSB& rr_gsb = device_rr_gsb.get_sb_unique_module(isb); + if (false == rr_gsb.is_sb_exist()) { + continue; + } + + /* Find all the sb instance under this module + * Create a regular expression to include these instance names + */ + vtr::Point gsb_coordinate(rr_gsb.get_sb_x(), rr_gsb.get_sb_y()); + std::string sb_module_name = generate_switch_block_module_name(gsb_coordinate); + + ModuleId sb_module = module_manager.find_module(sb_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(sb_module)); + + /* Create the file name for SDC */ + std::string sdc_fname(sdc_dir + generate_switch_block_module_name(gsb_coordinate) + std::string(SDC_FILE_NAME_POSTFIX)); + + fp << sdc_fname << "\n"; + + /* Go through all the instance */ + for (const size_t& instance_id : module_manager.child_module_instances(top_module, sb_module)) { + std::string sb_instance_name = module_manager.instance_name(top_module, sb_module, instance_id); + fp << " - "; + fp << sb_module_name << "/" << sb_instance_name << "\n"; + } + + fp << "\n"; + } + + /* close a file */ + fp.close(); +} + +/*************************************************************************************** + * Write the hierarchy of Switch Block module and its instances to a plain text file + * e.g., + * + * / + * ... + * This file is mainly used by hierarchical P&R flow + * + * Return 0 if successful + * Return 1 if there are more serious bugs in the architecture + * Return 2 if fail when creating files + ***************************************************************************************/ +void print_pnr_sdc_routing_cb_hierarchy(const std::string& sdc_dir, + const ModuleManager& module_manager, + const ModuleId& top_module, + const t_rr_type& cb_type, + const DeviceRRGSB& device_rr_gsb) { + + /* TODO: This is dirty, should use constant to handle this */ + std::string fname(sdc_dir); + if (CHANX == cb_type) { + fname += std::string("cbx_hierarchy.txt"); + } else { + VTR_ASSERT(CHANY == cb_type); + fname += std::string("cby_hierarchy.txt"); + } + + std::string timer_message = std::string("Write Connection Block hierarchy to plain-text file '") + fname + std::string("'"); + + std::string dir_path = format_dir_path(find_path_dir_name(fname)); + + /* Create directories */ + create_directory(dir_path); + + /* Start time count */ + vtr::ScopedStartFinishTimer timer(timer_message); + + /* Use default name if user does not provide one */ + VTR_ASSERT(true != fname.empty()); + + /* Create a file handler*/ + std::fstream fp; + /* Open a file */ + fp.open(fname, std::fstream::out | std::fstream::trunc); + + /* Validate the file stream */ + check_file_stream(fname.c_str(), fp); + + /* Print SDC for unique X-direction connection block modules */ + for (size_t icb = 0; icb < device_rr_gsb.get_num_cb_unique_module(cb_type); ++icb) { + const RRGSB& unique_mirror = device_rr_gsb.get_cb_unique_module(cb_type, icb); + + /* Find all the cb instance under this module + * Create a regular expression to include these instance names + */ + vtr::Point gsb_coordinate(unique_mirror.get_cb_x(cb_type), unique_mirror.get_cb_y(cb_type)); + std::string cb_module_name = generate_connection_block_module_name(cb_type, gsb_coordinate); + ModuleId cb_module = module_manager.find_module(cb_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(cb_module)); + + /* Create the file name for SDC */ + std::string sdc_fname(sdc_dir + generate_connection_block_module_name(cb_type, gsb_coordinate) + std::string(SDC_FILE_NAME_POSTFIX)); + + fp << sdc_fname << "\n"; + + /* Go through all the instance */ + for (const size_t& instance_id : module_manager.child_module_instances(top_module, cb_module)) { + std::string cb_instance_name = module_manager.instance_name(top_module, cb_module, instance_id); + fp << " - "; + fp << cb_module_name << "/" << cb_instance_name << "\n"; + } + + fp << "\n"; + } + + /* close a file */ + fp.close(); +} + +} /* end namespace openfpga */ From 17c254a3706323626008da0433f42679052edb38 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 15:36:07 -0600 Subject: [PATCH 037/180] add missing file to follow up the previous commit --- openfpga/src/fpga_sdc/sdc_hierarchy_writer.h | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 openfpga/src/fpga_sdc/sdc_hierarchy_writer.h diff --git a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.h b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.h new file mode 100644 index 000000000..3e7cae5a7 --- /dev/null +++ b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.h @@ -0,0 +1,30 @@ +#ifndef SDC_HIERARCHY_WRITER_H +#define SDC_HIERARCHY_WRITER_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include "vpr_context.h" +#include "openfpga_context.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ + +/* begin namespace openfpga */ +namespace openfpga { + +void print_pnr_sdc_routing_sb_hierarchy(const std::string& sdc_dir, + const ModuleManager& module_manager, + const ModuleId& top_module, + const DeviceRRGSB& device_rr_gsb); + +void print_pnr_sdc_routing_cb_hierarchy(const std::string& sdc_dir, + const ModuleManager& module_manager, + const ModuleId& top_module, + const t_rr_type& cb_type, + const DeviceRRGSB& device_rr_gsb); + +} /* end namespace openfpga */ + +#endif From 752470c2da734d2c69753f883bf6682761575e49 Mon Sep 17 00:00:00 2001 From: Xifan Tang Date: Tue, 5 May 2020 15:50:55 -0600 Subject: [PATCH 038/180] update documentation on write hierarchy command and options --- docs/source/openfpga_shell/openfpga_commands.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/source/openfpga_shell/openfpga_commands.rst b/docs/source/openfpga_shell/openfpga_commands.rst index 987e8b981..296a24a25 100644 --- a/docs/source/openfpga_shell/openfpga_commands.rst +++ b/docs/source/openfpga_shell/openfpga_commands.rst @@ -102,6 +102,15 @@ Setup OpenFPGA .. note:: This is a must-run command before launching FPGA-Verilog, FPGA-Bitstream, FPGA-SDC and FPGA-SPICE +.. option:: write_fabric_hierarchy + + Write the hierarchy of FPGA fabric graph to a plain-text file + + - ``--file`` or ``-f`` Specify the file name to write the hierarchy. + + - ``--verbose`` Show verbose log + + .. note:: This file is designed for hierarchical PnR flow, which requires the tree of Multiple-Instanced-Blocks (MIBs). FPGA-Bitstream ~~~~~~~~~~~~~~ @@ -182,6 +191,10 @@ FPGA-SDC - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). + - ``--output_hierarchy`` Output hierarchy of Multiple-Instance-Blocks(MIBs) to plain text file. This is applied to constrain timing for grids, Switch Blocks and Connection Blocks. + + .. note:: Valid only when ``compress_routing`` is enabled in ``build_fabric`` + - ``--constrain_global_port`` Constrain all the global ports of FPGA fabric. - ``--constrain_non_clock_global_port`` Constrain all the non-clock global ports as clocks ports of FPGA fabric From d9dc7160a7f98efcb3be1a593f01860cf299e853 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 16:14:08 -0600 Subject: [PATCH 039/180] minor fix on the hierarchy writer in SDC generator --- openfpga/src/base/openfpga_sdc_command.cpp | 2 +- openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index 6d58d4ac1..a0f578786 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -36,7 +36,7 @@ ShellCommandId add_openfpga_write_pnr_sdc_command(openfpga::Shell Date: Tue, 5 May 2020 16:40:41 -0600 Subject: [PATCH 040/180] add --depth option to fabric hierarchy writer --- openfpga/src/base/openfpga_build_fabric.cpp | 14 ++++++++++++++ openfpga/src/base/openfpga_setup_command.cpp | 4 ++++ .../src/fabric/fabric_hierarchy_writer.cpp | 19 ++++++++++++++++--- openfpga/src/fabric/fabric_hierarchy_writer.h | 1 + 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/openfpga/src/base/openfpga_build_fabric.cpp b/openfpga/src/base/openfpga_build_fabric.cpp index e013ab267..708bef124 100644 --- a/openfpga/src/base/openfpga_build_fabric.cpp +++ b/openfpga/src/base/openfpga_build_fabric.cpp @@ -102,11 +102,25 @@ int write_fabric_hierarchy(const OpenfpgaContext& openfpga_ctx, VTR_ASSERT(true == cmd_context.option_enable(cmd, opt_file)); VTR_ASSERT(false == cmd_context.option_value(cmd, opt_file).empty()); + /* Default depth requirement, will not stop until the leaf */ + int depth = -1; + CommandOptionId opt_depth = cmd.option("depth"); + if (true == cmd_context.option_enable(cmd, opt_depth)) { + depth = std::atoi(cmd_context.option_value(cmd, opt_depth).c_str()); + /* Error out if we have negative depth */ + if (0 > depth) { + VTR_LOG_ERROR("Invalid depth '%d' which should be 0 or a positive number!\n", + depth); + return CMD_EXEC_FATAL_ERROR; + } + } + std::string hie_file_name = cmd_context.option_value(cmd, opt_file); /* Write hierarchy to a file */ return write_fabric_hierarchy_to_text_file(openfpga_ctx.module_graph(), hie_file_name, + size_t(depth), cmd_context.option_enable(cmd, opt_verbose)); } diff --git a/openfpga/src/base/openfpga_setup_command.cpp b/openfpga/src/base/openfpga_setup_command.cpp index 2a3b11227..8af22e7da 100644 --- a/openfpga/src/base/openfpga_setup_command.cpp +++ b/openfpga/src/base/openfpga_setup_command.cpp @@ -255,6 +255,10 @@ ShellCommandId add_openfpga_write_fabric_hierarchy_command(openfpga::Shell Date: Tue, 5 May 2020 16:44:07 -0600 Subject: [PATCH 041/180] update documentation on the depth option for fabric hierarchy writer --- docs/source/openfpga_shell/openfpga_commands.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/openfpga_shell/openfpga_commands.rst b/docs/source/openfpga_shell/openfpga_commands.rst index 296a24a25..5cd5a8c33 100644 --- a/docs/source/openfpga_shell/openfpga_commands.rst +++ b/docs/source/openfpga_shell/openfpga_commands.rst @@ -108,6 +108,8 @@ Setup OpenFPGA - ``--file`` or ``-f`` Specify the file name to write the hierarchy. + - ``--depth`` Specify at which depth of the fabric module graph should the writer stop outputting. The root module start from depth 0. For example, if you want a two-level hierarchy, you should specify depth as 1. + - ``--verbose`` Show verbose log .. note:: This file is designed for hierarchical PnR flow, which requires the tree of Multiple-Instanced-Blocks (MIBs). From b57a90a6ca98bd5080ff321e840ec70d2b57d4d3 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 20:12:13 -0600 Subject: [PATCH 042/180] add SDC hierarchy writer for grids and now support flatten hierarchy in grid timing constraints --- openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp | 124 +++++++++-- openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h | 2 + openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 18 +- .../src/fpga_sdc/sdc_hierarchy_writer.cpp | 206 +++++++++++++++++- openfpga/src/fpga_sdc/sdc_hierarchy_writer.h | 7 + openfpga/src/fpga_sdc/sdc_writer_naming.h | 5 + 6 files changed, 342 insertions(+), 20 deletions(-) diff --git a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp index f0708cc61..740ba097b 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp @@ -21,7 +21,6 @@ #include "openfpga_digest.h" #include "openfpga_side_manager.h" - #include "openfpga_interconnect_types.h" #include "vpr_utils.h" #include "mux_utils.h" @@ -30,6 +29,7 @@ #include "openfpga_naming.h" #include "pb_type_utils.h" #include "pb_graph_utils.h" +#include "openfpga_physical_tile_utils.h" #include "sdc_writer_naming.h" #include "sdc_writer_utils.h" @@ -45,6 +45,8 @@ namespace openfpga { static void print_pnr_sdc_constrain_pb_pin_interc_timing(std::fstream& fp, const float& time_unit, + const bool& hierarchical, + const std::string& module_path, const ModuleManager& module_manager, const ModuleId& parent_module, t_pb_graph_pin* des_pb_graph_pin, @@ -147,11 +149,22 @@ void print_pnr_sdc_constrain_pb_pin_interc_timing(std::fstream& fp, continue; } + /* Give full path if hierarchical is not enabled */ + std::string src_module_path = src_instance_name; + if (false == hierarchical) { + src_module_path = module_path + src_instance_name; + } + + std::string des_module_path = des_instance_name; + if (false == hierarchical) { + src_module_path = module_path + des_instance_name; + } + /* Print a SDC timing constraint */ print_pnr_sdc_constrain_max_delay(fp, - src_instance_name, + src_module_path, generate_sdc_port(src_port), - des_instance_name, + des_module_path, generate_sdc_port(des_port), des_pb_graph_pin->input_edges[iedge]->delay_max / time_unit); } @@ -164,6 +177,8 @@ void print_pnr_sdc_constrain_pb_pin_interc_timing(std::fstream& fp, static void print_pnr_sdc_constrain_pb_interc_timing(std::fstream& fp, const float& time_unit, + const bool& hierarchical, + const std::string& module_path, const ModuleManager& module_manager, const ModuleId& parent_module, t_pb_graph_node* des_pb_graph_node, @@ -181,6 +196,8 @@ void print_pnr_sdc_constrain_pb_interc_timing(std::fstream& fp, /* Get the selected edge of current pin*/ print_pnr_sdc_constrain_pb_pin_interc_timing(fp, time_unit, + hierarchical, + module_path, module_manager, parent_module, &(des_pb_graph_node->input_pins[iport][ipin]), physical_mode, @@ -194,6 +211,8 @@ void print_pnr_sdc_constrain_pb_interc_timing(std::fstream& fp, for (int ipin = 0; ipin < des_pb_graph_node->num_output_pins[iport]; ++ipin) { print_pnr_sdc_constrain_pb_pin_interc_timing(fp, time_unit, + hierarchical, + module_path, module_manager, parent_module, &(des_pb_graph_node->output_pins[iport][ipin]), physical_mode, @@ -223,6 +242,8 @@ void print_pnr_sdc_constrain_pb_interc_timing(std::fstream& fp, static void print_pnr_sdc_constrain_pb_graph_node_timing(const std::string& sdc_dir, const float& time_unit, + const bool& hierarchical, + const std::string& module_path, const ModuleManager& module_manager, t_pb_graph_node* parent_pb_graph_node, t_mode* physical_mode, @@ -260,6 +281,8 @@ void print_pnr_sdc_constrain_pb_graph_node_timing(const std::string& sdc_dir, */ print_pnr_sdc_constrain_pb_interc_timing(fp, time_unit, + hierarchical, + module_path, module_manager, pb_module, parent_pb_graph_node, CIRCUIT_PB_PORT_OUTPUT, @@ -279,6 +302,8 @@ void print_pnr_sdc_constrain_pb_graph_node_timing(const std::string& sdc_dir, /* For each child_pb_graph_node input pins*/ print_pnr_sdc_constrain_pb_interc_timing(fp, time_unit, + hierarchical, + module_path, module_manager, pb_module, child_pb_graph_node, CIRCUIT_PB_PORT_INPUT, @@ -303,6 +328,8 @@ void print_pnr_sdc_constrain_pb_graph_node_timing(const std::string& sdc_dir, static void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, const float& time_unit, + const bool& hierarchical, + const std::string& module_path, const ModuleManager& module_manager, t_pb_graph_node* primitive_pb_graph_node, const bool& constrain_zero_delay_paths) { @@ -394,13 +421,20 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, /* Find max delay between src and sink pin */ float tmax = sink_pin->input_edges[iedge]->delay_max; + + /* Generate module path in hierarchy depending if the hierarchical is enabled */ + std::string module_hie_path = pb_module_name; + if (false == hierarchical) { + module_hie_path = module_path + pb_module_name; + } + /* If the delay is zero, constrain only when user wants it */ if ( (true == constrain_zero_delay_paths) || (0. == tmax) ) { print_pnr_sdc_constrain_max_delay(fp, - pb_module_name, + module_hie_path, generate_sdc_port(src_port), - pb_module_name, + module_hie_path, generate_sdc_port(sink_port), tmax / time_unit); } @@ -411,9 +445,9 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, if ( (true == constrain_zero_delay_paths) || (0. == tmin) ) { print_pnr_sdc_constrain_min_delay(fp, - pb_module_name, + module_hie_path, generate_sdc_port(src_port), - pb_module_name, + module_hie_path, generate_sdc_port(sink_port), tmin / time_unit); } @@ -433,6 +467,8 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, static void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, const float& time_unit, + const bool& hierarchical, + const std::string& module_path, const ModuleManager& module_manager, const VprDeviceAnnotation& device_annotation, t_pb_graph_node* parent_pb_graph_node, @@ -451,6 +487,8 @@ void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, if (true == is_primitive_pb_type(parent_pb_type)) { print_pnr_sdc_constrain_primitive_pb_graph_node(sdc_dir, time_unit, + hierarchical, + module_path, module_manager, parent_pb_graph_node, constrain_zero_delay_paths); @@ -465,6 +503,8 @@ void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, /* Write a SDC file for this pb_type */ print_pnr_sdc_constrain_pb_graph_node_timing(sdc_dir, time_unit, + hierarchical, + module_path, module_manager, parent_pb_graph_node, physical_mode, @@ -476,6 +516,8 @@ void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, for (int ipb = 0; ipb < physical_mode->num_pb_type_children; ++ipb) { rec_print_pnr_sdc_constrain_pb_graph_timing(sdc_dir, time_unit, + hierarchical, + format_dir_path(module_path + std::string(physical_mode->pb_type_children[ipb].name)), module_manager, device_annotation, &(parent_pb_graph_node->child_pb_graph_nodes[physical_mode->index][ipb][0]), @@ -488,26 +530,80 @@ void rec_print_pnr_sdc_constrain_pb_graph_timing(const std::string& sdc_dir, *******************************************************************/ void print_pnr_sdc_constrain_grid_timing(const std::string& sdc_dir, const float& time_unit, + const bool& hierarchical, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const ModuleManager& module_manager, + const ModuleId& top_module, const bool& constrain_zero_delay_paths) { /* Start time count */ vtr::ScopedStartFinishTimer timer("Write SDC for constraining grid timing for P&R flow"); + std::string root_path = format_dir_path(module_manager.module_name(top_module)); + for (const t_physical_tile_type& physical_tile : device_ctx.physical_tile_types) { /* Bypass empty type or nullptr */ if (true == is_empty_type(&physical_tile)) { continue; - } else { - VTR_ASSERT(1 == physical_tile.equivalent_sites.size()); - t_pb_graph_node* pb_graph_head = physical_tile.equivalent_sites[0]->pb_graph_head; - if (nullptr == pb_graph_head) { - continue; + } + + VTR_ASSERT(1 == physical_tile.equivalent_sites.size()); + t_pb_graph_node* pb_graph_head = physical_tile.equivalent_sites[0]->pb_graph_head; + if (nullptr == pb_graph_head) { + continue; + } + + if (true == is_io_type(&physical_tile)) { + /* Special for I/O block: + * We will search the grids and see where the I/O blocks are located: + * - If a I/O block locates on border sides of FPGA fabric: + * i.e., one or more from {TOP, RIGHT, BOTTOM, LEFT}, + * we will generate one module for each border side + * - If a I/O block locates in the center of FPGA fabric: + * we will generate one module with NUM_SIDES (same treatment as regular grids) + */ + std::set io_type_sides = find_physical_io_tile_located_sides(device_ctx.grid, + &physical_tile); + + + /* Generate the grid module name */ + for (const e_side& io_type_side : io_type_sides) { + std::string grid_module_name = generate_grid_block_module_name(std::string(GRID_MODULE_NAME_PREFIX), + std::string(physical_tile.name), + is_io_type(&physical_tile), + io_type_side); + /* Find the module Id */ + ModuleId grid_module = module_manager.find_module(grid_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(grid_module)); + + std::string module_path = format_dir_path(root_path + grid_module_name); + + rec_print_pnr_sdc_constrain_pb_graph_timing(sdc_dir, + time_unit, + hierarchical, + module_path, + module_manager, + device_annotation, + pb_graph_head, + constrain_zero_delay_paths); } - /* Special for I/O block, generate one module for each border side */ - rec_print_pnr_sdc_constrain_pb_graph_timing(sdc_dir, time_unit, + } else { + /* For CLB and heterogenenous blocks */ + std::string grid_module_name = generate_grid_block_module_name(std::string(GRID_MODULE_NAME_PREFIX), + std::string(physical_tile.name), + is_io_type(&physical_tile), + NUM_SIDES); + /* Find the module Id */ + ModuleId grid_module = module_manager.find_module(grid_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(grid_module)); + + std::string module_path = format_dir_path(root_path + grid_module_name); + + rec_print_pnr_sdc_constrain_pb_graph_timing(sdc_dir, + time_unit, + hierarchical, + module_path, module_manager, device_annotation, pb_graph_head, diff --git a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h index 909caff2a..761bcf94c 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h +++ b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.h @@ -19,9 +19,11 @@ namespace openfpga { void print_pnr_sdc_constrain_grid_timing(const std::string& sdc_dir, const float& time_unit, + const bool& hierarchical, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const ModuleManager& module_manager, + const ModuleId& top_module, const bool& constrain_zero_delay_paths); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp index 0d1b71e5f..3ef29330d 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp @@ -464,7 +464,8 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, } /* Output hierachy to plain text file */ - if ( (true == sdc_options.output_hierarchy()) + if ( (true == sdc_options.constrain_sb()) + && (true == sdc_options.output_hierarchy()) && (true == compact_routing_hierarchy) ) { print_pnr_sdc_routing_sb_hierarchy(sdc_options.sdc_dir(), module_manager, @@ -497,7 +498,8 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, } /* Output hierachy to plain text file */ - if ( (true == sdc_options.output_hierarchy()) + if ( (true == sdc_options.constrain_cb()) + && (true == sdc_options.output_hierarchy()) && (true == compact_routing_hierarchy) ) { print_pnr_sdc_routing_cb_hierarchy(sdc_options.sdc_dir(), module_manager, @@ -516,11 +518,23 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options, if (true == sdc_options.constrain_grid()) { print_pnr_sdc_constrain_grid_timing(sdc_options.sdc_dir(), sdc_options.time_unit(), + sdc_options.hierarchical(), device_ctx, device_annotation, module_manager, + top_module, sdc_options.constrain_zero_delay_paths()); } + + if ( (true == sdc_options.constrain_grid()) + && (true == sdc_options.output_hierarchy()) ) { + print_pnr_sdc_grid_hierarchy(sdc_options.sdc_dir(), + device_ctx, + device_annotation, + module_manager, + top_module); + + } } } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp index aff95ec5b..68cbed4b6 100644 --- a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp +++ b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp @@ -9,8 +9,12 @@ /* Headers from openfpgautil library */ #include "openfpga_digest.h" +#include "openfpga_reserved_words.h" #include "openfpga_naming.h" +#include "pb_type_utils.h" +#include "openfpga_physical_tile_utils.h" + #include "sdc_writer_naming.h" #include "sdc_hierarchy_writer.h" @@ -34,7 +38,7 @@ void print_pnr_sdc_routing_sb_hierarchy(const std::string& sdc_dir, const ModuleId& top_module, const DeviceRRGSB& device_rr_gsb) { - std::string fname(sdc_dir + std::string("sb_hierarchy.txt")); + std::string fname(sdc_dir + std::string(SDC_SB_HIERARCHY_FILE_NAME)); std::string timer_message = std::string("Write Switch Block hierarchy to plain-text file '") + fname + std::string("'"); @@ -109,13 +113,12 @@ void print_pnr_sdc_routing_cb_hierarchy(const std::string& sdc_dir, const t_rr_type& cb_type, const DeviceRRGSB& device_rr_gsb) { - /* TODO: This is dirty, should use constant to handle this */ std::string fname(sdc_dir); if (CHANX == cb_type) { - fname += std::string("cbx_hierarchy.txt"); + fname += std::string(SDC_CBX_HIERARCHY_FILE_NAME); } else { VTR_ASSERT(CHANY == cb_type); - fname += std::string("cby_hierarchy.txt"); + fname += std::string(SDC_CBY_HIERARCHY_FILE_NAME); } std::string timer_message = std::string("Write Connection Block hierarchy to plain-text file '") + fname + std::string("'"); @@ -170,4 +173,199 @@ void print_pnr_sdc_routing_cb_hierarchy(const std::string& sdc_dir, fp.close(); } +/******************************************************************** + * Recursively write the hierarchy of pb_type and its instances to a plain text file + * e.g., + * + * / + * ... + * This file is mainly used by hierarchical P&R flow + *******************************************************************/ +static +void rec_print_pnr_sdc_grid_pb_graph_hierarchy(std::fstream& fp, + const ModuleManager& module_manager, + const ModuleId& parent_pb_module, + const VprDeviceAnnotation& device_annotation, + t_pb_graph_node* parent_pb_graph_node) { + /* Validate the file stream */ + VTR_ASSERT(true == valid_file_stream(fp)); + + /* Validate pb_graph node */ + if (nullptr == parent_pb_graph_node) { + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid parent_pb_graph_node.\n"); + exit(1); + } + + /* Get the pb_type */ + t_pb_type* parent_pb_type = parent_pb_graph_node->pb_type; + + if (true == is_primitive_pb_type(parent_pb_type)) { + return; + } + + std::string pb_module_name = generate_physical_block_module_name(parent_pb_type); + + /* Find the pb module in module manager */ + ModuleId pb_module = module_manager.find_module(pb_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(pb_module)); + + fp << "- " << pb_module_name << "\n"; + + /* Go through all the instance */ + for (const size_t& instance_id : module_manager.child_module_instances(parent_pb_module, pb_module)) { + std::string child_instance_name = module_manager.instance_name(parent_pb_module, pb_module, instance_id); + fp << " "; + fp << "- " << child_instance_name << "\n"; + } + + fp << "\n"; + + /* Note we only go through the graph through the physical modes. + * which we build the modules + */ + t_mode* physical_mode = device_annotation.physical_mode(parent_pb_type); + + /* Go recursively to the lower level in the pb_graph + * Note that we assume a full hierarchical P&R, we will only visit pb_graph_node of unique pb_type + */ + for (int ipb = 0; ipb < physical_mode->num_pb_type_children; ++ipb) { + rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, + module_manager, + pb_module, + device_annotation, + &(parent_pb_graph_node->child_pb_graph_nodes[physical_mode->index][ipb][0])); + } +} + + +/*************************************************************************************** + * Write the hierarchy of grid module and its instances to a plain text file + * e.g., + * + * / + * ... + * This file is mainly used by hierarchical P&R flow + * + * Return 0 if successful + * Return 1 if there are more serious bugs in the architecture + * Return 2 if fail when creating files + ***************************************************************************************/ +void print_pnr_sdc_grid_hierarchy(const std::string& sdc_dir, + const DeviceContext& device_ctx, + const VprDeviceAnnotation& device_annotation, + const ModuleManager& module_manager, + const ModuleId& top_module) { + + std::string fname(sdc_dir + std::string(SDC_GRID_HIERARCHY_FILE_NAME)); + + std::string timer_message = std::string("Write Grid hierarchy to plain-text file '") + fname + std::string("'"); + + std::string dir_path = format_dir_path(find_path_dir_name(fname)); + + /* Create directories */ + create_directory(dir_path); + + /* Start time count */ + vtr::ScopedStartFinishTimer timer(timer_message); + + /* Use default name if user does not provide one */ + VTR_ASSERT(true != fname.empty()); + + /* Create a file handler*/ + std::fstream fp; + /* Open a file */ + fp.open(fname, std::fstream::out | std::fstream::trunc); + + /* Validate the file stream */ + check_file_stream(fname.c_str(), fp); + + std::string root_path = format_dir_path(module_manager.module_name(top_module)); + + for (const t_physical_tile_type& physical_tile : device_ctx.physical_tile_types) { + /* Bypass empty type or nullptr */ + if (true == is_empty_type(&physical_tile)) { + continue; + } + + VTR_ASSERT(1 == physical_tile.equivalent_sites.size()); + t_pb_graph_node* pb_graph_head = physical_tile.equivalent_sites[0]->pb_graph_head; + if (nullptr == pb_graph_head) { + continue; + } + + if (true == is_io_type(&physical_tile)) { + /* Special for I/O block: + * We will search the grids and see where the I/O blocks are located: + * - If a I/O block locates on border sides of FPGA fabric: + * i.e., one or more from {TOP, RIGHT, BOTTOM, LEFT}, + * we will generate one module for each border side + * - If a I/O block locates in the center of FPGA fabric: + * we will generate one module with NUM_SIDES (same treatment as regular grids) + */ + std::set io_type_sides = find_physical_io_tile_located_sides(device_ctx.grid, + &physical_tile); + + + /* Generate the grid module name */ + for (const e_side& io_type_side : io_type_sides) { + std::string grid_module_name = generate_grid_block_module_name(std::string(GRID_MODULE_NAME_PREFIX), + std::string(physical_tile.name), + is_io_type(&physical_tile), + io_type_side); + /* Find the module Id */ + ModuleId grid_module = module_manager.find_module(grid_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(grid_module)); + + fp << "- " << grid_module_name << "\n"; + + /* Go through all the instance */ + for (const size_t& instance_id : module_manager.child_module_instances(top_module, grid_module)) { + std::string grid_instance_name = module_manager.instance_name(top_module, grid_module, instance_id); + fp << " "; + fp << "- " << grid_instance_name << "\n"; + } + + fp << "\n"; + + rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, + module_manager, + grid_module, + device_annotation, + pb_graph_head); + } + } else { + /* For CLB and heterogenenous blocks */ + std::string grid_module_name = generate_grid_block_module_name(std::string(GRID_MODULE_NAME_PREFIX), + std::string(physical_tile.name), + is_io_type(&physical_tile), + NUM_SIDES); + /* Find the module Id */ + ModuleId grid_module = module_manager.find_module(grid_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(grid_module)); + + fp << "- " << grid_module_name << "\n"; + + /* Go through all the instance */ + for (const size_t& instance_id : module_manager.child_module_instances(top_module, grid_module)) { + std::string grid_instance_name = module_manager.instance_name(top_module, grid_module, instance_id); + fp << " "; + fp << "- " << grid_instance_name << "\n"; + } + + fp << "\n"; + + rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, + module_manager, + grid_module, + device_annotation, + pb_graph_head); + } + } + + /* close a file */ + fp.close(); +} + + } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.h b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.h index 3e7cae5a7..eb4aaf9c0 100644 --- a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.h +++ b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.h @@ -25,6 +25,13 @@ void print_pnr_sdc_routing_cb_hierarchy(const std::string& sdc_dir, const t_rr_type& cb_type, const DeviceRRGSB& device_rr_gsb); +void print_pnr_sdc_grid_hierarchy(const std::string& sdc_dir, + const DeviceContext& device_ctx, + const VprDeviceAnnotation& device_annotation, + const ModuleManager& module_manager, + const ModuleId& top_module); + + } /* end namespace openfpga */ #endif diff --git a/openfpga/src/fpga_sdc/sdc_writer_naming.h b/openfpga/src/fpga_sdc/sdc_writer_naming.h index 9783e29f2..17126f98b 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_naming.h +++ b/openfpga/src/fpga_sdc/sdc_writer_naming.h @@ -13,6 +13,11 @@ constexpr char* SDC_DISABLE_MUX_OUTPUTS_FILE_NAME = "disable_routing_multiplexer constexpr char* SDC_DISABLE_SB_OUTPUTS_FILE_NAME = "disable_sb_outputs.sdc"; constexpr char* SDC_CB_FILE_NAME = "cb.sdc"; +constexpr char* SDC_GRID_HIERARCHY_FILE_NAME = "grid_hierarchy.txt"; +constexpr char* SDC_SB_HIERARCHY_FILE_NAME = "sb_hierarchy.txt"; +constexpr char* SDC_CBX_HIERARCHY_FILE_NAME = "cbx_hierarchy.txt"; +constexpr char* SDC_CBY_HIERARCHY_FILE_NAME = "cby_hierarchy.txt"; + constexpr char* SDC_ANALYSIS_FILE_NAME = "fpga_top_analysis.sdc"; } /* end namespace openfpga */ From 55518f4cec765cfab0ed688cfd337f0a2e2efdd1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 5 May 2020 22:31:11 -0600 Subject: [PATCH 043/180] minor fix in the sdc hierarchy writer for grids --- .../src/fpga_sdc/sdc_hierarchy_writer.cpp | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp index 68cbed4b6..3e6b7e8a3 100644 --- a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp +++ b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp @@ -183,6 +183,7 @@ void print_pnr_sdc_routing_cb_hierarchy(const std::string& sdc_dir, *******************************************************************/ static void rec_print_pnr_sdc_grid_pb_graph_hierarchy(std::fstream& fp, + const size_t& depth, const ModuleManager& module_manager, const ModuleId& parent_pb_module, const VprDeviceAnnotation& device_annotation, @@ -200,26 +201,26 @@ void rec_print_pnr_sdc_grid_pb_graph_hierarchy(std::fstream& fp, /* Get the pb_type */ t_pb_type* parent_pb_type = parent_pb_graph_node->pb_type; - if (true == is_primitive_pb_type(parent_pb_type)) { - return; - } - std::string pb_module_name = generate_physical_block_module_name(parent_pb_type); /* Find the pb module in module manager */ ModuleId pb_module = module_manager.find_module(pb_module_name); VTR_ASSERT(true == module_manager.valid_module_id(pb_module)); + write_space_to_file(fp, depth * 2); fp << "- " << pb_module_name << "\n"; /* Go through all the instance */ for (const size_t& instance_id : module_manager.child_module_instances(parent_pb_module, pb_module)) { std::string child_instance_name = module_manager.instance_name(parent_pb_module, pb_module, instance_id); + write_space_to_file(fp, depth * 2); fp << " "; fp << "- " << child_instance_name << "\n"; } - fp << "\n"; + if (true == is_primitive_pb_type(parent_pb_type)) { + return; + } /* Note we only go through the graph through the physical modes. * which we build the modules @@ -230,11 +231,14 @@ void rec_print_pnr_sdc_grid_pb_graph_hierarchy(std::fstream& fp, * Note that we assume a full hierarchical P&R, we will only visit pb_graph_node of unique pb_type */ for (int ipb = 0; ipb < physical_mode->num_pb_type_children; ++ipb) { - rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, - module_manager, - pb_module, - device_annotation, - &(parent_pb_graph_node->child_pb_graph_nodes[physical_mode->index][ipb][0])); + for (int jpb = 0; jpb < physical_mode->pb_type_children[ipb].num_pb; ++jpb) { + rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, + depth + 2, + module_manager, + pb_module, + device_annotation, + &(parent_pb_graph_node->child_pb_graph_nodes[physical_mode->index][ipb][jpb])); + } } } @@ -324,15 +328,16 @@ void print_pnr_sdc_grid_hierarchy(const std::string& sdc_dir, std::string grid_instance_name = module_manager.instance_name(top_module, grid_module, instance_id); fp << " "; fp << "- " << grid_instance_name << "\n"; - } + rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, + 2, + module_manager, + grid_module, + device_annotation, + pb_graph_head); + } fp << "\n"; - rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, - module_manager, - grid_module, - device_annotation, - pb_graph_head); } } else { /* For CLB and heterogenenous blocks */ @@ -351,15 +356,17 @@ void print_pnr_sdc_grid_hierarchy(const std::string& sdc_dir, std::string grid_instance_name = module_manager.instance_name(top_module, grid_module, instance_id); fp << " "; fp << "- " << grid_instance_name << "\n"; + + rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, + 2, + module_manager, + grid_module, + device_annotation, + pb_graph_head); } fp << "\n"; - rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, - module_manager, - grid_module, - device_annotation, - pb_graph_head); } } From b167c859801c468634f9a1399026de120a2e3919 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 6 May 2020 11:01:49 -0600 Subject: [PATCH 044/180] fully expand grid hierarchy in SDC writer --- .../src/fpga_sdc/sdc_hierarchy_writer.cpp | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp index 3e6b7e8a3..f4730b350 100644 --- a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp +++ b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp @@ -216,30 +216,30 @@ void rec_print_pnr_sdc_grid_pb_graph_hierarchy(std::fstream& fp, write_space_to_file(fp, depth * 2); fp << " "; fp << "- " << child_instance_name << "\n"; - } - if (true == is_primitive_pb_type(parent_pb_type)) { - return; - } - - /* Note we only go through the graph through the physical modes. - * which we build the modules - */ - t_mode* physical_mode = device_annotation.physical_mode(parent_pb_type); - - /* Go recursively to the lower level in the pb_graph - * Note that we assume a full hierarchical P&R, we will only visit pb_graph_node of unique pb_type - */ - for (int ipb = 0; ipb < physical_mode->num_pb_type_children; ++ipb) { - for (int jpb = 0; jpb < physical_mode->pb_type_children[ipb].num_pb; ++jpb) { - rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, - depth + 2, - module_manager, - pb_module, - device_annotation, - &(parent_pb_graph_node->child_pb_graph_nodes[physical_mode->index][ipb][jpb])); + if (true == is_primitive_pb_type(parent_pb_type)) { + return; } - } + + /* Note we only go through the graph through the physical modes. + * which we build the modules + */ + t_mode* physical_mode = device_annotation.physical_mode(parent_pb_type); + + /* Go recursively to the lower level in the pb_graph + * Note that we assume a full hierarchical P&R, we will only visit pb_graph_node of unique pb_type + */ + for (int ipb = 0; ipb < physical_mode->num_pb_type_children; ++ipb) { + for (int jpb = 0; jpb < physical_mode->pb_type_children[ipb].num_pb; ++jpb) { + rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, + depth + 2, + module_manager, + pb_module, + device_annotation, + &(parent_pb_graph_node->child_pb_graph_nodes[physical_mode->index][ipb][jpb])); + } + } + } } From cc6d98887281636fdd3cacfb95bb1590632eccc1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 6 May 2020 14:31:56 -0600 Subject: [PATCH 045/180] bug fix in grid SDC generator --- openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp index 740ba097b..009b834fe 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp @@ -94,7 +94,7 @@ void print_pnr_sdc_constrain_pb_pin_interc_timing(std::fstream& fp, * If des module is not the parent module, it is a child module. * We should find the instance id */ - std::string src_instance_name = src_module_name; + std::string src_instance_name; if (parent_module != src_module) { src_instance_name = module_manager.module_name(parent_module) + std::string("/"); /* Instance id is actually the placement index */ @@ -124,7 +124,7 @@ void print_pnr_sdc_constrain_pb_pin_interc_timing(std::fstream& fp, * If des module is not the parent module, it is a child module. * We should find the instance id */ - std::string des_instance_name = des_module_name; + std::string des_instance_name; if (parent_module != des_module) { des_instance_name = module_manager.module_name(parent_module) + std::string("/"); /* Instance id is actually the placement index */ @@ -152,12 +152,18 @@ void print_pnr_sdc_constrain_pb_pin_interc_timing(std::fstream& fp, /* Give full path if hierarchical is not enabled */ std::string src_module_path = src_instance_name; if (false == hierarchical) { + if (true == src_instance_name.empty()) { + src_instance_name = generate_instance_name(src_module_name, 0); + } src_module_path = module_path + src_instance_name; } std::string des_module_path = des_instance_name; if (false == hierarchical) { - src_module_path = module_path + des_instance_name; + if (true == des_instance_name.empty()) { + des_instance_name = generate_instance_name(des_module_name, 0); + } + des_module_path = module_path + des_instance_name; } /* Print a SDC timing constraint */ From 10e1a4b2fea6a6829c1863fb6843b93721b8f510 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 6 May 2020 14:51:51 -0600 Subject: [PATCH 046/180] format fix in the fabric hierarchy and grid SDC hierarchy to be complaint to YAML format --- .../src/fabric/fabric_hierarchy_writer.cpp | 13 +++++++++++-- .../src/fpga_sdc/sdc_hierarchy_writer.cpp | 19 +++++++++++-------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/openfpga/src/fabric/fabric_hierarchy_writer.cpp b/openfpga/src/fabric/fabric_hierarchy_writer.cpp index 959c1fa5f..a40bfee39 100644 --- a/openfpga/src/fabric/fabric_hierarchy_writer.cpp +++ b/openfpga/src/fabric/fabric_hierarchy_writer.cpp @@ -40,7 +40,7 @@ int rec_output_module_hierarchy_to_text_file(std::fstream& fp, /* Iterate over all the child module */ for (const ModuleId& child_module : module_manager.child_modules(parent_module)) { - if (false == write_space_to_file(fp, current_hie_depth)) { + if (false == write_space_to_file(fp, current_hie_depth * 2)) { return 2; } @@ -51,7 +51,16 @@ int rec_output_module_hierarchy_to_text_file(std::fstream& fp, return 1; } + fp << "- "; fp << module_manager.module_name(child_module); + + /* If this is the leaf node, we leave a new line + * Otherwise, we will leave a ':' to be compatible to YAML file format + */ + if ( (0 != module_manager.child_modules(child_module).size()) + && (hie_depth_to_stop >= current_hie_depth + 1) ) { + fp << ":"; + } fp << "\n"; /* Go to next level */ @@ -123,7 +132,7 @@ int write_fabric_hierarchy_to_text_file(const ModuleManager& module_manager, return 0; } - fp << top_module_name << "\n"; + fp << top_module_name << ":" << "\n"; /* Visit child module recursively and output the hierarchy */ int err_code = rec_output_module_hierarchy_to_text_file(fp, diff --git a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp index f4730b350..2c47aec2f 100644 --- a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp +++ b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp @@ -79,7 +79,7 @@ void print_pnr_sdc_routing_sb_hierarchy(const std::string& sdc_dir, /* Create the file name for SDC */ std::string sdc_fname(sdc_dir + generate_switch_block_module_name(gsb_coordinate) + std::string(SDC_FILE_NAME_POSTFIX)); - fp << "- " << sb_module_name << "\n"; + fp << "- " << sb_module_name << ":" << "\n"; /* Go through all the instance */ for (const size_t& instance_id : module_manager.child_module_instances(top_module, sb_module)) { @@ -163,7 +163,7 @@ void print_pnr_sdc_routing_cb_hierarchy(const std::string& sdc_dir, for (const size_t& instance_id : module_manager.child_module_instances(top_module, cb_module)) { std::string cb_instance_name = module_manager.instance_name(top_module, cb_module, instance_id); fp << " "; - fp << "- " << cb_instance_name << "\n"; + fp << "- " << cb_instance_name << ":" << "\n"; } fp << "\n"; @@ -208,18 +208,21 @@ void rec_print_pnr_sdc_grid_pb_graph_hierarchy(std::fstream& fp, VTR_ASSERT(true == module_manager.valid_module_id(pb_module)); write_space_to_file(fp, depth * 2); - fp << "- " << pb_module_name << "\n"; + fp << "- " << pb_module_name << ":" << "\n"; /* Go through all the instance */ for (const size_t& instance_id : module_manager.child_module_instances(parent_pb_module, pb_module)) { std::string child_instance_name = module_manager.instance_name(parent_pb_module, pb_module, instance_id); write_space_to_file(fp, depth * 2); fp << " "; - fp << "- " << child_instance_name << "\n"; + fp << "- " << child_instance_name; if (true == is_primitive_pb_type(parent_pb_type)) { + fp << "\n"; return; } + + fp << ":" << "\n"; /* Note we only go through the graph through the physical modes. * which we build the modules @@ -321,13 +324,13 @@ void print_pnr_sdc_grid_hierarchy(const std::string& sdc_dir, ModuleId grid_module = module_manager.find_module(grid_module_name); VTR_ASSERT(true == module_manager.valid_module_id(grid_module)); - fp << "- " << grid_module_name << "\n"; + fp << "- " << grid_module_name << ":" << "\n"; /* Go through all the instance */ for (const size_t& instance_id : module_manager.child_module_instances(top_module, grid_module)) { std::string grid_instance_name = module_manager.instance_name(top_module, grid_module, instance_id); fp << " "; - fp << "- " << grid_instance_name << "\n"; + fp << "- " << grid_instance_name << ":" << "\n"; rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, 2, @@ -349,13 +352,13 @@ void print_pnr_sdc_grid_hierarchy(const std::string& sdc_dir, ModuleId grid_module = module_manager.find_module(grid_module_name); VTR_ASSERT(true == module_manager.valid_module_id(grid_module)); - fp << "- " << grid_module_name << "\n"; + fp << "- " << grid_module_name << ":" << "\n"; /* Go through all the instance */ for (const size_t& instance_id : module_manager.child_module_instances(top_module, grid_module)) { std::string grid_instance_name = module_manager.instance_name(top_module, grid_module, instance_id); fp << " "; - fp << "- " << grid_instance_name << "\n"; + fp << "- " << grid_instance_name << ":" << "\n"; rec_print_pnr_sdc_grid_pb_graph_hierarchy(fp, 2, From 99fa51cb49d9a7089fd62b3f7018c3a1c187afc5 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 6 May 2020 14:56:04 -0600 Subject: [PATCH 047/180] bug fixed in the SDC CB hierarchy writer --- openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp index 2c47aec2f..49214aaa3 100644 --- a/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp +++ b/openfpga/src/fpga_sdc/sdc_hierarchy_writer.cpp @@ -157,13 +157,13 @@ void print_pnr_sdc_routing_cb_hierarchy(const std::string& sdc_dir, /* Create the file name for SDC */ std::string sdc_fname(sdc_dir + generate_connection_block_module_name(cb_type, gsb_coordinate) + std::string(SDC_FILE_NAME_POSTFIX)); - fp << "- " << cb_module_name << "\n"; + fp << "- " << cb_module_name << ":" << "\n"; /* Go through all the instance */ for (const size_t& instance_id : module_manager.child_module_instances(top_module, cb_module)) { std::string cb_instance_name = module_manager.instance_name(top_module, cb_module, instance_id); fp << " "; - fp << "- " << cb_instance_name << ":" << "\n"; + fp << "- " << cb_instance_name << "\n"; } fp << "\n"; From 84d24ad075c9dd0e29e14f025250d4061aead299 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 6 May 2020 15:05:41 -0600 Subject: [PATCH 048/180] bug fix in pnr sdc grid writer for module paths in hierarchical view --- openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp | 2 -- openfpga/test_script/and_k6_frac.openfpga | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp index 009b834fe..26949ec29 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp @@ -96,7 +96,6 @@ void print_pnr_sdc_constrain_pb_pin_interc_timing(std::fstream& fp, */ std::string src_instance_name; if (parent_module != src_module) { - src_instance_name = module_manager.module_name(parent_module) + std::string("/"); /* Instance id is actually the placement index */ size_t instance_id = src_pb_graph_node->placement_index; if (true == module_manager.instance_name(parent_module, src_module, instance_id).empty()) { @@ -126,7 +125,6 @@ void print_pnr_sdc_constrain_pb_pin_interc_timing(std::fstream& fp, */ std::string des_instance_name; if (parent_module != des_module) { - des_instance_name = module_manager.module_name(parent_module) + std::string("/"); /* Instance id is actually the placement index */ size_t instance_id = des_pb_graph_node->placement_index; if (true == module_manager.instance_name(parent_module, des_module, instance_id).empty()) { diff --git a/openfpga/test_script/and_k6_frac.openfpga b/openfpga/test_script/and_k6_frac.openfpga index 014142fb1..90f20b2b7 100644 --- a/openfpga/test_script/and_k6_frac.openfpga +++ b/openfpga/test_script/and_k6_frac.openfpga @@ -52,6 +52,7 @@ write_verilog_testbench --file /var/tmp/xtang/openfpga_test_src/SRC --reference_ # Write the SDC files for PnR backend # - Turn on every options here +write_pnr_sdc --hierarchical --file /var/tmp/xtang/openfpga_test_src/SDC_hie write_pnr_sdc --file /var/tmp/xtang/openfpga_test_src/SDC # Write the SDC to run timing analysis for a mapped FPGA fabric From b8a79c563d70927b622018cfc6c3788b91db386d Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 6 May 2020 16:08:40 -0600 Subject: [PATCH 049/180] bug fix in the SDC port generation --- openfpga/src/fpga_sdc/sdc_memory_utils.cpp | 9 +++------ openfpga/src/fpga_sdc/sdc_writer_utils.cpp | 7 +------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/openfpga/src/fpga_sdc/sdc_memory_utils.cpp b/openfpga/src/fpga_sdc/sdc_memory_utils.cpp index 07b7d0804..c9459ebaf 100644 --- a/openfpga/src/fpga_sdc/sdc_memory_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_memory_utils.cpp @@ -100,12 +100,9 @@ void rec_print_pnr_sdc_disable_configurable_memory_module_output(std::fstream& f /* Disable timing for each output port of this module */ for (const BasicPort& output_port : module_manager.module_ports_by_type(parent_module, ModuleManager::MODULE_OUTPUT_PORT)) { - for (const size_t& pin : output_port.pins()) { - BasicPort output_pin(output_port.get_name(), pin, pin); - fp << "set_disable_timing "; - fp << parent_module_path << generate_sdc_port(output_pin); - fp << std::endl; - } + fp << "set_disable_timing "; + fp << parent_module_path << output_port.get_name(); + fp << std::endl; } } diff --git a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp index 0fcf450ad..85ff6edcb 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp @@ -71,12 +71,7 @@ std::string generate_sdc_port(const BasicPort& port) { * */ if (1 == port.get_width()) { - if (0 != port.get_lsb()) { - size_str = "[" + std::to_string(port.get_lsb()) + "]"; - } else { - VTR_ASSERT(0 == port.get_lsb()); - size_str.clear(); - } + size_str = "[" + std::to_string(port.get_lsb()) + "]"; } sdc_line = port.get_name() + size_str; From 05d276097e71d04483fab47c75740ce874067e14 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 6 May 2020 16:20:04 -0600 Subject: [PATCH 050/180] critical bug fixed in openfpga shell so that our command parse results should be reset each time before parsing a line --- libopenfpga/libopenfpgashell/src/command_context.cpp | 5 +++++ libopenfpga/libopenfpgashell/src/command_context.h | 2 ++ libopenfpga/libopenfpgashell/src/shell.tpp | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/libopenfpga/libopenfpgashell/src/command_context.cpp b/libopenfpga/libopenfpgashell/src/command_context.cpp index ee7c684d6..24593a77b 100644 --- a/libopenfpga/libopenfpgashell/src/command_context.cpp +++ b/libopenfpga/libopenfpgashell/src/command_context.cpp @@ -66,4 +66,9 @@ void CommandContext::set_option_value(const Command& command, option_values_[option_id] = value; } +void CommandContext::reset() { + std::fill(option_enabled_.begin(), option_enabled_.end(), false); + std::fill(option_values_.begin(), option_values_.end(), std::string()); +} + } /* End namespace openfpga */ diff --git a/libopenfpga/libopenfpgashell/src/command_context.h b/libopenfpga/libopenfpgashell/src/command_context.h index 2300888cf..5f3fb8856 100644 --- a/libopenfpga/libopenfpgashell/src/command_context.h +++ b/libopenfpga/libopenfpgashell/src/command_context.h @@ -43,6 +43,8 @@ class CommandContext { const CommandOptionId& option_id, const bool& status); void set_option_value(const Command& command, const CommandOptionId& option_id, const std::string& value); + /* Reset the command context to initial state */ + void reset(); private: /* Internal data */ /* Identify if the option is enabled or not */ vtr::vector option_enabled_; diff --git a/libopenfpga/libopenfpgashell/src/shell.tpp b/libopenfpga/libopenfpgashell/src/shell.tpp index 05f760e59..b5c506d42 100644 --- a/libopenfpga/libopenfpgashell/src/shell.tpp +++ b/libopenfpga/libopenfpgashell/src/shell.tpp @@ -473,6 +473,10 @@ int Shell::execute_command(const char* cmd_line, return command_status_[cmd_id]; } + /* Reset the command parse results to initial status + * Avoid conflict when calling the same command in the second time + */ + command_contexts_[cmd_id].reset(); if (false == parse_command(tokens, commands_[cmd_id], command_contexts_[cmd_id])) { /* Echo the command */ print_command_options(commands_[cmd_id]); From 8d2360a7101588fc1a923468a7a31746cfa1f21f Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 9 May 2020 19:01:41 -0600 Subject: [PATCH 051/180] simplify include_netlist.v --- openfpga/src/base/openfpga_verilog.cpp | 3 +- openfpga/src/fpga_verilog/verilog_api.cpp | 9 ++-- openfpga/src/fpga_verilog/verilog_api.h | 3 +- .../verilog_auxiliary_netlists.cpp | 41 ++----------------- .../fpga_verilog/verilog_auxiliary_netlists.h | 6 +-- 5 files changed, 10 insertions(+), 52 deletions(-) diff --git a/openfpga/src/base/openfpga_verilog.cpp b/openfpga/src/base/openfpga_verilog.cpp index 9a877c9f2..1d47055df 100644 --- a/openfpga/src/base/openfpga_verilog.cpp +++ b/openfpga/src/base/openfpga_verilog.cpp @@ -83,8 +83,7 @@ int write_verilog_testbench(OpenfpgaContext& openfpga_ctx, options.set_print_simulation_ini(cmd_context.option_value(cmd, opt_print_simulation_ini)); options.set_verbose_output(cmd_context.option_enable(cmd, opt_verbose)); - fpga_verilog_testbench(openfpga_ctx.verilog_netlists(), - openfpga_ctx.module_graph(), + fpga_verilog_testbench(openfpga_ctx.module_graph(), openfpga_ctx.bitstream_manager(), openfpga_ctx.fabric_bitstream(), g_vpr_ctx.atom(), diff --git a/openfpga/src/fpga_verilog/verilog_api.cpp b/openfpga/src/fpga_verilog/verilog_api.cpp index 2c2ea4e93..7f82507f5 100644 --- a/openfpga/src/fpga_verilog/verilog_api.cpp +++ b/openfpga/src/fpga_verilog/verilog_api.cpp @@ -144,8 +144,7 @@ void fpga_fabric_verilog(ModuleManager& module_manager, * This testbench is created for quick verification and formal verification purpose. * - Verilog netlist including preprocessing flags and all the Verilog netlists that have been generated ********************************************************************/ -void fpga_verilog_testbench(const NetlistManager& netlist_manager, - const ModuleManager& module_manager, +void fpga_verilog_testbench(const ModuleManager& module_manager, const BitstreamManager& bitstream_manager, const std::vector& fabric_bitstream, const AtomContext& atom_ctx, @@ -227,11 +226,9 @@ void fpga_verilog_testbench(const NetlistManager& netlist_manager, } /* Generate a Verilog file including all the netlists that have been generated */ - print_include_netlists(netlist_manager, - src_dir_path, + print_include_netlists(src_dir_path, netlist_name, - options.reference_benchmark_file_path(), - circuit_lib); + options.reference_benchmark_file_path()); } diff --git a/openfpga/src/fpga_verilog/verilog_api.h b/openfpga/src/fpga_verilog/verilog_api.h index c9d194dff..301e68b3e 100644 --- a/openfpga/src/fpga_verilog/verilog_api.h +++ b/openfpga/src/fpga_verilog/verilog_api.h @@ -37,8 +37,7 @@ void fpga_fabric_verilog(ModuleManager& module_manager, const DeviceRRGSB& device_rr_gsb, const FabricVerilogOption& options); -void fpga_verilog_testbench(const NetlistManager& netlist_manager, - const ModuleManager& module_manager, +void fpga_verilog_testbench(const ModuleManager& module_manager, const BitstreamManager& bitstream_manager, const std::vector& fabric_bitstream, const AtomContext& atom_ctx, diff --git a/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.cpp b/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.cpp index b69868d17..65e0d1ca2 100644 --- a/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.cpp +++ b/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.cpp @@ -94,11 +94,9 @@ void print_fabric_include_netlist(const NetlistManager& netlist_manager, * that have been generated and user-defined. * Some netlists are open to compile under specific preprocessing flags *******************************************************************/ -void print_include_netlists(const NetlistManager& netlist_manager, - const std::string& src_dir, +void print_include_netlists(const std::string& src_dir, const std::string& circuit_name, - const std::string& reference_benchmark_file, - const CircuitLibrary& circuit_lib) { + const std::string& reference_benchmark_file) { std::string verilog_fname = src_dir + circuit_name + std::string(TOP_INCLUDE_NETLIST_FILE_NAME_POSTFIX); /* Create the file stream */ @@ -112,46 +110,13 @@ void print_include_netlists(const NetlistManager& netlist_manager, print_verilog_file_header(fp, std::string("Netlist Summary")); /* Print preprocessing flags */ - print_verilog_comment(fp, std::string("------ Include defines: preproc flags -----")); - print_verilog_include_netlist(fp, std::string(src_dir + std::string(DEFINES_VERILOG_FILE_NAME))); - fp << std::endl; - print_verilog_comment(fp, std::string("------ Include simulation defines -----")); print_verilog_include_netlist(fp, src_dir + std::string(DEFINES_VERILOG_SIMULATION_FILE_NAME)); fp << std::endl; - /* Include all the user-defined netlists */ - print_verilog_comment(fp, std::string("------ Include user-defined netlists -----")); - for (const std::string& user_defined_netlist : find_circuit_library_unique_verilog_netlists(circuit_lib)) { - print_verilog_include_netlist(fp, user_defined_netlist); - } - - /* Include all the primitive modules */ - print_verilog_comment(fp, std::string("------ Include primitive module netlists -----")); - for (const NetlistId& nlist_id : netlist_manager.netlists_by_type(NetlistManager::SUBMODULE_NETLIST)) { - print_verilog_include_netlist(fp, netlist_manager.netlist_name(nlist_id)); - } - fp << std::endl; - - /* Include all the CLB, heterogeneous block modules */ - print_verilog_comment(fp, std::string("------ Include logic block netlists -----")); - for (const NetlistId& nlist_id : netlist_manager.netlists_by_type(NetlistManager::LOGIC_BLOCK_NETLIST)) { - print_verilog_include_netlist(fp, netlist_manager.netlist_name(nlist_id)); - } - fp << std::endl; - - /* Include all the routing architecture modules */ - print_verilog_comment(fp, std::string("------ Include routing module netlists -----")); - for (const NetlistId& nlist_id : netlist_manager.netlists_by_type(NetlistManager::ROUTING_MODULE_NETLIST)) { - print_verilog_include_netlist(fp, netlist_manager.netlist_name(nlist_id)); - } - fp << std::endl; - /* Include FPGA top module */ print_verilog_comment(fp, std::string("------ Include fabric top-level netlists -----")); - for (const NetlistId& nlist_id : netlist_manager.netlists_by_type(NetlistManager::TOP_MODULE_NETLIST)) { - print_verilog_include_netlist(fp, netlist_manager.netlist_name(nlist_id)); - } + print_verilog_include_netlist(fp, src_dir + std::string(FABRIC_INCLUDE_NETLIST_FILE_NAME)); fp << std::endl; /* Include reference benchmark netlist only when auto-check flag is enabled */ diff --git a/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.h b/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.h index 52292881a..57f04032f 100644 --- a/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.h +++ b/openfpga/src/fpga_verilog/verilog_auxiliary_netlists.h @@ -21,11 +21,9 @@ void print_fabric_include_netlist(const NetlistManager& netlist_manager, const std::string& src_dir, const CircuitLibrary& circuit_lib); -void print_include_netlists(const NetlistManager& netlist_manager, - const std::string& src_dir, +void print_include_netlists(const std::string& src_dir, const std::string& circuit_name, - const std::string& reference_benchmark_file, - const CircuitLibrary& circuit_lib); + const std::string& reference_benchmark_file); void print_verilog_preprocessing_flags_netlist(const std::string& src_dir, const FabricVerilogOption& fabric_verilog_opts); From dad99d13a20a64eb660cf2609d0bda85339d96d1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 11 May 2020 14:52:55 -0600 Subject: [PATCH 052/180] bug fixed in SDC timing writer for primitive pb_type --- openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp index 26949ec29..b56f8acf0 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_grid_writer.cpp @@ -397,34 +397,34 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, print_sdc_timescale(fp, time_unit_to_string(time_unit)); /* We traverse the pb_graph pins where we can find pin-to-pin timing annotation - * We walk through output pins here, build timing constraints by pair each output to input + * We walk through input pins here, build timing constraints by pair each input to output + * Because VPR keeps all the timing values in pin_timing data structure instead of pb_graph_pin edges * Clock pins are not walked through because they will be handled by clock tree synthesis */ - for (int iport = 0; iport < logical_primitive_pb_graph_node->num_output_ports; ++iport) { - for (int ipin = 0; ipin < logical_primitive_pb_graph_node->num_output_pins[iport]; ++ipin) { - t_pb_graph_pin* sink_pin = &(logical_primitive_pb_graph_node->output_pins[iport][ipin]); + for (int iport = 0; iport < logical_primitive_pb_graph_node->num_input_ports; ++iport) { + for (int ipin = 0; ipin < logical_primitive_pb_graph_node->num_input_pins[iport]; ++ipin) { + t_pb_graph_pin* src_pin = &(logical_primitive_pb_graph_node->input_pins[iport][ipin]); /* Port must exist in the module graph */ - ModulePortId sink_module_port_id = module_manager.find_module_port(pb_module, generate_pb_type_port_name(physical_pb_type, sink_pin->port)); - VTR_ASSERT(true == module_manager.valid_module_port_id(pb_module, sink_module_port_id)); - BasicPort sink_port = module_manager.module_port(pb_module, sink_module_port_id); + ModulePortId src_module_port_id = module_manager.find_module_port(pb_module, generate_pb_type_port_name(physical_pb_type, src_pin->port)); + VTR_ASSERT(true == module_manager.valid_module_port_id(pb_module, src_module_port_id)); + BasicPort src_port = module_manager.module_port(pb_module, src_module_port_id); /* Set the correct pin number of the port */ - sink_port.set_width(sink_pin->pin_number, sink_pin->pin_number); + src_port.set_width(src_pin->pin_number, src_pin->pin_number); /* Find all the sink pin from this source pb_graph_pin */ - for (int iedge = 0; iedge < sink_pin->num_input_edges; ++iedge) { - VTR_ASSERT(1 == sink_pin->input_edges[iedge]->num_input_pins); - t_pb_graph_pin* src_pin = sink_pin->input_edges[iedge]->input_pins[0]; + for (int itiming = 0; itiming < src_pin->num_pin_timing; ++itiming) { + t_pb_graph_pin* sink_pin = src_pin->pin_timing[itiming]; /* Port must exist in the module graph */ - ModulePortId src_module_port_id = module_manager.find_module_port(pb_module, generate_pb_type_port_name(physical_pb_type, src_pin->port)); - VTR_ASSERT(true == module_manager.valid_module_port_id(pb_module, src_module_port_id)); - BasicPort src_port = module_manager.module_port(pb_module, src_module_port_id); + ModulePortId sink_module_port_id = module_manager.find_module_port(pb_module, generate_pb_type_port_name(physical_pb_type, sink_pin->port)); + VTR_ASSERT(true == module_manager.valid_module_port_id(pb_module, sink_module_port_id)); + BasicPort sink_port = module_manager.module_port(pb_module, sink_module_port_id); /* Set the correct pin number of the port */ - src_port.set_width(src_pin->pin_number, src_pin->pin_number); + sink_port.set_width(sink_pin->pin_number, sink_pin->pin_number); /* Find max delay between src and sink pin */ - float tmax = sink_pin->input_edges[iedge]->delay_max; + float tmax = src_pin->pin_timing_del_max[itiming]; /* Generate module path in hierarchy depending if the hierarchical is enabled */ std::string module_hie_path = pb_module_name; @@ -434,7 +434,7 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, /* If the delay is zero, constrain only when user wants it */ if ( (true == constrain_zero_delay_paths) - || (0. == tmax) ) { + || (0. != tmax) ) { print_pnr_sdc_constrain_max_delay(fp, module_hie_path, generate_sdc_port(src_port), @@ -444,10 +444,10 @@ void print_pnr_sdc_constrain_primitive_pb_graph_node(const std::string& sdc_dir, } /* Find min delay between src and sink pin */ - float tmin = sink_pin->input_edges[iedge]->delay_min; + float tmin = src_pin->pin_timing_del_min[itiming]; /* If the delay is zero, constrain only when user wants it */ if ( (true == constrain_zero_delay_paths) - || (0. == tmin) ) { + || (0. != tmin) ) { print_pnr_sdc_constrain_min_delay(fp, module_hie_path, generate_sdc_port(src_port), From 4c0953415b87984e969a9a1d4161fc89b3721dc7 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 12 May 2020 20:44:53 -0600 Subject: [PATCH 053/180] add configuration chain sdc writer --- openfpga/src/base/openfpga_sdc.cpp | 36 ++++ openfpga/src/base/openfpga_sdc.h | 3 + openfpga/src/base/openfpga_sdc_command.cpp | 49 +++++ .../configuration_chain_sdc_writer.cpp | 175 ++++++++++++++++++ .../fpga_sdc/configuration_chain_sdc_writer.h | 26 +++ openfpga/src/fpga_sdc/sdc_writer_utils.cpp | 12 +- 6 files changed, 295 insertions(+), 6 deletions(-) create mode 100644 openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp create mode 100644 openfpga/src/fpga_sdc/configuration_chain_sdc_writer.h diff --git a/openfpga/src/base/openfpga_sdc.cpp b/openfpga/src/base/openfpga_sdc.cpp index d492e653a..93bd46959 100644 --- a/openfpga/src/base/openfpga_sdc.cpp +++ b/openfpga/src/base/openfpga_sdc.cpp @@ -15,6 +15,7 @@ #include "circuit_library_utils.h" #include "pnr_sdc_writer.h" #include "analysis_sdc_writer.h" +#include "configuration_chain_sdc_writer.h" #include "openfpga_sdc.h" /* Include global variables of VPR */ @@ -102,6 +103,41 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, return CMD_EXEC_SUCCESS; } +/******************************************************************** + * A wrapper function to call the PnR SDC generator on configuration chain + * of FPGA-SDC + *******************************************************************/ +int write_configuration_chain_sdc(const OpenfpgaContext& openfpga_ctx, + const Command& cmd, const CommandContext& cmd_context) { + /* If the configuration protocol is not a configuration chain, we will not write anything */ + if (CONFIG_MEM_SCAN_CHAIN != openfpga_ctx.arch().config_protocol.type()) { + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Configuration protocol is %s. Expected %s to write SDC!\n", + CONFIG_PROTOCOL_TYPE_STRING[openfpga_ctx.arch().config_protocol.type()], + CONFIG_PROTOCOL_TYPE_STRING[CONFIG_MEM_SCAN_CHAIN]); + return CMD_EXEC_FATAL_ERROR; + } + + /* Get command options */ + CommandOptionId opt_output_dir = cmd.option("file"); + CommandOptionId opt_time_unit = cmd.option("time_unit"); + CommandOptionId opt_min_delay = cmd.option("min_delay"); + CommandOptionId opt_max_delay = cmd.option("max_delay"); + + std::string sdc_dir_path = format_dir_path(cmd_context.option_value(cmd, opt_output_dir)); + + float time_unit = string_to_time_unit(cmd_context.option_value(cmd, opt_time_unit)); + + /* Write the SDC for configuration chain */ + print_pnr_sdc_constrain_configurable_chain(cmd_context.option_value(cmd, opt_output_dir), + time_unit, + std::stof(cmd_context.option_value(cmd, opt_max_delay)), + std::stof(cmd_context.option_value(cmd, opt_min_delay)), + openfpga_ctx.module_graph()); + + return CMD_EXEC_SUCCESS; +} + /******************************************************************** * A wrapper function to call the analysis SDC generator of FPGA-SDC *******************************************************************/ diff --git a/openfpga/src/base/openfpga_sdc.h b/openfpga/src/base/openfpga_sdc.h index 99a87f899..060c304bc 100644 --- a/openfpga/src/base/openfpga_sdc.h +++ b/openfpga/src/base/openfpga_sdc.h @@ -18,6 +18,9 @@ namespace openfpga { int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context); +int write_configuration_chain_sdc(const OpenfpgaContext& openfpga_ctx, + const Command& cmd, const CommandContext& cmd_context); + int write_analysis_sdc(OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context); diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index a0f578786..faa488931 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -80,6 +80,45 @@ ShellCommandId add_openfpga_write_pnr_sdc_command(openfpga::Shell& shell, + const ShellCommandClassId& cmd_class_id, + const std::vector& dependent_cmds) { + Command shell_cmd("write_configuration_chain_sdc"); + + /* Add an option '--file' in short '-f'*/ + CommandOptionId output_opt = shell_cmd.add_option("file", true, "Specify the SDC file to constrain configuration chain"); + shell_cmd.set_option_short_name(output_opt, "f"); + shell_cmd.set_option_require_value(output_opt, openfpga::OPT_STRING); + + /* Add an option '--time_unit' */ + CommandOptionId time_unit_opt = shell_cmd.add_option("time_unit", false, "Specify the time unit in SDC files. Acceptable is [a|f|p|n|u|m|k|M]s"); + shell_cmd.set_option_require_value(time_unit_opt, openfpga::OPT_STRING); + + /* Add an option '--min_delay' */ + CommandOptionId min_dly_opt = shell_cmd.add_option("min_delay", false, "Specify the minimum delay to be used."); + shell_cmd.set_option_require_value(min_dly_opt, openfpga::OPT_STRING); + + /* Add an option '--max_delay' */ + CommandOptionId max_dly_opt = shell_cmd.add_option("max_delay", false, "Specify the maximum delay to be used."); + shell_cmd.set_option_require_value(max_dly_opt, openfpga::OPT_STRING); + + /* Add command 'write_configuration_chain_sdc' to the Shell */ + ShellCommandId shell_cmd_id = shell.add_command(shell_cmd, "generate SDC files to constrain the configuration chain for FPGA fabric"); + shell.set_command_class(shell_cmd_id, cmd_class_id); + shell.set_command_const_execute_function(shell_cmd_id, write_configuration_chain_sdc); + + /* Add command dependency to the Shell */ + shell.set_command_dependency(shell_cmd_id, dependent_cmds); + + return shell_cmd_id; +} + /******************************************************************** * - Add a command to Shell environment: generate PnR SDC * - Add associated options @@ -134,6 +173,16 @@ void add_openfpga_sdc_commands(openfpga::Shell& shell) { openfpga_sdc_cmd_class, pnr_sdc_cmd_dependency); + /******************************** + * Command 'write_configuration_chain_sdc' + */ + /* The 'write_configuration_chain_sdc' command should NOT be executed before 'build_fabric' */ + std::vector cc_sdc_cmd_dependency; + cc_sdc_cmd_dependency.push_back(build_fabric_id); + add_openfpga_write_configuration_chain_sdc_command(shell, + openfpga_sdc_cmd_class, + cc_sdc_cmd_dependency); + /******************************** * Command 'write_analysis_sdc' */ diff --git a/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp b/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp new file mode 100644 index 000000000..ce41e6851 --- /dev/null +++ b/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp @@ -0,0 +1,175 @@ +/******************************************************************** + * This file includes functions that print SDC (Synopsys Design Constraint) + * files in physical design tools, i.e., Place & Route (PnR) tools + * The SDC files are used to constrain the timing of configuration chain + * + * Note that this is different from the SDC to constrain VPR Place&Route + * engine! These SDCs are designed for PnR to generate FPGA layouts!!! + *******************************************************************/ +#include +#include +#include + +/* Headers from vtrutil library */ +#include "vtr_assert.h" +#include "vtr_time.h" +#include "vtr_log.h" + +/* Headers from openfpgautil library */ +#include "openfpga_scale.h" +#include "openfpga_port.h" +#include "openfpga_digest.h" + +#include "openfpga_naming.h" + +#include "sdc_writer_utils.h" +#include "configuration_chain_sdc_writer.h" + +/* begin namespace openfpga */ +namespace openfpga { + +/******************************************************************** + * Print SDC commands to constrain the timing between outputs and inputs + * of all the configurable memory modules + * + * |<------Max/Min delay-->| + * | | + * +------+ out in +------+ + * | CCFF |---------------------->| CCFF | + * +------+ +------+ + * + * This function will be executed in a recursive way, + * using a Depth-First Search (DFS) strategy + * It will iterate over all the configurable children under each module + * and print a SDC command + * + *******************************************************************/ +static +void rec_print_pnr_sdc_constrain_configurable_chain(std::fstream& fp, + const float& tmax, + const float& tmin, + const ModuleManager& module_manager, + const ModuleId& parent_module, + const std::string& parent_module_path, + std::string& previous_module_path, + ModuleId& previous_module) { + + /* For each configurable child, we will go one level down in priority */ + for (size_t child_index = 0; child_index < module_manager.configurable_children(parent_module).size(); ++child_index) { + std::string child_module_path = parent_module_path; + ModuleId child_module_id = module_manager.configurable_children(parent_module)[child_index]; + size_t child_instance_id = module_manager.configurable_child_instances(parent_module)[child_index]; + std::string child_instance_name; + if (true == module_manager.instance_name(parent_module, child_module_id, child_instance_id).empty()) { + child_instance_name = generate_instance_name(module_manager.module_name(child_module_id), child_instance_id); + } else { + child_instance_name = module_manager.instance_name(parent_module, child_module_id, child_instance_id); + } + + child_module_path += child_instance_name; + + child_module_path = format_dir_path(child_module_path); + + rec_print_pnr_sdc_constrain_configurable_chain(fp, + tmax, tmin, + module_manager, + child_module_id, + child_module_path, + previous_module_path, + previous_module); + } + + /* If there is no configurable children any more, this is a leaf module, print a SDC command for disable timing */ + if (0 < module_manager.configurable_children(parent_module).size()) { + return; + } + + /* Validate file stream */ + valid_file_stream(fp); + + /* Disable timing for each output port of this module */ + if (!previous_module_path.empty()) { + bool first_port = true; + for (const BasicPort& output_port : module_manager.module_ports_by_type(previous_module, ModuleManager::MODULE_OUTPUT_PORT)) { + /* Only the first output port will be considered, + * being consistent with build_memory_module.cpp:395 + */ + if (false == first_port) { + continue; + } + + for (const BasicPort& input_port : module_manager.module_ports_by_type(parent_module, ModuleManager::MODULE_INPUT_PORT)) { + print_pnr_sdc_constrain_max_delay(fp, + previous_module_path, + generate_sdc_port(output_port), + parent_module_path, + generate_sdc_port(input_port), + tmax); + + print_pnr_sdc_constrain_min_delay(fp, + previous_module_path, + generate_sdc_port(output_port), + parent_module_path, + generate_sdc_port(input_port), + tmin); + } + + first_port = false; + } + } + + /* Update previous module */ + previous_module_path = parent_module_path; + previous_module = parent_module; +} + + +/******************************************************************** + * Break combinational loops in FPGA fabric, which mainly come from + * configurable memory cells. + * To handle this, we disable the outputs of memory cells + *******************************************************************/ +void print_pnr_sdc_constrain_configurable_chain(const std::string& sdc_fname, + const float& time_unit, + const float& max_delay, + const float& min_delay, + const ModuleManager& module_manager) { + + /* Create the directory */ + create_directory(find_path_dir_name(sdc_fname)); + + /* Start time count */ + std::string timer_message = std::string("Write SDC to constrain configurable chain for P&R flow '") + sdc_fname + std::string("'"); + vtr::ScopedStartFinishTimer timer(timer_message); + + /* Create the file stream */ + std::fstream fp; + fp.open(sdc_fname, std::fstream::out | std::fstream::trunc); + + check_file_stream(sdc_fname.c_str(), fp); + + /* Generate the descriptions*/ + print_sdc_file_header(fp, std::string("Timing constraints for configurable chains used in PnR")); + + /* Print time unit for the SDC file */ + print_sdc_timescale(fp, time_unit_to_string(time_unit)); + + std::string top_module_name = generate_fpga_top_module_name(); + ModuleId top_module = module_manager.find_module(top_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(top_module)); + + /* Go recursively in the module manager, starting from the top-level module: instance id of the top-level module is 0 by default */ + std::string previous_module_path; + ModuleId previous_module = ModuleId::INVALID(); + rec_print_pnr_sdc_constrain_configurable_chain(fp, + max_delay/time_unit, min_delay/time_unit, + module_manager, top_module, + format_dir_path(module_manager.module_name(top_module)), + previous_module_path, + previous_module); + + /* Close file handler */ + fp.close(); +} + +} /* end namespace openfpga */ diff --git a/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.h b/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.h new file mode 100644 index 000000000..1e636c8a9 --- /dev/null +++ b/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.h @@ -0,0 +1,26 @@ +#ifndef CONFIGURATION_CHAIN_SDC_WRITER_H +#define CONFIGURATION_CHAIN_SDC_WRITER_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include +#include +#include "module_manager.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ + +/* begin namespace openfpga */ +namespace openfpga { + +void print_pnr_sdc_constrain_configurable_chain(const std::string& sdc_fname, + const float& time_unit, + const float& max_delay, + const float& min_delay, + const ModuleManager& module_manager); + +} /* end namespace openfpga */ + +#endif diff --git a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp index 85ff6edcb..93a3a94aa 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp @@ -95,14 +95,14 @@ void print_pnr_sdc_constrain_max_delay(std::fstream& fp, fp << " -from "; if (!src_instance_name.empty()) { - fp << src_instance_name << "/"; + fp << format_dir_path(src_instance_name); } fp << src_port_name; fp << " -to "; if (!des_instance_name.empty()) { - fp << des_instance_name << "/"; + fp << format_dir_path(des_instance_name); } fp << des_port_name; @@ -130,7 +130,7 @@ void print_pnr_sdc_regexp_constrain_max_delay(std::fstream& fp, fp << " -from "; fp << "[get_pins -regexp \""; if (!src_instance_name.empty()) { - fp << src_instance_name << "/"; + fp << format_dir_path(src_instance_name); } fp << src_port_name; @@ -140,7 +140,7 @@ void print_pnr_sdc_regexp_constrain_max_delay(std::fstream& fp, fp << "[get_pins -regexp \""; if (!des_instance_name.empty()) { - fp << des_instance_name << "/"; + fp << format_dir_path(des_instance_name); } fp << des_port_name; @@ -167,14 +167,14 @@ void print_pnr_sdc_constrain_min_delay(std::fstream& fp, fp << " -from "; if (!src_instance_name.empty()) { - fp << src_instance_name << "/"; + fp << format_dir_path(src_instance_name); } fp << src_port_name; fp << " -to "; if (!des_instance_name.empty()) { - fp << des_instance_name << "/"; + fp << format_dir_path(des_instance_name); } fp << des_port_name; From fc2b09514eb8a6546419b6e0905892de90111abd Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 12 May 2020 20:51:16 -0600 Subject: [PATCH 054/180] add configuration chain write to regression tests --- ...onfiguration_chain_example_script.openfpga | 68 +++++++++++++++++++ .../configuration_chain/config/task.conf | 2 +- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga diff --git a/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga new file mode 100644 index 000000000..326bdba6a --- /dev/null +++ b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga @@ -0,0 +1,68 @@ +# Run VPR for the 'and' design +#--write_rr_graph example_rr_graph.xml +vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route + +# Read OpenFPGA architecture definition +read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} + +# Annotate the OpenFPGA architecture to VPR data base +# to debug use --verbose options +link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges + +# Check and correct any naming conflicts in the BLIF netlist +check_netlist_naming_conflict --fix --report ./netlist_renaming.xml + +# Apply fix-up to clustering nets based on routing results +pb_pin_fixup --verbose + +# Apply fix-up to Look-Up Table truth tables based on packing results +lut_truth_table_fixup + +# Build the module graph +# - Enabled compression on routing architecture modules +# - Enable pin duplication on grid modules +build_fabric --compress_routing #--verbose + +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + +# Repack the netlist to physical pbs +# This must be done before bitstream generator and testbench generation +# Strongly recommend it is done after all the fix-up have been applied +repack #--verbose + +# Build the bitstream +# - Output the fabric-independent bitstream to a file +build_architecture_bitstream --verbose --file fabric_indepenent_bitstream.xml + +# Build fabric-dependent bitstream +build_fabric_bitstream --verbose + +# Write the Verilog netlist for FPGA fabric +# - Enable the use of explicit port mapping in Verilog netlist +write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --include_signal_init --support_icarus_simulator --print_user_defined_template --verbose + +# Write the Verilog testbench for FPGA fabric +# - We suggest the use of same output directory as fabric Verilog netlists +# - Must specify the reference benchmark file if you want to output any testbenches +# - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA +# - Enable pre-configured top-level testbench which is a fast verification skipping programming phase +# - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini + +# Write the SDC files for PnR backend +# - Turn on every options here +write_pnr_sdc --file ./SDC + +# Write SDC to constrain timing of configuration chain +write_configuration_chain_sdc --file ./SDC/ccff_timing.sdc --time_unit ns --max_delay 5 --min_delay 2.5 + +# Write the SDC to run timing analysis for a mapped FPGA fabric +write_analysis_sdc --file ./SDC_analysis + +# Finish and exit OpenFPGA +exit + +# Note : +# To run verification at the end of the flow maintain source in ./SRC directory diff --git a/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf b/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf index 79781a758..9e18efc65 100644 --- a/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf @@ -8,7 +8,7 @@ [GENERAL] run_engine=openfpga_shell -openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml power_analysis = true spice_output=false From 02e86c565ac0051b47db452e78f9d09cfbf83247 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 12 May 2020 20:53:17 -0600 Subject: [PATCH 055/180] bug fix in configuration chain SDC writer --- openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp b/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp index ce41e6851..5372741bb 100644 --- a/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp @@ -162,7 +162,7 @@ void print_pnr_sdc_constrain_configurable_chain(const std::string& sdc_fname, std::string previous_module_path; ModuleId previous_module = ModuleId::INVALID(); rec_print_pnr_sdc_constrain_configurable_chain(fp, - max_delay/time_unit, min_delay/time_unit, + max_delay, min_delay, module_manager, top_module, format_dir_path(module_manager.module_name(top_module)), previous_module_path, From a41c8dbcb3eff7497cb388a5f87c9098e8d6c11d Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 12 May 2020 20:54:11 -0600 Subject: [PATCH 056/180] change to use default sphinx build version --- docs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index 6f26ca799..1f299ec6b 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,7 +3,7 @@ # You can set these variables from the command line. SPHINXOPTS = -SPHINXBUILD = sphinx-build-3.6 +SPHINXBUILD = sphinx-build SOURCEDIR = source BUILDDIR = build From df9cf32b4969a1b3eb918b041e5144a95b583512 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 12 May 2020 20:59:55 -0600 Subject: [PATCH 057/180] update documenation for configuration chain writer --- .../source/openfpga_shell/openfpga_commands.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/source/openfpga_shell/openfpga_commands.rst b/docs/source/openfpga_shell/openfpga_commands.rst index 5cd5a8c33..c07b7a71c 100644 --- a/docs/source/openfpga_shell/openfpga_commands.rst +++ b/docs/source/openfpga_shell/openfpga_commands.rst @@ -221,6 +221,23 @@ FPGA-SDC - ``--verbose`` Enable verbose output +.. option:: write_configuration_chain_sdc + + Write the SDC file to constrain the timing for configuration chain. The timing constraints will always start from the first output (Q) of a Configuration Chain Flip-flop (CCFF) and ends at the inputs of the next CCFF in the chain. Note that Qb of CCFF will not be constrained! + + - ``--file`` or ``-f`` Specify the output SDC file + + - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). + + + - ``--max_delay`` Specify the maximum delay to be used. The timing value should follow the time unit defined in this command. + + - ``--min_delay`` Specify the minimum delay to be used. The timing value should follow the time unit defined in this command. + + .. note:: + Only applicable when configuration chain is used as configuration protocol + + .. option:: write_analysis_sdc Write the SDC to run timing analysis for a mapped FPGA fabric From 99751b84f5814743acd93a13c9fef1bc7aa6de7b Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 12 May 2020 22:49:41 -0600 Subject: [PATCH 058/180] bug fix in configuration chain sdc writer --- openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp b/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp index 5372741bb..ea74ea579 100644 --- a/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/configuration_chain_sdc_writer.cpp @@ -101,16 +101,16 @@ void rec_print_pnr_sdc_constrain_configurable_chain(std::fstream& fp, for (const BasicPort& input_port : module_manager.module_ports_by_type(parent_module, ModuleManager::MODULE_INPUT_PORT)) { print_pnr_sdc_constrain_max_delay(fp, previous_module_path, - generate_sdc_port(output_port), + output_port.get_name(), parent_module_path, - generate_sdc_port(input_port), + input_port.get_name(), tmax); print_pnr_sdc_constrain_min_delay(fp, previous_module_path, - generate_sdc_port(output_port), + output_port.get_name(), parent_module_path, - generate_sdc_port(input_port), + input_port.get_name(), tmin); } From ae9f1fbd908f3724ad54c630bcf088cd1d7cc2d9 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 13 May 2020 23:37:07 -0600 Subject: [PATCH 059/180] critical bug fixed in the disable MUX output --- openfpga/src/fpga_sdc/sdc_mux_utils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp index ee30eae9b..7f7acc41f 100644 --- a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp @@ -52,10 +52,10 @@ void rec_print_pnr_sdc_disable_routing_multiplexer_outputs(std::fstream& fp, /* For each child, we will go one level down in priority */ for (const ModuleId& child_module : module_manager.child_modules(parent_module)) { - std::string child_module_path = parent_module_path; - /* Iterate over the child instances*/ for (const size_t& child_instance : module_manager.child_module_instances(parent_module, child_module)) { + std::string child_module_path = parent_module_path; + std::string child_instance_name; if (true == module_manager.instance_name(parent_module, child_module, child_instance).empty()) { child_instance_name = generate_instance_name(module_manager.module_name(child_module), child_instance); From 13f591cacfa451e9d0d8f97d6cb92fbb934ce820 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 14 May 2020 16:53:15 -0600 Subject: [PATCH 060/180] add new command to disable timing for configure ports of programmable modules --- openfpga/src/base/openfpga_sdc.cpp | 27 +++ openfpga/src/base/openfpga_sdc.h | 3 + openfpga/src/base/openfpga_sdc_command.cpp | 40 ++++ .../fpga_sdc/configure_port_sdc_writer.cpp | 160 ++++++++++++++ .../src/fpga_sdc/configure_port_sdc_writer.h | 26 +++ openfpga/src/fpga_sdc/pnr_sdc_writer.cpp | 63 ------ openfpga/src/fpga_sdc/sdc_mux_utils.cpp | 204 +++++++++++------- openfpga/src/fpga_sdc/sdc_mux_utils.h | 21 +- openfpga/src/fpga_sdc/sdc_writer_utils.cpp | 111 ++++++++++ openfpga/src/fpga_sdc/sdc_writer_utils.h | 8 + ...onfiguration_chain_example_script.openfpga | 3 + .../example_script.openfpga | 3 + 12 files changed, 523 insertions(+), 146 deletions(-) create mode 100644 openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp create mode 100644 openfpga/src/fpga_sdc/configure_port_sdc_writer.h diff --git a/openfpga/src/base/openfpga_sdc.cpp b/openfpga/src/base/openfpga_sdc.cpp index 93bd46959..bba115d3c 100644 --- a/openfpga/src/base/openfpga_sdc.cpp +++ b/openfpga/src/base/openfpga_sdc.cpp @@ -16,6 +16,7 @@ #include "pnr_sdc_writer.h" #include "analysis_sdc_writer.h" #include "configuration_chain_sdc_writer.h" +#include "configure_port_sdc_writer.h" #include "openfpga_sdc.h" /* Include global variables of VPR */ @@ -138,6 +139,32 @@ int write_configuration_chain_sdc(const OpenfpgaContext& openfpga_ctx, return CMD_EXEC_SUCCESS; } +/******************************************************************** + * A wrapper function to call the PnR SDC generator on routing multiplexers + * of FPGA-SDC + *******************************************************************/ +int write_sdc_disable_timing_configure_ports(const OpenfpgaContext& openfpga_ctx, + const Command& cmd, const CommandContext& cmd_context) { + + /* Get command options */ + CommandOptionId opt_output_dir = cmd.option("file"); + CommandOptionId opt_flatten_names = cmd.option("flatten_names"); + + std::string sdc_dir_path = format_dir_path(cmd_context.option_value(cmd, opt_output_dir)); + + /* Write the SDC for configuration chain */ + if (CMD_EXEC_FATAL_ERROR == + print_sdc_disable_timing_configure_ports(cmd_context.option_value(cmd, opt_output_dir), + cmd_context.option_enable(cmd, opt_flatten_names), + openfpga_ctx.mux_lib(), + openfpga_ctx.arch().circuit_lib, + openfpga_ctx.module_graph())) { + return CMD_EXEC_FATAL_ERROR; + } + + return CMD_EXEC_SUCCESS; +} + /******************************************************************** * A wrapper function to call the analysis SDC generator of FPGA-SDC *******************************************************************/ diff --git a/openfpga/src/base/openfpga_sdc.h b/openfpga/src/base/openfpga_sdc.h index 060c304bc..03f4af03f 100644 --- a/openfpga/src/base/openfpga_sdc.h +++ b/openfpga/src/base/openfpga_sdc.h @@ -21,6 +21,9 @@ int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, int write_configuration_chain_sdc(const OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context); +int write_sdc_disable_timing_configure_ports(const OpenfpgaContext& openfpga_ctx, + const Command& cmd, const CommandContext& cmd_context); + int write_analysis_sdc(OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context); diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index faa488931..17910a711 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -119,6 +119,36 @@ ShellCommandId add_openfpga_write_configuration_chain_sdc_command(openfpga::Shel return shell_cmd_id; } +/******************************************************************** + * - Add a command to Shell environment: generate PnR SDC for configure ports + * - Add associated options + * - Add command dependency + *******************************************************************/ +static +ShellCommandId add_openfpga_write_sdc_disable_timing_configure_ports_command(openfpga::Shell& shell, + const ShellCommandClassId& cmd_class_id, + const std::vector& dependent_cmds) { + Command shell_cmd("write_sdc_disable_timing_configure_ports"); + + /* Add an option '--file' in short '-f'*/ + CommandOptionId output_opt = shell_cmd.add_option("file", true, "Specify the output directory"); + shell_cmd.set_option_short_name(output_opt, "f"); + shell_cmd.set_option_require_value(output_opt, openfpga::OPT_STRING); + + /* Add an option '--flatten_name' */ + shell_cmd.add_option("flatten_names", false, "Use flatten names (no wildcards) in SDC files"); + + /* Add command 'write_configuration_chain_sdc' to the Shell */ + ShellCommandId shell_cmd_id = shell.add_command(shell_cmd, "generate SDC files to disable timing for configure ports across FPGA fabric"); + shell.set_command_class(shell_cmd_id, cmd_class_id); + shell.set_command_const_execute_function(shell_cmd_id, write_sdc_disable_timing_configure_ports); + + /* Add command dependency to the Shell */ + shell.set_command_dependency(shell_cmd_id, dependent_cmds); + + return shell_cmd_id; +} + /******************************************************************** * - Add a command to Shell environment: generate PnR SDC * - Add associated options @@ -183,6 +213,16 @@ void add_openfpga_sdc_commands(openfpga::Shell& shell) { openfpga_sdc_cmd_class, cc_sdc_cmd_dependency); + /******************************** + * Command 'write_sdc_disable_timing_configure_ports' + */ + /* The 'write_sdc_disable_timing_configure_ports' command should NOT be executed before 'build_fabric' */ + std::vector config_port_sdc_cmd_dependency; + config_port_sdc_cmd_dependency.push_back(build_fabric_id); + add_openfpga_write_sdc_disable_timing_configure_ports_command(shell, + openfpga_sdc_cmd_class, + config_port_sdc_cmd_dependency); + /******************************** * Command 'write_analysis_sdc' */ diff --git a/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp new file mode 100644 index 000000000..c38a2d725 --- /dev/null +++ b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp @@ -0,0 +1,160 @@ +/******************************************************************** + * This file includes functions that print SDC (Synopsys Design Constraint) + * files in physical design tools, i.e., Place & Route (PnR) tools + * The SDC files are used to constrain the timing of configuration chain + * + * Note that this is different from the SDC to constrain VPR Place&Route + * engine! These SDCs are designed for PnR to generate FPGA layouts!!! + *******************************************************************/ +#include +#include +#include + +/* Headers from vtrutil library */ +#include "vtr_assert.h" +#include "vtr_time.h" +#include "vtr_log.h" + +/* Headers from openfpgashell library */ +#include "command_exit_codes.h" + +/* Headers from openfpgautil library */ +#include "openfpga_scale.h" +#include "openfpga_port.h" +#include "openfpga_digest.h" + +#include "openfpga_naming.h" + +#include "sdc_writer_naming.h" +#include "sdc_writer_utils.h" +#include "sdc_mux_utils.h" +#include "configure_port_sdc_writer.h" + +/* begin namespace openfpga */ +namespace openfpga { + +/******************************************************************** + * Break combinational loops in FPGA fabric, which mainly come from + * non-MUX programmable modules + * To handle this, we disable the timing at configuration ports + * + * Return code: + * 0: success + * 1: fatal error occurred + *******************************************************************/ +static +int print_sdc_disable_non_mux_circuit_configure_ports(std::fstream& fp, + const bool& flatten_names, + const CircuitLibrary& circuit_lib, + const ModuleManager& module_manager, + const ModuleId& top_module) { + + if (false == valid_file_stream(fp)) { + return CMD_EXEC_FATAL_ERROR; + } + + /* Iterate over the MUX modules */ + for (const CircuitModelId& model : circuit_lib.models()) { + + /* Skip MUXes, they are handled in another function */ + if (CIRCUIT_MODEL_MUX == circuit_lib.model_type(model)) { + continue; + } + + /* We care programmable circuit models only */ + if (0 == circuit_lib.model_ports_by_type(model, CIRCUIT_MODEL_PORT_SRAM).size()) { + continue; + } + + std::string programmable_module_name = circuit_lib.model_name(model); + + /* Find the module name in module manager */ + ModuleId programmable_module = module_manager.find_module(programmable_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(programmable_module)); + + /* Go recursively in the module manager, + * starting from the top-level module: instance id of the top-level module is 0 by default + * Disable all the outputs of child modules that matches the mux_module id + */ + for (const CircuitPortId& sram_port : circuit_lib.model_ports_by_type(model, CIRCUIT_MODEL_PORT_SRAM)) { + const std::string& sram_port_name = circuit_lib.port_lib_name(sram_port); + if (CMD_EXEC_FATAL_ERROR == + rec_print_sdc_disable_timing_for_module_ports(fp, + flatten_names, + module_manager, + top_module, + programmable_module, + format_dir_path(module_manager.module_name(top_module)), + sram_port_name)) { + return CMD_EXEC_FATAL_ERROR; + } + } + } + + return CMD_EXEC_SUCCESS; +} + +/******************************************************************** + * Break combinational loops in FPGA fabric, which mainly come from + * the configure ports of each programmable module. + * To handle this, we disable the configure ports of + * - routing multiplexers + * - other circuit model that has SRAM ports + *******************************************************************/ +int print_sdc_disable_timing_configure_ports(const std::string& sdc_fname, + const bool& flatten_names, + const MuxLibrary& mux_lib, + const CircuitLibrary& circuit_lib, + const ModuleManager& module_manager) { + /* Create the directory */ + create_directory(find_path_dir_name(sdc_fname)); + + /* Start time count */ + std::string timer_message = std::string("Write SDC to disable timing on configuration outputs of programmable cells for P&R flow '") + sdc_fname + std::string("'"); + vtr::ScopedStartFinishTimer timer(timer_message); + + /* Create the file stream */ + std::fstream fp; + fp.open(sdc_fname, std::fstream::out | std::fstream::trunc); + + check_file_stream(sdc_fname.c_str(), fp); + + /* Generate the descriptions*/ + print_sdc_file_header(fp, std::string("Disable configuration outputs of all the programmable cells for PnR")); + + std::string top_module_name = generate_fpga_top_module_name(); + ModuleId top_module = module_manager.find_module(top_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(top_module)); + + /* Disable timing for the configure ports of all the routing multiplexer */ + VTR_LOG("Write disable timing for routing multiplexers..."); + if (CMD_EXEC_FATAL_ERROR == print_sdc_disable_routing_multiplexer_configure_ports(fp, + flatten_names, + mux_lib, + circuit_lib, + module_manager, + top_module)) { + VTR_LOG("Fatal errors occurred\n"); + return CMD_EXEC_FATAL_ERROR; + } + VTR_LOG("Done\n"); + + /* Disable timing for the other programmable circuit models */ + VTR_LOG("Write disable timing for other programmable modules..."); + if (CMD_EXEC_FATAL_ERROR == print_sdc_disable_non_mux_circuit_configure_ports(fp, + flatten_names, + circuit_lib, + module_manager, + top_module)) { + VTR_LOG("Fatal errors occurred\n"); + return CMD_EXEC_FATAL_ERROR; + } + VTR_LOG("Done\n"); + + /* Close file handler */ + fp.close(); + + return CMD_EXEC_SUCCESS; +} + +} /* end namespace openfpga */ diff --git a/openfpga/src/fpga_sdc/configure_port_sdc_writer.h b/openfpga/src/fpga_sdc/configure_port_sdc_writer.h new file mode 100644 index 000000000..ef66af749 --- /dev/null +++ b/openfpga/src/fpga_sdc/configure_port_sdc_writer.h @@ -0,0 +1,26 @@ +#ifndef CONFIGURE_PORT_SDC_WRITER_H +#define CONFIGURE_PORT_SDC_WRITER_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include +#include +#include "module_manager.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ + +/* begin namespace openfpga */ +namespace openfpga { + +int print_sdc_disable_timing_configure_ports(const std::string& sdc_fname, + const bool& flatten_names, + const MuxLibrary& mux_lib, + const CircuitLibrary& circuit_lib, + const ModuleManager& module_manager); + +} /* end namespace openfpga */ + +#endif diff --git a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp index 3ef29330d..c02988462 100644 --- a/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/pnr_sdc_writer.cpp @@ -75,69 +75,6 @@ void print_pnr_sdc_constrain_configurable_memory_outputs(const std::string& sdc_ fp.close(); } -/******************************************************************** - * Break combinational loops in FPGA fabric, which mainly come from - * loops of multiplexers. - * To handle this, we disable the timing at outputs of routing multiplexers - *******************************************************************/ -static -void print_sdc_disable_routing_multiplexer_outputs(const std::string& sdc_dir, - const bool& flatten_names, - const MuxLibrary& mux_lib, - const CircuitLibrary& circuit_lib, - const ModuleManager& module_manager, - const ModuleId& top_module) { - /* Create the file name for Verilog netlist */ - std::string sdc_fname(sdc_dir + std::string(SDC_DISABLE_MUX_OUTPUTS_FILE_NAME)); - - /* Start time count */ - std::string timer_message = std::string("Write SDC to disable routing multiplexer outputs for P&R flow '") + sdc_fname + std::string("'"); - vtr::ScopedStartFinishTimer timer(timer_message); - - /* Create the file stream */ - std::fstream fp; - fp.open(sdc_fname, std::fstream::out | std::fstream::trunc); - - check_file_stream(sdc_fname.c_str(), fp); - - /* Generate the descriptions*/ - print_sdc_file_header(fp, std::string("Disable routing multiplexer outputs for PnR")); - - /* Iterate over the MUX modules */ - for (const MuxId& mux_id : mux_lib.muxes()) { - const CircuitModelId& mux_model = mux_lib.mux_circuit_model(mux_id); - - /* Skip LUTs, we only care about multiplexers here */ - if (CIRCUIT_MODEL_MUX != circuit_lib.model_type(mux_model)) { - continue; - } - - const MuxGraph& mux_graph = mux_lib.mux_graph(mux_id); - std::string mux_module_name = generate_mux_subckt_name(circuit_lib, mux_model, - find_mux_num_datapath_inputs(circuit_lib, mux_model, mux_graph.num_inputs()), - std::string("")); - - /* Find the module name in module manager */ - ModuleId mux_module = module_manager.find_module(mux_module_name); - VTR_ASSERT(true == module_manager.valid_module_id(mux_module)); - - /* Go recursively in the module manager, - * starting from the top-level module: instance id of the top-level module is 0 by default - * Disable all the outputs of child modules that matches the mux_module id - */ - rec_print_pnr_sdc_disable_routing_multiplexer_outputs(fp, - flatten_names, - module_manager, - top_module, - mux_module, - format_dir_path(module_manager.module_name(top_module))); - - } - - /* Close file handler */ - fp.close(); -} - /******************************************************************** * Break combinational loops in FPGA fabric, which mainly come from * loops of multiplexers. diff --git a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp index 7f7acc41f..0d2770566 100644 --- a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp @@ -6,13 +6,19 @@ /* Headers from vtrutil library */ #include "vtr_assert.h" #include "vtr_log.h" +#include "vtr_time.h" + +/* Headers from openfpgashell library */ +#include "command_exit_codes.h" /* Headers from openfpgautil library */ -#include "openfpga_wildcard_string.h" #include "openfpga_digest.h" #include "openfpga_naming.h" +#include "mux_utils.h" + +#include "sdc_writer_naming.h" #include "sdc_writer_utils.h" #include "sdc_mux_utils.h" @@ -21,93 +27,137 @@ namespace openfpga { /******************************************************************** - * Print SDC commands to disable outputs of routing multiplexer modules - * in a given module id - * This function will be executed in a recursive way, - * using a Depth-First Search (DFS) strategy - * It will iterate over all the configurable children under each module - * and print a SDC command to disable its outputs - * - * Note: - * - When flatten_names is true - * this function will not apply any wildcard to names - * - When flatten_names is false - * It will straightforwardly output the instance name and port name - * This function will try to apply wildcard to names - * so that SDC file size can be minimal + * Break combinational loops in FPGA fabric, which mainly come from + * loops of multiplexers. + * To handle this, we disable the timing at outputs of routing multiplexers *******************************************************************/ -void rec_print_pnr_sdc_disable_routing_multiplexer_outputs(std::fstream& fp, - const bool& flatten_names, - const ModuleManager& module_manager, - const ModuleId& parent_module, - const ModuleId& mux_module, - const std::string& parent_module_path) { +void print_sdc_disable_routing_multiplexer_outputs(const std::string& sdc_dir, + const bool& flatten_names, + const MuxLibrary& mux_lib, + const CircuitLibrary& circuit_lib, + const ModuleManager& module_manager, + const ModuleId& top_module) { + /* Create the file name for Verilog netlist */ + std::string sdc_fname(sdc_dir + std::string(SDC_DISABLE_MUX_OUTPUTS_FILE_NAME)); - /* Build wildcard names for the instance names of multiple-instanced-blocks (MIB) - * We will find all the instance names and see there are common prefix - * If so, we can use wildcards - */ - std::map> wildcard_names; + /* Start time count */ + std::string timer_message = std::string("Write SDC to disable routing multiplexer outputs for P&R flow '") + sdc_fname + std::string("'"); + vtr::ScopedStartFinishTimer timer(timer_message); - /* For each child, we will go one level down in priority */ - for (const ModuleId& child_module : module_manager.child_modules(parent_module)) { + /* Create the file stream */ + std::fstream fp; + fp.open(sdc_fname, std::fstream::out | std::fstream::trunc); - /* Iterate over the child instances*/ - for (const size_t& child_instance : module_manager.child_module_instances(parent_module, child_module)) { - std::string child_module_path = parent_module_path; + check_file_stream(sdc_fname.c_str(), fp); - std::string child_instance_name; - if (true == module_manager.instance_name(parent_module, child_module, child_instance).empty()) { - child_instance_name = generate_instance_name(module_manager.module_name(child_module), child_instance); - } else { - child_instance_name = module_manager.instance_name(parent_module, child_module, child_instance); - } + /* Generate the descriptions*/ + print_sdc_file_header(fp, std::string("Disable routing multiplexer outputs for PnR")); - if (false == flatten_names) { - /* Try to adapt to a wildcard name: replace all the numbers with a wildcard character '*' */ - WildCardString wildcard_str(child_instance_name); - /* If the wildcard name is already in the list, we can skip this - * Otherwise, we have to - * - output this instance - * - record the wildcard name in the map - */ - if ( (0 < wildcard_names.count(child_module)) - && (wildcard_names.at(child_module).end() != std::find(wildcard_names.at(child_module).begin(), - wildcard_names.at(child_module).end(), - wildcard_str.data())) ) { - continue; - } + /* Iterate over the MUX modules */ + for (const MuxId& mux_id : mux_lib.muxes()) { + const CircuitModelId& mux_model = mux_lib.mux_circuit_model(mux_id); + + /* Skip LUTs, we only care about multiplexers here */ + if (CIRCUIT_MODEL_MUX != circuit_lib.model_type(mux_model)) { + continue; + } - child_module_path += wildcard_str.data(); - - wildcard_names[child_module].push_back(wildcard_str.data()); - } else { - child_module_path += child_instance_name; - } - - child_module_path = format_dir_path(child_module_path); + const MuxGraph& mux_graph = mux_lib.mux_graph(mux_id); + std::string mux_module_name = generate_mux_subckt_name(circuit_lib, mux_model, + find_mux_num_datapath_inputs(circuit_lib, mux_model, mux_graph.num_inputs()), + std::string("")); - /* If this is NOT the MUX module we want, we go recursively */ - if (mux_module != child_module) { - rec_print_pnr_sdc_disable_routing_multiplexer_outputs(fp, flatten_names, - module_manager, - child_module, - mux_module, - child_module_path); - continue; - } + /* Find the module name in module manager */ + ModuleId mux_module = module_manager.find_module(mux_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(mux_module)); - /* Validate file stream */ - valid_file_stream(fp); - - /* Reach here, this is the MUX module we want, disable the outputs */ - for (const BasicPort& output_port : module_manager.module_ports_by_type(mux_module, ModuleManager::MODULE_OUTPUT_PORT)) { - fp << "set_disable_timing "; - fp << child_module_path << output_port.get_name(); - fp << std::endl; - } + /* Go recursively in the module manager, + * starting from the top-level module: instance id of the top-level module is 0 by default + * Disable all the outputs of child modules that matches the mux_module id + */ + for (const BasicPort& output_port : module_manager.module_ports_by_type(mux_module, ModuleManager::MODULE_OUTPUT_PORT)) { + rec_print_sdc_disable_timing_for_module_ports(fp, + flatten_names, + module_manager, + top_module, + mux_module, + format_dir_path(module_manager.module_name(top_module)), + output_port.get_name()); } } + + /* Close file handler */ + fp.close(); +} + +/******************************************************************** + * Break combinational loops in FPGA fabric, which mainly come from + * loops of multiplexers. + * To handle this, we disable the timing at configuration ports of routing multiplexers + * + * Return code: + * 0: success + * 1: fatal error occurred + *******************************************************************/ +int print_sdc_disable_routing_multiplexer_configure_ports(std::fstream& fp, + const bool& flatten_names, + const MuxLibrary& mux_lib, + const CircuitLibrary& circuit_lib, + const ModuleManager& module_manager, + const ModuleId& top_module) { + + if (false == valid_file_stream(fp)) { + return CMD_EXEC_FATAL_ERROR; + } + + /* Iterate over the MUX modules */ + for (const MuxId& mux_id : mux_lib.muxes()) { + const CircuitModelId& mux_model = mux_lib.mux_circuit_model(mux_id); + + const MuxGraph& mux_graph = mux_lib.mux_graph(mux_id); + std::string mux_module_name = generate_mux_subckt_name(circuit_lib, mux_model, + find_mux_num_datapath_inputs(circuit_lib, mux_model, mux_graph.num_inputs()), + std::string("")); + + /* Find the module name in module manager */ + ModuleId mux_module = module_manager.find_module(mux_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(mux_module)); + + /* Go recursively in the module manager, + * starting from the top-level module: instance id of the top-level module is 0 by default + * Disable all the outputs of child modules that matches the mux_module id + */ + for (const CircuitPortId& mux_sram_port : circuit_lib.model_ports_by_type(mux_model, CIRCUIT_MODEL_PORT_SRAM)) { + const std::string& mux_sram_port_name = circuit_lib.port_prefix(mux_sram_port); + VTR_ASSERT(true == module_manager.valid_module_port_id(mux_module, module_manager.find_module_port(mux_module, mux_sram_port_name))); + if (CMD_EXEC_FATAL_ERROR == + rec_print_sdc_disable_timing_for_module_ports(fp, + flatten_names, + module_manager, + top_module, + mux_module, + format_dir_path(module_manager.module_name(top_module)), + mux_sram_port_name)) { + return CMD_EXEC_FATAL_ERROR; + } + + const std::string& mux_sram_inv_port_name = circuit_lib.port_prefix(mux_sram_port) + "_inv"; + VTR_ASSERT(true == module_manager.valid_module_port_id(mux_module, module_manager.find_module_port(mux_module, mux_sram_inv_port_name))); + if (CMD_EXEC_FATAL_ERROR == + rec_print_sdc_disable_timing_for_module_ports(fp, + flatten_names, + module_manager, + top_module, + mux_module, + format_dir_path(module_manager.module_name(top_module)), + mux_sram_inv_port_name)) { + return CMD_EXEC_FATAL_ERROR; + } + } + + } + + return CMD_EXEC_SUCCESS; } } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_sdc/sdc_mux_utils.h b/openfpga/src/fpga_sdc/sdc_mux_utils.h index 70089aa93..a63a42bb3 100644 --- a/openfpga/src/fpga_sdc/sdc_mux_utils.h +++ b/openfpga/src/fpga_sdc/sdc_mux_utils.h @@ -6,6 +6,8 @@ *******************************************************************/ #include #include +#include "mux_library.h" +#include "circuit_library.h" #include "module_manager.h" /******************************************************************** @@ -15,12 +17,19 @@ /* begin namespace openfpga */ namespace openfpga { -void rec_print_pnr_sdc_disable_routing_multiplexer_outputs(std::fstream& fp, - const bool& flatten_names, - const ModuleManager& module_manager, - const ModuleId& parent_module, - const ModuleId& mux_module, - const std::string& parent_module_path); +void print_sdc_disable_routing_multiplexer_outputs(const std::string& sdc_dir, + const bool& flatten_names, + const MuxLibrary& mux_lib, + const CircuitLibrary& circuit_lib, + const ModuleManager& module_manager, + const ModuleId& top_module); + +int print_sdc_disable_routing_multiplexer_configure_ports(std::fstream& fp, + const bool& flatten_names, + const MuxLibrary& mux_lib, + const CircuitLibrary& circuit_lib, + const ModuleManager& module_manager, + const ModuleId& top_module); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp index 93a3a94aa..e448d806e 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_writer_utils.cpp @@ -4,12 +4,16 @@ #include #include #include +#include /* Headers from vtrutil library */ #include "vtr_assert.h" /* Headers from openfpgautil library */ #include "openfpga_digest.h" +#include "openfpga_wildcard_string.h" + +#include "openfpga_naming.h" #include "sdc_writer_utils.h" @@ -295,4 +299,111 @@ void print_sdc_set_port_output_delay(std::fstream& fp, fp << std::endl; } +/******************************************************************** + * Print SDC commands to disable a given port of modules + * in a given module id + * This function will be executed in a recursive way, + * using a Depth-First Search (DFS) strategy + * It will iterate over all the configurable children under each module + * and print a SDC command to disable its outputs + * + * Return code: + * 0: success + * 1: fatal error occurred + * + * Note: + * - When flatten_names is true + * this function will not apply any wildcard to names + * - When flatten_names is false + * It will straightforwardly output the instance name and port name + * This function will try to apply wildcard to names + * so that SDC file size can be minimal + *******************************************************************/ +int rec_print_sdc_disable_timing_for_module_ports(std::fstream& fp, + const bool& flatten_names, + const ModuleManager& module_manager, + const ModuleId& parent_module, + const ModuleId& module_to_disable, + const std::string& parent_module_path, + const std::string& disable_port_name) { + + if (false == valid_file_stream(fp)) { + return 1; + } + + /* Build wildcard names for the instance names of multiple-instanced-blocks (MIB) + * We will find all the instance names and see there are common prefix + * If so, we can use wildcards + */ + std::map> wildcard_names; + + /* For each child, we will go one level down in priority */ + for (const ModuleId& child_module : module_manager.child_modules(parent_module)) { + + /* Iterate over the child instances*/ + for (const size_t& child_instance : module_manager.child_module_instances(parent_module, child_module)) { + std::string child_module_path = parent_module_path; + + std::string child_instance_name; + if (true == module_manager.instance_name(parent_module, child_module, child_instance).empty()) { + child_instance_name = generate_instance_name(module_manager.module_name(child_module), child_instance); + } else { + child_instance_name = module_manager.instance_name(parent_module, child_module, child_instance); + } + + if (false == flatten_names) { + /* Try to adapt to a wildcard name: replace all the numbers with a wildcard character '*' */ + WildCardString wildcard_str(child_instance_name); + /* If the wildcard name is already in the list, we can skip this + * Otherwise, we have to + * - output this instance + * - record the wildcard name in the map + */ + if ( (0 < wildcard_names.count(child_module)) + && (wildcard_names.at(child_module).end() != std::find(wildcard_names.at(child_module).begin(), + wildcard_names.at(child_module).end(), + wildcard_str.data())) ) { + continue; + } + + child_module_path += wildcard_str.data(); + + wildcard_names[child_module].push_back(wildcard_str.data()); + } else { + child_module_path += child_instance_name; + } + + child_module_path = format_dir_path(child_module_path); + + /* If this is NOT the MUX module we want, we go recursively */ + if (module_to_disable != child_module) { + int status = rec_print_sdc_disable_timing_for_module_ports(fp, flatten_names, + module_manager, + child_module, + module_to_disable, + child_module_path, + disable_port_name); + if (1 == status) { + return 1; /* FATAL ERRORS */ + } + continue; + } + + /* Validate file stream */ + valid_file_stream(fp); + + /* Reach here, this is the MUX module we want, disable the outputs */ + ModulePortId port_to_disable = module_manager.find_module_port(module_to_disable, disable_port_name); + if (ModulePortId::INVALID() == port_to_disable) { + return 1; /* FATAL ERRORS */ + } + fp << "set_disable_timing "; + fp << child_module_path << module_manager.module_port(module_to_disable, port_to_disable).get_name(); + fp << std::endl; + } + } + + return 0; /* Success */ +} + } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_sdc/sdc_writer_utils.h b/openfpga/src/fpga_sdc/sdc_writer_utils.h index 4b353045b..7a3861737 100644 --- a/openfpga/src/fpga_sdc/sdc_writer_utils.h +++ b/openfpga/src/fpga_sdc/sdc_writer_utils.h @@ -74,6 +74,14 @@ void print_sdc_set_port_output_delay(std::fstream& fp, const BasicPort& clock_port, const float& delay); +int rec_print_sdc_disable_timing_for_module_ports(std::fstream& fp, + const bool& flatten_names, + const ModuleManager& module_manager, + const ModuleId& parent_module, + const ModuleId& module_to_disable, + const std::string& parent_module_path, + const std::string& disable_port_name); + } /* end namespace openfpga */ #endif diff --git a/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga index 326bdba6a..8b523f4ae 100644 --- a/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga @@ -58,6 +58,9 @@ write_pnr_sdc --file ./SDC # Write SDC to constrain timing of configuration chain write_configuration_chain_sdc --file ./SDC/ccff_timing.sdc --time_unit ns --max_delay 5 --min_delay 2.5 +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + # Write the SDC to run timing analysis for a mapped FPGA fabric write_analysis_sdc --file ./SDC_analysis diff --git a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga index 1ccd8418d..f1dc80820 100644 --- a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga @@ -55,6 +55,9 @@ write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE # - Turn on every options here write_pnr_sdc --file ./SDC +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + # Write the SDC to run timing analysis for a mapped FPGA fabric write_analysis_sdc --file ./SDC_analysis From f4dd882f0f974b12f98348ddeedd2b65df84a585 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 14 May 2020 16:57:07 -0600 Subject: [PATCH 061/180] documentation updated for new command --- docs/source/openfpga_shell/openfpga_commands.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/source/openfpga_shell/openfpga_commands.rst b/docs/source/openfpga_shell/openfpga_commands.rst index c07b7a71c..4e5770ebd 100644 --- a/docs/source/openfpga_shell/openfpga_commands.rst +++ b/docs/source/openfpga_shell/openfpga_commands.rst @@ -237,6 +237,13 @@ FPGA-SDC .. note:: Only applicable when configuration chain is used as configuration protocol +.. option:: write_sdc_disable_timing_configure_ports + + Write the SDC file to disable timing for configure ports of programmable modules. The SDC aims to break the combinational loops across FPGAs and avoid false path timing to be visible to timing analyzers + + - ``--file`` or ``-f`` Specify the output SDC file + + - ``--flatten_names`` Use flatten names (no wildcards) in SDC files .. option:: write_analysis_sdc From 067d09f9542bccef2765a92a295ab3e9b37590f0 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 14 May 2020 17:13:05 -0600 Subject: [PATCH 062/180] bug fix for configure port disable_timing writer --- openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp | 5 ++++- openfpga/src/fpga_sdc/sdc_mux_utils.cpp | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp index c38a2d725..ee9c83667 100644 --- a/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp @@ -25,6 +25,8 @@ #include "openfpga_naming.h" +#include "circuit_library_utils.h" + #include "sdc_writer_naming.h" #include "sdc_writer_utils.h" #include "sdc_mux_utils.h" @@ -76,8 +78,9 @@ int print_sdc_disable_non_mux_circuit_configure_ports(std::fstream& fp, * starting from the top-level module: instance id of the top-level module is 0 by default * Disable all the outputs of child modules that matches the mux_module id */ - for (const CircuitPortId& sram_port : circuit_lib.model_ports_by_type(model, CIRCUIT_MODEL_PORT_SRAM)) { + for (const CircuitPortId& sram_port : find_circuit_mode_select_sram_ports(circuit_lib, model)) { const std::string& sram_port_name = circuit_lib.port_lib_name(sram_port); + VTR_ASSERT(true == module_manager.valid_module_port_id(programmable_module, module_manager.find_module_port(programmable_module, sram_port_name))); if (CMD_EXEC_FATAL_ERROR == rec_print_sdc_disable_timing_for_module_ports(fp, flatten_names, diff --git a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp index 0d2770566..b72d17fdf 100644 --- a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp @@ -17,6 +17,7 @@ #include "openfpga_naming.h" #include "mux_utils.h" +#include "circuit_library_utils.h" #include "sdc_writer_naming.h" #include "sdc_writer_utils.h" @@ -127,8 +128,8 @@ int print_sdc_disable_routing_multiplexer_configure_ports(std::fstream& fp, * starting from the top-level module: instance id of the top-level module is 0 by default * Disable all the outputs of child modules that matches the mux_module id */ - for (const CircuitPortId& mux_sram_port : circuit_lib.model_ports_by_type(mux_model, CIRCUIT_MODEL_PORT_SRAM)) { - const std::string& mux_sram_port_name = circuit_lib.port_prefix(mux_sram_port); + for (const CircuitPortId& mux_sram_port : find_circuit_regular_sram_ports(circuit_lib, mux_model)) { + const std::string& mux_sram_port_name = circuit_lib.port_lib_name(mux_sram_port); VTR_ASSERT(true == module_manager.valid_module_port_id(mux_module, module_manager.find_module_port(mux_module, mux_sram_port_name))); if (CMD_EXEC_FATAL_ERROR == rec_print_sdc_disable_timing_for_module_ports(fp, @@ -141,7 +142,7 @@ int print_sdc_disable_routing_multiplexer_configure_ports(std::fstream& fp, return CMD_EXEC_FATAL_ERROR; } - const std::string& mux_sram_inv_port_name = circuit_lib.port_prefix(mux_sram_port) + "_inv"; + const std::string& mux_sram_inv_port_name = circuit_lib.port_lib_name(mux_sram_port) + "_inv"; VTR_ASSERT(true == module_manager.valid_module_port_id(mux_module, module_manager.find_module_port(mux_module, mux_sram_inv_port_name))); if (CMD_EXEC_FATAL_ERROR == rec_print_sdc_disable_timing_for_module_ports(fp, From 910be3cadb0197d9254d1c1b0bfc6b0210ae6fb9 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 14 May 2020 17:23:58 -0600 Subject: [PATCH 063/180] massively deploy disable_timing for configure ports in CI --- .../duplicated_grid_pin_example_script.openfpga | 3 +++ .../flatten_routing_example_script.openfpga | 3 +++ .../generate_fabric_example_script.openfpga | 3 +++ .../implicit_verilog_example_script.openfpga | 3 +++ .../OpenFPGAShellScripts/mcnc_example_script.openfpga | 3 +++ .../OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga | 3 +++ 6 files changed, 18 insertions(+) diff --git a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga index 1ccd8418d..f1dc80820 100644 --- a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga @@ -55,6 +55,9 @@ write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE # - Turn on every options here write_pnr_sdc --file ./SDC +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + # Write the SDC to run timing analysis for a mapped FPGA fabric write_analysis_sdc --file ./SDC_analysis diff --git a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga index 529fc19ae..88be8a878 100644 --- a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga @@ -55,6 +55,9 @@ write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE # - Turn on every options here write_pnr_sdc --file ./SDC +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + # Write the SDC to run timing analysis for a mapped FPGA fabric write_analysis_sdc --file ./SDC_analysis diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga index 6514f36b4..ff40f4c76 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga @@ -29,6 +29,9 @@ write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --inc # - Turn on every options here write_pnr_sdc --file ./SDC +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + # Finish and exit OpenFPGA exit diff --git a/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga index aa4ea30ad..579e113a9 100644 --- a/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga @@ -55,6 +55,9 @@ write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE # - Turn on every options here write_pnr_sdc --file ./SDC +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + # Write the SDC to run timing analysis for a mapped FPGA fabric write_analysis_sdc --file ./SDC_analysis diff --git a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga index 71d3ee294..3293979ea 100644 --- a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga @@ -59,6 +59,9 @@ write_verilog_testbench --file ./SRC --reference_benchmark_file_path ./${REFEREN # - Turn on every options here write_pnr_sdc --file ./SDC +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + # Write the SDC to run timing analysis for a mapped FPGA fabric write_analysis_sdc --file ./SDC_analysis diff --git a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga index 39c4d1c70..b4b6ff5ef 100644 --- a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga @@ -55,6 +55,9 @@ write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE # - Turn on every options here write_pnr_sdc --time_unit ps --file ./SDC +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + # Write the SDC to run timing analysis for a mapped FPGA fabric write_analysis_sdc --time_unit ps --file ./SDC_analysis From e9ceedb01ba1bcaade45c24520196f45314620ba Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 14 May 2020 19:59:39 -0600 Subject: [PATCH 064/180] use constant openfpga context in SDC generator --- openfpga/src/base/openfpga_sdc.cpp | 4 ++-- openfpga/src/base/openfpga_sdc.h | 4 ++-- openfpga/src/base/openfpga_sdc_command.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openfpga/src/base/openfpga_sdc.cpp b/openfpga/src/base/openfpga_sdc.cpp index bba115d3c..148f5414b 100644 --- a/openfpga/src/base/openfpga_sdc.cpp +++ b/openfpga/src/base/openfpga_sdc.cpp @@ -28,7 +28,7 @@ namespace openfpga { /******************************************************************** * A wrapper function to call the PnR SDC generator of FPGA-SDC *******************************************************************/ -int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, +int write_pnr_sdc(const OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context) { CommandOptionId opt_output_dir = cmd.option("file"); @@ -168,7 +168,7 @@ int write_sdc_disable_timing_configure_ports(const OpenfpgaContext& openfpga_ctx /******************************************************************** * A wrapper function to call the analysis SDC generator of FPGA-SDC *******************************************************************/ -int write_analysis_sdc(OpenfpgaContext& openfpga_ctx, +int write_analysis_sdc(const OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context) { CommandOptionId opt_output_dir = cmd.option("file"); diff --git a/openfpga/src/base/openfpga_sdc.h b/openfpga/src/base/openfpga_sdc.h index 03f4af03f..2dd97b72a 100644 --- a/openfpga/src/base/openfpga_sdc.h +++ b/openfpga/src/base/openfpga_sdc.h @@ -15,7 +15,7 @@ /* begin namespace openfpga */ namespace openfpga { -int write_pnr_sdc(OpenfpgaContext& openfpga_ctx, +int write_pnr_sdc(const OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context); int write_configuration_chain_sdc(const OpenfpgaContext& openfpga_ctx, @@ -24,7 +24,7 @@ int write_configuration_chain_sdc(const OpenfpgaContext& openfpga_ctx, int write_sdc_disable_timing_configure_ports(const OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context); -int write_analysis_sdc(OpenfpgaContext& openfpga_ctx, +int write_analysis_sdc(const OpenfpgaContext& openfpga_ctx, const Command& cmd, const CommandContext& cmd_context); } /* end namespace openfpga */ diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index 17910a711..bf207c33f 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -72,7 +72,7 @@ ShellCommandId add_openfpga_write_pnr_sdc_command(openfpga::Shell Date: Thu, 14 May 2020 20:02:42 -0600 Subject: [PATCH 065/180] use error code in read_arch command --- libopenfpga/libarchopenfpga/src/check_circuit_library.cpp | 6 +++--- libopenfpga/libarchopenfpga/src/check_circuit_library.h | 2 +- openfpga/src/base/openfpga_read_arch.cpp | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp index 0abc16a0e..f5392a2e4 100644 --- a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp +++ b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp @@ -447,7 +447,7 @@ size_t check_circuit_library_ports(const CircuitLibrary& circuit_lib) { * 9. LUT must have at least an input, an output and a SRAM ports * 10. We must have default circuit models for these types: MUX, channel wires and wires ***********************************************************************/ -void check_circuit_library(const CircuitLibrary& circuit_lib) { +bool check_circuit_library(const CircuitLibrary& circuit_lib) { size_t num_err = 0; vtr::ScopedStartFinishTimer timer("Check circuit library"); @@ -545,10 +545,10 @@ void check_circuit_library(const CircuitLibrary& circuit_lib) { if (0 < num_err) { VTR_LOG("Finished checking circuit library with %d errors!\n", num_err); - exit(1); + return false; } VTR_LOG("Checking circuit library passed.\n"); - return; + return true; } diff --git a/libopenfpga/libarchopenfpga/src/check_circuit_library.h b/libopenfpga/libarchopenfpga/src/check_circuit_library.h index 7a056d796..a6690f60c 100644 --- a/libopenfpga/libarchopenfpga/src/check_circuit_library.h +++ b/libopenfpga/libarchopenfpga/src/check_circuit_library.h @@ -43,6 +43,6 @@ size_t check_sram_circuit_model_ports(const CircuitLibrary& circuit_lib, const CircuitModelId& circuit_model, const bool& check_blwl); -void check_circuit_library(const CircuitLibrary& circuit_lib); +bool check_circuit_library(const CircuitLibrary& circuit_lib); #endif diff --git a/openfpga/src/base/openfpga_read_arch.cpp b/openfpga/src/base/openfpga_read_arch.cpp index 214af1612..ee0670268 100644 --- a/openfpga/src/base/openfpga_read_arch.cpp +++ b/openfpga/src/base/openfpga_read_arch.cpp @@ -46,9 +46,10 @@ int read_arch(OpenfpgaContext& openfpga_context, * 2. Technology library (TODO) * 3. Simulation settings (TODO) */ - check_circuit_library(openfpga_context.arch().circuit_lib); + if (false == check_circuit_library(openfpga_context.arch().circuit_lib)) { + return CMD_EXEC_FATAL_ERROR; + } - /* TODO: should identify the error code from internal function execution */ return CMD_EXEC_SUCCESS; } From 6177921d4c1264c1033451f8b670e75c2fbbd924 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 17 May 2020 19:31:46 -0600 Subject: [PATCH 066/180] bug fixed in configure port disable timing. Now we disable the right ports of LUTs --- .../fpga_sdc/configure_port_sdc_writer.cpp | 87 +++++++++++++++++++ openfpga/src/fpga_sdc/sdc_mux_utils.cpp | 5 ++ 2 files changed, 92 insertions(+) diff --git a/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp index ee9c83667..a2a04f003 100644 --- a/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp @@ -35,6 +35,76 @@ /* begin namespace openfpga */ namespace openfpga { +/******************************************************************** + * Break combinational loops in FPGA fabric, which mainly come from + * Look-Up Table programmable modules + * To handle this, we disable the timing at configuration ports + * + * Return code: + * 0: success + * 1: fatal error occurred + *******************************************************************/ +static +int print_sdc_disable_lut_configure_ports(std::fstream& fp, + const bool& flatten_names, + const CircuitLibrary& circuit_lib, + const ModuleManager& module_manager, + const ModuleId& top_module) { + + if (false == valid_file_stream(fp)) { + return CMD_EXEC_FATAL_ERROR; + } + + /* Iterate over the MUX modules */ + for (const CircuitModelId& model : circuit_lib.models()) { + + /* Only care LUTs */ + if (CIRCUIT_MODEL_LUT != circuit_lib.model_type(model)) { + continue; + } + + std::string programmable_module_name = circuit_lib.model_name(model); + + /* Find the module name in module manager */ + ModuleId programmable_module = module_manager.find_module(programmable_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(programmable_module)); + + /* Go recursively in the module manager, + * starting from the top-level module: instance id of the top-level module is 0 by default + * Disable all the outputs of child modules that matches the mux_module id + */ + for (const CircuitPortId& sram_port : circuit_lib.model_ports_by_type(model, CIRCUIT_MODEL_PORT_SRAM)) { + const std::string& sram_port_name = circuit_lib.port_lib_name(sram_port); + VTR_ASSERT(true == module_manager.valid_module_port_id(programmable_module, module_manager.find_module_port(programmable_module, sram_port_name))); + if (CMD_EXEC_FATAL_ERROR == + rec_print_sdc_disable_timing_for_module_ports(fp, + flatten_names, + module_manager, + top_module, + programmable_module, + format_dir_path(module_manager.module_name(top_module)), + sram_port_name)) { + return CMD_EXEC_FATAL_ERROR; + } + + const std::string& sram_inv_port_name = circuit_lib.port_lib_name(sram_port) + "_inv"; + VTR_ASSERT(true == module_manager.valid_module_port_id(programmable_module, module_manager.find_module_port(programmable_module, sram_inv_port_name))); + if (CMD_EXEC_FATAL_ERROR == + rec_print_sdc_disable_timing_for_module_ports(fp, + flatten_names, + module_manager, + top_module, + programmable_module, + format_dir_path(module_manager.module_name(top_module)), + sram_inv_port_name)) { + return CMD_EXEC_FATAL_ERROR; + } + } + } + + return CMD_EXEC_SUCCESS; +} + /******************************************************************** * Break combinational loops in FPGA fabric, which mainly come from * non-MUX programmable modules @@ -63,6 +133,11 @@ int print_sdc_disable_non_mux_circuit_configure_ports(std::fstream& fp, continue; } + /* Skip LUTs, they are handled in another function */ + if (CIRCUIT_MODEL_LUT == circuit_lib.model_type(model)) { + continue; + } + /* We care programmable circuit models only */ if (0 == circuit_lib.model_ports_by_type(model, CIRCUIT_MODEL_PORT_SRAM).size()) { continue; @@ -128,6 +203,18 @@ int print_sdc_disable_timing_configure_ports(const std::string& sdc_fname, std::string top_module_name = generate_fpga_top_module_name(); ModuleId top_module = module_manager.find_module(top_module_name); VTR_ASSERT(true == module_manager.valid_module_id(top_module)); + + /* Disable timing for the configure ports of all the Look-Up Tables */ + VTR_LOG("Write disable timing for Look-Up Tables..."); + if (CMD_EXEC_FATAL_ERROR == print_sdc_disable_lut_configure_ports(fp, + flatten_names, + circuit_lib, + module_manager, + top_module)) { + VTR_LOG("Fatal errors occurred\n"); + return CMD_EXEC_FATAL_ERROR; + } + VTR_LOG("Done\n"); /* Disable timing for the configure ports of all the routing multiplexer */ VTR_LOG("Write disable timing for routing multiplexers..."); diff --git a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp index b72d17fdf..c0fd21fca 100644 --- a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp @@ -114,6 +114,11 @@ int print_sdc_disable_routing_multiplexer_configure_ports(std::fstream& fp, /* Iterate over the MUX modules */ for (const MuxId& mux_id : mux_lib.muxes()) { const CircuitModelId& mux_model = mux_lib.mux_circuit_model(mux_id); + + /* Skip LUTs, we only care about multiplexers here */ + if (CIRCUIT_MODEL_MUX != circuit_lib.model_type(mux_model)) { + continue; + } const MuxGraph& mux_graph = mux_lib.mux_graph(mux_id); std::string mux_module_name = generate_mux_subckt_name(circuit_lib, mux_model, From 8915d10d2790e296525f9c9c16c11b3a606978a6 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 17 May 2020 19:36:57 -0600 Subject: [PATCH 067/180] add verbose output option to configure port disable timing writer --- openfpga/src/base/openfpga_sdc.cpp | 4 +++- openfpga/src/base/openfpga_sdc_command.cpp | 3 +++ .../fpga_sdc/configure_port_sdc_writer.cpp | 24 +++++++++++-------- .../src/fpga_sdc/configure_port_sdc_writer.h | 3 ++- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/openfpga/src/base/openfpga_sdc.cpp b/openfpga/src/base/openfpga_sdc.cpp index 148f5414b..2d44520db 100644 --- a/openfpga/src/base/openfpga_sdc.cpp +++ b/openfpga/src/base/openfpga_sdc.cpp @@ -149,6 +149,7 @@ int write_sdc_disable_timing_configure_ports(const OpenfpgaContext& openfpga_ctx /* Get command options */ CommandOptionId opt_output_dir = cmd.option("file"); CommandOptionId opt_flatten_names = cmd.option("flatten_names"); + CommandOptionId opt_verbose = cmd.option("verbose"); std::string sdc_dir_path = format_dir_path(cmd_context.option_value(cmd, opt_output_dir)); @@ -158,7 +159,8 @@ int write_sdc_disable_timing_configure_ports(const OpenfpgaContext& openfpga_ctx cmd_context.option_enable(cmd, opt_flatten_names), openfpga_ctx.mux_lib(), openfpga_ctx.arch().circuit_lib, - openfpga_ctx.module_graph())) { + openfpga_ctx.module_graph(), + cmd_context.option_enable(cmd, opt_verbose))) { return CMD_EXEC_FATAL_ERROR; } diff --git a/openfpga/src/base/openfpga_sdc_command.cpp b/openfpga/src/base/openfpga_sdc_command.cpp index bf207c33f..5459b7fec 100644 --- a/openfpga/src/base/openfpga_sdc_command.cpp +++ b/openfpga/src/base/openfpga_sdc_command.cpp @@ -138,6 +138,9 @@ ShellCommandId add_openfpga_write_sdc_disable_timing_configure_ports_command(ope /* Add an option '--flatten_name' */ shell_cmd.add_option("flatten_names", false, "Use flatten names (no wildcards) in SDC files"); + /* Add an option '--verbose' */ + shell_cmd.add_option("verbose", false, "Enable verbose outputs"); + /* Add command 'write_configuration_chain_sdc' to the Shell */ ShellCommandId shell_cmd_id = shell.add_command(shell_cmd, "generate SDC files to disable timing for configure ports across FPGA fabric"); shell.set_command_class(shell_cmd_id, cmd_class_id); diff --git a/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp index a2a04f003..e0508d3f4 100644 --- a/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp @@ -183,7 +183,8 @@ int print_sdc_disable_timing_configure_ports(const std::string& sdc_fname, const bool& flatten_names, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const ModuleManager& module_manager) { + const ModuleManager& module_manager, + const bool& verbose) { /* Create the directory */ create_directory(find_path_dir_name(sdc_fname)); @@ -205,41 +206,44 @@ int print_sdc_disable_timing_configure_ports(const std::string& sdc_fname, VTR_ASSERT(true == module_manager.valid_module_id(top_module)); /* Disable timing for the configure ports of all the Look-Up Tables */ - VTR_LOG("Write disable timing for Look-Up Tables..."); + VTR_LOGV(verbose, "Write disable timing for Look-Up Tables..."); if (CMD_EXEC_FATAL_ERROR == print_sdc_disable_lut_configure_ports(fp, flatten_names, circuit_lib, module_manager, top_module)) { - VTR_LOG("Fatal errors occurred\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Fatal errors occurred\n"); return CMD_EXEC_FATAL_ERROR; } - VTR_LOG("Done\n"); + VTR_LOGV(verbose, "Done\n"); /* Disable timing for the configure ports of all the routing multiplexer */ - VTR_LOG("Write disable timing for routing multiplexers..."); + VTR_LOGV(verbose, "Write disable timing for routing multiplexers..."); if (CMD_EXEC_FATAL_ERROR == print_sdc_disable_routing_multiplexer_configure_ports(fp, flatten_names, mux_lib, circuit_lib, module_manager, top_module)) { - VTR_LOG("Fatal errors occurred\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Fatal errors occurred\n"); return CMD_EXEC_FATAL_ERROR; } - VTR_LOG("Done\n"); + VTR_LOGV(verbose, "Done\n"); /* Disable timing for the other programmable circuit models */ - VTR_LOG("Write disable timing for other programmable modules..."); + VTR_LOGV(verbose, "Write disable timing for other programmable modules..."); if (CMD_EXEC_FATAL_ERROR == print_sdc_disable_non_mux_circuit_configure_ports(fp, flatten_names, circuit_lib, module_manager, top_module)) { - VTR_LOG("Fatal errors occurred\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Fatal errors occurred\n"); return CMD_EXEC_FATAL_ERROR; } - VTR_LOG("Done\n"); + VTR_LOGV(verbose, "Done\n"); /* Close file handler */ fp.close(); diff --git a/openfpga/src/fpga_sdc/configure_port_sdc_writer.h b/openfpga/src/fpga_sdc/configure_port_sdc_writer.h index ef66af749..b8b4791d6 100644 --- a/openfpga/src/fpga_sdc/configure_port_sdc_writer.h +++ b/openfpga/src/fpga_sdc/configure_port_sdc_writer.h @@ -19,7 +19,8 @@ int print_sdc_disable_timing_configure_ports(const std::string& sdc_fname, const bool& flatten_names, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, - const ModuleManager& module_manager); + const ModuleManager& module_manager, + const bool& verbose); } /* end namespace openfpga */ From c2a81c76e1a1ba50d06a21d21db2b2e16db6e68f Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 17 May 2020 19:38:13 -0600 Subject: [PATCH 068/180] update doc for new options --- docs/source/openfpga_shell/openfpga_commands.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/openfpga_shell/openfpga_commands.rst b/docs/source/openfpga_shell/openfpga_commands.rst index 4e5770ebd..909a6416f 100644 --- a/docs/source/openfpga_shell/openfpga_commands.rst +++ b/docs/source/openfpga_shell/openfpga_commands.rst @@ -245,6 +245,8 @@ FPGA-SDC - ``--flatten_names`` Use flatten names (no wildcards) in SDC files + - ``--verbose`` Show verbose log + .. option:: write_analysis_sdc Write the SDC to run timing analysis for a mapped FPGA fabric From e089b0ef22412d13eed645519369eb471aacb1f3 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 17 May 2020 19:45:27 -0600 Subject: [PATCH 069/180] use constant string for inverted port naming --- openfpga/src/base/openfpga_reserved_words.h | 3 +++ openfpga/src/fabric/build_lut_modules.cpp | 7 ++++--- openfpga/src/fabric/build_mux_modules.cpp | 6 +++--- openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp | 3 ++- openfpga/src/fpga_sdc/sdc_mux_utils.cpp | 3 ++- openfpga/src/utils/module_manager_utils.cpp | 5 +++-- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/openfpga/src/base/openfpga_reserved_words.h b/openfpga/src/base/openfpga_reserved_words.h index f04490c0d..be47315ba 100644 --- a/openfpga/src/base/openfpga_reserved_words.h +++ b/openfpga/src/base/openfpga_reserved_words.h @@ -30,6 +30,9 @@ constexpr char* GRID_MUX_INSTANCE_PREFIX = "mux_"; constexpr char* SWITCH_BLOCK_MUX_INSTANCE_PREFIX = "mux_"; constexpr char* CONNECTION_BLOCK_MUX_INSTANCE_PREFIX = "mux_"; +/* Inverted port naming */ +constexpr char* INV_PORT_POSTFIX = "_inv"; + /* Bitstream file strings */ constexpr char* BITSTREAM_XML_FILE_NAME_POSTFIX = "_bitstream.xml"; diff --git a/openfpga/src/fabric/build_lut_modules.cpp b/openfpga/src/fabric/build_lut_modules.cpp index 2ba688e4d..477308e08 100644 --- a/openfpga/src/fabric/build_lut_modules.cpp +++ b/openfpga/src/fabric/build_lut_modules.cpp @@ -10,6 +10,7 @@ #include "vtr_log.h" #include "vtr_time.h" +#include "openfpga_reserved_words.h" #include "openfpga_naming.h" #include "circuit_library_utils.h" #include "module_manager.h" @@ -106,7 +107,7 @@ void build_lut_module(ModuleManager& module_manager, for (const auto& port : lut_regular_sram_ports) { BasicPort mem_port(circuit_lib.port_prefix(port), circuit_lib.port_size(port)); module_manager.add_port(lut_module, mem_port, ModuleManager::MODULE_INPUT_PORT); - BasicPort mem_inv_port(std::string(circuit_lib.port_prefix(port) + "_inv"), circuit_lib.port_size(port)); + BasicPort mem_inv_port(std::string(circuit_lib.port_prefix(port) + INV_PORT_POSTFIX), circuit_lib.port_size(port)); module_manager.add_port(lut_module, mem_inv_port, ModuleManager::MODULE_INPUT_PORT); } @@ -114,7 +115,7 @@ void build_lut_module(ModuleManager& module_manager, for (const auto& port : lut_mode_select_sram_ports) { BasicPort mem_port(circuit_lib.port_prefix(port), circuit_lib.port_size(port)); module_manager.add_port(lut_module, mem_port, ModuleManager::MODULE_INPUT_PORT); - BasicPort mem_inv_port(std::string(circuit_lib.port_prefix(port) + "_inv"), circuit_lib.port_size(port)); + BasicPort mem_inv_port(std::string(circuit_lib.port_prefix(port) + INV_PORT_POSTFIX), circuit_lib.port_size(port)); module_manager.add_port(lut_module, mem_inv_port, ModuleManager::MODULE_INPUT_PORT); } @@ -336,7 +337,7 @@ void build_lut_module(ModuleManager& module_manager, module_manager.add_module_net_sink(lut_module, lut_mux_sram_nets[pin], lut_mux_module, lut_mux_instance, lut_mux_sram_port_id, pin); } - ModulePortId lut_mux_sram_inv_port_id = module_manager.find_module_port(lut_mux_module, std::string(circuit_lib.port_prefix(lut_regular_sram_ports[0]) + "_inv")); + ModulePortId lut_mux_sram_inv_port_id = module_manager.find_module_port(lut_mux_module, std::string(circuit_lib.port_prefix(lut_regular_sram_ports[0]) + INV_PORT_POSTFIX)); BasicPort lut_mux_sram_inv_port = module_manager.module_port(lut_mux_module, lut_mux_sram_inv_port_id); VTR_ASSERT(lut_mux_sram_inv_port.get_width() == lut_mux_sram_inv_nets.size()); /* Wire the port to lut_mux_sram_net */ diff --git a/openfpga/src/fabric/build_mux_modules.cpp b/openfpga/src/fabric/build_mux_modules.cpp index a28eac264..6bc2a55d5 100644 --- a/openfpga/src/fabric/build_mux_modules.cpp +++ b/openfpga/src/fabric/build_mux_modules.cpp @@ -977,7 +977,7 @@ void build_mux_module_local_encoders_and_memory_nets(ModuleManager& module_manag /* Add mem and mem_inv nets here */ size_t mem_inv_net_cnt = 0; for (const auto& port : mux_sram_ports) { - ModulePortId mem_inv_port_id = module_manager.find_module_port(mux_module, std::string(circuit_lib.port_prefix(port) + "_inv")); + ModulePortId mem_inv_port_id = module_manager.find_module_port(mux_module, std::string(circuit_lib.port_prefix(port) + INV_PORT_POSTFIX)); BasicPort mem_inv_port = module_manager.module_port(mux_module, mem_inv_port_id); for (const size_t& pin : mem_inv_port.pins()) { MuxMemId mem_id = MuxMemId(mem_inv_net_cnt); @@ -998,7 +998,7 @@ void build_mux_module_local_encoders_and_memory_nets(ModuleManager& module_manag /* Local port to record the LSB and MSB of each level, here, we deposite (0, 0) */ ModulePortId mux_module_sram_port_id = module_manager.find_module_port(mux_module, circuit_lib.port_prefix(mux_sram_ports[0])); - ModulePortId mux_module_sram_inv_port_id = module_manager.find_module_port(mux_module, circuit_lib.port_prefix(mux_sram_ports[0]) + "_inv"); + ModulePortId mux_module_sram_inv_port_id = module_manager.find_module_port(mux_module, circuit_lib.port_prefix(mux_sram_ports[0]) + INV_PORT_POSTFIX); BasicPort lvl_addr_port(circuit_lib.port_prefix(mux_sram_ports[0]), 0); BasicPort lvl_data_port(decoder_data_port.get_name(), 0); BasicPort lvl_data_inv_port(decoder_data_inv_port.get_name(), 0); @@ -1181,7 +1181,7 @@ void build_cmos_mux_module(ModuleManager& module_manager, for (const auto& port : mux_sram_ports) { BasicPort mem_port(circuit_lib.port_prefix(port), num_mems); module_manager.add_port(mux_module, mem_port, ModuleManager::MODULE_INPUT_PORT); - BasicPort mem_inv_port(std::string(circuit_lib.port_prefix(port) + "_inv"), num_mems); + BasicPort mem_inv_port(std::string(circuit_lib.port_prefix(port) + INV_PORT_POSTFIX), num_mems); module_manager.add_port(mux_module, mem_inv_port, ModuleManager::MODULE_INPUT_PORT); /* Update counter */ sram_port_cnt++; diff --git a/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp index e0508d3f4..42d5c030c 100644 --- a/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp +++ b/openfpga/src/fpga_sdc/configure_port_sdc_writer.cpp @@ -23,6 +23,7 @@ #include "openfpga_port.h" #include "openfpga_digest.h" +#include "openfpga_reserved_words.h" #include "openfpga_naming.h" #include "circuit_library_utils.h" @@ -87,7 +88,7 @@ int print_sdc_disable_lut_configure_ports(std::fstream& fp, return CMD_EXEC_FATAL_ERROR; } - const std::string& sram_inv_port_name = circuit_lib.port_lib_name(sram_port) + "_inv"; + const std::string& sram_inv_port_name = circuit_lib.port_lib_name(sram_port) + INV_PORT_POSTFIX; VTR_ASSERT(true == module_manager.valid_module_port_id(programmable_module, module_manager.find_module_port(programmable_module, sram_inv_port_name))); if (CMD_EXEC_FATAL_ERROR == rec_print_sdc_disable_timing_for_module_ports(fp, diff --git a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp index c0fd21fca..57fd8f8a1 100644 --- a/openfpga/src/fpga_sdc/sdc_mux_utils.cpp +++ b/openfpga/src/fpga_sdc/sdc_mux_utils.cpp @@ -14,6 +14,7 @@ /* Headers from openfpgautil library */ #include "openfpga_digest.h" +#include "openfpga_reserved_words.h" #include "openfpga_naming.h" #include "mux_utils.h" @@ -147,7 +148,7 @@ int print_sdc_disable_routing_multiplexer_configure_ports(std::fstream& fp, return CMD_EXEC_FATAL_ERROR; } - const std::string& mux_sram_inv_port_name = circuit_lib.port_lib_name(mux_sram_port) + "_inv"; + const std::string& mux_sram_inv_port_name = circuit_lib.port_lib_name(mux_sram_port) + INV_PORT_POSTFIX; VTR_ASSERT(true == module_manager.valid_module_port_id(mux_module, module_manager.find_module_port(mux_module, mux_sram_inv_port_name))); if (CMD_EXEC_FATAL_ERROR == rec_print_sdc_disable_timing_for_module_ports(fp, diff --git a/openfpga/src/utils/module_manager_utils.cpp b/openfpga/src/utils/module_manager_utils.cpp index a57e97261..b1408dcad 100644 --- a/openfpga/src/utils/module_manager_utils.cpp +++ b/openfpga/src/utils/module_manager_utils.cpp @@ -13,6 +13,7 @@ /* Headers from openfpgautil library */ #include "openfpga_port.h" +#include "openfpga_reserved_words.h" #include "openfpga_naming.h" #include "memory_utils.h" #include "pb_type_utils.h" @@ -612,11 +613,11 @@ void add_module_nets_between_logic_and_memory_sram_bus(ModuleManager& module_man std::vector logic_model_sramb_port_names; /* Regular sram port goes first */ for (CircuitPortId regular_sram_port : find_circuit_regular_sram_ports(circuit_lib, logic_model)) { - logic_model_sramb_port_names.push_back(circuit_lib.port_prefix(regular_sram_port) + std::string("_inv")); + logic_model_sramb_port_names.push_back(circuit_lib.port_prefix(regular_sram_port) + std::string(INV_PORT_POSTFIX)); } /* Mode-select sram port goes first */ for (CircuitPortId mode_select_sram_port : find_circuit_mode_select_sram_ports(circuit_lib, logic_model)) { - logic_model_sramb_port_names.push_back(circuit_lib.port_prefix(mode_select_sram_port) + std::string("_inv")); + logic_model_sramb_port_names.push_back(circuit_lib.port_prefix(mode_select_sram_port) + std::string(INV_PORT_POSTFIX)); } /* Find the port ids in the memory */ std::vector logic_module_sramb_port_ids; From 6f133bd009b2afa204e5f005ad4177b87ff79316 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 20 May 2020 18:49:21 -0600 Subject: [PATCH 070/180] bug fix in packable mode support --- vpr/src/pack/cluster_router.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/vpr/src/pack/cluster_router.cpp b/vpr/src/pack/cluster_router.cpp index 7f2cd37d9..49a60a805 100644 --- a/vpr/src/pack/cluster_router.cpp +++ b/vpr/src/pack/cluster_router.cpp @@ -208,6 +208,15 @@ static bool check_edge_for_route_conflicts(std::unordered_mappb_type->modes[mode_of_edge]; auto result = mode_map->insert(std::make_pair(pb_graph_node, mode)); + + /* Xifan Tang: Insert unpackable mode to the illegal mode list */ + if (false == mode->packable) { + if (std::find(pb_graph_node->illegal_modes.begin(), pb_graph_node->illegal_modes.end(), mode->index) == pb_graph_node->illegal_modes.end()) { + pb_graph_node->illegal_modes.push_back(mode->index); + } + return true; + } + if (!result.second) { if (result.first->second != mode) { std::cout << vtr::string_fmt("Differing modes for block. Got %s mode, while previously was %s for interconnect %s.", @@ -1173,10 +1182,6 @@ static void expand_node_all_modes(t_lb_router_data* router_data, t_expansion_nod if (cur_mode != -1 && mode != cur_mode) { continue; } - /* Xifan Tang: Do not expand in unpackable modes */ - if (false == pin->parent_node->pb_type->parent_mode->packable) { - continue; - } /* Check whether a mode is illegal. If it is then the node will not be expanded */ bool is_illegal = false; From bba476fef499e50801c65ecf190e7e6c95f2a089 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 22 May 2020 14:40:05 -0600 Subject: [PATCH 071/180] add explicit port mapping support to Verilog testbench generator --- openfpga/src/base/openfpga_verilog.cpp | 2 ++ .../src/base/openfpga_verilog_command.cpp | 3 +++ openfpga/src/fpga_verilog/verilog_api.cpp | 9 +++++--- .../verilog_formal_random_top_testbench.cpp | 21 ++++++++++++------- .../verilog_formal_random_top_testbench.h | 3 ++- .../verilog_preconfig_top_module.cpp | 6 ++++-- .../verilog_preconfig_top_module.h | 3 ++- .../verilog_testbench_options.cpp | 9 ++++++++ .../fpga_verilog/verilog_testbench_options.h | 3 +++ .../fpga_verilog/verilog_testbench_utils.cpp | 6 ++++-- .../fpga_verilog/verilog_testbench_utils.h | 3 ++- .../fpga_verilog/verilog_top_testbench.cpp | 14 ++++++++----- .../src/fpga_verilog/verilog_top_testbench.h | 3 ++- ...onfiguration_chain_example_script.openfpga | 2 +- ...uplicated_grid_pin_example_script.openfpga | 2 +- .../example_script.openfpga | 2 +- .../flatten_routing_example_script.openfpga | 2 +- ...generate_testbench_example_script.openfpga | 2 +- .../sdc_time_unit_example_script.openfpga | 2 +- 19 files changed, 68 insertions(+), 29 deletions(-) diff --git a/openfpga/src/base/openfpga_verilog.cpp b/openfpga/src/base/openfpga_verilog.cpp index 1d47055df..481bd2866 100644 --- a/openfpga/src/base/openfpga_verilog.cpp +++ b/openfpga/src/base/openfpga_verilog.cpp @@ -69,6 +69,7 @@ int write_verilog_testbench(OpenfpgaContext& openfpga_ctx, CommandOptionId opt_print_formal_verification_top_netlist = cmd.option("print_formal_verification_top_netlist"); CommandOptionId opt_print_preconfig_top_testbench = cmd.option("print_preconfig_top_testbench"); CommandOptionId opt_print_simulation_ini = cmd.option("print_simulation_ini"); + CommandOptionId opt_explicit_port_mapping = cmd.option("explicit_port_mapping"); CommandOptionId opt_verbose = cmd.option("verbose"); /* This is an intermediate data structure which is designed to modularize the FPGA-Verilog @@ -81,6 +82,7 @@ int write_verilog_testbench(OpenfpgaContext& openfpga_ctx, options.set_print_preconfig_top_testbench(cmd_context.option_enable(cmd, opt_print_preconfig_top_testbench)); options.set_print_top_testbench(cmd_context.option_enable(cmd, opt_print_top_testbench)); options.set_print_simulation_ini(cmd_context.option_value(cmd, opt_print_simulation_ini)); + options.set_explicit_port_mapping(cmd_context.option_enable(cmd, opt_explicit_port_mapping)); options.set_verbose_output(cmd_context.option_enable(cmd, opt_verbose)); fpga_verilog_testbench(openfpga_ctx.module_graph(), diff --git a/openfpga/src/base/openfpga_verilog_command.cpp b/openfpga/src/base/openfpga_verilog_command.cpp index 71fad80f0..99ee7a319 100644 --- a/openfpga/src/base/openfpga_verilog_command.cpp +++ b/openfpga/src/base/openfpga_verilog_command.cpp @@ -89,6 +89,9 @@ ShellCommandId add_openfpga_write_verilog_testbench_command(openfpga::Shell(), std::string(FPGA_PORT_POSTFIX), atom_ctx, netlist_annotation, - true); + explicit_port_mapping); print_verilog_comment(fp, std::string("----- End FPGA Fabric Instanication -------")); @@ -190,7 +192,8 @@ void print_verilog_random_top_testbench(const std::string& circuit_name, const std::string& verilog_fname, const AtomContext& atom_ctx, const VprNetlistAnnotation& netlist_annotation, - const SimulationSetting& simulation_parameters) { + const SimulationSetting& simulation_parameters, + const bool& explicit_port_mapping) { std::string timer_message = std::string("Write configuration-skip testbench for FPGA top-level Verilog netlist implemented by '") + circuit_name.c_str() + std::string("'"); /* Start time count */ @@ -214,10 +217,14 @@ void print_verilog_random_top_testbench(const std::string& circuit_name, print_verilog_top_random_testbench_ports(fp, circuit_name, clock_port_names, atom_ctx, netlist_annotation); /* Call defined top-level module */ - print_verilog_random_testbench_fpga_instance(fp, circuit_name, atom_ctx, netlist_annotation); + print_verilog_random_testbench_fpga_instance(fp, circuit_name, + atom_ctx, netlist_annotation, + explicit_port_mapping); /* Call defined benchmark */ - print_verilog_top_random_testbench_benchmark_instance(fp, circuit_name, atom_ctx, netlist_annotation); + print_verilog_top_random_testbench_benchmark_instance(fp, circuit_name, + atom_ctx, netlist_annotation, + explicit_port_mapping); /* Find clock port to be used */ BasicPort clock_port = generate_verilog_testbench_clock_port(clock_port_names, std::string(DEFAULT_CLOCK_NAME)); diff --git a/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.h b/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.h index b12072b70..775bc14d4 100644 --- a/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.h +++ b/openfpga/src/fpga_verilog/verilog_formal_random_top_testbench.h @@ -19,7 +19,8 @@ void print_verilog_random_top_testbench(const std::string& circuit_name, const std::string& verilog_fname, const AtomContext& atom_ctx, const VprNetlistAnnotation& netlist_annotation, - const SimulationSetting& simulation_parameters); + const SimulationSetting& simulation_parameters, + const bool& explicit_port_mapping); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp index 8e1de5cfc..8e577dfb4 100644 --- a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp +++ b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp @@ -385,7 +385,8 @@ void print_verilog_preconfig_top_module(const ModuleManager& module_manager, const IoLocationMap& io_location_map, const VprNetlistAnnotation& netlist_annotation, const std::string& circuit_name, - const std::string& verilog_fname) { + const std::string& verilog_fname, + const bool& explicit_port_mapping) { std::string timer_message = std::string("Write pre-configured FPGA top-level Verilog netlist for design '") + circuit_name + std::string("'"); /* Start time count */ @@ -414,7 +415,8 @@ void print_verilog_preconfig_top_module(const ModuleManager& module_manager, /* Instanciate FPGA top-level module */ print_verilog_testbench_fpga_instance(fp, module_manager, top_module, - std::string(FORMAL_VERIFICATION_TOP_MODULE_UUT_NAME)); + std::string(FORMAL_VERIFICATION_TOP_MODULE_UUT_NAME), + explicit_port_mapping); /* Find clock ports in benchmark */ std::vector benchmark_clock_port_names = find_atom_netlist_clock_port_names(atom_ctx.nlist, netlist_annotation); diff --git a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.h b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.h index e8efe5f29..9177676fa 100644 --- a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.h +++ b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.h @@ -29,7 +29,8 @@ void print_verilog_preconfig_top_module(const ModuleManager& module_manager, const IoLocationMap& io_location_map, const VprNetlistAnnotation& netlist_annotation, const std::string& circuit_name, - const std::string& verilog_fname); + const std::string& verilog_fname, + const bool& explicit_port_mapping); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_verilog/verilog_testbench_options.cpp b/openfpga/src/fpga_verilog/verilog_testbench_options.cpp index 8cd2969f2..9fc6bfd33 100644 --- a/openfpga/src/fpga_verilog/verilog_testbench_options.cpp +++ b/openfpga/src/fpga_verilog/verilog_testbench_options.cpp @@ -19,6 +19,7 @@ VerilogTestbenchOption::VerilogTestbenchOption() { print_formal_verification_top_netlist_ = false; print_top_testbench_ = false; simulation_ini_path_.clear(); + explicit_port_mapping_ = false; verbose_output_ = false; } @@ -53,6 +54,10 @@ std::string VerilogTestbenchOption::simulation_ini_path() const { return simulation_ini_path_; } +bool VerilogTestbenchOption::explicit_port_mapping() const { + return explicit_port_mapping_; +} + bool VerilogTestbenchOption::verbose_output() const { return verbose_output_; } @@ -97,6 +102,10 @@ void VerilogTestbenchOption::set_print_simulation_ini(const std::string& simulat simulation_ini_path_ = simulation_ini_path; } +void VerilogTestbenchOption::set_explicit_port_mapping(const bool& enabled) { + explicit_port_mapping_ = enabled; +} + void VerilogTestbenchOption::set_verbose_output(const bool& enabled) { verbose_output_ = enabled; } diff --git a/openfpga/src/fpga_verilog/verilog_testbench_options.h b/openfpga/src/fpga_verilog/verilog_testbench_options.h index d18bfa224..2572e3dee 100644 --- a/openfpga/src/fpga_verilog/verilog_testbench_options.h +++ b/openfpga/src/fpga_verilog/verilog_testbench_options.h @@ -29,6 +29,7 @@ class VerilogTestbenchOption { bool print_top_testbench() const; bool print_simulation_ini() const; std::string simulation_ini_path() const; + bool explicit_port_mapping() const; bool verbose_output() const; public: /* Public validator */ bool validate() const; @@ -45,6 +46,7 @@ class VerilogTestbenchOption { void set_print_preconfig_top_testbench(const bool& enabled); void set_print_top_testbench(const bool& enabled); void set_print_simulation_ini(const std::string& simulation_ini_path); + void set_explicit_port_mapping(const bool& enabled); void set_verbose_output(const bool& enabled); private: /* Internal Data */ std::string output_directory_; @@ -54,6 +56,7 @@ class VerilogTestbenchOption { bool print_top_testbench_; /* Print simulation ini is enabled only when the path is not empty */ std::string simulation_ini_path_; + bool explicit_port_mapping_; bool verbose_output_; }; diff --git a/openfpga/src/fpga_verilog/verilog_testbench_utils.cpp b/openfpga/src/fpga_verilog/verilog_testbench_utils.cpp index 8b5c741f1..b733c8ddd 100644 --- a/openfpga/src/fpga_verilog/verilog_testbench_utils.cpp +++ b/openfpga/src/fpga_verilog/verilog_testbench_utils.cpp @@ -30,7 +30,8 @@ namespace openfpga { void print_verilog_testbench_fpga_instance(std::fstream& fp, const ModuleManager& module_manager, const ModuleId& top_module, - const std::string& top_instance_name) { + const std::string& top_instance_name, + const bool& explicit_port_mapping) { /* Validate the file stream */ valid_file_stream(fp); @@ -43,7 +44,8 @@ void print_verilog_testbench_fpga_instance(std::fstream& fp, /* Use explicit port mapping for a clean instanciation */ print_verilog_module_instance(fp, module_manager, top_module, top_instance_name, - port2port_name_map, true); + port2port_name_map, + explicit_port_mapping); /* Add an empty line as a splitter */ fp << std::endl; diff --git a/openfpga/src/fpga_verilog/verilog_testbench_utils.h b/openfpga/src/fpga_verilog/verilog_testbench_utils.h index d51f3b7e8..9ba67f298 100644 --- a/openfpga/src/fpga_verilog/verilog_testbench_utils.h +++ b/openfpga/src/fpga_verilog/verilog_testbench_utils.h @@ -26,7 +26,8 @@ constexpr char* OPENFPGA_BENCHMARK_OUT_PORT_PREFIX = "out_"; void print_verilog_testbench_fpga_instance(std::fstream& fp, const ModuleManager& module_manager, const ModuleId& top_module, - const std::string& top_instance_name); + const std::string& top_instance_name, + const bool& explicit_port_mapping); void print_verilog_testbench_benchmark_instance(std::fstream& fp, const std::string& module_name, diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 6a647de35..dc4856cb3 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -446,7 +446,8 @@ static void print_verilog_top_testbench_benchmark_instance(std::fstream& fp, const std::string& reference_verilog_top_name, const AtomContext& atom_ctx, - const VprNetlistAnnotation& netlist_annotation) { + const VprNetlistAnnotation& netlist_annotation, + const bool& explicit_port_mapping) { /* Validate the file stream */ valid_file_stream(fp); @@ -468,7 +469,7 @@ void print_verilog_top_testbench_benchmark_instance(std::fstream& fp, prefix_to_remove, std::string(TOP_TESTBENCH_REFERENCE_OUTPUT_POSTFIX), atom_ctx, netlist_annotation, - true); + explicit_port_mapping); print_verilog_comment(fp, std::string("----- End reference Benchmark Instanication -------")); @@ -803,7 +804,8 @@ void print_verilog_top_testbench(const ModuleManager& module_manager, const VprNetlistAnnotation& netlist_annotation, const std::string& circuit_name, const std::string& verilog_fname, - const SimulationSetting& simulation_parameters) { + const SimulationSetting& simulation_parameters, + const bool& explicit_port_mapping) { std::string timer_message = std::string("Write autocheck testbench for FPGA top-level Verilog netlist for '") + circuit_name + std::string("'"); @@ -856,7 +858,8 @@ void print_verilog_top_testbench(const ModuleManager& module_manager, /* Instanciate FPGA top-level module */ print_verilog_testbench_fpga_instance(fp, module_manager, top_module, - std::string(TOP_TESTBENCH_FPGA_INSTANCE_NAME)); + std::string(TOP_TESTBENCH_FPGA_INSTANCE_NAME), + explicit_port_mapping); /* Connect I/Os to benchmark I/Os or constant driver */ print_verilog_testbench_connect_fpga_ios(fp, module_manager, top_module, @@ -870,7 +873,8 @@ void print_verilog_top_testbench(const ModuleManager& module_manager, print_verilog_top_testbench_benchmark_instance(fp, circuit_name, atom_ctx, - netlist_annotation); + netlist_annotation, + explicit_port_mapping); /* Print tasks used for loading bitstreams */ print_verilog_top_testbench_load_bitstream_task(fp, sram_orgz_type); diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.h b/openfpga/src/fpga_verilog/verilog_top_testbench.h index c0ad77c51..39a2024d1 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.h +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.h @@ -33,7 +33,8 @@ void print_verilog_top_testbench(const ModuleManager& module_manager, const VprNetlistAnnotation& netlist_annotation, const std::string& circuit_name, const std::string& verilog_fname, - const SimulationSetting& simulation_parameters); + const SimulationSetting& simulation_parameters, + const bool& explicit_port_mapping); } /* end namespace openfpga */ diff --git a/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga index 8b523f4ae..11f3ed295 100644 --- a/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga @@ -49,7 +49,7 @@ write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --inc # - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA # - Enable pre-configured top-level testbench which is a fast verification skipping programming phase # - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts -write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini --explicit_port_mapping # Write the SDC files for PnR backend # - Turn on every options here diff --git a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga index f1dc80820..bcc8d36e3 100644 --- a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga @@ -49,7 +49,7 @@ write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --inc # - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA # - Enable pre-configured top-level testbench which is a fast verification skipping programming phase # - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts -write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini --explicit_port_mapping # Write the SDC files for PnR backend # - Turn on every options here diff --git a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga index f1dc80820..bcc8d36e3 100644 --- a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga @@ -49,7 +49,7 @@ write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --inc # - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA # - Enable pre-configured top-level testbench which is a fast verification skipping programming phase # - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts -write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini --explicit_port_mapping # Write the SDC files for PnR backend # - Turn on every options here diff --git a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga index 88be8a878..3210b411f 100644 --- a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga @@ -49,7 +49,7 @@ write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --inc # - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA # - Enable pre-configured top-level testbench which is a fast verification skipping programming phase # - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts -write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini --explicit_port_mapping # Write the SDC files for PnR backend # - Turn on every options here diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga index 5f7be9ffa..a426a7833 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga @@ -45,7 +45,7 @@ build_fabric_bitstream --verbose # - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA # - Enable pre-configured top-level testbench which is a fast verification skipping programming phase # - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts -write_verilog_testbench --file ./TESTBENCH --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini +write_verilog_testbench --file ./TESTBENCH --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini --explicit_port_mapping # Write the SDC to run timing analysis for a mapped FPGA fabric write_analysis_sdc --file ./SDC_analysis diff --git a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga index b4b6ff5ef..6841eb935 100644 --- a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga @@ -49,7 +49,7 @@ write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --inc # - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA # - Enable pre-configured top-level testbench which is a fast verification skipping programming phase # - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts -write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini --explicit_port_mapping # Write the SDC files for PnR backend # - Turn on every options here From f6895fcc148efcd3a708d7d82aaa8fb1017f3d59 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 22 May 2020 14:41:21 -0600 Subject: [PATCH 072/180] update documentation for new options of Verilog testbench writer --- docs/source/openfpga_shell/openfpga_commands.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/openfpga_shell/openfpga_commands.rst b/docs/source/openfpga_shell/openfpga_commands.rst index 909a6416f..7f72414d0 100644 --- a/docs/source/openfpga_shell/openfpga_commands.rst +++ b/docs/source/openfpga_shell/openfpga_commands.rst @@ -150,7 +150,7 @@ FPGA-Verilog - ``--file`` or ``-f`` Specify the output directory for the Verilog netlists - - ``--explict_port_mapping`` Use explict port mapping when writing the Verilog netlists + - ``--explicit_port_mapping`` Use explicit port mapping when writing the Verilog netlists - ``--include_timing`` Output timing information to Verilog netlists for primitive modules @@ -178,6 +178,8 @@ FPGA-Verilog - ``--print_simulation_ini`` Output an exchangeable simulation ini file, which is needed only when you need to interface different HDL simulators using openfpga flow-run scripts + - ``--explicit_port_mapping`` Use explicit port mapping when writing the Verilog netlists + FPGA-SDC ~~~~~~~~ From c27d77a418169c24a26042508c293f87ad2d32f0 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 23 May 2020 21:07:44 -0600 Subject: [PATCH 073/180] clean-up documentation for a shallow hierarchy --- docs/source/arch_lang/figures/.DS_Store | Bin 6148 -> 0 bytes docs/source/index.rst | 18 +++--------------- .../arch_lang/addon_vpr_syntax.rst | 0 .../arch_lang/annotate_vpr_arch.rst | 0 .../arch_lang/circuit_library.rst | 0 .../arch_lang/circuit_model_examples.rst | 0 .../arch_lang/direct_interconnect.rst | 0 .../{ => manual}/arch_lang/figures/Buffer.png | Bin .../{ => manual}/arch_lang/figures/FF.png | Bin .../arch_lang/figures/Inverter_1.png | Bin .../arch_lang/figures/Tapered_inverter.png | Bin .../arch_lang/figures/ccff_fpga.png | Bin .../arch_lang/figures/global_inout_ports.png | Bin .../arch_lang/figures/global_input_ports.png | Bin .../arch_lang/figures/gpin_ports.png | Bin .../arch_lang/figures/gpio_ports.png | Bin .../arch_lang/figures/gpout_ports.png | Bin .../{ => manual}/arch_lang/figures/iopad.png | Bin .../{ => manual}/arch_lang/figures/lut.png | Bin .../arch_lang/figures/meas_edge.png | Bin .../{ => manual}/arch_lang/figures/mux.png | Bin .../arch_lang/figures/mux1lvl.png | Bin .../arch_lang/figures/pass-gate.png | Bin .../arch_lang/figures/pass_transistor.png | Bin .../arch_lang/figures/point2point_example.png | Bin .../figures/point2point_truthtable.png | Bin .../{ => manual}/arch_lang/figures/scff.png | Bin .../{ => manual}/arch_lang/figures/sram.png | Bin .../arch_lang/figures/thru_channel.png | Bin .../{ => manual}/arch_lang/figures/wire.png | Bin .../{ => manual}/arch_lang/generality.rst | 0 docs/source/{ => manual}/arch_lang/index.rst | 5 ++++- .../arch_lang/simulation_setting.rst | 0 .../arch_lang/technology_library.rst | 0 .../fabric_dependent_bitstream.rst | 0 .../fpga_bitstream/generic_bitstream.rst | 0 .../{ => manual}/fpga_bitstream/index.rst | 0 .../fpga_spice/command_line_usage.rst | 0 .../fpga_spice/customize_subckt.rst | 0 .../fpga_spice/file_organization.rst | 0 docs/source/{ => manual}/fpga_spice/index.rst | 0 .../fpga_spice/spice_simulation.rst | 0 .../fpga_verilog/figures/Layout_Diagram.png | Bin .../figures/Verification_step.pdf | 0 .../figures/fpga_asap_10x10_final.png | Bin .../figures/fpga_asap_10x10_floorplan.png | Bin .../figures/verification_step.png | Bin .../fpga_verilog/file_organization.rst | 0 .../{ => manual}/fpga_verilog/func_verify.rst | 0 .../{ => manual}/fpga_verilog/index.rst | 0 .../{ => manual}/fpga_verilog/sc_flow.rst | 0 docs/source/manual/index.rst | 18 ++++++++++++++++++ docs/source/manual/openfpga_flow/index.rst | 12 ++++++++++++ .../openfpga_flow}/run_fpga_flow.rst | 0 .../openfpga_flow}/run_fpga_task.rst | 0 .../{ => manual}/openfpga_shell/index.rst | 0 .../openfpga_shell/launch_openfpga_shell.rst | 0 .../openfpga_shell/openfpga_commands.rst | 0 .../openfpga_shell/openfpga_script.rst | 0 docs/source/tutorials/index.rst | 11 +---------- 60 files changed, 38 insertions(+), 26 deletions(-) delete mode 100644 docs/source/arch_lang/figures/.DS_Store rename docs/source/{ => manual}/arch_lang/addon_vpr_syntax.rst (100%) rename docs/source/{ => manual}/arch_lang/annotate_vpr_arch.rst (100%) rename docs/source/{ => manual}/arch_lang/circuit_library.rst (100%) rename docs/source/{ => manual}/arch_lang/circuit_model_examples.rst (100%) rename docs/source/{ => manual}/arch_lang/direct_interconnect.rst (100%) rename docs/source/{ => manual}/arch_lang/figures/Buffer.png (100%) rename docs/source/{ => manual}/arch_lang/figures/FF.png (100%) rename docs/source/{ => manual}/arch_lang/figures/Inverter_1.png (100%) rename docs/source/{ => manual}/arch_lang/figures/Tapered_inverter.png (100%) rename docs/source/{ => manual}/arch_lang/figures/ccff_fpga.png (100%) rename docs/source/{ => manual}/arch_lang/figures/global_inout_ports.png (100%) rename docs/source/{ => manual}/arch_lang/figures/global_input_ports.png (100%) rename docs/source/{ => manual}/arch_lang/figures/gpin_ports.png (100%) rename docs/source/{ => manual}/arch_lang/figures/gpio_ports.png (100%) rename docs/source/{ => manual}/arch_lang/figures/gpout_ports.png (100%) rename docs/source/{ => manual}/arch_lang/figures/iopad.png (100%) rename docs/source/{ => manual}/arch_lang/figures/lut.png (100%) rename docs/source/{ => manual}/arch_lang/figures/meas_edge.png (100%) rename docs/source/{ => manual}/arch_lang/figures/mux.png (100%) rename docs/source/{ => manual}/arch_lang/figures/mux1lvl.png (100%) rename docs/source/{ => manual}/arch_lang/figures/pass-gate.png (100%) rename docs/source/{ => manual}/arch_lang/figures/pass_transistor.png (100%) rename docs/source/{ => manual}/arch_lang/figures/point2point_example.png (100%) rename docs/source/{ => manual}/arch_lang/figures/point2point_truthtable.png (100%) rename docs/source/{ => manual}/arch_lang/figures/scff.png (100%) rename docs/source/{ => manual}/arch_lang/figures/sram.png (100%) rename docs/source/{ => manual}/arch_lang/figures/thru_channel.png (100%) rename docs/source/{ => manual}/arch_lang/figures/wire.png (100%) rename docs/source/{ => manual}/arch_lang/generality.rst (100%) rename docs/source/{ => manual}/arch_lang/index.rst (69%) rename docs/source/{ => manual}/arch_lang/simulation_setting.rst (100%) rename docs/source/{ => manual}/arch_lang/technology_library.rst (100%) rename docs/source/{ => manual}/fpga_bitstream/fabric_dependent_bitstream.rst (100%) rename docs/source/{ => manual}/fpga_bitstream/generic_bitstream.rst (100%) rename docs/source/{ => manual}/fpga_bitstream/index.rst (100%) rename docs/source/{ => manual}/fpga_spice/command_line_usage.rst (100%) rename docs/source/{ => manual}/fpga_spice/customize_subckt.rst (100%) rename docs/source/{ => manual}/fpga_spice/file_organization.rst (100%) rename docs/source/{ => manual}/fpga_spice/index.rst (100%) rename docs/source/{ => manual}/fpga_spice/spice_simulation.rst (100%) rename docs/source/{ => manual}/fpga_verilog/figures/Layout_Diagram.png (100%) rename docs/source/{ => manual}/fpga_verilog/figures/Verification_step.pdf (100%) rename docs/source/{ => manual}/fpga_verilog/figures/fpga_asap_10x10_final.png (100%) rename docs/source/{ => manual}/fpga_verilog/figures/fpga_asap_10x10_floorplan.png (100%) rename docs/source/{ => manual}/fpga_verilog/figures/verification_step.png (100%) rename docs/source/{ => manual}/fpga_verilog/file_organization.rst (100%) rename docs/source/{ => manual}/fpga_verilog/func_verify.rst (100%) rename docs/source/{ => manual}/fpga_verilog/index.rst (100%) rename docs/source/{ => manual}/fpga_verilog/sc_flow.rst (100%) create mode 100644 docs/source/manual/index.rst create mode 100644 docs/source/manual/openfpga_flow/index.rst rename docs/source/{tutorials => manual/openfpga_flow}/run_fpga_flow.rst (100%) rename docs/source/{tutorials => manual/openfpga_flow}/run_fpga_task.rst (100%) rename docs/source/{ => manual}/openfpga_shell/index.rst (100%) rename docs/source/{ => manual}/openfpga_shell/launch_openfpga_shell.rst (100%) rename docs/source/{ => manual}/openfpga_shell/openfpga_commands.rst (100%) rename docs/source/{ => manual}/openfpga_shell/openfpga_script.rst (100%) diff --git a/docs/source/arch_lang/figures/.DS_Store b/docs/source/arch_lang/figures/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Sat, 23 May 2020 21:14:32 -0600 Subject: [PATCH 074/180] minor fix on the manual subtree --- docs/source/manual/openfpga_shell/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/manual/openfpga_shell/index.rst b/docs/source/manual/openfpga_shell/index.rst index 0aa515e23..24512f67d 100644 --- a/docs/source/manual/openfpga_shell/index.rst +++ b/docs/source/manual/openfpga_shell/index.rst @@ -1,5 +1,5 @@ -OpenFPGA Interface ------------------- +OpenFPGA Shell +-------------- .. _openfpga_shell: OpenFPGA Shell From c5a3e44e61ef0e3cdcef9e295c23a8d2bd46a7f0 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 24 May 2020 16:29:57 -0600 Subject: [PATCH 075/180] Update Verilog fabric netlist documentation --- .../manual/fpga_verilog/fabric_netlist.rst | 132 ++++++++++++++++++ .../figures/fabric_netlist_hierarchy.png | Bin 0 -> 49128 bytes .../fpga_verilog/figures/generic_fabric.png | Bin 0 -> 121309 bytes .../manual/fpga_verilog/file_organization.rst | 20 --- docs/source/manual/fpga_verilog/index.rst | 2 +- .../openfpga_shell/openfpga_commands.rst | 2 + 6 files changed, 135 insertions(+), 21 deletions(-) create mode 100644 docs/source/manual/fpga_verilog/fabric_netlist.rst create mode 100644 docs/source/manual/fpga_verilog/figures/fabric_netlist_hierarchy.png create mode 100644 docs/source/manual/fpga_verilog/figures/generic_fabric.png delete mode 100644 docs/source/manual/fpga_verilog/file_organization.rst diff --git a/docs/source/manual/fpga_verilog/fabric_netlist.rst b/docs/source/manual/fpga_verilog/fabric_netlist.rst new file mode 100644 index 000000000..7ce403300 --- /dev/null +++ b/docs/source/manual/fpga_verilog/fabric_netlist.rst @@ -0,0 +1,132 @@ +.. _fabric_netlists: + +Fabric Netlists +--------------- + +In this paper, we will introduce the hierarchy, dependency and functionality of each Verilog netlist, which are generated to model the FPGA fabric. + +.. note:: These netlists are automatically generated by the OpenFPGA command ``write_fabric_verilog``. See :ref:`openfpga_verilog_commands` for its detailed usage. + +All the generated Verilog netlists are located in the directory as you specify in the OpenFPGA command ``write_fabric_verilog``. +Inside the directory, the Verilog netlists are organized as illustrated in :numref:`fig_fabric_netlist_hierarchy`. + +.. _fig_fabric_netlist_hierarchy: + +.. figure:: ./figures/fabric_netlist_hierarchy.png + :scale: 90% + + Hierarchy of Verilog netlists modeling a FPGA fabric + +.. _fig_generic_fabric: + +.. figure:: ./figures/generic_fabric.png + :scale: 80% + + An illustrative FPGA fabric modelled by the Verilog netlists + +Top-level Netlists +~~~~~~~~~~~~~~~~~~ + +.. option:: fabric_netlists.v + + This file includes all the related Verilog netlists that are used by the ``fpga_top.v``. + This file is created to simplify the netlist addition for HDL simulator and backend tools. + This is the only file you need to add to a simulator or backend project. + + .. note:: User-defined (external) Verilog netlists will be included in this file. + +.. option:: fpga_top.v + + This netlist contains the top-level module of the fpga fabric, corresponding to the fabric shown in :numref:`fig_generic_fabric`. + +.. option:: fpga_defines.v + + This file includes pre-processing flags required by the ``fpga_top.v``, to smooth HDL simulation. + It will include the folliwng pre-procesing flags: + + - ```define ENABLE_TIMING`` When enabled, all the delay values defined in primitive Verilog modules will be considered in compilation. This flag is added when ``--include_timing`` option is enabled when calling the ``write_fabric_verilog`` command. + + .. note:: We strongly recommend users to turn on this flag as it can help simulators to converge quickly. + + - ```define ENABLE_SIGNAL_INITIALIZATION`` When enabled, all the outputs of primitive Verilog modules will be initialized with a random value. This flag is added when ``--include_signal_init`` option is enabled when calling the ``write_fabric_verilog`` command. + + .. note:: We strongly recommend users to turn on this flag as it can help simulators to converge quickly. + + - ```define ICARUS_SIMULATOR`` When enabled, Verilog netlists are generated to be compatible with the syntax required by `icarus iVerilog simulator`__. This flag is added when ``--support_icarus_simulator`` option is enabled when calling the ``write_fabric_verilog`` command. + + .. warning:: Please disable this flag if you are not using icarus iVerilog simulator. + +__ iverilog_website_ + +.. _iverilog_website: http://iverilog.icarus.com/ + +Logic Blocks +~~~~~~~~~~~~ +This sub-directory contains all the Verilog modules modeling configurable logic blocks, heterogeneous blocks as well as I/O blocks. +Take the example in :numref:`fig_generic_fabric`, the modules are CLBs, DSP blocks, I/Os and Block RAMs. + +.. option:: .v + + For each ```` defined in the VPR architecture description, a Verilog netlist will be generated to model its internal structure. + + .. note:: For I/O blocks, separated ``.v`` will be generated for each side of a FPGA fabric. + +.. option:: .v + + For each root ``pb_type`` defined in the ```` of VPR architecture description, a Verilog netlist will be generated to model its internal structure. + +Routing Blocks +~~~~~~~~~~~~~~ +This sub-directory contains all the Verilog modules modeling Switch Blocks (SBs) and Connection Blocks (CBs). +Take the example in :numref:`fig_generic_fabric`, the modules are the Switch Blocks, X- and Y- Connection Blocks of a tile. + +.. option:: sb__.v + + For each unique Switch Block (SB) created by VPR routing resource graph generator, a Verilog netlist will be generated. The ```` and ```` denote the coordinate of the Switch Block in the FPGA fabric. + +.. option:: cbx__.v + + For each unique X-direction Connection Block (CBX) created by VPR routing resource graph generator, a Verilog netlist will be generated. The ```` and ```` denote the coordinate of the Connection Block in the FPGA fabric. + +.. option:: cby__.v + + For each unique Y-direction Connection Block (CBY) created by VPR routing resource graph generator, a Verilog netlist will be generated. The ```` and ```` denote the coordinate of the Connection Block in the FPGA fabric. + +Primitive Modules +~~~~~~~~~~~~~~~~~ +This sub-directory contains all the primitive Verilog modules, which are used to build the logic blocks and routing blocks. + +.. option:: luts.v + + Verilog modules for all the Look-Up Tables (LUTs), which are defined as ```` of OpenFPGA architecture description. See details in :ref:`circuit_library`. + +.. option:: wires.v + + Verilog modules for all the routing wires, which are defined as ```` of OpenFPGA architecture description. See details in :ref:`circuit_library`. + +.. option:: memories.v + + Verilog modules for all the configurable memories, which are defined as ```` of OpenFPGA architecture description. See details in :ref:`circuit_library`. + +.. option:: muxes.v + + Verilog modules for all the routing multiplexers, which are defined as ```` of OpenFPGA architecture description. See details in :ref:`circuit_library`. + + .. note:: multiplexers used in Look-Up Tables are also defined in this netlist. + +.. option:: inv_buf_passgate.v + + Verilog modules for all the inverters, buffers and pass-gate logics, which are defined as ```` of OpenFPGA architecture description. See details in :ref:`circuit_library`. + +.. option:: local_encoder.v + + Verilog modules for all the encoders and decoders, which are created when routing multiplexers are defined to include local encoders. See details in :ref:`circuit_model_examples`. + +.. option:: user_defined_templates.v + + This is a template netlist, which users can refer to when writing up their user-defined Verilog modules. + The user-defined Verilog modules are those ```` in the OpenFPGA architecture description with a specific ``verilog_netlist`` path. + It contains Verilog modules with ports declaration (compatible to other netlists that are auto-generated by OpenFPGA) but without any functionality. + This file is created only when the option ``--print_user_defined_template`` is enabled when calling the ``write_fabric_verilog`` command. + + .. warning:: Do not include this netlist in simulation without any modification to its content! diff --git a/docs/source/manual/fpga_verilog/figures/fabric_netlist_hierarchy.png b/docs/source/manual/fpga_verilog/figures/fabric_netlist_hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..232eb940ce75d555f549acb109e7bfd9a284c237 GIT binary patch literal 49128 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⁣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 E0C1yyS^xk5 literal 0 HcmV?d00001 diff --git a/docs/source/manual/fpga_verilog/figures/generic_fabric.png b/docs/source/manual/fpga_verilog/figures/generic_fabric.png new file mode 100644 index 0000000000000000000000000000000000000000..64354d1b84560ba5c6075a455771d0e807d27e14 GIT binary patch literal 121309 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≀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

sIJNElw+3TXufDSrBbo)iTJ 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 Hk!Q@GFp_r^ literal 0 HcmV?d00001 diff --git a/docs/source/manual/fpga_verilog/file_organization.rst b/docs/source/manual/fpga_verilog/file_organization.rst deleted file mode 100644 index 181be2295..000000000 --- a/docs/source/manual/fpga_verilog/file_organization.rst +++ /dev/null @@ -1,20 +0,0 @@ -Hierarchy of Verilog Output Files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -All the generated Verilog Netlists are located in the /SRC as you specify in the command-line options. Under the /SRC, FPGA-Verilog creates the top file name_top.v and some folders: lb (logic blocks), routing and sub_modules. - -.. csv-table:: Folder hierarchy of FPGA-Verilog - :header: "File/Folder", "Content" - :widths: 10, 20 - - "name_top.v", "Contains the top module and calls all the other .v files" - "name.bitstream", "Only if --fpga_verilog_print_top_testbench or --fpga_verilog_print_top_auto_testbench is chosen. Contains the bitstream programming the generated FPGA." - "name_top_tb.v", "Only if --fpga_verilog_print_top_testbench. Contains a testbench used for the simulation." - "name_autocheck_top_tb.v", "Only if --fpga_verilog_print_autocheck_top_testbench is chosen. Contains a testbench used for the simulation." - "name_formal_random_top_tb.v", "Only if --fpga_verilog_print_formal_verification_top_netlist is chosen. Contains a testbench used for the simulation." - "name_top_formal_verification.v", "Only if --fpga_verilog_print_formal_verification_top_netlist is chosen. Contains a top fil used for formal verification and by name_formal_random_top_tb.v." - "fpga_defines.v", "Contains all the defines set as 'include_timing'" - "name_include_netlists.v", "Contains all the netlists and defines paths used for the simulation." - "lb", "Logic Block. Contains all the CLBs. The logic_block.v includes all the CLB and is called by the top module afterward." - "routing", "Contains all the routing in the circuit. You can find in it the Switch Boxes, the Connection Blocks and the routing needed to connect the different blocks. The routing.v file packs them all and is called by the top module." - "sub_modules", "Contains the modules generated by the flow to build the CLBs." diff --git a/docs/source/manual/fpga_verilog/index.rst b/docs/source/manual/fpga_verilog/index.rst index 85d278ae6..2940943c4 100644 --- a/docs/source/manual/fpga_verilog/index.rst +++ b/docs/source/manual/fpga_verilog/index.rst @@ -7,7 +7,7 @@ FPGA-Verilog .. toctree:: :maxdepth: 2 - file_organization + fabric_netlist func_verify diff --git a/docs/source/manual/openfpga_shell/openfpga_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands.rst index 7f72414d0..1ac4ed69b 100644 --- a/docs/source/manual/openfpga_shell/openfpga_commands.rst +++ b/docs/source/manual/openfpga_shell/openfpga_commands.rst @@ -140,6 +140,8 @@ FPGA-Bitstream - ``--file`` or ``-f`` Output the fabric bitstream to an plain text file (only 0 or 1) - ``--verbose`` Show verbose log + +.. _openfpga_verilog_commands: FPGA-Verilog ~~~~~~~~~~~~ From dcce782a468358da21045792462c61955311c3da Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 24 May 2020 18:01:34 -0600 Subject: [PATCH 076/180] update documentation about Verilog testbenches --- .../manual/fpga_verilog/fabric_netlist.rst | 4 +- .../fpga_verilog/figures/preconfig_module.png | Bin 0 -> 26664 bytes .../figures/verilog_testbench_hierarchy.png | Bin 0 -> 32203 bytes .../verilog_testbench_organization.png | Bin 0 -> 290654 bytes .../manual/fpga_verilog/func_verify.rst | 12 --- docs/source/manual/fpga_verilog/index.rst | 2 +- docs/source/manual/fpga_verilog/testbench.rst | 92 ++++++++++++++++++ 7 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 docs/source/manual/fpga_verilog/figures/preconfig_module.png create mode 100644 docs/source/manual/fpga_verilog/figures/verilog_testbench_hierarchy.png create mode 100644 docs/source/manual/fpga_verilog/figures/verilog_testbench_organization.png delete mode 100644 docs/source/manual/fpga_verilog/func_verify.rst create mode 100644 docs/source/manual/fpga_verilog/testbench.rst diff --git a/docs/source/manual/fpga_verilog/fabric_netlist.rst b/docs/source/manual/fpga_verilog/fabric_netlist.rst index 7ce403300..46c8a934b 100644 --- a/docs/source/manual/fpga_verilog/fabric_netlist.rst +++ b/docs/source/manual/fpga_verilog/fabric_netlist.rst @@ -3,7 +3,7 @@ Fabric Netlists --------------- -In this paper, we will introduce the hierarchy, dependency and functionality of each Verilog netlist, which are generated to model the FPGA fabric. +In this part, we will introduce the hierarchy, dependency and functionality of each Verilog netlist, which are generated to model the FPGA fabric. .. note:: These netlists are automatically generated by the OpenFPGA command ``write_fabric_verilog``. See :ref:`openfpga_verilog_commands` for its detailed usage. @@ -33,7 +33,7 @@ Top-level Netlists This file is created to simplify the netlist addition for HDL simulator and backend tools. This is the only file you need to add to a simulator or backend project. - .. note:: User-defined (external) Verilog netlists will be included in this file. + .. note:: User-defined (external) Verilog netlists are included in this file. .. option:: fpga_top.v diff --git a/docs/source/manual/fpga_verilog/figures/preconfig_module.png b/docs/source/manual/fpga_verilog/figures/preconfig_module.png new file mode 100644 index 0000000000000000000000000000000000000000..33b3ff6c5b6afe8a54ddd915b0a3a71f73c4c454 GIT binary patch literal 26664 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 literal 0 HcmV?d00001 diff --git a/docs/source/manual/fpga_verilog/figures/verilog_testbench_hierarchy.png b/docs/source/manual/fpga_verilog/figures/verilog_testbench_hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..042fb8eaf9212cf82e1f391990108b6b23cb045f GIT binary patch literal 32203 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 z%0AVt_0GVACiGb}BeiKa_C@r2jzQua<`6hI4+RWUQao*8pbeR3IU>Nq&BXp~XDpno z5}T8Lm?5QCzagYHKcTV&?g_KKC+~ws@39KlWw3Pe@<;Hd7&!EZ$S?G_ePtCtT|2en z+JHYAe|5xswxTl_j@_`O5XIw7Lf1uzE&Rp1l1|u${~pP-O|hJI59#>ndRk;6DDyH( zpGMhq<09I`(X;M~zqc4K-!ZwzE1^gXcl-Alo!4u`f)JP`t5vo8ilP4LwmJ!P076ey|>IN>EZ2XXeEKn zzN18YPpxz1UiVKCmD^5i^WP9R^CgEbT%|jPy}0GB>3w-t(MxElnpPFn^sSCbped}4 zdO;wM$y0q@f@JjN6gjcfH)n_Z*KDctPb;8qpYxP$!Xl1ALDO7}aF6En8zoqRe)fLD^)o|AR!g|?v+4vz#@ISVOcH}XH1b8a zCxhQ@#w@E|#4-Rtut@eKKZB}@c$9y4NiqFgCGTD$4aQFAS0EbOOBG7fn(|1lk_U@N zL%0PXsUW>a6nV{`$NXtpaJ;jaqV0DG+q)Rb zBTAZ$Lg{*X2u1f0-DpMf(4p&mC|HYEQ}~GeE;*~E+g;{~=^nVJF=yB`OxC-5%UMn> zNO)V!BE928bRcGwYWEa$!{=rirtw6vm)D!bKI1JX3(XaNb6N89k5IAk7qbgHP`0C! zyGw}5Nob}SXvor+JoCiw8}Unz<n#$D)hy#U(F?x#r%N zFtNis{Oxvhtks?^5D&vzScu1T2vFJvA(t{}-3JOcQKbdF>t93uc;GO%Z3edm2$aa(+EXQtlUIJ^5K@uSO-=My@ssr|kNMSNSl{ zi~)5zA7eTAmTW5E78!UV>C9HL{+af$G&`t)-89nE7|;s zl>J1d0JAMvg`gFFrOL6@RL8cv;n^z>9Ur7LvEE5|eg*1j`Nl!98B+aOlod}BUekjW zTJV|omYHQ4yVdbUo2F)2V^xoKPLuu5prdrV0DAPkcfP@MJNkBg=3D4G8+OTS_L#nK z8^;+|bIZ>GBOW@#vOLsNTSq;kXqh&;U+65u-Zi@em+J$Rou1j!IUOrP5tiFbH6s3nrP1#uP4kMeg9JBdDT#9;PM z(l^#LF;X7eH2rdfnh)l@4QhCrZ*c5NZnN<$zkuj;-9vSWAw@q!lR`0jWj;Bx+z!vQ z%)h>XNFS~}uccJ${TfbjXv~+sacA0vR)=rm!k3?++}f+cazx85J`1@_)p809^9baT z)G2D7!Lv)D+~VlLfD`KT))f)I&nTE`wQ5D_bm!U9^;WPVguUXWzQCNA?c8Vz+I^In zsoCZQ&x<*tSswLPYr49u$`o-^OS>iMDoACWJztbxo;}>t+VSG zm~4$4Nx7}l%t+!an=#`lIIdrxD;?TQbP8%&>r`8WN!ajn(R2Sywi!<#2Th9|eNCNx z+$;WV-6~*IutZm1NQ+m)Y=~${V$XQASw9|r5wHA-N36NtcsY2O0nC3~8NFDJ)Ayh* z90q%S8jd6CF#5uK=7xl0sj&P34>zR4^ns=Ju-p8g>CpPB&3A?wrMVZHfr;U^^&`D~ zVubBUeVu8<+N|7LsA1tMM1g&@ev+Pk9mJ5LwQFV?9VG+jX9Qgr^YO|*BNWpVrGH(I zZwDS6VXvz5x>sF`DYBjUv|maXku^8XqzGK*7nw@Qo@mV6;7PlEyvpr`#9nRN)o)x( zh0d#hV7J~D;r&v1x}&etbo&!IZSlV`cMyy3vGGcmsIU5%tmU1*?-_l>(W$lFyu2{< zdiqnZ(L2%K``0(R@4Oo_f+>}VGm5X2N!W!?$t7N`1RpO=V>LY+%5oZ3_)uebY?$!U zI(NEHRSr9d|6zr?AgD`rnUDz7jO=h7rOm(#p+IB8Xx9oQLIuP z`42nx#@SR@Ssdct?HauB7QBJmb-thhzlaxr4^JAR_WfnhkmSXw%i>VlF59QQ`_{xE zK>uCiJm6>i(nhTMt}=A2tA+)FGvqOH8u@YALQ0ymoVmB6uw!}gbTrUUSW}n8Xw!0< zDI8}FgHTC7?-Q*KQTnq74z8?>5~gH)D_}kBeJrlvP9a)k3M&V>7%tL*heowGHQtfu zYq9B&WRE~a3DoyN~WHf1r1-X83mhOddJN9m+y zku1BwiuvSvARca3bis)0C%MSNo%$s6&52|+epfAZ<5K!pVt`@l$X<;gC2a;v0e^Yt z+@nn~b>A$#y?x)jEj_)IxegjVmfMR|iZ13Gr8|u5SvNj1ngM*orIz}NV=_a1bz$91 zjGo6@La9cNgDFCb*`ATxji`7}GJD8d(%@|cvf|wPXFctDfywZKdn2*A-eqM;!YL>8 z)CKWpSt_uF$wzq1j}l}3l<(B%c6^NQFh?ALeAvSbV|D1tMoIICdaj1+F;Z6we#x_8 ziS~peA19GGXa_Nue3x}a_F2q!FXOe@UbKREsb`i$knFi)5w z@lQ4;y~ca;C)xU$JRoc+&Km&mm@qUyhIU$gx@?c%AuIg!yGx5MlNvNVdwT~?SEUqJ zHAas(j(Q5RCsD`-lZd?;9)u0N&Iq23smjhs(YOxhq7o+uOm+5*DBTWDJktV zy}eL$>#Hlx@tc+EfHiw?d$tYB^;2GzO|LLo`O_Xg27%@_VH?r+;#qXgi)o?VR#%{W zE#xB&)+30;M(oQL}r9WIq!E}cbW@(uwy4^4hW{&B5YWV7hgINObR3JNwo4@m>u8{Qsw zy41@kZyIGtKZWF2G5SeW42V#VfbxrCfeFLwvFFjj)j^)F+8+u?B>S)2(%2bUNViUZ zK5w`sPqXH|#&u-z9p2LIkrccrZ;;G0e_2;Ksv{pn zHPZ{)8HWq#iQviB#+pUd*d~N66I~(gLsBf+dV6K)aNo;WajG}7t3EN`j$zi++$S>& z^93w>B%M?6{){8y)`^e_@v${7%FPJFj*>tI@^5y1D(Sis<1Xs`+KN_a7J*qIh~n5R z85EVfkqxiKT2{HQVv$}39K1(-WYV=Ekx2dFFBvr!q=}-GJe>#5gr7?>^>{{_nRUqP z#3oWw#r5T0;dghZc<#0HOh$p|cKn}C%{jCX za?RK4-!2AD^PdJ|&Uw^4p%{il2bBB{tm2U#;%7W&8O}Wm^2+1R_1ST|yJIa24F&zZ z;{)CWvD=4@=~3vE$SSjimV@#KruYkiu_8LISC1gqcDc+!PY2fDayv$&RgD#p^%7I- z+@G?E(>QYDML{ST4FLYHSB#jOHaxhGK1EilC}fB_-MeBP8@w(|?2sjrqyFWk8GV=+ z&R&RuC=-_<#}GW1h+Bq!O(}a5@TTWrichMYiX+iDMJtT@tC#Ztv0q-fnN^wk>LNA|J49b;g4*wa$VOP7Sh-a33$#DnTNLlu8cq`li!>By^ zxWm@tIaB?>_Ux@?<0tP{UgSaMAIIP0xE8nSdnNf`)C3~5L*7;gL&8f|8H8H~Nv}^D zRJrp>P>HTarC%CaIRv~>5>NVYlH7fU0~gyeXb{tBwev7s(9_)Va2ade@aA2ENscDq zG8-qAnuw3R!i!SG`{d1If{Wt^Q*H=Olq4PXW7ccSTv)fj-)17dr_pMTUbI+y1P51OKC~z zE?HU{fdwfEX^;>p=@dagx}>{7l>-y}&^Xz)|oHKJ~KJ%HG_xrW( z(E^h~AD%JHs%uwPT3CJ8bMR$)x5L@<{Sq4y88bN@le6uevw^%oFQYLB137sY?ZH|S za){}hwRmT!qpK`QJCv0vw|AdI8|6vx?Y{FlHQ4x#5hwyzl8G(u{yp~dcP@Tyf+q#Z zLA-jQtAg>+aC*BQML(S*VT@f9sm#>Ahk)%zi#A(`g4{ZAM@Ph+JxnO$cTw~2koM*$ zAfwonh+%j}as0nGw19qy)!|vkpC>_`(%hYy)yIeiSdNw>v*-bnix_+FxeH1-3 zgVkn4Dj(n;5&u@yg^=Vk^CVmjhb{u5wO1xPpDUMi)%aO4Q)$jSqYw0@r8XlC? zsUa%!Eh2uwpQYy{3OaiAR+hqttKP%+S9#|Wzl)1DKEI&=yHUCy9eV9f=W{-*3VUJ? zW8ueR-z0j)rCo9QJoQ-Mn1FB``_DLI*R3$oZrp&oOZFd}1pD;KXKI#zPRiT|bkiq#h(;cSXy1eJ^9TiQ*~~PvmVd)_DmQXb#2&xsdfE9j)SLa?(zN2F{#DL^b%jsk>z)NeSI@|x!5`;^ zCphP`=qmMFA4Dw5LJXEhxwrFTFcDI!*3&;;2dT^|VEh=Fn!l4^2*SHPiqTxvUI*!V zAFJ_yBfGHV?y$Z@rto%5ThW~S1C0PiswbdpdYm!3{qt0yAT+MjjW>or z&U|`nN(M*#6n5mCWa;!hi1Pzy5M7 z1Iq|Z>+NUSzw-Wnw=4wQ4egvGcz@sj`^x|S<1<&>TmeJlljE%0_$ZV;K^Sy$Yiwds zUvKVMRAh*w*ai?pJs(!5qEfZL3wQU|3D2GfdpBj$p=F9X!u{tKs*aWX|vGY8U8O7;*iYWb1DjE*@9GD3(^cMUoVTh!#4Cm?D-_Bl{MSu< zd@8oJ_6(;w)*2V|M5Wfe(0>KtK~+56ZF5X1HnR^xf^tsArUSxaPeFHm9ppv%}Gp*kBjUL_jEX=SQHqktpC^yYZEJ|S zmuFlbZn}ulEA_pSD80UtRGA*&-)S_~)Ckip0zT4W?o#JJu?_gu3PrEOR^j5L))-mx zNvfU#i8o@**iS#G>r{L_>ivy%p?`gSvE%e!z|GnSZii@H>55xE2EvaZ3g6R5aH5O% z_1XI3aL(`EaJT3%s!S#N80SBX6hQV;ui1)>;yKy#I12+8;=NG;3Ypcl^* zix}Gz3qo8|mq#`*RO4W2kt5Ii95j?4DbMTvRIct5e@h0_CmEx?dT`Q@W|vqnq5nIH zJHhL~Qh-XN?;ndXoB$*pHh=)zO{15j zNFM(7jy|c2{U_&%_kr~Nf`Q9}(79K=XAqxrDZGYWi=UgoHuN7U*`Mkjv_?7PJg5K~ z92VQU)py3pX75npLLxx&AZi652-1g@HD|(2o=4%+z(k*%@PJyHP6&udP~i#$(oTvg z?`9Rz3nuUVIWMOk?^?I{Epduk7XFIa}eFNGtt3zHBj7tV?Nl-@Vn+` z5Tz3?K|EtOcLnGvYq(gS=i*n^K&H6b*&8pxZ5#8-UYyo8eeMtSh0iNq$}9Y*pMqzm zi{hU?(wM&(mPs;PWiy^iE#7+}ekQ)R*Eiq?+&V4CVw zbfAlDrSv*L7+MipSS<9KmKd(W{=t0&^fzTEhFdJU{0_`Jl#?f7zGKa*a+9Cb*Y_DTO9p&k>HrOR7FpqVS1_*m587BGw; z&j;ewT_Is$6TiJel?-KK&$Mn&{ywmNszMOl?_B|WS%^OmM?h_2dxuFkVSnkF$U}

i;E?*mXe|B-7(79gy)>zLtN6BSneq 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 Q9q><1T3M<@!YJT>0Wham)Bpeg literal 0 HcmV?d00001 diff --git a/docs/source/manual/fpga_verilog/figures/verilog_testbench_organization.png b/docs/source/manual/fpga_verilog/figures/verilog_testbench_organization.png new file mode 100644 index 0000000000000000000000000000000000000000..06f6d58fa5f4d7ab37289cb91448092464ec2102 GIT binary patch literal 290654 zcmcG$by!qg_dX6t36d&ZigXD`*C6Uh2#9od3({Spg47U_Qj#Lw(kRm1T@nM*H8gzp z=<__Ue%|N(=XYH{t_zrJ=A1eE?7j9{_qx};&Ra!!C>{<44hjkip7i4fN+>88G$<(O z64;pF9s99ueH0W_CJQMkMJp+&l&!U`{j(PaMkbQRwuUB3(EHp%LV_qL%n?TV`bv-4 zncEDA_4V7j*;sJwU6cX?LzMJ=zBYEywb8Ytw$Vk$X=~4s5zaNCpx>pq=~>g#h@Hl@ z_Ok2iyH?!KN=m^|e*3g^J@TB)tOok}T_`2dow7KPbs9RYJ1mr4x+sREsMOfTwy4E} zx7M%g^ARGbixR@=%;-+9gm=fHoAUatf0qp?!hl$RtfQk_iHl5m_X%aU?#+kH%-4)> zz3H%Jl-Oh-We(nwCQnV>AH97^e>X$vrs!Vef#Z#kYa!Rj$RP9hPtS!2sggqs%?J&# zeF@*we`%a+c<1N0L~y?=Bi7Hr5C6)QOXXK_3Ae8J`-)#_suya{d}yL*L>3=HPKLdM z${ix36Q;V33TDpQL|xkS$rBV-@ERKh9hCwF1H3|hB92P=&+A91%qUlWzK@225@3OX z{?{?`;6L&w2K*w=`Sl+y747dMFlbV*{QVkT0(oebZLtmbclE_%4F?nyQexyUs#(ea zSWpOx^aDv{SJd@sthnpL6OB6pembf4MD6_amBdV@hW*(vJ#cSFXZZVj}pu(uSj884x=8Jm8(B!H}rD-?C z;8*zG>m=DFNTy7*@wY%Cr3&luSHXLt_mxFq;TRIMryNJe*j@_TdqgF3aQ_ropG(sP zhqw6s+h?BOy%U=`c+>MQy;u^on_E}CeO^5{I-Y~m?@t%`1gF5lALpgOSXDm7*`*F- z$_5K4XBgW)A1`6ZmxK;$ml#VAd<-V#lCPG_L(3UD?Br^AT>Ua^qT=~vMSDjyn-L%H zI#nNa)w&>u!XX|lm7qyLCfx7Tu;zVwyrL8 z8iF{B!dfu80QAA4;Ua^k3@hnOxxC;EB|TOX!*WUbsdB5)uxN(AM$Rl4tZe;^<$AUM zHge7wbH=ii7#*9pIg+7mcWzE9cf2Yft8d=Jj?XZBFB9K)v#HXR=2q0NQw)ztdg+ZL zgPyaR+*i9c``zu8oKo?VOu3byc`Yyt(ySFZ@2=`_dj`Xac%+;8qj^5Cy|LX9{m(`6 zt-WbZ5gWX=V@--{eg3mW2L7IV-2x>>tzms%ZdBOY+h+iq7$`Ps&5&L5j~DZ(Fh86= z3wv3pTUSlxH1t%dK)Whqa%ZnsBG`LrX^BB+L>CgE=JI1mn&O_hzC>ale=q&FZ+m05 zUwWY{9xuUi19Lg^d{s}0u-(}sBA)+cE>|RIZE(HCkB(pXC~Tk7-}#C(mJeHR&b7d? zz+3{)_CC}}=If^~7iH1j*(N)gF~CJdCxoE<*PqB6uDk6_4+GS-+HpjAh9-#TZ~oUY zKhGOrgv@b2f2aHk1r3|d_rLzcp!h*$U#k7dC%XD*qGFTj{lF5JVr|ralxl4P%BKnXWrL1b%-8v zL-g5K0Y=g=6z42S`4%0licU7asBJ5bcC|0Hq+GuX%B<-`=0JCx3DTk_H0a54cgVzIB(dm zm->Shy#Yl%r(4=-rHz%2Vr-wO^9Wwx=rcv%=pg>-LFr1FjC zUf=+mW8Oq7HS6Wvtc08r0fUhsut?9i{hK`z6Eknqz-E0e>$H8&55BalyvP=qah1Xs zUP+xRRu(YrNn~-Ec2X<)JaUehv<)sumb#BL3c{V!^SgAuji{(8y#W}%5Bo+M#1D(c z_VYYuJh#!K?U;LW>J8rKbKc(k!p`f=d+^>^4y_9G+^Wlq)1_m03c+TnAJXgzi9f1t z2`>cV{Wkf=6%ap68YZy5!r75xIu6}@k?-FpcdF*8 zKjp05zV8OMoqw$B@lxzV|0FD0&llTdlt0ft#b8yn=E9@Y#m7QpxUav^Vu4O0`z>mj z@jv^6Mxyd*|z@JwAD*3UsHv%{>ZSk_-s?#X;|g^!5bT+*?KSg!)X_IrDg~H zzgj;;9Q{5~ji)kk&Wf6z7eg=!hkc^(R_$JfQl?Cp(eZSDawt>ciS6Q3*2kkR#)eq`?o)8&QXyzC zH#avP(=IY-dU>`Hj7E&AHEm<%?nWr3Kt~w0NScWqmBiA!XH=)v>1<|EzZ=hgwtT8N zI?kPKL8l+e8kIIl3t=bwtMr+&vCdSb&i5KW`rYpy{P>if1?*Q4#-$v0$fj+kJ{M~{ z_CMU6y}VHK6i-oMKl;>^PawA6H&<`td3k{QW{H4I=ft_H>YcswwnlIFV0Wj-z0eqYprsC zzbUV9S{pHFbtH=8?GdE6?BmY!wbS2SY_|ud6_6C9e7Qbe+O%u;pLzP@)d16WGpSx6 zCN*F8djSR20&NQ$(#J3;_42y>^NBJ$s)1XB^p8Rab+B8KYjq19H>WhhgqF#8>2jKK zM+1wB@Fbh&S7va^6C@M*)SYdGY zJ=>Y7Bo#2y1;MO3S_g+DJ7pc}NosVb8~@WxAJA?1L0z~WJ$G8_h;E|r>Ex(vYYC;K z)=P)N@H-Dzvr{_Gj`y0vpu&ndN|{AX5fj&A+6BX-q80@6r0S*reLlhyd`pA%Eu92q zEbjIv-NvBle8)n6Vv-3$Nqnxs+V%=?b<^4(+~>c(UJe>jO?EAGr_OIpzFpqxJu^`N z@I;joV!8W$w^VlmU#a{~(0_&GpO=-!xgj(66mApp4zW4S2DW#YDA<`L`d`rcKlC3< zN4SgHOjdAwU@dQ5*q(1P=}8m_qUDvwV_$0v=u!Hr7%#N zsCKd%D;C+RWJtTa17%ro+UEb@GVbusU*BT$C504caYHt*o#Qd##nJvG3|4+&KM4Z>`yAWB+emM{(WT>i_k2#cF1x9 z=Bu67s9cJ@PMwdz8dJ48LOq14{lmN)^ezq?E?+M>(T^ zpH>nM&A`#MJm-yx^0477;0ZV=6dki4OJ(Z0uQF(WjU-|Kx<+U^^XL95_zU--N2Aoq_DO?f-mJ5jVgXZ`)|c%n1_ zx_&WgrSZtC-Rlwg;x*kTdVX@?Kowk3>b7Uv%5r$HZw%lEmD`x)zc2GwqQ@RE=yT`8 z&FLmh39}xm*5U|ys7%uvJnGil8?K@>76Td5V=OMIJ2hMNxSfN*dlwl|{VO0u@q0!Y7kWV7UxSgRw;F-hq&LFniJ?r&*WO%G2bzct_OcIER) zMm_K2OnO*BL4Fg#1`my?W#FTueX-vReS4j$1K=m>fL`G>b{3US?-s~J z{)epzqG1rb4rLKg@^=xr4jEl%lzV|ra}dW!ZJ*Ruw02(AbUBP+F=f#ferr=|{eMLA z1dLi;c&eqHPTX$>rI@k)^M)I|&htJmZE`x+^ zGw9Q;%z(q#{T|HKu~yi?X*H5(mt;cv@0(!?Z36Y_sODF zJem)9dxM_fmn*Qi*;hUumnN8>q5S3#duCV6k|SRo&W*iBcDIomtr`iPPWyFXhqFEn zi5{C(UnbuRIb^Zx)lc;Y&b8kW$WlnL!MwWB?D!!;c>s7=69A>Yq*;v?;Mx2_fQp~d zpfsxyyGw%(-P1J>O?#a=6=P)1y&K5t<{zr&VFz+|LN%4T6K;#SyFQ$JR#O4}q(-_B zB?()3Y5AUi^#HBqtCgWAhVc*O26nBOm`+T#ehYQ?{cZHa{LsRB9I}S%`C@-&Lw-Z( zIQO6X3 zMcXB9(Gg;%<;$K zTi2A68YTbm;arc!q9#Nv)jekDa?e3$&DM#@#o1z^MMHi0bY?Jg^E3UKg5T*@Z`A7G zpab5TX6^0YTnfmLuzf0@qG0A=URmH{U}A#q2mg#G;bLfyx;PB)a!R)at_eb0wggRZJHF`V@|} z2P0Hfb1xI)BwNKi&>~|=Ybp(DoORviQ1h7%vQx!aYn(%=&eq5J>7CZHbOjjxgTIl{ z>n8I%8kpj*4H-`B#~^!F;%c|9ubp?|l-#P$qIy0dr4%5#Mip|f7Ob2{Mw7QT*3ZV2 zI2X(EEUogXe^{OSYoD1)D>aB|7k1mXx8BDamA>N+N`)HfZywjV(+F(}!V+E6)H-6E zbSu3)3a6Z6+ooMkAHY-O_zzYW_#WX2u9f}h`!K_lv=}|AEBnDPm-r8xN&SXP=*qq` zi-v-XA@N*y&Ez4vK6P_1_1}&ZN>w zSj>9AYrG@_=e;`;6LGM1z(yx=MtJv%uT+5hQV4IN7+a0YA%z(8VT#KLp^w6q;NnP3 zky+QK6eUGo)w)Ef-(rAYBt7A&4z%5FPX5>Y1+vZYW{C|6QA0!8qBbUz>L_zn4;}}T z^yp`(s@GJsF~q*QtR8-7QBW@|x)eG3iE;~YZaxST8;SSXT|9S^kN=)mqa^@S&Lzp^@A;Fq=*PeoeN;Jr z?bl_VV({DC7_XZo_Z({0UzZM$jOE-A<@a!gsOA;HWo)!a$L$W~M3>{f`6R8O37B-e zn#jmC?@g?_6t6$}3a;L4=2!sz6Gepwp#*nkq&*@>-kl#Ym*S^)f!^bTJxK^Lq7Cj9 zd0Nl8YnxTQOeKY4jPLpJhU*Mp^P*7X;va6WYLudV!LU=!C)Oxy((_bJD`g-`9}nA%uexU#U)`62QXbn{AljVc!^2y z+xswRy}-}0@aWD3(u+PK>?OY!JZi4PeNuOLM*O0s@B7VQ5Ao5XZXwsA(W4t&wPFpI zG}Y?Cg2yM>9)~r$33doT%cZ>lI&fxKXG*PQEx8m8%BD-yg@V zuw073qLsTC-OI0BZch~IUvnWS9XV!>KBTXDHXPYBqEojQWDmsyJ`2ridgDQLai&3!+4Qut5@ji z*mdNW(M01Y=#-ZMKi#+U76&8|4Sk#D(FSZ-{ts^eS;irB72UQ5*puxF=C$ygXW263 z>F+yovXc|46hdQ=o`XSdu5uQQ$3p1~X6?lhz4!Ur2u4@q{O;22i7Z<0KwZcSVUg|*u+ z^~#`k{!DfPnUG$-c0j|q9+Vo=^zQsz+(?G)<@e%l=LchAC{Z`<2(` z0%+`eNLM*CCBLM@5M*KpQgvk0Zh7bQu>HrO6!XWH!#EPA(Qgr&A6`NMGP>bPC^&H- z6!tr=YnE*s$4GN6Pa63JJHm_6f=RLNaP^L_JynCtLqBP$5#tE|D0h4s=a}U<8rxIx zl=Szc(KrU;J{xL0QrAy`94sn&kevRZ4H2IB#Is-$ntqzV<0p6&cT@x9)e^(j#wRB$ z^3^E#N@xuzf46DEK=ww(wKh(wU$igXELy24M#d9LGrpz(cw6P{vJe4dmCMQMTQ8fB z!A+k7jAlI@bi1lprk@BMC>LtGWjcI?ZX6ta4_>8C*sSL~{oTbVo?#Gsz?IInqC|cr zLaBWiEwIDRo}?aKSoeF6#WADnYsF+aUxX`-VmaTQpNOyCF{|gZLff5oL3OYr)1hOG z;L@3%fIG}cZOu^hg$xOY{TWeip~6KX`|SR9o^&Z_BF=&4+x-M1GpV zZIYvg%e~GY!#y1i5Qr7b1dipnB&VJec1Nnjfr_Tp_jj#6sSb7a~er+|Kd_0 zs8`SSpFwE6hL{AV-z})GHyb^;8Gzp%;diBOcPSRt;pTcM*Eda@UR;*1G5Iog&_LC6b3nDc}#U9=K)ty}& zu1$jx4+OgLiK7{;`CGw_j?AX~>84!1?W5)Q-d7h3fAl>Z`^kp?l~McU5$k_+QWcZ8 z!9+#p(a;C6t3;tDEJ7x)aeW-MYJWh~$YgcM{p#k#&2Tln1CZ{XhG6L39{tc%JS|ny za3QRpSCAxuc#V4{E!S`|sz+cvCyF=FQlj@S4D`#4-(5qc?!L)FDhhhC z=dQF-^gJd2T%#Q?F>rC_aK^QkvYudg*kb53)E#uj22XjGDuC2N!L%3AIaAl8pDb2b zUS}c;5kLNB)`b<%WLsC>5b%MhHRfQgsk6d{`T|!%0^kDvm9=*)^Iv-SpMNbh<7)b2 zAjS=l;ZG{m0u~z{Xpig@S-yyfgxo{{sh!z1KQ{URTJO(`%RIz&=sqGZ*03{l=6>WB z#+ape@vGYg;8Poq6&dijZtLd&j&s{pSb(#7<#u|&RPGm6O1|or6}&_97b&4>q|AD{ z4@fQhXZ-mr1C5*N>BkVaDw!Vj zl-ZTv{mB4*5g>HPc}+u*Wu7qMAIz)crP&(X5#?9vy%%(5tP1N)_h~e2X^ue&ajA>9 zSM)^;DVSP7Nh1puRs~g$Y-)EN2?55ui*B)473oqynmAhd%Y!`C;g7v!&%i_?|ZEwq3-5dnur$+zdt;=pYx(xC}&EkJ3#?tpNk z&+P1n{fy;zZ%XG2d5R4}QfhK+EPVU$*fY!v$)5XtB~%BLJd$%vYbtW;2mq{45DopG zZU}t)6gsvjNhQ-G4yXy~ z9s|j7lJi@~mD$dUH)+Z^5Hf3`>IfEm<{Y_a(sAP$E^)~MI5@lh+xAYseQzWo-F6&0 ziH2-)W3R-e_O4BW29e_tNt-CZahbup?bI+h@7gau?w{{lm7A_{5eQI8ap)0Js z|C*QU0kO+aIqU6FY{7;1TdlN_1LRN~U&Yb5(KRcqS;RaLArb!1upf~2-RfI?Ed1&O zkjnyB!jPp3X!MXD}5976WT5it%q~myvca^NDp}%=k7b<+qhVNX8h2xiVQ`@%S|1OCua!Gm< z*pPcF3q>l2-iMybEu%HgS8%t=7`8dX!QzrB@c?%jfht$6aL?yx%;FBK*L{q`VEc4iJ(#wS*UIQwqL4TJb{zS0HW|`_(BCirnu*XIs^mJ_)yAd*3Z2NZ zki^-x|9Cwp3kcIsN~eRsa)fh@O0ejNzus4?V5h|qle)Z0=!2_1YNa@DE|-q5m*iAe zt(4~L-@i5{*Aieca;(dFn*L_v+WSA;%s(fDhX8#;tSTVAb)aKE&6XMG zFV5$O1Mv@0*iXRw+a6214*ZiNLYo}<9^IS9L?KkSb0?n=s>C3MB5MsuODJyl>JdDp z*xuofB#H2G1JFwBzgMFFWf2cKi(VK&{-Vyn3jZ43jcAn4PbATzqrdH-|Bx0mN(_7`7?-3i5SC*aB z3h~=)8!(KAKbdF#iR-anfmrZ{{TE(ovqyzNGXNoyX!k}9UqVzj`;zK-0p=S*vk^tk zOH5mmH%cZx#b%bW5v`ONlEf_S?@A9nc>pg7iMDAFgHDv=mOE|Fd6k%k24Yeb)(%*q zQ%k|il3ixTXiZI55d}i}zG`pq4-&q#Jcb{r(-DRPLbh$v z_S9r`VC*?e6{{8a1V3w%F=J2n=-AlU?#i~hTZAf&R-P|4(jSF>gbRVHB!dFoeptrh zw1`Uxa={e8q8BuXL*<3r$v*}^Os%`Q^_d>p5xv(APiZA6vEXVw-Rz9moL#tlP_=YdsQt-vC!bT?op3?h-d1Zy2g~wbmY=5mah1iA^0Rp-) zj_AosIy$xNayq;~2aV!Y!%~cvHc~3%7s(2NwML#SR@s7Wl8S!yo-L>Sj9X8euC6Y` zv>T@lFdzWA>-YG4+#`4XvB>RjA$*t~T^6f%iqJhiKm6takOnGG;wGijo;B zY%t*d)bPaxl`D1Ap#+6p?@7ZI#NX;&I*l$pp!!@8xp4EBPJKT3)L)pv0V3qwGdDN5bp~iZ&=?q%?F&wfx605xhSSZuq<<;{3!Alc+p4OYEW5 zX(Yq#XIYEw46&|DQw~y+Q;Aft70*a?nvEdq-?5)BNIDizf4UDkdJKG#F17&b7|+4_ z;}%+{jImBg^>@8w>0 z$u`rqyX&QI%SDDOl#sr#%@I|{voo1OpuT;D<3i!|Rs~U;rr*IDQ``6ESksMjJ0l>% z(My$!=LwS=5%+^)1qT+~SNo*QlA~Unwsx)Nr;BV>fsoo4Gi}@=7?J{5=h*M19 z=OE-;F)xI8h$p+IjUIVjx14PBdy7F+ZnoSlaQZC;rmnZpayv;x#MW}T>*)FD;V`Y& zq6<3Bu-e+`p28`02{JIfV@FMjX-c-YXMManP`(~8_K403!`^|-Y@-f2vhX+vP=+9} zp6N1Bj7o!gY}a!%7{3HYf{07O3N0Rxd9mic7`GlnR>Xr!8_P$RrOPcph^SZblu=vc znm*xvLm=XBAF=yTnBO^%Yhb>}h+>RNpodH9&8s&Yqd5yiItK2Cn?>tkSE_NGyH)9^mt?fiyjfI#GHnaxf%h_x7U(WJ))mBM9Q^XH)#Cv0>L7Zl#26A`O}Nq*4o(V`FE@{F3^_{t^5)dtt# z9ju9L*=|f6)lugQJJNIrIeb5)DBs=FbVWm|WH4|^7EfPBv#IgF8KSiuiIPb|rbw6D zj)y3+nFci>!=d8m`_J}lOQTz|F>_V(d9ql?7*C|#qZprr(778~jO4}dZ_Vm;#B!x{ zFi@EQQ4e?YmrJVFec^J;eur+qpCIaI0G%WLs8w085-Uao(v{*tzAX96Hin-W$&I8& zWK0^!*vG2uh`!!0L_1lw6PGJz)hnUXEle#P0AY%{eNb!N*Jy-JlRlabcT8?OV|1Cb z>rPl1?b<45)^kN0%z6@4?{&I-`m)aBkl*`)G5#P!(@Z1%v;Y$wNbOjGCM$)USuV?f zQo!cjq-}%FjQbh~Z{G^%Dadz(@P~mysi67?>t1e_vz9!!*Tpe>xsB8VsTkFJ1fzK_ z@$EmEEd&iMCzM_`)v)AOJ`*mDrji?^?HHjp<0YU*<4QNG9bcs*Vmt9N%)PLkbD!Aa zak&WH3V+B@`d|`M1OPKhRguqYO7D5Z-%hPN7)Vmecc|RKy8y*)3S8nk>-{@67I`-= z-wA!X6M+aN=WS8f{&Cl67(sd)lbU|G*q{ls3TVTYQvLBG1!g^Ym116nS$IrKPnMc= zk{lW!=&{XxomcukERQ;k>X^ylMqJWN5OFr$`U|KtGotOgvNI9{nf~POGB{I{Qj)#+ zN6A>pYs?l98>s#B1D!E%cT9!!^LVHee7GZW;df%E^Xx|peBZH=*61Lt*1}gD?-8t z2{|kaqBRhRZbLNRG>Q~{{X5~jK??kT^OAJGJo4uJ-l5-XL=^hG#-cu4zuI;*G9G<+7|QAL$Gvq0gatWfsrY_li3vddUYD$;CSE zLwC7(_>`||ku&wxdAPW(7q>>*#A0rwWvV+_`fe6BT=1w0UOt=gK7FoH?U<9Epk-6_ z5c3)toiLVh#y-#~JiI1+v6piBj)?xzV~~C{1#xJ9R!nyNeidl-TpqyFhu)bz80Zy( zQ}r7Rin;G&vt8ftMT`uVL<|7U$o)BP;%lux6ItXgp`2$$SQ(sx>3Y;6&SfQk5q?OpMhNv4qFF%sRWwd@ z#ierp$eX&nhp||_W{5?75Eg}Z+cI9*Np$%uUv<*sA0R06b6hWMHM)Jk7-@EFZ#Gv9 zKwOzQ(MNtA*>skj`!e`F8-6k zDd}EgWd(|2K$r;1(fS5PQl!QG1_RX}L!-Uq5$NLgqxsoXbE321e`di7aa-YNaa71h9^di6^`(jJa9jB zUe;+4FRsWO;B+B3a<47A_ae1a%zzx9YGqQX*MAlWNFONp&DTr*` z>p#AepW(FnVpmSOdbbi&&WR{RnH06-oyQ02zXBBCW_n!k$K7C4H^I1lAy-N6j+8tW zPI68dC6ix0yJ_J#Bf|_PGy1xGAZ=OgnSG&h-b$B%soZ@2MYW?vqk3EuIs5wfApORK z(Bxvhh0$UGV1x&keJ*j^>b*7-*XfJ&=K7=vZWapci>2d!UNPiF>;vko4TzFo1~}rk z0gVgS=ajA%3{vg6wt~G!Em|5HYIzrP{sb?Vkm)8+)ChPe;8O|Sb)8D$a!m{8-xp8z z*c1|42;oJ_{gu)m;W^;TKDPyu?8P>E*gLj@&-Y2#)d?#fnkBns?d;9;oDCe`y)LcU zptAgi(gvGEXy@B?|JGTr!|6G@>AnxEs_`IX2=^2tRoF;hKF-xh1slH%sggpX%?G$= z2rY_(~MWbPl<* zYNNDl+KCQ}eiYWT);eoFUn)PsUgu34@Pn+Jwj0T%esU0)h{7+e$j&XOmgz9BoVzh# z*Gg^XNh|Sv1@&Xy4Yn0a`KOVbazzQhZOMvvNunse|`ihnx zT0#P2hY)K)11Fgq!w+8%acd4#arqq0W9^llx;hdYs7O*sT-y;mcA-6Lb zWMj|?3biUZKX+sPnk#HTGsA&^c_Fz<_NVtHzEfl@%{=#^GAU|-n4`wbK3A}D(r z=1CZ!Ulp_OlcZT4Xr?c>e7L!z26AD}x*;~r*%0y`VR}1!${6}q+O6n^!DwksHGFep zpQ51?6$fz+lGUBH=M}T+5u;vZ`iBkY{B(QE$3T)RCD}KSDF&3*Lc4w-unkx(9!0-JkY4Ipp$xWQkRa=f*Grphwt>KBKKD7rd+3UPlVm5g;&mV<~rs?fGB9%{A6d-A4PSEx5 z6k%=97KI)@m zVh<S#9>EW>POxNKZX>NG~ac>blKB z))Q2>orevcAftVQx0fK5TYi`-VnJPvv){>e+HEklxraF4wi@frGSgB!9&w{?I3KY^ z%myGcW@NH}9t2h_hvhAc%ck?ii9-YodZkkSjZiR+tD3gXf~(1h7F;RYcw7Z<0t zZU@6^^vNT~R0p+~*ZJl?=5kIx1JQq}h0?Z+7N;}n@!Srmf)ndxF!nocR>5UJ3Fm9c z8f}Yh-GS=%=bkG$xRsxyVxA9wisr`nqOi=OgALW8Uvi4=?yc8toi0^UI~^IWpl8t0 zU%tH9y6jRZ01A{R6euG!Z|R|7AMF zCh<=1S8mW3W7G>_1eC5;q1(ueJ|zHG(TMmIjT=XTe@2=REF z^=Q{Lz47a7+@-W&PMOsa$1&UHpqtbt0##{i6p10RjypG=L(`66yWqp|54HJf%H^+3YZFG{GbD_YbL&Wpe$Pa zY+DKqMuPcwI{>I4AsRIH(Ll=HiZ-96^mCHrZua@k5=f})9OR9zq+apH~NoY7DodDe}*UR9-p! zV|f!m3PwXWY`}uZU?YqC8=|A4C!z_zashRg9{&Qd4UO29StXD}+r4wfnxtYPSYIJr zR9|&7l79`-fo~m#n0On054w@vF0Jef;yHfM4UG7ey6Vo>$x;0eV$|*{9}v@VlM@U5 z$wSeN={m3e?onaBhMH!D^)6SfkQ0z|lq7!R=)fSNljlJ~4gWDC@l znt1Kdk=!{F+%oHfFoxxOKu`l5T<23LwF&!+7qyArC#x883I~7B3JO~Fwk&9d@F%38 z8&t{Ni<%O{n0E3ySQDXQ|2s&yoJ6BskL|q>Pn+v4D)WglVA18Qg z_LdK&oV++kWTFvkMgJ5bzJYR*`Cz|l=IqhzD`Yrk<2YI1KOZ`Hr-ZPP)UZxzTW$LULkQ{2zQBp>qWSc<=azw-gt#T zkn0|h^aUhY(0pQ@8tz0bf~inflO<= z=lTjW)u||q*8AuKFjjh-&`~{~x^x#qa1Tu#pgoe#RnCKV6NK8&TQhyhVLrXx{41q>ts?)dYp99`p0+_)ARO=6d7^9&9ntGl)&0#!0h@Q8V&&)~@ zh%I8*$FQof8uo!R-h6TATREC?=*2kPpw!GRK%4`zWP$)XJ@R1>QRcL!ddfNZ*Ej*~ zk1ZNggw?b0k1RT#IhD--V7FkUd`&*+o-XM8aM)=8+{s|^L^&pfQIQ_~ijDDN}@JBc=;ucr0?Ui@Q7=iiGO7IoJn5r3)&~ksW-ZE=KG0`2>Wm#l}*G z(FlQ&u!M<0zEN%Zg;rQBvS$+jHd~42zv-rTC}7qZ=59Fz|FaHugewD?!Q|^miGF$& zg)*hE<41De+-KQg_iU!drZ#8lYP8*!qSK^a=VzdH!Bc#6%d%5MssbLYg|C9%0+)(c z2vENEgw}&A>46sYWx<#*YP`kO?*a(tP0+1#joGrW8TizA5=#M#fjg}XT9q~&z;?42 z;>sOBXctC{1dLjwRY{kN$=}ZcD6CTjJq2`F)Q;iGpwklB$(iDFQKj(!{)!zGxK%`d zzxNp@RE|v|-M=gYj$UCZwu#{pr_9Jfi+~GNGF{l2Sg+>6?5j&4N=g$((FW!)( zuQ3`SSG&_f*(_$Q7I0pmQ=@uuvc}c_+~t!-X;v-hJGF1VsTPRIupv#FhZJ#~D^7hF z59=yOx+V1{5K|~W<4fZMQlH|EJ16e_4@ui&^}JbtYygifjm;9ODF+QmwrU)i_8`hWTTpP)^!ej;Qw`xM56QPS; zczsM}Vi|N+1|oixM&kEY^s-n`E9|R~n)T~?BKAQm@ubUOb$%Vh$z&DDK>^;DD!50T zbl{=8J7V1eJ@mo~UlKMd^)%qARZ?}}lZ*_%StFR($TjzBcy9>8OEFXCW@&6j!Ht5t zXB%P)8*CQPYMNFYXsQ$zjGIrgpcbLYLVuJDGJm&BZ!g$84$6d-Qkk2udluih(T;Q% z%-BY;C*U0$m2jXcd_DN6;AfQ!bRgt}a`q^=4W6UaZ$hQ`bLQ_X5{Sy z^ezQnoV1FoWiKL&) zL#8qmlNXnFRU6hTewybdjhA)-Jmhj3S2b%T=F|80EFv8p@P!r$O9NJcwxwH$%;)ml zg|{!aLReWVKu2p8FheE$M)iQl>RETA;Jwa-s{`@i&;^|ti7)Q&dMVgDhz;b%LaUt* z$i!})@AgA4?%Ot;zZ8!8x;?MEaQX85%fRzVwB6m#hm(vRr#OZ+cV-+U1(lcprC$%+ z_*VgVQ1jzdlg^m1w|!12e>eEOW>aihF?CvwHzV16$a`iv@%|~?X{gZg4xX;%mXeY) z4jJ{+rP<4#Xes=w2bLj@*)`4>T|zXn(LsrYo^CL0FQ+gvYVS~tuprL9Q6x~EPP|_G zy47E7ILAM7d{c$DV)`FM(v&nQ+!}+hgYE?stU`akvO!= z%e0LB3c6!?8|c_Fg~*zt{lzI5m-ynNjz;GXMs!ff;$C-^3%KL-5m~Bva7~y~dqqH1 z>=5+(&&z971a>7;->vs-3HN|iwT1MYnk$^2!pWM>ue995p2rm%-z)wJBoukj9Xn!? zy`2KNd%|mF90}N>3D-_9`*oiS`zXfqm@EPh&%^YsBFXgnKl>4>Haam_0%R?dcna6| zV`KahY*`-7#ZZP9AT2Z6N!=Er&Xzx*#1%XaQRy;@p7F8iPxC!npmp2rld4+2eGfq_ zyzYK+Cb|%sbks{1PTpK{?HmegGB22gR8j=3#@hQTz)_dPULha>^3zj`2!Tij@PZ}H7z z$~9qf2a)A=df1{&sp*Gg*aWV98)0Gb%2WFTjpx6fFhS>mUUnT&5OrT|0vi`lBZ0C9 z%RkKB9P~#TsQ;hNzaam{r%<;H)qKTp#mQP59mu0l8IH&1wK_a#A>wX7Sm0W1;$F4O zK?5Ua;qFP6!w*6ZU@t8u`H9YhVnZ}Azp2BSh+J7P(5G@UM;f#Cjh;Fxi3 zlz`-VgI#d0S^&aHR_$Pfi;Wz&3CqLMQcL8Q6k_khq|@DaZ`s#+jBfeGZgcPg0aNcc zkBZG`q~tY~86&ZQFQ|m!q2~sK?t&}ow$1HW=s$!k61@@=ugpq#1|DG19)+%=5VO*7 zNA;|JHjkK%JLFb&d5uFOG>={wLQ9KdZm9qSk5XRD11bIWOS_JJ&d*%U|H9-iy#2RI z^xjo6hZEV!iXOV@isz{DcW-%bbLn0O#iiOX`mh(eY`WAriG@$;K_fCvY=q2@V<2SU zeiH=$c1_rFyxK`@cg|l3NCD>Sz2pzYp!RcQU~>Ve_WD%9OmY_Q@6G-f<;kF(Y9b3; zTo(5Co1pI(rxI3415G6*hObNEdhhvrtTHuS3}Qr1%nO0y_-N9gaFm`@FOeQ_HT1$| z?|(Ix#X&yOdKezJ|Dp52HZJq!q^g>TTPy^kM)K*NmzLVOs`Gx050+Wv%ESPj_)Wam zu-uX+M@<2!Q65-57M}%L_=j-cA?4C6XqYhTjeAq&Y;;kKLLP>UJlTsE6W_?ZX+Wp? z)wn&OAKNxMfhu?~(E&>S+M0jV26no=pV*QLG2D7rt(lyVwZ&op23rQ^ss8dWze2DG z(E61ipBGbVrhrrd0ufUmHY0g|265y%Zkc*zt$k)`Y?_m3^r%Yi*R@Z&)1d6w1j|

2dev=erGfl0&HcC6Qq@-JyXT{Lr~%X&zuBsvA#-XlRQ^5x6VA_bXhvc6)%Kt%v!g4XH}eiV zt45W*D-3$b+I#Gl5rGyG%?8hINn@$8)q~hnvxu&kmoxUNk3J$zB^Mc~x(zEJnJJ{T z&E#N0CewcEXlJ(MvH|}ju*fx6T>sgnQ&@*c0KKYG$XuG8)js76JZhu)qCRaJk`bNj zvKbO1a=c(Q`X)9)6SZuAgU65~Ox!>rgq+89 zqEsJOgsAN1KdCWt{gepXDn5*9RlGWU5psiF&aZ>rP%fT4CP-_Jdq6bWK)^(#$UgHq zyfMqmWNW*W>L;6_2++JIEz%4%*!vVEf|zdk`m!|kUYW%P5i-!1?}nCI^Csw-4WSX! zbY35ec-$Y-ex2p9D&UM0;P{4?Tm8mY+*YlgSn}oTrD#_@mih!->DF<)cK#x=9#sN` zNPIg5$Y%+e3pRrylx;|(QTR(d;9=-a(F^KNERoL`KunXlyn;lc0hS^HaKWPOO2$wi z3StMd#~GGuczKjAvEEPZr0hO(vU(OlEi8D&rdqzY;<-U=*UA+kp>_e=(Sq&djP}v{ zSCL;Vf`QZsXcX!Doq@+}?0&(bZHwVJg=?9GwchuhLADRS#wEo>(lja-Gqr9&x4nL| zkGB4x0;VeBvYA*X;4#4ZSn8hL`3!C zUGamjZI~(xgS>t>-$-zJ0pMV2RSg@PE9b(rWq{l>@A9tEnZD@C+rmiJ=sX^Z+nRWs!{6|IX3 z0A)a~e)hKr^kEEpVp`j`ul|pk)&J-~!)!|WF)6^RA=-|&N|77KZ9(2}*==F!u=sYt zQ(}JTxXNjJmfB>CEsTId#RN5lu*nam!ZWvKtA*@eUaV{$uWY@EPnfUkXOK^H&KmD- zl^M%f;0y>FNZz)El@EKJe5mT1T_|}z?Nkn1z}V=NLb3Yi#ICzPUYDSi#ti>E6C4_? zyoJEfvs7R>s9$wm14Oq9NW)FPWK?1i^ttattDweY)^z;kf??a0w& zdKV0@A2KGn8LKSeKPnsIR9)_KLW{BLBQX;=7Qk1Ud!H7(+exDNp~;Is6pqfta*Kf1cD4cTjwm8}5J>3nNE!nptcYd9 z)Fp4O-96jPc|)!msX0`0-zkXfV*&Li2rh{dm5E&a#2!ZV=M@jKfGQjg8}G)_Svu^Mpw)Bw80_LWvnZ+@PK*ds%L`aR>fr zh&tQJ@UXPU@yELB%IC^t%McmYV|M*|#~--fCXrFxO6&cu$4dq|T0`#JChgC+>#C>A zPG={;yI}$glUc7Z`l3+w&BkT4$k0#$44KQa>iSm5=j###)Z2Q&nv{` zXj*u7IwuT#Q}3$BOYtg|{QNPI>0WO55^oDgAEq6qa~MzZ+9dkc=c)@i_VM!XuBHi3 zR&i)G)F>Ckcd}J2cHWVE4!Z|&;y;|;SR(V1N;eP+Q_o90zB^fWFs_%DKk&e8=@z}U zHhgLABZXrSbwPin-NfzCw+o5Kfg?hUzg|*bld1iVW1{c{69&P2!r}umjK_!!xCT}` zdqLXexm1P6fpt#AX199t@MPT!;DffE0(0&Y@s}yI*O)a6ZSz^RYG`xWE1iv1Y-y+n z{!`G>=3R#}9RLw*5kNp#&<+osnV>VZwM;?WZrLoVb6&26C6?-mz`4eEu4ZyjzIKkZn5%KhIs=DSJI7E%dzSY>x^kL?`L?2FWj=Do!gKKi z$d#W9`3jSbHnNDFzc%$UuXfatMea{(4d^Ay0-udZr9w;z;_QT#*XNZ&T&taC<9a&nUANPywd_wAG~UVH%qb^=0!{PLs-t-%4=Owcn{LtJlh9f zS^OSIGW2uYZlstU*-h~Srn6PV2{1v^mwpdo4=#hbigrg6T))mMn%n%6C5k0x`eD*n za`&L71R)6`&AgADMG*|gW@l~|4w8M^l-vBfRF3zqUIULg>3!&^a^T6g(Jz+C)!*-{ zgX^LepDOeg$N=5oaPE^>z5N?ZR~5a_b|jAxO&5=WVEcOFB@4OU@TapG*Eu!_J-tfp zdTw5C)Zu>OGGg_7y2fcK&LW9ZBlR?SXKnV^JY`J0q@M$j*tr94RN2qy5Q)p7E2&*3 zUSlXK;=L9kZUFE@o-9F5BS|jJ*pDE|<6Uc=CRZ9uZ{~)rPn4KEb<5mi_5?0C^a!rQ zhF}r|_sD5L$bzuour4Nr+u9mY2-kD$dc2%94Y|w`%0RY*k$P8(MM+vhpyz(4V3gZH#ESv_v@?F(?)E1&cyMdHh9gS|%_GYD z_Ltc4w$G&v`i;{HFw={?cV3^yRunpjX$?FS!mIq$Y@sWyMp!oLNKS_a+?GMF6(E4KtdPq4I=+t z2PP9=-7Tp}&J`tLw{)J2@vU>0CgtEz&vb2N59s-QLgK)`kHhybI=)g^;BZNT7!|3Z zXUR11L9`1BUAkEC9`aU$0Zwwfp+o)7M^4Rw!D3JJ#>yf8M|J8YQ9)w1=wOTcOS_c+ zc%XdmGKb2)%879Q;Ix7hba>BQVg;*+(lxQ;NMQO=*adq9B1Z^+r5E>skL1Z$1^gix zKeA`F5`Cq9g*tht(2M$I*y8k>+1(dpWZ*l`-Eff{J0Sbc6zNz0(+vFma?)%RGe=9x7H zhYVZ*Yqb5tum$;E^|TdmHYBqsOkG__8v+=(4gv^rTN>L0*|GzmJNI1&Bw>wE2OA~j zg&#d-UapUZG-cp$R@oDL>UYmUO_jFkGo!sT=bSdjo$g<~HjU*^ zhX2M;fC7yxc;7E8`&E9yC>UfonLXCOmgT!Mr3;&z0k4GJNsDA{Z81%)VOo$~?t9g^>wIOi zU>Y%}WwzZj&kKECSwRl9J7;;)RSt-0af0rS#gT*}jcBBe82~bw7s(Rr=49cVK_66- z?4N?$6q9i?FM7$Q7iw2dUZs3FED*}G3J^mpz!1TEQ*iu;cfbMY=*=l@o%Y?EO4>3@Dux0#fD!+9bh zBvPo+v}OSl{%Ex?jOr3u;<_cNZwjN-S_n<~F4FmCu`{Z?;=BiPo-1drUW1y>gW?qv(Y^@9>cV^9I-Isi#*kVFy9fRZ@=M*>MLHDghQ#q%1?C={Te}K+qnO zRXI-f9}^?6?2qMaLCT-z^{ZMvCcpx`K%{Ds=kf0NTDl z@*N6H`$KB@T3qM6EaYV8DKDk~>JbwM?0YhqDj$`xaaAku+v+DtxT9>=?r<=lqR4qU z8B~qfYp!VLgX!Ls5N}E*YV7b$?ejo|1M>_=iD$+r!Hf+)J@4bCRJ)L<-H~9egLX*P z_FlzIJkL{0MF^hCoS)6G)ewdvdAe3Tb;9cW6;D6ph1V|hy|(7?;T|~xWVU6OfX46^ zPB1sNa&oi~l0Y>uJx4*pq7hj(AUw6nlhH&3nz(AC>tNK(}fY1mI~VBJrD^CnL!H{w=!pXY?R$%Ba`4~zh?1O-&W zf`rZciY$4##%1PDBy(}J3ocoK>DHcvrCgKX3~=(s+nfP`T}-#(!9jJuq!kfF$Nk^{ zxK6nCbXyLbg*$$QewhLnJhS}HpSO^2IBklBeDyeqMhp1y}3h~w@! z^8nt%UZRiCQM2+$Yk}0Un9jEcZ<{X5yREXASgeYEn1%8^GKGD$?W()qD1Y*_I|>Ul@%F_iN@>TQl8 zWV5a~0w*Hv@wrKDupQbCMU^wat&?jjr(-hUK%^zX5`o(hIK|y_jT?z+)BdQ2nE$kC ziejq)r96-fT0S=e=&?q@8bPCh{Yi>dH$cC}ySmz+VCju&&Juc%cAaYGz&b=$UrZf4 zCG5V6^NM0QRaiI4K}kdV7gZ1r_LxpdYk;3n@_x!|Zj+M6?n6G}3cK;n_f>|G3T*9TDYEF%m%!?r;RU8(gXuA6BxmH!Mv*%W~2} zM$87d9E`Jfg2FFC*z4qzSJEwbKx%e)|8|NKPrD4{#RyZoHP##1ALOlu2f zl)B|(eWe3Xu;M1X?1eZqFbos2ICvX4pWo2eeG%bO396T(_hU1l8fjM0MdmOLnGy(9 z?QVoRp}Ho3AK&RKf!9FM)z%QS_M8l) zSL0A0+)&f37{8p)Prod&se+!XL;(9<{N>eErCm_A&DJ}xIJ|CTD0K_2M93hyc@0We zLSmk&_G8ZWC+6k<0t@)2-k-2z^*6XTqE2$)HC0r!$G#4;rz(iH^gvHqm<^?hH*X?e zfDqIikA^Qd4h3!6z&gTKOPk+L^zbokP+4GRRY{LPP(t?eB4R$e zVFm8uG9>z~A6!f?hp9|?in0ds(9v(L8pFJ-ABkwF_q<#mqKemh2J+B26~h>!CU6>+ zXTZI}<F~nke3AUBS&zI`j#uCT41|h1oO@un%bE@2v!S)`q2M$|X-~3?T}{%aGj@9N&p`{6 z;+wXUrA=8{xHU5`o8;jvbB!tD-=5LFV$Wu|ub3n_sTWFb5CPTN1g#KNZ)P5`&Fukd z=&d9kzR^R#6|Sn$3ZzD~=^FrvK#~f5HeQKyx_|zroHi_Kz~gJQ;mWsBXPix76ezht zg<1j9ooT;*HjDm7OePqGCE%y5!uH*s=m`9ZV#(b*5!?)1vJO#q9UPkFBf!ZEBayl| zKb%8l^*KKS>;V$NOkX>FCM{U2gbXrFhBSPr<|RJM+F_lrD$80U!?IhsSdb=FX1?+g zFosCznRP~2OgJD{{NxtRp%1ErYW!T#PI2`Gmo)}}QoTGKd}5^pn1X#*Ow#!_eD0lC z1-UqkD>6ulKl;wiLhf4l*H?SfG~)Zwjx zcOE-KUTw#l7Go(2?6FkjXR+dt@S>q$vm)v>eIH!1yP@ZYo`u#T%lhRXuvk&Pgh?YK zTzEdm7*{+pm`sHf4H#g5t+mYewsIKIk{0l2i|0}_Ax3W#p?1jGRxR}<1DtKL%6`by zo>T=#kCA)_3a^y{K?)+XW5Jg(MI;eI^WM8VMY?V;$$dHQM!)%7AX;bibvyZEMS3f5 zmNiE9lfFpn;lgHds%l%1A3LV0xv(f4&=dJQc)5C@jy-@*pQEUK(*t^~UVi4y6`5U^ z*CLWh+R_*H3$y>!2v>a1a95}54>s18VnxJdvK|^4E^=$QpWe3Vi?Iw*?mGmjt~m9} z1B78J%hM^pFtpA3>6{o0VqK$k9K)(@T%-eyS{GX%Px4~ZDGvn>xcDXK*_ZICVo>k| zpKJ=0AYTu}NKZki;uY5JbF2vlLD+oJE@Kbm%S{cnb@x{FQg&2;lHQlH0*ta`95y=r zHXQo;k6Ph(10glCW$A}vxV z#2Wslw7@cbc>FVmB&kZQzE|@*SBeBm6FdDl1{qavMm2#VXm`RSq^%)b!Q5uM5Oslr zFl5#!)p%Wsegu-dvi@+MH}~bd%~sm7fNpKlLt0S`CC* zMEA|vO;h~$z!l}gUwuyoaTR{@_G(qkxscnhiccouwlIE_yOqy?g$SvYfPwd6YT0L~ zb!lOm5H(8LFLVeiWC!`Wh>^I;xxXDWwaQR`8&rLSwd26?1G_tPuIIH{Za3(qs#lPE|JEeFV^=}M;?-#s9V7?4qmeT<4 zt5{p7Zo4HanqG=9c_nVQ{Aa38#V?jB9=UmP7T9oTz&8fthB>sSpl+oMWn;mLp!f3W zHt`!7GlMuMMdUL8zMBn&Z%21H`wtBDnV_%%)Y;*zPL&rS+xcbvUn~-bbqD81LGOpE zqi{&q_X|FGJ#>w|IrW8{{OT{$V!SP)!W(r_Hn5St)7yd~)xvM)McqNifa*IzkiioV zsuzOssqY*5fUCUFQ~T8D`<1!c!o|9;xTM*w1pXeuHPbKYlC;@TKlT2e3ZPjAeZXxj zh?;iRxnuX`#i0l;gS#_20|4Hde1>P@`gzw9^=5aPlb~~+dtc$PWBejBb<`Vd&B{@; zUP~1%Fk4QxjnKmu5VR(h8g*+2N(^j>p0&Z_;4Zvffm>TZJj+#%K z=}wUsUUn3=$nRcV|s2YRpmDnDkd%xnAhN=7i z{qw(i4UaBmkJ=-!zmJqMd~+rl<@lVke?4+Hn5a^Ig?V!*O;Q5!X4w@=sPIg#uHNOj z^S!A$7wE95h{6!e6P(Kt{Y`6>Y48e_sCm7wpx@YU<5YoXmB4e^C(jqvoo#Bo4X!87 zdYm9Wid^i3qzcVqfH9x}i~`-~?5}kPpD%q7>Ud zKC%rLVqLWk>RW-VEKj1$j|iiA3?kCv5CUxMDoHWc9RMwDenT66j!aX2%SaCehnx46zhr$lgp>L#D3c>-WC-2be*#r|CeCcECI0j)+E+kIk*r%qY+^ zj=IWL&A8|yQ_=|GI=YtaM{B6IK*KEXeYHR-K%YaWyffym!GI4?UAejmg`lfSL&t=> z>O2z|Pda1YVnG9C#Z;;HQ@@BK;Oy6&bzh+p2qm|bZJc_L-^7K$KcIA~33w@3riW~) z`PT^mQhRjQpx5FLPcdm*F1&~9oj-0+yM6bzGS+gS^0&-V&06;U-M^Q8br2Y>Aa$yZ zArClzkUB~6l|EhS8nf)!UmNi%7`s-r)(t9s+O=I7O3-u)Z-YHLnFMO<6Egjz8x>u8FF-CS0O?K5u3pd!#`UUc7l&xE29p#gha+lKu9AJ6y#F-eo6VKr3RWJ zl*p0aAgw2TD)JOwCt9X{gLvRMVjMPJi-C6X127f54-Lz$Od4y8Tx}RI9Vo9qUqi+hc^!KP zFU_dBpB^;sp7-vWi3|O`LZT&jvGre;@vTcLgI&P*lItp!{7PR|3f!$9WN+uB>gU~o zm{8>~D?-(_On`$EGO$uhSTUY>do~p{Mu+J7Linf=$QX;DJ`dU+-#$_g^W>X-hsDlg zGv2FNNBC7i9g0^C&X0krDFG~1*Hy|Ch<>7Kc|dxw+E{Xgsra6a<&6?!Cc3@fszeVt zKHk?*q2QS+c?K)P`BhlARV!2Lv7{#vz-XhU7l?M#D=`*7`w@R^4R`>hwv${#DM`T5 zUpUf*6}}Up!fL6HnG;&p9)^eCtwW@mTMfTPv}u$FEP!|@if9AaI5z1JV1Yy!yMFD& zp8kDZ7)zN@+X=OUTKL7qZ-HxX#sKMGg1_Y5?RNX@E#)Xr?6G!LDLA zh1Iv;gWfD=c<=nhrE>Un8zy_)q-xV{O;Bsq_z66RJ^a1ih$qN$O@m_7so?qJnnFXM z#ij}=z*BK`!rQnp0slEEm9H%PU2k|K{h$5L>T-j+m811WgSE+@k6LYC92EIOCTS$NDxYkd&5>z38`FBH363ET9c^>4Iy&Ti65el(B|IoltU_^U0J ziym&#acAjH?7x>5{=|0o2|i_|)dEfrSTDlL(fEM->Ts;>bZjFSYJTk7-nXAo6rtiZ zd~dR*nA;4yL3pd@aZL4$l*q+%bF3#r`ISiI?A&d67t>=FOQ~g)PlFFg8fu$e#9OZ`OO!`gU4VFJ9jfUQ>8(y9u z=9kIKygTUvj<7=F{dE@T$)!ePa6$W`spro02)@j| zX(2%Oz#7Z)odPrtXs%BCNGEFS{0~PIXibp-e)n0L_710^@S`Vw!8zo!)o-N~M1&p= z2Y57|hm; z%?3*cu3`tGii*|gmAu-6%Ggoyo^4YJ96uMW8()B%Z{;p465F}?{q>#i-^wn5Y$yG| zIq&m(D1B7Ik-?b`a(kq#>dZ3k&SRD!DyT{MutUq(Ux_8tF`%mndc?*uK& znzjb1;bp;}UBno&!m^!nd!AX}3lDqrXt+tFxkF9DRx*Y8It~%FEs^3l|9PzoDt>pb zuuH)?z6=P0Y0L>Mr<-LV@Vyt@HefG>(3)UGe2q>3HW;+`01F>c{1du$O{;_v{po~2 z(SYJ-AfK`Jb9S28BT<2Og$=TZSt@ZKPQrfh?kDk>m|$n&vXAr z1X8+(Wlrt_Zp+WdD)A3k^(wkcR~$UI8)9Rh^vV;Zl`e9bk7mYku+z5$1ejILoOvlg zna~vo3AvEOY_g9X<(J|+p;p(hsIQ`SvbA$7Rw=(g6jK@OhYa3>kd@y#bJ3wraaCg0 zNqXQU^>%@npXDVWh@#}!pV$C0wLU1-3> z=`g|DacrIkIk>JoxC3DRDIOrs0jP-zDM(=ItBc8gc3dp%*+Al8}J* z0_ETnxD6tG0U(=C<>fnUR7yi&N}5{_W)i6!Y=B%{iJe29`1rSF#BZAatvubXgZXeG z&+2oSOK)$)eO_N&pQ$wSlNa0>v2ZQ(;q>hNb&`m@!Y{Fl_w46O4H`nbm?**`6xrEa z`z3u)`QY?1!?RR!0I9Dk!zlNeF9xzOZfh<|FXe8mP$aRMVO*q|3rO*luk?;Wc;2lR zC`R;N3q-qM61ocsyp{#hHhAhhTI=`ZXY*cYP`y{2A5#8F_0JUPKQDKtm%c*in_V;) z^V=oaeV&Iiv1A@pyiWd6bE{d3adDa3;k=Rn>X=x9a zoy4!nhDVn>M3;!~*n~F|zCR+1$G@Ph0fOtIJO+)5uK#qLU7XZ~RNwUN00LHgy3viP zy%+03KA@Ax>^PZQ0y?1raRSQxmbjz)uvZt5#{+?Ou)(9j0SBgNgA1jnm7y8^bAZx_+ zYW1agVQFaWlX}ww>z@7mlHN1ZXrWdCFM_Va^|Po34=cFwVfS=#Gv=)1)*A?aqM9G% z;lhwNDOYB`EQ8<0UiYE*%*}p=;YBg4p?z1?oQ|>a19uLO8Pm@enuV+h0o*g!ohl~m z1xk_w4IY_$tL+;!m?89Ena>V{mRmm_F1PBu)e#hL+co=0OCqKEIt02(8}G@OyC<`# zRWEJqn4g=HMMNVkNbNR?uMb02xRfRlD+&&6UCr4O2NRt?LwNzF4S7~4u(qRT+xxKY zeI*TMBr;yS0~nF2)^%i+1C3&%YQ9~sYn=lB(mh~c3yw2h zK)a10_mmCSzA!w(*bauNR0h4kRoS(+J`_SvwDi}fC-4aI12fs}>@BQh&)v^dwv+Yl zPR>mv$Pm$fEU*MG?L6jZB1O4D)D?9NC_$M%XyuC4r~XvO8l30@%1JSbkK zJ^MaMk?}G=grSz2&?g7cWcSJB$)T+2{<9ff2d|ODT-t9Qnb(|I#P)u+0|)Q{7HD-6 z;58>e)2N83O1Dv#mi~O4)_-$|Zd{#zhT2zhKotTQav5OvNvg?;uH~gShO(*DcRk4q zt-W{MKgERCCx}Nx5esaOx#rs;sI5W(Zj@lrmXF3CxlfBSg!VLw&<;H=@)1L;gTKsr zhHp?b98f!}wbtouIc|*8@$dD1!i7Gj!O8J$7TEd}OTBh6ujfue<5`UJMBKjSvGZ@` z0MKzeeTHr&dc8v(Ej%hU7S}Es-bIGnHsKuEH%`t?DTSOKTl5gNvg^gVY0$AH<~gt3 z4QD9|l7d4f6P`Q&231EJ-5ZRf8r+>0%gbJ}K%29;_+HjY_%b>=x;t24i%9@g9jLeFgDNF?2fwmh?m0gZh43-G z`7&u>H?m^3o0S_Xz|3vYZn`LS$dZX8e>lZqixqP5t;gJ&4=l3td1F7GA3GB`M3D%X zvZg;iWUmdWj_VegNInyN?)FA1$wOvy_VaACCAex=d}bg;zrH?`kpFSrhgNyRX9cdp ze`-s$g+i~6(yqL?;a`d;$Y+%*^jy|7fNGl0x{l`^2tH;2>||BcmLnb8blxW(+to^& z8Hg;k2NScQ=j%yni_$pm5naX}%z40owbg_dN7={ur(+z`Nm0);kwd^-xqexDar037 zI$qN#@E9;fQ|R?8Z%SP8jb|!u7jv(CW)eyCeEteQs(eJQs4`7{zAZ?%(7a9HM%u{! zOH)Iab@pw2KTCvOM19P+q|@bu=v(CX_RN0TPYx5f@gEqz@ohSs`9cy6_Wtmg71h-^ zIs4?q!Aj_pMkRT@(YiQR z^qHA;s_%iw#^6x-y{fb5{nTZ6NggGiP%n8JgKzb-No5iVK$l`Go%DXrTvV0dhNZi9 zcB#qUN|ODrq!Z@tW_qDUG5@7G_0omD>2c~ z>wb0h@)$jLv-Vp)r#hAU$wRqOvA2*HMc)o*6CkUri3L{?9W;kGu!scmZ5t(59-!uH z4`(lG8Rbidai|XT&cg=jW@m>ppy_vo@nuX;m?`@gC%W+1Ed7>k0>_O|>}ULY*Oew_n}wF{GGeQejY zoXY9L+ACa<3$bU{HjXn`ya1p!7%t&;2juA7f^tNnTOi>nIC*wA#++uo1(xwCZ5+A{ z8m3R)3lSb9f|Wk+vjwosx+6;sqN?T$tUrdwG>jMEQ{K}Wdp&$OtNRdztg#z>1-#OY3Kq&ZKdUY zI1B1PG2z~SOJHAXw)tC_WCbZeJW0Da1_{wD0;_*=sB~?vJ@ovfRWufd8ZN49Rw>KP zy^?kfc3fe3hf6zsrj>otpe5lQ;{!LK@SK(NYbS*F>90|`u4UYbd8TVE8R}nsk+~wHs7(-^qs8%P4i`;Z{Pqca8blFseQ;c&? z?%ixtayhnif5VrHS;_BpwJ=6oW=Y!fCibWioWl2_LwL5c^^=Io`C11?mcMEeI0y{B zlYJ@BF2R84B6yFVOoD}hQPYTe_vpBYfjOHZi-GB;A8~pDsRx_os!SIrsH*Oow(ms< ze#3HUV%Kb^29Jw%=Cpvhq9z^36?n$7MeAiE4gsF*<%Rv!85@f(3%Cv*kj=zD)t3L2 zR|R=5;Wq!)HAR*2@3kn|qRg`S-^ktKG2qe4##QH%-oGpIq>_A}G9Ra5=??5*L1{!J(A*`CK4kAJ?AgMO;0I$Pqn z6CvNAHePgS?~HkY7-ZOXZQPsgfM6asDG*!nAI-4;d+BKvu|TsF9mvtBRd*T<{r)(U%BV%Lr z#H7Ju<7hn>?HtcT{mHG%a}M)x5`Q_Rv5K))ZivqkTNS;JhJX1@KF9#gXQP9BOnIwP zWv`$7zD!|$sN*46DQ^unw*>Q8k1`bpsQ>*?DeKoTOl|FQOXV@%cPxP7&X)43q^NES zBEXFXg|mRb&Eo)(vu{Qahx$7aKU>ayI~ooN6O2rGsQ0^sj0V26HgPy+T zi2%oOP3-_K1mZmBZlQK@z|la1IGp!u;d*NzNd^Era`$#dZm*`^9nO~c8MM!N1ql%= zyFucFae;t($gAz4)6Ip$^QD+gnD4sMb_aD}9P8SJXi3Bp1vPpEp$Yt*Zor zE+I`Jo^R? z_??@Z;Lo@`_ARw-AL@hAX6-F%!RnN+u*Ey5v6aiq?}P#$7JYBXY%V^H)0@7v&ULk< z7`nZ6iFY)j7#&2W>OII2VPonTL}tW5%y6{5G-1+W4C#o}-GA;d_;yX@*=jbU4Tl)P zvU?z*&(=^2fttr5e@{Hw>8R>CJ9*GdX&e8;y~E3kXADluM?%h>2g#S4L=x6t{mVP+ z+bBO{I$gz-uU!U}Kt!H;^ck+Rwo|Qc3{a-QpU*D>`xoW@OThV}HV*=N9F`n;4;$>_ z{Y53PFf7)F)!_cs2{|Hbz$aUcypaWW(a8u28eV+N(Ub@-qj+E_IAB|^y+{M=kC72i zk7qW^BRZorqorclFRmnBC<6>bYU%4&yL)&Q2Rj{UTyKmzJvrHI6k9&hxvze^3y{;< zWYLLk#7KUXl?qC}UYh!Zr_D6;Bks3o-07L0&24)3jm^TVX6}bIT?#SNc*km0;Ru4Q zr+|8XY$tp+Xy}@G|K!%_ewgIT(mpURqI6$5s(!zHpJI!>0A^Z9eLFONsE zIy@D~uhd_he1dynqGRv48)HP{wik(4f zNXaSfDbx2MB+7hreIWwDW+QBU-@5A-~1qN#oxXgKsnI(;%4!)q;u<`rA7rVv9kz(Zm zm7~{?xLE@S-0s9c3V+*K3*+w2eM!4xn4fET9f66E{d4kSeqTv6K*iAQr+;SE6i-C2 zS#;0?&Q#0y!GwW0G`#bfEuVRhrNz4kM06cT zA2;M1I!v}?Iv=^`rsBHy3)hYIP9^Ibsjqw*{UC%i;X$OfG;UX?smaKmqekfv*f`Z! zl^Yc3*c=;(`Y}hgBS}gJrhW;*l!V|N|DP&eB_;NwiUr<-uU`Z&J$vabKYwP>o%FdZ zo|!7C-{Vy}Zn|vSr28HxXVK(QA!3yIS&8dO9CeoSn&+qZK96NN*?vK8);d(Qr&Kj{ z-D|(c9QC)$R%&m_4HVT8cej5vzQL3w_ql7^hlY<#;}rvTjmZ2;Vmhu1h}LA+ADgec zbHPo@+zpFUHZK%}#zYo%R`LLlYmZjw@!b99mD_rUdhz1mGNzBOFydl{u^oLXetqpH{@W*8UksU1X~akxojZ;r(I^Q`VZ z5uN8ujvxK|mi_asi$76{($2vrNbSYGb)QxmmRgDGhK z-Yoz6KQ&k1;bE1@a;u1KzSW)81tW~|^Y57UKff%!qXmMlL1f$#-hjulHd9x1iwZI- z45tp6WO8Kv|9|bHYYcL+MmMOO7r?+3tTf0#dt-$NGidz(zCOs)QuqSG* zFm&26u&L3e@CmPP$Ct5~6PYoSflqhtOnRS&7L`=Z>M#Q=w}6o6?fid#Ceh|=XLH?n zE^)t#v|xf@ugMxFQ<$S!l(Y~0i$@gl_@I~aC4X4l$9IvURajNg$5%71RMt-fU9WOr zpR9~`Moh~y`vP-c4@lIjqR@6k{x4IT9`Ra_c3xoHfgaoIRC@;>{Fx-59n#dnb}+?v z69Akpu(keVOEI^AbsShjGJx$coc{S1IZtPqKjsns^Eym1$E^o2Zm>@%6mKRHhZb1j zo-o3p;fcV-siN|uDBPfvSmF5#u)qNyrV99KO8_W-xMlulJqhLuWIJP>RcdWe^FRAL ze5uf;CI6~%gnkCV7np&B;h*L4htp0fz-^6(==gjy{jS@3PL`NYd$}!;?=Z#9YeKY| zj_rTqf+=p-J5yBZ2R=ss=cg7*>YMCS2|$FGp25*Ryc~#c;mF6ohh;fHnMT6~fhN2c zZM+UWNduN-r1uQ)J%PAi)AH%v(Z6osC|a;9LPm7??tdN@wT$meF);^k1a?}B6W>a- z+IOEEs82pD)R)5oRantX0;_gHx$7d(>p^ej9S+8_vKTV7_V)45p#w}lfE^gEOtZ=e z{`+{PM1z&N`AZ^KrZF3@-ie~_tPZuv|JoZ-gu3SoDGHy%`E17JP7b$|FKEjSfjuq? z6mmKsAj<@Pc!4yRz(G&!7GzWWe>dqo3GMIIF{3|MIYk41vs6~fW#UD;^G0a7Em`=m z3P^UcYB%VZuBpfhpZ11pl7$0v3lP({}d;wm88E+;l*w2P=f)nNF!?7~rF- zNd?STXcZY?VFX5ud&LpVN7^Wa9cBghYCdsZ8t8qv{`Xe8a#ix(_q0dN0)H+-!M&St zTGOF)bYy(24+XYX(KqEjmN;fSUg+pp%!n~Ab+IdbbhqkYiz@uiqld$lcI&l>!ivQT zgz+vA)unk4fAJ#3(j|#pt(S=vCLW4hFr{AY*c%{9NJ*zxRBYl}sHC%w-+e-Z{bJ)S-;Y zdiN9SQI(bw4a^$|(n*`5&@+_7og70EXC>7lus)9hdbTAXo8&bcClbPx+TTI>;d^~xE)2q%5rJGklKN}T>K5o=IesYo2!G?jH}s)012N}?%O~kkC;|f;BQkw5sHwX_Y?j1J`d0uc3QHK{7whVLBEZ*ggdbwM3 zuhh!qP0X1ocHa`_&H_7A7;Q} zg@rnRAY(yN@M#ZOEZ&oM5&K(ZtkVJ9mWLpt4yL`M4Yjz6;&hvMeevCh)x4|vZM0kx zW!Z|s=+H+L(!clVQn7UQ9j+Fl8Ct`Eq}L-XOy=+1KTGTIz@Sh64hbUM_qvx|Mjw14 zgbVL0`80SG%y|> zmn%kgJRWagA+Lu3EGV(ZbB~Z6_9ozUby3;_Bo8B&Wp2jS_^O z)7QA}dFk!tqg}Aqfx&}l)^=tGE`8sdn`RK~5=6eL0g(A}ddWz;;iM11LRS*UQpvN# z*&n=%T&0ZJs6)RIL{FHYzU{<~W*lOmdy`jRqq@LO!WlV*g$I9Md9>{Fm+d5Tz5n39 zcy&d&1!35qJ*v_q#Fq-|Qe8@8+5+2p$ryKcI-<$E$)Yw21Ha%L)Qhh;+=@n{#Dn?U zF9$aAwK@4W@>Rf^hFH&|Z)P`W80Cr=x9ZY%S41S`Q%QXq{BFcN{){`0(s!5`Y(UpK zM^Agha&VJuIh#jS08mc_b|JaFlM{`<6uRzVThxd}E+w!WYa(~$JnBe(HSt}JM~l^W z`2Yo2fV%6}^yHR!me6cDA|B^QzreO2Y_(E#4d`G@fGk~E7Qe5*@(Aj2$6CUk;ENY9 zRhn;&RV?obv|ZaLI)EPn`u&8H%n4sSiO>bO?j-)0@|-EK@A4K8 zZS9nO-LZlQK>clgn{E8+OTxGsD@%c`uHohkv;p*>6Fg)@cV8GY#+u7RGkJk=y5^C*QZ#ZTNXD5sk-SrW9$O|WGZP6Brrpb#DP1BqJ}@>?i1=n%H|w@QP?xoYu?C;&D04HuCtR2X zjQj<}xIb{)^_UhKlFVfuroN~K(Wus{wfFrd*+S1iZp-oppK}7zQWVhST@hoEj}d&C z`OkZ(AaZ&Ez!gk&2o80{fKZZ!TbozTMdOTSOf3nU=9K2O-aD0Fg!hzIEV z0PIYEE>(*CV9EqVplNiT7W2rxH zj_f$BglCMiG3MUh8wI1y9aVFcV5ioz2hVMyFSYjI`X>i_ml@l$Fx4AW@cXQ~47*1Q zoDq601lH?Me_x(4M)M8zmYPN5)<=raq&vY)xBcHpxlmP-6urZ_hcUtBlV^7cl}j4s z&P93ig}sqq|8?)YP1R3tHYKf0an9$kZZ6JUdAm3wZnc&{WC$#3gFx%5EZ>LgIy8*c zbyejztR#L<+ZsH+*B}nNz*LE|@@TUS??bZ$*oqK<=79IRz)3N{uzu@dS9$gkuwm$^ z5yMTgn(4n9{{*5xR9i1Z=iFIdWeH*!^}*z4awJe_{}k{uZ_@L`H)tEiU)6!BW-^0| zqTVoRkC;sY)2mO(nT9w#&2qJ=E=bv7-J|n~yk@R{`bW3x`yu6!a5Jz2w=vy&-)%ZK z-KWiY8E;s=`KOqHT=bvuQEn61Qyjh4Y!YYmiDDYx|E1&6&l9`^k(b&Gc{aVbNGdiF zt-tZ&*6E>f#%P~e^$;K zrK<*bYd~jPq2fNr1r{p30+SJblSNJEXx+IrNcr=KR3{~KmEECsxx$Dp&e@L7;x4A6HtlFS ziSy3Zggdh@=4r{v$-%N69)n=1e1(T&HPO@AbfEe9G=L9iI4Eop4dBR8?<}#m<)-3z z6i?Ysz@v3JLVMx&;s(@Z`&Wt8ff)dhgdz5H~w<8H$&1U8agxW~ z%8nP4%&?p=J91cccp!r3&Vx#E{*G)PCvY>a6U3*}m`t(J7e*R(NW2^OLVpT_HB&H_ z$i&m38yVj2Pbb(_SkYY8j5b|WxRI|FI!OG^JMetsE47T+?xe|Z4CCI&4n*Ob?#j2t z0iuMh2Aww2pQ4lAj^dwNpQwkKT&MJ7&+1X~-8yPAywsOk(QPhoSjw7PMmzNpSnD8x=o| zd#>WIm!u9-OK}zgBQ`gn`OUhIHd;-2MWwUs@xH$?Xi3@BYLbj$)Cxci%=Z=e7UblA zd<@z;eC%Y~mo$5N@$4q)mx`h`dmENOs1e6#MMt#z4;5>5VN^nT zLm4U9tzZ13;&rBR4(e4AeJ;yGaQr1^^%LfHDWw&57I1%2b%O(!?QPvKYTOth?CRt5#bgkJ-Zlv#B6eOA-G3I<|-O)GPQ>Y!uX8G1W(_b2F|RXo%}&8wG)< z0seww5@@Z>3x|ps2DE-af@SLvbwj*b`$b$u_#QW_)1F)+oLGh6`ZVF&_i z=UPRqW6-VE=YSsCv9mVZ~k4*MxHx673A8#|Yx?VNDvM+r0iE8IZmF*L3PL92V zvM2_Ojd=DEg5GDZU+&fDj11gKD$i9~82;v1`qK+(y9(cKvq;OSTX=`HE#m05DA?Z! z0$)6+`{ibmgAL2Zm2fWr9}qarpx^Apz%}~+K1wFU48nap%L26 zjK;Q}4{CDVs1fj}9TVC2`WOjU9&hEbIGJ$yc@(mT|j0_pa(I>;WcMpIy0uvV0df9+d<>uJ8 z+89|{cDIK2sKQ68u~#*J@eFgnzpryllk<8)GUqnEX%y6uD#C`A!ex+A&SI(Kt7@m# z{GdtFzrhoZ~`d~BRRkA^C7bm}T- zA3r%_JHl`J?dm;F06-7_ov2=7=!TWQZ-BdSeUXwLDbajrxsPyC!txH_Y7ah+0yIsB zI$OA646`nF2Gd;|AJl8B$L|mH#DLa{(FYRW)C5-?21sFJoiUz+4*$Ieh%xH^^z2%n zf8bdk8e~Wktxd4#EC+~x77ZZSL3_AfVpmWHKA$nkos3#pw_OEhl3dU6snT(;dEAMN zk0Ba1x}?DcD1Ls%+bCe!L*4(DCXIS#h*v7--2nLW4L@v0%B{YUh-M51#F5l%y~=o$ zd3=#fnX7P=Hr?DAk(x2grkm{f90PMi^15c4RnRHj=vbNjqEyeO4s;`LrLv!Yj*OyyJFYTF!A72XzV?32 z?>PD>0;+~^nAVatQk`%c@PI7nBTSzLA|Kp$2%9y0rk*s_ ztI7VGsjtSJ`eHr{2CCFKJM3CqSQS7Bm@M8ZErE1BlbhVCAws+BkIu#QO;6k;r2Sp=U%0yt_^PJxV4`rFvJFow+?-Afp(lglAR{ zBsETLQHG7o<<0x%#z8^-Q|8%XTWD=HdV~)uo)Lm8lZD9djMh9>@627mXlUv*4j5C< z$DZq!3|*V^x403MJcK6k6TOi?6PUL-tO!UHfABjw9ng98Trdo{bLj3E zIu^>cu1d{{Q_s+`f%_o#yWEqgT!Y?CaICN(B`lM7My}%S)CzJ=tPUmwp12&336&_U z00~0EscJhZw!n0~e9l?-yZi|Upsn@mtJT#KA*WA9anq~}aW3ciKceX`!T$?C<=tUA zh)=0CYz-tZPfvcWUUHJlqVGNmD8Byp~Mo3j@x>*C+&P zJ#=mzTZyjM5P$^oMjhg3*6L%$mVJWqKr+@Ks(!JhvvBS3I}hG;9$@}y;@TCqK)5WK|8Dwj$VE2{{Dg8r6dG+r!+(IVA~ z!>Esh=v*v|j2Wu!yM|W-I(6uz71Yrxb+!(U8^p?HswGyk0dBdJTCGYBTG%=RjYz55 ztpTx!!5;!ThbuIUCO_%G{X&5{5C3XrJoNoV(h){UY0RA~~}^NUbf z>j0Ch?Ho5@@tcWIt9v`QZ?YmAB*WsVr_*)4%;rO5QsN_ncw5%lGv#Uic+kd#c?$)orYP|);n)r<>j}>+ieQLLwI!Rxd&oDI=}fwowtw_BaOA0Sepr= zFh}q7EvL1aH+LRIydAQ2-|rVoAmwRu8%e9%mtnMLHRw%rmJ|3b z$tnE>?t|N?EvWm-r}zj%UGrtcRq0y5DEcElSHp+ai0)@f09*FtoC%WfW6 zZ!)?&N9#kN#R5x&^0%Gv0~P7X?DS9rV|h+IpZqide@vB=U2iaLaslq$PCukK+l!Vd z!OwBiBd$M<0?(aLv0Ww{V_`rMLBsx!qj=F`oL3;C@ z1NxubJkXybRPnGVBe&pyJ_GI{#MgX9CllseV<5y`gjR1_qP@TVjxheZwmbKu`@IWA zhy?c~DAhec$>t647eePv32CT|JOG+*DbM9WOZPLwh2(iEqF&lBZ-kY z5lYlU-URLqlt(DqC3NyutLGLIz+H-^nQ2q%<~7Mp1fO5Ii~~e|L!o6dYhfyQ4^=qp zfL0(%x$;J!v2xBr5tVI~(8>M?NQsdiZH!30_C^6)nhYpB@j*Mnb09)MSO`jUn{#~f z9p%@$gf7lOXK+L_-C$e!up$~r3)QC%d(maHzO*okhoh}pO|F5*hh`ryR`$bWC4)f? zXff-foF{h|romul@FY-rVY(ozWC!yNt++$~_z8p3;v>j|Xz1*wV)P~rLY{vsFH5t@ypRps#|exj~L!7qB1i`B|$Wd$hjx z1%$oNbk7ghpb%Cl-XtunVPQ@SpgQjpHb}3-CcYv4*A?8k)9wS5qoO(>O;aj2i`xW& zc7OI;s*7{};WAEdMQSq8tm6fxCqIq=bmi)REJ{5K&DS4v2y8vld||WYFg!`|uPaIq zz(e(Tq0POGrs(#QqQyo-+4j9MEC5tN2jdUs(4CtW7U~OvfVO&AKW%%2jsyiqhwQ9_ zj(B6lADlpK#k#~XEc&+UHV{f&OaR9UTCK)B08NguhT(a;8h^|U*c;IxA2E5}ASx#2 z5=e{l<$PEPYGN#(RIH`PSmq^geDd{(T6~N6xuT)4l z)i-1{11+7?H(q5ptPg%g;@IDjIdYCJ`DX)y3r?D|DE?*pG+`vH<%1Jbm~&D|NT#aR z#1_A569Z~X`m>XI?fs=lrVOE3<_VG>IEC3(-anM@pm)v#SBAPwDLf_ji=PSLRn8BQ zIv^+fi(VL~8M&H2<$gmue$DeD6i

`})bP1+w#SIC%HU&g@-*z!u(Eri^gelzgge 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 j6~jZCOrkEfVPS({5%EAf{gH%ddl-7&W11k%9k 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�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

@aNoW@T&Jdq>cpzE8fDN=8DId@hYOc)g`@ zk;{xlj|6-1ZI)q#%V|0?Xu}_`q#Vu_a=DQLhHWw#E>Mc;A6;JgyL+pOPKT)P=}`^g z6Qx_`b|&Y-%3ROwwe{MMZg}9E`B?*pX06wK@mYAYI!!ki2ZSLVEaFdS#l5|oLt$bJ zt0(X_Ustted^v}8yq|>&ua9O0goX27OH~GZH(TGWl*~2G5Mm-PImYw!S)eB0Zzz?W zzxqt`j=S?C=`qj~NO?UsoGku0*WUiomtAwLe_qN9nify5qQfD0t+S`I@lV|R@3*fY zMshtAvPgZnp-8+>XBn@&Ss;=TWRWmC4m=m3S&I%%-BM>?+$-!Z6Z&|taU1=dTD2U6 zdC5S`^NoS-cd#1AP7F=j`CX(LV=6t(CI~w^;f0{OCUZhAUf7<>T0%CP0P}rkk}zP| zH8-7vv0FUiH|uk~ENK63u;uyHIA(;sR?H6!dHi2CF1PBN;2^dK{upQKtgY&9!G>zo z-nY>?2~sgC_xG(4JtonLRD-7G88)XV)2SJ{9P5@|OEULhiLbYDo1Tsi&8aPwmbbrF-H%0*!uVsP5}|bUtxv1c(d>LD9Nb{g zNx-S?MJJOP)?{mbzJ@Q8f^YS7s?j*6zK*2mWv7djoF*)B1O?a>dxW3M2x*$!2i=?j z%tf=dXzko8`MWi3$LP-JUfjth$!J9I^yAcK36cH_jHkWU%jsk#)6Fb?cP}63&RRYD zBlX(NNRsG|XT965Q0dz92e6@)%9?dUu_9-twP^fw)8tPreBW>1YRC<#vZp|9j^)8Z zKmOEwx|SF{KH}%a?3fu5Wq<#yLDO@yYrA1|J*x z455E$t*=MNMN=&Q=wPK~_~CLE>S9l|^Jzac)r_7unxe%>+Njkt4ojSbYd-~ii>GHk z-f}*LUsya?YBdFqzXK^;a#HSd z6`{}JmppS{`HOgauLEqERIv!~piAlz&B&&advdq<)=I!=^&}jQtsxz4pXWA&+nHPz zSn_tHYC!gPY;*9sm32GmsSj7Je)zSJ;Tlszd;2oSy>eLPJH>+#vVbQ~rBF~%@bpY& z&7o#gffIR>#8c|!ibB~lMpttUCIQatdioJDWVmy2Sz0<;eWO?My67C>vJ3mnpOwM3 zC(C_(LEAgTYVT9{QZ#vXKFLR+^=)E|5-q>kML|V9+c3cViI;8W;PAVq_S`CNODbT= z^c;QG?h{BxYpbxVQL04!yI=Nrx<(qlq$$L9{stzk977&ZoKcfC`x8sgWO}H{aZi2-akZUz9X3uB*c91K2JZf8G(m~fh=!z| zFHs+8*@%cVd%FS$^8a^Ed_eXwu5W1YkfI!@9T<+ex$J-mH&8`TlWU5u`No1^H&^^; zbQ5XGs^w}2ZoaQ8Wkt7Nwf2{o9<#JZP+@y4GUrmyjKFcXUCdH-Bl(+82u%R}?V&A^ zM^6%mr;iqeqQcUHcd;_`-Y4@z#mfedTq*Mh_4D>7MfE9Y=B1^~QyZ0q+o@z!#g%YiU)xS4lbaWray|sywI2Dx48{BT`i*m~iQK0W~9AC8w|i z`=+)D@$mexb5ozDnznz-S;}lnT?&mn(be>Nd@;(^*_WC~kPvuQ`w298NkIRin zTDxtV+D+Dvc7q#1E;dsXrN?oLN2NKJrt6CWk$peKIZX-+gM0QlKczY8;!lv~d+sLg zTiKq=N!aW;^lFW`n3KZhv0mfPL=6}Ie8zyC+jNd!F!E(;_Q4GpN~+GhFx zkep$&q3q(VCAPlb-5>-Orx_lL?pK%s^BS*v}Y{pM1 zk-KaPqkX?{%HYvMEpM@A`qO?^t&yQ`dLiwH8yV9y^~%Mj>{RCY`p(?*z zac{o4KJHUK{5kl-kCv7NVKfNPv`k32nm|p?cgw9|U%g#3Z-b zYbq7F-d7Cne4TB%H8d1SE9YPw(Ju4&rVhW)RpX!@{Gs9^j868fq@;w_kYShiw;dd5 z_(1}M2Gx-L+37GX+I7qu4$sED$2zAvH|Bmsq}hkZ401w69vZAHEn^H@b&5Zpo*Ee_ zk;}rIw}!RHG15EJs&J$dKjRbL#dCbcGD0cw?J_UkL}_h56yf@C!|98}k=CZ<;?j%d z_v#gKacSaVJs8{Md|Bv{7L0vz2bQk84MP<%j^1k)IVm(19 zvY6TBRsgw<$R98hJ+*1SuyHdA3_80fvvsa^(>s4<3#3kNft){!igZ#v_8I~g5zhh~ zf?@(Zy6jQY6gnwa;{CoEsH%QKuQal5(tS5Q4ivN&|B6u(PUxv;UG>o8i8b`%KsWO3 z^qjAvZs(@k%;zssMtr0ZGYRH^pCk9q`J!6!ZHUiyHdc`&S$-AYKnHhI!X}h$D zJ?W8iEg4%bzBR{Uw5EHq|HYm$l4un(fA;se0GVw!kUrofjV~A@`PTEjNbf-4Kr))! zhGVWiPR9G`Z{H-d>ztsWunT;<^3t;$fwHSl#}NU&bIBt3+&vG%=H{1q|0P9$L))K5 zyaO95=fa_<{_i84P2&0(>Sx<_l2D#3++*Vd?2cjCW{QAi|iV;*!c!&fMI^>2?K`6ScvawkmR|=FhhPXESjv^eDcawvOknn z_|fOqGa4{KJ{1)vARw5lyYXCexI$+Ra4U$j&kG8`g$=w(BNCB~oc&x9{raGB;*iJi zYC#hYY!E51Ah*$QrbpM^4NSPc>~=2X@j(G`zI;nP@o@LD_xFd??yNft#1*}tu$$Du zd;?|2)gHpj(ccL!zMyBXKqw6s@ zW^=0LMV^vev2QzvAqM?!Zy8TWMI5H?`X4VA@t1E6jS^+$C!aU^k@i1?Q``EH)#jqC5+SAe&fq;;4D<&@#-PHk=X4C(g9sua{M2Him=WU9lflj zMlGiag25DU^Eh_u8GdNi`Xwf@F^c6Ctg|v*!K2>5^yFw?Z z1CCsR?yy>cfno8Pj>#Nk6&?{mcKn9)cj5x=mzU@Pz1XOo{z`u4cMhgr4sUL0!H}Tt zPq)}D`Y%v`#H1G!4f!DA^Bo$Bg}keC>k80N1>8XnHaemjAZG$?O4Nu%fX7F`ar`(8 z1OVu^HEpkV*_MxB+1HxerT-yc|Mlela%9zT}a>v}^MCWv!fQXv-5i_ zbk63jU<21y*z-~R?u^>DmI>?mqZ=4$*ntHa*M+vCSy)swK>n043kW|Q+0sYk%k|V* ze}6SPnY_HbI)@Nvwl}wV91sl+jTz|YyCYR}L~TWdgVi0dMg!UNILxosQRCn9d_@l7 zGN~mI3FzkeAL^^&GV*WwNZJ-l+uUeCL)_Ws?%Zm09L2N z7eISjAF4Fe@A7iy?+z?_6+3>$la}NnQ zbZX}JZ&M&!fxEZg>MOj1TvTUq$wZTC^LtUrFE==Lzk2lwNE;!u(#a1UsKQ2>z8AB3 zf(KFm4paYOU@A_rEU#})5d!T;tVtLphfxY&_h%398mY;X-aFd=YuSW`J$VNM8khit zMCN?FCZ!-KE-g)`5xud!z0LlQjyHo!rXW$uuU7Z}dp-VLZ*G)G_I?ivjL}8w%_7{b z_IfTo>n}_f2r>NMBD0aDCnr}#ryMg@et;FJ{%VF|qXFBc`)dseg(%DOz$f_?z~L~( zM9|J@`}gHKs#biCQhZ<`ds`mIMX)$%Vr=ZwU#~G(7bY;~M90H3t)ZzoKLDKGNhf+u zF8v5T_k;A-uPPb*_{%7zsyZ82PXRPy@T`RSL9#vDzWLZBLUhT*z1O;o)u567^VHrp z`D8;@@D~6)l#xhAPySsu2mc%jW3&Y~daO4dao5fpSE~rG&dfsi(0T71zX`W>No_Ya zls(qbkRO=}tD~G~fZS(1m&y^#@vYo_B03Ha?hu#uP*a+mLqP;uVa%tWGqTYhuP|(S zF+-o>v|*@6@n&Zk87$7uTKz>>{VmH^QOj(=5Wa#KYhR$JtGoN9S|-%*ZvC(LpMscd zfW+13{z!_*$(2{^sn%M{LU9|AEmrf+=7xruwSCzoqhTTwu65M%$O#}61%mUM8Vwv~ zq!WQq8f%Gs3ncjgzj&(7G_rQ3$Q7#EfxXa^{#|M0ye1Qxa#nkK{05f@z%)jDNP0fN zZyxalTHVdB1-M1P_^(p+UKh?}X;;K}d3*n5_Gl?ch=~;q3^IYOTNOk_gLZv$d#kx2 z_F8Vk1g%4oZn_*duny|{?qa`(60cpyr(|7~swn-TO}J5_fjY--IFeZyFHB}O)=Uy- ztZ-b$0}B@Ta?U_aEslex9O_!MG9+YTZ9VXA-BT9W^rjShG8b8iK&)UDZUpD z1YC-B%aB_;Kw4%b1(3--EpERl=EjT{qkGHZwLQE`auBLU=mPWRC$5dm=;}xzs1S+mIWVcQr(UjTl4{e<%t$A*1DTh1`(Q`o9;{ zK9%IR8f93UxVk0EH0O<9sp_cNZk=RZ4_PR+PCbqGs7Y$L-NMqMK-%73$_4RXwi3Vu zKY&!;z3Ll-CBDn*oN7+7>;lo^XQePT;`t$W5JYZIW2|4Tlju|N7O3U;UFBcB{o+Hx zijR*!)st!h!u*WwlkmPoFihC|hC}OiT_$IDnfd&B9hLX?Qi>-U+4-U~Rk-y-*B7UT zkAQ6e9Iy=dAedvCoQ9F|oSAz)rQ&tJ(U8JKe$|$RU=sOp33X`IxYm$4;>~QmB{sQo z)HS(tZVi*fJfVkHE;GJb>Rftk8KjjmM?$MWTn7sHq0FMz070WSD)xKGmDKg4B%dW)){s!G-&$U{EY-q1alU#U}GP^txi}8Q*o~$Hyl&dDm9YBh{Cc zZ@%T+2Ud1pV1L^Cl<{KP_{9aLtC0ZWI7ZeagiIo?O}*HkVOHc#v8&%I=!uCzcqGNF zR4pAd_4K!o`(wn5B#(9DQl!TX_-6}k3?UsqE=BCf`Od$2-k)G5%^B#uHy1u1Th_iI z-Hp=i=@qAaSZ;i7d&jO{Dmh)CDM9zJTtGbav-mw2hwW?KdSFBdQtULnO0ud1jt9y_ zgqG(TbYqTIJRpyF%7#Mq1`moD2 z4AF8W%eVTJoR~s?pxm?mDx%~Hm^2{MZD~`8FQOJ|?t4d0*!9EO=_H=aYDe8lXDC0f zzr@!~-bOnX+Mns61u~vHq&S^0VVDrSD+=Rje)kIc4a`G>0R_q)ebr4N80aG)+8_iudMNG^7Dcx1Y+#H{%{~Y`$ z6lU6P({S+%|0zL!)?-FH$KzR-Vd|h#d0J7G7c&xMLL+G!R!gp#{0}ma{eVo#prfl> zD!v2wc>sFjC!rtgaI|_=Hmq!Hz|&>=;0@2SF&WK`U-PsoKE(eC89XIP^v7e3b+2o`5c7f|bKpPhftJYj6{tCHaJ0ndM-4lnXr;1_E0^}rvDw82hY}W zY>NJK%Vv9^01+| z=P$<*_(;kik6#nr@yzXw6c}7LF4%aA$~dU2+WF3Kh!N}e%*;=sSU*@*z$cXAY;Yb><7Xuk>Hr5eE%5I9x4BPVR&!T8pQf^wQ7rBMi>%T@)~PUIJ%_gQ ze8SSv6h^HXcIf#$v?_%VHV_Y_1fp#I5j~Zi8g^on*XYo5$YGbt+7)7$nv!rh3D39M zpI?H^bMo+{gea4<$zUGv(Ed7R&zQ4Ki?b667!ZBs?Dy^V(bQ%s+6wdP#KA_alPU73 z7hsu+0{L3ctjPKM1}0J&fi$l(Ma{Rw^RO55JsQhwwnpUS9O+c&>X03lO;~UvXM6^` zO;scFX8_yun0(n9#BT*-8GVXk1rsdxE0gAOtSL%^FpijE##2BVl%Yg-5BY6u4Sdu= z3k=C7r}<8DC5z8Uax6b z=`fdoED=hndP2Og7h>6a305%7_3L}ZX|1&`6O^!8ay_OYt#S6ns7e2)a6S8vm@Ei{ zxuP_A@-AqMz&;WHbbBt10q!_Rdba<6uxUI?6^z4#vW87n38Xo~Prjrdh0&g1xqKCj z@s`}Xn2dpB?hCG$8PcQpQfz5#&xeW8X6rcoDYJ0^hn;py2WDm6VamjJJ zb8R2UhL3CWoK^6`+G6stX_Ny)smXC2mh|xdTa%S_LuM;%a9sa-J|8+F?H6%2FPphL zT|O`P`t|F-_A|eyr*(0tXQ3mtBcO_TEYWR`+Y7si#YMBKTmu$HX0E)GLoGEmN-A-` z#PeCZpAGB(s%B7*q2+QOzsbzxnE+>&V-@!Cd`q@He!@ph4gcIYi*pw-nUS7aU;eFr zD&FTp1^3y|#JXZaY|6IMiicmh>E=vP#Kp)!D|(j2mLRvMo3fKff>O5Fz;K^z(y6^k zRn<6`)!9HkoJ5Wkl~fqBITs(jukDL_J zK(=Y5nRPN|8_@;ACVC|EVyRFVNQ;jdCKGU?p7?f96x`qDkjUhyhL2cyQ~Yij zEqWbvD~(H6+Q3RQk(iJGsz+~hDg`BBZV&(AAXZp0Q&x=Q{msxr@H7Wgx&QDjqG@$o z`??d4*M=q{`+=R#w6D=9l?^^TT;(6hkykf4wEWP^*cs)9H1)l(;#a82@HkSmBYTL6 z`S-@C{=2t;oP)Xvs(=fl2<(xAI|mhuI-W2RGUy#nJ%(P~JxTJU$yB(6!Qd&GiE z9)ptLl5GZ?E$(-1Fu$-3ddoRg=SEJI#uz`NlcJSlBA;tXAC9w#SFPbDJY{u^2n=q% zfhVNByxj_|C@Jsfs{PPNXDDf4C6`D`rD+38N0XKn-SN21_%y-8Yl0$^uk^T5v!l!Q z!-RK71?)Q6*rZyJ_H~C8JBY~K-Z#^#WRRzkYWL){h2+NCRnkwTk$FEJVSU=LlgV>0 z@u`-pyXCM_UW#jolQuY|2x!Y;Xc`Y4dDZ(VHVR~?`TOgs=2xXg2d^ual>WhfEVtPv zRr^CYUrr=CFi?p?yUH8dNWV9w~3sO2bjU^d}d`lwP~^JtXgx{_hJ(~X--vOB`fXNe*7`t zwNdg?Gbcq8-voqbBVEQXTl2(kggVVi1;V3*yaNy?N_bO^AwR6=oA4+ZEKQcN9hG-M3f;dP(}pfe=c$Oe=s+ zuu(~0wWmQW@?PeSh)zaYdM_|QmI4~q!}U?W?FH+U{Xz2; z)k-f=K5VqMN~OvRA^f4ewN;jCS4+`gaC_qg?;HI>&TEk-h$Lp0lRi1HEVm4vs3#^C z*rfkh)ZyO$j`S9V69J7*vw_#wniExCB2R%R2{IbCj_s6{6ARxmPR-H6@CXrBrLh(R zfZ%aHL6vs+Qal6K22!{zfd&(v8t*xJJP9+|MKZW1w0JaNYejLtjsn|)>UAXHqZ-NP zd1pUh9P)THRH9FBvE%<5mX)zyXm_t>Zsx@MBkB%$ki!M5{O^j>YVH6MJ+N-kE9nSmgWW-`L&I-Q`;N5ik%$Fy0#0gZWOqD?gjSpG)pD4 zFSYUT# zfJ}`w%khFVrCkFz3l01~yeAiWZz*3>p7mZuS#daR$-lyL|1O5;O(y%az0#ll)kv-% zEQvcfI5pz$=Tr(o3|9@HS!9}8gu2;HwoOv22sR# zai@2asy5?7?CcikL*|8)FnVWO0S3mOri8^^VQC#P(e>5zCDG|DYwjQ8F|lhoHLjZf zmo5*JdD4Y#hNoI&VQy~AX`_*vtcz>$7Et`k-T5eZT8n7&S*>$PbPL^D;-O9rQxL)$`gxV%Xhh{%*+gR z&etwTm`w21TF9784{7}OitU5_=>V?o8rOx&r%}QjTy_`SQ^^B6#OmtR&Nr(w9bmnz z`(c_tqHD}52*<@7xdfHR7`sc-T!i@q)y%6W(f?XqJPCcl%Y!M$S59Kpm#P>diB&bJ zv6)Oy!BD+nq?9M~=Nip2%3Q7&QHOqdez;VLy!B@$ot6djkd+OFL7+9UbFyZufMJj% zck=B{X-NYT+KohpJKs+ojPPHV^72Z~3(c`f+ZPKTFFOt+a^AfN^1Sb=SSGbG_Pw7< z4wVr~m@h7f;qb-a5SvmC*&2!&o@6f60B@8#`H1)YxD(J>V(%N!pZy)7espdy`lKsNL3r&ph9(GiaIs(uS?2KJ!>gCa%}cD zDK40GJAE95c=Vga*uPBbza_n8R+TrmfNRB@3(zNm)TAXX9gOf45V|SMptMXH6 zv%6gSDp)J9e8b0t{XLYA8~qpc^T_Ct882~;X6e!yYUfRcLN3rt@YE4Jln7ij3StmP zPnGE6L`tW;W22}4i2J9+cwz}Y%*2J z4R3f&u$9@!P&tS@j9R2KEH_ckyU+oJcajOW+%td$76tg%TZ&it`S7F{eE!>KKxw-5 z;HZ{(k-mZ3F6PB%KhUM<3*+fr@_`>O##aWqH62s8HT1rNQ;7Vb9~P2k3R*kMK*XGK zDCMbuDfH}(7gn1Ppw1G5Em!@GekB$E--5GL5qdgdPnv`jFFJ-(4oZ9IPtxQW$f2aR zHImU>zap+;9p5h6|`VJ9!PKFe?WZt#BqC_&f0%1Es}w1M~f zdv-)cJK!zHPO`_pf$Mv{hi?0^jlLnXcKz*^1g!Qt);idBGwIRH|@2Bs7<=ja&bW-+8Ieyr?=l?o62%Ump}{nxlX- zUI3b9jf?m&qaZfdWX|0t!n0fCC@Du+)hL(?*Xi3=#-;F_Hc!8+O3F(Qhpl#~i0YT# zLUtAvKr&{TpZj2r`N(^#JpxqZE@?fHz?TZ!hBqv*`ui~#Nw=nl(F^izXwr_XlIv=6 zQa)SdUk-wopcZzqwIh#qdk=~m2}Bcpn;;Rz#ZCbe)ENQe!NEaWe0h0!Qa-%kx+4Gu z{vBx}X4TOTStceX%(ZLROmAHRA`Q7Gnovh#RW| z!dk@cd{wC?hl&t9rhq5wOpuO@J8VP4gC>1p+EiDTn*Dog-MLx?L&mh(X>YD97lgZ( z3|j@BWnZ5=d))lyuRJ5O{X#vgS|rAoiB|X8sjNzKh~u2PQW*(hYs@2EYe`kY{w&Jj*qn2 zbIAT|8`+=y^Kzf&ZL%)ZoY!l`U4&V`<6;eqJfAGz3W>$|F;7q#rF6Xy&Vkw8W7zyV zVT0yKOcIoIswK|X?0i@whuW{^$N$PnHADhxudb1>)-ZDtyX9pm__02373>{BJTg|N zizLK+7o{Q*o41l8%Ol$JYW@$oXc^q{rR2+#Id+y5kEj(<5b_&06pia_vX*l04Pnp)_x};dANXJLMB5gT3zG;;)J)=SN9%BWH$B9X)RAiDq zD>HJ`jd==KQ>40S-$ckWCnw4_8$oR#NrOn<%~cZ-`P2jhd~9ZBawAb~I(Hn)n3SEf zx(RRthK%I!P?xfASoqogzSukzo7q`XS|}eucs#;3h?aY0`ZvDdYH%fkfR8h;E(ME# zk9DxMxY9u&+50n-xKJo$i6qpHq-fHPJiaM5gd>Z9WK_Djer-=*;QxG_lf7>T4n!g< z(40te;D^HG25Vdti98nWscC3-V~I54*+ z>S-)eXfAtBq(-{dAz_h|1P+wnLz%%&$63*Qku1;U860-_DbPE5VC6-bEyHJ)GwmCml3!!>hnciVyT4J?b4f((JrFFyl+VG$>@yyn zHLH8*#5l15XiwPs!L-3mv=7&4mR-|m4XfZ!UVE0~Iwb-Cj8Ny{cayf_Ka)TkGg@p; z>tTbRz$n)SN)fHAwbnwK){ax-W;X1#pL#iGkjB(iT!_`3%CdMyqTrXf@|8A(u}%uIU5dO@wpWP2G`+c?LL!r*#hXuw-T?Y{C=6_S~sy zcAqSrSJr%-U)0-_ktyu(D>@?c{voMq$HwUcU@|SYULmW@9h8q!u){R~$4Q<^sdA@6 zQ>t&)o|C@5Vf~&a|J5SYRlY?+pXpa2`hZ?J*Bl=k$4+0eeNizBa`Q`UdvY>FJVqQE z=ZCfd1ZMb@%f56O&KrIvv52XZxi?=9k51UO(gylCdFMFqs?)npw0>6k90%pu>r3sR z?|`e9bWNyy{a5*lTfsR}IS@&DvG`Dbe$kALFrTY_l9eHH8a#Ec*fPVk*ovTDXgf&| z*#2cdxPS3QK-h9!Eg*FSZ@+78p_Uy%JZ|Cmx3sG_sHB<7(j0T3LFU*B4s%lqLvDVP zGLt573})55zkX}dT)IAH2v+m7RFw7AIp)5jh1MS=k+WkZNVOyT^KE(fqAZnZH3X&| zsbcLA^&NG;{mzJa=jNDIIzDu|)LZ=+g&=t%`GP`yX?6=*PDFn{~4JEpaB(o|RE*xxZV@0DqK zh~u~-b%n@L6r>Eo#|{*jgZuK$p4wdV?uW{3P@#CY+m+`Ka0oaAb^`(^9&g>cWfic; zj~}1|fI}d71W=^D`s%AvrVg2-2j!1X z53P%emb(oKz7?*9-HZT4cR^9EDW1xg+O|S#8C*wA%8F~ul01>vK)hVI(khZ@(){H0 zOPc!+o0is2>rXOMUpihLV7qbW!qj=StfskrDk7awfX1=AJ+Pcj3rrS$ZS4rKBDwT4oYHLJNWtg`wUNx`1e$m$3 zAwQiER%cEg(z>w7{L05aXbwmXO$72hk+Be3_e#Sf4vn9*O!voR7`x<36m~T$scfcGwyhrZUiWIP@+7gNX>HqtVECp|w>&@+| zw_9r4ESE9w_lY=5Bbw>z`V|M>YolNDl#`JK=FqB(J7 zuO&($OZx^ip1vWA5B0Ct&tFq4h#>{F9X0&}L#n&hG}Km^y?g4+d!BgM?tiGUTq2*l z>*+T2$3Ok6Z`*!wXn&pUXM?&9==Yb@cdp%R)A1ZKfB5_VwGB%2#jkurqM=E1SbeLw zDBqH)kdXs}!{+k!TNWb-T*z|roH(*iZKyQQeBhjY5CB&6-O%K;`dC=|w3@dr-?Zgi zxY8mLRq-r(`fQ#P#}3PKp~$@F+)49@0`QcIbgfpuf>3qIArNl_R*sPIt|1}i@if4D z+NFm$x@Z?^@O#t^;TQQt;vU&o{0yN+LZwGw8rnda5Qb^i5Z?Q3LVh486~P&$U$Mq= zd`c1lJ6|fvdqv>JA0vr<>O@vT#)VW~k)n4KOea?2DFDhsl#yd17)KSvr6w;^gL9T{ zuGywak+X9ondQc*W?QA<@TkncRb~*0!B5bb8QpjxV>^4MY}*NZ1Chwhh7F&SJ$*b$ z^0-ynKPS9Qlo&&Pn|#HENDjrVx|a*`A7W9rwyj9U{seo~m&yE(L=C z*n%+=3pPHlXYvzFYj$?2U<=0dYlm_0=Qt-k5nJ%iNCl^kv%Zk00C7hTTx7KYoC-e_wRtNHAyK-Ul^zvTB13%s()-9vT{y z!fMn8ODM{h+Q_O{f@$YYC>3~p>lyJR@ep_H1Xwn44Bk8$b=j<}vrsO23bBYe-l9^E zIXih!V|9rL85TLzt?1ALA`5vxJ}Jen)+-YtBr%um>gm^dYRdHW56Oy)dATvU3h08S zkUCJ{^@yx$@4BOPf=DI>QW_FLHYkz^q7UK|)ni)!pvuisfYJ)Bt;!eM=&8LJ%UF|) zj!#%(=#JXc-qj=WX-Fj2kX0Avh%`f?)|)#dQa@X36{!jBaeCHSK4_E!$wSoZK9NRk zUA;E%sP3a7DL+wv61)dB+`PmqkV&^y7ewgM0}Xb520=%gC}&8dB}8B6oqjtca9>9C z2VS%nMH`AZzHe7u#fo4bl4v7cV|9;A-q}ASOh=TL@w-!G=(sR}uqE0(IvCopp7ESI z#)avyBA$2aywEO8cd+J3oQ8p?9Zo*=Y@-p(J;0HpYZWO6tOq)?QGU%di422dnmX69rK(C0*4i_ZVB{?QXmVML*0UuU-deo1m)ei7MAvvsbK|6cYmm#B3VA=q-bF=Eh`cB85 ztG-pJe#~#<>O=J9F}ajMVLCQ0<*v?sp2%VdcsPM6)oqo*ssm199QReiuWw*beWuTr zGokZO8^)$tj*GMqhfM_xibXTW)hRZkW_q-j<-4{ z%$t{oH0aNnlHv@j*sBo1N1&Kt1$OC?Y7f7T+Qk&)X6k88fmJ&4e!c0S0@0uZn%;k_ApdRDA9Wt!uMigkks>!zD#gVr>+g>>QS z>7542{R(swM4Dk@F{MB^iavh3TTcaLE-?{8TJDjI920Ho=$^1ac)*I|tCg?KY>}@Y zkk3qR6c?_I3Cn4bmy^1IPna$R+BvuPQ&*!Wp9(S*@5IfdtgOry8@(8hcU`-= zJQlE+d4e~S9zMGi3aO8SCdU zmXF7#rY38;`QU>Onu>~wr1SBZpP#=pez<-eTu)XVPb)wa7!##h*U|A==_ z)FO7hX<}mBTz%(~g35%=i33&gJ?<^i*Sr62%tyaY*BH%xaY3fEc9FFkf!N|PLj-^! zCf4npy_&BNn43*)mY6zu;-IOQIt+iKSt4s@v|hn97P9dF`Ky1li?vgyZfT(Tq(;*Q$t3iIB_PMb#`JYm-dvm%QyN4_HhrR7$K=~caNoWH7d zUV%A!c&{ZPk4YT{!Su$Z>$W|wym8s)IeY(6bMB$z5@0C!rq(BrQqRBeh9&RbQiNnw zbXl4=p=!fSxI)ArO1LhOInTfNy4o~miBgC=2vR>mx?a56Vt(?*J0eX7%y)nEx*ap$ z_xKsBzAIQXafT%9x-(!^gMaep-?WkEE2V&}sVXy#^_AA79a3#XBwv?~@2!j1Es0fM zS7p_IL~VZZ-2Ikhx~9nE5Q5+O{wvl@5-h>GN=m*X`yn&a&BIb1qPBeT)r)5C_PqK2 zkKZ&mT5g-igyq@$kBCUS_xu||Z$y4)QD0tbzOD6JpVnnP=2}aeNX#O0?!jYr9zQ;Q z%#wX?UcPQF-)J^NddPWAio_#27oYvqGZs&#`eme z^FY`^ioJ2E+1wWH;PCyQyk*WvDQMN2BHvD*I3Qdx<3?fHW0j8k8|t(+FEEduJ!-Kk zEXcR#Zg6N^WZ;lh5BA9yZlUUWpZXK#&Q;~b_B`Ee=`=*YZffl?-+cZROG-A@qw1_P zWg1h-2N~V3F}kz+j``F7^!HXV_?ch%h&g$5zw#7Wg)aT+jtD+Tz)RPfEXnGd`&U(z znRh>W+UC!de|tnWC@Z_wUz%DwEjfsSwW72{_uYK+k*6NFefZMVW{W*)%Im_6`p%v_ zqHC+n>}{yDnE&+rb;Ivhn_8tPZnkZC|C0}hh)y@-qm#-rZLYR-TeA0+H?Ns1H(G5u zzghFM>I2C+U*+1e^Nvi7)$?+lfQJF^S%-hwxz~6hptU%py2;G7*Nh!#w^;W2nXfHY z6y)yMpHFKrf^dVB>Kk19uuvuPWPlq)EaDN;izfx#JHk@kp;%m&7Jna;k`Q%e|B&h& zl7B+Ihioj?hR?@r5qmhU#jF{U66O&fijaS7(f$;v7ax(l&gmboexkkjdGr$`9Be;% zcpsT)$B6tT4v*={&m_Jb=5^D`wC2l&QZ=Hs#I!jJ#iR-tlG?FHgzeZwFr=e>Y`l0Z z(~?+@3%8IIpkTvhliGnIbV4{y3NJ7xYImIi;h=1Uc+~?^-Dn_5=Pjw)Ep=p3!IW-;gNW|_whpjvcM4r@xybil9H7KTdU2f_**KBA1ED%hllNA zub`m71`LV54t>QV!E(q0@x(h*A)|8*wV=ATm!k?QmYDD+)o(u-iI%EU|h2@dI|fhM0u4AoWg)@Wf0N;NydoaETIX={rkXeNyRk>GVBE7G%#vaQZDd_s7#_1603t7qUxw`g? zPv$6aYME6?LWrR#{oadj2&a%$^FhcSm+3O=+N+pc9ZW(k;3^R z&`>sJXKB4D1s`g|i`QCg+q*@uj*o|R%)~5^00m!)I)2Uz=IA$CI;66~hd-*)EMZlv z^>4n#39|E|O!Chb`)t%_1M$JMY*wV%iLGzDLKmUuNZ5 zneDbc^zZ8;*o)MjZYefV(&9suM8BL;{~%Ah`W0A1CUWk{zaMjLxel;%Ds>?G5^CRm zT|1n^T#=D6-B=yeIe}lIPo`-M z;lUiAx0>!USz9e>8~2x(PNdn4E}VHqmmbpKHoj_W01d~t1dMs)bct2Ut;npaZ9vLA z$j7(e8C`baX`GdLvix=Ex1nJi*DmM@&X}GSXwWOjFo*W$%ZG)OcOo9i%aaStizh_1 z@fp$+Qj(4Lk!f6kV4B+|EdkftKV?bH$loL16F}!-`E2Bs;3|=3*C7$G?H!ZWqh&VJLRxwqZF$=w>kjfgwSpbTw6{Lb zJoQ+GowkmtL1C#*h~@XLy{2FcXEl{xpJYqbu7X;1F;K>?8zO z*fF_)Osc7=u~DmI5leoa>S|5SwZ+P_lW=jz;t)tR1Rw)Qlc7n|daKps${kI0_4}-E zH5TD6IRxT?z~$?0=Ih`7iB+Oyq6+Yr4C;QEkA_A5K%R8p8MFinX3do%bRIZ)*!rW} zBh?rQB_pI1)?5eo){9(`a!>yM>f{S>PkohMD^#|Er-)dBxH}?$rBudR1)q1AoO%SY z-vC>z?q}(i;IzK?M95Jlfp8!^G0nyF8bb6M={qL?EiLUORpE(YcfDfHHs)qYc-X( zw9d_w`Z3=U#TBK+*8e2Lcb3Y5M4_*t%tXmLB=sYC4+xJMwH@D@^vT=uPx;#0S1qpe zCHfD_(gS;?qAV)3sz=H^EVKBlH`^8Gp+opBnAVP7T^o6p^yR!nCxXFz_`Q!IM6uFN;=Fzb{c=DbhK7K)x5>_3$a%*BV54LTcx!&w$?xuU?R<@s1@62c;fH zC2CE_g=bgKposHct(&K`_Rq2X=+NF8aS*xo+M8CMS(B;jVcZPJ9D8VJ$kbJqD^j#H zqY?@cwD<1C9eot;vqK;@0vW43mJyFq4K{a# zG~i5W0wDi~IcXZyGezFzsZJt+rI~`MbUlsAv(e(NHI120g{6P^lp=`fW=^{z%Ui7t zfqbtMMC5JA(t{##Kk`(KZU&wo7qH*on6LB9`N8?{h~68EZ-K~4-mfQ7&I_-9(_C)) zsRsIb^N}Y%se!t5J-fO*4grUNLtw`t5J^1N*K6V}@-aFwQAat!wpyO(ecWeojeaZwh6M5Wih^iBs$iZyIE-il zqHHBo#zQiQqDK`t26F9#?|oQn3y*k5%?0^p{RxU}eCy&(5sz{OC6W(eNxldj)Mhtj zK73hb(&rw$&pase;}b^@nrDCJJ(eU}m>w4y8n!0B$JB1fvm46qC(plL$gUOJI_^lN z*CYb4#ytJehpZ{=qi2s<;>yo|P(&6O)G2Vue|hdDt8Bcax;sS3L3G7R`1Sk1lMkB5 zAG%Kgc0{s?aKaqDR>Tqh8lU^&YnF^UC}Q$}NZofma=);BXsIa7d5<34Yn7ED5qJ3h zV}mr^Ou`rCk%NuqBkzCQV)VeNyTN);XHs_S?QZk^m)CbOrtyTibiAf}6lDS8ujj6)fM=_Znq-4iOA-jStBp zDMBk$MwN)yg9@Gl!Re=3k$sTBs7mwlhJ{~&ReYkz4M_nA8Qs#>ZGQaP1+7VQ)DKRo zAJ+)OhYjc4Pjd=FgQBsf@*M>adRhHyOo5TQwg0?THTwA?Uol_(`Ja8#JpS-Wm92HW zHml%MCg0C2Vw-XirnCVvHq}nK@u-54C6!)nO)I~r3j!gI==Le*&ErDEDKgO?R zhX~%LTiuql&CSh~`m@NIxTAc`QXnK{GqrW~vNoJCSFbmjW|?HyR+rj3=#S}|?|D~W zWb55~hrrqh)V=qdY5MDbSe7YW<8Sr3GdqKLgd{^H$Kt7~0@K_mMla&fxqlJRq*x}$ z_)J_aW$DS(T-JgqRJo-hDgDI#Ee~^OU98y}3?TM$q#DdtnT>V18hCOwP{^N#eM;aB zAhd6Z$W#5OCE22{X7Zr)o0&=1;G1o-rCjvWv}B#LvbLEK=|-R$h&c#2it+Ecyt0L- z7o^yn))NfRJSQXFGh^-*S;qjPal|S#m&}~?9s8k_93Gw46PI+6lla;5Yfs!O=aBP< z3A}$!{o1|7vDYXDUOsycffqb17(v&O{@_cWH9vUm>q|Mm`uvy8m;cT4x{=i_eHZzL zNe$+OBxiCRiA?<8Gx_6Y$GLTCs`%p@St5O!z73JYB;BQ85QrQ<=+pG=WJx#}XCq(? z?Tlq&#qU!%h?id`eov6BZNZbk&w1Zu@aGL$-q@{Er_h&@cA{lsxo z2IjlGM&p1IkA)sS?nx*DG3~{)7Bll@No`_(NG1rg^o(iYH)9Dfu!&3%QxIW!Ik{FL zhr$mcmBg`8hCMI(%mYJ6CRBNt4@V|2!OR%ni4eH6BF`X9H=n>GdkJ%n-A}ZO^8gX( z`wry1a*U9Mj8Rx4Vir#yB5z1@kHKNJXMV~Cm6_2Z7*qSETb%JKTb zU96V!3lnfaeVHS*q6%L835s$tK&0K@+ZWtsW!BC-h&Iz#A^WQ;iY*~MCQ`aj3duL* z_mRF_uITUt4hf5MfLkC)QeBOdm+}Rgsfg$J0*%qCrRHtt8*hZxe_g9?tPbu>FfQ8u zlqOwlmgfKZ%(Z;4^!OM4wds5Fk{MA1c2b(I?e~1~4@`bd)y^OuA*vc`a`Yr4%RKvZ ztyT7|3W`7jIU-NjC~!%v1g3>Do6gNmlhi-o96MOJl#L798zeAc7NMw{Vr^B9F4QbN zy}~3oPXmOU6YF~-T~kkQ4nLLeeBKj>GGmbb5r$b>p9X?2DOyiBPx!{((o2A3)ei)17k zw4WeC`v#}Ym8J<1t@1&sW1;PdPMDuV+#Zm!5z}x8+=%g)(!_*m%U^PBv0x%{E(C97 zWu>l}#P`81A4m!mz>Q=?QTgcG`06Vz_S6R{(DamRA{Y+WCY~lkfgILKT+^MMo#y7vo2Ij)-JCsrLZpaCPOP<` z`^`fDa$$BlY(HeMz;eK>ioibk!Xu~){_;Fi>qWFQHb5Ri(hLocn+sQ)MB;_bt+q~? ztB#t>EJQV_KYU2!QZWQay4kt9cGP3ag&1nao( z*nYF8q23af_DlVP0HhAcL|%QR8ozTb4#*4`qG?PKxk;EeA34-01zw3I{Op&D|7Z&v z$FxuCP<$5-$ozLw$~&-(Ob~aqGDAiUSD||GVd#&)-19I?&R3*w2r$Sz6rU%L9+22( zxn&pa#blW%&;wF?LbgJfMNI)Bt6uXx;+aYXTRE;{giu=&+-NUwpwB?!zJA^dwucH5 zzn#>VA@UPq^qHs6X?;9nZnWMpt(}U(EZ?Br3fjWGW0 zReq!o5G9=ch96KqLqOsalQH5O-+9@ZGe_@keJ+Yf_Y#WnrKat0aknKGypgg|AA0?*P_Nmu45RW{j z5oDHF^oY;97|?eA=E^I`v2g_6QIKQp)YN`CW`?G=OEJIqzXaz+4)}=Lvf^CX~1W_~zkJ9?NLL76Ox~l@QeJ!f`ZcPq==^Jc1`p3A3*?)(Li6_EasqF= z@j;2I=0*6jS?qPZ<05GxKhzP%Qba0m?bOdZgX^tff&z&hX&pfr#F|1bxZiu-lK`wfV#>hz3 zT(m_p877De#2=p__quvQ+E46pZob;h;Or&LzaKbJtU|$`t?LA2H)!MAJi+jf+x6eqx8>JbbXonJy*mpX5n_wiO#Uf=ehaivUfil zPdi<52si{B0=oqP7DG4^Z*Fe3#Nz4Gr>%MoVlgtI)@*5Mu}Z=dCr(HqQE17>$UN@7 zL%<=h{RrS@ptG~Xy!O*qG*>j{{^O0ZUh&L8x4(6+1v?3W6Y^{K(GMxmiinL&1w|`%lBmQ% z2u(;Eg3Hv)-yVTMh+d6Cj$k7w3Gqqj6MC_6WnD&~N{{GU?~0jrvBz)yPhz&~tvgsJ;(rg*>}7cQ1?rXkAU$X0 z#>*gpK>$KU5ef1R!$DgK&n>BXO*l zce577ggPWr`ak^1-16dEXPK%`ddQ$CCS(6$A-_|GG@p zLsNIm3ooD7d6_o#a&-VfNdTz-<~KfOqkCKaII>Xp-XX9>1cDufw%E9h>~5c;Xkb8! z97*PFqzpeV1GOa+WzLJwMf?qJF3F^u!Ac|^YZdy=84R|-S1t$PRtqbaZc90ofs4nREt$! zMNJrERLw#@ti>{B@FfM=rl6uo3*6;oNsQgxSBnTR560q%gc8rq_&h9P{YSY65r?U6 zw0}cCKfdXvMY=&YL5@JQK@!d;ja_&Z`$@J`RLU5QGmz!i0&Q*I76zUw1mv| z$kpZ5F-*^>Nz9>&MEc>M5&xUZl8W?{u`J4${Sxy7{mI{AWuORtr?1$25t(RnmV7mm zctAkV955rQIM-KRXRnPUZs&nAVILSAwdbZ!rm^_Aqz`5jv3@-bwY4PnpMSh=tPT)& z^=Te{*fEICw%WzLfhKI0QQJTjyEiL0*-}N5KCmaxl7W048ksgfd416OFRYS3M^ujX z;^BnGNGK8+c$;renpe&b$#0_~ZAqONE8Xs%G(WvKq(LPtpAYF~PjR04^^Z52qX+Q+ z0hzjTFCu9F;3or8J5HJ2!LYe_ZA^L7@VCxDX^-`LJ?3Td|lpX?vm;2ge>!_myuGI z*wk8YbY#+8y3%ZkpVKD}SwD^tyPHiA23b-%W{ZIG;uCDPqV`pW>DF2#=y$I*v z0D1Y{7vHkv8T}%NRRUvex%_74N;b~9<1-P_tpZo=efr&JWXb5Q2_sSI6LI(YrCU~w zStPsV0{LL%8c1}qHYYjy&BrM4(0Md1mpRuQX`K{ znAcvvpa}0*O;gKlDU(}e3hmGNK}}dBauMYrpE0%WRS*|^HS+#m3DS}K>%`=og2u=Piu^SC zen+DBoea$@n)R$17MaKmCSO5n4(%(Dv)E!=cdY(0r1GvQpv>5$ocs=lZTXOq(>$4) zrGqVBghto78$NT>i8epn4adD5$H>6uh_J*UpG+iJVvcxwYDw1dgUKoW9R~&m?D&S7 zku6&Bh=0f7;bE&TA^1$JJllip%37I>I>K=!Ede^twM@rpi+|mq*c?+}r%9QoLazCVcPRKUTeVS;wGaE*q-z+`3G&kStq9pVs$eA$ zZY$K9D$Ei_QacXIza_y;P>Djsq6*w>qKzCA#}aAvw%PLTwI9cb8FX~w*v5s^sK_kL zdP$J81Tuk8#3X-IfnujlzNXw9J5Xiwun&q^_Q7o3lA4=`hT>u-@XA&n zm|yUGG+O*rU%t$v2_)1Y^XdJKwJY|;r2R_M9ZQ1Y-xOlh??Wpx2mFQYONs)Hy0NpT zUlEBjMB-Lh?Dp@iT{81VMLe^RC4OPtT$R~6eH=n^MCYP}z&g54lQA(Scw;s9ST|M& zb&i;d*oVvN&vp!n!}aEf$Dqy@mx4|Z#ABg|$Lfk4^Qinqj>z}oz>s`dC~EbKuML`8 z^1WD9p$KJFH~^Pvv;y96nNP~x8Mh!;Z;qM~5rG%4j*1kV)qt)WZqzssk}t;@`2*>b zV)1r&NKX=tRF=6mYBzP$j@43@ZsZN}K{>0zWnkEw+)`d^$E2j$S$ZS{!ZS7+GZ3RFqlrth%b)R8|by_MCsG$xKYm zm}4i7TC>&JsR=V9w+7dm+7&IhMSk?Vts2j-5@M{Pw8Wa**4T2&M4V=t^Y1jP%o20< z{zHmZEQO~me8}6;-DgeBFG%g^sX;T%eMk3O#V982sgMXN)YRH#p8wGsHjv3yCBJ>&ijZ{&6cro-uIW~XBD0U_bDg3`hg43U^*sr3-Y??3RqgrSOXsDG zoimR;a7<)-rCrx2{M=cxC|%gdkGCRm-{~0=p*U?iyZfbjlvRsdzd`7i7ZuvzGDE_- zPb$+1nOlPe0hx%H&bDeSjD#PQt8k|v;E2b7&m=cmHi*XuP8Mrm3Ylh+jlBb5nNAOz z=8kN0{6K-oM0_!%>1m22&ARe?2d6B__~SQ*bTg8JW(9^BkvfqeFd9>r5+r0O?D+yg z5!u-t)?_o?Ja}J;HRmo+aGAA;M*_IiR(VcxZ?;a@av?X{6{KcdD$B$BWxBRhn|tFB za0oaA90EH50blV*@E8_-kcybkMk@wUJdP?#Zgq9FHM4fa<4!pH?idn*z$c&iZFAxJ z%T~$c*LUj3qvp)9cljS+6-Tw6I+a z7s*dvp8SmEig-k^7LwWxzmIc^0Y)HziVF*DU=axNIT1Yge1x2W zq?{G02yt}bQj=B1wX}9y0;Qp@O5~$N6C%6jlxI%+MvF2wbG)eVAO=w~R+X2S3T-IB zuH0-_{N!|zID^(7;mp*S3CZ{I)uuM{6PdF@j6xXti73RSBL7QEifq6R%7MhW($s1y z2TM$^lxPbg%t}j(tSS-`?HvXExY5#~a^^)?W||`krcz&1VaZFs++==5$%;Aki?3cX z`}fqEBT}xSU~TW{v*+}(%&BkPz9SOPh;%J6rBXFk2y6Th78MIu;YWWUO(_7;@X(kk z6!DDtHrTb@?y=b6( z$xxmweV?X|Gpci$nVq3=bj0M!w78)`{Y(ButK=$RZ$phWr*D&)IDw6h-fR=;JYz|` zI-Q@JBExSscbMk3F7uOD-?9&8?~{pgT0Mbj6F>Gs^n*Ltpw#V^s}7Wp_}1L3z&r={ z*6ALRXL2*M?Y(JOt^x)IhSZ;@>}S-PxCvm}F2$xjiSFNyM8FY`0iRZlYc>(!Wp7=s zz1gBL#B_RWTtuR7z7US&!~D8H!E6|mMKAqI;5(N5!Ji?2{P6ov@HM7h4d+h3 z-+bY7Up0UC+!v*q8Zc*1JYjzQW1m~s81Ui0|B`wA_x{M-{`QYdx_r*v_t{UFCqZ}MYqec?)rDVEX`0tli9D;ReSR%4gk(EPIlQy??N^mn`!XkN@f86Qqm*wBM4QK=zIIJk?m;_Vy zJ6CU+vC+vzmA91MBBhDYOnXK|JmQb@hRDIe@-Z8E9KUs(t8%qtQV&<>G;U64&ck`R zqxRYe*2&4R*5pN&aBgnvmI}AWl9PpUDS$$?N_`pv zn*cL5=|p(_f;Vg97_VO;A1ifywKZkdujXL?kj}-RRJTo5NsM_red2mco6gsms$DRR zBJ}HPMRrSV3`Vp$8Iw0cGgjkvfu8455C|~NGQTisv*MQKMbgucw^oxsnr*EVxA#2} zC=t2$uCwLlKm)-uGGu-;t*1i$rloB{A??S_3nCpknQV5_qi9~d-`kL@8&ifkdtb3R zb)?9&D9FqoeWlgb2T91~*4#d6O}H&ts6nJqPs&almRVd4(csoT#hD^K>#H?Li*&3K zQJEv+Gb{z=g)1Z0RQuVdd1AA>6ALWNn7Hu~BqG`rad)E=zoTbjgjwg<*q9|aF#mK< z+v10BWJyfMz?n$J1mq|xDvJEsy^kXTj2}dqC7~$X?uQqg`>w7oYhq1AYtB6pt?}JR z+n8uF(I5}xBzf@dh-n+Iex5i&6t|)vOKC5Q8L)O^b=;s`RuE$~;|HWP{U=s5^kqBj z;t!9UdY@t2Xv&ge@m>Gne>SuK{(rD)MlfeAi8X%keN$7DX=}YD^;gK8JhD&jc4{o~ zvC(>WbAB+M6PBcO7FfF(jC&qCf(dWCS61>7Bxan*xkJO2C~B3-ZS$?$BBG3W-e4M#cVm|+4nzYo_OSx`PL6!Ge1<@npAZ1Xxu_cnAft>r%%WsLOliy1TTktPg zUsI`dWx09e>@oA6$4*<5^?U_jfs8yT^JPqZA3SwbF2`~$(fs${{Ei6I1z8R9a1;~i zJoSYf^X^AZ+dwHldHs@k^Wt^&nIZG#zx<|xzf_yL+H!O9*a3^ib34lPu5Rag2Q8E<_J7hCtQ(>DXDauw*!Na0M2-37f6C^?uL0|zI;1bKdu{-y* zbM;J5-}l{J-Ch3wzUtRg-BaDuN4@H*>CD}ls;Zqif;Q}E0aM_ro|8NL3_1Rz(ccl47iYxZ$M+B5tl_rFnWH!v(Ni$pk9>s*kP#F;ErUyF4Pl%;iPtwtX38`-hx zN4^wTWm&$R1K0CnowHCDne>61QjO-XN%1ags|#!_jB&Nzm#dv-#l@sfMMb_AB)Ty@ zV5|@5=9)jVSq~NnYgY6>ZW;j=U$*e)hN2gL`w|WUU<<~`bzJ9!a~|Jn90737l)^Oz zK?iZf+y|s1GLd-ALEzzHO&y3Oh)Jy566<8jn1X)LSFfuBG{Soi^anZwdCFv&2oHty zv<$Y$G&rwT_-#~{K|@1>t|)I#o9Z&f7c2JjvKnBke9w|&esRHT%gOX{1grEYGrnf+ z3vtK>6c=X-Zp5}GW|jVcr5fZ6gb%Kt%?)*CVOFj%01#ocQK|b2ZpW=6j5P}q}8cC)@T)kZ)is(DmawMV&3S*&d?sGG8 zS0{1Q%B;!g3oI>3z|y7+#v}@@6c|V#HUI!X07*naRDs0b#O_NhU{8DKk0}vv<)sSM zrM_;KY~tLI#0?^0hjgyI&K@IabG6T-Pmr`&0+JCL5)up50BdlEWF)5IgscgtWi^SL za8wCW7L>V|QlvVN&tOS*=G$t&w|~%xvjxO(ktC!4jDxnwf{oQEFk7OZMFNuciuItC z@z)7!$VK8%B9p|14DM;n0WvkBIiufTh6OHh9GM3!Y`tYz96`4=iX}jBclY2B+#P}i zNO0E>+#Q0u4DKXofMKxU?k>Sy2Dc&T;M~dkopbK_o_qiHboX>uSJhs7)vmSPW+Co_ z^lLpgpne^GDqXF^zq+1ZiI4F#QT8g>JMM|B7Y!8jo^P5#wqHD_ZHu zjuX-$mnyfLZRq1pBgLvy1T(JmB)h8-4vwRyH|egcMQ`QdQC|UHZ%lqtGS6!5+cd4% z;tHt*(S-4~bmvHl#`J!dxM4s?3S(dBMHAX3S{6Q1ge6no)9dO@w-u!E<&!GQP_SJl zXeVnnR#mbHf_<(qV-oD`*09}*lfWEfIkrxF+>&CIDhow;t|qg71rHJ>-Z7R%lsekB zsT`v?Jhf^_hQU!ou6iG(e|>rX2Thjtg4}837$?B_t4Y@LV6EFRuhQ4S-E7sjXGZLr z>Aj(gq3+0cQh~`1ZCbVTBjh^8WODsr3Bskv(OUa`C-bIjtnpULfu`cb=3HKW6w3!^ ztqV@34}?)u<^!c+sr^Qx%c@C%x4+o)RkYs+V{+{A(Z-XU>+fy8?m4w=KJS>cRF47z z65BQ(3p(94q5i>NkWq=7w?FXnuYehC1ORq@WOaQ(0CvL?P-u{X9PP z6bFbU4>xST9AyPnR*tO+)ZT5hc~w955_OttZ;lvjyf`5~_sHV`m!lq%eUYZ;*YE&m zl0o#V_$4pnBGq#4e2dJxaL|5B!o;VSoUV%#$Z=XMWEWrrS=K_1OZ7he^W3W{ZXe zx(sU|_T#RrXwf4gl3cwZ&jkB&`ugch3K6gevNpgV^j>Efm5#uUVGIMKZgjr(jZj@P zu2fjtd&l~I<*?$=r|P^VN}hGy!&Klb;CsPNae^RUrNtw31tNUhv7ReMGi>> z**IYpM2F1uF7o|^#U>f%{GK*tm;m8C(wDBHyN|vR56aP*M_(UVbnO z8b^#@twSjm18#u(o#WZyD;MR2w_jdHp@F6r4=X1AQ#>g_+d~pZfw#&94Vih(Ohrx8 zW~T+zWHd-hjGx(KWumI2aSDTXxu_^Uen$}E=PDc@-D%#NYF-|3nV%0d6f{_q17u(a z4AVl+v8U^42ks%obw6isn+FraX|sMuPed7hP92P1=|f(P1JXV6b4G1d)^#$FD60g> z8LN#vBzkryS}@I(f%4($n9hvO)K1#R8PbEXj~IHJ%geu9>iH;^;JqVb1#TBE+F%?5Tv$915GPk;UO_G`=W2}nm2M%c2ABouhuW# zU!*1Y17=8-3E}{LDzLKTjeQK-C#DCc_H3PJ?#dh;fjbj0>GRI08m%mTaj)Z2ERY?nsncyt)2TI(@N-^E8qkrUXW_$7iv|JtQL z@}@`WzB{fd(bSClV!b!B=`Xpg8A8u}JM{MD=X3Lz$4?;l`L@z#MCx?J62O2Z4u0&9 z^m>w413qh@(j~eBGPFMwq58m3*YonDju|9GPPuim1#b#(>$Da#=oS&!Cy^o{!#Kj5 z0|)MrikRU{9>iXtu1#e7U5?n&4^8r(8`%y2N^Ny5;KJ4eeGzLwK@#)>YQ@^sEg%3> zo(CJ=1xpD=2E#J|qZ)MWdD%Rk*63yIZ_bz6VrJ_?%G7#i{BA-$yE&8Sb;C4n&(!ku z0@#VEubfLTVwPFEK&Z+DSx_ ztm)8L)M&D@&@dW-aD6Dz)zYr>eAsb?WQBeqF}EkD{g})*3f~_T5#l}Yjf_HW{?Si< z1%m5C#gUPcPO)_OOVN+R$@WAYL9J(ylcpkf&P)45>=uur0v48LB>bwLp>q4pgRQ#Z zUAm*L(!y188ksKVF5!xwnu@G~ig-$FxEtUr{g*ei0N}_F);V9YPvY7R4Wy7(*V!F3 z>(q~7Smpdg2>_*{%86zs>=R!Iit+!J6|LLExYn-%!Yi>M-Sd~k?f9F}ToU?xAKn{q znn-4PXB>82^yy0SC%bV{$5ssQLr9!AGXrgb-Z|0~2SCa);kJfePMn5a=^LVyQrw@X zD6o9G&heA*RLC$_12I0zV#*LEQV{5VvPDh2wX@YQM_1(Xqc+=MapOYTNBnx7Z2@XY zl1iMt)`V_giB%J;CUahL6ngWehuCqOJ+pgCzONAl*xp4wEE2&M(cl0afW}Z6J;WX- zLWj9$i&Q;&Nxq)s8egNZ=fch2Lha-dBEb6zMS+bcQo&}O%D-cFLts|TS*2yIQ{w)o z{(7_Wcx$b+aR0P)qglJO4RFOX*sN_7I#GB z6r61S0mg?*&H?8;U(YBJw$e=kbAS11o{yborMqXO z5@do#FR>BS_68~BJ{FnB_;tb#t;}%q=W(Wc`C6+5Bs+QYdX&$XHQatpoxC#js4-WU z)_`cG>e`BTs1TUa0#meS4;o)V`LQI5)5tGh{=kQ)So1laA!T*s!*fprM~(L`??N0s z%FhBRvy1pQ1cZrm|C|Ga*=~7SmaO^v9y3So9EzQcgY1#2s^*Oxo_iXUbdl;#Ap{Qx9fvk}1GpG+Qpi`)qmDlOelMC^%O~cUd~qfcqd~v6jeg-_v$N-xX`M#;lXf zA4EkBg@g!36O5%)9y1y;gw_&`&2UgKs12JR5WR95J)!UPyE@f}-%rd3QWN4qVk8xB z!D$TL$>%9J;r{A*$Y(5)Z*?Fy_{W1o9KIdx&qWrv)xkT|s5=9`1hO?waweXgjHZzK2_yQ{v z71K4-kfJb`O!kiGq7ikj9bDlyFs$Om_1|Pklte*MQB`fp5pZhFhj56IGrReDHZdO! zt$;FV-1`KMaQ^=1rj+oB-xaokQM|zy!PsZ*?=pX;e96hoD0t%P$!>~(NB4m*J!A!c zajg0h^jo2uZVPr9kO&@Fgd06X`-XbRh)@#{Vg+|Wg$M?8(NNZU(w7r1SM#oeT{?8{ zd?|w?;o+l(R-2sKUOJ6q9kg+6=lIT|ha$}!pNT~g{`246bbo7TwqVB`#ty46*U zX3(%^{G+=pi2%%sGdfccI(Gzt@W(1VygSkbqDRiD1DhzGO{Rp7B!v4<5^sJqGzbU3 zNODl_jy5*%-WQEfs_B(W6#mh($~$+HkwJ8==5PkgeC#OWJlg2v=M}XW>LATKTL<># z81)gwxfIODb~PPXG>mBwXAFm!e>X3#X_)oVwza#vFY)q3E^Kepa;I9BAa>--tv@ll!%9sFRA0B*X1EOzuZmxEBi}gI-_E#*}>42C>)$@rL_-Iu$O`lHq!X-=ch<^rn+_UzV;TJvOrG_xY5?LdWI6gP3C zcg~LBc&lJTKHeBa=o?nLoXcABYYuzdU#lK;`Yt_Gj!q|EW;mq z2{!XGST=2H+hs;89n+F9cN@hPt6g8$Tf8SSFYEzMjkc0&MJ&Q9#%NC5dNTP#NA=0` zl6^)OlBGaszu2|S&q>GPnVEj$67EL*&?sp7CRabeQFZQYX0Ka$+k09(a{GX})~Uag z%&|+Tn4Cr|eJYi&Y;>Cx9-e9CVLTl+DEnJVF)l9Qgwmf=`My*EbiyT2NUt|T6M8&5~5ZlGEI~0*eC4g-T(=oSw`dSHLS}! z8n{+?iF0oN=D3X-I@q4IQW^ga+G&HVb-h&NkdV4KaCU9w-|YqM(th-ZHL^;9$7Yv< z!q!5S0c0`oY%vZyCqKUtqr1`T7@k7+Xfm2rnIE73w#{VdCF_FyR{$DHsC}*W zs64QT7|1ewJ<45t(z?46;t#B>bmQ!}P8RXGEC#qm9}Ed!&6Ft1f07oIW(znm*sQxt zSf-}4t}S-)eFg|tZu`SxzAJ#ecxTj((*P2yTdJjfoERPL;>X-doz(@y5>|*DnvHAV z!ZQX+c4eSD#q(Zv+{bFmP!YofOQAw+yjJePz7xxyR@AHn+2N0s#2u|uFn3R9(8F9q zc1HDIikN3ivv7Y)8L7o!zHlz&Vb4J#m>%qh^^Yjj`~QHL3C}cc}z^dPK-1KM%j^!N#fW^!%ZyCE0o~=Ez&4c!*?V=F8Sg zCPQoM4@sys&h=rt{WO)OEoU{*^FA3c6|}7kaSJL_qU69T#dPw2CV-w5+(jyzFGC?h zLnrl{FNo@*96!Ml-bmU~aCH|e4R+SsJ%f1|{-qgd0x!U3Te}|VpXX9Rp->eV1gph# zo_L#!xQy~J?#F-a*S1U79Wj6*4BOYPGeMo>VPLR2(?B>!bB|6K+H8nt9I``AEw=Dh ziuu((!{6SDORB&JYnRP?^JAMC71_0j;8fq-!BN&YjZ?RfI@z+n1Lhxg4MVYdQww6I zbZ}0EUQ33ROhJz@ZLUuN(SjQbV|s`kL)tkbmCx`HEjLBH1d{5WQ192VT^U`iq@z=6 zOzP4dEYX9#jePe053Pt4y?mMR4|MOdCQ0wH7hJ$N&^_<*c`i`F=SJK9-|kT(3h9Sf z*T%shxsUuui7Wa(`cdBG#N@^TuNN=XFOvbY>lb;8hUaZIVi(?2JTGX8-S3cwA0E=G z{RjBB?T72lxJR)+xu)75aRy*KQE@VaSNWzQnjmv82U3<-~|*o8>!5+lnD z^lVPGBbg|5Lcp)LC_q_Lm?H;-C~%udJMav4;J@$!nj)Cuvek7jMvn`Z402Tfdl`HC z4`4uoj0&y*sH0;&;LHy8Gy_vFr&HM?Fn#kjc3VYx%xSOD|3vzKcloa%y@fN(hV&a* zN&osLl%gSp@~G?j|HTi~csN_A&M>jew!r7slamuSn3U7Lxe?4S^t`#8zEaE3&^|iC zzb;87_sb>|3~&4&9PwXwm-M8Ch5yrBfla&r`H5cc`%+wW$8GlGu};@<&C<)MjfC9= z1s0{~AvKYU8(sbmnN$1r%U`V5X~5nCZ^3=sypZ$OcRdtym&+(}&ziuqHx-%H9U|6MvvQnKNzGXAM?i8r0XX0=)*>p&;p& zDVIhEh1&5ECbTQQ*V5Cob)gIu|5PRkUop}CRl#Q38`|>|F?^I$2ccYd^2z{pEAS7%c3O_7 zs%pH$MhZW;YYi8HO}4g|mV=@g)p8^hWt%gm(H8n4OlUZ3=tseW*+{GlaL)NvRJS7TyXJ6-iw!o?kabS~0RYvC@tA(s5 zeNM3}oI(95yu_m{k)U*RsjaLbaY(-SOS0d=6ExlTvxfdz=XHyT;e*IBvg5{!tr?G{ zCX_;5>yxXf(e}XRKQshW8*`mVkum9&gUg-O%QQjx*??koEU9?utNX6*)WhShp5zb< z7VdMp0$QkoxBmpf7P_1y_8m7m>?QX1cUyy=N?zxmVXmY5FQcrTEf+UBYhGQ~u^hr= z9#`xQAp1=YXiE?@2jsj7A>ey1D3|R%N&H-x)y{q$ZgRpf#5lkCwsocYMl;_2@^+?U zL3txK^3~wqJCh?n(52alQT4NkxgAU;)1WxxJRftu03HWk!Her-R1Z_@L=so(Yp*vF zU9B{%Vdx|==Mn#Fu#m)bcRjDX*2xOb41_O*JXT3OP#Jo?=JEN7iU{v_LibEu-BM3kJwSWM9ox>{Sq}gA4#v{|F82DCAY5k z7V%zUf^tnVy$&S2SNZ18TF;xdVmG`dTMw6H{~pZv9aK7T2HaBpuiO7cvBX2j_Z}}@ zz6@9=M7q4XVn0GyNEY8W_11#xl#`R&Z&Wa~ez|2JM@q5)*9Cj=4_%`n=gl?7yr3B7 z-=8Xbqfn30&q@V(8&ObB9`4IN!vLWxu*i*9DJW`kg7I1W&NXm<<6OwqYKj5}m1Uf0 zei@xPU?hS;``c8b7ny(!uCnc1#mh2I=3s-GF zEEONmMG;U@YND-pPn7RaoOv%~b?*d`1ycS_?M{7vL5WgGly64ye#YVGjINRqeMo+b zL}=~;)+ifgVfomH>IGqeb<_a2a}N*Snp?Y$>#cFUe+P8^o&n-Ot&W8&Zpv8!uNRg7 znLGbiuJym>zF>;b?@W|l@yI9n1J-uUSa#E6)FLA4}Z-`=r}cw5g$ zJ_bEWaK`Ce^rc=j4qEG@k5dn$k}}DWgt^z>XJ1h6-rY-l8wm0(U{+ zzh|Nv>(QpiX=*NB-W^ziV(<1vOKZnJB+9uoJ^Zl0Ka7lwtX?p29!C1gkYUa_Iyz3q z$Hg^&{qRkR)*rn$>AQCQAy!T4XKn2V;?f9N!PmIN#2n0MS=xvOSVFQD2co2;mLbeutk9xA|VW0frKh1A;_V0jjTthw+ z}|^UE6mb6UtcI+X;-ly+hfF=@x^-ZM|)-*hAeKiFWCeGM1P1 zQgV`$ldaOj=cGX1k#qaL9L&r$I>Lig*MDHyz#kaSbekaegZ0P_(>Cf$957&fp))M@ zyU9s-EN4~Dzq$KPlG7aa2)4m1YL{HVo0-Uk{i)qW-<%;wI)#5du75|~x_j~FzvE>$ zrYxNDuH7Q21*Sg@%{%uWLMbbFY$!zLskY)Xovc(5S?#;Y5le*{w|J)K8MPO*) zE%}9Ki15K=UcK;?_#<#+>0)Q757A3*Y?!B&G`9m}46hdRDjS4PNSIAt+-$pPNQ>aA zG(nNYC2*2^?+q^QFL*wfqk(<+^1e$cc35}}#r`;P4htTn?>?cn4L=cVPV> zC;D^sjp#*YXUmn%s3sD14+6LwmM!MU)~LoIAJk%E*_m(Q6eNOOFtKd(<%3ew(w3F# za85=>l8-FK%uInNR>}XebcJ(if&JjjPACihZ2&{wt{PfeXYU9G52>E6)!VwDQ1Pza zo(8=R81kB+JxE;DKrv;I?CBlK_={~yL$r1+y0E>iG8U}jX0aV{2#Z=sx;C*YZWv&3 zjB-T;60j)GTf<71+R{&vzEB zQEnts5$7q$5M)U>C z@{M|%#MKVJCOxjV0cDdgfM5IB=6s{W5tiAE9V2}y0a#|O0_?(y6mS|_R*}qg`>JgH!KsVESEmG zFThF1ayo~Y6SF5TOBrQ2)765u{KqEBy-&X=r{G`H@^*AD4!Bd$t_q=PJm=g8yw!47 za722hVHK@O&$aZ0w}A05hr+Uryj{b>9iJ{X7*-Dx?hrG^7w7+xPsC&k;A@^PMIEBr z#bl3%aZArbtQ)?jn$dyl?!E5qly`Z*Zv1Nx0g%<>ezsnASFyevK;-1Twyz z4i{cuUx&ct0p$73FqB&^FPND35*B-th3dmDA&T=VPd=yFP; zn>+Az_>4(`;-whAhj{1C^>y@y`0MBx9pwidXR@-hteBQjeliM(5F8%iOb3Jk{}#s3 zWxXL(t|kAPbvO9_Kg;k!$8Ks;Ss*E#M7LRRFSRXCJM}Cr=6>y5DuHU}Y&Iv_E*+DO zY&op=S`Vo<@{-%Skn8Ixm!=htDh{>le%NVKLHiFP`T`B^|Do#26v@jlZdt+Z14JsCSvueR07 zCATuvYt0^go*cEwE>sU?kMqYo)0QhFd`lIv<8(1i43 z4bUacql}O6rH1jq^osvPcrTnemb=A!T;cBGJw>bi1+v^fO?*vK=kJXGtWe8_EO2|n>#ZSPQ>T7S>hXp^dix}L4FcucVxzW=L&kO)?gW=gKad#E8 z_i~gGM0X?^D*NW?P@rCk=Hp0)X>15u6j!3hM^n`mlxS+_#1ik^6zSAD&OcOA_CqQ| zq_{9_32dVGc^9SdK$R2|?GaUmfPPEY%o!n>ptxix_WL_=EIV@! z%%P5xMFH*^-o;ceR*p1D=!zJW4i@-&h7NtCL4kn{3E^4lv6guGd!KNM zQwB0oY324z2MAM@+MUV$9*1XK;nWN#s5;V@&B4|^2s&=ky1My5CcrCrs&DMO@#WN^ zKG3(maJqC%AU7Jtuq{B`wh7cwp!^WB@jfwkg=s=Zi}RdpqvhSI&wf{$eGUFSy1?g)zMW@4wmiHExA26FT(*i7Ek zn1nDT?f%W{*Y_kGFCws^WO_g?SqiSyscr=Ta2Dt0eqZ-~<7J*}fkDW5TNrET;NSo% zDH%|V`;ia?g<&KfM0hre^Rh#?`P}o0$_m3TUs@`GZ1WM)uVxPWvHvp#!P4sB zB%J1^9F%)m0|!dhr|1!(rXNgQnOvN}KDGj;HXk3~k(4mF72n}DIzm0u50Q@{DoJH! zMZKdVCGw!O0Uv&h)!ON}DTDC|c?(BhYbh5l*ZH!$LIK>7r*KYf@l=(>Kh}BU;2_0s zIL!h+z`nd;$x_|{P4=}vj!q}=3t1eqhJG?KGV<^FVVlMn=r|gpp>h4f*oj%#tK6AJ z4-qi3Qg}hCp#DZI$=0&3?Ic1ZmU}>9#eUnDn(`#m7@(NnD~_G;L-GVX(bTfsY5CyN z49N0{+&FbB^%7KlmZ?^o8Xqlj>6sXxgw5p?Z7W9(a@9f87(UIPEvzcp%32;)*KP^1 z(78&V$2Z>q`B(0sTC=ZJyr3r|sx~p+)})r$99=H7C=wN7vM!CG67!DW zw3AsKRpyc!&d{zo?|~XQ2TW=O zxFFq40-rPaqNu$d_aNKFVNB&!#))aCMhhv&n+NG$&3!icA#UZEOT*@`+g$(SS8~Jm z&FKg_G5aLNuTu6c)JpxHoGZN~N4HJyY`OUPt+}756Pzn=UXRlwZYM#m~Fy=Gq(Wmph$0n5$^8=MU6Ck~e2Q{eXR-L(2%>4H4yTS>Fz z332hTsyyOe9o$g*uao$-4Yu8JVDKmlL!g)3sMUQ0;~Lu9I%=+CuyRcL?Y+R-q?+LO zhHsy}HC(Unw>Q~=PTDp$MUc~h9G;gdh}-GVCO@w-P9q zO2qVj+S!#iMScNF5fT>m`WOqkeTSO@yWWB^ydIwT0FU>MUUs3ZoU9%Sn2mY}WoP7s zJYr@2njB1y@yRVBRcEp+d|^y-1c8mYMkTk-@2}ee zLPDICT~V=<1h%yVOssS`;4dYn(mcOWYeL+~iSs=KoYcPounAgpzAhB50(!8mRCxHR zj0{b>)~-S7&FK-eR$p=#p%2`I>Ti>NI+OOP@Rv9%0@EX?Hb;`3875xg*5!bH)pJu`s2_;%#h#M&COu*`l6vKe9S!JWa$ z^oNye3?mp(bF;+Q809GMMZHLWbIa_5I0Z-d~jShxS`& zxLsj&^~ROGdO z(rcOLFCL_qV@=`7t1vBd9|MBcm^yPEZOzjPyHTS~Hh4GlR{l${_J{k=ldizWu#tH( z3jTdjJ<)}4ef1J6zt3j+czlha4zcIiXVlerspT?k?cP<*)`O@hKj+x6 z-XeP;Oi9kt!XX%6WjtYdRr_>Qx!(GaEZ=;%z5GZ>fS;1D&hrxzeOML1e{D;PMu_Y% z%|Uyf$q_+@R_grQi*rCh^36AT&Y(XI8^Vpj+5unw3l%B8L11I1PNqI9tV`H}mxM`p z^{tb}@)LsRwgrY6H}v8@MIwEW%KLmh(6o)?t&9D&Vzq?t@a!>S_A}8G#CsDf)+Du& zfr)KYKP9M3U&LPm#*I_NTnKVAvhF`OfHeBmzl1kAo1pQ&uDT*oTPO?;T8(qPw}@y1 zRoYC?kA7>csOw$0Y{?{NKVy|eIh@LT$;!t?_|V*V4NG~*-}YMhd+^Xj}$k8)g^gqhaw z`r93?OF+^{<{+@3CR@S}$G|^_AvmcWh_uXB7sHiRElYdRgia1@$&VgAGB9JCLObrO!ltCrejM=iyzpF)A!&^a_EUCI}svdb04^A3fRU!`X6qn&ySkp%o|VA=6B{#C?L1%l+Y-{GIrip!`SGZuP+I)80JcYu*I@oqZS_nXo`>k2lP~0 zZ*76O_D>kf2qLm2!5ubEqHd_?+F1&bWUw8odkt zt1GnsLI%`XIx6Pt4dsC;v|prk1?u?iDS4gAmsM6*xpRs`Gnpv01PD4A61xLXEHN&K zugU9Oa7(t-3^`flfkd@mizQ7bq78HKE|zo!PO{0~t>_am%I$^ZF=d$8 z)7CfDC>7gpkc)O$loj9rItLhhXurpjJ`B>(&{){& z_}OFi$!a%y$-Wt~{eEO~nRbT+X{WUfVX%4nLD2go!d{C2U}l+}Tz-iz6nyf*Y2?z!V$u3U^PWIKrm=Wrg(}PtfR4=u)mRLz-m{nHmc6208`k-iw zECYWnLUX{BlIfU+Rh*SWng}I}+5P z*9xAd9VI;=#KgZ9Tf$DQ`d5u9HwxY;oQ-TaH14u$ptz@I0a_k|&vbfC57ea=9xW)9 zV1MY(p~^L^AQg~l>~gkLs30M8<{OqJq1vRN7acLkYV}R_&1Rd8f}zY=>f`V%pQE~+ zXSQaMVy$8Ep>bDEO!nXQ0xk zG{QTu$c)Zf1!CO?Vo{|64wKGPUq8QzH#x#d{#l=$?{6RIo=Bv0kRL+pttt#76Z=D_ z{$5`s3K^5J17>icKZEW!SM8#6m%7a{W?Y<|r;T9-h#We>cVx#EYa8pTft}h}=qTB1 zicddn*h-&~#QQqw<+hfG5}ONN9t!}gfmxK&%+?mT%eg5fJDF@0ZNA8B63=Oy{IMgm zM2^FFcAu1Nj@Qtp&`x{?Fk{t*1b(wlS{`ybeok)aD)iNUvCa1-EgCV#MQ;*jUYP*g zSS75j*BZt9yj`DocugSnA8L_a~n@9f>g@Z@w1Fxrc z+C7mDXP1yTF`?Kfu&ODXV6cme&nR^?HsjKpnvclCCZPTxQ!9i4TcXv9IoGtHB|(e! z%Qh+YD`M_rPfqxqc+QRc}~Es|31m>>Z;`(W2_w3Cc9$G@DtTQ z+bG{449HsQyE*!%L%o5x_;~NCB^`UPtr_IFx-27&^NS;hlXvhm>?8^{-MQV^my{jG zf2mr>`=N0HIbB{$jRuo}NfS9&QT#abR`Nb?YJ}KuA`8CZJ8n6KK(}~kfW8HM+mpZZJgThdjDor5jC!ho zC4Io0`?Bab3i7dTKtN)wrxg9vF+uqhIiB_MFb3y%py;WCU+%0xAEjNQ$9K3`$2uts zitq+HtC9ga4+NdlZUj+0cC-#d`TN9z(sZZYWLA$&|P)BLQIiGS+LN;<&{H|g0d9^P$XwlRMuNRzt)Qt~6ciHrFl@kH4psBovMp3r)9p>e`=AXhC( z>IRCb!#zRVtkT(>jwBgSuoRt*eWq<>u!y!0FWOv!mYa}T1hatv@P8Tmgr4`;qQgDj z3QmrHgIOWcljgbb;`Q-+9cNSE{b{c|un4T(D2?|wL(ZpjJ*P_ka<(MM1IJjulA)eu z1^Ho~8ba|Co|w*q(JDb!US*uOUE#ge`^ijcMVhwp5| zH)z;g>}BgI%IeMeVHW?J`4#4-g9?A>wZ%N7PksJyKgaH@BxYQuN0nnR*Z;Xg3fdv? zz+QP%W}MpaO$j9OyX^C*=>E$cXWM#JTT0zW_TQUjd{q5qx!HQo=O*MDuB7;lj-Ru; z`yM~8zlbq7>SzHT|EA1G^o_bacKwGjgw^u)pqO5GU+t^Lu6pkdO*BsS0iKo zDA@V{Dl<6%4GvYq3FHFr>ukQdk1OW)V@kK@wsaRhCh%bAo?UA0~+SZI>D^#&;i6k@JPL*XGOe z-yiFgwYi>6YOee030S1*>uEr;4RWl2Dd!sjuOWWVRnW6`ikMkcGY{AfXq_tIpjRdn z&qqrP)wh@CFiS-YtoJZWMacEN-3n{svC%WG-onDl*6rCho|A?1E*~{N)haS~j@l5& z?uEkdgDSVFTw$7OzTivLPN z*@MtcQM#$K!mFn#F1{Th2&;fW{LggGT@flbB)wm;(m%bf&awl(CHW}JjV8xVj91>= zh-!z>HcbDt#`%R)O+R-h_FmIYes^i>5a<|V*-RVi`B`AZhmOj|vP9wS*)K=xJ~}tg z7u$i%{*{DATf9PN)35RZO+s|NrE;0^BM7))90WJX^97xo>d(cN1(Wb20zXeD(_QpK zyIld&;|qIUS5T58~${R&=3IGZ&!dWw{kEW7PRceWyM1%mad~z`g>Ex zS8>2HAcY0>|=;ihhLyP;F>ntur9SweWfO>#r_2=0`S^PgRvPd zL+jbTF#buK36GtUm*QkE8PE~*MvxbwTBbK|2<{|)YrH{}pZ}PVX>j6w6;QD5>j18! zNqy^$>GGIs;?#wei8hw4h=`M&U)6*ImbEn|LK+4hXG@)d2E)Ru?iNOD6wHSa$>%F4 zfGxn+>?T}p^*4`sMl^BXjN@m$#>)2}Esq$K1$2H99rP4(S6D>guXd>;S%m`xv(WO)#<7fwrAxBhoo33)nE8^0IXktZT!yG{TNICplbo7#0B~8U~AA`ihs7 zTx&_$qY$!Q;eOCcsKu9uv2IZ7q_sFY-IHGn9)ZR#!~r1xi4aE*>VVe1TKYOgk|xyHBz@cs(pimkl2|Qo%kh;CYLo4{zd) zc?uKSWM`cw-Q)vurBUCf5-V&Q2!NN15m6)zBC4H73crx48<-G37W3&Q=Ht6CA!EwA z(mAIKOT{{rIaEPHy{POo#wP^b(RVsmvJww`YQsauBTF@d$fW~yJeHU-*J>2Eh4J%p zAYI+e$kLU88N#fDijGU3d7{a2x*Y@}#k0n3-}+O-Pj|tcFE}Y}qcNJ5y!0gG6nVde zAb5?#(z4I}g-z`$mKC@WX^NgneD&R_Swn86b__NVH~CY0Tk$Q<#acfJ!FgkoP7#qB3d>Jz+?!t`+b zvE2efN1fTxT9Uix^?&^(BMh{3iP-WzIZbK{w3$)tD^vfR#b9K0e`$slKiT3niGGs# z>#_d)`p|Z|9d{PLdA&-``d&xp%UA8VCXq4^7mnu5*OXOjm%FrrwKL394jfd%KNz2^ zPidj8kEuQe2hTqOX7DKwDgZ|w(JC-GZafTHo+8Y#AtgZkc|Muv0qD@WV&|JjLUN(u zSm(sV{^=e!%lBW84^3@`kLxV!l4xsmeq%t2MY9L?N-xh7UFQNR6 z50i!F*4C3z13460rAsu1Xz#daYNR4T=F~6y>F>}sn~aotyGb|cOQRI-+bpDw%-4*=*v_t%HBqwgo?`RpCISD z=jjr6>{T;QAe{%uu%*y%@b|yc|A7u8J)5>60_-CDU)?MJc4HtJO^D&ZO2YnolgdpE z|1mJ2g$bk+1S=kEakJUb(aa+8ayJQG$h4}v9RX$nx2YTNwe?~r$M{l`i>7)uJg?Xx z<8<7fT)4Kb`r0-f5XY(SZSH#!idh<7r-y-yGxR<{4&G;O0g)YfxiHD%=Y{j2iKtqA zD{A@40&$PIfZIK+EHmUmdTh<=4!_Bcs~0&6k)3SPZ|e#LBHQ^s;9qB0)E>^|kkjLo zG{d%&(^HS?t^n=FE=}lg&w6^p-JejuI2C{B8o|j_rBkkF^;qxa#So zt8^l(Mj=*Xpu5+4P$2BMySCZxvoJAM=bka?^5Pomr=~0ZvP1*xb=<()$xcT_ZSSNO zBG5*%jZs0H%OmKvVevN;hZm=~-x>sMhnA7XF39;MrhO6Ay7ALYFKPp(Dp3w~GkJ*H zj=sR8-zo^)d4yaxtX_)d&iJd7Mc+pg<^L8ATkQSvuh8k2AE#%B&?|WcrmP_HL#492(P1g$*DREdStzsW z9e2eoA_Al4_|T&`|HGXL_w1t(5k5&Hc=c7Tl$Am*DQf zy>Scf5IlHrhtuD`_c`aTE^5?8j~ef&Uh8@0w3FLVe*GOoGkC;e*!phVyLiAd`V+KA zD%7mKG_<(OdV+kjyd`v5|Euf!c^Xr6oxX9vKGw_%iJyTa4fv>p&`?^i_j$>CYJ$t| zsI2#KFe%-O=yCBdP@p$LBhNUoHcb$chS^n!jLF21?M@_glk#@v=3mBjik%>6Lx0Ju zEcHGaRHv_gwv-fBQaqLg0T`o&xYX$o%;?46H!(7oMCcfMqP*orL&8iP+=Fz5hZ7<{ zxG^5^1kvye~6TE?%z$)mJex^ zBVFE2ZAReB#$~$TuoLSGc`4S0&-KT$e-Lvaxa~hIg^Pr zj5IdFp>U|W9pLKLWLa#RmXK3YIE+rob$g?TW*jed56N04LPx?90|;G>LPt;i+SVyi zph)6|X+Xk|&f$~$hs|kY0l{Nn{NVi4vK4ohrrah$C>jXEo?B5nrt>3F=L=)}k4Pig zH5Z57o-rLVBH7&}8-9$WFaK?NHeygVV=qK;R~8`6YnH7)lhW=Mk0CA7U#Zf^qA(cB zhq(824jvnEp{slM2oaeD(wA!Nh<5_z!#@cS#ELfKVIIS*vR5xh3S+I$L_%b5i2%0& zLfu?+S%jShO3b4L^RUB34MsIMS41^igI@DlxG2~l$l`#pse3^s+`P_NOOoy(h8$G5FldN3!SlRtw)VNgnAq^`B81R0 zuC1L>4Tb&uU!fUgL;bf2?cR&;9s&U&U0E1xkzu;K7YN=1jpu7qN=^2il))ImNORcf zMrO}D>@g*4i2xZUVb-y8+&Q=;44&)9t?({b_CM&LvB!FY(DFePV%H|Iea+;J*(h%v z2+C%nSAbZkk~HB3z%&A>xOWV~c@R{8D!EtfUfrk>4VQ^6f!TzfFQ(KyKf$O?G?w*oH zh2<}bUyvIFv%_$}#Ei7!--4?v=OCoCUpz#&%gsdZdE7tk;g>&Zw0-rTq4zFa*JR5?W^lB(p4OaO;|3b zf=RWlfju&~zeaJr(*8mjrye?_Z>)lzvOPPfS(7a-Rx6$;XR*?%N|M|Hj-F4|N1@^M zYCl)2J=JI~e_HC$@pH|y^L(D9NZ$5+u>jGVrL9zE8vJH8C<2C{bNz95*GZLCTALfl(72Luw%C^uZC42uv0YvtQ{7 zhG8-R7%~wzc!j>&X~s%oW_LY)ud%~g4I84^$ICwj@^7*>UJW}a%pDnaMk+3FKpDBb zp&%}Wf`em6)h-u`QgK7jV@8$^#pxft=_4XRet}n;Mi|A>y<~FAixFQc*TA#{m`WhpOF?P_iQREA}Z!-n&;~0>@r5rTvK4Zmnk4W<$EA_A8z1yF5@y zbKedxdpXLpGaOxAL8Kr7pG-3c>7sX=0RF?#{6R>h+N%xyhbUMs5!M@mle4I?+{x7; zOD`Yvb#rr@Ki2mtzTizfIIIoKZ zgbM1eCEBWEE2s5uSxRf^he-cISFUfU9p0rUNwvTYMS(SQRJ$XSMUBF?!_2&?ND#KU zUZV+yag}M!q1Ik}m^p8FL8l^TDa!c_J;^|gjLeSUn$YIyt4FvwVVf+;i$jscyZo54 zktgM9HZ?j?{UANe6eObx!^-1byZP7oh;{RK0KIVo1u4eP{9oa_D?A)5)h#P~9?2{& zZZnY1TYqlkvLI z3~MXVo%o{G$^vJlNGBLQI?;+z-o^&>vX7LYAKSZBs;A4$ol#{k<(=8d!Z<9z&kD0p ztF>#UmC3a?V$5p+L#$&G^vvUw$M&GV0V2;M`{5F^rO@w>|MPJyIpQEpYcEf&OLSvj zHdkKaSo;N!Y)nI-rPSISSt7OS7?A%3D@kv zySsb-8x;%1#Z%iK^Y#cLGLFA|0DH4wtw_l#3|VB=E@L((MlR1kD4B6w^lofy1Z)GX z25AlGP3S>V(KWJxWQ4t}Rk{X=4|Hjij#I3G`?5oW_P9J`2{OdSbs0q?sFxfAx4*uX zk?N4+(ybzU%#Z#V7x(*3ntrf*@k{!pTg<;OSA0sqzo>qx5(5fl=Vl{0p#yEgEZL=* zE|2O)k3Lg0JPHr-3jS%0^}!}dSWIgW0bTnxoQYdTvY@f23cLS(^j)hHmrMfm(iMyu zrboEk5JHgvXINEjOwJ7$MhbMk-2LVF6etL-FaC!_|5u6SoaZ;DhtQ-d6ICxI$JX@P zgl+SVc42HDa9+#t&rrdb&Z}sQ9}oixK_Pw7!1vl8Hn zH_I$BPCj+*#N3aKjBJj8w6-QfXe4~Cf>fCXmLf+EDIOY*?4$(8PgKndIBh0PB2$li zA&S{7i6p30-RhC4O(qG#Sf`c$btHgL&`i$cq>wYr%N|mQ^sEQhs>3k?j37+~EvFJq zpqc;2D&$6h2(q~6#e;Qm^`$Ph=%8uHqA9Sy_u^3aUm|G3*k%RGy)WSwZI zlSjTx^~l@iln$W5h;SXGUi}iPOLl{>Ssx%4kjw8e3Yf;r_g4TT>E`X_aW$c*H~uC} z!J!6I0{0`UM^<>!uy^RoPGyScE!yox$a&88WKu@=e+xfUBnZ(~HL>GmXD4cAY;;?Y z!|lk>oP+mSbd0}7l|7(>MDPxxk?HSO)0OcX!tcnb2w~75Zp}mfCX(WFk(a}&@Xgdy z&q=d$%9(rs(b}99d?{WY-$kC5E72~4*`iFBROCp~&&ZcU&+Tu5o~>N^(Ae<(cn4Xi zATT$+UE7;00S#z|sj$8@^;X8MK`CUUBmjog*?5aq`!-$pwrwMral?grq#+`8EmcDL zA?7bospn%U(eg(*cl!XPaHQG`XagTT-L9sVZjnuNHp1ebtFkC)pNb>NM zwp6^TbUzhf-T#2WU1Vw*i^V zTQet1?FjEc%?i|ckYB>%{F{DBcOWVQa>calA-w0{fPY(Bv=23Bu=jvl}=Ql`R=e=O=Jfo;hArd@MWNayIDL#8Cze0*%oXA8gJ*_g1goc!pJBJ1TqIly12W-4+rva2Ib>=r}CRq2Q7 zojO3wDh&2yAg>$65)Du_O4BN&8qFqzieX3&C^3hV!a6cnmZQ^S#?8>z2#`0ZAA_IL zQ5_H~6!tGq&gM(YpaMsU3_0JohYB-vazeQjeVxd8?%(ZSTW+vnK4E$roNHEtagN&9 zBzNhLS7X?S#>T^xR~a6f%H`W1I{JoqGnP!T^K}NAJI+0?Ez4e_zZ;X_QIA zBG{NI2ZQcRO2;@@a=Ie70Xtbpqf#&8AO8d{CKeECWozdZQV5@cjv6QV{|hR^T%3)H zli}^;x>&WwzU!b3FOVy-FU2QEr^dpfMIj^JnecgebvA+ge*e95ws2`6n8#eJd(;|1 z3NF?dWBT15^}q#GF<#9gW^6^k_>-bLG@X+>#e*b;nIwsbQz`L6UcEocf^sFpy-xt5 zZQD+=@PdvJJ8vLU{YgPct_w&Edg1ovnjT`*EmYRQ+BMQ=#zbc1tzMyhwn<4ka zTvG49R|&fXJS%>XyNzBW%Z9zURn*b~erCYe^TlC3Xhkvr=D^+7IX{LF(OOr%1a2#g zY8QbAELz57`N0DXuyZBok>E@!Eov$X{2)cMLY62O=k73jFm!V0x3-z-<6Q1O?18kW zeg?D{{_0I$ClzNy7FBTHtInmvPS_GLK_5q07jHUTk{g5R(w<^Q2eQ zkc}&Sj?Uh&u?ulz7c4B_Cwa`i-y+Y(1=~mq!_FFhL5F$XeNqq<0#VR?hV(^L^#%5@ zSP&tZEE0mrUx9N)0NP#viDxpZt*hbw+AC#tEU3NzKrmmD^PzH;_BnK&<543eHLCS@ z7faHSW$M?#Ap>?~sDj{0mt5Uzsxe~oLF$~z9rR=H8xgvI?}aShn_u0=#AVNd&{=&GV2&@gOZyoIe5>tQM10u(Y^K*psbK$ zAho}d(6#W_$fs5bZ&yfa00prd!A6E6-E$_MPIaPuGSX_Z_d}U|Mk`iwmq`3jk#0D& zoq_S5Jo){@CB zx5+7m)#OrH*Sj28qfayzLwprFDd0#dx4TGotK{yEmO`*W&1of))OZ2@p2L-q#^@C7 z_S-Ao1HO%%FM2dMT(Attu5^hFKQw+V*iMKo+dqUb?8SJsjc*kO5RT7XY9|*XH}x)T zo74Tv*ueYHl8PU$V@b2CO*e<}8#+eu&_{0Ns`14FKGz~dQ(xbX*^TlaB$^6Il*Ij) zD2WK+sA;6Ds*Z(=zvqpJ;9xEiv9+~5qsk2Ba?yW&el~z$AUoYp(=cKaJs5dh7mm-) zzC*eUTC`+h15yrdHOYS=D4r?PR#4IJ#h~{;Z3;=Jaj}$yCqJu}t3=vLA=MwoiBz~|+?fmkS zuH67v5#s0uADAfTH;SI#q@JGp_n)Vnew z_FFa9UV~POrM zn!hpZx=~3x_%VXDZ!*A&r=_ON+Zj8R|+%Z)yVDSg7tv6$&viU9{!WstrIQiOkv$5rMB8yM}6N! zlpOr1OGdWe1psS!UHHEmc)%ak8`4WruLn*5-Cd^vw$~A-UdR25@tfUBVOGcBdT2^l z!*D=p92k1`?Qil3P)FU?@tL|L8kD0$zQggdv)QPT(CMaKzR9a9hXd%Rm~t7*VF$9F zcmf^$i0t-s?{rr?-D^kop^fOwZZNV&WP0$w9W$K-}Y zYFud(E-*0+t!3>qniQB5P20Wa7JUHd>d;(uRT5eB2v&vr{K#Uh^Jqa0!5mB z1%%CPBRcpe6OWW$jr%` zPln$mME}91Ix)Hm6dUTi8ed;y@pGJ(yrJHM#lliZw@gwthSwsUG$TDZ1j+xoH>K{db+>c$Sc zuRkeL9A!XUCfAD6X=8R835fqF8muw4MPuamtx1%MpE3^|lXv)XgsivoP~h+L8DZ3b zYW}mlyTfZ`*RFwB_Ngyif>)RIGtRcka6&O@?1Yg^V_>`t$dhTe*dl-`wZ`UA@7B~K&*92|G*C2e4*pemEM%GW6$)n-d!E1PS zE#Ig^lE7WmH)mj}N9t1@Iwi}#4SxAU<3cV)cH*@W+wgB5(ti97burmk08YglaIzpToM@tL z_sY$49n&z{x3W_gBv({P-zNJYn`tAUW?Z2E4Qo^^$?z0&v?I+`!b><$A^0>oRE$4T z8G_J(x^g=d_H$T>&$*$raQ{tiY599VgtNqwo^cp?AT6WG7Y~y*xl~}p69lR7Ki+{T zd_4h0@*SkB6{jNzfjKg5GsfyDz*svwt2FF7j$WHg5)1ig;9^=lEXr12{;z_*9`Y$u z?Q-kf*{S<2Jeecb_Y9ETW$5hPbu`y5By?ltzk*Koa&;tJ;uS%`?Tlpzkxs_^C!Li1 z1;mVe#iCXuf8Q8lJoj1QI<2&`-NY)xj?r*;q;vb8jv4=YWBlPSAFoO;jx}eQzTv39 zKdjKzH-c@Bfy9>-XClj6vJwwfm`EYcQ~0ZC!a}zCv+9*dqvLPHtpEc9Ad&*B?=ehZ#l$Oqh?c^53S_(*)!Dt; zK0B7h93s>nHu&S6RvqTK@{&xWuT6309nZJ?Pj`=^t9;B@hAC9IVeNN@iIAt!X6>xX46ONO%Q;Ms5RT6J%{NNz-svg7%`(&5k*2X*U zQ)(tuHFOucv9w|$Mz>qpHOBxgFJm@*WmKJ^Hg*!4@aK6Zu|lUV5N1`Cqc3yIhZyrB z2UbS}-s)t^x=E0oeV0KV$-u^;-NGZTE@JR}Ph!@mp3@Rx`p8%QD#FaGf(QnPD@jz_ z;ip8C4KAg0fzVO*;U$qmQC(gv@r1_73Z3(Zo-5_Y#F-c`%?tzpGzQ{hj|MeVWa!#p zI3~J`r5;rIcHW?twYK25=`7!0mR#wr zO=sGT4cm+0CZ}9GKGga|@`aJ6W?dmbCt3P+5)C*#pgs_idm6+?; z>;g))EHd$`Q9qmc7?Yn&Dgf4I)GUm)?2ZIgV%v5Bx~X6he4~GIufmTCSg-MdI^BQZ zUPxlLAD=>WicOYkPGjwwbfVnqxqrDA)bgJt@7HlI411gU z$R3KL;YmYMH523SFRZnY1N1`c-qP>|_a?D7VKLL~t;9_)e0_X2GC8aaAOOHeD}?gz{O}k_XAe`W6n~03BTpgAx}=NrGFLfX)f6X1D~FAoq1sDojI!8C-ey5 zU05?EAr}IBeKEe~M$gzW{XD7vTgXLS&qvRO5Zu&2Tn0$w?TJ)PVc^a3JiLT36fG3X zJIwr?$!L&FoDXI!6cD?f{Gccx20T-DP&|82@fsPPKWp1a}W@J8=44Mv+ zOyuSiu5}0>MrM=TWFx!ml;yg?Iq&cfyYF@NeQI@jnZ@K_x;FAw#`&9?c*hB)Y0pIC z8pVAZy6;vj+uzb(1uEyaMRtX+KvtU(`Mw5xsMy9gCQZ5s!JqdJJl_w6C}$F5zSXMU z`*1~P%c8;_#`iYhb0HbrJ?xPRS9oQ*Bb(|T6XLsH=5(4aWgIkGGvPdqawT2_znXFh z2ny~P1wM3vp4?rVXwJkS$v89Ti!=>znm9>L50%|M2;pH#z$#_uEveIEFPXvks)f+Nkb?lWFW_#f13yzlDl^j}`%8Fgwt8KQ~70bBvup%pGJ#f9ukZovmR0TZGnf z2pw9r0gB7qoe!Tw6pX7>tjt`+sg&|DVd-LOF!4=}cb8f03ez45Pi@cAnng^WT%5)n zwx0sI!#}x3AhBPOjV%bW5zJf**13~_q0)kZC>O_sobo)kJmBqq|C)=1s}PESeTc;p zGe$_R_FiB5%qD&y>+5&@LW7ZGdFM@&20m`-UyokbnV(>vMbpeTw4!tg7TJibq|Qb8 z#f*~RL!hr@q#faTY8Ne};#`!6*Iab2m?21o&z~b#YA%kfd6<5Btm5O2w6Q01xc?n& zbN-5x8K%z)>zXD>gC5>x?;8rS@-^(9Hqv{XM(O_=t@ig5U2HhNJIGILc%xQIfUB)9pd zSF4O}KMrkUd*M?3dS~ZYeHoz+hKxDJa-F1f`u?x@Sgep#uu>}3l5De=oJ8-kFJh#6 zE%{Rezf{XjhfjB(Lvvoe6vQu07sbwR*S(xw`%o-pT$UfLyq0_yIHm)5W@miZy$BEz z>fkCwI?mJl9Aq`7B*ZUVws5cNDN($UTWhn-!|MR1B*@ABig>p#&SEZ=ado6udJ0+W zwH#{%4&2?(bcA%u-`-j%T~Usqr#YpC5gR5udf88RUxknh&FVPMYRvkN?7HA#^oN#ctG6 zz*4`;prAj_a035tsP6?s!T=LnoES!?Th-vT(NZl=zW(EI0!zDRGjF8#B=BOE*9r11ytd`92d8$aZ3|agqFu86{)Fx`7 zw4XG9A8}tH72cHuC^}akL5O=iTLz{mX)GT88ecu($?uB;=la_)m21hNJ`di;KNdmi9wkCfTmDN4Z46yXut`H5)f{Iup^ zfz(sjZJw^X2Yd7bzpAE^({o+gPNv}lyY%!n?9{etPUw9F%7QTur~NDKEPu!ISgzbdugkk zMzYG0tFl^$Viuwii|~Logc^Y_5i(pK80SawiUH2BB$)Is!)Pp{(08>=biT-LNrhyT zU6XHm=b}qdy5=)+!nA^C;}F-*xn?P5b{7TxykKxwd{m!ej@ry?D1-4zLoBrcn|c_|XY#Ml`-z?5QPZGFJ_?E>L>AA54os zT}^Omi+CViqhRmjQ+g_|{O#J%&c6Ya+A5`Xcrev*YU` z!MjvBSX+PNu~QbLk(duW!dMZ8AtPyze|h%7VRRVg9z2Ln)~?=%mZBi>E-|hkr(Vs-$CF?6w}hXTgt;9W%spjqcva0Z2s_aU9iVYHq~o8%h^6 zb1%pEF|nUEdM{=!%W82nu8y`f420l=lNx$T=N3=GU{{9F92o;$YXLc8F*5kMByQ@_ z{(i@LoiF?N5pk)jN<>QV$rH@Q~#LCKHAtaRJ=%J(kAb7^t@fo$x9cw zn-bWhxXJ-6%V|?r4eOaI5)E77}eBq(UbJ_mVc`qO&Jq-!QMPu}| zIjzg1d;wG9Mq%IgC-wp-Nzir2{9ZVP}e%c&VSib0XKt)1Fd&yM9SVF%!0 zkz7y8{9Hj^vGK$IG?yk7>+3xBX$d-Rms)0dZ=Koh33MJ(Pq3Cz{M9N@pFc|^Ss^#? zd(*S0eS_-yHDNYSGy8F)LXqeXE-EEwukKQm-WFk8G z3L@?DK%4w)DO4vc$r&z4-!C465!DzaVu69t885&VGnd==ZK_4I{b6Q7Zyd+onQem} ze=|YJr)MX8WM0PL!8vu`DZ$%oC4|kjH_00DGFG6;0*Iek3Jey63*CEsY;#!4_yC`> z{G~*&AmfDQaRE}dadWuS5FmA|=>x+BBt}*KOgrLI8fix$@-AXRK`hTE$9ea|=EH~oVqIBB=bEDSqQ(>unoH9#mDTuAM7WdSG-3HEgNbys3wu zjCOBl!RsSC^@mn+C4(9RQHgISd=^5cN>T9XIWZ?`GOcoMQ~3giIu@cU`*Cfnd-iUU ziv&8+d zZ6dI>{-sS+qcz!EHwLIB`*A3$5kgOJ0ZFlkfd+j+pfUOv3YD=!O-&n!hKoo&01+I8QRnIf<5#f5}att`!YVn#Wwc`6w@ zsh>=y<0MBd3+PPWhNiUyw%wI8g(Eg*-=u1L_}Ak`Cp)@* z`)BsTE2%{gu30mSZ{({@T3mlEpU3EJ*={FiqTrTBQYp{jBfC6B$fA6>pu@7WPf%}nmDx9+{yB@R1^4<)8?Yb7ZqRiZt}*- zdWPdq&)eIP)-2jv8jBR#2Ip^s~Nb*kOgi&?mY zI;~YjKhpcA{LIXA65suRhdaUib8GD%hKiXX&WYTc<( z)`(H%4C&qshkIw!vwZu9;Tr<+7peNS6rNXd*)ObtFKvX_V>e}icZ#VY0LjpTwg2DB zDOm0*zX5s^h*c@+PU93#T{I$eNW|czxc?`TQR{B}6LWuqW2V=U;kPb=1^VfNrgkKd z#qEJ)`-r6Dqdc?v=)jVIpk4iNBI9|>->VL~eII}JwdV3wbh(hk)n*2%G=uvnhRJWa zTZUO>e8$LoqWk`kFD^6S;h@f6hGn7Bz(FxnpxG&6$LrGY#Xi>W2u@`FX>hiGLW)W& z=64upbtU#NoJToYXfJk}1pCALeD7=cVpVCSf;qQw=oPoNvA(IC24GqVfTGir{)Boax6ympFS$TMAzxXUA1e9LFSh~Q- zgX=*Z+TM8g#r7-}@hor}1)Lb$T8erS*lZlC;HGH2>1b&CTa7>nuSKu;J7 zBUh*Xax^0Ob^gpCGeCWr;!O$W+?rnE2rL3LJctDqhFw$IjLSM|RR)48*yp)qtz!P= zB)13Az%3%of5w%P?4v=e9MxOQywO`yqa;8lI;ua{%IR5|B)cuVs+dV5Z* zs5d$5Y1Lf{zyh|t`fc`WeblAb*C1J+(lyO$ez*8aSH2uA;wvkgyE&&@vA8>JeEk#B z1@ot4L`|id$%8RcnYhH>2V(F1&WC@47pdyXthl-<#wWsWv#c!d#OD(1=wD_} z+&le`Wb46q<)rhTG)s>jl2d?UhYM<`#L)tDg|M zAFS&LeohrbX)BE=Mn1W`Y#L3rPz%GcP0pKKKI!C=^+0CrYT7?l6z1K>ku*svd8fn1IE3LkEq?J+@-bO{-ti!+vK- z_2$}^I8#Agrm#S7E0XS4`$x+=D_rp`1H++4h)^10+%1hEwLsiL6l5JNsZW>fdtE%a zh(OdLXxq3`^1=zF^A)?_OD`jRG~GCln!mlPM7m2Zt8bqmC&f=A_lc8mIe=L=Pm;rp_ zpP!J^B&{4(pA4hJQC(_m{<(aS~DiECda#y z7~^t6tP6vZApKVQWzlMZa8l*Z?g%JAlnp@o+q2}>(6D7Ot|5z&DOi%=@tJCX*Bn*K zC!+w>b;Ik(hn)3IlV+f!xcv8c0(ZVdIj-#adVyVpdGsR5FvY{yaWPqb%2{mx;A`B) z^EUV`0x0oB+O_PO1~J9se412sO4p3%FDI9TT=IF!OA$y!EctH+#Q8m@ll^f7E;BC! z?hUC;V=Y0oIoN=Cjtr56u}g|i);k_zy&-}GnY*mhLU(OBr=*Uhuy zU)Zv8osAZ9N{Pg4vUwoYyu7L7Mx{`CS+`lUT|tRTp2H1^Yh%8G8`0p4 zRq}1r%F*V3@r&^Nq1|QL7-z-1#d&uF7>)I!FlMO zn%~|>{Oh=|8_LI6`g@T;;Dv*yePEG*%Q6ckbv)6A4dFWu9QXyPhIpP`k^y*VYhF8b z-V7}Rwk0PR>B#2OO^YOc&)zRYY8=^DlHLH~SZ^niUn`YPaO|TtGn94$U5CLA>2IB<_Aoz-A-K!JAlSS?xJKik3`-wp3cC6nZLv+Bv!<@#o;j($~B@P zx=nkG;{MS>ky^%2i2FL11qLy3CTSwarNh!G+GfN%_5pZOM&h?@xG($p=+HiL#k||Z z>YU%lNmO4{=`dvpw_{^te!hNF?R4@C*-`vNZiL={REHj?_hPu1dgZ#jBcz22q#KE^ zR65V?mR4Hp9MApjeJr066h_g9gcxlgAyG7J_lr@RY$Yf1jn4dTZjn1%ADIGrL6PT`y!J?2*LfNhnX0P^hl~;KwC2t`txltRQ1Sai&5!rDkAGGW zB;Qvz%hzwil*b($yNK7e4<16^^O7Og80?PXJyZz5&r#MGMVbk(8}$q>-iDC@{wlNO zJW0IE!XV!&YV6>w^jk0k(UiRb6aWo_FP_&_?I zFrQbsLZg6c0R%!&bJZ!{&!TeLhpO^BBzkJk2(!}RymCO9rEEUm!u3Gxl4FzasZF*` zTAnISBsvLr1qIsF#gUNyyJ;|a;qjRkU^D)~;qag{;t2zzwmr8`4G2hP2Nc>8mXjsE^hJMp?tlY`IR*$pGA z6usNYz=R!Uf?-`(d&+kMoud}vmPWy6C}?xYf*uVMyWXs4`ZcC-;p(js`n{zWK5hP+ zy5Hd@Ev2kVD9B^o)2NK)DyBm0nYiyWuyV0k6WpU%cyeSj+;fKFa%Tf8x#Ovb=# zgq{e464XV(cBuLyHVKR*3yl>kNlTA#rrg|gw|>~I_~~C@=O&2?@_@X;b=LHwO*L%m zlU^e<2k(`nfj`_R{!syDw@O99D(Jtd^a%VQHgKdcQZPD0*Rvk1`s@pptx!w50t`(6 zF*(*$Gn<_00e{-E9zqEr! znp_8x%;dT2!65MuBEE%h_bpV2hOGmM2GFLnZ|2_RF&WgRtg#yO|E7WSJxit@AU9u&?2;{zvE zN#xXqX^W}F9LV^u*rHwQ3v?<0cm1!iqu=7r$;8@71ezHi-KIRJ-Ov6EUyGak^w`H? z&P^XmYUd|6>@%>_ z1`h}X+Kt-NGcOuCRg|yqnS46f3im<3BRUbl4p$K7TQwbUsVdk;R#V8R4u;ReqT_B| zd8pDFbi~f`yDE8_j1lx-TT6ynh#Ns2&HN`$MuMGJk>bS=X+wdzUsa}@10c17J@5w?f=G1ixqfD83BTC6 z*WHQc^2*9zNZ)s-vZ^Y5(k>QhAwHeO&{e?mqSc5S<&@Kb-c@aiqy=?1T*gFz&=(t zk}P;!w99(hiI#;crrE@mOe)K&b)Z4>UG0B}( zP2})R7rMYmVn>F``rnU~NsVl>Z8N^)uS-5FL3Uz4tw$QqTGkW=u8Yq?CI{0?_(z^y zYRoAD%}FMH+j&U)UU5FXXbd^LiAAtdb@nnUf8F~L*E!v=kw8tQhw5KEr~>Qu=xP?% z+rL%&2rFgHDKCI(NwhD&3FtkttEI!diW&g90n5#gLa(~|l;#bR6vkB4-`X83focvx zUR)QS!pUSZuha46_IwO{5@bucC6|VrwQ{_%6C|ns`wd1t`mrI1_jx__NTfaSHM5Qu zfdXbNVWS8)H!`{J?9>{uU6>#pXp_=S9^QkzN7)3}w$*X(tB9zt3l~T}m6>I*QVi6% zKOgz`Xy6DA)nCzn@P4v`*72&|i{OY+^?MYX!^Xk!-en6=S(nBQjHZIm(pTIP6XfRM z=|sX~`77(0yAHv;!y-m$aEL3kHaE9H{1hGM>#d!or8Mf&yI72wSbLdIgUQENm(+&| zWV?J`FW9s&%@-NTdSS2&uYc6$?IMj0Xk)Dd2-E`=7%}Y~Jxa07cTBuoDrX(^nbuGj zii-F1j@3GmR?J-zGE+(4I5844p9!x)V5d`h_*DdgOrQ+-gOsvTqfX)J=OmUXfc<7V z`&(-0Z@Kj6dWDl=NovY@DJaZQT2%r4C9I6zZTkTYp>HM3qnMd^Ln*kf$$0d>sVxXE zzeL+R^bGOcCj2d=Cnnk?Op(|~n5Ry86f$Hpv*btfIb|J?jd@Hz%46>49*%XNC>%A- z+ifzMBA~{U_pkn#DYPsoGonU#O|sc2%Eh5X*)E+}iKL{6 zPn;lcOk=k|>Hpeke9-6#kH*AAM8Dm$YJQOVL}CwFtz7TDid{|K{l6@L?f<2>{$D)} zW*kIKgB9n6n1hxdD>*SN`E2ZOssE4cy40@rt?E_UguRfKMfMK>k5!jj?FJGw@U6Pk_68rim2gas>MB|-obB#!xvom-%Rls zDto5Cw&S$V1sl3%s{|1KTHqP`zx%xZAjldreOL(hPc6Dmw(LvJ&#OoCZ`Z&fc1PPYk{Uh@`Si9I_{t;pn13Xa@;hq{+!YvK4Ox*{ z116f)Y4X?=hcqx5^%C4)>$wBN9{X})n8#t>E4W)xZ!U;s9y-XSA{-5K(CYe5);D!CBjOY-vk)_B zBUu%%0P-fIA)ri6O{M3M{sxD3n4ll!PF32vXLT5B^8Q2T!42^0!>8DfXmFXBOJ+#; zHVXb6>}Iv?Q8f7Zq87q3t!6A4X-nPgZk&l8LKsoIW`%u`7( z1PHVhoRPH=@ur-+UK@Eb=85@a&M$$68f7aaz|8$7U2rgk+d>f-^{UZxvlW7C_`2gs z%+Z@meJZ(Wq&n(wEA@j*F)KR@KAE#s^(Co-9_DFGMKs6zY2j99q``_a5QrfwtggBx zB|5x|0HP(?TQTnWyZ#yKHTUlJHly;hRHE|#-e|H#bbKPB?~oxUu0~`5J9+|oA}H!9 zt{pYmUL(sM)z{aT`L{yBTI}Ti$s$%!e&gpnppn+9CEyq6VD6i@l`*60?we|AfXvyA6g{(=25Lt-O1PPjLjc7tqviQW5b~0}zW= zua%W;mIF>4iqU>?@PpsxjZNT-fv&TY!qkc}U`{e~wg$(=MSWklom;7Aqlg{U!6FbC zOO8wUr=yg4MGly68r%zMA3RK?idd~oPl8%wn>$bY)@Q#!6T_>r!4@3%)XL(fYg? z=AY_b`LAho_`Wvf8@>j7{|;_}NN@NI*UOaiJu-w30lA6UZgx>J93fcp(FDS?F=hV` zUFRHK*S9_T2949$M&rh|ZQE!XyWxp#J85j&HX1u8PGei|^n35`zWd&I@6Vm=Gxi#L z&o$Tdhpif!fMo^ENmnvlqKuo3t(CJWp>;FzC^k_bm42FL85t}jp0Dus5qXh(9iOo& zfp5^$i*D*yYz%n7&9@v2J1DY)XoSuKFheS*m^^y2!za6_F7Z2CKr5=Qx1h zT2V2<#>%?9{M8`V!r58%M-WrUC|j9CbbzlcMg>{*VD6jx6Zt!3-BhVR%N@dT77eGw zV%l`U&n0i!C6phz`$yL!YHr`^ZJw4Q0Ml~Qk{3S%YD}*bKyABELwFHSqynawgxC7QRvf!IP$-S-N7H#bP#!v zm4&vjXvnp$*zg?&Ee4k;U1Z1GAo4TC1i=J}A;MxQvxY@b-!7Tj-}mXhlB*@?@^Cw7 z`hGcJLRa<4V8|v)5L6uZQfTn}RpoP9*UeVzrwmUPP!KJv(tjOS;1Q1@^y;%Ky+ z;d$rqt(nkQ^+P$p7S6N!-9)CuO%?rY(YT5S^Mvk4!#j%aRE)8gBZ z-D|L%b!;sE_g+jey?uL%reD8EJRQhLO2o?O#5F9HXMGU2VMsn-sj8})Ru@!ShilLg ze|(4P)kWQ=jk5~tLBsUgS?3}PAJZ*mqD8Di=xfrInk%bNG>zn|qfsRp3>(6ZK>+0O*?4Nh@dY(GGn6`mpT= z_^}TL4`c;=SUx;10gM5YXy|#GLb;-X=7`a446oZnRUVliMpiJ4**Htq#vtsU6=)8A zgTYBJvB8mip5ybRPB7K=w#?5rkU{3U8(j!=Olr!|AsaEgHdn#YpXPSW4%EA zo9EY)75M4EU*PRXVdF1R?5`h0=y}Q%VchBYVC!V$n+FYuX6U%|{|9p#>i7oYZw_3a zt~QQ`4y!WhwI)0-G%x&bTj=jIKvhfOAXqyShUerG*EUQpvN2io>2mQS@uw!k$k}i# zfagu;qY>gzq*aWA7h^OXMkZR?9~D_ra28GfF?1{}9RRen__bktWM3RmT3VV;z$e$A zH>|>mZb~ephZ|&qC>1f7dpaQ)s%Mq@JMN7SuUFuu7rFCQAE*3ckziL1C-MQE;%Hn=U@FwS!sqJ zx*j^k2Qbjlv3v24a)NkE@QFPBkT_va0waS)c!ltk_p@AQzbNN{_LH@-mcoz}BcKNC z(n*qTMo(M4O>+2Y%IAfdkGA1f;zL6g1+=czzSbW`6Ih@X)9^CA^;X{*!yTpvZG<;& zrem~40dD`U+?Mwr44W+QslI^oFNQ7k%PrpWz+cQ`YL|CyFoN*th*hH~A*Nl2ZHj2d zYm2lGMjB$y1X_#(^hV4{i-D~OPTt?c z1l;=bA@H~+4*x@9`@bN&|GLx+7CiHmr+X2%?G)u!&*D7jD7}OG{)*Mi1O9Q&(6yEA zakLgO`8t$f;A-#=%yGsjY>WVk`J`rLHNw>RS(0Ax4?_EaNO{BXmK^-PUg1dKu@@#L zCegJ~2I;EzCs;&*#u_x(0c@}z0k!Npp?Y#E-32305EY;VKsWzanzkH)osbLT(IZRS zDn%ce#`9Flkw^sxk)G~X>{ zO8fU@#U0_}Y`4Qkb>}|Rv|cUq95c(h2;lufSKp%YkVRCFVYeReW zD4ApiXedoSBu?R5Z0aZ2)qyBxquC5(kH! zjm@mvbBBpWmgy<}$;8xjV2m`pfs)V!+-hDpRUoyzmy42e*n|M1uo8e{ZQh$PaG>-&;pD*#E~lo`HS z5;18f27;l+N5rHkT!|6)te6lOWK#3>aKBqzTU_pPIhgc-(t3sjTc^XW;Fp+3C6qa^ zoN)qTj8%N7|J*-KbTybZ3sJEPpa6A*WTSCFfn*qA5o{`hU=63PXzi-@p}M5NV6?(_ z0N}tw#>m5g*63dE1g}Jv|9<@6#{=HnL1J}Q5(Hii2=Rx(Gn2=>@+@#wD zNcg)XL_w`NmvS?T?GFMsy)Gzvbq^V9KAQ|R4*w*mF}`Hsd_f05VvidVOb}fO>}I(K z8@_+CIItGb7`DU5ZhCYb*y_{K8$kLK6#u5paE`p@wY}tVHJru*>C_0~?n2pt5W5Id zAS5JqX226!vK3!9p7cLEm=XN3yS$>J0n`2;#iJRzV~P)qCV#&Ng+ppMX{f1d`}n4= zdO4|*p7J|7*57Y$Bz&d4HsRsmFb|PpT)Y^IRR4NKh7enav7E-=W*xfff%3807~#M$ zuh9b?5HfW~06CQbbf&y>Izj!jip)XKHV^q{Stma${^BT8yKXF`93WpQ*qI3aaMXnT z<(D#@)ovny^F9r@b6-Gy-SKv>`PM~NM|LqcH}_@u9+Gf7DHIa+VAzE;_WovATv1*o z;{DRP@gjg3XE=`9#=I9p*44Nwf5ZuBne+A)v6NB4^27`} ze$L$8-L(?EUxtX&_-w-)*n8feYFQ(p98Kp4T!03^Z~XNdQI3hcZ)O*sPU(ANVq66+~GA9&|P*^f>fjO!=SL_dGO9Sr*b zM0T$OfY0y`V?^(z?e_!q^p$n zSU?2PB9ita2xad|w>iY_&(PviL?CSf{1STi7odH0#$fPlS)(>u%FgUUKQeC+xe+L4ku4ex+0d0Dw&|#CmIP`(rECHEtvYx@=@#05P z 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

v(0U&o?1}({jF{6#m!YQ{?}H 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 is the module name of users' RTL design. + +.. option:: _include_netlist.v + + This file includes all the related Verilog netlists that are used by the testbenches, including both full and formal oriented testbenches. + This file is created to simplify the netlist addition for HDL simulator. + This is the only file you need to add to a simulator. + + .. note:: Fabric Verilog netlists are included in this file. + +.. option:: define_simulation.v + + This file includes pre-processing flags required by the testbenches, to smooth HDL simulation. + It will include the folliwng pre-procesing flags: + + - ```define AUTOCHECK_SIMULATION`` When enabled, testbench will include self-testing features. The FPGA and user's RTL design (simulate using an HDL simulator) are driven by the same input stimuli, and any mismatch on their outputs will raise an error flag. + + .. note:: OpenFPGA always enable the self-testing feature. Users can disable it by commenting out the associated line in the ``define_simulation.v``. + + - ```define ENABLE_FORMAL_VERFICATION`` When enabled, the ``_include_netlist.v`` will include the pre-configured FPGA netlist for formal verification usage. This flag is added when ``--print_formal_verification_top_netlist`` option is enabled when calling the ``write_verilog_testbench`` command. + + - ```define ENABLE_FORMAL_SIMULATION`` When enabled, the ``_include_netlist.v`` will include the testbench netlist for formal-oriented simulation. This flag is added when ``--print_preconfig_top_testbench`` option is enabled when calling the ``write_verilog_testbench`` command. + + .. note:: To run full testbenches, both flags ``ENABLE_FORMAL_VERIFICATION`` and ``ENABLE_FORMAL_SIMULATION`` must be disabled! + +.. option:: _autocheck_top_tb.v + + This is the netlist for full testbench. + +.. option:: _formal_random_top_tb.v + + This is the netlist for formal-oriented testbench. + +.. option:: _top_formal_verification.v + + This netlist includes a Verilog module of a pre-configured FPGA fabric, which is a wrapper on top of the ``fpga_top.v`` netlist. + The wrapper module has the same port map as the top-level module of user's RTL design, which be directly def to formal verification tools to validate FPGA's functional equivalence. + :numref:`fig_preconfig_module` illustrates the organization of a pre-configured module, which consists of a FPGA fabric (see :ref:`fabric_netlists`) and a hard-coded bitstream. + Only used I/Os of FPGA fabric will appear in the port list of the pre-configured module. + +.. _fig_preconfig_module: + +.. figure:: ./figures/preconfig_module.png + :scale: 100% + + Internal structure of a pre-configured FPGA module + From f079c61bd3f7111d2870464643a320f31115ea20 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 24 May 2020 18:09:48 -0600 Subject: [PATCH 077/180] re organize tutorials --- .../manual/arch_lang/circuit_library.rst | 2 +- .../figures/Verification_step.pdf | 1300 ----------------- .../figures/verification_step.png | Bin 183723 -> 0 bytes docs/source/manual/fpga_verilog/index.rst | 4 - .../design_flow}/figures/Layout_Diagram.png | Bin .../figures/fpga_asap_10x10_final.png | Bin .../figures/fpga_asap_10x10_floorplan.png | Bin docs/source/tutorials/design_flow/index.rst | 10 + .../design_flow}/sc_flow.rst | 0 docs/source/tutorials/index.rst | 2 + 10 files changed, 13 insertions(+), 1305 deletions(-) delete mode 100644 docs/source/manual/fpga_verilog/figures/Verification_step.pdf delete mode 100644 docs/source/manual/fpga_verilog/figures/verification_step.png rename docs/source/{manual/fpga_verilog => tutorials/design_flow}/figures/Layout_Diagram.png (100%) rename docs/source/{manual/fpga_verilog => tutorials/design_flow}/figures/fpga_asap_10x10_final.png (100%) rename docs/source/{manual/fpga_verilog => tutorials/design_flow}/figures/fpga_asap_10x10_floorplan.png (100%) create mode 100644 docs/source/tutorials/design_flow/index.rst rename docs/source/{manual/fpga_verilog => tutorials/design_flow}/sc_flow.rst (100%) diff --git a/docs/source/manual/arch_lang/circuit_library.rst b/docs/source/manual/arch_lang/circuit_library.rst index cde9b5fbc..e483728ed 100644 --- a/docs/source/manual/arch_lang/circuit_library.rst +++ b/docs/source/manual/arch_lang/circuit_library.rst @@ -339,7 +339,7 @@ These inputs are widely seen in FPGAs, such as clock ports, which are shared bet The global inouts are short wired across different instances. -:numref:`fig_global_ioput_ports` shows an example on how the global inouts are wired inside FPGA fabric. +:numref:`fig_global_inout_ports` shows an example on how the global inouts are wired inside FPGA fabric. .. _fig_global_inout_ports: diff --git a/docs/source/manual/fpga_verilog/figures/Verification_step.pdf b/docs/source/manual/fpga_verilog/figures/Verification_step.pdf deleted file mode 100644 index 3c3d3b655..000000000 --- a/docs/source/manual/fpga_verilog/figures/Verification_step.pdf +++ /dev/null @@ -1,1300 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[7 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - Verification_step - - - Adobe Illustrator CC 22.1 (Macintosh) - 2018-12-18T14:15:37+01:00 - 2018-12-18T14:15:37+01:00 - 2018-12-18T14:15:37+01:00 - - - - 256 - 148 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAlAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q888xee/zGtfOFzon l/yZ+mNOtY4ZJNUkuxaITLFJIY1DxsGblGFqpIBI5ca1xVLvL35r+edS07WobzyXLYeatPkjjsND kll9O5DKrSuL1oFt6IOR+Fj0p3WqqVRfmD/zkSLDT1m/LqP6ykkI1G4W9gIkjCIZjHBzqhJZqVc+ HY4qlXnofl2fOmsnzHqdvZ3/AK6cYZtSazb0/Qj4n01miFK1+Kmcx2idR4x8MEx8o3+ho7V1+uxH HHDLJGHhj6bq+KXcknH8lf8Aq/WX/cbk/wCynMHi1n82X+k/Y6r+V+1f9Uzf7J3H8lf+r9Zf9xuT /spx4tZ/Nl/pP2L/ACv2r/qmb/ZLin5MempOuWXAkhW/TUm5AFRy+s7022x4tZ/Nl/pP2L/K/av+ qZv9kt4/kr/1frL/ALjcn/ZTjxaz+bL/AEn7F/lftX/VM3+ydx/JX/q/WX/cbk/7KceLWfzZf6T9 i/yv2r/qmb/ZO4/kr/1frL/uNyf9lOPFrP5sv9J+xf5X7V/1TN/sncfyV/6v1l/3G5P+ynHi1n82 X+k/Yv8AK/av+qZv9k7j+Sv/AFfrL/uNyf8AZTjxaz+bL/SfsX+V+1f9Uzf7JdKn5MCRxJrlkrgk Ov6akWhruOP1kU+WPFrP5sv9J+xf5X7V/wBUzf7Jbx/JX/q/WX/cbk/7KceLWfzZf6T9i/yv2r/q mb/ZO4/kr/1frL/uNyf9lOPFrP5sv9J+xf5X7V/1TN/sncfyV/6v1l/3G5P+ynHi1n82X+k/Yv8A K/av+qZv9k7j+Sv/AFfrL/uNyf8AZTjxaz+bL/SfsX+V+1f9Uzf7JcifkwVfjrlkQBVz+mpDQVG9 frO29BXHi1n82X+k/Yv8r9q/6pm/2S3j+Sv/AFfrL/uNyf8AZTjxaz+bL/SfsX+V+1f9Uzf7J3H8 lf8Aq/WX/cbk/wCynHi1n82X+k/Yv8r9q/6pm/2TuP5K/wDV+sv+43J/2U48Ws/my/0n7F/lftX/ AFTN/sncfyV/6v1l/wBxuT/spx4tZ/Nl/pP2L/K/av8Aqmb/AGTuP5K/9X6y/wC43J/2U48Ws/my /wBJ+xf5X7V/1TN/slzp+TAVOWuWQBFUP6akFRU71+s771FceLWfzZf6T9i/yv2r/qmb/ZLeP5K/ 9X6y/wC43J/2U48Ws/my/wBJ+xf5X7V/1TN/sncfyV/6v1l/3G5P+ynHi1n82X+k/Yv8r9q/6pm/ 2TuP5K/9X6y/7jcn/ZTjxaz+bL/SfsX+V+1f9Uzf7J3H8lf+r9Zf9xuT/spx4tZ/Nl/pP2L/ACv2 r/qmb/ZLok/JgyII9csmckBF/TUjVNdhx+smvyx4tZ/Nl/pP2L/K/av+qZv9kt4/kr/1frL/ALjc n/ZTjxaz+bL/AEn7F/lftX/VM3+yYF5/k8vR63oX+Gr9LmzOoW6u8F410pDV5rzMkld+NVrndeyW bPGNS4o8WWIP8Nipc+Tsseo1GbDE5zKUvX9X+b3/ABfXXm7SfMmp2EEHl/Wv0FdpP6k116CXPOL0 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 - - - - uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 - xmp.did:9f41edf3-0dec-4756-a203-f280702f55ca - uuid:f06d5b60-09aa-4341-86e7-81aa11cef064 - proof:pdf - - xmp.iid:3a5d0884-4bc5-4a38-9606-8aecf1459763 - xmp.did:3a5d0884-4bc5-4a38-9606-8aecf1459763 - uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 - proof:pdf - - - - - saved - xmp.iid:732293ad-e525-4cb9-91ac-e00c5cfb6e9d - 2018-12-17T23:00:02+01:00 - Adobe Illustrator CC 22.1 (Macintosh) - / - - - saved - xmp.iid:9f41edf3-0dec-4756-a203-f280702f55ca - 2018-12-18T14:15:35+01:00 - Adobe Illustrator CC 22.1 (Macintosh) - / - - - - Basic RGB - 1 - True - False - - 1024.000000 - 599.681067 - Points - - - - - TimesNewRomanPS-BoldMT - Times New Roman - Bold - Open Type - Version 5.01.3x - False - Times New Roman Bold.ttf - - - TimesNewRomanPS-BoldItalicMT - Times New Roman - Bold Italic - Open Type - Version 5.00.3x - False - Times New Roman Bold Italic.ttf - - - - - - Cyan - Magenta - Yellow - Black - - - - - - Groupe de nuances par défaut - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 0 - 0 - 0 - - - RGB Red - RGB - PROCESS - 255 - 0 - 0 - - - RGB Yellow - RGB - PROCESS - 255 - 255 - 0 - - - RGB Green - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blue - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Cold - 1 - - - - C=56 M=0 Y=20 K=0 - RGB - PROCESS - 101 - 200 - 208 - - - C=51 M=43 Y=0 K=0 - RGB - PROCESS - 131 - 139 - 197 - - - C=26 M=41 Y=0 K=0 - RGB - PROCESS - 186 - 155 - 201 - - - - - - Grays - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - - Adobe PDF library 15.00 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]/Properties<>/XObject<>>>/Thumb 19 0 R/TrimBox[5.0 5.0 1029.0 604.681]/Type/Page>> endobj 10 0 obj <>stream -H‰ŒUMO1½ûWÌ19¬c¿¥ª>„Z !ÊÞŠ–dYRH6,©ú÷;k;a#B!9DòxÞ›yžy™\ÂäòTÀÉÙ)°6¹¸м2o—Úc,ú¢Ð<Ðw¤<§µBP^s/¼ÓFÂ|Å&?VÎZv} -­ËP†‹€Î«ˆä­ Æ[P=—ÆÙ $ÐIÉDÌëš=ä¤,H(˜ô1F?ÆrDJY*Žª)Wl:Útc鹄QÛÌæÏíüi|Wþd…äÒ; ‡å‚^çÕº˜?VËõl¹—¿r)qx£Ýd -‚J%ˆQÚ>ú9‘Rê¢Ý!Ñëap:Š4£úµÞ~@±¨¶U§B1Ãàæ©fíŸmŒªaä¾^ÏWU÷´ #×ò€»î"»¡&»ÙÃsÕ¤WZCA/i¾*†Ÿ‰‘o#ÿ/F8.F#G>cÇ}\Œó’I¼ŸJ*ì×Óð4\“B 7Bæ PxCZÅÕ¢õ€®f7ŒÒTDHNRHÇroyRrî0–©÷`Ó¶RŠ·ôlÊzn@íˆ+íÄ·¢€·ÏÕº†ÍNȶéªÕrÝÀ¦î–íbp­(¾Ç‰…Hu^dP‰@ùžÑ’?ô ‘ ‡m ¥ÚàzÒ’Dz‰® 4eC š eÐéì/èÐQ7h —.(Ô!Û&[1‹šR› î,È¿ “ÊÖÑ,XˆîÔ‡Vi`U"´ðLê]½J0¿˜xøÚÓT½™çaÏMOšÝ¥¦—Žt7@Ê¢q>û¢>(£W)Ù¨z×€qŠò×/&¾¸ƒÌΗsý(åôÝÜ‘ËìÅyø,H$k Nƒr”ä}š‹ÛQu;î@@Aêd\µÛÑýþTÒHkÌÇótLÓr~IÿMÿ{*‚* endstream endobj 11 0 obj <> endobj 19 0 obj <>stream -8;Z,'6'?mD%*W:siI+H``iB!`rWu@_K^T=;'S5J.4*5YRCHr;-H4gjHhVT:_"Cl'B -'G5Z["ph)[-sM?JE\\6S5l<07e$]jR'/GlA6prPE6t:'G6/]u9k@id]5S9tue-(C. -&PK_#[fN0I'(VtOd>G%p/@`tHg#c^Qs$q@QOq0G(4L,q8",3@f*gI?\ObQ=$Gr3;4 -las<[\fdD-,lq[p*iT6ADE1c3M(Z62o[LH?`8gfs]H:"ZL^T_BJQ1Qt>GpdJ*mKD# -T'K3@PB,1O:dA@/FU\rDUl2@J$,2ThBnkHUr(0[WX;5U.K7T^CWa,GRp\M^*NA%"\ -#9CD[6hF)PhaaP)W?/YnF%9.1`iVBpMq%Gk+=]!omM endstream endobj 20 0 obj [/Indexed/DeviceRGB 255 21 0 R] endobj 21 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 16 0 obj <>stream -H‰ìÖŽ£Hлµzÿÿ“ﲌ4Ys×à`ß“fa醨a¨øë/€ß÷/€›øû“Çãã£É–I¶L²e’-Sj¶Ôçî-“l™dË$[¦Ôl©ÏÝ![&Ù2É–I¶L©ÙRŸ»C¶L²e’-“l™R³¥>w‡l™dË$[&Ù2¥fK}îÙ2É–I¶L²eJÍ–úܲe’-“l™dË”š-õ¹;dË$[&Ù2ɖ黳ýüßèÀtà :p8ƒÎœAçΠsgÐ9€3èÀtà :p8ƒÎœAçΠsgÐ9€3èÀtà :p8ƒÎœAçΠsgÐ9€3èÀtà :p8›Îœáï¦Ç£;™G¶L²e’-“l™R³¥>w‡l™dË$[&Ù2¥fK}îÙ2É–I¶L²eJÍ–úܲe’-“l™dË”š-õ¹;dË$[&Ù2É–)5[êswÈ–I¶L²e’-Sj¶Ôçî-“l™dË$[¦Ôl©ÏÝ![&Ù2É–I¶Lßí翦ÿÎçË_³íÿ½Om'ŸWöÎ÷ï;:ùzŠý'|ýdtr/áòúv²Z£íuö}ZÇ÷U?z3_ß½wxù³ý¿÷õûöé¾ÉOoæãQ'{ÛV´;yÇ÷÷ó—’÷YÛŸüþÛ?~ÿ½gÞÞåõ-ùßþ´Î³ô&uŽj²Ú{êÉj¶×Ùw´CÎç7SçXëiCç`ÿ^þä÷ßþñûï=óö.:G¯Iô'Ç¿ÂÝÉjï©'«5Ú^gßÑ9ŸwÞLcy¬§uã®Fþ&÷öïåOþìíù=ã÷ß{æí]F:Çú 3ú,{÷{~?êiï_˜Þ÷ºó]kýÉñ¯pw²Ú{êÉj¶×Ùw´CÎç7SçXëiCç¸+c¢sôšDrü+ܬöžz²Z£íuöíóyçÍÔ9–ÇzZçÐ9îJç˜è½&ÑŸÿ -w'«½§ž¬Öh{}G;ä|Þy3uŽå±žÖ9tŽ»Ò9&:G¯Iô'Ç¿ÂÝÉjï©'«5Ú^gßÑ9ŸwÞLcy¬§uã®tŽ‰ÎÑkýÉñ¯pw²Ú{êÉj¶×Ùw´CÎç7SçXëiCç¸+c¢sôšDrü+ܬöžz²Z£íuöíóyçÍÔ9–ÇzZçÐ9îJç˜è½&ÑŸÿ -w'«½§ž¬Öh{}G;ä|Þy3uŽå±žÖ9tŽ»Ò9&:G¯Iô'Ç¿ÂÝÉjï©'«5Ú^gßÑ9ŸwÞLcy¬§uã®tŽ‰ÎÑkýÉñ¯pw²Ú{êÉj¶×Ùw´CÎç7SçXëiCç¸+c¢sôšDrü+ܬöžz²Z£íuöíóyçÍÔ9–ÇzZçÐ9îJç˜è½&ÑŸÿ -w'«½§ž¬Öh{}G;ä|Þy3uŽå±žÖ9tŽ»Ò9&:G¯Iô'Ç¿ÂÝÉjï©'«5Ú^gßÑ9ŸwÞLcy¬§uã®tŽ‰ÎÑkýÉñ¯pw²Ú{êÉj¶×Ùw´CÎç7SçXëiCç¸+c¢sôšDrü+ܬöžz²Z£íuöíóyçÍÔ9–ÇzZçÐ9îJç˜è½&ÑŸÿ -w'«½§ž¬Öh{}G;ä|Þy3uŽå±žÖ9tŽ»Ò9&:G¯Iô'Ç¿ÂÝÉjï©'«5Ú^gßÑ9ŸwÞLcy¬§uã®tŽ‰ÎÑkýÉñ¯pw²Ú{êÉj¶×Ùw´CÎç7SçXëiCç¸+c¢sôšDrü+ܬöžz²Z£íuöíóyçÍÔ9–ÇzZçÐ9îJç˜è½&ÑŸÿ -w'«½§ž¬Öh{}G;ä|Þy3uŽå±žÖ9tŽ»Ò9&:G¯Iô'Ç¿ÂÝÉjï©'«5Ú^gßÑ9ŸwÞLcy¬§uã®tŽ‰ÎÑkýÉñ¯pw²Ú{êÉj¶×Ùw´CÎç7SçXëiCç¸+c¢sôšDrü+ܬöžz²Z£íuöíóyçÍÔ9–ÇzZçÐ9îJç˜è½&ÑŸÿ -w'«½§ž¬Öh{}G;ä|Þy3uŽå±žÖ9tŽ»Ò9&:G¯Iô'Ç¿ÂÝÉjï©'«5Ú^gßÑ9ŸwÞLcy¬§uã®tŽ‰ÎÑkýÉñ¯pw²Ú{êÉj¶×Ùw´CÎç7SçXëiCç¸+còýÒ]¿§]ýçúóÎQßOçàþ®ßÓ®þóGß9jÇŸü® ²e’-“l™dË”š-õ¹;dË$[&Ù2É–)5[êswÈ–I¶L²e’-Sj¶Ôçî-“l™dË$[¦Ôl©ÏÝ![&Ù2É–I¶L©ÙRŸ»C¶L²e’-“l™R³¥>w‡l™dË$[&Ù2¥fK}îÙ2É–I¶L²eJÍ–úܲe’-“l™dËt}¶Ÿ7ÝßuýsÿÙ2É–I¶L²eº>›Î±&[&Ù2É–I¶L×gÓ9ÖdË$[&Ù2É–éúl:Çšl™dË$[&Ù2]ŸMçX“-“l™dË$[¦ë³ék²e’-“l™dËt}6cM¶L²e’-“l™®Ï¦s¬É–I¶L²e’-ÓõÙtŽ5Ù2É–I¶L²eº>›Î±&[&Ù2É–I¶L×gÓ9ÖdË$[&Ù2É–éúl:Çšl™dË$[&Ù2]ŸMçX“-“l™dË$[¦ë³ék²e’-“l™dËt}6cM¶L²e’-“l™®Ï¦s¬É–I¶L²e’-ÓõÙtŽ5Ù2É–I¶L²eº>›Î±&[&Ù2É–I¶L×gÓ9ÖdË$[&Ù2É–éúl:Çšl™dË$[&Ù2]ŸMçX“-“l™dË$[¦ë³ék²e’-“l™dËt}6cM¶L²e’-“l™®Ï¦s¬É–I¶L²e’-ÓõÙtŽ5Ù2É–I¶L²eº>›Î±&[&Ù2É–I¶L×gÓ9ÖdË$[&Ù2É–éúlŸ;ÇÀ/Ð9€3¬;GåñèNæ‘-“l™dË$[¦Ôl©ÏÝ![&Ù2É–I¶L©ÙRŸ»C¶L²e’-“l™R³¥>w‡l™dË$[&Ù2¥fK}îÙ2É–I¶L²eJÍ–úܲe’-“l™dË”š-õ¹;dË$[&Ù2É–)5[êswÈ–I¶L²e’-Sj¶Ôçî-“l™dË$[¦ë³ýüìŸvýsÿÙ2É–I¶L²eº>›Î±&[&Ù2É–I¶L×gÓ9ÖdË$[&Ù2É–éúl:Çšl™dË$[&Ù2]ŸMçX“-“l™dË$[¦ë³ék²e’-“l™dËt}6cM¶L²e’-“l™®Ï¦s¬É–I¶L²e’-ÓõÙtŽ5Ù2É–I¶L²eº>›Î±&[&Ù2É–I¶L×gÓ9ÖdË$[&Ù2É–éúl:Çšl™dË$[&Ù2]ŸMçX“-“l™dË$[¦ë³}îÿø??Ï3ø=££òxt'óÈ–I¶§×¿îþÞ¾Ññ;”˜­û/c4Û¼£>½Îæ_Ÿþoû;êé?ý}Ç÷­ï´·vϳ×¼¯Ãû§ÎñþcM¶L²=éß"7›Î1v_ãµïwÔ9ŽÉ–I¶'ã[äfÓ9Æî«s¼ÖáýŽ:Ç1Ù2Éö¤s|‹Ül:ÇØ}uŽ×:¼ßQç8&[&ÙžtŽo‘›M绯ÎñZ‡÷;êÇdË$Û“Îñ-r³éc÷Õ9^ëð~Gã˜l™d{Ò9¾En6cì¾:ÇkÞï¨s“-“lO:Ç·ÈͦsŒÝWçx­ÃûuŽc²e’íIçø¹ÙtŽ±ûê¯ux¿£ÎqL¶L²=éß"7›Î1v_ãµïwÔ9ŽÉ–I¶'ã[äfÓ9Æî«s¼ÖáýŽ:Ç1Ù2Éövëp§uc£¨7ïÿÊU„Rb÷À“™í»ÖŸ;³¡ ßͱŠn›Íqì¹6ÇçÏaûD›ãï´5i»±9VÑm³9Ž=×æøü9lŸø¹9.4ú3.þ÷6J[“¶›cÝ6›ãØsmŽÏŸÃö‰6ÇßikÒÖ¤­I[Sµ­zîÚš´5ikÒÖTm«ž{„¶&mMÚš´5U۪硭I[“¶&mMÕ¶ê¹GhkÒÖ¤­I[Sµ­zîÚš´5ikÒÖTm«ž{„¶&mMÚš´5U۪硭I[“¶&mMÕ¶ê¹GhkÒÖ¤­I[Óü¶ËÆè]óÏý{´5ikÒÖ¤­i~›Í±§­I[“¶&mMóÛlŽ=mMÚš´5ikšßfsìikÒÖ¤­I[Óü6›cO[“¶&mMÚšæ·Ù{Úš´5ikÒÖ4¿ÍæØÓÖ¤­I[“¶¦ùm6Çž¶&mMÚš´5Ío³9ö´5ikÒÖ¤­i~›Í±§­I[“¶&mMóÛlŽ=mMÚš´5ikšßfsìikÒÖ¤­I[Óü6›cO[“¶&mMÚšæ·}¿9Þàír™}~ßþ·üÓßúö>›€#lŽÿ³7ÇWÞßG_9j{ª™žß¶mMÚšÎÕvý+òùÕ‘¶×ºÿü¯w^Û®ÿüxÊöoæø“?Ÿðݽ·§ÿé]nßùxÒþúö5_?ÿþ}ÞÞn¿·û»ïïûØ -¯¿m‡í»Þ_Ý~ÿþœ_oŽë3mŽ{çúœØÒÖ¤­é\m6DZ'Û6ǘs}NlikÒÖt®6›ãØ“m›c̹>'¶´5ik:W›ÍqìÉ6‡Í1æ\Ÿ[Úš´5«Íæ8öd›Ãæs®Ï‰-mMÚšÎÕfs{²ÍasŒ9×çÄ–¶&mMçj³9Ž=Ùæ°9ÆœësbK[“¶¦sµÙÇžlsØcÎõ9±¥­I[Ó¹ÚlŽcO¶9lŽ1çúœØÒÖ¤­é\m6DZ'Û6ǘs}NlikÒÖt®6›ãØ“m›c̹>'¶´5ik:W›ÍqìÉ6‡Í1æ\Ÿ[Úš´5«Íæ8öd›ãÓýÊ°9öÎõ9±¥­I[Ó¹ÚlŽcO¶9ÖÞëÐÖ¤­I[“¶¦j[õÜ#´5ikÒÖ¤­©ÚV=÷mMÚš´5ikª¶UÏ=B[“¶&mMÚšªmÕsÐÖ¤­I[“¶¦j[õÜ#´5ikÒÖ¤­©ÚV=÷mMÚš´5ikª¶UÏ=B[“¶&mMÚšªmÕsÐÖôª¶··ç_ûÛ_·ýü©«xü÷¶n¥ÿßš´úÙÿ{—;£÷ø4i{œÍñ\6G“¶&›c=ÚšlŽ£W×`s4ik²9Ö£­Éæ8zu 6G“¶&›c=ÚšlŽ£W×`s4ik²9Ö£­Éæ8zu 6G“¶&›c=ÚšlŽ£W×`s4ik²9Ö£­Éæ8zu 6G“¶&›c=ÚšlŽ£W×`s4ik²9Ö£­Éæ8zu 6G“¶&›c=ÚšlŽ£W×`s4ik²9Ö£­Éæ8zu 6G“¶&›c=ÚšlŽ£W×`s4ik²9Ö£­Éæ8zu 6G“¶¦Õ7ÇüÅå2û¿m[øÝWßÝ÷È»<ᆵ®_¿ÿ;¿Éÿýëú6?gsŒÝ÷È»<ï¾u7ÇWÞßG_Ù£­I[“¶Ç¼½½îy÷×öm׿T?õ™wþÜûûõ¯äõùïðñï‹G¾úÓß÷íµÛWûï|ü?¿¿ýêv¢ý}ûWÞ?e{ží«÷•÷›ãó=?ÎÛŸ÷í}nß¿¯¸îý¿}|eslikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤í16ÇóÙ6Ç+ikÒÖ¤­I[Sµ­zîÚš´5ikÒÖTm«ž{„¶&mMÚš´5U۪硭I[“¶&mMÕ¶ê¹GhkÒÖ¤­I[Sµ­zîÚš´5ikÒÖTm«ž{„¶&mMÚš´5U۪硭I[“¶&mMÕ¶ê¹GhkÒÖ¤­I[Ó -m—;£÷¬pîߢ­I[“¶&mM+´Ù[Úš´5ikÒÖ´B›Í±¥­I[“¶&mM+´Ù[Úš´5ikÒÖ´B›Í±¥­I[“¶&mM+´Ù[Úš´5ikÒÖ´B›Í±¥­I[“¶&mM+´Ù[Úš´5ikÒÖ´B›Í±¥­I[“¶&mM+´Ù[Úš´5ikÒÖ´B›Í±¥­I[“¶&mM+´Ù[Úš´5ikÒÖ´B›Í±¥­I[“¶&mM+´}·9Þžâr±9€ß÷ýæøÊûûè+{´5ikÒÖ¤­i~›Í±§­I[“¶&mMóÛlŽ=mMÚš´5ikšßfsìikÒÖ¤­I[Óü6›cO[“¶&mMÚšæ·Ù{Úš´5ikÒÖ4¿ÍæØÓÖ¤­I[“¶¦ùm6Çž¶&mMÚš´5Ío³9ö´5ikÒÖ¤­i~›Í±§­I[“¶&mMóÛlŽ=mMÚš´5ikšßfsìikÒÖ¤­I[Óü6›cO[“¶&mMÚšæ·Ù{Úš´5ikÒÖ4¿ÍæØÓÖ¤­I[“¶¦j[õÜ#´5ikÒÖ¤­©ÚV=÷mMÚš´5ikª¶UÏ=B[“¶&mMÚšªmÕsÐÖ¤­I[“¶¦j[õÜ#´5ikÒÖ¤­©ÚV=÷mMÚš´5ikª¶UÏ=B[“¶&mMÚšªmÕsÐÖ¤­I[“¶¦µÚ.—ÑW®uîçÒÖ¤­I[“¶¦µÚlŽ+mMÚš´5ikZ«Íæ¸ÒÖ¤­I[“¶¦µÚlŽ+mMÚš´5ikZ«Íæ¸ÒÖ¤­I[“¶¦µÚlŽ+mMÚš´5ikZ«Íæ¸ÒÖ¤­I[“¶¦µÚlŽ+mMÚš´5ikZ«Íæ¸ÒÖ¤­I[“¶¦µÚlŽ+mMÚš´5ikZ«Íæ¸ÒÖ¤­I[“¶¦µÚlŽ+mMÚš´5ikZ«Íæ¸ÒÖ¤­I[“¶¦µÚþ»9Þžâ~gØÀoù~s|åý}ô•=Úš´5ikÒÖ4¿ÍæØÓÖ¤­I[“¶¦ùm6Çž¶&mMÚš´5Ío³9ö´5ikÒÖ¤­i~›Í±§­I[“¶&mMóÛlŽ=mMÚš´5ikšßfsìikÒÖ¤­I[Óü6›cO[“¶&mMÚšæ·Ù{Úš´5ikÒÖ4¿ÍæØÓÖ¤­I[“¶¦ùm6Çž¶&mMÚš´5Ío³9ö´5ikÒÖ¤­i~›Í±§­I[“¶&mMóÛ.£wÍ?÷ïÑÖ¤­I[“¶¦ùm6Çž¶&mMÚš´5U۪硭I[“¶&mMÕ¶ê¹GhkÒÖ¤­I[Sµ­zîÚš´5ikÒÖTm«ž{„¶&mMÚš´5U۪硭I[“¶&mMÕ¶ê¹GhkÒÖ¤­I[Sµ­zîÚš´5ikÒÖTm«ž{„¶&mMÚš´5U۪硭I[“¶&mMÕ¶ê¹GhkÒÖ¤­I[Sµ­zîÚš´5ikÒÖTm«ž{„¶&mMÚš´5U۪硭I[“¶&mM ·ý#ÀÄÈŸ endstream endobj 17 0 obj <>stream -H‰ìÖAnd7DÁißÿІàW£¡‘åbRkÃxýÅJ̯_•ø¥4NiZK§Ò ‡¥Ïþ°EJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:á°ô?³ÿ¤_¤4¯¥´¥Sé„ÃÒgØ"¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ‡¥øžý'ý"¥y-¥-J'–>ûÃ)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Sé„áñý<é줿é„í/:cû«~Ï=}Ùý¦F>“Çò%û‡zö±¬ÛþªßsO_v¿é„‘ÏtþXf~Ü÷æþo>–?ù¯n(ý3_¥oŽïLÇ÷ÜÓ‰‘{òX<–Æ7Í=0¾C<–ûß4÷tÂøñXîg|ÓÜÓ ã;Äc¹ŸñMsO'Œïå~Æ7Í=0¾C<–ûß4÷tÂøñXîg|ÓÜÓ ã;Äc¹ŸñMsO'Œïå~Æ7Í=0¾C<–ûß4÷tÂøñXîg|ÓÜÓ ã;Äc¹ŸñMsO'Œïå~Æ7Í=0¾C<–ûß4÷tÂøñXîg|ÓÜÓ ã;Äc¹ŸñMsO'Œïå~Æ7Í=0¾C<–ûß4÷tÂøñXîg|ÓÜÓ ã;Äc¹ŸñMsO'Œïå~Æ7Í=0¾C<–ûß4÷tÂøñXîg|ÓÜÓ ã;Äc¹ŸñMsO'Œïå~Æ7Í=¹§Ï±ÿÔ0ùX^´ûMÓþßm~ÑÛ_tÆÀ7‰˜à±œÙý¦iÆwâ‹ÎØþ¢3¾i×ùuPš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥K?ð#<ûOúEJóZJ[:•N8,}ö‡-Rš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*`|}þoÆ×ø Œï×øfÿ¾i^KiK§Ò ‡¥Ïþ°Æ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'ßcÆ÷~-¥-J'–~øßûµ”¶t*`|ÿƒÕ?Á"¥i-J'–>ûÃ)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'ßuJóZJ[:•N0¾ë”æµ”¶t*pXú ú5ÿòìŸ`‘Ò´Lgê*ùOî÷ZÎOé„–RãËK=–Äÿå÷ZÎOé„–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[šz,@Nâ*ïÙI[d|¡^â*ïÙI[´2¾ÿ¥yJÓZ:•N0¾ë”æµ”¶t*`|×)Ík)méT:Áø®Sš×RÚÒ©t‚ñ]§4¯¥´¥Séã»Ni^KiK§Ò ÆwÒ¼–Ò–N¥Œï:¥y-¥-J'–~Ž uëÙ?Á"¥i§ç÷Ç6óh¿×r~J'´”_þØùc9ûïsZÎOé„–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÝSÞ³¥KžÒ¼–R÷”÷l©Ç’§4¯¥Ô=å=[ê±ä)Ík)uOyÏ–z,yJóZJÿf·L$‚òù'ý14íUGP†a÷”ïY©Ç’4ߊÔ=å{Vê±ä#Í·"uOùž•z,ùHó­HÝS¾g¥K>Ò|+R÷”ïY©Ç’4ߊÔ=å{Vê±ä#Í·"uOùž•~,’r}»¿\ÏNZ1ã+ õíþr=;iÅŽÇ·i>Òt+NÒ‹Œo=Ò|+Ò'éEÆ·i¾銓ô"ã[4ߊtÅIz‘ñ­GšoEºâ$½ÈøÖ#Í·"]q’^d|ë‘æ[‘®8I/2¾õHó­HWœ¤ßz¤ùV¤+NÒ‹Œo=Ò|+Ò'éEÆ·i¾銓ô"ã[4ߊtÅIz‘ñ­GšoEºâ$½ÈøÖ#Í·"]q’^d|ë‘æ[‘®8I/2¾õHó­HWœ¤ßz¤ùV¤+NÒ‹Œo=Ò|+Ò'éEÆ·i¾銓ô"ã[4ߊtÅIz‘ñ­GšoEºâ$½ÈøÖ#Í·"]q’^d|ë‘æ[‘®8I/2¾õHó­HWœ¤ßz¤ùV¤+NÒ‹Œo=Ò|+Ò'éEÆ·i¾銓ô"ã[4ߊtÅIz‘ñ­GšoEºâ$½ÈøÖ#Í·"]q’^d|ë‘æ[‘®8I/2¾õHó­HWœ¤ßz¤ùV¤+NÒ‹Œo=Ò|+Ò'éEÆ·i¾銓ô"ã[4ߊtÅIzÑGéŸ$I’ô=ûK_Œ4ߊtÅIzÑGé³VŒ4ߊtÅIz‘ñ­GšoEºâ$½ÈøÖ#Í·"]q’^d|ë‘æ[‘®8I/2¾õHó­HWœ¤ßz¤ùV¤+NÒ‹Œo=Ò|+Ò'éEÆ·i¾銓ô"ã[4ߊtÅIz‘ñ­GšoEºâ$½ÈøÖ#Í·"]q’^d|ë‘æ[‘®8I/2¾õHó­HWœ¤}”þ 0(Ç© endstream endobj 18 0 obj <>stream -H‰ìÖÑm1ÄÐsú/: äÄÑŽŽ4ùkÀã·’ÿúõ®×ëí$Ù…v_BþÞ>»ÐîKÈßÛgÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„çûúm¿èºÛ_wÑíoütë¯öÌÞgµ;½Ýþº‹nã§[µŸðEoÿÏf÷%äïí³ í¾„ü½}v¡Ý—¿·Ï.´ûò÷öÙ…v_BþÞ>»ÐîKÈßÛgÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„ü½}v¡Ý—¿·Ï.´ûò÷öÙ…v_BþÞ>»ÐîKÈßÛgÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„ü½}v¡Ý—¿·Ï.´ûò÷öÙ…v_BþÞ>»ÐîKÈßÛgÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„ßÿ­ï{bï“ú›ÝÑí/üt·¿ï¢õw{bï“ZÛ½n᧻ý}m¿èëµÝÛgÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„ü½}v¡Ý—¿·Ï.´ûò÷öÙ…v_BþÞ>»ÐîKÈßÛ÷Uønß¡§ëÕŸîö­ÿïözº^ýéìw¦ä׫?ýÎt‚üzõ§³ß™N_¯þtö;Ó òëÕŸÎ~g:A~½úÓÙïL'ȯW:ûéùõêOg¿3 ¿^ýéìw¦ä׫?ýÎt‚üzõ§³ß™N_¯þtö;Ó òëÕŸÎ~g:A~½úÓÙïL'ȯW:ûéùõêOg¿3 ¿^ýéìw¦ä׫?ýÎt‚üzõ§³ß™N_¯þtö;Ó òëÕŸÎ~g:A~½úÓÙïL'ȯW:ûéùõêOg¿3 ¿^ýéìw¦ä׫?ýÎt‚üž9ïÝ_ôsú ¯¾ê_»}kŸ­W_îýõß»ÐîKÈßÛgÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„ü½}v¡Ý—¿·Ï.´ûò÷öÙ…v_BþÞ>»ÐîKÈßÛgÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„ü½}v¡Ý—¿·Ï.´ûò÷öÙ…v_BþÞ>»ÐîKÈßÛgÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„ü½}v¡Ý—¿·Ï.´ûò÷öÙ…v_BþÞ>»ÐîKÈßÛgÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„ü½}v¡Ý—¿·Ï.´ûò÷öÙ…v_BþÞ>»ÐîKÈßÛgÚ} ù{ûìB»/!oŸ]h÷%ün_UUU¥ný¿Å'eÚ} ù{ûìB»/!oŸ]h÷%äïí³ í¾„ü½}v¡Ý—¿·Ï.´ûò÷öÙ…v_Âïö[€ˆÇÒ endstream endobj 14 0 obj [/Indexed/DeviceRGB 2 25 0 R] endobj 24 0 obj <>/Filter/FlateDecode/Height 119/Intent/RelativeColorimetric/Length 142/Name/X/Subtype/Image/Type/XObject/Width 1014>>stream -H‰ìÁ  þ©o7 €?`Uòž" endstream endobj 25 0 obj <>stream -ÿ endstream endobj 23 0 obj <>/Filter/FlateDecode/Height 310/Intent/RelativeColorimetric/Length 447/Name/X/Subtype/Image/Type/XObject/Width 1405>>stream -H‰ìÁ1 þ©g `–Aô endstream endobj 13 0 obj [/Indexed/DeviceRGB 6 26 0 R] endobj 22 0 obj <>/Filter/FlateDecode/Height 321/Intent/RelativeColorimetric/Length 711/Name/X/Subtype/Image/Type/XObject/Width 2164>>stream -H‰ìÁ€ÿ«ë -€ÙƒCAÿ_ûŸxî endstream endobj 26 0 obj <>stream -ÿÿÿÿÔÔÔÿÿ endstream endobj 7 0 obj <> endobj 27 0 obj [/View/Design] endobj 28 0 obj <>>> endobj 5 0 obj <> endobj 6 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <>stream -H‰Œ•XTI€«^õ0o:óÞ ¼1±& ˆ¬k^]ìéíšVEAPÁ´«¢¢"ðt1»ATĈs@TóŒ€ù)®i=à ۄÏï¼ûîöúûªº«»ªßëÿ뮊U!üýú6mÍÊeX`X@ÄÊ7¹—Рê¦À‰‘rÅrµBí†àˆ‘avÍYš€‘¡S‚Ó2óê>à¶:*(`ĵ&уŒ¹SëQ|¢Âß„\yŒ -‹œ\i+õBÃÀ{ü€͹í09¢b=¢#WòØ€° —¹ÜæûhzD„Oˆ,u9V *µl=b|P¥T€½#õŽ€DÍ*x¢RÞ÷¢$œQ#Z²ÓhtÄ -Á¾`rgZögЯwgŒ —kÆ”tC/­wÌ,x@³5½Ê¾Œk¡Â\9?>B7.v•›”m&e>Ÿ7¾HLc§uöUªVstªîìâZ£f­ÚuÜêÖÓ$Ùhr÷PÌõ4lÔØó‹&M›5oáÕ²Uë6Þm}Úù~Ùþ«;uîÒµÛ×Ý{|Ó³Wï>~þßþ­o¿¿÷}ÿ þaÈÐa0rôXæñ'O>söÜù Y³/]¾’Wsó®]¿qnß±XïæsˆãuæGÕ‚3LÇRA;Èü(œ¢h:ÅÑZO—é«ÊüØ\‹æœæ™æ­>D?FJŸ¥/5Ì0¬6¼6|”jHz©«Ô[ú^ ’~¦I{¥ÓRžd‘^Jo¥ÙQ6Éf¹™ÜRö‘}åöryˆqâ¹"€ùð|gâ2DÌu„&‘ëgv®vÑÚÄ -.Úârý¡BDOø‹&º‰Þ\'öÿ·ù>7°LÄÁ•VÿÿíýYd3±Å§q“ÿÃßé?¦6B ÌžC"<†¹°âa-l…MàqØlX -¯à5,„å 'y{ ë ~ƒ7ð6Àv8ga ‡@H€Ap.Àe¸Ùp ž@0\…+i0^À¸¹£à)Á|Ñ0 ÆB„Ã8ˆ€ñ0¢ &Â$Pa2L…)ð#LƒŸ Öà ˜Î«ëLxÏá &âr¡lPŒ+p%®ÂÕð” jQ„R\ƒkqþ‚I¸uhUÐ7àFxïqnÆ-˜Œ)¸Sqnǘ†;1wánÜà:Æa<îÅ}¸3ðVÅjx¡#:aut†B¸‡.芇ñÖÀš¸â1ÌÄãxOb-¬ ;!ë žÂÓXë¡ xÏÂGøîÔPF#šðžÇ ˜…1/áetGTÐŒW0¯b.æá58„õ±6ÄFðáuJ§]´›öÐ^ÚGû)ƒÐA:D‡é¥c”B™t¶Ð :I§è4¡³tŽÎÓÊ¢‹”M—„ÂK^3®ð y•r)®ÑuºA7éݦ;Â+á5YÈJw)Ÿ -¨îÑ}z@é=¦'¤ÒSzFEôœ~¥ô’^ÑkzC¿Ñ[ú'½£hšI³h6ÏÁsh.Í£XšÏkT<ÏÈ yN^Lïé}$ÓTB¥ 2cLÃ옖‰LÇìYæÀëY5æÈœXuæÌ\˜+ÞÀ›x oã´ˆÞ¬5küY[æÃÚ1_ö%kϾbY'Ö™ua]Y7ö5ë.¶}Ävb+ñ±øDTŧâ3±H|.þ*¾_êfëbtstsuót±ºùº8]¼nn¡n‘n±.õ`ß°ž¬ëÍúðšêϾ¥­¢¯ø%ÛÂ’Y -ÛÊRÙ6¶í`il'Kg»Øn¶‡ýÉr™€çxeqüÜsï=ïù”ÖRûÖ -"; ±„Dj­(-µw̨%ÔRkl¤j„$‚™KGg˜A¤¤Ä¾…E,AŠ‡N'ÄÛ÷ö0rŸ÷yò|ß÷Þ{¶{þ¿³Ýì0™f§É2?š]f7œ‡k&òÍOfÙkrÌ>³ß0Í!sØ1GÍ1s.Â%¸ Wá˜&ל4§LžùÙœ6gÌYó‹9gΛ &ß\4—ÌeŽä(nÍÑü·á¶ÜŽÛsîÈ1܉;sîÊÝt%]Ù~‰^;ÜŽ°#í(‹%v´#}n¬gÇÛ ök;ÑN²“í;ÕN³qvºagÚYv¶·sl‚kçéªü1wçÜ“?á^Ü[:[1ßçüñg܇ûÚmv»Ýa3íN›e´»ìn›m²{ì^›c÷Ùýög™'ɳj©{ªXÝWWÔõP=ROÔSU¢ž©ç*@½P/Õ+åUÂ4€x¨Ñ EB=XJá;XËà»ø–ÅrX+àû*+b%¢be¬‚U±VÇXkama£…BuT#Š>* ëb=¬¾ØýФÛöã_ùßäÇü„Ÿr‰-Â@ Â` Á†ØC1 c Ǧö®½‡SqÆátœ3qÎÆxœƒ 8×ã<œoïÛö¡}dÛ'ö©-±Ïìsû¾´¯¬×º¤I“!KD1y¨½C¥© ½Ke©•§ -¢;©U¦*T•ªQuªA5©Õ¦0¿ÑÉ:…>¤:z…^I>TW§ê4®WQ=ªO¾Ô@gèÕäGþ@DÁB ©…ê5z­þ«Páwz…QcjBáúïz½Þ 7RSjFÍ©EPKjE‘E­)š>¢6Ô–ÚQ{ê@)Æ“L© u¥nô1u§ÔSzÊ÷ô õ¢Þô)}F}¨/}Ný¨?  4ˆëèÍ4„¾ ?ÑPú3ý…†Ñ—4œFÐHÅÏø9ÅÒhOŠg…g¥'Õ“æI§1ô¥q4ž&Ð×4‘&ÑdšBSiÅÑtšáYåÉð¬ö¬¡™4‹fS<Í¡šKóh>%Ò7´€¾¥…´ˆÓ~AKi%ÑrJ¦ZA+)•Ò(VQ.Ÿ—â2LÂ嘌)¸‚_âJLÅ4LÇU˜«q ®¥ÕüŠ½ìò-ÏÏFU ®ªkêº*T¿:õœúŽ¯ÓÀñsü'Ð r‚§¡ÓÈ uÂœÆN'Üiê4sš;-Ô uSèsšŽÓÓ…Ìgòy¾Àù|‘/ñe¾Â|•¯ñu.Ä;øþç³ðoø.п«Æ°2်Û`;ä_ öÁ|¾‡Ô"µ˜Ïq]®Çõᱺ;Ü@5e?öÇÍÈAÎM==ƒ<ƒ=C ŠD³×C’Š‚%*ZMTËT’Z®&A–Šãýƒþ§Þ‚‡ùåc|œOp.ŸäSœ‡Gð(Ããxsñ$žÂ<üOãÍ¡t‚Vª”ì5V±×….¹ a‘|¨(ßÇê6ÈZk³dç¡òé%ÕOŹûÝ|÷¤É Q‚à¢èóÓ^ör²g4caµèxuh ý…W¦Â&8¬ê¸ ŒÓ °=¡!t¶y$vÌÝâîsÏA X‘òöHÉÃz‰x~¨Û¸ !Z>é°ö\ѵôRw˜D§  -Ê„¡¥³òMw•¤ó\ŸÂ¡£xÔ_)Aˆ,EÞÝ$ìµUˆ(r„~ÂUSÕN%ëÌW³½Q2#VŸ# ŸÄñB‰p‰¯tØƪƒDo€ÊÖEf‚ µ‘.¸+á=Ù9VÈ+^ˆì[Ø(÷DÞñSSÝqnâÛÜEB_ùÍX‰ËlYÙ’•«B=ÅÊ ugˆn×p§ÉÖÚ‹¥]ása¼QòëYÂë„O ë ‘Õ¢‰R#Ôu=P&³:×æÛbo¾;Ùý—[èÞËëJ„zC9+^â›(\¹vK”¸I-”È©UdŸ@5PÅ ñ}'¼tF=ÇŒ•:ÍÃk:L/Ó7D›_¯M´·i¯÷´ÛI¼P»*Ë -ÅÂOÅëa˜›dÿ,8 {ô •>–J #úª&²š‹µ1ª«pfªÚ]l…ݱœ4FºÈ6 ºšö×C¤3ÿÍ„™ÖfŠ(ôóB4u¡Ýì ñö¦IŒ+¸!n·ªHŽ£$:#¥ú' Ï&@²põVÉùN©ÓK!¡:±à®Pöx.[Z³œÄ9BEJ~_ÛÑO UcT‚Üäm¡§¥7ÝR÷ÞèeÑ«ŒÄhŒ¥«¥KO;ˆwuí«ôx!¯]Âg„¥æÚŠ’ýPc‡Øé‘›¤³ut¾à²œûÊÿÕU¯·­w˜w…÷·®íöw‡¸kÜuîN¹+‡Üãn[üvv`™ª@ ¹…r"%ó¡' ”5ZnÉ4Éü\X ÷" R%Ê[ÄÏ\©„<™nËLñ@9Ýê.8ío€“þ œ’8jƒÌ’FÏdßó°r[ n¤#¸n£e’y~Ùž…Œü)ä©óx š$;Q·*½¹tµæ(:˜ ‚[Ñïð~¨Z™G$f£…ÁGÖMËü ¾zo]íÒš%ÕU‹++¤ò//*s»œâB‡°`þ—ì¶R«¥¤¸¨°€7s¦yùFƒ^—Çj5 %UDÄ–„ ¸ -ã[[+U\쉞‡&ŠS-sy!‘cærsÓq§9ƒ³œ˜üÈ_Y!DDAù0, -iÜÕø@XŒ Êd^™ƒæà|€X D,aAÁ !¢´<5 Gax]Ê ‰¡~}eJé RJÄm)\Ò„s)‰4¤ÊË¥”R1Q¬bXÕ@¡®HOŸ²º# ÛŽXe…‚CÅ^‰ÍŠIʱ PNŒ¢ )lNŒ0¨îíRãòhšC½ ÉØ'öõ¬*´'¦Ê0K 7¬”$',Px9Šî{˜j£rÄ2(¨¨,ï”uD¦:Ô1ƒwÀZâjIÈ- zT5¢¥ -QÕW·2½©~1¢Î$¶ŠNlä- ðG©¬ 5»'JKƒg³×QiD×FE‡°‰±ž°=Uˆä5»_·ë\JeEŠ3O[35Ï4óúgi9(Ç®Bmkf͉UÄ劰QM¢"l¤^ú둼±ØàðJé7 *ºPBæ`žS×+' -òÜ.NÞœ;Ó33£uq_ Tƒc6¾€~V$I)/Wã‚ #AǦ^WYñTš\·q<À|hu–ŪÀæ‡êÕýé êDÙÓÆÔk;‚URL! •2~ŸRô˜JÙsŸ2»O‚.èô@êõxx/_W[æEæBU¹?óCcÇëÂíÎï¼:–Iz×¼»/a|ýØE_æ¹Ìó½ÿ™ªA‹²PÐAÉäÅ%ÁnâÁ~gãâ6çi‘Ñyq9’ ‹Œ’³Ü½ -sÜMÞp)¯r#E#žç\‡kx~:ÿåE·³ˆqñN‡ÕÈ2&½ñcÅ€ ?A #ñ®Bžw¹Ò4uiË[lMšF‚¼Õj2çXÐdàë¹8×(ä|Ú">;~ªÀ÷ù4Y,¶ëª*øj;¾mÇv±ž/áëõâ€E’8ÎEÛáEöìøëóM{:;~Ú -Ï É'IRlå¤j4©trBòKÜ8²J“‰[ª8?7˜ Lì›·XÒ<ͽ-wã“ïC>Ÿ™÷a3_’³ívߎ)«-*,^Z¾.ÑjÅ…îºZ¯Ìœƒx¯giMq‰—­-s‹ !0î³zè¯/R³®Èeò‰¾÷ùËÎ'šZÖ¯yut¨¿>Ì9;­ü‚ŽÐóbQåâæº ôнÍ&ÖÈ ùíüð®Æʲ-ïvVÿðñøk[×?ò•o*Nëü¦Ìwåºÿ°^%ÀU•WøÜ{ÿûnbH¸$ïeƒ$,Y ²ôIH[ -a `›Q¶dÈ D°" UIgH*‹PÒ*+“ÄLH"ÁQªŒ:4R,–éÃÐH+Bòþ~ç¾û²á´Úé›ùæü÷_ÏÎwÎù_ZFAéIö_ü× F…S"ux› -n`æ:s]S(_ŸÒª¹0y“s“«:d«s«ë`È^ç^×ëÎ×]ahªxÊ`EbD衈ˆ¡Q®áNçj3‚(Õ všg¿<ó® ááDCÙq£„#jLPPpR²lÆ0xŽá Ê»lHClŒ25ƣɸlFt²ù¶š†Íy‚‚£’‚#‚“(éöÝôWf˜·aâÔTv”å¡<öKŽÙ~£B‰þvÎZóndÚ‚g°oÜFˆ™“SÁCgØK)pRûÁe²[’”,DC¢‘ °/rÕÌ Ë7†Zq¨pyîšgÎþë« Jz¸s;H™á=™–˜ï./ò ÏÏ–¢—v¾:×}¨ÌûõŸN, SE†8µä1w?Žu =ÖQþ“‚‰#^D4Sl¿±“L»<Ñsú) -鑱aÑáfXX0ÒÝkúÂØ ÁFbƒòcÏ=ˆÎ+0A†ÒV®„?d‚¦o$;óXzLôטGÌ&S3£‡È!m -lT£R†-÷%#Vb{¥rã±öÔ–±¢×š×#Ó`•46e¤P‹¼ >’2KãÙ8N›¼–uºÉš¥)±‹æ—o.Þ2þ˜_UöÔÜÌ‘c³ú;,^¶|ŠgçÍ«³&Oß2å€2ö­’‚ ósR²’¹BƒÌ‰ÅÞ/×/~zh1T&Ê”Y‚h&P訥Ïnš¯º•<µ–Wkeúo‹i¦JøËQKÁWU·,F0 -x^<0Xܦó°f6 ð] zÓqPÞÑçÊJàC}.mÖß“õh7 Mú{ôk‡[6j1²Aü -ýâ ÙhÄȘ׈ñøna‰±&±Jž_Ð~|7cý7F u ÿyôñº÷qwU7í…ŒÁùcÏiЩz$aZeA¦@>¨ÖzùÌ]bEaMŠêöÖc¬Ú±°ýÑøNÇdl8 zJŒ'a,{¸¡ƒãûµ*éÁX›z–æ)-T£ž•ãp~’}ïJëÞ|gûN¬¿­Ó}`Y¿žÀ™½Ð­[@¯^ :ª¦ã+€)ÐõŠzŽJ ÿ,È»_¿KO0HvªµÊvØê-QBéF•¬‚Žsô㔉ïXî³@ò†xYnÒÚ©c©Ž]Ø«„F«?φP¥º”ð$¦d¬MÄyq@ ì–,.âì*ÂziísÕÒÿa œ?Òe'Øƨ¢#1÷&ôús¾f@¿a@"¯Çùilsö»2×[ñ!Ð} ૼۀ­Xßîÿ}xêÈ38'Ã>§¡‡l`îõ„í?šý°l_K¿êƒÐ¥?°˜‰ï È8ðN¢}Ù⢛ˆùÊœáoæsƒ9}3Xwßä;Ç.Òdpæ·°á:` ð¤ƒèYðŸ\ÍñÂœµâÅÞ›¹ÅœñKæ· EQë”ò=™S]’c¯“R,òÝÁ-¿ä¸cî³®"•†ð·Fké ¾uK‹Ké~Ù}WÚ¼±‘¥ððYà:¸è—~[tÉVÙäH+3éb¸E Úd fÒxè•![16Mϧ§Õ÷)Ðh¦xø²:T÷‘»F«²\o¦KVþ9GÕ‰¢U*Z]¯“×Å ¥Y¯S7pû~Ùþ¹,=Ç~hÿÿõS½Ž–¢ýw½¶m¥í\#Œ6e0Ø/Ñ Ø HUv”* Æ2Á›vàIøá!ÝCÙxåç y`§ôÏqìJi*ìU¬z”#]¼—ñˆÜ$Bå‡<ÇšÇkÊeÛƒmÔÓÌaëMÁ{ž£–=ÜØ«ƒnªòÃá¢KÆ;ò3=T^Ô3) `•|CN®µêµ—Æi;(Cm—mÚɼ7öÈoµ8y¡«‡àÝ4~Z'÷ˆ2»v[5\:8~ø½ÁÑßö½'¬5£égx§0D6åèUôSí 0[^Ó/`¿8ËÞŠ4ŠÔä%m¶/Ò÷–áw‚·~u:ŠcŒuÀyhÕZä µòKƳå!1Ÿø½˜I$ %À$ûû´”|s~V¡>\@ûQð5¯ÌõèËæw ˆ—ïj§äM—ë´ç¨ܹ¥®AÝÜA "’41˜–ª¹x›¼DµÍòM­’^Ö>“™ò_êJZ n—;µßÓE·7XŒyu„¼`ߎ«öí\LGû:÷Þ;åƒÕ®Ášç±O%dŒÝÿæ£ÝY6xѹ˜`cú -€`Ÿì¸Êü¼ï]òÿ—ß]¾§´ëOŠ]:ï«)?DNý^²Wíñûÿ¿Éî7doé·ƒ¿ŽöÐç?Ö<¿Q{‚s+ç7ΫœÛ8Ÿr>ñK«Žs^û7ëedEuÅáÓ}»ß{3E”L)Ê ‚0(ƒKdI¤¤Pq[d1â0"—¸Å…qÁˆKLŠ‚aF SqT@`ŒÑ€+et4h R:ôÉw{y í0”ÿøÞéwûvßsoß{ÎïØܦÇVÇ^ k3♥6žù ìbãLaÝÄ/ l½jêÐÌ·‡uck¿JºÛØ^wC;RŽÏkòZæú´"žXÍ{’´c¼}^+)Àžeµ†¿XžÏ 뻢$/Æ5^¡ÍY™—¥ÔßüÖæ3ëK®#š¿†ëÁaý‘ µùõú Ï~as¦»Gîb?<i\êÀZÙå”ûüge‹ß[fqÎûåuí/t,,4u5¼Î¸9ó‰ 6­ô-w5QaPÖŠ¯ÈB§øßN¦®ÐÊÜÇZ‰vèšCßdOÁßRTÀ\©…^È<-mñû@ò}Y²ýMh«±zæ5W<çôÞ´þá×p›'›<—ÝEžœ¥òºÿg,>+KšØsë…\¾nH×GÖozëôWæQ˜hDþüLúzÃì>³k,~Ê—–ÉX¬Ëš£É䌘çBRÓšçO }UT?qöÔzï)q­2—hà]©YnõPPÉú<†Ù-ÃÌ2çú0×Úýæà+´ëÚýÇœþîm‘"r}¯˜6Ô©KBP¬•¡¥° ®æ½ítw#ÖÂASÆ÷ï@ÞýŒ|²Úi…»,¨ -%>öMÆùÞâ½EÞ•¡Æêžµ‘b˜Ó~S(Y»v!|XaJxW‰”aß6•jëÝ©áËõ@¸f‹ì<‚'™saN´uIžñ¿–®™…ì›oX·ÒÃû‘tñûH—ÌUA•· :À©¬Ñ»ºÒ,%ç]ã”cËe€Å½A:›“¨{Ï´ú…:dº3 Ü:GºÙy=¤'5IOy#¬í"+Ül¬›ëa±»B‹aü•ÿ£¸×{ fÞat+VÌqŽïΖÕN©\ïÔÊun•”ÙqLKy< ý'DèØÛX‹/½QòxŠþixÖÚih·öô4q{Û4´[{aÚ/l£õ;šGköÎ߃G{oÇ4´wlÆ¿’4´—|?Ž¶ÎÒÐÞ©?§¡}pÚ4ÔH -è"ECËÙØ™ð5lô™ÜíÑZÿŽú„¼¯Ð^ˆî>Ž{h­`Ü¡·ro9×{·Y¡#ƒßsÿرnìMÛÉЇ>Œtƒ3¸^‡‡E4-°øÐ`;Ðסš `ë»àüh¼ðùU‘Uô¤ÕœA=×VCðNù| èN½/x1öÝÞßÙp\ë7ó—¾`µ0>j)L†×€6½˜¿¢õ4ú<­nlðut"gµ;áZï|jÎÙ‘YÞÆz‹ÐÛ?S½Ùbâ!ÄÊ;Íh ¾’Y«·x§±/çK+j©Çˆo‹2/ë»ä¥rÿi©¶õºæçæÏ:Ï«’ÿQq¼{eH¦XÆzƒ—hƒiÃ=ÆðÆë7V¿„õ™³Ó¹?]ÿhs˜­UÚŽ\RÐ_æÊPôM±yJ÷ä<ò_c^NÎûŽÉ•¢ê´M6ÁŸ¡ -ç > 6·Ò‘Ôž]2“d³?Z¦%y/s®ì÷.!ïĶ°z§;í˸ÿéY0C¦fn°¹38!?v¤µŠÍÊ7Ó›ÁÖÔº€ýp& ²>‡yfëSróËV;ù_ꯅîÄŸüy#¯–Þ<é›=À|rÒ¶ ǼOA_¼ÊZ4XŽÙ<½ÈæHÞ¿÷g ™i »^kkõFJ—žèÿFg{'ë‚H—êªDŸ&ïȶ£¼M°'^Jëš¼ŽJôM¬U“1âù¼~ª±ù3™~Òºã\tßpýÔX¶…ÚbN¡^cœµ²+»\ÚðýØÙJ\2xΊâ\Ÿ‹Ûá×ô{–¶ -âÈyü§& ¦ðÿ¸kúÕQŸCÏcߥ½vstö…ZO.ã9bYð®9kÎAìâ˜5NhaÛ­sM¤åÓ6¯ë­êš²Þ‘ÿuGÓµ›ÎŠí;yMÈÌÝAU¢k=Ù´¥&ˆÿ³¯æ££®ÈëÙDG§,ûýúmJÙ¢Èoؽf÷qÚæuõ‘Ö‹¬î?Vm™œ³üyKtuhuSʶÉëëcÙõÍâh>r¶/¶óy?¥Û‹±Oòì¡oÕ’#e?ëß {+öj‹®{%6_Æöp ×O‘½)¶sìÚX¿ì³a?ö’ý®ÞTÖ¢ì¾ Y¯ÿ IþÇDúþÛdŠdÜ•]-“¡<±¶VlŽ¬#ãàžÜ ™ ål­%¬ "¼F×y¨ÇÁ]þ2ÊÙZKøí› ó¼{sí¯=þŽÂßQRŽþØ™ãeo¶ý#jý-Ò§92/J¥%7”q†ò̽Œsohk-ɺ'똬K2¿Äßdüä½ÿïwdŒ–Íq¬ïò}Í»Yß.¹ßj’ØVº”ÏvÝZffÊ\˜”½JæÂ$Ÿè[á\|xïèˆx·,Þ@™ë­ê§uÌÅé=àµ×+,ùÿœE‹¿RæÂ$˜ÍxÅÔ7µ>ìµzößVÖ¢Þ®“P?´—³ÆÛ-Óm|·$±/w@7 .ã(±¦ TVyÕ2)Ò{!¡öc>…V/q¿,ŠwÒ•¹ö¶q»‘ø3Ï‚Îû'ìÁÇNp×âýô9¬Á–a·ãÓBx˜ëBÚ¾0Ýu),áº"Òâ24ÒÛÁÒHŸBÛ¨=ñ-(Ä—j{M‰þÒ«ÐþľBS§;Mß®íæ@/àgi¡Ïxü®;ýK¡;}ìYX »ÍWR”À{ÄÌ’Bîõïoà™}Zn>“‰ñmÌléb¶KÎ?‹þup¹ ñÖËw›^ÃX_™ó$ãMbN§óÜHè}ˆå^O¹Èê"3‚ë 9Õ93d¼œmN”ÐÏŒ•Åfšï¼"§»“e€ÄÝ+]ÙG½ÌêØ¥òcs}.&?ìåÙÒÍýXž1È‡Þ 'ã^%Sàk‰ûSÜaäÉØób:Ç dŒRù©Û}ù¤Œ Ïw4ígÀè˜ku£s·ÜâN”1îý2Í̤Ok¹Ù­–vn©¾å¨Üî^I¿ -¤Ÿ;¥ZãlÕw"´ÖOè3ÄQ­sçh¥[¡;èsµ?”ýR.+ýú_ïY]‹^Ÿïgô#ï_²Ú?[gy)µÇ¡°ÔÂ÷Ýç‰Ó ýø…­ rX—*ÍÅ:#¢¶ðúOüØê-ª#î µæ¥:Þÿœø>úå#›Ãl {xfªÕ °ÜæÞ0ïµ’Ö¼åuöW%´‰Î€nã|¢9ЄÑ9êæíÐ n½î¥O}~bkI÷-çÿJ«§Â3B~$^¼ÊÙØîQ ñþ¦L«íXìÇ—ÂñDÿÇ~ÕGU]ñsï}Én° Ÿ*²÷­† $˜5›`TvÑbx„†©a›l 즛I1-ÈØ©LÖ©vŠ¨Y‹!åÁv¥ý£ôC)Ú¡3ýÇB[u¦u†×ß½»Lí×Ðé8Öy»ó;çÜ{Ï=ç¼ûν÷¼^QL­ÆÕîOŠá;i;¬ö›Îëî9#ì‰Ý¸oOºßUu橽¬ö Öá6ëgØzQÕ] ÕŽ\-R÷t7¨:-/¸ªÖãðƒ>w/ßwñ U3 ž^¥sLJ÷é£räˆÎ6à> ¼À+(À—ÓV¶†z€m@³5îãà÷·±‹t«è¢UÀWùr7ýV~ÍVù$*aë=š [{Ø݈¼Z÷ÃG O"·bìrm9=^À˜×W8þ¼§¾pn4ó¸{š‡‘c«±·³¨ÃîÏT©ï¢^÷7ê=á<9|¹{ kpíßáoëËÜß—Õ•6«±­àR½Œ÷sA©Åwèzrv¡~8‹3ª¾‚Sõ¸â°¸”oÿP·M¤QC/}sa}Æ€À;¾ \õ€3õâ·ógëÅk|ãh–>a»P/XØDZn·éÚn¡ûµKµø'jm]"¾?mtÇÄÓȽ—h!ìn°_i60þöÁOBåW~'Ò– óÙ÷?Û_‰õsœP¿õàÁƒZÏNC“%Ê&¿µ 3ºï+ÈœÆó÷ ²@ÿÇÙ ÛE´ CÞQÈÑódQ-À? ©…6Pܦ$%€4õQîYŒV -²¢1ôwj -ŒD© ‹šÑ·óÓÔ«[qð8´·€¶C³ãݺעåà÷i­$úb°daTÄ€´öÑ5–¢MèKRÇŸ²šÐóóZÑêDKEdÑJH1ÝÊ{N ·R[°´í :~‹ÚÐÚŒQW§Ö®xÞªZ° lµlˆ[v2‘L÷õÄ­ÅÉTO2Kw&V´«Ëjî\¿!Ýk5Ç{ã©-ñöŠ¥ - MËÊ[:»ã½Ëã÷5'»c‰+ç×'»Ú—¦c]mv˧£¢Ç, ZzÔêìµbV:kwÇR›¬dÇ¿ ÜêLXiŒµ&:Óñvke:–†¥X¢½2™²’IYmÉ͉tª3Þ[ñ_Lž¥Ôû ÔD˨ü©”O¤¿¦Ñ -¼ÔùTvæ-Õ/¸ ÚmˆªEÛ]WÙ¥ÓêÓ±ù¿då3µÅÔ¡éžmwƒtœþÉïUjoŠ“Nµ¤èñ:-"À уâ ÃÀ)Àp‰cûª"Yðò -Í97TVÎ5³ªFÅ1~‚f“Dǘ3uºuêë B¸6/ìŸ;¿êltœ¥ó£bŒæägíŸSQu!+Æ°]Å»|ü°û ?áÜŠdù‰ý׆ª&D§ÃÃ: T -: pÊ€¾«¥µ {´T ºhâ'"Ï Ü"’«­«ŠØ ÏÈWä1ùcyN­í2-¿. CN–eò&¹D“H>$Gä¥8•{;ÇÉ=™Î͹\Î~ÛæØOÚ/Ú£¶aÛ5ýFïçý‚— -vJœç…+ŒGÅ G…Ñ$ÖŠ¤èÆ æGù)näN #?ð¨0¤¨‹D“0ú£Ñ›)©éZM›4]¤i¥¦RÓRM]MÏ+*:œ`Mi´ŒŸQsA³€ÀZœÁZœ¡¤n ò“è?‰5*•À"`-`ð3øŸÄÿVm2#ƨ„qòÓ´iH›‰Wú#Ñ+ùv¶›‘ÉnÕtª¢^Qöš¦{5Ý™0? -˜¿˜¿˜gæ[ssÀì ˜ñ€Ù0GødªÞžÈ5æÇ5æüsF™åS^)]RJ%#| --á[{†Ìò›[‚Õ8ö\y„W‘ͱ¶¼Â‘Éh ŸG’ÍD»|ø\Ýoò9,‚m-¹dݺ?@!CÍ›á„ÎÁÚt'›êçË,;îØ°£Žýؘcçä6’÷Ä9r=,²ƒ°¸m‡ÂÊ{™Âì ðŒÁ¬a'<„€Ø‹(uÖ£ûðø³Np†à«Ážq‚u`O;Á{áâ)ªÖ.îWŽ°>²µå-*€è¶9ÿl¬ž»À{ -“àªSþ™X§Ú¦\wPP÷·Qæw8öu*òÅ•^…øøÍÒí…Nè&v‚𢠶VåÔ ¡)átšWç—hš¼ìJ§:æwì>°bG9á‚ʇحf?‹L’çCóäï`üýà2ù.žé¬eÌ‘ï@yæù¶ÌÉ_jÕƒòáòt0ËV9ò§ušålÍ~d¨XéMqvË“‡Õëtä¡,\!_ÕÉ×Bµr Sg:r¤nį”÷³n(ï˲ȡ.¹7˜“OWgÙ‘Rùí{XúoVŸÃa’5ày[°Vö«éåý¡e²Oi”_±gËa˜Ôaß)Û‚;åºP³¼»nD½Z )yÂñ³²ÏØ”÷¶,¼[6Vò#—Öe¹ -òóu9Ùœ+ÃÞÌÈTYo7Ë(V#Ú)†»dEpœ‡ÙNŸ,Çr¨ æ Ig«HÙZs„ßE>Ç>¶#Ráû•ï9ßnß*ßm¾›| |7øfùfú,ßdÿDÿÿxÿçüãü~±ßðs?ù'gÝw#óÍäâ ŠŠZžÀUÕ·9S[Þ˜ñ­¸gõËŒ}달1s¬¿le>Zy}–ûÂÝ™¢ëëYfb#5¶Ô_å YѲ:Ë\5ãÓ3¯>ŒÓê/Ä”ÏKAÇg6)I-õ ¢% -éIº–ºîtñ"ÙÁ…Œ:x‚];v3½xÍÿ ¤ÓìQÿ“nþ'öÞÌ¢ºõØ}oö}?û̾âp’ÄXNl›By‡$^*z%~+ÞX¿¸Gß³éì‡é,%Þ­¶øLÙâ «”ÝG­Ãûö\koÜšk# v{NsÚ˜ßbžæ,°‰Ñ>¤-¤Ç -ëÒ>b0s]‰Õ%§È08FÓÈb@ ¾²â -²)ùå‚SR\!8•\€ª¶URâ–W*I*½¤UÙ´š^ʦa„<ÃäÜ@Ä‹xF\ʧ9£ä¦’›R.nä %w”Ü™ý‹=™Fy¯eÒF³í‰i×ïULDŸ¯å$Å>®†ÉMn}‘³ÅnÖ¡¬I*EËô¸!"w8n+q‰Û¸^o‡Å6 ;pc#£¿&Bg²JÒ_Ê×ò5”à¯AiÒû¾¤¿è=ó¥(¤cÐ[ç= . ˜Ë¸åºß:ž‡q½Šò’`Œnq|ÍÆÈ8ëÀò[€ ÿÇþ endstream endobj 29 0 obj <> endobj 32 0 obj <>stream -H‰Œ– XTG€«æÍ«3"· :óÞ ¼‰ְȺêÅsÝD#YÝͪ ‚*‡ â™¨dƒ,⌊·‚xá ("jDT@Eðžqo㸚¸~&f€Ù`ÙäÛ/_¶ç«êê¾þ§«û¥NŸ .DŒõN´6“¨˜¤è”ú auà>¾ýºtÕhEI§÷ ouëøvÐoz¼üÛž¡¿ëõûÞ}úþ!ìÝ~ýà 4xÈÐ?ûÓ{ïñÁȈÿc¯LðLgóÅÌ[Å$”r…âÖh§®Lz8;MpÚìÌÞ•—cVåÖ&ƒáWš*DÁôTÕ¼ŸÌ¥¶èy¿ò¯ ‡¨2ÛFé¿–é'‘«"Ûí±ÿ‡X»§SOü¶A:,â"!A,‡%° vÁvpƒ,ô X ßÂw° Ö@&"{G_ÀfØ ÿ‚—ð -¶Â^8•°&@ dÃD¨‚X8àTC \„ÇWà2ÔB!L‚ç°®BÔÃdø¬°âa -$@$ÂTÈ…d˜)0fÀLH…Y0žÀ˜sáS˜ŸA äÁBXÀ^÷Ïá)<ƒc˜ƒkP*‘4âZ\‡ëq4A3 -èv܈›p3nÁ\ÌCgT¡;àVܯá{ÜŽ;p'æcîÂݸ÷â>,Äýxâ!< ?À5ÌÂ%x‹°Kð(º`G<†¥èŠnèŽ`»è‰^xËÐ;áR<åxOáiü}ÐöÃìŒ~x+° vE jñ,VÂøîÁ}QBêñžÇ X…ÕXƒñúcÊhÀËX‹W°ëñ*”â[Ø »c <€‡x²h -¥e´œ¾¤lZA_ÑJZE«)‡ÖÐZ>€ÖÑzØIh#m¢Í´…r)¶Ò6ÚN;h'å+ã• T@»h7í¡½´ -i? ƒtˆÓe¢2‰Š¨˜Jè(£R:Net‚Êé$¢Óô5¡ -:K•tŽÎÓª¢jª¡‹t‰.S­²QÙ¤lVÚyàÙ‡ ÏñJžç‰x'Þ™WñjºBuTO×è:Ý ›t‹n“‘Lt‡ÌÔ@ºK÷è>= ‡ôˆÓVéOÉJÏèŸô¯ã ¼‰·ð6Õ‚›à.xž‚—à-t|_¡³ÐEè*h­ -’ ôjOµ—Ú[íª6«ÿMs}GgYdaçÎwgî}ï|@è=´„$š"½÷^,€k¥œƒ¨ô&5tiî®(ˆ¸k[eé ½†ÞkH€Ùq÷ì÷¯9sæœ9¿3ó<§åŒdÊY9'çå‚\”K.ËÝwÙ.Ç=pÝ#—ë»'î©Ë‹Qe+ÚJ6ÎV¶ñ6Á&Ú*6 㤨³£í;ÖŽ³ãí;ÑN²“í;Õ~d§Ùév†igÙÙ6Ãαsí¼àPpÚÎŽØv¡]äß®Åþ [j—ÙåöûWû7ûwûip48N‡ƒ“v…ýÌ~nWÚUö »Ú®±kí—výÊ®·_Û v£Ý$Å¥„””RRZÊHY‰•rR^*HE©$qRYâ%!’™C"#©15¡¦ÔŒšG†R jI­¨5µ¡¶ÔŽÚSêH¨3u¡®ÔºSêI½¨7õ¡¨/õ£þ‘y’(U$I’%EªJ5I•ËrE®Ê5¹.iR]Òi:Í ™4‹fSÍ¡¹4æÓZH‹ècZLKhy¢: ʪ[궺£N¨»êžÊRÙ*G=PÕ#•¤rÕcõD=UÉ>Sà&hˆ‚  ¡JQÈù¡Ä@A(…UU(EU5• -Å 8”€’P -JC( ±>›MóI£‚JSÕ¡¢J‡J•! ª@’ÔšrLŽË ¹!7å–ܦm )PªA*¤AuH‡PjAmú¶ÃHxFÁûð|£a Œ…q0&Ðï0&ÑÚI»h7í¡½´öÓúƒÒ!:LGè(£ãt‚NÒ):Mg(“ÎÒ9:Oè"]¢Ët•®ÑuºA7éݦ;t—îQݧlÊ¡ôÁd˜‚0†ré1ÄBô„žba,‚E±åqÀŠ‹c ÖadÖ‰™CvXKai,ƒe1–£œós,‡å±Vä.È…¸0á¢\Œ‹s .É¥¸4—á²Ëå¸}PÕ'u¦¾ ¯èú–¾wà.܃,¸Ù°>ƒÏÊZùRÖÉ#É•ÇòDžJ<„G á <…<h¥Akë1“±.ÖÃçðy¿»6ÁfØ[a;ì„Ý°—ŽÅ¾ø¾‚ƒñ |‡ëxé3Ñh‹ãq"NÆ©8 gø|”sq>.ô}r‰NÂeø ~Š+q ~…ñü¿ÇŸðßhvàܧSðÆãxÏé4¼„×ðÞÃÌÅ<ßw¬OïùMŒ)dŠék¦„)ãÛO9Ÿå+˜J¦²I0UL²©jRuMSÝç±:¾=çs~#ÓD“ijš™æ¦…iiZ™Ö¦ikÚ™ö¦ƒéh:™Î¦‹éjº™î¦‡éizù•Þ²^6üÿ~t¨E»ÿÝécú›æ53Hþá”CÇ.êb\W•qå]œ‹w‰.ÉUs鮶«ë¸Æ®¹kíڻή»ëíú¹îU7È ‘“ÑbÑâê¤:¥N«3*Så¼0U¡#!†&´!…†¡„.Œ†ùÂüa0&, - «sê|$;’yyyɕݲGöÊ>Ù/ä9(‡ä°‘£p®ÀU¸&[‚õÁ×0ÕlQ5‚MÁ7Á/êB°!Øü*[ƒ±Áæ`’nçûf'ßž:Êá`‹š®fÈ6ÝUwÓÝuÝYw Ÿ†y÷Õ%Qª¶h‰ÀÏ‘‚Ĺb¥€Ä¸]n·Ûãö‹‚Á¿ƒA†jÌT Õp5[e¨9jDðO5JØ 5ÃÌØ*ßÊwò½ü ?Ê¿ä'ùY6Ã6ø ¶Ãï°vÂ.Ø {`/ìƒýpNÁi8™pÎÁy¸á’×YßkìŒ]°«ŽÕåty]Á›€ñeï´=vÀŽ^i?ì/z¹­± ¶õÖ~Å-¸Õ{Û‰»p··û.Åa^ñ›ø¾­ãu‚NÔU¼æ÷p¾ï%Oñž'yÏyßê$ìUÏÖ)ºª®¦Suš®®Óu ¯4 ïc¶{oàMï´€—ZðÏ3½Ó²f°·:ļ®¯é«~®{— ½ÌÆ^úÌij^o¢7ï 'a3“jÒ¼é8ï9Å+®kê™úº¦®¥ïé,œÄb›ÿNi=7(y™~ÎûùßUÕuÆ¿ïÞ÷DE” ›ËŸ ²PÄ…fÁŒÆñ8l)hõ˜è1.©&k:š[jÕž˜ã[rÊÃ… V%jcšàVkŽG=±&JôôDÓ™×ß5t.3Üwï}÷~Ûý¾ßï¦/Ï|¨Î%Ý7Çl•¡`-;¾>1@ä|kéÍ¢/„$?OnR€%#Q"GQ>‡P8€UÅ‘NùT@a”<ØXs(}Ç9ôÇÐÚBh2õ¦Làî­<Þü¸ùWSÞÞÅD9×üŠ -©ÀügÎßÄÁÔ3A¬›W°ÃBZC€cL*¦êVìR@Si¾ù1•ÐY.æ™fšü¾‚6Ÿ¢ëü7+ªé¡Tð‚W€ÂC9NÖ˜»(M½ÐeŸyÜ<v1kÐm‘ ä˜ß“ƒn*lV„Òp´ùàt™#8UfS0¥à¬Y`õ22æ‚9l^Îõ2ØÜmF‚¬¤V^ÂÍ®^PïšË¨ôK¤^°™OèÝÂn9É\€Lñ§‘'Jd­âPj•:å¨òPí©õõµÂêÖ>ChÚ,p¶e°uÚ1ºv Æ’Ìc9;Íæ—ø5^Ïïñ60§F°–3ü-ðÝÂÖ¡²³òì+ã¥S¾/[»rQùÉVÚÞ×wÄwÇìj&˜ÃÍõæó’Ùæ÷BD|e#ºæ‚Ù½ ù8è‡È{'é¼…Ÿýí:xè}ú ¬.l*|IJ„v3Øͯ‚¥m›û9ú:?’ì& ÅÃå‰ ¶Ûþ -¡ËL¹Dþ^þC>P–ªÃÐêÔ}ê݀붘À–‡›Û¯øÈWí«õm6S‹ˆ¼PܹÊBÌåÁË`¨/ƒ¡ZÜtÚ*Äa=Ún:HŸñžF»D—ýòZÍb¹?øÙ¨€?UDë}<“hñp%|ÛÑ–s ÿv#ocýöíà}_¡’܃NŒš)ÆC£1SÌB›-ÊG׊½h§Ä—â2ï"{"Ó’.ù ù–ôJCî•ÿ”ç•X%SÉUæ*'”³ÐýHXgM“´LvÙ©w8žxår ôwOâáM+pÈ|ÁA…ò}Ô2úlتš“íÊZ>¹†_£ž)O…éêÙ¶3Ÿ7¬éë&(Ÿïú»óÃù]…ò±gƒ~ÌO‘j&œ?Ô5ü©E å·Oº'»_"?±¶oE`ãå ¸¬Á±§vNaücÛ¯ ˆ:†7éˆ:¶ ~~Y—}u¨œ©*¦è蓤&ÓBUL ó%†b&A%dhhB#ª1,¢h -P§O>ŸKá…œ’ÂäNWßR±X„6»˜ø¿^Rè—ðíGÑ0+Ã8t@H¿ðð&ݹx•ê›‚ïÀ™|é|éÂ_×jÛ˜Aý?}9¬Õ—úL_ƒÅcEÑÅA¤³FÁC¢èäWÔîÚÓ¹@”&hþ‹ë^A4C¡;Þ¤ú¯Ò'KO–6œ$éæˤ2ë/ÿ™yÀìfà…5uÞWñ}ì}Öyßuß3[ýW»ÀIœWD’It‰ž0W„+ë\ï1Áuà ®{•`ë*6¯bž`m7!X] -êÀ>Ï ³ìYþŒiÜ<&L0ïWÏÂY³ÑÏ -¬A„"M¢¹ªZØëÜëù&ó Óaçáêqëuézõ¬ûoÜa±#KUœìF§ïÀà²Aû:5'pc7r÷i¤\þŒù­vŸÙûþžÝŠ³ 9‚Ýšu€½¯¸ÒU™b†øcÏSG.ðG´ôb¹:Td&ätI.ÄZÍv™¬“[†žP"K(›É"C³+ U2pÑ(JŠÜP!×:(/Ã,ÈeIâ¹Æ³öS(ÏkF{Iö„‰¼ÄÚ»bK˜ -åObtÎœwÙœÊê5?¥`. k s(à‡l05kÃb•mm±Ç1 -Q"©ÿNß)*½~ç‡ä”Õöö®'Žn?ûÕ®ÁgwŸcž1•”~]*Ý.-þç64ÃõðTï»o”~_º0ñbTƒÎ¿6ãåb©›®(Ý]‰a¡ ‹NzKך¦Ž@zøÛÒÝãħž.ÿ›ú#5šA -mÑ,Æ ÚQ-Õ;?Å‹Siݽwõį'à·¸‰†7S7Þo¸˜m¸ÿ¸Aˆs]Ü–Š-âæø ¸—? ÎÅ/Àëð:oR9x,}–þAÃÍ4H÷§Ÿ«Nˆg—à…ö[𣴯êO¿˜¤6ñÈaw ¤>Ëm1ñ¯$Œª<©$•ú:¥^Vê#)õ¢úŽJÑêµO}I}M=¯¾¥þ\ý¥úµ¨©PMVò~ÿužF|’ïåòßåÏóüþ7¼`äÝü!žª´ó”dùòÅÈÞÆä&ÙÆF$i%f•|Ò3ÒAé¼tIº%q’>‘%J’4 ŽIÈÇ!£µÞWßXŸ©§ë;#VÙ'#ù4 -aT¸%Ð~‚°€„|GÃZúXiéá4JÿÔnýïêúë2e7t+ ·¢Ö(£åØAÒ¨‰Ñ˜~f˜¡熶íR6ŸÐ#%›SúŠ¹ùœò‹,Îææ³Ù‘^Ê.ÌeA&cO(¤Ÿ¤–ù".â¥ù9\´‰‰lnÄ®["AM"ïò8eI¥@V#—Y}³¹f’ª%²CÍM$t¢míž S´•P@6†!‹×æ&¿à…5ÁvªÕ °Çì…†Úè¤è^ÉÌ«þ2¹àH. È s -È‘6™ Ö„â±9 …‚Äã•úQaµµEVÖVY¥GÈêÍa»"¥FÑæ‹cýÏ`\Ôê[çò„6'3ÛG>Ìײ˩sÚtë_6-´Å¡P8mÄÀÄÂ--qÒ¬—¿:ü³á£ï=œ8WþÂz“êææ–ðÆLïÒÒÑܽ±³ÿ=ÞÔ²‡¾0Páq#yéÇ¥áÑ`rsû›Íö·ëuÈÖòÜÿ˜.ÿØ&Î3Žß{çÜù’³ïì»ó8ñùοbŸís’3ù‰}„†¦@€‰«ËÆKÇh~L@)Û(´¥@+F×MT¢)“JÕv‚5”¦ ¦)•˜*a: ±öЄª)4¨&µ){Þ;ÃÉïs÷æüÚ~Þçó}¾/µT,Nܱ¶Þ£Q‚E#ìÛÑYr6~ÝD#™F7Ê‘Yi­²™ý²ÝÞ8="¾/¾/Íç¤3ÑsñÙ襤@²HPÞ–qj¤†®#Ò…$D"U”CáÐmòý3”jbÔ!WïE^áèWp´"¬ÏäšB§àÍ'“·@#ø¥…lé`êÏáx¦M7k —ËyM&œè>dwF½ªðv´õá“v£››úgpÝ3aÛá"¶ ià.ióC–Ì.œs‡±t*]§.€Z@YÊÀìØï¯oÞuõµ÷»û†Yp.JQ3¬kYûº;¡ŸìDÍŸíä/Ö÷<²bS%î>öâ>½€YY ¬ +Q"ž³âoxÞñœõ|pùý]n"*DÉ ’gÝ¡ãJt6Î3 – ðs§¸øöGnýEŽs7)3hƒîTSK„[p“î,Bd(k'Ð âÑJDžB5e8Ld8Zäk•Q3ÈqcÊ %…RæÅ’ñ[PV\B¸Ð½'ôPDqN!ýKçn®Šqeîîð2'Ü›ûÝ«:È<„¦MËzÄD2ž$iª-I“´7©‰©4‘õÀô©i”æudS’µ)1Æ=ãâ¸6ž=e\0èqïnÿöàîøxfW~_ð`þ Ï‘ÀÑÜÛ÷rçrÞçù>ïbuĦÛpè6êtuºñê#DÕ'(7”ð†§ -©ÍV¼$Ú;þ`Ë»¨Oiw¾û›mŽ-™}|ôÃÑÅ£},Wxyé–d(i˜ù`Ûº Ë¿úd«¤Æ\êð/×”§öþáÈ­çÌE¨yK µ%;¿ï¤¼ùÖïÞM‰* ªÀ˜LÄPÉZGû—IUiL•¿Ú)1ÉÆäÇäEßeò2uÕsUþ7õOãnôR”Í5ÔfjLÛAíÖ^ öyozþ.³Y÷ýr³¬ŽË æ¦ÜÕ†X€@K3¨ít$%2à·£Ó\°Í5ìnÀ -kfài„7°Çyjòš8Z!_‰h6´Š¶A»¥¹´X†G -`Ø!ÔɳcÔïÄTÑ´«†ƒrª H«u«Xï†ç«70ƒºŽ‹ì¡MáÝyìãïVo áâ„]!Ð&[“¡`8HÒ-~%J4K(Šú"Q”apê"‹í¤Ž7y©NÇÃè‡ýcÌ°ÊTuþ>»~ð»ý»µå3;k[ÖÌ¿{èò¿âI9nª}èÞ¹­^¼6ptÏÔžó7‘üão=«ø;GŽÆ!pL€³AéÖ“–hQI^nä‹¥“;6Â6Ãß,¡>’ŠÄBb9úÄúVRhâ+¹äËìþüë™]gÙ2g -·÷ilìdKtÝ[Ñàl3lFéV†”WÝ/e²'ò'7YC‰Õ“ ÕË$¤rÆcp¶co†b/[þž²•J›e+ªÀ ‡ÌbáOûCfy†rY²$aD¥Ö®#×j”e´›Ô ÕbqPÁíG f0ÕÊÙ¨ù+8ZðmcChh(Ô;s¿fK¯§õv„&M* 2pw£h+“€“S¾b ~@ †TO -ö¤€xAHa†j°¤”Y„¥Hñ¦b’¦¥¦ôþ<fsV[ÆÌaÃÌçÆr?ÏQ«rµ™Û1 vÙvRÀí~¼ßÂ\(®óÕ‰¯¡Fæìi]w@îŸ×ûÁsØC×=±d)ª©Ìé¶èÎìY¢ ?; éÃJܪ˜ ÃØTà Õ#~ùzìj¬#UŽ‚uã“Ö°wvuØ ®),Ú]΀ÇÎÆy¦Ã®4ÊiÙõ»ùkÔ7Ý.†ÆÎ/¥'ó »Ê¿ýtåÄè{ÞùYmýàS{øã}Ï^?U]Ú»jå‚þUùضÍjÏöß¼rŒl¥Þ|¦½mAߦ×W7ôe²`½ôÄ+j{ûÚbá±°59¸·Ø>õô‹åm3¿{æØô¢âWw|J©sõÒÅa_4€Õ‚puCÏÏ¡kg úþíšz -6½ËJfÃ’\U¨H¦¡Ð)ÚÅ{È)Ar´ÿ¤÷¼—Œ BL(Þòs˧¥Š×Ø„â‰Ç[Š:C~f}/Þ–Prñ8ŠÀ[‰Ðf£©ª×ëit+,b³’h©‹*¢5ø¨)Z K¢µ^=½pSl‡!݃ž‡AKÀÕ-Z‚ϼ$"^D1ñ’H -"ñQÌ¡€”©iÆq&Ê%üC¦a);Âjv„í+Ù1W°£å8 -„cã²mi{ -¾Øí42ÒÒµ4…§¦»zM;;v„/e?ʶªf:œ_áX\YP¡ MÕ~¡~zIƒƒÖµ‡ØôƒŠA· «`ëgOSXºPÕv -*&¸©¢ÚŸ!q/8#çN xàÄÖk…y"BÅ‹«W•*ÖÁò‡ª“P³:”¬ocÖá8)\ªç³Om4ƒåñÿæÀÀÿiøùÁu?ý/áåÛ¶uÅq^R¢”t¯hê-’’HI–JN*Yq­FTœÙÊÃŽ·¥YãÀkº<€-à$Ûº$èì ]ƒ ŒµC¾Öë>ìñ%^œ¦î^q‘fm‡164M· PcH€yÛ#ºYÙ¹”ç1`‚Ásu)^ƒ÷þÿçüN®û©VfSD ±î]pW+Óñg·¯òÙCçfZ¯­8tÝ‘ŒF?üZ²ú™–p(’rê:Ÿå.¥ìLSä/5û1F`âÌŸÍ 2åÕ±Ÿ™¸ê'"‰ó!])L¦¼ºê§-¬«ñ_¢¿êóð¶þroùx“Až8/úÝ.ºq˜e\ÄźL.çñ`¯êe½ùpÈ„åCt3ž¬Ð0—ÐÊVì -YÑ,=åÙš!« 1•Q…U•ÊŒ2«ØJJ]™†Á‚rKáå‘H6²²Ü©@õe+“X[]@ë5¥·ëá}†=Í4Æö›æØØï‹-ÇE*nµ³&Ls«5v°jÓu6:Ȧ`˜wnw¾ î,¢¿™l"Ð÷ûkßMöû©×.»¢B&žJ¥´jüiï!ïIïóþ)ï÷bß÷žÇçÉO£½—ðMr›H,æˆ+»E{;Ý™I¤äsR®§„ÛÒNC-2Ø‘—B©´ªu7•åêµk×ê«×êË´±ò`iµ3O2:S$:)öhvŒ‰,ÇŇ WÕíTw0Rƒ9]Õ!°°j€Hj@ÕUMÓòºZÔ4Îþ6 ô°O *> $QŽK°ö*rœ`‹œ=*SdÜ.Þw#^”÷+ÀŒfX×µ`ÀýqÏ?zØÉÔ°ØæFrÍ£‰¹œ¹çÑ…‹¾äÈÇ`¤˜Áø(–U™•ŸW3*Uc>Ÿ£2 `ÚRn!·˜»•³å"¥ž_!ŽI2#h‰bP8* PÅÝñ¥Õ¥••ñÕ¿’•ŠP(|D†ÉÊJxu‰ -ÁjØœçŠß äÛ¹b¸0NG㌿/Lë" Œu}pLœ5gíœu…æ$ ƒU«½P@3ÉÏ;]Á¶=­zÁ9 -ëí’Lô£ÚØ‹GþòmÀç–œóoÕº·´äŽ_ÿóÒ'c1Ý™NsOLjýæp -Ôö…¶ ÜÿËÅX´WÏê =€ÑDêØ"š¶3äN˘k¦„yô˜çÖ-¸ëß߸o<î½/QãÁÛïbþëÀnƒìˆ©±HUÓ­T¸‹©1ƒj$íAõV#º*ͳ^JºÚ SJ5tµ¦¥°®viš™E)]Íγ7ßÔÌ~TÕÕ~›ym«®jš#eô&ȦÔ6±)GÜn›ƒäkýÝY©ËÝ4‡,{ZI•™æLs¶¹Ð´5Añ>ŒUÌâ|4%3Bëãk‘+‘ëÎŒLGØÈd*_4à–aÝ2®× Î4¦ Ö¸ÃàªZe«ù­ åTù@ãVƒiÌ6\ .‹ ®jγŸŸKÒ‚Vhó¸UÍ,«­®ÅñZÛ ”¸jôC7~˜,“û9ƒý[¯kVK¥—6ÆdÁkç{2ñÌF{QA¼C¢ -òxKü&ÅÌö=§LQM8] §’µ«®d–I$D+(T¸³gž1õÍ[M–÷èž²ÇlÞì»í»#®ÝÂBÓ¾™ÝÍïö|ÊÛhOpüÄ>«Ä6ARAÙÚè9¨óó÷þ5EÖŠPz¡—ùçýè÷¶ç!Zß±ÐþŽ;÷Iç9ˆôûÏ…>f½ÜC“¸þqÀ*áÿ_Œi¯bM9èÜ#~øÅ‘±ÓÉÑWGŸ;idÁç}1Q*È…g ¨ÑŠg ,•bÝÉRî)Và~|fÏÀž½c£û¾s¾uöXj´={½ò¶d½ÞrŽ¦© ´ŸC¯Lšz@ÝÙr¬óVZ8Æ+-´y± -¾(°6Ê‹·ßú\<2¨–6﬌Ȭ˜æ¹ØÜQ.ÀW€"¹èã+bdׂê#IR¸€¯`'ŠÅ%]ÅmvÌ/j)7°¤ÅŽ ÊŽ ˆ² iÉDcŸ;rÄÎÙ±yôìÜ"BhþÞæÞpb˜ï¶h2(NJ },¡„t]b%Š–`¥D±R2+½p”¨7$ -˜eK‰²¥DÙ’HH¢@‰UcÖ`KÆØhÒèФa£C•F‡"]º´öUñNÙÉf3÷±2ƒJ™…Ìb†Ët°2ÓÁÊL'õr&²a'-š$à$̬Œ¯k˲#éðäJá8àdm¹–1e¢Í”‰5¦Ä”)kL‰)SbÊ”˜2%~”)¡:=`eÌÚQóÿòãš½Ú|i×þoJ$™­„ˆXˆîÝ‘­´²yž:¼³ïõÖŽYH™ŽD3'kÉ3-áË›É6sǽ%îMС—I¢=føÝ(Êzø§/ãEŒ#”q¸œ‚lÚ¬ý†4j33…2¶![T£/´³b…¡v¨[a®ï©2¦Þ](/h‹Ëh¦v@£C»©½¦±U‘ÍEY… Öµ",Mãe¯,DR°ÆÔ¥leóqš9Û‡7¼<>BÖØÿ.Õð2Ó> Ú²•·¡$I³iUI(,/uºXžÏÄâÑx$ÎñØ+fá-e]¢Â„rù=¾,R8Ÿ‚ºÜ!…‰ÛCY¦“c -…|!Ÿ‡Œ Épc7êCÛÑvrÊcŸà'=“d"2ÅO{¦ÉTä=ö·ª{Ò1áÀ“áiÇ”w -O‡øãø>ÀD³“D›Y¶RC):ÖPzÖ*(=Ï jþÃWŸþðKw®?±=äšECÉz¥L:Ê]ýÖíï¾ûòë¨ûêû¨04üÉ툤žz%6)ÿ—íªmã,Ãßw¾;;¾‹ïüÛ±ÏöϱÝÔvri’&Áצÿ?ùéÖ@Ö†0Ú²©C´Cb-#c-Œ‰þ1hXéФR:5êhJ—MHd´B-ÛD3!XŒ†IÛ”˜÷=_»H`ëýžïçý¾ûþÞ÷}¾ ž`vy Šð ,ÒG͈¯è’xâ$^…—²—÷UàúšâD2! ¿à©Ú¯3¦6;½>x ð]x§GÎÑœ‹úʵóE˜îê1ÍXá@y®Ì”Êfy ›–ÔûL‘–DSgÅ9‘#¥>89`|ã–±ˆ0L$…Þ|vº!iáÕ°‚æ0l…?yOÕR-×T˶jy…êûp”,Ô^ h㥓úª†D$SÐãz6³ª!—¥z’|´9K›3YBì£-Ô‚\—fV6*& ‰ }bûh`"2ÿŠ:–(|=pB |¯á\â\ú¼v)p9=¥]üLómRg;ã gÀ@C­+-4„¬–<|VÏZç ¤í™^ —6-½k±&úÍrëÖ¡‡.jÏîìmiúìÕèÔÍëF—/n12&þŒãOøŽ9º%Y|òã§Þ=šŽ^<Òyÿíw=ƒk;!Ž/À ÈѬét¡SˆrͤÀ!þu:¦›ó>qUi³ŠñD­Z’-4³!è¤p¦À‘z¯!ÅI‚䔸œs< †Âa’¾ $,ª¾¡Ä-ªªjJoS\u·Hf¢<^c{Ezƒ Éñ‰¸[!îWè(aéèKgœsη¸¯˜ÉIa^Žy5]»oi+†…±¤…fÀ2fÓt,MIZN3é?æûv[w«ÆUáÁ›baAž¯½$Á -x9œÖåÀ»A -Ôæµ@± -wÝmí™­Q> £eZ¾2«[aäĺŽÞu«Ûúœîúx4LR§XìXvö\n½äxáon¬ônÛÀò¡tåÁ/ý¾£SŽE@ -:0Ü@¨1Êa¼¬Î3oÀµ0Sæ^¡”+¬\Ÿ ÈñËB™úä¿ËÈÎœœÉwÈkòO gÕ³Úeá‡êŒpM8‘«wå‚âfa»È›‚)2¾…œgJ1îPSðUžÇ`N7š~rÞW„ -£x§Ð DÎÇ”h+¨œ‰Òè }ÄLD·îø|œ^púºO°íØô ºÇ—š©¾}­.ÀïÆŒé® 0»IJN1)< AŒZ)íÁòZðߊ‡z¢’A‹F¿1j|ј0®¼ás%qL™Ý’Kq1.:×réh® '½¥&ÚdEQðüM‘VtùèñÇ ;çFÐ/üÔ•„0êBµ0tq™TÅÕT! e k³#+†ˆ÷Al¸×5•„²–Rc¤> ýq%Ó0„…0Š…0âÕ{c†ç è¿Ì5›`“½È1HÐå È%@‹ ÜU‘o/ÂÔ©¼°¸@äÛ¸S*šno¥hÖIÀZP •jZøåL3L L}nº†°T ™f !Pú­Y™L3ð’ÌLõ½ip§€ó/¡'n_û1»&ã`-èÚÀ·Q¿jQiŒXì=gÖ¢:Z1„GëÉêmXS+Ú™ïJéžcërkIªôêK©PJN7ÿ`S©§ûásÍëϞܱ9æõ…¯.¿zêáv-ÉÝüÖPßä@^h¡ÇwåK›6ìصïóW2’¤¢Ó«w˜Iv‰Dȳ¦ç´pZd¬DId†^‡óaGðCù¤PLÁ!ª;àÇ õ˜qN¸.Fc”e‰Ä)Ãåý¡àc€ß„Ý÷ã•’áýVôÏúçü$ŠÞ. ì/ÅE‹ì“!ü@‘T–æG*ðxCZ¸ØMå_•KtœŒSokPµbAK{¸æXÚ¼*ø’v:óæ›’.¯[›¼>|Ôë>òÕŸ¬g—–§ö-ý|°ßšÝדž¤¨Ã¿x ×Z©Î³eÇ $MŸy™h0»Kð"Ðæ4¦NŒ‰yq«ÈvŠßo¼Ü8ÓÈþÓù“6…z#…‰Ä¿ÂÉ~ö-'­:){NU%Mñ«jBSÒªÊñœ;r Np $† à Ÿ·#x‚G‚ÏãçäóHòyä÷ÛažƒÖx‡IÚüð]/`Ä íAG–üˆ¾FžÜÃæˆh­t¬u}¼&ÀÍÖœþàq~+çÄtVßù3È-{n[ÿGp^+…}ŽVÒøˆŠã3¿5ï"Ú×r’.©.ÁºæABì~"Aùo0ÏAîiÃ2ˆÇ¸Kìs0§EÒm~’¬†zƒ)ÃûYÍ\$|†ÔÁúÝ ‡­»‡wa?¹Σ -XϾC¢Ð¦èp†Wì}’qo Œçû_îË=¸Šò -àçîî½7Á0PBx$@HšÐ HWˆªT12&%WsƒÆgÍ£aBÜ^}»Ì‘|äDß>ƒvêÙçdÏ>[Ûe@z¹Ecwªú)ïŠz>;[ã£Æ8‘ç4Æùóƒ2¾~læ?üÕÄáC¬ùu_ȃ|Æ¿áÅâ°»ÚÄùîòh™»Üâ.Œt×FÎ"ç¹+¬:wa<§:òE/–õ÷s©É£û%ÙÏ£á©õbšæÝaárS,šüÍ9æ™ü–O»‡ú¡ñÁHªU‡^s¤“S,Õö+bÛ“É›ô;CˆÉ:¶TØ祷³ŽX÷C÷œý¤Œ6ys‚B.«s/˜ý4_!µOÏ©–1  Mî]àÅã|ýöIIIr$ÇÌ9Dl:.©ú_Œ*$ÓèA×>FAÅ^ÑÓÒ×iôÐO1kþ-)ªÕÑ'tËÍfÏã&žu6{çoÈ %ÒW*¢G‰™ú®…2'Ù’Aá&÷”—³ËɧåöÓÔA)"ÆþIŠ],éäÊ2ñÎ#è¼–¹Û½ºB%qßäûóÄ*l$¼N*M=¡cß¡îyMÆ+ιƒøXBì_.½#è¨J²Œ]ß{7ýå¦>Ñ<¥u‚úËhI‰Ìa=~aΠùF÷lt[ŽŽIêDny@ºPFj©uc¤ÒÖÒñ‰6z}½c2Ôß:%³t ›=Oð¼ˆ[cò}±äÛÏ’ß'Æ¿„=Ü*£­e„õ}á$S›âù[2Â~6¡ƒ:÷¸Ó“>ŽþÃ÷X÷ôÙ…±2g7v°šµ}xþ›Œµ÷ʈð·iÄV‘Çáën’õös²>ÒUÖXº›ÌþJ]Ë¿ÝO×A/õ¬>mžy—¤´yÞqŸ3~Æ6Χ{è¾fÎ)v£§·a`L¶L³6H=ì´Þbmƒ¬ =åîC¯e&$¶•¡µ0g¥ì@AžfØûá¼3]l׿ŒpUP¬Wd¦JÆ¿…cþX"úž¶úqÞu÷%¶ÃE2R±òÝ}J«ù;d˜óubl¡»O±W Ò¿M"ÞŸ ëíð Ùì,–>v¥ØéÓàW˜ ÇÒkù׊ÖhšŸ?«ý®¾ï*øªÑÿNjlèu„öË}¡¿»—ííQbméeô¹ƒ¼ä}'úךþÀ÷ÃVnSûy¥øíàwí¨Í¾óñíÀ'Z$¥ŠsŒùl'=*¥JDm,¿u;þÞö¨’aè©Ì©â,'Z·‰!Šµ„öÆߥF‡x»ŠüQ³OÝf)èzŸbà> -v%c•fþíJ‚^gª^í]kÖ›ïãÛyðû°Vœ×É/ïH&Ͻ‚2Ñgƒ6ìócI[s¾QØÞžÿOà;€&hü\߃‡[…®`jÔEÔª÷á‡ä‘V‰\yUäjÏW‘Bî$GôBþ -è{ -9y fìCò%{KµÓK6{u%c-S˜÷8¼Û§¥ÏCØÿ,üÖÑÿ¨†~ ó*<–1þvlmËÃȵ´/#WÀAú*™óÏÏÂlžÉÿW/Á(ˆíw…yW^Òz¤{èg+Û¹\«ôï¾ Þ!®K.êXïþ÷ïHúw‰6¤Ñƒwo:•p÷ùÔ;Ž/±ŸäD¨¥³¨)3µŽÖZVëg­}iîmÔ‘Þû»%ÈÎZ¿jí¬õ+ÒÜï§e*z?—ŸGb«•/A➌eΟ±µ Äž.¡ÝîEjËŠ$ÍcpòÜ…˜ûjh¿{yˆv¹,ÙÏi~lmc[ç´Ïµ}½9òrêùüþjàxG¦ÌÅ×KG¹û†sy;9:1Oÿ¯m?Ïû$ß.EJ´”s—¶®Kƒu@GíŽêÜëm뎄ö ʧŒ›v°.ñÛAZ·¶½X=Ó ó øÝõ‚ŸÞé,vøþêŸ!àÇâþæµ#«dÜåËÐnD ë½{WÏä3÷›ÈYIW¥(éçzïuɱîÞXÌqgér}èWÔÒjÔiYC;J,Ö¹3=fudÏA»ÕúÜÔ‡èÌœ}#ßâ)€H…`aü[s÷ä݇í©Ô€ÜsíwÜ‹ìu±½Z°=É=o™Þ÷hw¡Ý…Øœé$®`¼V¶y²q| L#fOFfEÖš9w26ÅÉ‘*òælg¤ŒwNºMÄôéš"c¤Ìúšäi¢o(sÇ‘K{Úç¥wô»ò•p“{¿æÍIµ2-’K :¡/Ç9‰ÔJ%kËÃ%äªâ|6ïñeEdžL SN19oµõIsv±v—Œ·ëÑËNIg¬ÈI&¯w—áºÖù”…ÈO¬-²Ó%Ýé{þ¦ IO®’tîjS’gH62›3ä%7IFÒRɈfH™æ+?¯šœè=S»æù^ýß´Ó=9ÉÿÏÁš@ÏÇÙÒ­=nSâ{ýuÑ’Î%Wòn“+Û®mF}\«¸çÈñk½\&ø>Öe3¯Ì“ƒ¹°všêÔèg‘,±ZÌÿˆåjrvx>ßÖæ[x:ÖYþ»°ÉsíÕB~m™ÎVìekÌÆX?&[ž òFÆ@C²wëÙÜyÎ|Ö)¿AÔΨ•=§¢öeÕI¾5IrÑÅ1h±ôÅ®÷Èp»ZwYSHý¢gìÆùŽPÿ5I9ïï›ÀDÃpìx¸ôå̹Šê˪q×虬?ºÖãúll)Ûèô‚”³w>{§²gš9ë8éfì3]ÒôûÃÚêSF^‘ÉFW•œa7ëõ?RSñŽåœ÷=§³ù“ý5‘“èý²L‰.åܼw"~ñŒdGâ—ÿá?¿·JwûˆŒ²¶+!´Ì=a%óœLŒìoH{9r.”J£}Iù[8g°YÎøVŒkO¨?ãÿe¿Üƒ«*î8þ»÷œsob€`* T"2 ÁG(Ïð -DlÁ‚T@0"ŽPS°µRéhÑv•2-¶:€E°µŒ©€êPmu¨:Ú -"¢,ÔÎ8uFrúùíÙs¹Ü¼¦âŸ›Ìçþv÷ìãwvÏþö»Gô½múÜ(MÙ0ÙhˆûØ,ä@½ð¸W"}“ó¥(Q‡o;c~0Ž×Nʇ6ßµ”i{ætº<”Ǩ|h«¶>”«í•-??ÊÕVåCyU~4W¯9?š+ï彿?šë·"Ê+Zð¯:Ê«ÿ?š›çžùPÞ³?&çCùä|?ˆO;á%î¨'°Ü%Â%ØÝØo`_ˆž‡¯Á›ÃÖ» -FEè_È6ߌhXeËל.3åôÝðNô,G5FX #¢±´mío;O™ë«ñ7×÷Žp(OÛ›±ê#Þkë̱ã>ùÝÐ;/ª¯ÏõM»çNzQÙ©nØz—‚éÉìÍRö(û4YÅ’dX¥½&¦tM<ƒe?›}œ ²Ó"÷ùûŽ(M_vг A¦sÅ\ºæœ5Þu2Œ³·Ÿ?‡x÷2ñkÏ=)2:îsHü½sª¿úÇäRba‡@øæ¶s¶-#F½Í=îÏÄÏ LÃ7üÓ1è_cûd=wuçFúé†ÅEï£ÉNq. “BoˆHj¤´ î–îÙóï^Ú½%b[t½ósÊÆ¿§e|៺MÆ3ÿeñرÖJþ^Pc OÀó°~+òe%LTŸÕ_£Ñ.#Ö€þF;{‰Ï¿à<ÆÙÛñã~ÏvÏv]¾®÷nÉ÷\ø–߇]Öê]¢¬)¿9%u€±‡Ik¨+–2û휄O­=Ç4n)>*ËÿM¶¾iÓè;'ó ñšì3{´4½˜19E8Oi®Œ 45?º.wSu›Z ¥Új¯÷ƒNèâ»ǾÂg¥·Æ£[ -Nâ«;^”Vïí·Úoû¼\õ’/áqï¦PÖÝÄ„ðçjÎf`¬»,¯[VZíW ”ÀÓ°)¯ú Hgž¬³í5Nzßá.ò,mfJ[o£Œó>”ÀŒ£}ì_u‘w#e{%ð*yoåèfyö¡¡?d> ý:ôE·®ÅÞ ½íõäùGX­S?¢ÎK®üŽ²™ØuVŸ—ZËl«ã·[ݾÌjzÕó,Y-¯:…©×Íèú5vœ+±³°ï L…¶¾Ö‹ëTŸ®|Š¶^ÇùÚAƤg1‡W…õ‰Oð½VÚ±¦çÀ`ÖZïC;¬ŽÚS`ù“É]²Hñn“"à a½·¬ ®'Æ} #ƒÑ2ÒßÅ·ñdx0E|;,Cƒéè?(ÑO5XßðëWã×IçÄ!|9n·¶>õWéW¸’uGe±W$¶É-€M\•™´ª·-‘"Ó}kÜTR®H­EG®5ÚJcO m~Èž«0» èùZ%—Z W…_+±ÃÍ7>NÊi³ÊîßUA9q…ïÊêÀ:Øš\%æ™\ÇŒ”®¶­Öá>ÞeçoýnÊ0%yIø…ô…t½’óükɳùwWÐ8ÏZN±œ±®ér¥â¿G=¥VyÜSüZÚn=Ÿj'ý•ä-ä×5‘/áÞR€¶Ô¶3ZÏ'KwÅ›ÆOkœgüË•ì{·’gW(ñ·–ýž›{ÿ¥áQw7K[bxGÒiÊÞóV‡_zƒÃùŽÚ£?3ß’H/êuå,™z™ø;‰øý})§M9±k°Ò¤+mUÜï&©–V­çƒÆu«ª[U“z›ÂkŒShû¿Öh¯ßj }6ÔÄÙÕhþ£ì t¨ÞÑ4™¸ÒøQÅŸÄÏ”ð‰dU/ˆ¥‰Ç¢˜dÒo²êlŒZÅ( 7S¿Kò¡(^yÄŸÄN­Ç<Ʊêc;%ï´qˆ=aø)\3u4XÂ¥Ø癇Ý&^•Ú88v¤õÞbôÍRÉè¤ÞÀÖ´çÿ6xöäØc±mMÚ6Ê;Jþsïˆôà[:ß«'ÆÌ0w·ÁóR˜½s‰tÔó:õˆ¹_Lι‹¯ë£w=³Nzw*ç[Ü(=òïþ0ËÙ9ýQ¬çó´äØ9á¹ñþçšž¹«®¨Pí w1Õ êñ6T”sß‹ïqæžÁ_ô•Jï=¾Á™J¿—A zPœ ¿Vô;‹¢­Üt–lüê$j#’íΞøæñ•™‘¾V¤¹)ú‰Hñ"%—ˆ´}©·\äÜÃ|çGtB)ž·F¤óS"݉dP™=þÑyáßE.ú“HŸ½‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8‡Ã’9g|&#äAIIRÚI™!R0.¹Gò"%²•_OôïFó«é´¼F.!ÑßàÄP›ö¤Kb±Mû¤ï³éé'm:-7$öP3ájŸÉJ›NÈðäZ›NJIò/6íQþ›öe¸WnÓ)Ò56?Þý²I22Pð)©ZY(ó±“d‰Ü ËäN¹Å”Œ"w+iýKù"S£O®’›øÏÈ4Ên ý2Yjró±ó©}¿ó¨YËóŦ4#“±·›ZK(›KOžê“¹°ÌŒ1:úìV©£l‰,ø -þi¯7›£vW“[DN=ÊÈtRsM.ùfJû›2¦ï…ÆÿŒ\Oî{~žÿÅÈÿ«dåõG–7“Ÿ‘ø»ÔaÕj»Úm -å5µfQuÙaC÷$¼ªŸäJ<àV `’b©~þ•¸U„ –e ,ÇÊÒ·žEà]$¾\Rýví:S4ÛUÕf^h¥Sø>~OÜJ8UÞÜ"·¥J婸ìNŠ,>²¯Üjïm+Ú]nnY nŽë‰|°€,pX¨ÞG¢@XT鉸pæE¬ÌV÷$êT/z¼rí^¢Q€‘.ù²ŸìQ+±+•¤S+ˆªVqÒ¯_Af·ÉJ™½­A*ßaʾ~ƒ9¥2:Bn':¾¶Nö¾{÷Š±sWÙ°#õæ\¢J%d *Q.²Ã æÒóðöñ(ŠheïÙÞÕ˜½o{jL+áeï@É»DJ%öÉáyýb"vÑ®r›^Ä/ÈŒŒƒé[€ˆ_´kÖŠô¯rOŽ›ã±Æ²a{×™©Äjö[ÔóKö ýº ú èFè ìE¢É:Ÿ°=^3ùÎ#ü<;Iî@÷Ø)¼Õtö${ˆÔÉ°kÜ]žçGÌD»ÀNË!ö i„ö³ãÜÔIö„¸ì Ûéõ½Á½kÌ)ö;NV#ê&¢juÏ Q@¬¤h;5³¨fE,³ˆmÑQ£BÆ$[ì%ŽD˜ïG,OÖ¢oš=LÖ@Ÿbð5zi’ýM†½-²`¾s¸1BlÍm–NvNÜv ;~KÎöW{ë.“$¶²o’@±©7`Ýß,lÖŽiG³€£Y@ ¸´„½‰ž7e×I–½B -Àl)Orìài„Âæö5v;áÄÞ)h}ÈvºEe§¹¿F†xë›!íEñ³â‰ÌL²oÉ¥ìuubÀo¸³[÷ÕòY`à)qS,Ï‘;ñ°Ü‰çàâþ³¯ËÁËvµÏÌáô;àfÀg€«À" "¬kè CxÊv{LÏ$»G>ÀÝq}ŠíÇÒ÷ËÝÚÏ×dÍûV ÕÃë6™Ï ƒÔã3ÌTݪƒGõÓìÓ¸?íìïÑQûaŽ¼bà!{W³›d‡ä^âz°ÜÌkn“Ƨ¸³|¯öØU>QÉ^¸Wºeó¶•G’EìÕµ¦Ž{Ú,W¬ Çׄ£iÂs—‡aÚ^?n3åŠLÒŒ€Š3Æ5æe‹‡íÄrw’e€álw’%¯v'iÎÏóÀ*ÙÚP´Ç0C¸PdŒÂ÷‚-  Èã@ X*È4«Ç<õˆŽóÀ0¨8«í¨c;úüÌ ïW¢“±š•É)9šc95·*çÍù*­[¶›Ö1A ‚ ¦.gÖ™w²˜Ór¦œÌë4œ´¸\âÍqˆåw4Ç_N¾ž|7ÉüMG¡‚N'ª™F¦/w}ñ:›®Ÿ«_¬gV²®ÙlêT2JN9£¨ºUZ•vEíd–cg˜ª³(kÅ]P»\YWÞÅb.Ë•r1¯ËpÑ‚kÜ5á*¹®ºVM8JŽ«ŽyÇ’cUÊÑåÈ:òŽ‚cÜáÐ+¢­–C]J졯`SÇÁ%ypAZ^ÙS_•~Aú]à¬ô-pJZApLX@¹^F\\Dœðƒà˜ð Þî×ЖJ¯Y±¢Þ¢$¤,…”«¡ù•B´”h¦³²ÊYT9+«œÅÈY9÷,ò‚¨vFÆÍ nFÆÍ NXÕÖÎJ˧¤Ç„Egx°É“¨¥"c'x ˜‰‚[ŒôtA[tÔ¾};~ðé(ߊw$$P–Me٠žm½Ù™ðÐQ¤EÊQ$ž´ -o¹DGø^;Â?Y–æø\¢ ¿¢¢”r ¤<&­(¸UZeŒçC¿^¤Oó°b—… IÔP†½×”É?•<&ùÛ’?+Ùc¹‚Ú;AíçAíBPKTÑ»HÍK’_“|Ìr‡´?…´BÚùv.¤M*7H›­õííwír@{*  h÷´Ãí`@¤ -ãkP£+÷KÞ`ÕÚ{†ö{Cû•¡½hhÚç ­Ù@¸r ¿§šò=Éß‘¼ãr£¦7jµg(ÞLʽÜCœ“”*÷UñH‹^dN)t3OnlàɤŽ'@Öóä ¤†'Ïê 'õ(—ð±¢S·r©Rh5<ŒnWY*yä~È*ù„^T>à‘ äï<½ò.Oo‚¼ÍÓ·„<«ü…¤)Ò(æéÇ^y„EZåU²•þZäÉVD_.Ï®UÀÌg7“U‰‚õÇÅW؇*g(UÌá] ¿…1ÀѶz…½©l± -< -eë+©ýìrò»˜Ä@³uŽ-ÃA.€M¡x-©ï±Ü˜ÈøœzŸÍ‰3˜Eq¢—5¼Tœc3S@“ð\Ž‚éÈØ]¬t*ÙÝûìÕñ{¼…éU˜o¤GŸ‡7ÃùðB8ÃO…Ãá^¹GŽÈ'äcr§,Ër›,ÉD&Roõ°‘æþzõvDPt´áÚ&ö WX°'‘¨,Á?ZîÉ)™ówœ›Õðáœ;ÁMW>ýºíQúŽCM·vž˜ù¸ûÛ|¢J;ÏœuÛêö˜Ä\ÈDìJoW)Y°«ô-¶cnOÖÞ'”>³}=†rfûºã¾©èTÖýÂŒ~Ä’k®†Î[#Êù#ŸúÝ÷ÍyÛý¤ßqGqsØï˜îÐ||ÑÞ—V¥‹†¾/]BáØûtYZ5æPO—uh“‚F4éЈ…hÒ"ÑúŇhÔµîiZ@:E=$Á¥9%HgRöaRh‡f)Ú¤A@ò€€i@k_%ª¨¶¯ -Ziž¢€§¢‚oT‚§Œ -øL Nðí¾p•Ò>¦Ù&‰""(R8ü…Ì0¢»©5Û($Œ\Â(À̹;ËQ÷j>÷Ö6ˆ»!%—?¿Œr©àn$ -º»–Ðã^Ê>¶N%tØÆ‚íÙé‚î§Ò)#±¤;»³[ëĺö ÖÄÖζÐÙÆš]?^Gxc­c¬uŒ5›ž±Ì¹ 5OÛžL2Nv1»RW'Ü–\lÐÉôE.kâêLF7cwÚ½Iº¸ãKdÜã0žžF®4B'@ýXŠnNÆîЛM(êîD†”£ÆŠ¿%årÔ¸T -j €27„2ìÊbö8KBÛÄˤÒœ\RâYÛ³,#º¢Ç ‰ßž›;%Âys1áÔ¢Ñï~WGßsßX?Z¿Z¡šèðë0¢Ã¯Aw_‡Ù€ TÓêZC Õ¬ºÕîAý qª ׇáñfÊ¡aë§ÂKTs*N+Ή@Ò°ÁSÿS†’Ê¢00½0åàˆ?0ç­M)+Â$ЖZÏ0è¾\áÿMíß Ä–G endstream endobj 15 0 obj <> endobj 12 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 22.1.0 %%For: (Baudouin Chauviere) () %%Title: (Verification_step.pdf) %%CreationDate: 12/18/18 14:15 %%Canvassize: 16383 %%BoundingBox: 9 -594 1016 -13 %%HiResBoundingBox: 9.98410490726747 -593.1220703125 1015.96983737134 -13.3836098402899 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 312 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -599.681066784218 1024 0 %AI3_TemplateBox: 512.5 -360.5 512.5 -360.5 %AI3_TileBox: 134 -587.840533392109 868 -11.8405333921091 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: -131.060833149656 36.2016751157107 0.9074 1428 851 18 0 0 6 43 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -131.060833149656 36.2016751157107 0.9074 1428 851 18 0 0 6 43 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 35 0 obj <>stream -%%BoundingBox: 9 -594 1016 -13 %%HiResBoundingBox: 9.98410490726747 -593.1220703125 1015.96983737134 -13.3836098402899 %AI7_Thumbnail: 128 76 8 %%BeginData: 12146 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD11FF6F754B756F754B756F754B7575754B756F754B756F754B75 %6F754B756F754B756F756F756F754B756F754B756F754B756F754B756F75 %4B756F756F756F754B756F754B756F754B756F754B756F754B7575754B75 %6F754B756F754B756F754B756F754B756F756F756F754B75702A2AFD06FF %A8A8A8FFFFA87DFF7DA8CA813F6339643963396439633964396339643963 %396439633964396339643963396439633964396339643963396439633964 %396339643963396439633964396339643963396439633964396339643963 %39643963396439633964396339643963396439633964396339643963397C %0028FD05FF272727F827FF27F8272727CA81886488638864886388648863 %886488638864886388648863886488638864886388648863886488638864 %886388648863886488638864886388648863886488638864886388648863 %886488638864886388648863886488638864886388648863886488638864 %8863886488582829FD05FF7D7DFF7D527DFFFD04A8CA752C332D332C332D %332C332C572C332C332C3333332C332D332C332D332C332D332C5733332C %332C332C332D332C332C332C332D332CFD0433572C332C3333332C333333 %2C332D332C332D332C3333572C332D332C3333332C332D332C332D332C33 %33332C5733332C3332520029FD08FFA8A8FFA8FFFFA8FFFF4A3333332C57 %33572D272D5733572D2D2C5E575E5D5E5D5E5D5E5D5E5D5E5D5E5D5D2D5D %2D33332D2C2D33332C57332D2D2704572D33335E5D5E5D5D5D5E5D5E33F8 %575E5D5E5D5E5D5E5D5E5D5E5D5E5D5E5D5E5D5E5D5EFD045D33575D5E5D %5E335E335D575D335D5D5D522829FFFF7D2727F8277DF827F82727A82727 %CA513264395D395D5D5D045D5D63335D2C57638863886388638863886388 %638863885D5D635D335D335D3264335D5D63335D0A335D5D336463886388 %638863886363F88863886388638863886388638863886388638863886388 %5D8863645D886388636363645D885D646388637C0029FFFFFFA8A87DA8A8 %A87DA8A8A87DA8A8FF4B2D2C332D2D2C332D2D2C3333332C2D2C332C5733 %332D5733332D5733332D5733332C572D2D2C2D2D2D2C2D2D332C2D2D2D2C %332D2D2C572D572D5733332D572D2D2D5733332D5733332D5733332D5733 %332D5733332D572D332D572D332D5733332C572D332D572D332D33522228 %FD0CFFA8FFA8FFCA4BFD0BF821FD43F821FD15F800FD05F8452E2FFD07FF %7DF852FFFD0527FF4BFD0BF80021FD15F827FD15F827FD15F82700FD16F8 %27FD04F845592FFD07FFA8277D7DA8FD047DCA4B04040426040404260404 %042D04040426040404260404042604040426040404260426042604040426 %040404260404042604040426040404260426042604040426040404260404 %0426040404260404042D0404042604040426040404260404042604040426 %042704260404044C2E2FFD11FF4A04F804F826F804F826F8040427F804F8 %26F804F826F804F826F804F826F804F826F827F826F804F826F804F826F8 %04F826F804F826F804F827F804F826F804F826F804F826F804F826F804F8 %26F8270404F804F826F804F826F804F826F804F804F804F8040527F826F8 %044B2829FD0BFFA8FD047DA84BF820F820F820F820F820F821F820F820F8 %20F820F820F820F820F820F820F820F82020F8F820F820F820F820F820F8 %20F820F820F820F8F82020F820F820F820F820F820F820F820F820F820F8 %20F821F820F820F820F820F820F820F8FD08204B2020F820F8700029FD0B %FF5252275252CA4AFD04F820F8F8F820F8F8F827F8F8F820F8F8F820F8F8 %F820F8F8F820FD05F827F820F8F8F820F8F8F820F8F8F820F8F8F820F8F8 %F827F8F8F820F8F8F820F8F8F820F8F8F820F8F8F820F827FD05F820F8F8 %F820F8F8F820446F444B444B446F6826FD04206F2829FD10FFCA4BFD0BF8 %27FD43F827FD15F827FD05F84B0529FD09FF52A87DA8FF7DA8FF4AFD22F8 %27FD15F827FD15F827FD0BF820F8F8F820F8F8F820F8F82027F826F82045 %592FFD08FF7DF8F827F8A82727A84BFD0BF827FD43F827FD07F820F8F844 %44FD05F8202020F84B204A4A2044702E2FFD0DFFA8FFFFFF4AFD0BF80505 %FD15F827FD15F827FD15F82705FD0AF820FD07F820F8F8F827F820F8204B %2829FD07FF7D7DFFA8FFFFA8A8A8CA4BFD0BF827FD21F820F820FD0BF820 %FD13F827FD0BF820F8F8F820FD05F827F8F8F820F84C2E2FFD07FF52F8F8 %2752FF27F805CA4A20F820F820F820F820F8202027F820F820F820F820F8 %20F820F820F820F820F8202027F820F820F820F820F820F820F820F820F8 %20F820F8272020F820F820F820F820F820F820F820F820F826FD0620F820 %F820F820F84A6E75929368996E684A7592936E4B4A4A69592FFD08FF7D7D %7DA87DFFA8FFCA4BFD0BF805FD43F827FD0BF826F844FD0420F826F84B20 %20F820F84B272FA8A8FFFFFF7DFD04FFA8A8FFA8FFA8FF44F8F820F827F8 %20F827F8202027F820F827F820F827F820F827F820F827F820F820F827F8 %27F820F827F820F827F820F827F820F827F820F827F820F827F820F827F8 %20F827F820F827F820F826F8272020F820F827F820F827F820F820F8F8F8 %20F8F8F8200527F826F8F845592F52FD0427F8F8272727F852A827F827A8 %6FF8FD0A204BFD152026FD172026FD15204BFD15204BFD0520452E53FFA8 %A8A8FFFD05A8FF7DFD04A8FF44FD22F827FD15F827FD15F805FD17F805FD %04F8452E29FD08FFA8FFA8FF7D7DFFFFCA4BFD0BF827FD43F827FD15F827 %FD05F84C0029FD06FF2727522727A852F82727FF4B20F8262020F8262020 %F8202027F8262020F8262020F8262020F8262020F82620202027F820F826 %2020F8262020F8262020F8262020F826F82720262020F8262020F8262020 %F8262020F8262020F8272020F8262020F8262020F8262020F8262020F826 %20202027F820F8204B2828FD06FF7DA8A8A87DA87DA87D52CA4BFD0BF805 %FD43F805FD15F805FD05F84C0029FD0EFFA87DA16F4A204B204B204B204B %2044444B204B204B204B204B204B204B204B204B204B204B204B204B204B %204B204B204B204B204B204B204B204B204B204A204B204B204B204B204B %204B204B204B204B204B444B204B204B204B204B204B204B204B204B204B %204B4B4B204B20444B2929FD0EFF52277DFFFD6CCAA9A9FD0FFFCAFD82FF %CAFFCACBCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFF %CAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFF %CAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFF %CAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFFCAFD12FF6F6F4BA07B7C75A0 %7B7C75A07B7C75A07B7C75A07B7C75A07B7C759A6F6F4B6F4B6F4B6F4B6F %4B6F4B6F4B6F4B6F4B6F4B6F4B75757C75A07B7C75A07B7C75A07B7C75A0 %7B7C75A07B7C75A0756F4B6F4B6F4B6F4B6F4B6F4B6F4B6F4B6F4B6F4B6F %4B6F6FA075A07B7C75A07B7C99FD0CFFA8FFA8FFCA4AF8F8042C042C042C %042C042C042C042C042C042C042C042C040A20FD18F82C042C042C042C04 %2C042C042C042C042C042C042C042C0451FD17F8043204042C042C042C04 %6FFD05FF5227522752FFFD0527FF4BFD1AF84BFD30F82626FD16F8042DFD %08F844FD05FF52527D27277D7D527D527DCA4BFD1AF82020FD2FF84BFD17 %F8262CFD08F84BFD09FFA8FD07FF44FD1AF84AFD30F82027FD17F827FD08 %F84BFD08FFA8FD05FFA8FFCA4BFD1AF82020FD2FF826FD18F827FD08F84B %FFFFA852522752A82727522752FF5252FF4AFD1AF84BFD30F82627FD17F8 %52FD08F84BFFFF7D7D525252A852522752527D5252CA4BFD1AF82020FD2F %F826FD18F827FD08F86FFD0DFFA8FFFFFF44FD1AF84BFD30F84B27FD17F8 %27FD08F844FD0CFFA8FFFFFFCA4BFD1AF82020FD2FF84B20FD16F82727FD %08F84BFD07FF7D527DFF52277D5252FF44FD1AF845FD30F84520FD17F827 %FD08F844FD07FF7DF8527D5227525252CA510A2C042D0A2C042D0A2C042D %0A2C042D0A2C042D0A2C042D0A2C262D0A2C042D0A2C042D0A2C042D0A2C %042D0A2C042D2C2C042D0A2C042D0A2C042D0A2C042D2C2C042D0A2C042D %0A2C0451262C042D0A2C042D0A2C042D0A2C042D0A2C042D0A2C042D2D2C %042D0A2C042D0A75FD09FFA8A8FD04FFA8CA9AA07CA076A07CA076A07CA0 %76A07CA076A07CA076A07CA076A07CA09AA0A0A076A07CA076A0A0A076A1 %A0A0A0A1A0A0A0A1A0A0A0A17CFD06A0A1FD04A07CA076A07CA076A0A0A0 %9AA07CA076A07CA076A07CA076A07CA076A07CA076A07CA076A07CA076A0 %7CA076A09AFD0EFF27F87DFFCAFFCBFFCAFFCBFFCAFFCBFFCAFFCBFFCAFF %CBFFCAFFCBFFCAFFCB7DA1FFCAFFCAFFCBFFCBCA527676A1A1A877A17DA1 %76A2777D777676A17DCA7D7D7D76767D4BCBFFFFCAFFCBFFCAFFA17DCAFF %CBFFCAFFCBFFCAFFCBFFCAFFCBFFCAFFCBFFCAFFCBFFCAFFCBFFCAFFCBFF %CAFD0FFFA87DFD1DFFA8CFA8FD08FFA87D7D7CA8527D7D7D27528352527D %7C7D27527D527C7D7D7D527DFD08FFA8CFA8FD33FFA97FA9A9A97FA9A9A9 %7FA9A9A97FA9A9A97FA9A9A97FA9A9A97FA9A9A985A9A9A97FA9A9A97FFD %06A97E7FA9A97E7EFD06A97F547F7FFD09A97FA9A9A97FA9A9A97FA9A9A9 %7FA9A9A97FA9A9A97FA9A9A97FA9A9A97FA9A9A97FA9A9A97FA9A9A97FA9 %FD0BFFA8A8FFFFA8FF02FD0C0028FD06000101FD110001FD0D0028010000 %010001FD130001FD0D0028FD100002FD05FF52F852F852A827F827F827A9 %28FD13F800FD13F826FD0CF80000FD19F826FD1DF801FD05FF527DA87D27 %A8A8A87DA87DFF282604270427042704270427042D042704270426012704 %270427042704270427042704270427042727260427042704270427042704 %280526042704270427042704270427042704270427042704270427272604 %270427042704270427042D0427042704270427042704270427042628FD08 %FFA8FFA8FFFFFFA8FFA928F804F8260404F8260404F8272604F8260404F8 %06F804F8260404F8260404F8260404F8260404042DF804F8260404F82604 %04F8260505F8260404F8260404F8260404F8260404F8260404F826040404 %2DF804F8260404F8260404F8262626F8260404F8260404F8260404F82604 %29FFFFA8275227527D272727F852A82727FF01FD0CF827FD06F80000FD1F %F82800FD26F827FD10F801FFFFFD047D52A87D7D527D527D7D7DA928FD13 %F800FD13F827FD0CF80000FD19F827FD1DF829FD11FF01F8F8F8042D042D %042D042D042D042D042D042C0500FD0FF82D042D272D042D042D042D042D %042D042E00FD0FF8042D042D042D042D042D272D042D042D2627FD05F827 %FD09F804262D042D042C29FD08FF7DFFFFA852A87DA7A928FD13F806FD0F %F80404F8F827FD0CF80000FD0FF82DFD09F827FD17F826FD05F829FD07FF %52F852FFFD0527FF28FD0CF827FD06F80000FD0FF827F827FD0DF82800FD %0FF80426FD07F827FD0DF827FD09F82604FD05F801FD08FF7DA87DFFA8FF %A8FFA928FD13F800FD13F827FD0CF80000FD19F827FD1DF828FD0BFFA8FF %A8FFA8FF28FD0CF827FD06F80000FD11F82727FD0CF82800FD18F82727FD %0CF827FD10F801FD0BFF52272727517E28FD13F801FD13F827FD0CF80000 %FD19F827FD1DF828FD0BFFA8FFA8FFA8FF01FD0CF827FD06F80000FD1FF8 %2800FD26F827FD10F801FD10FFA928FD13F800FD13F827FD0CF80001FD19 %F827FD1DF829FD08FFA82752527DFF5252FF22FD0CF827FD06F80027FD11 %F827FD0DF82800FD18F827FD0DF827FD10F801FD08FFA852275227A85252 %A928FD13F801FD13F827FD0CF80001FD19F827FD0DF826FD0FF829FD0DFF %A8FFFFFF2826042D0426FD07F827FD06F80000FD11F827FD0DF82700FD10 %F8040427042D0427042D2D27042D0427042D0427042D042D042D0427042D %0427042D0427042D042628FD07FF52277D52A8FF7D5252A928FD13F801FD %13F827FD0CF80000FD11F826FD07F827FD1DF828FD07FF5227F8F852A827 %2727FF28FD0CF827FD06F80000FD11F82727FD0CF82800FD10F82704FD06 %F82727FD0CF827FD10F801FD08FFA8FFA8FF7DFFFFFFA928FD13F801FD13 %F827FD0CF80000FD19F827FD1DF8287D7DA87D7D527D7DA87D52A8FF7D7D %7DA901FD0CF827FD06F80000FD1FF82800FD0FF80404FD15F827FD10F801 %5252FD0427F8FD04277DA827F827A928F8F8F804F826F804F826F8260404 %F804F826F806F826F804F826F804F826F804F826F804F8040427F826F804 %F826F804F826F8040528F804F826F804F826F804F826F804F82DFD09F827 %FD1DF829FD0BFFA8A8FD04FF01F8F8F80427042704270427042D04270427 %042605270427042704270427042704270427042704272627042704270427 %04270427042E05260427042704270427042704270427FD09F827FD0DF827 %FD10F801FD0CFFA8A8FFFFA928FD13F800FD13F821FD0CF80001FD19F827 %FD1DF829FD06FF5227522752FF52F85227FF2804F8270426F8270426F827 %0427F8270426F8260005F8270426F8270426F8270426F8270426F8272704 %F8270426F8270426F827042800260426F8270426F8270426F8270426F827 %0426F8270426F8272704F8270426F8270426F827F82704270426F8270426 %F8270426F827040406FD06FF52FD047DA8527D52277E28F804F804F804F8 %04F804F8040404F804F804F805F804F804F804F804F804F804F804F804F8 %04F826F804F804F804F804F804F8040405F804F804F804F804F804F804F8 %04F804F804F804F804F804F826F804F804F804F804F804F8040404F804F8 %04F804F804F804F804F804F828FD0BFFA8FD05FF2AFD0C294DFD07294E29 %4D2929295429292954294D2953294D295429292954294D29532929294D29 %54FD19294DFD0D294DFD10292AFD0EFF52527DFD15FF7EA9A9FF7D7D7DA8 %A8FF7EFD05A87D7D7EA9A8A97EA8A87D7EA87DFFA9FF7EFD47FF7D52A8FD %14FFCFA8A7A8A87D5252277D7D522752277D27525252277D5252277D5252 %277DA8A87DA8FD63FFA8FFA8FFA8FFA8A8FFFFA8FFA8FFA87D7DA8A8FFA8 %FFA8FFA8FD3CFFFF %%EndData endstream endobj 36 0 obj <>stream -%AI12_CompressedDataxœì½ùrÉ•æùx‡;”µÔÓÂ÷pMÛ˜ X£²RI¦¥»zjÚh‰L±‹$X\¤Êzú9¿ï¸Ç €©T+U­6C)ò†{xxørüìßßü?ÿå._ÝÿæîGé|9œýÍß\¸»ýtÿáÇÝ=üäÍ›Ï?}àÖ~ñÃChç‹UºüÉúbTü/w>¾¾÷ãCŒçA…ÏyúW·Ÿ_Ý~ýîpýÛÛÏ¿{}÷áüЊõúÓ›;«`¾þêõËÛOöô‹ŸîÞŸ¿õÕgìæ³ÛOV/Ä‹°Úÿ!ÿ8ŠoßýîöãÇ×ÿFaMk²{W÷Ÿß½zýîë«ûýñ¡~Tz>„%ÔÃÅÿÏë_Ü}<­sÞ×–Ü—kËGÒyˆqiK -±ðt9ﵯ©¥R¦¥s{Y]ìÁ%®½[»Ïî_~~{÷îÓÏ?Ü¿¼ûøñúþÍý‡?>\sûîðÓÛ¯­äöðßîÞ¼¹ÿýáêÍíËÞ=òüþÝ'«úÓo>¼¾}eÏÿèw_~sûÁªüŸ‡_½~{÷ñî~ÿ‹û··ïl‚®îß¼úɧÛ7¯_þôW_¬ ¢Ùü?Üݽº{õçyÉåOÊ‹ç¯ßÜÙ<¿½ýt°qY¸⋫ϯ߼ú‡Ïosg+À†‘Ûé…†å×mÝ}xgs3»óïøî›w¯^ òu÷jÿþ¢÷óö9rÍVçÏm½þìÃkºqo/þöÃëWÇ5ÜâaõÿÓÔœÛð'„—ûw½Óõ§ÕPVû¢ïrÇÍ–È'û„9ÏñÅõOwûk9ÿé/í+죯ïß²N?B8Y ¶çÞÜíeÛ¿Ub~öOg©_üËçûOw­­7w‡^/¾þpû»;#ÎëÅå+ˆûÇ×/.?XñÅõË»W¯ß¼¹½¸¹}ùùÓÝÅ?|2¢pwñ³Yíìâ×Û·^åV­]ܾ|ýÁ¶ÐWoîþõâöXÇŸ¿Uã/gãwzòìâνÛ=z·=úÚ›íu^ïê¼Þê¼Sóg÷^÷ÞëÞïêÞouï½+Ÿ½êg¯úùXõìâóV÷Õí×_ß}¸xe¼»»xiã}a‡Ü‡7|ÅÇ»—lÒ‹ß|~óæîÓÅûÛŒÀûß^ØFk_ýæÒÑ—c±¿n.îY#ï^Y—.îÞê/-db5:x›úu¼ï7_½þÝkÈ6hÛ˜ÿ·í__}¸õ½ùüá^=ÕNÙú­_jîìâ«×öÁcyØ›/ÞÛ{î_±@4×Ç}ö›Ûw[õê~úíýç¶DÎ..wKôf÷ïK_7[çn|h~â÷²_®?Ù*ýÄ+ýÌ+ýl×ÞüîŸy_{_ï›ùµ½b¦Œ3»Ø=íñööåÖ»ŒªvûR·´ï賋ß~~÷õí‡ÏoßÜ~þdûЈò?_¼¼µçÎ~u#ª\þîů>Ú{áW>ÿé_ð…¾¹×_èïwëé?…=59$]غ¼û—Ï·oìG½xýî+£KŸ¾ÙQ;Ö¢*Øae…-t~œ…5@ôŒè~z}ûæÕ믾º°o+Þòâý‡ûWŸ_I~m-~âp±æ×~ñ³·w_ßÎB/F!`‡ÐÛÅí{{à_G/úzñìî±ü1äA5ŒÚýÛÝ»¯ï1/T~ctäÅ/¿yû›û7/.üï“//ƒ5³iø¹mŽî³x&yëço>[Ñß~¸ÿüþ'ᄎ?û hÿÅÎ#Ÿÿv÷êð³ßüûñCD+Ýû¨o:¼º;¼ù¯á¶Eÿvw~ûúý¿µec'>ܼОÔÏù÷~úÙÝW&7†ÖXÝÃÝ¿ÂïÝ éòæÝïîÞÜ¿O»þÀnøçonßÙîÔýÇíþüΆí³õûÕ7ïnß¾¶Sèðê?èA«Ë£wŸþñ;¼Ã˜¾÷Ò¿›°½ïVØýáýýëwØDn& -Û[wÂø¹­¦ooú—ÿ|÷éåo¿µq¯ò?Ù¼Vïëoíñíßc^¶×Ë7w¿üÆx˜ï0«¿| ïúápõáóÇß~uÿæKk±Ó&Õöíç¼i<©yî/ë]?×ï~öÎþñÛïþÆ»ƒ1:¯¿bj>|ò‡ÿÒ_º=ó­/ôW±8Œ;dwÎó¿É+¯oï³þúåwxëËcõý›÷­üqójŸúÆøÙ_øìÿ‹¡Z›¯ø›É„œÞ}ÜÞù÷FüÙï¼€ÆD1ø üÖ:¿üý­‘–¿ý›o}dçö+ÛŒ¿üüú“Ž·û·ïï?ò%{’2+ÿrk³Hˆß—?úÑ·œ£ýpõnWü·åƇ¢­|óŠùÍÏŽÿ´S9®^™ø»œ—zNqÉy‰=æ³Åî…¼.-•ÔCj«ßŠ(„J]kl¹»±¶¥¬kL%öÂjwºþÕjö’³|ø›Wžz‰T§/Ñ­Ó—½äðè%ö(CŠñ³ËÂû~yö7/þÝÞwõñÏümÁßõïôeÛÛì»®žm‹p.¦§××ß—{xf§«-°ã¿­‘ì+ì?ŸÅû/Ä8þK‘?É®<®2þ߯:®f—ÿÿj—õ7^òÿgö—_Wúo^×úï:>Óu£ÿnâóø<-ÛÆ÷×YšrÊgÿ7]öç¨ÇÍšZêé*]§gé&/9X½œK¶±Ëkîù*_çgù&?/‹õ?•\J©e-½\•ëò¬Üœ•çÕxüjwk³YéõÊ®gõ¦-vÅ–Znµµ¶¶Þ.Ûu{ÖnÖe öÙiÍ«=°¶u]/׫õÙz³>ïË™-ƒÔs/(òÕåçy\Å®úèjÏí1]—'ו®ëq=×Íó›3û¿ïõÏÙɺl’·Ë†n©ÛÕƵž\}\—Ûue×µ]ϸÎô×͸žÏËvªýg×ñOÔQk!ë*vÕqµy!Q­¡û¥.ß»l¦o’]¬¯ Ë^§»±Ëÿ\Ûue×¥]Ý®U—Mì3›ög¶&že®³g¶¤´`ƒ]ê¿fâÆ.Úð?Wv]ÚÕíZíjºª]¶¼®mñ]']¶øÏ®ƒ]6"L«º¬”ݼ±^]_]]]^õ«õªÙ:,Wù*Ù -W‹­ˆëñõåÕååe¿\/Ûe½,—ù2Ùv —‹­Ÿ›3ûœë~Õ{_{³åWlµ±ZÖç¶:ŸY¯l­v[±ÍVn±œl%#RÏÛ Áu»²UÞmµ7[õå̲MÚRéò2OŽÿ|¦iX\>—ãºÚ.¾üÙÉÅÜ<Ïüp G½´íTmf#1¡.6¡Ïl›^Úvm¶m@–ŶÑ3ÛÔ—¶¹«mód d± ¿N— «摘#7¾õ®¶íÔ·ëôŽÌ›²j³ú5·ož[ãËWþ#¯Ä žÛ„,ÇS¡ØKúus±AŒ6¿Ùæ¹Ú|¯6ï—6ÿ׶nŒ>,¶2’­b+¥ÙŠé¶r®l=³•ôÜZ°••l…•§ú¿p…/^'¬Ém),ßÏŸ`ogLêvÑ”KÛ-ƒ`ˆ,¤ 4}“ LÑ&`øÅé³øv°ë™í†«~¹Û¾'ÂnO\iOh?œíl;°|+`«ì£WõÒÖ `.Mvùÿ©~Ùh}Ó‚{Hí¯Î¹ß“üã5J|¿ç?§ >œt_É¿ÙÿÜŒËÏ£}O7ß:7ãàã5N6v7ÏϬþ@›¯olÑÞزfÖnÖ£F7Õ._»-é²3½)° áDæLöSùÒ¨ÖµŸÍv=×ùõ5rFÛò9¶ª@:«±ëÕ¸ßôdênbb)zê(fØáyìQ)çƉ‡å/©SŒUÎaí‹-S—¤zŽðñ­V Jro…ó\–ÝKwãÞÏmÎêN„û^ýc$µ_¿{wûöîÕáëqËDX“Ùžº{Ô VÅr]ŠÁz&f*H†Ë’ÔV‰`׶žKÀr‘©HhZSCÇe̳SàËA{«Xé$&zó|-†¹‹Q®b‘“8ãEñ3?öT¿î˜§tBûõ×u³;®­‘pBø¢÷­ÇµÙ_%£Þ Eè~²³p¸ØÖ̉òá{kqlT;‡Ö” -BÑ®µ‡â»Ýy°õÓ -„墳?iáå§Ö]>YvãàK’ «ø´+ñiÏ%È9—V$l‹SK3Ž¥Ù¤2ØçÙ¶:wkÓX¹!Ô…Xw‚}‡á;ŠöîÃQ¼?3ÁN}ã ]Æ7)ßø/„× íE2£Tþ¸Ào̵ñu×Æn<—h†ØŸÅjA;ŸÑŸñL|ÆžËHâ2ÊÐ8¯q)^C܆kv G<Ï‘ÅŽÖó€÷˜ÜÇ3±¯Ï7)À倣$à²Ò€ä³M$XŽlKgáò{üô¥æÊ…ñ9_sÆ꘳>d·kÉi’ÑÎvÓW‡ÎçrSêÜ -óÆøLιôÙóyö`J][sœV&v?µ>¹B¬Ùeè˜_fXs|Æ$kšÃ¦yN4Sý ÞR ùœðý”I8åûIcÒ§hÌ%~ýhÂ5ÛgƒÉlC-ô`Žê˜!ŸŸ§g§m;ê87aNÍÙ˜ÛkS´ùÜìO€¹Ï|§Í½æ»Í&ç,ç1?õÌo>Ÿ¡òÇÍÑ~–þ¸y²™:ÛÄ€¹AÏ×2”ñÁVm»y۶ꙦN“÷ç¶ÂÙ—%ƒ ÂT¹íUm{Û¦\;óµr²Z¦”\ŸÜÑÇusÜл%s¶ÛÏOÑä#E>¥Ç,‹£šu§dÕ¤kºóP±^JÁú|¨W‹fy{¦ùŠR«2/¨TŸmj5 -yi”Ñhâ™Ää„pŠ¥7D¯$~®b@ŠØŽElÆâož9œ³§Y)û.¥ækRï}gÕÝÙwÑÝ ÕÝåwQÞ}7íÝ^yg»è™í§+ünSІž-¹¦í̶%ʶk©ÛºnÕ&1Ké¤v»±=-Õ[7ZФ~˶¢TpÏmY<32re‹¤§õÌVLµ•“SúëýuŽþ:GßËíd£ÚÎrJM G™pn¯ËÆ[¯&`‡äN]ŒÌ§¼Øk– Y»”d#¡p…µr'nÿ=-1ý™ßã¢üæ,ÿ¤\ô¥ò?IÎ)OÉ9å‡z×å^çÍ\Î)@ß³aÏÏž’ÁOL—ññòr'¡»óÙ^Š?ûã÷æQ |ªþ=*/7åïCE@þ’"àl§ x65R»:x*„×£RøžàOX?¶;:ª²ØTô^Ó&s·S‚=öŠªúeÃ÷Õ⟴¾ëS뻞¬oŒÿ¶f¯mí^Ú^W,½fÄ,k«ÜfÝÖüjk¿`ªrU­[e,¶þbå•øSkâb³lM»GyW{²gzãåÉ;JM•mIW[«­‰K[!׶^nnžÛBŠ²·”Íž~)C -örçäÿW<º£×¶vé…CÁ¨©Tç"*F#ÃbÇŠæÅ*•u±”ºQéK÷ªŸüîHý\††ý| öÎýöÿÒŽ±NýÕñ—o‚°¥þh}ÂúP£pöP¥ð¤Fá¯Ká¯Ká¯Ká¯Ka¿vÂ7QÛÎâVìh³¯À¾×z©ÁþOŽçüÂFc]²îô–uð5û´Ž+·®§Åù?Ûþ\ú”|̶2"ªM ÿ»×¿»3A^r;·ï$%a?¯ÉÖj#¬ªYwJ9ïË’ºËÇåC?·5{Î6¶véþ¥þÿï?îì¯ÏúgößèçßÙ?ÿ‡Ýü½½çðÓÃ?ý÷åðÊŸü…ý5ûðð ‡·Vøûqøû§j=úž¿ß½è[ ŸlÿýwqùáÓ³×JÅtûá›ÃyíáâêþþÍá—?ãûÂ#Ö_\ݾüg›eü{ñ eNùOöÀÿeÿ=+ýó?~VsÏtçgú7‘‹ñs½h¼¬hb,kGüÈl^YuŒ\³í³ÚŒïtN,{}0K:?°Øüã-¯Hå|I%tã/×fw[>︾¿…F;TìåÍ~©8P`”FOkZ)€°¨@gÑd~/ˆéð’æòzl·t›#WBܳÖ”w¨²ß¡­ç9ôn6%Úç[׌xöEQ1ØS*X3¿S²¯9¶Â´VjÕ+lª‚¿ÛæGïîk À芬Éf¸–ÐzŒ^â6bvÛÞó’^3³C²l©§…O$¨$“­ô|µ11šoŸ²„C6ë«W©çFÀ)&ŠPÖ5ÆÅÆѾ··óhR‰ÿ®ŒRhšœ%žÛÁ`'‘ ö°wì‰J¹†•J2ýQ!)ÔŠÕ·*]¦í-[²-/ìRÕÈ• v¼Äæ58.­ÆjÒòö¢B¯¬PÓc…­Ù0QÐÈjh{ÝöHñÇM~Ò ¢÷ ùmÛÅQ=³Óx´Ï­Û6!­V‘à$[c‰ë«-³ªuig¥¶ÈG‡j¶)aÙ­9/*oC_ùòÒ˜ØCMÙ*°÷óAÌ.5«-Þ”š½¨/¹ñh=ovžZ‰p´_mkÙÁ&k,ƒÕZÏí€^ˆ0YŽäs)’mï™Üi½h›³ \ Æ+°Ÿ¹J‘à(¶®%¬;¬¿e¼)ø€Y-ãAŠ×J7±=Vµ£Yµ-fÇ£·SQ¡FnlÕ°WSK5¬ªaïNÛ›lˆTKÚqjÙؤؔ$f“¾Ô–ÔkÐj„óea1p35|S7zÆ7EÆ—1dÕHöÕþ¦xnogv q^+ı5XúmbOÅŠQ¬Móù49_ßhí†îí¢qW»ÍúGV^[Dˆê Œ$GÆ·›µÏí½ã-ÆÏ{õW, ºf²Úh,Û:5i èv†Y~Ûp¯ÆNØÉžm¹qäÛT²†ö[Ρâ£e9[Ǻž7`PQzÆhL2bNãv¶P@ø¬fҾ߾«1åat‰ÂÌZjËÚmfÖƾê©TeÍÀÁØ)ûŒ¬ûœùü®sÈí^ˆëJ]扲4ÚX¤‘ôŘ¯c#+ѱLy4¾o{é˱ì0¥GFò5iœj68¬I94˜QP VØ}ƒ‹Â}kdY{¿}£Ø"Õ ª´g¶¼"¶6º·f"¡Zã´‚ºû\?²Y>vÕõ=Y¬»ÝGÒ6îªãƒ(jÏç%›èk»*ØÓ<ÐlYÛTÛSv¨,~D#/Ùònþ¥V5ë‚ÒÄ(Fáë+ß`5gúf”Öx4£Ap¶ü¶§ŒÝÎpWÍ„b£«ÓfuIZûÀŽ3QëÜNdDÍmÌ,B:i¶ŽDv çpÀ6X4yÈe0w.ÅvµqK‰·Ø¤)"Ph/).œ¶YË5è©Õ+õVYO¡Ï :ŒŒ9FÑζ5×!VV˜9«¬Ð—'Ƙ«À±ƒæ¾•÷àBs+&û£ÍÞ ¡ÊdðÕÚ9Ø:ή׊úh‘zÎ刲RÍÿÊîËœBÝgÓ$L#·ÖÊBʹ•5ûâïn ¾¥9²¥–¥Ñ]Á(AÇm»¬UcèÄö®ÛAj…êTE‹ë¼²had[µ±ûF´Ä¯+¬SD÷ÝNÙ^îi½6$U±ç6meTŽ*àŒ À˜ÊêÍÛ¤À¨ž¬sí”ÕÑVÉçc“}~“…YQ$Ú PÚà²Ä£û¶àëd5–­C¯m=pÛAƒ*a\Dl1 í¼üpæmßåCÆ»«ÌùÈÐèTûúnËÁµßñ‰‚h„0óéa!fô5 ýxª ®?HÎã}igtƒ9öÕel>Ìšd9S¨}a«èV1®Ø~ÌÈ(Ñõc+œ4ŽUæ€ãûrº_;Œ¦Shâ|v­W—]ÊFϸ -Jq…\¶Ã‡‚îSºfk©‰¾GWŠ1ýÒ¢ Ue›Qôc±í¾ˆ§R.3·°su0^Ù„V“qàv>tôiPÙ$}“³Ùƒ˜›4aü&£'¾“¢Î(-NcnVžZÆF2î™&B7è´Çh•TëFlE5µ6Õ."d C4º¤2ûŒ®‡¢ë)”ÛF¢@2-úŒ.z™ ÝTkF6¶ÖNg+Ì$*£ÎT•íoèã¬À„q·Êä‚%ÊXV -â‘ôØ0z¤5€¢Å–ØŠôÄ·"xvý'n9WÑ LQÈ'FR?lKnê V®*Vn3=Ä6…4XO„´œ0¤1Aöm:ž"&;žja¥E¾nçÖ…W%Ì"0¤Îp„Â[f#7&ED™¹ØÆBvãám¶¶Hœ1*|Ü¢Æp±wŒîgônö¡Iiép¿ã¦n’™lZCb·ÖzQcÔØ˘M*J˜ìr”¶dT¸Õ.¹©Êâ–†ÍDgïtÝtç§c‚´#7£|±Ñ«8,TIF뚘˜&˹¿ŒïƒÙ݈ÿÈ -/¯Î0E‰¾¸4@m&dõ±Ñ31|c/|»àÓGívÎìè)iŠ+ -Ô¦??)¨ú-íÕlE* «l½)"0«²ö0 -¯¸êÝÎrÂÅ™pFíÒ ‚mÿdä1É… 9þ‚í|§Ûý/&[C±PWO,ˆ¼vZJC7yî'HÜÆšÂÖFRA–1ÖIꌘY¶ßSmˆŽuPu÷sŽ[eß~Ûi-‘ÓŸ÷°7®™DŽ ÍCÚÇÖø’À>åz[‘V8Aí|ãÛlèߪÌ +vt VÇŠUeR‰ Þ·q^«¸"ÝMækN`êFé4Ö®W¢Pb嫆°!ÛÃ1Ï(¥tÌÒöó8Üô•]d¬•óŸI»¿é-Äã å†Ð*UØ «¤/µsÊ*eT3Æ9«FKÅ9”˜ ,K1¨ž>Ö;ÄîQCœ¯‘Û›¬+µ°.<ý¦È†´%! ¨Ã«wØ֞׈ä´XmL“wÃÔzÒc”YšYcmq‘ÿq­“ U¼¨uÄÔ9Ÿ†™3ŒÑÜf“ŠÚVÔ7gÚY5ï‰/P3 5¯aél2ñr-*_lÆ`“²Œ;³a6R`?,ƒvˆ•à_¢€¢«ˆZ8—‘>²°ÄÔˆd¦³-;'Û4“ƒFŠ -v3ÍÕ›é“&Ö¡(ŒI "Ý y-_Ž[.ÕˆXèŒR·99)MŽTNÔPj«ê`'ëñCð%àCD®Qº>Ñ5ðtb/âšÂæCf< Ca2Znì2¦m ¥…~J•gGÑ:MdðcWFäêãM‚µ]ctÎH)ç 3I»0 +â0EiÃôD$øˆéLþv¶ùÖ1!:n¼:´£›±LªY¤2¶OüHNö}HãSSܬ¥ß´‚î&g›ˆÅÈòxÁ -ÓiL ,‹Ü…È°j‹ÉÉÆðœ£`‘<á_ÆT­öÊH7Œ 6ºîßSMPXضïÛk8ÇE$ŒÑ‰×E¦:“ÿ£–Úaî Øô*Lj «¦îè‡ñÌFµSëâ{Ùd#~lé²@v+˜Fc¤lâ‡M&qêc*x­ZõTAÓgM\‡Ì“FÇìqXA¯¡q!ƒ5ŠÊOÂ’Öí¬MjõQÉF®‘u¯FàëÑÁ>•}’hB“Â1-ª‡²­…T ÑO¼ÇjÝìT¾_P„é”KçˆåFB‰_¨§¢Û"û ¸²ÁfÔ·ò¼Èþ¶fRÔf¡kN?v|c›I¦ÀØ\ã£mÐH,s‘Õ$ÖU²6›"˳N¶bå™Â¼-’/†ëàfMj“f£pQ ‡‹‚)0º`ƒ¦ä™W$­r@SÓ\xèMBÅÚ§o“ÕŠ}U;Æëy7"®FH¤¿U;HÔXü¤1 G²œ¨À§ñ¢P]xë„c[ €Æ‹ì$p“§m;¾JÌòž“íµUÙoÝ2e5ôˆÕ(ع0ˆ£†ÛZ¦/ƒŸBM‰…G³Ãw–1À“%Ë®‰TÅÑ ¿A΢yv[ÈΈÃ¿„׃Œ˜›±9'ó?ùIÁb­…{êèHÃø½æäý6‚ÕW™^Ë.¨Êl£[QçEÓò'À8P“\²¬Ï*¸ YAÂ2ÐuìŠWŽ¬äHªøu—v"Ê›ìŽ]Cbqí,Ô"a¥Sˆ1dhBíøsVØÖ™¸F'c×2ÎÒ$Œ(ºÄigÿ°xaBCOÜK€³ÂHp®±œÝlõ¬ÐhTQaß)þUFŸ›’šQ÷+ dî0Âi.~¶V1od8›U­e4§z ¢q–Î}¬ºo„Q}c]{Áæ+‘­£|3×Õ‡¸.>„ÚMÈŨ’úðƒä„•ª5'Ÿ+cÐÓ0ý@ÐQ­öeìã2H±’ôú8ÿÅ„XßZrË‹âºH›$Ùs¬P§™Ýoò‰xýÝÇm¹FYA¶®üúfkR¬fÜð»¿ÊNv{J–=EèÙÔ\ïŒzT¬Gw ;ËV8M`€09®(¸'¤uk~&ر‰ÖtGjí ¡fûÏ;…ºµÈ<Ýyu³1í)œ+lË`d‚-+Þ‘vä8¥çJ_ï%Z›è*’•‚¢绺nË/Ñnã2¥ú1“|•S¯*+ÕyRÙí¾íHÁÖ¬}ͤèØ&kÚ]!*±ÎòQ`×!Z²[Ð¥ª¡@#QÊ%Äú/_T>!ŽyÃÔ‘³ -¢)ÃÝ„û:“""=àbRäqÖ1b­akƒÀ8Õåhè˜R£×•DcÖA»-QW*°¬FH2/•ï×ìµ°<Ú¡ `ë=6v/FŽ—„¯cSsnR”óË¢áNM=Õ.,·kçŠ8<§"^e&ë&¡Â$@ÄîÛêÇ£ÌøYy¦NK Flb‘z²Hu!v!Ê1Þö;ü)¶E ì«·DªwÝGm„«ÛT«p]ÔZÁNƒ‹lÐdaiæ+‹É¶Ñ‰¢x3BT*2æ^ ÕÖC$WIÙR{‘WÑ®ntw#2«Ù -Ye¼{XñnèÛÄŸ–Á7÷ô·yg)I¢^W§Ÿ¶Ë;ÌHî›*e²XÂy _mÁØSàp#lÍuL¦äU O¢ÅïöŽð#«Üˆû‚ÃsŠíëB²EO½+VãVŘ-k­Ë³l~§D>§°ô$Zºƒò"k¬yËzJ3‡…«+6ª-5Êd¶Ê¾?Í_bZ z<üjΛN FS€¯lÖÆÌO½‡ïš½Ë~²ÙÀâÂ_jÏɽŒüFx¤/Éî2Âc× Ûn¸æ”s§n¡(k†sÁßblì/FÐã"38ή~,pŠñToC‘‡Ô`ÔsUDL•¼+Ìä…fS‚õUÂ!þ.‘Îe¤öٹťeœ»-¡´øA§7œ1‹Òº˜P'W±/ -×CÊø¿>{2°öÓic*™’€džF%-„§2¯âw‰µ•U{‡‡»¬BÚy8ïsÈâŠ8ˆÅ•u€ƒ$.•og!–o -mPèW2Ã2Äd4 º¿èT­®À2AÜ÷,˜ZA ¨‡L`@zŠ£ „:À¨:¡ÑŠÔÊ_‘ ~˜ä¡; CnRá~8æÊà÷P•Y¢ë9‘Çeò6. -ª%–h¾ºø²à`%¥ú‚n¯E¦»ât¡š ÈM+3ïÍÃÙm54†ßš•ÉU]À5FãpHѽ½17N;/X§ª7ˆ»$û¤ú ¶€ë™S€Ì§Êã@F±uÄa„.¸ÀÛ?Fî° -Îi‡¢êµïÀÖNgƒ¢?‹p† -4!²Ó¦ÿDa”aw8ÃØý®Ýe -ËF4&¢šâbØZÃ…‰Â7‡E…·&fÛk#J5¢ -t ×f/w÷Ë{9ìŠ8°…aLjƒ‰è(ˆQVá" rÂ+ý¯­*iϲDà Óm3c†’ÐbÕµÆYÑÜ-f)ÓܸHð#d -x -‡CãœÑª®:–\ƒ€ÂMļ‰—3•™Åµ*F°–èþ^qžë2bH1€×Äê„VV vVŒB'©¨£7 ÅBê±ÙyGÌn˜FuðP¦-嫾¸V`Uª -Ò2?­+=3W_ƒî¡€Y|é^À38ìù£ó3BFë“;Ùù‚Â}dËíŵœÅ>ÂØRÆÒãL0%)pgAG"7Iù•Š ë DZñi‰nv±,Š~fF"ƒñ]™A˜åDžwñ›ýŽÂUÙE’âê5UŠ\"†µ¢+3:@lGŒç]~‹+4Ä6¨(8ž‚u²`+Ô'*jÀv[ñ™zwzÂ¥d¿¯c—©ä¬@¦ ŸãÙØ‚—WQº -_{RS4¯JfI -#ŠeEìã5¶­×òì«S8¢¹ˆÉÖF`õÝñÕ¤}Iâ Ufå6ì‹E!•Vš;U!TñC¯Ð†e“KˆZPR±`-ºRÞæ^†’*¶V`Á( îÆ©qâÕl«"£±üouP r”ãΫ‚éVךdD\qå°b+LèQR…JØye3ß -©ˆ€•§JâÇ@¹â6õ -é -¹þ‰h -ž7jœ¿qùó8¾ÅÃ|%„2«SÂY¡IöŠ‰uOGyb+a #.7{sÐP*"ŽÏVܽ}ñï¦PrpAhk”åѺ»r_ùRR•$ßmija-ÇÝGg°Âñ§‡ß#ÖÅŸ4o - *„Y)FU4ÔGlu,ÂÀ™ Ô4Rsxè$ò)Pâ‘÷,ŠÚ"ˆÈÓ³´+pÔšP(Ï5ÅQæi¸ßý>9Ä(ðÐÂL‚§º°ãgUÁ:wâG‰=‡H=%ãXPÀgQç -C¹oÎEŽÁìy¶¸Û -‘¥K‚¶–ùé×\¤¡¹€KŠ#æ¢5g7 `ÇAj–Ž³÷õÐwxïÈ_IsÙM¢ --VÚQuŠayJ½JŸ9— á/SAI!!Þ«kwù-ö¦ºÊS ÅZ'\9(GÀÑ™OÄ6Yˆó*^Xý!yz–Öñ;†ñRФÃ-“–nË4aÈxb©ˆ¦ õ¤.[ô½·pOÕ™à¥8[Kw ¹ ’ÃÅ%+ÏŽ¢‚eå\–j?í ÄÃW -V<¼ ®Ðï4½®¸'ï­ÕÓÃ@õ‹’ ”‘a…`f -8ŸT ?+ˆÄàQ0Íè ±¿ræX¤…¤¬Š!›.vpƪÖÑâÜ‚÷©N“ ®9r“ÄålÄÓÉQã¡ß¶©ýì¸à’k„`Z¼Z?«ÄÏLŒFrïwuBbî"•Ø2mý,¾" ç͹ÁN[ “?©JÏÞýbIØ‚ÌÖ‹õÇG¡LŒ…/Jq“/‡ïˆ{_&“8}h³Ãê’›ƨÀå½$¯2~ÏMîy"2¹L¨LÌŽÝ—­2ã5|í#p¨ ëµ¥5o}ª¼·Tr7Uõ„o«k €Ö9ÝĘu·p“Çûºx¼‘»,̼‘Ì*“p-ÿ[á猨(rÝ–&Q!úTv^é²ä»²,ä Q¡ºÄB•¡ëý¢7ZO$fûÁz7.ýðpñËO^¿ûúðƒ««Ë—/?¿ýÅý§[ê>ÈÈöl²À¸öƒ6TÖÙ¦À¼d‡ËøBÚ.ŽÓ¦\7^‹l¸r›[š+ö IŠÉ -#G5ŠçÏP„!n‹ v‹Çe‘O#¼ ²FÉ%ÈÄJÅTkõlOAÒ 5ª:Lá0²=¥ªlOað©.Ê6$F¯1œÄl5M- þ¸&Okpÿ@y‰7X‚ÐÇ'á·DÆH}š:œü᩸ùNba%Z??®áÜxõ¨‘Çw‘ -¼±d¾€õ– Ãôߪ$K›B^u¯}Ž«22Œõ0ò‡ EM“§5YºåˆÑõ¼â—à¢B*1OT$ç9y¿a5Ÿž -1Eªü¹TKܾ¢HM`›†ïo Órw3§²p*Æáé,Ã?‹Äê/PÊ9òH¯djïŸç”ŠFײ›K=ÅI!vvi3ò‹àÂM½ætªX5;zFFÐX[é¶ÝÉè#qõá}’hpœLÙ:Ëi|D'áè$…IÑ9F4p#ÀG­DÏ‹ÓV¥b!ï_Tº¥©+¥Ð•˜Œ¾)ÍC=)P°ºÉV!V%Njü}"fè iEfsò|Æ…X½¹£œ -äÎ(€ñxè˜1¨ )iSšVr¾¤úÄ‚Ù‘ñÊj>`ÉuÿÙNGìÿMÖù‘h‡cÜγH²˜³™2NÙvDÄm#ÁvD,×CZXöýG *ð,@p]•‚ÍÄ !Ô¿ß„+tˆ²”(  ^ÉQ¤?XÜ߇Š“£““‡ËHYÑðÙ+òï+«LëÞGÎâ·8#â"o1…þ]O¦æÈÈ,ŒÆí¼GºøŽ¦³Ÿ9ü.Ãð»ÄÛ §Ÿ·æ*–-#‡ Ê°uq%Œ´CêS–¦š004¸æ%OG4’ Xa瓯)»e$/îÅSZirbQ¼ÅŠ AÁjûpÓsÉᬥ¥)&µËCé`1¬ FEsZè5ò‰µÖˆ!¯ÁÌ[[ÆŒ¹Æ3ü®”‰cÇ£"»l#¨ŠˆÔ¯‰Á¼“”Šf)3š7y)Õ#šg%j÷ÓSæ|p ‹³9Ý=ð…J¬„~,p?šænÍ6v²‚í”_˜ -K";˜"3°ê“²*ÉÊ”@¢Öl’wR(6þ¸7 ÝhâÕñsZ’[ˆl×’ˆõ ôt›gRru&†.@tÖ6Ò€!ºA ‰$Úx -’Œ^•è+è8¯ÍM³9E~˜\lKc¥Ð¹B -ðø¦ÀÎ: -ŒEó÷h#ÒÜâùG¥™N…“25<@£tð¥䞎K‚ ‚Íߣ,€ $¶)Í%Nseu§9™¿Ê{/¹Ïq"@ýj1Š’ÀÅ(SB£'ž¦~6§Ñ¹5Ù‰Ú·‡Þ‘­@ŸdƒŽÖA: EX%7kPО+ äl¼‘D³2N¡œ®ý!Æ›>O~&×½ŸS‚`,\‹;SD¹wЉîѧr†:<Üxô<].I§Ðp¹$Ð+sK÷H|"ä‰øD•› í g^kFS4ü3 UÎj -Lăj 8ýÄG 7>BI6e2žÉs µ!®iÙÉö–°HTe§cûTë¹X‘œƒ¬Œè4ƒ¥Ï*ÚÎ+B|bÉmsÒ$Y¥Á®P\Ê"Å0FH#œ«{2Ò0•ÉOwºÏB?­ÌâQ÷JûÊX.ĺÈヒÁSUYwjîén›†ˆ[bê„`‘›°2¹qb»s vH9öº¸­l\r×+„©µ²9p&¹†ÐYøý†Õ±Êvª¹S±Ž{eçÂצŽ Œž=J|šû›â[•u’ý…·¬lBVMÎ2‹¸»T”®({BFô5Yþ‘Ȩ2„%eÿóÅcÈ£[ðÙÉܤ„¶ & Î_iÊG¶IY -dÅ3Ê•ÜãT óŒ&xP†Ë­¬%ÏK  -ë,m“K“’PY»àÓH«›‘"ä œÝ±»m§` —d‡°‡Ñ=íî›AÍaØü$}W¸â -?b÷ÃUHªU¨Ûñ¦ÝÓº@â œ±ÉÉj’G<öà}“Ç -È+뎜°ö¨’´¨†\–’Ì4èµá Ñ@zÈ›lrÆH¯„bÇUNê=¶Å›ŠÙ@!A¶NF‡‡ùu&+&Ã=g/©EIêðÉnVw•3ž„šV·n)•3‘£d!Ÿ›eMÆbÅ¿—ãSKœf:[&Õ¶OÊBÜAx¢* -'¦8}Ûתž¸‰¢ ƒ ç ãâdíÝâªoך|Ÿš%Iq GY›/ö(=_ÓÑ‚‘%ÏÂÝã‡åMnlS‡4<×böC¬š^•Pùo¦1ÉÃl@$ŒÂ<#Qûž¦c%›ƒñË -˜¨ŠöŒñ˜3ÎAAÌ®tºwQ¹EÑÁó9&=åç ÎU˜ÒT°¢Ò“6½¨ Ï0p -;áÍV‰è=6'M †È˜Z·Nx<–6 UR¢×Â*z—•CôîŠ:¿³­³çh¬,Ž¨P¢›ì4R¤íXå‹“g1ö^3é5EXV%ÆRˆ ¥q§tí¨BWÞ@ D&'Âÿº¶t¤tT®@%ÿôññ,@e&³ -þÄöe˜Åª'Œœ3Iš°ª§ÜÕ+ºÿ/¿•k¯¬JG‘œ;vJ°YÖ©@b01LŽw€iáøi«{¨×Bv^-Ù~Ô -\!²\5A®) Œd!RsxF®@rAá?]åäÉéCî@fnR”à@ÕGFõÜo‡ÄÓɺ•‹[k" ÄÎH™fkÙ=¢*îÓxÁÊdUJ… s«o‘2³(ɈHeͨÏ~?ªóð©¯Pý~iYÜíŽÜ$Ʊ.òĹl<_¤aýÃAô˜¡M¬•’nÝDÇÛÕ< Š'CQX> þf[Ú>lrIÙSñ]ë‡-¸+â.#‡£@šåm'‹1Y[C£(ÈD0ˆG5I;j[ÚI -‡!«Þª„‚UÄ£ŽtyžNZMJjr˜€½0¬Më°ß“úì4¨‘§XãB„#\ƒÄBOÙ«űŽÀ Ü;Z86§˜¬‚+ÓXŽ.±î]ÐâCçÜì-ÛWTº.[|õ­¿ÔäÀo´]¶Þ6(¨Ò뇑^ÇÑuÀ[”Á½™Äh̵û]©Yª,˜9êÁÄ“Ü޽ʴfǼ¸<슇E'SÉ9qgí[,'=©J(”+1îå »kNŽÃSÝ :aä…@RÏhsÌ0C!Is -ö 1X$[ý)c£T ð>r Ëk@µÒ Pnøà -&m2g•³ÆÈ*ºËÇÛŠB­LedZ·9ø=0®ž± _ÄÎ(Ï]IÌBvc9û -°)Ý&N G/T\‘›ª˜,“½P9ÀäÀœ”+p) -äXèNÚ -A)¶}3m®ò&Ár¥Pù¥^NÓÜÝF^|œ¸•²+¹É—X¶p͸/T×>Î#›\áå9+å·(O -TîÎÙpUŽKŠ(À¢ŒN#z#¬®:ÌÁ«h¸¯®Î›}Rþ7¬ÅÈßi&‘®C EuI_J8=A”.(Þˆ|å+¶æàúh-rBÝ» X ÄIà0ÐZQ GurαŽ‘PLˆÜ‚ÝÕ\ÕJs˜˜|¢ßpÁKÃOi›!2¤m¡+Èä‹,ºË+ìȺ¢ÇØà ˆu"àÿTF6k‚1ñR%³`ÀVFÎI­«+ñ”ãKQ8žÑ)W<°û+{ªÞÀšÉî¥TVW™œÀöPèù®ªÒ£w>ÓOeS”<Æíu* IjåÉ… 4U‘GvºyfOãˆHjÊÑç®æy¤£¯áù¶zœº¯.è“z„nR¾‡2[åÏCš²QÃø¤ìä±*X*yߦKNC(‹°ëSÌ÷èKÃ¿Ú -ÇI²‰P€¬-ÞœĹº’sâ¼B9CRv‹pÅ'û¸ÌNIYÁÅÒk[¬39krbX²¼8“³°q쟎›µÆ¤ EV*󈱌vœ¤‘P^!DɨÈ©!—`BÀõPqD•Á„äQ_GÂyÀÍL͵ÍŒB…[![{$ÔýUñŽi܆¼Lžæ3É,ÇïcŸš'"oŠo™QZ?åXXÞ]9ÚÈÀ–&§rÛ.ã(CÀÆ!ƒ›ÆSpYHÿq<(œ±ÛäÃó¨Uy ¹™& -IUJó±(u±<0•½Ö¡(÷(ž[zÊÀ(oèZðV«Û@):h¥9ù–|P ïQ´¯¾h²ßWhRœöê÷gŒþ”,(Ù[Sª}ÄÅÃ5dž¤óè9Ú¦ÚšÇQ•§¿”œjõä®…"lÂýÓå$©`kAŘ°vü ± «¤mÙ)…ÅðŽ¢ÀS³ŒCšü‚#÷Ëp-[~K¥¤‘å<®äPZ¶:ÔHÁ½ËÈRèÀd˳±‚¿‡ŠŽ”‹1œ%ðÉžŸÉ9dž²³5î¤ Ç¼­K¶‘u ¢Štá©ŽÍnœ –ıÂG`v8x­9~Í‘$È¥;’rarnxW2 ’ ²7¾Ü0j»¦Ê¯;FÞC˜Ÿ¾X0Î*Ú:–,Ô#a4OR*0/[Æ8ïuòÐ}y|:›ÈQ»vÀ^Y=‹† -𓧠¯ê«/¨/I÷ß« -C8¸vÓ¶ã ÚÆÐÚ'ž={=zžÖŠg VžzEôvNX¥ÄVtg—¡Hbç Ö>åÓň¨ÈERØØ![³'ûU¦z±L¶$[3å«‚­2Í)QÇ®âúØ° Ö¼oåA!Îå‚yäSÐ"²¡’çd8y`‡$2ûûÒYàòÔê^ âÞ¶=Õ7˜³HÐ^ö8Òþ>*XŽaS -×:øŒ·§Ï# %‰7ë-ÀXc{g;/Oj òË1¦/eé_õ”‡à& ¹Ÿ Ð}{pŸ]°žˆ¢i@Õ¤ºw#ý¶8˜Ÿ¿=a2kj®”í®·Õ<:½‚ºŒ §´fð´öÖÜnÜJJO "¦jy1hä±fîé©|w=ynLcÒ•`ÊJ“ÈNY/[Ì„ -=[í¨â‹Iòtw½UëãèîqxÁ‡¨‹VP7"ØG -sGÙˆ¬”CášÕA:eQV¦ÂÈÌôÖ¶#=ÂõH Œ@®9˜Y 矻0:`ì -ËHý&"Ó=¿‡\šå²4‚#Ù•«0;4—Ž7SšyÊ)ã‡kUn屧@ö+(Fû4a™úô0ŒVÅ\«æpè§9|Æql•R€]Ðb@ÃFêàÙœ\`‰«"i?…8w*'ߒ姣§” ™ûJæ±öÝB¾ËÓš l™g•$W)Ër.V8ŽõÝü"i¿I™ÚÄi÷¡dÙ´àæ ÇòÄä> áÙ¼ZÁÕflÊJm‹tEòéC;•—нæ/(]Hy¤’Ërnž™Sê: µ¦ÕBB _O\ƒkÒAj„#»õCiÊÉa'ËXO>†u kïê€,<Û Ä³’}•ø¯ ¯¶‘[‡›MYZG¶ÐŠÕ¡”§ÞÚ–S[‰Lûcúwv¥*TvPéâûð¼2rÐAk#8B|NN„Yàƒ†&ß“-‹~ÊsßöˆÔ5Ôa…*Å.ÁÛv>cj §X{\Ãψ怯¥„=?ÑÞ?I«CɹŽÔèÆXiÁmZŽNEb§-ß@w{E‘÷²ç]<÷qÍúL¹>‘ÓÊÜðBWZc‚E£¿I! 6ÏŸ|LA°ºC6dØ#AÁ­TñÊœ¦ -È«–”†^š4¤…åÑF&ÞBÆÏñ¥ ‰vÚÜõÁ—aË° n‘èéyƒñŸçƸvÙIæ­(#…r¹§â¨í™˜Fj*ÌÖõSJ’VTÈ\òwÄeÀÎ`ü´8ð*ˆŠjÙØ‹GÅUaÔ$AÈ•#¨ŒLrĹöè@¥ÚÂ?±„©!oC£„`××a{íÊš”µ–ŒUKŒBÁý¶Ëü«83ã(s­ýöT«Ù³¿ÑÆšŽª0-î™N7”?d²/U˜Àê52r(N7‰3É©A® !¡HæF¿Áý —T«Žž<®ÑÀ”€AkðÕsª9Ó­ð+OgæP¹ÆåeÝ&ÀsŒ˜,G†SέE)÷M}eƬ§â>B0„÷£é0-D»”r˜x£¬tìÁEƒeàæeK½"»Œ™ˆâ‘ (€„|9 -‘d=±ÚÈ5?Aüfè¾ýˆ@ñOPF,<óp™žú -‚1üíH5šKpó®Œ[Œ®eaˆºmî¬vý=ÊŠSÿ>úB;OÀÃÿäã‹ŸÞ¾~÷âúþý7/î¿\üß~¸ÿüÞÛ{ú‰_ܽ¿»ýt÷ê…½âä½ýðƒþñ¿žýDù,ùåNÂîÉõe|êQ’ðÁ’ç¸Å˜5ñã±fgPùv°ñ f­Z| £Ý0MhÛ…,пM$|ÊD‚Gc…âgOP7÷ßtu½ó;—p÷®gBÙPÞi·µ¾»cìéýÒ KPu'”;æÜfsáî…à*#ø;àv¢ôI>>ñÚI~(÷¹×®dˆu}§}_x‚Ïž‘–ö–=lÚúÓhìyâÏ?DcÏHÿ1=aÏøé†ð4 -»<ÔbœàëØjK|½÷ŒÜƒ¯<Ú¤ó èº\qsx ºŽÅ¡‹Î=µŽŠœÌ§ ÖÉ})O†‡Èêr/ŽëÓ€êxcz„£^,özºî3]e½?†Jç-q-Òé[™ÐéÑ ŽXÒý::œI®UðÐQiˆŸ‚AŸá´ÐÏ•yI ÅÐ󺎀žÇPç(-Ryá¼!½´u6‡ï[âÓpæâkŒbÞFÊ…G -Î63¡=_êD-'Wغ”Ç`åm‚‚=…QŽœ,$χÐäm:±‡ˆä-{²À=yë>ñÇ×â*ÿ ;ÞGR³=Ú8ù1(Nqû- ÌçwXO0Åyv{@‰÷‘=b@ˆ#MÀçî‘ÃWP}×u ‡’áv3qÂé8ÎÃ{xp"ŽÐRLTpå¦t¿?rÄ… \¬†£ÜÙRYÚ *¸sZ¤7©,¸Ø DM+hÈÿüQ¼Õ\aVîºÚj®\QV¡npàúMœ$QW¤ŽÝÃkÅË”üé68pæ Uñ„_»rö0à}8ìOôo'kÊ’X^ÜпÅ*Éb“e6>AÿöB¹´geÞœ@Ü8o—]n¯ÐÖâiÅÐQµ ¾ü±8{Øð¿ÅÈÖõäa7óeñj'¸ß}'Ü7™Å±8O”o²S”SlïîÙO'¢·k`Êä݇cßÍ=6ý„íF)Œä:ѺéE Êó‘æ!B››¶´#$7ab¨‹wHÜMa)·V¨m”¼ ‡‚3Ão\`4sf»tÇ“ž0Ûe$·ß£k—K:ѵIH ˜ Úd¢FÙciYTÊ¡MÖKÞ3!´ù£ÁC‡ˆÕƒÏ„˜­lÖ§ ” —–Fò-¬¥°n°ØÕ]¸&6ÖhTk{0l%ˆ¬qb`²ŒgôNy¤êØ#^g%× â5¸d@O kðÕõß|GXkò×’74k~CÍö ÖÌobWËß¡Ö Y³CTï¡ªÓ Ç¡;­°D˜æµ,§xÔ’ù{š8Ôqœ¦~ú!O<-Zz {ÀõlšDn …L’É»ÈØ!¦aT ä{diÏÏ6@iy9v™g¢—o9ˈ†œ¨Ñ¼§ÊƒÃaŸ ™^—r‚­,rÈð{J÷(Ð,G„Æï™oMþUL#ÿ™¬¤>Jʬ†KJÄqkö\¢¯¨åLGJØýZ³òDOkÙ€œùM2•‰ßÌo¥ªÛÁ6ã;YÜ×H˜Ú K› ÍÛÏ63¹°8ý&$³É»Q)åFÚÿ‚ijÆmÌøÆT7Üe°Ÿë’7¼e¸Q{˜eµêÉldX„–ml‚*SÎ,ì±”‹'žÊ8Á õLàäBF›XNð’¹7Î<‘#~Ï!s ä#Ÿ@"ÃQÒÙ‰„Lð»a “%Oˆ=î1ItvÀîÉD9'I‰wàÆòC]ò†iŒ¿gr¼LQ!à…!Ï{cà±)LàbÉ\ñˆW |¥öñ§˜h–”ã†S,PÊr„'æ7ñ{Xâkâ†FÝT11ˆy$•äá”|5Àa¼Òj=⠧䲇ÆÅ$º TË€qï—;›W:B?ÁÆŠ½ÃÆYVÒôD ^4ÿéRð¹|“&B0§œOÑ8õí¨u$Þ#0‰J;¢#íÁ½>ÁüIªµ#Ô/ƒ³ø]Dæö°¾œK¤1šh¾Äk%O\ãùŽ²š=†/» t/–æ\ˆ½Ý!$N€zñôXÚÐKÒ¼¡òÆeF»—e“`¼ªãªnÄ–æo=Bï6'Fâ.IÈ5<‘vçï=Âî¼7‘u»ëP:.ðœè6v@º¤“÷À¨ØŽ°¹ÛïZî¼7ArÉ^B«6îXf{HÜ®´—yCÂM®,ßpA#ËøvsŸ€·8£*òº]jðá–Ý)×Ö qû#^¬®°m¥™ éÓ–„fŠ"˜P¶°Uü¶²÷”r\ ŒY‰^­-‘À ¦V:ˆtŠNk{“-0QiIÓ¼âd?Ñhy¸Ç܆BËXŠ™è³ ðÚÕ}ØÄl.RÅ°YS GŒÙeÀ,MlY”[i=”Åâ’=ŸçÝ¥¤ ÝAzÝãÆr 5:cÉ•Êi2qbÁ.é–£_ea)2úyƒå÷*”·£E>Ê— mد859€ _¬å¦´…Ö+lXMaÃzeŒ=LÓ“Å£‚Òkì:ïM@Wü„[u`F 4‰¶Jõ1ܪ»Â’“€´€KynU`ïT㺘Žh«4?*KMñ1ت6ñ"ªM©!ž[U-\„\³¶Ç`«ÜX‡ödU7Ñ”ÕÿiUÇTͺ‰™ò1Ȫ&`Õ–°ùdUÈ©Ðj,sJ¦Q\Ýu¦ -Ðï1Ȫ¬àr mبûcU­aÐoêªìOƒ¬bt–iÜJðØPV™z‡+Å÷cï)ʪï0Ä‹-9 é(«òÀù\UP–¤Äw:?ÁUymëw¹P?®Jﵯ¤Xý tU¾V^xúò!ºªú$ÔôÅyf5ÄþTÁ íñ1̪\ÆñçÃe<‡Œ˜UÕÕ³°yOâ­êM -OïØfóc¼UÕÀŠQD)öo•JKCD0Oâ­ -'tl·˜U”ûÊŸÒ›4Q™w€«Òx×ú4ЪÜÜ»*ŠñqUªGÁoY«N¨ ®ö2"ÇžB\%õm~ïèh@X“õþ!¾ª„¹ÌÁªR˜c}§ªgZyŒ¢Ê[úÓØ©hž÷2UÊWÅ—ÛÉéx*C%ŸoK‹Zx žÚûT{ˆ™ÚÃð|•ŠRavO!¤¢Gãü!u»€Q)€ùzu#2â! *rz:ͪO¢ž’DZ´ÇX§Ò;'akºåÖ©œñ¶EÔ¶Æë ¬S¸ò9Œœ(@Oµ8Ý´™ } z -Æ ˆ{°Ó®Tâå°4Íâ”ßHœ;dSn%‡•Ò—çe@¦Â1\Ê ~i+›ôüä£m~© nÚ>8-y2…<+Ÿk3NÕcž2Õ¹KÈŸ¼êJ} dª%Aà™½Ì©æÉkZ w@¦2ݵ´á—ê·rvØ”ÁîNS(Ev„»=€©[®E,Jщ_êFãÜhê`*+3‰\±M¯¥ž˜2=`"± `ªTžUÑ©€)££pWc^ºê'¦JùùýFxïD2…#rZÈa›'’©fŽŽ˜ÌPNMU†ÿ"³E¼Õ@4U"DY½ÐA…º!šR Dǘ’ðÅÜ#šR(|Ô†·SZ7DS(YsJßMUPt¶ãyOM.„²ÒÇ•¼!šrTwPPHj‹•}B›r8È)ÐÎ&ן@›z QD1lЦzJ „=%ÒÀ6 ž&î >2œÀœRñ]³B[eƒ9áGŽn”¸=5垇ÖÈÐwD5Usù&¶¶¡šª¿) -”Œko -ƒáNªì@uØbѵ‡lzt¨R®Ë2kqùÞ”B¥„«J¤V7|S -”ÎÜ -È{°á›ª@Y±­ ¶p‚tê…ø†Y¡Ò ¤S½').«lX§€+OrÑì±NÉÜ_ ÒÒ7¬SÐOŠôWjìuŠh¡|5F‚V°¦öX§Êd$az„oÊL¸,É &·Ñø¦â%!T"¯Ýàè!KÎ"úöéTÞïƒÑ88¥]OÃCæØî3qpÊl*$‘Ì2 Æþ)€S¢—… C±ŒˆÚ€S6±çZ!”9†Ç§A)„ BÎC{àT)0äwºØ•øà”ÃC7<8•î'q«‘¾·8U¡ÞEYŽœz >–IKñ1ÀéT.mZ(ø=™É€NN=Snd­  ®Ò) „bWI^T{šH§¾Ñ`‘’ü¿ONU(Ç7ÄÁÐ7¤Súà!¤‰Ä}C:¥ÀƒN'ETØ#ÊÁŽlôVÈÁµAªÀ9ÄEÇßÄ:õÂB€Òðl*9zG+€rmX§¢„!m§0R˜ŒvȦrJAѯLüD6•OP N)ÇàZOAM9PYó™ùák„iåä²×î¡K¹·8œ)¬?åmà@¥'’h‡OZ³;ÜLXÒšÝÚ3ªðS÷w ¤µmfnÁ‰µ:àCê·öH£ë@Ü·ˆ¼ÁiaŒÎß;€ÑíÖ]ųqEÁ¼äÚ㊶âÁe[Gò(¢ãç;tÞˆ¡ÖqÅ«ÄÐuÑ_;œÐuä¡œ8¡ë2l÷Ã)n]Üä²G]×ýNTPZŃd‚®‹ÿî1@íCd˜ÐŸm„ÓMÄO2¢Â›ï>˜øžúòë‰%vd¤ØÐ<¹ÇêŸ žüÎ;ìN¬µ8ì!;±ÖÊ+g@vbŸíŽ4 ¨NÙkc8Aè¬ÉóŠL`N¶£1¯0g‹n•ßãq‚eQ{Ú`8+*›\7ôÍÝonº©[î÷)!QÔ„Ø$AqœÎÖ°‰ & &~=Á!T1ñ3V±œàg*˜ƒ`6/%¥ p™²x§v‚’‰§ò› pLBŒQ-NPLz!H™¦zB6Y¥Ã*ò¥ÐOphÞ^*e -ôhà\*¿ -kkÀ[Û8¢Z‚\#ùn€Y¶áE°lûØ¡+I¨+›Å¹ a9I kpûë†O‰?¹g^uºkO&åÅ؃P*—îÚ'ö$?‘®&öäLл‡œ\³»?MÈIbk1ÒN¤I`8q÷ÝLv7un¸’h´1'œäü½C‘Ün ðHòn Ìp`F¢Pjé)²GÏN0"Q›¸ooÆŸµo‘J=*ïK“ËVÏ-°DRèò3Jë¸!EÊoRØF3u@Žè„;¢ãæ#<²“7æ°DÊ­[ŒIc¼9G“æ àØ÷~ÉqØåÐIGO°$ „˜ähÂ…\‡?ÙÍþ.R—ˆž°¶ RŒ‘³r˜ƒÒ ¤x"YP6Œ Òù¡eu~H©‰§Cv©L —åò!4á ¹/<†F,‹0ýFÀ®†ÌJX¿‡ƒƒŒ}·÷ ©4¥H/è¿çÛà ¿Èi]ŸýÅÁAÊ&äq ]®'p*”%°¹cò„ƒtƒQªn0*eƒ}”}'{ @ðöxÒ1»1Å8EJi°•™UNï‰ØÂ0!ûÈ<¹Çdp=ɉ1ƒ¨q&ä#ÐÄÄÈ¢àL"¨{>”‰‰¶«ä€ºÁ@ª@Ÿ¾‚„Y7HÈŠgÔÖufÂÚ:à€&ä´óLøGåÕ!myuËÙÃ?Ê:  ¹˜ßãÿ(mæâû;ð…þQ*[çƒMŠáþñ?àµ#=3hÁ5Ñ 9{ôǧ -§Ü£Iv¿Ê1¢O»B”“óôQœŠ@¬\Úú ¥E,‚ 3Ïî@œ¡L¦AH»è£„A·6QYo*I¾tÇ¿ÛP fÇagÂ>’›Î÷H¤q;GÜ©á]&¶#rDtÇA(¢Ë‘ ÈÌ\N ¥ï•=&Û‘ú†íèQJqD)Õ¾a;ª ôHG¿WÔJàæÄvTóE’PPRî‰í¨NI -"áˆ"ÝØŽnÈ‘O¼ýiGGiw\ ~‰âº•9GªþNPÑ\GË8¿ŽCgb:*r;ö(Ç‹0ðÛ:3‹;~có4!{ÔFn¥X£²w”uÃhlÕe¸=4#þøʬïÉVfæblÕóúìeëºá.6ܳÒní0¤²Ø°œ…º+VD‚%làŠÂ/맘ŠäœW>Ú©Hrz%«PŠJVßN¹… eà&Vi~'Xb¾L{ŒDyµÖ°¥¨jX#pµЈôÅð‘Hd(ÎBTÊ8ÇþaÎá{ØC9ö¶¡ææ±ä|²OAQ;àÊ3± ‘Ýd20 ùMÀàÊ?Z¢Y&‚!.ÝÂ'À…Ýå´B²ýà­5A - ¹ƒ6dB|y ;Ür¯•#!À¥´ 0adÏ=ì`‘øˆ6Xpý>y„Ü'Ђ¤£S¸ßH€*I+× H8kâ÷ød!å56 -œ'Z 踵ìA¹‡’|‚"!Op@ú¡6v˜€ÄE4 q "ÐaF3—á= ŸŠ¦oÿ!IJT'ÞIˆÄÚÃüõ!ÄNt?åÍ(}õ#hŠ•°õ#LÕ×Äò# EË„ð# ‹î¹oŠMÀ¾ÞüÄœ8}üž¯™8}2•ºò;“½uÃé›ÖÌ Ï·..øîQùH…"eÃ@åšBë_—•j=ÁàÃz«ää)Pdá´ª…™¡Ý6Ã@öôôAù=Ÿ -eéµvÛØ@ø‚ Á¢¬ðXT7>Ù%®,ðOë …Bön_Ö²ÁñÁ¿¸†]`€iƒã Ùž‚:ÓfŽ‡G¯¸|()s èŠ7X>…‚&¥¬!—G>åS¦C7!„Z6\>9je9 Ù /ë†ËçÎiî{„]è˜O|06Ù -½æ ˜OKÁ]¬3!ú¾ÈVOmì÷ÑׇvêId¾îþëðø0¥aeØÃðÁº„õ è{½{Ö#н>"ØaíÑÇOBì)×Kvýý ²^Y‘â¹’Øó1Q>®á»NÝ#c×ðD%vƒSfÈáOö;ìö$öå'ö$Ü7GóØëIN¾’&a|‡99¸±×ûðdv`=}urÿŽ<=IBYLé3ò—ÛÐ=Žd=yþŠ<=_Š\6B>÷ÀzªAz1ÚÙk<ÖS»¢=ѺkRïÖÓ„H60^œ4ðXïÑý=°žŒN8 -6ah† XÏ“Y!«<µ” YO^8w‚0‰ÃÍYOöFP»VãÖã~ŒÉ é0oÀz©b:ÁÓó«XòÌÑ“7<=Ì¥«ÿöÀ1*j fì)ë žž> aô„•'?&¶Ñ £§ÀT¹q) -öEOe"¾¶pÙŸ0z*Ð2±,ä FO‡—‡ÓZï{8Ñ¿èyüV¶&«L>Ê =‚D6P:Iƒ·‡Ñ“ò'¹· pOOΰÒÇU× OO´}'0zÒiFˆÒImƒÑƒL¬ž›Æ–U茞{ý$÷úÃÚÃè)Õ§Vj ÓAÛ`ôÜ«æâPëæ8"R€Øïõ”÷•0arN§<=î»›éŠ@ÝðôÜV*¯€çó žž¼U•œ•°nxz*Â1÷N<=µVNPôð,ñdÎäé^ú†¢'P“à &,§ ¢ÇšÚ!ñDÖE¦S:BÝ@ô䎢X’Gs”¥{ì<<ËNLU©Ÿge[‡I@gÝÀó°nk­»€Oß=BùÒU£HtæR"½•n FL£eƒÑÃæ?’g›¨ž×=!@H$¿ä Eû‹’<ƒHÚ†¢§©à’,Æ'(zJ¥-rà7cÚPô<Çö"  Ò?M=µ&${ Æô=ˆ^Pp"‡•°¡â¢G -#·"›¬Žr‚è IB¯ªYÛƒè¹kÆ2\3ZÝ@ô4òÛNŒAÜ@ôððLF¤Éw”ê DBïœ0Þó¢”÷™OȲDO¦7ùñe¢G¡!*¹ÃŽ zzHÃmqÈO=½_®ãíCGaX ”W`€é±:•¨¿‚Þ]ƪ÷¨`¯÷¸pàìÑWˆ’Ms9íÅ2âagOÍùh)€Ú“àǧbót[¤j놳÷èþfïaÙDÙ w@²2ºM”½¹A÷àz&úlxzÊ@…œÒÆ!• <=9Iø"Ø¢€t¯ûîÙ§Ô©&žQ­è;i{䟠,á&Ø'GåÛ¢³EäÀ¾÷á“í©¯°Þ×…¬puÂ詶£ÐfÖv‚§§þ˜* rÝõäUH¨©n'ˆzRZ;m#åPO88€Ox&.7û4§0aû'Gwñ>ÔÍ’d@vëO õȰĉ¨ÇÏêÞ(H4놨G %K|["(ÊüÝnÏÞg\$Rªøf·§n S¯ö1Îsm󆮽Ƀù²Û³°òcSÕ/.’é€<º¤¹¯^eoÓ5à41¶×R¹›}z%´ÇT½(g5ôŽ>njw Þül¢ü-REë¾Ò ÙŽi|D9ÌŸÓÀÇ^‘Š,Ϻžã4uGîâëÿä‹Æ¯C‘`Û¡ñë}kªkE[‰îÛÏ.hôcÚøxŸ‰S‹šØÑsÏøÅ錿ªnƒ³­”µ}ÍÄÔ­ðg;3=Ú‘À(³öQ™—µRèúÙ¼ ¶:LÛ³ _« o«2zs,¬?;”©0‰7e‰vih¦´êüéÏ6dü Eªí>†°¤à‡2ã{HŽ~ö£¿ o[Œ‹lg1T@úû‹Ÿ˜xÃùe#†ò'oMù‡q ÿülÆßèo»0ìqè¨n—0¼4ïX}\¶’ë6ãߨ¡–9ÿ‡ø³)7ÃFyµY¸Ãòƒ‹~$ò±þBüBù“è0„c}!­!Œú'/™ÛåÞ¥­¹ìïÇÍ Hμñðþ=¼ø7ÆmÝÅ¿¡UýlÙuõ(q}œºzÍšt šëc.šÞ%"¢$ØM$Û†‹¹*Äð'÷­õ7k[ä„m‘`x›mQ‘¦Ø÷³ÙÖ«rÚùå±Õú²ÖbÕŠ?Ý—£ÖˆÚîÇHë¬Ý²ü³˜ -ýüÅ>‹$ª²\³çïø˜e±!úsòÈB0Øã¶Æ¢sÎmˆõuû« V€³÷«»¯ezu•0Æ/¦Wkb‘î¼®¤ýdq¥H]ûÕÙê/Іû—¡U6ŽÕ_š€Š_l¬è ¢³¶Ý«˜ªzG—i•Ùö«WUKܲ=ª®Ú•·5•êV£ÿâH(’¹|¨È«4•ØöSHQçoöSëÞ÷þq:qŒÙ;žª8?›Lªßíc.¥*µîŠå*u¨ø”Xòc+Eë3Œe'Åbx[6RßBÜ¿eü̪y'öÿØGhcÎlר­Ü¼Í¢€4 ?ð³G%Â¥m …ò1év„¥9ó³«Ð2E‰à½‚7Êö‰ß÷¯nOãŠ6ð6y0gb{;©¤9û/–N£Ô{v -e½íÅ„òeÁ>ÆMÏÑÌý7*DeÓ„$lÁ­?îLüa»3½gt†Ê” ßÖÆŸ½˜è¦‘l &hò,V{ € -°Ÿ —Vwêše¸ô´è`n뤻p?Û+Qr&ÀØ›,=Œ-W¥ýïŸÍ”ö߶‡Ò]V;Ûé.ÏŸ=“`X°@ì¿=g¢‘íôù÷OÆHûoÛé®æ¶AºKKðg÷#è% -z–éŠêDÛìè.:ÌÏG|戃‘µ¶[¤fûx1¹[>óiÐàåcã©,Œžöí\ƘÕÏÞEuÕÂ-¥LÿuaïŸ5ñsüâPô”Þê6&²lûžc"Š¨²O~ò#z*·-¢g“Ê~hƒc~rÚ¶Ûlèy¢üÍcè)ÀÝ­…ž‚¥lG¡—Tåè#!lXöòoé°¸ û™çú¸A·æùÙ$H%æLyi u,d_ã' äsÁìl w¤ÆüÍ÷Çû[Þòßì~žr°øÝä‡Ö¤Uñß½}¸R4õy‹—ð͡o–ß,| G+(ò' ÊË,*쯜Ñ?ö|ú>=ÏF‚”=Ï“>îöÞÙËÇÏ^¿ûäÌ£L~7ÊùøÉ)çëo±Ê™¥±úͳä¾6ÈøÎ82ýÔo†8PÄúͧ¿‘ý£lº1ÿ`€#oþøf{C¾um?œßÝnè,G‰é7·›þl—‚ßLn8ðTUö›· öàI¿YÚЦýËÉF,Ó÷ON6 3Èë¶ãÁ(öèRQLê @„ßê^þbWÓ¯@€¿ÙÕ¢¥¸øÝ¥¦S6=ÿ`…ÄÐòó¤áÀ˜)áuÿfF£<åûåAó{À÷׿a0ùÿ{ÐüåAC7SX2vê¾±‡=0z(u÷¸Ò8JˆŒº9 -«eF5dm„°F(lãˆ7øËvÍÊø”1ò@ó ÎûüB‡œÐ¹WÒ3µ« θ-4Ÿ¦'|á§àïh†ô°RcÙx­iÎ;0߈x­l«c‰Y¡Dž·ÏÆÍ3èÆñ®i}Çî±\ÿÅ^ý4ŽáQ#+gF™ÜÎзD:Z@º¤^m7ï¸p€;Pðî-LÞ€M[bŠ‘ÛX)Àq=ex”Ë$»°U…2Ž¤›ƒq仑4~P D¹W:H"¶r"LZq¡°ÐqÞÜMÍe"Ä0Ñz—5ÖuD×Uò}Keì”ÉŽ“<¦–ë|†_t›ôG1—;¼g®§·¼£††íí£­ä3í kFˆ%(ů±‘}¿Û_ºî`[J•êã÷鄬zý†µ9·û &;§ŠÈ×yF0ÈųuÞ¾ "]ë>]E EçØÊ4¼;: )F£ƒSŇÄ·—£¯1"…Ü0ª×WzÈÆ\ÜÑxš -—ïë¥åòX+0aû]“ e¼]ÎqÔÁò³fŠÂÚOÞò›öÍ[OÒÄ[¯£3%P¶5Í¿5b„,Ü1¢¿ò=‡kËqm§?Ú´Ý—šœA'fLÃlÑÓHèï˜í–ííI³FÀ±ÈT¦AŸëÔŒh]q -®³`Iðz–×ò -¼^ºëtš?AF3»»óm¥ ¶RJH¹¥n–ë]g‘ñ/¤€\pŸPøuâî¤U'wöXOÓ¯ßyæ+˜õ…¾X|œ®Èô9Q.»qC]»ÉèÛá ;¡S± 4d‘Íß‹ FÏ ›Ya}#–nÂ?O8qÜó9«Â4=Þœ”èÍA¶2P#EŠ`}5²á_g-Ãzl|¿š¿¯‰+2¹îcÔê~du_‹lûñ̓œ»£ž– -x¯<Ñï}Q \ñ··ÀY—¿ÒV -Ö‡Jî¸âŽ|¡_ -tP½¸ÁG­L‡Q]½L£^&Ef6¿+­·ÏOq?a”yüäÁ¨¶vÙZ#H \E(ÁÃ8Nìiq%³@x-+õ5 ¹ÙØ™ö³-hÌ(qä|Ùy噈ƾ柩܌Š…×»O`÷jJ¾âéôE©<È>5}¾‹^7ö©õ˜3pã/baDâã!0°Pry:ßj¼”e‘=ÆǽYž×òÄ1~b¬Y¤©¬ß³ë ‘²'ˆPŽp=dü*»KÌ”:“¡Æi+q=ÿ•®ŠcF»€<Ö™=ÅpM]vžÕ¿WAÏr¼Z¦mLÖ¹£xk„#sýÖ¼»Õ‡S]¾XRfŽÇämÚzJïrIÖÛQ#F÷ôcSúeœXçEĹÕ(BF)4ψ(ˆRL¬Ë|ÁLvÚžð‘…Q¢Ä5õέòºy]ú>Àäù¹Òn¯82íkûR2#ÍáM•_–zÍJñFÝuÊÊ>ˆêRd˜Ž:èê@¸E¬p(\™>ІɣE*-ݦD¸:Ð1®ÔgÖö©BkÿÌ^ê<CW.3S 2-FŸ'…‰J>Ö€÷²— `ü¾©æˆÐû× J»Ëªª¹(ºîÀ¯@mg¯R™¹x­zúþŒz¨—Ï(ëžs;'Ð&eö)Ól‥ªgć†¾ÖĹá+%>×ÛÁ¨¦+£D'J --_   -¸Udn™ÓkDs§e©*Ù­ïE;²Ø85¶bä¸Èצåò‚ô#Ì]{ô¸)¹í¤¶1ðâë>ö#Ù­Ž–ã…Þ¿HÕ`Tâ¸#%ÿí≠ØZÄ;uŠ]e‹â.R`OÖœµ~¸û1i[+réö†°ÜyW.Ô9‡e 5°×E|”‰ÑŠem¾·¬ðèͼøD£HÂJ»¦Òk™¤¥Ã³F€:p€+kókUþ0ÒzHyò=[L “f‰dÁƒër=ýôºÑ ^ûÛ/ÕÐ5¢uÅJ_ŠsÐ-db›­ÇFÃxCX+}öRfúw8ogÎÚÎÈ…r©¯ÀþŽS ÝBÈ£Å((} v$ zÇG„—QìVÔêéß3ª_ÙTufÀp£FÐ@öÖêk^/L”5‚º¼#¬˧ڤ¨¹cXÖç'éÜLÚø@”òØ8í NÁhÞÞµûdœEà\+¼€|“žÅDRΠk"ññ@ÍÖÉ h]Ü£1EŸéE’ÜPú8õœƒr¶V‹{«Ý’”‡¿å›hã»"™X4'õZ)šýf¼LSF£uwº8f³&ïé¤fä/+Þ©˜¢•×òƒç™OgÍÛ3Ÿ–‡=Í£F>þš[¶aDØÊb‰Ë)µÝ5àÞ" ²•8IkŒêNd*÷9ËÁ¾Í=ˆÐ>¥Y:(Å>Ñf–Â÷`Ó™É6$ü%8:+žä0„š•uÊÊÃ7/ORXe{BçE?fÁUó¤¯åÌÍø2tLtÔÈ|Í¥ŽŠó°:'^œÌζ9sl[¼ë ÛCãöu¡—”•âp¯éÌ~ôb1§$'(v8ÏÊ¡ãSp‘3LãÅ,D3:ÅZ~t IÖ41«âÅ637ñ7Ï -;²âÇW(ðèmXB‰|õˆ9Q)Þ­(ìž%e~¨AλP?ä)B=ø³t­p:-Çž”sX®UcöNS$Èi8ÞOr[©ò¬ ¥qé"Ó¨Ò²ÞåV¥Üä$²9*I5$[q|Ûä` %Š©gU®ëæEÏå ŒDÁ Ð"¦õ$«—[ûzª¥]#3íIª=Õ†ø=F)©¤dÑ_CU]_xÈØ­uýKc!/áŒßØ -w3âM"MåcÓL„ú!„–Sìz8b3±‘=ç¨"o‹þc¿h8ë±¹‘êîõû §úœrÒ¸¾Yl“}§,r±J»¾+g8¾ÏRY5Ô¼]O¾¤ÊõsÝN…ÿ©2 ßéçñü‡á]äü¿úþr³ÝUb¤åU¢1ÁùØðØo§ÝÖþ‡ µoRYäLJp’­ë{‹ëö: ë4h˜x’¬HÒÌ`R'fÝ*Š ·:sæÉÜnwßÖã‰ùÚÕ®3S·V=ëæ ƒÔÒäïYG¥Cºp>rùD^z<åÔ¿öÙ›“HSRÙ ""¶³lÞ||ÚŽxáÞ;¢kµNê«9±PtÚˆ+½lfd€¦Ñ†ZÏ-µ6N¥L .‰ô7rN€\;d«Y¹å»Œ³›ù lŽ²2[¾^Ç­Ü"zjÊGÜç"Åx¸š;bĉÂèr [?žÖÈ×ù!‰~mp|µ”Ë ,•}Pì— -ò/B5N3b´Œðøùº¹³åkô„OsíRÕÅbÄù7ìu„@M¹Î¡<ÜÕFÌœˆoŠ Îc&ò»®Ý]ˆ#E#…•píUxÀØ«¼Y{©›½þoÄzè>iu¤Ù·fP¥˜) -k±¸­– ®ßd+É•¶‡¢ï{|îšï¶ÄZ›V´óÎÔ‘¬=õœŒ«öyçŸ -ÊýLB ç÷»èm=_?k¬ÈEÉ=O†ô9+Ôòp”ªïƒ`ÔxÊÀhž4)Ônb9ØQX$á¹¼µÚ¹«£×ŒsÅ'”Åc 1ûG4^ùD³N·¸z+nN«¿,ƒ.NR)„¨y_½dÚÖFz‰¢à“-u^é"y÷2©¢-הו¸„XU©¶N3#ÎÔÌ.z:Á`;xœ#9]s1eÄóÁqpƒŠ;û7ßeánúñ±² 7Lú!+wD°=”ëSšªí3æç f¬QM퟾@i‰5B~‘×—ë¾H·ùûÔÀ4x-ª,7»¹<>kðj²t×ÿÅ–q‹‹åJmmVhØaW5M: •¡Ï+u"Uz‰Ðîƒa‚Í•ÏÌíiˆfÀá(Á¶"?ý"u¼×>¾^$‹!ã`@µ–Iø–D” WbzIç—ÈɳYo~ßè˜7‹09èÂ]ucÛí}ÁÃ`ŠŒVV(V·'îÑkHU·N§#èDq×ÏcÑŒÑ.¶œÇ]w´XS(Ù–õ-õHÄ$b†þ§#è 3hφwm XéöûõC|)Uwnj®Äbí­ù"[™¨m›;ô8û²¿Æ™äLco®£vÔüñȬ`hŒ+ØJgÕ,¼cÂŒÀ×-BëF^€—ÐæÏ…œ{ -VμVô®q)íôùªöxißÎýFzä%t½AüpåJø$â3=üe€0(Šª–ùÍÁÅ\vž¼eîóL¨§£×æ6€^@\U´N ‰œ5½a'`™-jN»x $&G܈8ðt'ì© CîØL¸²õl3êɨNþÁñp®g„wÚ/g° º5¢Ûó®·ñ|?çµ®ƒ†:ÏŸQBb(¨“ÎùÍ48ÖË!Œðá5¤[žºð3È¢ ?ñÞŽØ{÷%Íþx¸Ó2–%‰†–˲HÆQËÅ]Ë/,þ‡°—ó‘ÚLDqð_˜–½ZßâÞ.¬¤ï’tZùóÌÔ9Àì®ÍµðXM_AÜï–h‰¡W'väà#*”>ôå‡ôK£ž+÷šO7 (—’¤ámYÛŒO5äŌ©VÇÄ¡¬ùÜ"ù.½±ùiAP¼?Yîgð`-.¿k–Ëák»…gCYf½'¨RºÍAÉ`‰hk›i¹?õ•mŠ"$Ю³ãN‘^&ü¡Ã÷öBMî,œkÑl0¾x‚ê®!*-œPÏeÐ y‚\ᔋå5á`ndcÇ6öÒ,¼’I°b¡~€õÒ×pú)u‰h|9pIÑAHí/…uEE2Exz___ œÎ…£ž£¡ª'ÿ­º#Ž@´×€®7â{f©â‹Ö1©iu*M;ÜÓà@äÎzËXgÀxR¤L\#¦è}xê% »MÖSLò>ì¸wëQùbsѱëCáÑ€HY(ò½Íhyò,ägŠfÞë´m„Œ趂é7(0û¬¸lB¤øÑÕüOË à:€dH…£Æ •”Ys@\¹r©Ã6B{Œ{êügT.uS¥p(;QóFŽ}½Ê)B”„PCÄÖÏßZ¡Ø6bøgðdD&¤‹cê³%©»ðßl¹xq¾õêh!ä$¦@˃ ¤õ¾_åš·^ªé¦¦"8{$?EÞ1Ü[^Ö^új/([Úß|$À< êŸü$; -}åZc¯¤çÉâÿñ5|nŠ†ŒÐ/¦›=9€Z¿GPŠ¿»ó‰“}ðÄ?X«óž TÂ|r~>ã#ÇsÞ+xÔ§ú’âá,_X»Œ?»qÕˆ³‡ ´Ãîw±=ŸŽzñœ €ÒN¢pÏ£?·½¬gvPÖÂu©stÀùCî¡¿X:˜¦ù6¿AÂqS‡ÛòQ»ÃÚ à:ƒô1:ôL͆kЩúÔ¥_6µ‘^Áši•ƒ@²q‚-åS›ŠS­ NGˆw[#Hë²³îîWî®ç`'áG1ôeãdZ¿¢°NÔs¸žg$ Á‡ -¢\±®Ÿ ½l2ïËã§uzäjƒ~l´–>û´Úõ²ˆLÉîÁ,·]ƒ?¸«\Á[íþZø4º²¼¿¾ý âŽ><·çYoKõÿ.åwü%ôW† ­dt‡¶žÇÈŸó°Gï¢é[ç4°¥îÕÛöáê÷œjeЋ>|hP€ñïÓp‡üC—²‰BÎT³p˜` ¡ÈÕ_#ŸŠ#9ÇvUcÔ“èþ•uý„${©Ó½‚ÃF<×éå¯)Šº#Î:-ì&lëNÈà~³B1⊊»nÇO± f± JäŠRK¦«"ð¹¦Ù-ÙÓË\ûâ“€)<P˜\Á,§•“ƒGÎxOX~ɼÒJn¾q5ŠŸÆ(ðŒ0h`Íù¹Ì”µÒa fHEFT²ó&>ÞxjñbëU~ؼ¼¬Œ\ k'Wò^ÅÚ¢FOOŸ.–¿þÌúEÛùE͵ Ϧ¬Ö÷tÝ ¯ -¨a³5~@¯l_Z8œüˆÀU^h‚,Pk²¯ÕËÈ -*ØÀˆ¤jδÂèušþæ‘ŸÌZUºc;Ön1¡‡­Šš­{n)[ÂÜ:c¹ÖЖwY!Ä•½œëF"IRBƒ -°îí¬j;läçö*L¯lÇ:x:y)>½°Tx'¸¯Â¯¨µõ3«+Y/eIèaÖA4ÂÉ™s¬]•ñ9v‚¶Ù î“jåpñXÓÆ·x¶p¦2ÇH“Üé r±±Ðù©„WZ®Qgþ©.S³‡´è’¨R‚Ìêµú¢Gïôá -³Ï;¬¯:p§–#â°ª%ÈŠ6Óš3ºÔD2éUY8³ÁžU A+÷“.*m*z´@Z.À*ùx³¢…y¹KFê½°0Ò½Õ첆*QÃQ|n•ÓºƒÞ™à<ÙàÄÛ/—Isí [®ÍQt‚y+0#òŠ¥g°EÖÍå{Z䥶7™TB€P=Ð1îIÕ¥Óáqœ·z+ÐÙX‰à,q £z²°¯eŒ¹U¹6upF­…Jí_ñ‰gð‰Ãý`H!x°½ƒ;7+;uóZ#zÐ׿0;Ey®™ÝËþüᙧ´nlŸ£Õˆ+#>ìm%&0š½2Júˆ´ÜäcR»ö%ô™¸Sk»7# Tê<"©^`n!ŸÔƒ ?ÐöE~¦S[6% 䣫î™GF¼$¹ºÜ¿â¤×N -]‘Ümæ†g¾=â8Hy’ƒ‚D˜áu Ýó#ôÀP›»µ‹°È…„®Ä{PFÞkEWÌuð\)Ï7…su£æEs,_õ Drþ› ‡O«¥}?ñ&½Èy\û4W°ée°Ê¹),1]—däà¡…ö9TÖ\! m-?wP„$ŸÕ.‰l5ÓxU‡l6ù `Кï.ÊJÒ¿`ˈç¦ØÂë¸"œ[ -P½[Cˆ™g-CD=”ýŽÔ¹%”°…¾¸Figì7Ró@ã4ò[¼¶BgÃDÅèŽÄÛòMgÛ ®»”™×(75‚0“A‰ŸŠ’Ȩj~úòýcšTÄŒV4’3’»§.û3øÀ€cAJK‘ §j½ÊÓ—­3sη›+p +ʵ½t—ŒHÍF§B.Ë%ÏrŸ-;Æ]µþAõÉtÚï3JË`‚oï'u”H8]rËŽþqò¦\¹)ã–“8{ŠHŠ¯€¹sãDl­×y]œrY7u]†jùå|¸¶8HÎ0×)Q)äh2¢%&¸¥PÑ”ÑVdý$Ñœºï0ݧñÙ»{‘ê(‹<±X«¨õé'´]1í+þR9MQa”¯,…xîÛŽúÛŸŒ¨îY¨nUõFÄà <‡‘dÐ@½®r½TõHêá›”péQ€“_Fd‹Ek“•ø¸K©î÷ó¼å7RFŒ·©“k¶(Žµ-„3¬d þÆ'4°ým™c$0è:fX«±±àÿcow&]óy’ÊóÈ$6Uöýþ -=Zy½CxÖAê[5#¨“BÓi;LMçÁæü†ÈƒYrœu}1)Zï„V9•% -s³ô˸óÎÞs·ÓN«GÏ3ƒž¶Øõí>ó§îã8ŒÜŸ†Ûo£ÞˆÉO`n¾Oø4I›…Ù"IÒ5<ÒÞQYTG]½n¶9 Ï&({ -k×ö^ºåó­¤þImçÚEÚu]†Âõ‚|`ë°õaf´’0ž;øû]?·ª½ñ'Œlºã® ªÆ(‰AJÑ¿{›i}Oz¼Fœ›rеEy¹heúí‡Ýu‰3‚š­·„V`V½àAf2EwKÈع0÷¬Ó_Áÿ’ºfÔœìÙ¡C{þÒÛÑN­©3€@òWU‘PG‰¨l -ö»©sM ïçQ¨(Ó{1åà^ }Jîcŵ=°±‹Ü×e/øŒÛêÚ·çÌH‘xv'CÙ;ȧÄ:Â_3½YóA¨€®ã–oNõîÜ[cV¢Â†OOÜ$°_îJ'µ™¦Š -dÞ &)Ú¼ -û]çNp‚-xÆ9ëg(¹¸ôªŸa)oJØÝ¿ã˜Ñ ê­Y·'ëÜÀýõÖ?î„€|Žt‚þë•…¿V BºïzmJ+R0!·¾{F‰í8]ã€Ò -ðü JàzqÙSÝS± þDU·÷£Õ¦ŒÛÖk[_ò³b›0œ‹4ö8nýkѹ”„â -©eG) Áã ç;è,iöq‡Ï -Z‡”\R8!!È*á<3Œ4€: Ÿ¾Ø—h´XÉ Ŷ<À ¿iåæz‘¼5ñCÔŒ á•ÈóÂ>÷9ŠÞᆩèTEéElœŠ -Mâœü`í:BÒ¾5™æU­¨5Í8ñ¥÷†H {È<[qüûúŽQ)i`+QÅ -¸†+Hî=Ot·è1å4•¨f¨Â)n¡Lw^QH¥ÉC»Þ¯/"•fL‚kŒ¼"‡£¾G:&ÉËSzk…¹_1ÚÌ/Jå¡Q#æQ#>¯z+a ã½è¡¿—Š¡CVÄî­ÃmÂjÓz³ÒÈŽ¢IS4Vf¨ª,ëUDõ¯µöþZb#'¾eª†Üš¥‰Šl§­Ü]ÝŠí:´sºTŽ qÞ24oKüÜÄÌ÷QOáø?Õg±¤ =¯¢Ý¥B°.åy"‰eóÉ ñ¡²–Ù)z´éö7¥=´rbãäVÀÅüÏR MÓ/¶¹œG®p•2pöoÚ äMT€»íä{G|Ãîc]Ir²lw—RÈ&5Ò[DT| -eÓT í8t+TÁ ×o>Ù^*š¸cXw¤Dz÷ži1åÓ6cîl‚JƒÕLË¿@;GŠNÌ`×ËÁ¢ò%s¼¶vÖ&Àˆ•X~íTD6àÛ¼8€òP°IÔƒ%°‚½v†C/Éö-uè;æß9½’#•®æYß}«ç@Z¬Ï4(4ÐŽÎeTìÕæÍ"å¹qlàŸ\•‚Zñàl(UQ%+‹€`L|f”"[OÌÙîplLÝ7VíÈé/+?„ô.•·.§žu?Ì#uz&u{b.÷RΠxl¹jU+C¨|ðÔBT_ £°u`9T®‹l"û‡C tSP`gƉçnŒ4§a 5Kb3×,åPøž%æI®Ú®¹ gD^!öèÍí×#ôvÔkȼ‰”CôœB:ÔBWkÊ;B’ÇÇYÒ-ͽ+®¯‚’ñÅЗuÔ¼”g°sÏù¿`Xȼç:Üo¹òvaÁ#öÍ93>_”R¬b–õ"aøÚ ¹ó*±s°5ù*¦.Å«?“˜QC •¸Ðß‹9Âé• Y“R¸~•©ÇÙ^ /k–gä !É\) Û~rzãH«BÁZ|Ù0>Å磇ýE•åVµ¨ Pƒ~6¸½r Ïè ¥äuÏP{EÌ¡ñn] -F‘c0ê¼³äApkߺPš!*-<¬„8LÝáøJ²ÀÞ!OýéÞ•·ø<ÉW¸â¼û¼)j»n1=M0û ý ã›Ôƒïíjßúñn àtJO%•|ˆW~‡ô'F#¬óGm‡³ts‡Ž5„Ö‡Êi—£„ -(ÛKl­µŸ4"ô[£îYRCjµ3<ÏSöúš¸ZÜ+y5"yÕß|µÛ ,>òª?__PÖ¤u;Õ¹¹¢sCÒYƽGÿ\òÓÏ«ô’ q@üµË^£²Òù"d÷¥î\Ž „j,@߈ŸÀçv¸x@Ô{"ãÄVŸnŽ2€!ΘÒfÕú¦vD¾£ú&¹^íó%’¥?1¼Û¤¢ñ*BX¶ÿ‘Bp«Bp;‹#Ùúè!Y—ò.º Rô¾ÕwYoÂ,9…»TÅ××Ï|Sè -žü¦; C’Á›ò¨‚£7€Æ¢jñ“Ïc+¶R0<÷cɦULæ0›•6´…»¥è`+ÑÁÍÛ\þg3¬N3‘gÿÜ3pMxµ˜NßÕå>Ž+™‘Ì›!“ªÿA6kFL×kT&[AW-¤‚ÅC7Lò•jk@‚œÏÚ y]ð^³qüÔˆó¥®èõæm‹WªXou¿•I®Ù×òÕÅ@õð=1×Pí¥ÌµÞ±Àºã­ôâ½Ã½7Ö%ŒÊ9h£låmÑ%dù°ÙuDue­<×ñ»@³×LÒ¦ÂJ{¯€q'nkTD÷HcìíÕ®8(pÝWæëÏã2gÖòTˆ›†f5ó·…"s±lIa5ô_? {O!/.)oœAC|¦O`¨F…nO»ësKZè}ZªIjÒ*í,+"ž2à[<ò+œë8"Yš‹—j¤_»ùu”Ž|ý; áY5ïÙ 1ÙaG%øyž?è^%EÝAny_Re&s¼wÆy—¯ßšÒ% ¢»²ˆÈóŒÖÑx_ÒÍ;ªÓYB8 -C‘OkŸ”VYy‘ƒõ.©µ¤ÿ£ˆ Q j²­>¸úùýï{æì­‡Jpßõýv—,½¾88¹ðk·ø ŒyÃ<ô¸ý~t«§ âõ´`¨Dø!½«fÃ|£±@Íòùà®·†+(ó,&§X+–õØD~šëò‚>š§Ý±µî'Rè1ìv»@±GTôq<ª<"fèõ²—ô°Ä®|ÚÞçšc—تµÜ´q:×]Ëj&¨ðiû=t·ãfÚ£¦`G…‹ù&jÿ|ÑÜ`Y`0"Òï15¯ÉÙòsn Œ*åkDoy‘NúW\o¯ä.嶻_o·Ã`–g‡Œh•hZêkçk2|‘ñë7Ÿ¿Iò§€fkJ]탨tÛKd¤îï#’äNÿðñ?©ì~XÅ红¬kTiù¶ÈQ+Ë #•¨b”~¾ªÇ3å!«ú²•D|Ò% íì«aŒ(¬ŠœS‚ˆ $ 7.ð•+Ø”ià(…yµ¢ -®OÚãÏo…Íst¯>¥DT‰Oè†ÿ ßtl#û8ž|“ü5ªgñF.´„ÓÏ©E+_ ØôäU -qè›70j»O´, Àµ˜Ê+n‹ºµp%”ÀdÅý>Bg†»ŠpúÆ÷-aÔ]ã{Ó,ÏÐTYî‰þ‡´¹3 -èâÇqUáRÙÊ¿Ûq~^‹ôœVüü⺣ÜÃJu„Œ¢ Íj04<ÀF!˜ÙžÙLRžSXÕ]#VìÖ>_Ô`yBjQžQ2?î@Ú!{l°0#Ž"øHí<ŠIþ¡—Íö¥ßºSåˆÜ'…qk¯NE©¥{ÝWôÑu/)€#JÖ)ŒÂü•f´B“«”{/-æìRt˃‹ ÷àÝ0è´. Èü…oȵÀ=4³ç@ò-Eísþº}+~¹“sµdâ‚vwÀV½$Œ[3µî@Çžu ™ÀšU(bw•PÃÌ@(ù Þ5]Þß`óËÆ TÍÖk¥@ž+„-tÈïªS v‚¬M ú=ôZEá‡r°§‰Àrœ˜ìÈ>êéÂ.)Fdºœµp»B±@}¾) ïµÆØdxT•×7=ÏSÛüøMÁë±¾¢Ná õ¤ÀÌæTÿ®6Ø’ÄðÞœQgð7O–R½è„˜ý%wœ=²½ï·ÀÉò§Ñ4Í7EŠyº<ºý!ô½£F4ä•àÝÍKaÔ¼‚Q5Ì6.AöÛú…Öp7ó™¬üãS^¥ºèœ´0š„ÛüzX‚‡F*â]Ñ{Önì`ø>!4;?pKU±ÿùÀμ’<”'øØõãÞ1àiâ3´hUƒCvûû*³¤¨ÉâÊvGÏÀ¶6¨—ëýÈ@®ï!×Ý}ï÷§§,ߢµHÖÚd‰C¤Î¼èèî¼ñ1JŽÌuǽ” «¯5h=ü'VÐ=ƒÔÎÉ4mçä@S[HàþB1ÖBw)úÞáa¬p”NaýŽ–8‚/G)ç¿V0 B8m³54Ðz÷>)Î¥/# m ×ÈTßYåYPÇK¼´Î€ì¡ã?ŽJ¦Š¥®Xú)#ð+dDÊšGCÆ$ߤBråÈd½vàÁ<6{¤*5MEÿ;ÈM¶“ñí}ÁäîkÙ±ƒƒ}.A—ßÞ@º’>›¨Ùù„ð1ô 9W4c€­ç™›†ørj·«Œ‚¶¶½ÚT°ÆQ¿°Mæx{;h¢la‹V?åÁ¥øÍ(¶!4 -½ëÇ |·Ïz%Ò1‚®>#Þ^ (a¤Ã’Iêo‡ -U%¶ßFÅ¡¦ÄÖ,êÈuËÛ)fä…é»KÈJÕ¥µö)°¸I!Êö̯ßÞèû­ºt•êÒ“ù"שüÕUÚ὎é×Xh>“ £s«å›îù|KªÅ'šägtJ¨t¢SrŽÈâ¼g„~¢ê@ða\|$ð駙!Ó‘U÷ÜÕË»p©´fŠ®š‘tl2Ô}énÕ¤GR)”²,:¡4À>g¦ýÔäiæí¤ÊH á—¥ÚÛš?]|Ò9«ö™ý9Ũ¼®é)ïAkýù>âƒ)#¦¸ÚøÃyŽkƒWPš•·‘g3aJÅá×׸U¿p ص¾o£fä -×콃ïì:ššFŒæö¯V-ÿ–•RU©óßÏøP»ž!È‹Ô¦¾ç’ú}âáx±ŽŽk¿¾…bœO(«÷úì­*áU|¢œQ2wl×óQŸ<çPú÷I¥Î–ÅÕ«±û€!j÷ExzýIéßõrFZóAÝð°nóž­Šu«cŒJÇ¡<«CaUnGbáÀ®kÏZÐ ÅÏò‡¡>­4­š…kHp2Bêôí/tªÿ6(GPð”îã& € žÁ_ʦ~ÿ&€Á]…ÅC¹í߯8#òSD|-ŸÏO?E ô™FÒJŸÆUÚ™jL”}¨¯  õÆçåUi˾ § -€¢ xžHÚr”—}('if4õ#N;û£p@ÍÕ¡-QrŒ&NýúÈJ‰RNi¿7íÊM;·ù‹.ÚÕmeóÙÉìB–5Úô‘ÁË9¼/ˆ*mqúQØôý¾ÂWZ£Îgƈ&˜þ’TA)^F4¹Xß"Õ‰¯ÌÇ âùú)Í/XóŒJï Ý·øv_žPr)£ñv²±hñÞ³rŠ³cº“Wiˆå‰ívøXû®Vã}†«9åF5'Ä©l·B_&É¢×P(•Æ¢,üiÅpG)"..,`'mfìd@ŸEÖ€.‘Œ‡-ü&JhñÄC_¥³ôBÑP<ÕZx²lžºf‰S~E\ÊyFâºg×µåÜÞ²„ýø’B'7¯¶pd(›1J. ÈGúÓç°ÊMVvDÁ4~4˜QѶC—aíÅÓµõä˜Πt¬…pqW>¤}5td¡fýŒXÈÜ`Qª¢<F<•xêRÝt¦¢måPn. bÏÈf‹þ†•Ö¾¿õ´{¯!ŒfåÕ#3Í:ƒgÓÔF-ÊÀ…å¿Aà—¶ô»‘)P•™5yĆ‚س‰Ã~ÊËòû•ÕW‰÷µ~$Êð*Òw÷"RЃQVöæßâŠê#RkD7½›¥³[Câ=ꆢ„ÄÞÏ7)Ë1î2ä l+] xKŸ:0EJø3ç ¬íñŽ9b -Á$–"òD.›ÏG¿y– ´ ú†È »–—ù+Zï*þ”ÆëÜ!|ÚW—J{£î'Áaò¶t)×)¬ge #"í:á²fϳØ>&aãéêªôÖÄ鎥F´ ´šu¿À›Ó\9x£P]-›ŒRkéÎãÃYˆF}| [Zn¢!¥Ù±”ñiÁv)›w î­èÛýn-8ûð'ZÚrœ ^M}LïÉ—æÚ¥Ô<#‘|ö£h…Ã8F· ud´¢%Ò¶Ûá.1G½F Ýí¶‹æØtõÓ{UËÉ0½„¢îrÀ•êµ\é£2ëæü‰6úÈÄ,+®æ-0‰|¿ûö‚­ÙSz7´…@:êZbg5¿‚¹® G®°bì¬à~) ç»÷ו"~ª†e™“¨!(O¸µ›Ô«µƒ×‡¯«ŠÙÍã%°ðH- FŸ;ýø`Q7ýb/"Û˜ë|^õ3–Ê(™yð‰Á×”¹6m;{5¦ž¼!7«Ñňù–Ï•¿ý¢Ô÷eŽÝ¤_ðq¤3ÙµÞr¿í´­Í‚æ×kD¼q Ó4sMåíßØø:¢}").0åû D 2³uHÂï“Ÿʉ²œ–•œO¸ó ”¬Rê­qÎöd¿é¤˜°}$P§¥ÄB1Îl,k…,“³Ò¯hÌ%‘bP 1fÈ곜"$ºÅ˜¤ÇêÅc“1 –O¿3|îɦ§£zd]玢Ä–œó«_°íc»³õ2fýêhFÑ æ*B|˜±È÷6í\ëGÙ ØÑ$·ÒÐ¥Pº¾ûgÞÉÊ>£Ñ´;¥ÚÚ QÌöŠ¸Æ¿ŒPbOú†O ݺèfH·¸£ÞðìüÙ ?„®OÖ»¨ó_ÏœÇLùÐ+î\=^rncS•V?dÖÙê4(`S±ìGà”Õøš¶Ò}wiŸN8PWžU@sÚ¼õÚµN§õñœC$çÍâÞ>ßdÍ™ƒº’Ý@fc)(‹=%²;÷þ6vÖßç™+Si€ÉØ~"ªý§Òu·»(RÃWåX" -íYDÞ4 ±‘sÑ` %Øe]òÔÁ¡œj§b=Û¥­5CÆ.˜÷P¥±3Ê?œ¥ˆ»ž‹Â½N}ÁŽ³FœÓ:Lô‚;`ÐÐK>ÈQ‡ã–eñ7è‡VL]®Ô^D–‘Y~rSù%Oÿ¨ÂR~#²¹UÈÊ« 0AÌÔ°Wæ,ßú\Zxç,‹°ÒÇ‘Où-4É('ÓoÁ‰R ½=ψYÈ´ž™ú'É{¥kÊ^ˆyT{ÑýÀKI^ü$zé°Û·59J†láAÅ…PvÇ]S ágyr„ÐefË%#ZÉE„H÷^E…˜ÜúžàeÉ: ¢ùú;ߤÐ1à «%ˆC#û<Ä×\n©¤ûÑe÷mž±F´‚u™Î±rƒèõM¢®0¦µQh8<*æ'? ‘=Q)7™/×߸ »ø¢EûÔtxÄ$Î(}-z&h‘jZ½Ø¶pˆÌŸ`šÜ(ñ=Vº%Ž¯˜jsgH˜Í-.¨.å2dlƦT§#*T<ªš…u@9ÖS-I4‚SêN0}$¤€2vûqWÊ5"—ÔFõ‰™iùKpX#°ôˈóë ¤°A$q{7§fe¨ŸUq1o]Ñ{¯`]Ûœú‰–­^Ï»‚ ¾‹w1cg:bg꾈L¦vX¨‰ÜùÝ7‘Ýú‚Cvüû¸6=+ɬ6ëˬèÏ^žÐ¦fŸF”ï¾î¢š¬•Ex=š `¤Öª1uDè4I Ù÷ÐéŽçRäwjJŽësÇ쀺SÚÑM¢‹–ÜFˆ¾¨.$.,.Pô|$|Ÿ 8òIw’µýç¦äl"é3ty™)ãºFA4Š…tF ÑneÓWáëÅÌé¿^ûü›VZ•ò©îÙ]uUH)¾Ðˆ-”B…×HÂaBŽÕÐU˜XùxÊAž7¶:JÝì%b‹L™.¦C諸%f†4º^½œÒfúUáèžj~ —Ï„©I^B´ z"/DâÕ¾Â]Ý°«}ä†ô8ç2êZse7xãF!ƒA ’à'pôpPk¬«ºÔÚ>s`R£¶`½ØJOÑå]xçFY eÎ -±N‰'³EÞÙµ¿¯èw®LšËCFøùà# 2.“6dð37­Ñ;î—Ñh -%­þbÄQÞó'”ãñõ¡÷Î3SîÏʹˆf¬DÐjêô=â`dNÊÄ_Ì ×Ð÷¨0Ùý£ŸÕ˜~1LíƈÃÓ­ #b`Ž>2BæÚ‰¾âõù3"¢º“¨÷-?—5ªkPùÃz¿ð¸¾ŸÇRôP ‚ÎŽ"‰ÎǶ”樮É`óbª¬'`‡½LÕyží¤qò {4ú=× .÷ûˆ$ÈO2ùoGlQ9Š$p(áôÑÝÕêÛˆw3)W,¹ƒß×Ð?œþ¥2ÏYK|¢Š›r7åŒzO¨ ÑÑ÷ûˆ_ž3‘…¾fûÃyÄBŠ²¯ž×qi÷ýïGhâhøŽÝ%ù}”OÆÀÜ)êwhŒhVFKç>¢¥ãŽõlfàwžaˆOˆëìÆSÎÍå=¢E€~IxEê:ÅZÁê4ç©2_WîÍ„™ hg| Âà:I·ú×™Ê}à[gÆ`ë ¬ÍP,šåhÞˆo<ÇØú噳mŒï‡ó5wKW8vjtʨR£4)\¡F­‚Ä´©]ÒèÑ® -ÁuêcStÄ·\‡1L‘ èÓÀnÁµjä€Ë›¤„кˆ€â®¸ÜR)1@D»É»xB¾òÔ¯­˜¹V›‘— ¬,€·ÿnõ Âå=/Íe<àæs¡Ô³×–66êÝ5(@`3wÍØ!H7åQ¾ÙÂI¡”ŸÐÿr!FÎ0šçùE^7I^3œš˜&ÝÄ×=zlÇÀ…ŽµÁ½j¶Œ¤Êû\y<Ù”N²ÑË^¶¤üfYìþZëÒc渥砄GWѺ X¬3¡ÐikŽ1Ñ:|²þ‡_Goel­¦³:çk”n¡o%xCbàÌ7uW”ñðüÈ+¬ò¬á&¾å7¨ß?yLÈþBèòÍeh0tKªËßì¯ë<îKhgKb„j¹¸†3)ñè8‘gÿtÝ/¡`†‹|£ ýC‹4ŒÀ!=lƦ•Âbú[#æ­j<êÎ iå­‹FÁW‡Vãà¯.Å=3Co&w¥(á#3ˆ3ÒägÐð!°sC^.•ìX@ɹX»²Ò0xI´Ø{×åãʃŒÅ=¡XGý^”¿|EL¯ÖúÐieT^a䑨lÍ€{æòâ_‚Ú×=ÿ|2½Öˆ5¡¶Û¦"Kz@ÔM™„¹áïɱÅ°ÏDÖ?O{É¿o´ßFä‘œö¦õ”’|rh‹•ýGvðš4£¶+…¶^h…9¡9辦óu‘–X  ¡kÆÎC@ÜÔãUQשT¸±ÅS²•RhiqÇ¿À­„ÑWâM—~Hø ÙMw Ñ¡GçãOùÙ‡=NÎsgÖŠjoàc;‘åˆh¦`"úMÿ†µJV~Ø]³úÒ*‰$þøCY½¿ŸŠ…µ%¸ë`<ÑKÜ]à!3moØ€ºNms9¢üw|þ~•b.·ÇǾ°Ž‘aRYýJT+[g-Ïv€‚󊯯…¥—E¼² CÈK©žyÙôþ>”nÝ’IqpU‰wf"ŠP¼t²0ÄPÐ&µ¬-ÖâIˆ8”h¢F±jå)aSÆx­’3òI×Kªé¢6Žõ¥šRit^µËR¬¶ÜoÙrÏ»€W"ËPþ¸?ßt@«r¡J˜GI€:WOt—;…jêQar[d -ÝÈ„áªÈþ|Ò „Ä·£3iY4ÏK€4㳡ô†Õ“„ bVÛDQ‚Ç—šêYb²Pú5•™i3—»Øo^3¶`¶’ºÕÿË68ðB‰fwxÖLw›zÓ4ðA­ðƒ¾åU{=˜´Žž bs`MµËÞ -b¼¢„ND¼ÊÔàÝ{`\_@_ó(-çóüÃLG¢¥µÈœº=q¡î;ki3zЊ;‘÷Mð£#b¸óPŠö3´¬ÅÔ ¨ýlÆÝ -jºf\»ãŠò[Mà¯ÃzƒZs‹ý ç9ü÷ÿã?ýÓÿõãßüÿöýwÿüÏÿðŸÿãßýÛÿûïþ—÷þãßýõŸþÓÿówÿôþÝÿôïÿÃ?ÿÏÿùŸþËÊùþü‰ÿíþÓ?ü»þ‡ÿwë+~ùÞ÷Ç¿ùoüÿûóQÌû/ÿÍŸÄóÎÜõC&5Nèz´6%‘*uxÔzE@@ÁEš †rz×G%OqßBãùÏÐûˆç¿Hç©#Ÿ4AšˆÉòTýËmÇ‘¡CÝiàïÀÕi æSÆ—˜P^½þ­JëÚ*=mH»>[òè1 „ìðc½õÝO”;ÙÙ)"P½Q|è%Rï>›¸§U»±1Za»A”t*-øZˆæ%ºžI"[N—bK$BEWíà -BqPßFŠ9ï]å‘yTr/óe?IÚðR?$Mx7+‚Óåí£m s5Þ'Sˆ¨'€ª~÷ß»IÁû–0|'O}*ÁQ7åÂsÿ i«rô;Cx[7¦ã(5yØA¬ÑÀ¹6îØúÔT½’d™ûLUãY/yÖ¾@Ñm#/ªK èøs;¼Íx•{uŸƒå’³r1?ìhྪ<@ oíZë€ê»a@ŸÅ€~êt ñи½n¯ƒ •ùT ëºúˆ]–ìÉ 9±Ü“»G £HZ¢ç¯¤*Y¦#KȽ;G™à‹¥ú>Œ‘㊳íx‘¢xm¨^ö,ª³z ÅÐtç]½#XâYDÌ_q=£ -„–=ü~±ØwHóhPþ‡&Çó(òü -+®BüB.£wïÁ¸âbtôð)å+/7<ÿB~/ë&ÿD‚€è?dù¨.rÊë‰^ŸÀ"ýHŠ¹_¢«d¡80 -°‹¿¬Ô WQ |¹;Xϳ¨¶ -‰nýà‰ûæS§;sºÍŠÑKi&`{ WTë6\š›M™òå@fÍ)õP„œì7ÂÆe—hÜÙé'­_r³Þ!ÙÇšØr}Š€÷ÈCÊü[‹Õv56Jžq‰´zÊœk QUþŠÉ`¿|¨ÈÜ?"Jßràô—>"ïêt¸Ã– ž¬bàΧ¬ {ªñÑt[ -Þººóш’äçtOŒ[]LÂu›ÕëÑnï(y–ù`Òðã†b÷-]ÚÔ_s²×Eš5yUįÏñS(µÿ ²Ð,±Td–9##µ–PÈ^…¨G‘‡½8mXÖo§Ž¥»Õ1uOåßg$B\ ©VÂÅ2E{Æš­ƒóXO—¯ömã@<³P;90M<à¯`±ól+Ç»ŠÄtj”éÔº—8ïé?} .ªìêºÒæÃ|åÜgÅ»(ÿ—rÌ‹OÒ™ÕÓÎ*§î>‚ØMdn€>9)lNúEXÊ ½»*Þw=ÞõõÏGª Æ “n6Ðc‘ÙJIâõ4– Þ½ÇS2OGÉ<=!>ðÀ’/ŠFþñ1Æ°†A—þŠtP„_z ¿Ø©Lx©(9íÇ1F8…>ô%K+ê,­¨í–ª† øu¿uØïèÇJ'¨¢foKz›ò³Ç "àÅ:5®d$38pãÌœE…=ÅÑVR7Q釣ÙÝõ%GôãŸÒú…SEñý8#>‚s©Ê€÷[ö1°÷7 ÊQ²*QG¹åB‰/Ó—*÷­w$¢^KÒÇu}ª¯·ÒVoy3®Õj»2ê~ã< p‚ƒé%Að9[°Ýüûuøº)zb?™9Êõë)½TZŽDZ ƒ¥©|vÑŽ(HµäJD\Ñc« ™i®(ÕÂx#Ey–ØؾàÀïVòz-òz£à´Ô%Im¼Cë|uÐ'ºËf(u?¼Úw}¢VgÛÊt –ƒ—– E>5ãêô›8Ó /ÿˆ–ƒ–,l;Û¼ƒjõ3ò›4/ÐvîÉš×Ä0"Kùhÿy€Vû—‡6ÇÏY-Ç~¼Û|{®}ñ™!Ê §´dÙ’ß¿h¬ú˜ -+.X¡û8Ñ%Û!m -Í j@'·™ˆCÕ1Ê T¹cXýo5ˆl;ËmnxA͸S2WElÅ8èqRÇÿqŒöbVP•ª?™~åîð»Ò±úEU¨ÉØ“Oq¸+ÌêÊ(ç'Æ1µÏÝÖ^ýYèñlJ×#T?J-ä&ËøÝ¡ª–…óÊÉAŠÀØñÙªæÞWD´‚+¸åíïnõEõ»îí)Ã…+tÿ0³.¨ýC ÏØÑ7}X77Œ‚ 3‰¿ù²àk°ÞÀÎQ§]ÿa›ÖF3ßGR8)upÆ÷”Yô&Õ9€v“1UЧB¬}†E«é㟓ÎQˆæA¸ÕU©‡H̵7®?ücÍÑo„®Õ\5Ýs9¥ÜõJ®§AÌM°$Œ¸X‘V¼Ã8dã?#Ô!Êûb­¯Vf¦ÀâFjŒJ¡JCð1¯øw h.€g{4Ä|¼:‘}¿¦0}ä×æÚ1¾ð©Ã—âµøý r´oÐÆ·ÀÅÖAV X¹ù+ã_sºÖ -½— -”³×­éI€ܹÜ™kr‘½®ØcȪ¥åSšP㪗#¦Ì:¶¢ˆæ/* …ßÿž‚ ';r²·ðgC×ú|SäÂS%åS¯ª·­\û€õœ9 . B.­£">¸?’Ýúf¡¨´NÇ%U¥$f󺃷üsà)ÛÊîó“Hw BX<‰ÂãæXa?ü fZTÞµfú<ïSyc´Šiâ±fÜ%ØïåϾ-¸0%ù¢í}Ä¿È>òÄ*Ñô*H'ÎV!²Z‰¥†,Rf„0ƒ©{À†¨Úé‹0zÉMBmÚ„-~‰[Έ×Õ>D×°iª7>%ÒÀsm=É+í jFp{·˜;lŒRr]Ó%,š¼¡ÚÃåÂ‬w®tµY¼`¦¹7¹{²æâdÛ€î/mƒuû0Õq¨Xi½7{•ëÂÒMƒÍzýô>^zÜ·Y.›8‚×%ö¸Â¹‰n#–ÍÅ/”V Êéñ! ‚à0¼¦þ-„í‰×~4Ò3…a=kN`~sŸÎýH ðK€L”Æ, ]FY jŸ?Ú±—î£pL2S³m4)c)ß* C›¡„§ iU}½ V¹¾ÕßPó émnŒlã™ÓEK—*”rÑYÀŸêÅcì©È±/i~ägypýÀÑÓø~¨aýƒ¾ŽÀÕù¤à–^þƒÀ„3n©ƒâÈs•Ã£Î9lÎb¡”]O¼‰FHØÒ_Öã8ßï äB¶ïÇê”ãJ¬ë6U«©ÉNÉQ‹Ô žÝ¡ù‹xó8Út‡º~äDú Ä(xh—ž0¹ÇÜ©iy¬Ï”m›$bÜnŒ\²z!Šù7ˆHB—ÀêŬà9÷é¦+o‰óreû3ë0-çïB6&¾¦€ÙN$ÖÖCzžjÁvq™®%yLæ¸fQù7þ¯UPèØ8ƒ‰\þ¬ -/¯—Z=ðåÖÞt UÔcL³ê©f•ÐŠ¿Äņ × r…3­¤*¡œ áàˆ ÷=­Èo%þÕ–GaÅ)ÄóÏñï¥ÜRbòð‡ð´óDU>DàÌc]²°K -ý˜œ|f·Kk[£|(ç[•˜¤&½`–q£>Zš:ÃZòfîƒO™o\§Hš«€¥+Æ¢‡6ÔgÕÌû»¿Ô§ÍïŸ1¯"ó=œàÏ NîëÀékîIö߆«)wÃìÇuÕ7 yŽpÛ×û8°¤Iä_….”É$j­ a·|Ã-Õ”A„éKÓƒöWžjÙ 2”×ðÐÝïNjãK{‘4桽ú”"É{~"êR“k%ÌiŽ¦t‹_bR±þ@‹ã¿;Ô›™<·l8Hw£ãHˆÉ´ŠÑ -èꑨc«˜ ´¸£°ó »q“:ôaÃ%ë6<íŸ.¤´JC¾œNoy@¼];$2L.C-EkÜí;Ý"KÖñˆ™&Z¤—ÌLŽg¥ÜÒÑa˜ºÇ!,³È$Z/sºÍ£>LêËTáâŠQ`GbÅu å„í ¬…÷Ï‚µãQS5+t¸.“à,íðêÚŒòx ÌG1ÁI1ÌDNJxkbZ -(‘6C݃¦cø0¬Ó/Ë)7nEkËÁµœ]ÈRÞ8ãÑ=¡Ò‡ â:R47\\ÛZöNO7ën%œŠ«rh´$ °pAp nk½’ǘI„„{8ýÔ¡fwÛ ‹µòT2ñÉ=ÏbèúHʪӭ›S´Ã÷ ò¬C­î¨æU+ ¯>Sµ§‘+R I0Ï=žÜÊxƪÙþ»ôk>ÖR§XaíY<¼ÏÁVœ­9@ÖžÄI×ó䧔Õ“ çÑT’¥¤×ŠTï«®.oÎUp1õV–Ñ”Ü,ƒ;·Ñ;X>a=„wkJƒ‘ü~NçÜ!Ù…T1Õ Û%ÒàSC¾u‹¸+Wñ¤}·T¸ÏÞËq‡¹îÖ"GÄî×ÞZÈíB’å ¸ÒŒ"ã{ -Íùü„œÃç:ÊJPPÚ$‡¹åáÖI‘ì^ÿ…<>¦©ÞÊßTÎúžíÅÒ+HpGyMCÁÏk3©_x™d_{$”ÖË -'µ°qôPò¦Ý`bïÿbº¿«l&Å ½»bÖוwª8Ý𮿤95«ÏsQ¾BæEe]$•.¨\ô¯5P„líÂÅV~l1öK8±$­`á“Þ‰ ´Ž³`è.„ŒêJˆL ±UÅ`ìì0alL°àh µçÓ{ô Û÷ZN¥–HxÀMÏêY«‡é>Ž”ù¸Å6…ϧËÊšÛõQÊé _弘 -á~?/}`÷ˆ~ -­Ë:ó÷Gîx'ÊÅ"bk·ÊNÕÒ‘q+Rü-â ˜‰D„ûiÄ F«•ò‰<:º9GêÕ9 ä ¸ÈiîCà¦JT½”¨Zˆ÷Á2¹Â ‘‹nàZ§†/å‰8Ò®Vw Û7kQ‡¤£õÁç®›Ùno¦l'¦páÓ"êùêÈ‚ý[oêŒ@­Šë>7p2ì)ÕκŒ7,!ÈŽ²„F=Q¸Öʱ㣒mÖˆc?’!æqeÅãý|í{~Áˆ¤adóëÌiND}ʱ·*BÏû¨AÐInÿdhÏf]ÎGë"ߨpÝuoM˜ƒ$~B¤½#¼.»•ÊZTìá¯XIs>erÑi@uäÚ22h¶”¦]ôØÖ¶(Õ2â&Œ=Mh¦*iÄÇV®²€žô%Jä­•ÈÛ‡_ «„8 -¹u߀Fh‰«»„.3EU”¼^2dw,ŸÉÚ®\´Ëu-ƒ(88BE%Z½Üâu÷÷]é:¥kÔ“Q資”ÊÞ)õ*´ªêGòz¡ºx ²Ž¸´ïd€/P(k¨€‘ÞsDƒG :Ê)¬`WÀe ôõ“Ÿb\QÞŒ@˜ñ%韧¢zn?ãæCÁîr 9#¸{«dÑkÁ¸kÁxCW›¥$ äÚ¤·‘áyÔB(«:ѼN¶æ/æȦ[d¤×§]¨G¤«Ñ°xD×aPjFeg£ Ln LÚ‹±×%$w„Öõâê =M­¹ñ—O [È+ î»­ps-’D:"ÐI·Å†÷°ðîß]W2ZD‘×Ûòº„Í覭 ¢å"“Çì=#ˆnjBŒ;»„ç4îˆÖIT­ JÉN­€7(“XÅô¡¨ÉKŸ„—Ê1ŒR|›éj=¸Ùö,»[‡æø1"Ý&¤Ò=»l£gDѸVÿZè=pé÷ñDQ -ƒÍÅ~(äAT< -ã¯çEpËѼ°*ñ÷[KqN×cDëFwÞ{nš##‹h@l+ÒXeÒÃQF4D(“Œ ‰W¦ ŒìõŽqçcy ûĈ—Í_k.®§Ë\Œ€ì¥|›ëñD8‰Ti½ÌEô tƒ:‰×1ÝW„*ƶPŸ rîä] V©7\­pk59’g€ §£Dñ4’Ój¤ÅZ8¨¾,ˆgHD࣋7Ò”ûA‹BøÑ"DÓ׋ôVc ² ­d®`‹ê­ë-;´bãqírìõ–,€h£<Üt7ßRÀ[kàSdË\øJŽåÛ2‚v#¢ZßBù‡}´@lÕš?Ù§Ê@9l({×Y’=’ïeÉ·lO×òpXP¦/h «Cã7D¸ÆföŽ²…˜š ÌŒ®Aó¸ê<š–RÍì¥7­A¡ÔåñŽ²™Ä«L-ÕVæÊØžçóM2˜åÖ­|v+ùì'¾šª¥s-îáèVŸiq^§²HGĈ9Ÿ¢q¾€¶—,„µ›$á||ºb^­D #ODíŒó¾¯}­-R=! -]&Ÿ'Eþ¨Ëæ(¹Õ2CØ Uo"·tÆ^NÏeCÖéènú"´RÆ‘Êû›Y•ÇGÑÁ›Þrx‰CÛ -û'ÝÎ+jQŒDé“»ò"€>ó»Q„ç%X¦—›#ú‘==Ô7ä£÷ò¨BLƒOh”wÉà¨{¼Ö9M¶N¤LÛoÕó ©Æ%ð-3–5âcÿ«Ò)¤«ŒiÂ.Òa5"œÍßÅŒ‚~œ…~œ[õ)i†ŸOÂœÄÂèÜQÉ”œ=‘úi —åk£ç(ý'­íätÍR^{œÇNzQ]ûWüÎÒòf·"ìši<)æFCê(=pjyßOµ¬¦­)Òшp3™ᾶ#£Ž`ž…tðúžguÃZuÃîò%“}Ù-¥Ã¦¢ìy˜12 ?^Øóy6©!tQ…’Çâ;JÞŒsòÁ‰ÒYìÃòÎBQ°h8“f;½ß -Ǭ™~´KQ%LäY…VZ•R‚mª+®ÇYì©?•cô²›¹‘nÇ yëË ™êlaYJØJáR0Ž’Æ=õQŽ°î–²Æ)¾ÊRo¼ò¤–{ß sê€dmx©]-FE:[ïÉ{ÖÇ3¢aPò#ÚY#â¡Ùñçø8õ–ÉåDbߊP9R3ä%E‹!"-o² ´¼euü«µÅO’¸ý‹À³:;ŅSŠUHÖ¼ºÄîGÌ"a çJ7#P³iu:5jY¡yú·-®ñ·Ð…1!ÕC1ÒŠ[ -ê‰i‚:?‘lÄÀ¢Ü9 ·:x'0"B0zŸ€!âãDëþüŠuá?3Ê^·£äx'‡ç‰âÓ -eís¡¾k°ï5›§.²^ã; ‚ ÞE&Jß®ØxY|`µ¾á WWŽ=/­ÜZUN¡÷X¸é76îm%Yˆð®"Ôª ÞØÝÃ…‘û‡ìì?eHhA÷f[˜s«ð··ä™tÔ$8äÅ〈Q…I½øY Näá<Ó“˜Ö•TÚ}lüöYà‡²Æ§‚då@çp§jÀëÊ'Ühøž ;Ÿfz…#TX—]ymñ@+,´Ð¢“2fƒðw_æ#){7†úpÛhm·x1k?¦ØÝDìz˜¡­Im^¡¹xßÅÌÊ­kºªÃ8Ê—g”¼ÂéTn'*Òá„^|s ]éQN ØÎÙÓjÛÈÁx¸"R£l…è^0SsG308Ú„Õ‡@7y’¤) ˜-œRû±Ðý啬àéUø[úwÑ0½a¬ù:´|Ê;³ZŸתʤ–à…ø —rí‚‚"ú*À†¿§¥¶"P’ª„9ž·K2W”Eõ -m·ÅÂQn -ñoþÍNÔJà¡¿ÿPŒ·ç»}©”ajòóéÅ=cŠ<öŠŠùˆ½`÷•}ýÞÐEó•ì¬˜ÏýÛß}™› ->Žt‡è¸Âˆ»ËEît³l?RŽí÷.: ^ÂüýSoÊÈZÌ=VfÆòþºðȳìõ>˜ìýq -O¥Ö;Õ%$Nºd>qy@—s‹¯GAœê¦î"tÄÁÛŠº¾þEŽ^Ϥºôé/äàR´ÐPJ¶Eü¼ï%FiQÊ¢ý¿.˜t¡Ÿ{“y‡¢¡Ùº°!\ú¨lå–CúšL NbNS¥~|[KîQÀqHüî&)ä7«†V¡cXbËÀƒëܯñBBMÄo+D4I°‘ µaÍÔ‡vÔ%Òo?¬2kìáÇ)1¢=õF&ðÎ؉®‘|ßòùDš¯´5¼|Ž´Ôm1Á·#zAÔ«š gùU´\º%Dß ¸”hõo_Åu¿£–@r%„ž:ÓÈoµ^Iãñ‰úê}Ö†WYL?™ëUÁpa¼#¯Å{Õ³xÐ -t_ÕuÁBíPJHÃÊ:,[úé*xç·žJÉþ}Zöý¼²Z'gÀê¥JyÁ­Äû'Ëp“G»}T\Áסdœ³‘až11I퉵Þ%Ê(WJ³ìÂ'»ÓUµf·žÊ­ÏK‹™É§éI™ã¦µÜ"Ë\N[¯Þðv=çåâ¼iFd“ÄM-5)ƒvD©q>Ç rpxþÓıQÀéS!û£À3´]­ ¶£4·×Œ>³;¤‚„d­÷åö‹Ÿ‰#ºBn6ÂOô¥Ekc -õú& [ºiÕ|O)G#íýBzNšó×÷sæÇ•cÍëb÷à·óÄ6 äµµÈÁÀSuŽ¸@¶8v¬3Ê>î!Ï«%møt -¡'4©-äˆP}ˆå£U^hâ¸ÝHà˜a !¤ÈŽƒë•]GJɺP¯ßx&Ï*§ñ÷Zk©ØiøÛªYF© ™T#N8J= CL½ -ßxCxbËÌ“Ž4í.¬ø®fôÀ/„”nG‹7JªRïM/¨®¥?tÆ ;û,‡-×J -Ü+@—3t:ÁºVënbÄ«’ÌIçåJÚŽó£CrëK'­’VâÛ×çf¤î{…Þk6Ò~Ñ8 dÌ^@OŒ“c¯“^·‹fÙë5è`°÷ÍÖцáÏ”s@Ä0XÃ’‚Ð*jžß”îea÷@äö%Å\ÿæÆØ[ío­›HŒ¦ -yÆýƒ ‰¿.Œº €bÙ’pká˜ÈmzdK†/ WY™_¬Ò®95úÉ÷@õÀªºRÅðŒè¬Uˆ(ä€Å™u`C¢ lŠj–þ|…þ nýžL\ÉíQ@–YÛ—g+ /@?NO÷þ%º¸ëËüH¸‡¾ûÔo ý`Å›”`Žô²z¢S@€Y'íã—›ž3D磼Y¦CãI‚ŸºÌw9, ZéY‚8v+^¦*Ó­“À¼3÷Y¥ï)yXΤuD’yMM@[U[m¨»õæàðtsí¨~Ê&ðÎö*Kç÷·RÆÛú>V&§ ­Ïðr¦ÇeáªÇp¥x^ús¼oÖâtê ôàÈý×”–rq”«4 eîÅ=ÅÔKª——ÔZ84Ô:R=“Vz&gßW7°I*­JÃR-2J¾KFQ ’îúž§ÄšÙ¸ËÒˆ`Ìú]¬LOâ»ûßÕÆSlJ.€ÔF~Cá¹( iVÓ<#ûû¶¦¿Ñõ »'È0t«®jkÑ,Øå³w×/ù¬{¤¢°âTF©¬uZ”á,±TªÀd‡JoO¹zÅÞJlÌê[¼ô†5+_'¿Ë¹— -¯E¦¢‰3Ò¼½´« —×¥NîˆkºLºAD¾¦*ö5QŽáÀóážAWÓÓïW”it®£ÕEH°1kºûè¸ÆŠ´1¸ªZBÉ}nvõлͮ‰ãlOy}Èn&ËQ׃µŒÉWJµ@.”ÑÐr>n°?õ`éý6l6Ôi¥LbfÎ2Ç€`§ZõïÊ#ú"ľeVãhæËG[›QÂq¶83ªX²D)õ­WŠ”ú¸t¨b¦ŠªRê½àeæ aªsœÊ£ªuÂn…2 ŒF;KÄÁ!\ªßyužíŽfpG:«•ÝÓÊ&ìý6"‹z*ja…û‡Óœ(¢0àäY•œeQB¤{ÜÂÀÎx"Ƴîq­OHH*¶Ríä…*rFúH TBˆµ­ŸúFb)r!”?6œˆ¤ýÊ>¯‘YÂmŠóu¿ùRƒƒzÀꇈ¾ü–5â8Ÿ$2õöq_-‡,¤¾oÄ ²ç¯wôŽŸ×°*·ý -\&?q r=³³=‘©Š‹´°ª»Q»w:Ø߼˴)>Š³Wìô4d…hO˜¾"[gü¯o××3VOíò¯U½×qˆî˜ÍZS”ç°a|žôôBÐY»YïAô‡Ä•Ìx×Ö¹Þ'ñl A@7e òv˜#™´™L‹1,~‚pëÿ/{oºI‘å>Þ!¿´ŒM ßÝc°þ@ šËŒh¸@OsmîX™²(Mk©QIMÓoôŽûb÷üÎâR¦J™E•”Ù ¤Nxxøzö…%u´àJ …Ç­>pìö [µ|(%N–Îh¹¨qeĤ¶Øë$5œ9>òJ¸") ظAôqìð©+[B<|×h!—¬yt’V…å>vâG$.·à<’œÄqzÚ; $x9Dì{—6­¬Š]FÖñáCêèj¡ÒŒ8VÏâGÜ‘Å+…w\Hu°²”ÄÌTѱ¡ïæñæCè*¼&Ÿ,iÅÜ2;ðÂMU¤¶»U.<@¥6ÎîàthÃ_hÄ,„|W,‹Ä¬Ö>T’r²W’ð6…(¹ÎØFF¨ ¸[È—œÄÆ8´aI?¡J>&d‹×tî¡òµ†ö».i€DpÈ>CÌy̆‚o4BR[v-CéƪVnâÒ@”¹Ä“ãr”ŠÁ¸ÆQäD-¼yÓKµ‰Ô&aj`?Oå‘Â…+A7ljRÔlË»vJ9 ŽAi†«²Ê#ÐFšÐ9Ô|Lòz \p»rN*n¡ŽÇ\Ñ•n…TƒKª@t¢²þ9G4ÙéYKœ˜}àbõœH Ž¯°²pj]œcæ\œÖèD•µ‰ðq•>„9áJi9Ó h­“KRÁ‚ƒZàÆߺñË‹ñ˱l ÆçA…W”Y’ÎBÝ—#ßÓ{Q8^Š=Hà¤äª†íq´ËåYà™8bÓ ~Gnø_3‰`iUA9»:•q´JÌ°J9—+ô>)‹a³ˆW9´4ÃÊ.´à»}'‹íNò4 ÁÀ‘ŠÄæÄ1@Jf8’åŠÎ—ÜNO já’•Hx¢¡1ƒµÙÖ -Œ86/iŒ¸îw,–Aüg9„ó< ]ýG3ÃɃ3àg `GÁÈFœC98 IªŸD㙘ÉýêIB äÛFÊ xq¼0°¬ÇZª4sP ‰;J%|…2"[`ŠË)‚-p ct¢]¹ÆSÑB"*WWb•Š„=¹EÉ=Þ848ŒvˆƒòʉðH¢/è)ßÑ(#k2ŸG8<˜•Žê³0u±cK9a©fQ’‹¶¹í©‡ÀõV^Ãöìg¬Ÿ«’=žcˆ¢,½\ŒÅKÁkÎgŒsR³Táa²”"b«lJAQ I‘0øKŠ )6šœ7)ÒÞâ¤pºh¢¸«q™½àÈ,%‡XÉŸ1llDPGŒJ_);„D¸\¹(k1s Gä&ðÒBbŽ‰±âØ„„0k?ôª-8ΆxœâÇrÁŽ¹ŽaQ'$ë… Èp¨Ä…;†òÈžgÄ ´ÄI3°ó<[ä$± Bap2áËIÅsÑ®]Ìi#ZbÜ)¤_¨¨5¤|Z“Toð´•Üä•—– f§Åªgœ…‡¬¼çÂ_Q«K@¡ëýøÚJ¸® ¸6© i|¨eJQŽ=á@hœçÒA¥«8»U»ø^™œÇÖåÅzÆÐa¢Ö»}bÇÙÑ¥IQòM rNÅi™ëèqÚG¶!ð¨+‹Ø[³¸£Ì !­qþEˆ•\žK³ƒù,„s°wÓj1^ÙÇÊ -+ºD¯£!ù³ë?W(âGSØáçŒdAZ²‚é››â—õV9ùìÍ1ðƒ Ø¥¥rqÑ>¸”0°Ù…Cf•%îEÖ"ק„f·ûè͆_Øÿ †Ìa=ÅY¶\–,[\ëo—Óy°›ÔÉðoEÆÎ5.ž?––°¦áå,TaÒ^ÒDsE:ö#‚«üÂ"w"¹Iùq0ŠN=;CÑløBbëKöœ‰)þ².Sáµ…±¾ðÎê‹eâxlku³îŠs’hÊ^DŽ²õçƼØ$ßÔG „Ì9߸ð10»û\ÎTŠ&JÀ¶¸W¡"ÚØ4 Ô˜P¢tŸ¥Ú$r ¸‡6HB¦“:ã|5ìÊÞìÌ!°Ÿš¾RjŒlÛάìf:DüƒýŽìL/þã¬×"2™‘»’½Ly+´¸›¤+Žø¾$x˜ØënœÙ8#«k*²ð>ŸˆfÕ€ ÀدÉ3à{A|‹Æ“™áb±+<°‘.¦(5îÙ¯š -EÈ—8ÈKâ»PðÆ#a¶¤Ï½y%bÐ7¡Õ,ì">¸åîDPa|à ?£@k>¨lIœØñÊ1Nêíx¹ ÐYCÌ£ÏØÅ¡|‘«^q½#~0°?"v‡{“™B'Çî' iPë-qé-¨â8Dî™tœÑ—„ -Ž}c§çƒÀæx(Æøæ7Ë‚ˆ@9yUñ)’?ÎË,Éa‘0ŠS½UÚÂmˆKçë†Ë*R8ùbøÏE±@óɪtѼš±i'Ž› -ª¹ø³H­èÍ…ª°ÅCPÚ:IG{BEÍDH0 -àôo!ü¦µn!TÑúÌðë‘Ýg -ëa1Œ“gC9ÞFŠ#ÓƒýIá\èµÂ5š?]ܹp -ØuƒÓë@ÌlÈiØáEs*A.‹¯î8NsE"GÒÀIÖ ž ¼æƒ: -²A¸ ¹‘ãñ¸I>„ˆã8tÿƒ¨nëìÑ–Ø:$Ñ,ºÔß›ÎT–P |JAìXØØRÆ0.}ß øDä±ÜCR§VòÏAøèÃUPm9ªGLÊ¢ØF1Ø6Æ|õA”§¢®á$ÙæÞ(Vˆ3Um²8p -~Tlàø2¤¡†¿RAµíÄ^Q\X ¥+\^K|j»Vâ…«jAÙž¤pEæ‚“â+C Ä"z.‰…{âU˃0¥õ -[!ª3-§¢›Œ¸[®Æ%N´ƒÔ£¢\þcñ©èpˆ¡Û~⸠„zËœ>"¢šÖ)³n2'föLáIDs ‹E$˜eÖDtàòâ~Ã)wé˨£Æè«XÝ ¢œÈ`ÄÙY­µ*QúÆb##»É~ØÀAeÜwhwÆÕ=g!në»rXiÕèE’jœfüïåûðf-| IñÀq=Wõx¥„+8¿¨Äe•ªæ)¨}jGüb®úCI˜ áeƒâÃŒ’³V“Cî~x'ÈÕ—8NwCW ‡X;$r•tÅšÁÊs ¼Å\œS˜‡üX4{))ô‘Óâ¡¨ä «øá1žõ-ñ¨á"ë |Ѳ7UEAßh½9fAJÕÜù¡ˆœXŒ[¥êçÙDä.§ñ£=Ô–¸_)7'§Ìa礼Ž‹nW§IDœ¢aXÎLƒ4y£©>SïÐnÐL½U"èðj’ÌU­4#€É¾Zlú’Ll¥°£jwp×N‹‰‰3û«T‰ù€äÅþ"(³ÅW9„et$liŒÒÀP<£IIœÆÿ.œºb¶þ ³µÜpNø€ÜÞŠø8˜} z`í€Wv”ëO“äËçrPGoXÎag ‘ø%<䊋ÀÁÐE2ÔˆwhâØ< <]Ù[)õ¡Æ’gÍêáe~˜¡Ä†…ºÇr 0 ½8óMc=“¥ f9Ó”M‰¬ƒ•õ‰`Kxu$L J”BµT¯7œSU¤*Q•SCw˜Ë”®L°Tp9I€¬ámÍ ó€\´<Ç™ýÕÅ ¨,§9NQÒG³µ1Z–qh,ñR¥rfèÉ™¦Àc†‚»^Ä\òMUÑr0¦ÔzL'U’ëÏÉõÅå'æ•£ÖH.…ÓÃII…,”±i02ÐI-¹á32è"å.ûUrPŸT5‹0´:Ñ}IbivS lh’YüzQÞÐãÖ8Îà‡êÄžKÄj*oÈzLÅé¢lŽj«F!4‡¤B’´¹©FYbúX­Í$o€=á¬Ð¦¹ª=‚ÌèSΡ…âÂ,wœ)#‘ÃUsA}¤ÛïSÍb ¤jÅ‹¡\Hì,*5]yHàËÍê©ÂSŠ ´NŠÔ i“i;‰"íEñ6ø,\ÁÄÌÆZ ÌtX®Iê äÌtHjiÍw‰UGiN•pPF‡Ù{lLª$[£c?þé$”*!a€ªÎì!?frHXq¼,³ à#Ä  Ìj¥‘† .ÞˆóV]ÒyH¹9xãÁƒÀ#åxÆ[’ˆqÒGʬ(ü€Éí rhFÊpžDwâVíÅž”YÿÄQ‰S¡peT>5™ÅÈŠº¸ÚݵÜ.Ùíw5ß)¼ÕÄ2Ï…oˆ£ÅÂÝ°ÿì ŽfH¼…p\½{¥û¢[sì–Ìð(Sä¨t:'ØÙµƒ}<‰ÄBe”¦ *š2DõMºUhÌŽYm`bÝ’$!å¿Ñ†{Y]Ôµt†°‚ô¹â= ›Ï{†^¸4#‚T|¦’’•C“ÊYD±PêwÆe¾Ù 5 »K‡úu‡ƒF3±3+ey@p²½—D«ð« ‹Œ -„œ%ª"ÐqðûQ­JhÍ ž”Xí¤ -~ÈVgåP3Ò6 ÖÝ5y U˜$®¤!×!ÈPtÔ1]+;²Ão©ua/‹’ýµrž"ö¹çâ‰pKK’·•iRÕ˜ç‘›É HÆÍÖ#IMŒpšÍ´ 0ÃBÕŠÀ\ hox_9ý|Uó¦ó*V^2)ùŠg’ÁÕIêAøA0ÛGhí‘MÞ÷<8®ƒ„%bÁL ÐŒ½ Q-὘ Ð/7æÌzœ³á礢E÷ðš+f¤pÀæxÈ +è!xï3¶†Kî]$V¨åÚgØó›C¦L¸9-''µ§¼†´WMÜø8ëõÀÊk' +/<àõ™@F;8v°¿*W­/Àt¼›°KIÊψl 52¥VôÍŠ–Å"|ó!üÆ5U»”zgŠÒ$å *|[ ½D$2PfÞoœêy7®’¾²¾¨jlSˆj¼¤i)ª½œ™B@’‡Iær?AwU%§:Ë -Èï º /¿¬õX÷‹7jÏR’9ï^Ôdc|$§uÝ£•€7 "æìAÐÔO(œãÆBúÐK€:'éC¬Ÿ–×ãD…œ¾®Wr¬Ü“êR}©rêòªb^‰RþèE2“Ãýœ†Ž´\2Íktì¥H’)äƦK6ôEĨ&Óä°ò…m’ð÷ƒM© Ù r&¢ìn X!¨~¸ÆBqü©½S´å’ú)} -nŸPIqAù ¥¾<öPQlÅ áR ÄÆYY¨eá+ï£Ô¥ pï(bÇ…+–<$Â`£ègåŒ{×óEɨļ¹„)²ýÑÑb%V•ìš’n)øQ–6¹(žãe„´" G^¬èl£‡HR<E£<`¥üŒANX5É©¦«·"ªÂ+q…Rsðañ$Î#(§CpbvHË`ÌeúÆuâé+›Œ"‹œ¤Õ«7i‚C”‘k!!>²™"ª;!ÝB˜Ý,öޣР.ÞGG·ôãgŸû*¾øâìHßÄß¿øóùÙ·tæ.éØ={&àçóŸi~“;~'Mž<¿¸zóÊúùè/gg§ó£YùxÇÍ>£ÿÿø˧q¹ÿåÇì*nöïôãôË,;žý×»ÙÞúnç\-wó iMè_§¨Nk:(lÿŒ®5øþýé»Ë`òîÙ8¢ovs‹06ªÒzÉèàlÚ5‹žty¶¬×qCà4 -Üõ9¾zÙm%Wã,§ÔgW£ÞiïÛ¸<¥*äýЗ‡ƒAtýÝ×8àÚ?çTnŠ2š†Ü\µcv^>‡m9ØÐ2:è'5‘œ€…ôp£”‚ŒžÂKG°×1WšTŽÔ0¢ö†çxKSÔÔ¬už€[Š¯¨¨¸‚5g ,(%³ôs6Ž4¹’ ÂÅ©‚a¬ÖcXt£’LAs*°x=Utjl‰¢Pi '¢}#ªUO2" -u Ø5¹(I·t`ãˆo|ÐFŒìrº©Èýºo­áaÐϲ’õàáòsË<ú˶öPÀ÷C4è q”I„¶SŸaÅÔ.ƾщá|1$€³vª`Äš ˜Ëmí+¸:¯«JâbîàXïñxÚžK[*8 vaPp&À’dr’¹ëÈÐìiU©;°±ÐDø;Â@-cn -„FËgô.öù¦#@Äöê‹7¡vé\€Éw4c"Ë‚ÙxcM‡Áš*FLM5` ÖéqXÀp>F6ŒX€³³Ž´HgíŒiäYß²Ö6 Ff½OCî8ëÆ÷m`šû àðT¡ìh)¬ž÷$éo„‡tÂc{ä/1Dî½£ÓœÅô¡æÞv0öÖ¡í²ïöC……óv´m`¬C1´iGŽÃÍð&"”å!Ý–¶tEðyÒ/|nÜ8Ä„È1}z[{mkÔö—w2"<¸*‡ÕÁÞ À¢¡íh3r°kÞLìè`(Á8X<•«ã|8zRâ0„¾ëˆ/QIÅúÖ6÷êñ´tã †~^¡1·™¹¾'K - ñæý*»œÊSï—«}hLídhĈÍìcÖ6„6¯À†{Nç§míÔÀή²ÚÎ8G` : ŒqoÇ ‹ « ¤ÌÞ(ùƘÆB<‘.0RôuD¼íÁh͊CËdZlì±uL!£QJßâl‹ ÅëÛÏB’ìcÍÚÖŽºÒÐ7¦0’Ä¡óLÌtIPŠV8ÓÐ)Zó6 Ö: -°*Û¤z„©[ÍÄjw.’J£BéÀë#ØëËÎöbéî7ýøvNÚeÅkpV‹zÝ€%UN8vG¡åεxßYqDO-ÁCó] `YV9§X³]Œ!¿ýDÅ2ºaçC³¹™bå-W3wpv©/N² ?–O ¾òr‰²à »™M…Ì„èۨ׈SÈ20$& /XKuç`Ӷưï¹5ª!¾ýfw$}YÄ pNT ‹0B7½;È*rÆQ äÚxM€(«­peÖšFôÀ¶è(’S³¶œ@ŽH¤¨Àª¬BörG0DëÀ £¸F…Jo^ÙÌàDÕÅÀVÚ8‚{°o`”äb°Ý*D!4‘\7eéÞÚ¦s¢|ãTÁ\QÀX½}k=äNšJÒ¥¬ˆ]ÔC¦7Õ¾œrªL¤úfê1ÇeóÙ63ó±½Q7GõË3ÖõIìwWcîrzÙ~6> ÿP’M#ãbŒëª›Ã)I#ŠËÈdÈàh3¤° *Ì9x8 _SÞ££o¤=3Öa%„àŒ+#æåHZôãZíZEµ_Jàj‚Ë-\J*Æ•wJkYGÙïsšï£u-X&rQ²ê ½%äkë  ½ß®½¸öŒ2`fy˜ÆnKèx°Ù*–ÜÑ3DÛ°j,J™vÐ)®7•¾5Ml²ýKe“…±n;;T'w$€ˆ-žN?. ,¿†õC?¥Ùuw|_a©Ÿ¡Qžða\ºzcSÆÉç¸dK–ìê­ˆ#ôá3›$@W ›ðÙ^ze'ªå+4lÅd£éi—3g°ÐØ$ -C¡CCGÎIvYÚŽÒV3ÜŒZ‡³¥Gu)Ù·}YTU¶A˜°žFN -Â]Î -LÕÖ2v­+½ú,‚áü‰€yËÔœÏ:~êPÚz…•¨këŒ2Mék»Î3럲¯Ô™!š40á†dÀ®‹ôƒû-Ê¢k³I IŸŽÁèÂÚN1£êÌ-#VÚ` -M—M,pC/ÞÁCÕÖ쓹ȌDíQ`ƺŽ$·³¥£˜ˆ9ͤ@וɣ”ãÅ¥ÀèøˆžÌ´ÐƒÒ4d9,£¾h×G3&ToÚ0z‚‹]Ù_Þ‰ö^¸êO=aT&.p–Þ!Þ6xáT -vƒlYIÝ"PQ¿)Í–ö« Ub×ç¢vŠ‘h€UÁÈYˆtQà¬üâ `°Á™Ñm±_ý`D®ˆ®àAÕéS×n¯¬M8ŽJp‚Ë,]“—Í -Á£…NÍnÇýv’èë—UèÞÖ2[:0qæJ’Š3P4\FÌ\BTÄÅêVæÁÐa ¢æ°cÞo|O;0 ØÇdm“2nIx ÆaD²-öÔJÛªGí5|8½õzc -ãÜÌ6ÊÎxzÞ€-Ô>‚¦Rd1Y. -"ž’ nh¢…+†À»Õï!Kuµ³’ºYJòÃF3‡¾¯`ŽþP°``.u%ßSº´_ý`hbªŽ×õNÑlæ1(@¤R rz •ºz€L,BCç•àc]åa,äâÆ«gö£01ç dž“2KH¬­R2“pvöñ²¶gýv½jQ&¢p~Ó™ø¡¯ÀVm˜X¹då©‚9¬€Õ -Ê5ÂMÈA ƒë>stream -mNK©*k¯uˆ¹wÕ°ŒÀöÁÚFõk(⧠\CœäŒÎ#iIµSÇf…}›  Û#Àíˆó^ÿAïBlæi€p Õ@u,XŽ+B› â«XV¸WoûM/‡>x; ÂÀ'ÔO€ƒ‚L}Ê6­ßlÒ4]mƒ¸&(åÞUÑ?Ž£g'v‰I¤¹a2~ÎJ¦@]€*J8æ’u ­ë·P]\9ÿÔ¶f…‚>\ÎfÖ¯´jZV®ñ- ‚ü â;Iï&õ E¼œ,snRf+vƒu`*(îÅnŽO8¯GxPÌÌ»Ó1³ÉIƼ^­ZE À§©_Nfkç!à‡ÐgÀõx ‘g«Zºb¾ ©@õÁ*ÍÃÏd‚óhlâ{fm‹: m°s€k•-bµ÷ù0 -qÉr2r–²ƒz\„vCÑìf"hO;@x§^·"ˆ ¦¬dX èQgû–‡nm3m« ‘AÎ5´‡ÕèvNÂœ1/ï”Ïh±Øܪ|Èê‘…üÕB:Ø™F(î¢eÚ×΂gUAS1˜iÏ°&[…œjf‚Æ¢ž.¸œ¥´lpª®Djí"´fæÅÁߡlj*ÌÁA'ÛÀÌo+u?¶Å™F9:³Š0ÝAÞÚš|–Ä«½ª¼BZGUTêöI?*’y³ðæÏÞ¦Ë2Ú~ý¸¶A7§ ÂÖØÑ93ŒÖAó;)Ñ,À0Ø"l8 ³ôŠª˜ÑÁ`kPÑ)ä¶ÚH¼8hQÁ¥d»b]—uBÕÜw!©ü±qufqo~?ƒ1—$ `?aœ+¬ºvÝ„]$Ž@€A&ä_övèä‹ë *VBj~ÕŽå]ezá^c{ž•TŒ5aôÙ_W sîNßÙMÔ~êâD÷Š1«t]7ºññU Òª"ºq¦bËÒ|¿Ÿ¬[v+Ý7p5}bU¯0L!Û°²êð$ŸV6>Ê=V«Ï‹y2a,t ¼ññMp©"%³·¬fý"„G€>Ãj>0küG%cï š®Þ¼hSí®µY¤mš›_žP[d^êøopBXP¸Ñ°¡¶£“ÍËs¿Iî¨7¤/bA½qëµÈÞ W¢‹Ñ0°A õ’OF„c-›S:Râpé"uý]D#@s†Ê@¾§bOIE!!Äx?›H˜TZM©û6ÉÐbâ×TˆbF2wò„z¼†ª’*èj“±Bo—*M•TTi”PJ=ÛéR¾Ñ®ƒ- ¹ØëãILŠRìŽ3¹«ìÑ2ØÆ$ŨIÕr2ÐAG,Y¦’¹ƒ -*\’"õÌ-tä›Ñ6uÉSÉ]‚¦ÂðÙ(j%λhcõ©·Æó¥­WvÔ›hDÓ÷õy³ú¡b«rH¹38h[:âÞ>fa%¼ÖkP†²tMvr¨sh{U„Tº,ÉØ+$Òs¶,Ìá›hpý*gArqÀBìtµ€Î,9wûSPc/¼Ä«µeyV7QØ.$•ÌÁ &Ñd2d÷W=êFˆ™)÷bR–£¨Ë(Ò2¨.¦7óΉµ¨†ÌÆëÁ0æ‚÷µéhKwÊŽq$Ç|¥Ú`G„ŒDt}°¡_Oö *(CX²ÍÀ|·‹Ø°m°¾W»o]lá>)ŠC:BåЪœ 뀳)2xd¿cí,Vgà‘gBq\‘ªLˆs`&wdOf‰b‚oÝ’XŒ® +k×þæîa€œ1‡5ò%0Ý #ª8EfŒÚOÂ` lìwõ&ØFÓ¥¥â2¤ùUó Pp0 òÔ/œ®Ò/ó”Ý@­½70ÓŠ½"Ô¢J£‹ˆZ ýÚ%#¬\•Ü¸ýl -ìÔU›u\­QÇ¢tÄ:ÈÕpº¹2¢×`úúVÅ–‚TÉܸ؂u`QxcfŒÝE,‰†]€ÌH AèN7Q] åæ*çD®vUkNûDÉ«à`‚ Wû'½sÊ¥r†UŽÔºš;Zd¿HÝs.sÙ—ZD=z©ŒTÀŒ Aò¶°s/ñ)Lc¢ ù|ÐNãac7G‚ªñ@ã­Lå¾ÀŽ­Ým±SØ2‰œ=¥JPeĸíûJÐK'|l"V‚ìN^}'nu×Ê=:om›³³òÛÈ ÚãncI‘£ÝÙ:5‹®ëç=Û¹…«‹ÎrXø2E«K&PÕ0òŠæêìDküL¸øõª -4VÉ m 7— V¬`±QaôKÉ]êðv¥ÐXƒË¶µO*q î怲,Ôªu ËܘÉ6ÑÏœ|s›&¸™œºÅRbßD.‘ Àèì0ÑOœùѲS1‹ˆO×´ÐfÒMË9f[±P^®»b¼—YäÐRy$-Fˆ‘,¿ZÛˆ¤ð:õœhoÙ¡kÁг¡°ÅÁÔש³«%ç\ƒM#´`ZmÚË{U²s6úŒ”š]ÝnŒVìÁÚpiê±û¦ûƒº½ÚxÇŒ:§Ò¥4cLQ ³±}ʹ»’iÏ4V“éJ¿£{Q ? ‰ÞGõ_{&ÖœîÌ\&Kóí(=ÿÔ%—¦wiôÜKCׂãÐ8³R±»‡¬aîŸ7« §FÓñg×pM@$@Û\MMõŒm£5ãü=3 ¦1,]F‹È‡ÐÃèuìSÌZ±3jÆ?"ÔÅ7Ć@ÖÎiŽæ;ßIœƒÖÌ+¾ò˜‚É‹Q¦[¢“EØ´Ñ<:¯—ÑnBu”¼5Ö!~å™Úe‡j¤*Z€-k”0BspÑ"‡LäÊ=–dÉ›GÊhoë8´±ƒd—ÃoŽ!Ùɘx?˜[6ûPš›¥vmNæ>‘‡ž¤ 4N9N¬.P%7 ÍŽj©„îEÉJìJR¨y²]¸Ø™6©G¬cz¿¯àQ»Ó{J§â¸áIa)Û·J5¤<æö]Í<Ñr„p±T'm9€,Š£„.Bg‡`£­("ežÙnè½²ogŽ@¹ÉYd&aa(mÜEÉ+h.Oæ·–ºÔ—§Žw,|¦º,¢)JQ÷-ÚQ¶Ï<ô „‘ -çA¼,›=¹Šñ¹*4¡ƒNÄ ó×ý{ƒx5õŠQפzBN‘Üï­Z²‹ëY#ü$¨°ø®hôcxˆŸD‚X F@À؇C^ñœðï%L‚ÈÙQQ€Y£§q8ÒØÁ0 8/š[\ÖK p%Mˆ~ƒ{‡t&ÒQs“hV=‰·…Ȥ Ûa± ®/¦ur(J&Àس¤jÄî­Áüʛ׶u’= ¨ªÀž©v[ziuGëº÷È4¶ÿ¸5c?-`³ ´Šµ -4Ÿ(Ø^>7LLäÁÜS‡n£× áƒàŠ{l|3&¥º m¼‡*Ù’W? Z5ÕK6ù˜3Ñ[ÞÈ€YH¹8_hakìVOlº¡;€»ÐREn¬Ê´]»ONøiJžåý1æ%Zhyf5A0¨ÃJ-ÝÙƒËfØ÷áÐg#“ù*—7¥ž"«Ê¿=m‡X•j‘º†Qœ·ÌimU9’¸¼·­âoνš“--h”Œ½ƒl„„«ì+¸¹‘ðI—ÊÕ§,îESˆè 5sÎ#éwèqï± ÄÍOd©¬ªÔk貧sçZ˜$^ålN<°I(B”$_N¥N½CZwÙ`qsBU o¬oúžuìŒZÉS„Åh u°‹Ã±¼žºëë(Ì4æXLWéšÉ,ÇÐüÚÍC¥ÔÛ¦fkkúÅ<Cg´8“vÐœ Y9pR>&y†šUCE2äHJ´äcE²»9ÀyѵhHºô|¿ÃÐmúpÈ2eÏ0ô3£.+û -α{Wj”á0L²&ÃQNÝ‹®«ý†A8_Ñæ\O½ˆÐ*½_ƒè´dDzy'âcÅÜŸ›JbCøV°s¹ÍŠQ$óz¿£ƒÖr8 £4Y„¯`ôæÈJë ôð…Ìkt`×8sò/³!”æÍM)©]k(9,]¨A@YjgˆÊL™\§¾h[ÓÛUI5ülyx¸aº¬à¤®€ŒVmÉÍ9üY{ðž÷­w`±»Eо¢`#Wcð%ªZ =’H# -˜‚ôÕí–È!t=cÈý#Xƒ‘¦zQ.¨ÖÝ<‹bQèÈR?ú–# àdáQ\Œk_Á£³®y pô)”êƒh'‹d:býZÖÕ"”D©þÐ]Xƒ½o–Æ -×`wJt(²Ökbyztw›”tÐ:—T„ÿÜWpQZk$mëJ¢¬‚ !læ3Þ+ó=Õ¼75M!~ú’ù? ÙÞÁ¶€]ÌäýÚ5µµ¬´Ò-¿£×bCXÅÖÎH€I‹æE\Õ߬ÕI8œÅȵÒO•ù¡­ÒBH×Á>f·?K#bµ©%F0˜¯RTY®á2èáVS0ÊÒu·K6huæ7›gVe1í\(%fî7ZTÈDÔ€‹¤yþ#²Så‡Þ) ï'°vŒÔ¢XFd±œ‰ÕLi+€–°Ø×Ò:µÔSQtvQ£Øj™û+$¨f몫ÊGÍÛ­XÔ¤¸lžŒE£õ›jRårGÑ, û°ëž¶^}ªÐ«3×8à »“êè{Ä£ÑV‹ìǺÇ7j0§"Yïm-˜³±%ÖÆŽuÔ’z–TqN8ìSèa@ªh[Û]˜dÁEj›ØLIYrge¹Eìš{yÓÌâ×O¡ï™¦ËÄ”Óü$åÇ©í+8g#aECMšïUb¢Od‚æ:Qª“ô†¨Øê DMÂÝ\·z(6”–a0dÌŠÒ“àÙ]­Ñœ¨“¹Wóªà’S5ꎒ™e@¨Ë¡Q{îtjÉŽ•0ýZs~Öž•¦]éV{Òž:Z§ëT_Õº^¨v‚Æ|0QÛ$Œ—£4­cèj¿ùÌý€Z5ŠÚºÁ&üq¾{ÓÑ6Íj<[Ø®%ýªuŠ|«ÜÇZ{þZÅ{ÚAêñ"­ÓU¨‘¢a*² ìøè=5Ә׸ˆâD€¹s¦ê ^K¯NSå—i§|¶e1aPšu÷fs_BiÕfœ—ïN uÌk?úGCqg8j ®\kÞîS2³/ê¿ÖkÓ(Y”w–­'X–¥›`B5OØmÂ"EÛ8f Pèi¤:f¥>JUªCÐõCU«ŒRÓ*øWÉ“mzK³–"î£ØÇÌC©v?@¬€ï©\?Ÿ\›Ò8žîYS—Å4AÛŽáêóS9.Õ.Ãxq’„·ÉÒ¨ç{MÝÝ w¤™F¶uÎ~4âÜ,àÃÙY†!É‚¥„Ä°‚a4 ða…pɶ‰–¾Æî‚1¹Ï£€¦Ù<hŠ^bŸº¿\ =ÁlëÁéu´wŽqÕÐiéæ‚`ç꣦+}V¦œ„¦|Ì+ÐÌ<CŸA³Õ±€L• ŠÏX…ŸÕ9±JrY³øN-8lÕl –áIN™JOb! °B$‹­O‡Í¢Ç±[Ì(zíh#ª{"S?‰¹ô”­'GÀxåÄpVC^¬m QÌ*']:¨Øí¼kÏuKíÞÈk‚Ì4~ö¹ZÆÌøR$Ý©‚ãx £&dÓJYq¿„ŒÞr³ ûD¿hÉõìiLy£ê¤ÅXš>ß=³²ïS7 1™ÕÈÜi„FM=Ú–8KöLsTêáÐKsh¥3ý¼0K¤”ÅM*Š.|Ф4 6µZÔúCGzÕË8OœÆ¸ מvbÏz›²ùUÆhŠ¹Ð_¿þý=ΚÃ;Æœ¦šõîÔÀÝ-ÄB#hF§¨\€¹;¤u†àÁŒd–(pljò[`­{zpÉ{¿ç8XÛÚm°={à &ÂI÷îõK¸ê¶97¦Å}šùŠ™Â„%Û3Û.t‹OþË_lQÙü–»\ÞJχi:ö1‹>ȱöÏÞ–Àü ¡ìm×£òÓ˜Xàú&é%{Z˜mði]g¯<fK6bjê[QwçúÌf_G¯˜j»½, åÒQiz)ÄxyJ¿;Ì8m;=VPÏì["ÒRVÔŒùQZ¤Wµ!/ŽÀ®µÖë‹ì%Ðkö s¹VVÒ‚jëæpåu Õ¼l-NງQOA‘B«ïÔ´@_ð“S–Siq`c*}S_&‘zz*}o.%d«{ÔI©ÍjDg1ƒe¬m}‰ÙgYßÒ“Þ§Ú“vC.~Õ)¦ ¹8°qC/yÉ|¿­±©’µÀ-ö>J.„gÊQÌT5:¿Üýö’–Ô°Û7³BF7ËëoG«®ba`Ò}¨|6àñÛÄ\wb}±ÉZ»Ž Q*êcG\ìz´¼.z؆²5gËøè„•¶–1oacÞ¿Ö=qCîYÿ, Bèym̱¿*ÙPç~w ÚŠ=Kˆ•šbî^:@5Š7¿>Kùª‰ží øl©ÑÙOÆ.Û˜Ã<÷zs‹ì "ûauL©iþ6 kaO–€Jƒxè{̦…†Iˆí$˜ªö±Yz… ~2ÇX—é¨öÆ  Ónm°„w-!ò4!tVóÖcYÜ#EBWM¥îïŽ^“ÝV¯X`qZö”öŒël‹Ì»mºoŽ)30ë…÷—wb[T{;Ížtª`“Q\Þ|î¨ÕMªFHgŠí¡|Uü»Ø­“øØ`è“…ÇTá½äSI1ø°l5Jç4Å©‚}OŒc¥û²£5•éŸ'yéBé¹4 çˆÕÁX㲪X'ö Ü —Mjà…MãÙ’ÕTT%“ñÞòoåZ3m0Û"-%ºq*UË­üÁM¡ÁûË;±Þ[ÏÚ$ -çTÁf¿l7%@Ó4ÄñšÄ´-MB'öÞÖ…ÙŽúöÅ`õÿ²3Ì>úxöã_¯ýúÃg_µ_œ=¿¸zóêÛƒËËùÅ™ŸÏ>>»þè/gg§ó£Cgþ‰céÿ?þbìýì³×ôÛÏÿ÷Ç_é§ÿC _fÞ;žý×»Ù^únçY-pPv± å -Q¸Ú$7R+&F¹z^!~°¿ôwfKc/ö—õºJþÀ&‚|³ãX|‡–ƒP/סBœ!±ùѧnq Ž0Y€¸×äÝ‘k‰îÉî‘„%êÇCƒ€ŠÄ¡âÿCòžÎ } *¿vÒìkâ€ÿŠ†ì8. -âØ_ú1§DðR‚‰³ö•{‡FQè ’Ã5D¶“øÖ*M'u—̇˜†€Œ—€Ä쉺÷ÌŠÕ ‚ðn‚(  &š=.AhKè†Ùj0DWEàksëZ¥Îc~ö¶¥ݲ^‘]¸Ê ÆxÛz­Ôèæç°vt$ˆµÔ¨4X8ú!WUÍÁe&¾ŽË˜{’M -C>I° ;|†‡$Âìt°qÞ>ã­ª‡JÖ”×J³¦ºvwÍxùÚÙ½‰„‘b¸eÆ+5Z¶vwïÂËߌ¢fiI­ƒŸ ÷\[Ÿa€_Ûâõ3¸³Ã1ÜücD22ú×ÿ>0¶Yy?Ý;üáÂûN™[à›ÈÓ$®ö $’¼7™íÍK&«û{Mæè†ÕÚô\òåÁež ¿ƒ=  Û¸* –Í*ŸB üÞjm:ê[òåÁpoŸ˜ ä³£ÍAÊrÛ¹Ù¦OþÖU¹kI'ü̱r¢i1ÁŠ¾üpC™Œ!‘€ODFW2-cá¢o5·4ºñ¹“UÆ´©üÌ°¸2#&¼ñ`ÄŠýüéíÂA¦#ú»ýÁÍ®6 ôAgçZ8ÇÁéµiNŒó÷ü›ÐW*þ~Ûƒ…®6ã¾/›Í8ÿ·aBýn{°lþËWìºxÝ#²‘»[Ïã{»Î Ÿ[©ÑÂçÞ…£É¾øóùÙ·Çg—Çg??{&`ft¦vþüO¼“Gßÿç—:>¡nv>é?gÿ¶óÉ_ïÿùühŽŸŸ^ŸŸ\üú¶ŸÎ>úÇéÉ=zFú8þéêrþæãÙ¿î|òÙÅÅÁ‡¯ŽOŽ.ægxfŸ|uv9>Ã?.}=dzÎúŸùáåóó«³#ûóó|<ûä/gLJÔæ{úÈÙÏ×ßûûÁÉ•¼ø’gBM/ß¼ý0}xƒFwí½ï©~öÕ‹ÏN^¿:xáWãñµ¼cNhsïSqXu -¿®¼9¿>À<¡®<“WóãŸ_]®<k¾Á{sÇ]›Læ¾7¿]¾Zy6Úú_Wø¦ É³óï//ï˜ã¸ o¸õÇ'óÕ±ãµwî}»ÃªS;»:ýæðòàïkÌlúʽOìòêâ§Uçv1su²:Ž±æ÷cv]^uN?¼™ÿébþ¿Wó³ÃÕ©Á·d×®NèãóUç)¯®8=ûÎ;Þ¿eðËy† ë4ÿaÅÙ#~ËÜóÎ|~uq8ÿòâàõ«ãÕ9©³•·æøìŽÛ]ãgrþz~qpy~±ò|Æ6õŸÝA®mQxÀ˳w~úúüÍñåwçCŒƒe™U‡ðÉçó—³O·"ঈ€i+.™ÈVÜŠ€ïº7[ðÑ‹€+#Å­¸ "àÊjÌÇ)¾¼8 sòçóã7[p+neÀ­ ¸•? `ô|þ÷ùÉ÷¯ŽÎy²gáÉHéé HëìΆ‹HkìΓ‘V Þ\}>ÿûñ´†p4}éÞwZxV=Žç§“«;¨×{‹ˆCøòàê͛ンçwÎqì•oÒÑêèñè!ðã:GlÓ¯Ë꛲:Gqô,ÅùË—oæ—wߌÇ{û¿á>¾{¿²UÿÍÕÅ˃Ãù÷‡'«k<®¿´Å¿a.o^Ï¿¹ºã„=>­â x·žŸœ_üÛ/¯î±§LݯëœEi}ÿ ûÊÓ¡¾:9¸Ø;?{syp¶úæ-¾ø†›ugùÅ?^ŸŸÍßa–ã‹IR!”þ³ê"ýsåUùçCÓ~¹l¶²ãY^c*kjˆùöüøìr½Ì‡ÑUο×»¯8þñqGkÝMç!ž¦Ááô$kÛ6ûä=6qéÌ)›‚V¦»C|Ÿìšn.cú·Õ/Ëßâ®ý+;(?¶k\¢ GÕ?­Î <·òŒ6Ms«³iÛ¬ K'¸ÍÚðÎ{s‡gÊ„,­UòPá$¿CŒ½ù~?­|Ê õYyF›N}¾[Ù&´÷êàìl~òýüd~¸ŽnjñÅû7³®l•|×I.¾ø`äèóã7¯Oç§ó³Ë¯^?>šäfößÙÂOíçªÛÊ¿V:¬ù&£•M'_+ë† Ê_/?è£üÓêje§šÇĉï!Bõ릷‰hoõ(ÔG˜)eÛ³é˜meu×£Ál+ÏèèŠ7åöŸ­¬œ88<¼:½ºÛ ;YŽé+÷¾ÁsfWžÞÑÑñåñßט\asuϗ竱ó˜ÈÊØÿåÅùéêÞ­Üøþwå^{b\=“´½õìÊsù µÝV×ÊJëûwÙ:ùåàוçDDéòàb-"&í@˼ŽõËã““u|ÄO`F'Çg󃕃hN¿>_=bòÂýG²­ÌÁN¨’}þÏ<…UIÓõ·H298;>]ƒ[ø@1*;ýÝÓq›iOÅmæðɹͬ>£­ÛÌÖmæ7rü+«¯›ßÌ·hÃqõá“ó›Y}F›®Æ~ú/·Ž3›KŸVfâ‡ãÌïeo¾ãÌá“sœY}F›N~¶Ž3[Ç™ £IwxˈfýIÕýiòñ%\`9ýN6yG6üÆÜ5¾Çi†zG£áÆöŸŸ¾>Câ7Ww ®÷€æ5ìÙ^XY‰ø·;ì=“ý@Óû—^WžÈê7æoåÂl:Æ^}sîp5šnN|µÂʹcÊÓ‰ø‡Ð'\_¾:_®Nj-]SLxL”ôç£|¤ôñ˜?Þik·Qˆï0Ž­ýykÞÚŸ—ÙŸ×Ë–¹µ?oíÏ6¹­ýùƒ¢YX ƒût-”»µ9?„p¸µ9omÎÛú)[›óÖæ|Û ·6çÐÇnmÎ[›ó‡ß‘_ç''翬º''Ç?¿º¤çÏ‘¡såý¹ùÚýóè+㾫‹—$‡}¿^–ük/m®áF®ýzs»öÎfã‹ Çç+oÓÑñË—Woæ{çgÄ|Ÿ­ŽÕÞ»÷)êžÕZsZÛ²ÄÂ(oUp[Ü}21Ÿþ|1ŸŸ}J4cþ)ÍøøçóOÿ~|~2¿üôb~ôéùÅÁÙ]¦¥G¨›ÛÖ6¾{6[ÝÜV7÷{ÕÍ­#±mtÊ\••-Góúc-õÜäû§Qmå‰üóøôêòŽ*«ÓgíLûóù1 [û¸fì;ó¹ˆ)ûzãß 6í©+¢ü“ÖD=%uÍ›×óCE/î#$âÞ ú+B]„µuQ‹/nòUÓÁ~ñ×çgów˜åøâV™³Uæl•9¿u~P݈2G5;¬ÓÙ*s¶Êœ­2çýcÊ­2g«ÌÙ*sÞóVm•9¿E™ó÷ê©ù%mfê{•“¯jê´›®àxÊ:žXTñ}ê¢[mÓs<|zŽÕ'²áé9ždmÕwgÃós¬žhd›Ÿã)éº^OEOŽ/¿=8¾K½¿%¡[ºÍpµöeÙtê¹Ínµ¥ž.²= -ºÍlõ¤2[­½­Û¬Vï0Ž‡ÓÉjõûJýôý«ƒ£ó_~ßu‡VNzµM\°¬ö½$.x Šò¸ƒýW.ztVzýcÃئ_—Õ7eåÁÜôÞ'rþòå›ù%nÆÅüh-ŒöØ°À7<Óß•Œðî›û„……MÙœû±w=ž}Ù -q[!n󄸼÷žçòÌç?¬:‰Õ™•‡àU|t+ÏäÕ|ºÞ|£wguþþ!Ø{ŸVß_ŽÖð1ÕÖIýQ¶êßÆ·l°lúØŸÇ­þh[õÇæ]—Õ7e«þØ,°UlÕ›„×·ê­úc«þØ\õÇåÁN^OÑ‚}vþýåñåábêT’CëŽOÖÈZpíû—ØWvK<»:ýæðòàïkLmúʽÏìðÃyEÝ÷LVV@>–DF«Ïhí ÝûöêÝ]9[ÑOo溘ÿïÕüìpu‘èÆ[÷>Á—t…Oþ|~¼zH‰¼¼âíK‰*ló/mó/Ý‚Q.ÿ’Û]¹RÐåùê×ó|³±êË‹óÓÕYjn|ïÓyJ顶é”TžÛ¦Sz°tJkpR¿ÓlJD“ôÃÕÅOW'´æPÕ¸†Ä±áÒà6ýË»‡Ý=*ø¢Ó¶jØ­v&jØí¾¸#Äùx¢­î´á~hîéù¡­>£ ÷B[což¼ÚÓ7a¬ìˆòØ,—„øŸšæßíº'®0¿\QJúàêò­ øîÓV -ÜJïùêl¥À­ø^¤À• èV -Ü Ic+nîÞl¥ÀG/®œa+n‚¸òv=N!pƒ¼¦¶bàV ÜŠ[1ðÆ8¶bà£ÿz~~ôóÅÁê÷~ceÀgþÉHùéIëìΆËkìΓ—Wf»oNŠ'V=æ^²RlðœKÕ¾Çac›`t¯þ6Áè£Áhç+dÖx|8í½å ¹ogïuª,?–#¶Ö¤6=löå ɱR ûß~:98üÛ§3¿>8<¾üõßÖп¹üõduÅ©¶~°;õ'Ló‰_©M'¬OSkú[Rmz£§ÏA¼á\³{É?÷¦ ½_^­.~¢UÒŸ­€,'{sóµûO^™Ò^]¼<8œx°Á½öÒý«ÿÖCëÍíÚ;[Y÷>¶I«Û¹<¸«ÌåTð½ùÞ½Oqͺ¼…p­[nøý­M!eå\Zóúc-Õúäû¿›qe -qðÏãÓ«5L(½ý½OŠ©î‡KCõ@¬ÖçÇŒÝö×12~ lŸ ^ØWîfËûmy¿-ƒôäÃõë?beÞÏÖ`mæoñÅpG_w–_üãõùÙüf9¾¸åž¶ÜӇ㞶ÌÓcž¾×«üx¹§w W›N‚Ÿ¦Ùà~œ­7ÿô=¶bX«¾2¥ÿÛFàÉ~ éýÇ1­<‘Õ/Ìßâ¾>›>Øùókî#É£ï=ýéüdç£çW——çgï¸ÙgôÿÁùΕüë_®hžŸÓïovFo¤¥?þ~ü~™y7ûzö_ÿífGxÿ;úÇÏ;¡í:çòì™÷³Sú‹ìï<E·<ÿñ,†Ù³a7¸64ù£Îövð£rÃ0ã‡-ù%ïv‡a˜¡3z}oGþ½ß?Ê ©kü‡õ@Ýs§{;ò‘ýé—í i:ü½—4¥Ïw¢§WOñ¯¶[r ³0пKÄüû—ÇédõZVŒ‚Æíè›ÚI ™Ë|½Œ‰àiuÖ_}F=Éêé'žq×ã@ù/þ²^ð ézO¦°¿óü'ÚÔþr†v4ûùâàè˜XÍYû˜w÷Ù€öÿ3?{þóŽÃ‡&ÿ¡. «ÐHn>Jôµ’ò¬¶f?ž.¼J¯aâoµÔÙóÃwþêówüjpø*6üùóùËÎ0s»t&ú¹Ÿ®÷étôdz¥¿¦{xmwmcžéÎ\; §FÎÓÞx°ÿÝáÉÎäxŽgV›µé!™žé4o;/pÚ^óÀPãRn[ÿ‚­óË ^w½ZÒmf•¯.90+}•ÐÑx`þ²ó‡DB/¯q -x‘f…Ö¤Í/Î'ßÍNÄ׌žÍ>"Œ¿%2<¿8¾?9–”s„®¿¼8>ú9»%üáEVb3iü!ñ7—lúAéÎ^„ņȩuq96!Âõüüüäz›3ˆó_^ #ð‡Do^ÐñÿèãÙ!Kȱ.?£„árBrÅ4ש®FEÊ®Ý2ûE׃0ÿõßü³,üh»žÏ4ý1L?~âôãß|üù‡{ÝÛ'÷n;ûûýO.b)u7¿ýðcrç'ø Aæ€AÈ/k`/bª6ý[OÕ;Q`¬ÌZGSvï¤Áw½üV*¼Â—o§Ãw½|ÿ¥c"ZÜ}ˆÙeïsvÀ(©ùœ’Jq¹ÐÞ¤ºR‡š‡¡!5‚Ä–ªw)z7´!2¤8bô±†œ†?}æ«Ò/?èØ`»Ñ[{¶Oƒ¾…ÐFÖ'O¾Ÿ\¾Z$~öÙk&~UA‚¸“àws Aøîv'rìë®àÒË®‹.Òûöën1=ôÃøðÙäÅg“™ÙòîK™d {þ­}Ú¯ÃûžA&ï]ënµ…i<µô‚—{`‡§CZ‚üIBMÂHkv}ªyV|J»5e/7?²ÀãÕ¦0Ä8– tOW1æÔ²‹…Y’:ÐÍqÃn*CÅÝÓë³ô0^ÓgÌ>ùóùåwóÃó‹#/ŽÕÆwóï}öÕ—:Û^ž_œšS=Ÿ$:iGç?Í_|öÕð‚ô=꽇19oX¡n¬h¸cE&æ^ qtfäõuòôÌ·Ý” ÷ÐF„7è¬T³Oô û[€0Bc@ œ@ ă+»C!zQvãP˜ïO B ßr Ý 9 -È»ƒo @ÉÔ µ<ä—B “E ˜œ´ñ”,ïºZ Óã6ÐÛ>í6 è=&]$QÌÂn+>*-£ãIÃÛ--6–Dˆ ¡Enø›„ŠH½tÀ!ˆb‰•ðܤ ¡Y‡Nª‡4C›OëD‹@ïÆVðá´›{&·D«}€B $G4Ÿ ò4?æ -@!$Ý€“K€!4·xÉ:Û «>ÑÙE/­O€TkfÁ‰ ¡QÒ1<ëº[#]kìÁeÞ•ÆæeŸ*dXÃœúFÞØì½nmþ¤ŠÆœˆw¥IÐGqÄhô~É©Ã'kt-ÆDÒ[v÷Ù”nëPh¶Í7šín.”hS›§ﯩbhS‰•X|È®ÕJtd×:“&Ü4è¹Þ-.Ò舖À×”¤X¢‰¹5Ú­0$p¿vô”YÜu çå –hŠ„sQhîñ,dâöânàUçS@;B»Fk;äâåìZYîL‰ZÀ ßvíp§€®–—~ ðFÚc—«ç—j´tò†RùèÐ -2û5T:[{|U]¼ãtì˜"óZÓ $¸Ä‹OkÃ…V¡^; ~ˆ‰H×ÚÐX䥭èºñ—èlz½òy ÓI7ÜåA4\t;‘º®Ä¨d¾®Ì - •8?M¼)vHïoôÖ<ð¿åÓ6¬z¬•/°£2Ý–ë[··ó'ÖÕõaÜSî?åb„1xÜõà¾( 1ø Ñ¿drÀDР¡õŒFKÀC§õ¬Œœ_xþPýMû3Pé‹<7:?n\šC$b‰BÀ6²²XØps{Ât{\MÓ6•fиMŒE(xblE“,9ÉyòÅ{¨@vùˆí3“ˆW^!î,õhvôÉ€^r9Ð’Ô]º,û¡“PiW1Òù"@8’· -¹a -t'<ÝÝq…oîÂÞâÆ€Sü—¿³È”訓*0ŠŸÓ?VóT7—|aO®íÛ!Þº¹¿' -$ä]€Ê<Ö‰1>aØ*^3ç®n.wµ°Œ }s3dX76M†E{é‚“•úÊÉ<ÅgêpÙb¡«3àóÏÎà9k,À¿\©6û»÷N?ÛI³¯YûI…‚Ÿ‰7$"~J¢ih^äyO8 \pgž.rU‚ÏØoo‡æˇêã ,S¡‚˜DosF.Ðb]nz‰¡ƒÁ‹çùàˆ‚uÃß68û{o‡FD€w‰‹][LŽG`z@KKfÒ[ ŸÐl2uÁxh¤®1Vo>M§“ G„sã P@ÃqyiŒ.´Èœ%Qõ:.ËÂÒf´6> C[‹`@¡Ch mYcTàªÜe†W‰½ 1dúåøÂ:>ÒÔ† ~d¢b€ž=3Z» ÄÌçÐûaháî‚“S!ä s'¢å@×tt":Ñ.–(h‡J"¾$ÝF¾ˆã>Øß{;œ1¡inŸ0] ô€.Æà#ÏK "ô!•ši°Ô¶p…]Ù&X2~ —š7"ûÀÊ -:F4|9WtFRW@mèxÅ–å¢UÈåôÎMk:D·AÀb¸æ¾77loa ÷Wã½ %¨™¥øDÂO˜ù"´A³\ä¾*I#QŸ¶iHE¹¯›PÈJ„ƒ°aÉô:-Ä«xˆ¬Í:Ýù‰D±téáóH© É^•fY™€ž­ñqFS+`:ðƒÃU§e'Î)@ЩЄ‚Æ´£|J@déàˆB¯Ž &Ö«@8m ì/~ÿV«Nú'ºññ‡ÐHø¸Ñ@:ÎiûJt•0 $ Px·Áí‘H# *Ÿ<1Åà —¼ÊðÄš—BKÍì-ØÁ6à~ãÜCÃH$ $Ü¿FÈãGê#3CiÄI&BÚÏ"av¢ó„ºhÆ`¿VûýÃÕÓÆÒ·¡hZ|jDŽ•X÷7±çïqb!šC¤§´PŒÑ±"!ß‘LN’ÍÖ7*‚Üìî"WgG³7¯^Ïg§lŒïRw¸®™¹Á”,9ó \ÿÔÓk‹ç$üæÉláì/É>Óúß:}别”_øFp²jÁ}Θ4X)‡-ñ¥KºIòraÊÍdmDt -€ -µd¦M"rCï¦A*˜ -¬\ñJ2#™,”3¡Å2;¦´ôƒNØZÖÉR“O:x!r„¡‰*AÃJÌLdö+EÕÆ?hô!ƒà(!Ó9^*÷éþ05$’„£Ãeæìañˆ=ÃùÆ0i ¬ˆ¨ÓQ‘´Ï¢Ü±!q`œú&Æ‘•D«Jnž®k|’ÒÂà¯Qî[BaÒ†6GÄW3ùÊ1 g@t{€¢¤òÅëâŠI€]LL%¡z–;Ht¯PKŸ\`¥_ îx$VbkUø‹ÄL>SÇähÞyÊ,¨Ñp c–^\ó˜QÀžˆë‘þÈŒ®~ÚB{K€æ™“!fÌåóˆu­<ƒ–«E‡P…»"Ή†wóìÞjÊM¬á  '!T¢€‚âÇSKh˜§JlÇàkJg‚Ž%­<ú2¸Ïg„  -°ḠÌqÄq׆ÃI ¶8;:—Ik¡óNǨœ"A¨þàBX|–<¯ýIø×ñҷÚy>Z%‚Ø;™ØzV=?¼¿Y=³Ê8ûÄÂdIˆ‚¾q -btDˆÀ*äÜ·HÎ÷28 _9B.C£‹NdžæÌÚœÈhM‡@}!ûÂç•MAÙO1…Ùë çôÌf‚¾—±F5®c0,8Í7"ç,'¨רÙ5r¤½€Ê´â~²âŽÎ’Ã}ψ™(¹gz'´ˆ0³g…„ÚWQqÑ«͉à$x’« “·À¢²ätcŸî¸´¡%–Hé½ ú`ºý$$,cí «&4R!²d5¡Úu ª –zá~E؉„Nâ6ˆGò²)„ ˆ·!úá1Ñ‘lF§0ÒEÁñ©­”]Œ©A†B×RÍ9„A2K  ‚çŒDM";Z­ô­:€Õw…¯8»°q­}®U:ñ¸¸÷5¯çïq^™È(IÛ™0,Qo0‘„s uBäÒçt͘®²ÇÔhAG;ÐY& ÜÏ©ŠÛUD º—ôAhI -‘lÑe]ïê­¢j!óƒ|GŒÄH,ž·N°!.$3§QñBM@ÁÞEÑüUYn‘»¤üÍó­9±‘лêfãáË€+‰†‚öˆ—g2ñ4çFH©v¢@H„³cóôý”Wý˜{ê…š4àÏÚ2ô¢D€2™öåÞæõü=ΫѨl„]S9‚x®é¸ërÄrÀâÙ[‹¡_8KºÜŸ*ïˆûqüí[$ê=ÏÜ"›eëÒ|ö›afwÄÌþÃü—Ÿ]Ìn5´C¿Iœ8$Gœus­BƒB”Î):âr¡ß$æf -¼´ Ö$¦jNÑo.ufÅrÌmöË,]·ßWx%la§ñ}ýã™þµø‡þ~³Ãº×ñ“Ä"Aí>ûe§6ÛrtÝÿØ×?žé_‹èï7·%åÉ}.øáhU2Ì„ƒßM…)9ÿk#ÎÕ‡qßÀ¹úêìõÕåRG¾ûYlKìÌÎG×_ðî­o,ôÎ]Ð ßüýàäÎö?œ_¾ZxÌ]¼yeoÓQú挶ãÕµW÷^\žœÌžÍþ4§‡ó k4vqíï/_¿>Ûé/éûû㓿Ϲ‹‹O>žíÊ&Ñ®^Û¢÷¼Õ·¬ÑÇH>îþÄ–ðÿäÿ“¬¸oë;}ZN ¶’?é¿„²*ØüO?ü>;NßN×} é.?Žo^ɪþßzÃxŸ'äHÆzmÄv¦é§ƒ%Ôúå–ﳯ^<¿ ¤x2ç·÷"¬übï{j^È:ã´¿x~r…Z ÷3Ÿe÷šæ±x±?FV”Of&}•Ofö_ZýOø~2cw7?Þ…ÙèTéxrH}?» ±`¿€YnNHZPã% YZä eYº“5p·­Á{>§ƒ<1ŸÅ7;ŸüÇÙù/gü‘{u1øäÏ4pŽ¢$Vàïs{úÉžZ$híi×ÏfÒàO ÈL6áèÂÿ<~sLÔ.öðýåÁáßÖèáùÁ›ãÃñuÙºï//Îÿ6ŸYrFûûúÂW''WÌlœ_ì¼&ê÷‰,-½4×ÉôÅË—óËÙѯ´‹Çÿ{Eùjvôÿ_ˆ!Ú?ÏÏ.Ï9+ÕÇ—Ü}àïž|s¡#ú×·z§~"ÍtgÄ—cU–Ô‹x,1š³ÙG“±q¬çWgoŽ9äÕ‚ƒ)”g>¡4o](_Ì"Á_%£¹|ñׄ7žÏ_žS§ÿ9¿x£YΫØGf½:¿øçr”‰˜xJÕœk͉5¤z4úGdù?|öp×H aÇ‘ÒàS›†Ö“Q¬ƒÇmzsxÂyû² ú'ιMg£ƒ‹¿M“F¾¹8Ä߬³Ô6篧m~:9;ºF¯ÞÌ¿ý~ÿ¹vÞ—èïó‹Ëkí^_¬x¡ž¤Ôúï„Ÿ_|ùýgoqöoaÊø}<[Ð,Ïþ‹ãOàÖ…ºô†…“z«Æ5ü÷ìõoÀ(w!þ X¤ÔhiH¥º8xÇÁ\® ¬A5 €øJŽÐ¿ºÒf¬€Ính] ‹÷ZWÇâ T·íš“@úmøy#ùÚÄß\aè_žœÿ2˳ח[<¹Å“·Oñûbm÷¯æW³ù?`ÎüPŒí£äc—q©a5.õ÷ʃþA®N.ÿ{‚]¿?>}}Ò±«è}F˵—Íûî}Ÿˆ·˜2o.ƒ×ñ-!ùË·Ì–bvôÿýšàÓ˜[ø¿8;íûw: |{p2¿¼œó ¿ýé=Ïé£ÿšzõý÷Ǽ‚?þsç&|çÛÃÅ%þ误œŸ½oÜB׃¨·}wwH5ù‘Þ$ç^ ˆ[†Œ4lò=ݼûÝ—ÏgßÍtdn ¾ñ„è&n…8ÑÀ|!b0†Øo{ûÿ™ŸÝKÄf_èýc®e6j6Ǿ¼˜ÏÏ´}F˜oR‚/ªcÕ]úRŽÄxfßB_H{ï×{}€µ ˆ‘«Îs"Ë„dôO¤ÜJ–$ÖM^Ž|Ïò:±³Á9Ïq,{TúO¬p2†ÃBìc_ÿúàçùÙåöà µ¢…)#»Vu >ÃÀ¹— ‰Ynæ*<Öˆ#'NAf´TS Ô)«ÍŸ¯¹äÒ9ov‰ý‰i¾ü#½òü)OΚD3Hn€ÿ?òå¦ÖJɈ„ð!ÉÎÞðúuœKhâ‰È´EÌúUäJúò¡ÑWcé_¥­¯‘ÞDkËœ¥—þ“i‹h”Éå _M×D ¸‰-ÎuùWéD~ùÇÁ]ÿjvt• ;ˆ³â308H|´‰â©r¨†k Œ¹æëévýõ%î_Å\=ý“>ëúg#R ˆØð 1àŽcA@¢/´ÓòÙ1U!ü9kÄÔûš³mL[¸fŸÍ˜,§œúcì~Ò ãP º7ü‰†Tˆ{™îlwœá)Íø¦Lÿ3ãÜk»oŸ ØÙÈ[õ³]¤íË™ŽU•Lw$ º†Øy_†¤)ñzSˆœäjtáö¯z>O4úÉWéRA*ˆcˆ’² ýeWé¾"{™.€­œ~ŠoñÍ­ 7¼‰ôò$‡50ÙbŸ­tˆ½„xiŠY'†€h‘¬ )`aºÂŽ½è¯Ýœãpc³å³™B×þX“~•°u‰ªChH”ƒ;éô §z,|_K žP3=1g*¤zÉôÍÊrŒg ßÅ(¦s÷vÀxê Ç«ØñjC¥M×É!Þ•¯f@~‘”‘/¬ðJbD\šGŠ´ kK— Ò -ÓÞdU'$wsãà uÂdÛž³­,„H"­D%D*·—¶b ,_¡g2±p¢×?Ý8òјúú{ß?KT‹P­&./.­zª„ª+áPÉiJè³!½ U†Òঈ…W­Ü>×LM›Ö›£ M[V‚¢%"ƒCÀ¦—À…T¥ ¡Óø"s¿™µÜØb Þé°ìÄ'A*˜:ÍÓ¶§šŽ7²f%^I"bÄ‹„€˜g½f²­×°Ìxí¸M§ê#¦ÚšÑê -‚Gw+8á_è¸åÊDZßEnšsŽHU&l8JØ!1ÂÔ7áÚaZræu²…†‘xÁ“ÌÕ % ©9â22‚<ùÓîHoEçnà»í[:½$|Îôxº¾`lvNx¼1,EmŒÙ@³¼s¶ë¹Ðþb|‰g¹UÄu×DLA²MFò]â‰hþÄ2¡LKØðP×I›â6DNë…ÙÛ!ÏɥЈY*tÇ°¯Ì$΂z¦A÷y m\ Ñy!/cÔjìá/ý*áÚj×â@_GªX&ztß2p!þB©ð b£}g=e™†)eY”xm`Þ>›}‹<ÄÎÊ‚BÑ¡«tÞ=- eRÏ6ñŒ¥(hÔg®ŒP‰à§K÷Rh8ò^£ÎË6þÆÚM ¶óÃÈ6€T -¥—•M ÓDj ,émœÙ Þ锧Øm¸Æ™E>oÁý¦% ‰ƒ„9Ρ"I;}ñ93 Ö#Þþý…¸Áûwh° -üH[D5œƒ-ŽêXãäÊ:àDñ’?¬-¥¨Ðv̹ö)Vh‰>Ë«0šp($ øƒD±ý—'ŠW©£ŒuÁ[±¢`CdÅ@ÕGÀ B„àA¾¿P»•oe»"Ú=±d8»ÍKl -• +’«ÆkxƒxjèÄoʬ4º€ƒˆ\¢ðê ‰ “ £]M_.4ðŠRFÃdÈŠ£*ਰ[cÈ¢Q†nñrX¼Õ G` ʈz[—(@À˜€âÁÌžEvÛ¢äFê–REŠ!ªQ›ÖÍ„”ß‘ûœqóˆ tŽ&!ÈVm ÄäqdgËÈ4çy$ОQR×®8 ï -ÔFÃŒ¨¾Á0Þ@‚«ðG8E‰’è¿dóÊÝåàR¾=_‰á†– Æ=2O¢þÃ~;€=‘bŒ´ð¢9Ò(ÀØ¢òümÜãrž‘‰&f4Nô(ñ0`H©w~Ní°d ÔQxÌ.ô#D)œaRÀ¢ý¸•¢ ŸÆCé+(ŠŽšq­Á ðÉp0D¸7%Élú…Õ›pëÑÈx³Ö Ë0êi~bHƒHÕ%#×Ä%,…@EžŸ8÷€×¢‚Fÿk”a“ü?ÖüG,„b6Ä)haÔ~ÀøvË"d[¯¡bxÍ QHüD¶…EŒ/aÇj¡ºH˜ò;™ýú¿0ƒŠ>®¯àÍ€xÉI ¯À! ¿€2wzf  4. * ±õÉz#?‚Jƒ©wCP„ ½Ã8ÒõA….ýâ›M°›ÿG|m_øRTºL|û _ÈFvëÓ‘ú€XÌýíïp¾)t7]Rm…ý¾[{¿ efwªVk%0õZÿý]œ •BªÂm%J¥T-Ÿvë|ýùîjpèÔU…¶øûZ¥WQ•ÉZòíÿRìÌó¡ÄÌýép`3\K÷v^½É|¥ Ì ˆ£5ÜÜ’IèÏOÜúDË$&´J [> Í‚÷!|ÝUý¿i£Çÿax«cÓÿ0Eãôú`í.~ÿ³œìßG‡ñuC€PæÁ3JŽÿö}ÑÂÌÿc†òÿ‡]ºýóÿ`iüÞk¼¾íÿòUö€­í¥hšT( ùèOµ)ÿËÈ"ÿë?ÍC‘˜7ö-z¥išÒ›Ô÷p2þ6Â9ø–ÿÙéÅ0ˆòƒÍÁ«a#zóû/C;ó?=+°ôC0±P$@ƒÅï×Õ?'ƒÍ·‘™± ÿóã¦զÓ[€•ú[Ž6w« Ø•Ff¶ûÎÿÊክÅvÕæ0%ä?®€ ûOáw¸é@Y:v±#Çq9`½F¨KÔ˜¼üz3L¶¿çÍáz1Û²Ë|7Ù*EóÎP¶ËóÒ ïŒ›WçÕp=Üœ Æ%äÌf«±ó›áúû¼Ù]o†«É“¨gæ€_òÆÝv³ÜntÞ…Ù\½;oñ:Æb¹]òíù»R©snþçèµ»ž÷0i€½ÅB -Mwµé-º«Áy1[¬4;›ÎÁî^ÀÐÇ«7Dé¨jwç4´r4 g[0‡–ew0þí®§2´^.Ø rIÊ‹;äÇÄˉWÖUw64·lõ<»Ý,xô ΣÇÓ"-j¶Yuçëeȼÿ/˜êdp¾æ»a1v¾ì.˜Ö“ßí¬+¬²°ýÙ‚éåÚÍ‚+úbIIö~ SÚüë¼>üÇp&C©"4âÉ–k6™Ï×$Ûk½»¾J7ÃÿÚì¶ ‹Zvç›É9 ¢»V^Z@4ï^„'>æj_4/²kØNkþ¾`ÿ¹'ÄmÆb2ß 7°7†«õrHRýðváÏæ±öai¶X¬:Ýùdý x í¥ÛeçEÔz³î|HÒs&ˆ¶ÖvóZ«á»îø~K\ÒA4¸O9"úÄ}`=0Ò‘‘>”fg³çQ¬„¢Ó -\2ˆüp6+þ×f¨‹¿íl¸bDtu>þWkØ_ÌÙ­JâiŒ@æ~(ØÒdµÖy…†úJ«½Æcä8úà»9<ø÷w¨ƒã Qv¡Dv*èõ{ý"7ÍVKÛٌ۠lî<•ò79ÑÝÝ‚”7ª,€§.摹PmŒäÐâù%Òj—_lET£ÜŽÐw¡áêªM‰ê¹ìöa½™¦xT­A#MÎߊƢ”FÃœ 'Â4ÔhY$£ú8™)‰ #áˆÖ&à‡ªÛRk£µšŠÕĪxk4%LÁ/hÏ'ûî&ÜÁ@Ñ¢MTHg2ü'l‹Âd½éÎû<>´¦Xêö‡Ùùx¦Û˜LRÖZ}­Ië¢ i‰6~­5 °Îz¤‡¼~—ª‘ŽÅTÁÍ*7¬¨âáJŸ“TzVž-zÝYs¸ÜÎÖ¼Š$F‚bF‰Lݶ‚§ÛtÅox=ÍoIIÔfb8¬þ1<ÇÛóâ`ê‘/lãp à»åxq¾;ÿGwÝë¤E~µXâ¡0sýÁ®¯Q^ÛIue‡ÛÎ`õv†*4`OÂC3;°\Ûň¤³t”ì…y7ìUB {¸Îñ²oìä>¨¶œ™TüŽÈ69— -Í0óbˆO˜QQÑ@@#|X4™A0d¼XOøMOsãò~…’™±ÜÈ ’µuì%·Ò‹ WK_í|2gJæ®'’g°ª8eJŒHÒJcó2-Œ m¬>q}wA‡† ʈC Ç Ñ…_.m)"…6”l åH÷èµ1ù¯á 4 -¼‰d§!í7ÔpGoù^ü³2Èd§Ù¼»Tàw»üƒÛi>ÁíûYô¼½Éæ·‹lT¾/™½,n¾ÿN½=df‹ÑÈËø¼YõCµù/ϵ¼9¥0içÛõFçZcDýÕÀ»X½ßRSO>G²„=Ö®…ŒÁp=Ï»»üI±ÇîšAžÖAByŇUš.FNWå´’ ·É/ðDï #»{ -ÿó¿G“ùä|ÙÙ=™-sÈ•y'‚«ÊjB/œúEg;”_u­Ö¨Œs«¥„ -슉ØP§¦£þ\îBÙ¡¦!)®5Po…=m&3±HPîiÍÝO£Ñ†Ð®6¬u9볊ƒ]g‘°KQ`ˆ°êN GÈÍD ¡¾e€­ÍºKÍ… ðAMç\rªT¢Gݤ§%PÒd>Z°sÏ/º »Ÿ—îÊÍl vþf¯¶îÎ):Œxè8í÷ßÚèéÿÂŽo%Œÿz…zóJ#[ Vkïh;ïk¬ÎxÅu7ÀBä¨QbDÿµô®Y…õŸ¨¯.ôù†¸KEÔ®½óá¸+ØPj„”±ä.v5Ä­ö¢KDÿ0,16Ü”w.4ÒZéÅ -=àÈ"KðcŠÐjY¬P›ÕaôýÙÊË«f=&C‹Uì;]²‹eJuˈö¨XofÞår€t<›‹ Ì`Ëcó rà³í €áC|·FXÈ´ ÞæflÀˆàáÊ8F˜ös±ú§®'Pê l‘hïLn4ßx³åj´뎊ÍÖÛÞÚ8Ô•ÀlWw -ª€êM˜¡ œ1 ÜÍL8ŒSa=h¨ 7ÓÜC¤h6sšòÖ…fëïî`¸j` GE!Ô.w˜ ´ÏJ\¢R«•\é¥TF†n‹9LT}dÐÌï…Ή­Ôr¬W£Gæ¨S6_v冫b— 4{Z,û kí±,–ƒ­ŽÈ•èeŠHg$3kîqˆ×a äî|Ϊ äN+] µ Æ Öÿý×T]¦CCäDÂáÔkóþ7·¸ç¿‹ çó¡Ž€œI™Öh¤^¡ŽÒ†~Ü^w¥¥±HÙÞÊ€·݃§¹CAa‘î—P,¨m`ˆÀë,1J:¸‘­­ôa ng-sÖ3·xfŸàÝáè®ÉrmÏ·ŸžOÓ¢œÍ8¼Ž¥ºžN– ’̧ÚÍVÀÅWëá‚”ï5_kóvX¸; ¯7#Ñ[jÃEe?­–¢úzÑ«‚!B47“zw½áÜÛÕÂÁÎÉ|:[o`üÁ,7€ê|zŽIhÆÙþ*ºþ–æ‡+»JcÅa5 -¥O_“ÓÞë\[‘Z³c?¬ºË¥–9ËõÚr¨ -†èõÝßÿù7À¯ÄÓ>؆s–… ‰'l`ÛÎÏG“þ÷d¸ß|>œ Zl½ÓBÉ{ÞF;}=üïó>Ó3°ÆÒLÿXláÁêþ÷?€ëþ÷ù`ìw0a÷ðy¾ØþcØݞφ<ÐuÈ‹­´³ìÿ>Ÿüb¨´—¿ºÏI³IŸ yCˆ0Bœî÷ùf‹yþ·µUçâWr#ˆR8Ð0¤yw²Æù-»0§.ô¶ÞLO€ƒQƒÕ¦Øxµ©ˆ[D€Ú_M–ÚŠ׸µéΰƒ4[I·¬cÎ(Í=h)Ê\ËlâÇaO¯õ?¬&¿x*·Ö,i*;ÒjÊ8M´X*×´9„Ÿg•äìJËž– ¡)Ç:ë‚Ð0Qp„%òÀ{— õÄ{ÓEv®ÁwÙ‹tÿu,Ðê8Ù×ú4-škcUÃ*â^!5Oôƒµì5‚ÐŽ8Ük’x¾8ß4ÇÖ­¦¹Ï½È6®ÎûÀȌ͓áÛ¬F™í¯½î¦Þý×p¥MÎFÂ0•ÞÓŠ³4Jý¤XtN)}ß(fùÛ†"šQõyfÇǾ2YÆ„=ûÖƒ(FWäS}­µíˆáMœ‰†§ç™ÄíXZ-~kýs±šò|¿×DŒl¿szGKªo -ìPÍW.—!:îkaß¾"D5^¸YÌýoÚ0/8Jj.Ü4¨è¿\XüsΤwVÑÉöÿÐf2°ÂûT­7ñ^ ÑPÙ¨lÖø …uÞ|.$úèµVD QÔ~M%šè”¾»ð`øMÑX5B¤ˆ#ÚJ:ʨׅ£ˆKm|÷Ô¢½²—÷!NÙ«éåX…ßÛߨÉ3myCÄb{=$öAtº§äè«iÀÅmŠÎŽ"ŸTG§"í÷•Ý"ããñ`¢ùʛpBYÙû©Å,äÄV04eUž·OùQ²dçÝåã7ÌãfñÇçz8F n­Ó pþ½ZÑêþcx³m&0š¬ÔÂ÷4þ«ÅdŸ 1ø; Ö*…»,<ĪûOÅŒ!YÔѲ;ßIBá;Á`R¾“¨_ós½èßkk}.ì{_nÂy ²­|µ †¨àÃ`úÎúêJ>^ÙÝ'÷uÀzçÉeVåßïøxnº.™Üv[~Òõ®Íáv¥¾ŒgÚåÔM0¯¿Ùn2«m?R*Ò7Q  ^úýëÂOaìö›3‰¯3“t/×™uöY2‰ºiÅ5ºÞäÆ•ûz&¶ò“«T¿àõÚÆ; êƒg€)”,ñÈKySøyÏ_<îì†Ú|»RáËm©4?æ~f¶Ç3Kaä¿î)vfŽÄF‘Îýë[ö!ïí¨·‹¿g’ÓÒ{&¾öþº -n˶d/Fg‚¬Òì Âèý1’›efOñQî{“ÿŽ¼Pt|Y }ªþ—I¦mL?0äuþcü±€OÖ¿BuP5å<Ñs¶å¹œ3cxê¶g–ØÝÕ/öC÷öüwð3‘ÌZVWîÖýåÊämíR~¸u¦:ח߉~¿;ÅOWqTÿf S~_7²š˜¿â“ëAnfIÛ<+×Û6[oYÿpüŽLâú;pf ':ï™ì¼oûu]Ý$|‘ß·«I$â[ÙU¿J¹¦qŠï±_¸^wmÛ0òð⓼¯ ëKÝ\Ù=îaniü23x®[2ùjòò±èŽ…Ö°.Õ×ðe*’_|¸’Ákœî]¾“nSs L(v^â’¼†Ã÷sÄS*7u„=,ivu?õ~ySðu“Ö’Éõ²B(a|ðAz!MÎ,þÞE5H>»R¥$û)ùX¬1ÍóîâÓýLWtŸü®Tªè¦ éñÛÏãU21ø¹ý +Éú»Ë…X(Ð(wÍà]e¿jb£aü2å -ŸÕ`¦ƒá—ðO?ûPøqF¾Ú_±Ûµ™sá^û>Ö°<µ³wù\£0jMþ2ïññ™%|~ødù¼?)W'|ÊÞ• -?ŸùÉOØ—ýZÆ¥üÈIS_‘Hs°àE[¿µì]ÝY+ƒƒÑ íÃêo–Þ{WºÓýc&” -G»™ÄÃæ"ûp½ÙîNM†Y¸…xZ™¸®Z°sîò›3Kñe`Ó_ÉtÁ_zË $¿’¥P‡ÓíÊ-bòµ’bV¼°ÜB0”“þ^o –`.b<]×ËÙÏkŠPLÒµL|•ì£š7ëO>¼ÐóG’ˆám36,Ù­KGþ;Üœ]uoI TØÏ ä0­â)4›ê× -S»täÇßÅu$Ño7³‘úQ¾ʬ#éû¢\ô¸{1¥%‰M‡µü™%ûp3p‡IÅ -¹úóTi´¤¥¨]ù92‚MS¤ýt9x³K9›FÉј%J…Ð íJ•¿Þ—¥â|ûE[b¿Q†²Üfßk4Ò¯_çî™rþçß[v ÛgKöþ¶ÕAWGƒ}ðø`±¼°ú#Óm¯á¯/½³òún¸2 -™á0r؇Bæ²”Y­¾ÛÁøÍcštfIøÓ‰/4®óþQ,_õ}·ÌUrÁmÎO¹Ûk“d ^?²±DÍÃ?xþy'YxZtgVו’Óá³zãÒ=˜ŸY@:5K¥O‡éçÈ${óÌã½Ëÿvµ& þb?„ÎEÜyÇTñ®WÎ/ez1SœŽß¿’ÎÄûW}÷Òᬕ•€*»=Šìþ >_¥ý+ì^Ñ@p÷‚%¾å'ëI¸0ò¼‚ž\üËËú;³p²ˆº½7äævoT•ÚŒ4‰SQÓmÉñÜØdkÏÔ€YÄ«Úí 0ø¹ùb¿(Œli!_¹d$›gaJy? #¢¯Bñá—uÈâ©ÒðåfÞ&ݶæ‚Ú¿mGß‹Ÿ–WúØ”ùË}ØÏ,¼Äúæ)¸nØlLĪ(sÆÅžïe"ÕaÇ~%®V^×Ç@R7Ë–Tr‡YJŽ$Åañã®÷ ºI"FŽbßåËí±{`€QF`Á.3ÉtÛZ¨þN^s¡Î“7{ïlŒ³ÍW©l)¿GrSj°+*œöÊW¨¾Ö¨n4I#àÎÉ–Òà£Vs«ôyi}.Œ_¹YÔì.\ÛvA¹aõˆ±e -»HŒÌ-ô)IÁ"Ð ˆÑæºèr†Gbñ†kµüÌ}d:æ͆‡\‡E›Â›z©™ =x=’6“¿úZN²:ŒH¾ùÍÏhŸØîo@¥sgK…çŠSij’v!Wâ}ñú¦Ô´>¶Qǹí'îdÃÇ”¸1ã·ãĤè^¼PÀCT¶*½—7N¶ûa8Ì ]®A’ÜÆí#~*çoó´Œ:Øã•éÔæ¿&,ræO¤²ù½€ÞÇ%9}RX/9å©…ÃW¥¿J²0«‡%˜]ÆKSaÔúZä'ævð.;OU -ù’»[ô—±›‘ÊÞÅ‹µL"·„])Ò¼Ù‘%확'¶EžœÉFÞ·…QìËW|n¬2|Æ~V¶ûÏÙÅ÷SF*¼ºTgVÿM< *]ÑIê*P"Ø4[|ÈFbÍ1ªŸ…ÑýºÆ0 -v¬•ËR>û>.å3ã晥b¾¢ªÙ˜ošUn”uþd:Õn)Y؈Fœøò"Ž3ÑåêSä:(Ò'Y+bÃÆ·ê\e3eÔQþµû%œj‹Ù§vŒ‚’C!MÈ0?JôƒÀùăU­Ï‹ýÐ|šIz¼dÙ²‘ÖM Ö๑]dG;ü¡ÞkQY’¼É¶ÜX—±s.#Íb{ñ™z¼¨† q‰9 ˆ£ù0œáNû½¤ó•ü÷ëàm¬‹Lò>ðQ¨Õ’üY½üµD©k-fïmP:#÷.?íþën 2w´Ì6g¡G î>eÖŽ§‹Bí:„™[*1T.h¢ñyøÜΡ]þª0…/’îíÛ$œúsÁrþá®,õYjä5 ^jr˜Õ8Ö¬QÑ°º®2‘‹ Ý€¼ç#­Á"Y^š?<"c0è?Ä鮳ÆC=”Ÿ^žæ°.›œàÍcÝ~ô¶¥¯÷í7»Øˆmä™»‚;Ëíßt™Õù<°ðm{vÞ¯ ocÖEÒãýKd (ÄEÒm”×- ð=«÷[éÓÇìC;ò à.6ÍüO†™ÿ>J\–ˆå¯GQKÿ:ëOÞ.E>Q‚¬œ-ùPpN|ý¤û¹–ËFÝUìÑ:‘©~Þ‹Óõ˜Åa5¼"¨S¹~ö®VÁÓêñ3b‚– éþ„Ãð5Ñ}\ü|ÅK©[LŠOßm`8žgÒ«’‰›…Ûw¯?,‡©—ÞTû.96‰E±v„r7Ç$2¯Þ»v}Ñ÷ ÷oJÀù Í/EÏstœ ><¢ÕŸ|¸ÇÙ‡ÂÚþ«uÓW`ÛÁ¼JRRxL?Ћó*Ñ‹O¯ -ï“çK¡a/è·„~ˆYRçW­‹À}þ;3ðª³ü£Läûéû·Ë’½–‹f/î…hö²È.7LÐ {ÅÀ%_Pu¨ ˆÃšó¼ÄˆO…DHI=.ñb÷ë-‹yÚÔ(}ÙßiÜ o…kÓÈ/Û÷çG¢zWi†ãOíÌeXbUD 5–[\ûǨæ9À›ØSŽ_¾Œì -Å>]ÅW öË {èa]ì§*ÐYÛº4ÇÚÅWslü¸‚qUÐ+ïýÈ>|÷78Âÿ•âs¥A‡r±½‡÷FS‘Íjx¾\Á§ðÿ‹‚„´ºŸEoÁ¼,¿±Kܯ¸r×Nªc‚¯(-À‡!¦La>¼^‹{vFBOÅ¿(FºR¡¯ˆ+Ýéùü>×Ç•þÞðLÞÇüƒ{þy¤69Ð3ÊÓÊeóª‹BŠJ»®šáo“cµ -šÜê™Åä‰z¢&WßÛ29¾FQüµhrB&ÇdZ7Ùͯv“ûæ©lrÊ¿Þ@=fr¥Ê&kp0ß“!Ów_)åë:Ž2Jåp•Û]7õÇB­jj À>/L½¾u¨’ØŽ;ÁÂåÐ]-®ÞVÑl%¼h%ÒT'Z¸l‹…´³J¼\çêá€}iÏ¿W·åh%9 f|g!÷uó˜}µÈ@Î,!SÞqÇL“àÄï0G1™ë:úH©­c–ìThòº¶™K% 0—í—×lï™›oJsu%éºÚL×——Û2Ðàó‹¿” ß °ú²¹^”~¢æy ÑPê/úU V:ø\T -s°¹¼zVFpé¯Mçzx1¸£÷L?hÃf“­i`Õñ} gÊ™í¥«úºz/tÔ±»ªÁ÷àÆÛö(]V®•€‚ €`÷þÄ%«´¿úˆROÊ@o‹ÎË¿ðöF èúr™+ ¸+wæZIÓsêEhÐñìJÌÚ·J@®ÎÌ£³+ -P˜US*_š[UBèó»¿ô^i*Îô¢´NX¦¾òd…¹úËîí­*PÛpœ¹Sš4ùVëeÃŒ@PäüÁ÷%g:’1!‚#K9Ðz$÷Ì}öØe@íú´Ã-¾MK’™¾düõ×b HÁ²s­ü­#ÓËû°"Ðçj¢ -43ýÌge@ -öÕáoŇke 5Ï[m0to¶>Ó U ·o•ëáüJs}Íû;¶§¨2Ðúå¶5î ¢Š@;uj!J °`Ûe_y¦´æï, iGçãñ+«ô1Ýs®T›ëçgvó¨ô-è¿{p(½½ÿ<’N(H1ìûÆ{¯ -ô·á²>©-ù?ïÿ’Ê@ï2à–¯Ùu^q®ÅOXh´bz¼õ× Ý‹MYºiÒ«íãkºXFÌ•î.Žíï'½ZÉ~9›fè4æ” }[ý7¬¤¡m){E -Ô sY¯/¬g—AÔ½¦·Ëp €fÖ;2õmc€¦íE· ½¦léÎÆ}ßįQŠ‰YaÛ•¨\]#Pß.+lSžHÝú@K[9ÐÕ$í`Æï½Ò™‚™ÙÎY¬I6n×ë’¹^¾®C½W"iü»L?f½xÚÜW(½ÃWÙÞ¼í²’äéŽD^­rQÛs»þv­øö¶kJú«o®ÊS[Šê®—²§·¼(•Ü&KÎ\Àç -l­7GJf -ŸºvŸ~/Ãs[8 òt¾:³DîÞ+!•ç›M”J½D”ŸV­¦ÌÝcñ^åé&Q«^_®ÉS¦æ¯»\¡­òÛµðçm&µµ©<­ñHÇ#{ÊË—ÛÊaO¿¾ãs÷.§ò›ùµÜ¥øzØÚî¾S*O“ uòÉÇŒÊóœóѼšäTžVÜŸùðÛòÓ›léçÊp§ -»m~ÿ¬?‹.å·oŸ~~k­òô÷oᙣ²§<=¿78íYáíwç+OÝ»O?ÿ:7TxÚ}æêÂ))?>Ý–6wCå§#ÿû·í§z¡øÔòx?èØM·ieŒ­VWŸ÷̽ݎϽ»Oé\õî>‡F#½Ã„VÙÏßµéÝVž¦–Žä’…ÂX`ÈfR±Šù‡p Æ>Ë{œMàJõˆšMÎZÝÎZ‚2¹ ÍG4²[hd?˜ì¯Ž-~j€%Œ¬ÍÚgHd¿¥®SO+Cà }7ѹ LÁ§-rt;°ÇQ’zé›\õ £]×цÏ/[ýÕm»jxå-ÃM]lÄô$b휩ÀpÅ@ƒŽ7U g`aÒÅ%–Ž -PPmÁÎùTúü!%ú˜d®eSH(Ú9<Ѐh´‚Úÿ´<€¢•”4½‹çl™Å¾Ï4E@V륔hÿ*@Cߨý/}L çú¬ô¢4ö«%Ú¿Pb%…/Qÿï)Ív5€–ýqU D£écÙª¢NÑVš4¹µfZµÊÖ”rƒ¶@ìë%ùÌ.Äív Ôr§ÝÝåÐH»‹»+“ŒÃ(·\m?§_9K¼Bâ ïºí"· |Âc2Ðáª1nù_¾k–oÜ쟴¿*ëˆïûà:ènŠwSà - ÎöšgÇÐmæ`˜ñÅ™%µ´ä¬ ó} üsÉpŠp{FóZ œ¹Ÿ6 H|OÀôR©¢çÿ1€3 -ó=ë3š7¬\vºÂý×!‹…üAb˜ -r_Ì àJõE˜/·ðÕŠœoëÔÒZk%É…Ç›nò‡Á§¢;”Az}«rÀþ×ÛÕ,æÅóKSµºÞüÈŸîSAiýع ¤;7ª+Èþqß,Øù›Fq~ §lýxûEww֯ܚ@A•ÔFV쬳8šØa¿ ²ü#ÛßÓI(kAuͶŠ ïŒÛó¾½vΙE Y½õÁÈ’°\—g÷\Î|Šoù¥?ÿ=YÏG‘*¾¯ËŒ·' ?!°\³²J™îŠowÍÑÎîÆÔÑ6õ*vœîஈVpM…m+îJ‡ê®ü(̉ZýÈ©½]*M  HPmeŽ–ýÃîg[wV+™•@삽C~v/¥‚â° ¼:GJV¢tÿ°áµ2ÒWi™Rå·?} -¡…‘/;ˆÅí/jRúž ùÃS²KÇ£¼÷•åc‡t&ù=z!ßuÝ‹:3g~]ÝwÝßDe%ÝEr^ ÿq«ÅRìrÁ^àB¶ ŠË‰XHÜÐmˆWfxC©væû^¸®˜!‰ÇÿSýGç^bÄ=à4XÑswή …i-É4º”- ¼Û^ dÈp~Z‰ù賞2"¦¤"–Äã™EYg­ï Løª†B ÇâÎêòRlÝj &£Ú ¾g’‰%ÎÓË# gèÓ#¹iìBuHÂh„!!%«êûRMVf„=k`ýpWj«tŸ[›†Î/Y?U…Ž×ÆuW_¿/¬ Ï-:غÅc(Kè -Oµ,½:S¥øC0¦¤×Œ1)¯=cO; 3Ö¯Å{zöH × -n”¢DŠªoR:|ãL¬Ò*ïƒqEo!õZYS¨ìZâïÊq…~ßæjš4&7”™óXì¤-†Õ}~4âè2ãfŸ -v`¹¿:sìO.ÅDÌçÊ€çQd#«yl;è±ÑÃŽˆH< 8S±>†AÚ~©2]#Êô”UiÜ/ñûËc‰ª¦u"Õnsd£‚pY“ -BŠØƒ -û%~ô~©É$ XS2Ê•° “TøéÐùÙnÈ8Rzºm œ`­8‘§ãëÓdËš\Ú©¡…•ûªˆÑsÓeÏ,ˆˆìÓev—4zfõÔb¼=Çï;„U9ŸÔâÓâ}è|÷(í¤§Õlg>#ä¥æo•vå?ž'矙­_]¹GºŸªk*ÉÜâåÖ\®oâo2–¡`‰õ{agÅ®]IF«qè£xÆ'G¥h]v[•Q)V?µ8šSàh"(í“q´ÎBÆÑÔ<$Úm=ÕaBÆ=ðØ™ú¡Ï^ ¯ ^Oéc¥o „ÖÅñ{¿} G“­þñ­­ÄÑ}}úýœàì•ô#åh’£ÿpÓö±T¤¬ H,á?S÷¨JŽ•µ–ØØÀüM9eA]$ìAsuèìSGÛŒ>³QYqA äª2YéÞÇÎÓê•Æ%Ä>(œ½d3#k4Ø̸.jÛ¹øVpÏ ŒÆíG¡ìíÑïÇ&¨Ö ã!!ýø÷sµªnCèJîõÓÓ’†nýþQI -Ür/iøö·—gCÙâCKG€õfaWc4f@¿‡ÎÔ·Ø«ChÝ‹¡ùx)öxýþQI ŵõ{ÃRìñý^Ò + E<ù`iؽ¸¡µeá™e/iˆAán™4”ž(Mų̈4|Ò’†âÐ)! C˜½ü$Gö¡jJP)lHš -´žl|wÇí:òìlÝ·‡ô¤(al¾—^£j\> »ÜP”š -cþ\i¹®ÅaÀÓK¥¾I l®¥Ôóåð*¦ç£4þ$LJ Ád rM<ûgY$½Ì;ª·½ä¤’{šªÛFûEÛbgD‹úÙˆócg›Óñ³A²ÚÙ€˜’{kCÁ·ü™¸Š&œ÷ú4‚oÅáÓ±ÄaPŽañª‚ºÀ„„+Zâ|9{Ó1¹¿Z˜WÇ‹j>µsè´3èxíâÈ:í :„rŠ:í : ±“äÐigÐíd ˜C§Awf9MÝPIã·<>‡N;ƒŽ¹Såø:% BB¶àA9tÚtìêC§ÝŽDªœ ‡N;ƒåþ)rè4ãJ.(>=C²a]° ÅZ$HïÌf´£Ï. i¥g‰#=Ù ¤î¿Jd¥š'¿aÕ‰ 5îé<5äÑäáɦg&Šº1‚'¹ ß3s*¥‚íœñ¡7Óu =I»rËì…~ƒóÓÉ›ctcÉn^íùiIœù(?Ì1ˆt…!É`ûì¯Ù#eN§dŒ`ŸÝ«ý½~r‹¯¨ ²G(ÈGQpkzz ¸Ÿ=FR‰ÎôrÃdáû‡‚`ª›<òÀd7ƒ#žÞâþ®*Ù2‘¼WÌP3 ¢Õ²÷"Lg’l#6$JMšÏ6kÙ%U"Jz6¹ažÜ½xÒr0šçURL9³w’)׸[2ÀÈXâlû’æY¶ŽãìL¬ëqËèÚu“ ÊÇ$IO¬¦Ñµº›S!L+ ìU”B|lŸöÅk5”ǧ«{Ý,§•ÒùRÆŒ“k•Aé_G!’V <¿x†šbf=5`<¾¹öm†×@ÙÉŠ9˜TnAËý=:ÓI‘‘wE´>ÕÎt¢ê÷ØNÎÌ>“T 8c:W!èaLz"Yí„:mRêLHUmT:KWt“v¹Í®¼5w²å”b®ôºÐe8óG7óq“ÖÙÝF=âØÕ¹ëFÐU1:÷|a5І± [-*aå4sFtWH~2¢fñ¨GDT ì}=|>}ÊÏÅA‡QñÆÝ£¢¹T ìsu•”×"Y»’~_÷¼R=²*×#uÌLõLŸ¹É0%•w&ã;j*äOõ˜ôd ‡AIj5²ãß7v«ž>fO6£{–Ù•êxÚÓ½£ê¹ÒÎSCRóÈ‹o/ºüì?$µ »½<2ºIq†=Wác;q§Î‡#þ±Œ¸½ -É6T·;è’½óᘽ¯:w¢|8~WJ2âx(ºùpÆN}™|1^d,_¬¤>g6 -Ú &‘ß¹dØXL¤HS’v&’8,sŒ×ßµO¬´s•: £×je£3ýìq­…j/Ef>8+M%Þh&ösø]¤2Ë‚lu‡˜‘ˆgi¼³‹]}é6ìœfâ2ˆ<«ÒÛçöˬ2t0Ù„,õmX|ëØ9:×Ê9VÏÚAÓ¶aGÕŒÞCG)~’Û€I?ÇoCèEº º»ƒég[ZíÌ‚ô³¯j¯Úré3z·M)û¥É8?—̇…¿éæ$ ï¤Sd¤¾ý0#:;UFêÛßI2R© #I7º©Ý‹÷ñjôâ=EF*ô£cCËH…~Ž2Ÿ8niüh=—Ù ²+S¥4¦±$߆q»{gÆíº·š܆û¥Â霋(ŽóŽòÉpÚ†û©p*÷ÀŸ8ÎÆN -ÇØ•OMøCSᔽ®©?$îÌ¢©” -·«ªåVç½'»4bœ‹8Dâȼ:•Ñé›Á3L9Û·ð„ªo;3p‘¡±ì5¼³K|Éð¡w‘6ÕémZ·ób–Ÿ†N[8ìÞ¦EòêŒQ„–p`=@÷¤f©™¢`éH*†GF¯£Há¥Ôie|›\½¸ú¸ú¼z(L©|ÎwýX¸^· -iWëájñå -çrÚÙò¥§·Ò€¶¥. -l¬ãîù“; -Én·iq.–,Ùí²óÜ»¯$ `@Éñüë³Z²Û“jÞÙjû§TúK~çDîË’Ý"MÇ»Z²›f†Ý2  -¤Xùò¥­2×ð¥­ÚóŽÕ’Ýåâ!Z"+¥)`k[Ä*”z•'»a‰Ë™J²›C3Ãî¢Ô—C”'»Õ’  áKKð¶ð¥–a÷©™aW6‡Õ–ï/_T€F+–»ÉMW=î©àÛZGh±Ø.I×ÔÌ\WÀ}âVµu^ù ´\my¿vþ/g<+kGòÅvZºâ‹MQ0ëç <Ö†?ÂQ§yÍ^ý[Y˜¼3rHOˆ -JáMÒ;U çÑ\¸ªYä5Ѭc¥}™¸á!åW{Å\ª$çR‰¹:m%9%ïÒn¥<ݲ#ñ$¾ôÌ@Ì•F]4¿Î-âò¸¾“‘S튱+ ‘3$¤&c™ÂzxÒÓd·œi•¼Ó«>«1$‡ÁA uL%–)µˆNž1÷M*⌸ÁtÊÜ‹†:¶Ì$ÿE­ÐÝ^ñˆl:žÄ_|Xµ¬}ËÜ)îy¡»ƒœ1â2w‡Ç'ïSæNã–¡ÐÝE¦ÌÝ~•&-sÇS²±(ÄCÊܽ.n».!"_–µåY¤ã÷ŠÉ¯»¹¢úJ7L-n?:—gY3‹¡“ôhÔk]Û+©H#‹óø|’_(“•"ÆHòë™âê»Ø9.ŸHâµF¹c(ãoÇ -:6Þì=E‚Ø颡Z§Œ†jí_ÖU)ó‘l½ã3’ØÏŒôs`N­4û û96šéE-ˆj¿:‰Ž M*ÖItœ0±Ö3ûEœX;°^i'!Nû‚ù‘üJvF¬1$’]j‘{ß¡Ó*E‡’¬ -ÁEuÊb¨A_sÈc¨á7"Mª®?…ì§#kTñv -†Å +vÇ\ Ê|<ºN-)¼æTíeCü=ÅGV“~N’Ï™Ðç7Ø4±B¯(rKÕmDÃþÞÿ„u/çN*ƒíOg! &2t˜8Øc·¡^…»³}¶áÁîvëVKkÜ*:¥îŽÉ|4^áN§RÞ ¶V¸;Q¥¼“ä%[áNÂajÜíÓ™z…;Y­´“$ÖRrÄÇö¾üXýÞQììÓ@.¬5‡d¦ôŽr0ØÖŒq2žùx`b­4Šôs|b-ô¢`Z+ÔI4ÐϾ—T)qKìGý^¸ý’˜ub÷Ïo÷캒Iª”©¨×glÆí:)+JRL5)çsu`“âý0O'»xºB³]c†ƒ±°3-³]×o)ÅØIL -Cq»×€ ¯“Äd»êø4äþž9®0$!;åÑÌqÍ{=;ŠaÞ«[óCѭ檪áó1åw$2{úV½©aßryo@O3žãš÷IK=3–ãš÷¾›Oc²øCH¢§øGñMýW,’g¬Ü£è¦VÍAWî‘å–ÂþõûJŸ%x\¢Ù0¿Z¥) “¤÷Ž<^JÏ…—â*“­„®ó9o?ŸÏùjx“JkÉ ËLŽ1Ö»$«ÃÖ^Î^•óá’¦W2w÷ñ†ô$Q’çJôïDixò:l–¤i¡–„§˜ùÇVþZ_”>1ýÊrÿr÷*@×’,19Ð/T䇑ºóÄD@åuØâ®5Tžš|ú®'d©i¸. ‚/쪩i«í¥ž„çJ&~Õ+ΑÚz‚çJž†÷ªUüí—Vê/-d@ cÁZëÃïСVÞý“:ÐâíkYtf!G°¤x¡èý)ÁÖdÁ“O,ÇV_¹eÂPÁ·ºj;6“‹ÏÄl0-Y1Y+(ÜÆ-mgrÑ©æ%füÉ%y§8É1 —ü~9’jc<~LK6¿ôBaä6³FAçoXÿNË Câ•NŠÓQkºGTfy- ­Ruçò_öWš:ž”«ÌJÓ«b<+M/AA…ž”ºBù²Oœ–Æü4¢´”¢µR÷Šúㇴ›Å©§e8ëŽ÷»_4¢´2Ìh”*MHÙ•w±Ã®žÝËý}ÌJÖëGñèãKÙ­qÊ÷À<Å+=·>Ó7€?Š'8åɽëû(jûµ úÇ`Í9²f£nˆoù›*‚(vÔXàAW6*S²Vœ–á’ÜœRÝ£$R’5Û½¨k_½kŒÃôèí©ld£Îà3îà’æ•ÀF’:¼Ý‹õË®ŒÜ<$õ©0÷B ž(²ÄËúee úÞe™hÜ÷ŽQãitc4‘ŒóÁj¤~hßs°WŽ•žú&ñƪix¡4$ÃÚ¸8#JÆïõUã”e)¿?"•3f9Ó)ijG*gÇ£oYïL7çg·+å›Ád.Ôc'é?%ÆÔÏÀ˜zbÐÓ-òc|\A Œí¤ «k‡z9€ì‰ÕA‘ñŠzª»ÒP Ñ@UmÜP Ñ@CþdÕ,@£9k`#‘h4ðì¨,@£+ÄDCšh4Ptþr@ Ñ@‘ïâ€,@É„4r•ldãY€Í„ÍάK⸾_Q>R‘mnÚÃô>¤(Ÿ¢îäEùv½pÿŽ¢|"ÝòßX”ODÉÿÆ¢|\>ò¿·(Ÿæ]j'+ʧ*ÅNZ”O_S2Š§zðMMwn»J¿®Ÿ¶•«u7Ô>uý´«úæn¨ßë“Ý ¥Y×Ïp´íQuý„¬;¥hŠ=ï†R­ë§=!¹öк~ÚUý̯ܩ맳¢9¼W]?Õãpž[ž¢®Ÿ -îت~GgrQF.—bî :¾®Ÿv<“Àù«ëÇMM¹ªß^~Kº~Úô)­ö{x]?É„vªú¡ªX×O{ã*çWž¨ø_ÕOŸ’ ¦iVõÓ¨_¹W]¿ã³ÒŒÔõÓö/pÙµÇÖõ“ŽK~yH´R]¿ýiìº~*½t:«¿_]?í^ ÔãÛs*õBhìuý¸!)gáʹå¡uý\šUý„;ˆŽ«ë§T ZÉhϺ~š¨$ÚÅ)êúñ׊Uý”Sä= µªúí••¦Q×OûôB®[Z×Oe\lU¿£ö~Û¨þ®_ï𼡗]/Üaýh_)°O=¾Ã‹s Ù»uýÏ{Wõ“ßÑ}h]?íª~ -öËAuý´­2í¬4ãuý4Õù<‰ˆ8A]?n\ÊUýöÒÆ5êúí¡Q×o§É&<¢ß7{hÖã;|Š{M(UاŸ¼3­ª~{Þ¨£Z×O/óñ4uýŒg¥¬|ñNU?…Ìúƒêúi¡·6íU×O»ªß‰êñ¼½áغ~Ú½ˆêñ_}·ªë9f-¾£ëúIN• Ü.߆ÆêúiûµÔo¡Ù¯®ŸæÙ\žœ$ž ®?IEß©øž+ã9O»uý´Íväɧ¨ëgc'¨ëÇå…*ðÊv¥ -ãÒ¨ë·ôà!uý´«ú)Ý6H]?µd6JØ•E׉QÙ[k§?2'ïÇ×õÓ>±Q\—êú© bõ³kÕõÓNˆ=ÓqOJ×R½®ŸvB¬,‹óàº~JC’çŒZ ƒõ wG8Ôƒ¢ïæð2’AïS[À›úd®]Õ3L6FQ½W -­’¦-Ê]ZR–U²íí¿’ua3_7Œ¤ p)PQ±»[ €a&û«ckòøl7Þ@=fæšÔ׫½ÎšœãØ/>%n <Þ„²¡°ký]õ-¶][e9Ó¯æ— Suã0eKMßÅóG8nn=^,Óy«n~/=áVýï32ÔÇ™é×íwmØŠÅnß*µ¬Zß÷“Y»ì»ÙžY:Ÿe‡ýó3ïrü<‡~î~®ÄhézÉlV––ݶZ̦‹Åpá³øÍß ÇK½ßqÅ\7öÔŸù·îXæ…Õ*o˜œïå»›¹ý`Æ_ò§SþÒÃcÉ_¾\ÜbmÁ»ÛïÕj’ö¬¶ß)ÛÚæ¾íáÔMl¦eê¯èºŠÞ¾â’˜HÚ›¿Ø‰|®ÖãëK¿ïn¨ÈŽØu!Ù¥©õæÌRx)e륫ìUŸ$˜:‚¶Ü_SY3*Øún›ÿV™yøÖôx[s©Ïtûå5ŸYœVËSÃMÌr–F«|mûjU¯‚1ëMØÅ'‡Â2½=‘ºõÈÂUZ_”ªÓjòîÃÎ&ˆ–»•t7åÅÛ‡ä½J|«¨N°þÖœ05Aúˆ1‘ŽØâÖ,>æþ:ßÆYpÅ‚=_®HW2ðÛÍufÔ~¸ÍVÂ_°.®Xè*]Š™›ƒüûõe…Ì•Î=»Š M“Zx©ò£OX쮂۲-Ù+Õ*Uüˆ'ó“®ÂÅ™ûÓ¿˜ß÷4õП•ÛïëþyP›1"ÂC,¾K¯+uµ˜Òí /9®áxû¥C~_(è _c™|»ÈWØÌÍ?øšñ0_ß×C7ù0'“_¥OÇkÍ?úÈŒÏ,™DÝ´‚q×ì®bç©’­=>¾ûv{œh*îÌþ.êkò@<ƒTÆ-<±UOqJ^уSàóÌB Rîe~ÌãDˆ)çþÐy{ëÿÖ¶÷¸Æ·nñƒqpÀ?ð’äHªbÎø™Ó3Uñ”øˆ"¸£*é&~½÷Ý»ð¢ç{7Ó¤oŽÄY¢öGè…ê{®(lâÃì§_ªŸ®Fñ+…<™¼sß&ÝbZjòqë¤df ´ÃÄë?<PÚ‘Î$Jï»mæfÞ±3Ûèê…ZÕÔì}¿p+`^ê:’–ähG¥”4Ú£Ròóèñ¾~Å÷˜ mæaùý%:ζ¶æIñeÐðã¬(žT¾ÀêþÈ° ÿü(éÄÓCP˜8hJ…t¤Ï-Ù£‡ .Üç}øÕÇœÂ'è»÷îÀO+ÞCDv-ðS€ÿd:(&~‘y¼0ý”Ï>Yø÷ö‹Ÿÿ$¢6ú‹þ˜p£y ˆ¦fvWNBÜ\^ØÌ\¿Ã…]IÏZ–¢;æøÈ$ü³˜‘€¨c!3!áës`åu*ôŽ;Dê;üy~´ã'BcìgZÜòfÄß‚ÂxøÑÜ—¾:Ïù‚+ê(•Š7(+ª7¿!ÿ°^Âïýñ=$ŒJ J6¾ZZD|“gkÆùf(˜„OÉëŒo½LŸYû,l»;E¾É3fæ<š]°ë_ÆÉæ`¶u÷âš°:פó‡„íEÛ‰¦ô¶Æç>ž8ßØPðe'<™…¯'Ã2»­ éÂ?váe’ uTÅ^€tVÄ"IÎ3jÇ_}JÀRßä«(·í‰½æ1!wlƒ®òšKü[Ýå!s©1TM¹ÇW¾Âurá—ñUÔðf¹ÙżDyÌÕož:m0,¬\¿ðÒÏ«Ëï+g\¸j7¤˜4‘è…+—ˆxp°Ò¢\÷ùC½2[?Ë<Ãu¡ošù­÷añÐÿ¸Úq] VâÜ«¶ô×ímÝ÷=r%Ùïååþö1/K ü"iX¡f‚ê[÷‘¢Êùª²'[t ñûN•?ž2üêÇ–þ²ü`LáÒµÙ±r+¾{Ks:¢(w¾[l¹ü×eW¾þÖµ ëñØ•}óºL¿o,WŠÄÙ"*›y-¡È#¤¯Áºö"»Ùãã4ÚUP^IyD„rM#QÊo⇽¸³ÙůE¤[=;ìEÕפha–×ew!”¸„¸ \Ò zËNßä²ò#‚ÞÏ+ƒ'÷ñ³º±+viýt¥TBƒ„ìfýÃMÕµ3+êöUý#C<Š2ôK_”‘÷â^¯aì¨ú‹‡È¥×IJò4²Dé5¤äý^4´$+‹QnËqwƒèPcð0Ý`µl4³Rt¡Žì%i¸óJ”5'‘4E´s(Úaûäqã‚Û-·“ ÁqbPßRN‘ÂN\cæâG´°æ}aÒÛÿ˜~‹nc¤¹µ­‰¦I~3mìk¾‹ÆNAgÙ¬dY÷ÕÕÂ)fÖÄHz˜ƒ3 ús*´=öö"¹*ÊdÉ™ \}ëN9Óé€*=•)ÁŒx ·@ËèfŽ§Õ©6'…o⎧\x ÷[çûíyå›ÜÍ]‚ç#îÜÖ¯;ç ãMä[Ãk¶ˆ[íÌ‚ðj²Ø%ëv›µoÅ~&r9ã躢o–3óèìGs£“q«ÙÓ¯3‘ Mn]‘»){A½¥è…p«z.p4ÏÒ;¦ÆžL _‘¹Fl•{~%x"@í=sóÜm,Ëo«|QK b$Ðã{ηèx£@vÇÛ4ºäP 7ƒ1÷½}qHú$àx¦¢L¼ÜÓ³GéøtΡÀi“ ÁÃ#ÊÞ¥F–DŒ\m8ÚßšœYLÁõ«•G‚¤ã KØ9GGAåÝ{ñÓæPàõ(ÑÇdž¤„ƒÇ8¥BJÊ]°G -äòuZ$qJzÔÈFŽ>¢[â©÷1Ó W…jm)Ø•:ÓhÇ}®³+Á:w¢Üç¨zšÕÖâRì@Š²új£hS½it“·B×w°ÌûIcª£ÐâOs•"]¬/Ê•œ‹¿õÏùº -ü‰Ú•scë‹Ò%´´o _âRÝOÛ‘46üÚ£1rú¦ÕÁ˜f Gc¶oû±4æŸ; t ¦±.ê.·.™ŠÇ°3ˆW ±CVƒ¸¹Œ.'£]ìtQ®_8u1¡5†rÛ.â|)ftå¯2*Õ–óÌ"_ò8¨»ãµÇ°ŒË ›Å˜áiTÌßþT)άÇC˜ãöF%\§”Æpf1¼7*é&­3†UÊGñT‚o;)–ÈèëÔ'*­1ôÆ.—ê8‰¬6 -¶‹%µQÉÆ@<$Ï1ÜOüڨĽ¯)‰úá¼á-®<†t5-¡±~å.#þzßΊ¿¾¼æD -¦Ãì‹¿z‚ ñ×p<)ÆÖ]‰ŸWJ)ñ×ûzZüõ¥™í?eÅ_g9ÖK¢ìDÓ%‡,¶Ýr=ÿ~ Z&s„Êxx·ÿý¾¬YcHtôÍZ†¤«Tû¡õA‚!PìÞcœ’êÑ·øÅ?‰4ò1\<]%§At=Î~b°¸@/.p#.Í┺,Å6da‚ÞxìÑù“žšÙÙ“Š»áwàÐÂÏßÅ¿Yýzˆ ÒáÍBP'‚Âu”3ÿú"œr¹¤.DiT -ãŠâÐòu¥Âg².­%zܼ™MDÑ®¬Ø‹Oìýù ä|×”»cºAHÐ?lä³Ì]Ì">M=dÎ(„îDñÔÿQ|ž÷µ(Ó¶«§õÎg-‹Ê¹Ã?²—ìjÒÁѸї@ûköׂ‹‰­cÂÉVªL•0F±x¹"giT¯>ÈÑ…¦'ˆîgéÔšLgÜÒ9 b˜ã6îtꉡÉk%cïËÀ2@GõúJê¢1¢‡š¶¥eÔàülÖÄú¶V@%—"Õo†CèS*Vê¾ïÅU–vl0«M7Cé{&jÎo÷¾ìzi<×¾I(ŸEŸ~”þüõûÍÜ^<¦¯¶Õ¯Ìñ d%wtøn,aÊc 7H@0©w ›LWÈ-ÕÄy bvKš»¤1ðâØ&÷ßòÙäþþ¹1¹ÜŸ1“ûæ©irÝ_MÙe?%LîÏþ?åL`qgáë `rÓ¥[lRÁJø´„½TMîÂ=pŒ–º5y¢ž;“'KCß/ö$| -ÔJ{,›\³ <ØÆÓø[ðûÂ&Wß{ÍÀsw>ŠØÕƒ´I -{(ñ %qÜè,–‘„ha -Á¢ÄHÜ…˜ájEvšT8ËfÊy·pàÉžo?½rQEÀZH¶àÛŸÂY“h­¤SÃ+ÉoÙ@н|ìŽïþ¹%¾¼k“$þTÝfÖªce}Ju[ÚECÉ a/àÙ«z·´GéÄJp+®Mﶂ(Ð``u;Ù€©r•uü"w&1W¬˜È$&ç‹—r‡Ë8âelÙ–þ/FvÉ¥\½ Í™PßôÂKâ€ëün­ù˜0tv6ÆÉœñ3Ÿ@Í¡ØמK.ßMkEƒÀLÓn“À€·ymb×ßÕóŒ0=ñ;3åNõÅ7ZÝË)9À†Ý)]nÍw–› l&ŸØhqµÒñ{ïîÙ+—¤Býb>¥ãDfMñS Ý®×ð\L¯x -¬@2)„¥Âñ.|?4§˜`¥ÜK Âf@rÑ@4rÛM_±„!>Ü­‚è|¯ƒŒ*È>Æ®9ë¨ÉC É)wûµè¯åðî²I¤]†ä#ÿÌŸòrfC^éÈîź{4ì¤íãß| [¬Åü£ö:Kõ-fî–ü]…¨ŸÒ¬çMû -„c密ÁS zš.¤×ähø‰Ñ H (ˆUž·x‚Ãá›ô> -¤ -UFÁq±·7‘%Þ?¯EüM€ÅÈ7v—Ù¸ (ñhJ0`,¾±ŸMEaÎ:w´¾GmŒ˜úkl•¿0gäà¿øö!›™þr(šÆ`Y‹‚:%Q¦ì˜P¿Ã)S íð:kxžåRT¦Xù"è¿À]H¦%ƶgÔaªºÞïC›U‡ù¥•†k0*py9(QåOs˜[v çGåU <9Çí4;PrŸ‰l3L¶ôxǸ¨ã·?µd ·'ÿ%kWŠCý?~Ôãû­8>PEÁ©×¢öêIÿõs> t0õ #Dùò4íÀrG-ôçK&3 ¢$A¿†ð²â8êÉf< “3chlß²óÛØŸqáC¬Ó”ôþV§§(,<|‘½?m¢­2 !Z³Â“ó5ÐÕ‹·¾ï‘%Š†9’W=|ìýŽýRîxf0}aK;°¦@/Ó¶ŸÈÿÀÞ|&GuLþ¾MºÈNÉ"×ìÒEQÒ‘„Í„Bªl1ŒF“Í8ÉëcØ Þn*a€26ƒ#cb–…hjFЉmÍÁ€j—€Em|vmnW¾üØ*)~ðbné€ÿºLev›!·)`M¼ª3ÂZˆÅÌ¥_5Ïú³Ýe»+p£È\FñuA¹Ä0ø+V ˜‹3PÓ°Œéå˜ í4Åʧf.|L/Ë\ü¼P8¹¬IU‰¹{v -æ²IýiË!&nühÕV¢¿÷ UI¤)‡tÁóKŠ€:‘ÊÐöF8†}¢Öç°lÖÎoCТRþ V¿XÖTÊ Y„)0 -Yñ Œž±CI4೓ïú0’adH/C⸠aðdáðרv‘,-I±u <°çã»uìdª•ï}«@˜OçáFpß1™¦âÎþhA “jÚþ/ëçWðØÅãÙúh À¯;5÷(±=æ1sÓÈùÕ‚\‰B§†à‡PܤÍXÈ‚á­Ða98ž,åþ6•‘@¢tÁkªÉøûcJ)H9GŠþ2ÅB@ ¹[5¡qé2ªrf9†sB•ëõœ*\QmyqM ÌÞW%ŸšKOB 3l©Õ¶ ¸óY‘/õ2ý¾ÞP;òÅá ò%"ø-Ý—(_b,Ñ(Ê—òx\&bråU!–J¨É—4¨äkÐaÀÙTå +xõï–/ÚÑ4Ug$_´*•œ†‘`VDÙ­ª…7O~´´éDJÊnøm“Â@ĸLÈÕwY!㸋 ö°lè"=¾<}'Ti‡ñ"ƒÝœå)'ˆ²·ªÆaÚK!D_.Ip´SA4®iþßÎaè¯ÇÚí1fýwsˆ©§ÁvßA1Ìg1<Æ-äŸ ªgñQMORyŒqoÊ7)Wó¸~rÚÁÕ…5™1_Š¨'aB*ôç¶ ¤ÛÁ¬®ûÏ^Åæ!Ï8C“}0vé[™¹Ã;a\ˆê®±s o„â${˜ZÇ\ ÆêüÄÜÉß]q¤T¼‡–¥4wUuEH¼|ƒÑúl÷GÄ)¶JRA;ã¡”3ð™\*'»NW&&ôÍdRV“¹éªü‰â©Ãà?½1§ OxTÐÀˆ"søàÚÆZxøPǧM< -¸Öê12G ÓE>{!rûóá¬F}ãå› ¶6ã -¾eIÆ­“Kk-Ù&å¸CÈ~"MxQs× äPÚÀi'{zl )Nrþ 9Iü¨dð£úG‘.¼z*œã—J#µÑ\®¯(=)h‰É)$TÇFª0éŠ -áÃÂùCÛ<åÌ -ŸŽ^ÒÏl˜Ô¡ª¶ò÷Nþ hÞè JU³,ý —ÁbøÉ‘+tؤk¥ƒL<ᔹf熸wldb½sæz·ˆgë4¹]ö¨…—ªOÎ#¬ÅZ5¿BNP!Òw2ãŠ÷)ÉÌ«é·ºïFt ÃÍ(“ É‘T%ÆÉ}%Æ/‹2©š¥¯•º?ŠôW²á}}˜œCû˜{HŠoÕ•ÊŸ†ä‹Ù·ô笎ÒwÁ±½› á‚D`¢ü 2í¾O!Ò߈¢$1EPÝi¬¨·RúÃÞÕI.Y!°q ¯ÄaÈ~}Õ@~†+Œ4ü2ÙrhØUJ„è]–ªd’Qà|µ`ÛwæŽ%VÎ&`¬z€ß™l~âQ,Ö`k³xÄþ›ͬ[@×g…zØè/-sñN¢ ÄYâD^`Ì·2'Ѯŧzh«pªÄÇX¼ 1J¼¯ïd1J§O²ê?'ˆ±PŠ°@/Ü1®¹jŒ…R„¬¾(ƘÁÑ1J¨Ÿ6ÆB)‚©awÊ % kÝ€òó¨ªÅXøð:ô€Ñ Œ°¸AÞ–ö_w¿iaùûûÅXrñ˜«™ý5aŠô1Fs¡Üö«Z}Eõ½ž0F²8ɽSÌ+r)Jb"f&£ø‚ˆe5Xé cÜ…äÆ/?‡‰‚¢íÚ¸xXdÛÓnrÈ-3…ˆ¬t‡èϪéš.ü†A¿­a@‘+ÊÜ›¶#Qe#œ½Ï0’üSŽrSÕ<ËH67Un/‹²=þVؽ6E¾~¤A£2ѪlD´.vc'õ{ºîæ©Þ²›5zæÄž‹ ãÜã+ÐarEtàø€Q6‹l­4t爛?ÉM¦>0{[T›ƒ˜ÊHá"^ -dú›qœ1Ûñ -å>XùÐcsÍ8‡ˆÕÆQáá–àºʘY/`}ÌÕ Qã…1] РL$ë q¼þìÝÙzWÂ%غîïÓ ô•<È©YÔ,y5ÓJ+-Ï£ìtzH§-wuÝT½d¿€dHà `€Mj­Úõ› â6 HÜkÞßy¡yWç½—'‡õÁ÷fO7Ÿ‚LžyŸøãÎä$uöü¤·&ÏRÎß{㭇ߜnΑ7Î}áÖ{Íj|ójÀƒ×Ϲ¸ñVádvòrs¶¼ÿÂÕÙ2Ó­Ïþqr~ˆ&?x2›œÇŽþðŸ¿_=õÇûŸWœv>U½ê‰'ýOOŸù&߯kÞâ»õžÖ¯¦­ñ«£‹?óÌþxÚ÷¬lþÐtø»O¿v±ã›3žxkÆ«,¼5ãõ¯Þ™|ûüv¯©îÅ3GN|q}҈߶~*k^¹*¼Ûb‡³ÉŽ§™›g6_Þi¿ópr}yrëQñxëoB¾Ø~ª2}ðxòi@çŠcñµ¾…wD,¼·=èONÎ¥×ßjÏqú7 §çƒæó&?\˜–«ÿÝþ¡aûP6û“ƒyúîÅ&?ŽŸÜ¸×¼saúG!&4ïo~Ïö­ædžÛÍ™ßLæýåãg>‡yûíæ%–Ûo½ÿÙÆâs˜æmØ›Üçî‘fåëpó»å·Ï¾òãËšß¡;Õ,±ÞœþòUó;:Gj¿]l¯BþàÚÕ^¿õÑ^?òóå7®~ÿàõÛ7?¹}éÞëÇݼõû矽{õÔãÛ§î^¿ôÙôO]ÿê½—Þ{ó½7¾{ó曇ݙlüå?š\pÿòÏߺv²‹Ë·&?gÞ|ûÚÝ ß¾?ù?ßÿ}òÃíÞ˜ìçú;“ÓÃËÓ]L.ûóÍ›~ýî{ÓË&ûùõÓÛ—&ÿûêÛ—ÿ¸róÍc“!oùùéßí¹qýäçצn¾ÑôÏžMç}ë£ëwî^ûöƒîMÿ¸Oñ§ŸÚwcÎV¬Êg ßDÖ÷m“Íúþ²Þ3¸}Úš}.ÏÆØ»mvÚšëôˆ´ÛÞ×úûÉ»Þmõ!hýþ~Ånwz»`͉§£tü÷ì˯ÝzkášßÜhîýë§~¿?ÙüÒÅÉQ¾eþÒýÑÉ“ÒÏß›ÿe´Íçà_MŽÝ×WN?ýàvó>žé»çîÍÖYŸ|—Vó“²¹ûÎæ_hïí[g˜“ÃÎ0gnÞýáÖRÏ0Í_yöÛÈïœùòÞÑ[Í>ÝþÔ¿…‡–òêø±7šwVœo -ôÆoßûl¶ü³u^Ù>«L{ò¼rôî·~zúËOÿí—»;žW¾?ýËÎ+O¾¿sã­éYeöyIOžWŽœ缲ݒöO¯›ç•+å·?û¼rbû¼²}VÙúwcœWš_ >¹ÓãíçüÍ=øíäÈ¿q³ùÅâsÅÕÇ®‚¼xi¾Wxßøù—g‹ƒ×þwò tæµWž|«Äìí™›oÎœ¾3fþXñÄ_ô:rqrxÜغO?›Vjú[œŸ¿}ú›/>½:¹¾97)ç¿oo–êƒIEþþΕ³×n>œììæ9[¥Zü±}û_l~lßØ*ûÉæ½£;ýà>{¸ýJËä©vó{g¯}t÷ýf·Çv;]jÞÜíwÃüS™ŽçPŠµ˜­Œl<óõݾ<õãÇÿ¾»ËZL¿÷¿>yO~æóÖïñæ¬^‹¿¿õÔ⶟YŸß>m8´ø„áãËÓÓÕæ,Ígg?óykó–Û{“›öŸßd¶bõŒç­gn}ýÆä)äßÞÛù½¿Þ¿ÜÜMç·ÞûûZó:þåí3Hs†™ŸCž|gæÆÍÂ9äøÙÎ!ó‡¥oÞ³yíðòä«7®mŸAš÷ölžCš§NoìòÒ}™þ&×æ9äû_¿±ËsHÓ±“Å3ÈåòôsË]ž\6Š'—Í5¾gœ\þù·›CN.Çf¿õÜur9räXÍûÆ¿}iãôñÿ¾|k¾–½‹÷O~ä8wææý÷Úïdm=úÌV _ŸÿdÜ/iq;¬ã<ñ²øŽÌYZ•›¿Îßû-Ç'Ÿõ¢ùö“þäò[[« ‹/›o½hÞ<7i^î>tôü._4Ÿ¾ö£æS+/^9sóç_.>9Ö‹æÍóŒæùíË÷Š/š·c詵F|Ñ|”ßH}æ‹æóOüÜéeó_4o‘ /›×¾h>¹õ›üóËåw6Ÿ<|còÜòóךß~¿>ý•æYßì—66Ÿ!tüq…'^Êxê+tþÒŒÒã‘íCNóÛ§7k¹l‡ÏGþæÇcƒŸL>õTrþ›õ[O&W=™¼óó©É³ÿï?,þ’ûSO%gŸcõä?8Ù¼´}¹ù«vxtòƒÖáÇÌÞ?}§ýô~uæ‹æ·ÉN¾>ûùäÉ__mÿU'_ø>Ó|“ÞÞù7œO?|}‡_L|ò+lÜèø«ͽúæ²ÿªÆ©!¿øÞ¼åÿîRÿªFç+ç­ÇÊ_;ç•óéï$v¼vÞýÊù™#¾»U8¹¼ùÖöïƒM;¶yryâ+œâ·èŸzô—«µ'—é©eú—ó{ž\6}sûÕ'_ã8:éùékÓO—›¾ù«yoÚ±'Þm»ùûï¿Ü|ìÒÆÛ‡¸ùäyåÜæg -w¿ôµùCÏxñ뉧}~ñýÕû¯¹õÂåsó¿t4iòÓ[¿£s£ý³æâ68ûÊG}Ðü"Î¥'_Ò:=ýÛHͯJÙ~Ikáoª4ØàîäñîÖÛMc.Mîýæ:_üqfþrÙù«oœ¹ùíûÍ« ¿AØül{õÌÍ»oœ˜¿›íoŽlßÏU½ótûló·^Ÿ{ò©ô±ÙSé£7N¿6*}ûË/7­¤ù+Í›l~Å䇮ëóΚ³ÜÑy'ÏÁ››qlÞ»éÿ|õpócßÝóOcl¾w滘tçñæéñÞÆö¦mÜýæÞÃùÇPnüºõû/o·?òøC[9ùöñö'6ïÜúÐÉ·O¶¯óÛã]y§5Þ¤ì¿]Ÿ˜;¯N,:Òþ\Í;WmmüÅôs5Úü§ÛÛñõ‹IüÞþ)éÎûÍ{LÍŽÝ©;ÎL ™túñåù&?35›ŸŸ2ÿ~ïÄæOçÝZÿû;'§ÍŸ€þýþÆäŸoNOÿÂìä>S¸z6¶÷xáÁ¯Þ¸öà•×¾ºñ¯‹oÿvíÃk¿~Ô<¹|æú§G¿˜V¥ù=‹·?#õóÛ|Ù¾¿ygû£P¿žJÉ7÷§?4Ÿ<ßœýP<ùaïŸÓŸ+›Cþ£³¯šóÏüw«'gï×ïM¿žßµßüÐü¨øÒì—`&ß4N6?/žÞüÝÆ—NlýâȉöO´?}}fk6ßLxðææ?üpnû»ò“ó[·å›É¸·ïnža?9qóÔׯ¿òê¿þíÁí×oû÷SoáÞüT±Ù§˜½²±õAã[/7¼>}οÕÆÇŸžšþ4ÝüÒãÑÙW·>{ëØì«Ö¼ÿpvzÙæ«íÙ\øä—»?ßüþÐ^}ý͇ç6gäÊùÏ›4?˜4&Ͻ²õ¦ðë“Q]Ÿ½å“%÷Ú'K^ûßW\¼pñòÁ‹—Ξ>xêþŸ??úýýßüáÇ_?ðÚS×î>ýà×ïþsû÷G>|ôÿ>¾ùŸoÿüåѯ¾zðÔµܸwïÒù›¾ýÏwÎ~sù«‹OýR@ë5‹Â_õœ}îÍï/ßùéîK÷ßøúæ÷_Yø¥²ß>üoó bwj~‹ìPóëòŸ6¿Eößýãxó??ž}œÌö‹’ ¯ªL›~ô¥›~¿þç­cï¾óÑSà;}i÷òWÞycúiªî_=õǯŸº{í“·o~rûŸÿhÞ4þŸÍŸ¬Z/˜mžöÊ¿2ý;_yáÈëïk~ÙíŸÍoÁ57øå›—N½püÈÕ«Í¥Ó¿üÞì·ä&ÿðfó„¿kþÔïÝŽþ÷¥ßÛ¯³MÏÄÏ|r0= Í;~yOæ9¶êÉÁöéêÊÅ#­¼nÝ‚+okýCëÄuåÆä;«õ‘×­Sî•{§ÚßY¯ýpmóÞ?½ý??Áßyãhë)Akä;7f/“Q¦ÿÔ»y=½y}ëõÈ#“ðÿ9ù‡û§§ÿsrnaò?ÿ~u{ß_N®qî?“ËnOÅnŸ(›óÓ¥ÙëÛ—¦Ÿ·>ÙèýS³§ ×þ÷åÉÿ|pzö¼`öµãK¶/›?~üÎö™¯6G™ŸÖª{˜Ùþðʧfš?!ôëí¿N\µÇÍU‹é¼uéƒË—îܾú·GÞ¼÷Ý/l>‰xxzëc®gÏ«ý§ïζþ¡õYíg¾z÷¿› ý§_.t?ÛñYØöÿyúYØã‡'[ß/ßÎËòø‹æýƒWO¾úúôæWßm?•ùvþXòøßçfsþñ?o=r嵋ÿ<ñâ»·¿z÷Ðåùû¦Î¾òå§4Úß|çÌ÷7NŸþ–Ùôùè©>>9û ÿzlº¼9ý‰wáYvóÍßÂyêÞŸþòÝüéÒæ©uvû|þ-ðÔyõÅ{¿MO©ÍÌ7?’ü4{2rü‹‹¶~›<‰¸øÏ»7¾úéÚwOý µýddú©—æ+>wn¢~h^½Øúý ÎÜ\<üÏìSoæOˆ&?cÍNž­3ööZó?lðÁ槨Ï~W¢õqí×ܺ?ËqöÌôÙŸå¸ýjmûÓÇþ,Ç­¿Yñħ9ŽýYŽÛ¿÷Ñþ4DZ?Ëqúù€ Ÿæ8ög98´Ó§9ŽýYŽÍgP.~šãØŸå¸õÓôŸæx¬÷ç u–ãüS žú4DZ?Ëqú»x Ÿæ8ög9v|r߈Ÿå8ýTµÝ|²h¯ÏrÜùSÕÆþ,Ç⧪úYŽ‹ß•Í§9ŽýYŽ}?UmwŸåøÄ'^m}šãØŸåxàÐNŸæ8ög9:6òg9îæ“ûú–ãûÛ¿ëØâg9nv¬z»ú,Ç';¶ùiŽc–ã¤cÕŸ£¸ûÏrÜüä¾'?Íq7£ó³·?K·ëÞúYŽ³O½vo<û³§/Ÿ£8Æg9üœÓÊÏrl="/~ŽâhŸå8}>Öó%ç»èñYŽóïý§g1òg9¶Î–õŸ*Üû³ϖͧ9>ë³?3qó‡?1qkm«ð™‰“ç‘Ÿ];¶ù¦ÔÃÍŠóô‡ëí×É›•¸ùO|ï?úuþ -ÈßN4¿¯p|ú3÷ìÝ&Ïx›àì«æ·Ì§oÓ˜- ÌÞ{þÕc󟺧¯gLæ:ûŸŸÿñhúzÜߦ?ÝÌ_‡i˜~Øú±·=ÑÞ«˜;­aÎ_¹jÎÙß·~¸Þ¾ÎSK³Ÿ›ßyñë­ËÚk “Sæ·[ÿpâ‰õÓÉyl£¹ôÔæ«Í:Àß_ù¥974Om[K[ûþàØl“É7MS¥Nlý€ðòôÏ4—œm2)äì¹åÇÞ<|ó÷¦OÍn?˜ïv§OɺrþÃù¿9ráÕ­óáÉöÛP~þÇ¡[Ç/ùâêkÿ|ùØ“×qö7ïÏdÖlîo¾ÿóÃSÝ{Üiuîq£ýv–S/ýñú±¯ý~áʃsï]»øùw‡gom8òÉ?^Ø|5òÓí×ѾÚþá¹ùÝÕ?¿ûió¦Ô*KóîæyäGó_H¼ùɽÙ+)Í›ÎÏ¿úùÁ™ùW~úÅìÍx·Ž|ýåü«3?4/º}t~¾Fß¼K¦Ùã''§B²ù ÃÙG˜5o©Ÿïû«#·ÚöÉ™Öl¾zí»oýùÖÊeû¶|õÑ 7¶ÿJÚõŸOþpôÚß¿ýþ§VSfßûÍû7f¯kmþŸCÛošÀ³‡þ¼·õŠÓç§æ« Í›‹ÎÍ—_ûôüü«›_ÿ¸µåÙÙùà•þríéÙ¼ãÃÏoßüùÅo¯Ýÿð³¿ÝúæÄÕéŠóë͹dóUÛÇ¿]Ø\¥Ìny~þƒy³º1û{ëÍ9kþôî¯ó+¾ÿèèì(n­.O_Ϙž§š—%6æç©n}½õ[r³wÙÞ=<{ipò3kó½æW¦ )§_<5_å;ÿÆñ­—'ß‹ÇßmÎc7N^¹|çý‡[+’Gæoå:ûÔöG‹h½Ð>]uYX?žþÕsÓ³üÉö[$®¼:½‡Ûçä+WÏ^œ<¯Ü›-,ÎV6Ÿx_ÆäG¥ÍåͧÖZ&=˜Ù;om~ÇãÊì<ÖZÞœÿVÁ‰ÖßjÎ]Í(ó—Íß'qç~kßÛk-³w|¿ù¯?þ÷•¯8Ô¬V~yë×ïÚ+•š\òGÿü­Ùàü—×ýðã¯ï|ý¿ý~àôÁÙÿÛ˜ü¿æÿ^¼|ðô™KÏœ??ùç›KßùæÀáé¶O9øί6^»uàЗ§®ýþøæß>þñ?¿~ýûÿ:øjsÑÃwßypïæÁWήðåä -¯<<™ÒÆ—“­'ÿt¤Y#ýr2Í/›ÝLþÿÃÿÙ|ñèÀŸ6擘\ö¿&ÿã­Éÿž\ô?žÞ8øîÁO?ß8ø]³ýýÙ-¸ýãÏ^mݘû_ÿñxrki®çÀ©›þŸ¿}tÿÎõƒß;ðéÁ“ç6N_8{ùò¥K“l\:;êä…³—Î^8wúü¹ó'ÿ~éàésçN^>ñܹ “Ο>xâôÿ{ãÌÁÏž9}áÜÁ³gšÙ>ü×Èûn®¹µÿ­/.<ÛÜG§GèÜäÿM6›Ü§Ó~óëÇ_¿zðÌdØËgÏxxïÿúÿ¨ö,ÁÿXŽÿ3µ¤Ã.è$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ûÖ_""""""""""""û:ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDD¤>ÖVDDDDDDDDDDDDêcmEDDDDDDDDDDDdÜX[©ÏšüŸ©µ  t’4:I$N’F'I£“¤ÑIÒè$it’zB$N’F'I£“¤ÑIÒè$it’4:I¤†žF'I£“¤ÑIÒè$it’4:I$N’F'©¡'¤ÑIÒè$it’4:I$N’F'I£“¤ÑIjè it’4:I$N’F'I£“¤ÑIÒè$it’zB$N’F'I£“¤ÑIÒè$it’4:I¤†žF'I£“¤ÑIÒè$it’4:I$N’F'©¡'¤ÑIÒè$it’4:I$N’F'I£“¤ÑÉ}ë¯VÚ—,nSóõbv·eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\>ÿ¹cÈq0ú÷B÷èÃ÷_s¬~ôú늌›q­ý戈ȈY<·9Û—®ëdwÇ-mVõóÜÕ-zÆÏ8{÷H./ë½½»{öؾdq›š¯»Cý–õ#înôÒµ†l3ü8¤¾¸å™÷IÚè¥k•öY?“!£?Cö#"óŒïëú3̸û/m¹¸}÷LƽæhÔì¿ï«?Ë»V9z÷qè½p¹µ•î‘Õ^]‘q3®µß1‹çö!gûÒu=‚ìͪ~ž»ºEÖVöØíÝݳÇö%‹ÛÔ|Ý}ê·¬qw£—®5d›áÇ!môÅ-‡Ì¼ïLÒF/]«´Ïú™ }øq²že|_ןaÆÝiËÅí»g2Öè5G£fÿ}XýXÞ½°ÊÑ»C÷è…Ë­­Œp¬~ôú늌›q­ý戈ì›$œ]G2ŸÒu“Aæ–0‡šYÕÏsW·(bm¥ô]¹Wî£!··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{WiÎ¥q»¿î>õ[Ö¸»ÑKײÍðã6úâ–CfÞw&i£—®UÚgýL†Œ>ü8 Ùˆ Ï2¾¯ëÏ0ãî¿´åâöÝ3kôš£Q³ÿ¾G¬þ,ï^XåèÝÇ¡{ôÂåÖVF¸GV?zýuEÆ͸Ö~sDDöMή‹£™OéºÉ sK˜Cͬê繫[dmeÍ··½·q•æ\·ûëîãP¿eýˆ»½t­!Û ?i£/n9dæ}g’6zéZ¥}ÖÏdÈèÃÃýˆÈð,ãûºþ 3îþK[.nß=“±F¯95ûï{ÄêÀòî…UŽÞ}ºG/\nme„{dõ£×_WdÜŒkí7GDdß$áìº8úù”®›ü’0·„9Ô̪~ž»ºEÖVÖ|{Û{×Ú”ˆˆˆˆˆˆˆˆˆì›xí1!Ž¿´Sú®Ü¯=)­ƒŒkí7SDDDDDDDDDöM¼ö˜Ç_Ú)}Wîמ”ÖA‚Í¿ bè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒèd„¿ª³&zB$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ`mzÒIÒè$it’4:I$N’F'I£“¤ÑÉÖV '$N’F'I£“¤ÑIÒè$it’4:IŒ°¼µ•ú=‹ˆˆˆˆˆˆˆˆˆˆˆì¿X[©Ïšøý&Òè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒèd„¿¦¾ÍÒè it’4:I$N’F'I£“¤ÑIÒè$it2‚µèI'I£“¤ÑIÒè$it’4:I$N’F'#X[žt’4:I$N’F'I£“¤ÑIÒè$it2‚µèI'I£“¤ÑIÒè$it’4:I$N’F'#X[žt’4:I$N’F'I£“¤ÑIÒè$it2‚µèI'I£“¤ÑIÒè$it’4:I$N’F'#X[žt’4:I$N’F'I£“¤ÑIÒè$it2‚µèI'I£“¤ÑIÒè$it’4:I$N’F'#X[žt’4:I$N’F'I£“¤ÑIÒè$it2‚µèI'I£“¤ÑIÒè$it’4:I$N’F'#X[žt’4:I$N’F'I£“¤ÑIÒè$it2‚µèI'I£“¤ÑIÒè$it’4:I$N’F'#X[žt’4:I$N’F'I£“¤ÑIÒè$it2ÂÒÖVþ Îì?ŵ¶""""""""""""ÒÊì?Å]ùÚÊXü~it’4:I$MN'×ú´š 9„¤ÞjËt’’u=›Jëä⫾¥¯»ÿuñëel¹»Y;“½2ÏÕ‡qo]·úÑ»/¯qqÎ5ãοžþ§ûô¸}·Yš´sè$it’4:IšœN®õi5Ar: 3:I½Õ<–é$%ëz6•ÖÉå­),{¥ ~VËXSÈŸçjŽÃ¸·®[ýèݗ׌¸8çšqç_OÿÓ}zÜ€¾Û,MÚ¹ t’4:I$MN'×ú´š 9„¤ÞjËt’’u=›JëäòÖ–½RP?«e¬)äÏs5ÇaÜ[×­~ôîËkF\œs͸ó¯§ÿé>=n@ßm–&íÜ:I$N’&§“k}ZMœNÂŒNRo5e:IɺžM¥uryk -Ë^)¨ŸÕ2Öò繚ã0î­ëV?z÷å5#.ιfÜù×Óÿt7 ï6K“vî$N’F'I“Óɵ>­&HN'aF'©·šÇ2¤d]ϦÒ:¹¼5…e¯ÔÏjk -ùó\Íq÷Öu«½ûòšç\3îüëéº@Ðw›¥I;wN’F'I£“¤ÉéäZŸV$§“0£“Ô[Íc™NR²®gSi\ޚ²W -êgµŒ5…üy®æ8Œ{ëºÕÞ}y͈‹s®wþõô?ÝG Ç è»ÍÒ¤»@'I£“¤ÑIÒätr­O« ’ÓI˜ÑIê­æ±L')Y׳©´N.oMaÙ+õ³ZÆšBþ=n@ßm–&íÜ:I$N’&§“k}ZMœNÂŒNRo5e:IɺžM¥uryk -Ë^)¨ŸÕ2Öò繚ã0î­ëV?z÷å5#.ιfÜù×Óÿt7 ï6K“vî$N’F'I“Óɵ>­&HN'aF'©·šÇ2¤d]ϦÒ:¹¼5…e¯ÔÏjk -ùó\Íq÷Öu«½ûòšç\3îüëéŠGà¯ÁY“´sè$it’4:IšœN®õi5Ar: 3:I½Õ<–é$%ëz6•ÖÉå­),{¥ ~VËXSÈŸçjŽÃ¸·®[ýèݗ׌¸8çšqç_OÿS< Κ¤»@'I£“¤ÑIÒè$it’4:I$N’F'©¡'¤ÑIÒè$it’4:I$N’F'I£“¤ÑIjè it’4:I$N’F'I£“¤ÑIÒè$it’zB$N’F'I£“¤ÑIÒè$it’4:I¤†žF'I£“¤ÑIÒè$it’4:I$N’F'©¡'¤ÑIÒè$it’4:I$N’F'I£“¤ÑIjè it’4:I$N’F'I£“¤ÑIÒè$it’zB$N’F'I£“¤ÑIÒè$it’4:I¤†žF'I£“¤ÑIÒè$it’4:I$N’F'#üU5ÑÒè$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèd„¥­­ÔïXDDDDDDDDöwfÿYû4DDä™™ýgyÛçß.k+""""""""’ÙÖ> yffÿYÞöù·k½k+cy>¿i­‡œgx>;I2$N’F'I£“¤ÑIV¤õŠV·„NzeföÖQm϶ÝÉöå‹·¨þÅÔõî[Qs­Ý8î+]kñÖõÝýX}·é{ÝÅùϾ.'kf^5Ï…5ˆÅù”Ö,jnc=Wï§ê~_¸]õãg2Öî– áñtõÖ{v¥ÛóÙI’é$it’4:I$N²"¯¼Í$tÒ+3Ë°·Žj{¶ÖVúnYºî¸G¬ïkïõû¯«ï6}¯[Z5°¶RºViÿ¥ÛU?nq&cín OWo½gWº=Ÿ$™N’F'I£“¤ÑIÒè$+RñÊÛLB'½2³ {먶gkm¥ï–¥ëŽ{Äú¾ö^¿ÿú±únÓ÷º¥Uk+¥k•ö_º]õãg2Öî– áñtõÖ{v¥ÛóÙI’é$it’4:I$N²"¯¼Í$tÒ+3Ë°·Žj{¶ÖVúnYºî¸G¬ïkïõû¯«ï6}¯[Z5°¶RºViÿ¥ÛU?nq&cín OWo½gWº=Ÿ$™N’F'I£“¤ÑIÒè$+RñÊÛLB'½2³ {먶gkm¥ï–¥ëŽ{Äú¾ö^¿ÿú±únÓ÷º¥Uk+¥k•ö_º]õãg2Öî– áñtõÖ{v¥ÛóÙI’é$it’4:I$N²"¯¼Í$tÒ+3Ë°·Žj{¶ÖVúnYºî¸G¬ïkïõû¯«ï6}¯[Z5°¶RºViÿ¥ÛU?nq&cín OWo½gWº=Ÿ$™N’F'I£“¤ÑIÒè$+RñÊÛLB'½2³ {먶gkm¥ï–¥ëŽ{Äú¾ö^¿ÿú±únÓ÷º¥Uk+¥k•ö_º]õãg2Öî– áñtõÖ{v¥ÛóÙI’é$it’4:I$N²"¯¼Í$tÒ+3Ë°·Žj{¶ÖVúnYºî¸G¬ïkïõû¯«ï6}¯[Z5°¶RºViÿ¥ÛU?nq&cín OWo½gWº=Ÿ$™N’F'I£“¤ÑIÒè$+RñÊÛLB'½2³ {먶gkm¥ï–¥ëŽ{Äú¾ö^¿ÿú±únÓ÷º¥Uk+¥k•ö_º]õãg2Öî– áñtõÖ{v¥ÛóÙI’é$it’4:I$N²"¯¼Í$tÒ+3Ë°·Žj{¶ÖVúnYºî¸G¬ïkïõû¯«ï6}¯[Z5°¶RºViÿ¥ÛU?nq&cín OWo½gWº=Ÿ$™N’F'I£“¤ÑIÒè$+RñÊÛLB'½2³ {먶gkm¥ï–¥ëŽ{Äú¾ö^¿ÿú±únÓ÷º¥Uk+¥k•ö_º]õãg2Öî– áñtõÖ{v¥ÛóÙI’é$it’4:I$N²"¯¼Í$tÒ+3Ë°·Žj{¶ÖVúnYºî¸G¬ïkïõû¯«ï6}¯[Z5°¶RºViÿ¥ÛU?nq&cín OWo½gWº=Ÿ$™N’F'I£“¤ÑIÒè$+RñÊÛLB'½2³ {먶gkm¥ï–¥ëŽ{Äú¾ö^¿ÿú±únÓ÷º¥Uk+¥k•ö_º]Ý·¨;õ[®KÂãéê­õó Ïg'I¦“¤ÑIÒè$it’4:ÉŠT¼ò6“ÐI¯Ì,ÃÞ:ªíÙZ[é»eéºã±¾¯½×ï¿~¬¾Ûô½niÕÀÚJéZ¥ý—nW÷-êNý–ë’ðx -m:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$NîÎ_Ó<Ÿû\Þžgû·“{ëiœ'5v?Ùd?ÑIÒè$ižŸNîçœUdMžŸž°Wè$it’4:¹;{edo­,X[!Óþ8Ojì~²?:É~¢“¤ÑIÒ ‘ŽÌþ³®-—1ϽxÄö÷<ÇÚ{?ë=¶ ù¿ÿÇ_i¥gVk+""""""""’•ÙÖ> ‘ŽÌþ³®-—1ϽxÄö÷<ÇÚ{?ë=¶ Y×ÚÊXžŸßob¯ÐIÒè$it’4:I$NÖ[ë $k°ŒÛ[³ÏÞl¿8ª½²Ïåíùyë|ɬ“‹/”–^:]Üfñ5êUnYŸ!û,γçµÚuóš9×Ük}çÙwôš[TÕϤjV‹—·öÓ÷ØïÍÎËŸ±e{>…ýÔ4ªæ8Ôüëû¬¿ÛVÎs<Òè$it’4:I$N’F'ë­õ’5XÆí­Ù§µ•œ=?o/±¶R³Ïâ<{^«}Q÷1¯™sͽÖwž}G¯¹Eõ÷WýLªfµxyk?}mñÞì¼ü[¶çSØOM£jŽCÍ¿î°Ïú»må<Ç#N’F'I£“¤ÑIÒè$it²ÞZ_ YƒeÜÞš}Z[ÉÙóóÖùk+5û,γçµÚuóš9×Ük}çÙwôš[TÕϤjV‹—·öÓ÷ØïÍÎËŸ±e{>…ýÔ4ªæ8Ôüëû¬¿ÛVÎs<Òè$it’4:I$N’F'ë­õ’5XÆí­Ù§µ•œ=?o/±¶R³Ïâ<{^«}Q÷1¯™sͽÖwž}G¯¹Eõ÷WýLªfµxyk?}mñÞì¼ü[¶çSØOM£jŽCÍ¿î°Ïú»må<Ç#N’F'I£“¤ÑIÒè$it²ÞZ_ YƒeÜÞš}Z[ÉÙóóÖùk+5û,γçµÚuóš9×Ük}çÙwôš[TÕϤjV‹—·öÓ÷ØïÍÎËŸ±e{>…ýÔ4ªæ8Ôüëû¬¿ÛVÎs<Òè$it’4:I$N’F'ë­õ’5XÆí­Ù§µ•œ=?o/±¶R³Ïâ<{^«}Q÷1¯™sͽÖwž}G¯¹Eõ÷WýLªfµxyk?}mñÞì¼ü[¶çSØOM£jŽCÍ¿î°Ïú»må<Ç#N’F'I£“¤ÑIÒè$it²ÞZ_ YƒeÜÞš}Z[ÉÙóóÖùk+5û,γçµÚuóš9×Ük}çÙwôš[TÕϤjV‹—·öÓ÷ØïÍÎËŸ±e{>…ýÔ4ªæ8Ôüëû¬¿ÛVÎs<Òè$it’4:I$N’F'ë­õ’5XÆí­Ù§µ•œ=?o/±¶R³Ïâ<{^«}Q÷1¯™sͽÖwž}G¯¹Eõ÷WýLªfµxyk?}mñÞì¼ü[¶çSØOM£jŽCÍ¿î°Ïú»må<Ç#N’F'I£“¤ÑIÒè$it²ÞZ_ YƒeÜÞš}Z[ÉÙóóÖùk+5û,γçµÚuóš9×Ük}çÙwôš[TÕϤjV‹—·öÓ÷ØïÍÎËŸ±e{>…ýÔ4ªæ8Ôüëû¬¿ÛVÎs<Òè$it’4:I$N’F'ë­õ’5XÆí­Ù§µ•œ=?o/±¶R³Ïâ<{^«}Q÷1¯™sͽÖwž}G¯¹Eõ÷WýLªfµxyk?}mñÞì¼ü[¶çSØOM£jŽCÍ¿î°Ïú»må<Ç#N’F'I£“¤ÑIÒè$it²ÞZ_ YƒeÜÞš}Z[ÉÙóóÖùk+5û,γçµÚuóš9×Ük}çÙwôš[TÕϤjV‹—·öÓ÷ØïÍÎËŸ±e{>…ýÔ4ªæ8Ôüëû¬¿ÛVÎs<Òè$it’4:I$N’F'ë­õ’5XÆí­Ù§µ•œ=?o/±¶R³Ïâ<{^«}Q÷1¯™sͽÖwž}G¯¹Eõ÷WýLªfµxyk?}mñÞì¼ü[¶çSØOM£jŽCÍ¿î°Ïú»må<Ç#N’F'I£“¤ÑIÒè$it²ÞZ_ YƒeÜÞš}Z[ÉÙóóÖùk+5û,γçµÚuóš9×Ük}çÙwôš[TÕϤjV‹—·öÓ÷ØïÍÎËŸ±e{>…ýÔ4ªæ8Ôüëû¬¿ÛVÎs<Òè$it’4:I$N’F'ë­õ’5XÆí­Ù§µ•œ=?o/±¶R³Ïâ<{^«}Q÷1¯™sͽÖwž}G¯¹Eõ÷WýLªfµxyk?}mñÞì¼ü[¶çSØOM£jŽCÍ¿î°Ïú»må<Ç#N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$Nù«"k¢'¤ÑIÒè$it’4:I$N’F'I£“¤ÑÉ ÖV šN’F'I£“¤ÑIÒè$it’4:I$N±¶Õt’4:I$N’F'I£“¤ÑIÒè$it2ˆµ¨¦“¤ÑIÒè$it’4:I$N’F'I£“A¬­@5$N’F'I£“¤ÑIÒè$it’4:I bmªé$it’4:I$N’F'I£“¤ÑIÒèdk+PM'I£“¤ÑIÒè$it’4:I$N’F'ƒX[j:I$N’F'I£“¤ÑIÒè$it’4:ÄÚ -TÓIÒè$it’4:I$N’F'I£“¤ÑÉ ÖV šN’F'I£“¤ÑIÒè$it’4:I$N±¶Õt’4:I$N’F'I£“¤ÑIÒè$it2ˆµ¨¦“¤ÑIÒè$it’4:I$N’F'I£“A¬­@5$N’F'I£“¤ÑIÒè$it’4:I ²„µ•š]Šˆˆˆˆˆˆˆˆˆˆˆì­ôÙÔÚŠˆˆˆˆˆˆˆˆˆˆˆ<ïé³ézøý&Òè$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒèdk+ГN’F'I£“¤ÑIÒè$it’4:I$NF°¶=é$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒè$5ô„4:I$N’F'I£“¤ÑIÒè$it’4:I =!N’F'I£“¤ÑIÒè$it’4:I$NRCOH£“¤ÑIÒè$it’4:I$N’F'I£“ÔÐÒè$it’4:I$N’F'I£“¤ÑIÒèäžñ×4k¢'¤ÑIÒè$it’4:I$N’F'I£“¤ÑÉ=ÃÚ -´è$it’4:I$N’F'I£“¤ÑIÒèäžamZt’4:I$N’F'I£“¤ÑIÒè$itrÏ°¶-:I$N’F'I£“¤ÑIÒè$it’4:¹gX[$N’F'I£“¤ÑIÒè$it’4:IÜ3¬­@‹N’F'I£“¤ÑIÒè$it’4:I$NîÖV E'I£“¤ÑIÒè$it’4:I$N’F'÷ k+Т“¤ÑIÒè$it’4:I$N’F'I£“{†µhÑIÒè$it’4:I$N’F'I£“¤ÑÉ=ÃÚ -´è$it’4:I$N’F'I£“¤ÑIÒèäžamZt’4:I$N’F'I£“¤ÑIÒè$itrÏ°¶-:I$N’F'I£“¤ÑIÒè$it’4:¹gX[$N’F'I£“¤ÑIÒè$it’4:IÜ3vµ¶ò—ˆˆˆˆˆˆˆˆˆˆˆÈ¾Ë欭ˆˆˆˆˆˆˆˆˆˆˆˆ<;›ÿme,~¿‰4:I$N’F'I£“¤ÑIÒè$it’4:ÁÚ -ô¤“¤ÑIÒè$it’4:I$N’F'I£“¬­@O:I$N’F'I£“¤ÑIÒè$it’4:ÁÚ -ô¤“¤ÑIÒè$it’4:I$N’F'I£“¬­@O:I$N’F'I£“¤ÑIÒè$it’4:ÁÚ -ô¤“¤ÑIÒè$it’4:I$N’F'I£“¬­@O:I$N’F'I£“¤ÑIÒè$it’4:ÁÚ -ô¤“¤ÑIÒè$it’4:I$N’F'I£“¬­@O:I$N’F'I£“¤ÑIÒè$it’4:ÁÚ -ô¤“¤ÑIÒè$it’4:I$N’F'I£“¬­@O:I$N’F'I£“¤ÑIÒè$it’4:ÁÚ -ô¤“¤ÑIÒè$it’4:I$N’F'I£“¬­@O:I$N’F'I£“¤ÑIÒè$it’4:á¯ê¬‰žF'I£“¤ÑIÒè$it’4:I$N’F'#X[žt’4:I$N’F'I£“¤ÑIÒè$it’zB$N’F'I£“¤ÑIÒè$it’4:I¤†žF'I£“¤ÑIÒè$it’4:I$N’F'©¡'¤ÑIÒè$it’4:I$N’F'I£“¤ÑIjè it’4:I$N’F'I£“¤ÑIÒè$it’zB$N’F'I£“¤ÑIÒè$it’4:I¤†žF'I£“¤ÑIÒè$it’4:I$N’F'©¡'¤ÑIÒè$it’4:I$N’F'I£“¤ÑIjè it’4:I$N’F'I£“¤ÑIÒè$it’zB$N’F'I£“¤ÑIÒè$it’4:I¤†žF'I£“¤ÑIÒè$it’4:I$N’F'©¡'¤ÑIÒè$it’4:I$N’F'I£“¤ÑIjè it’4:I$N’F'I£“¤ÑIÒè$it’zB$N’F'I£“¤ÑIÒè$it’4:IÜgþ endstream endobj 38 0 obj <>stream -€ÿŸ½;ínêLû¼Ý¯Ÿµü ‰™Ë–çÉ£€0! °Á fÌÝ]oº?z *$P%@löÿ8ú*îËòåý;µ÷Fñ¢ A##kÛ÷W×_¯Ý<=4²tfúvç߯¬¿z½ñrèÂÐÈí±¥—¯W·î½Þz¶½þòŸÃ ÝߺyþÜõ3«Ã ÃέÿsãåíÖíñÛ‡X:3ÞºÝù„ÎGé8súÈÔÚèO‡_-\ŸºyèåÝù_nÍüÔzÑž[øîèæÑç'Ž-¾ºñü»Éö£c¿O=´újòþ‰s·VG¯l¾>ÜY?±zvñÑ©›‡µWï??>4ÒýëK×nœœ9üêèáǧn½X]Z9ýãã,ÍÝ}þàðò“³‡Wöo.ýqëöÄê¾Õíñ{ßÏNO.ú~­µyà—öXëô¯#­Ísë'&—&÷·ÇÎÿ°}²µñø·µñC‹·~;|ìÆýsC#‡mý~£ûÏ×îî»·r´½öúUçKÍͶ¿Û>qiéÑȉ‹íµÕ3·[c#¶O-lx1öìÒ½•ÖØô™3ݧ]jX˜í~îLûПڋÇÖ—–Ú{V?ý~æúé™7Ï<4òæ¹g^ŸkŸ[»{íììò“Å'“o~oq¡=úº}òÜæ“w?÷ö—?É­åÇ+¯NùýÀɵ}Ïnêü^ûø›C0¶=÷`¡5³òìäÒÃK´~8~ýÇ÷ž¢ûËŸßË¥Ûkû§W~úó{™\ÛÞ·0¶xc¤5²º92ziñèÓÇWÇn¼Ø÷©œ[|zð»Îûó)æ7Öî>]<½vwqd~ññÕÖÒÕ'{^¶×æn=|¶wÿ§žçæòå}{&Ú6ÏNtr_þµ½újîYkúîÃ;‹ 7î-ýa¢SÿÀ棥ÕÍÍgÇ—/l­´6.NÙsúÄ?ãÔÚ¥…sK[wη¸ðjôòòã‰ã{¦~?¼uaüþžöt÷°›»úâé٥ˮÞh¯Új¿·›“7×é¼H·Û^¬ŽŽî0iß¡«Ý=?2þt­½:}rÏäíã­WËS7ïþ°úÃáý§žo­^{÷ß>ä·+—öµ÷Í´½ÿèÂo+§ïýKÎëeíøëµÉ;Ë×[>Å»­ürmik}}yê÷»?Ý|3+Þò¯{7¤Ý>:1~ûÞÛOë>iw’¿ÁÓ¾ÿ¸ïïý×$ݘ9õ~ß·z9݃Þ=äW7÷ŸžYºvþù‘ÕÍÑ;Û/ºñèßètùóC§þþÙ¿{3@3ǃÖòãý·/µW6Ïv^M­“ßwöðóÄÔïG¦¯¼ÝÍýçFÛ«O¾ûG{mâࡹkû~üuíÞÉ}ãí•åùCûÄØÛy‘Ú÷æAlï¯øØçî[1¿zzüʃöɧ—ßž>¶î<ü¾}ðÒ“£oà±SOÎ?ýË°wN#+·†Ff~¾¼~º½rÿÑÙÎ/?>nýpéâñÖÆëãs÷Î_Üœ¼µµ|~üȹss­Í‡{–;}ñrmßóÅ#KW®ýòdæõñ³{Úù'íË7–žŸ¾ùÍ“vÏc½<ío“KsG~úþÓOûxiíÚÒìü•oòûáÍÓ“#??:9vþÚø¡‘ñ# OOµÎž{ujôñÖ­ã­N]_þè'~ä¹ß‡Õ'{V7çO]ŸÙÛÞ^Y:{óò­•­W›‹Ý £k?߿ݹæ>qé׃­û#OŽw.˜{;''Ó3£3gçFWÇn_Ü¿vwì—ïW7¯n¾XÝxqmíƒjãk“w׎^èœ.œ_<ú||dùñ+ÛÝKÇò©‡žüðîäx©sĦn]¾²ôlõ·#‹ÇŽÿròƒç¹~ãÝ#/Ìür-¼üæ\òæÔÓ™ä­;nÎ^~1¶ÔšÙ¼¸oulýäþöÊâɸ¾ô—¿Ÿ-ÿû/½ž}›¯òé_æ§?úåûûUþã÷²÷ó¾ÿ¾wéÓ—ÿâ#öY#ð º|d¬ÿ柿åôò½|ý—ÿº#Öë|«.Ž@Óõ¿åôü½|Õ—ïÃëa¾i—w#0úßh>ï{ùÒ/߯#öŸGàÛwéŽÀàê÷¾à{ù‚/ß×#öÉh¬Ë§nëÒ¯øÒ#6È»ñO@³¯Êo;=|/}¯:bƒ¼ÿÈ àœüÍF ×ïåëFàëØ ïÆ?A]‘¿Å|Ö÷òÅ#Ч#6È»ñw#0Ðû±>Àç/_2ýÿýÁþ±þÀ±Ï¾wô»£_òqX_FàkŽXï#ðmº úÝÑo9½}/_;_}ÄzoØeÐïŽ~£øŒïå+F ?Gì¿À·î2èwGû?Ÿû½|Ùôñˆý‡h¤Ë ßíë|Ñ÷òÙ#Ðï#öñh²Ë€ÿkuŸFàËØçŒÀ7éò·hüU9àÿZýõ#ð•G¬Çøv]öü~lÀÿµú«F Gì¿À7î²wà÷cþ¯Õ_:};bÿqšè²wà÷cþ¯Õ~zÐOúéA?=è§ýô ŸôÓƒ~zp`õ¿tüô`˜ŸôÓƒ~zÐO¬~Ï#৿i?=è§{øò3üµ#£SC#K“«GnÙsuæÿžèþÅ'oþ“‰áKOÖïmܾyþÒp÷/cyïoE™>ppøæC­á¥¡ßßþ-í­' oÿqyãÁÖö¿þ¾–Î[Ã7O ­nüÏÖ½+§–‡o^úe¸5:3>73>>95153?ßšè<¬ÕýÝ™ñé¹ù™éñùÉéÉùñáñ©©Ñ¹™™ùÎoNLLOL ÿcrfjtf¶5>1?19Óšþµó Öôðäx÷n>ì÷“w?õÝx÷sÓÃ'˜íüÒžêü¿ÎÆFFÞ|ëÝ£µ0<>Ùš™™žºyæÿûoü/"©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²RõKm††©ŸLýdê'S?“îÉÔO¦~²Zõÿ°,˲,˲,˲,˲,˲,˲,˲,ËÚI«Ö^Ð,õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOV«þ–eY–eY–eY–eY–eY–eY–eY–eY;iÕúÑ š¥~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ™®?,k +F¹×~²½¾Pîœ?ð±·ÂWŒr¯ýdû®r£8èb¥¯å^ûÉ>öVø"@¹sþÀÇÞ -_1ʽö“ |ìºÊbØ©`°ÊÕ¬°ÙS¿ÆgOýdÔ;ï%+÷ª7{ *W°ÂfOýB²ï÷Jm¦+ìT0XåêVØì©_Höeˆ†yÛ!S¹W½ÙkP¹úƒ6{ê’}¿Wj3]a§‚Á*W°ÂfOýB²/C4ÌۙʽêÍ^ƒÊÕ¬°ÙS¿ìû½R›é -; V¹úƒ6{ê’}¢aÞvÈTîUoöT®þ`…Ížú…dßï•ÚLWØ©`°ÊÕ¬°ÙS¿ìË ó¶C¦r¯z³× rõ+löÔ/$û~¯ÔfºÂNƒU®þ`…Ížú…d_†h˜·2•{Õ›½•«?Xa³§~!Ù÷{¥6Óv*¬rõ+löÔ/$û2Düí©Ü«Þì5¨\ýÁ -›=õ ɾß+µ™®°SÁ`•«?Xa³§~!Ù—!æm‡Lå^õf¯AåêVØì©_Höý^©Ít… -«\ýÁ -›=õ ɾ Ñ0o;d*÷ª7{ *W°ÂfOýB²ï÷Jm¦+ìT0XåêVØì©_Höeˆ†yÛ!S¹W½ÙkP¹úƒ6{ê’}¿Wj3]a§‚Á*W°ÂfOýB²/C4ÌۙʽêÍ^ƒÊÕ¬°ÙS¿ìû½R›é -; V¹úƒ6{ê’}¢aÞvÈTîUoöT®þ`…Ížú…dßï•ÚLWØ©`°ÊÕ¬°ÙS¿ìË ó¶C¦r¯z³× rõ+löÔ/$û~¯ÔfºÂNƒU®þ`…Ížú…d_†h˜·2•{Õ›½•«?Xa³§~!Ù÷{¥6Óv*¬rõ+löÔ/$û2Düí©Ü«Þì5¨\ýÁ -›=õ ɾß+µ™®°SÁ`•«?Xa³§~!Ù—!æm‡Lå^õf¯AåêVØì©_Höý^©Ít… -«\ýÁ -›=õ ɾ Ñ0o;d*÷ª7{ *W°ÂfOýB²ï÷Jm¦+ìT0XåêVØì©_Höeˆ†yÛ!S¹W½ÙkP¹úƒ6{ê’}¿Wj3]a§‚Á*W°ÂfOýB²/C4ÌۙʽêÍ^ƒÊÕ¬°ÙS¿ìû½R›é -; V¹úƒ6{ê’}¢aÞvÈTîUoöT®þ`…Ížú…dßï•ÚLWØ©`°ÊÕ¬°ÙS¿ìË ó¶C¦r¯z³× rõ+löÔ/$û~¯ÔfºÂNƒU®þ`…Ížú…d_†h˜·2•{Õ›½•«?Xa³§~!Ù÷{¥6Óv*¬rõ+löÔ/$û2Düí©Ü«Þì5¨\ýÁ -›=õ ɾß+µ™®°SÁ`•«?Xa³§~!Ù—!æm‡Lå^õf¯AåêVØì©_Höý^©Ít… -«\ýÁ -›=õ ɾ Ñ0o;d*÷ª7{ *W°ÂfOýB²ï÷Jm¦+ìT0XåêVØì©_Höeˆ†yÛ!S¹W½ÙkP¹úƒ6{ê~¿÷GÉE#jâÀ |ì­ðÕ ¯ýdyÛÁ²µh„sþ>öVøjP­×þÀü s$«5Š7ð±·ÂWƒ¼ö“yÛÁ*´h„sþ>öVøjP©×~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ“©ŸLýdêgÒ=™úÉÔOV«þ–eY–eY–eY–eY–eY–eY–eY–eY;iÕúÑ š¥~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦~2õ“©ŸLýLº'S?™úÉJÕ/µ¦þþ°,˲,˲,˲ú¼üÁ3™úô‹Ñ²,˲,˲,k÷-ðL¦þÞ¾(b¨ŸLýdêgÒ=™úÉÔOVª~©ÍÐ0õ?àmb¨ŸLýLº'S?™úÉJÕ/µ¦þ¼í@ õ“©ŸI÷dê'S?Y©ú¥6CÃÔÿ€·ˆ¡~2õ3éžLýdê'+U¿Ôfh˜úð¶1ÔO¦~&Ý“©ŸLýd¥ê—Ú SÿÞv †úÉÔϤ{2õ“©Ÿ¬TýR›¡aêÀÛÄP?™ú™tO¦~2õ“•ª_j34LýxÛê'S?“îÉÔO¦~²RõKm††©ÿo;CýdêgÒ=™úÉÔOVª~©ÍÐ0õ?àmb¨ŸLýLº'S?™úÉJÕ/µ¦þ¼í@ õ“©ŸI÷dê'S?Y©ú¥6CÃÔÿ€·ˆ¡~2õ3éžLýdê'+U¿Ôfh˜úð¶1ÔO¦~&Ý“©ŸLýd¥ê—Ú SÿÞv †úÉÔϤ{2õ“©Ÿ¬TýR›¡aêÀÛÄP?™ú™tO¦~2õ“•ª_j34LýxÛê'S?“îÉÔO¦~²RõKm††©ÿo;CýdêgÒ=™úÉÔOVª~©ÍÐ0õ?àmb¨ŸLýLº'S?™úÉJÕ/µ¦þ¼í@ õ“©ŸI÷dê'S?Y©ú¥6CÃÔÿ€·ˆ¡~2õ3éžLýdê'+U¿Ôfh˜úð¶1ÔO¦~&Ý“©ŸLýd¥ê—Ú SÿÞv †úÉÔϤ{2õ“©Ÿ¬TýR›¡aêÀÛÄP?™ú™tO¦~2õ“•ª_j34LýxÛê'S?“îÉÔO¦~²RõKm††©ÿo;CýdêgÒ=™úÉÔOVª~©ÍÐ0õ?àmb¨ŸLýLº'S?™úÉjÕÿò¬÷VŒZ'"š¥~2õ3éžLýdê'«Uàʳ¬R+F­ÍR?™ú™tO¦~2õ“•ª_j34Lýdê'S?™ú™tO¦~2õ“•ª_j34Lýdê'S?™ú™tO¦~2õ“•ª_j34Lýdê'S?™ú™tO¦~2õ“•ª_j34Lýdê'S?™ú™tO¦~2õ“•ª_j34Lýdê'S?™ú™tO¦~2õ“•ª_j34Lýdê'S?™ú™tO¦~2õ“•ª_j34Lýdê'S?™ú™tO¦~2õ“•ª_j34Lýdê'S?™ú™tO¦~2õ“ÕªÿÇ.]ô Ö(Ò,õ“©ŸLýL»°ûÀo5-˲,‹ì›z¦~2õ“©Ÿivø­¦eY–ÕóÚµ—!z° ëÓ3õ“©ŸLýL»°»û½žíÂúôLýd¥ê—ÚL¸ õlÖ§gê'S?™ú™vaw÷{=Û…õé™úÉJÕ/µ™þpêÙ.¬OÏÔO¦~2õ3íÂîî÷z¶ ëÓ3õ“•ª_j3ýá2Ô³]XŸž©ŸLýdêgÚ…ÝÝïõlÖ§gê'+U¿ÔfúÃe¨g»°>=S?™úÉÔÏ´ »»ßëÙ.¬OÏÔOVª~©Íô‡ËPÏva}z¦~2õ“©Ÿivw¿×³]XŸž©Ÿ¬TýR›é—¡žíÂúôLýdê'S?Ó.ìî~¯g»°>=S?Y©ú¥6Ó.C=Û…õé™úÉÔO¦~¦]ØÝý^Ïva}z¦~²RõKm¦?\†z¶ ëÓ3õ“©ŸLýL»°»û½žíÂúôLýd¥ê—ÚL¸ õlÖ§gê'S?™ú™vaw÷{=Û…õé™úÉJÕ/µ™þpêÙ.¬OÏÔO¦~2õ3íÂîî÷z¶ ëÓ3õ“•ª_j3ýá2Ô³]XŸž©ŸLýdêgÚ…ÝÝïõlÖ§gê'+U¿ÔfúÃe¨g»°>=S?™úÉÔÏ´ »»ßëÙ.¬OÏÔOVª~©Íô‡ËPÏva}z¦~2õ“©Ÿivw¿×³]XŸž©Ÿ¬TýR›é—¡žíÂúôLýdê'S?Ó.ìî~¯g»°>=S?Y©ú¥6Ó.C=Û…õé™úÉÔO¦~¦]ØÝý^Ïva}z¦~²RõKm¦?\†z¶ ëÓ3õ“©ŸLýL»°»û½žíÂúôLýd¥ê—ÚL¸ õlÖ§gê'S?™ú™vaw÷{=Û…õé™úÉJÕ/µ™þpêÙ.¬OÏÔO¦~2õ3íÂîî÷z¶ ëÓ3õ“•ª_j3ýá2Ô³]XŸž©ŸLýdêgÚ…ÝÝïõlÖ§gê'+U¿ÔfúÃe¨g»°>=S?™úÉÔÏ´ »»ßëÙ.¬OÏÔOVª~©Íô‡ËPÏva}z¦~2õ“©Ÿivw¿×³]XŸž©Ÿ¬TýR›é—¡žíÂúôLýdê'S?Ó.ìî~¯g»°>=S?Y©ú¥6Ó.C=Û…õé™úÉÔO¦~¦]ØÝý^Ïva}z¦~²RõKm¦?\†z¶ ëÓ3õ“©ŸLýL»°»û½žíÂúôLýd¥ê—ÚL¸ õlÖ§gê'S?™ú™vaw÷{=Û…õé™úÉJÕ/µ™þøò,˲,Ë -Xô`ÞíÓ3õ“•ª_j3ý1ð+ eY–eY–ÕÀ¢»ðnŸž©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬Vý?J.Qki–úÉÔO¦~¦rÝ~«iY–eY4¢ÜM R?™úÉÔÏT®ûÀo5-˲¬WÑË(WŸ©ŸLýdêg*×Ýý^ƒÊÕ§Aê'+U¿Ôfº\†T®> R?™úÉÔÏT®»û½•«OƒÔOVª~©Ít¹ 5¨\}¤~2õ“©Ÿ©\w÷{ *WŸ©Ÿ¬TýR›érjP¹ú4Hýdê'S?S¹îî÷T®> R?Y©ú¥6Óå2Ô rõiúÉÔO¦~¦rÝÝï5¨\}¤~²RõKm¦Ëe¨AåêÓ õ“©ŸLýL庻ßkP¹ú4Hýd¥ê—ÚL—ËPƒÊÕ§Aê'S?™ú™Êuw¿× rõiúÉJÕ/µ™.—¡•«OƒÔO¦~2õ3•ëî~¯AåêÓ õ“•ª_j3].C *WŸ©ŸLýdêg*×Ýý^ƒÊÕ§Aê'+U¿Ôfº\†T®> R?™úÉÔÏT®»û½•«OƒÔOVª~©Ít¹ 5¨\}¤~2õ“©Ÿ©\w÷{ *WŸ©Ÿ¬TýR›érjP¹ú4Hýdê'S?S¹îî÷T®> R?Y©ú¥6Óå2Ô rõiúÉÔO¦~¦rÝÝï5¨\}¤~²RõKm¦Ëe¨AåêÓ õ“©ŸLýL庻ßkP¹ú4Hýd¥ê—ÚL—ËPƒÊÕ§Aê'S?™ú™Êuw¿× rõiúÉJÕ/µ™.—¡•«OƒÔO¦~2õ3•ëî~¯AåêÓ õ“•ª_j3].C *WŸ©ŸLýdêg*×Ýý^ƒÊÕ§Aê'+U¿Ôfº\†T®> R?™úÉÔÏT®»û½•«OƒÔOVª~©Ít¹ 5¨\}¤~2õ“©Ÿ©\w÷{ *WŸ©Ÿ¬TýR›érjP¹ú4Hýdê'S?S¹îî÷T®> R?Y©ú¥6Óå2Ô rõiúÉÔO¦~¦rÝÝï5¨\}¤~²RõKm¦Ëe¨AåêÓ õ“©ŸLýL庻ßkP¹ú4Hýd¥ê—ÚL—ËPƒÊÕ§Aê'S?™ú™Êuw¿× rõiúÉJÕ/µ™.—¡•«OƒÔO¦~2õ3•ëî~¯AåêÓ õ“•ª_j3].C *WŸ©ŸLýdêg*×Ýý^ƒÊÕ§Aê'+U¿Ôfº\†T®> R?™úÉÔÏT®»û½•«OƒÔOVª~©ÍtýaY–eY–e,QînŸ©Ÿ¬TýR›éøв,˲,Ëj`шrwû4Hýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýd¥ê—Ú S?™úÉÔO¦~&Ý“©ŸLýdµêÿaY–eY–eY–eY–eY–eY–eY–eY–µ“V­½ Yê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬TýR›¡aê'S?™úÉÔϤ{2õ“©Ÿ¬Tý?>ËÈÈÚöýÕõ×ëC7O,™¾Ýù÷+ë¯^o¼º04r{léåëÕ­{¯·žm¯¿üçðB÷·nž?wýÌêðÂðsëÿÜxy»u{êöÁá£Ã–ÎŒ·nw>¡óуÃG:»²±þdøÀÛgî|løâË­[Ûß¼zoýÉÆÛÇíüoèúýrÿ{ææçk£¯·6?þåÆ–·Þ~ÚðØÒÕ•3gæ¦W7î=»¿ÑýàÔÉí­Å…‹ÖÛÇNXž>8súÈÔÚèO‡_-\ŸºyèåÝù_nÍüÔzÑž[øîèæÑç'Ž-¾ºñü»Éö£c¿O=´újòþ‰s·VG¯l¾>ÜY?±zvñÑ©›‡µWï??>4ÒýëK×nœœ9üêèáǧn½X]Z9ýãã,ÍÝ}þàðò“³‡Wöo.ýqëöÄê¾Õíñ{ßÏNO.ú~­µyà—öXëô¯#­Ísë'&—&÷·ÇÎÿ°}²µñø·µñC‹·~;|ìÆýsC#‡mý~£ûÏ×îî»·r´½öúUçKÍͶ¿Û>qiéÑȉ‹íµÕ3·[c#¶O-lx1öìÒ½•ÖØô™3ݧ]jX˜í~îLûПڋÇÖ—–Ú{V?ý~æúé™7Ï<4òæ¹g^ŸkŸ[»{íììò“Å'“o~oq¡=úº}òÜæ“w?÷ö—?É­åÇ+¯NùýÀɵ}Ïnêü^ûø›C0¶=÷`¡5³òìäÒÃK´~8~ýÇ÷ž¢ûËŸßË¥Ûkû§W~úó{™\ÛÞ·0¶xc¤5²º92ziñèÓÇWÇn¼Ø÷©œ[|zð»Îûó)æ7Öî>]<½vwqd~ññÕÖÒÕ'{^¶×æn=|¶wÿ§žçæòå}{&Ú6ÏNtr_þµ½újîYkúîÃ;‹ 7î-ýa¢SÿÀ棥ÕÍÍgÇ—/l­´6.NÙsúÄ?ãÔÚ¥…sK[wη¸ðjôòòã‰ã{¦~ßû䇉CÇ.ÎtÛ±¹«/žž]º|áêöê¡­ö{»9ysý—΋t»}àÅêèèþó—öºÚ}гÖÆÝßVÚ«Ó'÷LÞ>Þzµ>7qïüÅÍÉ[[?_ï¼|O¶6îYîlôÅ˵}Ï,]¹öË“™×ÆÏ~ìi矴/ßXz~úþå7OÚ=õò´¿M.ÍùéûO?í㥵kK³óW¼}Èï‡7OOŽüüèäØùkãw†FÆ,<=5¹ß½FoÝ:ÞúáÔõå~âGžûíqX}2±gusþÔõ™½íí•¥³7/ßZÙzµ¹ØÍ0ºöóýÛkîá—~=غ?òäx点·sÒx2=3:svntuìöÅýkwÇ~ù~uóêæ‹Õ×Ö>¨6¾6ywíè…ÎÙéÂùÅ£ÏÇG–¸²Ý½t,ŸºqèÉïNŽ—:GlêÖå+KÏV;²xìø/'?xžë7Þ=òÂÌÏ3÷;swýÌí¥ ·§ZÓ¯¯­¼ÙÒêæâúÁÕW'§º5®üå{^;ü¨5Ù}½üzm¼sä/ßœ¹ñbsiiûÞþ§Ó{÷>¼vdîÕh§ËOÿþRsO=ZZ»7}ùÀûgΉâ#×ÂËoÎ%oN=IÞºóàæìåcK­™Í‹ûVÇÖOîo¯,žü؉ëKùûÙò¿ÿò×ëÙ·ù*Ÿþea~ú£_¾¿_å?~/{?ïûï{—>}ù/>bŸ5ß ËGF Áúoþù[Ž@/ßË×ù¯;b½ŽÀ·êòá4]ÿ[Ž@ÏßËW}ù>±Fà›vy7©ÿFàó¾—/ýòý:bÿy¾}—î ®~ÿGà ¾—/øò}=bŸƺ|ꆰ±.ý/=bƒ¼ÿÔ4ûªü¶#ÐÃ÷Ò‡øª#6È»ñŒÀÎÉßlzý^¾n¾þˆ ònüÃÔù[ŒÀg}/_<}:bƒ¼7½ëó|þ÷ò%#ÐÏ#6È»ñ·_åóßìïëß|áûÌè{—A¿;ú%o÷÷ˆõe¾æˆõ>ߦˠßý–#ÐÛ÷òµ#ðÕG¬§ø†]ýîè7Ïø^¾búsÄþÛ|ë.ƒ~w´ÿ#ð¹ßË—@ØFº úÝѾŽÀ}/Ÿ=ý>b&» ø¿V÷i¾üˆ}Î|“.Æ_•þ¯Õ_?_yÄzo×eïÀïÇü_«¿júqÄþû|ã.{~?6àÿZý¥#з#öG ‰.{~?6àÿZí§ýô ŸôÓƒ~zÐOúéA?=è§VÿKGÀOö÷ˆùéA?=è§ýôàÀê÷<~zð›vñÓƒ~z°‡/?óÁ_;2:54²4¹zäÖ‘=Wgþï‰î_|òæo1™¾ôdýÞÆýá›ç/ wÿ2–÷þV”ùá‡oþ84ÖyÜøµÿózxa¨5<Ö~¹±q}ûþ³ÎßüÛúÓ3Û÷7þOçßg‡Ç®¾~öòŸþ{÷ïTé|ÒÍãCãÃKχÆ'§Gçæ'ǧf¦fçæ§ç‡ÿ19;7ÚšœšžoͶ¦æƧ†ŸÍÎÏM·¦:¿513;5û‘ûȃ&¦§GgçÇ''fæf&&[³ýýËõô |¹í¡›‡‡Ž­<ÛÞÜÚÞÚ~piýõÃÎ÷71<Ö=.KÛ¯·ÖŸl­¿ê|¤ó»G‡:¦5|óþÐÌgÁñOÁÉ™ÑÖÔdg‹3³ãï¦5?:953>??97>1=Ó9xã­ÑñÉ©ùñ¹Ötkzv~ú#:÷±Mηæg§[ssSÓ3soËß¾Z/ùûkîÐÍü‡C÷×ÆÓ33£³“““ã³ãÃ05ÿѹûÛƒ>6w“³ã£“ãã3³ÓS­©ééOTúÈ—ûڃ׾Òý­Ñ¹¹‰É‰‰Î.Z­™Vç5ߟ™š˜é|7mu>m¼ó»¯;9?1>Ý}yÌNu~wtbøæÒÐÔðÿž>?4??;:ÝjÍÎÌtÆfn²||~tnvb²ómu^[“Ý×ïøÔÔèüôìÔÔÌ\knúc9÷÷ÇŒONÎMδ:G·517ÿæPÿí‹õô |µWŸøÛþË¿·þü¤Ö·®lÜ{½¾ýàÉÆÂÂʳ—Û/¯¬ßßúýÕÂÂäÛæ3ÛÿÓIqÿàðØõí­îßütõõËn–öµ>ïüóÄg~î•g¿oßï|àígÍWn}ÕWûÙsÓ£ÓSŸíœSÇ?q¼~ܺÿúáÛÏèíŽÕæ>÷[{ÿ°üùMLw&b¾óÒ˜™ŸŸýÔ®7¶_o¼¼ù_oòsË×MË¿>{rxìÌöë¿=öÌöV÷Trù÷õû/×·_¿û+Ô–Ÿ=ûȶž<»÷øo½ÚøÏ»_êþŸÏùÿUnv~jn´sþé\k:S5ÿ©±z{ôzû9­©Ñ©¹¹ÙÉÖtg*§¦>ñ9§7¶<ü×wwôíGÏmýÏÆÕ‡ëÝCti½s9yõ¯£üÁg~üX¿÷©§×·ï?Ùxy¡s9úø³¿w[Õ9ÏÎÏOuNÊ“S㓳ÝÓñdç¢255;>139773Ü=wFp²óщéÎÕf|~¦5×=A¿wvîœ;'íÎéy¼sJïSJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦´¿Oê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Ò>ûòvÈ‚šþÒ°¬T6ðÈÀ—ãie.¨ià/ ËêqAe |}‹ã •™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLi9žÔgJ©Ì|RŸ)¥>SÚ_Ž'õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLi9žÔgJ©Ì|RŸ)¥>SÚ_Ž'õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLi9žÔgJ©Ì|RŸ)¥>SÚ_Ž'õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLi9žÔgJ©Ì|RŸ)¥>SÚ_Ž'õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLi9žÔgJ©Ì|RŸ)¥>SÚ_Ž'õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLi9žÔgJ©Ì|RŸ)¥>SÚ_Ž'õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥|ƒ•}‹™·¬þ.¨là/Ëêq%sSÚ_Ž'õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLi9žÔgJ©Ì|RŸ)¥>SÚ_Ž'õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLi9žìÿÿ€Ã²,k,(Ìi9žì¿,Z–eí‚…¹#í/Ç“Àµ‰ÂœEÙœE)Ϲ´¿Ov×& -sep¥<çÒþr<Ù\›(ÌY”ÀY”òœKûËñdpm¢0gQvgQÊs.í/Ç“Àµ‰ÂœEÙœE)Ϲ´¿Ov×& -sep¥<çÒþr<Ù\›(ÌY”ÀY”òœKûËñdpm¢0gQvgQÊs.í/Ç“Àµ‰ÂœEÙœE)Ϲ´¿Ov×& -sep¥<çÒþr<Ù\›(ÌY”ÀY”òœKûËñdpm¢0gQvgQÊs.í/Ç“Àµ‰ÂœEÙœE)Ϲ´¿Ov×& -sep¥<çÒþr<Ù\›(ÌY”ÀY”òœKûËñdpm¢0gQvgQÊs.í/Ç“Àµ‰ÂœEÙœE)Ϲ´¿Ov×& -sep¥<çÒþr<Ù\›(ÌY”ÀY”òœKûËñdpm¢0gQvgQÊs.í/Ç“Àµ‰ÂœEÙœE)Ϲ´¿Ov×& -sep¥<çÒþr<Ù\›(ÌY”ÀY”òœKûËñdpm¢0gQvgQÊs.í/Ç“Àµ‰ÂœEÙœE)Ϲ´¿Ov×& -sep¥<çÒ½N-+mAI®Jì?[–eYÖG”äŸ`à'p˲þëê+×&ê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦´¿Oê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦´¿Oê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦´¿Oê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦´¿Oê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦´¿Oê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦´¿Oê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦´¿Oê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦´¿Oê3¥Tf>©Ï”RŸ)í/Ç“úL)•™Oê3¥ÔgJûËñ¤>SJeæ“úL)õ™Òþr<©Ï”R™ù¤>SJ}¦ôýaY–eY–eY–eY–eY–eYVÉÕWþ›õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLi9žÔgJ©Ì|RŸ)¥>SÚ_Ž'õ™R*3ŸÔgJ©Ï”ö—ãI}¦”ÊÌ'õ™Rê3¥ýåxRŸ)¥2óI}¦”úLéÀ42²¶}uýõúÐÍÓC#Kg¦owþýÊú«×/‡. Ü[zùzuëÞë­gÛë/ÿ9¼Ðý­›çÏ]?³:¼0|àÜú?7^ÞnÝž¸}pøèð¥3ã­ÛOè|ôàð‘ÎCLJǮl¬?>ðö‡;¾ørëÁÖvç7¯Þ[²ñöqG;ÿºþ_¿Üÿ>³º~þÒèë­Í¹±å­·Ÿ6<¶tuåÌ™¹éÕ{Ïîot?8urû@kqáâõö±S#–§Îœ>2µ6úÓáW ×Ƨnzyw~ã×…[3?µ^´ç¾;ºyôÁù‰c‹¯n<ÿn²ýèØïSÏ­¾š¼âÜ­ÕÑ+›¯·GÖO¬ž]|tgêæácíÕûOçtãúÒµ'g¿:zøñ©[/V—VNÿøøKswŸ?8¼|ãäìáÅ•ý›Kgܺ=±ºou{üÞ÷³Ó“K‡¾_kmø¥=Ö:ýëHkóÜú‰É¥Éýí±ó?lŸlm<þmmüÐâ­ß»qÿÜÐÈác[¿ßèþóõ»ûî­m¯½~ÕùRs³íï¶O\Zz4râb{mõÌíÖØÈ…íS Û^Œ=»to¥56}æL÷i—Zc'f»Ÿ;Ó>tã§öâ±õ¥¥öžÕÇO¿Ÿ¹~zæÍ3¼yî™×çÚçÖî^;;»üdñÉä›ß[\h¾nŸ<·ùäÝÃϽýåÏcrkùñÊ«“GF~?prmß³›‡:¿×>þæŒmÏ=Xhͬ<;¹ôðÒãÇC#­Ž_ÿñ½§èþòç÷réöÚþé•Ÿþü^&×Ƕ÷-Œ-Þi¬nŽŒ^Z<úôñÕ±‡/ö}j#çŸü®sÄþ|Šùµ»OO¯Ý]™_||cµµtõÉž—íµùƒ[cŸíÝÿ©ç¹¹|yßž‰öͳÜ—m¯¾š{Öš¾ûðÎâÂÍ…{KçG˜èÔ?°ùhiusóÙñåË#[+­K£ÓGöœ>qãßÏ8µviáÜÒÖóß-.¼½¼üxâøž©ß÷Þ95~O{º{ØŽÍ]}ñôìÒå Wo´WmµßÛÍÉ›ë¿t^¤Ûí/VGG÷?˜¿´ïÐÕ¶6oŸ<×^>¹gòöñÖ«å©›wXýáðþƒSÏ·V¯½{Š‡oòÛ•KûÚûfÚŽÞtá·•‡Ó÷þ¥@çõ²vüõÚäåë­ŸâÝV~¹¶´µ¾¾<õûÝŸn¾‹•‡?ï?ù×ǽÒîGŸN¿}ïí§uŸ´;ÉßàißÜ÷÷þk’nÌ¿œz¿oçC½ŽîAïòÇ«›ûOÏ,];ÿüÈêæèíÎÝxôïtºüù¡Sÿìƒß½ Î™ãAkùñþÛ—Ú+›g;¯¦ÖÉï;{øybê÷#ÓWÞîæÎþs£íÕ'ßý£½6qðÐܵ}?þºvïä¾ñöÊòü¡ÎŒ}â ìí¼Hí{ó ¶÷×|ìs÷-½özïÒµs¿ü¼vûù™çïåêúÅwOñ×w?ú‘Ctð»•'·Ö~»x÷öÒöÝíïÖÖ×÷øp7ï=¤;Éï?èc;ëÔû‡ÛwnŸ˜_==~åAûäÓËoO[w~ß>xéÉÑ7ðØ©'çŸþeØ;§‘•[C#3?_^?Ý^¹ÿèlç—·~¸tñxkãõñ¹‰{ç/>˜¼µµvaüôÌÓã­Í‡{–;}ñrmßóÅ#KW®ýòdæõñ³{Úù'íË7–žŸ¾ùÍ“vÏc½<ío“KsG~úþÓOûxiíÚÒìü•oòûáÍÓ“#??:9vþÚø¡‘ñ#+¯NwžñÐùÑÇ[·Ž·~8u}ù£Ÿø‘ç~{VŸLìYÝœ?u}fo{{eéìÍË·V¶^m.v3Œ®ý|ÿvçš{øÄ¥_¶î<9Þ¹`îíœ4žLόΜ]»}qÿÚݱ_¾_ݼºùbuãŵµª¯MÞ];z¡svºp~ñèóñ‘åÇ®lw/˧nüÿí\kSÛFýþ*34Ibß÷&†IÀ@Bš¤­ÆVŒRÛ„äK{ïÊÚX6z¬¬&£aìÁöJW÷œ£{¤ýáò·Iq<ÄØ›ãf£»÷ÇÆÎO?¿ÞžÙÏÙ‹ÉÈgâwÑÝüÙxv2ħ¢CÚ{·ã=ØóûṴ̂Ѽ•óþÃ÷ˆšóåí)äÏÅ‹ï°uÝ{øpCõ]àå•ÿ_(õü×÷ý?¾?] PÄôÂ㨖D¥”üÕ9—Ç·H¼{þýÞ–·}ïñ£í¸Â•õm¾ZÞýv»Ÿeñ[]óØðv£,Íe-]þÖy±>3b©$P/1X!ûÑÿEJ I.ùÃçC,©ŠâeV«f¿H $Î%Wx ˆ%@¡¼L$P -ûI ].YÃÛBl¹ŠçÅH <öíK C.Â[El¡VÆË"C¸2^lI +beºñEXíYY¬äbA¹+ÓÇH „š\˜’æ’Où+ÓÏJ ¬Ž\„Rå’Y–+ÓO$Pª³,ô¹d‘€MÄÊtãÃ(éïÚEÌž2"–RÖy)ûîh–[Äv³"<ˆ%—@1¼”}w´H $Ë%¯r#–HòRöÝÑ‚$"—°ƒØ](š—²ïŽÚ—@Ú\²IÀ"bK$°^ʾ;jU™rI-ÛˆÅK`•¼”ü´Ú’²#–F…ð2'•Ÿ•%?­Î/œˆ%”@q¼¬•îÇJ~ZK6»[ó²Vº+ùiuV XCl©VÁËZé~¬ä§ÕÕìÁjö`5{°š=XͬfV³«ÙƒÕìÁÒØÏ*jö ]ĪكÕìÁjö`5{°4öK š=X(/ÕìÁjö`‚ðbfÙ—ÕÖtoãÍÆw'âŸ_ÌÂ'Ñ*&Ä9ºôZ~Û9zä˜ÅX¦VEÑÎýÎùËršðB®f’aI¥b„s­Ì7˜`­9ŠHθƒ /äœ7j̹q˜óÔyMó÷9íÄŘ ΩFˆ -g“Rír„%c”)Á+ƒ])±VB"„ s6 ã.‚ …‘âœ;‡µ“ëµÜñYaB]¦F‚%Æ+ÄxA½~„~½þÈ~ïÕÍ\D9(WR¦æ‡úagp1­3QJ0bÅŒîü|´<Ë!i˜$‚ðùáÍîÀ3ß;“µjÆ¿òO.¼0èÈëyWýᯓm8[ga`VŸ9ô‚°3·Õ/l_ú½gÞÕ‚vˆ\„¦v8ÞÓîn£Õº¾Ü”Z$“®æˆPÅ”’\Æ‘kÆ$¹ÐR+‚ùZÈeD€*•8MÉ-ûú¹ÅNãCT”"”*1BÎNøJ–ð1ÀËQ p±BT …Ai -ƒKLQx•Œ0uµÐŠB1Á”Å)3æj" ð Raz~Ìa̘5ÍK4h>Z?›,Ñ4ûM¿5ð ç ˜n/ô{M¯\÷ëu:bå üä]íx–ç¶>ýb')·mv¯Ã6ü0Ü:Od”+2[B»ÈtŠ5f/ÀëeÐŸÉ Ź.mjÓ°Œ#\¹Œ)OBÃ\tÔÓ¥#S<š–|jmM­ƒp07ö wy|íµ{^8˜,ĶÛíÆÖe·õ÷MÐ÷—ýT‰L–àˆ¹%í`ü™ž@$”l„4§ ¶yâ‹Aâª=ÙÒVéŽ*2Š*²«Áoð¨nq‰°Žê1×B»THG–lø‡£ú;mÆtA¡PÅ §TA/†¹<Ôm - PbÜ.™„b)•ql‚¹`Í0 £ l•£a­\‚'œ(|gÇ&ˆ»æTjÁYÞ±¡!pèVàÇÀh¤“¶lèïÐá¾;­×ÕHCæ˜Cœ¡—b81€^3 ‚ˆB´0Ã.ƒo¥%vA(VÙUŒ$§|ÑT%6dß »CCæ‚wÕpA¦ R£Òœþ.?“˜ÀE O~—Pø•p¦¡Fd®Üð”;Cp-‡oÛ30F¦®pÐÉŒr£çÏæÅ´[ÕCL¼×t¸DƒbÂU­@‡F'cøÖ Ô‰@f‹ú}eЊ1h³ "‘Cv WìHk-ÿ×m«q€ñ©ÿyE€yÜóý³°Ý…Ñ'ØÅAØö?Ãgn*~·÷eüšŸÙ®®¯oŽd£öc ªþƒ‘ó´Ýck×Äè]òP4i¨ÌPƇ»“5 £¥77këëG^Ç?íy`^ëô½O¾ã…¡é†þøÅéôü>ÄòþE÷Æ|›Œ‡¯¯ï?\ûG]C endstream endobj 8 0 obj [7 0 R] endobj 39 0 obj <> endobj xref 0 40 0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000056614 00000 n -0000000000 00000 f -0000072742 00000 n -0000073131 00000 n -0000072556 00000 n -0000278138 00000 n -0000056665 00000 n -0000057198 00000 n -0000057961 00000 n -0000112234 00000 n -0000071478 00000 n -0000070284 00000 n -0000112121 00000 n -0000059203 00000 n -0000065140 00000 n -0000069018 00000 n -0000058026 00000 n -0000058642 00000 n -0000058690 00000 n -0000071524 00000 n -0000070780 00000 n -0000070330 00000 n -0000070723 00000 n -0000072486 00000 n -0000072626 00000 n -0000072657 00000 n -0000087858 00000 n -0000073433 00000 n -0000073714 00000 n -0000088131 00000 n -0000112308 00000 n -0000112538 00000 n -0000113927 00000 n -0000126308 00000 n -0000191896 00000 n -0000257484 00000 n -0000278161 00000 n -trailer <<26234F01CEB648099183139963F89171>]>> startxref 278361 %%EOF \ No newline at end of file diff --git a/docs/source/manual/fpga_verilog/figures/verification_step.png b/docs/source/manual/fpga_verilog/figures/verification_step.png deleted file mode 100644 index 7512f10291fa57aba6a2f0c373e52ebdce18411a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183723 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%0Dq*v6glTo4pFLY+>?*tCNIv#;B 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%0D9fiA2G zGzAcyp$5UJxUXENF6Edul6fN<5xX4<|NMN}uB&F6#STgEuSbtz?x4q=^1}Pu1JcxB zH88tuTTr9pFx;zN9;-!an7s%@#ZNW$>dAwTzjUgkq$Jm4^R_D}Un7iZ7&W+l(ARMv zZXJE{`ML1+>O3yNWOfI1oaW`?|A@B_S+d=~+igz22u}YVL$Q`t^FHR)ajN#L+Y=4l zFQDUn8(4?+$OaiIb$klQ)=Nf1q;M7Io@^aHg%}3A0%sxJ??$?Y3TOZ;fk2ddL!qHf zg#uRCOgSPGIRU*bj`lfV&Yp0W?WM!dCHnK7hpExjddN-4_jh+VKohs58Xh$joKwRh zBd12Xk=8m$n)`T*I(z|l#1LrX{K(t-zGRPO39U2@*XCG(NW=g&avxY75#B%t+;er8 z=s7Sr?}Mwcugp0soK1#VtnhftU%M;`y=rGA5VUeX&Q{n$*BR6?h8@9x8T^K=-+%?w z`1p7o4DL(-LYV8cpye${^>ztq(t)||RW-GU%L%w}+n+(J5M>7C@phVBm1;ypJxuwE z8xBKk320jq$Xj0o9NMF5$FWbiI9c zccH(lU~y;1BN}=Z#(hZab_((1obJneWnAJVw-`|geox+oAD89aOf)N#?FZ5e`AyjamMc(sQZ%K1*dwqHWbd#PnBwSa%Ey zaF&dpn1Rs(u+v5oTA=&L5L69p79C0w&XEG{XjW#T#UK8ST=GYD(E_oFDuEzv+IOt* z$)CZ-lpR70`Pn1t_`SNc5i^tfO)9%0$ad{Wo0*(Ig3NctoT}t9VpIjO99yS4m?B>b@NfK*5?Gvnx zr4g>JKZY9b^&!yzh|QD647(!cp3|CBfpHz;9)>wp$MsiAj!nl;b620w;sJh{(>Rsu zcxaI8bKH4F$*EXg%Vg!lT3hxS+Ct^_m_N87Rf&Q<1g0%x^HpgSH0iWZr+LgjAM2}t zkf?@?^g=v}9zz??Z*8a0enhkc^xo2`g$BE6k0Z{?qi}Yf!fh|akG#1?;KVu0Q1i?% zhNMqPJ2^SIQL$|Bk70Ia>2p1y6o>$JiPG9GsYpN5AZ@bvuN@Zh4*h}ctK}Ng9xxt4 zJg})mOs2U+gq#=86!t@>t~Dp!exx!88Ng_M&Bit>#j?UY>Mym8LF6!T>$%PugEK&TrfyjX9n2e^ zc4la+b5{QN5@KosRmKihzWPU)`!|4>1ZzL#S9nQ_ZVMl)Ol@-5vBK8Nae9m`HMMdV z)<{}=+M%VT6%5nu2I$=~V;m(6Hx3eH+U4#wKD>fxg1|cIJ#nleZHNt$K?N~6Pq&J{ zRm+&I%QII?*PxY;9%~gfwMnZCk(_Ws@0}n zAsFxrz$umlMgY~E_c}1pQxg-bM?%um+2>xC1eGXB&`_iI2g*Ar+iW;-l}^(^-`Isp zcGg{;s*r10Btv%u2uv2wN09Dap34inJh6rZUm{2?Z)-``m3Odhvt|@=d#__tu{gC@1zr$lN={3OMi_8 z!pdRRiGGARw}F6+3@rk+D(XzD_V>z=E}@!(+=oXeCqg6%b21ac_F}XKc)j;LG_ws* zCwDxMMsJco^|_PhZm{H1>2Y;_Uj)s{=&n2QmCik}LWtk_jW?5!lI@h9&ZZ0WHe@lK0MmB-iNs$aE$;ckXd-s!hS{#X`majmiI!3O! zT(Odu+ki&E0&?-SCA!((DX{87n$6vn0`|j~+L;0iJeGzl)VNN$1(}Q)IdSPuV4eI^kn?~_VU3^+PMq{Vx4;*|BBEv<~;+)F+8zsGK_k+q&Rsrd0FuzT6J|9a-0%hi$XrM|pRTl)Zf zkZt<}vhZeDHq+OxuX)4{PaSg){uMi^@uKvLo+68+j<(A9x}|*Z$5{|G^|2OgM#z@C z6L+7321<)cw}<#NkAClF<1vUtIfL{aWRx_h!Z#%qw57M<-Ex zOn!|2>Ycae%`b4;^hGHdE%6N-4uy@ zT8>RjWi3Efv(9JP{@&be(ZO?i+gQ30oIuSF->q~~tj z;zuJEy~9(l&*boKkmb7wq<}}9 zSd_=+X74U+MP*Mb(#4&^;NZQptqald$96aiT`SzyJtj}}1=+G|7dG`&d3z@mHgcL@ zj*a!L1P1T0%5eO7fmTl@?$%eI&g;ak#T--kR(Yl3k_`Iy7q4erbhGSiS!S$5Bd5IO zJ_n9^27H+FwUeyEIA0;WnVXj<`PtFav#ZBys4)Kf1|QK68^2^6yK}2J?-dPTASCKZ zu+Wp0FgI7WH^L(lyQx5AFxdaz?=Xu+-5_l>#6hmodui2SjPhsnPXoR4LqVLET$(;_ zul~8|Q^Y8Jqq(cVzVh`hnNe#qcbmg`BVTooU?*9J?~OpDflE0nVbjR~oy)6pVZqZvTi^rfCx3jl~aaARVa%?sc z-R!QkZuJ~B=iqpiQ1l4zW6u>mz^m;EEtIZn1_xu$_liqwk#jk?j;?`7fYHJd48#}g zC5vM_C~mC4yVaf;+M8~+FQObN6>%3v&3%}oc+w?!qL@os@zb1J7r)E8*7(Gx{^07n z!pE>Jx^3O)muIZqM;#MUo-ftW6J{(so%=0cX-?gO?4&ln1=FfmCSWR;jJsm;2Vi#u z^|SOUB!*8-yHgS@dVC3B)~T9en=8!o{C#t_AvM|>z0@`lNZIXPxbB@{;$1?t^C5YN zclX3Q&KE6Psdo+9xyl#xHDUlo_sFg2#&rlhxU9aLsO-e-v$?oIx<}gu z#cW>YLR)OT8%FK1Xd|qPGf&ol_xHXaot#oMWw`nnflv1^0r~*RAmuwqM9(zB{EJFM zI^bn3)_aSPLTtk*L-n0?$b<*>VwX`1owudemks?I9P$VB)G^R_i-oz5e9$wyJlFiW zI;Co!fbeuN$eCjVYIHy_%`%RqC_WG4-jLfdNoZVlwm6*je#YPUELy8ovWCmIfFRM16Uw6r=vdE|3C~K z*P^Im!#~rZY7Kwy-4g7`?@K5z*8xbu(+GLuO?#;?tVQaX*_iJauE~G4D5Kr5fBZX# zxH<~aZDZ!i)m_H&UGHJ9?#%6VvlUQmxI7oxt8!D87V`^BVwFx&i+a(NtoU(hzMKB6 zx6(R3-=U1)8gyW#NJ*-SBUAt^$?Xh%475jA`-Odmusype!)oO2)B5;7ZA}uo`cw(b zYCbtF@J}yauoD@dAv*08T|H&sU(L^$%{uVdZ4+}|qwnsqU~eIIPk7-P^l5!|!a7uas>=5I;Hm^hg-^?i_Da2CtlVk- zwSpRs8EcK=;Ru{g2NHU&P)uG~W%sA;w8Zzb71!9dWWv9s>y?PCV?;x(I}n(6PDm8E~N|`p6<6%qXg%xVot2$3!T?*s7EjelaVGy zKIhTZ*Og-zpMLO|v1_*81QxIybai$cqYtOR_LxmiWCg)O$rP~QMqWcRS@}@stibMm zSaO~QShz&1)*k1paMroZ(NR*wt#|TYo7fefDk!cqos8U(<`h7Y(Kaepi^;~DLDnzX zbWI}26n?{)|F;fWkX@)VPY`xX95;28PEHGC`$1QcP16iOP+b? z<c(WhxYE?jcpeP{pnd1XCyeYe{l?3p z5puba+W-!08oA!WHbBlKXVsZW9H#2BZoCOI9*%F@#~%wT>6`lWFrf!<8u$^CbXZ44iCsNk8yU9Egc+t- zeJq;&WzVtmlC|}q(lu&PiOoBEyi`HCBFN*9`OMx4hy9rr{l;hsm|>sd9wKN28F7Q% zFa_@dvr<_uRVi=jm&ZF6tU@QyPr;Mq#9S@9(LCaIH}h(h0aTxcvAAs`68--leOh zdMR6)@j~c!0<{?5GkFDEitL6cG;Y@2O|kV)9}Od3G%LZz!91!pJ!{5N6QZTy{1uTt z@E?!0`!2b%7MZCS!;4!VeA91(;tScCWRdIB=7C>QK<8WPrjC7LEbViN2CL&3V{US{ z@aY63ed~~h9Tc(ovv|(swN$kZ;u2$SLO7NVVpsCFGt=%a4))DHUj_-Dr_kN611yd$ zRpdOAfjH;391#h6!DIY7tmaYWi(&{@8(eVm~*)nVfMeBbp_zi^`khfh5V6da9r zQb^0D^$RZcSYOf)d~|1T+nK2$K%+u$dM>Nd|F-;?8?z&uyq+6=_@t+UWj9Aq>Bfn5 z=pJZ^)FIU@?b7%4Eh@kttqZ<8wxAaGmNoFODV6dZ+Ul0hb$y1IkGK+b$!AZcZB0yp z4CIX+yhj?fkI}3hC(`u?El&fEUARF{^xs_(pmMonqqHn=PGKP-%j$kGSYV>`kyS-Pat}+)#COJ&S4`g2w8kEi7 z9vjJyW?2;KZ+x^Nk$7BqW;4BZa$0h?c4((tOhnZLt;jl`y(P4cBS?p?e~xcBOZtPz zKK;^+KBLjPTN0YpSSF*e#cY-ux9`0&G0Wkjk!HHzyLXB?0^=eLCOujk9khdTpCzk zxu^-8{DmhLTSFK6xCU>}P9%a|(+JDPLYa~xUr1wHrZE~OZN$4Lu^r8=! zs-{P)_?Ee(>=;E|1eMw45>uIHMUa=%HCnc+Ug`idU|oS%B16;eGg1m;epmsdm?Y&~ zLJHR#BRKBo=}xUXHgfpRWr#QW&F#{0_e$u0rS@D?v5xvwy;bl^e0ROP@I3b}wDD1S z-D_~kD&q>QNy&~~=6RI2WapT!nRf*!Ewrvsib%P?ya@4i0!qp-usIDNyd%A$l$idR zIBSCjUTl1pbSk{qzW1~1$qY3Xq5TcFF&nhR_RV3$)`mCTJ^TaxI>gEekhzJ(=Pa(C zt!H&0{{#Nhh8rH3c{&w9F+*4gXclR{NhD9o&#r*zVLhmtFzs%wKiyoNB1utEmF<>1 zm{U|6qfz;cgVI1jXe!#IS?7gj z%EiW*<2}}Xoa`(t4!WPbD)K-+am;rGKxeWBx^7;Ur&dvx&}l{VgsR!u>M9sSu*u9v zFa)AvW7#00R7`WlCb-SAvdJ1lDWDc|C54t9W6rSD1>N*k5NVe0n7oX8#mCix*C|up zKPv8W26W9y7aK<0ofCFmyvy$+h>_l4j3cIMZ{4>75xXN+}yPjPUG_|_tl$NtG0NH3LK*AX{1N-~PrEgll(8;h0OcHXTqg);WHEnAqsU8UF=F0$9x zgv7x6DG*mOy67KXz8?^U%TO!$rEs-PFRT8C)_7r6%&D}VKxnl252UQSWuRp;VAA3K z47^=Q?)d^D3nE`(P~psb-MvH*1TE94*Yo{fR#!{Qi2rd}K0=0#IrSQ7sI`-b(d~}D zXv7uqGKC%-k6%bG9EM=ANKRd;vqHzJVX|ZB8NCfn{(8vwr2O$t^O!weKP~K(t^LTWoeFh$0W!4s46H=H4;LK@1U;@Os-A{m%((Ix?i`5BhXiX$_vXCb|F8lQVS z;QB%`^}(F$7Z`#?fRRa;8$oA_bpNU!wyg!1BycgpV9=`}K27m3bLwh-1?mBBIwm>f zG`WRmUE;&p)RhobK%ah%)D-jpkDvzwuPm~9OguR7idu5qDq7u;puSbbaB(JE77(Pk zpUtRIM5y-iwJ3P-Vp%>V&e+ce|g-~S?NFM<9q+Jy^Obu065tSUV^D_f$< z>Pa>=_VvA)$mZX}2PL$M&7PsPOg_88i+#nnUUYTsgT~mGeN*q^G0d<#_Lh!x2LSpD zhVL+YD8B%xG${=r^cgncndwqX+YT6f=|oz-9Cm1t8Js~~Qc!8!VsJSEAtYxolSeO_MW%Vm}zobv;hVMXxE%WH#k ze9?M=gBt?eTxwaTpyKozHQVXX_ueh=7IKi#f5o@_nd8=O>6?&K_-G0)F2P;JMQ&StuBY;_mj+F4QPx$?r0z_ps{Rs{?Gj&V39-6RZ$- z%#Q|liZnAhEvr)N?sV#CK8#pL(?j9~^6wFjk!Jdzp!z7~@7!+iuxfX~9u#l=A9QMl z9n0GAgb+>}+tSiiM6i`9j$dt#=yKNK& zn?w&BdkEU}X!DDR7vv=GYZ$ea-5-A3sdomwOs;1%1e_+BQl1N$gc16aa+U~M_Bl|G z&9)7D@%AzmyKf-Gh4f?rMU1DFULw%*-HS(|M>fX^c8u*qmfi?PoT;zHe5%(2V>YZt z*lxTYEsX}}(W|pvY32k8ci^SSXJ{4ZG+GjU0uN?;D(2mjjs|$nUUS*%cJ+kEaP`O* zUHsC_VLDNB^T$-6wtBIr!zx!jA4TJx_f;LKQOiGpYXYkt-DIzK>Gs4*d$1kpx)j;05H0H@BBOa|y=h8*chM941HwznVNj_- z`{#-vsc}dr`lMN0%OK5a^f0r>TTLODqCBLJjQ8&jV^aQT%1YQZb*zA4 z-WH7T@MZcOcqTt4EAU+sK9f!5*EJC+z;a$fP`+*n!^1)&r@-Y zw4@nvU@{SL*H<{A6gpSRv9mdq;906$Mo9Adi#s%;J()t@pR+@E@p$R(ynnmkf(T*p zP1A`X&{o{bb$Y&K<0I?=gShX2FM{qrjmKoqr%D)$Zz_a5&VnX~XvfolC8!`aqKCEK zbuV;P#)?t*@b@n)bfrbwfBW)5v}3?`3F5yKM;a5%2^{ksq17tN6BlUhnz0QT-|cV# zaYE6Kv;b?@3eKK%&95w%-8XC+TkOn7S0Psz;}KU3S`m5?&vg2eBc+)J=l-oi^~awM z7JE3@BL3^G3M=7qH>6+C!+-L7d8;F@>#o~3nGDec-0J0-{d?7Sv|cHWhAX#R_uTF5 zA=(`=@j;Vpu+-GG^TF{nW8o^(`V+JvM)Lu4?G*RnEpXW1!BmwH!{Fzg7PnVAI?|e< znfG!D(uVb!JEH`=1e4qqst*QTIPu=EsTmI0;HNXYXx+yI<~?>A1rK|OacqsL;~oH= z)|wM8U!FIM$bQM2jDn5a5C~h-3H0?oCF1R}&tz z%O4mJsCCppQQHwZ#Sc#d+^FKDg<;mI<~-~VI{?opL}#5Z<$awD8jsKP~>73?ZEK&7S>xT!!|(ZBe!aMc5+9Yfy<#O(6vj+Px4ZLXas7x z@#ELpV{0f(jNJ@y*(W>hMaZJW0SK#R@D#h|^;7Ea$u?_#cVWtxv7iI;kkS!dZfj9} zXbKb#Z7^ScILB)@*lX_hG`o;E%bJ&L>fu)dDM6CPIlf}tR9B9bl^w2nSK@Lmy-GdI z?p+W|-$Le5Zl7oOF)GOTu&}Kxsv~E7>kh_Pu)!u`q2blCcAG?lPMicfc`4T< z2KP_g_;0|*5mfkzR>Na=HT>h^&a^EqtsA=G5-m(>mwoFoq*WO8L-hCL3Pup17o&Vc z9ZcrR; zEZW{tpx0v_d62G7M&2*l5&K~Mnn1^WzjbaAL#eJaBKl3uYLFJ{-k7L8Svu;2|9)+r z*e-{8Q)s8@(Mh)VYbWU8is#Bz;z*O6nl4FT`Si99n|b-2l%Pz*7q=%p)+*(M-j@1Y zgZ-91a_M7X3diM>vpQaWqB<{byq63`&Qln8YwiasB!(WKWq$8ZB3Vzsv#Rc&&h!8C zUOoU5YSY9}R(;6i#Z~XE^eh9~j)EQl(M}W%uPqv3;mz={u4A4UJ2U2{Sh4y@p+P$JHDH!&2nSA)5|5sd3&p6n``uSRc<@^YI_&eP4dGww`s=GO zNilyHC=->_KLXrDAF0FMTuYL8{}BY0H4jc(xvqx408MKAktx|(s_Pp#fBO*+{l!XL zY#!MD{nx?o6uXT}N=8=7ui+jd>(2{B8}AUmMSDR0C*!rZ=0X?tDI}@WDbJuXVL$*0 z=B`S_C@CSC_FXr{(Cd$e{#pZsk%0iIpAhnwA;|kbf0bB1I`k18IZ6SY+Ou<`(FTC- zH?s7GsJYh`e6m%4QaP4i5fpTJ`(UnGXVriGJ(M?;j!P$K zPco={1Z12klzAYNkDk^ANqYo>wgg(I>3WPxni|I&=;m51H$W@Yv_6b+1@4VTsM}M- z?_(q7Y27_Ej4+E}ORHO04O_5(I2MUt{AQUVJC7#hGyqE&KHf?^`L}lg{}f&#rlb@U z=kN|U7vdJ(K>KSIdidhWAn2$g^!}5Y{C%fppEyu``2vb65eeRVnqIr>>T^j~K-M=F zDGjW;(=9~+Hp&EZ%upaqsR6H&^Jbcw;>OUcT@{@0F2Q%}6d!7maQ?OqA&JNnO{0=D z|M^5TA-(8s_w_IUIQ4*J^b9Vur0Czja~Qre<@-1Dr9YS8@Kyhny8ZeJFf|iji#b4X z2p#AB4TI)$3FA|r?vmUH`p3Tb*B@C~9Ig#KE?zh(V)gz>3<2#uv2>8Z>Stz)_~gdc zd5ClP*V7-oZ}`s}h7dy|-paVACyR8AXu673@@W6LE&lba$cOkZl>LAHk3Y9NjU56R zI(WW+eS&{Kn^-Br|64Ravi-k4|G_uk0!|gZU8l|8Pw<}y?a!m#j-ZO~UdHJ4{(t(U z4`ZQxx%I+K^54(-A0H(IW=9=V_jYBDpw@_cvn}J&_Z{zU&2zgy5{ttG6Hyz4SU5je zavdS@zRJiY$81-wuI%1e9AX0_g|KNJxTVTZO#>ZxTCxLfmd1ifk@I|X2DrRdow5kx zQgO~*){{#P;_ebA_Hk-i^WeB}8hA6mE0`4I z0GS)2?5u(tyL&lmPej{u`(6ZjayF8q^EId@*wWt<)4{^SE4-?=_o&$J=@Z%zLiCfl z0`e2*o|)>4bM|NmopIR6X~LYh=E(D?9ADC9-Q3(X?Iz=YEOrjxB;49)FUvO1Db$+d zSupRmS~vPOKK@Qm|FCCO)c4R5(;b2gvH$LYj*^^c$emk%C1@NH@Vt;4Yfjtk3Z zU^3^fG~4g|W?6}b{{DBGVM|q#zlEfGVi%xG9I7A_Soj;Wex7)gNlroI4e75Fa*2pW zqZ32w?LQ8WEH|VJC+6?9o;f@-G<(R29*N`l^`pe@idc;v_V9ndty$z3x_t`&D^GaD z3hk-$H7tjL?G_1i2LBy)P{p|6!2=P!MCdpVPHL3ieS;Xp94IfmgoI%QDlxxt=Bpo} z9dp-x9u;!0g9BUm6|VxSCfsB zKRt4H8^4LVq~d5_7`l4{=btw)a=1rHX|C1I)SN*#rE7huNV&OOd)ySdrYnF^5b94v zQ3S++eGvzgDbKX+N*Gh3LG>56p8kM%PeY8wA9cl1`MqBo)30|XYlv!Uk|^0(!A(wJ z1N`B27v(;_!}oc(hvR_e`DM+35OsmX0zw5iy5u(%>bDbE)6@gVk!7NhE!Iim?{zB}w?IrZ>MmT;Kl)fIlx5F*k%MK>aDY;!jzDKcn#99vOuR4GelTLUhG{ z?7RQ|BWjI^C4ssuTF*TisDcQhVQ2 zf%C%^1CE*q6CMO2x^v&XlZd|LnhOp(@d`8vG&T$&MwnqcfDr?V3Uoxrj6;l2rxqGEM#U*Lr&!v9M6Ibk#3qT zl78@7wo4&nn;Afk-AGew?l5zic=P1Z&9a_MT{h8#7RM?!wR9H96`hgsG`w55!U?%4 zH4LfAz3pTZ7Ct3t-cF8=vTa#DppYSN*oBVU=>6rC>}A61k-NjSUWI9AO_-Plc>YD( z2|0n@HbS5rFr*m#y!FUqcv^ig=$M31b<;e7x~BvN(-S~k=hpWl6>7K(`vh`*MnNz@ zrrM0lZlUc5WWPB!mD$NQ&QXkOg|;&z35;KkJ(S2zCX4Ionf?5=E{(y3X~I z$3;wr^0Po<1IQmA-cCV7rU;z_tm~XMq4ZqT;BvV#=L*oA^itlC6rGaW7YwS8u(GgZ zZ`i`SNET-xC*NWW=CSR~PSU8M`CLHXVo3=-UBd-qP@IW#`4W)p^3ABtfIyKVgd1?3 zB`{KcM$1(z82f?J^YcCstK?!JvPXr0CH3}Ydz5!({<)(dlYd_zn zzh3QET1N8>6A!;2uP1rfoV0-b8AI=>zn@6d-4h1WPf0KJ_p|w8VrXD z{#@8OVsWTU7@b^nf9Fn``V%;3g54EB>q$TISgXKFaAkpfq2?=S+BslaPG4A1l(63$ zkaMrP2tBTenxkj)eRzXF=$-9{WKo)kkwwdy(gj49jkA1NqHS1wupN|;COWSxKLe!t zBWz0x3K6$_(8Q-i43soPd@bTRJ4PRl`f~=}1igs_08PvI9Y1SVun$E+1WbfAP&`h` zw6p6)RlABGgU{-}J=k>*Wy;onSa6+ldJ6=LasY58i`WvS7^WR;t#IFa?)EaKZ6^u? z4o~()xKAD2xcv|R{4+v^fPb=8$~%=~dB>rt4`PlYa*rwa8Yt|>p`9AmBD$>*@3A5$ zBS_^Zg~8+Vl#o7IoTf(3Klk({muw4V>i#ro11nhL7gKl(Gsd%>Z}#XAV3-BDB4A{n z9?(Zj4;Z_ewH%hgGzlIn0p6j6^e1|Sr2$2pYT6jFH$ia(G}dj}c7q-5DZszr2>_d# z`wL_GMD7FWq6P2qH-QEP9q5)Mi`a$px=y?q2v#p!(9^kFOeJy@9&kQvQFQJgM{r>x zQcT1akh}EtCEc&3XYo6-B>o5`t@4kpz(DLUd{a5>N=MT)W`2>+Xo^66fxkb3Y^}0@ zvZ(vonZ08?Nj0Ph*`O)+CELxnq+tS1^BQT)Pheaai0#^oMkh4>aD&2-nF<>jU*?); z#9zu+53WuTQNd&)paVzZER4KyKWNXERs~X?ogWD4)jhRVXtNA2~qG`j2=Ih z6X^=$<>vC`cldkfKww9q{`2RJ7VG15C^>&Om7*|)tV@mq-@w4J!aZX&9O(i~^#B%J zD@@m%>flqgz``!ah2tF_gLA0Ik7bu6fqjk_Ch?E>F2@LWwklQT7e4-CXMEi<;04`= zMxgMyhJWaFb&Lj%A|y}8IMn?T z1BkMYj3cVTU>co(9X9Uc7mqjIC9Y#JEtJq*M7oHfeCD6eXcpQ;)3?k;htkUk^}nom zfcX-1DLEXv`}d&%d!Po^e!b{au+v=Yxqghgt@XKyK(5LVn1D#-rG+0{{SO20t?s|w zW|ADiD2}8*^*>%l&`v+WqTeYIks2=sG^4Jk(#!FV^Svq`pHNQK5zgH~sf5@+;jDqr-#C`k_qfvHtOH`Va6a4m7~Xt`YaX2do74=TaqzZ_}sP?AEPl z0ydTp#KT0Ow;TqPl1JEr7RXuljus&vto56;K2BIuPq=~e`MZ&xI}xr;QFnA~ET!r? z7|TeVO_kGg`&c>z)q`3vhfrM5MqRE+{fQo94T|I42UKE~jC*@6JNfy~vVT|8*KAM` z9O`nLEBaCE5|=NZD!ZWe&#Zt(4)gRDgB;bq?99^w^i$p|XQO5AeS4}r)v6H5nI;DyAjt!7SE9l7Sq>y7A#d}G z9%(Rei5T}SB0@tx{;iq?R?iTTn;e5ArN4)(|9GN9jwryvCjmfa$D*T5iSmW+GUdfN zp&{6pAv*^uWB${RYUYr^Wax_^p$7d|gikI2@?d|bzrY%SFzjuD;-xY;DrxR}uropY zCQ)4gJPv~$ikTKGFq(KiDJ`;-=l?1`_8$*-n2M@uKz&XsTKu7}0Eo9`WLf%EmDXOj zc;IFq4Y@h!BMC|z8Dr;t@QbXv8bWVo>4`)GhXA>mRST?cT1OM+d_$l;VA+`p+Dyr4 zXNAfe!1TzZJw;A6LyJ#_O0T7u0PTgOw?(#JPd&22+tKFnp+H^G{zTt93f~(JoH1;3 zp8vi1kdl9IyO)HuqH#VhR&2DDZevA~P*4gP*tJB=YR=&)*$K=528&8ZAz%HcKAH9C zhq_SuROnYDI+dEHP(RpWSs)-zFjLcOn}UDvO{WYzR&?*^(C5E&%iv{pi$yQtbgI#qx$1ilWFN%O-_e# zo(~h4xq%0@>q>L&f=HdW;@>L*$QYYjW7i;i z4g)pEA88KwoeqsXF&~?=rp9?0IouJ1@)rOXv$_ga^d>fL!|#IqCF*es+48gwp(N5(>EsL(&n+ z1cotjHpQm}GWX-+;zG{BQ2k3?haM3$QReG9$cx6V0v}(pp~UnO;Btd(2pW2Uv`Vjx z!HNEKqs{@ePO;52J7Aa=_BBXYiC06?ekIZ|#E<_iWU(j8gJXV6m^~LLLZA@<+zSWg zS*!DGC7PuZmSdx~&pJB-ovhvOzK$ME5$APkzZVN#+uHc`%le@FoC_*A`;FgGIUx?`Md~8nEt^^(?PiP~p>lesL?Olv zfL-@)w@R2Qq)7S`0v@-%x%tUCu9T4aRzq3PHki{-K|5ActEUiusjo_h*{)(;t;bM# zvG^-tj{8WfBSQbcJ=Hq;n)@S9sW*_0@%tK}rjmBgya=G5j4`du;xBlXFkR}J1cRbx z{o!Wy` zrAM%4_-7v>gay6)s9ZR`xbQzdWjTb>TH(f&*KYuUinM>NUq7Lh^s9qbE)!rKa=$Wd zs>o0=f`Tz_Ujk%^zQ^X0d|}GOB&rWUO(}qdDt_WVb*Pfo-wpA99FBd?OUKtwfeELB zlo`!O_cvk4x~qv$Q_cX-6iH3q=#~|BzE+V0e&aa;O8$I5N&~vWTLSK`TV3wzL%wm+5bAo5I`*2 zb=Y(Xg}22T=I{H@gpD=C(2iPWwb?^;QKwWu%e@|q7)j0?1Hx*d-)QkCLj-7+W8Kf@8M z1rp{US1pW5+8!>jR_`l!&9lyHh~%KcPib8e9_w2IItHBcvB zNv|OXS&n>k3u>29G=w6_2oy+nS;6L3F&JZSew_7uUm*6NspkGh{iBI7{F@dcYPkcV zWR*ui0Vh!kohs;}gjG~e;ZFIbXxmIf)fHUQ`3!~*Y7GsO+ThC3+i#p(Pf14@8ropZ zTPyDC&+RwUMv){V*;z%QJK3A;os5vOl96$@s7Ut6p0_QVkfLFi zYziS|WM}g`AFJ|xp6C1f<9S{w-~0ZI_xrrhxz2T6r{efqqZcL?lCVmNuDQkVozE`L z{{(W|uiCO%m5pECDx-VO53dz0DI8;1c){lRdFt}YPyZxIMZy;mcmN!6en_-4tIpI^ zwynQ)<9uE8xW1PzF3HJ!57&&zNU0Q-lwBBlywP#7qSi;oM#o{27^EtEk6K^gH8hx;m=K<^0jcv$LOghs0Nw2rgv_xGFwa|iT{X~{1kV5mMW`sx2G zX%hSfs=*l{Jr;e|Vf5m=mywE~M_X*ZX!eiAaa1=l0>KbGI_D z`chFpZ7OrQm7`EfLqpuUOH#LK4pcZ9(XA>8+V-xKBvFZ}tN5H$^*$s72qVx&a z4a#-D)rBztyY(rQ3rH(BBTB%&JUjctaFoFL^9FfsBxBF}AvVn1&`!>OhtDA^!-Xkc z>tN(PLGd}?-T7g5A-*GnwZ-_CrkKkYJMt|v`JQ**^OG8Z8!(}d zez71FcX4mpSGWTo%X$|h3$Y5a4|BeYFXaPP4L;5JBfq797*-)U%)-rniG?1?V@?{} z{Kq{!E&?1ruTb^s^?q=QTZhS=6lCw?3m|yB+DrF3&Z|uPM_qIacyTQPGtTR9VJd** zlW=$8t36OBTBo6!GAvJ=TXw8-G>%~79)s3tj%4@Py*^Rmk z`^;xt>^0f*T{w!k>-#{cFM$mAHDP<3cBXe9e68`b_vE; zpw4?bYX15jfjabDC4qhaXn)fO9x79GEMO(FP^>l7fCa==;pxB4qjuH{o2$(cabPWd z(_d5u)X#g@o>{g-1r}eVx@J{U3Sl=7B~hjQ9h6>`&LbtQf|_WIS$bXJ-Nnu?e8V zr_eWz6*fYY-BXBt4^qY=mN$swg)gme!u8K3D$r-Oyw(LI!1pkemJKQI5bqOPAm7z` zkuoHJ=_Ha4)LoPGtUXJZC-Sdm4^_I=wb6y|`n2m!T*CpbOOP z+QPB`LaQRZt2Um8Q44TA@4+&hDd2>>f3e+A4fKQuGYY@>Bg6-L#}L3_A?-c z)eDd!2C?x^WM)2ZDeD9MJf1u#9BH&N3mvNP{G4D{U*+;^|F$oP2Q$i7*r9B++sQM9 zZDPe!q3g#U-pM@SO5U9bD$8+zC1hwMh7^!duQ_1dW0q7Kv4@w@&Z4UzV|hAy&3^PX z03ar?wL#Evp!z-jve7$bIheATj`fbPydRwg1;YG&_KnT}9Sbgf8OQ!LcYYQJUx}>~ zR+R7{rA5V6Lo&- z2rQ0AB3s@XF{tvBhl`}i@W{kB7eh=aii*nbi{}JwLTJLl9rjpKD4dlJ)OK43O_za( zBuq4rFwL^OZrJdNP%=eQ0AA6p){{wlNYDOc^iGmkB^jzF#a2T$e=pkd=fA9%|4{n`3UwjeWz3Go^D*LgAwW3wPpHBUq%R1 zz%PVEN)^*tpObjAkosY#Q0IN{t{n&~7O0=- ze~y5Fbg`j*sozi_JPgK+ijXU%ae`$CkJFU#IBODg#;oz%+o*dU3TTF2sIbFXI!Btx-)Npfg5wF9QsVHOZ%fWI znSkLZdYqq-W_4h+54s>!L*o zueIR(`O1>kA}3u+NsLv}-HM;Pd5zb8J!;JyUgOWqw-*>5y`qJ$8h~2MFR-fDujU_T z0!>YCB>GjswGIPKstyRP+g`S4`0Un_S+`Dlsxp@ z+|}yZBc`m)wEW#)Jmtbs;NU6mhzJeODr2o60hdcbhb| z*`Nqs?DkosIc{Bgf@zu;=BzJzjYw^mu`D&+kS3V4lf+M^OMKP8>ykf=ft z6e{xVWN=`l;6E25GZNg2{ZA=TGgv=L&#=gi#v)xGF2rSP&wG1zJclY>sER|$bGI*t zjta_6M(GExF+Q6Q2Hb1lv#v>c|Jn@pTMyFlxYC!$GT1ExbtqLk@Jyc_#TwI6XZQVT z4;?)xwX}t&;NVf8?xyQ1awFYe?xrhLsDJtgBUFYN4lBgu9`b%r>01KMSZqJs zEDfAS9per${ZQ5=zxQwR4#4%Ebis(2^x$f5y;yVRiM7$sdv6~!S)HG};e3^#?20J4 z*dyA#tWAQr&AAx7;-1*OkJ?G@Uut;tnt(Nqj*DX7@X8xoddH|oGM;o^F?9H>w)a?1 zGQ~0;QCXed-%!H;qNDC-LxUTwL4N~yg05 zOlX2aV*Yl@-$MKTTr4qDsE0vWcc@9c(kr02W{H>d1yM?Yqt!d#W4_nSmh*xG0{Zti zDTzON{8$_>l;)g6T_Z(nT|uotdWvk;pP%%fKAnyhS{`2Sw0tMIlarEaAZK9(@=Wfi z6ru-gDTH2db-ho9*+{1ejefv|JzFbo>n-ef7@!Sjg3~e%S1~t;TuMsnDZu9Hnf|Br zKPSo_Qg*eMM_liq?^0~4<<`U5pDo09^xs7v7aaz3>0+6LE0kkm(HvKbZ4~;KHD4w)1Ptx!2mWFF?

5!hivK&!2XTO*9?Xw7-L`>DNu(ea#itR&zsFmGS9lu(KfC9zsU{FU9D(rG^U~sIB zb@mo9&&TdPDadO5W3%tV*@w@l6GLo|gVROWoT;bNOgT~wpFisqvj&e3?TF`}H(dLI z-`+hz!*NM;Z1a(laG^|0hHrTl?R^-sU>dRGK_}zYEQOqs5W$6zOb_@Q*{t(hDl;i) z1P+26Bq$+)5mCA$o|67yVL$q7dU6q`W-vz2fk6}tFtt7rh=PcvTrnV(2=Myy&`d5E zRvlk}oPI{++UF9r8#=Ry=oc|oUMiLu=zVopMHB0GvGp97QlOifnr6sT8vs(O21WoA z8=GwA%T?zx-!B?r0hhFh4a!cku?2vqS~Z~dgHSC7@-_-xS{+|o%@Vyp9xHH;hDgx5 z*CUHlT2%B7pJi*EQ$y->?Afa!HUiH())P;B(HM3#9B!yxHe25RqGb5?#AGUox;xW$ zk3?9*__oe6GBWG_{n7y^9(Dq){t34C0l4#P0LzgDamNSK7|{p&slJ|3iZ3eCe5sFT zkL7v|?39$fI#|O4LBpVg0%?CRG}9JGTR?G>GxfZoFF~0NzZJ2zw1IXlByYiC-&UV3Ek_ynT2@ zCCh=zb0oBV{RG8lB>65&22X~-mUeTcv2w<^29na@v6J*VE9~?rH5A6lFK1-I$AIEb z^n^kLcCWdv>ud`^!y>}(MKjJ`#x=)UJUMp$XKn!~5vrj?nmOB?N|`E>Z*gCnia~I} zzSLX$avvaG{)qZ4?Fm@(+t*#DWUeV(Wx``P3fO!3kGx|x7gxk5xi3<~>X?kz_1Ua9qA2zHE6(Nj4AN#km zg$ZVKHugN#)b^pgu@^^?C{1Fw1XPa~u9I#cO_8>+NOci)jj(X`>--~7R=z0z`oM1v_Qx=rIrd7vg#=h1%~J3;KX)Fe1`D#5 zOx_ejZ*Z7wa2hT71P54(T3WDWaCz3^rwpAl9c3uq(PbvUv6e zO`gos%YXfl@TxMKC^kr@nUEp#2Q&vhXi(VH^Zu&02M694%2vf$>S4t0k$JTO%Rauh z*Y8RLr<~EI#qikXDxhbmctq`IlSHv2{8%C?=&IXb99fj{8UetS)8r1bFfd&F))1Mt zS9zYWSt-r56j&n?Ho}f{931sdxBKoNIy=|$B(>}2;A2n~)i~*AgvY8IS<4TTvPYQ@ z)&xaqHS|;STL{egL_**DhwC+986_kn%->!{;BcR>LCzWJl1@Hz!!5GzGqNyAW;RIX zwy=bRaNJuBo=;lBM9l36#}-azMLSSQI$aq69|>@WI(|yEiwbMCJ8z8MY9!0by{W*h zvsI((o8^)1a_^Le;fEN-1nvA++KH<_FX;0WUa;7i)mNY(J;LQCIKMg{ufsC?o{XYB zMm_qJiYL)gv5dSvHl-_51J!XTcJBoBSJv`TX&TrHVzp?$<|_)ipWwNlghp&b`pk^| zQ2FzC^?->Ge}Df{1^LiZuNLqrZ>nT0_JuX~>(@yI&7RC6hW1;GT|T*5Lz{r^P<=ip zZ)8gi^Q)w*jgn3)@TzK#Fbu7q1^Y2-oegAGI;mE*c~->*86QqlET=S#wVmGXW*BCo zKP4^YH8L~{d%kpe8u{(Cl+}))kFSY_^o{PsaW=Nvv_S2kSi~L$)YXEG^`YDsooBxH z38|mkOGNYZ))%LD9F2B(-XNA5X0z2r2DHEdjL5_hidTaru;Tl>H9+q+LrPJ1nbE)? z=@2C)b@D}L7@G6d*~Vl<^=4RKUng^;tKvR`egUVcgdvkf8@>ovhbqaWESpg7V% zmce>&N!1xy|241I*~i%BY=7cFCRhQ*sb@?q8|h|LSVN9f`~73Q3DBhwo7^nQmMbC< z!MmrXr>44}w7ddQ=4}1Qy- z9d+CzggyJ{(WCCvvo>GvH5Pm(Tycm&DXlIKod-jZ^5MCVAxoM}-wc~FPU?otv5>-X zOPZ)@G=U>41T(`oXfT<%olcP5SY*!pD~OlQQW39s zCn5wneSrJ)vv39hKH(&v0v=UK5K^~xJwL0ICUY;mIUk%Xn~%9qfp0-II28=SVwz2D zXsf}~zaRJXa)D&g1Co)3KHJ!>@mqhTHGhX0ObtPHoWxT%X=!O5V5XRVF3A^Ko~YFK z>QO z;g*6@#XFT_%_3N`XphCAA?pPtuJuq6i6>!sx3;+e_k5R`_A0g2Z&C6$f@|IF$}Y{L zni-;=1q&s_%5%qtMehA0XK)3;5nG{~s>b^B<(k_M5ZWPt9@472ISV-@0zUft`Nc+G z!W@iBiHSiI4+}sMAgs6`q<-Nj(v3xgrw!APQ^e6G^woL2RxmY9V%IG?g$;hjZK>hSp@Y1-VB6784Ww9QB9i3IM3D{`Gdt2q;n|;Kn;DT3 z3Ef&6I)$CJTMST7FUWO5@@owGWoPRLtN`QPLS)sTMiZrE*X&ilXk+sn0Y00G?aYLG zGz{;Yh3TdHm0wZ5Vw`QKXrnuj&-w-g*kpBympKB$!&$*h2&;6&)KL}titu1TsvX_~ z^d`NF^|%sculDQ_klSxwV}&lx*exSef(IT-w-ISo{#8z-Gm|Xmo=I<;^P2q*LnjbH zxAKL<5~~w7u`z{_U88a_Kk+Z>g3N6m4jks>(9^uq)n9#xwY*Z-=CeiYmTlp@`&>eOLG!V zC`0Z%%>Xg^z_)KTh>eb#Gs1PqHI+AW0~1e#1>4YHRV5Y%oTTaYc4Z6>^ws?V^FFM# zI0BQn62XhMfr1Zlv=tW@zitBc(1~GEHWL$*9LqLNr^O%1pBvKd!g_TYq@rSCVtSi7 z-NM^Atw~{jK-ETH^HpSxbJ6LcG~Xzv^2Jdti5ByMTxah`W>YPhto>{~$ZzTmSzcr9 zsWT3-2{jkhgS+!^#hdr9Dz~eBzjbryUJCy7u3J0r&I64_j=1B=D1Oxvq^}CXqU#z7 ziHXvXsYW=J(@Mup0i9-${mLk|mpK1*72y9TA+>EimIy|+lF9~8)>g*d+a9MZx+2E* z$c|$=cTR`6eS$sLZb$)K;_o9f%Jeb2-aSb%t9y}LS}IiN4L+!aS8n!>oP`|TSoLjX zzO%uKpxbhhCF$fDB8q{p;dKtbW>l?Gg0zJ0URN#8vT@WOzd zcOBLZog1#EgOJ;|aK8$}dX34iYgVf<65 ziOR5q-2&hdA;e`zo9287i~vCQWb-X063I%-qJ&+}j;JiKegN?pgGC#ME3&~oi1It% zf&JQ;gZ@!0-CZDObhDig^i~q~E?D-t0tMA#zmcjS|9R+WN7+1_R>OOZoh&)Q8yWNo z5us|A*{y+I#qMX?QTKkYncGD-hYNQ@9B*rXzn-;BFlFo4>SkC8b{5EVsatdrTIpmW z8A3>b-}e5p!y9fpk9EENTs^J1P1vi1c;UYknMjt$h(-J0T5%}kKY9bcTMS5NADY;* zU}weVzEEp0gZ4s(KYnYB=2}%ZMJ#r2!$P(Nk}{GGYorZNvLKx1MA?vGHj~46unEQR z_yLfqe(w)uUM=EX0nZ``Y$R10qhW9u_=2mAC)ZpB!UL@skMVnwp_>Ri0V$!Nuih=B zkqG&4W>gC#z)t->XLJ?M&8eNLfsRbXyV#%ihGRR~ZqTIm96f9Q;l<5Yc!%CY+r-sD zxxUR{ZBb)LFgF64S*+j>Lo9+8OZF+@Go;^$A!wGGR^c9+gb^R+<0lk4o_G z2)w;uHbQecf^j^}HH7N!D_A4=!{IOTo~`V03REodGD62RzUocQ(d5T@X6^Fnk&XCb z3DhLB;6dMullW~hqoXvOyu<&GIVSk}blmfCf&UJBy8jfG5GGjDJ=4D2V&soV% zw0oDIPa4Diu{fAd-TDdkIJctJV<8FG$g_*Dw|pAD&K|S;Q#mPP$@#Z_hAO?~RMrl#a<$#k(4Ki#V=f-D3IAgETv2 zm#@h4w%a_^TYpO@hRNC0HpwKti*Bp1N8>~H>jpQ956r zxK)Kt7u{LZj~_qcw(6DGeG^R5-yL+fDDkm`ko;k7b$3wWNor9-i;Tf$zUAAfL=t4t zm#LX3c4RkyWZz0pcClFm-mPTWeh6;3*FQbb*6UKOc#vgvYgy@(%H}_Lg`#`PWleze zGFbJnU;A14&kICi>0Er8d`nf`Z)YFTxf zBO)ua3`(OX10pS_Rw9^?0j?7qO6S<*EzFXaM5q{wXU_&n%luLpqc&xV*s-*2Df^~?L3N>4Ph>_v*b z99bO04EOB8f;zKOs8`psKNNL=iS%H5a(=#|#nrW!D^G|>uZ1MNX0aA%JML?mwa<*a z8DP-U2fsUC+)XwAo{C!}MQs~~o+zkP!2bT3x5&Wv99aeB?%zylVyS@G$za{JE#pV@!1jE33SERgF(Ta6F5vPBJ zgDQG9tx>eqVof2p%Zxtx*U_Bjz=<sfe38@s3@?sYV5rpw21sY+=5acMC%Ou>UGx&Hkkp+{0J$%U zo9D?aQ#7)^sTg#rF5Vt~@zuKO%VDGXh}E~rK@6 zUaW>};DZ8%y?%n#v;47@c`>7Ah$%T9&h}){5AW5zyH7!KmG_%WbzR*6uODHkR`J!g zBS&C!4-&-Pz_0Q`KaZEAl<(lca~hs*X_t9xwlbXiv@zPL$07P*GfV}`GdGVEJg!uE z*6xDhR)EEvBNpgPDuiw%x__G;7`Ow6g5Zp?a}(2u=Pc>@qcJ`(CLxx z%N0Ae6%8@jNW5!*XuehRh=L-N50`Ie{LL;x4u)vDlI=JsCIOJmdx1}co2yt=4t{>* zq`U=cZ{9f_B@&?SYsL9)1|$!3I|6E-<36w%vOJKpVUqs%@BZ8Rwa^ja`u7`p@BhuQ zp^K>~)PBfg-W>Z#H6@Jk%@dW5S(Eapw|!2>tQ`OWfV<>tw{e-gbmaDEDsOa1e{9 z-O;J5ze=R|mqxI{IjSas3NMbhMu^^J|1T&)V8G4Q7**w#N_bV?Q2?Z zsd+@=InF$cGz)qD-;antUY189Jh|*<`w#y<3<`N**}2FOJ3Y!%5K6l46af+?6>aU| zmLWj=5L3g_sSJN^Xxdd*S5J0C0+&YyuqW3jhOI&6+fQQablO@HBwmtGbAGjHrOF+| zg$AM=0$v!y1dl01Fqq*Esb9^H4zuVWaA&M8vgt1^ahe*C&Juz+x&0CU`A--}%HEI6 zlR``0pH)yuIt;qnH!7}#NxZC22f*~+f57-_`JKtQzemdd@r*WGmH1VKyL!^!&Mosg zKPG@#C~Zc^0^&-8 zb{4FEG=V~gSZPi>=`r%OXdYtMqyw}f0IcTJ5VgR7mHvGr+_ddi_>rYHIb0w^tg*iCYW#CF{X$@3jeStX*RmMlN&}_{kh&S?GzI$ z8IGe*Jfn0pWAgG;5nK%EBCeXaLU9=3zPf;L=wvTkz|dZ^fqJ(FEVBCe2`M~m#`4>0 zK>j&&QvuH$N;pY`j_d^0vv_`gIN%UWS!KV%VS?=oQ_q_(q4Rb^K0Lv{>v%3WwH{*2-=jVm5W|>qhJE98E;vO7-WvPibH8nK=_Yne9z%_3S zfnR2`M)_6HYK?a0%Yu}L8C?B?z&GL&Vj2$7;1QOB5;_IlN*E&6r~MC^qfX^SX88(D zdC|@TtbRyJTRR*`v)#qEcRMxGERbR2#ZwQaU!NL{ID1pZ;3#60>pTXW_yq4GXB6CE zM2l+>F$GDi`rhInNzWL$xs_Lc6~4UR{kW!t`ha9=BS?rd%S+xPeD^bvVPP!LY4n3~ zyXiY&*7`zJCNDCubPCrM;m`?>xFrAN=t+Nfy_agWmkgq?V`hKipoI1#1rh}}+~pJ^ z1UUJJnQIMtt~2;6o!IxY^SH|y+BWKQ*RJ1f-hrEWc;MlZaeUZYLb4ZS!M~qD>f(Vp zkj_$4B*Zqsw3Xw44t$tvSzGTM84K|0I)Gu!Pg{HETi|Ck1+v^9zA9QUc#a+HK9SK6 zg|+~ho$0xqtD|2;g!I<9@9@^YzJkw>-WOzY<-NQeJB*0 z8z^a6Qghj# zS~8@`%A%$&H6qd@HS*<1qD*~@c2o&*htYq&UpPK07~9MCLHjls1Y6C5b+}_Vd7y2H zn${fKPtEs!OcPHVoVpHOcN#`#RP=^5A6l~rLdMpeQ-oqq#=X>w_hOea2Kw+RT;Z=n zn&Y*aE$Adlpxrl1A>w@{-`~qp#rHM>4p^#xSTZe^$Y}&fG49SK7;Tx-cwbxk{?2-3 zD`0P){qSQ|0K}+CzAoj%mRee2-LTuPbHIQL10Eip?kVlOt9=gXceqR&B7OuX6E(++ z3I(Lz0R7bU4v6lyEovIYgDH288Ff{tjc9otx-lcg8$4e43 z;7G%FEWB*-AS;xd*E7R|LZe`yGjWf!=QOY>{J??8|z~#*5sT|ts zNB`H$LDQKc%$tss$39QexCVtUL5wvEb{nO_#`3gW;SrTD2XI#p&WioAF>j%(R8~>~ zs?01QUY*w0{iC6@}>GvJ8qE`u~^K_tX zo_dsLm0WOtjyp+v_jV&-D_fyw1%yegxIgQ8ceifV1!m@@)#q#+9J8!01Mf+*N)378 ztqW~+D?s?oBi@*xEShH`}doM--MBVvpGvV6*T?Q1Eph2Zl zTJoJssdD=H@nKPeHW#(;%<&*=7@~4#vzlku#nge;*fHo!$<4HRLi8l7=Bxb%oUug@ zUNoAUn@{!LC3g1t3DghD*^>v?D+n|@0ak5$K%j?5F{+cCXZL^Yj=je{7$IS| zIo`%o5}+Yc_I)!U2c5#1I>NTUb76zjKSf>w z)szQ@-XV4whh70dJqVLF^%r1{9Rvq4S(w#$c`j;#>EVmLlADRQ;S*?$d=pUF_xC{v z*A2yuY%axJS7Cs{OP$9?Y8Sv)z%l4j8h3=vTPpp9SElpM*B%Wk!nm?K8F8Y6xABCr zgr;?&%CXLOSgr+I7A-|U?}(r?OR{WnI1Q4=zSDUtOLMhA9vcpRw{bG_K`VnXd@*ms zkq2Fh;6tSiLj8Z&Xo8ifwG@hs+RUVzAok%gsttn(2K9L%+8 z^Wc+KI#pMLOru1aM`YwmD+;I4+LD!dgLc7+1sRMweY$TvYvjWGX(GfxT2{V z<_+r^Y9yzN`^en61y(NY!!6l+S&eIHZT~6Jzj7hERiqkwDd;=zl?;N&)+EB3ldP<^ zwOv5s=z6aGun#ypo;p!4??SrQk!$AL_5>$f1}qdJ5(U7YgwLmPY=@EGMTF1q~ar5VqbLCT~)C&c+ya1X78w*5j_~RQT&dbWkcte8- z`gwK+cwclKI!qd_Tp23px*h;>Xll>W_11})yy3IfDGT%FK1=hDR{|nF&K?YkS^|ML&9ecz5ROIjBC+8L@7=aa#8(=Ly8z)U(tzKFKP;OKNsDbeDbB(FXbQuni(BP5DsN^yw4g_W9{p+9dFs zYJsIOcDv4ta9JshALPwaa0sZyI$z{SM@gz0zJUp;gZa+)QZMC#V=4(X*HEP*>S74Izo*x zEBK3(g$Lho$?t9`}M1`&GB)L>}$RnN?*v8yA~bxobUdDBR_-k@-C`mq^nBkb*szd zgZf#W92*&QJ)iUAF#tN1F>KN1$MKxraCf?t_@HNicfF$TAK;&uAFp)%CAY}WkpO?P zdyQgoYq^rdB-wX&ML*QMLFv;dmKu1lc1+{#yB^EdXL!yBrDCcDfA*~4u{JtE=<7A3 zV@1KibTB_G5(a*o!1&=sQ-{y7&B-V!Rgy=Y^nP{LKK9WJeMWi8OWu6uEo`3z2G* zDa!7e6D`V3_86cb$bL$a&!;=!Sr^7D>CRt9$|_bNhFLBnBDaiZ1tcr2B2L_uiECWM z%8|gq>#OJ4SVRJ-JK`)rMMafk)<_$6=7xTI=W~lUQ5Ou< z$Cy_j;#(4wI!;nb%jKv?f3G)3?gq}Z6<$(ZlI$Fh#l$ld^Wvg(Poeg}+!MILf@xA2 zr$E(s8%*b`D*o`Mz-vC=L_FTVZ#P@R0ay4mHhgRl^>Pn&6zj==%Hm}z>iRI&vw`$X zEuRvr{9+pK6Si;8HzpYYb~Ed#$~9rBhrjj(blY#Gd*!*OrJixz zyYryG^!%i?J@HyY!Eh;6^uvQgg7Yr*sR3dyp*#2*wYtWn+m{NU>%>0nRq00iuT=z% z=^pQp5+0nx_Oc(khQZmr2WoWf>^CeM$dv~k9xCH?e7V?f7xHg}jEvUAMwut`cLd6+ zJ8gP(`l0KA z9z}rUb9Um28$fb)0HkCN;qq^{oewuoXKQVAhK;;v#T3fGbv6h=flM2t#&WZOopmrj z_096av}+Xe766GNnCMD}x3L97ecOktuUxr&8q`I92R_WzeUNnJnR)!WOZL6HICmMk z%s90tn3(X`;|XVZD+SYiL?jckCf0Z&tzp}~FE z;ce@g^;x0#yzG0Az6YspruhLv`gOo&p}eiIrl z;WY@)9RV?E@_N&*44QVTBLAr0T#!Ct)`BtLW(MPd_CocTx25=O*UDlFU^CC)A5ki5 zd5X){r)eA5-+1`DP|B22-nL78TMugMgZ^1uufK&VA9&d|ye<0=?s$&>`Nufq#6%wM zR*&F6|JvrULw6m?D4(U6#{A1wY^G~gn1QRe{`~B8x>HIcRf3(ty=GmpgKOviM0yAY zzMT%(sNbxnONo`omQ$@7(~kb*c@%(>qVn{mYV_7wh^fKXP0|y}i6EpjAHr`wx!3E` z=H-#xfm!z*U#<6Z4b^0H3WCTC=j*{8g~WcsiSGf2Blt?TMV4av=#>Y*EjPXLV7dEI zCJXOamlM!KAa%Q@L%jQ@V^%s zx@QwWyojk_vjCjf^E~DLt>wQ1A~FTf2)kN^mFyB5n(S2iKFA{=l)SfUjrYp2N_8LueNV6mQW~O54+WBhn|}t zMj^61$fQ<6MqgilfI5-s?*|Hk7Ixr##tGs4KiB#s1FYTUI(~-#2g3vWxKASQYmgwu zY3J8&t)s0+x&A@{frVr5p9t)K*>+-DPy(J*+*QBL5cpp^1ig$z)bn=rQl!~|$S~mn zU>E5+ziQ9#T02mE1v^deF) zLGHX*+|;B3sY(4zw zQbZg|Pp08nZ{CKdK#d)-0%Wfm*2iG5&UHVK;Kvs=wmr(zQ&&HMR9T1=ekRot>79TK z-pmd7++wqL*TV(L0gOhT#Ce#7k=YLjT%D@?Ohf6g^6uLVaU0E+zOO|J|+=CD+cFy7fvJUX7 z%B@3~*N~-I(;hho{K8W2qvzB?%QyIlE%U=}{v^d{&XklC9;;5iVz4UliEC){_a}3L zxn78OSKKc(4=Et7B16`KKx`)izOMs_#~-)=1s=gF`xQKX^k@J^s0KnO^XyVz$)|Ex zm$r)?#dgWYCMLxj+!8tx7R;FTMT_4gYCrP#b#);F0~FeKo%}2VgLiIpuN>&2KAgh+ zaQilXH^_6GcS*psncGD3pb~3}mn1HvJD_F_T~y-egT_!b`eGi4CuuM+W|0N3-jl`buVYoew{Yr`5m2iUiIc8#2f|#V}?D-S4B%UZQ=JI)6ev3BC_|5r1TA z`4?s7v#mOdPHGZX$ZXnk8;z_#xB8Af3k{GnICD4dkDWgI_O8bpWbo0~7NpYu0V<>x zX0SXv4x6B@mXVS1J%V1EfliiqNLx}CpW)T97rim6UK@I&bLEF2sy#CEo}13=Jz z%K`vI61XY~`111b%)AT0o_58vP))KjV;J2&i2iXYTbUI;K8AXkgpT9_4h4Q+7{nrG za1TvKupF>@Fa~|lB7=1K($90sX_|+BG@Ki6KBi+tlUA|6u^E)}X06Z>VgT&^qc8Y| zNSc**A~u#YBW;Qf<6p+=#-SAftYrfr3YvFy>^k?~FJk*TrO5_RV}a>lj;*5+iERg~PEX{#WWX+S8*%xbK|>#o4_2XV-3VE*WZCFT#GO05m{Kh;&{%(R6!|7Q`#*_}X7&_$QS5LH#sAJp(3S#t5N&0m4obgbOo$Wo5te zEcKqlXRb#e;FeRv&7nVaFO#|{@j1|nt6Z-UJc96Q(z^v0w>paj6d>D-Q}5WU{I-`6 zogo*Jit$H#pV)(k2(CTKzQAY|jWA&5R|8@Dd(b#nKMYOugXLWd?A4#S?>B`kIYw^? z3xoLUu6CK-HC~4mH09v%Vn2P{eoGx=4<9{$VaKVH9gU7#c~Ip=;>Ceu;Cp0}<^r_u zgmQt>+(I_OQv~a>c{u4FG5O$3>im$v2Y`>Wapzr zD+Ihf@UD$j_U?!^qb!ir2@eG+cgWF!TFX)l;__6@zCgbiSCqrr${ga3odC#^$m7Py za~hz{jU1}8=+ZjAvD$ZjQ8DDvr=txYY;!L*R(|hA$b*laG(K*~j~N}kmc{7`pX^+5 zzl|Wo8;;NwDZHDd5NsNFky8>t@)~4rTph0ia<~8p%}11&W0m%ZjC>*fEkO+tBp-%a zn9tgc>XtfB3No4sf;tOCyMosWGCt{V!N^FPqb2QFNJ2usc4E{V-CI|$66W89^yXHD z7h5izkI-135ia);yH6CO)&X7?w&|5F$z!fFen|hav8S}-&X8$SGK5RFj|c*SOkZ~(;nvvgWPIP}#>g6sqBStB^s5CiiC7;>rC;01&T(H?KP+4tma z6awDp0~805hKLi4cQXdN1jN@%`4yQ39#Ify$#;6hc3#ra z+eYEJ_ZNwU8KEEL55s8$r#B?xJ9hWqKaR437}g#Ye329}&^GlTeT;m-b-Yb#m6 zM5zVA+tKVsFxGQM-zCHX8EKNW2fY29Aek71iORRmfwTrh(4a2~fEI=%t=s%%VSzYs znwkoExhxKf&;gJ>2O<8|+LtRe2=lGtGeJI51D=cYkWujF%(Nk$o~glF@s{5O$c`BC z`^QmEQzcnMk$+x)IStrF>^c5~K==Ez+S0-<+m&+=|nO8wkhc)zSZdT1QMKJgJ zGd+P|f<8P1gPgd)crXZdxh#;0W+fAijg1}khQdf?x-xHKCG)Uq;-G6|c)2|F7-r?_ z5+AnVAa7XF)-w0+Jj)v)uXF}w!=e-~k4fMYV*T;XS2j(*^xf#Uadu`TG*$_F zDN^!~;-7r_Whyj5l`DYy2j22Iju=Wj5`4W1$E?XPsqYVTAEHm8-kQ;uw%z#%?6uf^ zhsXI}xUGh&>#7aR-Cw)t$@8P;9uG&D>Y)}S;we)c7MTfL&im|ss9~||Wx~pL!PR}% zNZkR1-#3c-Y{yovBz(X1z=WVPjWQ^`RhI3|RCiN?;?$7mC;=a~!l|^4A;pA3t#t&hi-N3Tp zlDHX_)Whi#-$=W;r0=~xFI-EoRU^}h;c%SFD|I1htN2Kw)628<_gno4cCbEqFqm|Y z2w?9bTsLh$E*GLvLXFwx$LMath)*d2Fv5d{Xv|N}vNh93$5Zpz{F4ZVL891R>xb;O z@14I`D^55q-Cw4ztIKYgKNs%I1fF;cs1B_T|Dec3jfjANN|*ZE;HZZ_q%`L{JYEo& zF33_1-0eoZ1MNX2wHD`{TS!BNmWsa);#@iX>NWlR?jd!D% zV^&adl^`xFmtkq!=;A_uimNB9ud&eqT#HaIX*D=CtT55)1J#*@3;rKFbH&Dulw)2^ zi1>#GF~NA?oC&QjSDp)aCNI%I(w(JAsbK6DFZlAUOMRd9`=Q2CuHhgkxxVe28E(-X zwtOZNt>_vu7rs!{?B&7vG$@G9>cN?iOFARLY;o!~$~w8v0iAx~~PE7(UnS83J z#qT$6qz(Afc>dm*-ymfGUNf&pts>68KzBj2oh3zf4Aj7s5eG}Q!6h+$gy#F~6a8ih z?`2K=T5-J-{yVitFB1S@Hvh~{VjD1dwy z-2h25=jc+YZtA8wZ1Xm@KDb>5vH%@<=DXXhMo|i-#*A+rEwRHk2!RU8xbB@$DqAFw zR?v^ti#Vi>r@O^#+=}w(e}Z}2+4a`%Y<(f}56>aLk+{}yr0nm0{_jWn*Pnh@T>n3i z=NeKyKbw}w+WFxBj`5q{0a>j7mF!0Q-(X#ZJ?8vXe&DSWxD}9Vuk!tsvD2JY)!E9} zdtBegcNX(ZQ-hh+UssGkYH){v%pTviufY=EzNI9#9CtEOCGDtxdH>qj5@Rtb=~erN z%PIa^tSn4#nqE4Sv$P`Fl3_X8!68hwdNEqxX6@h?%WwNGF`$z1pqZ9fBe)h&s>c7O zZ(g#P{gCkd1I80UfjSQY5Pwvqk!4r^Uaste3O5*1ie0RB3>=-EQ+5M^Dc4gwV_M#6IA8> zF~rlcm+Xg@yjn{;#a5fMp0C!d0bWCcO4LqF-p#+-{A^BJ;9d$jrU!48+1$y;?fgvc znci2tj4b!j2hIx_GxSOtzKk*uUs|iEg&lWS>@@7SqSCfK6Z*V3fvhAG4AzUhq$}h6 zUo73c-%C{N$8m9AEn3PwoAXu_W&)YYQQiE#qN+;J9)nf2%_;-iaA<`whVD9dO%X9S zRpju_cfkSYmEW~u6r_GL!1L$u@k(>~DCVN$yIXm(D!da~JrPSPQT?!fAoefZ)y zxVpHHd=sRl%}cN@Qa}6k4BN#kj3LmeM-26rndWe`9Pec{ynW)eOTF5CS2(XveX(>{ zS>}GO{v1m8Z)?3u44aVw9EePC-C8;IIegBl`myo{B(y8Dz9_G2n^N87+1dQNF>^{I z#-ar!Eu+oG#MHUhv|)*;f3?!FgSe51y|ZZxUax_u^O+vB^Xo zQB$f$(&{s`&@iLDeC8H0yB9Z{zl)(I%{Qd9w6vEqW=E?5^hYF8d9My1-gHOXdaPSt z_>KyKH@p2LbAwgR!js7q^TP{a-2_Z)TKcIy@Z@fAx1K z5AKf}X=TYN9*dk~J_UnW7NAe)8kMP2n8~hFP&XvVQ-%iyQB1jJjjf7Ec?70M15lOx z;*>&aMh~?2J}j5GfBvom?v+YI+l#@Y1C=~}p(ZP6>FJcKz~jH4EQuwe3v4y@Ufshq z0p{Yh?rTd1h+odNj+{3z_`ym?>1L?jRX`zZhnrb)(+*g=ffo#Fav{i5o6$&H$#Ggs&^9$(XD|CO<4^LoY4W@Mqk|x(0yQ? zg#jvbX(b*TV2ePH=f4<#%XA2x`KH z;JKgaC;phSIMQvvPjUcIzYn_&x)rSd8FV+_+x9=SYtnsud*#a2(}$GU^z6sKeCCkq z2WzfiXrSmekAPx=oRrLI>Duk%O#V1-bO(4nWsu>A5}a0~jcap%wJ3 zW~e^Ia;m0XMQjkD6+j;r7Iyt61xzXeAU;9ZbN-%=$Odw_^XmURWI*o*z|Zt(r{lFZ zZ{FAlc5EeoO3b?Z z7{4s=>f^G=CLuOCRiVdRIy#$L|7i0l2EZKSRzCUSw0RX&1@p?6EX|xZ&hJnF%a@Msb zutos&f*<(HIaB%p?&dP+he3`J=+2$ij-RV8IV15t*>@$H-Tjxu*gTGv%S7SW@iC;F z+_>0Kwx`hs7j-gh)75|AS}l1Ne9p2OrmZRhMtfeY-%x0os!@* zv>Tl${*Sr$j>me9|Hn(nEXoKO6(QMM;kHAelqf5*5)x8I-09dWm6a`{G9#N*LiQ~g znHeD@Wo3R}mvuVM`FuXVKY!=(IFCo9+xvds*ZaC&uh(-$^If^e%D%c%bsDxKc<4Lx z8@YnW(B6VICyGiJUPw)IeN~dj%st7vvE{>K5b<4fA=p_!O>%?J)PHfe95{N}5?Z9Hx)N|h9yejC zaKT61^%Dh5k($SZVRm^qhphD2(KSAF+&w%K>f`FRo4*HaM&B&o#r$|JukoAd?5^#F z&==bI<%`|#dTF>>41LQ1Hu-WPD6`7?HZ@7`c7v`D5I;R!A}iT{6+)1JwVYB=(B7Wj zVky*_alVS{c6O#=SVBSqNvrJI@5cTh!iP+%GFIYb-P=y5(l-{Gq0-Lp+~Z;|{I>`d z>t|k^3rzNF=Dws65P*Y5-=`PA#c~?DAS6dXIX&K?+3Rl^#(nuHvSmYlcS8)rwKa9W zF`SWB48}gKmM|C1jZD^C`!q;^)o}KT0MEu*ioFR;r$k*QwXNCC`jxaJLevwrv}iAf zAAK^JUm})GR?(gh|K}s~6qLH6Q*t{yRmmRdz|yS@xa11}6=R9C@@mps7YJtsVEEp6 z9Y10HWYm;p{bjWk-JL0FPZKb1s~Eh)VXvl4Og@x@54M$~7e2v|y!5B+2M$io2Y`!$ z*`y|#+@5=V*A*eC=(v>vp{d4mvV}ra6&atOdK{^IZk*$> zp262u5&ang-|UWXcOYA?Jtmk6g63vlR!)obM~_mK{EB*P4lI8AL^*XA$MUZgfKbz@ zq83IPNIpHD=@bN(k&iFp$X*?*0{HbPv)fYkuVz>nXZJSWFuiZV4)5RM)cLi-kHQX5 z{8Er}ZC?cA(+ioW#iPc8m2%qNcX5pHZTyysP)v7`*Hfn%RW@E;-aH94o2|BcV}YjL z#~86?44uPIINZmjF#v!WpnDHgW`+SGvL$UsUN*WnKd>G86cMhSogW%u<<)Y9XM+*( z&!c^F0=IrbdV6Eumz@bb6=sf){Yd}=^5Xys{X8}ejxEkZ)U+>>G`k-Cb7gbhK@x82{wHv?*DZl5B1y4TgfTO&TfBP-lSj$_77KmIO(3HPHx9K4Z!TBE* zNHK9?0VcWjwVE>YkPG_ya*TuqmNLcyNag3wpC1e@1;18w&OU-t0^IxtM^j>Noygn+ zWM{$JoVwJve_*QNgX z9z+na?dX0wn|B&A^k@_g+yF7J46XbTuytE=KZLWyRT%mPQ?bV4?_>wXG>|hMSs5yh zqa0dwG8DRIhauS(?6X36^ok0GXsM`9K}bUqI2J-#H+ah$9z1=S0}zE9g#45Yq6a|9 z{i)U~(JDXi{_Qxe19t#=bJbsl?-ma6>b#T>JSg4|Qaq`ZdE;RfhHGpO!9cY0h5xl- za3G!Akfi*%5Fdc={kE!p!=t5no~{XAmK%h!4}qOTJK_1$HcJY@Ped=Q1@_S_yIj~zmI4ib1Y+O0#h@+y6Y)8iisyqF9V5V3f0 zGO|?VgjNuNUH5av=YqMLN#nMMZ}ed#Kh$<+27pG5+f?Qts$x2Y5*Q`tzku%K)5UxwXiPQqg{!PVynDC#cg)k&f-Q-POKh(a zD&c29z;F~QTk^&h;H&5q-%3XUL<3IQ^sck|-#(@Up+b8THPKJGboQO#Ux`+YBFAo~ zEhH{5oOXg34+Sf1Gc5UC)WnOw2dD9$g^ZT{RBmTT0x}hb<(Y~PYcj2BLSp!wHd&+N zhiCGf5)sEul2&6&7u_=xYG}n))YZ-7FCKbCt+A65{*yU>gIimRQb*w;0W~!PSB7u< z8NyD?Y~A&0SuZfMmsHCM2)=&h{vS!YzJ!`y~=)bYk=8pA!O+? zR#|EhMfX?qCcI&^-bp|Et29M7dosty@(DcfLbQuglM^os@*Ee_{GuGqBrRG~7^$Et zGsOBnzIDo_i|Ltp$rol9(cbJGzd|qDJ^3p1kXT{mp>mvJVK)WOdewz_M6~o^-y)9;zTzwP5J#%Q6W1a1JcaFX$<7A(9aud4pZ*IcaV}8HOfhop;2eDM zqUFqw#Gn$^sa-yD8&6Q2HXi$uSfm++bg&ryKlgqXf7pMC5}zns1R}pZUc~6{n}#nM zY)(TA2ZrQ)+Id`cDkX1KfIq#`9%kaJA9F7R;wjy&pBcFJ&tGr=?`jJNA&u9zT0tJ! zTT$9^(Gfwe1{XXm@X$l*`{oFKx>}C!b3?-c_gxPbU+fC&0g_&h7h1i%<5*6IGa56xvs&U#4V_ z)P~#(O}xUt56zL*KJqU|f+L-@k7<>t0ozCXof9E$ywa&Esad`)-|48Pe~ZT<7B_|5(?CpG15D(M!9TR8B1x;Orf1{t=lj_N}LlWql_ z!M4BKyxuFU~ltrZ5ApTxA53&GAu6rZzxXC4m#nJRB15idrJEBX{GYa{immx zO`9qm-`=irHh0b&VTUpA+q31dyqU?&DO$~PmrLy9+s=+L#UC{t^P>UHICk;^8B~n6b{4s~|O5t~V^UZZc^c>^j5>xTsmHqec zJBre2W)u@4uQFnlUfn}W{C*n7de*k1NPG2(?>;L$ay1K&5VO7Iu{-}%x!mNs$=lCIBjqHB@XXi&rl-1c& zr3P(ifJcnQBM2P-@L06?C(tXfhi_NK$h%BNk%r|@iCjeQ_x_7P zwfSUhd+_3qz>oj`_todwn_9)j!?Ul_tA=J@Wl#;Yvbc6#b8{cZmJ?sSdOmo1x?9oX zFG&ykJzWGA+nVSdSPBa7y;!Lxg00nw4W{7uhT}WR>ZA-3yS2s2(u{wb&?omq&F#&X z-Z)E1Xju{!zetU5(cBZ{`|dLjuxh;9%erS{AH*6FRaE>SJ4eQ|XY0q-U&fmPo3L{A zkgVqiKH0Nh&@9-wPz34fE|@QxP*|?-Q6zslY(E zo+aSXBPv{6KxWxOjo^0}%zS_%n-lC3V5G;GTR*aKs$#uS5Q~wu$;e*hCLY5=K4E2Kl+a;OpM`@= zS43s6sHmuhX7)JPf9ze}iF>z?_^PR?3S7;HY?Q0F67Zd>LurUKot?0k`2!drdiJCVJTdP-UyedJl06bxdoA>U)@K3xNi zkG#Z3!Nv1B-f5J7duVR%yxUeW2nY?K(jm#aqP~N`{yC|0HlA>6kTK^ZYw(+ktFX|4sJq6M7wUt z<&uTjZmSr#j?1-It1~hj+4KTf`$h)TnKw-01vK!07W@E0PEp!o;s+pmcH~(-(J_G7 zLo_0Vc}xf7G7o5{d;9r4gyuJV5!r#ny3R%*>va@t0wm{<@7=}4F~eFBF)=)-(S>5Z z8kqF;w?H<{TXa5CzkA{l-WXz&0d^#qVuKsi%Z-I$NQf#=p?rhbfInU%*BB%CgoO^( zh9Ls$RcI@}J`w=te~9$z@5aid*92}eju4^)yq}D2O-o5pQPGQt)9rK`778*P%TeET zGv;n18>7@ zGw=4@qa|ZHYfK1^z1VA&3WNvzRv5IKeySVCI%ATuJ+|&6)nyiG>DKwgfZYMVUIrw^ znFUW(mYsQT{bc|4M}Y`s9Lml#$e((R`gXzM`-I})W#43Wo}K~+;B!s}*fo7kDJw95 zM%kR@4Ooy3+Lc(7F^HUwaa*|~4uPBC)}ahL-2kzFlSBP;gfyyuC7&dOq506uTAqgh zU*CBSpa9!kk8@_BE1(>{gv{nUl+Kz!r*0bT$&`X+c3U1Zs5d09r${hf0AW$xU00xE zeq8{0O#QOLtIMC4BRNs5O@FO$*N?Cs+-u1-t^hXm2W4Q@47{A$3FpmyP zG(bjLx^Bxere6c@EhNeaMk)+~h=W$LEbiyKz0%=tc)zW{i0{On9J9Gpjre;52ac`X zlp58zWZQT%--7nx%DZ^Nz8E9XjbfQfu5W%y8!GH`6?DD-V}(t@py-ZN8{G-E7I<=P@g860LV8 zZ>>4sZ8dG{55x~dsE47!(g?4!nUbr0w zb5LiS$T0~2Uo1Jhw0=ZrwNY za`!nQtIsXNKk1iHMtH15_l;kU2haNtbTuUHLD$F9g72~#P4=n>`8%u~z22rf1+K~e z>NXqy$KA%Tl8E(sD)n>FY049!0jsG`7HzctJN*(t)e))ayA}EXjhJTcbB^<5%DUbm z5IcYrQ#sw>#UATUlrLp!V)8p`|40Bpx?&4DK*X*xv6rBA#$g_URL)trbM2R%WrxDZ z^H=YeRAZyffPnoUC2@dc^Zks^E(8rtLgDJPPK8(w2=ldf@$P8$$kmcd!?M# z_EJalEI-pjQ2xxFXO?t2kBm|nCG3B+WUuXY6ajej=L?#&g$xtphRlWD@|kYjISx5& zd;378TgqLtCCBG0j&?GQEGAEqUXpn!ef-D0gr=zgs*Eo+vL<501q5J(46?v6;ubVL zH9iFq;ZG8+!QoEIA(Al>=qZ6kFeLWo(Lyq-lYqXwG<<^>>ty-*vWE97UW!;0Jd_v# z*%C_8TJ5`pbFJGl^cG~+)|&S=*b0hL#wwUKmgy};Qy(l(r0_8qfZW$L_`-mq|9yE?qWo2dVHG{g-b`%ra=?R|Gb@+7QComyYK(MJJYTYGf zflK&np#A4_a|j|EIA^`{ct=M^zX-W1_=z1HuB!aG%5;$9{6EXM&HMD{l_pW$h-HX> z6mU}lZ-}!`#Hz|7CHg49Blh-kyLizVs(j`Q3O-X#R1CNZb%&|Dr&fN9g#tK!Iyb$=5bx~PS(KC?;472RBCPB?$E7@~5O1cx@ zbw06z|GzHh&+k!?BdW_gy}%#*)}49v{BL2ZDE2M4A0$Fl^$8Ec!q_D~DMS6J8^o1* zPVgLr&Ac_sH~j|jjz6ApO$LDaPZc!0NHP|qT1;@Q;8VBLSo%I%+F|j=OV8kFJ)$93 zHK_*>Qi&+3ZrgD-YlWPL|C%~(G#MKmCTx6I^L>Wa9_B@zG6!FD+A~-?{N*qO6eHxS zT6GArOlF_?`S?75q>0}xqm>Yd`4pm9OtTbYrCfa(pT=7O7OOk{h8S#p_)^qxQ|3+8 z00Sg@El^qdQpMKnupwiX>Pk@{ugRLb;GqephsM$X^XiX`pJ|qPl+LKiPEkpT!jZAg zCVZ@F2mI@$c#?l<&xv`YU++5@Km|9yR~7 z87Fy~GATfRe4K8us9Zm|b$v_!``r?~gt@Lv*-qTe-^Nwb?}KcBpEZ}xVKfGf@lBip z?FT5@C6%lJjDVVRvZM9!6YC-rk2aZ9?FckRZc{jxP{2_1Aj_1&Cy4z+&@LYm z*mL7_38q)~T86T@%KO_EzPub=d*%Gri0u8oKDwvcx(Bz&@9Pf@1D>isBc3f_af!T?>G%xYf8Sh%R%D7e&m1~nkVJldRS$YSCwMvxc+H|6 zLeD=tr+|`_0hK-X>>S%OATUPV`fPC%TqQr0&h>Bsf$|q|iTTImfWqF7!Bz^p4k1nD zaFktOV+rJq{4`Q#xy+7L!c$=aN~l1m`uQt+?eBo~WfBaoO=&_v z-6-A=zeekeJ4v86Z_AG-yoBke*gUfGFlQSNo%Eo3@@RXNE_(^;nBX$WFTLXREb%%= zkDde2+=ERszn*by3gZaS1@JKbz$C`k1yfC17_;bo&r0kNCNP zBkQviiRTXA0)U+5tM(#c3@DE;M$R8a?xzqIRh<;3e=X1Q%17+_&0~OkWDe2 zSi&1(WXq+q3?A7kC`wOI*&MMJ{h6ipS3ngN-f1!;4eZ0@8N|s04%uUfMN@$eF$wrx zNJeURjnbjX-A~4Ykoq$@xe?C)AcVnAiK~$#o#k)X&`>8RwP-Jw^C-0uf^J81)IH84 z3kFmkxPB8>t%(x111em7N(?!=S=gU69N!3hX1&5#hg>ffY$)(?hcsI3h#FaNQ+DMX z|0qzfBb0_Q*pb3E8M=9=~({UyqT; z_Q{ki`>~hU&u!gS+INq1uz0deaF?`DwVWXKk=Y&Ku*uWb zCuf5`H77HYTwd^sIU%K+9}|*f3vw7ki;_U6D%5%EFB0myqe4F_te%J6``k9FgRF*6 z+!_z=y}MYS%f*qE94C^xR}VWsc%bn1DY*~zQcOkBPt8mYYh+IBR92Sc$?ni;&bgE* zP)HaMT8f#)(F=?{ew+F6OKZ`&QvSJu8%ZxaEnVC8{roi;qC(EvIR6xeKz#)CqEd%A zEnbI{8-$cQa{qXn>s>yH7ug|@G%?xxDtuV2+DCRpFrnT-IO(osjLdw8Oq>|rCyDO@ z0#BHNokqQ$n(Z%>exJ?Nko}3FSpA`Hl!zG3)^^Pz0VRQV!y?mcVynRjvMc=BKWS)R zL{(474~XuEnwp<;Lca=NLZ*_2Ay02QO^1L*#fc7%@x@xFVjw*xs9N}{5!-z{Bldp7fAJI4> zlH7y|5X?+xGwZDoJSDVzm9G^;G%muxzj`8_wl@~z-TY_TF&433f+KUOoADy)jNq(G z&=ChGV{VBdPt&j_tLTg)yu9kbBt}`pb+V}VYP@YP$#=XM=U`eE(sJF}kPUEiTI? zy_nwS{=Wn3j{Hz46zPc_ut@(0<4EABy<3U`;LbeR`<}1bFhAmWg4Iuf)!=7 zTa-%6qaGAr{owpsu~bfIm#$;C!_6Ablxi?Q7=oSB&(xRbz+ykq0lC3FZx%8v44>U? zn|=tTHkNke_V>b@)>VO~@1Xn~DyF$@bVB;L&*m@_12aARy*pu-MRTCNQY{HxUY}}KtSIfZcVHnsf zfBi*hF~Tn)S@o(-pUZ8rvzHadNei&gCVo3@Lpk{i(QJEO}xO8XzM@7tRmu-xtcMh=hqsGU#ZuM_n58m zm)?m2?y73*4|Z2|o_xG(PdvzYI%H|!LqcQllH(=&ZfC{6+3OTc=(MVG^)1pbT4oC{ zeaB&80p8)mE$F;pa`_sH_t{LYU7)pu;^!70#8TCQgG&;e*nzGJ7t9s?p_r_O zqQL~3jhn4HW*?C6TX&Je!$@!i0p;u<7|gx|h6ExJy8w9s`Ka6h3&|mHSa~=P=f#Yt>=sq3De0|htniOqxWn|g~uwDVXh z46`^Rzx1Pg0&s|_oC&{o4BX8wjP|~M?E>DC$omoT=3F3O8f6jVEH3o-_df;NQ8P@F zN1>5H?jX&;dAb*w_^%j>jnne)IttDMBSh%CE}+JtiUmK)%Rt`H9ApzpO<+YQ5VCBJ z)kNkOP{4(NeJwvfztm!l(EuE0vzGoV`o-WKv%*wkyZ)}I4hNf$J6CH@_sUKxsAuP` zTBX^vl5B=}uu$-U;2x`Znce@r)7Pftbcf}oX6>>zm8~Dx>{lp}Rz$w5vYPHbp$atV zkH*}=8df3f=P?)`CXlYr*s)FfP6-tKI!&o}$$Xq$Baw*p)&>@U;U{?cl8L_|^?bEX zr@t%yH7dLco`1e~EZ=@_@|>0CHB#gHVDx*J;loZJ}{%PR4BrF$b_B17z>CZ_*2hSZlS#2V(|Xt9QQKsWbHCF&&K>S+Wf53y+!)?D)m@OfOr z9$4G7J8^g}aA>I3fg%h4nAYcGQ?@65XXvoF9M(|8YjvEsKhMT_yk5*bPWYS2!c04X^ka6Fg zE!Zq=khoX4)C%Bq@s#nOp2T(2@IV!gV+nrZDl71D zhPU!aF)PFCU>5!xS9^^Wx4BHfwGfaFnlgu#q*X7FHr-RIjWHx)J<3M^+RKlBwO@>V zaV{>vaMsK62*oozVjp7DS^DL%y8z-lh0$H)Akyv?uD=l;9c^jP`7$QuW+3BU0#kKn z;Jj#L!HM#K2Us#{5n|VspYGN4w4Nw82$EmYGj;#7KV7>S8o}jJZH_hmUrvyGJ|l^@ zbAQ2DMlmaJn(N4f!2`$rm8u*FD7l(a)S1DEfwEWFfCh9l1%PVT*3^XB4y*B$-sFggH2=U00hq%6<^_&3B*7ii9jeX~Jk&c{Znk=F5$Q=Icz1&T^md&fd1QYaoxVZ9c z3UpvS?!#mE*Qc5>Kcy8ATyVjDU7CdT-rwYoE09%uFL>&Z*!cFxT@GfK_rIJ;tlfIu zJ^~?)#MHN{Aqn@}H(#8MlH;5BeY4<@)SGLXvcHcR%m_mNisn3Hwi?MpN6S@1D2o3! zd->NU$3li~;=3n`VVgG%+lT6;gN_;NJ^(;v0oqRUB;UZ6h2Z*&{6H2jZ64g4Hxh9c z)@ziF>(?NGd#!@4dbas~HZJuF2L*GD>k80wpQ^`7g+xbBjF`gA1KA9HH=HDvZc10kn~s%{>KbriQB37$JT z=DDVtg0O?UF6YV8Jwc$KlK7VT!@v;6P6DQN2T&VxkR5Qdy0c0OI6OhKhDW441(<#N z_W4SMA6dIkHOhvj;(A`STV)G7LI1#OL6K&4t*n17r2C}zms;3;e0**K(55tRMO62r zOqRJcMTAs^NGCNlb%?QZaMUI>6SY~WfB;2Je9wi2e{V_KZa)$Jd6vOl z!uGlNO!IDy#zsa6hg*p)e{h$y;{AJN1P4gP?CK^E5=(?!-;gISEUf;;w%U3#o3D+r zC%&%`=Sj${u|(TcNB`(0WqICo1`;)a6IfW;p}!3*|Fr@)pUt-#APyFO+w_>{h`YOA zIgAo`z%|>pLyr3YoNQ7s;!WZBPbb?&TDTiWXGFK^}k2e<0#N-?Z0>FsEH3zDV;z*yMR3_m1=<`K?%y) zI#-F(caQ*N0=XX{p`k}byX_xZI%km6J^q{mnkre5>+LKs78Y!j1XKzc+y&P>=AyN~ z6hFhR78MLbgAX7smG6!ewc$ajF$j~MDFGMUYM>eG&3ytm_Lx?h`FDs%cz92GE4IS!8wG0lm_MRuptBc^QjtdhUXJR@@#r}zKv@^)+-vV zSr_B!r$|dLL~Cy-^5{jbb8N!k`Y9){#o*IU@>Y9dX+k7NX0eX zcFV;n9>V-uvRXgAvm1f3utU5hybyoI1hIoKE^~N$&NI=IloOsYbVzkJpt9 z)GV9a%US>Ec+&^;5M^^&Mp`T3CK2`ExjDx zc+Z*7`8Jb!RvF;@RwV$Eeeql4;l{l%zT}m3o)uc;2k5M71;FMHV5MV3c=e$8O?iN= zSe*h1Jl*MdnZQ1AT*zwZDkFI4_`jm9?`)N!EHfC(T7X0W_{8dpZIQmHO9R zt{oY4{6g>KWE2FCBbz8RRTE?}Lc>a+6GU_zolbgPcC|IEW7gdpRG^pc&VSk6W;*l! zmFYk@H~~Tu+rq&_-VcD}H{c1L7PIXBG}$z7ji%Ivx%#3GXu z1p3NP!ks=VE+dWd(8}uaCc2iu^v&g-&@{#>CvJQn+F?MCDI}<)z4&Qyb!Bo@K1b=1 zL$D&~Sat6VJvL=|5IM4pTNDM6f}o(EDFzu}cDb!Cf0cBsB}s{id zAEH@|*!lWE!1dYM9P|+NBoO(f^ z_ZUh`dv$Deq3v~DIjQQ24dhbyC8z6i5fj zuU=WXB6>hGIA8q+G6Wh}BaKrP)zQdw`CTkRFFXh@YJY5L_mIftj(+}5UuZ-|(83&- zMi-g>hJ+r+sXoo*L`zPFqS#AcoE-aR(byMvLO4#wO-*RPyVOA9FE7cgijRhexU^a+ zqK{n#$yFHEo0eLOuxoI9;aQf`=T{%)()30_Sa*u z-m0oQoY-O2RRbPgSHHK#G3iYYN3Datr+4ay;A_TOuD8k*rFbVjX+i$vV7Id zu9Ujue>-+D<9fQ2)T_Pp?eV-L`}gfT*daEJakZV)5|YElSW=TG|6qzWRr+)#R--hx}MlOXk?MTlIwl%IO;=meYUx=WJFl8)Xek3I1CV4LJ{%@s7QZRzUXZ z*tL^<1jq&phoq%@HPf+lfRdfi9zr10dq3LCPrjPz>P9u@S({hlO_GsmQFzQ@K|k=b zXF3g_=wGIM_b$ZKQIzx^6HOa>YB_wUDHPAvtE<8aeT<#`;S1 za44lrj(+>tM5j~P6F)V(e!ZjWG2;*Kyu0fvc?+Pfo|O4C%OCejN9_6FU=IP_8;ayJ zkMlBJZ7Qd8uH3U&IBP{NhD)Q72n8U_DcLlenRdjgp2R3tOJP^QIF@QQ){b1N*u!TkT>zZ|g4zF9g9OWj-0DRKQa9 zmAx7_#@gVF?^5H|ioRTIO^9|0S)6AaJ%62TQ zEREM{O7z{m%Od;oclg0M9T~wR#N|t^n&Ue8bSf~ z)k3(rT10}hu|)mpJCA|)D8@5HlNujk-qN#ZHUWdtuT(PhMDp7&ecNMzzT~(JCbKOX zvh~_m2(F>+bk8T{hetm^LI)sJV{$LF(oZ^A@1%)|ey@!iJvwdznB(j*y9IJ36FRMe znHONEfAJ%|1{Bn^cG+s-Kpz=7&qGRc{KvEW*)buO_nb*^R_q8v^$%3k^|jw-fH$Fq zkSSm&6pHC_PGwuaQL@%ioyMC57{%_%Eyc0_yN`jvJ+*fM1Z~}(J9OtYpChU70R*T1 zl+G$y$VI-NHMh*$G$fj^b@Ed!I*Za8AGvr@C#D3W}L)fOLOGn2) z5*UzrD8({XFzJ68((1S1th4@be||nv~8*+!CLBJ5^`m?D@QDKUqjX%EmF^-Uxf31W9h7 zUxa`iBf-;)z+XCk0j1bx$Vfr;5-3is@{E4&*C4RTB?6CgXuNa&ynl=}|5v)J%l}Hg zT|YPQ)mZxRgu!9spu~caG|ZPYV?#r~>f~$LNBSDl36Zh%Yb{BqHq>dBA+qud{^@`Xjq2 zW(Ee^)yX&fitE(Fzi-XI{{&zsQKx7&fk~to5X;{EC>qQ7^~|!XARBgBWX37rJbPWK z)KNjEZCWb%=@_!N$`ys0 z0h}!<HP@HOjol955%_KOvzT;dVKJ>ZVXo2C%$_w1hxd6>xi-Is^Hu3xK0VE)5|Q_ETvPQ@0t$~2M? zd!s=Q6#xxVnn`C`NvDwUAx7?OiInO%M$H_aK77#vP?8Jg3pCMhE7M z9phzMhgj8KjzjOiY?K!~tx9Lo50`G5OXU{V2HbV;6FE)+k{B~bY|B94i zr)L18pDFy^1*IHq1H#o;!O3P;v);<}K}LkYxWcY|xv$p-AdBCN5s6-q}ETcS&Q;O`dg#T@6A;9M$=TKyM6Y&T<)cwSm_z~ zj{8Uz+_Z_pVJ9_^kPHDBm>0_gVTJ{ZO(EtNqGt+2}@rIh?pxtjdc}8GJp~Dd%GAyMl{rNxV9#~s%!Wn65#vE zUCkmv#2P7g5|&>ID33Jy5egMhlV5L&eE}1w!U-M+J)j_q3)cZt>H13A$axHGr=q(; zU^HbDxC(oj@S>=BQ=Dw(MaUc$JmPgXzr?R6%=vqvQrXf^)n~eeFXwpd^io1_&a>c{ zurU6yoR0ijHePyKH2ry)mLJ4T9$6pcwd0kr63;UBEv$d8@`>&b?mzg~2=+X2#eoQX z--Q5|CYjmq-IirkWfOUwE&{B`JILi(rdw$y9UgF-fpKvT${wRR9YHo^s|}7*Mk}9Q zm({h>*1~lCy)~BxyEz|-8<}VE-;owhRE$%3Emio_?hrp;r(-Eg=Ph#5mLb`^XxhEe?3~YRUz$u^`Q4{z zCK44qA;w6084Hk|n$W|?YA=#@`aSwVU0wf;^`@-H#ek}J2VCWInfALG1o`zI&z@?q z$b9Qq@#T}oKvP#Q-G9XR#(^G8(LoWs$ejkO?V78Gp_7-| zyF?`DJpt`K<2IQZ@%zZcT#)b!Jznm}0Nx)BBg~X_m-|nD*XSco>Y}8<(kC4}l5)fy z{0=BmrxpY9Ac1x;Pw@2i1`%R?lt6mGyho%)1AujbiX;pC68yBVD*S7=#D8 z-ojGqYMuqo?9?XXN8;AWw(uVDj#HFw)!`BgUgg3Ek8)c@Ml&6iOnS1hu>tacL#ffZ zJ$EX>Tac2A&vky*n~`A`=^3oVa*=XBvz`21L0@rqxnDfE7pEw)$}A(DZhWp@^(zoR zeB=ugzh^Z?!H>5`&vk0&o@U^GFnQ@}mzE;sJv<8w{^o>U;IVZimI)0r?0sY1%!dC~ zEAD-qrN8^a`HoVD7cRe~R-0L9^ce+V_0tBiHny8R9-vaxBOc!Gu}a>wC8+x-1c8iL5Zl^6;@X% zHm?iAg3lyCugvu{{z#=1s2O(}(QY71k1#Ck!=?jicBJBVx!FNL*Klv&X8TNGir7pY zK1H}a`($yJ~ z(35T3Dnbk1H(Yf~O92u@-HkG*Mu7CQA{s z96hr&ZU4fZ)ituhWQ+@AYbD(eypepm4WbS_RYYkR-7bj_jrkyywX*D9SmONefe$Q+ zV4EFbTPVJ)QeS5LN9rxT`q?AFAwRAK8|NG{E(p~>!u<-{mXzOn|*wK9@j{FyF9uxd)KLr2Jr)B*m9zBEy zZwSBMWbJO!faYT?4HVLnG>m7pM%PwI5#EWdvfj&Ukj|=db1doI(#sHF%|Xy zzBMK=VTZ0I8To8@Z~1H-M#{H}O69+Q(b}J`fTyftdyj;~x&Z`yQ23Y7^2L@hO>C{K zV;U`jL~jz7qP9Nh^;eM(g}d>~QuHtXI%c);E-)4Z)v0GM$uw-;g7sTY#EqSA`nIR^?`1<2Q!ZJV z#6{;vcwJkD0f-0IqW@rw3=Yx)iSVMoVt0&m?)SF;P0gUogl#54*c}A9nDb0cO*KQD zmPKz_X+>oSUrKIX6e51e$CfvbFbEvkwCs%os6L&4A((0UZqw$w*;15n7Izz+@u{+NyKeMhdYnjsm9uG|DdD+P7X~bFKaB z#VI(X(MoTOe6BN5hKUkO%;D5Qt_MbP;@G?iPR?V|JO$UACJ-fP|S662d^IB zik-!S26ztNVkBFl-X|0;PX)}u>Sw~k4;22a;i`97*^EK@pWiWt#U3s9HCCF&QxN0r zz6zFeQdK$;!Z1LogHS?f@xU(e=Jd!}6wA_>eSQ7yX%t|jjU8Q$eSRC`5`p-rd-eFo zKX?WBr&&bjND|W(D-#+SE|tVe+q0J;&cK8xL8bBX-PMsQm z!pPVdQCh$9&${oa^4ZW;^-&ajOdah@mDHIk%2okOpS_!>1PcWmn{9OU=2?m|CJEUd zn1Flse?RLR3tbv*@UNW}gA%nNlJgz^0w9HA-%{6?Mch?9h2`~yA-#>?5g5IX1pU<%FMxf6lepBpl$*F8L}oE2=6~X(%zPS*-R}FXzGYo3#t<^ zM+~c`GmHA-s0oz9m*%*`$g%-st7m~c!7|aAFN!3si`{#6uk9T7Ltsyew-+5DUEh-) z9ML!*N7%^nz%COqv;VRCxsy;WCDX^I(##J_uX3(=Z$e1&r;7$wgl9_tFA50{=K$va z^EJ8=GkF<|UTCiZ>J#XS*xp@$%O~vI9cFO15W1STc6DIWhn#@8!St8(`l$){ zS*wo*9#Zxaq0qTBEa^C*cp!iaO#1@!%y^3(CwYY2EAO6Mm&#&k`q-4?6f8DvN_=UM z0n$@*w!m#0kT)wVNS~+0bne;aihfWnR!h!x9f^E)Wdo~69GJSW>Bvtq9t=qTUG-^U zZqkO(@cav{`fPPBXc4(+b#GwRgFRc_kU(B_sW~Ro$^v(K4@43sAz>StfEeIx^?eV- z?Y@S0Fbd^V!7y(Krlw)AUR1QSS|{0^mTlq|`afNLrp1c{|LyT0p9{PtblHbcb_9V$ zRd?Nvp^3Ys(=?xlkWh6$?1-j{0pLGy3OF*LUNMxLyZ|H@z53}mNDN0x(=PCRHN6qk z3i?EqqiRtcFcKGZ3(ZyAB_?#j+ZE@!wgq4fNq&T|hA-$ctnI?s5$ZlVR;NkHBmX>} z5|H!NNXaBYpcClYf5Kqw$s&wUx#_bEAEW8zrN_uDKmdkKjd`yUG%t;`9G-LOCa{0FdYk>0;px&9AlIQR9E-QF- zIYfe70z~l;ohhbf1G3LT^*NxJbObH~znx+%9p)}uL~R5pR(=!oT&Am76u)Zq-=z-R8ga`BxzvIq5sk8+UNo&7Ipwkt~@zH-rk~}qjb$u*CgeSqK zEoxj?tzE=W`@Zs~Pqywtl|UN#J!|H%W z>9A!mR&wAzA<_@NPjOu=K$|siB5BBvWrc;zzVA`vuo)9#?=kr~_~9n(`9V(}>%Ch% z5dE@3AI?Z~^o}!il*biPu1)c%h8}+a7%!5&mA+W_=-Bq~|MSbk=fLBK^3G*HX%1H% zX&4>F?ic2Gr$5d+A>95pb`7j0W9%6MoRQW!*mLggq=Q?-CPcd^^z72B=WzQ+>={5i zLkv{O*=uc9ZVUZRM&4R`=!L3N%s~I~3(AB&`G$z67i$ONx} z-gY1LKQ{CKXffO|_lbZmD{Fn#!fOinP!f?%X|y0a{_(8$wcG2)S(wDT=8=9j$0aDp z6fZrW8(u;X>*t%KEuaw&E+`O-9X|x7`H#WF8!3ekTD5a6jruJ|Y4k8bx^l$m)&2^f zgg1gcJB1en`2fdJngf{opo6t$n0e@a=MVMuuPzpsQed1JaAiS;Dj|FYOS ziyOTJ!4rT)J!F9g`c-h;)L{j;q;=YFuAcHgWxqga|M zD~U%y^-&38lB}~!&n_g`(Xs0q7~yb(w@kL$m;L{)dbiz6Z*y$BHxr}Bugh_;i3J)v z91F&vOySVyoNf&^pmG|ZCm^^sI6QnJ(BVX{ZSdJI>IPj6q(c%j2au${L-rrYEcJ^{ z=DYLpxt47Wc7ZEofJ1fVl)5h7ijZTl->BeDQqb_dx7+EU)V>r6ZJSB z;J}J~6A%zM=m0=BvK&`(6*`aXcal%zUdOGJBBvsr*Go4obJ}C+Z%+YEp$h&h=AGXp zuC;IoV&nwvPXf`)G&vBSRoY@JwY86)C=W`!H)XqY*CQmb)l_1X5$}wUOW8km0V)>g zZFlnFw9-FbK=m!s;K#;Wn%)Nnq?(aY6tC&ZV(%)F=MDl=^;4W(n_&ZJt%ij5lX^Eu zTW-84h9pup9<|kbVnx2Dv}?}5al%}Rva7j)3xza00SRefK+trb2j%OZ5{kUYN0?Y)OL;MFRYP#(Q&YR2&q zf+e-UHeXB0-p%aNRQy@j@riZC-Le7JOyA}xX)x=_43!t+I0Ayr6g7|Cz)gBL1?j}^ zifeN8Bg<~n6ZiQ7A;H?gNm<243 z{*>njARZfqNH-Td+7u$;al983@?#Z`0}Jrw=XM9Dl@$J8d*2<8W&i$NM%f7|>WUH~ zlvy?zQIcfO$R0`dy0{{wj8gW_EV=Bxib!@cE;~CrGy6Htx>w!5-}iYv|2%(v??3MH z5*OEbo}c45-p6~Gw{&NKcg9@Xlf#G^dus}uePel|&Wpo%X`*b`_1(Fs5&~g~AgFbJ z=HhLF=jK=kKNfB_8qOXlJwS$CKn^yffclf_N!K--^<(CZpr2B@1e|cGyJ% zJ@I8TM>l@t9ue^a&fwFFN)-QjyGZ-(1J(5plg(f5A1`JI+hKm21_ADWt_|;*ORpyf268E?KDLf?kYZB1-vU?b zaCQiqUv~PH3y{A$!x!HwvHCu(UD?WPf~5H_H&~2aIY&HKQVM52eJq5%as{J!%j+YfbJY8X`+gm!OPj#h5GT|(^ zBcEYX62*zk-rF>&w3NZ*Fkq-irj}ps_NB_ipIX&KbR!t*be)vk+Pd1SupKfw(M+UM zgIN2D!6qzl=+XD=Yz+A2W)3}C)Fr*dNq%~m>9$Ar>DBe%Dy}ImOFhpz)26}WLOIpt z%q?`R<-x>bLUjCi8S>gh(k0a}gg23KL^&YZ3dHmz5_iph3vQl?d|oKr&*I|lnh0tZ z-HpAX&JEt=;g0MqU*mHs4JBV9&455w&Izkc`har=KbisV^^KLE2VQKjP`c9N9)^20*T%XN-wqY-;rW` zM+ioToWM_e0nvfWcF@d$2T2Ovl{XFUb-@hh5jBg80uPmss2-+>mvy~Et%1O1y_R>6EVxnKR2EptN!0=32-GcPT z%i#itFR|U;QS@2pm8b6d`3c&LD$gcCTCKfrf9!x^dPU3b`D76X`u9HO$Z5`=OSDEq*l z&JI0aa9^aVg!?2@eRRoGo4xL}C$)8No)-I@M-Pp8HtHfSzsAOm#kPBVsdSB8>tgpL z36dlsqP8_0u!~436u-rpp#rnwuTQwo{;_+cTipzno!!ex16C8NFdA&D$<_Q~oS7JG=R1n#(+A#z{(alZvyr)M@TN47e=)Oo@HqK=OW> z0Ty}qXEN;x$~k*8xb>=Fj~3ik`2yV#?{?SZvf~xsI}!_ zDlBN9aK*>FCDeOMFCaSx0xc=oZ|^a@k-oXLXSprTsp2Dl3cp5wJTHVhF^CP;cG zo826#b2p1bvg(qR7_lq6ExK83nN)s%NKr8-D2IjRC}NDFe%t&FQze*we)#qb9#Jjp zBG8K(^>>$!x_}z$hu979Q5RrqjRQBIsxdcN?&)b|;0Pk7LWrQ`K0Fa0LF{>QND}vB z^}>k3vwwDmGF11EWsgK9;dhE>HtcG@g+zWp^rN{We4qU7siwdS5&{pI4OBsY`I4#- zt1_Dots~F9;pzk_6vR;=Y>?nUt#nGKI|sikB2fl%=k^Q9f10*eqWf7u?#nV_7Z?Tc zC8d7rhVM%QNOVH5osZW64?^K-c3y6?DV00hwu}GlT1rXBI^{2C>z2k#PXAO_N|=x= zqR#NP9xwP!>+i1$-%4Y==Z8HZGJby$!tkfcFhq){ncz!UNI2Mvt2$&(Csetu1(R ze0-yU`m>z>F|uNsj+~7tQB9lprPcgpX!+|KA>FqLm=QeHoP6B-*J|%SeWAnwaFTfX zmNod*-%Npje!JgZ=l}b6m#1-VpLL7h=(E{HZ|zm#Pqc4Do2CB61D7y_=eMeLwrzuA z#Ql(MrRUUW{UcFEx8LZg5(!>}0kn(X1V#Qr^CfzT%*bq>5*4t~7|{Kdnu+Nl;J8+G z2W}1l(Zb*K-5;bem&4d1HEgF5TQ46H`>N>#_dEgn`S@0-9oX&N`Z#gZ3sB974`0eO zl4sLN_McKmQdwAx;%Ac+2(Cushd;S@uQ@k|_uYM3=38)*L>`Tv9Vlu=H#09g&mPC< z9676(89{SSum5f(I_sPMgiZyOnNu!dK*T~YbMv|!C*;uZU<+!PPAny8uG#sFb6nns zQNjQXN{8eK`x(#e-Lly}Y@`Kj>q5x(PZreKoNj0{jwjk?8{TGlXE}F+I+aq+*K1j; zv1^Ed^e7jb%;PDW;lcOr9$|#>w99%CJ|#w<U^g}CqDbCz`3@>9HoZ*#v2p;Go=c|BB;blgf{p&WT zw|66oj#@HOzV_NGs9OlmVW036ZnnAp_xkoXH0QSu+l|BJ4oWYAnUB9u))y&k)H&i-G2 zUP?JuaB)cPz$I`I8TnTOgp>lU5AmT-Z4*a%@FjrxtO#Coj1Y}^-Pd2~`d@beMw(={ zCr1jT4=k`NQyjaCQ>P`mXKnOWKAHGmzY(JhH*)Qg4!4~`{0+~+8t2(*83;k5fAk^w zOP2Ti0`PppVMzPP+bS}uSNn%4jQRO&a9fK6yDJWjYzeWwZM(9UF5pVoe*(Wx(fmu7bMJy_YDvw6@Ych2pi1X>=dos zpEMXdvH}smZ&*;%-CXIl#J+%0MOMe};lFMh7YT$X@+yt9|`ko2f)+}Rz^8vqcCgmeEJ56;zw$9Pt(DxU)5Lu__X z1va$CfCR0HH9lu!f`04;jLj2U$3O^>w-CUg#dn`49>$tm2<+%q1wyA#K%e3BnLpbs ziC2V`J8RlsdkbD8c2AOiT?wQWFG~Sfkz8JFfS%qMBx;UpXV)*Iv=sdIUg?$r_v7%qFJD&zqOrQrXn?#83{1n69_bZhT_>fpO;i(Z&o8;hgDT=PD zv@50q{aHZBLu&5rX8e}few zY2yjRTNx~8o|domT7Kxo9PBL z^bq1iJqG7d(E^nonC&8l4amLUs%te=DSBZjR!rfz9yBE*da;x!Q&DdBn)Eq&VUUNRYc4Cpm zYJB84tCkhwKpsrIRw>q%tOmd+d*0H4_OEDxr0bM2-+&D$7H2yTow&pZU_HseXLKdZ zkk#9;OE`6*nE*MnB_>FxLKtAa%oS(lOE7>Vh7OmGxP!l?p?`8r3*ic|-At06vKpEM zxQTYo-|;BwekLUOk*yBP8VHRNtgI$VUWvYF)8aHxz>5YzM!CY(LAWOaK)xl|qxul? zjl20}M)2cBx?7L&uiRmYJ%efikFrYTlKaMp&w)a`n5aJPK2JvA=if+V``}cex&B`A z5_kt1WmSV=fiZ0LCCPy_aHY*|Jv3NsQx2pMO!WRYljRP#+lGVf=3Ok9VAm#a&?9CR zZXMMtV55xR;d(T6_k(`%1zY3&G%Qd#F=W(j3Hanz2zg@mi$s1XYv|(x(PnKUVB|vE z_2gxc(8rduM+zC=J%Nn@;noR^fOxqJH&>87{et|&p zGJAZae(3mQ#$h;_FHsThrSA=OG%0U7&F0j9M2z<~_oT_Ql720-$VC{$TXCPTuB9g$ z%l{E@v9-Q%=oq5Eg6QknYP)qGlcu&Zmeni5oN(ZV^0r)J%0^g9DH=J3Yj$%XpA2r6 ze}wG-US5ISjlG{#sz_F(ZX?2-F&}Eh5X8d+P+?ZZ5Z_cx6+}gkwO?UqF7`D~%>aD6 zJ#SEm<|+rOae7phukrcG;0F>cU_bYULKVCO+KOMH8ZFtf@N;eJ;P;~G&-mn3dzeWU zK_&2Bv~l=vx}ZPFv&tj;AcJQ6?+Sk$#s4_gzk@?i&5$oMWT_JHb>^2%#a1MK#l?K?^$syJO~IL6z^KUj z%7N#};!!YJ%CfJ92Xz^7a z1;<_i6rRzt$_7J2tc_3$M~C^{$e@C3hgF?Oucm~ZiB%(Tj~c_A`gkQL$hLYV+OUCjykS^Fi+yfwTIRFxNQzLfMfhHqmsIO^J2xGmXQyQGukrs15AZ3zKc>|yo&JJ!=q4iW{e=A7e ztRjc;wn};49;@sV`#$U~>Br^YT@6c>On4j!r_)H%8m zGef)+B-oV914Yuii{HuCH7mTksqbzXr5#(eCQ$!EeSg%>u)5vq0OnR z(D7#M-*Uv7`g-Rnu;lpHw?BN8-Qj3);o;WzmVC(M?v?__V$tq)FIwGsF8YuyNCG}b znQzErq5%xb{FSZv-ADy4gZ*NgrCrq|*jz9a6_${m89g%fB@3H1x=l{Ub0%9jl#Tgb zpx}&fa3Y4j^yVu){7pSm9y|gZSm?B`SvF;CgIDMA{Qiuht#6fE^LA>%o7}41R;RPn zt#y*HI5RBy#d|!1QuceBVrdHn^LCjF83B^PQZNfPPH9zhN#t<>Q-jdg`!-x^~B&xRlq+4d}BgUtw)vupi=c-pq zZ}n`H4?P1sMMShjML*LAAo-cjqPr_U!#x^D-T<2|J^PQ!33q6UH$ z6Cm&an*W*7UYBxE?=pG=U7GOC!VCU6*e8={)eC0n-FO->D7cV0gZ?Zuq1x2O6W8ZT zXfaj!Y=^$h@(p~Afx{As2Ju`(m!*8(qS<2bu6f;4=d0{lIB8vMZ;P~kUc26LEkC0Q zzp0r9vi4(+x@NK`oe(<#o5iQlG;%A|44}y`e5w{=U4FK;BO(6sF6bnS^^eYvaw7=t zKN}4w=zzn?n?5c*9b$-SGmu-kt5%hSx;)P?$VYxJe;m9AD0=-U%HGAQwX^3UwrC+I zFi`5WdT(k$WlvbQ@L1?p90r%1p7~?lGz&N_`*hNEQ{Ab26WT{<5W~VZvg>dxv@J=B z+o!9>1r1}0Hqg6?tdin0<`XZ+tghT#@LD@Zzc{R?F22lPBVh)FH^nwrSUc-XvELM5 zr?;2@(R>QzSS8$j>9hpWCbm6#M#v(HQy$ zH2DjuS8t+F=rCAUjB9>!L^6Jn;Uo zIy5HNdhUmAoU)2*xqw#gkwbdB$Nz?`@HJhSK#+@A+H&EQKT=@Ot`8$tU>3r$<(Ei@i6T%XoEwc=hIfp)HpQ_ z30T(LH6I$X4Qd`ti-GL|dC#FJ(|PxB$WS@h%*#slVsMjl0x; z1HS`FhXbVIK%6l3M36p$AuX#k>EGEcL=cBM zH{U|LE`$@X&J~chQa1CtQ~N@ccGDq1_;nP`Zi`V|Fg>3#RIu#TZ9K;7zE83p9DM0U zq!k2SBp4%CMUO^5VKe0U=)=hyc~u&p;qo>1xfPw6Z!t+2Ram)an@y%wDoS~qU44G` zOD6q_8IJ{lX!pV$J(<3kdFI2|{p8s_6AQc>=?(y54~K17XhDKE1AJ5U^9@u!Z;@XV5?N2J-9Q*WfpW=)<)I^ zr}BjdTV~4fNSc&Rwj>&&S7w|MqUNNSI7H87Z|Lo3EPd8JunR(Jl0LC2UOtHrufIDy zb3=K8oe~eY4?yF{cO&nE^AV@)j69JSj!~<1=ZWewg111>Zu5MiIl9dBQ6VtA?n*9i z$9>m5kDf{E*f!I{pC`LKFYsO08@(KUUVna2B&B1c!sM1q1-nFkw-tw3gXUh6ZL@~GuwPU*3$IZ z+UXF2{nu~y0TT`}5wBR6L#epdM-6gL*(-lV^?*Pq&vT`lVfiA&Ad=Jbg#Z!0$Gmu; zvr{&-0EJR?rhxcC|l+q*aGqlN6Q7qc+cIEft)0#y6F(r zsNQlZKZ;7Wg&nPAT-bK5khAs6w|Fa!!+>uSGH=wbK-cZ@Rkc4exj3Z zP;3L}RqSC6>2{ZTt_i;0`R>U082@=q$Myq7(@r9$M0m{)Qt9r4*yG5tLP>95K8YD% z_AFT~05~c#Y5J}SE(MGbNv5HE`{2q}9CS8z`_?N)x4h(r+|QkkvTn_?mZ6#JlmpnI zHgUqI{7iAJRnCQh6YgeeQQ>;7^5FT%grK=?sX{7G4$MtC9o(V#a#Zd}{^6g8{6BF0 z4^+rLb4>aZ8NoB=gjj3E1m7Xu2d-8XuU#SG>Hhc&_1=t@*iE1!btzJdfy)A(d(=^LvJIr)#XIfxK=f@tK_PH~(Wu~+BIuJbqTOjAV6Z{H(lL2D9 zOc3dH#T9^8kHROOg@a#DXywE9Kgcce!0dNpl{VMXYg0<}^Ttn8J9}O$mR^UkO7vnU zg*Z0pZPFulwC458*a4Nk68%H%`Knmc_3X2~LD2gtAn8%`PwpWpJzzGJgfp(onsKQ3 zdO@5%^KdVBm35y$tK;-NaXpzT)}ty7t^Co`Gpd}16(-9w5%A_?*QL`G>G!>urfQwk z7wMbmR3xAH#F!2Fl#(V*5vLO436Y^5NqC1WGG=w(8;y-m#((LLU`K&SkLP3Uw4O+) z;6b06BLV}}n!x5u`{dh5Fw^6#Jl9nVBqVhpG39GmK}VgaPe2)-t9maC@C*?tlJv2{ zP81@hKT(Puf_$m%2c%rtdx+gBqS!&@BUvV8xd^Ed9QZ!(cAUDkqKE^JhtpOZn=6)@ zgZx6^x#SKZXT0md;=7AGO^ucd=-BeoSae-#shNbYdVA|CL_W4!-h4OlaL{3HFvrB@ z8+#%O(<1a#C)QyJ$qI96Rh9C#SGGQClU7t2bP()55pWNmPf>V|PuMMp+G`v)bs{1I zcX6d+77~DnE#8WVLfX_GI&^iBW-f>{VG@G!hym3an+v*io-P*If+e*(D4xIMZ zi&aSrdnI}+TAzl=n#+&SSEtflK_Kfb;kV!p5;~)j|C9atj};W#ll@TPDCH5|`^a`k zA^aity0>xV;2gx#;1r)?as2jEG*yh`0}}P89Ovyj8QwWG+5c#yBqoT=w05d?SFwnf zE+P*@5x;7_VxXH&7X#A5c@N(;Cu;QC7F-u z?QpuvMY9@54k?{>%?j1EH#=T65>7vKUg;$a$>_2G*UAH2&M(@&Fe{s<4dwAYzRn?& zCpWdoLa!kV3ngK>m*6|NmVGu6cheB(DPZ+-e=U72m5@;Y#pp1X>kfpXc8OjCwHIrv z_?~-Pxr#V)cYXwfg#rH5uY&H~%!IiLAzf6-Xo~8KZ}CYb?Z)5aT`^NT=@cRhVE4b069j6?Qrl4Oqur zz|DC!z{0B@(A8z#uORFY%DyYocfj#k>m!792yg)#66!Wdi^wtHm~`QK%!e?tDj)Y1 zSh7MnSk#TnB!qQX`D7OV)`J5!)7g{_?7eU2)cH~>)xRANlDRd@`U-I68as7(Es`kx z5J$-)j~0!PXbr%P2#v3_&nWn@T>=FVlU1bK<9UEn%kWDfyAv6Lj}L=GUyh%Qt?y39 z`YG0Q&8j|&2`?lp+KlqXtJNjDW|McT^l!9t2c@<%^U<4v;eQ+f7Q*5{cLj{lhnQM= z=tjTH5H%2swS?VdbMw-QgByR%L4cMb@(euwEU}!^0TO^exNZTM{sH)|Dd0d(obk}{ z^Xe?_*2)!;>w&Lhm42$PW+~6YZfQV11N8!t$n1z=o%+zgA$7#(ck^*{2Rl9`1k*z3 z**hX#T{D%+nta7de!Pq9F!IyP6$ci6H>PhlFo`+!A!)$0d}bzg6t-qG*hDErXaVD4 z;5ubxAH>wEfpaDY08JFySMX(EhvA>S0ni_LbQ-Vn;q=43Y&s#1aYUzh9sGU4+ePTC zoRoU|u(vdUx%9_WTICl{TwY0XM(Ijb6#=-ZZU3Em&L8p45`9B12uvAiKl0DxQ7^bq z0s0BPFaWL3@YB}AJ^LJn>lXU)@o9qTTIC^)qDPa<=ew-=w?a+c!wy7MslY+w6_ALB zC|Zz2-tXkM{>Or5u-{j#;Y;X^4q&oLbO=~(ZpxYCmdmQ3q`s>R)$**?&M_pEq~CaW zM-&!BjQE6ncj^!UpU~YM03XbphA+j=3aNOZDU7rb#WNyrjO*M5%Vj2Er}-6~iHpl{ z=h2Y6FS1*ty?sWgx-AsVukrqzSB-8f!lwte;6mJy&U}5^^Hrm}&<7c8o!87wMtq(O zmhZ$SN}kpme@A+rELu0j(clGfWMWM$67_Y;P6ml+&UVRZT09=d66TT8C_o>Ph~bFZ zujrkFkVg^wDDWw)ZxKnWIr+7XVlx)E(0^1~8@htcPQfGCRilzKGosRdjw|d!+v@o; zeheS;lO%2D8Oh0gk3&U<@$D_eY_}K713sR)Oy%D=J(vfSKwM}1EXaaKclI6#Plz}B57@1iu?_le;p>~QAD;a-tDSFlN=RCQB@Eu3 z{ybhazaf7Cd|$_VbGSU#CzAM=`DWxKX?JGV+39JxZ&&Zb%B&#>Mgu~Tjw(6T#RIJ7 z)>#TPsulWDa^dHxYfir1#M;Nk$wZ5yrp5E0v#VY$7xJOD4*x(g0Cez&0yXF?Tu1-= zbKhmcCso6#n6DN)QAdbD2Yy?Nb)-b>f#dTrR#)p-u>EnIhzFd%N0WagW=4q{8t*)B zOb~#~?PQm}ssJ1f!`mw9v3H!vh1CiiY?I}oF^9D}WS;0_&cT;sOy{Usg2K$GdM zI0}Q*nmZPZspyj@+-7skRis`allCvL$0kBQ+MV>LKOF+jGbh(G^I8I4i$zgrEeI%n zMn&7I`Ud_$t4X9Kgq=%4g^IY2KqxYe9BM=~-Nd3z_-nzkKt7U8`fNz}wL=A*J-+jo z;de0V8+#EcA#7Oj5w@z+{Mvk8?_Pf=KmH>k501^R1&=^{D+|fmud*4b=R#DDq6TN9 zEVI7#3yAZ+R(;I^vhzdQosDXF5k3^5$}o)yM_=oqSc*uTl;UObq21Zdg@?Qix5i!W zODdlq+nrOuLqAJtUF~i1V38dLoOr}oTx@fSX`^0z*Wl3Vmx4Gu5A!SK>ZaxTes6>$ zWM?vK9w9mhNx!zHBYN)_datipLVGKD1(-ScuTwDeU)88=n^`tpRbNW$<&{>MVFMAU zY4K!QtYefKTRLJJ2B<+(f=iU(Ro-kf-&5FU{#Fn5wysZzphm9XbFK0+KBas7Ow)Aj zUucsMa9*AUnLZRc6_SeAtC@_t^^K;AVSW_H+V`V3HOi6zfR?v#3E1JuU@lcN?_+oI z@}}6&g4`8CYtqR<-dV78)@`HlU#DF@Q1g!s^zH{Pv2`!tZG0M zDi)V(J1X1Gai(|U6*_9}{W&5T;c$Mhb&x^i#j39^37eL3^jfMFJ^BNeTI#tI>|&zS&L~|`$?qla{c%O8Tj4m=kI&OSM^Nmn zw2!ky<^%HYjRJF+mo<SO_Cp zBnVS~P5G^F^u^$|Cpt6Qvn3kFcB^h0Y9PO1t-n9^%{~b+7G-#>MqE2n&n!g+j`!ZP zW0?^(0yc>nn0AX|4^gKZwVv0?Pfx)X!C2vzmDU|h?31TJ%k1FKj%9wZ7!mGG)OoTSq3{XeB)5k4y|Bn zqaepq5}*7|pP7ikpKsZdt6!d3>GGl_*Sg7zRn#EY;KoTMS(u7A0zjPGbb$xsC^Sdz z!J%844?U=pjK%#no(f+D+30F?^SuL(UUd*&_n?cH?p!9cDZQV@T^0C|yfCu4Lc zmOv4u4R|xf38^BdZ3ThAYTM6cmmiWy&O9u<5pU_|i1f*G%B%EBhp?s6yjTF+!y446 z%xp5LGfGWHOY{n?AC;TjDG}Iqr`|c4R39nsS!v1`uEzi+(4Fyn3o1Pkivcr1+*@_T zEYX;!S%c;EQ~iR-KVx(Lem;PHDA#9J*(3&ThOYptG579}YK78goLJszjsCw#4A+w>c z+tPk4pT2mkIGnhVq4p+9R3(7;Y=Fzfj7pP^IoCisE~6Uh3cq5f*EO+I@eOfCRYezp z8>7H-k~`96wzDn>WqIh7aqiJa4MJmrRsn9F3cv6Ayd>6;I=eF&LHkcuu!O$^TBt%w z;EQ<>Nrcrg!`uKQrDufdg4A(&z(oxQ4|ZEM*<1aN^1dB58UDVDCJRxK+2W>YaVvNnJ^Te$1SsRbje19=` zX|31W{l%sGdprg1GmwPrT2cJJS|(7+B~?do-$CMskUYH%jhv+NowYtBL9aT5R?lx2 zl-sig4oI2?%tgeRBLt2FCKrByxxeu|L-Oz*+7*uT{m!Y{&wzmos0#c)(}U(y>_5Cx z;gt+Se6!Sx?-_iBuyjO}9Dm>=OxDy9CO-qB{{G34zcCge2=v_YjhTNe+&{?gZw?t& zE%(h_)CzXN{h;&#XHy@Kd;k^#w}r&15v($^3v9C?j8=Zwg@alrFDE_cFT13_e}RxV zgfTkllBo9g!vT9C>HSrT>o8Qad`q7d3MGJ6namt?gb5#+t^_>?ioX_I0?LR<{%_!6 z-&p&IIt98&$F)GP%lL?R9u!!pEEk)+95FQh_XS~mLr9{Tn(RQH@#_#A!ia&g+5oA+ zv!^)A9W{YF1QfF%n9u4hxtH%N+(z=zp_6s_ni4LJeEO?P%Aixl|L^x5qYnT9O;PiHm0>!*ZtL_eT6>Dpg<4$pcc0O+^(zUB{Z zCG0Y8x8R9H9)#$c<YACMMijda@qh4ep>si#QpEL>>oV6 zKfmyU0OlR8i?J7C?*4h<{=Trk{w?`6P|Lo$nxy~fcK6Q)`rqHeC>H*?rqfk(%Kv`% yU*E|8zB9kRAAjFR|9xlv`_2&kKc6$zd;1B^tBq{J<>L0ifATVl(pi^pKlnc)oFj$+ diff --git a/docs/source/manual/fpga_verilog/index.rst b/docs/source/manual/fpga_verilog/index.rst index 9b3af3a12..f851e6ed9 100644 --- a/docs/source/manual/fpga_verilog/index.rst +++ b/docs/source/manual/fpga_verilog/index.rst @@ -10,7 +10,3 @@ FPGA-Verilog fabric_netlist testbench - - sc_flow - - diff --git a/docs/source/manual/fpga_verilog/figures/Layout_Diagram.png b/docs/source/tutorials/design_flow/figures/Layout_Diagram.png similarity index 100% rename from docs/source/manual/fpga_verilog/figures/Layout_Diagram.png rename to docs/source/tutorials/design_flow/figures/Layout_Diagram.png diff --git a/docs/source/manual/fpga_verilog/figures/fpga_asap_10x10_final.png b/docs/source/tutorials/design_flow/figures/fpga_asap_10x10_final.png similarity index 100% rename from docs/source/manual/fpga_verilog/figures/fpga_asap_10x10_final.png rename to docs/source/tutorials/design_flow/figures/fpga_asap_10x10_final.png diff --git a/docs/source/manual/fpga_verilog/figures/fpga_asap_10x10_floorplan.png b/docs/source/tutorials/design_flow/figures/fpga_asap_10x10_floorplan.png similarity index 100% rename from docs/source/manual/fpga_verilog/figures/fpga_asap_10x10_floorplan.png rename to docs/source/tutorials/design_flow/figures/fpga_asap_10x10_floorplan.png diff --git a/docs/source/tutorials/design_flow/index.rst b/docs/source/tutorials/design_flow/index.rst new file mode 100644 index 000000000..e7e9937ae --- /dev/null +++ b/docs/source/tutorials/design_flow/index.rst @@ -0,0 +1,10 @@ +.. _design_flow_tutorials: + Design Flows + +Design Flows +------------ + +.. toctree:: + :maxdepth: 2 + + sc_flow diff --git a/docs/source/manual/fpga_verilog/sc_flow.rst b/docs/source/tutorials/design_flow/sc_flow.rst similarity index 100% rename from docs/source/manual/fpga_verilog/sc_flow.rst rename to docs/source/tutorials/design_flow/sc_flow.rst diff --git a/docs/source/tutorials/index.rst b/docs/source/tutorials/index.rst index ea844c11c..fbadf5193 100644 --- a/docs/source/tutorials/index.rst +++ b/docs/source/tutorials/index.rst @@ -7,3 +7,5 @@ compile eda_flow + + design_flow/index From 011ce5cdf6de11ea6f7e29c7292304273246480c Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 24 May 2020 18:22:45 -0600 Subject: [PATCH 078/180] minor fix on the documentation --- docs/source/tutorials/compile.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/tutorials/compile.rst b/docs/source/tutorials/compile.rst index 6844740d2..e7db5a059 100644 --- a/docs/source/tutorials/compile.rst +++ b/docs/source/tutorials/compile.rst @@ -23,7 +23,8 @@ In general, please follow the steps to compile .. note:: recommand to use ``make -j`` to accelerate the compilation -Quick Compilation Verification +**Quick Compilation Verification** + To quickly verify the tool is well compiled, user can run the following command from OpenFPGA root repository :: From 35536ee59428238a08764f430037b0a3b3405585 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 24 May 2020 23:03:54 -0600 Subject: [PATCH 079/180] renaming design flows in documentation --- docs/source/tutorials/design_flow/index.rst | 2 +- .../tutorials/design_flow/{sc_flow.rst => verilog_to_gds2.rst} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename docs/source/tutorials/design_flow/{sc_flow.rst => verilog_to_gds2.rst} (98%) diff --git a/docs/source/tutorials/design_flow/index.rst b/docs/source/tutorials/design_flow/index.rst index e7e9937ae..610b09b35 100644 --- a/docs/source/tutorials/design_flow/index.rst +++ b/docs/source/tutorials/design_flow/index.rst @@ -7,4 +7,4 @@ Design Flows .. toctree:: :maxdepth: 2 - sc_flow + verilog_to_gds2 diff --git a/docs/source/tutorials/design_flow/sc_flow.rst b/docs/source/tutorials/design_flow/verilog_to_gds2.rst similarity index 98% rename from docs/source/tutorials/design_flow/sc_flow.rst rename to docs/source/tutorials/design_flow/verilog_to_gds2.rst index f89d71db2..6efb3041f 100644 --- a/docs/source/tutorials/design_flow/sc_flow.rst +++ b/docs/source/tutorials/design_flow/verilog_to_gds2.rst @@ -1,4 +1,4 @@ -From Verilog to Layout +From Verilog to GDSII ~~~~~~~~~~~~~~~~~~~~~~ The generated Verilog code can be used through a semi-custom design flow to generate the layout. From aa77ee9af6d4fbd3631af8a8e924e4e1ed6e1668 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 25 May 2020 00:31:01 -0600 Subject: [PATCH 080/180] add tutorial for full testbench run --- docs/source/manual/fpga_verilog/testbench.rst | 2 ++ docs/source/tutorials/compile.rst | 8 ++++---- docs/source/tutorials/design_flow/index.rst | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/source/manual/fpga_verilog/testbench.rst b/docs/source/manual/fpga_verilog/testbench.rst index e9be51fda..728adb1e0 100644 --- a/docs/source/manual/fpga_verilog/testbench.rst +++ b/docs/source/manual/fpga_verilog/testbench.rst @@ -1,3 +1,5 @@ +.. _fpga_verilog_testbench: + Testbench --------- diff --git a/docs/source/tutorials/compile.rst b/docs/source/tutorials/compile.rst index e7db5a059..5183be503 100644 --- a/docs/source/tutorials/compile.rst +++ b/docs/source/tutorials/compile.rst @@ -8,7 +8,7 @@ General Guidelines OpenFPGA uses CMake to generate the Makefile scripts In general, please follow the steps to compile -:: +.. code-block:: shell git clone https://github.com/LNIS-Projects/OpenFPGA.git cd OpenFPGA @@ -27,7 +27,7 @@ In general, please follow the steps to compile To quickly verify the tool is well compiled, user can run the following command from OpenFPGA root repository -:: +.. code-block:: shell python3 openfpga_flow/scripts/run_fpga_task.py compilation_verification --debug --show_thread_logs @@ -49,7 +49,7 @@ Docker If some of these dependencies are not installed on your machine, you can choose to use a Docker (the Docker tool needs to be installed). For the ease of the customer first experience, a Dockerfile is provided in the OpenFPGA folder. A container ready to use can be created with the following command -:: +.. code-block:: shell docker run lnis/open_fpga:release @@ -57,7 +57,7 @@ For the ease of the customer first experience, a Dockerfile is provided in the O Otherwise, a container where you can build OpenFPGA yourself can be created with the following commands -:: +.. code-block:: shell docker build . -t open_fpga docker run -it --rm -v $PWD:/localfile/OpenFPGA -w="/localfile/OpenFPGA" open_fpga bash diff --git a/docs/source/tutorials/design_flow/index.rst b/docs/source/tutorials/design_flow/index.rst index 610b09b35..e854a08c6 100644 --- a/docs/source/tutorials/design_flow/index.rst +++ b/docs/source/tutorials/design_flow/index.rst @@ -7,4 +7,6 @@ Design Flows .. toctree:: :maxdepth: 2 + blif_to_verification + verilog_to_gds2 From 339bf87c430e98732ad4435b86c3e7d7d1408078 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 25 May 2020 00:31:27 -0600 Subject: [PATCH 081/180] add missing file --- .../design_flow/blif_to_verification.rst | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 docs/source/tutorials/design_flow/blif_to_verification.rst diff --git a/docs/source/tutorials/design_flow/blif_to_verification.rst b/docs/source/tutorials/design_flow/blif_to_verification.rst new file mode 100644 index 000000000..d3b27a43f --- /dev/null +++ b/docs/source/tutorials/design_flow/blif_to_verification.rst @@ -0,0 +1,157 @@ +.. _from_blif_to_verification: + +From BLIF to Verification +------------------------- + +This tutorial will show an example how to + - generate Verilog netlists for a FPGA fabric + - generate Verilog testbenches for a RTL design + - run HDL simulation to verify the functional correctness of the implemented FPGA fabric + +Netlist Generation +~~~~~~~~~~~~~~~~~~ +We will use the openfpga_flow scripts (see details in :ref:`run_fpga_task`) to generate the Verilog netlists and testbenches. +Here, we consider a representative but fairly simple FPGA architecture, which is based on 4-input LUTs. +We will map a 2-input AND gate to the FPGA fabric, and run a full testbench (see details in :ref:`fpga_verilog_testbench`) + +We will simply execute the following openfpga task-run by + +.. code-block:: shell + + python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/configuration_chain + +Detailed settings, such as architecture XML files and RTL designs, can be found at ``${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf``. + +.. note:: ``${OPENFPGA_PATH}`` is the root directory of OpenFPGA + +After this task-run, you can find all the generated netlists and testbenches at + +.. code-block:: shell + + ${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/latest/k4_N4_tileable_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/ + +.. note:: See :ref:`fabric_netlists` and :ref:`fpga_verilog_testbench` for the netlist details. + +Run icarus iVerilog Simulation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Through OpenFPGA Scripts +^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, the ``configuration_chain`` task-run will execute iVerilog simulation automatically. +The simulation results are logged in + +.. code-block:: shell + + ${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/latest/k4_N4_tileable_40nm/and2/MIN_ROUTE_CHAN_WIDTH/vvp_sim_output.txt + +If the verification passed, you should be able to see ``Simulation Succeed`` in the log file. + +All the waveforms are stored in the ``and2_formal.vcd`` file. +To visualize the waveforms, you can use the `GTKWave +`_. + +.. code-block:: shell + + gtkwave ${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/latest/k4_N4_tileable_40nm/and2/MIN_ROUTE_CHAN_WIDTH/and2_formal.vcd & + +Manual Method +^^^^^^^^^^^^^ + +If you want to run iVerilog simulation manually, you can follow these steps: + +.. code-block:: shell + + cd ${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/latest/k4_N4_tileable_40nm/and2/MIN_ROUTE_CHAN_WIDTH + + source iverilog_output.txt + + vvp compiled_and2 + +Debugging Tips +^^^^^^^^^^^^^^ + +If you want to apply full visibility to the signals, you need to change the following line in + + .. code-block:: shell + + ${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/latest/k4_N4_tileable_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/and2_autocheck_top_tb.v + +from + +.. code-block:: shell + + $dumpvars (1, and2_autocheck_top_tb); + +to + +.. code-block:: shell + + $dumpvars (12, and2_autocheck_top_tb); + + +Run Modelsim Simulation +~~~~~~~~~~~~~~~~~~~~~~~ +Alternatively, you can run Modelsim simulations through openfpga_flow scripts or manually. + +Through OpenFPGA Scripts +^^^^^^^^^^^^^^^^^^^^^^^^ +You can simply call the python script in the following line: + +.. code-block:: shell + + python3 openfpga_flow/scripts/run_modelsim.py openfpga_shell/configuration_chain --run_sim + +The script will automatically create a Modelsim project at + +.. code-block:: shell + + ${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/latest/k4_N4_tileable_40nm/and2/MIN_ROUTE_CHAN_WIDTH/MSIM2/ + +and run the simulation. + +You may open the project and visualize the simulation results. + +Manual Method +^^^^^^^^^^^^^ + +Modify the ``fpga_defines.v`` (see details in :ref:`fabric_netlists`) at + +.. code-block:: shell + + ${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/latest/k4_N4_tileable_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/ + +by **deleting** the line + +.. code-block:: shell + + `define ICARUS_SIMULATOR 1 + +Create a folder ``MSIM`` under + +.. code-block:: shell + + ${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/latest/k4_N4_tileable_40nm/and2/MIN_ROUTE_CHAN_WIDTH/ + +Under the ``MSIM`` folder, create symbolic links to ``SRC`` folder and reference benchmarks by + +.. code-block:: shell + + ln -s ../SRC ./ + + ln -s ../and2_output_verilog.v ./ + +.. note:: Depending on the operating system, you may use other ways to create the symbolic links + +Launch ModelSim under the ``MSIM`` folder and create a project by following Modelsim user manuals. + +Add the following file to your project: + +.. code-block:: shell + + ${OPENFPGA_PATH}/openfpga_flow/tasks/openfpga_shell/configuration_chain/latest/k4_N4_tileable_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/and2_include_netlists.v + +Compile the netlists, create a simulation configuration and specify ``and2_autocheck_top_tb`` at the top unit. + +Execute simulation with ``run -all`` +You should see ``Simulation Succeed`` in the output log. From 1150b903a5b88b258240e30649e77c462edc61b3 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 25 May 2020 14:43:55 -0600 Subject: [PATCH 082/180] add quick start tutorial for architecture modeling --- .../arch_modeling/figures/k4n4_arch.png | Bin 0 -> 71307 bytes docs/source/tutorials/arch_modeling/index.rst | 10 + .../tutorials/arch_modeling/quick_start.rst | 549 ++++++++++++++++++ docs/source/tutorials/index.rst | 2 + 4 files changed, 561 insertions(+) create mode 100644 docs/source/tutorials/arch_modeling/figures/k4n4_arch.png create mode 100644 docs/source/tutorials/arch_modeling/index.rst create mode 100644 docs/source/tutorials/arch_modeling/quick_start.rst diff --git a/docs/source/tutorials/arch_modeling/figures/k4n4_arch.png b/docs/source/tutorials/arch_modeling/figures/k4n4_arch.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4803094ddb00ff00abe0d86f80e4e9bbe2f2b5 GIT binary patch literal 71307 zcmaI81z1~6*ER|Shu{vy-QBeW2wvRX-QA_QYfI5$#oda#dvS^sD8;3?p71>HC;xw) zbF!~wPbO>D%&d{UX6}0u{Xt0vh)jeG1qB6^1%p(fpkT0|prBt6;UO`jYWr)D8?>9M z%zLQnDUt)omm~{qSxZGlC`L#a5egm}9t!X#0tEy4!1_-Z8WJXgg8L^P3Q7~2_`k!3 z(DeT!A87*x`yUxg$o=gFhP)xE|8ocAL;sJ)e3<`|hQZ1Q{8t$I58QP+0YR#Xr)b8=ucF?TYxVD)xzeoF-<>@5fhI#{@ykb67W zJGu#ai%|X}AqWY-MYBx~$<>0Khn1U^ol+E;oSanc}mHd|; zkcFF>tBtd}jguq!n_d%BCl7ZKO3Js4{`>WBIo)k6|0gF$xBpZNQbD%2U)VTU+1dVE zHzcX>Tdbh6tBnOD=QsVL9K!!d{vUDwlh42MAFQ3+ogh|lwK0=*bhmJIc7<5vpVXZH zN&WvV@qg=5wQzH?_jpUJ;b`M7`dLYAqLV{#GzzC66)U2#|8-5ID>OF^1I&V)O1qfptvZ+ zsBig{@B`;*TU>>Khx3t`69W6egd9vTF<%is^-D@g!O`rK3%v8XeSQ^L^K)}+Xm9Xq zxcGjm#rLkfy~5Vg%C@}1ub#S&ov`Xfa={TBlb>+a06IEDf!{t^ZGauP zlL&z3be05MG5_lN=Tn^4wub=gv$tlv!kfB(FQmC(4r;6-Yp%Hemi&K}BP@rO)}dUi zhlNKa$RE=_MW`3!J9o?eVD`ran@98O(5&l)^-$c4AkeFm`h8yWCT&CSW^Dmnpgl^nK z>_j63z;lz_oV2|>M@DADLro$B9nFT3tG#!_;{;i;p!oD}E{*!aSsW*;h&eaDoz#+f z1#LH-5z-)PNmH^JP=m?hW_}RRo3NJb9CItOC!!}=9C(!Mt!gzfYfX+u#Lqgj|48~E z$}ax53PHDq`r^<0(efBm5@$rXRy8mOVh?d?+hD%_wcz$(t`N82SA-uuU#{L8D;x7| zac`mbJcfh^g!rc~BUYkzV1n~|O;C}Fk^izO5fR}1S&F47uzBXD{xxeQPVIz%ZGWJs z95H6yV@>`-l#e+J?M;0SKkR%Zst+TKc&C}~$da%Ib3hZaqeNnaRy5gbO};_&EfP8b zNIt(E41YQU#d(4-P&obVo-+dUgOLmPX4+pxA(=C0Ul9ZF^8@XJEddFS(9>|2memr( z_<~LeknS?qbMU8C73wn@Lf8i#zF>t%=!-vGwq0=)m`!5}07!oe;kOP}!(H+__Cot} z3Y&{04AuH>8Sn?rds+zhj{Mxy*ef3*q|L)Vu{e|4jEj(Z&czZBDb3S-&wKYK%9vCB;dN{<8~lZ#G4(fKXksvSa79RGh!M0h0MepSngD~D zU{Vfv60FabpNY98OoH-DEV3;2LcFgCvBidxqGTOPlHV+!!c&X1BZfnR&KL56xFx(* zCGIPJ8GIZm9RVqlH8(r6xV=$&(RlXr6AGMwxZ*hX_!t0EJ=#D>^-@=(SU&(5AO8fvg#|nx_0iprJA!^OqnTImOq4(!@HvjouTrf*g_#w{nNwx7IQlosv{NF*rsQ{R?zhstrFxShK zt%l+-=HAi(aO1R6f6fOY<+RAjzs!GV179Ud&KQdG^`p9aT~?O=#SZiKLPyV z!G$5tWVKvLE?ALJx6qJ=gfyiDV2BDcY)%3D%|flVTY*=igB*PxBW`HlJ@Pwf5^7-Q zglEW&zx?je3Lz>dzmOnz6G-5uwYEQ}v8AqsJGahX0bZ%nrEpi5-V1 zZj_zZL|sU#4b(kuUOXhbhh2!NX3c0+OF-i#!#fwBuG!NVR)l0=6xx zi1XJWxgY$xtfZ5lJRQ8{BijvA3Y4Ant+*HPz_-8|0!+eyta#_>xnO*hF=fNFJ)BdA zjp<$mqqmu}SXeOnrPJ>EuUB4W9S{0%YiQc{=&&R3?xc;%$ zo5k3Pz#>5E09&eSbyI%M{}p{+4s8bZUP${tWa$e-ijJvFVkz1BlNkO@{vRb|Ku zwr5ckDW|14hrXg6clSFB?-sb?);jWkMg1mkB^kA^_IG+`yrZpJ_*sd`c^ovOwc!yj_q2h_1K}^yM`u z)>}9eZ=xg`T4Mz$()bD=_8fJV;92v@;dwSW&S1+5m&UA+d`o0}=ba!hF1NQbwYae% z;}Uh_NhG55S#(rBzca@$GySUdi!E{|iwi@xMGY?^AiYN`FDUG>n^~%WG>%p(noLa=(f^vi; z9c1lkHai23wbp=P!;%MAo3q7IJ-?Rvq<~PZ%cg*jBb93238n#1R;Tw>#wh~8X!8jz z8nX#x&#d@XX@E^3^wD)K|6Rr>-Z+^-`j&Iq+u^eeI9+pXTzJNMc>T;E*ZonDv6N;< z^3S(NQ@%`cO>;CT;ebw?G}`oN%WAlUEsqB>s>+qkz;~6a?nhGx$zZ;h{)?j<9x*GO zBH>4`xo~1GQV+)+p>fK+RF+}ZNYiW|O`-8@A3h?P7F^LUsAsvGW}2vpAZh*bMlD=e z?C(7!*d-xp=XPzr)L121Mpk>7k|qa9W7rX$qQByZX_)lRJIwv~~}g z+QGq5FPe1q4y$BlRO%zZnu?|Hxa^e|`~>E8GN?GFB5TY#wgn}%2nu-Y7HX1>VWK3a zk$FAgB>c?yCXDTkR|`nW%SN{V=Q9?ZlS=R4ExWqJ3p_bMKAJn%ok$igbGw_h zVQK9EP;|*gT-7P6>bH0c8?okJ$a821#Rr28Gn535%9Dbe3SZKFoU^D^w)0CYy)18TDKe zkRi`If17eHsU~|ubtjBMOLBZ1@}$$#5Mmb`3B3bd(&or!uHDzk$LTLfXeD=q1V92Uj5l(!%407b8Uce(k8w~nbMQ*8=neI4{P^1Q z0W(H*m*!s+_)?-lxgsoo=-Geh`;dM?&ldp_ZnS-Pb7AQd;U|7b`!r^LYd$4KQi4W> zM+4jdE_=cG6qs7yK0Cl^1%9{iU3Rf_%wZ6U^^|*F_f--ks!fGih8hlnzTY~7Ejs!o zolk5n`RjF^@twtSqBwv_(|BwDNW8tk?Cc2M-1?3h^-5N0IoOi?UuOl8h+T~s6DJL8 zp%@q~*)yNoliqXD^CI4rPKSzz%bddUQLhN|7eya*Cti9T++*Te5VDMP|GucP6}gr} z9H0cb14a6ZJ2s#@r;0uZ#@p#DAx{M8E05#Q+mkG+2zn4@EKg|UHydHS@5zVGFQ=(jVZ2y^7{yN*YDUYdmhdYxh$GrAvgXj4ng=Q{a zhimD(IsPiI0E(BQ4X@hut$bIX<9O)h z&P#w!{r-EMQ25S8H}5MZTBHD&IhiB*A5{Go_x}w$B^@F9VT;_Q#Xj z-nHU86R@8;`%mtet5!t2n#WTW>lkv`=#&+sRtkJLA$GAmncoo&lzK=0m7)Mwtpi8- z-ZlS}&T!a;Z=Kv7K$e_IM|HCzQ~X)1+0lS-qd4}eMpq;K`TFm4z59l+K(UV-A#!+S=f1bjZv0B~ldT{Rf@ix;-t0rT(`<_<2&FO68l0*|fE(|((vncxOT3bLn z&dCN#I|{P-Qo=jeRShlK$tVAXq0&1Hz88I#3T-qo2#oi zbq5m9c1V7~R=DNK+IV!KbeVQy^SO3hm`k!=Sqit~f?Tp@m5L;9jnSEX#<@T3NHP-V z`M`X`<=iBnyr*MzkwDjaVWbzY(47?0{YKp;pNA>uf4j^Cbae&U`*u3CjGi1ThG?p?$E|>^fC)987 zi^nn5yMA5lmb)2l;pWA29N1?=DfZR$5U5_Pt8a5|z`?;E$VrUh7cVEk3dn!D4d$WB zfgJ+3`p`tg6JnQ@Wpns8+OKu!RQKxL4mBGfrPWY`%RJ-Xef5XR5( zyGoKL3s5iDtTD`}wU;gW(#0;_H_4Q2FQ9KqJtl`wzb%U8Xc%oizGeJrBke=}l-f4} zq!XPslRnro_2L*3gUKwB{LG^auMHJ7^Gwn}Zw59k7ZsJ6@$17JFUFl8bZlDmgq(H4 zrg0#&DO;H*dp$F%oohW%ml1hA_HP+%`$%=-(t}&vmx^L!Uh31B^WG8<43Vf8EqjcE z4I&|qN$i#8@z)E}gJgU^i?yLqq4&ake`}4@lzPYvq7WltbBH;$V{H*!{*$MeGh`xOLO25XcLIW8~<>N`Fx#`aE$z8{kM73G$gNchj zMF*C|WUjEhQd4fd9 z?8t^6xRiYS1n$L?k?^+x_|Q})?2cMz-|f}75h#-Uc!>t|%E5hXW&N;ZSeNM->EvwP7szd)a+pl_^!~RpH&XBQ(SAM3QcBzu9Wh7dR zryru^VyDMPh9*>`OyhB4V{zd}r=yUUBh};4xV+tsPZC54RY|%(uvfYj{oUQyFzghF zfbxqvWzLKGY+7F+Z7#r~3lu zFzPT%*#sn~bbXuMpBhrHjJzA|Swr`%$XSU-;^k{>HV$rB^vnf*cOxYl`4p>HXvh;{ zwR@eU1Yu0*w3zfaCb47hf)NO@c6ACkaM1dOz~OeELOt4XmC+Ihs!EO3LdBWSJJKlw zE;Ku{VuzsJGGizD9N~--RdkGA7s8gdTOBns*El}9TuM?tHsjc6;v2cy(p|1Db)jjU zPA$T^V^tT@AR?^AAH=PvWZpRMQXI0=nM$x1prm+YZ@!>!^RCDvXN*h>RkA#}HMs8a zGoy4iT%63g819?bWz6oB#8Av4=(1|Xh38p~zGU#<{fgbQ?y!(XN_KppFr)rTLdWdG z{MJ~Q8D;cLX34!Aup*KL;yI-sIIs$c+R`(J8&VkOEgW5G$|kbvWVW&+I={p`-D>Ax z6aMv##w?J}dZF+?$wdN6ZXI^-(kJuQKHmpFKPfB3c0{)#Pgom@fp<85*w zAuW2?mSZ49--h?kPYf6?C-fxffb*s&i^;qEnaZ-W-50pLaL*{LeUaq;x`MJI{BAfvL#QRQ*kKU=QGsu=?h?BoI3={V5)0nhi~+q{Vsx`&7or5E%z zqfrl8IWJtjSwCpO`)9AVcJ+F=s>c_Op>8u1s2<@EYMhx`)s52W0BS4LU`oPJ^bbuW zbUGcGc(bd#=NFBYk2u>o@{c@bil@Ae*0eHS?o0h2w<9l^Gfq8vy3q4F9?JF6ub?`% zBVlMFGYOC;QH1JCJ%%rm`e~%!qg#nF60U37FGqiB{_CJ@_uYFW{}GJ@w! zDoWM+wq5@y9c&Z+A@0u|EYHzkd~G+>L+tubObtGmMAeSL^7~)woA;1C^30`wGWL)%B--eAL$1yI_ zLv4T^qxJh&#ML$P`I!RmPjgAeZ4rB~+VdEKMj``W+N)cLv505+O4<28iWi3Fmx_X0 zd?Gb0iIs5ECeXC6pPWiR-?uj%zOU)Xx7wP^WS)laB$hc*n^R)jXJ)7qrkGgsSg1;G zr>Jv^P02XZ*G#dDndi005BCuow;1Wb`!QX`_H29gSMF4<1r9phtGZ1dvN#MSWoa%q z#V&77Uj?@?{!Ejf#ul_!2$@W_SwY%16O8+!LwE1Yh2LV6)2I0G6P0buSwhhE~zQNqZ zPTHP^uaV`5!|!Q|Sfqc2<;lnX?9@1jG&|76JWb6v$z0GY>v^waa)-2Dvz>4&u5aO4#%cXf=~sl`?DkJ%bh(&eAO_&z^_|&nI17n z>RnJ^7h@);WR1WIq|g9FnDiIRB>dX0WHzlq{GIwW>z;ZHY)iu4Er0e7y=Np;qpDU8 z_Ixpg3=J=5Bn>#P3t8>H3fh?nW zFp?jK2!^eWhdB)74?`K8IIylzo?-oImRUi+hEK%CdOi-zzQV~cWjETStVXNu`#ibP z{dP4C-}HKMjEf@hz%SD&_oglhQ(03UOLw@w`9mY!*W_V};?NSx31AZF7yzf)d=7@` zHlxPsaV?@q>*~jpib)1zPRsFQa#l@oQj?5}CAQ-`zPw82o6<3N4(Qz@yw<^>?K9VD z^6I<9;i`MDf$V&@Hqe>Tp#iw)wtAQByEq5{T&8V_6+|_1A_8oQANf0+$J`{D?Y47A z`C(!!Vr0u+Xic6APn++P6NBnZ=?R9Njfs<;UYmUl(455W1~|`8@+9Ko^k(vhcN*g( z9(dfx1Xa<1f{v2=ZQPn{kqZ{wP$j+MGvivrW`dE@E2Q2XcIdFB#;uvKVPLQ0_e2{+ zjyFwr5=;@{6?~5VdbieM@Iku0;hnrmC1+M-#y#P#1>!20FN?U}nr--9N zWTgx*>paS~7E5WiD+@SPB`!i!>w?(hVwv!zysZv5a>r~J%MZgpM-)G!6M=Ch`w&zV z@TCC<1<-7246G^P?K-I>iNkRroTNx{&2WidLlA?0VT}joRN>;I!ceo*yTJcKO6b5w z7iU_RRpfDQ>XUkwyUEm!ilpy^wQGqIzCFWof_wbrlVd^7uDEsjc|AC0T#ScZ+XWew zpgMO({H$-6sjB!B^HD>~$M3nr?X=PQ&sm7^*)6Pfq>C~hm?ruWH+aq~G-SVT^Hk<8 z<0Pw2x}1Eb8Fx69;l*8}kNgLs)^7`n6CZf$R2F^5t?#^?#>tIm=m7N5+!!0;Ynaey zBaN>aaS~=$$ani)By{ijY7ET@LF>-3OSABWdz6J+?sC!@Tfzi$3fu@`XEJZqsJ|a`2T6P9#=T9lu+- zgnHZf_MCtf;FN&RO>s}@_e5%=wE?SJ#IHFqk9Hd!3amSY+OKT~nzN>!^1F9T7#cE8 z8iR*W&L^`f7zo6+;ET-8X#h<9Ck0!Jyjk`8(}Rs;CZ{ZS;*QP*8pFk;L;-bb!m;L~rZ)Cp2{6Fj84Q1dP2VH^LSwn|p!P<93zcnN3 ziI7yHlNwKP4{zz*TzBJEOGn2ija*Az)6jIewP_s#H&r0L>bOajpz#2HUFPcw8Oyk) z2NLWo$SZ#Jv2OQ#QItsckzjic0zj>M-v}nevvdo;5AA;0PiB&|}c^onUUvgQn5S9}E}17|;n=Oj9~9r`QA z1nt&*iK2MKW;W2q#_M+$n$8FwSh*3o;^jQL0H43$v_m2F-#LnB$eC8WBOl?ggL9;W z_NJP=MuEVZC8<7}SoEzr_9R`RC~Gh(0lRpK@k${XyYrT~*msTq0tjSj-VDzy*@tKU z`S91Ab^cPw1^l{r%$f(+WPItJWzcwg8LI^I6Wqz7abI!fclt-vJCqq-o3LzPE7jh4 zG1cB@k=&FapLh%TZM-(;L8;5R2(8@;2cvPMCU}$aqdbdWCAS}$xZa=G+uS7AGVp|q zLiVwCM^mv!5(xjnoeIqC4B7KYPvwHhZ{;n{uK!!O?{>5E4!XU+)Wfv2C{97ax%(@EbgC_x{o5eiH_ z(%Sq}j@6JDUZMNTkYF|`N(jLc>L1Y5hFno3X0fQrfh@X}VPrVr-T(+Mrb&VbUkr=Q zTJMM4Y~CKUAfi?vPgWdb4GxECNCeSO4z#QjU|lTK96*qwG9s{AqUoxl1NAjEo!xm# z&#f~A$of@1(aO+~2%FcR6MSwm`kuVtT`iF_TGE3@p@fSqgzurcBTT^hhD6J8CwZz7 z(^P5|sn1|yDzt*n7^F>Gj)&@}88`_?_#>U!iHWs7hH*ps8tHDq2QuhH(($uqhbV-l=u5R&c+bb?1L@@6IRhBEBpMHL;BZg)9uLO*Q)w13_Hzn=zV4( zt&KI|Iua4;Vg`I@WtbOZ;%E6HJ}Atgik^7d59v=~9Mma6Xs8JPz^gn-R|H6>zGYt3 zjSWM%1UKjbD@RXYF9#C`>GK^^G2d7>vW*g6;X$x7om`;y(ZCj|f$4 z-Y(k2nxOZdQs=7HvNoXX4{k{$8V%hfhEO|8LUYFaQ@uZe z-a&ve1lh}a2!fG&Iyv%Iic=!+!;c{=?GP96*Vha93Oof3l$CG2-OQ|n9bM!4LWvplsDzl}&PJ|tI)ONS6s!bMLZ>Si$ zsYT>FL5%}yx&=Ym2xdY?Cr96LLyI|48}buWq_xvz(K2#@pZ|E4lCD!-ggl|}DWXlY zJGB0#JJiWXO11oZc=L)fCiPj5kwZw|x!Ddr9i;J5cPKifA>z{Vlx)Y3MQzclzZ&~e zp|r#P{kz%ZYCB4POflP_tNgj?Pm{; z>UbRq%c=v%^`OJ1?y?RZgL1r(&6pn^r$oZ#*j9-e1RW$xbSs!DzNk#QO}Xg|C^+O8 zeFQI?Q5+w9m_rl5KxZFVZ|QBY1>U6HJt_O&9Zja78v_5tpnJWGoh(21-??QAG*qo` zx^4-IMqO?x+DB6aX&Q5ocVoK_V;oT#18rmcd5m_;4(>)4m1!DfqWWS-ftw392WI^IBt4Nnarj$%3rGDC~wIXE) z5Yv5a|2faBTa{*JH>K-S;G&k`J(5eHMye4-z&@w{cM`94BqI|yC<4ruK5_DMl>9_x z?Cnei1do=nJCE7v3*@U6p1U!I2k+OQ^Cbv`MGrM<8 ze7qe6apdc)eh+xs%9z1Uq+V5>dXBdInhDh|X$n6%HJbSISD_J;SW@IQ^$!KCx%xho ztQJ5Zg7A{tqoa`TVh|n|7#e7vW;Ljo$FQs7ZpNmrBd6dHZaP)J32(3Xs!!94E z#EP`8`*$S?uoA2M^j}u5Go7!8FMl!#Um1fu6_#%*Mh*Qlv5G`!S}y@^r0!#6L9ejMbky+!7`>MD?2ScihTUpt?uv zjM5!1y&`>Vv&>gcE&38e2_-3!X{2RsQKRW`El1+v=TrbTzf~GdsbeZ7%MTxuJkP21 z<3AzfM;Jh7xYeP5j3_@R?YL_j(Gig%cw{dRislQ67{<=C9h;MBp05qEQ*fFXx`~YS zkVPg5;H9<})}J?SJT_`--?i8q9o8!;L-!7--@|4YNWd`MYFsTHyZik~4_W+3uIi&a zSl}mz^{nyd4vUy-P8l+uq!Tlv5~hFfMrbkaBrMWsd%aJdxs&Yq!2;jfw_#yHj=^5W zBF*IMw$TO^+}yN?PwV`^DB`+eiOgBb27H~psn_npoCu}_34M?x z(^7W>c;E6n?dRdGevwa6>0jUluJ?|bjmB0yrm;>RX9`>q-rPmbrUisc^LaX94?UWS z`t|v{Q*xFa%GN8l*=i|U!ar1sWXOx3!@G&tBf`5MxI5oCQE5g11`}|jojN6A7){~| z0td=DYPNsy$iTQ%!l|ty2fJ!;9ts_IZ`z=QgG8(#Oez1+B*sc<+XzckA^iZA7tt?@ zlIf;U=JvvFUmoVwMPMb>E7vpDFUpq{+jNbZ(C1VqJRSG$k+sZUC`x6{`>da1k>KUi zz!(OH8Pa?x-Ror`b(r1TOnFbILnBX^^+D<4IOVj?0=%ORl!|||Ok=)jv(QZD=^3p~ zugR}Itth?3S2gHq*wR2SYXjY^ua~wEbTUmVtfcdes<}y2iyBRNwB@yL`0)74m#J1| z-nHCxEXcijx79o+y=y1H&SFUF8Pr8;md>J2qQrp@?XDyG@e6L??t(|#Lg zxTH_9z76q|9MEM)o(e?zV#fZB?~S=aENBy&Lqos)Ut}Oy#}pYtX}yWBgda+JzdqVunY?~3C- zOLe7pT%q@2Ug=)PlUuQ(q1`<(yi`Sp=2#T@wci)oti3#oh2QeBf`nM96c@n+MV{^6 zIS{4{$)YTF46gKFR8)=VONFFn;Cv?v9jpnlWV2V#^=eQ@sNHQX9T*4EgHJxbW7S*4->%L`4Qf1`KMHb| zruu|#)B(jaS%H&zYtYO9ZVojcdibQj9g~hZ?2E1FA=hkDfdZX2ZT~ywAKR+&O ztol;FKiGOfmuf{Wq%)KCnj$ZP}eynOXDsC*_mAF@he$(uswT~6?`HN$dy`)WX8%bbj^{J9opT$gb zb9Vz%?zU=9!@)Kkcb%HJ`j}{VH&U?9mGSZG#?VgfG9?VC{}%Hr@x(YQ<7gfs5}ESXFJ80iN# z(v2J*aiv4p3V<@RNC=tEP@f4RgO3* z_sW_g!TV!5dk+hI-y&qS;m7jlOBc2l#U4spr9CpLm>p6f4)&Uw6#*a7h>Q5u}^F zx^+B2QagSRKO}_;p9_DCGH^;P(St@{`#_~_tlZIXVBq7@FYjvc%oIwj_71`m(r-ER zwMkh5wRR7%+AHBAk?P!jd%(G`Af`)uXdb!@#qHydLs$|aDMRrSDYYj!li1l8^pi?E zP?HcN{p4V`1ZSfQ%D%jx(#*|}H3Jvz*>EWk1I-)ZQ;4VvC;@-R4qLta5W zR(()aNj(`<^Vo zLc(V<$NO6M{D=j7yq&QF$XI&Rk-AjaA{Z|K5-B3ipL6}Vh7Kf-pxvv8qe#9i9bvcT z{;V=OMptbgpOq2)V8fTDbU!BTQ z!^`=ZYMc&weVtBUMCf!BT(h0C?BaD0 zM6@S?$TYm^_8a_#HT#eY!t$>&@a`_yNlE~E1G z)PWG|sea$F!);aUoukUYOVI519Th?qS z^jc!WN`Tzl2+kT6di7@s7MDkLzS{EOTJ1BqDkx0>a zl&>Psw3o2W4Vhe%R>Y-pa?Awg_B}m`BW}FS@MWLkticMo*)gI`>gvVYqt@geJV}6Hz@3G~JG0Rppf#Ug52?8o2s~ z+y(VuhxCU8gv16Ll7`oWOd{YFB^h&1m`zC^WRwo3A@?v9<0WMn(yRNIgz$y> zN2G-8A*;?3OAMijOwb#cNvT#7x`u0* zK=M>C+Ah6oI??soscZhiXm@0vketYXP50DDQ1jh-9{V}qp<)C;CdiPIbURB`M{EMC z-=$-?#m7tAloeIgoS0^bSZfdALm^i`HC}TIH1NIyo|^7DnZV4#?t2f}=KW_J&M zl{4KbG*t*`qHTJm>vJAFtQn_uTDEgH&*0ai6hBnMlwJ_$eOX#M9XfZLa$S#dgqt#w zV}$`A5344{K}$VQIok;nhbPHEL0OQ(XLr5SL7buct<0;nyg)JbZ*7`vZ|@jkMgP zV@z!#NgKk%iiy5+dal?NTV6g~|Gqym^1XlW>l4b}`jeZv+qNaHIU$>e`fi|_g{_&O z5{wyjUx;sCWK8l%FZUqW8{4)IAR*a{G`ZT6i7gYa`X#&Z=2pBH&4T36;Z(~ty(?+IHsKdzy*<*>$2i}pSrXG@@_d`j zD{XCa^=2|U80S6e5dPUL+y6iP%&2OJFhuml_^?mE!<_a^Tz6RU#q4@<{2GXk{T%(}*FylXm6 zmvwgJX2MwgLvhKSX#C`rv{M8kx)7QX%MyA1d9K@Zx=;i#m1jKTqdk|!IzQoJS!(u5 zLD<)yUASJ6{F47N@VHAqS$*U?a*oouiwg;s>8qzpq0nG~1-Zt&?jwnzOP~L?AaDqgn2u*{mG6q$`Z%g2w2(75tJ342fZ9`nK^|)f_ z+t`kPGThkNb=RbFY5iG_tJxF{YAceM{OK+le`=a0Q=+dRqZ#;tuSMruoPQ4Fr_-jJ z{Y!+gZw_trN=CuKDEAhY*vmU60}&iapMJa>XGKx{l$3+J87`PZ8QE zzY;KpdK)ix_D++jif@xBIDcO+SsbFUjWjG79(jCYN=LE}ioQo^<=WhS^p0CO2x~d_o40h^u3G_=Kv)R`XL2tX?=nK)0v6Ta1dQQ@V zhLL0mk*{!foVan}uPiuiHy#9te3VgG5xs9nmL8Jm2E!+$?wx?-NU`_+uz1peB16cv z`cXPHqAf9%KTWHC@xO@10nPvgyux@_!P%F!Bbo!3o9-zZQ?DdnIB-|BO;&dLF}+uE z%BXwF3AJ5a{p)Z}cF&NrE*rTyDdMV^J5?W;kLiGz#4dte=RS*b4aGZoIpO2)`Ka#Z z-lz-XqQZAggt#&n4K?Tbku_Co-&DL|eu#Qeoni$Cpo{6RdY+VPdMgCp=(OF1AgKE= zK8?c)sOrG`YEnXX>aX!SX&P3?+f{*EIh;BufH%wiO$-nid(*EbX8K^gFjD{FPoZkl z_i^9u`YNCK1lYl3#JO*|c%X!Dozxg4N#fp*ez4hbSE9zl6+dm*d}PhJQPF&P37p${ zFh%UEoBYMqiy>$)5 zO$Ya;x{+;}IFP%3L}`K)yiB6pCWIlg0#Q^P)o0%5_2;2C3|E7iZE1!5gD)Bp_3P=P zqAmFbW$q9|XK*0l`Fbj4$hho(7-sKiuVg8+V`txAW?zu z+MZ5(&nHq_K0Q(0H6S?^q0(jr8=g@QaG+hk75}?u6HZ3NTXG&E0#s6@MRV`I28!fu zUwWEc5j@lLLHzOA{)qH)70*88BYh^Xk^TD(r{CsGdjH+ z`;iqoU~BwrPk{Ms0+Zgt?6s9-DlK zB23WAq^%2$wZcGYMs}W@M1aJ0`P=NUkPwC$iEA@ZXgU0m_IUX>LrFZ}^M`K_Oipp2 zq%!ts?Om{W9Ee~sOrvfD!``08dj~>*q*RX!FU)hb$jMC~PvrlamRX^n<7cgqXzDZ5 zj}e&q=D=$?-m$3b-n4Av!-iflWrPBs-d!~17UZA7RKTbqBgdfZrUQ5OZg{*#94ef& z?sgwaaT4`O521BKBBbZ0#SvMTpmP4EX%)m_GI~0yeX0K!Z>mX1 zcfbAmgh~GONv-SoT+#J`sgfxyp&56ffQ=@Y6!!4Oy6sL z@^XsDYxHZVl<}Bp1tV{PtzKEYd&Qh$r%Jd99yGZt;s<~%1D{0z0+ueUrTQ(TkOxc3vNqxammk7j> zO5tywEaf1WS{@BT6XVlKLoK*TMvS5#O_4|>}uMEkijT4hpZsP@OtHo z-}mg44>;pfJRJxMaJex0Z|7aEY3Tq?2qmaLCd-(_T3%InPoER*SN+2JG~Q`}yNRBQ z3>`&mK0)xc6Y)s$hrpk(dvs7X+&M@Cq3gA^xJ}%&jHuR9HX%O!8b|vc(3t_{oUPL1 z0Kw(CF1Mmn;%C8oXJWYvUXflQ?b%57()FVlT^vEMoqb(fZM@eW}YY9sPliqxlcl=^=tRLZ!K0 z`#G+gaQGvS%EA-^%R@QsWviX~`nHGg&30o|kOQp*NPD)PkMZ}o%qNR{Ly&{&sWOIa z$<|=2$iWfr%wB$VCr38E1CX`xI81V)FYb7Av9MDf3628t z(?f2d`gN#dy9+v9iEF0NxFNbp2KMBN%ikcgLU_ z_jmtcAj1432UcPf+pmG(THK1eyA%yYibH|mT8g_% zarfd-9E!U`ai>Ue*Wm8%Cw-px{pNgU=1l%fCYkKL_S$>h_wTwEhbeWu2Ibc+0>-vs z@V>wbKt8ib`emvP5^rmB)69YV_s5~{9ltz&wcH+phDT=I_LX;b(lG4ib*(oP*)#;p zmztf1ajNuLg}o#{oT>+;5rp?;pH;~5XHq~@eZeE(M>prA{Ebaki316Zi>`_Hpb zs_I1}(%B4btM;LhT$Wlu=;wVIUO0vw3Bu}yMH_+x`vqJu1UppUMxMKIPDetSkL zH~_*KF(yt$S4#mn%*p>UC*tiq1MF(D+%>33Tn%xl2{pzn0H%#^U?)`@B_EC$)@*8~ zUi7^!5-wy#=ygN}DSBBm!r`Vr>#}M`Z zCgCC22-^+bm!wUz!N~HgAp$)W2xOm2#Lj_rq3pK7N`M(Csa^_-WMYSn4uhizN%Ol* z_ebs6#_7)jRsq=tK6QlvJ5HQDI{i^+{q_iu+WTEX4!grlAZ0E{2nK@a`DA~mESJv+ zA2%+)j}@+hCxy-!lqYD$bomBQf^l35P{q~U#l&=fRfP6II)=@s_=pi?LQZK!?!*o0 zhX1Wdt>=^Q$Ii$7H55QPmSO*3e;^zANFVxP#0Z?c#X0V_p8W$dPa zWxzU=r#JK}thOTIg!u>Ld-e$+ye0W29EV43xY$tFm90dnA(6EB_q+?~dzWZDJajO=%Ki!?>A3N4 zNaDFF2#3I*RMO{h86$(6A@|OQtKsw7QK(cO-(L9hA5dz50@b!7Ia)ojpSa&-51+Zc zVh(0I*0rL0@I3Ih!^3E<*d(qwxj1*MB5AlefO)@%Y64~+3<1^61nHtrndXdXe`8jl zF2f9$;_(YyF}wcLn({v#c4N;knTx#usTxIVZm556bNP)X?yYr{L(+?>L2b z8Fa!%mnLRu3xdDpkQd~wCYSsq(gxW6@Ia!8u#bEHg%A68 zBlnl<5x95@l*grON+86S@JOZb*H&@NSs#&$(}tO3G$Zbx?)XoSYd~hp$lO3?Wxy?2 za+pphM)TgOQKk{~eYTzJlImtMM4!><@YCoAS&nmZK&QbaF3WiZt{@$pukWKL`=>Jj zEw~qwt-O1oL~r!8=d>>fttLQ&1QSMG zQf{Efg z#tW(H*m$uCdFEam1$;Ix0H39J(ZD=@c~@~J5>CMGZ+y=}Ot$L_cikUd^u-^~T*5e5 zz?Xg){TBA+5xCs?(>mR9`!VgRN8^7V4~nN~#Lw$#LylyNDI}ZaP=BiQr2n=rmjx`2 zUuY;#{@cF%-!6mamY5mM+jUK$X~QK2UOp}96hwE-K=UlMAR|h6g$aU-*ytMc`{$x5 zLI8!aKdE`X@TWbgMd;{uJzy3WNgtsJK7&|g)d#jw3Gt%>(J6=n#(aQPyo{iB-OF0u z(saZHb<&Mc%8P!&YpK-{a$@Q#5(d@`D5w6b0r$g4>ex4vEK#PK^ zu_gY)7;8Qd##b@F4*l>~bFu!9=3-=mG31z!jK%#z1=c7T5csknFmGbgd|uS0@ayjg zcHGRr2o*eQ|5q@f)cC&Ue9t<;ns8;{uIDE{(V2$0yDU%g2_4=%wWdSDpJ?%^e&TC@ z%vImkxjRN$&g&KnaZ0d?fsX&`m&AiHAeoheHL(d<6T;GK;FkX9Mg=%W?>`qlpEjE*4T#3vju3c(4bbaNGgH#)Wg7RB-!EUk?Ks zB_;I|ZzNE}vC7?0+DIoMIera5HDUF^fP19Pk;(K({@2^EYT)tRlDTQUDw^$&lKkL1 z?@ycQ#{Jm$@a09^^|}Jh9+ zq6q5ng`5-jTCg+o5WZi6@aP!0$P2|2Em9lhQUios?!g$t@#-VC{3$8u@50BWZ%QbQ z`9*qX3y|Nosr2rnTE`4WLxSz?4Hnc_q6utw)417hZlzDECloKpbsxr z&8@dT(_qsOZxItv)x7(yP?!ZRg_1rA<_8mjIl5Z?_5Gjp-ecr{+EykPrY=GC^6LQi zfFtRRGfC)|t!@K=X(s?i{?jmj3!U<^mz zsYNP7#7fTC0kmnGQsnwb&xr17ITS^t=m1A!+R6ZXNIr5V)_n1|p&2*@=!stmw+0`D z=b6_{2lV_f1}$ZbGeQ3J{`bWo)F6y1?mkNz#>_n4xP~Cu07&;f0OoKOT{!k(SpS`g z0AwHz1;h(SUTH&8mW-wFQ{7?UUl1=tf&+h=c?SQ0L7dCRDx{9V&)YJ z4A}H0Uq3{$J9Icam_aBd zKq2FVVJcicwAk0BKViU{7X8<+lu+`^RTO%pf8tJFPPx)90_$I|()>?-UYve=jt_G(mNV7E5e$0(B_NT1e^5&5mWS#gJ0R8zzzJe^XQ0c2SCa zv#f~wU4qR1g|ym~`qcO3kmw8zcS*#Z|6~{HI|JB!jV&3l z5P38Vgz;&6<>< z9Q>doQ{9zH>00unjCXz0BHYQdxNp#J=tJL(w}J=?OfwFJyT1{KA9?G)PpEiL{Gq1tirjrt|S(*%fQ`}G_zm9s!FIG`v*-r0|M7jW8v|Cip18D z+!&pHC!p<=@^(Zx!4Rcv8-9Q-Q<`H}T?B)#;5+ zT%}g>ztf)6*vjW@9du~}kx7t02bZzmv}1ndN<{5WNQ+oQ-MVLlKMMZr`X`PXbW-=Ee(KKb0gqUg}C*8Jk0<+r&A{2r5gOvwE5dB3?o&~v* zh|Q#_o3G-j6@NXm{>v`vtfsZ7&)dS?msq^WQ`e=pJw-~?km$( zH7)^ClC82fs(Q(BhUZp>OyupzNsyEpdd@RR^euD;YQ1Raz6@Bd0G<_E7OQl<9+}_G1J;2S7&!MqiyDHiR3K8qTcNOc7%(H zI|s~F=`s+{m0$d1Y7(Iw?j}GI?Xvp|;;(%DT+SucgK@3{kD!#>#@M~C9cbEiM<5MC zi?VyIMXl_I@{XgM6J>zJ02oD&@3XxcT|!WGct5VKU;C8S>W8p-Qmk2Dv~2I~_S#tJ z1&p{=#a^WtkSkUBN>%Fhv->56WP)SpjFGD8&XEl3t1;2cUn&sLVH^(wfPetHD;QJj zbIhqHm~m)r^lxP9?dV_`s-Hj~;vZVE;KXDb` z?Bbhr+9;Ch7(MbffEkuXohX9O1xvmYj`7^%OdQhRi`O(n?1aT<<3cBIsvvRhKRe5f z1|yIh{^vH4iEW<;R8>xFoi?W4BlHATkidvv+F-E&q#0xDT=cwZL|W*m{<~gXb>}`U zd9MIr$%?SUnoEw<>N2c+#p*}-f>X(}fp7>}9|^&VG{A3u#U6~?Wo{%wlmWAX_RMzf zNG?pG)@1>tV|PB+GW-T60ITPOaK+|0nnI`F23)Y${gNgoz{bU`4~BcN8M?Qi%A?>g z^n-9D2#^4WZ2UoS4v%cEc&;Teqf~&L`rX;O!J1yXHtE|gvE+#F)9oqC_{JZP_o!jd zv*00g80KDUPkds?_l>67VIhEf0<9`ZRkcVlcJnt^ZZupP zCLo+&gi!uy*`fN-ywr_6J}!zuBdNmDns(`)q3V`TM}+R|w$-ZEIpW5a@@Za}_S3wO z_Fn_S#YDw$$E8@=kmcV16f7V&a%JvbeX(lT=knziOKBU`T}@>1l0gVl3BltK)i~hX zeEQS&FuX>W?ob?)#_OlY9`;Ms~W@6QKoX3PL+nrjU0Em_8TwAYOag7cLVQNXdqR&978Pt#L_YJmj`j?G z%fuFjhJRbZ_`73C0~Oi~m!&+E{m;!ehrU|>KKG3lLOPvN=KSTmZ?mb-q!<;h=CR=g zaB_hM%HdYTQR}kzLqf0+fg|sTy~cTp<#c=E)_}Zt7l!tuhc)9E~@?3(vhGy)j$xn zE8%`?ha}W~dHkv1G+rJxB*c!&CHU;t%$Q#9QQOwMVe+HXs^jpg^ig9tW;640dF)p= zZ~N;hi&Ev@p)@n-_i&sk@3?dlf^IsQ70;O3`eviWB$3y4uEXl%+j0b}3!j`zC zz9-wH^NsLm{-}01(Uuh5jpobmCS^C$GaPPqxO{BCV;q;(*HS9H;k@ndK7o0=s^OgRwg5m&oK7LtjnmYn)NB(fRH``ahk)Gg*+HNIHDcWFD;$g>THQ_ zrtxrh|0_@F{;xd6`0(pxT}J#BZ0=XYtQp7$vpg~0^^2p6exZg4ij1G_F$^S$Ak%DC zQad`LTUA|~u7Y+Gq#yllOjzTTfLDHwS!dTUms*Z(zFIMJdla1n=j8TXh_y`QWx}- z{VBHfR6C;hE4LV4E!z%wzACUvs=S=9>{KJsFnu=gwk;2<(x;fHb=pznH3;QF`z$Bx}R)hX)wf;npW!E#q~Y^g-2F!_*5I(4NF9d#Tmr+*&`AOlDRbc%H;R45{_B8eUI zws+4GuS4D0U^tnmI}IIv{xToDU$}|844LHekI@uX;PN}@07}r>$$VI>U3<9Wdrm<3 z1rdy6G*pqnSam}(i4@TN)?YKr!}EhI#$Ppyu1_E4aO^_6RmyXq;h3|(d@L2oSLs-@ zV9_;u&D-!qR(wkWk;wCfM8V255?BTJyPECfmA)tiw+fb$2m0Qt<3EQ^SV_@{fJdrWRQQnQ;l&E zucs$SP=08VvMM<5NArWXi*=YDJ5OR9Rgna(LW18GGK2>HB6$8j$3%<*6Ix&LB@3u% zZ0$0U718#R%k%C*t4kO?@S-b;(B|iAe-8(+(9}jY@D~j}Oefqc@-s#?(ggaJ?N0RPxMJ=6CBBw{3QCKCbITR z)o3*YO}w5FRPNy_$oR4IHjbXBlnOiYZxW2cmaeqm*Y2=*O7dDi)oHN4T-n(hGGSuVAleYYzN_+v z!bV=KH5~5@f{tCcev)F<^odjJt{-&zGXTfqCiyaA0>PC79&#I$`VYfIFfBYOp{^nP zD7-KYs;zY(`G_iBHY0Ha@38R^sm8aD)myTQNiz|V_`GfOcNO1&B5Rj5@+;h*)z9=< zDwrD7nK<>kMF@!==k}TYVufa`ALK5)&2Pk$-s>h^bS)v6Jcnq2GWv%al;#u?`F7(y ze+E3@rwJDoss+G>%RT$$j=^7MIbc9cyd<|ZX4V!&WPAWYCv2(&-DSJKAqIxH2e9=&{tMXE zf)-K;l_wwTKOa6_r&6I_0SVz?z?XLX3TZiZ=Ni)l7b=*s3d;=*Ho1xf?VV)MSs}{} z1~`Q8?J!j(9%-!RbPRUy{9tmOX0j5ySuZa^&vX;?%r$D|^=-sIm5}+lGv1YmJc3fq z)AMU&Jf%$I72j^uW@kRLbNKd)=i4ufkGZJYUU~Lp$eDYGSbY5VXX3NSF|?Zf9QbA2 z`=2S=8V+oR9%)SMR_*-y6}yQ2vHcJLAJ&~kW2Xtch#Plfx5wc{V7#ED-LQ)I z-~nuK!#59<^FMNAODUNbgs_6ix7Dy6?7-~cAHY_PfVB`CAl;~x|E=tV)dlUj2N>0` zQB7Jui8`EmAE|)oKjc) zFVx&@)`m)D=;v$@85IeY(cW@aOc83!Syvps7rh#F?icF!FNsV?fo27|TV^W8MDPY* zEW0fv7ED&O+Z0ZGEchsoZ+r^&s7QNkB^I7uip&H5f;u^vMpZw>#G+uibDATIcqu6- zA+2N0bFsiYUVF}SDsnwqZs-_Tsem(}J^i^gxTH&tBk=R{M=E0pAbwWYtzi?*tcFh2 zM}$BA0DqxRg8sRFcM3#kz5dbuy?)uyTKdSxfr+Kk^P|TH)1Y_hyS`)PT9^AfDF{uy zyS;Z1(Ta0}kkcQY%VC?Qp+c7hsmGe*4Ug{QDxZ@0M|qk=_K{`r-gOT zo>@o0K(A4sm&c)YGGATUPyZ8ZxQ~$yeYs5#yE$S4xX`;Q3S)eeU2*G%yL`n~l16WI z*t0DqX>m(Y()R{cB7|@%3lHad$jqJbWyA~-KOlcHUbWw)9*~|NE{z>z6=RcbzS;=2 zi~-WwK_4Vl1IVP&{5J|WTk?FcsC;M=Ug#O6)&Dw1zJuVkC;CNqhL zO_{aWHlHK0i{O1=H~YgIid+8tM}<y&gTdBkM%V{_f z@Sz6SGP`OBg=_$r+t-4VV5gK4|hltTCSe>4)b#>ApVp zxl=15{B(o*fPV&mmUAwV5)lcR(Wv*h?+ddngFtK>l|(7%@^J5X7g+PMN-fQ=3vm6`4r88%3jA%cSN(E^IBk`Na+533)wv)`<_7gs5@z{_du8* z?-y8oE9hz(m${>3edajW(3foSwvyg$uw)rp_$wbY zWPW$79xAZYosua=&kx|XiyT~a1oNl)NG+XqMR_LFX*;+;{v$+ z2j~AZs+(rms+%sT;e4Cg4XLIvK4Vjn8xN7lkCFe&JpvCc{v~s1@~h*gIfty5ei(;|(zW`Sf~v1n2XnXjMzw-;~uk_K|@u0dagZwr)dqrTe;Q}otyn8%YX-x<&D{h$^<%d@W)CT`acM_ojM)2SJ?BUMW+TY>QtK zj+7(?otSw4=-j0yP^(_y1KCg6K6}usn|f7;a!_tMP)%hKUNlmxk!E(i{%UB z4r|g!P5R5AP6CN6!TC#crQa`+4wO%bZ^I*g17)L|)IYICi&h`{J3>sfYFXLHX7UnE5327Nu*)*u|0@gijjLO6p4nw&J>sfbh@p}&5~9`Aj#OI$*zc) zB*D^KUwr1+107LuceA*>rnixy+5njQp);aIUFaV*IU1&@o5QGHuYw{{5>#GMTj$X6 zvw-p8C40ARP;xl{oh?PB?)H#Ti{y?)gG>c!+$y^9sK6^z%GSn->^!fXL|Pmy4pz=_ zp`e1!Y3jD&AviecvXjt7$Uw+|dyj;w=$-hCrEK|+A{mnM;qg1U84fFshE=y_U5OI3 zT5O*6@K*}fz!18(G7<=^ZZ~foT@Vn5)8Nd`PG@`5c;lokkkofN(EXJld*mC{n;J&0 z@G)K1W*g$|*e{hA5<$pqaWWZ@FCX3SchePx#@Ne%4A!{lLEJ|yNYs+quEihC#X>^4sugvW%eBMNI%4Qr!jV}vzNW=qqLHPgOpZ-v~QhfZOD2T z&c(}3rAN5k>eYH2BG}bC`BHSHb;Q}>Y%H?Qi4C#w21fO)o7^0<*G9tTpBHq68xAd) zR(`3Q%@P{eyf;@;^7^$QcVyQQTDhA_nB1zp8eYXIqKw`8n%^v4$BSpmJCH(@s4iJC z6O6*9UN)?*wSkhZm!oK@>CM3cq`vG*}ae-w@Zs=0-4Cv zR~A*2f}P7&6*A|YbCN#2was6UxPXrXXYc=DJF9gx?;K0laMXG%)&y*g)kmPPbl?5C zvR9OCD!uGZDF(XH!=Uv>=y2X7b-vak*V`6-Ty87{hgNAz!p1zOGqxS`7R*(Icm57` z+EO|)lI{JN(=LYd_9L3sUI_snW-=&!r5ynkp##1&{otL9LzX^M?n9BNuC&C(p`de9 zt=^K+?7=-@xV`TuU0!$y#NVn%JrwG*El%d{Q-0*_{N9&}^x*3wi5PmGsoHm4uO8>lkDjZhX5ebe1=jM{ylRfAj>C`Tlvb?3^eMI948 z5hp#l5vn?ikjllXu8A$lw-m^(LcFqhl}lD~+dU-c;W+T2*Vba?UV(p%pd5RQiO`Z1 zKrEg@m_O9crcBW)cTJswTsFK3+wZq?{;dWo-FYjI8%TB1zO<)jf95 zSnz%ozjQyXwfsxj{*$IY>D7UXFu1Wp8i9hFn5QvN9H95D3_MR(GV$1;-q9uEt#+^h8axYV zM_21!_fhdL{KHc4bH6ZDZBg`l3H`j>cV6)v`Q9V#z;vwcpk?c3Q%9+R(!L-1Jv~4X zj&qq9=MX${Oe1o9!fG6(qruQQgzQ&Q(Ca`QNEW^RBq!q3R}1%boxRU^!uOU`b7oJ| z0)}O|xGScW0TiO)s)LLkcms_>1+ZBv;nXCX8E|1lEDL7n)*x+4gk`e5k;U~oWW{~H zwgK6XmLy|!--8jVios~mepDC~d%TC)38ko;vegh6-EzmZs^YMn4t{k<_jl7VCz{v@uAO9p;$ z@jKJBS_Y0ml`Z0M$QR>`!gp%j1|3a>lo7{D5-6^R1;e)O^cN!YB`a`A)5JTP2AChc zf8cFJ51c>Fm)4szz493R^Q%IJcir1xqPK?&q!;@7L^c8Mo%+q?=qKkz>5-Hk->n=`ci`zv>~@ zANVz3Cq>er!0Saa#Gki>b@{)jtulsag2JzYgpLOoljlz+Q{HbZ~`w?|z ztXM>S`B!skCf073v%TSocs@(A`4mLh`VbsZ>Z|8AlvU*Wd)|O9!oo}4M|DBhec!6@ z#233fqmgqvKincz^?#=zH*ab3v>$JZMCy%3G8UYF3 z!K;`WnkCv}O+XcAoX2!(`g~f41^Cb?1lWaUE8^nyDToUKAUXAP2Yw zLCT3ILy+rTL$c$Sf!dac8c$Uz2y$}lUfFb0l^dJd%x{B`F`Z`v2n3_>1$ z4XTAPh`>qumNOcX>lvQEgHc;jwNDYgC*7o(Hk{;OMx7au_-kJLm@-}|_pTU-H0Iij zE9;curX8(=w$?W(Ppn`({Lf7x{=@PTu&heMEY(C{E5oRXd#JvjQ8J9^Rzb$U_0roZ2``osfPfC`6f|Ts03~+4R+MS6-p;sv}UE5>#{?~zW zfsN=@1z9xh^-DR4&!NY9YM0_S&2OB=0Wbx8xyUT{atu~f^hd76+6TA7hN0R8Go>aQ z?$$Msz26K}5aNM=I9+aF{j6l1#0UUS5;RM}}wnp*@0&)bT>-t8OK7mG-8`hsnnTj28%a zPVF@1(s}dX5~5YeHAd(vmmsgRa;fR^q-P;+oGBr*|PcS@}tys4XIruX$5|pyG}V>0g1K(TcobF$Tbzl zV{EyJBoo3TtYB}H+dsD(XAecbmy`g;i^XG)f;r!?vzC5?Ou5DlR9M*SU3=5jK0BC1@c3eB zP{d0U{QeC8xF_A}RFHX)Q^&&iVZ1mDLly>m(*db-UT{9H7P|+5f76k{{Ic5><9FUb zC~i2jrLux~1P286fAg$t@O-n3jSu!`HY3MiX3`p~F8Z^KQ4o#b3bh3AnxBp6lRF=b zSB>+FWX^QNqwH{!+66X?EV-xs%oL<*oJfEkKX&Cz|2s?<`g1?;eTU|H71YMwnvC&SKPzh6ChW^6(d4^Yk};k= z9PU(uN`4xha;z_L_E|r;gQERc&s)?-m5P2XXevejqK&|1zzf$z9ddwN*uSOVwHKo| zTM#P+zH6kejn+YJa9o&<^*CEUiFB>|5&L6y33t(w6H~WIy7JcN!#8wmR^pFPc7LN# zPfHyQr^HO4lp%-Ac3J~a>p3mUHW4=ixFrYuxBgSoNRHG#tV=S-7ELJtK!?dFQCvwh zY6kLFA$!{^549=H^LAvmhX?dx>~JSG0}TqmqYrAHea7hk!@x@)wmEsj+z`c{g&kd5 z?NTys;$_Y*NtY{LaYF#thQzUKUWJ;uE@=6)(iTvxLSXi@{84)(&IZ=R!NJ`}XAkFJ zO%fpz2B^hr=PkS;R@AhBsut2{E>2UW_DA^4lZ)DN{wKPjAZR0UJ_2xEn1Oy9G&8&a zjN$_vrWuqjc9&#`yEcr}n6Laiu^PEp9x=qqK%Y?W-o-Ob0-|-VpwDnlYEHPvG z`_PqbW^0sazb)(Hsy3Bw8qAe!j++(-_-h=wmTZ16Qp;x|9cl<+kli~ibssK_;6xeg zWbKDZ7`H_|4w-Kd%Bs4qh(mOs<$&9Ga}GlU^Z-2x&mF}XZBx#AJ8%R8;{3Zrp{#Y( zC>l1(Q1RcHlmP9Js!%U7_utQ)6P!Jgrv39-F`xBx>Az6C8i^yx7ARun&Q~vmsDYs zh$WwSJtnM3x+jA3Ddc@4t>`Ws78HQLG~X5VdpQYyKSxytO3Vj7EbIr$6{^7BiQJ$1 zQ7V9D2(2kD7doc4$~NG!QLObzq1Ed0CNAp29?dxVLT3ef{(h4)3n zWF51Qfvim8tB)0Z-ej`&YhT01{n$Bi>7s>(6Tl9{`+>v2nIS#(=V5rErU|TSa<-n(hGG;fqC#jEZC6Up6uOsAwP+Es3s_kfdqZ6|@d0`09y`U%FT`<4PTF;^T)8l)AdLycUOX`~pax$Mq2E7_&xwl{jo%ps@l(LN3Z?r=9HoZyYm8x?|F!?PcilLtG`!FWB z8lj}43%M1MJ;pX-lln@kh2>G`+@ghbe%eTk1h1f6!`?z?!KwokABZr|pbKw+MH>M! zl|?y@@2VzR#D-G(leG`_c;Xd}yhWkjV3uIaV6ve-d8yi@C|4^!0_f|BaNawp@cXS# z3>Q@U{vzz^kwLEN7`apyL;Ny<5#zpytm;6|e+>Jd<-zZNmj`XS6!q>i8^_uOusJ}S zwfh{#g(D!yb!c7f!I(z2!l|{M>B@a)8Xqvs)ux}M-=1OpnHpVkn*A5)na|5in90bDs_1zO`pBvGQ>jtv2pKY5p4M_>wNUWP+@Ew%b-8>}QgW${PGd2b zU9%XE_1x%i*A^)vN;qtpdu5z`g8W^tNpz5oXnCPibWr-&7K|9)3#kZLrV@=gM8*QE zWHvW7wr*I0dnAho(?8G_jdC4gVc#ZWijcC$qoTVIpt3hT&ja`h_a)OaOfhA${N3VQ zM8Ota87h-Bg*G(>l@rb*m7*F+r>nY2-@T?ISoh~tafPqqkdKE+`behoqLJ$%8m^vB zA`Cc?Ie@LE8aC(M1ZOTyJ>1ssPgSK;*mueWFRp#OW+>MbBP?xR)r>-Sj#eZg+WbYs z9Gw97&^eWZX%5h8A)?e2KwC|L=mSoP-|r8#*U}XAqgO@>=7=ak>GfxG3YlIHJ99n+ zdPX$_5n|{47Sn3!W0@7(F2wtiE4II;@l*bJlsb z&KGFz;l~+)DLSU?t$PAP@^=jvi+R#fQsPF$5sx{2Mhl`;UNs!m`4Tq^%aSAYj={cT z9T!rwjdJ)d*mKY;z8k@Zr~ZK1%V3mf98h~UDoH8)?QzN2!P=^9s|S^V&t|+ihF6)N zv=ueyDn<$qmaTWq<2#FJiNYr^zqlj}`f(A=s%tl*`Ule#QMW4Ou?!-S7$qeXyP`>2?=PsQORZd%o%pF3QLu_| z&0zlcYA$a-qb@8%{t5izV`>;2Ju!YYfX@++b@3wxQNGV04pI$GfaCd&RaFVZKWcCz ze8LU7oYOh1!#7Z4Tk&$5V^4&f&0CSLKOhgEqH!w@s)5gjY=nru`NK=N(hS=@3D6 zf2v#_>8=$#7c&3BzA9o96B~4q`m1z5{OXilIy+JyvKQ4?{&< z^%Hi=biK<_DnwX7YF)6{u0%H5puu*8@;#2N?HyNkX4gsnK0lL8J`dJ~dY7}$b#EjO z){oP`pFV3!afUR}kWD{Fn3-a1W!NR*A%7aoqqyNjn@(LWou3Pu8%y3wQL~nk#JZoA zntWl~YHy7}R(z365_Yd+6gDv^;4KIB_jZZ*Ru zEeA_ao+y?0)!f%n)?knt+t1I3U^E0p1|idIel@%bL9?99Hi|q@o!2WmyflGD|K;-4hpe%*9x$bv#;sHPu6?Dc1$a%Fc+(KD_yrHwdzlSfrEFZ#?{K8E%z=Ji}XXy?(MU$Mgo};=b z7fmCqs-H04r)?P;6Qa@^~QTGd*J ztnjAzQY6m|m+j`owdHkT3zf2q0bK~?SqfOoz+n_mbY_xp=c!U2E{Es$DOYlwZdsU` z^h+a}!H0dcb7$c#Uh#&>fS=&3fom`rfr5epLdi&oso5v^gdL-xB2Y47@+b2|vS3K+ z2JNUM0J>@O|J+}Gk7N%dBZ%hyLR(-R155^;t+R8x?*rPy?fOm=dsI@JxVS1ljF5f>>as zpy;6c{TPxZd!}edH7}mVpzP@X7GFy3HG1(6uFH$1aeEV3REas#2;VjgK7CiWTl4jm z3}G-HETyabC3P{aWE=X&-->^?xIxHwTA_5FBDC0rNkjXyLFYw?z;P7UjE8tgv8eA0 zNTGLEy=uiJWeNIf@y_cKiC3~r1fg&QvL&FJs4kw4)UkTG=*h4e86_`&AVR%~NjI6V zraG&zo)mi1(GqU@rh{%Iqi0T7GW}|xbbVvrw{l`Ebl5StC4e?R`RpY0vWsJ^v^z$k z12g!Rw#%^@<_QUm43wkX;ZmZVR;9?Z??_jNkrh~)M!q@M%`^`T#7OGi=&JH7kj}s9 zo_i}Y)oQ?q|d(OP&%OC!3 z+39ohcyy>v9v?uo$73=Znfo5q6yOhlj(h$J=5w|pwO_eepgSMKdsrN@ zJ^_trv0sJSpealYG>9}zw=``vO2dx2!DVYFM)w!?9%sh*3@(4S*0Hv5#I_?F6*|`m z{CmN&&wUwTt|{+39NcBh96p7br?toB-y?r0cH(O1M0+|ucB?fKIWmuC$0dR-lP3IV zox(6QS2QB6;iFAyo}`JPc6xM7;v4rUuA26mmE}GA%o^Z})8+InLzBAeW13_(qMDWa zi-m-|WFEv^c8HyN-5zWFy})D=gf4lE02Kc}w7vCP6hPYsy34}SDc#Zy(j_e2ozftU zG$_rkG!l{mQqo8xB_J%Vv~;s{2`(UwaMt&IzjOYA^Ap#_wL1(m_fz+C&&+(WGRvbI zGo7^ur4iefzl`+fj2;n^gKM8+vjLJ60Z=e)Pz4hcb~!73A8C%k_+V4EL4K})9IM?6 z@7;+s0g5-@JR%&g!vP>DJ(N7`wWt=Rv{!IZ0t0}c&ExIw>lp+1tOuqq<4I7{sTINn z5iQ(uD=WDgfoqwUNh)V^6$fdJwR2-iw|uXt(1cVOB}{Q|`zq!i}nm z6BRT41ad?@I78ITBvVhUQZJN_VmveyF+|_-#^e6H?r{Hw`-agAjA+(Wf)N5~?Z1AX zA|(iDGA{82h#pNi$ku%=fNlUX`evb=+oCVSnLR{H%5D-dqc<*MFxEvf#6Lc#J`ndD zCQx~6WJqAjyfCgBS|R?)F0o#_{Qi0rz#DI+M*6PE#AwnE$zO;suv{gd=;IO9-A~|) z13e%72(1H*Gk-t}`yoIoO=YuwPxSXyT!rSX9_R4(+VmYj2Thw5O|NkwmBn5j=MUM2 zjQ_q%nw=Sobd46yND#O&Fi|medmyBK(2P07{+pH4yV>M153=0~rIcyBupf_~5Kb^U zC@N;#upwIg&`GWzI#H*7PLG=g->-0aP zN?m(?(EXg${kJ!_OABJ5Mh-?=wn|K^hg!yZ@3RLfr}0sX-EwUOlO4;{kAk&P6^hbh z8$VU6eG%IMq-RZ-!K7pGWyVQfdOBdw4(cS}SQNE4XJ8x@G>`nq*KH+O$d8ro5>Pcu zbWm(j%N&1m8o{SUiai$DhGMKxW%dwUfHW`Jjm7Sn;{nmeF`gZ3#+H?!4cE)?`8MM~CF22d{$#Uw>8g>aDPV!}g(m0E zNvg;z)+xWZyE0d+8oF0SPQjtJ(TMKQd@QdC^7z2S$t9cU8gxEcI^s9)61}}*K%T%% zO8)~6@2G#XAOia&z>Z%_Z|Ym6`xfz5Kr5Wz;qf*pFUe6KAKQF`xnJyD9iN-a6$Qk zlN6=i^^YUd`c)K}?h3C>Q!3W9<4&`IH7|;&`^;;m$Y$+&iSI!zZRuES6RhtP`@0G7 zuR50Mx;|-=URtNj6lo1Yq11bW(jrJc{nS z!5^u8TceeoZ?^y@JJTVdWRt{gSO^9yDPo6CIU1{QS8}CZ2CLGU6&oms!m|<8Q7iq|QN#alM=dzFmV+T$QU~rTD#6w~Xn0TA92%@BJ&Eh{z&`P}i1Ib9BH6;Sz_=2VS2H*PgdwJAN zBq+NQ(?6Wq%p+rQJ=}>(Jx2Wu+HFf;U-|MZoe?IM0DhS_cpe>Hu7U#=nsr zGV#qiX~^vDJu+5pZ?$DLcm=b(*ecFr^zP z4W6W(-uZS;?>5hnJoK5l=axK^(}?=ycfMB`e(>{02SQNoJKpDYTtXQ62l_St zrmQ4B-9~!kmTvxcyv=k&^J+^UQ(;_yQ0hM&q$E4mEOtDvLj@KY@GbKTYs7E(2>>&p z71jWeWSRSFHm=MQV`=AH9hc?T)UrF#%F{3s2rzJJzBy0eGEC3uXWv5$SO<>8|j6%3-e_(0KgiN00I8yyt-RS-8 z20w~XDcWfWXX=G?;(5V1)=TaNKR#7&zw=5^S7Y0;Gn8SC1Fs}VzfAr9VVq~~Ti#q{ z;`@BKx|3KbpKW2ZAmd%n%;b}TyVcz?`$VWO>=~r7_w<+nqJr46$310Szu|aE0X5J` z+vG|1yx9XbZTq3^qP^h8c(E+#lJy^l-3!sOw|T$n!bN(IC;s9SYmtZ-+NAiRy#8n_ z&DmAUNTD5R-5 zEi2Af_1}L8M9HZA8?^b4-VJ^_u`WCO)4t}s67<8RDJbC%XDuNu z0hM605kq(TFsexN=vkc0c(3?D5m)Wm-^%Zvmr)P%TO8+1A3~CcQuv>!O$B+H+vh|? z;p%DkKEe6u;MP6wUoS0o+D_jp>1QE%WS3_(PZ6iE+O0Wzpz_VJK(l*3H^<>)STTKo z5LaiCVkFEI&+8qa)oEO$L9m^+U_*bdhVLL(&!TV8Zw^r7~A{wpn3;5`U$@)q8cAI$FcJFNgZ0h@&|`4Ex#O2RpF z*V_814zR>jvaF5k*NT6=RM?=$69!(t_-szCXhO_Ka}B;GXd`h3N@G_8TR=?i69X5t z%+O@$BjBF&5@^E>KgbD$%&85M#Z|vlq-Oa~U=?_e4Hgf0VgfK^83eTg;)ccT5s)rS zxGerhJX(MNU#1uQfwKPL)u{IUa|O0-2zDm*u3LFOjL}~LWLWeQuRZq|3 z5_WC0hSJ-|?9>WD2Z|JW71FprNS@|@;Tr|I{vjwmQi775JM+itxCOxn1DsPVvgj>3 zY!@nl0p7&Gl>?m?*&n;UbH9U4#b&PJOVIx3zHJ!^z<=7($o2&#M|ObU$`An!jQ1&Eso{7u)~uGeqDJ8%VN7k!s`* ztqe>CZM|8h3+yUt?x+9n{DkoKy*X!rhILx1e(F6(R_x0K_UD1C4_P}0(Sw>C*#9$~ zNSLrd;ZUg|8Ft;UTJy+{7Uso}$`-MW`?DLT-gGta|HfmWM9fWwLi3IrZ>Sulpm*|k z&0Cw^IgEM+g^77tTeN?hGY?C0??$OQ;_NeRr$?E1AWlC}1gk(82Q zXZE$63mKkxW&5KHe=d*2<^6vRKNVKGf03;`5!|EW6;YvBB1RH!YcEdpFaS425HYXm z@RNbL_+zLt>OIe4xC!FrZ&;aLqb+#yf;O_z>`O^{lwA{J!u~6FK>b^c26zdI1GK7I zpDM2jE+>h1NBk~CJE{0#DJl{@pm*S=+EUT!)GiLJ0p=pop zhcNUOG*44ENN(+TYkWa9@P^Ee)PIPK%!T)25f8GjKYlAELtko_|$sad5OIWq-Z9+lfx*()2;k!vD09 zATvKHh-vmy@Sa0~-Rywmx9a2_2e&+{D-koc!Sug*~g9`0K6pmq#!p+NCqd>JLeOA`h5QX>9M1X+0KTK!~$4Sq*zZ7rajCr*W~clJDbSN)Rk55^xbzM*|-pw ziPYLw^ajVlV?*u zY*AM5oflkvXI3Wab5x?{76r4ghsX#`418g8CkJoZGu9Z;c((Bn`^75jgn{~_>xYDQU*EGWI4Y`Ahye@?ld_f6b7 zfp-Vm4*WNq3Bn=@nrHse00A*`&ex;^-Co@jocq^*v6?5uKVUy@!3}L>3rUgY zT@Vbdt?F&Mk`Afyrb-qm>}=0xIBld43<+LcK@s~|)uqGpU%3COX8>!RM$IB%7p34i z)yR8*WNkNkoZ@DjII0lir38*Q73*^G5fwscLptEp61QUcF!uT{=7dX8aaq<+- z2cHFC`VEeu1p&iwkHRMOemF<^-(7mso^!XMVLSpYFn)n`v!~pz`R{`P^T1_jIm{2c z&U-Z}?BKI--$i}5#}rkH5RkrnQwofb_|zzZU)cMV>RN1)`Wh2bs(3C2diV<)gnpcn zXQ^xD2j;~%oP~tH?00|rhzC)m{EiMvIZ4)RDmBZSOWcYf=@HcXsN5W%7)zimS@vcP z$-g*sQ;z`2ja(v;?m2-nK%ZHzh%%G!=-1*E&DF7|;|jP?83w;#N+pB9=^-nj&A-UA z`*92zFVcrMkrW^Xw1cV6N>y46=NoMLG0;Rr=0}8DIg_{S;q-CEk9hRo-d5b(cDVKY zHaNd;$^rC`t=`Z*qw}jaVurEcxRjx$VN2WoFQeaz$(V*Bfd!O^=Dm)Rqn;xbl{qOK zk-iY~T^jI?o=qo8voIQ6%s}5{v*JNJV#HqqBn0B3Bq(Z-XNV{yFL$aJa?VFu+C!bH zyiniB%d9woADRR;s2FX+&<0#9Q>iT>Ai~-$eWz?Gf>N8Z%GW|Fx#nJ!OnV)45DO5^ zcwfl$F?xSvX2XQ0n|jm3$Ah!Qb&R|_@Z|jP08*+v041r$D@5~%uf)m<6H1)!9;dR6 zDTvZ|m!6r{tb!6$u2X(@P-2?;T9F8PLxZ{g?0!i~KN#_V>1-S6yEp>7S44!`5F@c5 zLLJun>l|4)Dqo3D@E%QV$dEz;WNoyQK5Wt324BFFMVY>35cHo0MEZweYGV2Y zS8T81@_+(5B_JDtcNkf~dR`6G?VIKD&xpLY-AUlDy9soE#|5eB!ZoS;PZ(kyv!DMG6bEPvC#^aSO}pTE zG1|+_nd5mu?XTq_BbdnjM#6gLF_*XFv2N(Ozc*7*#vGrNnzq!hI&v#+>Ghn5x<4>1 zz6{~%cx4Q&y>IOD^iF>yl=Bk@<+#4KSK}j93@#I1ZIXed9pIg^(!2{inuJ}B7PWW5 zl9KS4nvYpx--MFQZv!^Rm5X)&m{s-=As4}lh>(;>iYX6x1YliLBH$4pfyhtrs^0_! zQA0`-k9QQV*dQbR$bHN`)oTslU)??PLXY1}*Lj->FK?bCC~jYw+r-m}t&5j^bENvf zn0ma0(AcnxCc}No$(8G^@8TlN*}%~aTGD%yFbttJ97F=apMNn*Hw5o06^Hbq6d8-&0f>Jz`^yub0v@&r|<8d@b^lk=#DD+V0ML(n==Ee`_vLcWfgTB(Ayq+tK z+6$JV`6Y`vt{AoJ-DT?wDNDe7czMGWPEhs7SQ>I6QHa*pa~cfSGJpL}D86b}Wcp)R zo~|rhYe0`%(9ny6Hr;=%##qzg@mHbKcol~W2C_+S6Bp@AWPyRqT|skxYE9}>mLb$7 zVNeUKDAa54QI}Gb#u0e@I35v5z1!?Q93=D}EK7#EY!U;a1D(h&hDyNcAnnT$TuPC^ zN2>2-z=^6g*YkS5x|&N$zIB|ju18y1je!x&Hww_QzxMDR3947hGUfZQlv54p9kA>8 z1Ya7+Qmn}Mv3dVgFzD4r#2F4<{VJbwz`J8HGU}Z3XX~X1N=I zUjYwCuWQEScq0H@JwiYNc{5>8wsJ#B4#RO&|Hn(hfrIHadJAT>IN`2K*8Eq_U%`@5 z>ib4;Y=|t>fV#85B`}DNh!}j93X~B)*K+)%FrA?7FLb};CX@aszs(W~2Yomqn`6c9 zYG469U&xAJU2j3z&t*kbWdu`Pb}{Ad>>u#!A*iZUt5x~R^Yu3-gYC?Crq7C89(t@tZ89sRd#_D z13X!+q@{j$#l3VBZlZ036GE_%*NaPlMAd_I@yMhKpf3pcltWK(fN}DpM}u{xqXkLP_Ch zvKav0V7S77*E3{iQsjv5JuPG>CZ2G;e@v!voga-Sxwq9fG^{#S`tMizzd5c~i59X{ zp9&074-dT-OLAk)&@q}Mg6=~Kb9~UzWI>&AH(vC(uh6otSQxEQr!9jP%a3#^8HU*=e2I3Uby1-9zHUUR}*&nAEb*R4Pvlf448$FG3$ zOh4L;3=OEe^2#Hkd}qspS-X7xM40vnM=>qU8|enw`_w@kfW42UO8_zkNRC-t-+{_# zlb|Owbp`~tznITQF)z_Mw%-oJ_}p;s>p)H8x}2N-waI#%hj>VQ%b}kR42yl`_93u-8DgBd6?rDsnv48$EmJ&@Lm$6 z1Cq>Fw~~48IZ2m7YYUyXnTz+2un&0mOYu9W@}?EU6Mn44oYKhRZigb;&q7fy{q@K< z8m8qAI@x?>t{INt+o3jxih>zqasi4(QbuZvQPL)4Tf^|$5e}vvau>tF}mB>FBd>CsO z*Oy$W-|&zxNRK7tH2N+9<$}&VpNwoljGGLgrnSi;W5A@m5Eao6JW#_4p^lkDPWE$7 zT^wStPb{qXS4$Yyo805QzPje)@Ws~yKPU!12abp)NIy(vTS$KOLgVkmkK zzP3V*0lXv%fD~#tL^#c+>EwJ@U$B`tkx3%+C7#ze;Cj*Aj%kNmknatT`X7l*&HRwv z?D$lQh=)FoJ#`xyI7Y99Jx}Tj@RUytdl1M~eWA@yweeU(Wx0glU&$p6`XSBnb$olO+G(}(!M38W}2m4Ph;khbdXdH#dR3JW!(BJ;c z8@{vI=-;Fo7^p(%y#pT08N@20#rFyK@D4zhuC!9z%1bV|(`6NP#QSl;dFu=D5>?g1 z-;}y1@Ma}zU`Vm(9qO6y?71=Pw6lozir#^0rvDXG^g@U$nt75YlWzaRiMP*B5cIR+m_udgGqxr=WhO6e7!1Q&jEeN(l<- zo9o5wRLufT3#PFv|g3MedS-rn0&b?cqd=VaB0z>^x#4}LD6OM_H;`6P* zAMTT1k2@F~hL*=t1D-4$E8zi>r~blFO0?hoL|qIO&UzHv07Iu z6AdXh<@!en&^p2=Dib9U4jped+uh%mn%6h`RnYW0q20%9Qo&7aXa#_Xf(VCqlhi-a zQI98FB@$I`;KefO_3;A^x=_2M=m6JIdW(Bx`0j+g;yB3Ku-hj zJpX2|cC7;9t#X)z{0IiwI~`azRCAceP`fHJ_7Tr?KGssptQz-+pBibLy=j{CzYQJ1 zOJ|w9R*grW$NU2%K(_*jW2B~&&V8;sY+X_k@n}tUZ63+yGHrR`ZuP7tV64*{z7Tyx zuIWt0v${eY#ekoSMw@S_lp=&b_~~g1;Rxzrnk1@#R@_rb!a+gt;o1A|g;ZK7b;*oH zq<^aEG||1-J$G6u7ZHachAxLIFx?E_tSb8W(&+fI%P_ct~D%S6Aiu+{L?A zot7ky8+9)pV(lVQ))-eNP__l9#gm&%8C=xh9?yu>QVM^36@`v{e#f_ z4uwxBou|I)2$5m+2z~+sf+$A&-QwRD0~FK>E0SE*3);==duNbykD(JNS{-_YZc}0_l1I%XmG$_&<2DD#$RmOF zI6~O`AHraYlpJb|4K67HW1|~PXc(VgPahkVM|egG{_M`fLFa=5PcVLRz$69p{8Y9}qsyCtrPJO7dQOhlVt#M6oO7{3D`Y^g#@jUiXVeubRijZ%5=&ps_J2Cxa3`=j2}ePPj%zkLp$Mj(C5LHPgiPUT z^l?zt@nyUCOvS3qYJ=jLWWR6u@T+y@pn8w)wqA%Jo}thzt3m942Vsn%RJGTFy8Fa_ zd84}8dG`#a9kW91+O)d1imV(E`u-K)MnZd3!9w(2BoKRPBRwV7tHq>u%||}zTwXEd z`@3n5ynj@20i{4WYny|J))?wMds1M5d7g#PPrIQlw7lDuYU-BN5$%&q!K$rWC;y|f zV((M0+$RP!jmk{2e5wagD08~*gEWbdgecVU#qzGV$hn)hiW{~E8cA5$ReDJi@PJ39 z>4+YPok1+zD;95;{m$J|q@c2Z-}dhpEq=$>oU-DJTtuumDe#bd4JRnY{I?mDC=a9R zkyPUSoPVUX#zcdyn>t7A0d~e)<#bxtVhzkhbw#m-pStREk=y~Vw}s)4_xpG(T&!`9 z@Bj2de?Tn6qO;}hQ6r(aHE|FtcGG&3YJW%~UWU8gNLkmD9N7mLV%JEhQgM>{8AxD6 zt?;%jRbP%1h0bGKhfTTbH(-)Qu&=5`vucs1fQ^-J7)Me5A2m{J9p`lUf25xdl>iyE zVq)a1=4keeilI{JNx?Fhb<+)bYK_1JOw)v^10T|g6J5WaR}Nqd_}_jiTZYj?n1&+@ z@Y5U5b72)?%K2B8?d<>h7!V$C5jTmcsoI9$;Ba=q=bI<=JeI9C_oj-ggbBbFvCY<$}tv6GWhs@>y^~1)Lg;y!?1h71~wsm(&Nj*rjakMQYrOF{uD;1 z#kx6go)NTbQK~&8##dl$4Z8L`7_GcGIY&5K8GA?1JTYRwJn1~$Y|4=G~AmT9IV0t~4l zjOZU@ED2Aj$V9TKV}GlRFIrdbbs4#yg=8r%anCjc{*m?(zM^_RA?y1{t4@g8D7Y+` ziHoGCQ9r6qaOVD$Fw@iQ+16b>iQWTtPUB+tt|EW7)a!YV1?A?|qh5%B;hNvW6=80i zj^0gg06&rfN*bpYuKE7{>i0D*I!=$9EXM^^HQw_jt_xlnVcvnmZhS75&$0VcbO z12`(g1)y`YRw%wY{o0zR+a*z0t$>{6^51l>iLNpFXa$;?oAssP|9E+FVA|IMJP@_X zW)9D&_JDZ{WgJE|6IY3HT--60I`W%*UgxtNQJ^A?V_J}O_FuprR{A)oJ|>T^F~>FA zAw-%eSV~^&&26-K76%+kOwqAS>-rD3j2MR7%$r`R`c8@#d@vL+24szM1juNqM+W1r z+WkCiA8W4|kHN=oT0JUAbQ5t7Wm}TKQoE7hiVoMHvR(IkY_jeUC(V?Rie9ZN+n_O~ zeO_-a-Wl>uUltNoq?uJZ!ZaS6yLQE8Ckw|;@az5G zSkrnMvue@8ifuv*L%pY^@J7O;2Q8zv}Bf;z?)!Tb@WmFbf0Yv%#$eYc9>se7jt%y57#6qLH+sxoV+U%S^ zZcDWMj_>4T4D=j$B`t2FF>u=V24~1(#-#GLx$oiA%hNr3{N8D5twT=#fem%u0T$dS z1BRi?x0Q~-F2pq-EqnLP7?gwLCN!+{%|HJ}4N4)6n^C`zcmt^7Ykg%JIo4pMtHFkE z-s&)xJE6xq=gmBe=wg{?$H9_?w}GbqExDh=ls&%C*xP$gOej6*(!7)!@}up* zv{cz5DT-2;OFNu86IZ(^wxkzo%A#+pbB0PBP}$l)gHQkH8;_n5>;BQCf^1rLO1IDZRG6JKPM5L& zIqyvTX>!#-w{(Z?@@;7`eCr!Zh`Q_tE<$lfo|Kd1*j&U#ssVkK>HjnrKZGDky`FLH zY;e7=i}|ngy|_Nc)i95=RvV#$P4(R9-$7%hw~sOC2C#ti*wo=(!QWdD!+o1}+Cz(s zCosi(YeIuu7aZ@E2OSZi?47+e^2Tl@5wp~!$#}&n4Ap;#`j4cHr0I=nuDd8NNzy0o zagq=n^8U?XBiGqcz2)JS+B;GOz6`7olTYef)sj|xn>>8Y_Rp829 zZM-8|FyRX~sx%1hTk-j?C%+qYBlz}R+j~EBaZ%MJ1GUsxASye!Axq;`AQewB$uny8et(3EAW&K)auH=Hhw4x|sn>zdkQy~SOPsYDtFmqQZ=(4eET1L_n5N3I{I_iZJ zR?5<8j{Zv6 zro69AtnN z5#O&rY1btZG_22ITKl&2qamlv5nhJM61dk)mujMDSk;}o2c{?nkl$;nmT*0Z;g0_D0aSt9}gmH{W$;AxrePdGG;PuxcrvC7JX{k zP8HwBbuT-})a13?!M&!lf<#O_mw4Q_fDm;N=)23?}XJ+>)sd%Tqldut=G)(v@CzSQ~LSU zh&o7#UUxDkpOU!UX&=pB)=P5zRcZpwMo$m+sFKA@B{HeQU z#BB*n#}^61NiNN{Yw4C0D&1~5{iTf)onO?ORnn{(AO6+od**3XJrhx|;W_y@#o4bF zg<8!2`5g$Kpa5lJ(tNsS7e@OFF9Z5cvAX=4-O%vvrTT4(=GPnjg*YBtLAW*2UZ>k) za8sz1q4FKYJ2Ub8(V#?J~Lsw zp>JpzZu^1i$DZ5_-y{*T>!;Y9k7v1!&4!hM_L6r4|EWK!%<`+5PDz7c1~0VQsGaGc z2DMh0Yv}jsX?oWq09kTLAR_U@XNYw(y`YCDL-!^n-%(RMLud$!GnN>)nry=PyL#JK zz`S9F_6zM5;VX1;nz&_sRIgA2tf|y{oc;b6LaQ+o^ahQVaTg#2yMZKj6*%_oPF11v zD5h+z%T)sGu;-2KBfQ228!s{*({u3M&l>SP#FV9X9&zK;p_cfaxR1JpnDCygh>Z34 ze#nd*-4|@4Arjh>cwPp^9}RGA=n2Ec5;qhEX?I}c`qQ55RH&KHuqxaB8xTTxO$cAE zqk;#>Z2$2&jYAr^ECUhE=NP)h3_<(ds$oJz8Y!x!S3GxOHi7~)h;(pG@&NRPExu5- zR?zF0hx$*uDU8fami|tHYo2j+HRBW;r`)_C0`Fu{@>wBodGB!rNTyA|=f$oZfgeMV z=>s_3$T?k%_Td@y%S7y%<^5stIa(<7^BeMO^Z={{OjE27eCJQkCJkwo4?%(3Q|ebF z5C?r0St<^-LUY<*&27*5zbe0thgV7Jq47CBe1c=*)a$%Nup=-c`7sF4uFrb65&<&r zM(@bvOw?LG7jHNzMARfIx{lM-a--^tgfh)bwfepLrI(?tA^Y;&t)hPAN@tujsr=hUaRb z{HMm70QVd6-)ig3_`h{1@5vIj=4PJF8?>o4x^v3e#(8ZTzgZia1$AtF641>SzxKFi zUdj_#zce`{;vjwA8o^m9sy$;-dLoPO+kKp2)=2Jaq>*vB%zVF2|NC)MU60L5+ma?# z-JUDH|C#c@F4QNNxSJqs4NH3iW1TLGU@`{+8#g|tIf#xuLK_8F6zXa`f+l+}g{(`$ z(7mdK;FYjSNax#;VtFr#ir-xFr-3<7spbjpu@yUXB{#(RG@?c(%sc_*IoCf`x^`&o zXYBK3yZ%l#`bl_U!z=N4gZrkZ2#^~ssE1bC{E2tJ7WuSJ?NCnqWwQAiir1Qx1Ii*) zNDQZgL;e^XmE&@O5UA+8De8pJLAb^3?xKaAaB+(DyQF=R1URPdH zx|76SF&>Ipg+EeOA#y%g>3`lmL{EY%neJ&B{(7;+-$|hXD_Xusjf<4_ow^L>=-q6! z*iK7UR9rU~NQ}0|P)zzc{k3N0AgvxF4H9R>Qq0Bs8bimM@34gAnHv?f++0Xz^(lX{ zNqj+J8OP7TRML0ayi)4|X(@Rrm0wc4OOCtgPHbDknOC|&yO4eb696r37wYCvWuRu? zpG4rW2OJX~f_P?w4+s9Gf}W8IkS(BVf;<448wek6ILuWTDUGD4$0bUpeaW(E9+*v> zw7mleVHTjeCcP%J`OA)0)+CQ`hYqm;gq`#^f-n&fWm>fBMHREOcp$GdrWt*7Oa$j$ zClv=~)1P_zw%c49z4*=)PcCfQ1PN1XoF?EJ=m8+^u83=FjXE$7hWm%tnH)jXhtCy1Ycw8GcWa_|9 zS;c!>6qZwbYII2q<&MFhU(ELz&i8p51m|B>F8yUFsH#<2D_{CUT}bV}z^_}kNDxd; zI@d*#@jS;TN*|(+N86)EcqWo>%zjLK8Gh5DuX2fZH#BB=IC9kcpz|1W!%^`ehMDk@ z*&eUJ=R}@Wn3~>eBGa+~LrrvuR@bzD5#Yz?hTK(fr-a9xeSmUOJVj!`V{R_t7J#7q z3xP-M6Emp%nKnQM{Tg1528Z41K=sj@z<+GM!yp>G0piZ91iGgPngioPAulo_4RNn# zF_J{V`;<<1Z)oUWek5-_A(D2I7Ew4yRp^DdrxM3-#-YWgMXwJvY_Dyx6z{q`H8r;R zeu7-bO91nMG-ZgZQAa%uQm)1HpRM~83hCmI0?R?%&<{`#2oU~K`l{10AdEx0V0#aQ zU;sqz`Gk*{T(Fy28q((jU!w<%c|r5B5-_yU&;WHbK02Q^pV1&BCeNs)bq=8ud>P6u zoMg5PiknV0UiWHMrlf(#x6EzopL95WX_eOVXMA3Dmf|2TucRN6t-hrFqg6O`I`MfE zJTt^>W*wL?k^Tc-g~!6kid{11tWPkmB#s+Nz9uczTti(xops=MYrkro*el_LxY%C- zA;FP)3D!xpE4;L_0B^H49SkzUFb~N$rTX)}=_4@OAwTz+XmK7ljg5krh&49!pHBHamwp54B0Q<(Lsk^W(-t~-qCt76h?t=AU4?W^BRYo%LR|>c1>KIFZVboX-Irzmo~!a%Qfgz zsu23*@s0#7KpMA1AwZ^=1iJQx!tdv~KoMSV>0UIf(5Lm0G1Ngc&vK=WiX%?SVZp2< ztvvA$k+$rEW1l{kVFhH?ebJI^KCY5q|8xz1zl?^qeB?-$-CoelES`PHY2HSg^4rc* z`6HJ(HMet#5rD9?zeH2?cYXoWx7`KP7+nsf&zu;MK;TfpUXF zqRkcjfoaFTnMl}cEhOZxR=N6uNS#D_Zk~R+;uq?t6LQKjx$+~16Fo2SCJ76TLnH;z z3WZURxVeHt>chdhqqtVx8+=xtZ11*WHGD9!nCyh=It~$e&&lFyamho-~7=n2+GXv54Wr; z3KMJ5PsZR6irOvOBLHQ`wxPp`FJuwm@Lx9M3wQgjF-=>x> z`>CSjHtPzn*5?-6bHRm#ap-3eYA3W-4^N8|SxXa<#K=xZh^((^ZI^OqEwf`_r*Jhf zSCBf_^(}p3zMx9-R4*LXz7C?qLlDqJD*5r+j(6fb9tJvzuh8jiGkbUD>bxY}k&|w4 zf!X}65;GzXxt$hxE(VwWl~YeL-Npw_Y~I+S^A7fTjIGHIEHV_Ga?i(D^ zkM%A0APU*|_l`HcvV?tKK?p_)tsDdbsEpPs=DSs2`fJ5b5wH1gXSM{?Wdo}IiKNsa z{`e+233}JCaaEP<__ecB!pqh6Z=2=k>UWbvNwf5A%ew2c2N%?etI* z90k;%-DB#UjMTrOz?&-F=m~lTKFh>Eom=Exft*AiG*>T~8lgx>b0ldgiQHmSjeeX> zz{6pB2A07y#kwyB*GO%{Q6Nx9Y$Uf1b?)HP4kW+~Z3O1)&$2??@<`HlJ6IxUllq6K zcl7ZMw6|x62SEmAbfozcQ4m3bDLUL=pN905-JXn~6gq0m!)S0f3_&*4>3$X$(8A<+ z<>`jf4w%{G9>?Urx~RfjNdvB+9onFVxmnNTzuz)p7?Vreo0!Y1QQzA%N!HFoSYslL z>q+~VH}n@AxoAl98Mv&|gW%=>71{iE6M#_dH?V>o7h4%FER`dyHZhY%>Sjts}Oxx8cE68{a%e}l7pSGhCNuY)=Hnu%|pyu(3?7} zjl2eQQRDrU7ANOOE}KX#6Gg)b=Jch6S+Tx<&Ynu3%pG%oUhudr%0oP2qIed>BR zQ%NS~C3obK>c%Nn&zvK-RMW)Fn)Tp$m-vth|~kZH_cj{5ZM z7^2;XB}2XnRe_{V7IO+R>Ue{c$sKy=OEaolvIkbp+-EKeR2?fJF%A_UHfTQVJp&5W zH*!9&>sjo;OkfFGHYR^6^A7eD8(H{U&2d8{O$=?|lc$_q&sU8Pe9!BQs*FwKV3Suc zNdy!$^Vz8C^C*U+`H)L!p;vrFFDE9>l`oMRKPXNnMck`JB&>nEuO>*w?=GNWkX-WnZP;QJ=m=G`QoK4=9SE{HN{CX z;HHC!QTA8y$Lm>@Gc^a@k-ept9nzv$Z43yBY;4`pp1fRHpzh7|Fh-{lILOBzcam6~ zK>+h~h`1~(G=##|3_l3CoqWdbMNm(QXeRcwESoB-6XN>v4LD4V%6XXJ=Zh4Ryw~m>nE`wPWvkXT=ui-w^P*=rK)&O8V%hv>|(Ok1{@d_)UouC5lfc znLaV;ipIKmCaSppe|G`MDW3dn_jjW&CTXBPDDTOW@mOh-dq=_V7&3=bPRwBj!&=a3 z;SCYoOJ4ZaC|NS}rTWOSD89c`nb5drq9+g3s|LVS;SE6^$$g9<#*CAMSfcjE0PX=e z+OzpffYh_DA>k2**)`ek#hkE>*z9zE4QwQw{kig0?|9dI9 z?5!zblyxO{{VLt751kBv_uQA+f;_)WyMu@vp%$Lt1rHf}e+CI?Hx>^dKXYeCc4cMjq zyWq9Jz2->ydIMYA4ecJAdUjyA2?sje##s)3lzzkNmkF7U-o@R<#>Vsb`1s3*{o>?& zsm)ksv+nz|k&y)9HozD2GJb;AI%B;B-lhqH?uvgHKV72?L29F2M^}_mNq+%!Y31YT z+QOeq-nwpDd$ppGwlko@KwqAE{{@^)%0pzO1BNB8=yRG9pl+(F6$5e!877Q_zRNl= zBQsHo<$K5Lz%^}91zk9HCs5a=knHVV++WB09=KT{KfFu73quqnU4925<)W}Q??QHw zpenDV_=q32(*6yjw}2gX=rErH7vy9FFgI}dC7JY#X9r^l4wP6L)T@QwMsD|~(w5ck zPUzD^Q6Re(EZ&#)q$DE?a+J*4(Q48a?NFE_-c46bO<5BTETO}24LsNLKwH(TIEvFOkW>i`MRBOr>(w@4v45KdaQ1?@k}odOVtq~*N?CH|`AM00?z zbQT0bv?0yX1QR=w0I`p^-`yf|YtbD++P062L+h}w;}O`=m43QEV}-NW%_%TpgK$?k zX9x4!;Ss+*m~bRFCKq3c1Xh@fSKUi~&kun{hK3dKBblGg z95f7TrUo);u-pwsa_$w}mzvc6UY_Z#D1W>%aheP1!Jx1}E8QUH!1YD-B7Ap8v*~un zKE8ps`yYkBX!SVetryqzULR~y!;--H?U1VI*xjhv{X~kYrT_5vyIzrBbM&4cO}4Z! zbo5Ucya}x0l<%o!T8^pk*tqM3=n6U)*%Y`v=5cf)*<=!~xsP9(^n|j=x2yh)vp7l_ zj-{H2c`X@9A;j-$AihshhM29A@2W!@U1c5Qs)#Y#B?wLJA+0$Iyq<80Qqol)P)Yyg z?!s}#c`QYR!KjFA&czuOtAvogWR{<|44gV80bGek%yfz&jsAL^{sv5@vn&tx78Qy! zZZWJQo-gGSgUX)f0@mns`ZERW5+$BIQ7!H@pi?F}z3oNShP?S^EbXt4m(btQ(lniz z*5*`qT9RR!7zKaaN;I)(!Rro5FwEG?4?a=rCn9BQ6VWv-*U_uF{Wd&2{1_oX_E-sN z97b<+EZA=*dPP-3a$MI(<5GnrNZtK^So#WvDBq{+T^5$^Zd|%cO1cq{?(UG5kY?$w zpM-=oh=hbR2upWJOD`$iDe?^Fd({f&W6^VV)l^0nfdIdUNll-&W|5De0xMz-DEc4KS80 z+Tix8uhQO7)*(hgv)te~QyT?fgdl@bDBh|tOQ^LZGD%57w zDl`Yf5324D4?#^;&xckv-2ttos?Le2;`TT*5AHX?@Q~T;H zKPg>AwmTGrIv-jzMZI&3e6`V|*ap}-fM5+S<>Gqk>Y@Y)BseVA!UepW4`*5oPeUp% z-ca*YM{4pJvZ9r5wsGn%ucDUkt|nFfUCjsKH`4YT68P)xw-0hxov^vt9gaX3gmQj0PPCZQ5Etzt8*E1q_gIa zhnUgMMk3bK&n?!}|DBZ%Bz`668{Cd?!UNO9bPYcddWHsmkWW3%wn#jqF*r`3366=C zefnmX#^FItac_KNlVkbU@BHuLK11Y31b+)oomr>+fP#*OZwa%pz(xuhM~gPk;XhAe zwBmz)3tw$nkX~+bnUs0txit9i8Nh+{<&0Pk7goWjCJP58=EFU$R*Lcv1~cUoiF3^Lz1@qv76D(~zKj4JO2M(;gI={c?BD|i7YMFQYMQRwAzqtoCP z)zv40G;gjEcmsWNRGD{qo}tFpK%#Cm4)qFAEbMYpvJ1lz7gboizh-Fq)fbJ}WoSLR z@))xn=)Hh5s_iD0Zl{ZBJc65&v|jJ?3e4z4J4Bnp1wV8d!zz8o{Zw0A_PJ5#);dc5 z=_&RM=ab|**lJl%ou2o;|6h*UTcT9x_atoJ0V2t~odZtjo0lLlheZMxm(o<(iH(M( z8qml$h``|MN?wb#2S=+@PA#cH{(C3eA_hIjr;q(3XI)$E+6I(n;S?9Y=M2!0P(lL) z&$_sT6Fr`JoU6jsxykJw+SLXiO0~iLPIbzeTdfm_>9q!fOP^W?VCN1z5_;N=g(?k$ zqqgREHGn&fe4GtU=Xas!)v1=81~PWXUpH?AD`vK<Zx+d2(}S%x)=}Dp zZo=CMaqx6F{OL@cn5uLuN!CiMg~6*)N`v2Fi1o!<>G7t&M`p@zIq z?SSYFF`pj4l6qe7MjNW6Ef>b=k(M;*DpUEL0PFWd z1#l2-QdFhX-SwsdG zU?v5D7qV%wb>el_oC4;0z15AR-3^MVbmaQ>eXHx%jApuC8WAPGsI`hh`TDU zU*4-d=R(LT&9gFwr@;8)w5%pshJ=Nwi+$QClE<_1rH%)6Ga<6g>KB^L*G3HJmtZI4 z9To#xmVEg8EuY!;o{T2!iX(IbFOeI`soVmM$Jc|(R!{DV!;ZBkM|0%H0}7R;eDQZH z@^k>e?*(in;m)tx)D-i zOi@55E8>$qk0hx=jaDPxOG1Iuzo=#?F5KLHKr7|K$ zEQVfKv4PXeBHg1Qru~7glz_{W-c!q&&fNPw?dr{EKZmS04=HEWZGNMIbB6`mvrFSB zZ52^xQ~>vl5x-EGf&w`)tjZpPmY?`*lq2$P1)dEPaNz~{K6cs7cQIa?MCer5a2|!D zvM)TB)3-0n?Kr~UDh`9}KJF{wBO|9mSmNR++VSf`A#YzZ@%nJY#@6-G6sNvwS`3I) zI8v~Fu8S{cp_7+q4O6z?|6)tJXnXkB<+j$|?iS5@IzBPhnI*n=`*%0v<7v=s(B)dt zUY_yVI?^c9`dqtje`e-_j!*bV|t8BiV2r+Nv+E_PSsT92rSc_&pU zmZLnuUl1oZ@zU=f8f*_`+O+-CZy1N%Bo~3GB`n)I)wgmMrRCoU(YpPdktUQ$)BD2A zdHXE2`}o(()6qA5Cuxz8MzWU}-?F=8Xksx3uE9ncv(bUhM*8Q{2&rq;UXYj7GeA_i z4LP`nq(j>vloz<7_rm9*Xfe^M<`Y`3rYhqA{utH6G|ns+zPEiZ0n z63#>KlnPAF=B`o`&(dXE7lT$>JSwBHDSbpaNcSOqx?AHfjCd?5f~H_(e=2{+;Qkx$ zpm>syKx175%N_lhNq>i#rPo844mcLYvD%@7!Mw_9oDtlKl@YU-vcU=9C;#u$e@c{5 z#bkTm(@h?}DMy6oGHq5jChwkI2Sc5QVHca#dx2%hVp%zj7)F`b)ftQME*^AeXtA!;6{$$putVwZJ%ZCpK1Fx<7>t6pBXr6w-7s^v{Dz z>x8c1k(&T46O`S8gnZDQz7sKi#vHBzYKh$Y_Z8F5 zm%3Wz$Mwv%K(5FuChausRQI{_B4ANPhpHfV7T%I(eIV*C`y-T)6lvcj;(bMl)$)5J zkfmRZOza)=L@Tw1CU|-TT8Y~G9cVAFU96_i_G-p;*k)F2L`vHd`hNZ9Lu#_UvHqCH z?ME+z;<}e$^?!u8gOTHU|J}>QX88F?T(y%#H_BOLQfTFCb^;P@Mh%ErG{Lz(vTkgx z@bIp=Ag01}WlZ)D26&q;gR9){#TivZP0@dPN>9Ku2_BplOvDhbfCgE@0`VvwDK3|aGh2MweO4{I zvw_hPuBw7s1+zz`(h6#Y1=nQ*&4XZxBz^&-6*?@^1-QW@MU0*@)wfM-QnUQG`mLtt zGNq{bNuteYhGdsTUlXK-GQ2C?m1Lwlb^UX^(yd-EQ;TadeRorz1e{}Kg! zbaFz60Vvmkl9Z7t2V{Y4i0Y|?hp2Z89k1%r)$T4k-Fs-sid0&upzx;ozVT>5k~_Tq zHv@M=TgG^bjEeo{SSH6c2R0poRD(3Y#UC_$!NKCMIzM0&D6}*5++XY-uD%j5_!1hM zzAnbzuOeAf&a!%jl3jS13Uw)EW(*h%~$c4YeckW8V+wW~bTM<#EB!Z!xqC!NRrTIBW zf1?GWYTPtZ-6JUTd6W2DOeuH4`LH;U`I#(mB!uJZ zO*57RSE3fev>^OkGL|qg=-+=`k)R@yh0Jg+pz2@L8g}^Rn!sH8@;pcz{`Eqt6110E z=fW@oOfMUiQZrykU<{Qdss`R%yjwXwyL`oO$%btTy@vV~+-Xd0!mz*TA(`A47Gbe~ z@Uf^w0lTfT2a3Us8r#Mld0e!5q%UvG1b$@9N6uvufuwO;H(3dCF+HlI>mi>$&@AAI z{^!XijM_7^f+6ZA`$dz*!b=wO*W+RhU_1;J8+AZFTl04Q_wLK1Q=nJ z%CDU?5*>eq#YU64=n+!e>!U%9SW+G=)jU+n8>3YE2jkB_Rvru%FjU=w!JvrfTf!_f z%8esirsy_o3)rX%e+J|ibY{WMHoCG;fz_m`GQkt6yFrEL*nWx-L9UM_LeHLO0Ri8y zG4lbsxASZ7IRVXRQiLpSNDWdNVF22MOaxND4x|OJAx<4$B(PH?!!sk5lb!0hwDz3X zGA&TAP$WD3B)I&V+R)(Ai;W;EDd}tsY$kwzzy=Zo1rAbJ^21eFl{6|-g(srds|Gd# z(fFB>*3SCgP84qR?!F$bmhx4%pxv;7W;ez06=3yQLd{=ZZ(i{ySsuxzSIej{>H9p1 zVsgWV{fmoXUq$XmISC!&=yq{kP^u^9Y$gomeD@ax!&LP2VbJtfvugLt~JJPGBM zST?wzW6e2hz(hbClPSIk@*n);0_s81ZQ9UD08VT$@}0DTUwMS=Ps|#M%al3qX>XVg}j0X!N`XhdLBzc zGyafNdd+7qDECtcAaGb5<1?EW+6x%ko0SiusxNpX*~n$_p_>4<0WqP>p*Vm@F>IW_ z6t~QO;8$w#5pbC7O_kD{H|+0!zh>X>*vnO}u31!i-C)TUKreO+a058=tc?6t@)dLE zkdlw^WPC;`X91a!lbs02f@i*VxTfaoI{d=AExD+(KTWN9$G2}?i+ zERT8u)3?bt&QiK4Vz+A|MZRDsxYdkSL%Pv3oRRe|M#RtpL=9jhBo9A#n}1XwxbPAn z%!N1|m>Enx`sGn0ft#a8@B1In`W@!zq&05@+fcO>H?%i7@caIoC#H#gS9yxgyTY;| zGH4=6zWxt?3%9$(&)y8O?~qsOnqH7v?Cv&Y2R*))4v?QJO|z^OME|gpNp(nic)e>g zsww>9fSY?K;&}A6Z?bXXqODFdmN{2LUYq${?o;R*>>JDw;1(!|^AS`72ny|n5x`jO zmw=55!iJh%e0bebHlsdrREnu$$7PpQHH=9`5gW6b#QgVjFFf0~*km!fe#E0*eMd>2e24+0hVqFTY_1HE4@+O0`F`)aY>OMA zjJ$)j@ewu%7`58kOe4gj!+%|<=0j8aG}!$l0*jtQC)mYOd|0L0yW>dDi{J~S{j96H z&Z>McV=foJPj%clBZg@_3KuW7k(wnN3kb2nkWfI1N;=S$9OvAswO)7&8DHdRPcycd z^b5%w?aSt-LQg69&lIaglR>S4dzgj57iE5=@~jcb04IQc z9jM0ZnAJS(2fJCv%oNY`8jf_uc=jzE+U4tb48i{E`n8R!W(==2M9YgY?3?Sr=+mTR zq{u@{o7iD<;atD-e{On49%CW%bg9d*K9bz69wCbgv&f+SkIhMLD>$53@!M)A$>h#1 zha-Mg6-w#}Z(f|u9jr9^{e^Q5+iVWB!CKt_;uFc=D8#+TNbcSPc2G}927t)gwB#ij zCIr)l`c3!+VnRj5I}Si<21$e5h@I19P$=Xo?iEmZ1T}uwn=Vy)eM1#%aZGGi6a6v{ zfUa^DKei^0u2tT=9mgb?4fmwK8>s{{0f=U1?tsBJV#4^JWNf?dr+6n=URjgJKuBM? zlEFGfUc8vk9;!%vXo@9&ofDMAdYe&I5OP)i{UFk53*DXmrquC9dt32yhBbORz=$R{ zu5W?8>Vs;YJQ-Hop=WANl*N0o2TEFL$HnvtQkx~ds>C30NoXT3H`ws0%J+Hty(W0> z5a|k-|D#LMD|m>SzepkwtuTJ=2}UcBXb<0PG1TKt`$27 z^xhWd2=BebJ9iT91>xTZU%#^@WF=t!EwDp7O|gL&8QV@B{EW_&uwZ+SK4?F{SsXYGosU4#JNH-0$?76=XXbnzq@OYqOM7&+z23tK5;r% zSBaqkS)^c77<93BTw-SWc+?dwf9{9ItAg+`YhTX8QmTIe9``3xqsda zDxh`;NQt0qwj!6kTz51UDV|t6bEV!G!!?7W+l zLO7#Xl z(yPfzAD_%6Fjw&c*4`F*R)=Xdq4#Q;P2yiK~>=!doq zG4pOW2FjWm1ij_OyGp5KWg#er4gNFAoUAYOIQB=Fk7%D?#$2fC%U>hPp-Ey>Ssrm< zS6@!U^Lct`uyWj8-5PcA8Efv4b$dUhvJlr)1DEeE~ePwbBym1{Iz3ZGgh+8sB zddfQIa}E7*yGlF?K9ku6tAAOB?cT>UUwN074GN*FkE8QU(X36fg>+Lmy~G$s8c?7J zRM8& z$ylIynP1bGjF#qI!pQKKLT}qe5sR^LwU6z8nP3%QBL4@Bq+)SrGxK91Q++*m`T8mq zV);FEU@lUsZ&t=rxNKB}Xf@Q2SK9_2`cu>zY>3`zuq_>FRU_Q3m^nS%hr;ss?R6d< zLKOoQn&@uBokUVq?=>4qXxi$h9lTBMQLlZAZ;0H#NsiT-r7LJQqc|_p;26qZ(T(ee zA7xDAPaBZ%IKXzZlyA7;`O;pyFhH}WCEs(;U9wgaCwCw+N8p(N6pHIhY}pNf3PIQX zTY|qI++o5zIgnfdQ+p$>@I0JT(}*v=68)VU{J*9YJ0$MDL^w?2JY7;JE^K#2zWId# z?W}$cGEiv)W25ueNVDGsv3~plxwz8_a3&zKun8;r~AxLnL8MP0h0nMi9#pDdr`{XY`1*8iP#s-w$zPP$=lpdZ^! zt#>0m8VJ|F0bdDIzMY46=%CFob|fcg$z;MiVZL*W;EV>Kv_*Cn=DHv2Rvo>Mn5b8nyB430L&>8)6(Wi*0ekcy`3KQ6&t2)af z7Ox&)>X*W6U11|Y#HY(I!dc1!ie*p0l|n6Kizszp0@35Vx9fk04i#2Dz{{!zRD0h( zr!jLfGY5aUHEBByFG087`l2M;!c`#<%nM{9FM z3+ya2eqMmL>{Zb}5D9Bz7* zPxwB1tgR(V2Kw8V<{jUyF#fvZ0{#O3FNA}I!lGfTFm@?(3m)h$7srczyH^4UN^gBg zI@*aK`Tc4Fdoun$c&AX{VR7aB0_%$O=E%Y{%hMdy)jmko&B56^8lt2ei@Y{DafaiR@BQaf$>#xP7v$C-j(hj-dQ_V_fS)ISB2b60<3Yi}rP>%dBcEtG>qJX1k^b?ePg;mCm9}!MT`$xXwsxz&w;ieRHfputw}gKMe*45E2=O%1Ia!Bes!w zwhua=-qlqY;^`QRRr)5E53NK_a92k=;XhmY4KXeBJ)nM zSRLLR@51a$C)$=5j6hPsWnw<2aDX7g`v;VGBr`4p?W9QrF z5X8=K#{H_Mu;)Zwt)?a!-eUbbuF12bsxtRG+e<_mSKoX~DMw9S2E(Z7Q{LbTOFOMs zp0n9wtTSsa-SR@vLWR}evMshzK^oMZA~7B9MkN^mw?ef(XF6h%I87G&*9C~TO}~_w zd>G1!W9FMRpI;w+o_5sjM8GY`cbGh+F=_d9Nbl@@eIy$>B^v5BuJ1_FuE|q0)}pd! zH*3&8^}pk3)hJnztR1%(a;^f}LU1dHt4SW`6*}gqKNdtqDEpIbj3l6T;fc_S2MBEn z{LJB7EoptW*HAcqGfhzEj=j6uKOq_qb|sMz%&fa%(P3~qB0^Uep^-0SGz#05mDVA->5l~dF1HUy9y8ZgSE|n8XZ9*dKBUJlL89Qf7*vz}@ z652ay&9htfZbIF7SQBHHr|+XL5RdKI3R)?Uv3RMsGCStvFJwEQ;`tKbs|5I3B^RW= zRmmzN)AFlg^c!=f4HSsLs+M`j3NX9|q1z&7lPYbl4vI1w(AbVgyXo(HsndlEsao2m z(e=AN&RnbrqrhYHLKxuy0ht1A|k(ZDAs!U+jF3@3yvkcK7YcCfQ8 zkjCoMW>BkFc?NSaA+u7f?j?A@z z2cnLJtE8ftUFhVri|Aqx# zHsJ_W8SRyovM(Um*lzU!45F}p1^fUk8NZ-f7#WZ)^ppl-ap3&DQY2RbfoLt6Ce8!q zxLaH>SJFaA{G2hEzH2pl#~{X9#d;NGGngUsyU9Pw*2Cbs)Y+6@eRDp^ug^$M5nj|@Tv4x*#*NS5>Cu*R{l!Xw;!shZCML2U zurX@)QTg5XCH8z+!l$iiPAR(#*xp;L1Z5r+F`uU1@J>toe%-PRy^+G#0Cu1UqGv&^bQ3srTghkUYt zjfZ>CkJ!@RRt#QD$~|EFtfjjv`i|8Mrz5nPp_lQ&7*yEqc9PLgc7O^wXarVlW@edo zDy)jqsneS1w$JVe8(Z)!f2jywg0_S`smBo~ zr3Du~<-z*{GTwku6B(aYS62r!p8gg+mgmz>;XsZl%ofZIJhbruwh@3n@EBvtW)Ec~ zmv4#;f#{;I)tsPk+67-`O#hAOLcI|_$j;#O*-x6#g<-kXihGCYwM8jY62Z{VOhhu- z$nz?~8gdaJ;pT$hUHZuPpUG6?}ZvVeZ~K($i~ zB=vIq(375=zQz~vg`$66#eFJvHkVWsoCqKlHOXPM6)kmj=%XWY@51In-&I|k9qR84 ziZ0!KpeRn`RiiHCWlL%E9QdK+)$eEqbnw|pu)cvzg4RG8Ky_dM(kB2Lc@Xfcm%_#= zz@GDkR2Wm^ToNR%*}nxaN+0{OhVg9X^VuU+N=GMF)qaFOmOeSh*E>Dbi;rhS7Cs^5 z&~Y=J_5HhVU(|cH+Mm~|zw26S36zod`ms=iL&p4G_`etS*x#@a1qhjBC}KuZqPM** zaZE$BIp_=EnSV9Iw_&loihN7G!2reRv)bT?ZvD&^8+hxbZ~~3Ke*q&Ta-adK<#(At zuH`Q{9H;|GlSr?7gV8#W-6uv*foeE5lL;0J2jm;fQYG%fhaLr3Jo|gyAz&%E%_uKa zM3DHo8yd%#;tCF#+|BXtz04i8 zhD-GQG_MTGrcD9zAFzh3-Z?jjwCH^PJbsAbEl67lU5D=$MU!4& zou2)>X?F}}iwlLlUJ7gu=6@-akGUi%hk*1utlBz10@xOp^oAu&Nkps}sKb$pQdW_qupMO4SeWO zv?i5j+>{@qAy48Ot|Er$ZzS?L=pZ3klP(Y?fBu`aKy%yar1}BjnOk)Kdv?fdE#r1p z$7~6_R~(U&D={(l$&K*j*RkTS#l-n#WaBzdYQespGpOBnCEQ%BwT6CeSEZ5V(Kc7$9hRh{! z5Dmy~5$U{@n8JZ^5@%?iiDFvZ)xfl2FHmzJl~oIQ45O13_0(Mhe{J*@RwebbmtS~N z*m`6>NvxHki5U08Yd$fvFa@!w&Majd{*5E#IuM~QBCS||(!NmQ`p-Bjxzw)NzhTT@ zn19e+Y$!7>3+D{#fhux0%^bM8ES-Q=86)bO$Pd4&#qD;A16oPc?+bs5Y}41X?ejD1 zny%aTESQ|@d+5E>@wmygDvizN{glc}i=h+tJ&;y4wY)g3TcQZ9YXhX3Kas1 z2~VR6ui^ZN9wjACFuvYZrz_ti1lzqi=zihS?P=xzwap^H-TH zhhTDoRrEBZ-K9SYprXUk+NbKXmR5t?b)cOC3l_1iZ!ImcND()arBvZ(GnV>~`s}M; zeL)GrQx{zir8@_1;)qxH`=6lS1Tjw<2D`#D0SVsX#KKVH^1Lb;2SGq@X51wC2KHlp zaZ>Y}N3~Nl`IWH8g?w|Y_vl~4vmtC6tABF8RJX4*y=gk4K(tqrk!SJR2V-0~{NCcwXAt)Cc#^aRU+K&EM!jumNamX`A zXOsf7IBXxCGyG^x$d_K9R%T2~8=|3>&v30$DV9*jI^%x5x$KjQ-4e$q1*WMDeU3W9wJ725z;3(TePZ53YrbG+ zU?>_sb4aE5ie&>u?6xN&-y%kmm9?$ABfmJgiO+`rI59{l%$|;hB{)l14nD~Y$>`I} zOdzmS-us}T3&EmnJrpFDm${{N4JsT~{ zUbf$+bW@{O z_&BHA&d_A+XrEMn|Hk!#yzl{6im}Jh(#xdCKWGGs<8rs1EHch~J@uXiG$Q50mm(gA ztY`18)>r@bCB@c!MK`iF?MTTKST(A4&^Z4aCiRJYX(&ok_OKigl#*M*W^w_uL%-v1 z8;P6CK15f2zDYqq7*dRz^g2(s|e-0i(n3F(p`YXALYRN@rC zK7Lhtr*j`audnc~G_O@-yT_WNG(ttY^)J(Hd%=Gf5Bdh4&k1k$jTij7;24jr_;2zh z*}pYv{Ud7>;FG(v5d^#Pi)gk{DI;e%M^A*WCldUMX&8{WUePs(e>PY>_ss8~$U@Ub zZ`n3rAy_;+U_7$+pmpX_X!*e;se3}i_3lgkR2=-7#I&XxwfK7&A7Ag1*l3pC(=h+W zUNq#sayl2mU?{*UNeXq=WUz?b0DrJlk<&cj>he%tN(y4h?Wu|V!0w9CyjgZsaA2d7 z)$6wTN5M7hx+WFU{PS29?$l+(5cqWKu=8)g-}vyZeBqrM3`mQ}akQPAJ`21Np08Tq zY5I&-Itdqn#6eQHsk=88k7GN-y4B{Sslj((v@WBEvA*q*DHBot0+QG-BEQHGRE{AR zutGqG7y`JyWbqW78n^yk_es_qcH7i5BCG2cOT_sF;$-)vIMVzbXKr@U^m4KFCl$K? z+Z8g${GS@zIm=c2lg1zy$BtVgs#V+&4ZK{4leg0LC)$q8LXjf=f=`^q2><%OnUjH6 zSO|hr?xYIRhtnEHPpAdM%U9Z@mFHDaJJSgQvpO)=M_EwWRD@g<;;sQqx(dY3%AADI zR#>alJZ3ax-nwX8k{ibS?c*S7&_p-G$lj*8-l-ZSGAR+3+4~|9rKm=RCz(H)q;<-R zbUm0~6c-`+LRy`USo6E+f53c7l%5b#MMiy*eEmV?UWv_4rdFGWW_i7{c0s*!Pi5<%>u z0+}sCYW5A;Yy3JD^PY}I$|CiYvdC`Lix}+ z+U-8SRL8`(L0~fCTT@z`mxD_wH$u>EKE%22-M4|+&JRxFdgBLAo#9iH$7JP_7p^~x zV?mEwo9X#2$fT^Z5O^5FyMI)uciBK8S;`>TRH#(FC&OZh1Q=Gy^|)hdM3u|W#{ZXT zaF|j%1GdY@Le>T5wtz+}F_22;v&iozd9H!?{N;if1v~|mCbOpP%2d?78+8zOLIcb< z0i~3;LVMqzw?57AelSoGNErGJW(@NN*dav_6V@opDQ@Rr!(wU>y$jUBvqkn!Awd={ z=X4!H3BEsZRXZEn-=`{x_WL6tzIH|ql1{$%C|2_2`0#bRT?Y3zeN92BMb4qP`xV;8 zdke-h#xo%7`Bsqb7iJ_sssnXs-FkY0OvSJ7TJMW^K)K21XTKrQxA=~s%`AJS?w(bm z!K~9=@k1h$F-PmN+kse>kNd=Z`LFnFpz>?zf8zqX-ZaPP#LKxp<@*c#+tSa#8t!pb z7J|@6l6EBoA2~goi)_7Wk5{P4sd+GU^&+S74Oylq?-_&#{f-%$1)QddVYI8?f!7hp z^`X-DP$cw9Ih8xkxZ;xsLx;$d7ZXr5y8B=H>E zl1T7d@wIHrd(VA+PJ-4ew}Zxi7XJ;Id$E#OGNF)7J)=+6*eAPc(YJ#?!J}NOxakMQ z-!tMi=kEL2zc#J4oITAmj(+v-QBL~lL8I2z4j{u7-qWNj|IZcdDu$wmdX#hz6L#>t z=^J;ceRAI$Z{n1=1-7pD?$7jERSWY3wX#!+>$Wdlapy`Y%KgOVV|J*j#*;)!U92pQFU zdD1$(sID}6C0ih<9i*;^%na}hMUa4q_+WF8w8`MU=za(8u)v4#p8=jub;cZaN}e|rUIl+fs!kreOJzK8ug6^rP}Vvj*Tj+ zhoMn75+6bx*dbNyFZ7YiIr#5#mz^Jwt?$I}GF@3qbc8OH;B5=&uc}y#M}By%B=Y8< z*;6eo9RNW1?ya1(j&WRnyf3&O@`U8KVsXp~Z$cXIj zKbi-q67$tuK4q*erwT`D7~EJfrh^|-7F*a1JCc6xVq-7^CCr;;lYK4YM_$vxkN5GV zLk)u)gv~c)N3n%CC$yS*#r#HBg|*N2PrCnt0y+{J99c@677u zS{s5JWTjgMcnUKP%;2CC1z0x&!S0&e@nh>81{KzNk7?A#7ikE!_ff>{xwP)Q{DB3Bfto z2UQG7{@|g!4D%5FUML$u7Tj?1pOO4MDkaEDV6grQ1TZr7x8>ehdp|Lp@l_&11mng| zeZr4mO?i5Dm%Vdl zWHlC<`H7;meXNym?@!EK`(o>|*q{x`#9w$)Ea3;c-Hl^U#Fv--WRz+7id>CPpI_O< zt0TvUT^56gB(&s8NQx1&FzkgcWZKOmIR72;_Yjx0vSKgE$2dS|$!vxDg=ADj1-ol^ zmlyMf4pSIfz>b_+RM1xJrJTg)L_hT8q6o6-O2SUwbNh}(kHGa4$fPP!>rp9Ltf^ec z#%2JqZTe>+-Z^>8Yz9WGa!4uxMI+w7Q(+0NS4%|;Nq{^?BbOLfu9ghq>w{~rN=)G; z%agslu8?sN!q2)X9cP~wKZZb)t>GZua|T?BzAW_(V=_*;&erhv_kf{!Xjiil|`F@p9N6|Hb}&cH{jXZkH5fO%sz+%n13 zC-eEMILV*-7q^e-h_Z*MH`8q0!=I&LpH$6Q_{y1gnWg$4EE|XZ!@lcbjN+N-MIO8i zO>(K?!K4<{u$kqSTWW6FWoO7%hkt`)FOp*29oXHX&>NxuTS;#OOwB#zm>Og20`rnN zVK5AT_T3=9iw021C}rk`hUI{&k_lrl0|^dG#+Q$np45XFYMr{Y-^gU$VNYBBlr>0& z4GpTzV-LuuZ{5@twQ_o6Yf;avW4JA{UCa@TzU)|y2D$S247JJH1hk@EdOO+oAG)3V zoAt?Kra$Aqz<>sUgUGE2{l+g=3ZFf}Vp^_~#K! zPAPrGs({z^V#P|MMgb92efR=gh?5)q88z}fAbH6A;rIGYCC92eZA_@N`5O3c+EoXA zPDf=wiq@ukvC>IdFGx3LWCd3YSI&7W;`5u>3J3QI&`$lUc?RW&!N6D3->Mrw%A%TF z>oQyU*t4g~u;8DL4=|Ce*7bncxtc6)-y(i5MI5{GAbI`%pFQUVb@#nJD0Qz^B5H8p z{&GY9>VEv=u=(S;H;ApNdPi$C1IB)>JmwDAMP=nSV#Abp@N`gt@8x(rpoV4w*zk*? zzo1Tzzp=9MnKV1a-fh#3r57YbdKUq1D2%9?tmFqj4@2T#Ld9u$FvHu`B*cNtenPoA zAs-SDH}=C3?%e3VnxhCTUw_A<*9&pTlUR&0Z6_~?F9uI`_??fj$dI=wQ<7&IhDaHsJoA=>#3*kdh`}_RP-}~&d&f05#*Is+??^*|-r2VWtEy?zzZ3R-BftO-GrxHIm7*+UNJG3Xe z9#*?3pKku8prxSJt#S+Sf)F@Ol(r#sP&~Ybb4GAiuC)%dAWKmZ=1X!)UFqS4h~!)8 zif>aI&#b(>=Q@hBvS)%o^o6_-d>@p;^%`pXNgGYsQiZX;liskx*REq?~(o;3ztG#)j#?vJSc8|}3X=36Y+ z)o6PWpAqw7+k`JW)ZiGhYu?D4}HoIDZrlhqKx z#2fDxQju~(#|4@q)Fd;6opE=;B1zHd>KH-`N@|o{YhDzoJZ-5BiJ(MHzce;zx?S^u zyJ(a?^!b~}pL_X!mb{bJku~yc!Mt$e&9b4ZZ*gGKa{*5ByC`9uU5nsIt3rCq5cMHA zojtRZ>TT)S!&gY5emDQr@gy7HPAXE{`|5^i-Q7cKS9I62lH~f|EB085G94tQg;hi1 z9oykJ=?AvO3ZR*F*~7ml;$HI6V>{xRcCp42y%MK}5M(qlZ&YCRglb=er*dUELFdV> zB#CpEPtH4K9g*e5dR%}IZ%G-vS7bMY<#}!_f3~;$V4m4m z_cQk#tKi!M6E8W4N_52EkZV~;GxqK3>j_%QSTO8Gun*}G0r8OMlJVm$)rYmZGAkOJ z;35oXO%I%7rieQ0+0*?s(1n)fa>)drAWixK73cd76)B>B9Jk^RB%gV-bO4-xbt&Ix zWw+V8>o$NW+-o7}@N;V*bh2U|HyJ=SVW<3jAY>3Km@0q?}T_GU*Im4-aRR zNpq&0Qs{6_9dNNb7`8>#uzB}#;i-5LX-g`v{m}cST1dA)P`=_qF8~*@*3Jc1xM;Y1 zxEMWBUu~ANi+EvhmFd5;aC%olM%+I}i8+hk(V5D-*XhkL{ShQAzY+G5Hp;c54%lzm ztPdKU;t(8wL`T~Z%@$fi`8LVl>w;qQRG1blK}OsS^KG!x^xFr_=4MWP-1#(^g@y8O zj7Cxh)XK*YWT&pgpSD$@Pu_wzXDWd{9&D!YAo%E030ghu>be_@IB2)N(V+9Vk0!!J zv8eIaq#7Q(`F~4}yOXWQi9e_x?RlVY`;U;oupYqT28(8>f3^s3lpf(z<4^C=FR3d`1|*mt{gW#LAUo1i3=)0J?_# zbm_^#MewNm-8o7fWfrL8nNnJLFv7AB$gOkTvV8(#9LovTShO@-E&D3_;r9wd)ltD} zSf#uewnvrD+8Of8xmb_R&+xY=>GZ)3>0rDAv9d@2L;f^ zf~AvJT0-GbH9s)pn@j{c+=$wwggp(X$&q|c zv|$UU6o1j{=CKpQz-5@0z#PRhNeReLSBG`#0R3M&faDr|v|m_B^v(R+8!n$Y`}A!EAy&dBlMe$O$#a$?dzZ zR*xhrlxsIQq>dt7xD0?NB?Dmw-v^k8(Nb@mvU{@Dy~I0HF>Q=}pLKKe8Fb+tD$dtg z4s<=wf}MJgfpP;sabr(h0$ucH)T{CckA=|t;NyIq#p%Fli!JF6q2F*Ub{AI&b{nQ; zA+{qWtuwXZAXh%2a|r0~9mh{n`jp9-2I&9<+P(u^B6E8!l501lf;XmX1gO))zAD62xqKGy6?xrg0Yt;LlqC1RN?H-D(9`Wq$oUa6#*-xX zaIGkTvLH1HV4O+q%J^br{ZA>KEx1;c&tByTUX%qt>6y zjmU)dgOMVqiFb(G?Ogo*l*6Wdheavf(a*PqhV2AK#Ok^Cfm*TbQxe#mPEbdgnhUhQ zWCK3C>EU|eKrbpl90w8FSa0cSK&@(fB&4_Fklr5rt2ZMmW&m6H6B+H%_9zkAtKFk? z!HfQ5gePi|5^5Tb0wvpaUId^r)8PhKRB3*atXTglNtmZi5fSd!-;^QOEBcLC(!(eL zk>;v}sc2zBRWel|yI2fu>*8NIVSi`C{jM;52f%m&8>j_hM9CvTK(6_mT@XtKP`{vH zHKV<*$rGT3DJ|{6t9@0aM0_1fAj9dcTAODnyqkQ272mI55FZI_*o;DO)VlndCjMTe z9?~6&Lu7-gFvkrk0fV9aqp}>|QboL}P!&+sR3h#Gr-dT$STbHpesDs+=^uoUD}vg137aUo;=x8?6h%tNxzU~^8Sms3bUn$I>5IjC-EpnIa0 zBh?%r^~aQo;=Rq<^=e7HZk-2Zsrjg`D(p(d~OmA{7O=$|gVVjq4(QK#h3! zp7Oc9%KD{9Uq2qzKf)|B0SRH_L3$Qm7+;eCb;e??ju~9um|J;jv;{A_{V2%$&(3DV z+PP*5NJpWt7*1%lRCeGz+{nwuky`%HMwb0=Tw_L_K0D5e#9FIIcOuq6T3QHpq literal 0 HcmV?d00001 diff --git a/docs/source/tutorials/arch_modeling/index.rst b/docs/source/tutorials/arch_modeling/index.rst new file mode 100644 index 000000000..1b643641d --- /dev/null +++ b/docs/source/tutorials/arch_modeling/index.rst @@ -0,0 +1,10 @@ +.. _design_flow_tutorials: + Design Flows + +Architecture Modeling +--------------------- + +.. toctree:: + :maxdepth: 2 + + quick_start diff --git a/docs/source/tutorials/arch_modeling/quick_start.rst b/docs/source/tutorials/arch_modeling/quick_start.rst new file mode 100644 index 000000000..0efbddf0d --- /dev/null +++ b/docs/source/tutorials/arch_modeling/quick_start.rst @@ -0,0 +1,549 @@ +.. _arch_quick_start: + +A Quick Start +------------- + +In this tutorial, we will consider a simple but representative FPGA architecture to show you how to + - Adapt the VPR architecture XML file to OpenFPGA acceptable format + - Create the OpenFPGA architecture XMl file to customize the primitive circuits + +Through this quick example, we will introduce the key steps to build your own FPGA based on a VPR architecture template. + +.. note:: These tips are generic and fundamental to build any architecture file for OpenFPGA. + +Adapt VPR Architecture +~~~~~~~~~~~~~~~~~~~~~~ +We start with the VPR architecture `template +`_. +This file models a homogeneous FPGA, as illustrated in :numref:`fig_k4n4_arch`. + +.. _fig_k4n4_arch: + +.. figure:: ./figures/k4n4_arch.png + :scale: 100% + + K4N4 FPGA architecture + +A summary of the architectural features is as follows: + - An array of tiles surrounded by a ring of I/O blocks + - K4N4 Configurable Logic Block (CLB), which consists of four Basic Logic Elements (BLEs) and a fully-connected crossbar. Each BLE contains a 4-input Look-Up Table (LUT), a Flip-Flop (FF) and a 2:1 routing multiplexer + - Length-1 routing wires interconnected by Wilton-Style Switch Block (SB) + +The VPR architecture description is designed for EDA needs mainly, which lacks the details physical modelingrequired by OpenFPGA. +Here, we show a step-by-step adaption on the architecture template. + +Physical I/O Modeling +^^^^^^^^^^^^^^^^^^^^^ +OpenFPGA requires a physical I/O block rather the abstract I/O modeling of VPR. +The ```` under the ```` should be adapted to the following: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Note that, there are several major changes in the above codes, when compared to the original code. + - We added a physical ``mode`` of I/O in addition to the original VPR I/O modeling, which is close to the physical implementation of an I/O cell. OpenFPGA will output fabric netlists base on the physical implementation rather than the operating modes. + - We remove the ``clock`` port of I/O is actually a dangling port. + - We specify that the phyical ``mode`` to be disabled for VPR packer by using ``packable=false``. This can help reduce packer's runtime. + +Since, we have added a new BLIF model ``subckt io`` to the architecture modeling, we should update the ```` XML node by adding a new I/O model. + +.. code-block:: xml + + + + + + + + + + + + + +Tileable Architecture +^^^^^^^^^^^^^^^^^^^^^ +OpenFPGA does support fine-grained tile-based architecture as shown in :numref:`fig_k4n4_arch`. +The tileable architecture leads to fast netlist generation as well as enables highly optimized physical designs through backend flow. +To turn on the tileable architecture, the ``tileable`` property should be added to ```` node. + +.. code-block:: xml + + + +By enabling this, all the Switch Blocks and Connection Blocks will be generated as identical as possible. +As a result, for any FPGA array size, there are only 9 unique tiles to be generated in netlists. +See details in :cite:`XTang_FPT_2019`. + +Detailed guidelines can be found at :ref:`addon_vpr_syntax`. + +Craft OpenFPGA Architecture +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +OpenFPGA needs another XML file which contains detailed modeling on the physical design of FPGA architecture. +This is designed to minimize the modification on the original VPR architecture file, so that it can be reused. + +Overview on the Structure +^^^^^^^^^^^^^^^^^^^^^^^^^ + +An OpenFPGA architecture including the following parts. + - Architecture modeling with a focus on circuit-level description + - Configuration protocol definition + - Annotation on the VPR architecture modules + - Simulation settings + +These parts are organized as follows in the XML file. + +.. code-block:: xml + + + + + ... + + + + + ... + + + + + ... + + + ... + + + ... + + + ... + + + + + ... + + +Technology Library Definition +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Technology information are all stored under the ```` node, which contains transistor-level information to build the FPGA. +Here, we bind to the open-source ASU Predictive Technology Modeling (PTM) 45nm process library. +See details in :ref:`technology_library`. + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + +.. note:: These information are important for FPGA-SPICE to correctly generate netlists. If you are not using FPGA-SPICE, you may provide a dummy technology library. + +Circuit Library Definition +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Circuit library is the crucial component of the architecture description, which contains a list of ````, each of which describes how a circuit is implemented for a FPGA component. + +Typically, we will defined a few atom ```` which are used to build primitive ````. + +.. code-block:: xml + + + + + ... + + + + + + ... + + + + +.. note:: Primitive ```` are the circuits which are directly used to build a FPGA component, such as Look-Up Table (LUT). Atom ```` are the circuits which are only used inside primitive ````. + +In this tutorial, we need the following atom ````, which are inverters, buffers and pass-gate logics. + +.. code-block:: xml + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + + + + + 10e-12 5e-12 5e-12 + + + 10e-12 5e-12 5e-12 + + + + + + + + + + + + + + + + + + + + +In this tutorial, we require the following primitive ````, which are routing multiplexers, Look-Up Tables, I/O cells in FPGA architecture (see :numref:`fig_k4n4_arch`). + +.. note:: We use different routing multiplexer circuits to maximum the performance by considering it fan-in and fan-out in the architecture context. + +.. note:: We specify that external Verilog netlists will be used for the circuits of Flip-Flops (FFs) ``static_dff`` and ``sc_dff_compact``, as well as the circuit of I/O cell ``iopad``. Other circuit models will be auto-generated by OpenFPGA. + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +See details in :ref:`circuit_library` and :ref:`circuit_model_examples`. + +Annotation on VPR Architecture +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In this part, we bind the ```` defined in the circuit library to each FPGA component. + +We specify that the FPGA fabric will be configured through a chain of Flip-Flops (FFs), which is built with the ````. + +.. code-block:: xml + + + + + +For the routing architecture, we specify the ``circuit_model`` to be used as routing multiplexers inside Connection Blocks (CBs), Switch Blocks (SBs), and also the routing wires. + +.. code-block:: xml + + + + + + + + + + + +.. note:: For a correct binding, the name of connection block, switch block and routing segment should match the name definition in your VPR architecture description! + +For each ```` defined in the ```` of VPR architecture, we need to specify + +- The physical mode for any ```` that contains multiple ````. The name of the physical mode should match a mode name that is defined in the VPR architecture. For example: + +.. code-block:: xml + + + +- The circuit model used to implement any primitive ```` in physical modes. It is required to provide full hierarchy of the ``pb_type``. For example: + +.. code-block:: xml + + + +.. note:: Mode-selection bits should be provided as the default configuration for a configurable resource. In this example, an I/O cell has a configuration bit, as defined in the ````. We specify that by default, the configuration memory will be set to logic ``1``. + +- The physical ```` for any ```` in the operating modes (mode other than the physical mode). This is required to translate mapping results from operating modes to their physical modes, in order to generate bitstreams. It is required to provide full hierarchy of the ``pb_type``. For example, + +.. code-block:: xml + + + +.. note:: Mode-selection bits should be provided so as to configure the circuits to be functional as required by the operating mode. In this example, an I/O cell will be configured with a logic ``1`` when operating as an input pad. + +- The circuit model used to implement interconnecting modules. The interconnect name should match the definition in the VPR architecture file. For example, + +.. code-block:: xml + + + +.. note:: If not specified, each interconnect will be binded to its default ``circuit_model``. For example, the crossbar will be binded to the default multiplexer ````, if not specified here. + +.. note:: OpenFPGA automatically infers the type of circuit model required by each interconnect. + +The complete annotation is shown as follows: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + +See details in :ref:`annotate_vpr_arch`. + +Simulation Settings +^^^^^^^^^^^^^^^^^^^ + +The simulation settings contain critical parameters to build testbenches for verify the FPGA fabric. + +The complete annotation is shown as follows: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +The ```` is crucial to create clock signals in testbenches. + +.. note:: FPGA has two types of clocks, one is the operating clock which controls applications that mapped to FPGA fabric, while the other is the programming clock which controls the configuration protocol. + +In this example, we specify + +- the operating clock will follow the maximum frequency achieved by VPR routing results +- the number of operating clock cycles to be used will follow the average signal activities of the RTL design that is mapped to the FPGA fabric. +- the actual operating clock frequency will be relaxed (reduced) by 20% by considering the errors between VPR results and physical designs. +- the programming clock frequency is fixed at 200MHz + +The ```` are the options for SPICE simulator. +Here we specify + +- SPICE simulations will consider a 25 :math:`^\circ C` temperature. +- SPICE simulation will output results in a compact way without details on node capacitances. +- SPICE simulation will use ``0.1ps`` as the minimum time step. +- SPICE simulation will consider fast algorithms to speed up runtime. + +The ```` are the options for SPICE simulator. +Here we specify that for each testbench, we will consider two Monte-Carlo simulations to evaluate the impact of process variations. + +The ```` specify how the output signals will be measured for delay and power evaluation. +Here we specify that + +- for slew calculation (used in power estimation), we consider from the 5% of the ``VDD`` to the 95% of the ``VDD`` for both rising and falling edges. +- for delay calculation, we consider from the 50% of the ``VDD`` of input signal to the 50% of the ``VDD`` of output signals for both rising and falling edges. + +In the ````, we specify that ``20ps`` slew time will be applied to built clock waverforms in SPICE simulations. + +See details in :ref:`simulation_setting`. diff --git a/docs/source/tutorials/index.rst b/docs/source/tutorials/index.rst index fbadf5193..9b1993d68 100644 --- a/docs/source/tutorials/index.rst +++ b/docs/source/tutorials/index.rst @@ -9,3 +9,5 @@ eda_flow design_flow/index + + arch_modeling/index From 62c506182c53949822574e336017ed888c5a5a7b Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 25 May 2020 18:21:12 -0600 Subject: [PATCH 083/180] start developing frame-based configuration protocol --- libopenfpga/libarchopenfpga/src/circuit_types.h | 6 +++--- .../libarchopenfpga/src/read_xml_config_protocol.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libopenfpga/libarchopenfpga/src/circuit_types.h b/libopenfpga/libarchopenfpga/src/circuit_types.h index 448bf28d2..f13a8a5ee 100644 --- a/libopenfpga/libarchopenfpga/src/circuit_types.h +++ b/libopenfpga/libarchopenfpga/src/circuit_types.h @@ -119,16 +119,16 @@ constexpr std::array CIRCUIT_MODEL_D * 1. configurable memories are organized and accessed as standalone elements * 2. configurable memories are organized and accessed by a scan-chain * 3. configurable memories are organized and accessed by memory bank - * 4. configurable memories are organized and accessed by a local encoder + * 4. configurable memories are organized and accessed by frames */ enum e_config_protocol_type { CONFIG_MEM_STANDALONE, CONFIG_MEM_SCAN_CHAIN, CONFIG_MEM_MEMORY_BANK, - CONFIG_MEM_LOCAL_ENCODER, + CONFIG_MEM_FRAME_BASED, NUM_CONFIG_PROTOCOL_TYPES }; -constexpr std::array CONFIG_PROTOCOL_TYPE_STRING = {{"standalone", "scan_chain", "memory_bank", "local_encoder"}}; +constexpr std::array CONFIG_PROTOCOL_TYPE_STRING = {{"standalone", "scan_chain", "memory_bank", "frame_based"}}; #endif diff --git a/libopenfpga/libarchopenfpga/src/read_xml_config_protocol.cpp b/libopenfpga/libarchopenfpga/src/read_xml_config_protocol.cpp index e00600b1a..2daedbd39 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_config_protocol.cpp +++ b/libopenfpga/libarchopenfpga/src/read_xml_config_protocol.cpp @@ -35,8 +35,8 @@ e_config_protocol_type string_to_config_protocol_type(const std::string& type_st return CONFIG_MEM_MEMORY_BANK; } - if (std::string("local_encoder") == type_string) { - return CONFIG_MEM_LOCAL_ENCODER; + if (std::string("frame_based") == type_string) { + return CONFIG_MEM_FRAME_BASED; } return NUM_CONFIG_PROTOCOL_TYPES; From 3a26bb5eefb7105c3c92c99c211b18360ec26a45 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 25 May 2020 19:02:14 -0600 Subject: [PATCH 084/180] add advanced check in configurable memories --- .../src/check_circuit_library.cpp | 1 + openfpga/src/base/openfpga_read_arch.cpp | 7 ++++ openfpga/src/utils/circuit_library_utils.cpp | 37 +++++++++++++++++++ openfpga/src/utils/circuit_library_utils.h | 4 ++ 4 files changed, 49 insertions(+) diff --git a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp index f5392a2e4..f37742a5a 100644 --- a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp +++ b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp @@ -552,3 +552,4 @@ bool check_circuit_library(const CircuitLibrary& circuit_lib) { return true; } + diff --git a/openfpga/src/base/openfpga_read_arch.cpp b/openfpga/src/base/openfpga_read_arch.cpp index ee0670268..db9b09b5b 100644 --- a/openfpga/src/base/openfpga_read_arch.cpp +++ b/openfpga/src/base/openfpga_read_arch.cpp @@ -11,6 +11,7 @@ /* Headers from archopenfpga library */ #include "read_xml_openfpga_arch.h" #include "check_circuit_library.h" +#include "circuit_library_utils.h" #include "write_xml_openfpga_arch.h" #include "openfpga_read_arch.h" @@ -50,6 +51,12 @@ int read_arch(OpenfpgaContext& openfpga_context, return CMD_EXEC_FATAL_ERROR; } + if (false == check_configurable_memory_circuit_model(openfpga_context.arch().config_protocol.type(), + openfpga_context.arch().circuit_lib, + openfpga_context.arch().config_protocol.memory_model())) { + return CMD_EXEC_FATAL_ERROR; + } + return CMD_EXEC_SUCCESS; } diff --git a/openfpga/src/utils/circuit_library_utils.cpp b/openfpga/src/utils/circuit_library_utils.cpp index cecbcafed..082349008 100644 --- a/openfpga/src/utils/circuit_library_utils.cpp +++ b/openfpga/src/utils/circuit_library_utils.cpp @@ -11,6 +11,7 @@ #include "vtr_assert.h" #include "vtr_log.h" +#include "check_circuit_library.h" #include "circuit_library_utils.h" /* begin namespace openfpga */ @@ -226,4 +227,40 @@ std::vector find_circuit_library_unique_verilog_netlists(const Circ return netlists; } +/************************************************************************ + * Advanced check if the circuit model of configurable memory + * satisfy the needs of configuration protocol + * - Configuration chain -based: we check if we have a CCFF model + * - Frame -based: we check if we have a SRAM model which has BL and WL + * + ***********************************************************************/ +bool check_configurable_memory_circuit_model(const e_config_protocol_type& config_protocol_type, + const CircuitLibrary& circuit_lib, + const CircuitModelId& config_mem_circuit_model) { + size_t num_err = 0; + + switch (config_protocol_type) { + case CONFIG_MEM_SCAN_CHAIN: + num_err = check_ccff_circuit_model_ports(circuit_lib, + config_mem_circuit_model); + break; + case CONFIG_MEM_STANDALONE: + case CONFIG_MEM_MEMORY_BANK: + case CONFIG_MEM_FRAME_BASED: + num_err = check_sram_circuit_model_ports(circuit_lib, + config_mem_circuit_model, + true); + + break; + default: + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of configuration protocol!\n"); + return false; + } + + VTR_LOG("Found %ld errors when checking configurable memory circuit models!\n", + num_err); + return (0 == num_err); +} + } /* end namespace openfpga */ diff --git a/openfpga/src/utils/circuit_library_utils.h b/openfpga/src/utils/circuit_library_utils.h index 7c5552304..b03c03156 100644 --- a/openfpga/src/utils/circuit_library_utils.h +++ b/openfpga/src/utils/circuit_library_utils.h @@ -38,6 +38,10 @@ std::vector find_circuit_library_global_ports(const CircuitLibrar std::vector find_circuit_library_unique_verilog_netlists(const CircuitLibrary& circuit_lib); +bool check_configurable_memory_circuit_model(const e_config_protocol_type& config_protocol_type, + const CircuitLibrary& circuit_lib, + const CircuitModelId& config_mem_circuit_model); + } /* end namespace openfpga */ #endif From 8864920460aea5b60e52bf0754e064d6dc5e9e5c Mon Sep 17 00:00:00 2001 From: tangxifan Date: Mon, 25 May 2020 22:15:16 -0600 Subject: [PATCH 085/180] add frame-based memory module builder --- openfpga/src/base/openfpga_build_fabric.cpp | 3 +- openfpga/src/base/openfpga_context.h | 6 + openfpga/src/base/openfpga_naming.cpp | 14 ++ openfpga/src/base/openfpga_naming.h | 3 + openfpga/src/base/openfpga_reserved_words.h | 6 + openfpga/src/fabric/build_decoder_modules.cpp | 59 +++++- openfpga/src/fabric/build_decoder_modules.h | 5 + openfpga/src/fabric/build_device_module.cpp | 7 +- openfpga/src/fabric/build_device_module.h | 3 +- openfpga/src/fabric/build_memory_modules.cpp | 195 +++++++++++++++++- openfpga/src/fabric/build_memory_modules.h | 2 + openfpga/src/utils/module_manager_utils.cpp | 60 ++++++ openfpga/src/utils/module_manager_utils.h | 9 + 13 files changed, 361 insertions(+), 11 deletions(-) diff --git a/openfpga/src/base/openfpga_build_fabric.cpp b/openfpga/src/base/openfpga_build_fabric.cpp index 708bef124..b1a1fe118 100644 --- a/openfpga/src/base/openfpga_build_fabric.cpp +++ b/openfpga/src/base/openfpga_build_fabric.cpp @@ -76,8 +76,9 @@ int build_fabric(OpenfpgaContext& openfpga_ctx, VTR_LOG("\n"); openfpga_ctx.mutable_module_graph() = build_device_module_graph(openfpga_ctx.mutable_io_location_map(), - g_vpr_ctx.device(), + openfpga_ctx.mutable_decoder_lib(), const_cast(openfpga_ctx), + g_vpr_ctx.device(), cmd_context.option_enable(cmd, opt_compress_routing), cmd_context.option_enable(cmd, opt_duplicate_grid_pin), cmd_context.option_enable(cmd, opt_verbose)); diff --git a/openfpga/src/base/openfpga_context.h b/openfpga/src/base/openfpga_context.h index 2ea114410..8c025687f 100644 --- a/openfpga/src/base/openfpga_context.h +++ b/openfpga/src/base/openfpga_context.h @@ -10,6 +10,7 @@ #include "vpr_placement_annotation.h" #include "vpr_routing_annotation.h" #include "mux_library.h" +#include "decoder_library.h" #include "tile_direct.h" #include "module_manager.h" #include "netlist_manager.h" @@ -55,6 +56,7 @@ class OpenfpgaContext : public Context { const openfpga::VprRoutingAnnotation& vpr_routing_annotation() const { return vpr_routing_annotation_; } const openfpga::DeviceRRGSB& device_rr_gsb() const { return device_rr_gsb_; } const openfpga::MuxLibrary& mux_lib() const { return mux_lib_; } + const openfpga::DecoderLibrary& decoder_lib() const { return decoder_lib_; } const openfpga::TileDirect& tile_direct() const { return tile_direct_; } const openfpga::ModuleManager& module_graph() const { return module_graph_; } const openfpga::FlowManager& flow_manager() const { return flow_manager_; } @@ -72,6 +74,7 @@ class OpenfpgaContext : public Context { openfpga::VprRoutingAnnotation& mutable_vpr_routing_annotation() { return vpr_routing_annotation_; } openfpga::DeviceRRGSB& mutable_device_rr_gsb() { return device_rr_gsb_; } openfpga::MuxLibrary& mutable_mux_lib() { return mux_lib_; } + openfpga::DecoderLibrary& mutable_decoder_lib() { return decoder_lib_; } openfpga::TileDirect& mutable_tile_direct() { return tile_direct_; } openfpga::ModuleManager& mutable_module_graph() { return module_graph_; } openfpga::FlowManager& mutable_flow_manager() { return flow_manager_; } @@ -105,6 +108,9 @@ class OpenfpgaContext : public Context { /* Library of physical implmentation of routing multiplexers */ openfpga::MuxLibrary mux_lib_; + /* Library of physical implmentation of decoders */ + openfpga::DecoderLibrary decoder_lib_; + /* Inner/inter-column/row tile direct connections */ openfpga::TileDirect tile_direct_; diff --git a/openfpga/src/base/openfpga_naming.cpp b/openfpga/src/base/openfpga_naming.cpp index 74750fca5..bf82a1d7c 100644 --- a/openfpga/src/base/openfpga_naming.cpp +++ b/openfpga/src/base/openfpga_naming.cpp @@ -142,6 +142,20 @@ std::string generate_mux_local_decoder_subckt_name(const size_t& addr_size, return subckt_name; } +/************************************************ + * Generate the module name of a decoder + * for frame-based memories + ***********************************************/ +std::string generate_frame_memory_decoder_subckt_name(const size_t& addr_size, + const size_t& data_size) { + std::string subckt_name = "frame_decoder"; + subckt_name += std::to_string(addr_size); + subckt_name += "to"; + subckt_name += std::to_string(data_size); + + return subckt_name; +} + /************************************************ * Generate the module name of a routing track wire ***********************************************/ diff --git a/openfpga/src/base/openfpga_naming.h b/openfpga/src/base/openfpga_naming.h index 9896dddd4..d3cfb04f0 100644 --- a/openfpga/src/base/openfpga_naming.h +++ b/openfpga/src/base/openfpga_naming.h @@ -50,6 +50,9 @@ std::string generate_mux_branch_subckt_name(const CircuitLibrary& circuit_lib, std::string generate_mux_local_decoder_subckt_name(const size_t& addr_size, const size_t& data_size); +std::string generate_frame_memory_decoder_subckt_name(const size_t& addr_size, + const size_t& data_size); + std::string generate_segment_wire_subckt_name(const std::string& wire_model_name, const size_t& segment_id); diff --git a/openfpga/src/base/openfpga_reserved_words.h b/openfpga/src/base/openfpga_reserved_words.h index be47315ba..c556a19b1 100644 --- a/openfpga/src/base/openfpga_reserved_words.h +++ b/openfpga/src/base/openfpga_reserved_words.h @@ -30,6 +30,12 @@ constexpr char* GRID_MUX_INSTANCE_PREFIX = "mux_"; constexpr char* SWITCH_BLOCK_MUX_INSTANCE_PREFIX = "mux_"; constexpr char* CONNECTION_BLOCK_MUX_INSTANCE_PREFIX = "mux_"; +/* Decoder naming constant strings */ +constexpr char* DECODER_ENABLE_PORT_NAME = "enable"; +constexpr char* DECODER_ADDRESS_PORT_NAME = "address"; +constexpr char* DECODER_DATA_PORT_NAME = "data"; +constexpr char* DECODER_DATA_INV_PORT_NAME = "data_inv"; + /* Inverted port naming */ constexpr char* INV_PORT_POSTFIX = "_inv"; diff --git a/openfpga/src/fabric/build_decoder_modules.cpp b/openfpga/src/fabric/build_decoder_modules.cpp index 06defc007..a2accae89 100644 --- a/openfpga/src/fabric/build_decoder_modules.cpp +++ b/openfpga/src/fabric/build_decoder_modules.cpp @@ -9,6 +9,7 @@ #include "vtr_assert.h" #include "vtr_time.h" +#include "openfpga_reserved_words.h" #include "openfpga_naming.h" #include "decoder_library_utils.h" #include "module_manager_utils.h" @@ -18,6 +19,61 @@ /* begin namespace openfpga */ namespace openfpga { +/*************************************************************************************** + * Create a module for a decoder with a given output size + * + * Data input + * | | ... | + * v v v + * +-----------+ + * / \ + * enable-->/ Decoder \ + * +-----------------+ + * | | | ... | | | + * v v v v v v + * Data Outputs + * + * The outputs are assumes to be one-hot codes (at most only one '1' exist) + * Considering this fact, there are only num_of_outputs conditions to be encoded. + * Therefore, the number of inputs is ceil(log(num_of_outputs)/log(2)) + ***************************************************************************************/ +ModuleId build_frame_memory_decoder_module(ModuleManager& module_manager, + const DecoderLibrary& decoder_lib, + const DecoderId& decoder) { + /* Get the number of inputs */ + size_t addr_size = decoder_lib.addr_size(decoder); + size_t data_size = decoder_lib.data_size(decoder); + + /* Create a name for the local encoder */ + std::string module_name = generate_frame_memory_decoder_subckt_name(addr_size, data_size); + + /* Create a Verilog Module based on the circuit model, and add to module manager */ + ModuleId module_id = module_manager.add_module(module_name); + VTR_ASSERT(true == module_manager.valid_module_id(module_id)); + + /* Add enable port */ + BasicPort en_port(std::string(DECODER_ENABLE_PORT_NAME), 1); + module_manager.add_port(module_id, en_port, ModuleManager::MODULE_INPUT_PORT); + /* Add each input port */ + BasicPort addr_port(std::string(DECODER_ADDRESS_PORT_NAME), addr_size); + module_manager.add_port(module_id, addr_port, ModuleManager::MODULE_INPUT_PORT); + /* Add each output port */ + BasicPort data_port(std::string(DECODER_DATA_PORT_NAME), data_size); + module_manager.add_port(module_id, data_port, ModuleManager::MODULE_OUTPUT_PORT); + + /* Data port is registered. It should be outputted as + * output reg [lsb:msb] data + */ + module_manager.set_port_is_register(module_id, data_port.get_name(), true); + /* Add data_in port */ + if (true == decoder_lib.use_data_inv_port(decoder)) { + BasicPort data_inv_port(std::string(DECODER_DATA_INV_PORT_NAME), data_size); + module_manager.add_port(module_id, data_inv_port, ModuleManager::MODULE_OUTPUT_PORT); + } + + return module_id; +} + /*************************************************************************************** * Create a module for a decoder with a given output size * @@ -44,7 +100,7 @@ void build_mux_local_decoder_module(ModuleManager& module_manager, size_t addr_size = decoder_lib.addr_size(decoder); size_t data_size = decoder_lib.data_size(decoder); - /* TODO: create a name for the local encoder */ + /* Create a name for the local encoder */ std::string module_name = generate_mux_local_decoder_subckt_name(addr_size, data_size); /* Create a Verilog Module based on the circuit model, and add to module manager */ @@ -67,7 +123,6 @@ void build_mux_local_decoder_module(ModuleManager& module_manager, module_manager.add_port(module_id, data_inv_port, ModuleManager::MODULE_OUTPUT_PORT); } - /*************************************************************************************** * This function will generate all the unique Verilog modules of local decoders for * the multiplexers used in a FPGA fabric diff --git a/openfpga/src/fabric/build_decoder_modules.h b/openfpga/src/fabric/build_decoder_modules.h index 842aef8c4..bf18e47d4 100644 --- a/openfpga/src/fabric/build_decoder_modules.h +++ b/openfpga/src/fabric/build_decoder_modules.h @@ -5,6 +5,7 @@ * Include header files that are required by function declaration *******************************************************************/ #include "module_manager.h" +#include "decoder_library.h" #include "mux_library.h" #include "circuit_library.h" @@ -15,6 +16,10 @@ /* begin namespace openfpga */ namespace openfpga { +ModuleId build_frame_memory_decoder_module(ModuleManager& module_manager, + const DecoderLibrary& decoder_lib, + const DecoderId& decoder); + void build_mux_local_decoder_modules(ModuleManager& module_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib); diff --git a/openfpga/src/fabric/build_device_module.cpp b/openfpga/src/fabric/build_device_module.cpp index 9680285fa..1d65fef7c 100644 --- a/openfpga/src/fabric/build_device_module.cpp +++ b/openfpga/src/fabric/build_device_module.cpp @@ -27,8 +27,9 @@ namespace openfpga { * for a FPGA fabric *******************************************************************/ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, - const DeviceContext& vpr_device_ctx, + DecoderLibrary& decoder_lib, const OpenfpgaContext& openfpga_ctx, + const DeviceContext& vpr_device_ctx, const bool& compress_routing, const bool& duplicate_grid_pin, const bool& verbose) { @@ -66,7 +67,9 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, build_wire_modules(module_manager, openfpga_ctx.arch().circuit_lib); /* Build memory modules */ - build_memory_modules(module_manager, openfpga_ctx.mux_lib(), + build_memory_modules(module_manager, + decoder_lib, + openfpga_ctx.mux_lib(), openfpga_ctx.arch().circuit_lib, openfpga_ctx.arch().config_protocol.type()); diff --git a/openfpga/src/fabric/build_device_module.h b/openfpga/src/fabric/build_device_module.h index b8f8c0ac8..75a9f982c 100644 --- a/openfpga/src/fabric/build_device_module.h +++ b/openfpga/src/fabric/build_device_module.h @@ -15,8 +15,9 @@ namespace openfpga { ModuleManager build_device_module_graph(IoLocationMap& io_location_map, - const DeviceContext& vpr_device_ctx, + DecoderLibrary& decoder_lib, const OpenfpgaContext& openfpga_ctx, + const DeviceContext& vpr_device_ctx, const bool& compress_routing, const bool& duplicate_grid_pin, const bool& verbose); diff --git a/openfpga/src/fabric/build_memory_modules.cpp b/openfpga/src/fabric/build_memory_modules.cpp index 299bf6d70..bbdb01fef 100644 --- a/openfpga/src/fabric/build_memory_modules.cpp +++ b/openfpga/src/fabric/build_memory_modules.cpp @@ -15,12 +15,14 @@ #include "mux_graph.h" #include "module_manager.h" #include "circuit_library_utils.h" +#include "decoder_library_utils.h" #include "module_manager_utils.h" #include "mux_utils.h" #include "openfpga_reserved_words.h" #include "openfpga_naming.h" +#include "build_decoder_modules.h" #include "build_memory_modules.h" /* begin namespace openfpga */ @@ -553,6 +555,178 @@ void build_memory_bank_module(ModuleManager& module_manager, add_module_global_ports_from_child_modules(module_manager, mem_module); } +/********************************************************************* + * Frame-based Memory organization + * + * EN Address Data + * | | | + * v v v + * +------------------------------------+ + * | Address Decoder | + * +------------------------------------+ + * | | | + * v v v + * +-------+ +-------+ +-------+ + * | SRAM | | SRAM | ... | SRAM | + * | [0] | | [1] | | [N-1] | + * +-------+ +-------+ +-------+ + * | | ... | + * v v v + * +------------------------------------+ + * | Multiplexer Configuration port | + * + ********************************************************************/ +static +void build_frame_memory_module(ModuleManager& module_manager, + DecoderLibrary& frame_decoder_lib, + const CircuitLibrary& circuit_lib, + const std::string& module_name, + const CircuitModelId& sram_model, + const size_t& num_mems) { + + /* Get the global ports required by the SRAM */ + std::vector global_port_types; + global_port_types.push_back(CIRCUIT_MODEL_PORT_CLOCK); + global_port_types.push_back(CIRCUIT_MODEL_PORT_INPUT); + std::vector sram_global_ports = circuit_lib.model_global_ports_by_type(sram_model, global_port_types, true, false); + /* Get the input ports from the SRAM */ + std::vector sram_input_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_INPUT, true); + /* A SRAM cell with BL/WL should not have any input */ + VTR_ASSERT( 0 == sram_input_ports.size() ); + + /* Get the output ports from the SRAM */ + std::vector sram_output_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_OUTPUT, true); + + /* Get the BL/WL ports from the SRAM + * Here, we consider that the WL port will be EN signal of a SRAM + * and the BL port will be the data_in signal of a SRAM + */ + std::vector sram_bl_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_BL, true); + std::vector sram_blb_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_BLB, true); + std::vector sram_wl_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_WL, true); + std::vector sram_wlb_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_WLB, true); + + /* We do NOT expect any BLB port here!!! + * TODO: to suppor this, we need an inverter circuit model to be specified by users !!! + */ + VTR_ASSERT(1 == sram_bl_ports.size()); + VTR_ASSERT(1 == circuit_lib.port_size(sram_bl_ports[0])); + VTR_ASSERT(1 == sram_wl_ports.size()); + VTR_ASSERT(1 == circuit_lib.port_size(sram_wl_ports[0])); + VTR_ASSERT(0 == sram_blb_ports.size()); + + /* Create a module and add to the module manager */ + ModuleId mem_module = module_manager.add_module(module_name); + VTR_ASSERT(true == module_manager.valid_module_id(mem_module)); + + /* Find the specification of the decoder: + * Size of address port and data input + */ + size_t addr_size = find_mux_local_decoder_addr_size(num_mems); + /* Data input should match the WL (data_in) of a SRAM */ + size_t data_size = num_mems * circuit_lib.port_size(sram_bl_ports[0]); + bool use_data_inv = (0 < sram_blb_ports.size()); + + /* Search the decoder library + * If we find one, we use the module. + * Otherwise, we create one and add it to the decoder library + */ + DecoderId decoder_id = frame_decoder_lib.find_decoder(addr_size, data_size, true, true, use_data_inv); + if (DecoderId::INVALID() == decoder_id) { + decoder_id = frame_decoder_lib.add_decoder(addr_size, data_size, true, true, use_data_inv); + } + VTR_ASSERT(DecoderId::INVALID() != decoder_id); + + /* Create a module if not existed yet */ + std::string decoder_module_name = generate_frame_memory_decoder_subckt_name(addr_size, data_size); + ModuleId decoder_module = module_manager.find_module(decoder_module_name); + if (ModuleId::INVALID() == decoder_module) { + decoder_module = build_frame_memory_decoder_module(module_manager, + frame_decoder_lib, + decoder_id); + } + VTR_ASSERT(ModuleId::INVALID() != decoder_module); + + /* Add module ports */ + /* Input: Enable port */ + BasicPort en_port(std::string(DECODER_ENABLE_PORT_NAME), 1); + ModulePortId mem_en_port = module_manager.add_port(mem_module, en_port, ModuleManager::MODULE_INPUT_PORT); + + /* Input: Address port */ + BasicPort addr_port(std::string(DECODER_ADDRESS_PORT_NAME), addr_size); + ModulePortId mem_addr_port = module_manager.add_port(mem_module, addr_port, ModuleManager::MODULE_INPUT_PORT); + + /* Input: Data port */ + BasicPort data_port(std::string(DECODER_DATA_PORT_NAME), data_size); + ModulePortId mem_data_port = module_manager.add_port(mem_module, data_port, ModuleManager::MODULE_INPUT_PORT); + + /* Add each output port: port width should match the number of memories */ + for (const auto& port : sram_output_ports) { + BasicPort output_port(circuit_lib.port_prefix(port), num_mems * circuit_lib.port_size(port)); + module_manager.add_port(mem_module, output_port, ModuleManager::MODULE_OUTPUT_PORT); + } + + /* Instanciate the decoder module here */ + VTR_ASSERT(0 == module_manager.num_instance(mem_module, decoder_module)); + module_manager.add_child_module(mem_module, decoder_module); + + /* Find the sram module in the module manager */ + ModuleId sram_mem_module = module_manager.find_module(circuit_lib.model_name(sram_model)); + + /* Build module nets */ + /* Wire enable port to decoder enable port */ + ModulePortId decoder_en_port = module_manager.find_module_port(decoder_module, std::string(DECODER_ENABLE_PORT_NAME)); + add_module_bus_nets(module_manager, mem_module, + mem_module, 0, mem_en_port, + decoder_module, 0, decoder_en_port); + + /* Wire address port to decoder address port */ + ModulePortId decoder_addr_port = module_manager.find_module_port(decoder_module, std::string(DECODER_ADDRESS_PORT_NAME)); + add_module_bus_nets(module_manager, mem_module, + mem_module, 0, mem_addr_port, + decoder_module, 0, decoder_addr_port); + + /* Instanciate each submodule */ + for (size_t i = 0; i < num_mems; ++i) { + /* Memory seed module instanciation */ + size_t sram_instance = module_manager.num_instance(mem_module, sram_mem_module); + module_manager.add_child_module(mem_module, sram_mem_module); + + /* Wire data_in port to SRAM BL port */ + ModulePortId sram_bl_port = module_manager.find_module_port(sram_mem_module, circuit_lib.port_lib_name(sram_bl_ports[0])); + add_module_bus_nets(module_manager, mem_module, + mem_module, 0, mem_data_port, + sram_mem_module, sram_instance, sram_bl_port); + + /* Wire decoder data_out port to sram WL ports */ + ModulePortId sram_wl_port = module_manager.find_module_port(sram_mem_module, circuit_lib.port_lib_name(sram_wl_ports[0])); + ModulePortId decoder_data_port = module_manager.find_module_port(decoder_module, std::string(DECODER_DATA_PORT_NAME)); + ModuleNetId wl_net = module_manager.create_module_net(mem_module); + /* Source node of the input net is the input of memory module */ + module_manager.add_module_net_source(mem_module, wl_net, decoder_module, 0, decoder_data_port, sram_instance); + module_manager.add_module_net_sink(mem_module, wl_net, sram_mem_module, sram_instance, sram_wl_port, 0); + + /* Optional: Wire decoder data_out inverted port to sram WLB ports */ + if (true == use_data_inv) { + ModulePortId sram_wlb_port = module_manager.find_module_port(sram_mem_module, circuit_lib.port_lib_name(sram_wlb_ports[0])); + ModulePortId decoder_data_inv_port = module_manager.find_module_port(decoder_module, std::string(DECODER_DATA_INV_PORT_NAME)); + ModuleNetId wlb_net = module_manager.create_module_net(mem_module); + /* Source node of the input net is the input of memory module */ + module_manager.add_module_net_source(mem_module, wlb_net, decoder_module, 0, decoder_data_inv_port, sram_instance); + module_manager.add_module_net_sink(mem_module, wlb_net, sram_mem_module, sram_instance, sram_wlb_port, 0); + } + + /* Wire inputs of parent module to outputs of child modules */ + add_module_output_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_output_ports, sram_mem_module, i, sram_instance); + } + + /* Add global ports to the pb_module: + * This is a much easier job after adding sub modules (instances), + * we just need to find all the global ports from the child modules and build a list of it + */ + add_module_global_ports_from_child_modules(module_manager, mem_module); +} + /********************************************************************* * Generate Verilog modules for the memories that are used @@ -566,6 +740,7 @@ void build_memory_bank_module(ModuleManager& module_manager, ********************************************************************/ static void build_memory_module(ModuleManager& module_manager, + DecoderLibrary& arch_decoder_lib, const CircuitLibrary& circuit_lib, const e_config_protocol_type& sram_orgz_type, const std::string& module_name, @@ -574,7 +749,7 @@ void build_memory_module(ModuleManager& module_manager, switch (sram_orgz_type) { case CONFIG_MEM_STANDALONE: build_memory_standalone_module(module_manager, circuit_lib, - module_name, sram_model, num_mems); + module_name, sram_model, num_mems); break; case CONFIG_MEM_SCAN_CHAIN: build_memory_chain_module(module_manager, circuit_lib, @@ -584,8 +759,13 @@ void build_memory_module(ModuleManager& module_manager, build_memory_bank_module(module_manager, circuit_lib, module_name, sram_model, num_mems); break; + case CONFIG_MEM_FRAME_BASED: + build_frame_memory_module(module_manager, arch_decoder_lib, circuit_lib, + module_name, sram_model, num_mems); + break; default: - VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid SRAM organization!\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid configurable memory organization!\n"); exit(1); } } @@ -606,6 +786,7 @@ void build_memory_module(ModuleManager& module_manager, ********************************************************************/ static void build_mux_memory_module(ModuleManager& module_manager, + DecoderLibrary& arch_decoder_lib, const CircuitLibrary& circuit_lib, const e_config_protocol_type& sram_orgz_type, const CircuitModelId& mux_model, @@ -626,7 +807,8 @@ void build_mux_memory_module(ModuleManager& module_manager, std::vector sram_models = find_circuit_sram_models(circuit_lib, mux_model); VTR_ASSERT( 1 == sram_models.size() ); - build_memory_module(module_manager, circuit_lib, sram_orgz_type, module_name, sram_models[0], num_config_bits); + build_memory_module(module_manager, arch_decoder_lib, + circuit_lib, sram_orgz_type, module_name, sram_models[0], num_config_bits); break; } case CIRCUIT_MODEL_DESIGN_RRAM: @@ -659,6 +841,7 @@ void build_mux_memory_module(ModuleManager& module_manager, * memory-bank organization for the memories. ********************************************************************/ void build_memory_modules(ModuleManager& module_manager, + DecoderLibrary& arch_decoder_lib, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, const e_config_protocol_type& sram_orgz_type) { @@ -676,7 +859,8 @@ void build_memory_modules(ModuleManager& module_manager, continue; } /* Create a Verilog module for the memories used by the multiplexer */ - build_mux_memory_module(module_manager, circuit_lib, sram_orgz_type, mux_model, mux_graph); + build_mux_memory_module(module_manager, arch_decoder_lib, + circuit_lib, sram_orgz_type, mux_model, mux_graph); } /* Create the memory circuits for non-MUX circuit models. @@ -708,7 +892,8 @@ void build_memory_modules(ModuleManager& module_manager, std::string module_name = generate_memory_module_name(circuit_lib, model, sram_models[0], std::string(MEMORY_MODULE_POSTFIX)); /* Create a Verilog module for the memories used by the circuit model */ - build_memory_module(module_manager, circuit_lib, sram_orgz_type, module_name, sram_models[0], num_mems); + build_memory_module(module_manager, arch_decoder_lib, + circuit_lib, sram_orgz_type, module_name, sram_models[0], num_mems); } } diff --git a/openfpga/src/fabric/build_memory_modules.h b/openfpga/src/fabric/build_memory_modules.h index 2728d1d81..3551426a2 100644 --- a/openfpga/src/fabric/build_memory_modules.h +++ b/openfpga/src/fabric/build_memory_modules.h @@ -4,6 +4,7 @@ /******************************************************************** * Include header files that are required by function declaration *******************************************************************/ +#include "decoder_library.h" #include "circuit_library.h" #include "mux_library.h" #include "module_manager.h" @@ -16,6 +17,7 @@ namespace openfpga { void build_memory_modules(ModuleManager& module_manager, + DecoderLibrary& arch_decoder_lib, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib, const e_config_protocol_type& sram_orgz_type); diff --git a/openfpga/src/utils/module_manager_utils.cpp b/openfpga/src/utils/module_manager_utils.cpp index b1408dcad..44e13c65a 100644 --- a/openfpga/src/utils/module_manager_utils.cpp +++ b/openfpga/src/utils/module_manager_utils.cpp @@ -1227,6 +1227,66 @@ size_t find_module_num_config_bits_from_child_modules(ModuleManager& module_mana return num_config_bits; } +/******************************************************************** + * Add a bus of nets to a module (cur_module_id) + * Note: + * - both src and des module should exist in the module manager + * - src_module should be the cur_module or a child of it + * - des_module should be the cur_module or a child of it + * - src_instance should be valid and des_instance should be valid as well + * - src port size should match the des port size + *******************************************************************/ +void add_module_bus_nets(ModuleManager& module_manager, + const ModuleId& cur_module_id, + const ModuleId& src_module_id, + const size_t& src_instance_id, + const ModulePortId& src_module_port_id, + const ModuleId& des_module_id, + const size_t& des_instance_id, + const ModulePortId& des_module_port_id) { + + VTR_ASSERT(true == module_manager.valid_module_id(cur_module_id)); + VTR_ASSERT(true == module_manager.valid_module_id(src_module_id)); + VTR_ASSERT(true == module_manager.valid_module_id(des_module_id)); + + VTR_ASSERT(true == module_manager.valid_module_port_id(src_module_id, src_module_port_id)); + VTR_ASSERT(true == module_manager.valid_module_port_id(des_module_id, des_module_port_id)); + + if (src_module_id == cur_module_id) { + VTR_ASSERT(0 == src_instance_id); + } else { + VTR_ASSERT(src_instance_id < module_manager.num_instance(cur_module_id, src_module_id)); + } + + if (des_module_id == cur_module_id) { + VTR_ASSERT(0 == des_instance_id); + } else { + VTR_ASSERT(des_instance_id < module_manager.num_instance(cur_module_id, des_module_id)); + } + + const BasicPort& src_port = module_manager.module_port(src_module_id, src_module_port_id); + const BasicPort& des_port = module_manager.module_port(des_module_id, des_module_port_id); + + if (src_port.get_width() != des_port.get_width()) { + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Unmatched port size: src_port is %lu while des_port is %lu!\n"); + exit(1); + } + + /* Create a net for each pin */ + for (size_t pin_id = 0; pin_id < src_port.pins().size(); ++pin_id) { + ModuleNetId net = module_manager.module_instance_port_net(cur_module_id, + src_module_id, src_instance_id, + src_module_port_id, src_port.pins()[pin_id]); + if (ModuleNetId::INVALID() == net) { + net = module_manager.create_module_net(cur_module_id); + } + /* Configure the net source */ + module_manager.add_module_net_source(cur_module_id, net, src_module_id, src_instance_id, src_module_port_id, src_port.pins()[pin_id]); + /* Configure the net sink */ + module_manager.add_module_net_sink(cur_module_id, net, des_module_id, des_instance_id, des_module_port_id, des_port.pins()[pin_id]); + } +} /******************************************************************** * TODO: diff --git a/openfpga/src/utils/module_manager_utils.h b/openfpga/src/utils/module_manager_utils.h index fcc95b8ba..0ecdfd282 100644 --- a/openfpga/src/utils/module_manager_utils.h +++ b/openfpga/src/utils/module_manager_utils.h @@ -129,6 +129,15 @@ size_t find_module_num_config_bits_from_child_modules(ModuleManager& module_mana const CircuitModelId& sram_model, const e_config_protocol_type& sram_orgz_type); +void add_module_bus_nets(ModuleManager& module_manager, + const ModuleId& cur_module_id, + const ModuleId& src_module_id, + const size_t& src_instance_id, + const ModulePortId& src_module_port_id, + const ModuleId& des_module_id, + const size_t& des_instance_id, + const ModulePortId& des_module_port_id); + } /* end namespace openfpga */ #endif From 290dd1a8a68cfa893e77d57075a7c6c5023218ad Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 26 May 2020 18:55:55 -0600 Subject: [PATCH 086/180] add frame decoder builder to all the module graph builder except the top-level --- openfpga/src/base/openfpga_naming.cpp | 17 +- openfpga/src/base/openfpga_reserved_words.h | 5 +- openfpga/src/fabric/build_decoder_modules.cpp | 4 +- openfpga/src/fabric/build_device_module.cpp | 6 +- openfpga/src/fabric/build_grid_modules.cpp | 27 +- openfpga/src/fabric/build_grid_modules.h | 2 + openfpga/src/fabric/build_memory_modules.cpp | 6 +- openfpga/src/fabric/build_routing_modules.cpp | 18 +- openfpga/src/fabric/build_routing_modules.h | 3 + openfpga/src/fabric/build_top_module.cpp | 14 +- .../src/fabric/build_top_module_memory.cpp | 3 + openfpga/src/utils/memory_utils.cpp | 4 + openfpga/src/utils/module_manager_utils.cpp | 256 +++++++++++++++++- openfpga/src/utils/module_manager_utils.h | 6 + 14 files changed, 337 insertions(+), 34 deletions(-) diff --git a/openfpga/src/base/openfpga_naming.cpp b/openfpga/src/base/openfpga_naming.cpp index bf82a1d7c..5c9c81eb3 100644 --- a/openfpga/src/base/openfpga_naming.cpp +++ b/openfpga/src/base/openfpga_naming.cpp @@ -798,8 +798,23 @@ std::string generate_sram_port_name(const e_config_protocol_type& sram_orgz_type port_name = std::string("wlb"); } break; + case CONFIG_MEM_FRAME_BASED: + /* Only one input port is required, which is the address port + * + * EN ADDR DATA_IN + * | | | + * v v v + * +---------------------------------+ + * | Frame decoder | + * +---------------------------------+ + * + */ + VTR_ASSERT(port_type == CIRCUIT_MODEL_PORT_INPUT); + port_name = std::string(DECODER_ADDRESS_PORT_NAME); + break; default: - VTR_LOG_ERROR("Invalid type of SRAM organization !\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of SRAM organization !\n"); exit(1); } diff --git a/openfpga/src/base/openfpga_reserved_words.h b/openfpga/src/base/openfpga_reserved_words.h index c556a19b1..132858687 100644 --- a/openfpga/src/base/openfpga_reserved_words.h +++ b/openfpga/src/base/openfpga_reserved_words.h @@ -33,8 +33,9 @@ constexpr char* CONNECTION_BLOCK_MUX_INSTANCE_PREFIX = "mux_"; /* Decoder naming constant strings */ constexpr char* DECODER_ENABLE_PORT_NAME = "enable"; constexpr char* DECODER_ADDRESS_PORT_NAME = "address"; -constexpr char* DECODER_DATA_PORT_NAME = "data"; -constexpr char* DECODER_DATA_INV_PORT_NAME = "data_inv"; +constexpr char* DECODER_DATA_IN_PORT_NAME = "data_in"; +constexpr char* DECODER_DATA_OUT_PORT_NAME = "data_out"; +constexpr char* DECODER_DATA_OUT_INV_PORT_NAME = "data_out_inv"; /* Inverted port naming */ constexpr char* INV_PORT_POSTFIX = "_inv"; diff --git a/openfpga/src/fabric/build_decoder_modules.cpp b/openfpga/src/fabric/build_decoder_modules.cpp index a2accae89..ada36e3e7 100644 --- a/openfpga/src/fabric/build_decoder_modules.cpp +++ b/openfpga/src/fabric/build_decoder_modules.cpp @@ -58,7 +58,7 @@ ModuleId build_frame_memory_decoder_module(ModuleManager& module_manager, BasicPort addr_port(std::string(DECODER_ADDRESS_PORT_NAME), addr_size); module_manager.add_port(module_id, addr_port, ModuleManager::MODULE_INPUT_PORT); /* Add each output port */ - BasicPort data_port(std::string(DECODER_DATA_PORT_NAME), data_size); + BasicPort data_port(std::string(DECODER_DATA_OUT_PORT_NAME), data_size); module_manager.add_port(module_id, data_port, ModuleManager::MODULE_OUTPUT_PORT); /* Data port is registered. It should be outputted as @@ -67,7 +67,7 @@ ModuleId build_frame_memory_decoder_module(ModuleManager& module_manager, module_manager.set_port_is_register(module_id, data_port.get_name(), true); /* Add data_in port */ if (true == decoder_lib.use_data_inv_port(decoder)) { - BasicPort data_inv_port(std::string(DECODER_DATA_INV_PORT_NAME), data_size); + BasicPort data_inv_port(std::string(DECODER_DATA_OUT_INV_PORT_NAME), data_size); module_manager.add_port(module_id, data_inv_port, ModuleManager::MODULE_OUTPUT_PORT); } diff --git a/openfpga/src/fabric/build_device_module.cpp b/openfpga/src/fabric/build_device_module.cpp index 1d65fef7c..ee2547d7d 100644 --- a/openfpga/src/fabric/build_device_module.cpp +++ b/openfpga/src/fabric/build_device_module.cpp @@ -74,7 +74,9 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, openfpga_ctx.arch().config_protocol.type()); /* Build grid and programmable block modules */ - build_grid_modules(module_manager, vpr_device_ctx, + build_grid_modules(module_manager, + decoder_lib, + vpr_device_ctx, openfpga_ctx.vpr_device_annotation(), openfpga_ctx.arch().circuit_lib, openfpga_ctx.mux_lib(), @@ -83,6 +85,7 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, if (true == compress_routing) { build_unique_routing_modules(module_manager, + decoder_lib, vpr_device_ctx, openfpga_ctx.vpr_device_annotation(), openfpga_ctx.device_rr_gsb(), @@ -92,6 +95,7 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, } else { VTR_ASSERT_SAFE(false == compress_routing); build_flatten_routing_modules(module_manager, + decoder_lib, vpr_device_ctx, openfpga_ctx.vpr_device_annotation(), openfpga_ctx.device_rr_gsb(), diff --git a/openfpga/src/fabric/build_grid_modules.cpp b/openfpga/src/fabric/build_grid_modules.cpp index 12090d43d..b189a20fe 100644 --- a/openfpga/src/fabric/build_grid_modules.cpp +++ b/openfpga/src/fabric/build_grid_modules.cpp @@ -226,6 +226,7 @@ void add_primitive_module_fpga_global_io_port(ModuleManager& module_manager, *******************************************************************/ static void build_primitive_block_module(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const VprDeviceAnnotation& device_annotation, const CircuitLibrary& circuit_lib, const e_config_protocol_type& sram_orgz_type, @@ -314,7 +315,7 @@ void build_primitive_block_module(ModuleManager& module_manager, * This is a one-shot addition that covers all the memory modules in this primitive module! */ if (0 < module_manager.configurable_children(primitive_module).size()) { - add_module_nets_memory_config_bus(module_manager, primitive_module, + add_module_nets_memory_config_bus(module_manager, decoder_lib, primitive_module, sram_orgz_type, circuit_lib.design_tech_type(sram_model)); } @@ -799,6 +800,7 @@ void add_module_pb_graph_interc(ModuleManager& module_manager, *******************************************************************/ static void rec_build_logical_tile_modules(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const VprDeviceAnnotation& device_annotation, const CircuitLibrary& circuit_lib, const MuxLibrary& mux_lib, @@ -821,7 +823,8 @@ void rec_build_logical_tile_modules(ModuleManager& module_manager, if (false == is_primitive_pb_type(physical_pb_type)) { for (int ipb = 0; ipb < physical_mode->num_pb_type_children; ++ipb) { /* Go recursive to visit the children */ - rec_build_logical_tile_modules(module_manager, device_annotation, + rec_build_logical_tile_modules(module_manager, decoder_lib, + device_annotation, circuit_lib, mux_lib, sram_orgz_type, sram_model, &(physical_pb_graph_node->child_pb_graph_nodes[physical_mode->index][ipb][0]), @@ -831,7 +834,8 @@ void rec_build_logical_tile_modules(ModuleManager& module_manager, /* For leaf node, a primitive Verilog module will be generated */ if (true == is_primitive_pb_type(physical_pb_type)) { - build_primitive_block_module(module_manager, device_annotation, + build_primitive_block_module(module_manager, decoder_lib, + device_annotation, circuit_lib, sram_orgz_type, sram_model, physical_pb_graph_node, @@ -938,7 +942,7 @@ void rec_build_logical_tile_modules(ModuleManager& module_manager, * This is a one-shot addition that covers all the memory modules in this pb module! */ if (0 < module_manager.configurable_children(pb_module).size()) { - add_module_nets_memory_config_bus(module_manager, pb_module, + add_module_nets_memory_config_bus(module_manager, decoder_lib, pb_module, sram_orgz_type, circuit_lib.design_tech_type(sram_model)); } @@ -955,6 +959,7 @@ void rec_build_logical_tile_modules(ModuleManager& module_manager, *****************************************************************************/ static void build_physical_tile_module(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const CircuitLibrary& circuit_lib, const e_config_protocol_type& sram_orgz_type, const CircuitModelId& sram_model, @@ -1094,7 +1099,7 @@ void build_physical_tile_module(ModuleManager& module_manager, * This is a one-shot addition that covers all the memory modules in this pb module! */ if (0 < module_manager.configurable_children(grid_module).size()) { - add_module_nets_memory_config_bus(module_manager, grid_module, + add_module_nets_memory_config_bus(module_manager, decoder_lib, grid_module, sram_orgz_type, circuit_lib.design_tech_type(sram_model)); } @@ -1114,6 +1119,7 @@ void build_physical_tile_module(ModuleManager& module_manager, * - Only one module for each heterogeneous block ****************************************************************************/ void build_grid_modules(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const CircuitLibrary& circuit_lib, @@ -1140,8 +1146,9 @@ void build_grid_modules(ModuleManager& module_manager, if (nullptr == logical_tile.pb_graph_head) { continue; } - rec_build_logical_tile_modules(module_manager, device_annotation, - circuit_lib, mux_lib, + rec_build_logical_tile_modules(module_manager, decoder_lib, + device_annotation, + circuit_lib, mux_lib, sram_orgz_type, sram_model, logical_tile.pb_graph_head, verbose); @@ -1169,7 +1176,8 @@ void build_grid_modules(ModuleManager& module_manager, std::set io_type_sides = find_physical_io_tile_located_sides(device_ctx.grid, &physical_tile); for (const e_side& io_type_side : io_type_sides) { - build_physical_tile_module(module_manager, circuit_lib, + build_physical_tile_module(module_manager, decoder_lib, + circuit_lib, sram_orgz_type, sram_model, &physical_tile, io_type_side, @@ -1178,7 +1186,8 @@ void build_grid_modules(ModuleManager& module_manager, } } else { /* For CLB and heterogenenous blocks */ - build_physical_tile_module(module_manager, circuit_lib, + build_physical_tile_module(module_manager, decoder_lib, + circuit_lib, sram_orgz_type, sram_model, &physical_tile, NUM_SIDES, diff --git a/openfpga/src/fabric/build_grid_modules.h b/openfpga/src/fabric/build_grid_modules.h index f2a8e967b..53e7f92cd 100644 --- a/openfpga/src/fabric/build_grid_modules.h +++ b/openfpga/src/fabric/build_grid_modules.h @@ -8,6 +8,7 @@ #include "vpr_device_annotation.h" #include "module_manager.h" #include "mux_library.h" +#include "decoder_library.h" /******************************************************************** * Function declaration @@ -17,6 +18,7 @@ namespace openfpga { void build_grid_modules(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const CircuitLibrary& circuit_lib, diff --git a/openfpga/src/fabric/build_memory_modules.cpp b/openfpga/src/fabric/build_memory_modules.cpp index bbdb01fef..f8db73d7a 100644 --- a/openfpga/src/fabric/build_memory_modules.cpp +++ b/openfpga/src/fabric/build_memory_modules.cpp @@ -657,7 +657,7 @@ void build_frame_memory_module(ModuleManager& module_manager, ModulePortId mem_addr_port = module_manager.add_port(mem_module, addr_port, ModuleManager::MODULE_INPUT_PORT); /* Input: Data port */ - BasicPort data_port(std::string(DECODER_DATA_PORT_NAME), data_size); + BasicPort data_port(std::string(DECODER_DATA_IN_PORT_NAME), data_size); ModulePortId mem_data_port = module_manager.add_port(mem_module, data_port, ModuleManager::MODULE_INPUT_PORT); /* Add each output port: port width should match the number of memories */ @@ -700,7 +700,7 @@ void build_frame_memory_module(ModuleManager& module_manager, /* Wire decoder data_out port to sram WL ports */ ModulePortId sram_wl_port = module_manager.find_module_port(sram_mem_module, circuit_lib.port_lib_name(sram_wl_ports[0])); - ModulePortId decoder_data_port = module_manager.find_module_port(decoder_module, std::string(DECODER_DATA_PORT_NAME)); + ModulePortId decoder_data_port = module_manager.find_module_port(decoder_module, std::string(DECODER_DATA_OUT_PORT_NAME)); ModuleNetId wl_net = module_manager.create_module_net(mem_module); /* Source node of the input net is the input of memory module */ module_manager.add_module_net_source(mem_module, wl_net, decoder_module, 0, decoder_data_port, sram_instance); @@ -709,7 +709,7 @@ void build_frame_memory_module(ModuleManager& module_manager, /* Optional: Wire decoder data_out inverted port to sram WLB ports */ if (true == use_data_inv) { ModulePortId sram_wlb_port = module_manager.find_module_port(sram_mem_module, circuit_lib.port_lib_name(sram_wlb_ports[0])); - ModulePortId decoder_data_inv_port = module_manager.find_module_port(decoder_module, std::string(DECODER_DATA_INV_PORT_NAME)); + ModulePortId decoder_data_inv_port = module_manager.find_module_port(decoder_module, std::string(DECODER_DATA_OUT_INV_PORT_NAME)); ModuleNetId wlb_net = module_manager.create_module_net(mem_module); /* Source node of the input net is the input of memory module */ module_manager.add_module_net_source(mem_module, wlb_net, decoder_module, 0, decoder_data_inv_port, sram_instance); diff --git a/openfpga/src/fabric/build_routing_modules.cpp b/openfpga/src/fabric/build_routing_modules.cpp index b00cc5dc5..98a94baa8 100644 --- a/openfpga/src/fabric/build_routing_modules.cpp +++ b/openfpga/src/fabric/build_routing_modules.cpp @@ -329,6 +329,7 @@ void build_switch_block_interc_modules(ModuleManager& module_manager, ********************************************************************/ static void build_switch_block_module(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const VprDeviceAnnotation& device_annotation, const RRGraph& rr_graph, const CircuitLibrary& circuit_lib, @@ -438,7 +439,8 @@ void build_switch_block_module(ModuleManager& module_manager, * This is a one-shot addition that covers all the memory modules in this primitive module! */ if (0 < module_manager.configurable_children(sb_module).size()) { - add_module_nets_memory_config_bus(module_manager, sb_module, + add_module_nets_memory_config_bus(module_manager, decoder_lib, + sb_module, sram_orgz_type, circuit_lib.design_tech_type(sram_model)); } @@ -709,6 +711,7 @@ void build_connection_block_interc_modules(ModuleManager& module_manager, ********************************************************************/ static void build_connection_block_module(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const VprDeviceAnnotation& device_annotation, const RRGraph& rr_graph, const CircuitLibrary& circuit_lib, @@ -846,7 +849,8 @@ void build_connection_block_module(ModuleManager& module_manager, * This is a one-shot addition that covers all the memory modules in this primitive module! */ if (0 < module_manager.configurable_children(cb_module).size()) { - add_module_nets_memory_config_bus(module_manager, cb_module, + add_module_nets_memory_config_bus(module_manager, decoder_lib, + cb_module, sram_orgz_type, circuit_lib.design_tech_type(sram_model)); } @@ -860,6 +864,7 @@ void build_connection_block_module(ModuleManager& module_manager, *******************************************************************/ static void build_flatten_connection_block_modules(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const DeviceRRGSB& device_rr_gsb, @@ -882,6 +887,7 @@ void build_flatten_connection_block_modules(ModuleManager& module_manager, continue; } build_connection_block_module(module_manager, + decoder_lib, device_annotation, device_ctx.rr_graph, circuit_lib, @@ -902,6 +908,7 @@ void build_flatten_connection_block_modules(ModuleManager& module_manager, * 2. Switch blocks *******************************************************************/ void build_flatten_routing_modules(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const DeviceRRGSB& device_rr_gsb, @@ -922,6 +929,7 @@ void build_flatten_routing_modules(ModuleManager& module_manager, continue; } build_switch_block_module(module_manager, + decoder_lib, device_annotation, device_ctx.rr_graph, circuit_lib, @@ -932,6 +940,7 @@ void build_flatten_routing_modules(ModuleManager& module_manager, } build_flatten_connection_block_modules(module_manager, + decoder_lib, device_ctx, device_annotation, device_rr_gsb, @@ -941,6 +950,7 @@ void build_flatten_routing_modules(ModuleManager& module_manager, verbose); build_flatten_connection_block_modules(module_manager, + decoder_lib, device_ctx, device_annotation, device_rr_gsb, @@ -962,6 +972,7 @@ void build_flatten_routing_modules(ModuleManager& module_manager, * the option compact_routing_hierarchy is turned on!!! *******************************************************************/ void build_unique_routing_modules(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const DeviceRRGSB& device_rr_gsb, @@ -976,6 +987,7 @@ void build_unique_routing_modules(ModuleManager& module_manager, for (size_t isb = 0; isb < device_rr_gsb.get_num_sb_unique_module(); ++isb) { const RRGSB& unique_mirror = device_rr_gsb.get_sb_unique_module(isb); build_switch_block_module(module_manager, + decoder_lib, device_annotation, device_ctx.rr_graph, circuit_lib, @@ -989,6 +1001,7 @@ void build_unique_routing_modules(ModuleManager& module_manager, const RRGSB& unique_mirror = device_rr_gsb.get_cb_unique_module(CHANX, icb); build_connection_block_module(module_manager, + decoder_lib, device_annotation, device_ctx.rr_graph, circuit_lib, @@ -1002,6 +1015,7 @@ void build_unique_routing_modules(ModuleManager& module_manager, const RRGSB& unique_mirror = device_rr_gsb.get_cb_unique_module(CHANY, icb); build_connection_block_module(module_manager, + decoder_lib, device_annotation, device_ctx.rr_graph, circuit_lib, diff --git a/openfpga/src/fabric/build_routing_modules.h b/openfpga/src/fabric/build_routing_modules.h index d8eb09784..d82ce3a69 100644 --- a/openfpga/src/fabric/build_routing_modules.h +++ b/openfpga/src/fabric/build_routing_modules.h @@ -8,6 +8,7 @@ #include "vpr_device_annotation.h" #include "device_rr_gsb.h" #include "mux_library.h" +#include "decoder_library.h" #include "circuit_library.h" #include "module_manager.h" @@ -19,6 +20,7 @@ namespace openfpga { void build_flatten_routing_modules(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const DeviceRRGSB& device_rr_gsb, @@ -28,6 +30,7 @@ void build_flatten_routing_modules(ModuleManager& module_manager, const bool& verbose); void build_unique_routing_modules(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const DeviceRRGSB& device_rr_gsb, diff --git a/openfpga/src/fabric/build_top_module.cpp b/openfpga/src/fabric/build_top_module.cpp index 112b32a52..6124333c0 100644 --- a/openfpga/src/fabric/build_top_module.cpp +++ b/openfpga/src/fabric/build_top_module.cpp @@ -361,6 +361,13 @@ void build_top_module(ModuleManager& module_manager, */ add_module_gpio_ports_from_child_modules(module_manager, top_module); + /* Organize the list of memory modules and instances */ + organize_top_module_memory_modules(module_manager, top_module, + circuit_lib, sram_orgz_type, sram_model, + grids, grid_instance_ids, + device_rr_gsb, sb_instance_ids, cb_instance_ids, + compact_routing_hierarchy); + /* Add shared SRAM ports from the sub-modules under this Verilog module * This is a much easier job after adding sub modules (instances), * we just need to find all the I/O ports from the child modules and build a list of it @@ -379,13 +386,6 @@ void build_top_module(ModuleManager& module_manager, add_sram_ports_to_module_manager(module_manager, top_module, circuit_lib, sram_model, sram_orgz_type, module_num_config_bits); } - /* Organize the list of memory modules and instances */ - organize_top_module_memory_modules(module_manager, top_module, - circuit_lib, sram_orgz_type, sram_model, - grids, grid_instance_ids, - device_rr_gsb, sb_instance_ids, cb_instance_ids, - compact_routing_hierarchy); - /* Add module nets to connect memory cells inside * This is a one-shot addition that covers all the memory modules in this pb module! */ diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index 21f7a5e6c..28c003957 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -421,6 +421,9 @@ void add_top_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, case CONFIG_MEM_MEMORY_BANK: /* TODO: */ break; + case CONFIG_MEM_FRAME_BASED: + /* TODO: */ + break; default: VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid type of SRAM organization!\n"); diff --git a/openfpga/src/utils/memory_utils.cpp b/openfpga/src/utils/memory_utils.cpp index 8452626d8..ef0433502 100644 --- a/openfpga/src/utils/memory_utils.cpp +++ b/openfpga/src/utils/memory_utils.cpp @@ -337,6 +337,10 @@ std::vector generate_sram_port_names(const CircuitLibrary& circuit_ } break; } + case CONFIG_MEM_FRAME_BASED: { + model_port_types.push_back(CIRCUIT_MODEL_PORT_INPUT); + break; + } default: VTR_LOG_ERROR("Invalid type of SRAM organization !\n"); exit(1); diff --git a/openfpga/src/utils/module_manager_utils.cpp b/openfpga/src/utils/module_manager_utils.cpp index 44e13c65a..2819cc0b4 100644 --- a/openfpga/src/utils/module_manager_utils.cpp +++ b/openfpga/src/utils/module_manager_utils.cpp @@ -18,7 +18,9 @@ #include "memory_utils.h" #include "pb_type_utils.h" +#include "build_decoder_modules.h" #include "circuit_library_utils.h" +#include "decoder_library_utils.h" #include "module_manager_utils.h" /* begin namespace openfpga */ @@ -173,6 +175,11 @@ void add_formal_verification_sram_ports_to_module_manager(ModuleManager& module_ * The other two ports are optional: BLB and WLB * Note that the constraints are correletated to the checking rules * in check_circuit_library() + * 4. Frame-based memory: + * - An Enable signal + * - An address port, whose size depends on the number of config bits + * and the maximum size of address ports of configurable children + * - An data_in port (single-bit) ********************************************************************/ void add_sram_ports_to_module_manager(ModuleManager& module_manager, const ModuleId& module_id, @@ -214,6 +221,18 @@ void add_sram_ports_to_module_manager(ModuleManager& module_manager, } break; } + case CONFIG_MEM_FRAME_BASED: { + BasicPort en_port(std::string(DECODER_ENABLE_PORT_NAME), 1); + module_manager.add_port(module_id, en_port, ModuleManager::MODULE_INPUT_PORT); + + BasicPort addr_port(std::string(DECODER_ADDRESS_PORT_NAME), num_config_bits); + module_manager.add_port(module_id, addr_port, ModuleManager::MODULE_INPUT_PORT); + + BasicPort din_port(std::string(DECODER_DATA_IN_PORT_NAME), 1); + module_manager.add_port(module_id, din_port, ModuleManager::MODULE_INPUT_PORT); + + break; + } default: VTR_LOG_ERROR("Invalid type of SRAM organization !\n"); exit(1); @@ -750,6 +769,194 @@ void add_module_nets_cmos_memory_chain_config_bus(ModuleManager& module_manager, } } +/******************************************************************** + * This function will + * - Add a frame decoder to the parent module + * - If the decoder exists in the library, we use the module + * - If the decoder does not exist, we create a new module and use it + * - create nets for the following types of connections: + * - Connect the EN signal, first few bits of address of parent module + * to the frame decoder inputs + * - Connect the enable (EN) port of memory modules under the parent module + * to the frame decoder outputs + * - Connect the data_in (Din) of parent module to the data_in of the all + * the memory modules + * + * EN ADDR[X - 1: X - log(N)/log2] + * | | + * v v + * +--------------------------------------------+ + * | Frame-based decoder | + * | | + * | Data out | + * +--------------------------------------------+ + * | + * +-------------+--------------------+ + * | | | + * Din | Din | Din | + * | | | | | | + * v v v v v v + * +--------+ +--------+ +--------+ + * | Memory | | Memory | ... | Memory | + * | Module | | Module | | Module | + * | [0] | | [1] | | [N-1] | + * +--------+ +--------+ +--------+ + * ^ ^ ^ + * | | | + * +-------------+--------------------+ + * | + * ADDR[X - log(N)/log2 - 1: 0] + * + * Note: + * - X is the port size of address port of the parent module + * - the address port of child memory modules may be smaller than + * X - log(N)/log2. In such case, we will drop the MSBs until it fit + * + *********************************************************************/ +void add_module_nets_cmos_memory_frame_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, + const ModuleId& parent_module) { + std::vector configurable_children = module_manager.configurable_children(parent_module); + + /* Find the decoder specification */ + size_t addr_size = find_mux_local_decoder_addr_size(configurable_children.size()); + /* Data input should match the WL (data_in) of a SRAM */ + size_t data_size = configurable_children.size(); + + /* Search the decoder library and try to find one + * If not found, create a new module and add it to the module manager + */ + DecoderId decoder_id = decoder_lib.find_decoder(addr_size, data_size, true, true, false); + if (DecoderId::INVALID() == decoder_id) { + decoder_id = decoder_lib.add_decoder(addr_size, data_size, true, true, false); + } + VTR_ASSERT(DecoderId::INVALID() != decoder_id); + + /* Create a module if not existed yet */ + std::string decoder_module_name = generate_frame_memory_decoder_subckt_name(addr_size, data_size); + ModuleId decoder_module = module_manager.find_module(decoder_module_name); + if (ModuleId::INVALID() == decoder_module) { + decoder_module = build_frame_memory_decoder_module(module_manager, + decoder_lib, + decoder_id); + } + VTR_ASSERT(ModuleId::INVALID() != decoder_module); + + /* Instanciate the decoder module here */ + VTR_ASSERT(0 == module_manager.num_instance(parent_module, decoder_module)); + module_manager.add_child_module(parent_module, decoder_module); + + /* Connect the enable (EN) port of memory modules under the parent module + * to the frame decoder inputs + */ + ModulePortId parent_en_port = module_manager.find_module_port(parent_module, std::string(DECODER_ENABLE_PORT_NAME)); + ModulePortId decoder_en_port = module_manager.find_module_port(decoder_module, std::string(DECODER_ENABLE_PORT_NAME)); + add_module_bus_nets(module_manager, parent_module, + parent_module, 0, parent_en_port, + decoder_module, 0, decoder_en_port); + + /* Connect the address port of the parent module to the frame decoder address port + * Note that we only connect to the first few bits of address port + */ + ModulePortId parent_addr_port = module_manager.find_module_port(parent_module, std::string(DECODER_ADDRESS_PORT_NAME)); + ModulePortId decoder_addr_port = module_manager.find_module_port(decoder_module, std::string(DECODER_ADDRESS_PORT_NAME)); + BasicPort parent_addr_port_info = module_manager.module_port(parent_module, parent_addr_port); + BasicPort decoder_addr_port_info = module_manager.module_port(decoder_module, decoder_addr_port); + for (size_t ipin = 0; ipin < decoder_addr_port_info.get_width(); ++ipin) { + ModuleNetId net = module_manager.module_instance_port_net(parent_module, + parent_module, 0, + parent_addr_port, + parent_addr_port_info.get_msb() - ipin); + if (ModuleNetId::INVALID() == net) { + net = module_manager.create_module_net(parent_module); + /* Configure the net source */ + module_manager.add_module_net_source(parent_module, net, + parent_module, 0, + parent_addr_port, + parent_addr_port_info.get_msb() - ipin); + } + /* Configure the net sink */ + module_manager.add_module_net_sink(parent_module, net, + decoder_module, 0, + decoder_addr_port, + decoder_addr_port_info.get_msb() - ipin); + } + + /* Connect the address port of the parent module to the address port of configurable children + * Note that we only connect to the last few bits of address port + */ + for (size_t mem_index = 0; mem_index < module_manager.configurable_children(parent_module).size(); ++mem_index) { + ModuleId child_module = module_manager.configurable_children(parent_module)[mem_index]; + ModulePortId child_addr_port = module_manager.find_module_port(child_module, std::string(DECODER_ADDRESS_PORT_NAME)); + BasicPort child_addr_port_info = module_manager.module_port(child_module, child_addr_port); + for (size_t ipin = 0; ipin < child_addr_port_info.get_width(); ++ipin) { + ModuleNetId net = module_manager.module_instance_port_net(parent_module, + parent_module, 0, + parent_addr_port, + parent_addr_port_info.get_lsb() + ipin); + if (ModuleNetId::INVALID() == net) { + net = module_manager.create_module_net(parent_module); + /* Configure the net source */ + module_manager.add_module_net_source(parent_module, net, + parent_module, 0, + parent_addr_port, + parent_addr_port_info.get_lsb() + ipin); + } + /* Configure the net sink */ + module_manager.add_module_net_sink(parent_module, net, + child_module, 0, + child_addr_port, + child_addr_port_info.get_lsb() + ipin); + } + } + + /* Connect the data_in (Din) of parent module to the data_in of the all + * the memory modules + */ + ModulePortId parent_din_port = module_manager.find_module_port(parent_module, std::string(DECODER_DATA_IN_PORT_NAME)); + for (size_t mem_index = 0; mem_index < module_manager.configurable_children(parent_module).size(); ++mem_index) { + ModuleId child_module = module_manager.configurable_children(parent_module)[mem_index]; + ModulePortId child_din_port = module_manager.find_module_port(child_module, std::string(DECODER_DATA_IN_PORT_NAME)); + add_module_bus_nets(module_manager, parent_module, + parent_module, 0, parent_din_port, + child_module, 0, child_din_port); + } + + /* Connect the data_out port of the decoder module + * to the enable port of configurable children + */ + ModulePortId decoder_dout_port = module_manager.find_module_port(decoder_module, std::string(DECODER_DATA_OUT_PORT_NAME)); + BasicPort decoder_dout_port_info = module_manager.module_port(decoder_module, decoder_dout_port); + VTR_ASSERT(decoder_dout_port_info.get_width() == module_manager.configurable_children(parent_module).size()); + for (size_t mem_index = 0; mem_index < module_manager.configurable_children(parent_module).size(); ++mem_index) { + ModuleId child_module = module_manager.configurable_children(parent_module)[mem_index]; + ModulePortId child_en_port = module_manager.find_module_port(child_module, std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort child_en_port_info = module_manager.module_port(child_module, child_en_port); + for (size_t ipin = 0; ipin < child_en_port_info.get_width(); ++ipin) { + ModuleNetId net = module_manager.module_instance_port_net(parent_module, + decoder_module, 0, + decoder_dout_port, + decoder_dout_port_info.pins()[mem_index]); + if (ModuleNetId::INVALID() == net) { + net = module_manager.create_module_net(parent_module); + /* Configure the net source */ + module_manager.add_module_net_source(parent_module, net, + decoder_module, 0, + decoder_dout_port, + decoder_dout_port_info.pins()[mem_index]); + } + /* Configure the net sink */ + module_manager.add_module_net_sink(parent_module, net, + child_module, 0, + child_en_port, + child_en_port_info.pins()[ipin]); + } + } + + /* Add the decoder as the last configurable children */ + module_manager.add_configurable_child(parent_module, decoder_module, 0); +} + /********************************************************************* * Add the port-to-port connection between all the memory modules * and their parent module @@ -796,6 +1003,7 @@ void add_module_nets_cmos_memory_chain_config_bus(ModuleManager& module_manager, **********************************************************************/ static void add_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type) { switch (sram_orgz_type) { @@ -809,6 +1017,10 @@ void add_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, case CONFIG_MEM_MEMORY_BANK: /* TODO: */ break; + case CONFIG_MEM_FRAME_BASED: + /* TODO: */ + add_module_nets_cmos_memory_frame_config_bus(module_manager, decoder_lib, parent_module); + break; default: VTR_LOG_ERROR("Invalid type of SRAM organization!\n"); exit(1); @@ -871,12 +1083,14 @@ void add_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, * and its child module (logic_module and memory_module) is created! *******************************************************************/ void add_module_nets_memory_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type, const e_circuit_model_design_tech& mem_tech) { switch (mem_tech) { case CIRCUIT_MODEL_DESIGN_CMOS: - add_module_nets_cmos_memory_config_bus(module_manager, parent_module, + add_module_nets_cmos_memory_config_bus(module_manager, decoder_lib, + parent_module, sram_orgz_type); break; case CIRCUIT_MODEL_DESIGN_RRAM: @@ -1219,10 +1433,38 @@ size_t find_module_num_config_bits_from_child_modules(ModuleManager& module_mana const e_config_protocol_type& sram_orgz_type) { size_t num_config_bits = 0; - /* Iterate over the child modules */ - for (const ModuleId& child : module_manager.child_modules(module_id)) { - num_config_bits += find_module_num_config_bits(module_manager, child, circuit_lib, sram_model, sram_orgz_type); - } + switch (sram_orgz_type) { + case CONFIG_MEM_STANDALONE: + case CONFIG_MEM_SCAN_CHAIN: + case CONFIG_MEM_MEMORY_BANK: { + /* For scan-chain, standalone and memory bank configuration protocol + * The number of configuration bits is the sum of configuration bits + * per configurable children + */ + for (const ModuleId& child : module_manager.configurable_children(module_id)) { + num_config_bits += find_module_num_config_bits(module_manager, child, circuit_lib, sram_model, sram_orgz_type); + } + break; + } + case CONFIG_MEM_FRAME_BASED: { + /* For frame-based configuration protocol + * The number of configuration bits is the sum of + * - the maximum of configuration bits among configurable children + * - and the number of configurable children + */ + for (const ModuleId& child : module_manager.configurable_children(module_id)) { + size_t temp_num_config_bits = find_module_num_config_bits(module_manager, child, circuit_lib, sram_model, sram_orgz_type); + num_config_bits = std::max((int)temp_num_config_bits, (int)num_config_bits); + } + + num_config_bits += find_mux_local_decoder_addr_size(module_manager.configurable_children(module_id).size()); + + break; + } + default: + VTR_LOG_ERROR("Invalid type of SRAM organization !\n"); + exit(1); + } return num_config_bits; } @@ -1280,9 +1522,9 @@ void add_module_bus_nets(ModuleManager& module_manager, src_module_port_id, src_port.pins()[pin_id]); if (ModuleNetId::INVALID() == net) { net = module_manager.create_module_net(cur_module_id); + /* Configure the net source */ + module_manager.add_module_net_source(cur_module_id, net, src_module_id, src_instance_id, src_module_port_id, src_port.pins()[pin_id]); } - /* Configure the net source */ - module_manager.add_module_net_source(cur_module_id, net, src_module_id, src_instance_id, src_module_port_id, src_port.pins()[pin_id]); /* Configure the net sink */ module_manager.add_module_net_sink(cur_module_id, net, des_module_id, des_instance_id, des_module_port_id, des_port.pins()[pin_id]); } diff --git a/openfpga/src/utils/module_manager_utils.h b/openfpga/src/utils/module_manager_utils.h index 0ecdfd282..d52727a40 100644 --- a/openfpga/src/utils/module_manager_utils.h +++ b/openfpga/src/utils/module_manager_utils.h @@ -20,6 +20,7 @@ #include "circuit_types.h" #include "circuit_library.h" +#include "decoder_library.h" #include "module_manager.h" #include "vpr_device_annotation.h" @@ -94,7 +95,12 @@ void add_module_nets_cmos_memory_chain_config_bus(ModuleManager& module_manager, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type); +void add_module_nets_cmos_memory_frame_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, + const ModuleId& parent_module); + void add_module_nets_memory_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type, const e_circuit_model_design_tech& mem_tech); From ed2325ec9e696d1c0c84a6c0dcc3010b39d4f38c Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 26 May 2020 19:34:45 -0600 Subject: [PATCH 087/180] add frame decoder build-up to top-level module --- openfpga/src/fabric/build_device_module.cpp | 4 +++- openfpga/src/fabric/build_top_module.cpp | 4 +++- openfpga/src/fabric/build_top_module.h | 2 ++ openfpga/src/fabric/build_top_module_memory.cpp | 6 +++++- openfpga/src/fabric/build_top_module_memory.h | 2 ++ 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/openfpga/src/fabric/build_device_module.cpp b/openfpga/src/fabric/build_device_module.cpp index ee2547d7d..4b2375057 100644 --- a/openfpga/src/fabric/build_device_module.cpp +++ b/openfpga/src/fabric/build_device_module.cpp @@ -105,7 +105,9 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, } /* Build FPGA fabric top-level module */ - build_top_module(module_manager, io_location_map, + build_top_module(module_manager, + io_location_map, + decoder_lib, openfpga_ctx.arch().circuit_lib, vpr_device_ctx.grid, vpr_device_ctx.rr_graph, diff --git a/openfpga/src/fabric/build_top_module.cpp b/openfpga/src/fabric/build_top_module.cpp index 6124333c0..072548807 100644 --- a/openfpga/src/fabric/build_top_module.cpp +++ b/openfpga/src/fabric/build_top_module.cpp @@ -311,6 +311,7 @@ vtr::Matrix add_top_module_connection_block_instances(ModuleManager& mod *******************************************************************/ void build_top_module(ModuleManager& module_manager, IoLocationMap& io_location_map, + DecoderLibrary& decoder_lib, const CircuitLibrary& circuit_lib, const DeviceGrid& grids, const RRGraph& rr_graph, @@ -390,7 +391,8 @@ void build_top_module(ModuleManager& module_manager, * This is a one-shot addition that covers all the memory modules in this pb module! */ if (0 < module_manager.configurable_children(top_module).size()) { - add_top_module_nets_memory_config_bus(module_manager, top_module, + add_top_module_nets_memory_config_bus(module_manager, decoder_lib, + top_module, sram_orgz_type, circuit_lib.design_tech_type(sram_model)); } } diff --git a/openfpga/src/fabric/build_top_module.h b/openfpga/src/fabric/build_top_module.h index 4ced0735b..d64de2755 100644 --- a/openfpga/src/fabric/build_top_module.h +++ b/openfpga/src/fabric/build_top_module.h @@ -11,6 +11,7 @@ #include "rr_graph_obj.h" #include "device_rr_gsb.h" #include "circuit_library.h" +#include "decoder_library.h" #include "tile_direct.h" #include "arch_direct.h" #include "module_manager.h" @@ -25,6 +26,7 @@ namespace openfpga { void build_top_module(ModuleManager& module_manager, IoLocationMap& io_location_map, + DecoderLibrary& decoder_lib, const CircuitLibrary& circuit_lib, const DeviceGrid& grids, const RRGraph& rr_graph, diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index 28c003957..c488599a9 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -408,6 +408,7 @@ void organize_top_module_memory_modules(ModuleManager& module_manager, **********************************************************************/ static void add_top_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type) { switch (sram_orgz_type) { @@ -423,6 +424,7 @@ void add_top_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, break; case CONFIG_MEM_FRAME_BASED: /* TODO: */ + add_module_nets_cmos_memory_frame_config_bus(module_manager, decoder_lib, parent_module); break; default: VTR_LOGF_ERROR(__FILE__, __LINE__, @@ -464,12 +466,14 @@ void add_top_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, * and its child module (logic_module and memory_module) is created! *******************************************************************/ void add_top_module_nets_memory_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type, const e_circuit_model_design_tech& mem_tech) { switch (mem_tech) { case CIRCUIT_MODEL_DESIGN_CMOS: - add_top_module_nets_cmos_memory_config_bus(module_manager, parent_module, + add_top_module_nets_cmos_memory_config_bus(module_manager, decoder_lib, + parent_module, sram_orgz_type); break; case CIRCUIT_MODEL_DESIGN_RRAM: diff --git a/openfpga/src/fabric/build_top_module_memory.h b/openfpga/src/fabric/build_top_module_memory.h index dfa9a5c78..1d0295b87 100644 --- a/openfpga/src/fabric/build_top_module_memory.h +++ b/openfpga/src/fabric/build_top_module_memory.h @@ -11,6 +11,7 @@ #include "module_manager.h" #include "circuit_types.h" #include "circuit_library.h" +#include "decoder_library.h" #include "device_grid.h" #include "device_rr_gsb.h" @@ -34,6 +35,7 @@ void organize_top_module_memory_modules(ModuleManager& module_manager, const bool& compact_routing_hierarchy); void add_top_module_nets_memory_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type, const e_circuit_model_design_tech& mem_tech); From c696e3d20f8fd063ba167ff8cbd855fd8287a868 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Tue, 26 May 2020 20:01:02 -0600 Subject: [PATCH 088/180] refine frame-based memory addition to compact the area --- .../src/fabric/build_top_module_memory.cpp | 1 - openfpga/src/utils/module_manager_utils.cpp | 100 ++++++++++++++++-- 2 files changed, 91 insertions(+), 10 deletions(-) diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index c488599a9..c15070488 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -423,7 +423,6 @@ void add_top_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, /* TODO: */ break; case CONFIG_MEM_FRAME_BASED: - /* TODO: */ add_module_nets_cmos_memory_frame_config_bus(module_manager, decoder_lib, parent_module); break; default: diff --git a/openfpga/src/utils/module_manager_utils.cpp b/openfpga/src/utils/module_manager_utils.cpp index 2819cc0b4..27231aaf3 100644 --- a/openfpga/src/utils/module_manager_utils.cpp +++ b/openfpga/src/utils/module_manager_utils.cpp @@ -769,6 +769,58 @@ void add_module_nets_cmos_memory_chain_config_bus(ModuleManager& module_manager, } } +/******************************************************************** + * This function will create nets for the following types of connections: + * - Connect the enable signal to the EN of memory module + * - Connect the address port to the address port of memory module + * - Connect the data_in (Din) to the data_in of the memory module + * + * EN ADDR DATA_IN + * | | | + * v v v + * +-----------------------------+ + * | Memory Module | + * | [0] | + * | | + * +-----------------------------+ + * + * Note: + * - This function is ONLY applicable to single configurable child case!!! + * + *********************************************************************/ +static +void add_module_nets_cmos_memory_frame_short_config_bus(ModuleManager& module_manager, + const ModuleId& parent_module) { + std::vector configurable_children = module_manager.configurable_children(parent_module); + + VTR_ASSERT(1 == configurable_children.size()); + ModuleId child_module = configurable_children[0]; + + /* Connect the enable (EN) port of the parent module + * to the EN port of memory module + */ + ModulePortId parent_en_port = module_manager.find_module_port(parent_module, std::string(DECODER_ENABLE_PORT_NAME)); + ModulePortId child_en_port = module_manager.find_module_port(child_module, std::string(DECODER_ENABLE_PORT_NAME)); + add_module_bus_nets(module_manager, parent_module, + parent_module, 0, parent_en_port, + child_module, 0, child_en_port); + + /* Connect the address port of the parent module to the child module address port */ + ModulePortId parent_addr_port = module_manager.find_module_port(parent_module, std::string(DECODER_ADDRESS_PORT_NAME)); + ModulePortId child_addr_port = module_manager.find_module_port(child_module, std::string(DECODER_ADDRESS_PORT_NAME)); + add_module_bus_nets(module_manager, parent_module, + parent_module, 0, parent_addr_port, + child_module, 0, child_addr_port); + + /* Connect the data_in (Din) of parent module to the data_in of the memory module + */ + ModulePortId parent_din_port = module_manager.find_module_port(parent_module, std::string(DECODER_DATA_IN_PORT_NAME)); + ModulePortId child_din_port = module_manager.find_module_port(child_module, std::string(DECODER_DATA_IN_PORT_NAME)); + add_module_bus_nets(module_manager, parent_module, + parent_module, 0, parent_din_port, + child_module, 0, child_din_port); +} + /******************************************************************** * This function will * - Add a frame decoder to the parent module @@ -811,11 +863,13 @@ void add_module_nets_cmos_memory_chain_config_bus(ModuleManager& module_manager, * - X is the port size of address port of the parent module * - the address port of child memory modules may be smaller than * X - log(N)/log2. In such case, we will drop the MSBs until it fit + * - This function is only applicable to 2+ configurable children!!! * *********************************************************************/ -void add_module_nets_cmos_memory_frame_config_bus(ModuleManager& module_manager, - DecoderLibrary& decoder_lib, - const ModuleId& parent_module) { +static +void add_module_nets_cmos_memory_frame_decoder_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, + const ModuleId& parent_module) { std::vector configurable_children = module_manager.configurable_children(parent_module); /* Find the decoder specification */ @@ -885,7 +939,7 @@ void add_module_nets_cmos_memory_frame_config_bus(ModuleManager& module_manager, /* Connect the address port of the parent module to the address port of configurable children * Note that we only connect to the last few bits of address port */ - for (size_t mem_index = 0; mem_index < module_manager.configurable_children(parent_module).size(); ++mem_index) { + for (size_t mem_index = 0; mem_index < configurable_children.size(); ++mem_index) { ModuleId child_module = module_manager.configurable_children(parent_module)[mem_index]; ModulePortId child_addr_port = module_manager.find_module_port(child_module, std::string(DECODER_ADDRESS_PORT_NAME)); BasicPort child_addr_port_info = module_manager.module_port(child_module, child_addr_port); @@ -915,7 +969,7 @@ void add_module_nets_cmos_memory_frame_config_bus(ModuleManager& module_manager, */ ModulePortId parent_din_port = module_manager.find_module_port(parent_module, std::string(DECODER_DATA_IN_PORT_NAME)); for (size_t mem_index = 0; mem_index < module_manager.configurable_children(parent_module).size(); ++mem_index) { - ModuleId child_module = module_manager.configurable_children(parent_module)[mem_index]; + ModuleId child_module = configurable_children[mem_index]; ModulePortId child_din_port = module_manager.find_module_port(child_module, std::string(DECODER_DATA_IN_PORT_NAME)); add_module_bus_nets(module_manager, parent_module, parent_module, 0, parent_din_port, @@ -927,9 +981,9 @@ void add_module_nets_cmos_memory_frame_config_bus(ModuleManager& module_manager, */ ModulePortId decoder_dout_port = module_manager.find_module_port(decoder_module, std::string(DECODER_DATA_OUT_PORT_NAME)); BasicPort decoder_dout_port_info = module_manager.module_port(decoder_module, decoder_dout_port); - VTR_ASSERT(decoder_dout_port_info.get_width() == module_manager.configurable_children(parent_module).size()); - for (size_t mem_index = 0; mem_index < module_manager.configurable_children(parent_module).size(); ++mem_index) { - ModuleId child_module = module_manager.configurable_children(parent_module)[mem_index]; + VTR_ASSERT(decoder_dout_port_info.get_width() == configurable_children.size()); + for (size_t mem_index = 0; mem_index < configurable_children.size(); ++mem_index) { + ModuleId child_module = configurable_children[mem_index]; ModulePortId child_en_port = module_manager.find_module_port(child_module, std::string(DECODER_ENABLE_PORT_NAME)); BasicPort child_en_port_info = module_manager.module_port(child_module, child_en_port); for (size_t ipin = 0; ipin < child_en_port_info.get_width(); ++ipin) { @@ -957,6 +1011,29 @@ void add_module_nets_cmos_memory_frame_config_bus(ModuleManager& module_manager, module_manager.add_configurable_child(parent_module, decoder_module, 0); } +/********************************************************************* + * Top-level function to add nets for frame-based memories + * Add nets depending on the need + * - If there is no configurable child, return directly. + * - If there is only one configurable child, short wire the EN, ADDR and DATA_IN to it + * - If there are more than two configurable childern, add a decoder and build interconnection + * between it and the children + **********************************************************************/ +void add_module_nets_cmos_memory_frame_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, + const ModuleId& parent_module) { + if (0 == module_manager.configurable_children(parent_module).size()) { + return; + } + + if (1 == module_manager.configurable_children(parent_module).size()) { + add_module_nets_cmos_memory_frame_short_config_bus(module_manager, parent_module); + } else { + VTR_ASSERT (1 < module_manager.configurable_children(parent_module).size()); + add_module_nets_cmos_memory_frame_decoder_config_bus(module_manager, decoder_lib, parent_module); + } +} + /********************************************************************* * Add the port-to-port connection between all the memory modules * and their parent module @@ -1457,7 +1534,12 @@ size_t find_module_num_config_bits_from_child_modules(ModuleManager& module_mana num_config_bits = std::max((int)temp_num_config_bits, (int)num_config_bits); } - num_config_bits += find_mux_local_decoder_addr_size(module_manager.configurable_children(module_id).size()); + /* If there are more than 2 configurable children, we need a decoder + * Otherwise, we can just short wire the address port to the children + */ + if (1 < module_manager.configurable_children(module_id).size()) { + num_config_bits += find_mux_local_decoder_addr_size(module_manager.configurable_children(module_id).size()); + } break; } From 5c5a044c68a9af946fe68e79e23335718d34e671 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 27 May 2020 14:25:06 -0600 Subject: [PATCH 089/180] add architecture decoder (for frame-based config memory) to Verilog writer --- openfpga/src/base/openfpga_verilog.cpp | 1 + openfpga/src/fpga_verilog/verilog_api.cpp | 3 +- openfpga/src/fpga_verilog/verilog_api.h | 2 + openfpga/src/fpga_verilog/verilog_constants.h | 1 + .../src/fpga_verilog/verilog_decoders.cpp | 178 +++++++++++++++++- openfpga/src/fpga_verilog/verilog_decoders.h | 7 + .../src/fpga_verilog/verilog_submodule.cpp | 7 + openfpga/src/fpga_verilog/verilog_submodule.h | 2 + 8 files changed, 198 insertions(+), 3 deletions(-) diff --git a/openfpga/src/base/openfpga_verilog.cpp b/openfpga/src/base/openfpga_verilog.cpp index 481bd2866..c67c270eb 100644 --- a/openfpga/src/base/openfpga_verilog.cpp +++ b/openfpga/src/base/openfpga_verilog.cpp @@ -48,6 +48,7 @@ int write_fabric_verilog(OpenfpgaContext& openfpga_ctx, openfpga_ctx.mutable_verilog_netlists(), openfpga_ctx.arch().circuit_lib, openfpga_ctx.mux_lib(), + openfpga_ctx.decoder_lib(), g_vpr_ctx.device(), openfpga_ctx.vpr_device_annotation(), openfpga_ctx.device_rr_gsb(), diff --git a/openfpga/src/fpga_verilog/verilog_api.cpp b/openfpga/src/fpga_verilog/verilog_api.cpp index 06ef0e58e..2f92156fb 100644 --- a/openfpga/src/fpga_verilog/verilog_api.cpp +++ b/openfpga/src/fpga_verilog/verilog_api.cpp @@ -54,6 +54,7 @@ void fpga_fabric_verilog(ModuleManager& module_manager, NetlistManager& netlist_manager, const CircuitLibrary& circuit_lib, const MuxLibrary& mux_lib, + const DecoderLibrary& decoder_lib, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const DeviceRRGSB& device_rr_gsb, @@ -90,7 +91,7 @@ void fpga_fabric_verilog(ModuleManager& module_manager, * Without the modules in the module manager, core logic generation is not possible!!! */ print_verilog_submodule(module_manager, netlist_manager, - mux_lib, circuit_lib, + mux_lib, decoder_lib, circuit_lib, submodule_dir_path, options); diff --git a/openfpga/src/fpga_verilog/verilog_api.h b/openfpga/src/fpga_verilog/verilog_api.h index 301e68b3e..3076beb47 100644 --- a/openfpga/src/fpga_verilog/verilog_api.h +++ b/openfpga/src/fpga_verilog/verilog_api.h @@ -8,6 +8,7 @@ #include #include #include "mux_library.h" +#include "decoder_library.h" #include "circuit_library.h" #include "vpr_context.h" #include "vpr_device_annotation.h" @@ -32,6 +33,7 @@ void fpga_fabric_verilog(ModuleManager& module_manager, NetlistManager& netlist_manager, const CircuitLibrary& circuit_lib, const MuxLibrary& mux_lib, + const DecoderLibrary& decoder_lib, const DeviceContext& device_ctx, const VprDeviceAnnotation& device_annotation, const DeviceRRGSB& device_rr_gsb, diff --git a/openfpga/src/fpga_verilog/verilog_constants.h b/openfpga/src/fpga_verilog/verilog_constants.h index 4456a1048..3266fe2f6 100644 --- a/openfpga/src/fpga_verilog/verilog_constants.h +++ b/openfpga/src/fpga_verilog/verilog_constants.h @@ -37,6 +37,7 @@ constexpr char* LUTS_VERILOG_FILE_NAME = "luts.v"; constexpr char* ROUTING_VERILOG_FILE_NAME = "routing.v"; constexpr char* MUXES_VERILOG_FILE_NAME = "muxes.v"; constexpr char* LOCAL_ENCODER_VERILOG_FILE_NAME = "local_encoder.v"; +constexpr char* ARCH_ENCODER_VERILOG_FILE_NAME = "arch_encoder.v"; constexpr char* MEMORIES_VERILOG_FILE_NAME = "memories.v"; constexpr char* WIRES_VERILOG_FILE_NAME = "wires.v"; constexpr char* ESSENTIALS_VERILOG_FILE_NAME = "inv_buf_passgate.v"; diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 30789e36f..66a1a8ed8 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -1,7 +1,6 @@ /*************************************************************************************** * This file includes functions to generate Verilog modules of decoders ***************************************************************************************/ -/* TODO: merge verilog_decoder.c to this source file and rename to verilog_decoder.cpp */ #include /* Headers from vtrutil library */ @@ -15,6 +14,7 @@ #include "decoder_library_utils.h" #include "module_manager.h" +#include "openfpga_reserved_words.h" #include "openfpga_naming.h" #include "verilog_constants.h" @@ -133,7 +133,6 @@ void print_verilog_mux_local_decoder_module(std::fstream& fp, print_verilog_module_end(fp, module_name); } - /*************************************************************************************** * This function will generate all the unique Verilog modules of local decoders for * the multiplexers used in a FPGA fabric @@ -227,4 +226,179 @@ void print_verilog_submodule_mux_local_decoders(const ModuleManager& module_mana VTR_LOG("Done\n"); } +/*************************************************************************************** + * Create a Verilog module for a decoder used as a configuration protocol + * in FPGA architecture + * + * Address + * | | ... | + * v v v + * +-----------+ + * Enable->/ \ + * / Decoder \ + * +-----------------+ + * | | | ... | | | + * v v v v v v + * Data output + * + * The outputs are assumes to be one-hot codes (at most only one '1' exist) + * Considering this fact, there are only num_of_outputs conditions to be encoded. + * Therefore, the number of inputs is ceil(log(num_of_outputs)/log(2)) + * + * The decoder has an enable signal which is active at logic '1'. + * When activated, the decoder will output decoding results to the data output port + * Otherwise, the data output port will be always all-zero + ***************************************************************************************/ +static +void print_verilog_arch_decoder_module(std::fstream& fp, + const ModuleManager& module_manager, + const DecoderLibrary& decoder_lib, + const DecoderId& decoder) { + /* Get the number of inputs */ + size_t addr_size = decoder_lib.addr_size(decoder); + size_t data_size = decoder_lib.data_size(decoder); + + /* Validate the FILE handler */ + VTR_ASSERT(true == valid_file_stream(fp)); + + /* Create a name for the decoder */ + std::string module_name = generate_frame_memory_decoder_subckt_name(addr_size, data_size); + + /* Create a Verilog Module based on the circuit model, and add to module manager */ + ModuleId module_id = module_manager.find_module(module_name); + VTR_ASSERT(true == module_manager.valid_module_id(module_id)); + /* Find module ports */ + /* Enable port */ + ModulePortId enable_port_id = module_manager.find_module_port(module_id, std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort enable_port = module_manager.module_port(module_id, enable_port_id); + /* Address port */ + ModulePortId addr_port_id = module_manager.find_module_port(module_id, std::string(DECODER_ADDRESS_PORT_NAME)); + BasicPort addr_port = module_manager.module_port(module_id, addr_port_id); + /* Find each output port */ + ModulePortId data_port_id = module_manager.find_module_port(module_id, std::string(DECODER_DATA_OUT_PORT_NAME)); + BasicPort data_port = module_manager.module_port(module_id, data_port_id); + /* Data port is registered. It should be outputted as + * output reg [lsb:msb] data + */ + BasicPort data_inv_port(std::string(DECODER_DATA_OUT_INV_PORT_NAME), data_size); + if (true == decoder_lib.use_data_inv_port(decoder)) { + ModulePortId data_inv_port_id = module_manager.find_module_port(module_id, std::string(DECODER_DATA_OUT_INV_PORT_NAME)); + data_inv_port = module_manager.module_port(module_id, data_inv_port_id); + } + + /* dump module definition + ports */ + print_verilog_module_declaration(fp, module_manager, module_id); + /* Finish dumping ports */ + + print_verilog_comment(fp, std::string("----- BEGIN Verilog codes for Decoder convert " + std::to_string(addr_size) + "-bit addr to " + std::to_string(data_size) + "-bit data -----")); + + /* Print the truth table of this decoder */ + /* Internal logics */ + /* Early exit: Corner case for data size = 1 the logic is very simple: + * data = addr; + * data_inv = ~data_inv + */ + if (1 == data_size) { + print_verilog_wire_connection(fp, data_port, addr_port, false); + + /* Depend on if the inverted data output port is needed or not */ + if (true == decoder_lib.use_data_inv_port(decoder)) { + print_verilog_wire_connection(fp, data_inv_port, addr_port, true); + } + + print_verilog_comment(fp, std::string("----- END Verilog codes for Decoder convert " + std::to_string(addr_size) + "-bit addr to " + std::to_string(data_size) + "-bit data -----")); + + /* Put an end to the Verilog module */ + print_verilog_module_end(fp, module_name); + return; + } + + /* We use a magic number -1 as the addr=1 should be mapped to ...1 + * Otherwise addr will map addr=1 to ..10 + * Note that there should be a range for the shift operators + * We should narrow the encoding to be applied to a given set of data + * This will lead to that any addr which falls out of the op code of data + * will give a all-zero code + * For example: + * data is 5-bit while addr is 3-bit + * data=8'b0_0000 will be encoded to addr=3'b001; + * data=8'b0_0001 will be encoded to addr=3'b010; + * data=8'b0_0010 will be encoded to addr=3'b011; + * data=8'b0_0100 will be encoded to addr=3'b100; + * data=8'b0_1000 will be encoded to addr=3'b101; + * data=8'b1_0000 will be encoded to addr=3'b110; + * The rest of addr codes 3'b110, 3'b111 will be decoded to data=8'b0_0000; + */ + + fp << "\t" << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ")" << std::endl; + fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << "1'b1) begin" << std::endl; + fp << "\t\t" << "case (" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ")" << std::endl; + /* Create a string for addr and data */ + for (size_t i = 0; i < data_size; ++i) { + fp << "\t\t\t" << generate_verilog_constant_values(itobin_vec(i, addr_size)); + fp << " : "; + fp << generate_verilog_port_constant_values(data_port, ito1hot_vec(i, data_size)); + fp << ";" << std::endl; + } + fp << "\t\t\t" << "default : "; + fp << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size - 1, data_size)); + fp << ";" << std::endl; + fp << "\t\t" << "endcase" << std::endl; + fp << "\t" << "end" << std::endl; + + if (true == decoder_lib.use_data_inv_port(decoder)) { + print_verilog_wire_connection(fp, data_inv_port, data_port, true); + } + + print_verilog_comment(fp, std::string("----- END Verilog codes for Decoder convert " + std::to_string(addr_size) + "-bit addr to " + std::to_string(data_size) + "-bit data -----")); + + /* Put an end to the Verilog module */ + print_verilog_module_end(fp, module_name); +} + +/*************************************************************************************** + * This function will generate all the unique Verilog modules of decoders for + * configuration protocols in a FPGA fabric + * It will generate these decoder Verilog modules using behavioral description. + * Note that the implementation of local decoders can be dependent on the technology + * and standard cell libraries. + * Therefore, behavioral Verilog is used and the local decoders should be synthesized + * before running the back-end flow for FPGA fabric + * See more details in the function print_verilog_arch_decoder() for more details + ***************************************************************************************/ +void print_verilog_submodule_arch_decoders(const ModuleManager& module_manager, + NetlistManager& netlist_manager, + const DecoderLibrary& decoder_lib, + const std::string& submodule_dir) { + std::string verilog_fname(submodule_dir + std::string(ARCH_ENCODER_VERILOG_FILE_NAME)); + + /* Create the file stream */ + std::fstream fp; + fp.open(verilog_fname, std::fstream::out | std::fstream::trunc); + + check_file_stream(verilog_fname.c_str(), fp); + + /* Print out debugging information for if the file is not opened/created properly */ + VTR_LOG("Writing Verilog netlist for configuration decoders '%s'...", + verilog_fname.c_str()); + + print_verilog_file_header(fp, "Decoders for fabric configuration protocol "); + + /* Generate Verilog modules for the found unique local encoders */ + for (const auto& decoder : decoder_lib.decoders()) { + print_verilog_arch_decoder_module(fp, module_manager, decoder_lib, decoder); + } + + /* Close the file stream */ + fp.close(); + + /* Add fname to the netlist name list */ + NetlistId nlist_id = netlist_manager.add_netlist(verilog_fname); + VTR_ASSERT(NetlistId::INVALID() != nlist_id); + netlist_manager.set_netlist_type(nlist_id, NetlistManager::SUBMODULE_NETLIST); + + VTR_LOG("Done\n"); +} + + } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_verilog/verilog_decoders.h b/openfpga/src/fpga_verilog/verilog_decoders.h index 9b2bbb6b1..e15d5299a 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.h +++ b/openfpga/src/fpga_verilog/verilog_decoders.h @@ -11,6 +11,7 @@ #include "circuit_library.h" #include "mux_graph.h" #include "mux_library.h" +#include "decoder_library.h" #include "module_manager.h" #include "netlist_manager.h" @@ -27,6 +28,12 @@ void print_verilog_submodule_mux_local_decoders(const ModuleManager& module_mana const CircuitLibrary& circuit_lib, const std::string& submodule_dir); +void print_verilog_submodule_arch_decoders(const ModuleManager& module_manager, + NetlistManager& netlist_manager, + const DecoderLibrary& decoder_lib, + const std::string& submodule_dir); + + } /* end namespace openfpga */ #endif diff --git a/openfpga/src/fpga_verilog/verilog_submodule.cpp b/openfpga/src/fpga_verilog/verilog_submodule.cpp index 37df77c60..6756824ab 100644 --- a/openfpga/src/fpga_verilog/verilog_submodule.cpp +++ b/openfpga/src/fpga_verilog/verilog_submodule.cpp @@ -34,6 +34,7 @@ namespace openfpga { void print_verilog_submodule(ModuleManager& module_manager, NetlistManager& netlist_manager, const MuxLibrary& mux_lib, + const DecoderLibrary& decoder_lib, const CircuitLibrary& circuit_lib, const std::string& submodule_dir, const FabricVerilogOption& fpga_verilog_opts) { @@ -49,6 +50,12 @@ void print_verilog_submodule(ModuleManager& module_manager, submodule_dir, circuit_lib); + /* Decoders for architecture */ + print_verilog_submodule_arch_decoders(const_cast(module_manager), + netlist_manager, + decoder_lib, + submodule_dir); + /* Routing multiplexers */ /* NOTE: local decoders generation must go before the MUX generation!!! * because local decoders modules will be instanciated in the MUX modules diff --git a/openfpga/src/fpga_verilog/verilog_submodule.h b/openfpga/src/fpga_verilog/verilog_submodule.h index 06bb7aeef..27bf7fdba 100644 --- a/openfpga/src/fpga_verilog/verilog_submodule.h +++ b/openfpga/src/fpga_verilog/verilog_submodule.h @@ -7,6 +7,7 @@ #include "module_manager.h" #include "netlist_manager.h" #include "mux_library.h" +#include "decoder_library.h" #include "fabric_verilog_options.h" /******************************************************************** @@ -19,6 +20,7 @@ namespace openfpga { void print_verilog_submodule(ModuleManager& module_manager, NetlistManager& netlist_manager, const MuxLibrary& mux_lib, + const DecoderLibrary& decoder_lib, const CircuitLibrary& circuit_lib, const std::string& submodule_dir, const FabricVerilogOption& fpga_verilog_opts); From 8c14cced84deddb8b8d522bd2ec5af6716d5cac3 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 27 May 2020 15:09:18 -0600 Subject: [PATCH 090/180] start improve fabric bitstream database to support frame-based configuration protocol --- .../src/fpga_bitstream/fabric_bitstream.cpp | 77 ++++++++++++++++ .../src/fpga_bitstream/fabric_bitstream.h | 90 +++++++++++++++++++ .../src/fpga_bitstream/fabric_bitstream_fwd.h | 23 +++++ 3 files changed, 190 insertions(+) create mode 100644 openfpga/src/fpga_bitstream/fabric_bitstream.cpp create mode 100644 openfpga/src/fpga_bitstream/fabric_bitstream.h create mode 100644 openfpga/src/fpga_bitstream/fabric_bitstream_fwd.h diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/fabric_bitstream.cpp new file mode 100644 index 000000000..581a466d5 --- /dev/null +++ b/openfpga/src/fpga_bitstream/fabric_bitstream.cpp @@ -0,0 +1,77 @@ +/****************************************************************************** + * This file includes member functions for data structure FabricBitstream + ******************************************************************************/ +#include + +#include "vtr_assert.h" +#include "fabric_bitstream.h" + +/* begin namespace openfpga */ +namespace openfpga { + +/************************************************** + * Public Accessors : Aggregates + *************************************************/ +/* Find all the configuration bits */ +FabricBitstream::fabric_bit_range FabricBitstream::bits() const { + return vtr::make_range(bit_ids_.begin(), bit_ids_.end()); +} + +/****************************************************************************** + * Public Accessors + ******************************************************************************/ +ConfigBitId FabricBitstream::config_bit(const FabricBitId& bit_id) const { + /* Ensure a valid id */ + VTR_ASSERT(true == valid_bit_id(bit_id)); + + return config_bit_ids_[bit_id]; +} + +std::vector FabricBitstream::bit_address(const FabricBitId& bit_id) const { + /* Ensure a valid id */ + VTR_ASSERT(true == valid_bit_id(bit_id)); + + return bit_addresses_[bit_id]; +} + +bool FabricBitstream::bit_din(const FabricBitId& bit_id) const { + /* Ensure a valid id */ + VTR_ASSERT(true == valid_bit_id(bit_id)); + + return bit_dins_[bit_id]; +} + +/****************************************************************************** + * Public Mutators + ******************************************************************************/ +FabricBitId FabricBitstream::add_bit(const ConfigBitId& config_bit_id) { + FabricBitId bit = FabricBitId(bit_ids_.size()); + /* Add a new bit, and allocate associated data structures */ + bit_ids_.push_back(bit); + config_bit_ids_.push_back(config_bit_id); + bit_addresses_.emplace_back(); + bit_dins_.push_back(false); + + return bit; +} + +void FabricBitstream::set_bit_address(const FabricBitId& bit_id, + const std::vector& address) { + VTR_ASSERT(true == valid_bit_id(bit_id)); + bit_addresses_[bit_id] = address; +} + +void FabricBitstream::set_bit_din(const FabricBitId& bit_id, + const bool& din) { + VTR_ASSERT(true == valid_bit_id(bit_id)); + bit_dins_[bit_id] = din; +} + +/****************************************************************************** + * Public Validators + ******************************************************************************/ +bool FabricBitstream::valid_bit_id(const FabricBitId& bit_id) const { + return (size_t(bit_id) < bit_ids_.size()) && (bit_id == bit_ids_[bit_id]); +} + +} /* end namespace openfpga */ diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream.h b/openfpga/src/fpga_bitstream/fabric_bitstream.h new file mode 100644 index 000000000..3f13406c4 --- /dev/null +++ b/openfpga/src/fpga_bitstream/fabric_bitstream.h @@ -0,0 +1,90 @@ +/****************************************************************************** + * This file introduces a data structure to store fabric-dependent bitstream information + * + * General concept + * --------------- + * The idea is to create a unified data structure that stores the sequence of configuration + * bit in the architecture bitstream database + * as well as the information (such as address of each bit) required by a specific + * configuration protocol + * + * Cross-reference + * --------------- + * By using the link between ArchBitstreamManager and FabricBitstream, + * we can build a sequence of configuration bits to fit different configuration protocols. + * + * +----------------------+ +--------------------------+ + * | | ConfigBitId | | + * | ArchBitstreamManager |---------------->| FabricBitstream | + * | | | | + * +----------------------+ +--------------------------+ + * + * Restrictions: + * 1. Each block inside BitstreamManager should have only 1 parent block + * and multiple child block + * 2. Each bit inside BitstreamManager should have only 1 parent block + * + ******************************************************************************/ +#ifndef FABRIC_BITSTREAM_H +#define FABRIC_BITSTREAM_H + +#include +#include "vtr_vector.h" + +#include "bitstream_manager_fwd.h" +#include "fabric_bitstream_fwd.h" + +/* begin namespace openfpga */ +namespace openfpga { + +class FabricBitstream { + public: /* Types and ranges */ + typedef vtr::vector::const_iterator fabric_bit_iterator; + + typedef vtr::Range fabric_bit_range; + + public: /* Public aggregators */ + /* Find all the configuration bits */ + fabric_bit_range bits() const; + + public: /* Public Accessors */ + /* Find the configuration bit id in architecture bitstream database */ + ConfigBitId config_bit(const FabricBitId& bit_id) const; + + /* Find the address of bitstream */ + std::vector bit_address(const FabricBitId& bit_id) const; + + /* Find the data-in of bitstream */ + bool bit_din(const FabricBitId& bit_id) const; + + public: /* Public Mutators */ + /* Add a new configuration bit to the bitstream manager */ + FabricBitId add_bit(const ConfigBitId& config_bit_id); + + void set_bit_address(const FabricBitId& bit_id, + const std::vector& address); + + void set_bit_din(const FabricBitId& bit_id, + const bool& din); + + public: /* Public Validators */ + bool valid_bit_id(const FabricBitId& bit_id) const; + + private: /* Internal data */ + /* Unique id of a bit in the Bitstream */ + vtr::vector bit_ids_; + vtr::vector config_bit_ids_; + + /* Address bits: this is designed for memory decoders + * Here we store the binary format of the address, which can be loaded + * to the configuration protocol directly + */ + vtr::vector> bit_addresses_; + + /* Data input (Din) bits: this is designed for memory decoders */ + vtr::vector bit_dins_; +}; + +} /* end namespace openfpga */ + +#endif diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream_fwd.h b/openfpga/src/fpga_bitstream/fabric_bitstream_fwd.h new file mode 100644 index 000000000..d93eec638 --- /dev/null +++ b/openfpga/src/fpga_bitstream/fabric_bitstream_fwd.h @@ -0,0 +1,23 @@ +/************************************************** + * This file includes only declarations for + * the data structures for fabric-dependent bitstream database + * Please refer to fabric_bitstream.h for more details + *************************************************/ +#ifndef FABRIC_BITSTREAM_FWD_H +#define FABRIC_BITSTREAM_FWD_H + +#include "vtr_strong_id.h" + +/* begin namespace openfpga */ +namespace openfpga { + +/* Strong Ids for BitstreamContext */ +struct fabric_bit_id_tag; + +typedef vtr::StrongId FabricBitId; + +class FabricBitstream; + +} /* end namespace openfpga */ + +#endif From 4a0e1cd90890faa3e0c71b03e85f98fa4b752958 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 27 May 2020 15:53:40 -0600 Subject: [PATCH 091/180] add fabric bitstream data structure and deploy it to Verilog testbench generation --- openfpga/src/base/openfpga_bitstream.cpp | 1 + openfpga/src/base/openfpga_context.h | 7 +- .../fpga_bitstream/build_fabric_bitstream.cpp | 127 ++++++++++++------ .../fpga_bitstream/build_fabric_bitstream.h | 9 +- .../src/fpga_bitstream/fabric_bitstream.cpp | 10 +- .../src/fpga_bitstream/fabric_bitstream.h | 5 + .../fabric_bitstream_writer.cpp | 8 +- .../fpga_bitstream/fabric_bitstream_writer.h | 3 +- openfpga/src/fpga_verilog/verilog_api.cpp | 2 +- openfpga/src/fpga_verilog/verilog_api.h | 3 +- .../fpga_verilog/verilog_top_testbench.cpp | 14 +- .../src/fpga_verilog/verilog_top_testbench.h | 3 +- 12 files changed, 125 insertions(+), 67 deletions(-) diff --git a/openfpga/src/base/openfpga_bitstream.cpp b/openfpga/src/base/openfpga_bitstream.cpp index e131a2bfc..b1af639b5 100644 --- a/openfpga/src/base/openfpga_bitstream.cpp +++ b/openfpga/src/base/openfpga_bitstream.cpp @@ -62,6 +62,7 @@ int build_fabric_bitstream(OpenfpgaContext& openfpga_ctx, /* Build fabric bitstream here */ openfpga_ctx.mutable_fabric_bitstream() = build_fabric_dependent_bitstream(openfpga_ctx.bitstream_manager(), openfpga_ctx.module_graph(), + openfpga_ctx.arch().config_protocol, cmd_context.option_enable(cmd, opt_verbose)); /* Write fabric bitstream if required */ diff --git a/openfpga/src/base/openfpga_context.h b/openfpga/src/base/openfpga_context.h index 8c025687f..0eb34c029 100644 --- a/openfpga/src/base/openfpga_context.h +++ b/openfpga/src/base/openfpga_context.h @@ -16,6 +16,7 @@ #include "netlist_manager.h" #include "openfpga_flow_manager.h" #include "bitstream_manager.h" +#include "fabric_bitstream.h" #include "device_rr_gsb.h" #include "io_location_map.h" @@ -61,7 +62,7 @@ class OpenfpgaContext : public Context { const openfpga::ModuleManager& module_graph() const { return module_graph_; } const openfpga::FlowManager& flow_manager() const { return flow_manager_; } const openfpga::BitstreamManager& bitstream_manager() const { return bitstream_manager_; } - const std::vector& fabric_bitstream() const { return fabric_bitstream_; } + const openfpga::FabricBitstream& fabric_bitstream() const { return fabric_bitstream_; } const openfpga::IoLocationMap& io_location_map() const { return io_location_map_; } const std::unordered_map& net_activity() const { return net_activity_; } const openfpga::NetlistManager& verilog_netlists() const { return verilog_netlists_; } @@ -79,7 +80,7 @@ class OpenfpgaContext : public Context { openfpga::ModuleManager& mutable_module_graph() { return module_graph_; } openfpga::FlowManager& mutable_flow_manager() { return flow_manager_; } openfpga::BitstreamManager& mutable_bitstream_manager() { return bitstream_manager_; } - std::vector& mutable_fabric_bitstream() { return fabric_bitstream_; } + openfpga::FabricBitstream& mutable_fabric_bitstream() { return fabric_bitstream_; } openfpga::IoLocationMap& mutable_io_location_map() { return io_location_map_; } std::unordered_map& mutable_net_activity() { return net_activity_; } openfpga::NetlistManager& mutable_verilog_netlists() { return verilog_netlists_; } @@ -120,7 +121,7 @@ class OpenfpgaContext : public Context { /* Bitstream database */ openfpga::BitstreamManager bitstream_manager_; - std::vector fabric_bitstream_; + openfpga::FabricBitstream fabric_bitstream_; /* Netlist database * TODO: Each format should have an independent entry diff --git a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp index 0a15f6930..3953e0c16 100644 --- a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp @@ -28,11 +28,11 @@ namespace openfpga { * in the configurable_children) and configurable_child_instances() of each module of module manager *******************************************************************/ static -void rec_build_module_fabric_dependent_bitstream(const BitstreamManager& bitstream_manager, - const ConfigBlockId& parent_block, - const ModuleManager& module_manager, - const ModuleId& parent_module, - std::vector& fabric_bitstream) { +void rec_build_module_fabric_dependent_chain_bitstream(const BitstreamManager& bitstream_manager, + const ConfigBlockId& parent_block, + const ModuleManager& module_manager, + const ModuleId& parent_module, + FabricBitstream& fabric_bitstream) { /* Depth-first search: if we have any children in the parent_block, * we dive to the next level first! @@ -51,9 +51,9 @@ void rec_build_module_fabric_dependent_bitstream(const BitstreamManager& bitstre VTR_ASSERT(true == bitstream_manager.valid_block_id(child_block)); /* Go recursively */ - rec_build_module_fabric_dependent_bitstream(bitstream_manager, child_block, - module_manager, child_module, - fabric_bitstream); + rec_build_module_fabric_dependent_chain_bitstream(bitstream_manager, child_block, + module_manager, child_module, + fabric_bitstream); } /* Ensure that there should be no configuration bits in the parent block */ VTR_ASSERT(0 == bitstream_manager.block_bits(parent_block).size()); @@ -64,45 +64,47 @@ void rec_build_module_fabric_dependent_bitstream(const BitstreamManager& bitstre * And then, we can return */ for (const ConfigBitId& config_bit : bitstream_manager.block_bits(parent_block)) { - fabric_bitstream.push_back(config_bit); + fabric_bitstream.add_bit(config_bit); } } /******************************************************************** - * A top-level function re-organizes the bitstream for a specific - * FPGA fabric, where configuration bits are organized in the sequence - * that can be directly loaded to the FPGA configuration protocol. - * Support: - * 1. Configuration chain - * 2. Memory decoders - * This function does NOT modify the bitstream database - * Instead, it builds a vector of ids for configuration bits in bitstream manager - * - * This function can be called ONLY after the function build_device_bitstream() - * Note that this function does NOT decode bitstreams from circuit implementation - * It was done in the function build_device_bitstream() + * Main function to build a fabric-dependent bitstream + * by considering the configuration protocol types *******************************************************************/ -std::vector build_fabric_dependent_bitstream(const BitstreamManager& bitstream_manager, - const ModuleManager& module_manager, - const bool& verbose) { - std::vector fabric_bitstream; +static +void build_module_fabric_dependent_bitstream(const ConfigProtocol& config_protocol, + const BitstreamManager& bitstream_manager, + const ConfigBlockId& top_block, + const ModuleManager& module_manager, + const ModuleId& top_module, + FabricBitstream& fabric_bitstream) { - vtr::ScopedStartFinishTimer timer("\nBuild fabric dependent bitstream\n"); - - /* Get the top module name in module manager, which is our starting point */ - std::string top_module_name = generate_fpga_top_module_name(); - ModuleId top_module = module_manager.find_module(top_module_name); - VTR_ASSERT(true == module_manager.valid_module_id(top_module)); - - /* Find the top block in bitstream manager, which has not parents */ - std::vector top_block = find_bitstream_manager_top_blocks(bitstream_manager); - /* Make sure we have only 1 top block and its name matches the top module */ - VTR_ASSERT(1 == top_block.size()); - VTR_ASSERT(0 == top_module_name.compare(bitstream_manager.block_name(top_block[0]))); - - rec_build_module_fabric_dependent_bitstream(bitstream_manager, top_block[0], - module_manager, top_module, - fabric_bitstream); + switch (config_protocol.type()) { + case CONFIG_MEM_STANDALONE: { + rec_build_module_fabric_dependent_chain_bitstream(bitstream_manager, top_block, + module_manager, top_module, + fabric_bitstream); + break; + } + case CONFIG_MEM_SCAN_CHAIN: { + rec_build_module_fabric_dependent_chain_bitstream(bitstream_manager, top_block, + module_manager, top_module, + fabric_bitstream); + fabric_bitstream.reverse(); + break; + } + case CONFIG_MEM_MEMORY_BANK: { + break; + } + case CONFIG_MEM_FRAME_BASED: { + break; + } + default: + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid SRAM organization.\n"); + exit(1); + } /* Time-consuming sanity check: Uncomment these codes only for debugging!!! * Check which configuration bits are not touched @@ -124,11 +126,50 @@ std::vector build_fabric_dependent_bitstream(const BitstreamManager */ /* Ensure our fabric bitstream is in the same size as device bistream */ - VTR_ASSERT(bitstream_manager.bits().size() == fabric_bitstream.size()); + VTR_ASSERT(bitstream_manager.bits().size() == fabric_bitstream.bits().size()); +} + +/******************************************************************** + * A top-level function re-organizes the bitstream for a specific + * FPGA fabric, where configuration bits are organized in the sequence + * that can be directly loaded to the FPGA configuration protocol. + * Support: + * 1. Configuration chain + * 2. Memory decoders + * This function does NOT modify the bitstream database + * Instead, it builds a vector of ids for configuration bits in bitstream manager + * + * This function can be called ONLY after the function build_device_bitstream() + * Note that this function does NOT decode bitstreams from circuit implementation + * It was done in the function build_device_bitstream() + *******************************************************************/ +FabricBitstream build_fabric_dependent_bitstream(const BitstreamManager& bitstream_manager, + const ModuleManager& module_manager, + const ConfigProtocol& config_protocol, + const bool& verbose) { + FabricBitstream fabric_bitstream; + + vtr::ScopedStartFinishTimer timer("\nBuild fabric dependent bitstream\n"); + + /* Get the top module name in module manager, which is our starting point */ + std::string top_module_name = generate_fpga_top_module_name(); + ModuleId top_module = module_manager.find_module(top_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(top_module)); + + /* Find the top block in bitstream manager, which has not parents */ + std::vector top_block = find_bitstream_manager_top_blocks(bitstream_manager); + /* Make sure we have only 1 top block and its name matches the top module */ + VTR_ASSERT(1 == top_block.size()); + VTR_ASSERT(0 == top_module_name.compare(bitstream_manager.block_name(top_block[0]))); + + build_module_fabric_dependent_bitstream(config_protocol, + bitstream_manager, top_block[0], + module_manager, top_module, + fabric_bitstream); VTR_LOGV(verbose, "Built %lu configuration bits for fabric\n", - fabric_bitstream.size()); + fabric_bitstream.bits().size()); return fabric_bitstream; } diff --git a/openfpga/src/fpga_bitstream/build_fabric_bitstream.h b/openfpga/src/fpga_bitstream/build_fabric_bitstream.h index 507454059..3daadde75 100644 --- a/openfpga/src/fpga_bitstream/build_fabric_bitstream.h +++ b/openfpga/src/fpga_bitstream/build_fabric_bitstream.h @@ -5,7 +5,9 @@ * Include header files that are required by function declaration *******************************************************************/ #include +#include "config_protocol.h" #include "bitstream_manager.h" +#include "fabric_bitstream.h" #include "module_manager.h" /******************************************************************** @@ -15,9 +17,10 @@ /* begin namespace openfpga */ namespace openfpga { -std::vector build_fabric_dependent_bitstream(const BitstreamManager& bitstream_manager, - const ModuleManager& module_manager, - const bool& verbose); +FabricBitstream build_fabric_dependent_bitstream(const BitstreamManager& bitstream_manager, + const ModuleManager& module_manager, + const ConfigProtocol& config_protocol, + const bool& verbose); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/fabric_bitstream.cpp index 581a466d5..988839cf8 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/fabric_bitstream.cpp @@ -56,17 +56,23 @@ FabricBitId FabricBitstream::add_bit(const ConfigBitId& config_bit_id) { } void FabricBitstream::set_bit_address(const FabricBitId& bit_id, - const std::vector& address) { + const std::vector& address) { VTR_ASSERT(true == valid_bit_id(bit_id)); bit_addresses_[bit_id] = address; } void FabricBitstream::set_bit_din(const FabricBitId& bit_id, - const bool& din) { + const bool& din) { VTR_ASSERT(true == valid_bit_id(bit_id)); bit_dins_[bit_id] = din; } +void FabricBitstream::reverse() { + std::reverse(config_bit_ids_.begin(), config_bit_ids_.end()); + std::reverse(bit_addresses_.begin(), bit_addresses_.end()); + std::reverse(bit_dins_.begin(), bit_dins_.end()); +} + /****************************************************************************** * Public Validators ******************************************************************************/ diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream.h b/openfpga/src/fpga_bitstream/fabric_bitstream.h index 3f13406c4..0b4842aa8 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream.h +++ b/openfpga/src/fpga_bitstream/fabric_bitstream.h @@ -67,6 +67,11 @@ class FabricBitstream { void set_bit_din(const FabricBitId& bit_id, const bool& din); + /* Reverse bit sequence of the fabric bitstream + * This is required by configuration chain protocol + */ + void reverse(); + public: /* Public Validators */ bool valid_bit_id(const FabricBitId& bit_id) const; diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream_writer.cpp b/openfpga/src/fpga_bitstream/fabric_bitstream_writer.cpp index 069a99345..f8ca706fa 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream_writer.cpp +++ b/openfpga/src/fpga_bitstream/fabric_bitstream_writer.cpp @@ -31,14 +31,14 @@ namespace openfpga { * in this file *******************************************************************/ void write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager, - const std::vector& fabric_bitstream, + const FabricBitstream& fabric_bitstream, const std::string& fname) { /* Ensure that we have a valid file name */ if (true == fname.empty()) { VTR_LOG_ERROR("Received empty file name to output bitstream!\n\tPlease specify a valid file name.\n"); } - std::string timer_message = std::string("Write ") + std::to_string(fabric_bitstream.size()) + std::string(" fabric bitstream into plain text file '") + fname + std::string("'"); + std::string timer_message = std::string("Write ") + std::to_string(fabric_bitstream.bits().size()) + std::string(" fabric bitstream into plain text file '") + fname + std::string("'"); vtr::ScopedStartFinishTimer timer(timer_message); /* Create the file stream */ @@ -48,8 +48,8 @@ void write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manag check_file_stream(fname.c_str(), fp); /* Put down pure 0|1 bitstream here */ - for (const ConfigBitId& fabric_bit : fabric_bitstream) { - fp << bitstream_manager.bit_value(fabric_bit); + for (const FabricBitId& fabric_bit : fabric_bitstream.bits()) { + fp << bitstream_manager.bit_value(fabric_bitstream.config_bit(fabric_bit)); } /* Print an end to the file here */ fp << std::endl; diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream_writer.h b/openfpga/src/fpga_bitstream/fabric_bitstream_writer.h index 6b2c0e771..71c2addd8 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream_writer.h +++ b/openfpga/src/fpga_bitstream/fabric_bitstream_writer.h @@ -7,6 +7,7 @@ #include #include #include "bitstream_manager.h" +#include "fabric_bitstream.h" /******************************************************************** * Function declaration @@ -16,7 +17,7 @@ namespace openfpga { void write_fabric_bitstream_to_text_file(const BitstreamManager& bitstream_manager, - const std::vector& fabric_bitstream, + const FabricBitstream& fabric_bitstream, const std::string& fname); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_verilog/verilog_api.cpp b/openfpga/src/fpga_verilog/verilog_api.cpp index 2f92156fb..705cd4a65 100644 --- a/openfpga/src/fpga_verilog/verilog_api.cpp +++ b/openfpga/src/fpga_verilog/verilog_api.cpp @@ -147,7 +147,7 @@ void fpga_fabric_verilog(ModuleManager& module_manager, ********************************************************************/ void fpga_verilog_testbench(const ModuleManager& module_manager, const BitstreamManager& bitstream_manager, - const std::vector& fabric_bitstream, + const FabricBitstream& fabric_bitstream, const AtomContext& atom_ctx, const PlacementContext& place_ctx, const IoLocationMap& io_location_map, diff --git a/openfpga/src/fpga_verilog/verilog_api.h b/openfpga/src/fpga_verilog/verilog_api.h index 3076beb47..94fbf3a29 100644 --- a/openfpga/src/fpga_verilog/verilog_api.h +++ b/openfpga/src/fpga_verilog/verilog_api.h @@ -16,6 +16,7 @@ #include "netlist_manager.h" #include "module_manager.h" #include "bitstream_manager.h" +#include "fabric_bitstream.h" #include "simulation_setting.h" #include "io_location_map.h" #include "vpr_netlist_annotation.h" @@ -41,7 +42,7 @@ void fpga_fabric_verilog(ModuleManager& module_manager, void fpga_verilog_testbench(const ModuleManager& module_manager, const BitstreamManager& bitstream_manager, - const std::vector& fabric_bitstream, + const FabricBitstream& fabric_bitstream, const AtomContext& atom_ctx, const PlacementContext& place_ctx, const IoLocationMap& io_location_map, diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index dc4856cb3..9edce0b52 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -694,7 +694,7 @@ void print_verilog_top_testbench_generic_stimulus(std::fstream& fp, static void print_verilog_top_testbench_configuration_chain_bitstream(std::fstream& fp, const BitstreamManager& bitstream_manager, - const std::vector& fabric_bitstream) { + const FabricBitstream& fabric_bitstream) { /* Validate the file stream */ valid_file_stream(fp); @@ -720,11 +720,9 @@ void print_verilog_top_testbench_configuration_chain_bitstream(std::fstream& fp, /* Attention: the configuration chain protcol requires the last configuration bit is fed first * We will visit the fabric bitstream in a reverse way */ - std::vector cc_bitstream = fabric_bitstream; - std::reverse(cc_bitstream.begin(), cc_bitstream.end()); - for (const ConfigBitId& bit_id : cc_bitstream) { + for (const FabricBitId& bit_id : fabric_bitstream.bits()) { fp << "\t\t" << std::string(TOP_TESTBENCH_CC_PROG_TASK_NAME); - fp << "(1'b" << (size_t)bitstream_manager.bit_value(bit_id) << ");" << std::endl; + fp << "(1'b" << (size_t)bitstream_manager.bit_value(fabric_bitstream.config_bit(bit_id)) << ");" << std::endl; } /* Raise the flag of configuration done when bitstream loading is complete */ @@ -753,7 +751,7 @@ static void print_verilog_top_testbench_bitstream(std::fstream& fp, const e_config_protocol_type& sram_orgz_type, const BitstreamManager& bitstream_manager, - const std::vector& fabric_bitstream) { + const FabricBitstream& fabric_bitstream) { /* Branch on the type of configuration protocol */ switch (sram_orgz_type) { case CONFIG_MEM_STANDALONE: @@ -794,7 +792,7 @@ void print_verilog_top_testbench_bitstream(std::fstream& fp, *******************************************************************/ void print_verilog_top_testbench(const ModuleManager& module_manager, const BitstreamManager& bitstream_manager, - const std::vector& fabric_bitstream, + const FabricBitstream& fabric_bitstream, const e_config_protocol_type& sram_orgz_type, const CircuitLibrary& circuit_lib, const std::vector& global_ports, @@ -842,7 +840,7 @@ void print_verilog_top_testbench(const ModuleManager& module_manager, * by traversing the linked-list and count the number of SRAM=1 or BL=1&WL=1 in it. * We plus 1 additional config clock cycle here because we need to reset everything during the first clock cycle */ - size_t num_config_clock_cycles = 1 + fabric_bitstream.size(); + size_t num_config_clock_cycles = 1 + fabric_bitstream.bits().size(); /* Generate stimuli for general control signals */ print_verilog_top_testbench_generic_stimulus(fp, diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.h b/openfpga/src/fpga_verilog/verilog_top_testbench.h index 39a2024d1..07e671e57 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.h +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.h @@ -8,6 +8,7 @@ #include #include "module_manager.h" #include "bitstream_manager.h" +#include "fabric_bitstream.h" #include "circuit_library.h" #include "vpr_context.h" #include "io_location_map.h" @@ -23,7 +24,7 @@ namespace openfpga { void print_verilog_top_testbench(const ModuleManager& module_manager, const BitstreamManager& bitstream_manager, - const std::vector& fabric_bitstream, + const FabricBitstream& fabric_bitstream, const e_config_protocol_type& sram_orgz_type, const CircuitLibrary& circuit_lib, const std::vector& global_ports, From 85921dcc05b29b1415332b40faf4f410a43ad4e4 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 27 May 2020 17:04:11 -0600 Subject: [PATCH 092/180] add fabric bitstream builder for frame-based configuration protocol --- .../fpga_bitstream/build_fabric_bitstream.cpp | 134 +++++++++++++++++- 1 file changed, 132 insertions(+), 2 deletions(-) diff --git a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp index 3953e0c16..80026cbef 100644 --- a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp @@ -9,6 +9,10 @@ #include "vtr_log.h" #include "vtr_time.h" +/* Headers from openfpgautil library */ +#include "openfpga_decode.h" + +#include "openfpga_reserved_words.h" #include "openfpga_naming.h" #include "bitstream_manager_utils.h" @@ -18,14 +22,15 @@ namespace openfpga { /******************************************************************** - * This function will walk through all the configurable children under a module + * This function aims to build a bitstream for configuration chain-like protocol + * It will walk through all the configurable children under a module * in a recursive way, following a Depth-First Search (DFS) strategy * For each configuration child, we use its instance name as a key to spot the * configuration bits in bitstream manager. * Note that it is guarentee that the instance name in module manager is * consistent with the block names in bitstream manager * We use this link to reorganize the bitstream in the sequence of memories as we stored - * in the configurable_children) and configurable_child_instances() of each module of module manager + * in the configurable_children() and configurable_child_instances() of each module of module manager *******************************************************************/ static void rec_build_module_fabric_dependent_chain_bitstream(const BitstreamManager& bitstream_manager, @@ -68,6 +73,125 @@ void rec_build_module_fabric_dependent_chain_bitstream(const BitstreamManager& b } } +/******************************************************************** + * This function aims to build a bitstream for frame-based configuration protocol + * It will walk through all the configurable children under a module + * in a recursive way, following a Depth-First Search (DFS) strategy + * For each configuration child, we use its instance name as a key to spot the + * configuration bits in bitstream manager. + * Note that it is guarentee that the instance name in module manager is + * consistent with the block names in bitstream manager + * We use this link to reorganize the bitstream in the sequence of memories as we stored + * in the configurable_children() and configurable_child_instances() of each module of module manager + * + * For each configuration bits, we will infer its address based on + * - the child index in the configurable children list of current module + * - the child index of all the parent modules in their configurable children list + * until the top in the hierarchy + * + * The address will be organized as follows: + * ... + * The address will be decoded to a binary format + * + * For each configuration bit, the data_in for the frame-based decoders will be + * the same as the configuration bit in bitstream manager. + *******************************************************************/ +static +void rec_build_module_fabric_dependent_frame_bitstream(const BitstreamManager& bitstream_manager, + const std::vector& parent_blocks, + const ModuleManager& module_manager, + const std::vector& parent_modules, + const std::vector& addr_code, + FabricBitstream& fabric_bitstream) { + + /* Depth-first search: if we have any children in the parent_block, + * we dive to the next level first! + */ + if (0 < bitstream_manager.block_children(parent_blocks.back()).size()) { + const ConfigBlockId& parent_block = parent_blocks.back(); + const ModuleId& parent_module = parent_modules.back(); + + size_t num_configurable_children = module_manager.configurable_children(parent_modules.back()).size(); + + bool add_addr_code = true; + ModuleId decoder_module = ModuleId::INVALID(); + + /* Early exit if there is no configurable children */ + if (0 == num_configurable_children) { + return; + } + + /* For only 1 configurable child, there is not frame decoder need, we can pass on addr code directly */ + if (1 == num_configurable_children) { + add_addr_code = false; + } else { + /* For more than 2 children, there is a decoder in the tail of the list + * We will not decode that, but will access the address size from that module + * So, we reduce the number of children by 1 + */ + VTR_ASSERT(2 < num_configurable_children); + num_configurable_children--; + decoder_module = module_manager.configurable_children(parent_module).back(); + } + + for (size_t child_id = 0; child_id < num_configurable_children; ++child_id) { + ModuleId child_module = module_manager.configurable_children(parent_modules.back())[child_id]; + size_t child_instance = module_manager.configurable_child_instances(parent_module)[child_id]; + /* Get the instance name and ensure it is not empty */ + std::string instance_name = module_manager.instance_name(parent_module, child_module, child_instance); + + /* Find the child block that matches the instance name! */ + ConfigBlockId child_block = bitstream_manager.find_child_block(parent_block, instance_name); + /* We must have one valid block id! */ + if (true != bitstream_manager.valid_block_id(child_block)) + VTR_ASSERT(true == bitstream_manager.valid_block_id(child_block)); + + /* Pass on the list of blocks, modules and address lists */ + std::vector child_blocks = parent_blocks; + child_blocks.push_back(child_block); + + std::vector child_modules = parent_modules; + child_modules.push_back(child_module); + + /* Set address, apply binary conversion from the first to the last element in the address list */ + std::vector child_addr_code = addr_code; + + if (true == add_addr_code) { + /* Find the address port from the decoder module */ + const ModulePortId& decoder_addr_port_id = module_manager.find_module_port(decoder_module, std::string(DECODER_ADDRESS_PORT_NAME)); + const BasicPort& decoder_addr_port = module_manager.module_port(decoder_module, decoder_addr_port_id); + std::vector addr_bits_vec = itobin_vec(child_id, decoder_addr_port.get_width()); + for (const size_t& bit : addr_bits_vec) { + VTR_ASSERT((0 == bit) || (1 == bit)); + child_addr_code.push_back(bit); + } + } + + /* Go recursively */ + rec_build_module_fabric_dependent_frame_bitstream(bitstream_manager, child_blocks, + module_manager, child_modules, + child_addr_code, + fabric_bitstream); + } + /* Ensure that there should be no configuration bits in the parent block */ + VTR_ASSERT(0 == bitstream_manager.block_bits(parent_block).size()); + } + + /* Note that, reach here, it means that this is a leaf node. + * We add the configuration bits to the fabric_bitstream, + * And then, we can return + */ + for (const ConfigBitId& config_bit : bitstream_manager.block_bits(parent_blocks.back())) { + const FabricBitId& fabric_bit = fabric_bitstream.add_bit(config_bit); + + /* Set address */ + fabric_bitstream.set_bit_address(fabric_bit, addr_code); + + /* Set data input */ + fabric_bitstream.set_bit_din(fabric_bit, bitstream_manager.bit_value(config_bit)); + } +} + /******************************************************************** * Main function to build a fabric-dependent bitstream * by considering the configuration protocol types @@ -98,6 +222,12 @@ void build_module_fabric_dependent_bitstream(const ConfigProtocol& config_protoc break; } case CONFIG_MEM_FRAME_BASED: { + rec_build_module_fabric_dependent_frame_bitstream(bitstream_manager, + std::vector(1, top_block), + module_manager, + std::vector(1, top_module), + std::vector(), + fabric_bitstream); break; } default: From cff5b5cfc1f52a13c52da0808a3e9d42adfd7fe3 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 27 May 2020 18:40:45 -0600 Subject: [PATCH 093/180] break the configuration testbench. This commit is to spot which modification leads to the problem --- .../fpga_bitstream/build_fabric_bitstream.cpp | 11 +- .../src/fpga_bitstream/fabric_bitstream.cpp | 4 +- .../src/fpga_bitstream/fabric_bitstream.h | 6 +- .../fpga_verilog/verilog_top_testbench.cpp | 217 +++++++++++++++++- 4 files changed, 215 insertions(+), 23 deletions(-) diff --git a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp index 80026cbef..4dc8ee70b 100644 --- a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp @@ -101,7 +101,7 @@ void rec_build_module_fabric_dependent_frame_bitstream(const BitstreamManager& b const std::vector& parent_blocks, const ModuleManager& module_manager, const std::vector& parent_modules, - const std::vector& addr_code, + const std::vector& addr_code, FabricBitstream& fabric_bitstream) { /* Depth-first search: if we have any children in the parent_block, @@ -154,17 +154,14 @@ void rec_build_module_fabric_dependent_frame_bitstream(const BitstreamManager& b child_modules.push_back(child_module); /* Set address, apply binary conversion from the first to the last element in the address list */ - std::vector child_addr_code = addr_code; + std::vector child_addr_code = addr_code; if (true == add_addr_code) { /* Find the address port from the decoder module */ const ModulePortId& decoder_addr_port_id = module_manager.find_module_port(decoder_module, std::string(DECODER_ADDRESS_PORT_NAME)); const BasicPort& decoder_addr_port = module_manager.module_port(decoder_module, decoder_addr_port_id); std::vector addr_bits_vec = itobin_vec(child_id, decoder_addr_port.get_width()); - for (const size_t& bit : addr_bits_vec) { - VTR_ASSERT((0 == bit) || (1 == bit)); - child_addr_code.push_back(bit); - } + child_addr_code.insert(child_addr_code.end(), addr_bits_vec.begin(), addr_bits_vec.end()); } /* Go recursively */ @@ -226,7 +223,7 @@ void build_module_fabric_dependent_bitstream(const ConfigProtocol& config_protoc std::vector(1, top_block), module_manager, std::vector(1, top_module), - std::vector(), + std::vector(), fabric_bitstream); break; } diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/fabric_bitstream.cpp index 988839cf8..7306eba01 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/fabric_bitstream.cpp @@ -27,7 +27,7 @@ ConfigBitId FabricBitstream::config_bit(const FabricBitId& bit_id) const { return config_bit_ids_[bit_id]; } -std::vector FabricBitstream::bit_address(const FabricBitId& bit_id) const { +std::vector FabricBitstream::bit_address(const FabricBitId& bit_id) const { /* Ensure a valid id */ VTR_ASSERT(true == valid_bit_id(bit_id)); @@ -56,7 +56,7 @@ FabricBitId FabricBitstream::add_bit(const ConfigBitId& config_bit_id) { } void FabricBitstream::set_bit_address(const FabricBitId& bit_id, - const std::vector& address) { + const std::vector& address) { VTR_ASSERT(true == valid_bit_id(bit_id)); bit_addresses_[bit_id] = address; } diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream.h b/openfpga/src/fpga_bitstream/fabric_bitstream.h index 0b4842aa8..12d1c7885 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream.h +++ b/openfpga/src/fpga_bitstream/fabric_bitstream.h @@ -52,7 +52,7 @@ class FabricBitstream { ConfigBitId config_bit(const FabricBitId& bit_id) const; /* Find the address of bitstream */ - std::vector bit_address(const FabricBitId& bit_id) const; + std::vector bit_address(const FabricBitId& bit_id) const; /* Find the data-in of bitstream */ bool bit_din(const FabricBitId& bit_id) const; @@ -62,7 +62,7 @@ class FabricBitstream { FabricBitId add_bit(const ConfigBitId& config_bit_id); void set_bit_address(const FabricBitId& bit_id, - const std::vector& address); + const std::vector& address); void set_bit_din(const FabricBitId& bit_id, const bool& din); @@ -84,7 +84,7 @@ class FabricBitstream { * Here we store the binary format of the address, which can be loaded * to the configuration protocol directly */ - vtr::vector> bit_addresses_; + vtr::vector> bit_addresses_; /* Data input (Din) bits: this is designed for memory decoders */ vtr::vector bit_dins_; diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 9edce0b52..3d2cad1ea 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -41,7 +41,7 @@ constexpr char* TOP_TESTBENCH_FPGA_OUTPUT_POSTFIX = "_fpga"; constexpr char* TOP_TESTBENCH_CHECKFLAG_PORT_POSTFIX = "_flag"; -constexpr char* TOP_TESTBENCH_CC_PROG_TASK_NAME = "prog_cycle_task"; +constexpr char* TOP_TESTBENCH_PROG_TASK_NAME = "prog_cycle_task"; constexpr char* TOP_TESTBENCH_SIM_START_PORT_NAME = "sim_start"; @@ -79,12 +79,49 @@ void print_verilog_top_testbench_config_chain_port(std::fstream& fp) { fp << generate_verilog_port(VERILOG_PORT_WIRE, config_chain_tail_port) << ";" << std::endl; } +/******************************************************************** + * Print local wires for frame-based decoder protocols + *******************************************************************/ +static +void print_verilog_top_testbench_frame_decoder_port(std::fstream& fp, + const ModuleManager& module_manager, + const ModuleId& top_module) { + /* Validate the file stream */ + valid_file_stream(fp); + + /* Print the address port for the frame-based decoder here */ + print_verilog_comment(fp, std::string("---- Address port for frame-based decoder -----")); + ModulePortId addr_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_ADDRESS_PORT_NAME)); + BasicPort addr_port = module_manager.module_port(top_module, addr_port_id); + + fp << generate_verilog_port(VERILOG_PORT_REG, addr_port) << ";" << std::endl; + + /* Print the data-input port for the frame-based decoder here */ + print_verilog_comment(fp, std::string("---- Data input port for frame-based decoder -----")); + ModulePortId din_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_DATA_IN_PORT_NAME)); + BasicPort din_port = module_manager.module_port(top_module, din_port_id); + fp << generate_verilog_port(VERILOG_PORT_WIRE, din_port) << ";" << std::endl; + + /* Wire the programming clock to the enable signal */ + print_verilog_comment(fp, std::string("---- Wire enable port of frame-based decoder to programming clock -----")); + ModulePortId en_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort en_port = module_manager.module_port(top_module, en_port_id); + BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); + + print_verilog_wire_connection(fp, en_port, prog_clock_port, false); +} + /******************************************************************** * Print local wires for different types of configuration protocols *******************************************************************/ static void print_verilog_top_testbench_config_protocol_port(std::fstream& fp, - const e_config_protocol_type& sram_orgz_type) { + const e_config_protocol_type& sram_orgz_type, + const ModuleManager& module_manager, + const ModuleId& top_module) { switch(sram_orgz_type) { case CONFIG_MEM_STANDALONE: /* TODO */ @@ -95,6 +132,9 @@ void print_verilog_top_testbench_config_protocol_port(std::fstream& fp, case CONFIG_MEM_MEMORY_BANK: /* TODO */ break; + case CONFIG_MEM_FRAME_BASED: + print_verilog_top_testbench_frame_decoder_port(fp, module_manager, top_module); + break; default: VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid type of SRAM organization!\n"); @@ -398,7 +438,8 @@ void print_verilog_top_testbench_ports(std::fstream& fp, fp << generate_verilog_port(VERILOG_PORT_REG, set_port) << ";" << std::endl; /* Configuration ports depend on the organization of SRAMs */ - print_verilog_top_testbench_config_protocol_port(fp, sram_orgz_type); + print_verilog_top_testbench_config_protocol_port(fp, sram_orgz_type, + module_manager, top_module); /* Create a clock port if the benchmark have one but not in the default name! * We will wire the clock directly to the operating clock directly @@ -506,15 +547,72 @@ void print_verilog_top_testbench_load_bitstream_task_configuration_chain(std::fs * It aims at avoid racing the programming clock (scan-chain data changes at the rising edge). */ print_verilog_comment(fp, std::string("----- Task: input values during a programming clock cycle -----")); - fp << "task " << std::string(TOP_TESTBENCH_CC_PROG_TASK_NAME) << ";" << std::endl; + fp << "task " << std::string(TOP_TESTBENCH_PROG_TASK_NAME) << ";" << std::endl; fp << generate_verilog_port(VERILOG_PORT_INPUT, cc_head_value) << ";" << std::endl; fp << "\tbegin" << std::endl; fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; fp << "\t\t\t"; - fp << generate_verilog_port(VERILOG_PORT_CONKT, cc_head_port); - fp << " = "; - fp << generate_verilog_port(VERILOG_PORT_CONKT, cc_head_value); - fp << ";" << std::endl; + print_verilog_wire_connection(fp, cc_head_port, cc_head_value, false); + fp << std::endl; + + fp << "\tend" << std::endl; + fp << "endtask" << std::endl; + + /* Add an empty line as splitter */ + fp << std::endl; +} + +/******************************************************************** + * Print tasks (processes) in Verilog format, + * which is very useful in generating stimuli for each clock cycle + * This function is tuned for frame-based memory manipulation: + * During each programming cycle, we feed + * - an address to the address port of top module + * - a data input to the din port of top module + *******************************************************************/ +static +void print_verilog_top_testbench_load_bitstream_task_frame_decoder(std::fstream& fp, + const ModuleManager& module_manager, + const ModuleId& top_module) { + + /* Validate the file stream */ + valid_file_stream(fp); + + BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); + + ModulePortId addr_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_ADDRESS_PORT_NAME)); + BasicPort addr_port = module_manager.module_port(top_module, addr_port_id); + BasicPort addr_value = addr_port; + addr_value.set_name(std::string(DECODER_ADDRESS_PORT_NAME) + std::string("_val")); + + ModulePortId din_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_DATA_IN_PORT_NAME)); + BasicPort din_port = module_manager.module_port(top_module, din_port_id); + BasicPort din_value = din_port; + din_value.set_name(std::string(DECODER_DATA_IN_PORT_NAME) + std::string("_val")); + + /* Add an empty line as splitter */ + fp << std::endl; + + /* Feed the address and data input at each rising edge of programming clock + * As the enable signal is wired to the programming clock, we should synchronize + * address and data with the enable signal + */ + print_verilog_comment(fp, std::string("----- Task: address and data values during a programming clock cycle -----")); + fp << "task " << std::string(TOP_TESTBENCH_PROG_TASK_NAME) << ";" << std::endl; + fp << generate_verilog_port(VERILOG_PORT_INPUT, addr_value) << ";" << std::endl; + fp << generate_verilog_port(VERILOG_PORT_INPUT, din_value) << ";" << std::endl; + fp << "\tbegin" << std::endl; + fp << "\t\t@(posedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; + + fp << "\t\t\t"; + print_verilog_wire_connection(fp, addr_port, addr_value, false); + fp << std::endl; + + fp << "\t\t\t"; + print_verilog_wire_connection(fp, din_port, din_value, false); + fp << std::endl; fp << "\tend" << std::endl; fp << "endtask" << std::endl; @@ -528,7 +626,9 @@ void print_verilog_top_testbench_load_bitstream_task_configuration_chain(std::fs *******************************************************************/ static void print_verilog_top_testbench_load_bitstream_task(std::fstream& fp, - const e_config_protocol_type& sram_orgz_type) { + const e_config_protocol_type& sram_orgz_type, + const ModuleManager& module_manager, + const ModuleId& top_module) { switch (sram_orgz_type) { case CONFIG_MEM_STANDALONE: break; @@ -540,6 +640,11 @@ void print_verilog_top_testbench_load_bitstream_task(std::fstream& fp, dump_verilog_top_testbench_stimuli_serial_version_tasks_memory_bank(cur_sram_orgz_info, fp); */ break; + case CONFIG_MEM_FRAME_BASED: + print_verilog_top_testbench_load_bitstream_task_frame_decoder(fp, + module_manager, + top_module); + break; default: VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid type of SRAM organization!\n"); @@ -721,7 +826,7 @@ void print_verilog_top_testbench_configuration_chain_bitstream(std::fstream& fp, * We will visit the fabric bitstream in a reverse way */ for (const FabricBitId& bit_id : fabric_bitstream.bits()) { - fp << "\t\t" << std::string(TOP_TESTBENCH_CC_PROG_TASK_NAME); + fp << "\t\t" << std::string(TOP_TESTBENCH_PROG_TASK_NAME); fp << "(1'b" << (size_t)bitstream_manager.bit_value(fabric_bitstream.config_bit(bit_id)) << ");" << std::endl; } @@ -741,6 +846,86 @@ void print_verilog_top_testbench_configuration_chain_bitstream(std::fstream& fp, print_verilog_comment(fp, "----- End bitstream loading during configuration phase -----"); } +/******************************************************************** + * Print stimulus for a FPGA fabric with a frame-based configuration protocol + * where configuration bits are programming in serial (one by one) + * + * We will use the programming task function created before + *******************************************************************/ +static +void print_verilog_top_testbench_frame_decoder_bitstream(std::fstream& fp, + const ModuleManager& module_manager, + const ModuleId& top_module, + const FabricBitstream& fabric_bitstream) { + /* Validate the file stream */ + valid_file_stream(fp); + + /* Feed addresss and data input pair one by one + * Note: the first cycle is reserved for programming reset + * We should give dummy values + */ + ModulePortId addr_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_ADDRESS_PORT_NAME)); + BasicPort addr_port = module_manager.module_port(top_module, addr_port_id); + std::vector initial_addr_values(addr_port.get_width(), 0); + + ModulePortId din_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_DATA_IN_PORT_NAME)); + BasicPort din_port = module_manager.module_port(top_module, din_port_id); + std::vector initial_din_values(din_port.get_width(), 0); + + print_verilog_comment(fp, "----- Begin bitstream loading during configuration phase -----"); + fp << "initial" << std::endl; + fp << "\tbegin" << std::endl; + print_verilog_comment(fp, "----- Address port default input -----"); + fp << "\t\t"; + fp << generate_verilog_port_constant_values(addr_port, initial_addr_values); + fp << ";"; + + print_verilog_comment(fp, "----- Data-input port default input -----"); + fp << "\t\t"; + fp << generate_verilog_port_constant_values(din_port, initial_din_values); + fp << ";"; + + fp << std::endl; + + /* Attention: the configuration chain protcol requires the last configuration bit is fed first + * We will visit the fabric bitstream in a reverse way + */ + for (const FabricBitId& bit_id : fabric_bitstream.bits()) { + fp << "\t\t" << std::string(TOP_TESTBENCH_PROG_TASK_NAME); + fp << "(" << addr_port.get_width() << "'b"; + VTR_ASSERT(addr_port.get_width() == fabric_bitstream.bit_address(bit_id).size()); + for (const size_t& addr_bit : fabric_bitstream.bit_address(bit_id)) { + fp << addr_bit; + } + fp << ", "; + fp <<"1'b"; + if (true == fabric_bitstream.bit_din(bit_id)) { + fp << "1"; + } else { + VTR_ASSERT(false == fabric_bitstream.bit_din(bit_id)); + fp << "0"; + } + fp << ");" << std::endl; + } + + /* Raise the flag of configuration done when bitstream loading is complete */ + BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); + fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; + + BasicPort config_done_port(std::string(TOP_TB_CONFIG_DONE_PORT_NAME), 1); + fp << "\t\t\t"; + fp << generate_verilog_port(VERILOG_PORT_CONKT, config_done_port); + fp << " <= "; + std::vector config_done_enable_values(config_done_port.get_width(), 1); + fp << generate_verilog_constant_values(config_done_enable_values); + fp << ";" << std::endl; + + fp << "\tend" << std::endl; + print_verilog_comment(fp, "----- End bitstream loading during configuration phase -----"); +} + /******************************************************************** * Generate the stimuli for the top-level testbench * The simulation consists of two phases: configuration phase and operation phase @@ -750,6 +935,8 @@ void print_verilog_top_testbench_configuration_chain_bitstream(std::fstream& fp, static void print_verilog_top_testbench_bitstream(std::fstream& fp, const e_config_protocol_type& sram_orgz_type, + const ModuleManager& module_manager, + const ModuleId& top_module, const BitstreamManager& bitstream_manager, const FabricBitstream& fabric_bitstream) { /* Branch on the type of configuration protocol */ @@ -763,6 +950,11 @@ void print_verilog_top_testbench_bitstream(std::fstream& fp, case CONFIG_MEM_MEMORY_BANK: /* TODO */ break; + case CONFIG_MEM_FRAME_BASED: + print_verilog_top_testbench_frame_decoder_bitstream(fp, + module_manager, top_module, + fabric_bitstream); + break; default: VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid SRAM organization type!\n"); @@ -875,10 +1067,13 @@ void print_verilog_top_testbench(const ModuleManager& module_manager, explicit_port_mapping); /* Print tasks used for loading bitstreams */ - print_verilog_top_testbench_load_bitstream_task(fp, sram_orgz_type); + print_verilog_top_testbench_load_bitstream_task(fp, + sram_orgz_type, + module_manager, top_module); /* load bitstream to FPGA fabric in a configuration phase */ print_verilog_top_testbench_bitstream(fp, sram_orgz_type, + module_manager, top_module, bitstream_manager, fabric_bitstream); /* Add stimuli for reset, set, clock and iopad signals */ From ece651ade20ac48acb0b753d2254f393d766b27c Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 27 May 2020 18:47:27 -0600 Subject: [PATCH 094/180] bug fixed in the configuration chian errrors --- .../src/fpga_verilog/verilog_top_testbench.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 3d2cad1ea..9041df361 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -552,8 +552,10 @@ void print_verilog_top_testbench_load_bitstream_task_configuration_chain(std::fs fp << "\tbegin" << std::endl; fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; fp << "\t\t\t"; - print_verilog_wire_connection(fp, cc_head_port, cc_head_value, false); - fp << std::endl; + fp << generate_verilog_port(VERILOG_PORT_CONKT, cc_head_port); + fp << " = "; + fp << generate_verilog_port(VERILOG_PORT_CONKT, cc_head_value); + fp << ";" << std::endl; fp << "\tend" << std::endl; fp << "endtask" << std::endl; @@ -607,11 +609,17 @@ void print_verilog_top_testbench_load_bitstream_task_frame_decoder(std::fstream& fp << "\t\t@(posedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; fp << "\t\t\t"; - print_verilog_wire_connection(fp, addr_port, addr_value, false); + fp << generate_verilog_port(VERILOG_PORT_CONKT, addr_port); + fp << " = "; + fp << generate_verilog_port(VERILOG_PORT_CONKT, addr_value); + fp << ";" << std::endl; fp << std::endl; fp << "\t\t\t"; - print_verilog_wire_connection(fp, din_port, din_value, false); + fp << generate_verilog_port(VERILOG_PORT_CONKT, din_port); + fp << " = "; + fp << generate_verilog_port(VERILOG_PORT_CONKT, din_value); + fp << ";" << std::endl; fp << std::endl; fp << "\tend" << std::endl; From 3fa3b170610905711455011781c3207e878b3b64 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 10:19:04 -0600 Subject: [PATCH 095/180] start testing the frame-based configuration protocol. To distinguish, rename xml to identify between configuration chain and frame-based. This should not impact the pre-config testbenches. --- ...penfpga.xml => k4_N4_40nm_cc_openfpga.xml} | 0 .../k4_N4_40nm_frame_openfpga.xml | 229 ++++++++++++++++++ .../configuration_chain/config/task.conf | 2 +- 3 files changed, 230 insertions(+), 1 deletion(-) rename openfpga_flow/openfpga_arch/{k4_N4_40nm_openfpga.xml => k4_N4_40nm_cc_openfpga.xml} (100%) create mode 100644 openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml similarity index 100% rename from openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml rename to openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml new file mode 100644 index 000000000..e5fe5a89b --- /dev/null +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + + + + + 10e-12 5e-12 5e-12 + + + 10e-12 5e-12 5e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf b/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf index 9e18efc65..8318c1dea 100644 --- a/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf @@ -15,7 +15,7 @@ spice_output=false verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif -openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml From 3a0d3b4e95e13b84d83bc649c9d338f4b7e958bd Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 11:01:08 -0600 Subject: [PATCH 096/180] fix the broken CI/regression tests due to incorrect file path --- .../src/check_circuit_library.cpp | 2 +- .../src/read_xml_circuit_library.cpp | 2 +- .../configuration_frame/config/task.conf | 34 +++++++++++++++++++ .../sdc_time_unit/config/task.conf | 2 +- 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf diff --git a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp index f37742a5a..11cea2d44 100644 --- a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp +++ b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp @@ -282,7 +282,7 @@ size_t check_sram_circuit_model_ports(const CircuitLibrary& circuit_lib, /* Check if we has 1 output with size 2 */ num_err += check_one_circuit_model_port_type_and_size_required(circuit_lib, circuit_model, CIRCUIT_MODEL_PORT_OUTPUT, - 1, 2, false); + 2, 2, false); /* basic check finished here */ if (false == check_blwl) { return num_err; diff --git a/libopenfpga/libarchopenfpga/src/read_xml_circuit_library.cpp b/libopenfpga/libarchopenfpga/src/read_xml_circuit_library.cpp index ba6e6af7f..7a894ab34 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_circuit_library.cpp +++ b/libopenfpga/libarchopenfpga/src/read_xml_circuit_library.cpp @@ -553,7 +553,7 @@ void read_xml_circuit_port(pugi::xml_node& xml_port, || (CIRCUIT_MODEL_PORT_WL == circuit_lib.port_type(port)) || (CIRCUIT_MODEL_PORT_BLB == circuit_lib.port_type(port)) || (CIRCUIT_MODEL_PORT_WLB == circuit_lib.port_type(port)) ) { - circuit_lib.set_port_inv_model_name(port, get_attribute(xml_port, "inv_circuit_model_name", loc_data, pugiutil::ReqOpt::OPTIONAL).as_string(nullptr)); + circuit_lib.set_port_inv_model_name(port, get_attribute(xml_port, "inv_circuit_model_name", loc_data, pugiutil::ReqOpt::OPTIONAL).as_string()); } } diff --git a/openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf b/openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf new file mode 100644 index 000000000..87c487f63 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +#vpr_fpga_verilog_formal_verification_top_netlist= diff --git a/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf b/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf index 1aeaa036f..332020fab 100644 --- a/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf @@ -15,7 +15,7 @@ spice_output=false verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif -openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_openfpga.xml +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml From 65df309419c483371cd492c981261d36bf63b28f Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 12:25:47 -0600 Subject: [PATCH 097/180] bug fixing for frame-based configuration protocol and rename some naming function to be generic --- .../src/check_circuit_library.cpp | 8 ++-- openfpga/src/base/openfpga_naming.cpp | 8 ++-- openfpga/src/base/openfpga_naming.h | 4 +- openfpga/src/fabric/build_grid_modules.cpp | 11 +++-- openfpga/src/fabric/build_memory_modules.cpp | 44 ++++++++++++++----- .../fpga_bitstream/arch_bitstream_writer.cpp | 2 +- .../fpga_bitstream/build_grid_bitstream.cpp | 6 +-- .../build_routing_bitstream.cpp | 4 +- .../verilog_preconfig_top_module.cpp | 8 ++-- openfpga/src/utils/circuit_library_utils.cpp | 3 +- openfpga/src/utils/memory_utils.cpp | 19 +++++--- openfpga/src/utils/module_manager_utils.cpp | 21 ++++++--- openfpga/src/utils/mux_utils.cpp | 1 + 13 files changed, 90 insertions(+), 49 deletions(-) diff --git a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp index 11cea2d44..fe364bf0f 100644 --- a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp +++ b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp @@ -135,9 +135,11 @@ size_t check_one_circuit_model_port_size_required(const CircuitLibrary& circuit_ size_t num_err = 0; if (port_size_to_check != circuit_lib.port_size(circuit_port)) { - VTR_LOG_ERROR(circuit_lib.model_name(circuit_model).c_str(), + VTR_LOG_ERROR("Expect circuit model %s to have %d %s ports but only see %d!\n", + circuit_lib.model_name(circuit_model).c_str(), + port_size_to_check, CIRCUIT_MODEL_PORT_TYPE_STRING[size_t(circuit_lib.port_type(circuit_port))], - port_size_to_check); + circuit_lib.port_size(circuit_port)); /* Incremental the counter for errors */ num_err++; } @@ -282,7 +284,7 @@ size_t check_sram_circuit_model_ports(const CircuitLibrary& circuit_lib, /* Check if we has 1 output with size 2 */ num_err += check_one_circuit_model_port_type_and_size_required(circuit_lib, circuit_model, CIRCUIT_MODEL_PORT_OUTPUT, - 2, 2, false); + 2, 1, false); /* basic check finished here */ if (false == check_blwl) { return num_err; diff --git a/openfpga/src/base/openfpga_naming.cpp b/openfpga/src/base/openfpga_naming.cpp index 5c9c81eb3..dd5e7df2c 100644 --- a/openfpga/src/base/openfpga_naming.cpp +++ b/openfpga/src/base/openfpga_naming.cpp @@ -687,18 +687,18 @@ std::string generate_configuration_chain_tail_name() { } /********************************************************************* - * Generate the memory output port name of a configuration chain + * Generate the memory output port name of a configurable memory * TODO: This could be replaced as a constexpr string *********************************************************************/ -std::string generate_configuration_chain_data_out_name() { +std::string generate_configurable_memory_data_out_name() { return std::string("mem_out"); } /********************************************************************* - * Generate the inverted memory output port name of a configuration chain + * Generate the inverted memory output port name of a configurable memory * TODO: This could be replaced as a constexpr string *********************************************************************/ -std::string generate_configuration_chain_inverted_data_out_name() { +std::string generate_configurable_memory_inverted_data_out_name() { return std::string("mem_outb"); } diff --git a/openfpga/src/base/openfpga_naming.h b/openfpga/src/base/openfpga_naming.h index d3cfb04f0..4e1c44fa9 100644 --- a/openfpga/src/base/openfpga_naming.h +++ b/openfpga/src/base/openfpga_naming.h @@ -168,9 +168,9 @@ std::string generate_configuration_chain_head_name(); std::string generate_configuration_chain_tail_name(); -std::string generate_configuration_chain_data_out_name(); +std::string generate_configurable_memory_data_out_name(); -std::string generate_configuration_chain_inverted_data_out_name(); +std::string generate_configurable_memory_inverted_data_out_name(); std::string generate_mux_local_decoder_addr_port_name(); diff --git a/openfpga/src/fabric/build_grid_modules.cpp b/openfpga/src/fabric/build_grid_modules.cpp index b189a20fe..7a9e3b2b4 100644 --- a/openfpga/src/fabric/build_grid_modules.cpp +++ b/openfpga/src/fabric/build_grid_modules.cpp @@ -414,7 +414,8 @@ void add_module_pb_graph_pin2pin_net(ModuleManager& module_manager, module_manager.add_module_net_sink(pb_module, pin2pin_net, pin_pb_type_module, pin_pb_type_instance, pin_module_port_id, pin_module_pin_id); break; default: - VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid pin-to-pin interconnection type!\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid pin-to-pin interconnection type!\n"); exit(1); } } @@ -598,8 +599,9 @@ void add_module_pb_graph_pin_interc(ModuleManager& module_manager, break; } default: - VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid interconnection type for %s [at Architecture XML LINE%d]!\n", - cur_interc->name, cur_interc->line_num); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid interconnection type for %s [at Architecture XML LINE%d]!\n", + cur_interc->name, cur_interc->line_num); exit(1); } } @@ -686,7 +688,8 @@ void add_module_pb_graph_port_interc(ModuleManager& module_manager, break; } default: - VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid pb port type!\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid pb port type!\n"); exit(1); } } diff --git a/openfpga/src/fabric/build_memory_modules.cpp b/openfpga/src/fabric/build_memory_modules.cpp index f8db73d7a..58ddd6de6 100644 --- a/openfpga/src/fabric/build_memory_modules.cpp +++ b/openfpga/src/fabric/build_memory_modules.cpp @@ -396,10 +396,10 @@ void build_memory_chain_module(ModuleManager& module_manager, for (size_t iport = 0; iport < sram_output_ports.size(); ++iport) { std::string port_name; if (0 == iport) { - port_name = generate_configuration_chain_data_out_name(); + port_name = generate_configurable_memory_data_out_name(); } else { VTR_ASSERT( 1 == iport); - port_name = generate_configuration_chain_inverted_data_out_name(); + port_name = generate_configurable_memory_inverted_data_out_name(); } BasicPort output_port(port_name, num_mems); module_manager.add_port(mem_module, output_port, ModuleManager::MODULE_OUTPUT_PORT); @@ -421,10 +421,10 @@ void build_memory_chain_module(ModuleManager& module_manager, for (size_t iport = 0; iport < sram_output_ports.size(); ++iport) { std::string port_name; if (0 == iport) { - port_name = generate_configuration_chain_data_out_name(); + port_name = generate_configurable_memory_data_out_name(); } else { VTR_ASSERT( 1 == iport); - port_name = generate_configuration_chain_inverted_data_out_name(); + port_name = generate_configurable_memory_inverted_data_out_name(); } std::vector output_nets = add_module_output_nets_to_chain_mem_modules(module_manager, mem_module, port_name, circuit_lib, sram_output_ports[iport], @@ -657,12 +657,22 @@ void build_frame_memory_module(ModuleManager& module_manager, ModulePortId mem_addr_port = module_manager.add_port(mem_module, addr_port, ModuleManager::MODULE_INPUT_PORT); /* Input: Data port */ - BasicPort data_port(std::string(DECODER_DATA_IN_PORT_NAME), data_size); + BasicPort data_port(std::string(DECODER_DATA_IN_PORT_NAME), 1); ModulePortId mem_data_port = module_manager.add_port(mem_module, data_port, ModuleManager::MODULE_INPUT_PORT); + /* Should have only 1 or 2 output port */ + VTR_ASSERT( (1 == sram_output_ports.size()) || ( 2 == sram_output_ports.size()) ); + /* Add each output port: port width should match the number of memories */ - for (const auto& port : sram_output_ports) { - BasicPort output_port(circuit_lib.port_prefix(port), num_mems * circuit_lib.port_size(port)); + for (size_t iport = 0; iport < sram_output_ports.size(); ++iport) { + std::string port_name; + if (0 == iport) { + port_name = generate_configurable_memory_data_out_name(); + } else { + VTR_ASSERT( 1 == iport); + port_name = generate_configurable_memory_inverted_data_out_name(); + } + BasicPort output_port(port_name, num_mems); module_manager.add_port(mem_module, output_port, ModuleManager::MODULE_OUTPUT_PORT); } @@ -717,7 +727,19 @@ void build_frame_memory_module(ModuleManager& module_manager, } /* Wire inputs of parent module to outputs of child modules */ - add_module_output_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_output_ports, sram_mem_module, i, sram_instance); + for (size_t iport = 0; iport < sram_output_ports.size(); ++iport) { + std::string port_name; + if (0 == iport) { + port_name = generate_configurable_memory_data_out_name(); + } else { + VTR_ASSERT( 1 == iport); + port_name = generate_configurable_memory_inverted_data_out_name(); + } + + add_module_output_nets_to_chain_mem_modules(module_manager, mem_module, + port_name, circuit_lib, sram_output_ports[iport], + sram_mem_module, i, sram_instance); + } } /* Add global ports to the pb_module: @@ -727,7 +749,6 @@ void build_frame_memory_module(ModuleManager& module_manager, add_module_global_ports_from_child_modules(module_manager, mem_module); } - /********************************************************************* * Generate Verilog modules for the memories that are used * by a circuit model @@ -818,8 +839,9 @@ void build_mux_memory_module(ModuleManager& module_manager, */ break; default: - VTR_LOGF_ERROR(__FILE__, __LINE__, "Invalid design technology of multiplexer '%s'\n", - circuit_lib.model_name(mux_model).c_str()); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid design technology of multiplexer '%s'\n", + circuit_lib.model_name(mux_model).c_str()); exit(1); } } diff --git a/openfpga/src/fpga_bitstream/arch_bitstream_writer.cpp b/openfpga/src/fpga_bitstream/arch_bitstream_writer.cpp index 6a87a6768..7f7e8ed07 100644 --- a/openfpga/src/fpga_bitstream/arch_bitstream_writer.cpp +++ b/openfpga/src/fpga_bitstream/arch_bitstream_writer.cpp @@ -85,7 +85,7 @@ void rec_write_block_bitstream_to_xml_file(std::fstream& fp, fp << "\t" << std::endl; for (const ConfigBitId& child_bit : bitstream_manager.block_bits(block)) { fp << "\t\t" << std::endl; bit_counter++; diff --git a/openfpga/src/fpga_bitstream/build_grid_bitstream.cpp b/openfpga/src/fpga_bitstream/build_grid_bitstream.cpp index 204b80260..204d7b31e 100644 --- a/openfpga/src/fpga_bitstream/build_grid_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_grid_bitstream.cpp @@ -98,7 +98,7 @@ void build_primitive_bitstream(BitstreamManager& bitstream_manager, std::string mem_block_name = generate_memory_module_name(circuit_lib, primitive_model, sram_models[0], std::string(MEMORY_MODULE_POSTFIX)); ModuleId mem_module = module_manager.find_module(mem_block_name); VTR_ASSERT (true == module_manager.valid_module_id(mem_module)); - ModulePortId mem_out_port_id = module_manager.find_module_port(mem_module, generate_configuration_chain_data_out_name()); + ModulePortId mem_out_port_id = module_manager.find_module_port(mem_module, generate_configurable_memory_data_out_name()); VTR_ASSERT(mode_select_bitstream.size() == module_manager.module_port(mem_module, mem_out_port_id).get_width()); /* Create a block for the bitstream which corresponds to the memory module associated to the LUT */ @@ -194,7 +194,7 @@ void build_physical_block_pin_interc_bitstream(BitstreamManager& bitstream_manag std::string mem_module_name = generate_mux_subckt_name(circuit_lib, mux_model, datapath_mux_size, std::string(MEMORY_MODULE_POSTFIX)); ModuleId mux_mem_module = module_manager.find_module(mem_module_name); VTR_ASSERT (true == module_manager.valid_module_id(mux_mem_module)); - ModulePortId mux_mem_out_port_id = module_manager.find_module_port(mux_mem_module, generate_configuration_chain_data_out_name()); + ModulePortId mux_mem_out_port_id = module_manager.find_module_port(mux_mem_module, generate_configurable_memory_data_out_name()); VTR_ASSERT(mux_bitstream.size() == module_manager.module_port(mux_mem_module, mux_mem_out_port_id).get_width()); /* Add the bistream to the bitstream manager */ @@ -424,7 +424,7 @@ void build_lut_bitstream(BitstreamManager& bitstream_manager, std::string mem_block_name = generate_memory_module_name(circuit_lib, lut_model, sram_models[0], std::string(MEMORY_MODULE_POSTFIX)); ModuleId mem_module = module_manager.find_module(mem_block_name); VTR_ASSERT (true == module_manager.valid_module_id(mem_module)); - ModulePortId mem_out_port_id = module_manager.find_module_port(mem_module, generate_configuration_chain_data_out_name()); + ModulePortId mem_out_port_id = module_manager.find_module_port(mem_module, generate_configurable_memory_data_out_name()); VTR_ASSERT(lut_bitstream.size() == module_manager.module_port(mem_module, mem_out_port_id).get_width()); /* Create a block for the bitstream which corresponds to the memory module associated to the LUT */ diff --git a/openfpga/src/fpga_bitstream/build_routing_bitstream.cpp b/openfpga/src/fpga_bitstream/build_routing_bitstream.cpp index faef05174..0713fcb09 100644 --- a/openfpga/src/fpga_bitstream/build_routing_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_routing_bitstream.cpp @@ -76,7 +76,7 @@ void build_switch_block_mux_bitstream(BitstreamManager& bitstream_manager, std::string mem_module_name = generate_mux_subckt_name(circuit_lib, mux_model, datapath_mux_size, std::string(MEMORY_MODULE_POSTFIX)); ModuleId mux_mem_module = module_manager.find_module(mem_module_name); VTR_ASSERT (true == module_manager.valid_module_id(mux_mem_module)); - ModulePortId mux_mem_out_port_id = module_manager.find_module_port(mux_mem_module, generate_configuration_chain_data_out_name()); + ModulePortId mux_mem_out_port_id = module_manager.find_module_port(mux_mem_module, generate_configurable_memory_data_out_name()); VTR_ASSERT(mux_bitstream.size() == module_manager.module_port(mux_mem_module, mux_mem_out_port_id).get_width()); /* Add the bistream to the bitstream manager */ @@ -230,7 +230,7 @@ void build_connection_block_mux_bitstream(BitstreamManager& bitstream_manager, std::string mem_module_name = generate_mux_subckt_name(circuit_lib, mux_model, datapath_mux_size, std::string(MEMORY_MODULE_POSTFIX)); ModuleId mux_mem_module = module_manager.find_module(mem_module_name); VTR_ASSERT (true == module_manager.valid_module_id(mux_mem_module)); - ModulePortId mux_mem_out_port_id = module_manager.find_module_port(mux_mem_module, generate_configuration_chain_data_out_name()); + ModulePortId mux_mem_out_port_id = module_manager.find_module_port(mux_mem_module, generate_configurable_memory_data_out_name()); VTR_ASSERT(mux_bitstream.size() == module_manager.module_port(mux_mem_module, mux_mem_out_port_id).get_width()); /* Add the bistream to the bitstream manager */ diff --git a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp index 8e577dfb4..973f7d0ff 100644 --- a/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp +++ b/openfpga/src/fpga_verilog/verilog_preconfig_top_module.cpp @@ -206,7 +206,7 @@ void print_verilog_preconfig_top_module_assign_bitstream(std::fstream& fp, bit_hierarchy_path += std::string("."); /* Find the bit index in the parent block */ - BasicPort config_data_port(bit_hierarchy_path + generate_configuration_chain_data_out_name(), + BasicPort config_data_port(bit_hierarchy_path + generate_configurable_memory_data_out_name(), bitstream_manager.block_bits(config_block_id).size()); /* Wire it to the configuration bit: access both data out and data outb ports */ @@ -239,7 +239,7 @@ void print_verilog_preconfig_top_module_assign_bitstream(std::fstream& fp, bit_hierarchy_path += std::string("."); /* Find the bit index in the parent block */ - BasicPort config_datab_port(bit_hierarchy_path + generate_configuration_chain_inverted_data_out_name(), + BasicPort config_datab_port(bit_hierarchy_path + generate_configurable_memory_inverted_data_out_name(), bitstream_manager.block_bits(config_block_id).size()); std::vector config_datab_values; @@ -290,10 +290,10 @@ void print_verilog_preconfig_top_module_deposit_bitstream(std::fstream& fp, bit_hierarchy_path += std::string("."); /* Find the bit index in the parent block */ - BasicPort config_data_port(bit_hierarchy_path + generate_configuration_chain_data_out_name(), + BasicPort config_data_port(bit_hierarchy_path + generate_configurable_memory_data_out_name(), bitstream_manager.block_bits(config_block_id).size()); - BasicPort config_datab_port(bit_hierarchy_path + generate_configuration_chain_inverted_data_out_name(), + BasicPort config_datab_port(bit_hierarchy_path + generate_configurable_memory_inverted_data_out_name(), bitstream_manager.block_bits(config_block_id).size()); /* Wire it to the configuration bit: access both data out and data outb ports */ diff --git a/openfpga/src/utils/circuit_library_utils.cpp b/openfpga/src/utils/circuit_library_utils.cpp index 082349008..74d0c1e50 100644 --- a/openfpga/src/utils/circuit_library_utils.cpp +++ b/openfpga/src/utils/circuit_library_utils.cpp @@ -143,7 +143,8 @@ size_t find_circuit_num_shared_config_bits(const CircuitLibrary& circuit_lib, num_shared_config_bits = std::max((int)num_shared_config_bits, (int)find_rram_circuit_num_shared_config_bits(circuit_lib, sram_model, sram_orgz_type)); break; default: - VTR_LOG_ERROR("Invalid design technology for SRAM model!\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid design technology for SRAM model!\n"); exit(1); } } diff --git a/openfpga/src/utils/memory_utils.cpp b/openfpga/src/utils/memory_utils.cpp index ef0433502..05b6e8736 100644 --- a/openfpga/src/utils/memory_utils.cpp +++ b/openfpga/src/utils/memory_utils.cpp @@ -70,8 +70,8 @@ std::map generate_cmos_mem_module_port2port_map(const Ba /* Link the SRAM output ports of the memory module */ VTR_ASSERT( 2 == mem_output_bus_ports.size() ); - port2port_name_map[generate_configuration_chain_data_out_name()] = mem_output_bus_ports[0]; - port2port_name_map[generate_configuration_chain_inverted_data_out_name()] = mem_output_bus_ports[1]; + port2port_name_map[generate_configurable_memory_data_out_name()] = mem_output_bus_ports[0]; + port2port_name_map[generate_configurable_memory_inverted_data_out_name()] = mem_output_bus_ports[1]; break; } case CONFIG_MEM_MEMORY_BANK: @@ -127,15 +127,16 @@ std::map generate_rram_mem_module_port2port_map(const Ba /* Link the SRAM output ports of the memory module */ VTR_ASSERT( 2 == mem_output_bus_ports.size() ); - port2port_name_map[generate_configuration_chain_data_out_name()] = mem_output_bus_ports[0]; - port2port_name_map[generate_configuration_chain_inverted_data_out_name()] = mem_output_bus_ports[1]; + port2port_name_map[generate_configurable_memory_data_out_name()] = mem_output_bus_ports[0]; + port2port_name_map[generate_configurable_memory_inverted_data_out_name()] = mem_output_bus_ports[1]; break; } case CONFIG_MEM_MEMORY_BANK: /* TODO: link BL/WL/Reserved Ports to the inputs of a memory module */ break; default: - VTR_LOG_ERROR("Invalid type of SRAM organization!\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of SRAM organization!\n"); exit(1); } @@ -342,7 +343,8 @@ std::vector generate_sram_port_names(const CircuitLibrary& circuit_ break; } default: - VTR_LOG_ERROR("Invalid type of SRAM organization !\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of SRAM organization !\n"); exit(1); } @@ -378,8 +380,11 @@ size_t generate_sram_port_size(const e_config_protocol_type sram_orgz_type, break; case CONFIG_MEM_MEMORY_BANK: break; + case CONFIG_MEM_FRAME_BASED: + break; default: - VTR_LOG_ERROR("Invalid type of SRAM organization !\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of SRAM organization!\n"); exit(1); } diff --git a/openfpga/src/utils/module_manager_utils.cpp b/openfpga/src/utils/module_manager_utils.cpp index 27231aaf3..85e71de3f 100644 --- a/openfpga/src/utils/module_manager_utils.cpp +++ b/openfpga/src/utils/module_manager_utils.cpp @@ -234,7 +234,8 @@ void add_sram_ports_to_module_manager(ModuleManager& module_manager, break; } default: - VTR_LOG_ERROR("Invalid type of SRAM organization !\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of SRAM organization !\n"); exit(1); } } @@ -613,8 +614,8 @@ void add_module_nets_between_logic_and_memory_sram_bus(ModuleManager& module_man } /* Get the SRAM port name of memory model */ - /* TODO: this should be a constant expression and it should be the same for all the memory module! */ - std::string memory_model_sram_port_name = generate_configuration_chain_data_out_name(); + /* This should be a constant expression and it should be the same for all the memory module! */ + std::string memory_model_sram_port_name = generate_configurable_memory_data_out_name(); /* Find the corresponding ports in memory module */ ModulePortId mem_module_sram_port_id = module_manager.find_module_port(memory_module, memory_model_sram_port_name); @@ -649,7 +650,7 @@ void add_module_nets_between_logic_and_memory_sram_bus(ModuleManager& module_man } /* Get the SRAM port name of memory model */ - std::string memory_model_sramb_port_name = generate_configuration_chain_inverted_data_out_name(); + std::string memory_model_sramb_port_name = generate_configurable_memory_inverted_data_out_name(); /* Find the corresponding ports in memory module */ ModulePortId mem_module_sramb_port_id = module_manager.find_module_port(memory_module, memory_model_sramb_port_name); @@ -1099,7 +1100,8 @@ void add_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, add_module_nets_cmos_memory_frame_config_bus(module_manager, decoder_lib, parent_module); break; default: - VTR_LOG_ERROR("Invalid type of SRAM organization!\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of SRAM organization!\n"); exit(1); } } @@ -1174,7 +1176,8 @@ void add_module_nets_memory_config_bus(ModuleManager& module_manager, /* TODO: */ break; default: - VTR_LOG_ERROR("Invalid type of memory design technology !\n"); + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of memory design technology!\n"); exit(1); } } @@ -1593,7 +1596,11 @@ void add_module_bus_nets(ModuleManager& module_manager, if (src_port.get_width() != des_port.get_width()) { VTR_LOGF_ERROR(__FILE__, __LINE__, - "Unmatched port size: src_port is %lu while des_port is %lu!\n"); + "Unmatched port size: src_port %s is %lu while des_port %s is %lu!\n", + src_port.get_name().c_str(), + src_port.get_width(), + des_port.get_name().c_str(), + des_port.get_width()); exit(1); } diff --git a/openfpga/src/utils/mux_utils.cpp b/openfpga/src/utils/mux_utils.cpp index b921f0589..15c7a97d7 100644 --- a/openfpga/src/utils/mux_utils.cpp +++ b/openfpga/src/utils/mux_utils.cpp @@ -260,6 +260,7 @@ size_t find_cmos_mux_num_config_bits(const CircuitLibrary& circuit_lib, case CONFIG_MEM_MEMORY_BANK: case CONFIG_MEM_SCAN_CHAIN: case CONFIG_MEM_STANDALONE: + case CONFIG_MEM_FRAME_BASED: num_config_bits = mux_graph.num_memory_bits(); break; default: From bf9f62f0f7e8e5f21643b6dbc2bbfec73c5bde36 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 13:09:01 -0600 Subject: [PATCH 098/180] keep bug fixing for frame-based configuration protocol. --- openfpga/src/fabric/build_grid_modules.cpp | 2 +- openfpga/src/utils/circuit_library_utils.cpp | 25 +++++++++++++++++++- openfpga/src/utils/circuit_library_utils.h | 3 ++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/openfpga/src/fabric/build_grid_modules.cpp b/openfpga/src/fabric/build_grid_modules.cpp index 7a9e3b2b4..ff2fe5d14 100644 --- a/openfpga/src/fabric/build_grid_modules.cpp +++ b/openfpga/src/fabric/build_grid_modules.cpp @@ -270,7 +270,7 @@ void build_primitive_block_module(ModuleManager& module_manager, } /* Regular (independent) SRAM ports */ - size_t num_config_bits = find_circuit_num_config_bits(circuit_lib, primitive_model); + size_t num_config_bits = find_circuit_num_config_bits(sram_orgz_type, circuit_lib, primitive_model); if (0 < num_config_bits) { add_sram_ports_to_module_manager(module_manager, primitive_module, circuit_lib, sram_model, sram_orgz_type, diff --git a/openfpga/src/utils/circuit_library_utils.cpp b/openfpga/src/utils/circuit_library_utils.cpp index 74d0c1e50..07ef140a3 100644 --- a/openfpga/src/utils/circuit_library_utils.cpp +++ b/openfpga/src/utils/circuit_library_utils.cpp @@ -12,6 +12,7 @@ #include "vtr_log.h" #include "check_circuit_library.h" +#include "decoder_library_utils.h" #include "circuit_library_utils.h" /* begin namespace openfpga */ @@ -161,7 +162,8 @@ size_t find_circuit_num_shared_config_bits(const CircuitLibrary& circuit_lib, * for a multiplexer, because the multiplexer size is determined during * the FPGA architecture generation (NOT during the XML parsing). *******************************************************************/ -size_t find_circuit_num_config_bits(const CircuitLibrary& circuit_lib, +size_t find_circuit_num_config_bits(const e_config_protocol_type& config_protocol_type, + const CircuitLibrary& circuit_lib, const CircuitModelId& circuit_model) { size_t num_config_bits = 0; @@ -170,6 +172,27 @@ size_t find_circuit_num_config_bits(const CircuitLibrary& circuit_lib, num_config_bits += circuit_lib.port_size(sram_port); } + switch (config_protocol_type) { + case CONFIG_MEM_STANDALONE: + case CONFIG_MEM_SCAN_CHAIN: + case CONFIG_MEM_MEMORY_BANK: { + break; + } + case CONFIG_MEM_FRAME_BASED: { + /* For frame-based configuration protocol + * The number of configuration bits is the address size + */ + if (0 < num_config_bits) { + num_config_bits = find_mux_local_decoder_addr_size(num_config_bits); + } + break; + } + default: + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of SRAM organization !\n"); + exit(1); + } + return num_config_bits; } diff --git a/openfpga/src/utils/circuit_library_utils.h b/openfpga/src/utils/circuit_library_utils.h index b03c03156..255da4f4f 100644 --- a/openfpga/src/utils/circuit_library_utils.h +++ b/openfpga/src/utils/circuit_library_utils.h @@ -31,7 +31,8 @@ size_t find_circuit_num_shared_config_bits(const CircuitLibrary& circuit_lib, const CircuitModelId& circuit_model, const e_config_protocol_type& sram_orgz_type); -size_t find_circuit_num_config_bits(const CircuitLibrary& circuit_lib, +size_t find_circuit_num_config_bits(const e_config_protocol_type& config_protocol_type, + const CircuitLibrary& circuit_lib, const CircuitModelId& circuit_model); std::vector find_circuit_library_global_ports(const CircuitLibrary& circuit_lib); From 8298bbff78cad19f399dab4e052af9820acc25e0 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 16:55:13 -0600 Subject: [PATCH 099/180] bug fixed in the fabric bitstream for frame-based configurable memories. --- openfpga/src/fabric/build_memory_modules.cpp | 4 + .../fpga_bitstream/build_fabric_bitstream.cpp | 89 +++++++++++++++++-- openfpga/src/utils/module_manager_utils.cpp | 13 +-- 3 files changed, 92 insertions(+), 14 deletions(-) diff --git a/openfpga/src/fabric/build_memory_modules.cpp b/openfpga/src/fabric/build_memory_modules.cpp index 58ddd6de6..bc04dd07d 100644 --- a/openfpga/src/fabric/build_memory_modules.cpp +++ b/openfpga/src/fabric/build_memory_modules.cpp @@ -701,6 +701,7 @@ void build_frame_memory_module(ModuleManager& module_manager, /* Memory seed module instanciation */ size_t sram_instance = module_manager.num_instance(mem_module, sram_mem_module); module_manager.add_child_module(mem_module, sram_mem_module); + module_manager.add_configurable_child(mem_module, sram_mem_module, sram_instance); /* Wire data_in port to SRAM BL port */ ModulePortId sram_bl_port = module_manager.find_module_port(sram_mem_module, circuit_lib.port_lib_name(sram_bl_ports[0])); @@ -747,6 +748,9 @@ void build_frame_memory_module(ModuleManager& module_manager, * we just need to find all the global ports from the child modules and build a list of it */ add_module_global_ports_from_child_modules(module_manager, mem_module); + + /* Add the decoder as the last configurable children */ + module_manager.add_configurable_child(mem_module, decoder_module, 0); } /********************************************************************* diff --git a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp index 4dc8ee70b..f281a72dc 100644 --- a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp @@ -79,7 +79,7 @@ void rec_build_module_fabric_dependent_chain_bitstream(const BitstreamManager& b * in a recursive way, following a Depth-First Search (DFS) strategy * For each configuration child, we use its instance name as a key to spot the * configuration bits in bitstream manager. - * Note that it is guarentee that the instance name in module manager is + * Note that it is guarenteed that the instance name in module manager is * consistent with the block names in bitstream manager * We use this link to reorganize the bitstream in the sequence of memories as we stored * in the configurable_children() and configurable_child_instances() of each module of module manager @@ -112,16 +112,21 @@ void rec_build_module_fabric_dependent_frame_bitstream(const BitstreamManager& b const ModuleId& parent_module = parent_modules.back(); size_t num_configurable_children = module_manager.configurable_children(parent_modules.back()).size(); - + + size_t max_child_addr_code_size = 0; bool add_addr_code = true; ModuleId decoder_module = ModuleId::INVALID(); /* Early exit if there is no configurable children */ if (0 == num_configurable_children) { + /* Ensure that there should be no configuration bits in the parent block */ + VTR_ASSERT(0 == bitstream_manager.block_bits(parent_block).size()); return; } - /* For only 1 configurable child, there is not frame decoder need, we can pass on addr code directly */ + /* For only 1 configurable child, + * there is no frame decoder here, we can pass on addr code directly + */ if (1 == num_configurable_children) { add_addr_code = false; } else { @@ -132,10 +137,18 @@ void rec_build_module_fabric_dependent_frame_bitstream(const BitstreamManager& b VTR_ASSERT(2 < num_configurable_children); num_configurable_children--; decoder_module = module_manager.configurable_children(parent_module).back(); + + /* The address code size is the max. of address port of all the configurable children */ + for (size_t child_id = 0; child_id < num_configurable_children; ++child_id) { + ModuleId child_module = module_manager.configurable_children(parent_module)[child_id]; + const ModulePortId& child_addr_port_id = module_manager.find_module_port(child_module, std::string(DECODER_ADDRESS_PORT_NAME)); + const BasicPort& child_addr_port = module_manager.module_port(child_module, child_addr_port_id); + max_child_addr_code_size = std::max((int)child_addr_port.get_width(), (int)max_child_addr_code_size); + } } for (size_t child_id = 0; child_id < num_configurable_children; ++child_id) { - ModuleId child_module = module_manager.configurable_children(parent_modules.back())[child_id]; + ModuleId child_module = module_manager.configurable_children(parent_module)[child_id]; size_t child_instance = module_manager.configurable_child_instances(parent_module)[child_id]; /* Get the instance name and ensure it is not empty */ std::string instance_name = module_manager.instance_name(parent_module, child_module, child_instance); @@ -161,7 +174,46 @@ void rec_build_module_fabric_dependent_frame_bitstream(const BitstreamManager& b const ModulePortId& decoder_addr_port_id = module_manager.find_module_port(decoder_module, std::string(DECODER_ADDRESS_PORT_NAME)); const BasicPort& decoder_addr_port = module_manager.module_port(decoder_module, decoder_addr_port_id); std::vector addr_bits_vec = itobin_vec(child_id, decoder_addr_port.get_width()); - child_addr_code.insert(child_addr_code.end(), addr_bits_vec.begin(), addr_bits_vec.end()); + + child_addr_code.insert(child_addr_code.begin(), addr_bits_vec.begin(), addr_bits_vec.end()); + + /* Note that the address port size of the child module may be smaller than the maximum + * of other child modules at this level. + * We will add dummy '0's to the head of addr_bit_vec. + * + * For example: + * Decoder is the decoder to access all the child modules + * whose address is decoded by the addr_bits_vec + * The child modules may use part of the address lines, + * we should add dummy '0' to fill the gap + * + * Addr_code for child[0]: '000' + addr_bits_vec + * Addr_code for child[1]: '0' + addr_bits_vec + * Addr_code for child[2]: addr_bits_vec + * + * Addr[6:8] + * | + * v + * +-------------------------------------------+ + * | Decoder Module | + * +-------------------------------------------+ + * + * Addr[0:2] Addr[0:4] Addr[0:5] + * | | | + * v v v + * +-----------+ +-------------+ +------------+ + * | Child[0] | | Child[1] | | Child[2] | + * +-----------+ +-------------+ +------------+ + * + * Child[2] has the maximum address lines among the children + * + */ + const ModulePortId& child_addr_port_id = module_manager.find_module_port(child_module, std::string(DECODER_ADDRESS_PORT_NAME)); + const BasicPort& child_addr_port = module_manager.module_port(child_module, child_addr_port_id); + if (0 < max_child_addr_code_size - child_addr_port.get_width()) { + std::vector dummy_codes(max_child_addr_code_size - child_addr_port.get_width(), 0); + child_addr_code.insert(child_addr_code.begin(), dummy_codes.begin(), dummy_codes.end()); + } } /* Go recursively */ @@ -172,17 +224,36 @@ void rec_build_module_fabric_dependent_frame_bitstream(const BitstreamManager& b } /* Ensure that there should be no configuration bits in the parent block */ VTR_ASSERT(0 == bitstream_manager.block_bits(parent_block).size()); + + return; } /* Note that, reach here, it means that this is a leaf node. - * We add the configuration bits to the fabric_bitstream, - * And then, we can return + * A leaf node (a memory module) always has a decoder inside + * which is the last of configurable children. + * We will find the address bit and add it to addr_code + * Then we can add the configuration bits to the fabric_bitstream. */ - for (const ConfigBitId& config_bit : bitstream_manager.block_bits(parent_blocks.back())) { + if (!(1 < module_manager.configurable_children(parent_modules.back()).size())) + VTR_ASSERT(1 < module_manager.configurable_children(parent_modules.back()).size()); + ModuleId decoder_module = module_manager.configurable_children(parent_modules.back()).back(); + /* Find the address port from the decoder module */ + const ModulePortId& decoder_addr_port_id = module_manager.find_module_port(decoder_module, std::string(DECODER_ADDRESS_PORT_NAME)); + const BasicPort& decoder_addr_port = module_manager.module_port(decoder_module, decoder_addr_port_id); + + for (size_t ibit = 0; ibit < bitstream_manager.block_bits(parent_blocks.back()).size(); ++ibit) { + + ConfigBitId config_bit = bitstream_manager.block_bits(parent_blocks.back())[ibit]; + std::vector addr_bits_vec = itobin_vec(ibit, decoder_addr_port.get_width()); + + std::vector child_addr_code = addr_code; + + child_addr_code.insert(child_addr_code.begin(), addr_bits_vec.begin(), addr_bits_vec.end()); + const FabricBitId& fabric_bit = fabric_bitstream.add_bit(config_bit); /* Set address */ - fabric_bitstream.set_bit_address(fabric_bit, addr_code); + fabric_bitstream.set_bit_address(fabric_bit, child_addr_code); /* Set data input */ fabric_bitstream.set_bit_din(fabric_bit, bitstream_manager.bit_value(config_bit)); diff --git a/openfpga/src/utils/module_manager_utils.cpp b/openfpga/src/utils/module_manager_utils.cpp index 85e71de3f..eebe9008a 100644 --- a/openfpga/src/utils/module_manager_utils.cpp +++ b/openfpga/src/utils/module_manager_utils.cpp @@ -941,7 +941,8 @@ void add_module_nets_cmos_memory_frame_decoder_config_bus(ModuleManager& module_ * Note that we only connect to the last few bits of address port */ for (size_t mem_index = 0; mem_index < configurable_children.size(); ++mem_index) { - ModuleId child_module = module_manager.configurable_children(parent_module)[mem_index]; + ModuleId child_module = configurable_children[mem_index]; + size_t child_instance = module_manager.configurable_child_instances(parent_module)[mem_index]; ModulePortId child_addr_port = module_manager.find_module_port(child_module, std::string(DECODER_ADDRESS_PORT_NAME)); BasicPort child_addr_port_info = module_manager.module_port(child_module, child_addr_port); for (size_t ipin = 0; ipin < child_addr_port_info.get_width(); ++ipin) { @@ -959,7 +960,7 @@ void add_module_nets_cmos_memory_frame_decoder_config_bus(ModuleManager& module_ } /* Configure the net sink */ module_manager.add_module_net_sink(parent_module, net, - child_module, 0, + child_module, child_instance, child_addr_port, child_addr_port_info.get_lsb() + ipin); } @@ -969,12 +970,13 @@ void add_module_nets_cmos_memory_frame_decoder_config_bus(ModuleManager& module_ * the memory modules */ ModulePortId parent_din_port = module_manager.find_module_port(parent_module, std::string(DECODER_DATA_IN_PORT_NAME)); - for (size_t mem_index = 0; mem_index < module_manager.configurable_children(parent_module).size(); ++mem_index) { + for (size_t mem_index = 0; mem_index < configurable_children.size(); ++mem_index) { ModuleId child_module = configurable_children[mem_index]; + size_t child_instance = module_manager.configurable_child_instances(parent_module)[mem_index]; ModulePortId child_din_port = module_manager.find_module_port(child_module, std::string(DECODER_DATA_IN_PORT_NAME)); add_module_bus_nets(module_manager, parent_module, parent_module, 0, parent_din_port, - child_module, 0, child_din_port); + child_module, child_instance, child_din_port); } /* Connect the data_out port of the decoder module @@ -985,6 +987,7 @@ void add_module_nets_cmos_memory_frame_decoder_config_bus(ModuleManager& module_ VTR_ASSERT(decoder_dout_port_info.get_width() == configurable_children.size()); for (size_t mem_index = 0; mem_index < configurable_children.size(); ++mem_index) { ModuleId child_module = configurable_children[mem_index]; + size_t child_instance = module_manager.configurable_child_instances(parent_module)[mem_index]; ModulePortId child_en_port = module_manager.find_module_port(child_module, std::string(DECODER_ENABLE_PORT_NAME)); BasicPort child_en_port_info = module_manager.module_port(child_module, child_en_port); for (size_t ipin = 0; ipin < child_en_port_info.get_width(); ++ipin) { @@ -1002,7 +1005,7 @@ void add_module_nets_cmos_memory_frame_decoder_config_bus(ModuleManager& module_ } /* Configure the net sink */ module_manager.add_module_net_sink(parent_module, net, - child_module, 0, + child_module, child_instance, child_en_port, child_en_port_info.pins()[ipin]); } From 1e73fd6def99fc5def3011a31fd13509c685607a Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 16:57:04 -0600 Subject: [PATCH 100/180] create configuration frame example script --- ...onfiguration_frame_example_script.openfpga | 68 +++++++++++++++++++ .../configuration_frame/config/task.conf | 2 +- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 openfpga_flow/OpenFPGAShellScripts/configuration_frame_example_script.openfpga diff --git a/openfpga_flow/OpenFPGAShellScripts/configuration_frame_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/configuration_frame_example_script.openfpga new file mode 100644 index 000000000..bcc8d36e3 --- /dev/null +++ b/openfpga_flow/OpenFPGAShellScripts/configuration_frame_example_script.openfpga @@ -0,0 +1,68 @@ +# Run VPR for the 'and' design +#--write_rr_graph example_rr_graph.xml +vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route + +# Read OpenFPGA architecture definition +read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} + +# Annotate the OpenFPGA architecture to VPR data base +# to debug use --verbose options +link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges + +# Check and correct any naming conflicts in the BLIF netlist +check_netlist_naming_conflict --fix --report ./netlist_renaming.xml + +# Apply fix-up to clustering nets based on routing results +pb_pin_fixup --verbose + +# Apply fix-up to Look-Up Table truth tables based on packing results +lut_truth_table_fixup + +# Build the module graph +# - Enabled compression on routing architecture modules +# - Enable pin duplication on grid modules +build_fabric --compress_routing #--verbose + +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + +# Repack the netlist to physical pbs +# This must be done before bitstream generator and testbench generation +# Strongly recommend it is done after all the fix-up have been applied +repack #--verbose + +# Build the bitstream +# - Output the fabric-independent bitstream to a file +build_architecture_bitstream --verbose --file fabric_indepenent_bitstream.xml + +# Build fabric-dependent bitstream +build_fabric_bitstream --verbose + +# Write the Verilog netlist for FPGA fabric +# - Enable the use of explicit port mapping in Verilog netlist +write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --include_signal_init --support_icarus_simulator --print_user_defined_template --verbose + +# Write the Verilog testbench for FPGA fabric +# - We suggest the use of same output directory as fabric Verilog netlists +# - Must specify the reference benchmark file if you want to output any testbenches +# - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA +# - Enable pre-configured top-level testbench which is a fast verification skipping programming phase +# - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini --explicit_port_mapping + +# Write the SDC files for PnR backend +# - Turn on every options here +write_pnr_sdc --file ./SDC + +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + +# Write the SDC to run timing analysis for a mapped FPGA fabric +write_analysis_sdc --file ./SDC_analysis + +# Finish and exit OpenFPGA +exit + +# Note : +# To run verification at the end of the flow maintain source in ./SRC directory diff --git a/openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf b/openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf index 87c487f63..7a448e3e8 100644 --- a/openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf @@ -8,7 +8,7 @@ [GENERAL] run_engine=openfpga_shell -openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/configuration_frame_example_script.openfpga power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml power_analysis = true spice_output=false From 8aa665b3b2856e1dddf9a6fa430c30486b52b7f5 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 17:46:14 -0600 Subject: [PATCH 101/180] bug fix in the Verilog codes for frame decoders --- openfpga/src/fpga_verilog/verilog_decoders.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 66a1a8ed8..9a37ba46b 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -330,8 +330,8 @@ void print_verilog_arch_decoder_module(std::fstream& fp, * The rest of addr codes 3'b110, 3'b111 will be decoded to data=8'b0_0000; */ - fp << "\t" << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ")" << std::endl; - fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << "1'b1) begin" << std::endl; + fp << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ") begin" << std::endl; + fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << " == 1'b1) begin" << std::endl; fp << "\t\t" << "case (" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ")" << std::endl; /* Create a string for addr and data */ for (size_t i = 0; i < data_size; ++i) { @@ -340,11 +340,19 @@ void print_verilog_arch_decoder_module(std::fstream& fp, fp << generate_verilog_port_constant_values(data_port, ito1hot_vec(i, data_size)); fp << ";" << std::endl; } + /* Different from the MUX encoders, architecture decoders will output all-zero by default!!! */ fp << "\t\t\t" << "default : "; - fp << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size - 1, data_size)); + fp << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)); fp << ";" << std::endl; fp << "\t\t" << "endcase" << std::endl; fp << "\t" << "end" << std::endl; + + /* If not enabled, we output all-zero */ + fp << "\t" << "else begin" << std::endl; + fp << "\t\t" << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)) << ";"<< std::endl; + fp << "\t" << "end" << std::endl; + + fp << "end" << std::endl; if (true == decoder_lib.use_data_inv_port(decoder)) { print_verilog_wire_connection(fp, data_inv_port, data_port, true); From f5968fda52ea31f21026f2d9c32bfb0f1709e1a7 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 18:13:06 -0600 Subject: [PATCH 102/180] add configurable latch Verilog codes --- openfpga_flow/VerilogNetlists/config_latch.v | 38 ++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 openfpga_flow/VerilogNetlists/config_latch.v diff --git a/openfpga_flow/VerilogNetlists/config_latch.v b/openfpga_flow/VerilogNetlists/config_latch.v new file mode 100644 index 000000000..6cbe5657e --- /dev/null +++ b/openfpga_flow/VerilogNetlists/config_latch.v @@ -0,0 +1,38 @@ +//----------------------------------------------------- +// Design Name : config_latch +// File Name : config_latch.v +// Function : A Configurable Latch where data storage +// can be updated at rising clock edge +// when wl is enabled +// Coder : Xifan TANG +//----------------------------------------------------- +module config_latch ( + input reset, // Reset input + input clk, // Clock Input + input wl, // Data Enable + input bl, // Data Input + output Q, // Q output + output Qb // Q output +); +//------------Internal Variables-------- +reg q_reg; + +//-------------Code Starts Here--------- +always @ ( posedge clk or posedge reset) begin + if (reset) begin + q_reg <= 1'b0; + end else if (1'b1 == wl) begin + q_reg <= bl; + end +end + +`ifndef ENABLE_FORMAL_VERIFICATION +// Wire q_reg to Q +assign Q = q_reg; +assign Qb = ~q_reg; +`else +assign Q = 1'bZ; +assign Qb = !Q; +`endif + +endmodule From 6a72c66eb8e610bbc300590a35bc8496a0d3c47b Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 18:22:27 -0600 Subject: [PATCH 103/180] bug fixed for frame-based configuration memory in top-level full testbench --- openfpga/src/fpga_verilog/verilog_decoders.cpp | 5 +++++ openfpga/src/fpga_verilog/verilog_top_testbench.cpp | 3 ++- openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml | 6 +++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 9a37ba46b..70b65ee61 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -299,7 +299,12 @@ void print_verilog_arch_decoder_module(std::fstream& fp, * data_inv = ~data_inv */ if (1 == data_size) { + fp << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ") begin" << std::endl; + fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << " == 1'b1) begin" << std::endl; + fp << "\t"; print_verilog_wire_connection(fp, data_port, addr_port, false); + fp << "\t" << "end" << std::endl; + fp << "end" << std::endl; /* Depend on if the inverted data output port is needed or not */ if (true == decoder_lib.use_data_inv_port(decoder)) { diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 9041df361..5a5d98aed 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -102,7 +102,7 @@ void print_verilog_top_testbench_frame_decoder_port(std::fstream& fp, ModulePortId din_port_id = module_manager.find_module_port(top_module, std::string(DECODER_DATA_IN_PORT_NAME)); BasicPort din_port = module_manager.module_port(top_module, din_port_id); - fp << generate_verilog_port(VERILOG_PORT_WIRE, din_port) << ";" << std::endl; + fp << generate_verilog_port(VERILOG_PORT_REG, din_port) << ";" << std::endl; /* Wire the programming clock to the enable signal */ print_verilog_comment(fp, std::string("---- Wire enable port of frame-based decoder to programming clock -----")); @@ -111,6 +111,7 @@ void print_verilog_top_testbench_frame_decoder_port(std::fstream& fp, BasicPort en_port = module_manager.module_port(top_module, en_port_id); BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); + fp << generate_verilog_port(VERILOG_PORT_WIRE, en_port) << ";" << std::endl; print_verilog_wire_connection(fp, en_port, prog_clock_port, false); } diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml index e5fe5a89b..a0e0194b5 100644 --- a/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml @@ -142,7 +142,7 @@ - + @@ -158,13 +158,13 @@ - + - + From 986956e47468c2213912a3886ed2879b69ac141e Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 18:29:22 -0600 Subject: [PATCH 104/180] bug fix for arch decoder Verilog codes. Now Modelsim compiles ok. --- openfpga/src/fpga_verilog/verilog_decoders.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 70b65ee61..2637736ea 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -301,8 +301,8 @@ void print_verilog_arch_decoder_module(std::fstream& fp, if (1 == data_size) { fp << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ") begin" << std::endl; fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << " == 1'b1) begin" << std::endl; - fp << "\t"; - print_verilog_wire_connection(fp, data_port, addr_port, false); + fp << "\t\t" << generate_verilog_port(VERILOG_PORT_CONKT, data_port); + fp << " = " << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ";" << std::endl; fp << "\t" << "end" << std::endl; fp << "end" << std::endl; From bdc9efb38fe15dd4711b78ad15b86945d002e6c1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 18:34:18 -0600 Subject: [PATCH 105/180] bug fix in top-level testbench for frame-based decoders --- openfpga/src/fpga_verilog/verilog_top_testbench.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 5a5d98aed..26ce99b92 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -598,7 +598,7 @@ void print_verilog_top_testbench_load_bitstream_task_frame_decoder(std::fstream& /* Add an empty line as splitter */ fp << std::endl; - /* Feed the address and data input at each rising edge of programming clock + /* Feed the address and data input at each falling edge of programming clock * As the enable signal is wired to the programming clock, we should synchronize * address and data with the enable signal */ @@ -607,7 +607,7 @@ void print_verilog_top_testbench_load_bitstream_task_frame_decoder(std::fstream& fp << generate_verilog_port(VERILOG_PORT_INPUT, addr_value) << ";" << std::endl; fp << generate_verilog_port(VERILOG_PORT_INPUT, din_value) << ";" << std::endl; fp << "\tbegin" << std::endl; - fp << "\t\t@(posedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; + fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; fp << "\t\t\t"; fp << generate_verilog_port(VERILOG_PORT_CONKT, addr_port); From b8c449d520931882b5771bcf29d5ddbbc29e7a6f Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 18:46:47 -0600 Subject: [PATCH 106/180] add comments for decoding functions to help debugging the frame-based decoders --- .../libopenfpgautil/src/openfpga_decode.cpp | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/libopenfpga/libopenfpgautil/src/openfpga_decode.cpp b/libopenfpga/libopenfpgautil/src/openfpga_decode.cpp index 9839f13b9..06b3487b0 100644 --- a/libopenfpga/libopenfpgautil/src/openfpga_decode.cpp +++ b/libopenfpga/libopenfpgautil/src/openfpga_decode.cpp @@ -14,6 +14,21 @@ namespace openfpga { /******************************************************************** * Convert an integer to an one-hot encoding integer array + * For example: + * Input integer: 3 + * Binary length : 4 + * Output: + * index | 0 | 1 | 2 | 3 + * ret | 0 | 0 | 0 | 1 + * + * If you need all zero code, set the input integer same as the binary length + * For example: + * Input integer: 4 + * Binary length : 4 + * Output: + * index | 0 | 1 | 2 | 3 + * ret | 0 | 0 | 0 | 0 + * ********************************************************************/ std::vector ito1hot_vec(const size_t& in_int, const size_t& bin_len) { @@ -33,6 +48,12 @@ std::vector ito1hot_vec(const size_t& in_int, /******************************************************************** * Converter an integer to a binary vector + * For example: + * Input integer: 4 + * Binary length : 3 + * Output: + * index | 0 | 1 | 2 + * ret | 0 | 0 | 1 ********************************************************************/ std::vector itobin_vec(const size_t& in_int, const size_t& bin_len) { From 31c9a011dd8b7a13d019e53409c1a678acd0f5c8 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 21:24:41 -0600 Subject: [PATCH 107/180] keep bug fixing for arch decoders --- .../src/fpga_verilog/verilog_decoders.cpp | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 2637736ea..64568515c 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -299,10 +299,13 @@ void print_verilog_arch_decoder_module(std::fstream& fp, * data_inv = ~data_inv */ if (1 == data_size) { - fp << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ") begin" << std::endl; + fp << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port); + fp << " or " << generate_verilog_port(VERILOG_PORT_CONKT, enable_port); + fp << ") begin" << std::endl; fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << " == 1'b1) begin" << std::endl; - fp << "\t\t" << generate_verilog_port(VERILOG_PORT_CONKT, data_port); - fp << " = " << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ";" << std::endl; + fp << "\t\t" << generate_verilog_port_constant_values(data_port, std::vector(1, 1)) << ";" << std::endl; + fp << "\t" << "end else begin" << std::endl; + fp << "\t\t" << generate_verilog_port_constant_values(data_port, std::vector(1, 0)) << ";" << std::endl; fp << "\t" << "end" << std::endl; fp << "end" << std::endl; @@ -335,7 +338,9 @@ void print_verilog_arch_decoder_module(std::fstream& fp, * The rest of addr codes 3'b110, 3'b111 will be decoded to data=8'b0_0000; */ - fp << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ") begin" << std::endl; + fp << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port); + fp << " or " << generate_verilog_port(VERILOG_PORT_CONKT, enable_port); + fp << ") begin" << std::endl; fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << " == 1'b1) begin" << std::endl; fp << "\t\t" << "case (" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ")" << std::endl; /* Create a string for addr and data */ @@ -345,18 +350,21 @@ void print_verilog_arch_decoder_module(std::fstream& fp, fp << generate_verilog_port_constant_values(data_port, ito1hot_vec(i, data_size)); fp << ";" << std::endl; } - /* Different from the MUX encoders, architecture decoders will output all-zero by default!!! */ - fp << "\t\t\t" << "default : "; + /* Different from MUX decoder, we assign default values which is all zero */ + fp << "\t\t\t" << "default"; + fp << " : "; fp << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)); fp << ";" << std::endl; + fp << "\t\t" << "endcase" << std::endl; fp << "\t" << "end" << std::endl; - - /* If not enabled, we output all-zero */ - fp << "\t" << "else begin" << std::endl; - fp << "\t\t" << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)) << ";"<< std::endl; - fp << "\t" << "end" << std::endl; + /* If enable is not active, we should give all zero */ + fp << "\t" << "else begin" << std::endl; + fp << "\t\t" << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)); + fp << ";" << std::endl; + fp << "\t" << "end" << std::endl; + fp << "end" << std::endl; if (true == decoder_lib.use_data_inv_port(decoder)) { From 583c15131bfa991c73d327aa90d982b49869601f Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 21:33:44 -0600 Subject: [PATCH 108/180] change configuration latch to be triggered at negative edge; Frame-based fabric passed Modelsim verification but failed in iVerilog --- openfpga_flow/VerilogNetlists/config_latch.v | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfpga_flow/VerilogNetlists/config_latch.v b/openfpga_flow/VerilogNetlists/config_latch.v index 6cbe5657e..e177fe2e7 100644 --- a/openfpga_flow/VerilogNetlists/config_latch.v +++ b/openfpga_flow/VerilogNetlists/config_latch.v @@ -18,7 +18,7 @@ module config_latch ( reg q_reg; //-------------Code Starts Here--------- -always @ ( posedge clk or posedge reset) begin +always @ ( negedge clk or posedge reset) begin if (reset) begin q_reg <= 1'b0; end else if (1'b1 == wl) begin From b5e5182f524713c6c6c7f1172ca1b1561c092ebb Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 23:05:24 -0600 Subject: [PATCH 109/180] frame-based configuration protocol is working on k4n4 arch now. Spot bugs in iVerilog about negedge flip-flops --- .../fpga_verilog/verilog_top_testbench.cpp | 25 ++++++++++++++----- openfpga_flow/VerilogNetlists/config_latch.v | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 26ce99b92..91e5eb8cf 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -104,15 +104,15 @@ void print_verilog_top_testbench_frame_decoder_port(std::fstream& fp, BasicPort din_port = module_manager.module_port(top_module, din_port_id); fp << generate_verilog_port(VERILOG_PORT_REG, din_port) << ";" << std::endl; - /* Wire the programming clock to the enable signal */ - print_verilog_comment(fp, std::string("---- Wire enable port of frame-based decoder to programming clock -----")); + /* Wire the INVERTED programming clock to the enable signal !!! */ + print_verilog_comment(fp, std::string("---- Wire enable port of frame-based decoder to inverted programming clock -----")); ModulePortId en_port_id = module_manager.find_module_port(top_module, std::string(DECODER_ENABLE_PORT_NAME)); BasicPort en_port = module_manager.module_port(top_module, en_port_id); BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); fp << generate_verilog_port(VERILOG_PORT_WIRE, en_port) << ";" << std::endl; - print_verilog_wire_connection(fp, en_port, prog_clock_port, false); + print_verilog_wire_connection(fp, en_port, prog_clock_port, true); } /******************************************************************** @@ -581,7 +581,9 @@ void print_verilog_top_testbench_load_bitstream_task_frame_decoder(std::fstream& /* Validate the file stream */ valid_file_stream(fp); - BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); + ModulePortId en_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort en_port = module_manager.module_port(top_module, en_port_id); ModulePortId addr_port_id = module_manager.find_module_port(top_module, std::string(DECODER_ADDRESS_PORT_NAME)); @@ -602,12 +604,12 @@ void print_verilog_top_testbench_load_bitstream_task_frame_decoder(std::fstream& * As the enable signal is wired to the programming clock, we should synchronize * address and data with the enable signal */ - print_verilog_comment(fp, std::string("----- Task: address and data values during a programming clock cycle -----")); + print_verilog_comment(fp, std::string("----- Task: assign address and data values at rising edge of enable signal -----")); fp << "task " << std::string(TOP_TESTBENCH_PROG_TASK_NAME) << ";" << std::endl; fp << generate_verilog_port(VERILOG_PORT_INPUT, addr_value) << ";" << std::endl; fp << generate_verilog_port(VERILOG_PORT_INPUT, din_value) << ";" << std::endl; fp << "\tbegin" << std::endl; - fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; + fp << "\t\t@(posedge " << generate_verilog_port(VERILOG_PORT_CONKT, en_port) << ");" << std::endl; fp << "\t\t\t"; fp << generate_verilog_port(VERILOG_PORT_CONKT, addr_port); @@ -919,6 +921,17 @@ void print_verilog_top_testbench_frame_decoder_bitstream(std::fstream& fp, fp << ");" << std::endl; } + /* Disable the address and din */ + fp << "\t\t" << std::string(TOP_TESTBENCH_PROG_TASK_NAME); + fp << "(" << addr_port.get_width() << "'b"; + std::vector all_zero_addr(addr_port.get_width(), 0); + for (const size_t& addr_bit : all_zero_addr) { + fp << addr_bit; + } + fp << ", "; + fp <<"1'b0"; + fp << ");" << std::endl; + /* Raise the flag of configuration done when bitstream loading is complete */ BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; diff --git a/openfpga_flow/VerilogNetlists/config_latch.v b/openfpga_flow/VerilogNetlists/config_latch.v index e177fe2e7..6cbe5657e 100644 --- a/openfpga_flow/VerilogNetlists/config_latch.v +++ b/openfpga_flow/VerilogNetlists/config_latch.v @@ -18,7 +18,7 @@ module config_latch ( reg q_reg; //-------------Code Starts Here--------- -always @ ( negedge clk or posedge reset) begin +always @ ( posedge clk or posedge reset) begin if (reset) begin q_reg <= 1'b0; end else if (1'b1 == wl) begin From cdc2237008ad70104bbde858f80bc13f61bfb790 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 28 May 2020 23:07:03 -0600 Subject: [PATCH 110/180] deploy frame-based configuration protocol to travis CI --- .travis/script.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis/script.sh b/.travis/script.sh index ba4c209a1..0cb3326e6 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -51,6 +51,9 @@ echo -e "Testing OpenFPGA Shell"; echo -e "Testing configuration chain of a K4N4 FPGA"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/configuration_chain --debug --show_thread_logs +echo -e "Testing fram-based configuration protocol of a K4N4 FPGA"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/configuration_frame --debug --show_thread_logs + echo -e "Testing user-defined simulation settings: clock frequency and number of cycles"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/fixed_simulation_settings --debug --show_thread_logs From de07712a3a1bbb5477ee8853c381fce44178dd3b Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 29 May 2020 14:02:33 -0600 Subject: [PATCH 111/180] update documentation about the frame-based configuration protocol --- .../manual/arch_lang/annotate_vpr_arch.rst | 80 ----------- .../arch_lang/circuit_model_examples.rst | 57 +++++++- .../manual/arch_lang/config_protocol.rst | 126 ++++++++++++++++++ .../manual/arch_lang/figures/config_latch.png | Bin 0 -> 16495 bytes .../figures/frame_config_protocol.png | Bin 0 -> 85962 bytes .../figures/frame_config_protocol_example.png | Bin 0 -> 259112 bytes .../manual/arch_lang/figures/sram_blwl.png | Bin 0 -> 41280 bytes docs/source/manual/arch_lang/index.rst | 2 + 8 files changed, 184 insertions(+), 81 deletions(-) create mode 100644 docs/source/manual/arch_lang/config_protocol.rst create mode 100644 docs/source/manual/arch_lang/figures/config_latch.png create mode 100644 docs/source/manual/arch_lang/figures/frame_config_protocol.png create mode 100644 docs/source/manual/arch_lang/figures/frame_config_protocol_example.png create mode 100644 docs/source/manual/arch_lang/figures/sram_blwl.png diff --git a/docs/source/manual/arch_lang/annotate_vpr_arch.rst b/docs/source/manual/arch_lang/annotate_vpr_arch.rst index 69aed061e..39e02269c 100644 --- a/docs/source/manual/arch_lang/annotate_vpr_arch.rst +++ b/docs/source/manual/arch_lang/annotate_vpr_arch.rst @@ -4,86 +4,6 @@ Bind circuit modules to VPR architecture ---------------------------------------- Each defined circuit model should be linked to an FPGA module defined in the original part of architecture descriptions. It helps FPGA-circuit creating the circuit netlists for logic/routing blocks. Since the original part lacks such support, we create a few XML properties to link to Circuit models. -Configuration Protocol -~~~~~~~~~~~~~~~~~~~~~~ - -Configuration protocol is the circuitry designed to program an FPGA. -As an interface, configuration protocol could be really different in FPGAs, depending on the application context. - -Template -```````` - -.. code-block:: xml - - - - - -.. option:: type="scan_chain|memory_bank|standalone" - - Specify the type of configuration circuits. - - OpenFPGA supports different types of configuration protocols to program FPGA fabrics: - - ``scan_chain``: configurable memories are connected in a chain. Bitstream is loaded serially to program a FPGA - - ``memory_bank``: configurable memories are organized in an array, where each element can be accessed by an unique address to the BL/WL decoders - - ``standalone``: configurable memories are directly accessed through ports of FPGA fabrics. In other words, there are no protocol to control the memories. This allows full customization on the configuration protocol for hardware engineers. - - .. note:: Avoid to use ``standalone`` when designing an FPGA chip. It will causes a huge number of I/Os required, far beyond any package size. It is well applicable to eFPGAs, where designers do need customized protocols between FPGA and processors. - -.. warning:: Currently FPGA-SPICE only supports standalone memory organization. - -.. warning:: Currently RRAM-based FPGA only supports memory-bank organization for Verilog Generator. - -.. option:: circuit_model_name="" - - Specify the name of circuit model to be used as configurable memory. - - ``scan_chain`` requires a circuit model type of ``ccff`` - - ``memory_bank`` requires a circuit model type of ``sram`` - - ``standalone`` requires a circuit model type of ``sram`` - -Configuration Chain Example -``````````````````````````` -The following XML code describes a scan-chain circuitry to configure the core logic of FPGA, as illustrated in :numref:`fig_ccff_fpga`. -It will use the circuit model defined in :ref:`circuit_model_examples`. - -.. code-block:: xml - - - - - -.. _fig_ccff_fpga: - -.. figure:: figures/ccff_fpga.png - :scale: 60% - :alt: map to buried treasure - - Example of a configuration chain to program core logic of a FPGA - -Memory bank Example -``````````````````` -The following XML code describes a memory-bank circuitry to configure the core logic of FPGA, as illustrated in :numref:`fig_sram`. -It will use the circuit model defined in :ref:`circuit_model_examples`. - -.. code-block:: xml - - - - - -.. _fig_sram: - -.. figure:: figures/sram.png - :scale: 60% - :alt: map to buried treasure - - Example of a memory organization using memory decoders - -Standalone SRAM Example -``````````````````````` - -.. warning:: TO BE CONSTRUCTED - Switch Blocks ~~~~~~~~~~~~~ diff --git a/docs/source/manual/arch_lang/circuit_model_examples.rst b/docs/source/manual/arch_lang/circuit_model_examples.rst index 9b689d2f7..e93d18e6a 100644 --- a/docs/source/manual/arch_lang/circuit_model_examples.rst +++ b/docs/source/manual/arch_lang/circuit_model_examples.rst @@ -240,7 +240,62 @@ Template .. note:: The information of input and output buffer should be clearly specified according to the customized Verilog/SPICE netlist! The existence of input/output buffers will influence the decision in creating testbenches, which may leads to larger errors in power analysis. -.. note:: The support SRAM modules should have a BL and a WL when the memory-bank-style configuration circuit is declared. Note that the WL should be the write/read enable signal, while BL is the data input. +SRAM with BL/WL +``````````````` +.. _fig_sram_blwl: + +.. figure:: ./figures/sram_blwl.png + :scale: 100% + + An example of a SRAM with Bit-Line (BL) and Word-Line (WL) control signals + +The following XML codes describes the SRAM cell shown in :numref:`fig_sram_blwl`. + +.. code-block:: xml + + + + + + + + + + + + +.. note:: OpenFPGA always assume that a ``WL`` port should be the write/read enable signal, while a ``BL`` port is the data input. + +.. note:: When the ``memory_bank`` type of configuration procotol is specified, SRAM modules should have a BL and a WL. + +Configurable Latch +`````````````````` + +.. _fig_config_latch: + +.. figure:: ./figures/config_latch.png + :scale: 100% + + An example of a SRAM-based configurable latch with Bit-Line (BL) and Word-Line (WL) control signals + +The following XML codes describes the configurable latch shown in :numref:`fig_config_latch`. + +.. code-block:: xml + + + + + + + + + + + + +.. note:: OpenFPGA always assume that a ``WL`` port should be the write/read enable signal, while a ``BL`` port is the data input. + +.. note:: When the ``frame_based`` type of configuration procotol is specified, the configurable latch or a SRAM with ``BL`` and ``WL`` should be specified. Logic gates ~~~~~~~~~~~ diff --git a/docs/source/manual/arch_lang/config_protocol.rst b/docs/source/manual/arch_lang/config_protocol.rst new file mode 100644 index 000000000..f37c7f18b --- /dev/null +++ b/docs/source/manual/arch_lang/config_protocol.rst @@ -0,0 +1,126 @@ +.. _config_protocol: + +Configuration Protocol +---------------------- + +Configuration protocol is the circuitry designed to program an FPGA. +As an interface, configuration protocol could be really different in FPGAs, depending on the application context. +OpenFPGA supports versatile configuration protocol, providing different trade-offs between speed and area. + +Template +~~~~~~~~ + +.. code-block:: xml + + + + + +.. option:: type="scan_chain|memory_bank|standalone" + + Specify the type of configuration circuits. + + OpenFPGA supports different types of configuration protocols to program FPGA fabrics: + - ``scan_chain``: configurable memories are connected in a chain. Bitstream is loaded serially to program a FPGA + - ``frame_based``: configurable memories are organized by frames. Each module of a FPGA fabric, e.g., Configurable Logic Block (CLB), Switch Block (SB) and Connection Block (CB), is considered as a frame of configurable memories. Inside each frame, all the memory banks are accessed through an address decoder. Users can write each memory cell with a specific address. Note that the frame-based memory organization is applid hierarchically. Each frame may consists of a number of sub frames, each of which follows the similar organization. + - ``memory_bank``: configurable memories are organized in an array, where each element can be accessed by an unique address to the BL/WL decoders + - ``standalone``: configurable memories are directly accessed through ports of FPGA fabrics. In other words, there are no protocol to control the memories. This allows full customization on the configuration protocol for hardware engineers. + + .. note:: Avoid to use ``standalone`` when designing an FPGA chip. It will causes a huge number of I/Os required, far beyond any package size. It is well applicable to eFPGAs, where designers do need customized protocols between FPGA and processors. + +.. warning:: Currently FPGA-SPICE only supports standalone memory organization. + +.. warning:: Currently RRAM-based FPGA only supports memory-bank organization for Verilog Generator. + +.. option:: circuit_model_name="" + + Specify the name of circuit model to be used as configurable memory. + - ``scan_chain`` requires a circuit model type of ``ccff`` + - ``frame_based`` requires a circuit model type of ``sram`` + - ``memory_bank`` requires a circuit model type of ``sram`` + - ``standalone`` requires a circuit model type of ``sram`` + +Configuration Chain Example +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The following XML code describes a scan-chain circuitry to configure the core logic of FPGA, as illustrated in :numref:`fig_ccff_fpga`. +It will use the circuit model defined in :numref:`fig_ccff`. + +.. code-block:: xml + + + + + +.. _fig_ccff_fpga: + +.. figure:: figures/ccff_fpga.png + :scale: 60% + :alt: map to buried treasure + + Example of a configuration chain to program core logic of a FPGA + +Frame-based Example +~~~~~~~~~~~~~~~~~~~ +The following XML code describes frame-based memory banks to configure the core logic of FPGA. +It will use the circuit model defined in :numref:`fig_config_latch`. + +.. code-block:: xml + + + + + +Through frame-based configuration protocol, each memory cell can be accessed with an unique address given to decoders. +:numref:`fig_frame_config_protocol_example` illustrates an example about how the configurable memories are organizaed inside a Logic Element (LE) shown in :numref:`fig_k4n4_arch`. +The decoder inside the LE will enable the decoders of the Look-Up Table (LUT) and the routing multiplexer, based on the given address at ``address[2:2]``. +When the decoder of sub block, e.g., the LUT, is enabled, each memory cells can be accessed throught the ``address[1:0]`` and the data to write is provided at ``data_in``. + +.. _fig_frame_config_protocol_example: + +.. figure:: figures/frame_config_protocol_example.png + :scale: 25% + :alt: map to buried treasure + + Example of a frame-based memory organization inside a Logic Element + +:numref:`fig_frame_config_protocol` shows a hierarchical view on how the frame-based decoders across a FPGA fabric. + +.. _fig_frame_config_protocol: + +.. figure:: figures/frame_config_protocol.png + :scale: 60% + :alt: map to buried treasure + + Frame-based memory organization in a hierarchical view + +.. note:: Frame-based decoders does require a memory cell to have + + - two outputs (one regular and another inverted) + - a Bit-Line input to load the data + - a Word-Line input to enable data write + +Memory bank Example +~~~~~~~~~~~~~~~~~~~ +The following XML code describes a memory-bank circuitry to configure the core logic of FPGA, as illustrated in :numref:`fig_sram`. +It will use the circuit model defined in :numref:`fig_sram_blwl`. + +.. code-block:: xml + + + + + +.. _fig_sram: + +.. figure:: figures/sram.png + :scale: 60% + :alt: map to buried treasure + + Example of a memory organization using memory decoders + +.. warning:: THIS IS STILL UNDER CONSTRUCTION + +Standalone SRAM Example +~~~~~~~~~~~~~~~~~~~~~~~ + +.. warning:: TO BE CONSTRUCTED diff --git a/docs/source/manual/arch_lang/figures/config_latch.png b/docs/source/manual/arch_lang/figures/config_latch.png new file mode 100644 index 0000000000000000000000000000000000000000..33506a49f37328fee0bd8e3dd0df9f29ca27c7ef GIT binary patch literal 16495 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

5I**XzdMK+jJEzHxTn-( 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

?ZS4%7X?UaX93x*VbTh` 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

1;e<5?|D-ccD7*HdKCMX__t$YmM3(T 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 LISlIuznEn*4?o+Z*Z%d2T@E}Pyc+hn)#Fac< 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 TO0R!_fS(t#$}*+Ti~|2ZLV;dA literal 0 HcmV?d00001 diff --git a/docs/source/manual/arch_lang/figures/sram_blwl.png b/docs/source/manual/arch_lang/figures/sram_blwl.png new file mode 100644 index 0000000000000000000000000000000000000000..243420fbc0ff508bf6945db9b15d2e09afba4db6 GIT binary patch literal 41280 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 n83&gSL%D_Re|wpirX Date: Fri, 29 May 2020 15:59:57 -0600 Subject: [PATCH 112/180] file moving in regression tests --- .travis/script.sh | 4 ++-- .../{ => full_testbench}/configuration_chain/config/task.conf | 0 .../{ => full_testbench}/configuration_frame/config/task.conf | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename openfpga_flow/tasks/openfpga_shell/{ => full_testbench}/configuration_chain/config/task.conf (100%) rename openfpga_flow/tasks/openfpga_shell/{ => full_testbench}/configuration_frame/config/task.conf (100%) diff --git a/.travis/script.sh b/.travis/script.sh index 0cb3326e6..8a716156b 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -49,10 +49,10 @@ python3 openfpga_flow/scripts/run_fpga_task.py duplicate_grid_pin --debug --show echo -e "Testing OpenFPGA Shell"; echo -e "Testing configuration chain of a K4N4 FPGA"; -python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/configuration_chain --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/configuration_chain --debug --show_thread_logs echo -e "Testing fram-based configuration protocol of a K4N4 FPGA"; -python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/configuration_frame --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/configuration_frame --debug --show_thread_logs echo -e "Testing user-defined simulation settings: clock frequency and number of cycles"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/fixed_simulation_settings --debug --show_thread_logs diff --git a/openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_chain/config/task.conf similarity index 100% rename from openfpga_flow/tasks/openfpga_shell/configuration_chain/config/task.conf rename to openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_chain/config/task.conf diff --git a/openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_frame/config/task.conf similarity index 100% rename from openfpga_flow/tasks/openfpga_shell/configuration_frame/config/task.conf rename to openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_frame/config/task.conf From 05aa166a9e852277174add04e19ec75e987ba90e Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 29 May 2020 16:12:51 -0600 Subject: [PATCH 113/180] add preconfig testbench cases to regression tests for different configuration protocols --- .../configuration_chain/config/task.conf | 34 +++++++++++++++++++ .../configuration_frame/config/task.conf | 34 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_chain/config/task.conf create mode 100644 openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_frame/config/task.conf diff --git a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_chain/config/task.conf b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_chain/config/task.conf new file mode 100644 index 000000000..3fd340a7b --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_chain/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +vpr_fpga_verilog_formal_verification_top_netlist= diff --git a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_frame/config/task.conf b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_frame/config/task.conf new file mode 100644 index 000000000..4a41fc671 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_frame/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +vpr_fpga_verilog_formal_verification_top_netlist= From 22648cdb9cabaa4e37b5c41d548aef87c1707f8f Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 29 May 2020 16:14:22 -0600 Subject: [PATCH 114/180] deploy the preconfig testbench cases to CI --- .travis/script.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis/script.sh b/.travis/script.sh index 8a716156b..37ad55006 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -50,9 +50,11 @@ echo -e "Testing OpenFPGA Shell"; echo -e "Testing configuration chain of a K4N4 FPGA"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/configuration_chain --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/configuration_chain --debug --show_thread_logs echo -e "Testing fram-based configuration protocol of a K4N4 FPGA"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/configuration_frame --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/configuration_frame --debug --show_thread_logs echo -e "Testing user-defined simulation settings: clock frequency and number of cycles"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/fixed_simulation_settings --debug --show_thread_logs From 8b3e79766c4c0a78212fbc51ffb948daffb4ffac Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 29 May 2020 18:07:21 -0600 Subject: [PATCH 115/180] add fast configuration option to fpga_verilog to speed up full testbench simulation --- openfpga/src/base/openfpga_verilog.cpp | 2 + .../src/base/openfpga_verilog_command.cpp | 3 + openfpga/src/fpga_verilog/verilog_api.cpp | 1 + .../verilog_testbench_options.cpp | 8 +++ .../fpga_verilog/verilog_testbench_options.h | 3 + .../fpga_verilog/verilog_top_testbench.cpp | 63 +++++++++++++++-- .../src/fpga_verilog/verilog_top_testbench.h | 1 + ...onfiguration_frame_example_script.openfpga | 2 +- .../full_testbench_example_script.openfpga | 68 +++++++++++++++++++ .../configuration_frame/config/task.conf | 2 +- 10 files changed, 145 insertions(+), 8 deletions(-) create mode 100644 openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga diff --git a/openfpga/src/base/openfpga_verilog.cpp b/openfpga/src/base/openfpga_verilog.cpp index c67c270eb..926e0f8d3 100644 --- a/openfpga/src/base/openfpga_verilog.cpp +++ b/openfpga/src/base/openfpga_verilog.cpp @@ -67,6 +67,7 @@ int write_verilog_testbench(OpenfpgaContext& openfpga_ctx, CommandOptionId opt_output_dir = cmd.option("file"); CommandOptionId opt_reference_benchmark = cmd.option("reference_benchmark_file_path"); CommandOptionId opt_print_top_testbench = cmd.option("print_top_testbench"); + CommandOptionId opt_fast_configuration = cmd.option("fast_configuration"); CommandOptionId opt_print_formal_verification_top_netlist = cmd.option("print_formal_verification_top_netlist"); CommandOptionId opt_print_preconfig_top_testbench = cmd.option("print_preconfig_top_testbench"); CommandOptionId opt_print_simulation_ini = cmd.option("print_simulation_ini"); @@ -81,6 +82,7 @@ int write_verilog_testbench(OpenfpgaContext& openfpga_ctx, options.set_reference_benchmark_file_path(cmd_context.option_value(cmd, opt_reference_benchmark)); options.set_print_formal_verification_top_netlist(cmd_context.option_enable(cmd, opt_print_formal_verification_top_netlist)); options.set_print_preconfig_top_testbench(cmd_context.option_enable(cmd, opt_print_preconfig_top_testbench)); + options.set_fast_configuration(cmd_context.option_enable(cmd, opt_fast_configuration)); options.set_print_top_testbench(cmd_context.option_enable(cmd, opt_print_top_testbench)); options.set_print_simulation_ini(cmd_context.option_value(cmd, opt_print_simulation_ini)); options.set_explicit_port_mapping(cmd_context.option_enable(cmd, opt_explicit_port_mapping)); diff --git a/openfpga/src/base/openfpga_verilog_command.cpp b/openfpga/src/base/openfpga_verilog_command.cpp index 99ee7a319..89c4e27e3 100644 --- a/openfpga/src/base/openfpga_verilog_command.cpp +++ b/openfpga/src/base/openfpga_verilog_command.cpp @@ -79,6 +79,9 @@ ShellCommandId add_openfpga_write_verilog_testbench_command(openfpga::Shell Date: Fri, 29 May 2020 18:08:16 -0600 Subject: [PATCH 116/180] add fast configuration testcase --- .../fast_configuration_frame/config/task.conf | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf new file mode 100644 index 000000000..7a448e3e8 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/configuration_frame_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +#vpr_fpga_verilog_formal_verification_top_netlist= From 9e176b8d383da30f1880267b30eed967963928fe Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 29 May 2020 18:22:36 -0600 Subject: [PATCH 117/180] add fast configuration stats to log --- openfpga/src/fpga_verilog/verilog_top_testbench.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 5c6795132..4a1072c70 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -505,12 +505,17 @@ size_t calculate_num_config_clock_cycles(const e_config_protocol_type& sram_orgz case CONFIG_MEM_FRAME_BASED: { /* For fast configuration, we will skip all the zero data points */ if (true == fast_configuration) { + size_t full_num_config_clock_cycles = num_config_clock_cycles; num_config_clock_cycles = 1; for (const FabricBitId& bit_id : fabric_bitstream.bits()) { if (true == fabric_bitstream.bit_din(bit_id)) { num_config_clock_cycles++; } } + VTR_LOG("Fast configuration reduces number of configuration clock cycles from %lu to %lu (compression_rate = %f%)\n", + full_num_config_clock_cycles, + num_config_clock_cycles, + 100. * ((float)num_config_clock_cycles / (float)full_num_config_clock_cycles - 1.)); } break; } @@ -520,6 +525,9 @@ size_t calculate_num_config_clock_cycles(const e_config_protocol_type& sram_orgz exit(1); } + VTR_LOG("Will use %ld configuration clock cycles to top testbench\n", + num_config_clock_cycles); + return num_config_clock_cycles; } From 9a6a5e331024b2fa5f7759b198aa0eba4b167f45 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 29 May 2020 18:23:12 -0600 Subject: [PATCH 118/180] deploy fast configuration testcase to CI --- .travis/script.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis/script.sh b/.travis/script.sh index 37ad55006..9d222c17a 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -54,6 +54,7 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbenc echo -e "Testing fram-based configuration protocol of a K4N4 FPGA"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/configuration_frame --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fast_configuration_frame --debug --show_thread_logs python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/configuration_frame --debug --show_thread_logs echo -e "Testing user-defined simulation settings: clock frequency and number of cycles"; From d2d443a988d65ec5a0677a990f1581e5594ea024 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 29 May 2020 20:55:45 -0600 Subject: [PATCH 119/180] start developing memory bank and standalone configuration protocol --- openfpga/src/base/openfpga_reserved_words.h | 2 + openfpga/src/fabric/build_memory_modules.cpp | 276 +++++++------------ 2 files changed, 100 insertions(+), 178 deletions(-) diff --git a/openfpga/src/base/openfpga_reserved_words.h b/openfpga/src/base/openfpga_reserved_words.h index 132858687..40a2af96b 100644 --- a/openfpga/src/base/openfpga_reserved_words.h +++ b/openfpga/src/base/openfpga_reserved_words.h @@ -23,6 +23,8 @@ constexpr char* GRID_MEM_INSTANCE_PREFIX = "mem_"; constexpr char* SWITCH_BLOCK_MEM_INSTANCE_PREFIX = "mem_"; constexpr char* CONNECTION_BLOCK_MEM_INSTANCE_PREFIX = "mem_"; constexpr char* MEMORY_MODULE_POSTFIX = "_mem"; +constexpr char* MEMORY_BL_PORT_NAME = "bl"; +constexpr char* MEMORY_WL_PORT_NAME = "wl"; /* Multiplexer naming constant strings */ constexpr char* MUX_BASIS_MODULE_POSTFIX = "_basis"; diff --git a/openfpga/src/fabric/build_memory_modules.cpp b/openfpga/src/fabric/build_memory_modules.cpp index bc04dd07d..f634408b1 100644 --- a/openfpga/src/fabric/build_memory_modules.cpp +++ b/openfpga/src/fabric/build_memory_modules.cpp @@ -40,59 +40,31 @@ namespace openfpga { static void add_module_input_nets_to_mem_modules(ModuleManager& module_manager, const ModuleId& mem_module, + const ModulePortId& module_port, const CircuitLibrary& circuit_lib, - const std::vector& circuit_ports, + const CircuitPortId& circuit_port, const ModuleId& child_module, const size_t& child_index, const size_t& child_instance) { /* Wire inputs of parent module to inputs of child modules */ - for (const auto& port : circuit_ports) { - ModulePortId src_port_id = module_manager.find_module_port(mem_module, circuit_lib.port_prefix(port)); - ModulePortId sink_port_id = module_manager.find_module_port(child_module, circuit_lib.port_prefix(port)); - for (size_t pin_id = 0; pin_id < module_manager.module_port(mem_module, sink_port_id).pins().size(); ++pin_id) { - ModuleNetId net = module_manager.create_module_net(mem_module); - /* Source pin is shifted by the number of memories */ - size_t src_pin_id = child_index * circuit_lib.port_size(port) + module_manager.module_port(mem_module, src_port_id).pins()[pin_id]; - /* Source node of the input net is the input of memory module */ - module_manager.add_module_net_source(mem_module, net, mem_module, 0, src_port_id, src_pin_id); - /* Sink node of the input net is the input of sram module */ - size_t sink_pin_id = module_manager.module_port(child_module, sink_port_id).pins()[pin_id]; - module_manager.add_module_net_sink(mem_module, net, child_module, child_instance, sink_port_id, sink_pin_id); - } - } -} + ModulePortId src_port_id = module_port; + ModulePortId sink_port_id = module_manager.find_module_port(child_module, circuit_lib.port_prefix(circuit_port)); -/********************************************************************* - * Add module nets to connect an output port of a memory module to - * an output port of its child module - * Restriction: this function is really designed for memory modules - * 1. It assumes that output port name of child module is the same as memory module - * 2. It assumes exact pin-to-pin mapping: - * j-th pin of output port of the i-th child module is wired to the j + i*W -th - * pin of output port of the memory module, where W is the size of port - ********************************************************************/ -static -void add_module_output_nets_to_mem_modules(ModuleManager& module_manager, - const ModuleId& mem_module, - const CircuitLibrary& circuit_lib, - const std::vector& circuit_ports, - const ModuleId& child_module, - const size_t& child_index, - const size_t& child_instance) { - /* Wire inputs of parent module to inputs of child modules */ - for (const auto& port : circuit_ports) { - ModulePortId src_port_id = module_manager.find_module_port(child_module, circuit_lib.port_prefix(port)); - ModulePortId sink_port_id = module_manager.find_module_port(mem_module, circuit_lib.port_prefix(port)); - for (size_t pin_id = 0; pin_id < module_manager.module_port(child_module, src_port_id).pins().size(); ++pin_id) { - ModuleNetId net = module_manager.create_module_net(mem_module); - /* Source pin is shifted by the number of memories */ - size_t src_pin_id = module_manager.module_port(child_module, src_port_id).pins()[pin_id]; - /* Source node of the input net is the input of memory module */ - module_manager.add_module_net_source(mem_module, net, child_module, child_instance, src_port_id, src_pin_id); - /* Sink node of the input net is the input of sram module */ - size_t sink_pin_id = child_index * circuit_lib.port_size(port) + module_manager.module_port(mem_module, sink_port_id).pins()[pin_id]; - module_manager.add_module_net_sink(mem_module, net, mem_module, 0, sink_port_id, sink_pin_id); - } + /* Source pin is shifted by the number of memories */ + size_t src_pin_id = module_manager.module_port(mem_module, src_port_id).pins()[child_index]; + + ModuleNetId net = module_manager.module_instance_port_net(mem_module, + mem_module, 0, + src_port_id, src_pin_id); + if (ModuleNetId::INVALID() == net) { + net = module_manager.create_module_net(mem_module); + module_manager.add_module_net_source(mem_module, net, mem_module, 0, src_port_id, src_pin_id); + } + + for (size_t pin_id = 0; pin_id < module_manager.module_port(mem_module, sink_port_id).pins().size(); ++pin_id) { + /* Sink node of the input net is the input of sram module */ + size_t sink_pin_id = module_manager.module_port(child_module, sink_port_id).pins()[pin_id]; + module_manager.add_module_net_sink(mem_module, net, child_module, child_instance, sink_port_id, sink_pin_id); } } @@ -139,6 +111,38 @@ std::vector add_module_output_nets_to_chain_mem_modules(ModuleManag return module_nets; } +/********************************************************************* + * Add module nets to connect an output port of a memory module to + * an output port of its child module + * Restriction: this function is really designed for memory modules + * 1. It assumes that output port name of child module is the same as memory module + * 2. It assumes exact pin-to-pin mapping: + * j-th pin of output port of the i-th child module is wired to the j + i*W -th + * pin of output port of the memory module, where W is the size of port + ********************************************************************/ +static +void add_module_output_nets_to_mem_modules(ModuleManager& module_manager, + const ModuleId& mem_module, + const CircuitLibrary& circuit_lib, + const std::vector& sram_output_ports, + const ModuleId& child_module, + const size_t& child_index, + const size_t& child_instance) { + + for (size_t iport = 0; iport < sram_output_ports.size(); ++iport) { + std::string port_name; + if (0 == iport) { + port_name = generate_configurable_memory_data_out_name(); + } else { + VTR_ASSERT( 1 == iport); + port_name = generate_configurable_memory_inverted_data_out_name(); + } + add_module_output_nets_to_chain_mem_modules(module_manager, mem_module, + port_name, circuit_lib, sram_output_ports[iport], + child_module, child_index, child_instance); + } +} + /******************************************************************** * Connect all the memory modules under the parent module in a chain * @@ -273,9 +277,14 @@ void add_module_nets_to_cmos_memory_chain_module(ModuleManager& module_manager, } /********************************************************************* - * Flat memory modules + * Flatten memory organization * - * in[0] in[1] in[N] + * Bit lines(BL/BLB) Word lines (WL/WLB) + * | | + * v v + * +------------------------------------+ + * | Memory Module Configuration port | + * +------------------------------------+ * | | | * v v v * +-------+ +-------+ +-------+ @@ -289,33 +298,49 @@ void add_module_nets_to_cmos_memory_chain_module(ModuleManager& module_manager, * ********************************************************************/ static -void build_memory_standalone_module(ModuleManager& module_manager, - const CircuitLibrary& circuit_lib, - const std::string& module_name, - const CircuitModelId& sram_model, - const size_t& num_mems) { +void build_memory_flatten_module(ModuleManager& module_manager, + const CircuitLibrary& circuit_lib, + const std::string& module_name, + const CircuitModelId& sram_model, + const size_t& num_mems) { /* Get the global ports required by the SRAM */ std::vector global_port_types; global_port_types.push_back(CIRCUIT_MODEL_PORT_CLOCK); global_port_types.push_back(CIRCUIT_MODEL_PORT_INPUT); std::vector sram_global_ports = circuit_lib.model_global_ports_by_type(sram_model, global_port_types, true, false); - /* Get the input ports from the SRAM */ - std::vector sram_input_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_INPUT, true); + /* Get the BL/WL ports from the SRAM */ + std::vector sram_bl_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_BL, true); + std::vector sram_wl_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_WL, true); /* Get the output ports from the SRAM */ std::vector sram_output_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_OUTPUT, true); + /* Ensure that we have only 1 BL, 1 WL and 2 output ports*/ + VTR_ASSERT(1 == sram_bl_ports.size()); + VTR_ASSERT(1 == sram_wl_ports.size()); + VTR_ASSERT(2 == sram_output_ports.size()); + /* Create a module and add to the module manager */ ModuleId mem_module = module_manager.add_module(module_name); VTR_ASSERT(true == module_manager.valid_module_id(mem_module)); - /* Add each input port */ - for (const auto& port : sram_input_ports) { - BasicPort input_port(circuit_lib.port_prefix(port), num_mems); - module_manager.add_port(mem_module, input_port, ModuleManager::MODULE_INPUT_PORT); - } + /* Add module ports */ + /* Input: BL port */ + BasicPort bl_port(std::string(MEMORY_BL_PORT_NAME), num_mems); + ModulePortId mem_bl_port = module_manager.add_port(mem_module, bl_port, ModuleManager::MODULE_INPUT_PORT); + + BasicPort wl_port(std::string(MEMORY_BL_PORT_NAME), num_mems); + ModulePortId mem_wl_port = module_manager.add_port(mem_module, wl_port, ModuleManager::MODULE_INPUT_PORT); + /* Add each output port: port width should match the number of memories */ - for (const auto& port : sram_output_ports) { - BasicPort output_port(circuit_lib.port_prefix(port), num_mems); + for (size_t iport = 0; iport < sram_output_ports.size(); ++iport) { + std::string port_name; + if (0 == iport) { + port_name = generate_configurable_memory_data_out_name(); + } else { + VTR_ASSERT( 1 == iport); + port_name = generate_configurable_memory_inverted_data_out_name(); + } + BasicPort output_port(port_name, num_mems); module_manager.add_port(mem_module, output_port, ModuleManager::MODULE_OUTPUT_PORT); } @@ -330,8 +355,13 @@ void build_memory_standalone_module(ModuleManager& module_manager, /* Build module nets */ /* Wire inputs of parent module to inputs of child modules */ - add_module_input_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_input_ports, sram_mem_module, i, sram_mem_instance); - /* Wire inputs of parent module to outputs of child modules */ + for (const CircuitPortId& port : sram_bl_ports) { + add_module_input_nets_to_mem_modules(module_manager, mem_module, mem_bl_port, circuit_lib, port, sram_mem_module, i, sram_mem_instance); + } + for (const CircuitPortId& port : sram_wl_ports) { + add_module_input_nets_to_mem_modules(module_manager, mem_module, mem_wl_port, circuit_lib, port, sram_mem_module, i, sram_mem_instance); + } + /* Wire outputs of child module to outputs of parent module */ add_module_output_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_output_ports, sram_mem_module, i, sram_mem_instance); } @@ -448,113 +478,6 @@ void build_memory_chain_module(ModuleManager& module_manager, add_module_global_ports_from_child_modules(module_manager, mem_module); } -/********************************************************************* - * Memory bank organization - * - * Bit lines(BL/BLB) Word lines (WL/WLB) - * | | - * v v - * +------------------------------------+ - * | Memory Module Configuration port | - * +------------------------------------+ - * | | | - * v v v - * +-------+ +-------+ +-------+ - * | SRAM | | SRAM | ... | SRAM | - * | [0] | | [1] | | [N-1] | - * +-------+ +-------+ +-------+ - * | | ... | - * v v v - * +------------------------------------+ - * | Multiplexer Configuration port | - * - ********************************************************************/ -static -void build_memory_bank_module(ModuleManager& module_manager, - const CircuitLibrary& circuit_lib, - const std::string& module_name, - const CircuitModelId& sram_model, - const size_t& num_mems) { - /* Get the global ports required by the SRAM */ - std::vector global_port_types; - global_port_types.push_back(CIRCUIT_MODEL_PORT_CLOCK); - global_port_types.push_back(CIRCUIT_MODEL_PORT_INPUT); - std::vector sram_global_ports = circuit_lib.model_global_ports_by_type(sram_model, global_port_types, true, false); - /* Get the input ports from the SRAM */ - std::vector sram_input_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_INPUT, true); - /* A SRAM cell with BL/WL should not have any input */ - VTR_ASSERT( 0 == sram_input_ports.size() ); - /* Get the output ports from the SRAM */ - std::vector sram_output_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_OUTPUT, true); - /* Get the BL/WL ports from the SRAM */ - std::vector sram_bl_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_BL, true); - std::vector sram_blb_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_BLB, true); - std::vector sram_wl_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_WL, true); - std::vector sram_wlb_ports = circuit_lib.model_ports_by_type(sram_model, CIRCUIT_MODEL_PORT_WLB, true); - - /* Create a module and add to the module manager */ - ModuleId mem_module = module_manager.add_module(module_name); - VTR_ASSERT(true == module_manager.valid_module_id(mem_module)); - - /* Add module ports: the ports come from the SRAM modules */ - /* Add each input port */ - for (const auto& port : sram_input_ports) { - BasicPort input_port(circuit_lib.port_prefix(port), num_mems * circuit_lib.port_size(port)); - module_manager.add_port(mem_module, input_port, ModuleManager::MODULE_INPUT_PORT); - } - /* Add each output port: port width should match the number of memories */ - for (const auto& port : sram_output_ports) { - BasicPort output_port(circuit_lib.port_prefix(port), num_mems * circuit_lib.port_size(port)); - module_manager.add_port(mem_module, output_port, ModuleManager::MODULE_OUTPUT_PORT); - } - /* Add each output port: port width should match the number of memories */ - for (const auto& port : sram_bl_ports) { - BasicPort bl_port(circuit_lib.port_prefix(port), num_mems * circuit_lib.port_size(port)); - module_manager.add_port(mem_module, bl_port, ModuleManager::MODULE_INPUT_PORT); - } - for (const auto& port : sram_blb_ports) { - BasicPort blb_port(circuit_lib.port_prefix(port), num_mems * circuit_lib.port_size(port)); - module_manager.add_port(mem_module, blb_port, ModuleManager::MODULE_INPUT_PORT); - } - for (const auto& port : sram_wl_ports) { - BasicPort wl_port(circuit_lib.port_prefix(port), num_mems * circuit_lib.port_size(port)); - module_manager.add_port(mem_module, wl_port, ModuleManager::MODULE_INPUT_PORT); - } - for (const auto& port : sram_wlb_ports) { - BasicPort wlb_port(circuit_lib.port_prefix(port), num_mems * circuit_lib.port_size(port)); - module_manager.add_port(mem_module, wlb_port, ModuleManager::MODULE_INPUT_PORT); - } - - /* Find the sram module in the module manager */ - ModuleId sram_mem_module = module_manager.find_module(circuit_lib.model_name(sram_model)); - - /* Instanciate each submodule */ - for (size_t i = 0; i < num_mems; ++i) { - /* Memory seed module instanciation */ - size_t sram_instance = module_manager.num_instance(mem_module, sram_mem_module); - module_manager.add_child_module(mem_module, sram_mem_module); - - /* Build module nets */ - /* Wire inputs of parent module to inputs of child modules */ - add_module_input_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_input_ports, sram_mem_module, i, sram_instance); - /* Wire inputs of parent module to outputs of child modules */ - add_module_output_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_output_ports, sram_mem_module, i, sram_instance); - /* Wire BL/WLs of parent module to BL/WLs of child modules */ - add_module_input_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_bl_ports, sram_mem_module, i, sram_instance); - add_module_input_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_blb_ports, sram_mem_module, i, sram_instance); - add_module_input_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_wl_ports, sram_mem_module, i, sram_instance); - add_module_input_nets_to_mem_modules(module_manager, mem_module, circuit_lib, sram_wlb_ports, sram_mem_module, i, sram_instance); - } - - /* TODO: if a local memory decoder is required, instanciate it here */ - - /* Add global ports to the pb_module: - * This is a much easier job after adding sub modules (instances), - * we just need to find all the global ports from the child modules and build a list of it - */ - add_module_global_ports_from_child_modules(module_manager, mem_module); -} - /********************************************************************* * Frame-based Memory organization * @@ -773,17 +696,14 @@ void build_memory_module(ModuleManager& module_manager, const size_t& num_mems) { switch (sram_orgz_type) { case CONFIG_MEM_STANDALONE: - build_memory_standalone_module(module_manager, circuit_lib, - module_name, sram_model, num_mems); + case CONFIG_MEM_MEMORY_BANK: + build_memory_flatten_module(module_manager, circuit_lib, + module_name, sram_model, num_mems); break; case CONFIG_MEM_SCAN_CHAIN: build_memory_chain_module(module_manager, circuit_lib, module_name, sram_model, num_mems); break; - case CONFIG_MEM_MEMORY_BANK: - build_memory_bank_module(module_manager, circuit_lib, - module_name, sram_model, num_mems); - break; case CONFIG_MEM_FRAME_BASED: build_frame_memory_module(module_manager, arch_decoder_lib, circuit_lib, module_name, sram_model, num_mems); From fbe05963e00e7203f2e236643c42198952e63e00 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 29 May 2020 22:41:56 -0600 Subject: [PATCH 120/180] add configuration bus builder for flatten memory organization (applicable to memory bank and standalone configuration protocol) --- openfpga/src/base/openfpga_naming.cpp | 36 ++---- openfpga/src/utils/memory_utils.cpp | 7 +- openfpga/src/utils/module_manager_utils.cpp | 131 +++++++++++++++++--- openfpga/src/utils/module_manager_utils.h | 12 ++ 4 files changed, 139 insertions(+), 47 deletions(-) diff --git a/openfpga/src/base/openfpga_naming.cpp b/openfpga/src/base/openfpga_naming.cpp index dd5e7df2c..5cf00bf7f 100644 --- a/openfpga/src/base/openfpga_naming.cpp +++ b/openfpga/src/base/openfpga_naming.cpp @@ -744,19 +744,6 @@ std::string generate_sram_port_name(const e_config_protocol_type& sram_orgz_type std::string port_name; switch (sram_orgz_type) { - case CONFIG_MEM_STANDALONE: { - /* Two types of ports are available: - * (1) Regular output of a SRAM, enabled by port type of INPUT - * (2) Inverted output of a SRAM, enabled by port type of OUTPUT - */ - if (CIRCUIT_MODEL_PORT_INPUT == port_type) { - port_name = std::string("mem_out"); - } else { - VTR_ASSERT( CIRCUIT_MODEL_PORT_OUTPUT == port_type ); - port_name = std::string("mem_outb"); - } - break; - } case CONFIG_MEM_SCAN_CHAIN: /* Two types of ports are available: * (1) Head of a chain of Configuration-chain Flip-Flops (CCFFs), enabled by port type of INPUT @@ -772,30 +759,25 @@ std::string generate_sram_port_name(const e_config_protocol_type& sram_orgz_type port_name = std::string("ccff_tail"); } break; + case CONFIG_MEM_STANDALONE: case CONFIG_MEM_MEMORY_BANK: - /* Four types of ports are available: + /* Two types of ports are available: * (1) Bit Lines (BLs) of a SRAM cell, enabled by port type of BL * (2) Word Lines (WLs) of a SRAM cell, enabled by port type of WL - * (3) Inverted Bit Lines (BLBs) of a SRAM cell, enabled by port type of BLB - * (4) Inverted Word Lines (WLBs) of a SRAM cell, enabled by port type of WLB * - * BL BLB WL WLB BL BLB WL WLB BL BLB WL WLB - * [0] [0] [0] [0] [1] [1] [1] [1] [i] [i] [i] [i] - * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ - * | | | | | | | | | | | | + * BL WL BL WL BL WL + * [0] [0] [1] [1] [i] [i] + * ^ ^ ^ ^ ^ ^ + * | | | | | | * +----------+ +----------+ +----------+ * | SRAM | | SRAM | ... | SRAM | * +----------+ +----------+ +----------+ */ if (CIRCUIT_MODEL_PORT_BL == port_type) { - port_name = std::string("bl"); - } else if (CIRCUIT_MODEL_PORT_WL == port_type) { - port_name = std::string("wl"); - } else if (CIRCUIT_MODEL_PORT_BLB == port_type) { - port_name = std::string("blb"); + port_name = std::string(MEMORY_BL_PORT_NAME); } else { - VTR_ASSERT( CIRCUIT_MODEL_PORT_WLB == port_type ); - port_name = std::string("wlb"); + VTR_ASSERT( CIRCUIT_MODEL_PORT_WL == port_type ); + port_name = std::string(MEMORY_WL_PORT_NAME); } break; case CONFIG_MEM_FRAME_BASED: diff --git a/openfpga/src/utils/memory_utils.cpp b/openfpga/src/utils/memory_utils.cpp index 05b6e8736..bb7cefee7 100644 --- a/openfpga/src/utils/memory_utils.cpp +++ b/openfpga/src/utils/memory_utils.cpp @@ -314,20 +314,15 @@ std::vector generate_sram_port_names(const CircuitLibrary& circuit_ std::vector model_port_types; switch (sram_orgz_type) { - case CONFIG_MEM_STANDALONE: - model_port_types.push_back(CIRCUIT_MODEL_PORT_INPUT); - model_port_types.push_back(CIRCUIT_MODEL_PORT_OUTPUT); - break; case CONFIG_MEM_SCAN_CHAIN: model_port_types.push_back(CIRCUIT_MODEL_PORT_INPUT); model_port_types.push_back(CIRCUIT_MODEL_PORT_OUTPUT); break; + case CONFIG_MEM_STANDALONE: case CONFIG_MEM_MEMORY_BANK: { std::vector ports_to_search; ports_to_search.push_back(CIRCUIT_MODEL_PORT_BL); ports_to_search.push_back(CIRCUIT_MODEL_PORT_WL); - ports_to_search.push_back(CIRCUIT_MODEL_PORT_BLB); - ports_to_search.push_back(CIRCUIT_MODEL_PORT_WLB); /* Try to find a BL/WL/BLB/WLB port and update the port types/module port types to be added */ for (const auto& port_to_search : ports_to_search) { std::vector found_port = circuit_lib.model_ports_by_type(sram_model, port_to_search); diff --git a/openfpga/src/utils/module_manager_utils.cpp b/openfpga/src/utils/module_manager_utils.cpp index eebe9008a..cf9808466 100644 --- a/openfpga/src/utils/module_manager_utils.cpp +++ b/openfpga/src/utils/module_manager_utils.cpp @@ -664,6 +664,85 @@ void add_module_nets_between_logic_and_memory_sram_bus(ModuleManager& module_man } } +/******************************************************************** + * Connect all the memory modules under the parent module in a flatten way + * + * BL + * | + * +---------------+--------- ... --------+ + * | | | + * v v v + * +--------+ +--------+ +--------+ + * | Memory | | Memory | ... | Memory | + * | Module | | Module | | Module | + * | [0] | | [1] | | [N-1] | + * +--------+ +--------+ +--------+ + * ^ ^ ^ + * | | | + * +------------+----------------------+ + * | + * WL + * + * Note: + * - This function will do the connection for only one type of the port, + * either BL or WL. So, you should call this function twice to complete + * the configuration bus connection!!! + * + *********************************************************************/ +void add_module_nets_cmos_flatten_memory_config_bus(ModuleManager& module_manager, + const ModuleId& parent_module, + const e_config_protocol_type& sram_orgz_type, + const e_circuit_model_port_type& config_port_type) { + /* A counter for the current pin id for the source port of parent module */ + size_t cur_src_pin_id = 0; + + ModuleId net_src_module_id; + size_t net_src_instance_id; + ModulePortId net_src_port_id; + + /* Find the port name of parent module */ + std::string src_port_name = generate_sram_port_name(sram_orgz_type, config_port_type); + net_src_module_id = parent_module; + net_src_instance_id = 0; + net_src_port_id = module_manager.find_module_port(net_src_module_id, src_port_name); + + /* Get the pin id for source port */ + BasicPort net_src_port = module_manager.module_port(net_src_module_id, net_src_port_id); + + for (size_t mem_index = 0; mem_index < module_manager.configurable_children(parent_module).size(); ++mem_index) { + ModuleId net_sink_module_id; + size_t net_sink_instance_id; + ModulePortId net_sink_port_id; + + /* Find the port name of next memory module */ + std::string sink_port_name = generate_sram_port_name(sram_orgz_type, config_port_type); + net_sink_module_id = module_manager.configurable_children(parent_module)[mem_index]; + net_sink_instance_id = module_manager.configurable_child_instances(parent_module)[mem_index]; + net_sink_port_id = module_manager.find_module_port(net_sink_module_id, sink_port_name); + + /* Get the pin id for sink port */ + BasicPort net_sink_port = module_manager.module_port(net_sink_module_id, net_sink_port_id); + + /* Create a net for each pin */ + for (size_t pin_id = 0; pin_id < net_sink_port.pins().size(); ++pin_id) { + /* Create a net and add source and sink to it */ + ModuleNetId net = create_module_source_pin_net(module_manager, parent_module, + net_src_module_id, net_src_instance_id, + net_src_port_id, net_src_port.pins()[cur_src_pin_id]); + VTR_ASSERT(ModuleNetId::INVALID() != net); + + /* Add net sink */ + module_manager.add_module_net_sink(parent_module, net, net_sink_module_id, net_sink_instance_id, net_sink_port_id, net_sink_port.pins()[pin_id]); + + /* Move to the next src pin */ + cur_src_pin_id++; + } + } + + /* We should used all the pins of the source port!!! */ + VTR_ASSERT(net_src_port.get_width() == cur_src_pin_id); +} + /******************************************************************** * Connect all the memory modules under the parent module in a chain * @@ -1088,18 +1167,19 @@ void add_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type) { switch (sram_orgz_type) { - case CONFIG_MEM_STANDALONE: - /* Nothing to do */ - break; case CONFIG_MEM_SCAN_CHAIN: { - add_module_nets_cmos_memory_chain_config_bus(module_manager, parent_module, sram_orgz_type); + add_module_nets_cmos_memory_chain_config_bus(module_manager, parent_module, + sram_orgz_type); break; } + case CONFIG_MEM_STANDALONE: case CONFIG_MEM_MEMORY_BANK: - /* TODO: */ + add_module_nets_cmos_flatten_memory_config_bus(module_manager, parent_module, + sram_orgz_type, CIRCUIT_MODEL_PORT_BL); + add_module_nets_cmos_flatten_memory_config_bus(module_manager, parent_module, + sram_orgz_type, CIRCUIT_MODEL_PORT_WL); break; case CONFIG_MEM_FRAME_BASED: - /* TODO: */ add_module_nets_cmos_memory_frame_config_bus(module_manager, decoder_lib, parent_module); break; default: @@ -1557,6 +1637,32 @@ size_t find_module_num_config_bits_from_child_modules(ModuleManager& module_mana return num_config_bits; } +/******************************************************************** + * Try to create a net for the source pin + * This function will try + * - Find if there is already a net created whose source is the pin + * If so, it will return the net id + * - If not, it will create a net and configure its source + *******************************************************************/ +ModuleNetId create_module_source_pin_net(ModuleManager& module_manager, + const ModuleId& cur_module_id, + const ModuleId& src_module_id, + const size_t& src_instance_id, + const ModulePortId& src_module_port_id, + const size_t& src_pin_id) { + ModuleNetId net = module_manager.module_instance_port_net(cur_module_id, + src_module_id, src_instance_id, + src_module_port_id, src_pin_id); + if (ModuleNetId::INVALID() == net) { + net = module_manager.create_module_net(cur_module_id); + module_manager.add_module_net_source(cur_module_id, net, + src_module_id, src_instance_id, + src_module_port_id, src_pin_id); + } + + return net; +} + /******************************************************************** * Add a bus of nets to a module (cur_module_id) * Note: @@ -1609,14 +1715,11 @@ void add_module_bus_nets(ModuleManager& module_manager, /* Create a net for each pin */ for (size_t pin_id = 0; pin_id < src_port.pins().size(); ++pin_id) { - ModuleNetId net = module_manager.module_instance_port_net(cur_module_id, - src_module_id, src_instance_id, - src_module_port_id, src_port.pins()[pin_id]); - if (ModuleNetId::INVALID() == net) { - net = module_manager.create_module_net(cur_module_id); - /* Configure the net source */ - module_manager.add_module_net_source(cur_module_id, net, src_module_id, src_instance_id, src_module_port_id, src_port.pins()[pin_id]); - } + ModuleNetId net = create_module_source_pin_net(module_manager, cur_module_id, + src_module_id, src_instance_id, + src_module_port_id, src_port.pins()[pin_id]); + VTR_ASSERT(ModuleNetId::INVALID() != net); + /* Configure the net sink */ module_manager.add_module_net_sink(cur_module_id, net, des_module_id, des_instance_id, des_module_port_id, des_port.pins()[pin_id]); } diff --git a/openfpga/src/utils/module_manager_utils.h b/openfpga/src/utils/module_manager_utils.h index d52727a40..640d798ab 100644 --- a/openfpga/src/utils/module_manager_utils.h +++ b/openfpga/src/utils/module_manager_utils.h @@ -91,6 +91,11 @@ void add_module_nets_between_logic_and_memory_sram_bus(ModuleManager& module_man const CircuitLibrary& circuit_lib, const CircuitModelId& logic_model); +void add_module_nets_cmos_flatten_memory_config_bus(ModuleManager& module_manager, + const ModuleId& parent_module, + const e_config_protocol_type& sram_orgz_type, + const e_circuit_model_port_type& config_port_type); + void add_module_nets_cmos_memory_chain_config_bus(ModuleManager& module_manager, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type); @@ -135,6 +140,13 @@ size_t find_module_num_config_bits_from_child_modules(ModuleManager& module_mana const CircuitModelId& sram_model, const e_config_protocol_type& sram_orgz_type); +ModuleNetId create_module_source_pin_net(ModuleManager& module_manager, + const ModuleId& cur_module_id, + const ModuleId& src_module_id, + const size_t& src_instance_id, + const ModulePortId& src_module_port_id, + const size_t& src_pin_id); + void add_module_bus_nets(ModuleManager& module_manager, const ModuleId& cur_module_id, const ModuleId& src_module_id, From b9aac3cbdf70ebe3e17ccf6e1a3ba2710d5757e6 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 29 May 2020 23:22:01 -0600 Subject: [PATCH 121/180] updated fpga verilog testbench generation to support vanilla (standalone) configuration protocol --- .../src/fabric/build_top_module_memory.cpp | 7 +- .../fpga_verilog/verilog_top_testbench.cpp | 128 +++++++++++++++++- 2 files changed, 131 insertions(+), 4 deletions(-) diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index c15070488..b5d7f1db1 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -413,14 +413,17 @@ void add_top_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, const e_config_protocol_type& sram_orgz_type) { switch (sram_orgz_type) { case CONFIG_MEM_STANDALONE: - /* Nothing to do */ + add_module_nets_cmos_flatten_memory_config_bus(module_manager, parent_module, + sram_orgz_type, CIRCUIT_MODEL_PORT_BL); + add_module_nets_cmos_flatten_memory_config_bus(module_manager, parent_module, + sram_orgz_type, CIRCUIT_MODEL_PORT_WL); break; case CONFIG_MEM_SCAN_CHAIN: { add_module_nets_cmos_memory_chain_config_bus(module_manager, parent_module, CONFIG_MEM_SCAN_CHAIN); break; } case CONFIG_MEM_MEMORY_BANK: - /* TODO: */ + /* TODO */ break; case CONFIG_MEM_FRAME_BASED: add_module_nets_cmos_memory_frame_config_bus(module_manager, decoder_lib, parent_module); diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 4a1072c70..7ece43460 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -60,6 +60,30 @@ constexpr char* TOP_TB_CLOCK_REG_POSTFIX = "_reg"; constexpr char* AUTOCHECK_TOP_TESTBENCH_VERILOG_MODULE_POSTFIX = "_autocheck_top_tb"; +/******************************************************************** + * Print local wires for flatten memory (standalone) configuration protocols + *******************************************************************/ +static +void print_verilog_top_testbench_flatten_memory_port(std::fstream& fp, + const ModuleManager& module_manager, + const ModuleId& top_module) { + /* Validate the file stream */ + valid_file_stream(fp); + + /* Print the port for Bit-Line */ + print_verilog_comment(fp, std::string("---- Bit Line ports -----")); + ModulePortId bl_port_id = module_manager.find_module_port(top_module, std::string(MEMORY_BL_PORT_NAME)); + BasicPort bl_port = module_manager.module_port(top_module, bl_port_id); + fp << generate_verilog_port(VERILOG_PORT_REG, bl_port) << ";" << std::endl; + + /* Print the port for Word-Line */ + print_verilog_comment(fp, std::string("---- Word Line ports -----")); + ModulePortId wl_port_id = module_manager.find_module_port(top_module, std::string(MEMORY_WL_PORT_NAME)); + BasicPort wl_port = module_manager.module_port(top_module, wl_port_id); + fp << generate_verilog_port(VERILOG_PORT_REG, wl_port) << ";" << std::endl; +} + + /******************************************************************** * Print local wires for configuration chain protocols *******************************************************************/ @@ -125,7 +149,7 @@ void print_verilog_top_testbench_config_protocol_port(std::fstream& fp, const ModuleId& top_module) { switch(sram_orgz_type) { case CONFIG_MEM_STANDALONE: - /* TODO */ + print_verilog_top_testbench_flatten_memory_port(fp, module_manager, top_module); break; case CONFIG_MEM_SCAN_CHAIN: print_verilog_top_testbench_config_chain_port(fp); @@ -498,6 +522,11 @@ size_t calculate_num_config_clock_cycles(const e_config_protocol_type& sram_orgz /* Branch on the type of configuration protocol */ switch (sram_orgz_type) { case CONFIG_MEM_STANDALONE: + /* We just need 1 clock cycle to load all the configuration bits + * since all the ports are exposed at the top-level + */ + num_config_clock_cycles = 2; + break; case CONFIG_MEM_SCAN_CHAIN: case CONFIG_MEM_MEMORY_BANK: /* TODO */ @@ -692,6 +721,7 @@ void print_verilog_top_testbench_load_bitstream_task(std::fstream& fp, const ModuleId& top_module) { switch (sram_orgz_type) { case CONFIG_MEM_STANDALONE: + /* No need to have a specific task. Loading is done in 1 clock cycle */ break; case CONFIG_MEM_SCAN_CHAIN: print_verilog_top_testbench_load_bitstream_task_configuration_chain(fp); @@ -845,6 +875,98 @@ void print_verilog_top_testbench_generic_stimulus(std::fstream& fp, fp << std::endl; } +/******************************************************************** + * Print stimulus for a FPGA fabric with a flatten memory (standalone) configuration protocol + * We will load the bitstream in the second clock cycle, right after the first reset cycle + *******************************************************************/ +static +void print_verilog_top_testbench_vanilla_bitstream(std::fstream& fp, + const ModuleManager& module_manager, + const ModuleId& top_module, + const BitstreamManager& bitstream_manager, + const FabricBitstream& fabric_bitstream) { + /* Validate the file stream */ + valid_file_stream(fp); + + /* Find Bit-Line and Word-Line port */ + BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); + + /* Find Bit-Line and Word-Line port */ + ModulePortId bl_port_id = module_manager.find_module_port(top_module, std::string(MEMORY_BL_PORT_NAME)); + BasicPort bl_port = module_manager.module_port(top_module, bl_port_id); + + ModulePortId wl_port_id = module_manager.find_module_port(top_module, std::string(MEMORY_WL_PORT_NAME)); + BasicPort wl_port = module_manager.module_port(top_module, wl_port_id); + + /* Initial value should be the first configuration bits + * In the rest of programming cycles, + * configuration bits are fed at the falling edge of programming clock. + * We do not care the value of scan_chain head during the first programming cycle + * It is reset anyway + */ + std::vector initial_bl_values(bl_port.get_width(), 0); + std::vector initial_wl_values(wl_port.get_width(), 0); + + print_verilog_comment(fp, "----- Begin bitstream loading during configuration phase -----"); + fp << "initial" << std::endl; + fp << "\tbegin" << std::endl; + print_verilog_comment(fp, "----- Configuration chain default input -----"); + fp << "\t\t"; + fp << generate_verilog_port_constant_values(bl_port, initial_bl_values); + fp << ";"; + fp << "\t\t"; + fp << generate_verilog_port_constant_values(wl_port, initial_wl_values); + fp << ";"; + + fp << std::endl; + + fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; + fp << "\t\t\t"; + + /* Enable all the WLs */ + std::vector enabled_wl_values(wl_port.get_width(), 1); + fp << generate_verilog_port(VERILOG_PORT_CONKT, wl_port); + fp << " = "; + fp << generate_verilog_port_constant_values(wl_port, enabled_wl_values); + + size_t ibit = 0; + for (const FabricBitId& bit_id : fabric_bitstream.bits()) { + BasicPort cur_bl_port(bl_port); + cur_bl_port.set_width(ibit, ibit); + + fp << generate_verilog_port(VERILOG_PORT_CONKT, cur_bl_port); + fp << " = "; + fp << "1'b" << (size_t)bitstream_manager.bit_value(fabric_bitstream.config_bit(bit_id)); + fp << ";" << std::endl; + + ibit++; + } + + fp << "\tend" << std::endl; + + /* Disable all the WLs */ + fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; + fp << generate_verilog_port(VERILOG_PORT_CONKT, wl_port); + fp << " = "; + fp << generate_verilog_port_constant_values(wl_port, initial_wl_values); + fp << "\t\t\t"; + + /* Raise the flag of configuration done when bitstream loading is complete */ + fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; + + BasicPort config_done_port(std::string(TOP_TB_CONFIG_DONE_PORT_NAME), 1); + fp << "\t\t\t"; + fp << generate_verilog_port(VERILOG_PORT_CONKT, config_done_port); + fp << " <= "; + std::vector config_done_enable_values(config_done_port.get_width(), 1); + fp << generate_verilog_constant_values(config_done_enable_values); + fp << ";" << std::endl; + + fp << "\tend" << std::endl; + print_verilog_comment(fp, "----- End bitstream loading during configuration phase -----"); +} + + /******************************************************************** * Print stimulus for a FPGA fabric with a configuration chain protocol * where configuration bits are programming in serial (one by one) @@ -1022,7 +1144,9 @@ void print_verilog_top_testbench_bitstream(std::fstream& fp, /* Branch on the type of configuration protocol */ switch (sram_orgz_type) { case CONFIG_MEM_STANDALONE: - /* TODO */ + print_verilog_top_testbench_vanilla_bitstream(fp, + module_manager, top_module, + bitstream_manager, fabric_bitstream); break; case CONFIG_MEM_SCAN_CHAIN: print_verilog_top_testbench_configuration_chain_bitstream(fp, bitstream_manager, fabric_bitstream); From 8b5b221a211ed2e41cbf4c6395de6c5f88da4635 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 11:36:00 -0600 Subject: [PATCH 122/180] add new architecture for standalone memory organization --- .../k4_N4_40nm_standalone_openfpga.xml | 229 ++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml new file mode 100644 index 000000000..fc97f75c1 --- /dev/null +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + + + + + 10e-12 5e-12 5e-12 + + + 10e-12 5e-12 5e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5f6a790effffee2dd00a9af8e384ebde442773e3 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 11:39:24 -0600 Subject: [PATCH 123/180] add new test cases for the standalone memory configuration protocol --- .../flatten_memory/config/task.conf | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 openfpga_flow/tasks/openfpga_shell/full_testbench/flatten_memory/config/task.conf diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/flatten_memory/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/flatten_memory/config/task.conf new file mode 100644 index 000000000..d2bf1bb9f --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/flatten_memory/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +#vpr_fpga_verilog_formal_verification_top_netlist= From 8ec8ac41181b9e628bfa6b37033faff5a2f1e0e1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 12:16:41 -0600 Subject: [PATCH 124/180] bug fixed in flatten memory organization. Passed verification --- openfpga/src/fabric/build_memory_modules.cpp | 4 +-- .../fpga_verilog/verilog_top_testbench.cpp | 21 ++++++----- .../src/fpga_verilog/verilog_writer_utils.cpp | 36 ++++++++++++++++--- .../src/fpga_verilog/verilog_writer_utils.h | 3 +- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/openfpga/src/fabric/build_memory_modules.cpp b/openfpga/src/fabric/build_memory_modules.cpp index f634408b1..72d1315ad 100644 --- a/openfpga/src/fabric/build_memory_modules.cpp +++ b/openfpga/src/fabric/build_memory_modules.cpp @@ -61,7 +61,7 @@ void add_module_input_nets_to_mem_modules(ModuleManager& module_manager, module_manager.add_module_net_source(mem_module, net, mem_module, 0, src_port_id, src_pin_id); } - for (size_t pin_id = 0; pin_id < module_manager.module_port(mem_module, sink_port_id).pins().size(); ++pin_id) { + for (size_t pin_id = 0; pin_id < module_manager.module_port(child_module, sink_port_id).pins().size(); ++pin_id) { /* Sink node of the input net is the input of sram module */ size_t sink_pin_id = module_manager.module_port(child_module, sink_port_id).pins()[pin_id]; module_manager.add_module_net_sink(mem_module, net, child_module, child_instance, sink_port_id, sink_pin_id); @@ -328,7 +328,7 @@ void build_memory_flatten_module(ModuleManager& module_manager, BasicPort bl_port(std::string(MEMORY_BL_PORT_NAME), num_mems); ModulePortId mem_bl_port = module_manager.add_port(mem_module, bl_port, ModuleManager::MODULE_INPUT_PORT); - BasicPort wl_port(std::string(MEMORY_BL_PORT_NAME), num_mems); + BasicPort wl_port(std::string(MEMORY_WL_PORT_NAME), num_mems); ModulePortId mem_wl_port = module_manager.add_port(mem_module, wl_port, ModuleManager::MODULE_INPUT_PORT); /* Add each output port: port width should match the number of memories */ diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 7ece43460..68d1e3dba 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -913,27 +913,27 @@ void print_verilog_top_testbench_vanilla_bitstream(std::fstream& fp, print_verilog_comment(fp, "----- Configuration chain default input -----"); fp << "\t\t"; fp << generate_verilog_port_constant_values(bl_port, initial_bl_values); - fp << ";"; + fp << ";" << std::endl; fp << "\t\t"; fp << generate_verilog_port_constant_values(wl_port, initial_wl_values); - fp << ";"; + fp << ";" << std::endl; fp << std::endl; - fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; - fp << "\t\t\t"; + fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ") begin" << std::endl; /* Enable all the WLs */ std::vector enabled_wl_values(wl_port.get_width(), 1); - fp << generate_verilog_port(VERILOG_PORT_CONKT, wl_port); - fp << " = "; + fp << "\t\t\t"; fp << generate_verilog_port_constant_values(wl_port, enabled_wl_values); + fp << ";" << std::endl; size_t ibit = 0; for (const FabricBitId& bit_id : fabric_bitstream.bits()) { BasicPort cur_bl_port(bl_port); cur_bl_port.set_width(ibit, ibit); + fp << "\t\t\t"; fp << generate_verilog_port(VERILOG_PORT_CONKT, cur_bl_port); fp << " = "; fp << "1'b" << (size_t)bitstream_manager.bit_value(fabric_bitstream.config_bit(bit_id)); @@ -942,14 +942,14 @@ void print_verilog_top_testbench_vanilla_bitstream(std::fstream& fp, ibit++; } - fp << "\tend" << std::endl; + fp << "\t\tend" << std::endl; /* Disable all the WLs */ fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; - fp << generate_verilog_port(VERILOG_PORT_CONKT, wl_port); - fp << " = "; - fp << generate_verilog_port_constant_values(wl_port, initial_wl_values); + fp << "\t\t\t"; + fp << generate_verilog_port_constant_values(wl_port, initial_wl_values); + fp << ";" << std::endl; /* Raise the flag of configuration done when bitstream loading is complete */ fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; @@ -966,7 +966,6 @@ void print_verilog_top_testbench_vanilla_bitstream(std::fstream& fp, print_verilog_comment(fp, "----- End bitstream loading during configuration phase -----"); } - /******************************************************************** * Print stimulus for a FPGA fabric with a configuration chain protocol * where configuration bits are programming in serial (one by one) diff --git a/openfpga/src/fpga_verilog/verilog_writer_utils.cpp b/openfpga/src/fpga_verilog/verilog_writer_utils.cpp index 90ee95e9c..c59d92dd0 100644 --- a/openfpga/src/fpga_verilog/verilog_writer_utils.cpp +++ b/openfpga/src/fpga_verilog/verilog_writer_utils.cpp @@ -644,12 +644,38 @@ std::string generate_verilog_local_wire(const BasicPort& output_port, /******************************************************************** * Generate a string for a constant value in Verilog format: * <#.of bits>'b + * + * Optimization: short_constant + * When this switch is turned on, we will generate short version + * for all-zero/all-one vectors + * {{1'b}} *******************************************************************/ -std::string generate_verilog_constant_values(const std::vector& const_values) { - std::string str = std::to_string(const_values.size()); - str += "'b"; - for (const auto& val : const_values) { - str += std::to_string(val); +std::string generate_verilog_constant_values(const std::vector& const_values, + const bool& short_constant) { + VTR_ASSERT(!const_values.empty()); + + bool same_values = true; + size_t first_val = const_values.back(); + if (true == short_constant) { + for (const auto& val : const_values) { + if (first_val != val) { + same_values = false; + break; + } + } + } + + std::string str; + + if ( (true == short_constant) + && (true == same_values) ) { + str = "{" + std::to_string(const_values.size()) + "{1'b" + std::to_string(first_val) + "}}"; + } else { + str = std::to_string(const_values.size()); + str += "'b"; + for (const auto& val : const_values) { + str += std::to_string(val); + } } return str; } diff --git a/openfpga/src/fpga_verilog/verilog_writer_utils.h b/openfpga/src/fpga_verilog/verilog_writer_utils.h index 8e6cddaaa..0d8219283 100644 --- a/openfpga/src/fpga_verilog/verilog_writer_utils.h +++ b/openfpga/src/fpga_verilog/verilog_writer_utils.h @@ -96,7 +96,8 @@ BasicPort generate_verilog_bus_port(const std::vector& input_ports, std::string generate_verilog_local_wire(const BasicPort& output_port, const std::vector& input_ports); -std::string generate_verilog_constant_values(const std::vector& const_values); +std::string generate_verilog_constant_values(const std::vector& const_values, + const bool& short_constant = false); std::string generate_verilog_port_constant_values(const BasicPort& output_port, const std::vector& const_values); From 1fedd009124770eceeb45388b6b15f61f60de10e Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 12:23:48 -0600 Subject: [PATCH 125/180] deploy the flatten configuration memory testcase to CI --- .travis/script.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis/script.sh b/.travis/script.sh index 9d222c17a..034704c10 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -57,6 +57,9 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/con python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fast_configuration_frame --debug --show_thread_logs python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/configuration_frame --debug --show_thread_logs +echo -e "Testing standalone (flatten memory) configuration protocol of a K4N4 FPGA"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/flatten_memory --debug --show_thread_logs + echo -e "Testing user-defined simulation settings: clock frequency and number of cycles"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/fixed_simulation_settings --debug --show_thread_logs From 2def059b5b6d3663dcde451b823cb646d4818f11 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 12:25:29 -0600 Subject: [PATCH 126/180] add standalone configuration protocol to pre config test cases --- .../flatten_memory/config/task.conf | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 openfpga_flow/tasks/openfpga_shell/preconfig_testbench/flatten_memory/config/task.conf diff --git a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/flatten_memory/config/task.conf b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/flatten_memory/config/task.conf new file mode 100644 index 000000000..1a02eb45f --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/flatten_memory/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +vpr_fpga_verilog_formal_verification_top_netlist= From c456ef4d0029979d226dc28a4e1709cada47ef35 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 12:26:05 -0600 Subject: [PATCH 127/180] deploy the standalone preconfig testcase to CI --- .travis/script.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis/script.sh b/.travis/script.sh index 034704c10..846ec847f 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -59,6 +59,7 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbenc echo -e "Testing standalone (flatten memory) configuration protocol of a K4N4 FPGA"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/flatten_memory --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/flatten_memory --debug --show_thread_logs echo -e "Testing user-defined simulation settings: clock frequency and number of cycles"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/fixed_simulation_settings --debug --show_thread_logs From fe2ba7d50aadc9f398549c579f90dde740cdbf43 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 12:52:59 -0600 Subject: [PATCH 128/180] update documentation for standalone configuration protocol --- .../manual/arch_lang/config_protocol.rst | 28 ++++++++++++++++-- .../figures/frame_config_protocol_example.png | Bin 259112 -> 263616 bytes .../figures/vanilla_config_protocol.png | Bin 0 -> 184972 bytes 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 docs/source/manual/arch_lang/figures/vanilla_config_protocol.png diff --git a/docs/source/manual/arch_lang/config_protocol.rst b/docs/source/manual/arch_lang/config_protocol.rst index f37c7f18b..3eba78fd4 100644 --- a/docs/source/manual/arch_lang/config_protocol.rst +++ b/docs/source/manual/arch_lang/config_protocol.rst @@ -107,7 +107,7 @@ It will use the circuit model defined in :numref:`fig_sram_blwl`. .. code-block:: xml - + .. _fig_sram: @@ -122,5 +122,29 @@ It will use the circuit model defined in :numref:`fig_sram_blwl`. Standalone SRAM Example ~~~~~~~~~~~~~~~~~~~~~~~ +In the standalone configuration protocol, every memory cell of the core logic of a FPGA fabric can be directly accessed at the top-level module, as illustrated in :numref:`fig_vanilla_config_protocol`. + +.. _fig_vanilla_config_protocol: + +.. figure:: figures/vanilla_config_protocol.png + :scale: 30% + :alt: map to buried treasure + + Vanilla (standalone) memory organization in a hierarchical view + +The following XML code shows an example where we use the circuit model defined in :numref:`fig_sram_blwl`. + +.. code-block:: xml + + + + + +.. note:: The standalone protocol does require a memory cell to have + + - two outputs (one regular and another inverted) + - a Bit-Line input to load the data + - a Word-Line input to enable data write + +.. warning:: This is a vanilla configuration method, which allow users to build their own configuration protocol on top of it. -.. warning:: TO BE CONSTRUCTED diff --git a/docs/source/manual/arch_lang/figures/frame_config_protocol_example.png b/docs/source/manual/arch_lang/figures/frame_config_protocol_example.png index 9cc4e7e4d84b5a48976fe69e60a1d9f4e540d242..cd24907994c64ca4316262564df631854c98eb8e 100644 GIT binary patch literal 263616 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 VY+mW{Clyk_Wp4wsE;{0V?LTdbsX+h$ literal 259112 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

5I**XzdMK+jJEzHxTn-( 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

?ZS4%7X?UaX93x*VbTh` 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

1;e<5?|D-ccD7*HdKCMX__t$YmM3(T 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 LISlIuznEn*4?o+Z*Z%d2T@E}Pyc+hn)#Fac< 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 TO0R!_fS(t#$}*+Ti~|2ZLV;dA diff --git a/docs/source/manual/arch_lang/figures/vanilla_config_protocol.png b/docs/source/manual/arch_lang/figures/vanilla_config_protocol.png new file mode 100644 index 0000000000000000000000000000000000000000..3b62b0df7f85a5c280c7df71933b701422096df0 GIT binary patch literal 184972 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 literal 0 HcmV?d00001 From 0931eccbf685174c589f301def305cf03bdc2eb8 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 12:58:42 -0600 Subject: [PATCH 129/180] update documentation for the fast configuration options --- docs/source/manual/openfpga_shell/openfpga_commands.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/manual/openfpga_shell/openfpga_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands.rst index 1ac4ed69b..6e2f0e490 100644 --- a/docs/source/manual/openfpga_shell/openfpga_commands.rst +++ b/docs/source/manual/openfpga_shell/openfpga_commands.rst @@ -172,6 +172,8 @@ FPGA-Verilog - ``--reference_benchmark_file_path`` Must specify the reference benchmark Verilog file if you want to output any testbenches + - ``--fast_configuration`` Enable fast configuration phase for the top-level testbench in order to reduce runtime of simulations. It is applicable to memory bank and frame-based configuration protocols. When enabled, all the zero configuration bits will be skipped. So ensure that your memory cells can be correctly reset to zero with a reset signal. + - ``--print_top_testbench`` Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA - ``--print_formal_verification_top_netlist`` Generate a top-level module which can be used in formal verification From ad7422359d795a449db21fd686b9dea19fe4db9c Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 13:04:55 -0600 Subject: [PATCH 130/180] deploy compact constant values in Verilog codes --- openfpga/src/fpga_verilog/verilog_writer_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfpga/src/fpga_verilog/verilog_writer_utils.h b/openfpga/src/fpga_verilog/verilog_writer_utils.h index 0d8219283..21c12509b 100644 --- a/openfpga/src/fpga_verilog/verilog_writer_utils.h +++ b/openfpga/src/fpga_verilog/verilog_writer_utils.h @@ -97,7 +97,7 @@ std::string generate_verilog_local_wire(const BasicPort& output_port, const std::vector& input_ports); std::string generate_verilog_constant_values(const std::vector& const_values, - const bool& short_constant = false); + const bool& short_constant = true); std::string generate_verilog_port_constant_values(const BasicPort& output_port, const std::vector& const_values); From c00653961e732af832e3e7ef7545ddf699a3fc03 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 15:26:22 -0600 Subject: [PATCH 131/180] minor format fix in documentation --- docs/source/manual/arch_lang/config_protocol.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/manual/arch_lang/config_protocol.rst b/docs/source/manual/arch_lang/config_protocol.rst index 3eba78fd4..2fcdae535 100644 --- a/docs/source/manual/arch_lang/config_protocol.rst +++ b/docs/source/manual/arch_lang/config_protocol.rst @@ -35,6 +35,7 @@ Template .. option:: circuit_model_name="" Specify the name of circuit model to be used as configurable memory. + - ``scan_chain`` requires a circuit model type of ``ccff`` - ``frame_based`` requires a circuit model type of ``sram`` - ``memory_bank`` requires a circuit model type of ``sram`` From fa8dfc1fbdc021208a10daac2c9f60f4b223faff Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 15:49:15 -0600 Subject: [PATCH 132/180] add configuration protocol ports to top module for memory bank organization --- openfpga/src/base/openfpga_reserved_words.h | 2 + openfpga/src/fabric/build_top_module.cpp | 4 +- .../src/fabric/build_top_module_memory.cpp | 100 ++++++++++++++++++ openfpga/src/fabric/build_top_module_memory.h | 7 ++ openfpga/src/utils/decoder_library_utils.cpp | 39 +++++++ openfpga/src/utils/decoder_library_utils.h | 2 + openfpga/src/utils/module_manager_utils.cpp | 2 +- 7 files changed, 154 insertions(+), 2 deletions(-) diff --git a/openfpga/src/base/openfpga_reserved_words.h b/openfpga/src/base/openfpga_reserved_words.h index 40a2af96b..a9b31f64e 100644 --- a/openfpga/src/base/openfpga_reserved_words.h +++ b/openfpga/src/base/openfpga_reserved_words.h @@ -38,6 +38,8 @@ constexpr char* DECODER_ADDRESS_PORT_NAME = "address"; constexpr char* DECODER_DATA_IN_PORT_NAME = "data_in"; constexpr char* DECODER_DATA_OUT_PORT_NAME = "data_out"; constexpr char* DECODER_DATA_OUT_INV_PORT_NAME = "data_out_inv"; +constexpr char* DECODER_BL_ADDRESS_PORT_NAME = "bl_address"; +constexpr char* DECODER_WL_ADDRESS_PORT_NAME = "wl_address"; /* Inverted port naming */ constexpr char* INV_PORT_POSTFIX = "_inv"; diff --git a/openfpga/src/fabric/build_top_module.cpp b/openfpga/src/fabric/build_top_module.cpp index 072548807..7b05a5676 100644 --- a/openfpga/src/fabric/build_top_module.cpp +++ b/openfpga/src/fabric/build_top_module.cpp @@ -384,7 +384,9 @@ void build_top_module(ModuleManager& module_manager, */ size_t module_num_config_bits = find_module_num_config_bits_from_child_modules(module_manager, top_module, circuit_lib, sram_model, sram_orgz_type); if (0 < module_num_config_bits) { - add_sram_ports_to_module_manager(module_manager, top_module, circuit_lib, sram_model, sram_orgz_type, module_num_config_bits); + add_top_module_sram_ports(module_manager, top_module, + circuit_lib, sram_model, + sram_orgz_type, module_num_config_bits); } /* Add module nets to connect memory cells inside diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index b5d7f1db1..c2a726ea9 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -13,6 +13,8 @@ #include "openfpga_reserved_words.h" #include "openfpga_naming.h" +#include "memory_utils.h" +#include "decoder_library_utils.h" #include "module_manager_utils.h" #include "build_top_module_memory.h" @@ -361,6 +363,104 @@ void organize_top_module_memory_modules(ModuleManager& module_manager, } } +/******************************************************************** + * Add a list of ports that are used for SRAM configuration to the FPGA + * top-level module + * The type and names of added ports strongly depend on the + * organization of SRAMs. + * 1. Standalone SRAMs: + * two ports will be added, which are BL and WL + * 2. Scan-chain Flip-flops: + * two ports will be added, which are the head of scan-chain + * and the tail of scan-chain + * IMPORTANT: the port size will be forced to 1 in this case + * because the head and tail are both 1-bit ports!!! + * 3. Memory decoders: + * - An enable signal + * - A BL address port + * - A WL address port + * - A data-in port for the BL decoder + * 4. Frame-based memory: + * - An Enable signal + * - An address port, whose size depends on the number of config bits + * and the maximum size of address ports of configurable children + * - An data_in port (single-bit) + ********************************************************************/ +void add_top_module_sram_ports(ModuleManager& module_manager, + const ModuleId& module_id, + const CircuitLibrary& circuit_lib, + const CircuitModelId& sram_model, + const e_config_protocol_type sram_orgz_type, + const size_t& num_config_bits) { + std::vector sram_port_names = generate_sram_port_names(circuit_lib, sram_model, sram_orgz_type); + size_t sram_port_size = generate_sram_port_size(sram_orgz_type, num_config_bits); + + /* Add ports to the module manager */ + switch (sram_orgz_type) { + case CONFIG_MEM_STANDALONE: { + for (const std::string& sram_port_name : sram_port_names) { + /* Add generated ports to the ModuleManager */ + BasicPort sram_port(sram_port_name, sram_port_size); + module_manager.add_port(module_id, sram_port, ModuleManager::MODULE_INPUT_PORT); + } + break; + } + case CONFIG_MEM_MEMORY_BANK: { + BasicPort en_port(std::string(DECODER_ENABLE_PORT_NAME), 1); + module_manager.add_port(module_id, en_port, ModuleManager::MODULE_INPUT_PORT); + + size_t bl_addr_size = find_memory_decoder_addr_size(num_config_bits); + BasicPort bl_addr_port(std::string(DECODER_BL_ADDRESS_PORT_NAME), bl_addr_size); + module_manager.add_port(module_id, bl_addr_port, ModuleManager::MODULE_INPUT_PORT); + + size_t wl_addr_size = find_memory_decoder_addr_size(num_config_bits); + BasicPort wl_addr_port(std::string(DECODER_WL_ADDRESS_PORT_NAME), wl_addr_size); + module_manager.add_port(module_id, wl_addr_port, ModuleManager::MODULE_INPUT_PORT); + + BasicPort din_port(std::string(DECODER_DATA_IN_PORT_NAME), 1); + module_manager.add_port(module_id, din_port, ModuleManager::MODULE_INPUT_PORT); + + break; + } + case CONFIG_MEM_SCAN_CHAIN: { + /* Note that configuration chain tail is an output while head is an input + * IMPORTANT: this is co-designed with function generate_sram_port_names() + * If the return vector is changed, the following codes MUST be adapted! + */ + VTR_ASSERT(2 == sram_port_names.size()); + size_t port_counter = 0; + for (const std::string& sram_port_name : sram_port_names) { + /* Add generated ports to the ModuleManager */ + BasicPort sram_port(sram_port_name, sram_port_size); + if (0 == port_counter) { + module_manager.add_port(module_id, sram_port, ModuleManager::MODULE_INPUT_PORT); + } else { + VTR_ASSERT(1 == port_counter); + module_manager.add_port(module_id, sram_port, ModuleManager::MODULE_OUTPUT_PORT); + } + port_counter++; + } + break; + } + case CONFIG_MEM_FRAME_BASED: { + BasicPort en_port(std::string(DECODER_ENABLE_PORT_NAME), 1); + module_manager.add_port(module_id, en_port, ModuleManager::MODULE_INPUT_PORT); + + BasicPort addr_port(std::string(DECODER_ADDRESS_PORT_NAME), num_config_bits); + module_manager.add_port(module_id, addr_port, ModuleManager::MODULE_INPUT_PORT); + + BasicPort din_port(std::string(DECODER_DATA_IN_PORT_NAME), 1); + module_manager.add_port(module_id, din_port, ModuleManager::MODULE_INPUT_PORT); + + break; + } + default: + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid type of SRAM organization !\n"); + exit(1); + } +} + /********************************************************************* * Add the port-to-port connection between all the memory modules diff --git a/openfpga/src/fabric/build_top_module_memory.h b/openfpga/src/fabric/build_top_module_memory.h index 1d0295b87..a912845b2 100644 --- a/openfpga/src/fabric/build_top_module_memory.h +++ b/openfpga/src/fabric/build_top_module_memory.h @@ -34,6 +34,13 @@ void organize_top_module_memory_modules(ModuleManager& module_manager, const std::map>& cb_instance_ids, const bool& compact_routing_hierarchy); +void add_top_module_sram_ports(ModuleManager& module_manager, + const ModuleId& module_id, + const CircuitLibrary& circuit_lib, + const CircuitModelId& sram_model, + const e_config_protocol_type sram_orgz_type, + const size_t& num_config_bits); + void add_top_module_nets_memory_config_bus(ModuleManager& module_manager, DecoderLibrary& decoder_lib, const ModuleId& parent_module, diff --git a/openfpga/src/utils/decoder_library_utils.cpp b/openfpga/src/utils/decoder_library_utils.cpp index a41e439ef..20f7473b2 100644 --- a/openfpga/src/utils/decoder_library_utils.cpp +++ b/openfpga/src/utils/decoder_library_utils.cpp @@ -38,6 +38,45 @@ size_t find_mux_local_decoder_addr_size(const size_t& data_size) { return ceil(log(data_size) / log(2)); } +/*************************************************************************************** + * Find the size of address lines for a memory decoder to access a memory array + * Addr lines + * | | ... | + * v v v + * +-----------+ + * / Local \ + * / Decoder \ + * +-----------------+ + * | | | ... | | | + * v v v v v v + * Data outputs + * + * +------+ +------+ +------+ + * | SRAM | | SRAM | ... | SRAM | + * | [0] | | [1] | | [i] | + * +------+ +------+ +------+ + * + * +------+ +------+ +------+ + * | SRAM | | SRAM | ... | SRAM | + * | [i+1]| | [i+2]| |[2i-1]| + * +------+ +------+ +------+ + * + * ... ... ... + * + * +------+ +------+ +------+ + * | SRAM | | SRAM | ... | SRAM | + * | [x] | | [x+1]| | [N] | + * +------+ +------+ +------+ + * + * Due to the shared lines in the array, + * each memory decoder (BL or WL) will access sqrt(N) control lins (BL or WL) + * Then we can use the function for mux local encoder to compute the address size + * + ***************************************************************************************/ +size_t find_memory_decoder_addr_size(const size_t& num_mems) { + return find_mux_local_decoder_addr_size((size_t)std::ceil(std::sqrt((float)num_mems))); +} + /*************************************************************************************** * Try to find if the decoder already exists in the library, * If there is no such decoder, add it to the library diff --git a/openfpga/src/utils/decoder_library_utils.h b/openfpga/src/utils/decoder_library_utils.h index d55a0750a..e43068f5f 100644 --- a/openfpga/src/utils/decoder_library_utils.h +++ b/openfpga/src/utils/decoder_library_utils.h @@ -13,6 +13,8 @@ bool need_mux_local_decoder(const size_t& data_size); size_t find_mux_local_decoder_addr_size(const size_t& data_size); +size_t find_memory_decoder_addr_size(const size_t& num_mems); + DecoderId add_mux_local_decoder_to_library(DecoderLibrary& decoder_lib, const size_t data_size); diff --git a/openfpga/src/utils/module_manager_utils.cpp b/openfpga/src/utils/module_manager_utils.cpp index cf9808466..ec871368a 100644 --- a/openfpga/src/utils/module_manager_utils.cpp +++ b/openfpga/src/utils/module_manager_utils.cpp @@ -163,7 +163,7 @@ void add_formal_verification_sram_ports_to_module_manager(ModuleManager& module_ * The type and names of added ports strongly depend on the * organization of SRAMs. * 1. Standalone SRAMs: - * two ports will be added, which are regular output and inverted output + * two ports will be added, which are BL and WL * 2. Scan-chain Flip-flops: * two ports will be added, which are the head of scan-chain * and the tail of scan-chain From 0e16ee10300e606b26230f5a472e9174fd0b9907 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 18:14:36 -0600 Subject: [PATCH 133/180] add configuration bus nets for memory bank decoders at top module --- openfpga/src/base/openfpga_naming.cpp | 28 ++ openfpga/src/base/openfpga_naming.h | 6 + openfpga/src/fabric/build_decoder_modules.cpp | 113 ++++++++ openfpga/src/fabric/build_decoder_modules.h | 8 + .../src/fabric/build_top_module_memory.cpp | 245 ++++++++++++++++++ openfpga/src/utils/decoder_library_utils.cpp | 4 + openfpga/src/utils/decoder_library_utils.h | 2 + 7 files changed, 406 insertions(+) diff --git a/openfpga/src/base/openfpga_naming.cpp b/openfpga/src/base/openfpga_naming.cpp index 5cf00bf7f..1c792d26d 100644 --- a/openfpga/src/base/openfpga_naming.cpp +++ b/openfpga/src/base/openfpga_naming.cpp @@ -156,6 +156,34 @@ std::string generate_frame_memory_decoder_subckt_name(const size_t& addr_size, return subckt_name; } +/************************************************ + * Generate the module name of a bit-line decoder + * for memories + ***********************************************/ +std::string generate_bl_memory_decoder_subckt_name(const size_t& addr_size, + const size_t& data_size) { + std::string subckt_name = "bl_decoder"; + subckt_name += std::to_string(addr_size); + subckt_name += "to"; + subckt_name += std::to_string(data_size); + + return subckt_name; +} + +/************************************************ + * Generate the module name of a word-line decoder + * for memories + ***********************************************/ +std::string generate_wl_memory_decoder_subckt_name(const size_t& addr_size, + const size_t& data_size) { + std::string subckt_name = "wl_decoder"; + subckt_name += std::to_string(addr_size); + subckt_name += "to"; + subckt_name += std::to_string(data_size); + + return subckt_name; +} + /************************************************ * Generate the module name of a routing track wire ***********************************************/ diff --git a/openfpga/src/base/openfpga_naming.h b/openfpga/src/base/openfpga_naming.h index 4e1c44fa9..534bf2a78 100644 --- a/openfpga/src/base/openfpga_naming.h +++ b/openfpga/src/base/openfpga_naming.h @@ -53,6 +53,12 @@ std::string generate_mux_local_decoder_subckt_name(const size_t& addr_size, std::string generate_frame_memory_decoder_subckt_name(const size_t& addr_size, const size_t& data_size); +std::string generate_bl_memory_decoder_subckt_name(const size_t& addr_size, + const size_t& data_size); + +std::string generate_wl_memory_decoder_subckt_name(const size_t& addr_size, + const size_t& data_size); + std::string generate_segment_wire_subckt_name(const std::string& wire_model_name, const size_t& segment_id); diff --git a/openfpga/src/fabric/build_decoder_modules.cpp b/openfpga/src/fabric/build_decoder_modules.cpp index ada36e3e7..fb8a29e5c 100644 --- a/openfpga/src/fabric/build_decoder_modules.cpp +++ b/openfpga/src/fabric/build_decoder_modules.cpp @@ -74,6 +74,119 @@ ModuleId build_frame_memory_decoder_module(ModuleManager& module_manager, return module_id; } +/*************************************************************************************** + * Create a module for a BL decoder with a given output size + * + * BL Address + * | | ... | + * v v v + * +-----------+ + * / \<-- data_in + * enable-->/ Decoder \ + * +-----------------+ + * | | | ... | | | + * v v v v v v + * Data Outputs + * + * The outputs are assumes to be one-hot codes (at most only one '1' exist) + * Considering this fact, there are only num_of_outputs conditions to be encoded. + * Therefore, the number of inputs is ceil(log(num_of_outputs)/log(2)) + ***************************************************************************************/ +ModuleId build_bl_memory_decoder_module(ModuleManager& module_manager, + const DecoderLibrary& decoder_lib, + const DecoderId& decoder) { + /* Get the number of inputs */ + size_t addr_size = decoder_lib.addr_size(decoder); + size_t data_size = decoder_lib.data_size(decoder); + + /* Create a name for the local encoder */ + std::string module_name = generate_bl_memory_decoder_subckt_name(addr_size, data_size); + + /* Create a Verilog Module based on the circuit model, and add to module manager */ + ModuleId module_id = module_manager.add_module(module_name); + VTR_ASSERT(true == module_manager.valid_module_id(module_id)); + + /* Add enable port */ + BasicPort en_port(std::string(DECODER_ENABLE_PORT_NAME), 1); + module_manager.add_port(module_id, en_port, ModuleManager::MODULE_INPUT_PORT); + /* Add each input port */ + BasicPort addr_port(std::string(DECODER_ADDRESS_PORT_NAME), addr_size); + module_manager.add_port(module_id, addr_port, ModuleManager::MODULE_INPUT_PORT); + /* Add each input port */ + BasicPort din_port(std::string(DECODER_DATA_IN_PORT_NAME), 1); + module_manager.add_port(module_id, din_port, ModuleManager::MODULE_INPUT_PORT); + /* Add each output port */ + BasicPort data_port(std::string(DECODER_DATA_OUT_PORT_NAME), data_size); + module_manager.add_port(module_id, data_port, ModuleManager::MODULE_OUTPUT_PORT); + + /* Data port is registered. It should be outputted as + * output reg [lsb:msb] data + */ + module_manager.set_port_is_register(module_id, data_port.get_name(), true); + /* Add data_in port */ + if (true == decoder_lib.use_data_inv_port(decoder)) { + BasicPort data_inv_port(std::string(DECODER_DATA_OUT_INV_PORT_NAME), data_size); + module_manager.add_port(module_id, data_inv_port, ModuleManager::MODULE_OUTPUT_PORT); + } + + return module_id; +} + +/*************************************************************************************** + * Create a module for a Word-line decoder with a given output size + * + * WL Address + * | | ... | + * v v v + * +-----------+ + * / \ + * enable-->/ Decoder \ + * +-----------------+ + * | | | ... | | | + * v v v v v v + * Data Outputs + * + * The outputs are assumes to be one-hot codes (at most only one '1' exist) + * Considering this fact, there are only num_of_outputs conditions to be encoded. + * Therefore, the number of inputs is ceil(log(num_of_outputs)/log(2)) + ***************************************************************************************/ +ModuleId build_wl_memory_decoder_module(ModuleManager& module_manager, + const DecoderLibrary& decoder_lib, + const DecoderId& decoder) { + /* Get the number of inputs */ + size_t addr_size = decoder_lib.addr_size(decoder); + size_t data_size = decoder_lib.data_size(decoder); + + /* Create a name for the local encoder */ + std::string module_name = generate_wl_memory_decoder_subckt_name(addr_size, data_size); + + /* Create a Verilog Module based on the circuit model, and add to module manager */ + ModuleId module_id = module_manager.add_module(module_name); + VTR_ASSERT(true == module_manager.valid_module_id(module_id)); + + /* Add enable port */ + BasicPort en_port(std::string(DECODER_ENABLE_PORT_NAME), 1); + module_manager.add_port(module_id, en_port, ModuleManager::MODULE_INPUT_PORT); + /* Add each input port */ + BasicPort addr_port(std::string(DECODER_ADDRESS_PORT_NAME), addr_size); + module_manager.add_port(module_id, addr_port, ModuleManager::MODULE_INPUT_PORT); + /* Add each output port */ + BasicPort data_port(std::string(DECODER_DATA_OUT_PORT_NAME), data_size); + module_manager.add_port(module_id, data_port, ModuleManager::MODULE_OUTPUT_PORT); + + /* Data port is registered. It should be outputted as + * output reg [lsb:msb] data + */ + module_manager.set_port_is_register(module_id, data_port.get_name(), true); + /* Add data_in port */ + if (true == decoder_lib.use_data_inv_port(decoder)) { + BasicPort data_inv_port(std::string(DECODER_DATA_OUT_INV_PORT_NAME), data_size); + module_manager.add_port(module_id, data_inv_port, ModuleManager::MODULE_OUTPUT_PORT); + } + + return module_id; +} + /*************************************************************************************** * Create a module for a decoder with a given output size * diff --git a/openfpga/src/fabric/build_decoder_modules.h b/openfpga/src/fabric/build_decoder_modules.h index bf18e47d4..13d5091d4 100644 --- a/openfpga/src/fabric/build_decoder_modules.h +++ b/openfpga/src/fabric/build_decoder_modules.h @@ -20,6 +20,14 @@ ModuleId build_frame_memory_decoder_module(ModuleManager& module_manager, const DecoderLibrary& decoder_lib, const DecoderId& decoder); +ModuleId build_bl_memory_decoder_module(ModuleManager& module_manager, + const DecoderLibrary& decoder_lib, + const DecoderId& decoder); + +ModuleId build_wl_memory_decoder_module(ModuleManager& module_manager, + const DecoderLibrary& decoder_lib, + const DecoderId& decoder); + void build_mux_local_decoder_modules(ModuleManager& module_manager, const MuxLibrary& mux_lib, const CircuitLibrary& circuit_lib); diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index c2a726ea9..278a33f2d 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -16,6 +16,7 @@ #include "memory_utils.h" #include "decoder_library_utils.h" #include "module_manager_utils.h" +#include "build_decoder_modules.h" #include "build_top_module_memory.h" /* begin namespace openfpga */ @@ -461,6 +462,249 @@ void add_top_module_sram_ports(ModuleManager& module_manager, } } +/********************************************************************* + * Top-level function to add nets for memory banks + * - Find the number of BLs and WLs required + * - Create BL and WL decoders, and add them to decoder library + * - Create nets to connect from top-level module inputs to inputs of decoders + * - Create nets to connect from outputs of decoders to BL/WL of configurable children + * + * WL_enable WL address + * | | + * v v + * +-----------------------------------------------+ + * | Word Line Decoder | + * +-----------------------------------------------+ + * +---------+ | | | + * BL | | | | | + * enable ---->| |-----------+--------------+---- ... |------+--> BL[0] + * | | | | | | | | + * | | | v | v | v + * | Bit | | +------+ | +------+ | +------+ + * BL | Line | +-->| SRAM | +-->| SRAM | +->| SRAM | + * address ---->| Decoder | | | [0] | | | [1] | ... | | [i] | + * | | | +------+ | +------+ | +------+ + * | | | | | + * | |-----------+--------------+---- --- | -----+--> BL[1] + * | | | | | | | | + * | | | v | v | v + * | | | +------+ | +------+ | +------+ + * | | +-->| SRAM | | | SRAM | +->| SRAM | + * | | | | [x] | | | [x+1]| ... | | [x+i]| + * | | | +------+ | +------+ | +------+ + * | | | | + * | | | ... ... ... | ... + * | | | | | + * | |-----------+--------------+---- --- | -----+--> BL[y] + * | | | | | | | | + * | | | v | v | v + * | | | +------+ | +------+ | +------+ + * | | +-->| SRAM | +-->| SRAM | +->| SRAM | + * | | | | [y] | | |[y+1] | ... | |[y+i] | + * | | | +------+ | +------+ | +------+ + * BL | | v v v + * data_in ---->| | WL[0] WL[1] WL[i] + * +---------+ + * + **********************************************************************/ +static +void add_top_module_nets_cmos_memory_bank_config_bus(ModuleManager& module_manager, + DecoderLibrary& decoder_lib, + const ModuleId& top_module) { + /* Find Enable port from the top-level module */ + ModulePortId en_port = module_manager.find_module_port(top_module, std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort en_port_info = module_manager.module_port(top_module, en_port); + + /* Find data-in port from the top-level module */ + ModulePortId din_port = module_manager.find_module_port(top_module, std::string(DECODER_DATA_IN_PORT_NAME)); + BasicPort din_port_info = module_manager.module_port(top_module, din_port); + + /* Find BL and WL address port from the top-level module */ + ModulePortId bl_addr_port = module_manager.find_module_port(top_module, std::string(DECODER_BL_ADDRESS_PORT_NAME)); + BasicPort bl_addr_port_info = module_manager.module_port(top_module, bl_addr_port); + + ModulePortId wl_addr_port = module_manager.find_module_port(top_module, std::string(DECODER_WL_ADDRESS_PORT_NAME)); + BasicPort wl_addr_port_info = module_manager.module_port(top_module, wl_addr_port); + + /* Find the number of BLs and WLs required to access each memory bit */ + size_t bl_addr_size = bl_addr_port_info.get_width(); + size_t wl_addr_size = wl_addr_port_info.get_width(); + size_t num_bls = find_memory_decoder_data_size(bl_addr_size); + size_t num_wls = find_memory_decoder_data_size(wl_addr_size); + + /* Add the BL decoder module + * Search the decoder library + * If we find one, we use the module. + * Otherwise, we create one and add it to the decoder library + */ + DecoderId bl_decoder_id = decoder_lib.find_decoder(bl_addr_size, num_bls, + true, true, false); + if (DecoderId::INVALID() == bl_decoder_id) { + bl_decoder_id = decoder_lib.add_decoder(bl_addr_size, num_bls, true, true, false); + } + VTR_ASSERT(DecoderId::INVALID() != bl_decoder_id); + + /* Create a module if not existed yet */ + std::string bl_decoder_module_name = generate_bl_memory_decoder_subckt_name(bl_addr_size, num_bls); + ModuleId bl_decoder_module = module_manager.find_module(bl_decoder_module_name); + if (ModuleId::INVALID() == bl_decoder_module) { + /* BL decoder has the same ports as the frame-based decoders + * We reuse it here + */ + bl_decoder_module = build_bl_memory_decoder_module(module_manager, + decoder_lib, + bl_decoder_id); + } + VTR_ASSERT(ModuleId::INVALID() != bl_decoder_module); + VTR_ASSERT(0 == module_manager.num_instance(top_module, bl_decoder_module)); + module_manager.add_child_module(top_module, bl_decoder_module); + + /* Add the WL decoder module + * Search the decoder library + * If we find one, we use the module. + * Otherwise, we create one and add it to the decoder library + */ + DecoderId wl_decoder_id = decoder_lib.find_decoder(wl_addr_size, num_wls, + true, false, false); + if (DecoderId::INVALID() == wl_decoder_id) { + wl_decoder_id = decoder_lib.add_decoder(wl_addr_size, num_wls, true, false, false); + } + VTR_ASSERT(DecoderId::INVALID() != wl_decoder_id); + + /* Create a module if not existed yet */ + std::string wl_decoder_module_name = generate_bl_memory_decoder_subckt_name(wl_addr_size, num_wls); + ModuleId wl_decoder_module = module_manager.find_module(wl_decoder_module_name); + if (ModuleId::INVALID() == wl_decoder_module) { + /* BL decoder has the same ports as the frame-based decoders + * We reuse it here + */ + wl_decoder_module = build_wl_memory_decoder_module(module_manager, + decoder_lib, + wl_decoder_id); + } + VTR_ASSERT(ModuleId::INVALID() != wl_decoder_module); + VTR_ASSERT(0 == module_manager.num_instance(top_module, wl_decoder_module)); + module_manager.add_child_module(top_module, wl_decoder_module); + + /* Add module nets from the top module to BL decoder's inputs */ + ModulePortId bl_decoder_en_port = module_manager.find_module_port(bl_decoder_module, std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort bl_decoder_en_port_info = module_manager.module_port(bl_decoder_module, bl_decoder_en_port); + + ModulePortId bl_decoder_addr_port = module_manager.find_module_port(bl_decoder_module, std::string(DECODER_ADDRESS_PORT_NAME)); + BasicPort bl_decoder_addr_port_info = module_manager.module_port(bl_decoder_module, bl_decoder_addr_port); + + ModulePortId bl_decoder_din_port = module_manager.find_module_port(bl_decoder_module, std::string(DECODER_DATA_IN_PORT_NAME)); + BasicPort bl_decoder_din_port_info = module_manager.module_port(bl_decoder_module, bl_decoder_din_port); + + /* Top module Enable port -> BL Decoder Enable port */ + add_module_bus_nets(module_manager, + top_module, + top_module, 0, en_port, + bl_decoder_module, 0, bl_decoder_en_port); + + /* Top module Address port -> BL Decoder Address port */ + add_module_bus_nets(module_manager, + top_module, + top_module, 0, bl_addr_port, + bl_decoder_module, 0, bl_decoder_addr_port); + + /* Top module data_in port -> BL Decoder data_in port */ + add_module_bus_nets(module_manager, + top_module, + top_module, 0, din_port, + bl_decoder_module, 0, bl_decoder_din_port); + + /* Add module nets from the top module to WL decoder's inputs */ + ModulePortId wl_decoder_en_port = module_manager.find_module_port(wl_decoder_module, std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort wl_decoder_en_port_info = module_manager.module_port(wl_decoder_module, wl_decoder_en_port); + + ModulePortId wl_decoder_addr_port = module_manager.find_module_port(wl_decoder_module, std::string(DECODER_ADDRESS_PORT_NAME)); + BasicPort wl_decoder_addr_port_info = module_manager.module_port(wl_decoder_module, bl_decoder_addr_port); + + /* Top module Enable port -> WL Decoder Enable port */ + add_module_bus_nets(module_manager, + top_module, + top_module, 0, en_port, + wl_decoder_module, 0, wl_decoder_en_port); + + /* Top module Address port -> WL Decoder Address port */ + add_module_bus_nets(module_manager, + top_module, + top_module, 0, wl_addr_port, + wl_decoder_module, 0, wl_decoder_addr_port); + + /* Add nets from BL data out to each configurable child */ + size_t cur_bl_index = 0; + + ModulePortId bl_decoder_dout_port = module_manager.find_module_port(bl_decoder_module, std::string(DECODER_DATA_OUT_PORT_NAME)); + BasicPort bl_decoder_dout_port_info = module_manager.module_port(bl_decoder_module, bl_decoder_dout_port); + + for (size_t child_id = 0; child_id < module_manager.configurable_children(top_module).size(); ++child_id) { + ModuleId child_module = module_manager.configurable_children(top_module)[child_id]; + size_t child_instance = module_manager.configurable_child_instances(top_module)[child_id]; + + /* Find the BL port */ + ModulePortId child_bl_port = module_manager.find_module_port(child_module, std::string(MEMORY_BL_PORT_NAME)); + BasicPort child_bl_port_info = module_manager.module_port(child_module, child_bl_port); + + for (const size_t& sink_bl_pin : child_bl_port_info.pins()) { + /* Find the BL decoder data index: + * It should be the residual when divided by the number of BLs + */ + size_t bl_pin_id = cur_bl_index / num_bls; + + /* Create net */ + ModuleNetId net = create_module_source_pin_net(module_manager, top_module, + bl_decoder_module, 0, + bl_decoder_dout_port, + bl_decoder_dout_port_info.pins()[bl_pin_id]); + VTR_ASSERT(ModuleNetId::INVALID() != net); + + /* Add net sink */ + module_manager.add_module_net_sink(top_module, net, + child_module, child_instance, child_bl_port, sink_bl_pin); + + /* Increment the BL index */ + cur_bl_index++; + } + } + + /* Add nets from WL data out to each configurable child */ + size_t cur_wl_index = 0; + + ModulePortId wl_decoder_dout_port = module_manager.find_module_port(wl_decoder_module, std::string(DECODER_DATA_OUT_PORT_NAME)); + BasicPort wl_decoder_dout_port_info = module_manager.module_port(wl_decoder_module, wl_decoder_dout_port); + + for (size_t child_id = 0; child_id < module_manager.configurable_children(top_module).size(); ++child_id) { + ModuleId child_module = module_manager.configurable_children(top_module)[child_id]; + size_t child_instance = module_manager.configurable_child_instances(top_module)[child_id]; + + /* Find the WL port */ + ModulePortId child_wl_port = module_manager.find_module_port(child_module, std::string(MEMORY_WL_PORT_NAME)); + BasicPort child_wl_port_info = module_manager.module_port(child_module, child_wl_port); + + for (const size_t& sink_wl_pin : child_wl_port_info.pins()) { + /* Find the BL decoder data index: + * It should be the residual when divided by the number of BLs + */ + size_t wl_pin_id = cur_wl_index % num_wls; + + /* Create net */ + ModuleNetId net = create_module_source_pin_net(module_manager, top_module, + wl_decoder_module, 0, + wl_decoder_dout_port, + wl_decoder_dout_port_info.pins()[wl_pin_id]); + VTR_ASSERT(ModuleNetId::INVALID() != net); + + /* Add net sink */ + module_manager.add_module_net_sink(top_module, net, + child_module, child_instance, child_wl_port, sink_wl_pin); + + /* Increment the WL index */ + cur_wl_index++; + } + } +} /********************************************************************* * Add the port-to-port connection between all the memory modules @@ -524,6 +768,7 @@ void add_top_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, } case CONFIG_MEM_MEMORY_BANK: /* TODO */ + add_top_module_nets_cmos_memory_bank_config_bus(module_manager, decoder_lib, parent_module); break; case CONFIG_MEM_FRAME_BASED: add_module_nets_cmos_memory_frame_config_bus(module_manager, decoder_lib, parent_module); diff --git a/openfpga/src/utils/decoder_library_utils.cpp b/openfpga/src/utils/decoder_library_utils.cpp index 20f7473b2..8fd7e2208 100644 --- a/openfpga/src/utils/decoder_library_utils.cpp +++ b/openfpga/src/utils/decoder_library_utils.cpp @@ -77,6 +77,10 @@ size_t find_memory_decoder_addr_size(const size_t& num_mems) { return find_mux_local_decoder_addr_size((size_t)std::ceil(std::sqrt((float)num_mems))); } +size_t find_memory_decoder_data_size(const size_t& num_addr) { + return (size_t)std::pow(2., num_addr); +} + /*************************************************************************************** * Try to find if the decoder already exists in the library, * If there is no such decoder, add it to the library diff --git a/openfpga/src/utils/decoder_library_utils.h b/openfpga/src/utils/decoder_library_utils.h index e43068f5f..f7f06f733 100644 --- a/openfpga/src/utils/decoder_library_utils.h +++ b/openfpga/src/utils/decoder_library_utils.h @@ -15,6 +15,8 @@ size_t find_mux_local_decoder_addr_size(const size_t& data_size); size_t find_memory_decoder_addr_size(const size_t& num_mems); +size_t find_memory_decoder_data_size(const size_t& num_addr); + DecoderId add_mux_local_decoder_to_library(DecoderLibrary& decoder_lib, const size_t data_size); From 51e1559352c5a64e909ca391622c8550c1e51088 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 19:12:46 -0600 Subject: [PATCH 134/180] add fabric bitstream support for memory bank configuration protocol --- .../fpga_bitstream/build_fabric_bitstream.cpp | 102 ++++++++++++++++++ .../src/fpga_bitstream/fabric_bitstream.cpp | 26 ++++- .../src/fpga_bitstream/fabric_bitstream.h | 20 +++- 3 files changed, 141 insertions(+), 7 deletions(-) diff --git a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp index f281a72dc..1be2025b3 100644 --- a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp @@ -15,6 +15,7 @@ #include "openfpga_reserved_words.h" #include "openfpga_naming.h" +#include "decoder_library_utils.h" #include "bitstream_manager_utils.h" #include "build_fabric_bitstream.h" @@ -73,6 +74,90 @@ void rec_build_module_fabric_dependent_chain_bitstream(const BitstreamManager& b } } +/******************************************************************** + * This function aims to build a bitstream for memory-bank protocol + * It will walk through all the configurable children under a module + * in a recursive way, following a Depth-First Search (DFS) strategy + * For each configuration child, we use its instance name as a key to spot the + * configuration bits in bitstream manager. + * Note that it is guarentee that the instance name in module manager is + * consistent with the block names in bitstream manager + * We use this link to reorganize the bitstream in the sequence of memories as we stored + * in the configurable_children() and configurable_child_instances() of each module of module manager + * + * In such configuration organization, each memory cell has an unique index. + * Using this index, we can infer the address codes for both BL and WL decoders. + * Note that, we must get the number of BLs and WLs before using this function! + *******************************************************************/ +static +void rec_build_module_fabric_dependent_memory_bank_bitstream(const BitstreamManager& bitstream_manager, + const ConfigBlockId& parent_block, + const ModuleManager& module_manager, + const ModuleId& parent_module, + const size_t& bl_addr_size, + const size_t& wl_addr_size, + const size_t& num_bls, + const size_t& num_wls, + size_t& cur_mem_index, + FabricBitstream& fabric_bitstream) { + + /* Depth-first search: if we have any children in the parent_block, + * we dive to the next level first! + */ + if (0 < bitstream_manager.block_children(parent_block).size()) { + for (size_t child_id = 0; child_id < module_manager.configurable_children(parent_module).size(); ++child_id) { + ModuleId child_module = module_manager.configurable_children(parent_module)[child_id]; + size_t child_instance = module_manager.configurable_child_instances(parent_module)[child_id]; + /* Get the instance name and ensure it is not empty */ + std::string instance_name = module_manager.instance_name(parent_module, child_module, child_instance); + + /* Find the child block that matches the instance name! */ + ConfigBlockId child_block = bitstream_manager.find_child_block(parent_block, instance_name); + /* We must have one valid block id! */ + if (true != bitstream_manager.valid_block_id(child_block)) + VTR_ASSERT(true == bitstream_manager.valid_block_id(child_block)); + + /* Go recursively */ + rec_build_module_fabric_dependent_memory_bank_bitstream(bitstream_manager, child_block, + module_manager, child_module, + bl_addr_size, wl_addr_size, + num_bls, num_wls, + cur_mem_index, + fabric_bitstream); + } + /* Ensure that there should be no configuration bits in the parent block */ + VTR_ASSERT(0 == bitstream_manager.block_bits(parent_block).size()); + } + + /* Note that, reach here, it means that this is a leaf node. + * We add the configuration bits to the fabric_bitstream, + * And then, we can return + */ + for (const ConfigBitId& config_bit : bitstream_manager.block_bits(parent_block)) { + FabricBitId fabric_bit = fabric_bitstream.add_bit(config_bit); + + /* Find BL address */ + size_t cur_bl_index = cur_mem_index / num_bls; + std::vector bl_addr_bits_vec = itobin_vec(cur_bl_index, bl_addr_size); + + /* Find WL address */ + size_t cur_wl_index = cur_mem_index % num_wls; + std::vector wl_addr_bits_vec = itobin_vec(cur_wl_index, wl_addr_size); + + /* Set BL address */ + fabric_bitstream.set_bit_bl_address(fabric_bit, bl_addr_bits_vec); + + /* Set WL address */ + fabric_bitstream.set_bit_wl_address(fabric_bit, wl_addr_bits_vec); + + /* Set data input */ + fabric_bitstream.set_bit_din(fabric_bit, bitstream_manager.bit_value(config_bit)); + + /* Increase the memory index */ + cur_mem_index++; + } +} + /******************************************************************** * This function aims to build a bitstream for frame-based configuration protocol * It will walk through all the configurable children under a module @@ -287,6 +372,23 @@ void build_module_fabric_dependent_bitstream(const ConfigProtocol& config_protoc break; } case CONFIG_MEM_MEMORY_BANK: { + size_t cur_mem_index = 0; + /* Find BL address port size */ + ModulePortId bl_addr_port = module_manager.find_module_port(top_module, std::string(MEMORY_BL_PORT_NAME)); + BasicPort bl_addr_port_info = module_manager.module_port(top_module, bl_addr_port); + size_t num_bls = find_memory_decoder_data_size(bl_addr_port_info.get_width()); + + /* Find WL address port size */ + ModulePortId wl_addr_port = module_manager.find_module_port(top_module, std::string(MEMORY_WL_PORT_NAME)); + BasicPort wl_addr_port_info = module_manager.module_port(top_module, wl_addr_port); + size_t num_wls = find_memory_decoder_data_size(wl_addr_port_info.get_width()); + + rec_build_module_fabric_dependent_memory_bank_bitstream(bitstream_manager, top_block, + module_manager, top_module, + bl_addr_port_info.get_width(), + wl_addr_port_info.get_width(), + num_bls, num_wls, + cur_mem_index, fabric_bitstream); break; } case CONFIG_MEM_FRAME_BASED: { diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/fabric_bitstream.cpp index 7306eba01..1e318a530 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/fabric_bitstream.cpp @@ -31,7 +31,18 @@ std::vector FabricBitstream::bit_address(const FabricBitId& bit_id) cons /* Ensure a valid id */ VTR_ASSERT(true == valid_bit_id(bit_id)); - return bit_addresses_[bit_id]; + return bit_addresses_[bit_id][0]; +} + +std::vector FabricBitstream::bit_bl_address(const FabricBitId& bit_id) const { + return bit_address(bit_id); +} + +std::vector FabricBitstream::bit_wl_address(const FabricBitId& bit_id) const { + /* Ensure a valid id */ + VTR_ASSERT(true == valid_bit_id(bit_id)); + + return bit_addresses_[bit_id][1]; } bool FabricBitstream::bit_din(const FabricBitId& bit_id) const { @@ -58,7 +69,18 @@ FabricBitId FabricBitstream::add_bit(const ConfigBitId& config_bit_id) { void FabricBitstream::set_bit_address(const FabricBitId& bit_id, const std::vector& address) { VTR_ASSERT(true == valid_bit_id(bit_id)); - bit_addresses_[bit_id] = address; + bit_addresses_[bit_id][0] = address; +} + +void FabricBitstream::set_bit_bl_address(const FabricBitId& bit_id, + const std::vector& address) { + set_bit_address(bit_id, address); +} + +void FabricBitstream::set_bit_wl_address(const FabricBitId& bit_id, + const std::vector& address) { + VTR_ASSERT(true == valid_bit_id(bit_id)); + bit_addresses_[bit_id][1] = address; } void FabricBitstream::set_bit_din(const FabricBitId& bit_id, diff --git a/openfpga/src/fpga_bitstream/fabric_bitstream.h b/openfpga/src/fpga_bitstream/fabric_bitstream.h index 12d1c7885..519330dae 100644 --- a/openfpga/src/fpga_bitstream/fabric_bitstream.h +++ b/openfpga/src/fpga_bitstream/fabric_bitstream.h @@ -13,11 +13,11 @@ * By using the link between ArchBitstreamManager and FabricBitstream, * we can build a sequence of configuration bits to fit different configuration protocols. * - * +----------------------+ +--------------------------+ - * | | ConfigBitId | | + * +----------------------+ +-------------------+ + * | | ConfigBitId | | * | ArchBitstreamManager |---------------->| FabricBitstream | - * | | | | - * +----------------------+ +--------------------------+ + * | | | | + * +----------------------+ +-------------------+ * * Restrictions: * 1. Each block inside BitstreamManager should have only 1 parent block @@ -53,6 +53,8 @@ class FabricBitstream { /* Find the address of bitstream */ std::vector bit_address(const FabricBitId& bit_id) const; + std::vector bit_bl_address(const FabricBitId& bit_id) const; + std::vector bit_wl_address(const FabricBitId& bit_id) const; /* Find the data-in of bitstream */ bool bit_din(const FabricBitId& bit_id) const; @@ -64,6 +66,12 @@ class FabricBitstream { void set_bit_address(const FabricBitId& bit_id, const std::vector& address); + void set_bit_bl_address(const FabricBitId& bit_id, + const std::vector& address); + + void set_bit_wl_address(const FabricBitId& bit_id, + const std::vector& address); + void set_bit_din(const FabricBitId& bit_id, const bool& din); @@ -83,8 +91,10 @@ class FabricBitstream { /* Address bits: this is designed for memory decoders * Here we store the binary format of the address, which can be loaded * to the configuration protocol directly + * + * We use a 2-element array, as we may have a BL address and a WL address */ - vtr::vector> bit_addresses_; + vtr::vector, 2>> bit_addresses_; /* Data input (Din) bits: this is designed for memory decoders */ vtr::vector bit_dins_; From e14c39e14cc2b8329498866b8b0f6d7d21faed80 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 20:04:44 -0600 Subject: [PATCH 135/180] update Verilog full testbench generation to support memory bank configuration protocol --- .../fpga_verilog/verilog_top_testbench.cpp | 264 +++++++++++++++++- 1 file changed, 257 insertions(+), 7 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 68d1e3dba..e741e16ee 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -103,6 +103,51 @@ void print_verilog_top_testbench_config_chain_port(std::fstream& fp) { fp << generate_verilog_port(VERILOG_PORT_WIRE, config_chain_tail_port) << ";" << std::endl; } +/******************************************************************** + * Print local wires for memory bank configuration protocols + *******************************************************************/ +static +void print_verilog_top_testbench_memory_bank_port(std::fstream& fp, + const ModuleManager& module_manager, + const ModuleId& top_module) { + /* Validate the file stream */ + valid_file_stream(fp); + + /* Print the address port for the Bit-Line decoder here */ + print_verilog_comment(fp, std::string("---- Address port for Bit-Line decoder -----")); + ModulePortId bl_addr_port_id = module_manager.find_module_port(top_module, + std::string(MEMORY_BL_PORT_NAME)); + BasicPort bl_addr_port = module_manager.module_port(top_module, bl_addr_port_id); + + fp << generate_verilog_port(VERILOG_PORT_REG, bl_addr_port) << ";" << std::endl; + + /* Print the address port for the Word-Line decoder here */ + print_verilog_comment(fp, std::string("---- Address port for Word-Line decoder -----")); + ModulePortId wl_addr_port_id = module_manager.find_module_port(top_module, + std::string(MEMORY_WL_PORT_NAME)); + BasicPort wl_addr_port = module_manager.module_port(top_module, wl_addr_port_id); + + fp << generate_verilog_port(VERILOG_PORT_REG, wl_addr_port) << ";" << std::endl; + + /* Print the data-input port for the frame-based decoder here */ + print_verilog_comment(fp, std::string("---- Data input port for frame-based decoder -----")); + ModulePortId din_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_DATA_IN_PORT_NAME)); + BasicPort din_port = module_manager.module_port(top_module, din_port_id); + fp << generate_verilog_port(VERILOG_PORT_REG, din_port) << ";" << std::endl; + + /* Wire the INVERTED programming clock to the enable signal !!! */ + print_verilog_comment(fp, std::string("---- Wire enable port of frame-based decoder to inverted programming clock -----")); + ModulePortId en_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort en_port = module_manager.module_port(top_module, en_port_id); + BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); + + fp << generate_verilog_port(VERILOG_PORT_WIRE, en_port) << ";" << std::endl; + print_verilog_wire_connection(fp, en_port, prog_clock_port, true); +} + + /******************************************************************** * Print local wires for frame-based decoder protocols *******************************************************************/ @@ -155,7 +200,7 @@ void print_verilog_top_testbench_config_protocol_port(std::fstream& fp, print_verilog_top_testbench_config_chain_port(fp); break; case CONFIG_MEM_MEMORY_BANK: - /* TODO */ + print_verilog_top_testbench_memory_bank_port(fp, module_manager, top_module); break; case CONFIG_MEM_FRAME_BASED: print_verilog_top_testbench_frame_decoder_port(fp, module_manager, top_module); @@ -528,9 +573,9 @@ size_t calculate_num_config_clock_cycles(const e_config_protocol_type& sram_orgz num_config_clock_cycles = 2; break; case CONFIG_MEM_SCAN_CHAIN: - case CONFIG_MEM_MEMORY_BANK: - /* TODO */ + /* Fast configuraiton is not applicable to configuration chain protocol*/ break; + case CONFIG_MEM_MEMORY_BANK: case CONFIG_MEM_FRAME_BASED: { /* For fast configuration, we will skip all the zero data points */ if (true == fast_configuration) { @@ -644,6 +689,89 @@ void print_verilog_top_testbench_load_bitstream_task_configuration_chain(std::fs fp << std::endl; } +/******************************************************************** + * Print tasks (processes) in Verilog format, + * which is very useful in generating stimuli for each clock cycle + * This function is tuned for memory bank manipulation: + * During each programming cycle, we feed + * - an address to the BL address port of top module + * - an address to the WL address port of top module + * - a data input to the din port of top module + *******************************************************************/ +static +void print_verilog_top_testbench_load_bitstream_task_memory_bank(std::fstream& fp, + const ModuleManager& module_manager, + const ModuleId& top_module) { + + /* Validate the file stream */ + valid_file_stream(fp); + + ModulePortId en_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort en_port = module_manager.module_port(top_module, en_port_id); + + ModulePortId bl_addr_port_id = module_manager.find_module_port(top_module, + std::string(MEMORY_BL_PORT_NAME)); + BasicPort bl_addr_port = module_manager.module_port(top_module, bl_addr_port_id); + BasicPort bl_addr_value = bl_addr_port; + bl_addr_value.set_name(std::string(MEMORY_BL_PORT_NAME) + std::string("_val")); + + ModulePortId wl_addr_port_id = module_manager.find_module_port(top_module, + std::string(MEMORY_WL_PORT_NAME)); + BasicPort wl_addr_port = module_manager.module_port(top_module, wl_addr_port_id); + BasicPort wl_addr_value = wl_addr_port; + wl_addr_value.set_name(std::string(MEMORY_WL_PORT_NAME) + std::string("_val")); + + ModulePortId din_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_DATA_IN_PORT_NAME)); + BasicPort din_port = module_manager.module_port(top_module, din_port_id); + BasicPort din_value = din_port; + din_value.set_name(std::string(DECODER_DATA_IN_PORT_NAME) + std::string("_val")); + + /* Add an empty line as splitter */ + fp << std::endl; + + /* Feed the address and data input at each falling edge of programming clock + * As the enable signal is wired to the programming clock, we should synchronize + * address and data with the enable signal + */ + print_verilog_comment(fp, std::string("----- Task: assign BL and WL address, and data values at rising edge of enable signal -----")); + fp << "task " << std::string(TOP_TESTBENCH_PROG_TASK_NAME) << ";" << std::endl; + fp << generate_verilog_port(VERILOG_PORT_INPUT, bl_addr_value) << ";" << std::endl; + fp << generate_verilog_port(VERILOG_PORT_INPUT, wl_addr_value) << ";" << std::endl; + fp << generate_verilog_port(VERILOG_PORT_INPUT, din_value) << ";" << std::endl; + fp << "\tbegin" << std::endl; + fp << "\t\t@(posedge " << generate_verilog_port(VERILOG_PORT_CONKT, en_port) << ");" << std::endl; + + fp << "\t\t\t"; + fp << generate_verilog_port(VERILOG_PORT_CONKT, bl_addr_port); + fp << " = "; + fp << generate_verilog_port(VERILOG_PORT_CONKT, bl_addr_value); + fp << ";" << std::endl; + fp << std::endl; + + fp << "\t\t\t"; + fp << generate_verilog_port(VERILOG_PORT_CONKT, wl_addr_port); + fp << " = "; + fp << generate_verilog_port(VERILOG_PORT_CONKT, wl_addr_value); + fp << ";" << std::endl; + fp << std::endl; + + fp << "\t\t\t"; + fp << generate_verilog_port(VERILOG_PORT_CONKT, din_port); + fp << " = "; + fp << generate_verilog_port(VERILOG_PORT_CONKT, din_value); + fp << ";" << std::endl; + fp << std::endl; + + fp << "\tend" << std::endl; + fp << "endtask" << std::endl; + + /* Add an empty line as splitter */ + fp << std::endl; +} + + /******************************************************************** * Print tasks (processes) in Verilog format, * which is very useful in generating stimuli for each clock cycle @@ -727,9 +855,9 @@ void print_verilog_top_testbench_load_bitstream_task(std::fstream& fp, print_verilog_top_testbench_load_bitstream_task_configuration_chain(fp); break; case CONFIG_MEM_MEMORY_BANK: - /* TODO: - dump_verilog_top_testbench_stimuli_serial_version_tasks_memory_bank(cur_sram_orgz_info, fp); - */ + print_verilog_top_testbench_load_bitstream_task_memory_bank(fp, + module_manager, + top_module); break; case CONFIG_MEM_FRAME_BASED: print_verilog_top_testbench_load_bitstream_task_frame_decoder(fp, @@ -1028,6 +1156,126 @@ void print_verilog_top_testbench_configuration_chain_bitstream(std::fstream& fp, print_verilog_comment(fp, "----- End bitstream loading during configuration phase -----"); } +/******************************************************************** + * Print stimulus for a FPGA fabric with a memory bank configuration protocol + * where configuration bits are programming in serial (one by one) + * + * We will use the programming task function created before + *******************************************************************/ +static +void print_verilog_top_testbench_memory_bank_bitstream(std::fstream& fp, + const bool& fast_configuration, + const ModuleManager& module_manager, + const ModuleId& top_module, + const FabricBitstream& fabric_bitstream) { + /* Validate the file stream */ + valid_file_stream(fp); + + /* Feed addresss and data input pair one by one + * Note: the first cycle is reserved for programming reset + * We should give dummy values + */ + ModulePortId bl_addr_port_id = module_manager.find_module_port(top_module, + std::string(MEMORY_BL_PORT_NAME)); + BasicPort bl_addr_port = module_manager.module_port(top_module, bl_addr_port_id); + std::vector initial_bl_addr_values(bl_addr_port.get_width(), 0); + + ModulePortId wl_addr_port_id = module_manager.find_module_port(top_module, + std::string(MEMORY_WL_PORT_NAME)); + BasicPort wl_addr_port = module_manager.module_port(top_module, wl_addr_port_id); + std::vector initial_wl_addr_values(wl_addr_port.get_width(), 0); + + ModulePortId din_port_id = module_manager.find_module_port(top_module, + std::string(DECODER_DATA_IN_PORT_NAME)); + BasicPort din_port = module_manager.module_port(top_module, din_port_id); + std::vector initial_din_values(din_port.get_width(), 0); + + print_verilog_comment(fp, "----- Begin bitstream loading during configuration phase -----"); + fp << "initial" << std::endl; + fp << "\tbegin" << std::endl; + print_verilog_comment(fp, "----- Address port default input -----"); + fp << "\t\t"; + fp << generate_verilog_port_constant_values(bl_addr_port, initial_bl_addr_values); + fp << generate_verilog_port_constant_values(wl_addr_port, initial_wl_addr_values); + fp << ";"; + + print_verilog_comment(fp, "----- Data-input port default input -----"); + fp << "\t\t"; + fp << generate_verilog_port_constant_values(din_port, initial_din_values); + fp << ";"; + + fp << std::endl; + + /* Attention: the configuration chain protcol requires the last configuration bit is fed first + * We will visit the fabric bitstream in a reverse way + */ + for (const FabricBitId& bit_id : fabric_bitstream.bits()) { + /* When fast configuration is enabled, we skip zero data_in values */ + if ((true == fast_configuration) + && (false == fabric_bitstream.bit_din(bit_id))) { + continue; + } + + fp << "\t\t" << std::string(TOP_TESTBENCH_PROG_TASK_NAME); + fp << "(" << bl_addr_port.get_width() << "'b"; + VTR_ASSERT(bl_addr_port.get_width() == fabric_bitstream.bit_bl_address(bit_id).size()); + for (const size_t& addr_bit : fabric_bitstream.bit_bl_address(bit_id)) { + fp << addr_bit; + } + + fp << ", "; + fp << wl_addr_port.get_width() << "'b"; + VTR_ASSERT(wl_addr_port.get_width() == fabric_bitstream.bit_wl_address(bit_id).size()); + for (const size_t& addr_bit : fabric_bitstream.bit_wl_address(bit_id)) { + fp << addr_bit; + } + + fp << ", "; + fp <<"1'b"; + if (true == fabric_bitstream.bit_din(bit_id)) { + fp << "1"; + } else { + VTR_ASSERT(false == fabric_bitstream.bit_din(bit_id)); + fp << "0"; + } + fp << ");" << std::endl; + } + + /* Disable the address and din */ + fp << "\t\t" << std::string(TOP_TESTBENCH_PROG_TASK_NAME); + fp << "(" << bl_addr_port.get_width() << "'b"; + std::vector all_zero_bl_addr(bl_addr_port.get_width(), 0); + for (const size_t& addr_bit : all_zero_bl_addr) { + fp << addr_bit; + } + + fp << ", "; + fp << wl_addr_port.get_width() << "'b"; + std::vector all_zero_wl_addr(wl_addr_port.get_width(), 0); + for (const size_t& addr_bit : all_zero_wl_addr) { + fp << addr_bit; + } + + fp << ", "; + fp <<"1'b0"; + fp << ");" << std::endl; + + /* Raise the flag of configuration done when bitstream loading is complete */ + BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); + fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; + + BasicPort config_done_port(std::string(TOP_TB_CONFIG_DONE_PORT_NAME), 1); + fp << "\t\t\t"; + fp << generate_verilog_port(VERILOG_PORT_CONKT, config_done_port); + fp << " <= "; + std::vector config_done_enable_values(config_done_port.get_width(), 1); + fp << generate_verilog_constant_values(config_done_enable_values); + fp << ";" << std::endl; + + fp << "\tend" << std::endl; + print_verilog_comment(fp, "----- End bitstream loading during configuration phase -----"); +} + /******************************************************************** * Print stimulus for a FPGA fabric with a frame-based configuration protocol * where configuration bits are programming in serial (one by one) @@ -1151,7 +1399,9 @@ void print_verilog_top_testbench_bitstream(std::fstream& fp, print_verilog_top_testbench_configuration_chain_bitstream(fp, bitstream_manager, fabric_bitstream); break; case CONFIG_MEM_MEMORY_BANK: - /* TODO */ + print_verilog_top_testbench_memory_bank_bitstream(fp, fast_configuration, + module_manager, top_module, + fabric_bitstream); break; case CONFIG_MEM_FRAME_BASED: print_verilog_top_testbench_frame_decoder_bitstream(fp, fast_configuration, From a1ec6833c29b5c07bcce3522599acb3025e8dad1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 20:07:06 -0600 Subject: [PATCH 136/180] add memory bank example arch xml --- .../k4_N4_40nm_bank_openfpga.xml | 229 ++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml new file mode 100644 index 000000000..7de3ec8c4 --- /dev/null +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + + + + + 10e-12 5e-12 5e-12 + + + 10e-12 5e-12 5e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 0bee70bee6ee2997551a36f5294bd9c50e4776b5 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 20:53:19 -0600 Subject: [PATCH 137/180] finish memory bank configuration protocol support. --- openfpga/src/base/openfpga_naming.cpp | 26 +--- openfpga/src/base/openfpga_naming.h | 11 +- openfpga/src/fabric/build_decoder_modules.cpp | 6 +- openfpga/src/fabric/build_memory_modules.cpp | 6 +- .../src/fabric/build_top_module_memory.cpp | 4 +- .../fpga_bitstream/build_fabric_bitstream.cpp | 4 +- .../src/fpga_verilog/verilog_decoders.cpp | 134 +++++++++++++++++- .../fpga_verilog/verilog_top_testbench.cpp | 17 ++- openfpga/src/utils/module_manager_utils.cpp | 6 +- 9 files changed, 166 insertions(+), 48 deletions(-) diff --git a/openfpga/src/base/openfpga_naming.cpp b/openfpga/src/base/openfpga_naming.cpp index 1c792d26d..44eb2c8cd 100644 --- a/openfpga/src/base/openfpga_naming.cpp +++ b/openfpga/src/base/openfpga_naming.cpp @@ -146,23 +146,9 @@ std::string generate_mux_local_decoder_subckt_name(const size_t& addr_size, * Generate the module name of a decoder * for frame-based memories ***********************************************/ -std::string generate_frame_memory_decoder_subckt_name(const size_t& addr_size, - const size_t& data_size) { - std::string subckt_name = "frame_decoder"; - subckt_name += std::to_string(addr_size); - subckt_name += "to"; - subckt_name += std::to_string(data_size); - - return subckt_name; -} - -/************************************************ - * Generate the module name of a bit-line decoder - * for memories - ***********************************************/ -std::string generate_bl_memory_decoder_subckt_name(const size_t& addr_size, - const size_t& data_size) { - std::string subckt_name = "bl_decoder"; +std::string generate_memory_decoder_subckt_name(const size_t& addr_size, + const size_t& data_size) { + std::string subckt_name = "decoder"; subckt_name += std::to_string(addr_size); subckt_name += "to"; subckt_name += std::to_string(data_size); @@ -174,9 +160,9 @@ std::string generate_bl_memory_decoder_subckt_name(const size_t& addr_size, * Generate the module name of a word-line decoder * for memories ***********************************************/ -std::string generate_wl_memory_decoder_subckt_name(const size_t& addr_size, - const size_t& data_size) { - std::string subckt_name = "wl_decoder"; +std::string generate_memory_decoder_with_data_in_subckt_name(const size_t& addr_size, + const size_t& data_size) { + std::string subckt_name = "decoder_with_data_in_"; subckt_name += std::to_string(addr_size); subckt_name += "to"; subckt_name += std::to_string(data_size); diff --git a/openfpga/src/base/openfpga_naming.h b/openfpga/src/base/openfpga_naming.h index 534bf2a78..3634be27a 100644 --- a/openfpga/src/base/openfpga_naming.h +++ b/openfpga/src/base/openfpga_naming.h @@ -50,14 +50,11 @@ std::string generate_mux_branch_subckt_name(const CircuitLibrary& circuit_lib, std::string generate_mux_local_decoder_subckt_name(const size_t& addr_size, const size_t& data_size); -std::string generate_frame_memory_decoder_subckt_name(const size_t& addr_size, - const size_t& data_size); +std::string generate_memory_decoder_subckt_name(const size_t& addr_size, + const size_t& data_size); -std::string generate_bl_memory_decoder_subckt_name(const size_t& addr_size, - const size_t& data_size); - -std::string generate_wl_memory_decoder_subckt_name(const size_t& addr_size, - const size_t& data_size); +std::string generate_memory_decoder_with_data_in_subckt_name(const size_t& addr_size, + const size_t& data_size); std::string generate_segment_wire_subckt_name(const std::string& wire_model_name, const size_t& segment_id); diff --git a/openfpga/src/fabric/build_decoder_modules.cpp b/openfpga/src/fabric/build_decoder_modules.cpp index fb8a29e5c..eecb31344 100644 --- a/openfpga/src/fabric/build_decoder_modules.cpp +++ b/openfpga/src/fabric/build_decoder_modules.cpp @@ -45,7 +45,7 @@ ModuleId build_frame_memory_decoder_module(ModuleManager& module_manager, size_t data_size = decoder_lib.data_size(decoder); /* Create a name for the local encoder */ - std::string module_name = generate_frame_memory_decoder_subckt_name(addr_size, data_size); + std::string module_name = generate_memory_decoder_subckt_name(addr_size, data_size); /* Create a Verilog Module based on the circuit model, and add to module manager */ ModuleId module_id = module_manager.add_module(module_name); @@ -100,7 +100,7 @@ ModuleId build_bl_memory_decoder_module(ModuleManager& module_manager, size_t data_size = decoder_lib.data_size(decoder); /* Create a name for the local encoder */ - std::string module_name = generate_bl_memory_decoder_subckt_name(addr_size, data_size); + std::string module_name = generate_memory_decoder_with_data_in_subckt_name(addr_size, data_size); /* Create a Verilog Module based on the circuit model, and add to module manager */ ModuleId module_id = module_manager.add_module(module_name); @@ -158,7 +158,7 @@ ModuleId build_wl_memory_decoder_module(ModuleManager& module_manager, size_t data_size = decoder_lib.data_size(decoder); /* Create a name for the local encoder */ - std::string module_name = generate_wl_memory_decoder_subckt_name(addr_size, data_size); + std::string module_name = generate_memory_decoder_subckt_name(addr_size, data_size); /* Create a Verilog Module based on the circuit model, and add to module manager */ ModuleId module_id = module_manager.add_module(module_name); diff --git a/openfpga/src/fabric/build_memory_modules.cpp b/openfpga/src/fabric/build_memory_modules.cpp index 72d1315ad..e3c8a0c03 100644 --- a/openfpga/src/fabric/build_memory_modules.cpp +++ b/openfpga/src/fabric/build_memory_modules.cpp @@ -554,14 +554,14 @@ void build_frame_memory_module(ModuleManager& module_manager, * If we find one, we use the module. * Otherwise, we create one and add it to the decoder library */ - DecoderId decoder_id = frame_decoder_lib.find_decoder(addr_size, data_size, true, true, use_data_inv); + DecoderId decoder_id = frame_decoder_lib.find_decoder(addr_size, data_size, true, false, use_data_inv); if (DecoderId::INVALID() == decoder_id) { - decoder_id = frame_decoder_lib.add_decoder(addr_size, data_size, true, true, use_data_inv); + decoder_id = frame_decoder_lib.add_decoder(addr_size, data_size, true, false, use_data_inv); } VTR_ASSERT(DecoderId::INVALID() != decoder_id); /* Create a module if not existed yet */ - std::string decoder_module_name = generate_frame_memory_decoder_subckt_name(addr_size, data_size); + std::string decoder_module_name = generate_memory_decoder_subckt_name(addr_size, data_size); ModuleId decoder_module = module_manager.find_module(decoder_module_name); if (ModuleId::INVALID() == decoder_module) { decoder_module = build_frame_memory_decoder_module(module_manager, diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index 278a33f2d..0de55ca4e 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -545,7 +545,7 @@ void add_top_module_nets_cmos_memory_bank_config_bus(ModuleManager& module_manag VTR_ASSERT(DecoderId::INVALID() != bl_decoder_id); /* Create a module if not existed yet */ - std::string bl_decoder_module_name = generate_bl_memory_decoder_subckt_name(bl_addr_size, num_bls); + std::string bl_decoder_module_name = generate_memory_decoder_with_data_in_subckt_name(bl_addr_size, num_bls); ModuleId bl_decoder_module = module_manager.find_module(bl_decoder_module_name); if (ModuleId::INVALID() == bl_decoder_module) { /* BL decoder has the same ports as the frame-based decoders @@ -572,7 +572,7 @@ void add_top_module_nets_cmos_memory_bank_config_bus(ModuleManager& module_manag VTR_ASSERT(DecoderId::INVALID() != wl_decoder_id); /* Create a module if not existed yet */ - std::string wl_decoder_module_name = generate_bl_memory_decoder_subckt_name(wl_addr_size, num_wls); + std::string wl_decoder_module_name = generate_memory_decoder_subckt_name(wl_addr_size, num_wls); ModuleId wl_decoder_module = module_manager.find_module(wl_decoder_module_name); if (ModuleId::INVALID() == wl_decoder_module) { /* BL decoder has the same ports as the frame-based decoders diff --git a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp index 1be2025b3..a9c5b6ec7 100644 --- a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp @@ -374,12 +374,12 @@ void build_module_fabric_dependent_bitstream(const ConfigProtocol& config_protoc case CONFIG_MEM_MEMORY_BANK: { size_t cur_mem_index = 0; /* Find BL address port size */ - ModulePortId bl_addr_port = module_manager.find_module_port(top_module, std::string(MEMORY_BL_PORT_NAME)); + ModulePortId bl_addr_port = module_manager.find_module_port(top_module, std::string(DECODER_BL_ADDRESS_PORT_NAME)); BasicPort bl_addr_port_info = module_manager.module_port(top_module, bl_addr_port); size_t num_bls = find_memory_decoder_data_size(bl_addr_port_info.get_width()); /* Find WL address port size */ - ModulePortId wl_addr_port = module_manager.find_module_port(top_module, std::string(MEMORY_WL_PORT_NAME)); + ModulePortId wl_addr_port = module_manager.find_module_port(top_module, std::string(DECODER_WL_ADDRESS_PORT_NAME)); BasicPort wl_addr_port_info = module_manager.module_port(top_module, wl_addr_port); size_t num_wls = find_memory_decoder_data_size(wl_addr_port_info.get_width()); diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 64568515c..6e6025ea6 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -262,7 +262,7 @@ void print_verilog_arch_decoder_module(std::fstream& fp, VTR_ASSERT(true == valid_file_stream(fp)); /* Create a name for the decoder */ - std::string module_name = generate_frame_memory_decoder_subckt_name(addr_size, data_size); + std::string module_name = generate_memory_decoder_subckt_name(addr_size, data_size); /* Create a Verilog Module based on the circuit model, and add to module manager */ ModuleId module_id = module_manager.find_module(module_name); @@ -377,6 +377,132 @@ void print_verilog_arch_decoder_module(std::fstream& fp, print_verilog_module_end(fp, module_name); } +/*************************************************************************************** + * Create a Verilog module for a decoder with data_in used as a configuration protocol + * in FPGA architecture + * + * Address + * | | ... | + * v v v + * +-----------+ + * Enable->/ \<-data_in + * / Decoder \ + * +-----------------+ + * | | | ... | | | + * v v v v v v + * Data output + * + * The outputs are assumes to be one-hot codes (at most only one '1' exist) + * Only the data output at the address bit will show data_in + * + * The decoder has an enable signal which is active at logic '1'. + * When activated, the decoder will output decoding results to the data output port + * Otherwise, the data output port will be always all-zero + ***************************************************************************************/ +static +void print_verilog_arch_decoder_with_data_in_module(std::fstream& fp, + const ModuleManager& module_manager, + const DecoderLibrary& decoder_lib, + const DecoderId& decoder) { + /* Get the number of inputs */ + size_t addr_size = decoder_lib.addr_size(decoder); + size_t data_size = decoder_lib.data_size(decoder); + VTR_ASSERT(true == decoder_lib.use_data_in(decoder)); + + /* Validate the FILE handler */ + VTR_ASSERT(true == valid_file_stream(fp)); + + /* Create a name for the decoder */ + std::string module_name = generate_memory_decoder_with_data_in_subckt_name(addr_size, data_size); + + /* Create a Verilog Module based on the circuit model, and add to module manager */ + ModuleId module_id = module_manager.find_module(module_name); + VTR_ASSERT(true == module_manager.valid_module_id(module_id)); + /* Find module ports */ + /* Enable port */ + ModulePortId enable_port_id = module_manager.find_module_port(module_id, std::string(DECODER_ENABLE_PORT_NAME)); + BasicPort enable_port = module_manager.module_port(module_id, enable_port_id); + /* Address port */ + ModulePortId addr_port_id = module_manager.find_module_port(module_id, std::string(DECODER_ADDRESS_PORT_NAME)); + BasicPort addr_port = module_manager.module_port(module_id, addr_port_id); + /* Find data-in port*/ + ModulePortId din_port_id = module_manager.find_module_port(module_id, std::string(DECODER_DATA_IN_PORT_NAME)); + BasicPort din_port = module_manager.module_port(module_id, din_port_id); + /* Find each output port */ + ModulePortId data_port_id = module_manager.find_module_port(module_id, std::string(DECODER_DATA_OUT_PORT_NAME)); + BasicPort data_port = module_manager.module_port(module_id, data_port_id); + /* Data port is registered. It should be outputted as + * output reg [lsb:msb] data + */ + BasicPort data_inv_port(std::string(DECODER_DATA_OUT_INV_PORT_NAME), data_size); + if (true == decoder_lib.use_data_inv_port(decoder)) { + ModulePortId data_inv_port_id = module_manager.find_module_port(module_id, std::string(DECODER_DATA_OUT_INV_PORT_NAME)); + data_inv_port = module_manager.module_port(module_id, data_inv_port_id); + } + + /* dump module definition + ports */ + print_verilog_module_declaration(fp, module_manager, module_id); + /* Finish dumping ports */ + + print_verilog_comment(fp, std::string("----- BEGIN Verilog codes for Decoder convert " + std::to_string(addr_size) + "-bit addr to " + std::to_string(data_size) + "-bit data -----")); + + /* Print the truth table of this decoder */ + /* Internal logics */ + /* Early exit: Corner case for data size = 1 the logic is very simple: + * data = addr; + * data_inv = ~data_inv + */ + if (1 == data_size) { + fp << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port); + fp << " or " << generate_verilog_port(VERILOG_PORT_CONKT, enable_port); + fp << ") begin" << std::endl; + fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << " == 1'b1) begin" << std::endl; + fp << "\t\t" << generate_verilog_port(VERILOG_PORT_CONKT, din_port) << ";" << std::endl; + fp << "\t" << "end else begin" << std::endl; + fp << "\t\t" << generate_verilog_port_constant_values(data_port, std::vector(1, 0)) << ";" << std::endl; + fp << "\t" << "end" << std::endl; + fp << "end" << std::endl; + + /* Depend on if the inverted data output port is needed or not */ + if (true == decoder_lib.use_data_inv_port(decoder)) { + print_verilog_wire_connection(fp, data_inv_port, addr_port, true); + } + + print_verilog_comment(fp, std::string("----- END Verilog codes for Decoder convert " + std::to_string(addr_size) + "-bit addr to " + std::to_string(data_size) + "-bit data -----")); + + /* Put an end to the Verilog module */ + print_verilog_module_end(fp, module_name); + return; + } + + /* Only the selected data output bit will be set to the value of data_in, + * other data output bits will be '0' + */ + fp << "always@(" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port); + fp << ", " << generate_verilog_port(VERILOG_PORT_CONKT, enable_port); + fp << ", " << generate_verilog_port(VERILOG_PORT_CONKT, din_port); + fp << ") begin" << std::endl; + + fp << "\t" << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)) << ";" << std::endl; + + fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << " == 1'b1) begin" << std::endl; + fp << "\t\t" << data_port.get_name().c_str() << "[" << addr_port.get_name().c_str() << "]"; + fp << " = " << generate_verilog_port(VERILOG_PORT_CONKT, din_port) << ";" << std::endl; + + fp << "\t" << "end" << std::endl; + + fp << "end" << std::endl; + + if (true == decoder_lib.use_data_inv_port(decoder)) { + print_verilog_wire_connection(fp, data_inv_port, data_port, true); + } + + print_verilog_comment(fp, std::string("----- END Verilog codes for Decoder convert " + std::to_string(addr_size) + "-bit addr to " + std::to_string(data_size) + "-bit data -----")); + + /* Put an end to the Verilog module */ + print_verilog_module_end(fp, module_name); +} + /*************************************************************************************** * This function will generate all the unique Verilog modules of decoders for * configuration protocols in a FPGA fabric @@ -407,7 +533,11 @@ void print_verilog_submodule_arch_decoders(const ModuleManager& module_manager, /* Generate Verilog modules for the found unique local encoders */ for (const auto& decoder : decoder_lib.decoders()) { - print_verilog_arch_decoder_module(fp, module_manager, decoder_lib, decoder); + if (true == decoder_lib.use_data_in(decoder)) { + print_verilog_arch_decoder_with_data_in_module(fp, module_manager, decoder_lib, decoder); + } else { + print_verilog_arch_decoder_module(fp, module_manager, decoder_lib, decoder); + } } /* Close the file stream */ diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index e741e16ee..670074d74 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -116,7 +116,7 @@ void print_verilog_top_testbench_memory_bank_port(std::fstream& fp, /* Print the address port for the Bit-Line decoder here */ print_verilog_comment(fp, std::string("---- Address port for Bit-Line decoder -----")); ModulePortId bl_addr_port_id = module_manager.find_module_port(top_module, - std::string(MEMORY_BL_PORT_NAME)); + std::string(DECODER_BL_ADDRESS_PORT_NAME)); BasicPort bl_addr_port = module_manager.module_port(top_module, bl_addr_port_id); fp << generate_verilog_port(VERILOG_PORT_REG, bl_addr_port) << ";" << std::endl; @@ -124,7 +124,7 @@ void print_verilog_top_testbench_memory_bank_port(std::fstream& fp, /* Print the address port for the Word-Line decoder here */ print_verilog_comment(fp, std::string("---- Address port for Word-Line decoder -----")); ModulePortId wl_addr_port_id = module_manager.find_module_port(top_module, - std::string(MEMORY_WL_PORT_NAME)); + std::string(DECODER_WL_ADDRESS_PORT_NAME)); BasicPort wl_addr_port = module_manager.module_port(top_module, wl_addr_port_id); fp << generate_verilog_port(VERILOG_PORT_REG, wl_addr_port) << ";" << std::endl; @@ -711,13 +711,13 @@ void print_verilog_top_testbench_load_bitstream_task_memory_bank(std::fstream& f BasicPort en_port = module_manager.module_port(top_module, en_port_id); ModulePortId bl_addr_port_id = module_manager.find_module_port(top_module, - std::string(MEMORY_BL_PORT_NAME)); + std::string(DECODER_BL_ADDRESS_PORT_NAME)); BasicPort bl_addr_port = module_manager.module_port(top_module, bl_addr_port_id); BasicPort bl_addr_value = bl_addr_port; bl_addr_value.set_name(std::string(MEMORY_BL_PORT_NAME) + std::string("_val")); ModulePortId wl_addr_port_id = module_manager.find_module_port(top_module, - std::string(MEMORY_WL_PORT_NAME)); + std::string(DECODER_WL_ADDRESS_PORT_NAME)); BasicPort wl_addr_port = module_manager.module_port(top_module, wl_addr_port_id); BasicPort wl_addr_value = wl_addr_port; wl_addr_value.set_name(std::string(MEMORY_WL_PORT_NAME) + std::string("_val")); @@ -1176,12 +1176,12 @@ void print_verilog_top_testbench_memory_bank_bitstream(std::fstream& fp, * We should give dummy values */ ModulePortId bl_addr_port_id = module_manager.find_module_port(top_module, - std::string(MEMORY_BL_PORT_NAME)); + std::string(DECODER_BL_ADDRESS_PORT_NAME)); BasicPort bl_addr_port = module_manager.module_port(top_module, bl_addr_port_id); std::vector initial_bl_addr_values(bl_addr_port.get_width(), 0); ModulePortId wl_addr_port_id = module_manager.find_module_port(top_module, - std::string(MEMORY_WL_PORT_NAME)); + std::string(DECODER_WL_ADDRESS_PORT_NAME)); BasicPort wl_addr_port = module_manager.module_port(top_module, wl_addr_port_id); std::vector initial_wl_addr_values(wl_addr_port.get_width(), 0); @@ -1196,8 +1196,12 @@ void print_verilog_top_testbench_memory_bank_bitstream(std::fstream& fp, print_verilog_comment(fp, "----- Address port default input -----"); fp << "\t\t"; fp << generate_verilog_port_constant_values(bl_addr_port, initial_bl_addr_values); + fp << ";"; + fp << std::endl; + fp << generate_verilog_port_constant_values(wl_addr_port, initial_wl_addr_values); fp << ";"; + fp << std::endl; print_verilog_comment(fp, "----- Data-input port default input -----"); fp << "\t\t"; @@ -1312,6 +1316,7 @@ void print_verilog_top_testbench_frame_decoder_bitstream(std::fstream& fp, fp << "\t\t"; fp << generate_verilog_port_constant_values(addr_port, initial_addr_values); fp << ";"; + fp << std::endl; print_verilog_comment(fp, "----- Data-input port default input -----"); fp << "\t\t"; diff --git a/openfpga/src/utils/module_manager_utils.cpp b/openfpga/src/utils/module_manager_utils.cpp index ec871368a..0fe16987c 100644 --- a/openfpga/src/utils/module_manager_utils.cpp +++ b/openfpga/src/utils/module_manager_utils.cpp @@ -960,14 +960,14 @@ void add_module_nets_cmos_memory_frame_decoder_config_bus(ModuleManager& module_ /* Search the decoder library and try to find one * If not found, create a new module and add it to the module manager */ - DecoderId decoder_id = decoder_lib.find_decoder(addr_size, data_size, true, true, false); + DecoderId decoder_id = decoder_lib.find_decoder(addr_size, data_size, true, false, false); if (DecoderId::INVALID() == decoder_id) { - decoder_id = decoder_lib.add_decoder(addr_size, data_size, true, true, false); + decoder_id = decoder_lib.add_decoder(addr_size, data_size, true, false, false); } VTR_ASSERT(DecoderId::INVALID() != decoder_id); /* Create a module if not existed yet */ - std::string decoder_module_name = generate_frame_memory_decoder_subckt_name(addr_size, data_size); + std::string decoder_module_name = generate_memory_decoder_subckt_name(addr_size, data_size); ModuleId decoder_module = module_manager.find_module(decoder_module_name); if (ModuleId::INVALID() == decoder_module) { decoder_module = build_frame_memory_decoder_module(module_manager, From 73d4c835b739548d9aca2a18421c3b224e1143f9 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 20:54:05 -0600 Subject: [PATCH 138/180] add regression test case for memory bank --- .../memory_bank/config/task.conf | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 openfpga_flow/tasks/openfpga_shell/full_testbench/memory_bank/config/task.conf diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/memory_bank/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/memory_bank/config/task.conf new file mode 100644 index 000000000..b000c0ba6 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/memory_bank/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +#vpr_fpga_verilog_formal_verification_top_netlist= From 288294c23aed63f3b8170716e77ce3f84b3640cd Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 20:56:54 -0600 Subject: [PATCH 139/180] add fast configuration test case for memory bank configuration protocol --- ...ast_configuration_example_script.openfpga} | 0 .../fast_configuration_frame/config/task.conf | 2 +- .../fast_memory_bank/config/task.conf | 34 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) rename openfpga_flow/OpenFPGAShellScripts/{configuration_frame_example_script.openfpga => fast_configuration_example_script.openfpga} (100%) create mode 100644 openfpga_flow/tasks/openfpga_shell/full_testbench/fast_memory_bank/config/task.conf diff --git a/openfpga_flow/OpenFPGAShellScripts/configuration_frame_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga similarity index 100% rename from openfpga_flow/OpenFPGAShellScripts/configuration_frame_example_script.openfpga rename to openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf index 7a448e3e8..55c98dda1 100644 --- a/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf @@ -8,7 +8,7 @@ [GENERAL] run_engine=openfpga_shell -openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/configuration_frame_example_script.openfpga +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml power_analysis = true spice_output=false diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_memory_bank/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_memory_bank/config/task.conf new file mode 100644 index 000000000..61b3d8b72 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_memory_bank/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +#vpr_fpga_verilog_formal_verification_top_netlist= From 03e56f5ca6769f069c6cd670695e729f6a8a51e1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 20:58:02 -0600 Subject: [PATCH 140/180] deploy memory bank regression tests to CI --- .travis/script.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis/script.sh b/.travis/script.sh index 846ec847f..11056cbed 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -57,6 +57,11 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/con python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fast_configuration_frame --debug --show_thread_logs python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/configuration_frame --debug --show_thread_logs +echo -e "Testing memory bank configuration protocol of a K4N4 FPGA"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/memory_bank --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fast_memory_bank --debug --show_thread_logs + + echo -e "Testing standalone (flatten memory) configuration protocol of a K4N4 FPGA"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/flatten_memory --debug --show_thread_logs python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/flatten_memory --debug --show_thread_logs From 3f9afea3e88fa8e96a3c78da3151ab7b9fc01f70 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 20:59:14 -0600 Subject: [PATCH 141/180] add preconfig testbench test case for memory bank configuration protocol --- .../memory_bank/config/task.conf | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 openfpga_flow/tasks/openfpga_shell/preconfig_testbench/memory_bank/config/task.conf diff --git a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/memory_bank/config/task.conf b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/memory_bank/config/task.conf new file mode 100644 index 000000000..75579406c --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/memory_bank/config/task.conf @@ -0,0 +1,34 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +vpr_fpga_verilog_formal_verification_top_netlist= From e46651e0c10f55d62ab5904b35fa494db9447a4d Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 20:59:40 -0600 Subject: [PATCH 142/180] deploy preconfig regression test for memory bank to CI --- .travis/script.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis/script.sh b/.travis/script.sh index 11056cbed..907e1a3cf 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -60,6 +60,7 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbenc echo -e "Testing memory bank configuration protocol of a K4N4 FPGA"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/memory_bank --debug --show_thread_logs python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fast_memory_bank --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/memory_bank --debug --show_thread_logs echo -e "Testing standalone (flatten memory) configuration protocol of a K4N4 FPGA"; From b9dd47d465fe7fdd5ab54c9f3f71b00083ffc344 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 21:01:38 -0600 Subject: [PATCH 143/180] update documentation about memory bank configuration protocol --- docs/source/manual/arch_lang/config_protocol.rst | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/source/manual/arch_lang/config_protocol.rst b/docs/source/manual/arch_lang/config_protocol.rst index 2fcdae535..48fd66ac3 100644 --- a/docs/source/manual/arch_lang/config_protocol.rst +++ b/docs/source/manual/arch_lang/config_protocol.rst @@ -100,6 +100,8 @@ When the decoder of sub block, e.g., the LUT, is enabled, each memory cells can - a Bit-Line input to load the data - a Word-Line input to enable data write +.. warning:: Please do NOT add inverted Bit-Line and Word-Line inputs. It is not supported yet! + Memory bank Example ~~~~~~~~~~~~~~~~~~~ The following XML code describes a memory-bank circuitry to configure the core logic of FPGA, as illustrated in :numref:`fig_sram`. @@ -119,7 +121,13 @@ It will use the circuit model defined in :numref:`fig_sram_blwl`. Example of a memory organization using memory decoders -.. warning:: THIS IS STILL UNDER CONSTRUCTION +.. note:: Memory-bank decoders does require a memory cell to have + + - two outputs (one regular and another inverted) + - a Bit-Line input to load the data + - a Word-Line input to enable data write + +.. warning:: Please do NOT add inverted Bit-Line and Word-Line inputs. It is not supported yet! Standalone SRAM Example ~~~~~~~~~~~~~~~~~~~~~~~ @@ -147,5 +155,7 @@ The following XML code shows an example where we use the circuit model defined i - a Bit-Line input to load the data - a Word-Line input to enable data write +.. warning:: Please do NOT add inverted Bit-Line and Word-Line inputs. It is not supported yet! + .. warning:: This is a vanilla configuration method, which allow users to build their own configuration protocol on top of it. From dda6fe19ae975680f8e24bee814ef127ecfecb30 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 22:28:12 -0600 Subject: [PATCH 144/180] show iverilog version in CI --- .travis/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/install.sh b/.travis/install.sh index 27d1cad5b..f8860b711 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -32,7 +32,7 @@ set -e # export PATH=${DEPS_DIR}/iverilog-10_3/bin:${PATH} # echo ${PATH} #fi -#iverilog -V +iverilog -V #cd - From b191732d32ce52cdd2e8e7c852bad68d96ba6dd1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 22:29:40 -0600 Subject: [PATCH 145/180] show vvp version in CI --- .travis/install.sh | 1 + .travis/script.sh | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index f8860b711..46d535342 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -33,6 +33,7 @@ set -e # echo ${PATH} #fi iverilog -V +vvp -V #cd - diff --git a/.travis/script.sh b/.travis/script.sh index 907e1a3cf..c16c2eeac 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -58,8 +58,8 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fas python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/configuration_frame --debug --show_thread_logs echo -e "Testing memory bank configuration protocol of a K4N4 FPGA"; -python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/memory_bank --debug --show_thread_logs -python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fast_memory_bank --debug --show_thread_logs +#python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/memory_bank --debug --show_thread_logs +#python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fast_memory_bank --debug --show_thread_logs python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/memory_bank --debug --show_thread_logs From c85ccceac77cc761078d4e8c082a6a6e49d42a05 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sat, 30 May 2020 23:41:33 -0600 Subject: [PATCH 146/180] try bug fixing in memory bank configuration protocol --- .../src/fpga_verilog/verilog_decoders.cpp | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 6e6025ea6..0ae2c70b3 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -483,16 +483,38 @@ void print_verilog_arch_decoder_with_data_in_module(std::fstream& fp, fp << ", " << generate_verilog_port(VERILOG_PORT_CONKT, din_port); fp << ") begin" << std::endl; - fp << "\t" << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)) << ";" << std::endl; - fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << " == 1'b1) begin" << std::endl; - fp << "\t\t" << data_port.get_name().c_str() << "[" << addr_port.get_name().c_str() << "]"; - fp << " = " << generate_verilog_port(VERILOG_PORT_CONKT, din_port) << ";" << std::endl; + fp << "\t\t" << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)); + fp << ";" << std::endl; + fp << "\t\t" << "case (" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ")" << std::endl; + /* Create a string for addr and data */ + for (size_t i = 0; i < data_size; ++i) { + BasicPort cur_data_port(data_port.get_name(), i, i); + fp << "\t\t\t" << generate_verilog_constant_values(itobin_vec(i, addr_size)); + fp << " : "; + fp << generate_verilog_port(VERILOG_PORT_CONKT, cur_data_port); + fp << " = "; + fp << generate_verilog_port(VERILOG_PORT_CONKT, din_port); + fp << ";" << std::endl; + } + /* Different from MUX decoder, we assign default values which is all zero */ + fp << "\t\t\t" << "default"; + fp << " : "; + fp << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)); + fp << ";" << std::endl; + fp << "\t\t" << "endcase" << std::endl; fp << "\t" << "end" << std::endl; + /* If enable is not active, we should give all zero */ + fp << "\t" << "else begin" << std::endl; + fp << "\t\t" << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)); + fp << ";" << std::endl; + fp << "\t" << "end" << std::endl; + fp << "end" << std::endl; + if (true == decoder_lib.use_data_inv_port(decoder)) { print_verilog_wire_connection(fp, data_inv_port, data_port, true); } From 5368485bd6e17cd2f961fa1088db8473819a4f8b Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 31 May 2020 12:44:38 -0600 Subject: [PATCH 147/180] keep bug fixing for memory bank configuration protocol. Reduce number of BL/WLs at the top-level --- openfpga/src/fabric/build_top_module.cpp | 3 +- .../src/fabric/build_top_module_memory.cpp | 25 ++++++++---- openfpga/src/fabric/build_top_module_memory.h | 3 +- .../fpga_bitstream/build_fabric_bitstream.cpp | 39 +++++++++++++++---- .../fpga_verilog/verilog_top_testbench.cpp | 19 --------- openfpga/src/utils/decoder_library_utils.cpp | 11 ++++-- openfpga/src/utils/decoder_library_utils.h | 2 +- 7 files changed, 61 insertions(+), 41 deletions(-) diff --git a/openfpga/src/fabric/build_top_module.cpp b/openfpga/src/fabric/build_top_module.cpp index 7b05a5676..762ba66f0 100644 --- a/openfpga/src/fabric/build_top_module.cpp +++ b/openfpga/src/fabric/build_top_module.cpp @@ -395,7 +395,8 @@ void build_top_module(ModuleManager& module_manager, if (0 < module_manager.configurable_children(top_module).size()) { add_top_module_nets_memory_config_bus(module_manager, decoder_lib, top_module, - sram_orgz_type, circuit_lib.design_tech_type(sram_model)); + sram_orgz_type, circuit_lib.design_tech_type(sram_model), + module_num_config_bits); } } diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index 0de55ca4e..568646d57 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -510,7 +510,8 @@ void add_top_module_sram_ports(ModuleManager& module_manager, static void add_top_module_nets_cmos_memory_bank_config_bus(ModuleManager& module_manager, DecoderLibrary& decoder_lib, - const ModuleId& top_module) { + const ModuleId& top_module, + const size_t& num_config_bits) { /* Find Enable port from the top-level module */ ModulePortId en_port = module_manager.find_module_port(top_module, std::string(DECODER_ENABLE_PORT_NAME)); BasicPort en_port_info = module_manager.module_port(top_module, en_port); @@ -529,8 +530,8 @@ void add_top_module_nets_cmos_memory_bank_config_bus(ModuleManager& module_manag /* Find the number of BLs and WLs required to access each memory bit */ size_t bl_addr_size = bl_addr_port_info.get_width(); size_t wl_addr_size = wl_addr_port_info.get_width(); - size_t num_bls = find_memory_decoder_data_size(bl_addr_size); - size_t num_wls = find_memory_decoder_data_size(wl_addr_size); + size_t num_bls = find_memory_decoder_data_size(num_config_bits); + size_t num_wls = find_memory_decoder_data_size(num_config_bits); /* Add the BL decoder module * Search the decoder library @@ -704,6 +705,12 @@ void add_top_module_nets_cmos_memory_bank_config_bus(ModuleManager& module_manag cur_wl_index++; } } + + /* Add the BL and WL decoders to the end of configurable children list + * Note: this MUST be done after adding all the module nets to other regular configurable children + */ + module_manager.add_configurable_child(top_module, bl_decoder_module, 0); + module_manager.add_configurable_child(top_module, wl_decoder_module, 0); } /********************************************************************* @@ -754,7 +761,8 @@ static void add_top_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, DecoderLibrary& decoder_lib, const ModuleId& parent_module, - const e_config_protocol_type& sram_orgz_type) { + const e_config_protocol_type& sram_orgz_type, + const size_t& num_config_bits) { switch (sram_orgz_type) { case CONFIG_MEM_STANDALONE: add_module_nets_cmos_flatten_memory_config_bus(module_manager, parent_module, @@ -767,8 +775,7 @@ void add_top_module_nets_cmos_memory_config_bus(ModuleManager& module_manager, break; } case CONFIG_MEM_MEMORY_BANK: - /* TODO */ - add_top_module_nets_cmos_memory_bank_config_bus(module_manager, decoder_lib, parent_module); + add_top_module_nets_cmos_memory_bank_config_bus(module_manager, decoder_lib, parent_module, num_config_bits); break; case CONFIG_MEM_FRAME_BASED: add_module_nets_cmos_memory_frame_config_bus(module_manager, decoder_lib, parent_module); @@ -816,12 +823,14 @@ void add_top_module_nets_memory_config_bus(ModuleManager& module_manager, DecoderLibrary& decoder_lib, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type, - const e_circuit_model_design_tech& mem_tech) { + const e_circuit_model_design_tech& mem_tech, + const size_t& num_config_bits) { switch (mem_tech) { case CIRCUIT_MODEL_DESIGN_CMOS: add_top_module_nets_cmos_memory_config_bus(module_manager, decoder_lib, parent_module, - sram_orgz_type); + sram_orgz_type, + num_config_bits); break; case CIRCUIT_MODEL_DESIGN_RRAM: /* TODO: */ diff --git a/openfpga/src/fabric/build_top_module_memory.h b/openfpga/src/fabric/build_top_module_memory.h index a912845b2..b67389790 100644 --- a/openfpga/src/fabric/build_top_module_memory.h +++ b/openfpga/src/fabric/build_top_module_memory.h @@ -45,7 +45,8 @@ void add_top_module_nets_memory_config_bus(ModuleManager& module_manager, DecoderLibrary& decoder_lib, const ModuleId& parent_module, const e_config_protocol_type& sram_orgz_type, - const e_circuit_model_design_tech& mem_tech); + const e_circuit_model_design_tech& mem_tech, + const size_t& num_config_bits); } /* end namespace openfpga */ diff --git a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp index a9c5b6ec7..a69594f48 100644 --- a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp @@ -93,6 +93,7 @@ static void rec_build_module_fabric_dependent_memory_bank_bitstream(const BitstreamManager& bitstream_manager, const ConfigBlockId& parent_block, const ModuleManager& module_manager, + const ModuleId& top_module, const ModuleId& parent_module, const size_t& bl_addr_size, const size_t& wl_addr_size, @@ -105,8 +106,17 @@ void rec_build_module_fabric_dependent_memory_bank_bitstream(const BitstreamMana * we dive to the next level first! */ if (0 < bitstream_manager.block_children(parent_block).size()) { - for (size_t child_id = 0; child_id < module_manager.configurable_children(parent_module).size(); ++child_id) { - ModuleId child_module = module_manager.configurable_children(parent_module)[child_id]; + /* For top module, we will skip the two decoders at the end of the configurable children list */ + std::vector configurable_children = module_manager.configurable_children(parent_module); + + size_t num_configurable_children = configurable_children.size(); + if (parent_module == top_module) { + VTR_ASSERT(2 <= configurable_children.size()); + num_configurable_children -= 2; + } + + for (size_t child_id = 0; child_id < num_configurable_children; ++child_id) { + ModuleId child_module = configurable_children[child_id]; size_t child_instance = module_manager.configurable_child_instances(parent_module)[child_id]; /* Get the instance name and ensure it is not empty */ std::string instance_name = module_manager.instance_name(parent_module, child_module, child_instance); @@ -114,12 +124,12 @@ void rec_build_module_fabric_dependent_memory_bank_bitstream(const BitstreamMana /* Find the child block that matches the instance name! */ ConfigBlockId child_block = bitstream_manager.find_child_block(parent_block, instance_name); /* We must have one valid block id! */ - if (true != bitstream_manager.valid_block_id(child_block)) + if (true != bitstream_manager.valid_block_id(child_block)) VTR_ASSERT(true == bitstream_manager.valid_block_id(child_block)); /* Go recursively */ rec_build_module_fabric_dependent_memory_bank_bitstream(bitstream_manager, child_block, - module_manager, child_module, + module_manager, top_module, child_module, bl_addr_size, wl_addr_size, num_bls, num_wls, cur_mem_index, @@ -376,18 +386,31 @@ void build_module_fabric_dependent_bitstream(const ConfigProtocol& config_protoc /* Find BL address port size */ ModulePortId bl_addr_port = module_manager.find_module_port(top_module, std::string(DECODER_BL_ADDRESS_PORT_NAME)); BasicPort bl_addr_port_info = module_manager.module_port(top_module, bl_addr_port); - size_t num_bls = find_memory_decoder_data_size(bl_addr_port_info.get_width()); /* Find WL address port size */ ModulePortId wl_addr_port = module_manager.find_module_port(top_module, std::string(DECODER_WL_ADDRESS_PORT_NAME)); BasicPort wl_addr_port_info = module_manager.module_port(top_module, wl_addr_port); - size_t num_wls = find_memory_decoder_data_size(wl_addr_port_info.get_width()); + + /* Find BL and WL decoders which are the last two configurable children*/ + std::vector configurable_children = module_manager.configurable_children(top_module); + VTR_ASSERT(2 <= configurable_children.size()); + ModuleId bl_decoder_module = configurable_children[configurable_children.size() - 2]; + VTR_ASSERT(0 == module_manager.configurable_child_instances(top_module)[configurable_children.size() - 2]); + ModuleId wl_decoder_module = configurable_children[configurable_children.size() - 1]; + VTR_ASSERT(0 == module_manager.configurable_child_instances(top_module)[configurable_children.size() - 1]); + + ModulePortId bl_port = module_manager.find_module_port(bl_decoder_module, std::string(DECODER_DATA_OUT_PORT_NAME)); + BasicPort bl_port_info = module_manager.module_port(bl_decoder_module, bl_port); + + ModulePortId wl_port = module_manager.find_module_port(wl_decoder_module, std::string(DECODER_DATA_OUT_PORT_NAME)); + BasicPort wl_port_info = module_manager.module_port(wl_decoder_module, wl_port); rec_build_module_fabric_dependent_memory_bank_bitstream(bitstream_manager, top_block, - module_manager, top_module, + module_manager, top_module, top_module, bl_addr_port_info.get_width(), wl_addr_port_info.get_width(), - num_bls, num_wls, + bl_port_info.get_width(), + wl_port_info.get_width(), cur_mem_index, fabric_bitstream); break; } diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp index 670074d74..5c05d666f 100644 --- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp +++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp @@ -1245,25 +1245,6 @@ void print_verilog_top_testbench_memory_bank_bitstream(std::fstream& fp, fp << ");" << std::endl; } - /* Disable the address and din */ - fp << "\t\t" << std::string(TOP_TESTBENCH_PROG_TASK_NAME); - fp << "(" << bl_addr_port.get_width() << "'b"; - std::vector all_zero_bl_addr(bl_addr_port.get_width(), 0); - for (const size_t& addr_bit : all_zero_bl_addr) { - fp << addr_bit; - } - - fp << ", "; - fp << wl_addr_port.get_width() << "'b"; - std::vector all_zero_wl_addr(wl_addr_port.get_width(), 0); - for (const size_t& addr_bit : all_zero_wl_addr) { - fp << addr_bit; - } - - fp << ", "; - fp <<"1'b0"; - fp << ");" << std::endl; - /* Raise the flag of configuration done when bitstream loading is complete */ BasicPort prog_clock_port(std::string(TOP_TB_PROG_CLOCK_PORT_NAME), 1); fp << "\t\t@(negedge " << generate_verilog_port(VERILOG_PORT_CONKT, prog_clock_port) << ");" << std::endl; diff --git a/openfpga/src/utils/decoder_library_utils.cpp b/openfpga/src/utils/decoder_library_utils.cpp index 8fd7e2208..f4db14ba7 100644 --- a/openfpga/src/utils/decoder_library_utils.cpp +++ b/openfpga/src/utils/decoder_library_utils.cpp @@ -74,11 +74,16 @@ size_t find_mux_local_decoder_addr_size(const size_t& data_size) { * ***************************************************************************************/ size_t find_memory_decoder_addr_size(const size_t& num_mems) { - return find_mux_local_decoder_addr_size((size_t)std::ceil(std::sqrt((float)num_mems))); + return find_mux_local_decoder_addr_size(find_memory_decoder_data_size(num_mems)); } -size_t find_memory_decoder_data_size(const size_t& num_addr) { - return (size_t)std::pow(2., num_addr); +/*************************************************************************************** + * Find the size of data lines (BLs and WLs) for a memory decoder to access a memory array + * As the memory cells are organized in an array with shared bit lines and word lines, + * the number of data lines will be a square root of the number of memory cells. + ***************************************************************************************/ +size_t find_memory_decoder_data_size(const size_t& num_mems) { + return (size_t)std::ceil(std::sqrt((float)num_mems)); } /*************************************************************************************** diff --git a/openfpga/src/utils/decoder_library_utils.h b/openfpga/src/utils/decoder_library_utils.h index f7f06f733..aa25d0df2 100644 --- a/openfpga/src/utils/decoder_library_utils.h +++ b/openfpga/src/utils/decoder_library_utils.h @@ -15,7 +15,7 @@ size_t find_mux_local_decoder_addr_size(const size_t& data_size); size_t find_memory_decoder_addr_size(const size_t& num_mems); -size_t find_memory_decoder_data_size(const size_t& num_addr); +size_t find_memory_decoder_data_size(const size_t& num_mems); DecoderId add_mux_local_decoder_to_library(DecoderLibrary& decoder_lib, const size_t data_size); From 82b04ae3f06e76e1e33e76b0a40e6a1260ba86c4 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 31 May 2020 13:03:54 -0600 Subject: [PATCH 148/180] add SRAM verilog for memory bank usage --- openfpga_flow/VerilogNetlists/sram.v | 49 ++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/openfpga_flow/VerilogNetlists/sram.v b/openfpga_flow/VerilogNetlists/sram.v index 536c1012a..8b2c6c2d6 100644 --- a/openfpga_flow/VerilogNetlists/sram.v +++ b/openfpga_flow/VerilogNetlists/sram.v @@ -1,3 +1,52 @@ +//----------------------------------------------------- +// Design Name : sram_blwl +// File Name : sram.v +// Function : A SRAM cell is is accessible +// when wl is enabled +// Coder : Xifan TANG +//----------------------------------------------------- +module sram_blwl( +input wl, // Word line control signal +input bl, // Bit line control signal +output out, // Data output +output outb, // Data output +); + + //----- local variable need to be registered + reg data; + + //----- when wl is enabled, we can read in data from bl + always @(bl, wl) + begin + //----- Cases to program internal memory bit + //----- case 1: bl = 1, wl = 1, a -> 0 + if ((1'b1 == bl)&&(1'b1 == wl)) begin + data <= 1'b1; + end + //----- case 2: bl = 0, wl = 1, a -> 0 + if ((1'b0 == bl)&&(1'b1 == wl)) begin + data <= 1'b0; + end + end + +`ifdef ENABLE_SIGNAL_INITIALIZATION + initial begin + $deposit(data, $random); + end +`endif + +`ifndef ENABLE_FORMAL_VERIFICATION + // Wire q_reg to Q + assign out = data; + assign outb = ~data; +`else + assign out = 1'bZ; + assign outb = !out; +`endif + +endmodule + + //------ Module: sram6T_blwl -----// //------ Verilog file: sram.v -----// //------ Author: Xifan TANG -----// From aac2e8c805d4b7a6636d24c093b40691184fcd72 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 31 May 2020 13:08:13 -0600 Subject: [PATCH 149/180] update openfpga architecture for memory bank usage --- .../openfpga_arch/k4_N4_40nm_bank_openfpga.xml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml index 7de3ec8c4..487cd91e0 100644 --- a/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml @@ -142,29 +142,27 @@ - + - - - - + + - + - + From 8267dad8ef567e7d876cd9ce9de4664ac7a452a7 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 31 May 2020 13:12:00 -0600 Subject: [PATCH 150/180] add decoder support for Z signals --- libopenfpga/libarchopenfpga/src/check_circuit_library.cpp | 1 - openfpga/src/fpga_verilog/verilog_decoders.cpp | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp index fe364bf0f..b38fbf1b6 100644 --- a/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp +++ b/libopenfpga/libarchopenfpga/src/check_circuit_library.cpp @@ -508,7 +508,6 @@ bool check_circuit_library(const CircuitLibrary& circuit_lib) { /* 6. SRAM must have at least an input and an output ports*/ std::vector sram_port_types_required; - sram_port_types_required.push_back(CIRCUIT_MODEL_PORT_INPUT); sram_port_types_required.push_back(CIRCUIT_MODEL_PORT_OUTPUT); num_err += check_circuit_model_port_required(circuit_lib, CIRCUIT_MODEL_SRAM, sram_port_types_required); diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 0ae2c70b3..327cb51b7 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -484,7 +484,10 @@ void print_verilog_arch_decoder_with_data_in_module(std::fstream& fp, fp << ") begin" << std::endl; fp << "\tif (" << generate_verilog_port(VERILOG_PORT_CONKT, enable_port) << " == 1'b1) begin" << std::endl; - fp << "\t\t" << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)); + fp << "\t\t" << generate_verilog_port(VERILOG_PORT_CONKT, data_port); + fp << " = "; + std::string high_res_str = "{" + std::to_string(data_port.get_width()) + "{1'bz}}"; + fp << high_res_str; fp << ";" << std::endl; fp << "\t\t" << "case (" << generate_verilog_port(VERILOG_PORT_CONKT, addr_port) << ")" << std::endl; /* Create a string for addr and data */ From baa2c6b7ef16a7ad054a74a19740a011fe2f570c Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 31 May 2020 13:26:55 -0600 Subject: [PATCH 151/180] update arch to support reset signal for SRAm --- openfpga_flow/VerilogNetlists/sram.v | 16 ++++++---------- .../openfpga_arch/k4_N4_40nm_bank_openfpga.xml | 1 + 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/openfpga_flow/VerilogNetlists/sram.v b/openfpga_flow/VerilogNetlists/sram.v index 8b2c6c2d6..c27dbeebe 100644 --- a/openfpga_flow/VerilogNetlists/sram.v +++ b/openfpga_flow/VerilogNetlists/sram.v @@ -6,10 +6,11 @@ // Coder : Xifan TANG //----------------------------------------------------- module sram_blwl( +input reset, // Word line control signal input wl, // Word line control signal input bl, // Bit line control signal output out, // Data output -output outb, // Data output +output outb // Data output ); //----- local variable need to be registered @@ -18,23 +19,18 @@ output outb, // Data output //----- when wl is enabled, we can read in data from bl always @(bl, wl) begin + if (1'b1 == reset) begin + data <= 1'b0; + end else if ((1'b1 == bl)&&(1'b1 == wl)) begin //----- Cases to program internal memory bit //----- case 1: bl = 1, wl = 1, a -> 0 - if ((1'b1 == bl)&&(1'b1 == wl)) begin data <= 1'b1; - end + end else if ((1'b0 == bl)&&(1'b1 == wl)) begin //----- case 2: bl = 0, wl = 1, a -> 0 - if ((1'b0 == bl)&&(1'b1 == wl)) begin data <= 1'b0; end end -`ifdef ENABLE_SIGNAL_INITIALIZATION - initial begin - $deposit(data, $random); - end -`endif - `ifndef ENABLE_FORMAL_VERIFICATION // Wire q_reg to Q assign out = data; diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml index 487cd91e0..fe7d3f1b8 100644 --- a/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml @@ -146,6 +146,7 @@ + From 3c10af7f2bdc0380bbd5d33dbabfba49a5040f1b Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 31 May 2020 16:12:42 -0600 Subject: [PATCH 152/180] bug fixed in memory bank configuration protocol which is due to the wrong Verilog port merging algorithm --- .../src/fabric/build_top_module_memory.cpp | 4 +- .../fpga_bitstream/build_fabric_bitstream.cpp | 12 +++++- .../src/fpga_verilog/verilog_decoders.cpp | 8 +++- .../src/fpga_verilog/verilog_writer_utils.cpp | 40 +++++++++---------- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index 568646d57..6466d98e5 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -2,6 +2,8 @@ * This file includes functions that are used to organize memories * in the top module of FPGA fabric *******************************************************************/ +#include + /* Headers from vtrutil library */ #include "vtr_assert.h" #include "vtr_log.h" @@ -652,7 +654,7 @@ void add_top_module_nets_cmos_memory_bank_config_bus(ModuleManager& module_manag /* Find the BL decoder data index: * It should be the residual when divided by the number of BLs */ - size_t bl_pin_id = cur_bl_index / num_bls; + size_t bl_pin_id = std::floor(cur_bl_index / num_bls); /* Create net */ ModuleNetId net = create_module_source_pin_net(module_manager, top_module, diff --git a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp index a69594f48..240f19028 100644 --- a/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp +++ b/openfpga/src/fpga_bitstream/build_fabric_bitstream.cpp @@ -2,6 +2,7 @@ * This file includes functions to build fabric dependent bitstream *******************************************************************/ #include +#include #include /* Headers from vtrutil library */ @@ -115,6 +116,13 @@ void rec_build_module_fabric_dependent_memory_bank_bitstream(const BitstreamMana num_configurable_children -= 2; } + /* Early exit if there is no configurable children */ + if (0 == num_configurable_children) { + /* Ensure that there should be no configuration bits in the parent block */ + VTR_ASSERT(0 == bitstream_manager.block_bits(parent_block).size()); + return; + } + for (size_t child_id = 0; child_id < num_configurable_children; ++child_id) { ModuleId child_module = configurable_children[child_id]; size_t child_instance = module_manager.configurable_child_instances(parent_module)[child_id]; @@ -137,6 +145,8 @@ void rec_build_module_fabric_dependent_memory_bank_bitstream(const BitstreamMana } /* Ensure that there should be no configuration bits in the parent block */ VTR_ASSERT(0 == bitstream_manager.block_bits(parent_block).size()); + + return; } /* Note that, reach here, it means that this is a leaf node. @@ -147,7 +157,7 @@ void rec_build_module_fabric_dependent_memory_bank_bitstream(const BitstreamMana FabricBitId fabric_bit = fabric_bitstream.add_bit(config_bit); /* Find BL address */ - size_t cur_bl_index = cur_mem_index / num_bls; + size_t cur_bl_index = std::floor(cur_mem_index / num_bls); std::vector bl_addr_bits_vec = itobin_vec(cur_bl_index, bl_addr_size); /* Find WL address */ diff --git a/openfpga/src/fpga_verilog/verilog_decoders.cpp b/openfpga/src/fpga_verilog/verilog_decoders.cpp index 327cb51b7..b0259f247 100644 --- a/openfpga/src/fpga_verilog/verilog_decoders.cpp +++ b/openfpga/src/fpga_verilog/verilog_decoders.cpp @@ -503,7 +503,9 @@ void print_verilog_arch_decoder_with_data_in_module(std::fstream& fp, /* Different from MUX decoder, we assign default values which is all zero */ fp << "\t\t\t" << "default"; fp << " : "; - fp << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)); + fp << "\t\t" << generate_verilog_port(VERILOG_PORT_CONKT, data_port); + fp << " = "; + fp << high_res_str; fp << ";" << std::endl; fp << "\t\t" << "endcase" << std::endl; @@ -511,7 +513,9 @@ void print_verilog_arch_decoder_with_data_in_module(std::fstream& fp, /* If enable is not active, we should give all zero */ fp << "\t" << "else begin" << std::endl; - fp << "\t\t" << generate_verilog_port_constant_values(data_port, ito1hot_vec(data_size, data_size)); + fp << "\t\t" << generate_verilog_port(VERILOG_PORT_CONKT, data_port); + fp << " = "; + fp << high_res_str; fp << ";" << std::endl; fp << "\t" << "end" << std::endl; diff --git a/openfpga/src/fpga_verilog/verilog_writer_utils.cpp b/openfpga/src/fpga_verilog/verilog_writer_utils.cpp index c59d92dd0..900c3da37 100644 --- a/openfpga/src/fpga_verilog/verilog_writer_utils.cpp +++ b/openfpga/src/fpga_verilog/verilog_writer_utils.cpp @@ -517,31 +517,27 @@ std::vector combine_verilog_ports(const std::vector& ports if (&port == &ports[0]) { continue; } - /* Identify if the port name can be potentially merged: if the port name is already in the merged port list, it may be merged */ - bool merged = false; - for (auto& merged_port : merged_ports) { - if (false == port.mergeable(merged_port)) { - /* Unable to merge, Go to next */ - continue; - } - /* May be merged, check LSB of port and MSB of merged_port */ - if (merged_port.get_msb() + 1 != port.get_lsb()) { - /* Unable to merge, Go to next */ - continue; - } - /* Reach here, we should merge the ports, - * LSB of merged_port remains the same, - * MSB of merged_port will be updated - * to the MSB of port - */ - merged_port.set_msb(port.get_msb()); - merged = true; - break; - } - if (false == merged) { + /* Identify if the port name can be potentially merged: + * if the port can be merged to the last port in the list, it may be merged + */ + if (false == port.mergeable(merged_ports.back())) { /* Unable to merge, add the port to merged port list */ merged_ports.push_back(port); + continue; } + /* May be merged, check LSB of port and MSB of merged_port */ + if (merged_ports.back().get_msb() + 1 != port.get_lsb()) { + /* Unable to merge, add the port to merged port list */ + merged_ports.push_back(port); + continue; + } + /* Reach here, we should merge the ports, + * LSB of merged_port remains the same, + * MSB of merged_port will be updated + * to the MSB of port + */ + BasicPort& port_to_merge = merged_ports.back(); + port_to_merge.set_msb(port.get_msb()); } return merged_ports; From 0b9971cb5c7a03380dd8e65e726129cd57b35472 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 31 May 2020 16:14:38 -0600 Subject: [PATCH 153/180] try to deploy the memory bank protocol test case to CI --- .travis/script.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis/script.sh b/.travis/script.sh index c16c2eeac..907e1a3cf 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -58,8 +58,8 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fas python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/configuration_frame --debug --show_thread_logs echo -e "Testing memory bank configuration protocol of a K4N4 FPGA"; -#python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/memory_bank --debug --show_thread_logs -#python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fast_memory_bank --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/memory_bank --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/full_testbench/fast_memory_bank --debug --show_thread_logs python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/preconfig_testbench/memory_bank --debug --show_thread_logs From f73dfa2bccd895d0da3d522e9e0fa09451739e82 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 31 May 2020 18:58:44 -0600 Subject: [PATCH 154/180] bug fixed in k6_n10_40 architecture --- openfpga_flow/arch/vpr_only_templates/k6_N10_40nm.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openfpga_flow/arch/vpr_only_templates/k6_N10_40nm.xml b/openfpga_flow/arch/vpr_only_templates/k6_N10_40nm.xml index e94f339c1..4ab67628f 100644 --- a/openfpga_flow/arch/vpr_only_templates/k6_N10_40nm.xml +++ b/openfpga_flow/arch/vpr_only_templates/k6_N10_40nm.xml @@ -54,7 +54,7 @@ - + @@ -197,7 +197,7 @@ --> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp index 4c773f87f..031946346 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp +++ b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp @@ -113,3 +113,35 @@ openfpga::Arch read_xml_openfpga_arch(const char* arch_file_name) { return openfpga_arch; } + +/******************************************************************** + * Top-level function to parse an XML file and load data to simulation settings + *******************************************************************/ +openfpga::SimulationSetting read_xml_openfpga_simulation_settings(const char* sim_setting_file_name) { + vtr::ScopedStartFinishTimer timer("Read OpenFPGA simulation settings"); + + openfpga::SimulationSetting openfpga_sim_setting; + + pugi::xml_node Next; + + /* Parse the file */ + pugi::xml_document doc; + pugiutil::loc_data loc_data; + + try { + loc_data = pugiutil::load_xml(doc, sim_setting_file_name); + + /* Second node should be */ + auto xml_simulation_settings = get_single_child(doc, "openfpga_simulation_setting", loc_data); + + /* Parse simulation settings to data structure */ + openfpga_sim_setting = read_xml_simulation_setting(xml_simulation_settings, loc_data); + + } catch (pugiutil::XmlError& e) { + archfpga_throw(sim_setting_file_name, e.line(), + "%s", e.what()); + } + + return openfpga_sim_setting; +} + diff --git a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.h b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.h index e23018c8f..660baeec0 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.h +++ b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.h @@ -12,4 +12,6 @@ *******************************************************************/ openfpga::Arch read_xml_openfpga_arch(const char* arch_file_name); +openfpga::SimulationSetting read_xml_openfpga_simulation_settings(const char* sim_setting_file_name); + #endif diff --git a/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.cpp b/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.cpp index 60821e2ed..6007a14bf 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.cpp +++ b/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.cpp @@ -40,7 +40,7 @@ e_sim_accuracy_type string_to_sim_accuracy_type(const std::string& type_string) static void read_xml_clock_setting(pugi::xml_node& xml_clock_setting, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { /* Parse operating clock setting */ pugi::xml_node xml_operating_clock_setting = get_single_child(xml_clock_setting, "operating", loc_data); @@ -73,7 +73,7 @@ void read_xml_clock_setting(pugi::xml_node& xml_clock_setting, static void read_xml_simulator_option(pugi::xml_node& xml_sim_option, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { pugi::xml_node xml_operating_condition = get_single_child(xml_sim_option, "operating_condition", loc_data); sim_setting.set_simulation_temperature(get_attribute(xml_operating_condition, "temperature", loc_data).as_float(0.)); @@ -119,7 +119,7 @@ void read_xml_simulator_option(pugi::xml_node& xml_sim_option, static void read_xml_monte_carlo(pugi::xml_node& xml_mc, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { sim_setting.set_monte_carlo_simulation_points(get_attribute(xml_mc, "num_simulation_points", loc_data).as_int(0)); } @@ -129,7 +129,7 @@ void read_xml_monte_carlo(pugi::xml_node& xml_mc, static void read_xml_measurement_setting(pugi::xml_node& xml_measurement, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { pugi::xml_node xml_slew = get_single_child(xml_measurement, "slew", loc_data); pugi::xml_node xml_slew_rise = get_single_child(xml_slew, "rise", loc_data); sim_setting.set_measure_slew_upper_threshold(SIM_SIGNAL_RISE, get_attribute(xml_slew_rise, "upper_thres_pct", loc_data).as_float(0.)); @@ -155,7 +155,7 @@ void read_xml_measurement_setting(pugi::xml_node& xml_measurement, static void read_xml_stimulus_clock(pugi::xml_node& xml_stimuli_clock, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting, + openfpga::SimulationSetting& sim_setting, const e_sim_signal_type& signal_type) { /* Find the type of accuracy */ const char* type_attr = get_attribute(xml_stimuli_clock, "slew_type", loc_data).value(); @@ -188,7 +188,7 @@ void read_xml_stimulus_clock(pugi::xml_node& xml_stimuli_clock, static void read_xml_stimulus_input(pugi::xml_node& xml_stimuli_input, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting, + openfpga::SimulationSetting& sim_setting, const e_sim_signal_type& signal_type) { /* Find the type of accuracy */ const char* type_attr = get_attribute(xml_stimuli_input, "slew_type", loc_data).value(); @@ -221,7 +221,7 @@ void read_xml_stimulus_input(pugi::xml_node& xml_stimuli_input, static void read_xml_stimulus(pugi::xml_node& xml_stimulus, const pugiutil::loc_data& loc_data, - SimulationSetting& sim_setting) { + openfpga::SimulationSetting& sim_setting) { pugi::xml_node xml_clock = get_single_child(xml_stimulus, "clock", loc_data); pugi::xml_node xml_clock_rise = get_single_child(xml_clock, "rise", loc_data); read_xml_stimulus_clock(xml_clock_rise, loc_data, sim_setting, SIM_SIGNAL_RISE); @@ -240,9 +240,9 @@ void read_xml_stimulus(pugi::xml_node& xml_stimulus, /******************************************************************** * Parse XML codes about to an object of technology library *******************************************************************/ -SimulationSetting read_xml_simulation_setting(pugi::xml_node& Node, - const pugiutil::loc_data& loc_data) { - SimulationSetting sim_setting; +openfpga::SimulationSetting read_xml_simulation_setting(pugi::xml_node& Node, + const pugiutil::loc_data& loc_data) { + openfpga::SimulationSetting sim_setting; /* Parse clock settings */ pugi::xml_node xml_clock_setting = get_single_child(Node, "clock_setting", loc_data); diff --git a/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.h b/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.h index 801caad2e..df6f2856c 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.h +++ b/libopenfpga/libarchopenfpga/src/read_xml_simulation_setting.h @@ -11,7 +11,8 @@ /******************************************************************** * Function declaration *******************************************************************/ -SimulationSetting read_xml_simulation_setting(pugi::xml_node& Node, - const pugiutil::loc_data& loc_data); + +openfpga::SimulationSetting read_xml_simulation_setting(pugi::xml_node& Node, + const pugiutil::loc_data& loc_data); #endif diff --git a/libopenfpga/libarchopenfpga/src/simulation_setting.cpp b/libopenfpga/libarchopenfpga/src/simulation_setting.cpp index 2e332a29d..63f20a90c 100644 --- a/libopenfpga/libarchopenfpga/src/simulation_setting.cpp +++ b/libopenfpga/libarchopenfpga/src/simulation_setting.cpp @@ -2,6 +2,9 @@ #include "simulation_setting.h" +/* namespace openfpga begins */ +namespace openfpga { + /************************************************************************ * Member functions for class SimulationSetting ***********************************************************************/ @@ -208,3 +211,5 @@ void SimulationSetting::set_stimuli_input_slew(const e_sim_signal_type& signal_t bool SimulationSetting::valid_signal_threshold(const float& threshold) const { return (0. < threshold) && (threshold < 1); } + +} /* namespace openfpga ends */ diff --git a/libopenfpga/libarchopenfpga/src/simulation_setting.h b/libopenfpga/libarchopenfpga/src/simulation_setting.h index f2e4add5c..7be1294eb 100644 --- a/libopenfpga/libarchopenfpga/src/simulation_setting.h +++ b/libopenfpga/libarchopenfpga/src/simulation_setting.h @@ -34,6 +34,9 @@ enum e_sim_accuracy_type { /* Strings correspond to each accuracy type */ constexpr std::array SIM_ACCURACY_TYPE_STRING = {{"frac", "abs"}}; +/* namespace openfpga begins */ +namespace openfpga { + /******************************************************************** * A data structure to describe simulation settings * @@ -211,4 +214,6 @@ class SimulationSetting { std::array input_slews_; }; +} /* namespace openfpga ends */ + #endif diff --git a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp index 6d0a8ff06..468924ad2 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp +++ b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp @@ -20,7 +20,7 @@ #include "write_xml_openfpga_arch.h" /******************************************************************** - * A writer to output an OpenFPGAArch to XML format + * A writer to output an OpenFPGA arch database to XML format *******************************************************************/ void write_xml_openfpga_arch(const char* fname, const openfpga::Arch& openfpga_arch) { @@ -69,3 +69,25 @@ void write_xml_openfpga_arch(const char* fname, /* Close the file stream */ fp.close(); } + +/******************************************************************** + * A writer to output an OpenFPGA simulation setting database to XML format + *******************************************************************/ +void write_xml_openfpga_simulation_settings(const char* fname, + const openfpga::SimulationSetting& openfpga_sim_setting) { + vtr::ScopedStartFinishTimer timer("Write OpenFPGA simulation settings"); + + /* Create a file handler */ + std::fstream fp; + /* Open the file stream */ + fp.open(std::string(fname), std::fstream::out | std::fstream::trunc); + + /* Validate the file stream */ + openfpga::check_file_stream(fname, fp); + + /* Write the simulation */ + write_xml_simulation_setting(fp, fname, openfpga_sim_setting); + + /* Close the file stream */ + fp.close(); +} diff --git a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.h b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.h index 790d483f4..68611493f 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.h +++ b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.h @@ -13,4 +13,8 @@ void write_xml_openfpga_arch(const char* xml_fname, const openfpga::Arch& openfpga_arch); +void write_xml_openfpga_simulation_settings(const char* xml_fname, + const openfpga::SimulationSetting& openfpga_sim_setting); + + #endif diff --git a/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.cpp b/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.cpp index c5ff0beca..9403036c6 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.cpp +++ b/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.cpp @@ -20,7 +20,7 @@ static void write_xml_clock_setting(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -53,7 +53,7 @@ void write_xml_clock_setting(std::fstream& fp, static void write_xml_simulator_option(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -87,7 +87,7 @@ void write_xml_simulator_option(std::fstream& fp, static void write_xml_monte_carlo(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -111,7 +111,7 @@ void write_xml_monte_carlo(std::fstream& fp, static void write_xml_slew_measurement(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting, + const openfpga::SimulationSetting& sim_setting, const e_sim_signal_type& signal_type) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -130,7 +130,7 @@ void write_xml_slew_measurement(std::fstream& fp, static void write_xml_delay_measurement(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting, + const openfpga::SimulationSetting& sim_setting, const e_sim_signal_type& signal_type) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -149,7 +149,7 @@ void write_xml_delay_measurement(std::fstream& fp, static void write_xml_measurement(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -174,7 +174,7 @@ void write_xml_measurement(std::fstream& fp, static void write_xml_stimulus(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); @@ -216,7 +216,7 @@ void write_xml_stimulus(std::fstream& fp, *******************************************************************/ void write_xml_simulation_setting(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting) { + const openfpga::SimulationSetting& sim_setting) { /* Validate the file stream */ openfpga::check_file_stream(fname, fp); diff --git a/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.h b/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.h index 1c23ef0ca..d0581a8c6 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.h +++ b/libopenfpga/libarchopenfpga/src/write_xml_simulation_setting.h @@ -12,6 +12,6 @@ *******************************************************************/ void write_xml_simulation_setting(std::fstream& fp, const char* fname, - const SimulationSetting& sim_setting); + const openfpga::SimulationSetting& sim_setting); #endif diff --git a/libopenfpga/libarchopenfpga/test/main.cpp b/libopenfpga/libarchopenfpga/test/main.cpp deleted file mode 100644 index 7974cf258..000000000 --- a/libopenfpga/libarchopenfpga/test/main.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/******************************************************************** - * Unit test functions to validate the correctness of - * 1. parser of data structures - * 2. writer of data structures - *******************************************************************/ -/* Headers from vtrutils */ -#include "vtr_assert.h" -#include "vtr_log.h" - -/* Headers from readarchopenfpga */ -#include "check_circuit_library.h" -#include "read_xml_openfpga_arch.h" -#include "write_xml_openfpga_arch.h" - -int main(int argc, const char** argv) { - /* Ensure we have only one or two argument */ - VTR_ASSERT((2 == argc) || (3 == argc)); - - /* Parse the circuit library from an XML file */ - const openfpga::Arch& openfpga_arch = read_xml_openfpga_arch(argv[1]); - VTR_LOG("Parsed %lu circuit models from XML into circuit library.\n", - openfpga_arch.circuit_lib.num_models()); - - /* Check the circuit library */ - check_circuit_library(openfpga_arch.circuit_lib); - - /* Output the circuit library to an XML file - * This is optional only used when there is a second argument - */ - if (3 <= argc) { - write_xml_openfpga_arch(argv[2], openfpga_arch); - VTR_LOG("Echo the OpenFPGA architecture to an XML file: %s.\n", - argv[2]); - } -} - - From 4a2f6dfae21cf52fec402eea3a07c827b358912e Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 10 Jun 2020 15:23:32 -0600 Subject: [PATCH 158/180] add read/write simulation setting commands to openfpga shell --- openfpga/src/base/openfpga_context.h | 3 + openfpga/src/base/openfpga_read_arch.cpp | 54 ++++++++++++++++ openfpga/src/base/openfpga_read_arch.h | 6 ++ openfpga/src/base/openfpga_setup_command.cpp | 66 ++++++++++++++++++++ 4 files changed, 129 insertions(+) diff --git a/openfpga/src/base/openfpga_context.h b/openfpga/src/base/openfpga_context.h index 0eb34c029..e18a3fd34 100644 --- a/openfpga/src/base/openfpga_context.h +++ b/openfpga/src/base/openfpga_context.h @@ -50,6 +50,7 @@ class OpenfpgaContext : public Context { public: /* Public accessors */ const openfpga::Arch& arch() const { return arch_; } + const openfpga::SimulationSetting& simulation_setting() const { return sim_setting_; } const openfpga::VprDeviceAnnotation& vpr_device_annotation() const { return vpr_device_annotation_; } const openfpga::VprNetlistAnnotation& vpr_netlist_annotation() const { return vpr_netlist_annotation_; } const openfpga::VprClusteringAnnotation& vpr_clustering_annotation() const { return vpr_clustering_annotation_; } @@ -68,6 +69,7 @@ class OpenfpgaContext : public Context { const openfpga::NetlistManager& verilog_netlists() const { return verilog_netlists_; } public: /* Public mutators */ openfpga::Arch& mutable_arch() { return arch_; } + openfpga::SimulationSetting& mutable_simulation_setting() { return sim_setting_; } openfpga::VprDeviceAnnotation& mutable_vpr_device_annotation() { return vpr_device_annotation_; } openfpga::VprNetlistAnnotation& mutable_vpr_netlist_annotation() { return vpr_netlist_annotation_; } openfpga::VprClusteringAnnotation& mutable_vpr_clustering_annotation() { return vpr_clustering_annotation_; } @@ -87,6 +89,7 @@ class OpenfpgaContext : public Context { private: /* Internal data */ /* Data structure to store information from read_openfpga_arch library */ openfpga::Arch arch_; + openfpga::SimulationSetting sim_setting_; /* Annotation to pb_type of VPR */ openfpga::VprDeviceAnnotation vpr_device_annotation_; diff --git a/openfpga/src/base/openfpga_read_arch.cpp b/openfpga/src/base/openfpga_read_arch.cpp index db9b09b5b..ce7aed6ba 100644 --- a/openfpga/src/base/openfpga_read_arch.cpp +++ b/openfpga/src/base/openfpga_read_arch.cpp @@ -87,5 +87,59 @@ int write_arch(const OpenfpgaContext& openfpga_context, return CMD_EXEC_SUCCESS; } +/******************************************************************** + * Top-level function to read an OpenFPGA simulation setting file + * we use the APIs from the libarchopenfpga library + * + * The command will accept an option '--file' which is the simulation setting + * file provided by users + *******************************************************************/ +int read_simulation_setting(OpenfpgaContext& openfpga_context, + const Command& cmd, const CommandContext& cmd_context) { + /* Check the option '--file' is enabled or not + * Actually, it must be enabled as the shell interface will check + * before reaching this fuction + */ + CommandOptionId opt_file = cmd.option("file"); + VTR_ASSERT(true == cmd_context.option_enable(cmd, opt_file)); + VTR_ASSERT(false == cmd_context.option_value(cmd, opt_file).empty()); + + std::string arch_file_name = cmd_context.option_value(cmd, opt_file); + + VTR_LOG("Reading XML simulation setting '%s'...\n", + arch_file_name.c_str()); + openfpga_context.mutable_simulation_setting() = read_xml_openfpga_simulation_settings(arch_file_name.c_str()); + + /* TODO: should identify the error code from internal function execution */ + return CMD_EXEC_SUCCESS; +} + +/******************************************************************** + * A function to write an OpenFPGA simulation setting file + * we use the APIs from the libarchopenfpga library + * + * The command will accept an option '--file' which is the simulation setting + * file provided by users + *******************************************************************/ +int write_simulation_setting(const OpenfpgaContext& openfpga_context, + const Command& cmd, const CommandContext& cmd_context) { + /* Check the option '--file' is enabled or not + * Actually, it must be enabled as the shell interface will check + * before reaching this fuction + */ + CommandOptionId opt_file = cmd.option("file"); + VTR_ASSERT(true == cmd_context.option_enable(cmd, opt_file)); + VTR_ASSERT(false == cmd_context.option_value(cmd, opt_file).empty()); + + std::string arch_file_name = cmd_context.option_value(cmd, opt_file); + + VTR_LOG("Writing XML simulation setting to '%s'...\n", + arch_file_name.c_str()); + write_xml_openfpga_simulation_settings(arch_file_name.c_str(), openfpga_context.simulation_setting()); + + /* TODO: should identify the error code from internal function execution */ + return CMD_EXEC_SUCCESS; +} + } /* end namespace openfpga */ diff --git a/openfpga/src/base/openfpga_read_arch.h b/openfpga/src/base/openfpga_read_arch.h index b664a7b3e..d5502db56 100644 --- a/openfpga/src/base/openfpga_read_arch.h +++ b/openfpga/src/base/openfpga_read_arch.h @@ -21,6 +21,12 @@ int read_arch(OpenfpgaContext& openfpga_context, int write_arch(const OpenfpgaContext& openfpga_context, const Command& cmd, const CommandContext& cmd_context); +int read_simulation_setting(OpenfpgaContext& openfpga_context, + const Command& cmd, const CommandContext& cmd_context); + +int write_simulation_setting(const OpenfpgaContext& openfpga_context, + const Command& cmd, const CommandContext& cmd_context); + } /* end namespace openfpga */ #endif diff --git a/openfpga/src/base/openfpga_setup_command.cpp b/openfpga/src/base/openfpga_setup_command.cpp index 8af22e7da..b47cfb97a 100644 --- a/openfpga/src/base/openfpga_setup_command.cpp +++ b/openfpga/src/base/openfpga_setup_command.cpp @@ -64,6 +64,55 @@ ShellCommandId add_openfpga_write_arch_command(openfpga::Shell& return shell_cmd_id; } +/******************************************************************** + * - Add a command to Shell environment: read_openfpga_simulation_setting + * - Add associated options + * - Add command dependency + *******************************************************************/ +static +ShellCommandId add_openfpga_read_simulation_setting_command(openfpga::Shell& shell, + const ShellCommandClassId& cmd_class_id) { + Command shell_cmd("read_openfpga_simulation_setting"); + + /* Add an option '--file' in short '-f'*/ + CommandOptionId opt_file = shell_cmd.add_option("file", true, "file path to the simulation setting XML"); + shell_cmd.set_option_short_name(opt_file, "f"); + shell_cmd.set_option_require_value(opt_file, openfpga::OPT_STRING); + + /* Add command 'read_openfpga_arch' to the Shell */ + ShellCommandId shell_cmd_id = shell.add_command(shell_cmd, "read OpenFPGA simulation setting file"); + shell.set_command_class(shell_cmd_id, cmd_class_id); + shell.set_command_execute_function(shell_cmd_id, read_simulation_setting); + + return shell_cmd_id; +} + +/******************************************************************** + * - Add a command to Shell environment: write_openfpga_simulation_setting + * - Add associated options + * - Add command dependency + *******************************************************************/ +static +ShellCommandId add_openfpga_write_simulation_setting_command(openfpga::Shell& shell, + const ShellCommandClassId& cmd_class_id, + const std::vector& dependent_cmds) { + Command shell_cmd("write_openfpga_simulation_setting"); + /* Add an option '--file' in short '-f'*/ + CommandOptionId opt_file = shell_cmd.add_option("file", true, "file path to the simulation setting XML"); + shell_cmd.set_option_short_name(opt_file, "f"); + shell_cmd.set_option_require_value(opt_file, openfpga::OPT_STRING); + + /* Add command 'write_openfpga_arch' to the Shell */ + ShellCommandId shell_cmd_id = shell.add_command(shell_cmd, "write OpenFPGA simulation setting file"); + shell.set_command_class(shell_cmd_id, cmd_class_id); + shell.set_command_const_execute_function(shell_cmd_id, write_simulation_setting); + + /* Add command dependency to the Shell */ + shell.set_command_dependency(shell_cmd_id, dependent_cmds); + + return shell_cmd_id; +} + /******************************************************************** * - Add a command to Shell environment: link_openfpga_arch * - Add associated options @@ -295,16 +344,33 @@ void add_openfpga_setup_commands(openfpga::Shell& shell) { openfpga_setup_cmd_class, write_arch_dependent_cmds); + /******************************** + * Command 'read_openfpga_simulation_setting' + */ + ShellCommandId read_sim_setting_cmd_id = add_openfpga_read_simulation_setting_command(shell, + openfpga_setup_cmd_class); + + /******************************** + * Command 'write_openfpga_simulation_setting' + */ + /* The 'write_openfpga_simulation_setting' command should NOT be executed before 'read_openfpga_simulation_setting' */ + std::vector write_sim_setting_dependent_cmds(1, read_sim_setting_cmd_id); + add_openfpga_write_simulation_setting_command(shell, + openfpga_setup_cmd_class, + write_sim_setting_dependent_cmds); + /******************************** * Command 'link_openfpga_arch' */ /* The 'link_openfpga_arch' command should NOT be executed before 'vpr' */ std::vector link_arch_dependent_cmds; link_arch_dependent_cmds.push_back(read_arch_cmd_id); + link_arch_dependent_cmds.push_back(read_sim_setting_cmd_id); link_arch_dependent_cmds.push_back(vpr_cmd_id); ShellCommandId link_arch_cmd_id = add_openfpga_link_arch_command(shell, openfpga_setup_cmd_class, link_arch_dependent_cmds); + /******************************** * Command 'write_gsb' */ From 96b58dfdbbb12c14462d067848ae6038cdce4e95 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 10 Jun 2020 15:37:17 -0600 Subject: [PATCH 159/180] use new simulation setting command in openfpga shell --- openfpga/src/base/openfpga_link_arch.cpp | 6 +++++- openfpga/src/base/openfpga_sdc.cpp | 6 +++--- openfpga/src/base/openfpga_setup_command.cpp | 4 +++- openfpga/src/base/openfpga_verilog.cpp | 2 +- .../configuration_chain_example_script.openfpga | 3 +++ .../duplicated_grid_pin_example_script.openfpga | 3 +++ openfpga_flow/OpenFPGAShellScripts/example_script.openfpga | 3 +++ .../fast_configuration_example_script.openfpga | 3 +++ .../flatten_routing_example_script.openfpga | 3 +++ .../full_testbench_example_script.openfpga | 3 +++ .../generate_fabric_example_script.openfpga | 3 +++ .../generate_testbench_example_script.openfpga | 3 +++ .../implicit_verilog_example_script.openfpga | 3 +++ .../OpenFPGAShellScripts/mcnc_example_script.openfpga | 3 +++ .../sdc_time_unit_example_script.openfpga | 3 +++ 15 files changed, 45 insertions(+), 6 deletions(-) diff --git a/openfpga/src/base/openfpga_link_arch.cpp b/openfpga/src/base/openfpga_link_arch.cpp index 65aef7cf8..c67619caa 100644 --- a/openfpga/src/base/openfpga_link_arch.cpp +++ b/openfpga/src/base/openfpga_link_arch.cpp @@ -147,9 +147,13 @@ int link_arch(OpenfpgaContext& openfpga_ctx, * We SHOULD create a new simulation setting for OpenFPGA use only * Avoid overwrite the raw data achieved when parsing!!! */ + /* OVERWRITE the simulation setting in openfpga context from the arch + * TODO: This will be removed when openfpga flow is updated + */ + openfpga_ctx.mutable_simulation_setting() = openfpga_ctx.mutable_arch().sim_setting; annotate_simulation_setting(g_vpr_ctx.atom(), openfpga_ctx.net_activity(), - openfpga_ctx.mutable_arch().sim_setting); + openfpga_ctx.mutable_simulation_setting()); /* TODO: should identify the error code from internal function execution */ return CMD_EXEC_SUCCESS; diff --git a/openfpga/src/base/openfpga_sdc.cpp b/openfpga/src/base/openfpga_sdc.cpp index 2d44520db..9bcbc26df 100644 --- a/openfpga/src/base/openfpga_sdc.cpp +++ b/openfpga/src/base/openfpga_sdc.cpp @@ -88,8 +88,8 @@ int write_pnr_sdc(const OpenfpgaContext& openfpga_ctx, /* Execute only when sdc is enabled */ if (true == options.generate_sdc_pnr()) { print_pnr_sdc(options, - 1./openfpga_ctx.arch().sim_setting.programming_clock_frequency(), - 1./openfpga_ctx.arch().sim_setting.operating_clock_frequency(), + 1./openfpga_ctx.simulation_setting().programming_clock_frequency(), + 1./openfpga_ctx.simulation_setting().operating_clock_frequency(), g_vpr_ctx.device(), openfpga_ctx.vpr_device_annotation(), openfpga_ctx.device_rr_gsb(), @@ -200,7 +200,7 @@ int write_analysis_sdc(const OpenfpgaContext& openfpga_ctx, if (true == options.generate_sdc_analysis()) { print_analysis_sdc(options, - 1./openfpga_ctx.arch().sim_setting.operating_clock_frequency(), + 1./openfpga_ctx.simulation_setting().operating_clock_frequency(), g_vpr_ctx, openfpga_ctx, global_ports, diff --git a/openfpga/src/base/openfpga_setup_command.cpp b/openfpga/src/base/openfpga_setup_command.cpp index b47cfb97a..e9d759b1f 100644 --- a/openfpga/src/base/openfpga_setup_command.cpp +++ b/openfpga/src/base/openfpga_setup_command.cpp @@ -365,7 +365,9 @@ void add_openfpga_setup_commands(openfpga::Shell& shell) { /* The 'link_openfpga_arch' command should NOT be executed before 'vpr' */ std::vector link_arch_dependent_cmds; link_arch_dependent_cmds.push_back(read_arch_cmd_id); - link_arch_dependent_cmds.push_back(read_sim_setting_cmd_id); + /* TODO: This will be uncommented when openfpga flow script is updated + * link_arch_dependent_cmds.push_back(read_sim_setting_cmd_id); + */ link_arch_dependent_cmds.push_back(vpr_cmd_id); ShellCommandId link_arch_cmd_id = add_openfpga_link_arch_command(shell, openfpga_setup_cmd_class, diff --git a/openfpga/src/base/openfpga_verilog.cpp b/openfpga/src/base/openfpga_verilog.cpp index 926e0f8d3..58ea20f2e 100644 --- a/openfpga/src/base/openfpga_verilog.cpp +++ b/openfpga/src/base/openfpga_verilog.cpp @@ -96,7 +96,7 @@ int write_verilog_testbench(OpenfpgaContext& openfpga_ctx, openfpga_ctx.io_location_map(), openfpga_ctx.vpr_netlist_annotation(), openfpga_ctx.arch().circuit_lib, - openfpga_ctx.arch().sim_setting, + openfpga_ctx.simulation_setting(), openfpga_ctx.arch().config_protocol.type(), options); diff --git a/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga index 11f3ed295..7492854a2 100644 --- a/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges diff --git a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga index bcc8d36e3..83707cf53 100644 --- a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges diff --git a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga index bcc8d36e3..83707cf53 100644 --- a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges diff --git a/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga index 94e16b906..56d05257c 100644 --- a/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges diff --git a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga index 3210b411f..fa376dbe3 100644 --- a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} diff --git a/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga index bcc8d36e3..83707cf53 100644 --- a/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga index ff40f4c76..434c573e1 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga index a426a7833..6fe802168 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges diff --git a/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga index 579e113a9..021488557 100644 --- a/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges diff --git a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga index 3293979ea..ebd6c217c 100644 --- a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route --absorb_buffe # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges diff --git a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga index 6841eb935..3411f6e87 100644 --- a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga @@ -5,6 +5,9 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route # Read OpenFPGA architecture definition read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} +# Read OpenFPGA simulation settings +#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE + # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges From cb09896f23b059a5f617fd689607d210d7eb0449 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 10 Jun 2020 15:41:46 -0600 Subject: [PATCH 160/180] add example simulation setting for openfpga flow --- .../auto_sim_openfpga.xml | 39 +++++++++++++++++++ .../fixed_sim_openfpga.xml | 37 ++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml create mode 100644 openfpga_flow/openfpga_simulation_settings/fixed_sim_openfpga.xml diff --git a/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml b/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml new file mode 100644 index 000000000..99ff97235 --- /dev/null +++ b/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openfpga_flow/openfpga_simulation_settings/fixed_sim_openfpga.xml b/openfpga_flow/openfpga_simulation_settings/fixed_sim_openfpga.xml new file mode 100644 index 000000000..94593863d --- /dev/null +++ b/openfpga_flow/openfpga_simulation_settings/fixed_sim_openfpga.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From dfdfea208149ab99aadf676251a380c1f18bceb1 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 10 Jun 2020 15:49:20 -0600 Subject: [PATCH 161/180] fix the bug in CMake Script due to splitted simulation setting files --- CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f46955c8b..6aa930b94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -258,12 +258,6 @@ set_target_properties(libvpr vpr_shell LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/vpr7_x2p/vpr" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/vpr7_x2p/vpr") -set_target_properties(libarchopenfpga read_arch_openfpga - PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libopenfpga/libarchopenfpga" - LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libopenfpga/libarchopenfpga" - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libopenfpga/libarchopenfpga") - set_target_properties(libvpr8 vpr8 PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/vpr" From f26550141fd4f1a11ac382b3da6c1f358f23cd9c Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 10 Jun 2020 15:56:37 -0600 Subject: [PATCH 162/180] add missing files --- .../test/read_arch_openfpga.cpp | 37 +++++++++++++++++++ .../test/read_simulation_setting_openfpga.cpp | 31 ++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 libopenfpga/libarchopenfpga/test/read_arch_openfpga.cpp create mode 100644 libopenfpga/libarchopenfpga/test/read_simulation_setting_openfpga.cpp diff --git a/libopenfpga/libarchopenfpga/test/read_arch_openfpga.cpp b/libopenfpga/libarchopenfpga/test/read_arch_openfpga.cpp new file mode 100644 index 000000000..7974cf258 --- /dev/null +++ b/libopenfpga/libarchopenfpga/test/read_arch_openfpga.cpp @@ -0,0 +1,37 @@ +/******************************************************************** + * Unit test functions to validate the correctness of + * 1. parser of data structures + * 2. writer of data structures + *******************************************************************/ +/* Headers from vtrutils */ +#include "vtr_assert.h" +#include "vtr_log.h" + +/* Headers from readarchopenfpga */ +#include "check_circuit_library.h" +#include "read_xml_openfpga_arch.h" +#include "write_xml_openfpga_arch.h" + +int main(int argc, const char** argv) { + /* Ensure we have only one or two argument */ + VTR_ASSERT((2 == argc) || (3 == argc)); + + /* Parse the circuit library from an XML file */ + const openfpga::Arch& openfpga_arch = read_xml_openfpga_arch(argv[1]); + VTR_LOG("Parsed %lu circuit models from XML into circuit library.\n", + openfpga_arch.circuit_lib.num_models()); + + /* Check the circuit library */ + check_circuit_library(openfpga_arch.circuit_lib); + + /* Output the circuit library to an XML file + * This is optional only used when there is a second argument + */ + if (3 <= argc) { + write_xml_openfpga_arch(argv[2], openfpga_arch); + VTR_LOG("Echo the OpenFPGA architecture to an XML file: %s.\n", + argv[2]); + } +} + + diff --git a/libopenfpga/libarchopenfpga/test/read_simulation_setting_openfpga.cpp b/libopenfpga/libarchopenfpga/test/read_simulation_setting_openfpga.cpp new file mode 100644 index 000000000..b8540240b --- /dev/null +++ b/libopenfpga/libarchopenfpga/test/read_simulation_setting_openfpga.cpp @@ -0,0 +1,31 @@ +/******************************************************************** + * Unit test functions to validate the correctness of + * 1. parser of data structures + * 2. writer of data structures + *******************************************************************/ +/* Headers from vtrutils */ +#include "vtr_assert.h" +#include "vtr_log.h" + +/* Headers from readarchopenfpga */ +#include "read_xml_openfpga_arch.h" +#include "write_xml_openfpga_arch.h" + +int main(int argc, const char** argv) { + /* Ensure we have only one or two argument */ + VTR_ASSERT((2 == argc) || (3 == argc)); + + /* Parse the simulation settings from an XML file */ + const openfpga::SimulationSetting& openfpga_sim_setting = read_xml_openfpga_simulation_settings(argv[1]); + VTR_LOG("Parsed simulation settings from XML %s.\n", + argv[1]); + + /* Output the simulation settings to an XML file + * This is optional only used when there is a second argument + */ + if (3 <= argc) { + write_xml_openfpga_simulation_settings(argv[2], openfpga_sim_setting); + VTR_LOG("Echo the OpenFPGA simulation settings to an XML file: %s.\n", + argv[2]); + } +} From 1a006f2ddb484d34610adad212c0bb85a410e33f Mon Sep 17 00:00:00 2001 From: tangxifan Date: Wed, 10 Jun 2020 20:05:43 -0600 Subject: [PATCH 163/180] update documentation for separated XML files --- docs/source/manual/arch_lang/generality.rst | 53 ++++++++++++------- docs/source/manual/fpga_spice/index.rst | 5 +- .../openfpga_shell/openfpga_commands.rst | 18 ++++++- 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/docs/source/manual/arch_lang/generality.rst b/docs/source/manual/arch_lang/generality.rst index d594ff896..af7719b9a 100644 --- a/docs/source/manual/arch_lang/generality.rst +++ b/docs/source/manual/arch_lang/generality.rst @@ -1,4 +1,4 @@ -.. _generality: +.. _arch_generality: General Hierarchy ----------------- @@ -13,34 +13,49 @@ In the following sub-sections, we will introduce the structures of these XML nod For OpenFPGA using VPR8 ~~~~~~~~~~~~~~~~~~~~~~~ -OpenFPGA uses a separated XML file other than the VPR8 architecture description file. +OpenFPGA uses separated XMLs file other than the VPR8 architecture description file. This is to keep a loose integration to VPR8 so that OpenFPGA can easily integrate any future version of VPR with least engineering effort. However, to implement a physical FPGA, OpenFPGA requires the original VPR XML to include full physical design details. Full syntax can be found in :ref:`addon_vpr_syntax`. -The OpenFPGA architecture description XML file consisting of the following parts: +The OpenFPGA requires two XML files: an architecture description file and a simulation setting description file. - - ```` contains architecture-level information, such as device-level description, circuit-level and architecture annotations to original VPR architecture XML. It consists of the following code blocks +OpenFPGA Architecture Description File +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This file contains device-level and circuit-level details as well as annotations to the original VPR architecture. +It contains a root node called ```` under which architecture-level information, such as device-level description, circuit-level and architecture annotations to original VPR architecture XML are defined. + +It consists of the following code blocks - ```` includes a number of ``circuit_model``, each of which describe a primitive block in FPGA architecture, such as Look-Up Tables and multiplexers. Full syntax can be found in :ref:`circuit_library`. - - ```` includes transistor-level parameters, where users can specify which transistor models are going to be used when building the ``circuit models``. - - ```` includes detailed description on the configuration protocols to be used in FPGA fabric. - - ```` includes annotation on the connection block definition ```` in original VPR XML - - ```` includes annotation on the switch block definition ```` in original VPR XML - - ```` includes annotation on the routing segment definition ```` in original VPR XML - - ```` includes annotation on the inter-tile direct connection definitioin ```` in original VPR XML - - ```` includes annotation on the programmable block architecture ```` in original VPR XML - - - ```` includes all the parameters to be used in generate testbenches in simulation purpose. Full syntax can be found in :ref:`simulation_setting`. - - - ```` defines the clock-related settings in simulation, such as clock frequency and number of clock cycles to be used - - ```` defines universal options available in both HDL and SPICE simulators. This is mainly used by FPGA-SPICE - - ```` defines critical parameters to be used in monte-carlo simulations. This is used by FPGA-SPICE - - ```` defines the parameters used to measure signal slew and delays. This is used by FPGA-SPICE - - ```` defines the parameters used to generate voltage stimuli in testbenches. This is used by FPGA-SPICE + - ```` includes transistor-level parameters, where users can specify which transistor models are going to be used when building the ``circuit models``. Full syntax can be found in :ref:`technology_library`. + - ```` includes detailed description on the configuration protocols to be used in FPGA fabric. Full syntax can be found in :ref:`config_protocol`. + - ```` includes annotation on the connection block definition ```` in original VPR XML. Full syntax can be found in :ref:`annotate_vpr_arch`. + - ```` includes annotation on the switch block definition ```` in original VPR XML. Full syntax can be found in :ref:`annotate_vpr_arch`. + - ```` includes annotation on the routing segment definition ```` in original VPR XML. Full syntax can be found in :ref:`annotate_vpr_arch`. + - ```` includes annotation on the inter-tile direct connection definitioin ```` in original VPR XML. Full syntax can be found in :ref:`direct_interconnect`. + - ```` includes annotation on the programmable block architecture ```` in original VPR XML. Full syntax can be found in :ref:`annotate_vpr_arch`. .. note:: ```` will be applied to ``circuit_model`` when running FPGA-SPICE. It will not impact FPGA-Verilog, FPGA-Bitstream, FPGA-SDC. + +OpenFPGA Simulation Setting File +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This file contains parameters required by testbench generators. +It contains a root node ````, under which all the parameters to be used in generate testbenches in simulation purpose are defined. + +It consists of the following code blocks + + - ```` defines the clock-related settings in simulation, such as clock frequency and number of clock cycles to be used. + - ```` defines universal options available in both HDL and SPICE simulators. This is mainly used by :ref:`fpga_spice`. + - ```` defines critical parameters to be used in monte-carlo simulations. This is used by :ref:`fpga_spice`. + - ```` defines the parameters used to measure signal slew and delays. This is used by :ref:`fpga_spice`. + - ```` defines the parameters used to generate voltage stimuli in testbenches. This is used by :ref:`fpga_spice`. + +Full syntax can be found in :ref:`simulation_setting`. + .. note:: the parameters in ```` will be applied to both FPGA-Verilog and FPGA-SPICE simulations diff --git a/docs/source/manual/fpga_spice/index.rst b/docs/source/manual/fpga_spice/index.rst index 4cdffcc0f..b8ce29223 100644 --- a/docs/source/manual/fpga_spice/index.rst +++ b/docs/source/manual/fpga_spice/index.rst @@ -1,11 +1,10 @@ +.. _fpga_spice: + FPGA-SPICE ---------- .. warning:: FPGA-SPICE has not been integrated to VPR8 version yet. Please the following tool guide is for VPR7 version now -.. _fpga_spice: - FPGA-SPICE - .. toctree:: :maxdepth: 2 diff --git a/docs/source/manual/openfpga_shell/openfpga_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands.rst index 6e2f0e490..eb5929861 100644 --- a/docs/source/manual/openfpga_shell/openfpga_commands.rst +++ b/docs/source/manual/openfpga_shell/openfpga_commands.rst @@ -28,7 +28,7 @@ Setup OpenFPGA .. option:: read_openfpga_arch - Read the XML architecture file required by OpenFPGA + Read the XML file about architecture description (see details in :ref:`arch_generality`) - ``--file`` or ``-f`` Specify the file name @@ -42,6 +42,22 @@ Setup OpenFPGA - ``--verbose`` Show verbose log +.. option:: read_openfpga_simulation_setting + + Read the XML file about simulation settings (see details in :ref:`simulation_setting`) + + - ``--file`` or ``-f`` Specify the file name + + - ``--verbose`` Show verbose log + +.. option:: write_openfpga_simulation_setting + + Write the OpenFPGA XML simulation settings to a file + + - ``--file`` or ``-f`` Specify the file name + + - ``--verbose`` Show verbose log + .. option:: link_openfpga_arch Annotate the OpenFPGA architecture to VPR data base From 1842bf51e1d37bbc077a3fe211665ff465d1795b Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 11 Jun 2020 11:22:47 -0600 Subject: [PATCH 164/180] deploy read_openfpga_simulation_setting in CI on a single test case --- .../configuration_chain_example_script.openfpga | 2 +- .../full_testbench/configuration_chain/config/task.conf | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga index 7492854a2..0cf8a6448 100644 --- a/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/configuration_chain_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_chain/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_chain/config/task.conf index 8318c1dea..9b4921136 100644 --- a/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_chain/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_chain/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml From 068d9943e746c4d830d9d6c6e709f073512f6d87 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 11 Jun 2020 11:41:36 -0600 Subject: [PATCH 165/180] update all the templates and regression test cases with simulation settings --- .../duplicated_grid_pin_example_script.openfpga | 2 +- openfpga_flow/OpenFPGAShellScripts/example_script.openfpga | 2 +- .../fast_configuration_example_script.openfpga | 2 +- .../flatten_routing_example_script.openfpga | 2 +- .../OpenFPGAShellScripts/full_testbench_example_script.openfpga | 2 +- .../generate_fabric_example_script.openfpga | 2 +- .../generate_testbench_example_script.openfpga | 2 +- .../implicit_verilog_example_script.openfpga | 2 +- openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga | 2 +- .../OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga | 2 +- .../tasks/openfpga_shell/behavioral_verilog/config/task.conf | 1 + .../tasks/openfpga_shell/bram/dpram16k/config/task.conf | 1 + .../tasks/openfpga_shell/bram/wide_dpram16k/config/task.conf | 2 +- .../tasks/openfpga_shell/duplicated_grid_pin/config/task.conf | 1 + .../openfpga_shell/fabric_chain/adder_chain/config/task.conf | 1 + .../openfpga_shell/fabric_chain/register_chain/config/task.conf | 1 + .../openfpga_shell/fabric_chain/scan_chain/config/task.conf | 1 + .../openfpga_shell/fixed_simulation_settings/config/task.conf | 1 + .../tasks/openfpga_shell/flatten_routing/config/task.conf | 1 + .../full_testbench/configuration_frame/config/task.conf | 1 + .../full_testbench/fast_configuration_frame/config/task.conf | 1 + .../full_testbench/fast_memory_bank/config/task.conf | 1 + .../full_testbench/flatten_memory/config/task.conf | 1 + .../openfpga_shell/full_testbench/memory_bank/config/task.conf | 1 + .../tasks/openfpga_shell/generate_fabric/config/task.conf | 1 + .../tasks/openfpga_shell/generate_testbench/config/task.conf | 1 + openfpga_flow/tasks/openfpga_shell/hard_adder/config/task.conf | 1 + .../tasks/openfpga_shell/implicit_verilog/config/task.conf | 1 + openfpga_flow/tasks/openfpga_shell/io/aib/config/task.conf | 1 + .../tasks/openfpga_shell/io/multi_io_capacity/config/task.conf | 1 + .../tasks/openfpga_shell/io/reduced_io/config/task.conf | 1 + .../tasks/openfpga_shell/lut_design/frac_lut/config/task.conf | 1 + .../lut_design/intermediate_buffer/config/task.conf | 1 + .../openfpga_shell/lut_design/single_mode/config/task.conf | 1 + .../openfpga_shell/mux_design/local_encoder/config/task.conf | 1 + .../openfpga_shell/mux_design/stdcell_mux2/config/task.conf | 1 + .../openfpga_shell/mux_design/tree_structure/config/task.conf | 1 + .../preconfig_testbench/configuration_chain/config/task.conf | 1 + .../preconfig_testbench/configuration_frame/config/task.conf | 1 + .../preconfig_testbench/flatten_memory/config/task.conf | 1 + .../preconfig_testbench/memory_bank/config/task.conf | 1 + .../tasks/openfpga_shell/sdc_time_unit/config/task.conf | 1 + openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf | 1 + openfpga_flow/tasks/openfpga_shell/untileable/config/task.conf | 1 + 44 files changed, 44 insertions(+), 11 deletions(-) diff --git a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga index 83707cf53..ae729290e 100644 --- a/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/duplicated_grid_pin_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga index 83707cf53..ae729290e 100644 --- a/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga index 56d05257c..fceabcaaa 100644 --- a/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga index fa376dbe3..5ab1c56b6 100644 --- a/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/flatten_routing_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga index 83707cf53..ae729290e 100644 --- a/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/full_testbench_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga index 434c573e1..38ebc9d28 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga index 6fe802168..971f8d374 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_testbench_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga index 021488557..e86ba055e 100644 --- a/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/implicit_verilog_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga index ebd6c217c..dc7af60ae 100644 --- a/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/mcnc_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route --absorb_buffe read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga index 3411f6e87..36c3c88b9 100644 --- a/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/sdc_time_unit_example_script.openfpga @@ -6,7 +6,7 @@ vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} # Read OpenFPGA simulation settings -#read_openfpga_simulation_setting -f OPENFPGA_SIM_SETTING_FILE +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} # Annotate the OpenFPGA architecture to VPR data base # to debug use --verbose options diff --git a/openfpga_flow/tasks/openfpga_shell/behavioral_verilog/config/task.conf b/openfpga_flow/tasks/openfpga_shell/behavioral_verilog/config/task.conf index e11da844f..3693bd3db 100644 --- a/openfpga_flow/tasks/openfpga_shell/behavioral_verilog/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/behavioral_verilog/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/bram/dpram16k/config/task.conf b/openfpga_flow/tasks/openfpga_shell/bram/dpram16k/config/task.conf index 4996f42e2..93e491745 100644 --- a/openfpga_flow/tasks/openfpga_shell/bram/dpram16k/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/bram/dpram16k/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_chain_mem16K_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/bram/wide_dpram16k/config/task.conf b/openfpga_flow/tasks/openfpga_shell/bram/wide_dpram16k/config/task.conf index 5cfc3ce57..3d89335d9 100644 --- a/openfpga_flow/tasks/openfpga_shell/bram/wide_dpram16k/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/bram/wide_dpram16k/config/task.conf @@ -16,7 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml - +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_chain_wide_mem16K_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/duplicated_grid_pin/config/task.conf b/openfpga_flow/tasks/openfpga_shell/duplicated_grid_pin/config/task.conf index f2777f7ee..328203c08 100644 --- a/openfpga_flow/tasks/openfpga_shell/duplicated_grid_pin/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/duplicated_grid_pin/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/fabric_chain/adder_chain/config/task.conf b/openfpga_flow/tasks/openfpga_shell/fabric_chain/adder_chain/config/task.conf index 5e9533e36..4ab0447a3 100644 --- a/openfpga_flow/tasks/openfpga_shell/fabric_chain/adder_chain/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/fabric_chain/adder_chain/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_chain_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/fabric_chain/register_chain/config/task.conf b/openfpga_flow/tasks/openfpga_shell/fabric_chain/register_chain/config/task.conf index 1b76cb3e9..06441b7f3 100644 --- a/openfpga_flow/tasks/openfpga_shell/fabric_chain/register_chain/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/fabric_chain/register_chain/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_register_chain_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/fabric_chain/scan_chain/config/task.conf b/openfpga_flow/tasks/openfpga_shell/fabric_chain/scan_chain/config/task.conf index ac398aa4c..0d1f49c94 100644 --- a/openfpga_flow/tasks/openfpga_shell/fabric_chain/scan_chain/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/fabric_chain/scan_chain/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_register_scan_chain_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/fixed_simulation_settings/config/task.conf b/openfpga_flow/tasks/openfpga_shell/fixed_simulation_settings/config/task.conf index 4875931e3..813aabc03 100644 --- a/openfpga_flow/tasks/openfpga_shell/fixed_simulation_settings/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/fixed_simulation_settings/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/fixed_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/flatten_routing/config/task.conf b/openfpga_flow/tasks/openfpga_shell/flatten_routing/config/task.conf index 2879e95ed..36bdb28bd 100644 --- a/openfpga_flow/tasks/openfpga_shell/flatten_routing/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/flatten_routing/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_frame/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_frame/config/task.conf index 2f5baca4d..e99b9c2ab 100644 --- a/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_frame/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/configuration_frame/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf index 55c98dda1..0a95022d3 100644 --- a/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_configuration_frame/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_memory_bank/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_memory_bank/config/task.conf index 61b3d8b72..eb3aafbd3 100644 --- a/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_memory_bank/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/fast_memory_bank/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/flatten_memory/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/flatten_memory/config/task.conf index d2bf1bb9f..b893a163f 100644 --- a/openfpga_flow/tasks/openfpga_shell/full_testbench/flatten_memory/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/flatten_memory/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/full_testbench/memory_bank/config/task.conf b/openfpga_flow/tasks/openfpga_shell/full_testbench/memory_bank/config/task.conf index b000c0ba6..fadc53968 100644 --- a/openfpga_flow/tasks/openfpga_shell/full_testbench/memory_bank/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/full_testbench/memory_bank/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/generate_fabric/config/task.conf b/openfpga_flow/tasks/openfpga_shell/generate_fabric/config/task.conf index 75bc6c703..077bafbc5 100644 --- a/openfpga_flow/tasks/openfpga_shell/generate_fabric/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/generate_fabric/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/generate_testbench/config/task.conf b/openfpga_flow/tasks/openfpga_shell/generate_testbench/config/task.conf index 9540b767f..02d4fb597 100644 --- a/openfpga_flow/tasks/openfpga_shell/generate_testbench/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/generate_testbench/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/hard_adder/config/task.conf b/openfpga_flow/tasks/openfpga_shell/hard_adder/config/task.conf index c0198598e..2d8c162d0 100644 --- a/openfpga_flow/tasks/openfpga_shell/hard_adder/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/hard_adder/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_chain_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/implicit_verilog/config/task.conf b/openfpga_flow/tasks/openfpga_shell/implicit_verilog/config/task.conf index 4040caee1..36cc8208d 100644 --- a/openfpga_flow/tasks/openfpga_shell/implicit_verilog/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/implicit_verilog/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/io/aib/config/task.conf b/openfpga_flow/tasks/openfpga_shell/io/aib/config/task.conf index 0f4727657..ab8b7849e 100644 --- a/openfpga_flow/tasks/openfpga_shell/io/aib/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/io/aib/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml ##################################### # Debugging status diff --git a/openfpga_flow/tasks/openfpga_shell/io/multi_io_capacity/config/task.conf b/openfpga_flow/tasks/openfpga_shell/io/multi_io_capacity/config/task.conf index 8ae3286c5..c751ed64c 100644 --- a/openfpga_flow/tasks/openfpga_shell/io/multi_io_capacity/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/io/multi_io_capacity/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_chain_mem16K_multi_io_capacity_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/io/reduced_io/config/task.conf b/openfpga_flow/tasks/openfpga_shell/io/reduced_io/config/task.conf index 190acfda7..17b2c8564 100644 --- a/openfpga_flow/tasks/openfpga_shell/io/reduced_io/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/io/reduced_io/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_chain_mem16K_reduced_io_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/lut_design/frac_lut/config/task.conf b/openfpga_flow/tasks/openfpga_shell/lut_design/frac_lut/config/task.conf index 030c0d41e..39bbeb784 100644 --- a/openfpga_flow/tasks/openfpga_shell/lut_design/frac_lut/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/lut_design/frac_lut/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/lut_design/intermediate_buffer/config/task.conf b/openfpga_flow/tasks/openfpga_shell/lut_design/intermediate_buffer/config/task.conf index b2535bd7c..885569b51 100644 --- a/openfpga_flow/tasks/openfpga_shell/lut_design/intermediate_buffer/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/lut_design/intermediate_buffer/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/lut_design/single_mode/config/task.conf b/openfpga_flow/tasks/openfpga_shell/lut_design/single_mode/config/task.conf index 4216a7482..0c735e07f 100644 --- a/openfpga_flow/tasks/openfpga_shell/lut_design/single_mode/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/lut_design/single_mode/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/mux_design/local_encoder/config/task.conf b/openfpga_flow/tasks/openfpga_shell/mux_design/local_encoder/config/task.conf index 76cf4b589..7b48cf6e2 100644 --- a/openfpga_flow/tasks/openfpga_shell/mux_design/local_encoder/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/mux_design/local_encoder/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/mux_design/stdcell_mux2/config/task.conf b/openfpga_flow/tasks/openfpga_shell/mux_design/stdcell_mux2/config/task.conf index 60df151e7..08bebdf04 100644 --- a/openfpga_flow/tasks/openfpga_shell/mux_design/stdcell_mux2/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/mux_design/stdcell_mux2/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/mux_design/tree_structure/config/task.conf b/openfpga_flow/tasks/openfpga_shell/mux_design/tree_structure/config/task.conf index 3f8b56582..48633266c 100644 --- a/openfpga_flow/tasks/openfpga_shell/mux_design/tree_structure/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/mux_design/tree_structure/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_chain/config/task.conf b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_chain/config/task.conf index 3fd340a7b..9c9fc9627 100644 --- a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_chain/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_chain/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_frame/config/task.conf b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_frame/config/task.conf index 4a41fc671..e55a6ea8e 100644 --- a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_frame/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/configuration_frame/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/flatten_memory/config/task.conf b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/flatten_memory/config/task.conf index 1a02eb45f..78d1e818c 100644 --- a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/flatten_memory/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/flatten_memory/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/memory_bank/config/task.conf b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/memory_bank/config/task.conf index 75579406c..c9505c1d5 100644 --- a/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/memory_bank/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/preconfig_testbench/memory_bank/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf b/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf index 332020fab..11cd98766 100644 --- a/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/sdc_time_unit/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf b/openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf index b42e17287..d7d55eb62 100644 --- a/openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/spypad/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_adder_register_scan_chain_depop50_spypad_40nm.xml diff --git a/openfpga_flow/tasks/openfpga_shell/untileable/config/task.conf b/openfpga_flow/tasks/openfpga_shell/untileable/config/task.conf index 7dcf88915..a7e1939ed 100644 --- a/openfpga_flow/tasks/openfpga_shell/untileable/config/task.conf +++ b/openfpga_flow/tasks/openfpga_shell/untileable/config/task.conf @@ -16,6 +16,7 @@ verilog_output=true timeout_each_job = 20*60 fpga_flow=vpr_blif openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml [ARCHITECTURES] arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_40nm.xml From 58807bfcb3227e67e7744291a3b2db61570d0439 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 11 Jun 2020 11:58:18 -0600 Subject: [PATCH 166/180] remove simulation settings from openfpga arch data structure --- libopenfpga/libarchopenfpga/src/openfpga_arch.h | 3 --- libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp | 6 ------ libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp | 3 --- openfpga/src/base/openfpga_link_arch.cpp | 2 +- openfpga/src/base/openfpga_setup_command.cpp | 2 +- 5 files changed, 2 insertions(+), 14 deletions(-) diff --git a/libopenfpga/libarchopenfpga/src/openfpga_arch.h b/libopenfpga/libarchopenfpga/src/openfpga_arch.h index a3dd71a12..33d8f1b6c 100644 --- a/libopenfpga/libarchopenfpga/src/openfpga_arch.h +++ b/libopenfpga/libarchopenfpga/src/openfpga_arch.h @@ -29,9 +29,6 @@ struct Arch { /* Technology devices */ TechnologyLibrary tech_lib; - /* Simulation settings */ - SimulationSetting sim_setting; - /* Configuration protocol settings */ ConfigProtocol config_protocol; diff --git a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp index 031946346..1d5f23e9e 100644 --- a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp +++ b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp @@ -100,12 +100,6 @@ openfpga::Arch read_xml_openfpga_arch(const char* arch_file_name) { /* Parse the pb_type annotation */ openfpga_arch.pb_type_annotations = read_xml_pb_type_annotations(xml_openfpga_arch, loc_data); - /* Second node should be */ - auto xml_simulation_settings = get_single_child(doc, "openfpga_simulation_setting", loc_data); - - /* Parse simulation settings to data structure */ - openfpga_arch.sim_setting = read_xml_simulation_setting(xml_simulation_settings, loc_data); - } catch (pugiutil::XmlError& e) { archfpga_throw(arch_file_name, e.line(), "%s", e.what()); diff --git a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp index 468924ad2..2c5134d4e 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp +++ b/libopenfpga/libarchopenfpga/src/write_xml_openfpga_arch.cpp @@ -63,9 +63,6 @@ void write_xml_openfpga_arch(const char* fname, fp << "" << "\n"; - /* Write the simulation */ - write_xml_simulation_setting(fp, fname, openfpga_arch.sim_setting); - /* Close the file stream */ fp.close(); } diff --git a/openfpga/src/base/openfpga_link_arch.cpp b/openfpga/src/base/openfpga_link_arch.cpp index c67619caa..af75ff6a2 100644 --- a/openfpga/src/base/openfpga_link_arch.cpp +++ b/openfpga/src/base/openfpga_link_arch.cpp @@ -150,7 +150,7 @@ int link_arch(OpenfpgaContext& openfpga_ctx, /* OVERWRITE the simulation setting in openfpga context from the arch * TODO: This will be removed when openfpga flow is updated */ - openfpga_ctx.mutable_simulation_setting() = openfpga_ctx.mutable_arch().sim_setting; + //openfpga_ctx.mutable_simulation_setting() = openfpga_ctx.mutable_arch().sim_setting; annotate_simulation_setting(g_vpr_ctx.atom(), openfpga_ctx.net_activity(), openfpga_ctx.mutable_simulation_setting()); diff --git a/openfpga/src/base/openfpga_setup_command.cpp b/openfpga/src/base/openfpga_setup_command.cpp index e9d759b1f..bf2412a6f 100644 --- a/openfpga/src/base/openfpga_setup_command.cpp +++ b/openfpga/src/base/openfpga_setup_command.cpp @@ -366,8 +366,8 @@ void add_openfpga_setup_commands(openfpga::Shell& shell) { std::vector link_arch_dependent_cmds; link_arch_dependent_cmds.push_back(read_arch_cmd_id); /* TODO: This will be uncommented when openfpga flow script is updated - * link_arch_dependent_cmds.push_back(read_sim_setting_cmd_id); */ + link_arch_dependent_cmds.push_back(read_sim_setting_cmd_id); link_arch_dependent_cmds.push_back(vpr_cmd_id); ShellCommandId link_arch_cmd_id = add_openfpga_link_arch_command(shell, openfpga_setup_cmd_class, From 60dd37e08603c5a863651a35ca4aac2037885dcc Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 11 Jun 2020 12:05:12 -0600 Subject: [PATCH 167/180] remove simulation settings from openfpga arch XML update travis to split CI tests fix errors in travis configuration fixing travis errors in scripts keep fixing travis fix travis on build.sh bug fixing in travis CI bug fix in travis regression test run fixing bugs in the travis scripts bug fix in travis script: remove common.sh in regression test call keep bug fixing in travis --- .travis.yml | 180 +++++++++--------- .travis/build.sh | 17 ++ .travis/install.sh | 25 +-- .travis/openfpga_vpr7_reg_test.sh | 30 +++ .../{script.sh => openfpga_vpr8_reg_test.sh} | 39 +--- .../k4_N4_40nm_bank_openfpga.xml | 33 ---- .../openfpga_arch/k4_N4_40nm_cc_openfpga.xml | 33 ---- .../k4_N4_40nm_fixed_sim_openfpga.xml | 33 ---- .../k4_N4_40nm_frame_openfpga.xml | 33 ---- .../k4_N4_40nm_standalone_openfpga.xml | 33 ---- .../openfpga_arch/k6_N10_40nm_openfpga.xml | 33 ---- ..._N10_intermediate_buffer_40nm_openfpga.xml | 33 ---- .../k6_frac_N10_40nm_openfpga.xml | 34 ---- .../k6_frac_N10_adder_chain_40nm_openfpga.xml | 34 ---- ...c_N10_adder_chain_mem16K_40nm_openfpga.xml | 34 ---- ...0_adder_chain_mem16K_aib_40nm_openfpga.xml | 34 ---- ...c_N10_adder_column_chain_40nm_openfpga.xml | 34 ---- ...N10_adder_register_chain_40nm_openfpga.xml | 34 ---- ...dder_register_scan_chain_40nm_openfpga.xml | 34 ---- ...ister_scan_chain_depop50_40nm_openfpga.xml | 34 ---- ...can_chain_depop50_spypad_40nm_openfpga.xml | 34 ---- .../k6_frac_N10_behavioral_40nm_openfpga.xml | 34 ---- ...6_frac_N10_local_encoder_40nm_openfpga.xml | 34 ---- .../k6_frac_N10_spyio_40nm_openfpga.xml | 34 ---- .../k6_frac_N10_stdcell_mux_40nm_openfpga.xml | 34 ---- .../k6_frac_N10_tree_mux_40nm_openfpga.xml | 34 ---- 26 files changed, 148 insertions(+), 850 deletions(-) create mode 100644 .travis/build.sh create mode 100755 .travis/openfpga_vpr7_reg_test.sh rename .travis/{script.sh => openfpga_vpr8_reg_test.sh} (82%) diff --git a/.travis.yml b/.travis.yml index 0b5ce92fb..13b89c162 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,105 +14,99 @@ cache: # Currently sudo is not required, NO ENV is used # Supported Operating systems -#os: -# - linux -# - osx -# Create a matrix to branch the building environment -matrix: - include: - - os: linux - # Compiler is specified in ./travis/common.sh - sudo: false - dist: bionic - compiler: g++-8 - addons: - apt: - sources: - - ubuntu-toolchain-r-test # For newer GCC - - llvm_toolchain-trusty-7 - packages: - - autoconf - - automake - - bash - - bison - - build-essential - - cmake - - ctags - - curl - - doxygen - - flex - - fontconfig - - g++-8 - - gcc-8 - - gdb - - git - - gperf - - iverilog - - libcairo2-dev - - libevent-dev - - libfontconfig1-dev - - liblist-moreutils-perl - - libncurses5-dev - - libx11-dev - - libxft-dev - - libxml++2.6-dev - - perl - - python - - python-lxml - - texinfo - - time - - valgrind - - zip - - qt5-default - - clang-format-7 -# - os: osx -# osx_image: xcode10.2 # we target latest MacOS Mojave -# sudo: true -# compiler: gcc-4.9 # Use clang instead of gcc in MacOS -# addons: -# homebrew: -# packages: -# - bison -# - cmake -# - ctags -# - flex -# - fontconfig -# - git -# - gcc@6 -# - gcc@4.9 -# - gawk -# - icarus-verilog -# - libxml++ -# - qt5 +dist: bionic +compiler: g++-8 +addons: + apt: + sources: + - ubuntu-toolchain-r-test # For newer GCC + - llvm_toolchain-trusty-7 + packages: + - autoconf + - automake + - bash + - bison + - build-essential + - cmake + - ctags + - curl + - doxygen + - flex + - fontconfig + - g++-8 + - gcc-8 + - gdb + - git + - gperf + - iverilog + - libcairo2-dev + - libevent-dev + - libfontconfig1-dev + - liblist-moreutils-perl + - libncurses5-dev + - libx11-dev + - libxft-dev + - libxml++2.6-dev + - perl + - python + - python-lxml + - texinfo + - time + - valgrind + - zip + - qt5-default + - clang-format-7 +#- os: osx +# osx_image: xcode10.2 # we target latest MacOS Mojave +# sudo: true +# compiler: gcc-4.9 # Use clang instead of gcc in MacOS +# addons: +# homebrew: +# packages: +# - bison +# - cmake +# - ctags +# - flex +# - fontconfig +# - git +# - gcc@6 +# - gcc@4.9 +# - gawk +# - icarus-verilog +# - libxml++ +# - qt5 -before_install: +before_script: - source .travis/common.sh - -install: - - DEPS_DIR="${HOME}/deps" - - mkdir -p ${DEPS_DIR} && cd ${DEPS_DIR} - - | - if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then - CMAKE_URL="https://cmake.org/files/v3.16/cmake-3.16.3-Linux-x86_64.tar.gz" - mkdir -p cmake && travis_retry wget --no-clobber --no-check-certificate --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake - export PATH=${DEPS_DIR}/cmake/bin:${PATH} - echo ${PATH} - else - brew install cmake || brew upgrade cmake - fi - - cmake --version - - cd - - source .travis/install.sh +stages: + - name: Test + if: type != cron + +jobs: + include: + - stage: Test + name: "OpenFPGA + VPR7 regression tests" + script: + - source .travis/build.sh + - source .travis/openfpga_vpr7_reg_test.sh + + - stage: Test + name: "OpenFPGA + VPR8 regression tests" + script: + - source .travis/build.sh + - source .travis/openfpga_vpr8_reg_test.sh + +#after_failure: +# - .travis/after_failure.sh + +#after_success: +# - .travis/after_success.sh + script: - - .travis/script.sh - #- .travis/regression.sh + - true -after_failure: - - .travis/after_failure.sh - -after_success: - - .travis/after_success.sh notifications: slack: secure: L8tzicFh+EKcK21GBA2m3rQ3jmnDdqiRXIZcb0iqYlhT0V5asYvCqwlpPDUDV1wmBXqPgRJBI/jitAJlKFWu74pLTVc6FscUIDYM7S0DJfHEcufLknZx88lMmmV0IsYLQe3/s89tWoudMf1bNBo/8YWzLDffqUQ7s/rTPD9SWLppb01X0Xm158oDlA0rWETs35nuNFgJxWcSyIyIvnRNE3dHjzmBETUR9mYDsUSYlcOI44FMD8rE6emicdkqdn1zVxScobrl4Dt2bPsMfKopgIKK1x+38AuaqQa7t5F5ICnF0WfxmQ6/TcRNwIij0fDu68w/fcU8SyV+Ex5aZBKYUU7PG7ELTOq+q1geDoTlbguvFSIT4EzqErc4hbJmcUn79BKLhdjshZtGihKatntJx2faXYNYGFjwmnPFRYpqsozydztgMjzv4prZ5yoh7jhoDiGj44QcpXlQ9otM17JdfqveowMLHBYzATsxIRG93irZfXG/E3S8FvXg8mYOIEn8UK7H6i8VWL3JHlw8RbpLdNLswZOUlpEaDAeTm5tvYcw7FGH2nlZ2e5aXLxN6dTovSSRztQHbWdJTGG0N+xldBXcCiChmok4nXGReIkMc+99nZjRsiCB0R16tCNb25/p7NAVkItfVe1qRTzdnhi1hdE7LPURK4kxoFRJ6sFVuYjw= diff --git a/.travis/build.sh b/.travis/build.sh new file mode 100644 index 000000000..d7d2fcef9 --- /dev/null +++ b/.travis/build.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +source .travis/common.sh +set -e + +start_section "OpenFPGA.build" "${GREEN}Building..${NC}" +cd ${TRAVIS_BUILD_DIR} +mkdir build +cd build + +if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + cmake .. -DCMAKE_BUILD_TYPE=debug -DENABLE_VPR_GRAPHICS=off +else + cmake .. -DCMAKE_BUILD_TYPE=debug +fi + make -j16 +end_section "OpenFPGA.build" diff --git a/.travis/install.sh b/.travis/install.sh index 46d535342..23841212d 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -4,18 +4,19 @@ source .travis/common.sh set -e ## Install necessary package which is not available on Travis CI -#export DEPS_DIR="${HOME}/deps" -#mkdir -p ${DEPS_DIR} && cd ${DEPS_DIR} -## Install CMake -#if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then -# export CMAKE_URL="https://cmake.org/files/v3.13/cmake-3.13.0-rc3-Linux-x86_64.tar.gz" -# mkdir -p cmake && travis_retry wget --no-check-certificate --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake -# export PATH=${DEPS_DIR}/cmake/bin:${PATH} -# echo ${PATH} -#else -# brew install cmake || brew upgrade cmake -#fi -# cmake --version +export DEPS_DIR="${HOME}/deps" +mkdir -p ${DEPS_DIR} && cd ${DEPS_DIR} +# Install CMake +if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then + export CMAKE_URL="https://cmake.org/files/v3.16/cmake-3.16.3-Linux-x86_64.tar.gz" + mkdir -p cmake && travis_retry wget --no-check-certificate --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake + export PATH=${DEPS_DIR}/cmake/bin:${PATH} + echo ${PATH} +else + brew install cmake || brew upgrade cmake +fi +cmake --version +cd - # ## Install latest iVerilog. Since no deb is provided, compile from source codes #if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then diff --git a/.travis/openfpga_vpr7_reg_test.sh b/.travis/openfpga_vpr7_reg_test.sh new file mode 100755 index 000000000..c04d202a4 --- /dev/null +++ b/.travis/openfpga_vpr7_reg_test.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -e + +start_section "OpenFPGA+VPR7.TaskTun" "${GREEN}..Running_Regression..${NC}" +cd ${TRAVIS_BUILD_DIR} + +############################################### +# OpenFPGA with VPR7 +# TO BE DEPRECATED +############################################## +echo -e "Testing single-mode architectures"; +python3 openfpga_flow/scripts/run_fpga_task.py single_mode --debug --show_thread_logs +#python3 openfpga_flow/scripts/run_fpga_task.py s298 + +echo -e "Testing multi-mode architectures"; +python3 openfpga_flow/scripts/run_fpga_task.py multi_mode --maxthreads 4 --debug --show_thread_logs + +echo -e "Testing compact routing techniques"; +python3 openfpga_flow/scripts/run_fpga_task.py compact_routing --debug --show_thread_logs + +echo -e "Testing tileable architectures"; +python3 openfpga_flow/scripts/run_fpga_task.py tileable_routing --debug --show_thread_logs + +echo -e "Testing Verilog generation with explicit port mapping "; +python3 openfpga_flow/scripts/run_fpga_task.py explicit_verilog --debug --show_thread_logs + +echo -e "Testing Verilog generation with grid pin duplication "; +python3 openfpga_flow/scripts/run_fpga_task.py duplicate_grid_pin --debug --show_thread_logs + +end_section "OpenFPGA+VPR7.TaskTun" diff --git a/.travis/script.sh b/.travis/openfpga_vpr8_reg_test.sh similarity index 82% rename from .travis/script.sh rename to .travis/openfpga_vpr8_reg_test.sh index 907e1a3cf..046f8210f 100755 --- a/.travis/script.sh +++ b/.travis/openfpga_vpr8_reg_test.sh @@ -1,46 +1,9 @@ #!/bin/bash -source .travis/common.sh set -e -start_section "OpenFPGA.build" "${GREEN}Building..${NC}" -mkdir build -cd build - -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then - cmake .. -DCMAKE_BUILD_TYPE=debug -DENABLE_VPR_GRAPHICS=off -else - cmake .. -DCMAKE_BUILD_TYPE=debug -fi - make -j16 -end_section "OpenFPGA.build" - - start_section "OpenFPGA.TaskTun" "${GREEN}..Running_Regression..${NC}" -cd - - -############################################### -# OpenFPGA with VPR7 -# TO BE DEPRECATED -############################################## -echo -e "Testing single-mode architectures"; -python3 openfpga_flow/scripts/run_fpga_task.py single_mode --debug --show_thread_logs -#python3 openfpga_flow/scripts/run_fpga_task.py s298 - -echo -e "Testing multi-mode architectures"; -python3 openfpga_flow/scripts/run_fpga_task.py multi_mode --maxthreads 4 --debug --show_thread_logs - -echo -e "Testing compact routing techniques"; -python3 openfpga_flow/scripts/run_fpga_task.py compact_routing --debug --show_thread_logs - -echo -e "Testing tileable architectures"; -python3 openfpga_flow/scripts/run_fpga_task.py tileable_routing --debug --show_thread_logs - -echo -e "Testing Verilog generation with explicit port mapping "; -python3 openfpga_flow/scripts/run_fpga_task.py explicit_verilog --debug --show_thread_logs - -echo -e "Testing Verilog generation with grid pin duplication "; -python3 openfpga_flow/scripts/run_fpga_task.py duplicate_grid_pin --debug --show_thread_logs +cd ${TRAVIS_BUILD_DIR} ############################################### # OpenFPGA Shell with VPR8 diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml index fe7d3f1b8..14a7881ef 100644 --- a/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml @@ -193,36 +193,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml index 298e0c0c0..13eb292b0 100644 --- a/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml @@ -193,36 +193,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml index 677061785..13eb292b0 100644 --- a/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml @@ -193,36 +193,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml index a0e0194b5..da2322044 100644 --- a/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml @@ -194,36 +194,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml index fc97f75c1..05b096a03 100644 --- a/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml @@ -194,36 +194,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml index e6e53d9f6..9512672a9 100644 --- a/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml @@ -193,36 +193,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml index b211bd040..2127c0b3c 100644 --- a/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml @@ -194,36 +194,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml index 9b20ab2a2..222d0d3e6 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml @@ -224,37 +224,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml index 10051a9ca..be9bd0d3b 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml @@ -249,37 +249,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml index 40a451b55..6dfb6ac71 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml @@ -266,37 +266,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml index 9e608ead9..81dfd17ce 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml @@ -278,37 +278,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml index 79b82375f..9a5d94056 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml @@ -249,37 +249,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml index 33cfa9e61..d2cb8a163 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml @@ -252,37 +252,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml index 460c8743e..129e11f71 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml @@ -258,37 +258,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml index 4bb4a24a2..f22ec1fc9 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml @@ -253,37 +253,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml index e1dde16b6..650e30a6b 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml @@ -337,37 +337,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml index ebad2d203..2d6a765d0 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml @@ -224,37 +224,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml index b32deb8a9..b351666a7 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml @@ -224,37 +224,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml index c980065bb..94c8f9fb8 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml @@ -228,37 +228,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml index 2b42cdced..794f10d4f 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml @@ -216,37 +216,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml index c26c30f31..e9081fa86 100644 --- a/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml +++ b/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml @@ -215,37 +215,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From aaa52b6e89241645feec6d4cb35ea708e73d0d1a Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 11 Jun 2020 18:33:47 -0600 Subject: [PATCH 168/180] start using multiple jobs in travis CI --- .travis/build.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis/build.sh b/.travis/build.sh index d7d2fcef9..254133177 100644 --- a/.travis/build.sh +++ b/.travis/build.sh @@ -13,5 +13,9 @@ if [[ $TRAVIS_OS_NAME == 'osx' ]]; then else cmake .. -DCMAKE_BUILD_TYPE=debug fi - make -j16 +make -j16 + +# Return to upper directory +cd ${TRAVIS_BUILD_DIR} + end_section "OpenFPGA.build" From 8a4ec85c39b38e2de2e3c6060cf2bc2969d0f1d8 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 11 Jun 2020 21:44:25 -0600 Subject: [PATCH 169/180] add configurable children-related methods to module manager --- openfpga/src/fabric/module_manager.cpp | 22 ++++++++++++++++++++++ openfpga/src/fabric/module_manager.h | 12 ++++++++++++ 2 files changed, 34 insertions(+) diff --git a/openfpga/src/fabric/module_manager.cpp b/openfpga/src/fabric/module_manager.cpp index d03af54b0..3f5cfdbfb 100644 --- a/openfpga/src/fabric/module_manager.cpp +++ b/openfpga/src/fabric/module_manager.cpp @@ -626,6 +626,18 @@ void ModuleManager::add_configurable_child(const ModuleId& parent_module, configurable_child_instances_[parent_module].push_back(child_instance); } +void ModuleManager::reserve_configurable_child(const ModuleId& parent_module, + const size_t& num_children) { + VTR_ASSERT ( valid_module_id(parent_module) ); + /* Do reserve when the number of children is larger than current size of lists */ + if (num_children > configurable_children_[parent_module].size()) { + configurable_children_[parent_module].reserve(num_children); + } + if (num_children > configurable_child_instances_[parent_module].size()) { + configurable_child_instances_[parent_module].reserve(num_children); + } +} + /* Add a net to the connection graph of the module */ ModuleNetId ModuleManager::create_module_net(const ModuleId& module) { /* Validate the module id */ @@ -741,6 +753,16 @@ ModuleNetSinkId ModuleManager::add_module_net_sink(const ModuleId& module, const return net_sink; } +/****************************************************************************** + * Public Deconstructor + ******************************************************************************/ +void ModuleManager::clear_configurable_children(const ModuleId& parent_module) { + VTR_ASSERT(valid_module_id(parent_module)); + + configurable_children_[parent_module].clear(); + configurable_child_instances_[parent_module].clear(); +} + /****************************************************************************** * Private validators/invalidators ******************************************************************************/ diff --git a/openfpga/src/fabric/module_manager.h b/openfpga/src/fabric/module_manager.h index cd79bde8c..ee06f1415 100644 --- a/openfpga/src/fabric/module_manager.h +++ b/openfpga/src/fabric/module_manager.h @@ -156,6 +156,11 @@ class ModuleManager { void set_child_instance_name(const ModuleId& parent_module, const ModuleId& child_module, const size_t& instance_id, const std::string& instance_name); /* Add a configurable child module to module */ void add_configurable_child(const ModuleId& module, const ModuleId& child_module, const size_t& child_instance); + /* Reserved a number of configurable children + * for memory efficiency + */ + void reserve_configurable_child(const ModuleId& module, const size_t& num_children); + /* Add a net to the connection graph of the module */ ModuleNetId create_module_net(const ModuleId& module); /* Set the name of net */ @@ -169,6 +174,13 @@ class ModuleManager { ModuleNetSinkId add_module_net_sink(const ModuleId& module, const ModuleNetId& net, const ModuleId& sink_module, const size_t& instance_id, const ModulePortId& sink_port, const size_t& sink_pin); + public: /* Public deconstructors */ + /* This is a strong function which will remove all the configurable children + * under a given parent module + * It is mainly used by loading fabric keys + * Do NOT use unless you know what you are doing!!! + */ + void clear_configurable_children(const ModuleId& parent_module); public: /* Public validators/invalidators */ bool valid_module_id(const ModuleId& module) const; bool valid_module_port_id(const ModuleId& module, const ModulePortId& port) const; From 9167b288b68e70eeb1143529598189eb4ca552ad Mon Sep 17 00:00:00 2001 From: tangxifan Date: Thu, 11 Jun 2020 21:50:46 -0600 Subject: [PATCH 170/180] add options for fabric key --- openfpga/src/base/openfpga_setup_command.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/openfpga/src/base/openfpga_setup_command.cpp b/openfpga/src/base/openfpga_setup_command.cpp index bf2412a6f..5d50614ac 100644 --- a/openfpga/src/base/openfpga_setup_command.cpp +++ b/openfpga/src/base/openfpga_setup_command.cpp @@ -273,6 +273,17 @@ ShellCommandId add_openfpga_build_fabric_command(openfpga::Shell Date: Thu, 11 Jun 2020 23:59:24 -0600 Subject: [PATCH 171/180] bug fix for 'build_fabric' command --- openfpga/src/base/openfpga_setup_command.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openfpga/src/base/openfpga_setup_command.cpp b/openfpga/src/base/openfpga_setup_command.cpp index 5d50614ac..ca5864b2e 100644 --- a/openfpga/src/base/openfpga_setup_command.cpp +++ b/openfpga/src/base/openfpga_setup_command.cpp @@ -274,11 +274,11 @@ ShellCommandId add_openfpga_build_fabric_command(openfpga::Shell Date: Fri, 12 Jun 2020 00:07:04 -0600 Subject: [PATCH 172/180] add fabric key library --- libopenfpga/CMakeLists.txt | 1 + .../libarchopenfpga/src/write_xml_utils.cpp | 15 ++++ .../libarchopenfpga/src/write_xml_utils.h | 4 + libopenfpga/libfabrickey/CMakeLists.txt | 35 ++++++++ .../libfabrickey/key_examples/key_example.xml | 7 ++ libopenfpga/libfabrickey/src/fabric_key.cpp | 82 +++++++++++++++++ libopenfpga/libfabrickey/src/fabric_key.h | 59 +++++++++++++ libopenfpga/libfabrickey/src/fabric_key_fwd.h | 22 +++++ .../libfabrickey/src/read_xml_fabric_key.cpp | 88 +++++++++++++++++++ .../libfabrickey/src/read_xml_fabric_key.h | 16 ++++ .../libfabrickey/src/write_xml_fabric_key.cpp | 69 +++++++++++++++ .../libfabrickey/src/write_xml_fabric_key.h | 16 ++++ .../libfabrickey/test/test_fabric_key.cpp | 34 +++++++ 13 files changed, 448 insertions(+) create mode 100644 libopenfpga/libfabrickey/CMakeLists.txt create mode 100644 libopenfpga/libfabrickey/key_examples/key_example.xml create mode 100644 libopenfpga/libfabrickey/src/fabric_key.cpp create mode 100644 libopenfpga/libfabrickey/src/fabric_key.h create mode 100644 libopenfpga/libfabrickey/src/fabric_key_fwd.h create mode 100644 libopenfpga/libfabrickey/src/read_xml_fabric_key.cpp create mode 100644 libopenfpga/libfabrickey/src/read_xml_fabric_key.h create mode 100644 libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp create mode 100644 libopenfpga/libfabrickey/src/write_xml_fabric_key.h create mode 100644 libopenfpga/libfabrickey/test/test_fabric_key.cpp diff --git a/libopenfpga/CMakeLists.txt b/libopenfpga/CMakeLists.txt index 00cf0acf0..ec3299198 100644 --- a/libopenfpga/CMakeLists.txt +++ b/libopenfpga/CMakeLists.txt @@ -3,3 +3,4 @@ add_subdirectory(libini) add_subdirectory(libopenfpgashell) add_subdirectory(libarchopenfpga) add_subdirectory(libopenfpgautil) +add_subdirectory(libfabrickey) diff --git a/libopenfpga/libarchopenfpga/src/write_xml_utils.cpp b/libopenfpga/libarchopenfpga/src/write_xml_utils.cpp index e4d32e720..a416203ee 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_utils.cpp +++ b/libopenfpga/libarchopenfpga/src/write_xml_utils.cpp @@ -61,6 +61,21 @@ void write_xml_attribute(std::fstream& fp, fp << "\""; } +/******************************************************************** + * A most utilized function to write an XML attribute to file + * This accepts the value as a size_t + *******************************************************************/ +void write_xml_attribute(std::fstream& fp, + const char* attr, + const size_t& value) { + /* Validate the file stream */ + openfpga::valid_file_stream(fp); + + fp << " " << attr << "=\""; + fp << value; + fp << "\""; +} + /******************************************************************** * A most utilized function to write an XML attribute to file * This accepts the value as a float diff --git a/libopenfpga/libarchopenfpga/src/write_xml_utils.h b/libopenfpga/libarchopenfpga/src/write_xml_utils.h index 3976d78b9..b54caf6db 100644 --- a/libopenfpga/libarchopenfpga/src/write_xml_utils.h +++ b/libopenfpga/libarchopenfpga/src/write_xml_utils.h @@ -26,4 +26,8 @@ void write_xml_attribute(std::fstream& fp, const char* attr, const float& value); +void write_xml_attribute(std::fstream& fp, + const char* attr, + const size_t& value); + #endif diff --git a/libopenfpga/libfabrickey/CMakeLists.txt b/libopenfpga/libfabrickey/CMakeLists.txt new file mode 100644 index 000000000..db52b510e --- /dev/null +++ b/libopenfpga/libfabrickey/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 3.9) + +project("libfabrickey") + +file(GLOB_RECURSE EXEC_SOURCES test/*.cpp) +file(GLOB_RECURSE LIB_SOURCES src/*.cpp) +file(GLOB_RECURSE LIB_HEADERS src/*.h) +files_to_dirs(LIB_HEADERS LIB_INCLUDE_DIRS) + +#Remove test executable from library +list(REMOVE_ITEM LIB_SOURCES ${EXEC_SOURCES}) + +#Create the library +add_library(libfabrickey STATIC + ${LIB_HEADERS} + ${LIB_SOURCES}) +target_include_directories(libfabrickey PUBLIC ${LIB_INCLUDE_DIRS}) +set_target_properties(libfabrickey PROPERTIES PREFIX "") #Avoid extra 'lib' prefix + +#Specify link-time dependancies +target_link_libraries(libfabrickey + libopenfpgautil + libarchopenfpga + libvtrutil + libpugixml + libpugiutil) + +#Create the test executable +foreach(testsourcefile ${EXEC_SOURCES}) + # Use a simple string replace, to cut off .cpp. + get_filename_component(testname ${testsourcefile} NAME_WE) + add_executable(${testname} ${testsourcefile}) + # Make sure the library is linked to each test executable + target_link_libraries(${testname} libfabrickey) +endforeach(testsourcefile ${EXEC_SOURCES}) diff --git a/libopenfpga/libfabrickey/key_examples/key_example.xml b/libopenfpga/libfabrickey/key_examples/key_example.xml new file mode 100644 index 000000000..49140b6e0 --- /dev/null +++ b/libopenfpga/libfabrickey/key_examples/key_example.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/libopenfpga/libfabrickey/src/fabric_key.cpp b/libopenfpga/libfabrickey/src/fabric_key.cpp new file mode 100644 index 000000000..187150800 --- /dev/null +++ b/libopenfpga/libfabrickey/src/fabric_key.cpp @@ -0,0 +1,82 @@ +#include "vtr_assert.h" + +#include "fabric_key.h" + +/************************************************************************ + * Member functions for class FabricKey + ***********************************************************************/ + +/************************************************************************ + * Constructors + ***********************************************************************/ +FabricKey::FabricKey() { + return; +} + +/************************************************************************ + * Public Accessors : aggregates + ***********************************************************************/ +FabricKey::fabric_key_range FabricKey::keys() const { + return vtr::make_range(key_ids_.begin(), key_ids_.end()); +} + +/************************************************************************ + * Public Accessors : Basic data query + ***********************************************************************/ +/* Access the name of a key */ +std::string FabricKey::key_name(const FabricKeyId& key_id) const { + /* validate the key_id */ + VTR_ASSERT(valid_key_id(key_id)); + return key_names_[key_id]; +} + +/* Access the value of a key */ +size_t FabricKey::key_value(const FabricKeyId& key_id) const { + /* validate the key_id */ + VTR_ASSERT(valid_key_id(key_id)); + return key_values_[key_id]; +} + +/************************************************************************ + * Public Mutators + ***********************************************************************/ +void FabricKey::reserve_keys(const size_t& num_keys) { + key_ids_.reserve(num_keys); + key_names_.reserve(num_keys); + key_values_.reserve(num_keys); +} + +/* Create a new key and add it to the library, return an id */ +FabricKeyId FabricKey::create_key() { + /* Create a new id */ + FabricKeyId key = FabricKeyId(key_ids_.size()); + key_ids_.push_back(key); + key_names_.emplace_back(); + key_values_.emplace_back(); + + return key; +} + +void FabricKey::set_key_name(const FabricKeyId& key_id, + const std::string& name) { + /* validate the key_id */ + VTR_ASSERT(valid_key_id(key_id)); + + key_names_[key_id] = name; +} + +void FabricKey::set_key_value(const FabricKeyId& key_id, + const size_t& value) { + /* validate the key_id */ + VTR_ASSERT(valid_key_id(key_id)); + + key_values_[key_id] = value; +} + +/************************************************************************ + * Internal invalidators/validators + ***********************************************************************/ +/* Validators */ +bool FabricKey::valid_key_id(const FabricKeyId& key_id) const { + return ( size_t(key_id) < key_ids_.size() ) && ( key_id == key_ids_[key_id] ); +} diff --git a/libopenfpga/libfabrickey/src/fabric_key.h b/libopenfpga/libfabrickey/src/fabric_key.h new file mode 100644 index 000000000..7488923df --- /dev/null +++ b/libopenfpga/libfabrickey/src/fabric_key.h @@ -0,0 +1,59 @@ +#ifndef FABRIC_KEY_H +#define FABRIC_KEY_H + +/******************************************************************** + * This file include the declaration of fabric key + *******************************************************************/ +#include +#include +#include + +/* Headers from vtrutil library */ +#include "vtr_vector.h" + +#include "fabric_key_fwd.h" + +/******************************************************************** + * A data structure to describe a secure key for fabric organization + * + * Typical usage: + * -------------- + * // Create an empty fabric key + * FabricKey fabric_key; + * // Add a key with name and value + * FabricKeyId key = fabic_key.create_key(key_name, key_value); + * + *******************************************************************/ +class FabricKey { + public: /* Types */ + typedef vtr::vector::const_iterator fabric_key_iterator; + /* Create range */ + typedef vtr::Range fabric_key_range; + public: /* Constructors */ + FabricKey(); + public: /* Accessors: aggregates */ + fabric_key_range keys() const; + public: /* Public Accessors: Basic data query */ + std::string key_name(const FabricKeyId& key_id) const; + size_t key_value(const FabricKeyId& key_id) const; + public: /* Public Mutators: model-related */ + void reserve_keys(const size_t& num_keys); + FabricKeyId create_key(); + void set_key_name(const FabricKeyId& key_id, + const std::string& name); + void set_key_value(const FabricKeyId& key_id, + const size_t& value); + public: /* Public invalidators/validators */ + bool valid_key_id(const FabricKeyId& key_id) const; + private: /* Internal data */ + /* Unique ids for each key */ + vtr::vector key_ids_; + + /* Names for each key */ + vtr::vector key_names_; + + /* Values for each key */ + vtr::vector key_values_; +}; + +#endif diff --git a/libopenfpga/libfabrickey/src/fabric_key_fwd.h b/libopenfpga/libfabrickey/src/fabric_key_fwd.h new file mode 100644 index 000000000..523eaeab8 --- /dev/null +++ b/libopenfpga/libfabrickey/src/fabric_key_fwd.h @@ -0,0 +1,22 @@ +/************************************************************************ + * A header file for FabricKey class, including critical data declaration + * Please include this file only for using any TechnologyLibrary data structure + * Refer to fabric_key.h for more details + ***********************************************************************/ + +/************************************************************************ + * Create strong id for FabricKey to avoid illegal type casting + ***********************************************************************/ +#ifndef FABRIC_KEY_FWD_H +#define FABRIC_KEY_FWD_H + +#include "vtr_strong_id.h" + +struct fabric_key_id_tag; + +typedef vtr::StrongId FabricKeyId; + +/* Short declaration of class */ +class FabricKey; + +#endif diff --git a/libopenfpga/libfabrickey/src/read_xml_fabric_key.cpp b/libopenfpga/libfabrickey/src/read_xml_fabric_key.cpp new file mode 100644 index 000000000..8b1f03f11 --- /dev/null +++ b/libopenfpga/libfabrickey/src/read_xml_fabric_key.cpp @@ -0,0 +1,88 @@ +/******************************************************************** + * This file includes the top-level function of this library + * which reads an XML of a fabric key to the associated + * data structures + *******************************************************************/ +#include + +/* Headers from pugi XML library */ +#include "pugixml.hpp" +#include "pugixml_util.hpp" + +/* Headers from vtr util library */ +#include "vtr_assert.h" +#include "vtr_time.h" + +/* Headers from libarchfpga */ +#include "arch_error.h" +#include "read_xml_util.h" + +#include "read_xml_fabric_key.h" + +/******************************************************************** + * Parse XML codes of a to an object of FabricKey + *******************************************************************/ +static +void read_xml_component_key(pugi::xml_node& xml_component_key, + const pugiutil::loc_data& loc_data, + FabricKey& fabric_key) { + + /* Find the id of component key */ + const size_t& id = get_attribute(xml_component_key, "id", loc_data).as_int(); + const std::string& name = get_attribute(xml_component_key, "name", loc_data).as_string(); + const size_t& value = get_attribute(xml_component_key, "value", loc_data).as_int(); + + if (false == fabric_key.valid_key_id(FabricKeyId(id))) { + archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_component_key), + "Invalid 'id' attribute '%d'\n", + id); + } + + VTR_ASSERT_SAFE(true == fabric_key.valid_key_id(FabricKeyId(id))); + + fabric_key.set_key_name(FabricKeyId(id), name); + fabric_key.set_key_value(FabricKeyId(id), value); +} + +/******************************************************************** + * Parse XML codes about to an object of FabricKey + *******************************************************************/ +FabricKey read_xml_fabric_key(const char* key_fname) { + + vtr::ScopedStartFinishTimer timer("Read Fabric Key"); + + FabricKey fabric_key; + + /* Parse the file */ + pugi::xml_document doc; + pugiutil::loc_data loc_data; + + try { + loc_data = pugiutil::load_xml(doc, key_fname); + + pugi::xml_node xml_root = get_single_child(doc, "fabric_key", loc_data); + + size_t num_keys = std::distance(xml_root.children().begin(), xml_root.children().end()); + fabric_key.reserve_keys(num_keys); + for (size_t ikey = 0; ikey < num_keys; ++ikey) { + fabric_key.create_key(); + } + + /* Iterate over the children under this node, + * each child should be named after circuit_model + */ + for (pugi::xml_node xml_key : xml_root.children()) { + /* Error out if the XML child has an invalid name! */ + if (xml_key.name() != std::string("key")) { + bad_tag(xml_key, loc_data, xml_root, {"key"}); + } + read_xml_component_key(xml_key, loc_data, fabric_key); + } + } catch (pugiutil::XmlError& e) { + archfpga_throw(key_fname, e.line(), + "%s", e.what()); + } + + return fabric_key; +} + diff --git a/libopenfpga/libfabrickey/src/read_xml_fabric_key.h b/libopenfpga/libfabrickey/src/read_xml_fabric_key.h new file mode 100644 index 000000000..692722d08 --- /dev/null +++ b/libopenfpga/libfabrickey/src/read_xml_fabric_key.h @@ -0,0 +1,16 @@ +#ifndef READ_XML_FABRIC_KEY_H +#define READ_XML_FABRIC_KEY_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include "pugixml_util.hpp" +#include "pugixml.hpp" +#include "fabric_key.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ +FabricKey read_xml_fabric_key(const char* key_fname); + +#endif diff --git a/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp b/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp new file mode 100644 index 000000000..d384d8607 --- /dev/null +++ b/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp @@ -0,0 +1,69 @@ +/******************************************************************** + * This file includes functions that outputs a configuration protocol to XML format + *******************************************************************/ +/* Headers from system goes first */ +#include +#include + +/* Headers from vtr util library */ +#include "vtr_assert.h" +#include "vtr_log.h" +#include "vtr_time.h" +#include "openfpga_digest.h" + +/* Headers from arch openfpga library */ +#include "write_xml_utils.h" + +/* Headers from fabrickey library */ +#include "write_xml_fabric_key.h" + +/******************************************************************** + * A writer to output a component key to XML format + *******************************************************************/ +static +void write_xml_fabric_component_key(std::fstream& fp, + const char* fname, + const FabricKey& fabric_key, + const FabricKeyId& component_key) { + /* Validate the file stream */ + openfpga::check_file_stream(fname, fp); + + fp << "\t" << "" << "\n"; +} + +/******************************************************************** + * A writer to output a fabric key to XML format + *******************************************************************/ +void write_xml_fabric_key(const char* fname, + const FabricKey& fabric_key) { + + vtr::ScopedStartFinishTimer timer("Write Fabric Key"); + + /* Create a file handler */ + std::fstream fp; + /* Open the file stream */ + fp.open(std::string(fname), std::fstream::out | std::fstream::trunc); + + /* Validate the file stream */ + openfpga::check_file_stream(fname, fp); + + /* Write the root node */ + fp << "" << "\n"; + + /* Write component by component */ + for (const FabricKeyId& key : fabric_key.keys()) { + write_xml_fabric_component_key(fp, fname, fabric_key, key); + } + + /* Finish writing the root node */ + fp << "" << "\n"; + + /* Close the file stream */ + fp.close(); +} diff --git a/libopenfpga/libfabrickey/src/write_xml_fabric_key.h b/libopenfpga/libfabrickey/src/write_xml_fabric_key.h new file mode 100644 index 000000000..f47c39a12 --- /dev/null +++ b/libopenfpga/libfabrickey/src/write_xml_fabric_key.h @@ -0,0 +1,16 @@ +#ifndef WRITE_XML_FABRIC_KEY_H +#define WRITE_XML_FABRIC_KEY_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include +#include "fabric_key.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ +void write_xml_fabric_key(const char* fname, + const FabricKey& fabric_key); + +#endif diff --git a/libopenfpga/libfabrickey/test/test_fabric_key.cpp b/libopenfpga/libfabrickey/test/test_fabric_key.cpp new file mode 100644 index 000000000..51acfd818 --- /dev/null +++ b/libopenfpga/libfabrickey/test/test_fabric_key.cpp @@ -0,0 +1,34 @@ +/******************************************************************** + * Unit test functions to validate the correctness of + * 1. parser of data structures + * 2. writer of data structures + *******************************************************************/ +/* Headers from vtrutils */ +#include "vtr_assert.h" +#include "vtr_log.h" + +/* Headers from fabric key */ +#include "read_xml_fabric_key.h" +#include "write_xml_fabric_key.h" + +int main(int argc, const char** argv) { + /* Ensure we have only one or two argument */ + VTR_ASSERT((2 == argc) || (3 == argc)); + + + /* Parse the fabric key from an XML file */ + FabricKey test_key = read_xml_fabric_key(argv[1]); + VTR_LOG("Read the fabric key from an XML file: %s.\n", + argv[1]); + + /* Output the circuit library to an XML file + * This is optional only used when there is a second argument + */ + if (3 <= argc) { + write_xml_fabric_key(argv[2], test_key); + VTR_LOG("Echo the fabric key to an XML file: %s.\n", + argv[2]); + } +} + + From 3499b4d3e76417e9e1494c59e40063f7b1f56d7f Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 12 Jun 2020 10:41:34 -0600 Subject: [PATCH 173/180] add fabric key writer for top-level module --- .../libfabrickey/src/write_xml_fabric_key.cpp | 38 +++++++-- .../libfabrickey/src/write_xml_fabric_key.h | 4 +- openfpga/CMakeLists.txt | 1 + openfpga/src/base/openfpga_build_fabric.cpp | 12 +++ openfpga/src/fabric/fabric_key_writer.cpp | 80 +++++++++++++++++++ openfpga/src/fabric/fabric_key_writer.h | 23 ++++++ 6 files changed, 148 insertions(+), 10 deletions(-) create mode 100644 openfpga/src/fabric/fabric_key_writer.cpp create mode 100644 openfpga/src/fabric/fabric_key_writer.h diff --git a/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp b/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp index d384d8607..1697f94a6 100644 --- a/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp +++ b/libopenfpga/libfabrickey/src/write_xml_fabric_key.cpp @@ -19,29 +19,44 @@ /******************************************************************** * A writer to output a component key to XML format + * + * Return 0 if successful + * Return 1 if there are more serious bugs in the architecture + * Return 2 if fail when creating files *******************************************************************/ static -void write_xml_fabric_component_key(std::fstream& fp, - const char* fname, - const FabricKey& fabric_key, - const FabricKeyId& component_key) { +int write_xml_fabric_component_key(std::fstream& fp, + const FabricKey& fabric_key, + const FabricKeyId& component_key) { /* Validate the file stream */ - openfpga::check_file_stream(fname, fp); + if (false == openfpga::valid_file_stream(fp)) { + return 2; + } fp << "\t" << "" << "\n"; + + return 0; } /******************************************************************** * A writer to output a fabric key to XML format + * + * Return 0 if successful + * Return 1 if there are more serious bugs in the architecture + * Return 2 if fail when creating files *******************************************************************/ -void write_xml_fabric_key(const char* fname, - const FabricKey& fabric_key) { +int write_xml_fabric_key(const char* fname, + const FabricKey& fabric_key) { vtr::ScopedStartFinishTimer timer("Write Fabric Key"); @@ -56,9 +71,14 @@ void write_xml_fabric_key(const char* fname, /* Write the root node */ fp << "" << "\n"; + int err_code = 0; + /* Write component by component */ for (const FabricKeyId& key : fabric_key.keys()) { - write_xml_fabric_component_key(fp, fname, fabric_key, key); + err_code = write_xml_fabric_component_key(fp, fabric_key, key); + if (0 != err_code) { + return err_code; + } } /* Finish writing the root node */ @@ -66,4 +86,6 @@ void write_xml_fabric_key(const char* fname, /* Close the file stream */ fp.close(); + + return err_code; } diff --git a/libopenfpga/libfabrickey/src/write_xml_fabric_key.h b/libopenfpga/libfabrickey/src/write_xml_fabric_key.h index f47c39a12..985662abf 100644 --- a/libopenfpga/libfabrickey/src/write_xml_fabric_key.h +++ b/libopenfpga/libfabrickey/src/write_xml_fabric_key.h @@ -10,7 +10,7 @@ /******************************************************************** * Function declaration *******************************************************************/ -void write_xml_fabric_key(const char* fname, - const FabricKey& fabric_key); +int write_xml_fabric_key(const char* fname, + const FabricKey& fabric_key); #endif diff --git a/openfpga/CMakeLists.txt b/openfpga/CMakeLists.txt index 1cdd56a32..7578630af 100644 --- a/openfpga/CMakeLists.txt +++ b/openfpga/CMakeLists.txt @@ -22,6 +22,7 @@ target_link_libraries(libopenfpga libarchopenfpga libopenfpgashell libopenfpgautil + libfabrickey libini libvtrutil libvpr8) diff --git a/openfpga/src/base/openfpga_build_fabric.cpp b/openfpga/src/base/openfpga_build_fabric.cpp index b1a1fe118..a5cb3125d 100644 --- a/openfpga/src/base/openfpga_build_fabric.cpp +++ b/openfpga/src/base/openfpga_build_fabric.cpp @@ -12,6 +12,7 @@ #include "device_rr_gsb_utils.h" #include "build_device_module.h" #include "fabric_hierarchy_writer.h" +#include "fabric_key_writer.h" #include "openfpga_build_fabric.h" /* Include global variables of VPR */ @@ -65,6 +66,7 @@ int build_fabric(OpenfpgaContext& openfpga_ctx, CommandOptionId opt_compress_routing = cmd.option("compress_routing"); CommandOptionId opt_duplicate_grid_pin = cmd.option("duplicate_grid_pin"); + CommandOptionId opt_write_fabric_key = cmd.option("write_fabric_key"); CommandOptionId opt_verbose = cmd.option("verbose"); if (true == cmd_context.option_enable(cmd, opt_compress_routing)) { @@ -83,6 +85,16 @@ int build_fabric(OpenfpgaContext& openfpga_ctx, cmd_context.option_enable(cmd, opt_duplicate_grid_pin), cmd_context.option_enable(cmd, opt_verbose)); + /* Output fabric key if user requested */ + if (true == cmd_context.option_enable(cmd, opt_write_fabric_key)) { + std::string fkey_fname = cmd_context.option_value(cmd, opt_write_fabric_key); + VTR_ASSERT(false == fkey_fname.empty()); + write_fabric_key_to_xml_file(openfpga_ctx.module_graph(), + fkey_fname, + cmd_context.option_enable(cmd, opt_verbose)); + + } + /* TODO: should identify the error code from internal function execution */ return CMD_EXEC_SUCCESS; } diff --git a/openfpga/src/fabric/fabric_key_writer.cpp b/openfpga/src/fabric/fabric_key_writer.cpp new file mode 100644 index 000000000..17f951ba2 --- /dev/null +++ b/openfpga/src/fabric/fabric_key_writer.cpp @@ -0,0 +1,80 @@ +/*************************************************************************************** + * Output fabric key of Module Graph to file formats + ***************************************************************************************/ +/* Headers from vtrutil library */ +#include "vtr_log.h" +#include "vtr_assert.h" +#include "vtr_time.h" + +/* Headers from openfpgautil library */ +#include "openfpga_digest.h" + +/* Headers from archopenfpga library */ +#include "write_xml_fabric_key.h" + +#include "openfpga_naming.h" + +#include "fabric_key_writer.h" + +/* begin namespace openfpga */ +namespace openfpga { + +/*************************************************************************************** + * Write the fabric key of top module to an XML file + * We will use the writer API in libfabrickey + * + * Return 0 if successful + * Return 1 if there are more serious bugs in the architecture + * Return 2 if fail when creating files + ***************************************************************************************/ +int write_fabric_key_to_xml_file(const ModuleManager& module_manager, + const std::string& fname, + const bool& verbose) { + std::string timer_message = std::string("Write fabric key to XML file '") + fname + std::string("'"); + + std::string dir_path = format_dir_path(find_path_dir_name(fname)); + + /* Create directories */ + create_directory(dir_path); + + /* Start time count */ + vtr::ScopedStartFinishTimer timer(timer_message); + + /* Use default name if user does not provide one */ + VTR_ASSERT(true != fname.empty()); + + /* Find top-level module */ + std::string top_module_name = generate_fpga_top_module_name(); + ModuleId top_module = module_manager.find_module(top_module_name); + if (true != module_manager.valid_module_id(top_module)) { + VTR_LOGV_ERROR(verbose, + "Unable to find the top-level module '%s'!\n", + top_module_name.c_str()); + return 1; + } + + /* Build a fabric key database by visiting all the configurable children */ + FabricKey fabric_key; + const size_t& num_keys = module_manager.configurable_children(top_module).size(); + fabric_key.reserve_keys(num_keys); + + for (size_t ichild = 0; ichild < num_keys; ++ichild) { + const ModuleId& child_module = module_manager.configurable_children(top_module)[ichild]; + const size_t& child_instance = module_manager.configurable_child_instances(top_module)[ichild]; + + FabricKeyId key = fabric_key.create_key(); + fabric_key.set_key_name(key, module_manager.module_name(child_module)); + fabric_key.set_key_value(key, child_instance); + } + + VTR_LOGV(verbose, + "Created %lu keys for the top module %s.\n", + num_keys, top_module_name.c_str()); + + /* Call the XML writer for fabric key */ + int err_code = write_xml_fabric_key(fname.c_str(), fabric_key); + + return err_code; +} + +} /* end namespace openfpga */ diff --git a/openfpga/src/fabric/fabric_key_writer.h b/openfpga/src/fabric/fabric_key_writer.h new file mode 100644 index 000000000..68e6468b2 --- /dev/null +++ b/openfpga/src/fabric/fabric_key_writer.h @@ -0,0 +1,23 @@ +#ifndef FABRIC_KEY_WRITER_H +#define FABRIC_KEY_WRITER_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include "vpr_context.h" +#include "openfpga_context.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ + +/* begin namespace openfpga */ +namespace openfpga { + +int write_fabric_key_to_xml_file(const ModuleManager& module_manager, + const std::string& fname, + const bool& verbose); + +} /* end namespace openfpga */ + +#endif From cf9c3b0f4456e20a292781061cabb83756468560 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 12 Jun 2020 10:50:23 -0600 Subject: [PATCH 174/180] add write fabric to test cases --- openfpga/src/fabric/fabric_key_writer.cpp | 6 +++--- .../generate_fabric_example_script.openfpga | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openfpga/src/fabric/fabric_key_writer.cpp b/openfpga/src/fabric/fabric_key_writer.cpp index 17f951ba2..40770965f 100644 --- a/openfpga/src/fabric/fabric_key_writer.cpp +++ b/openfpga/src/fabric/fabric_key_writer.cpp @@ -55,12 +55,12 @@ int write_fabric_key_to_xml_file(const ModuleManager& module_manager, /* Build a fabric key database by visiting all the configurable children */ FabricKey fabric_key; - const size_t& num_keys = module_manager.configurable_children(top_module).size(); + size_t num_keys = module_manager.configurable_children(top_module).size(); fabric_key.reserve_keys(num_keys); for (size_t ichild = 0; ichild < num_keys; ++ichild) { - const ModuleId& child_module = module_manager.configurable_children(top_module)[ichild]; - const size_t& child_instance = module_manager.configurable_child_instances(top_module)[ichild]; + ModuleId child_module = module_manager.configurable_children(top_module)[ichild]; + size_t child_instance = module_manager.configurable_child_instances(top_module)[ichild]; FabricKeyId key = fabric_key.create_key(); fabric_key.set_key_name(key, module_manager.module_name(child_module)); diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga index 38ebc9d28..d7f025434 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga @@ -18,7 +18,7 @@ check_netlist_naming_conflict --fix --report ./netlist_renaming.xml # Build the module graph # - Enabled compression on routing architecture modules # - Enable pin duplication on grid modules -build_fabric --compress_routing #--verbose +build_fabric --compress_routing --write_fabric_key ./fabric_key.xml #--verbose # Write the fabric hierarchy of module graph to a file # This is used by hierarchical PnR flows From 9dbf5363068808d03bdf894b582870265ec5103d Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 12 Jun 2020 11:16:53 -0600 Subject: [PATCH 175/180] add shuffled configurable children support for top module --- openfpga/src/base/openfpga_build_fabric.cpp | 2 ++ openfpga/src/fabric/build_device_module.cpp | 3 +- openfpga/src/fabric/build_device_module.h | 1 + openfpga/src/fabric/build_top_module.cpp | 8 ++++- openfpga/src/fabric/build_top_module.h | 3 +- .../src/fabric/build_top_module_memory.cpp | 35 +++++++++++++++++++ openfpga/src/fabric/build_top_module_memory.h | 3 ++ 7 files changed, 52 insertions(+), 3 deletions(-) diff --git a/openfpga/src/base/openfpga_build_fabric.cpp b/openfpga/src/base/openfpga_build_fabric.cpp index a5cb3125d..f5c007a09 100644 --- a/openfpga/src/base/openfpga_build_fabric.cpp +++ b/openfpga/src/base/openfpga_build_fabric.cpp @@ -66,6 +66,7 @@ int build_fabric(OpenfpgaContext& openfpga_ctx, CommandOptionId opt_compress_routing = cmd.option("compress_routing"); CommandOptionId opt_duplicate_grid_pin = cmd.option("duplicate_grid_pin"); + CommandOptionId opt_gen_random_fabric_key = cmd.option("generate_random_fabric_key"); CommandOptionId opt_write_fabric_key = cmd.option("write_fabric_key"); CommandOptionId opt_verbose = cmd.option("verbose"); @@ -83,6 +84,7 @@ int build_fabric(OpenfpgaContext& openfpga_ctx, g_vpr_ctx.device(), cmd_context.option_enable(cmd, opt_compress_routing), cmd_context.option_enable(cmd, opt_duplicate_grid_pin), + cmd_context.option_enable(cmd, opt_gen_random_fabric_key), cmd_context.option_enable(cmd, opt_verbose)); /* Output fabric key if user requested */ diff --git a/openfpga/src/fabric/build_device_module.cpp b/openfpga/src/fabric/build_device_module.cpp index 4b2375057..36769636a 100644 --- a/openfpga/src/fabric/build_device_module.cpp +++ b/openfpga/src/fabric/build_device_module.cpp @@ -32,6 +32,7 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, const DeviceContext& vpr_device_ctx, const bool& compress_routing, const bool& duplicate_grid_pin, + const bool& generate_random_fabric_key, const bool& verbose) { vtr::ScopedStartFinishTimer timer("Build fabric module graph"); @@ -116,7 +117,7 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, openfpga_ctx.arch().arch_direct, openfpga_ctx.arch().config_protocol.type(), sram_model, - compress_routing, duplicate_grid_pin); + compress_routing, duplicate_grid_pin, generate_random_fabric_key); /* Now a critical correction has to be done! * In the module construction, we always use prefix of ports because they are binded diff --git a/openfpga/src/fabric/build_device_module.h b/openfpga/src/fabric/build_device_module.h index 75a9f982c..7b8a6bd2b 100644 --- a/openfpga/src/fabric/build_device_module.h +++ b/openfpga/src/fabric/build_device_module.h @@ -20,6 +20,7 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, const DeviceContext& vpr_device_ctx, const bool& compress_routing, const bool& duplicate_grid_pin, + const bool& generate_random_fabric_key, const bool& verbose); } /* end namespace openfpga */ diff --git a/openfpga/src/fabric/build_top_module.cpp b/openfpga/src/fabric/build_top_module.cpp index 762ba66f0..a751834ef 100644 --- a/openfpga/src/fabric/build_top_module.cpp +++ b/openfpga/src/fabric/build_top_module.cpp @@ -321,7 +321,8 @@ void build_top_module(ModuleManager& module_manager, const e_config_protocol_type& sram_orgz_type, const CircuitModelId& sram_model, const bool& compact_routing_hierarchy, - const bool& duplicate_grid_pin) { + const bool& duplicate_grid_pin, + const bool& generate_random_fabric_key) { vtr::ScopedStartFinishTimer timer("Build FPGA fabric module"); @@ -369,6 +370,11 @@ void build_top_module(ModuleManager& module_manager, device_rr_gsb, sb_instance_ids, cb_instance_ids, compact_routing_hierarchy); + /* Shuffle the configurable children in a random sequence */ + if (true == generate_random_fabric_key) { + shuffle_top_module_configurable_children(module_manager, top_module); + } + /* Add shared SRAM ports from the sub-modules under this Verilog module * This is a much easier job after adding sub modules (instances), * we just need to find all the I/O ports from the child modules and build a list of it diff --git a/openfpga/src/fabric/build_top_module.h b/openfpga/src/fabric/build_top_module.h index d64de2755..fca3ea841 100644 --- a/openfpga/src/fabric/build_top_module.h +++ b/openfpga/src/fabric/build_top_module.h @@ -36,7 +36,8 @@ void build_top_module(ModuleManager& module_manager, const e_config_protocol_type& sram_orgz_type, const CircuitModelId& sram_model, const bool& compact_routing_hierarchy, - const bool& duplicate_grid_pin); + const bool& duplicate_grid_pin, + const bool& generate_random_fabric_key); } /* end namespace openfpga */ diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index 6466d98e5..2ac546218 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -366,6 +366,41 @@ void organize_top_module_memory_modules(ModuleManager& module_manager, } } + +/******************************************************************** + * Shuffle the configurable children in a random sequence + * + * TODO: May use a more customized shuffle mechanism + * + * Note: + * - This function should NOT be called + * before allocating any configurable child + ********************************************************************/ +void shuffle_top_module_configurable_children(ModuleManager& module_manager, + const ModuleId& top_module) { + size_t num_keys = module_manager.configurable_children(top_module).size(); + std::vector shuffled_keys; + shuffled_keys.reserve(num_keys); + for (size_t ikey = 0; ikey < num_keys; ++ikey) { + shuffled_keys.push_back(ikey); + } + + std::random_shuffle(shuffled_keys.begin(), shuffled_keys.end()); + + /* Cache the configurable children and their instances */ + std::vector orig_configurable_children = module_manager.configurable_children(top_module); + std::vector orig_configurable_child_instances = module_manager.configurable_child_instances(top_module); + + /* Reorganize the configurable children */ + module_manager.clear_configurable_children(top_module); + + for (size_t ikey = 0; ikey < num_keys; ++ikey) { + module_manager.add_configurable_child(top_module, + orig_configurable_children[shuffled_keys[ikey]], + orig_configurable_child_instances[shuffled_keys[ikey]]); + } +} + /******************************************************************** * Add a list of ports that are used for SRAM configuration to the FPGA * top-level module diff --git a/openfpga/src/fabric/build_top_module_memory.h b/openfpga/src/fabric/build_top_module_memory.h index b67389790..1c6dd56e5 100644 --- a/openfpga/src/fabric/build_top_module_memory.h +++ b/openfpga/src/fabric/build_top_module_memory.h @@ -34,6 +34,9 @@ void organize_top_module_memory_modules(ModuleManager& module_manager, const std::map>& cb_instance_ids, const bool& compact_routing_hierarchy); +void shuffle_top_module_configurable_children(ModuleManager& module_manager, + const ModuleId& top_module); + void add_top_module_sram_ports(ModuleManager& module_manager, const ModuleId& module_id, const CircuitLibrary& circuit_lib, From 65b387a5898463f23310277d2277b3a99216aa07 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 12 Jun 2020 11:32:52 -0600 Subject: [PATCH 176/180] develop test cases for fabric keys --- .../generate_fabric_example_script.openfpga | 2 +- ...enerate_fabric_key_example_script.openfpga | 42 +++++++++++ ...rate_secure_fabric_example_script.openfpga | 74 +++++++++++++++++++ .../generate_random_key/config/task.conf | 35 +++++++++ .../generate_vanilla_key/config/task.conf | 32 ++++++++ 5 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 openfpga_flow/OpenFPGAShellScripts/generate_fabric_key_example_script.openfpga create mode 100644 openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_example_script.openfpga create mode 100644 openfpga_flow/tasks/openfpga_shell/fabric_key/generate_random_key/config/task.conf create mode 100644 openfpga_flow/tasks/openfpga_shell/fabric_key/generate_vanilla_key/config/task.conf diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga index d7f025434..38ebc9d28 100644 --- a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga +++ b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_example_script.openfpga @@ -18,7 +18,7 @@ check_netlist_naming_conflict --fix --report ./netlist_renaming.xml # Build the module graph # - Enabled compression on routing architecture modules # - Enable pin duplication on grid modules -build_fabric --compress_routing --write_fabric_key ./fabric_key.xml #--verbose +build_fabric --compress_routing #--verbose # Write the fabric hierarchy of module graph to a file # This is used by hierarchical PnR flows diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_fabric_key_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_key_example_script.openfpga new file mode 100644 index 000000000..d7f025434 --- /dev/null +++ b/openfpga_flow/OpenFPGAShellScripts/generate_fabric_key_example_script.openfpga @@ -0,0 +1,42 @@ +# Run VPR for the 'and' design +#--write_rr_graph example_rr_graph.xml +vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route + +# Read OpenFPGA architecture definition +read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} + +# Read OpenFPGA simulation settings +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} + +# Annotate the OpenFPGA architecture to VPR data base +# to debug use --verbose options +link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges + +# Check and correct any naming conflicts in the BLIF netlist +check_netlist_naming_conflict --fix --report ./netlist_renaming.xml + +# Build the module graph +# - Enabled compression on routing architecture modules +# - Enable pin duplication on grid modules +build_fabric --compress_routing --write_fabric_key ./fabric_key.xml #--verbose + +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + +# Write the Verilog netlist for FPGA fabric +# - Enable the use of explicit port mapping in Verilog netlist +write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --include_signal_init --support_icarus_simulator --print_user_defined_template --verbose + +# Write the SDC files for PnR backend +# - Turn on every options here +write_pnr_sdc --file ./SDC + +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + +# Finish and exit OpenFPGA +exit + +# Note : +# To run verification at the end of the flow maintain source in ./SRC directory diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_example_script.openfpga new file mode 100644 index 000000000..4f340704b --- /dev/null +++ b/openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_example_script.openfpga @@ -0,0 +1,74 @@ +# Run VPR for the 'and' design +#--write_rr_graph example_rr_graph.xml +vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route + +# Read OpenFPGA architecture definition +read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} + +# Read OpenFPGA simulation settings +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} + +# Annotate the OpenFPGA architecture to VPR data base +# to debug use --verbose options +link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges + +# Check and correct any naming conflicts in the BLIF netlist +check_netlist_naming_conflict --fix --report ./netlist_renaming.xml + +# Apply fix-up to clustering nets based on routing results +pb_pin_fixup --verbose + +# Apply fix-up to Look-Up Table truth tables based on packing results +lut_truth_table_fixup + +# Build the module graph +# - Enabled compression on routing architecture modules +# - Enable pin duplication on grid modules +build_fabric --compress_routing \ + --write_fabric_key ./fabric_key.xml \ + --generate_random_fabric_key + #--verbose + +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + +# Repack the netlist to physical pbs +# This must be done before bitstream generator and testbench generation +# Strongly recommend it is done after all the fix-up have been applied +repack #--verbose + +# Build the bitstream +# - Output the fabric-independent bitstream to a file +build_architecture_bitstream --verbose --file fabric_indepenent_bitstream.xml + +# Build fabric-dependent bitstream +build_fabric_bitstream --verbose + +# Write the Verilog netlist for FPGA fabric +# - Enable the use of explicit port mapping in Verilog netlist +write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --include_signal_init --support_icarus_simulator --print_user_defined_template --verbose + +# Write the Verilog testbench for FPGA fabric +# - We suggest the use of same output directory as fabric Verilog netlists +# - Must specify the reference benchmark file if you want to output any testbenches +# - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA +# - Enable pre-configured top-level testbench which is a fast verification skipping programming phase +# - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini --explicit_port_mapping + +# Write the SDC files for PnR backend +# - Turn on every options here +write_pnr_sdc --file ./SDC + +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + +# Write the SDC to run timing analysis for a mapped FPGA fabric +write_analysis_sdc --file ./SDC_analysis + +# Finish and exit OpenFPGA +exit + +# Note : +# To run verification at the end of the flow maintain source in ./SRC directory diff --git a/openfpga_flow/tasks/openfpga_shell/fabric_key/generate_random_key/config/task.conf b/openfpga_flow/tasks/openfpga_shell/fabric_key/generate_random_key/config/task.conf new file mode 100644 index 000000000..8777a5930 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/fabric_key/generate_random_key/config/task.conf @@ -0,0 +1,35 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +#vpr_fpga_verilog_formal_verification_top_netlist= diff --git a/openfpga_flow/tasks/openfpga_shell/fabric_key/generate_vanilla_key/config/task.conf b/openfpga_flow/tasks/openfpga_shell/fabric_key/generate_vanilla_key/config/task.conf new file mode 100644 index 000000000..2893f7ba9 --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/fabric_key/generate_vanilla_key/config/task.conf @@ -0,0 +1,32 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/generate_fabric_key_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k6_frac_N10_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] From 76b82e348fb4d576424548368256ca643595d6bd Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 12 Jun 2020 11:38:05 -0600 Subject: [PATCH 177/180] deploy fabric key test cases to CI --- .travis/openfpga_vpr8_reg_test.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis/openfpga_vpr8_reg_test.sh b/.travis/openfpga_vpr8_reg_test.sh index 046f8210f..13e9fddfb 100755 --- a/.travis/openfpga_vpr8_reg_test.sh +++ b/.travis/openfpga_vpr8_reg_test.sh @@ -102,6 +102,10 @@ python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/generate_testbench echo -e "Testing SDC generation with time units"; python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/sdc_time_unit --debug --show_thread_logs +echo -e "Testing Secured FPGA fabrics"; +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/fabric_key/generate_vanilla_key --debug --show_thread_logs +python3 openfpga_flow/scripts/run_fpga_task.py openfpga_shell/fabric_key/generate_random_key --debug --show_thread_logs + # Verify MCNC big20 benchmark suite with ModelSim # Please make sure you have ModelSim installed in the environment # Otherwise, it will fail From a5055e9d26e9b0a2f6da1e7c70260d7b11a08d76 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 12 Jun 2020 13:03:11 -0600 Subject: [PATCH 178/180] add support about loading external fabric key --- libopenfpga/libfabrickey/src/fabric_key.cpp | 4 ++ libopenfpga/libfabrickey/src/fabric_key.h | 1 + openfpga/src/base/openfpga_build_fabric.cpp | 15 +++++++ openfpga/src/fabric/build_device_module.cpp | 4 +- openfpga/src/fabric/build_device_module.h | 2 + openfpga/src/fabric/build_top_module.cpp | 22 +++++++--- openfpga/src/fabric/build_top_module.h | 2 + .../src/fabric/build_top_module_memory.cpp | 44 +++++++++++++++++++ openfpga/src/fabric/build_top_module_memory.h | 5 +++ 9 files changed, 92 insertions(+), 7 deletions(-) diff --git a/libopenfpga/libfabrickey/src/fabric_key.cpp b/libopenfpga/libfabrickey/src/fabric_key.cpp index 187150800..0c2c508bd 100644 --- a/libopenfpga/libfabrickey/src/fabric_key.cpp +++ b/libopenfpga/libfabrickey/src/fabric_key.cpp @@ -37,6 +37,10 @@ size_t FabricKey::key_value(const FabricKeyId& key_id) const { return key_values_[key_id]; } +bool FabricKey::empty() const { + return 0 == key_ids_.size(); +} + /************************************************************************ * Public Mutators ***********************************************************************/ diff --git a/libopenfpga/libfabrickey/src/fabric_key.h b/libopenfpga/libfabrickey/src/fabric_key.h index 7488923df..053e32e56 100644 --- a/libopenfpga/libfabrickey/src/fabric_key.h +++ b/libopenfpga/libfabrickey/src/fabric_key.h @@ -36,6 +36,7 @@ class FabricKey { public: /* Public Accessors: Basic data query */ std::string key_name(const FabricKeyId& key_id) const; size_t key_value(const FabricKeyId& key_id) const; + bool empty() const; public: /* Public Mutators: model-related */ void reserve_keys(const size_t& num_keys); FabricKeyId create_key(); diff --git a/openfpga/src/base/openfpga_build_fabric.cpp b/openfpga/src/base/openfpga_build_fabric.cpp index f5c007a09..adbe8fce6 100644 --- a/openfpga/src/base/openfpga_build_fabric.cpp +++ b/openfpga/src/base/openfpga_build_fabric.cpp @@ -8,6 +8,9 @@ /* Headers from openfpgashell library */ #include "command_exit_codes.h" +/* Headers from fabrickey library */ +#include "read_xml_fabric_key.h" + #include "device_rr_gsb.h" #include "device_rr_gsb_utils.h" #include "build_device_module.h" @@ -68,6 +71,7 @@ int build_fabric(OpenfpgaContext& openfpga_ctx, CommandOptionId opt_duplicate_grid_pin = cmd.option("duplicate_grid_pin"); CommandOptionId opt_gen_random_fabric_key = cmd.option("generate_random_fabric_key"); CommandOptionId opt_write_fabric_key = cmd.option("write_fabric_key"); + CommandOptionId opt_load_fabric_key = cmd.option("load_fabric_key"); CommandOptionId opt_verbose = cmd.option("verbose"); if (true == cmd_context.option_enable(cmd, opt_compress_routing)) { @@ -78,12 +82,23 @@ int build_fabric(OpenfpgaContext& openfpga_ctx, VTR_LOG("\n"); + /* Load fabric key from file */ + FabricKey predefined_fabric_key; + if (true == cmd_context.option_enable(cmd, opt_load_fabric_key)) { + std::string fkey_fname = cmd_context.option_value(cmd, opt_load_fabric_key); + VTR_ASSERT(false == fkey_fname.empty()); + predefined_fabric_key = read_xml_fabric_key(fkey_fname.c_str()); + } + + VTR_LOG("\n"); + openfpga_ctx.mutable_module_graph() = build_device_module_graph(openfpga_ctx.mutable_io_location_map(), openfpga_ctx.mutable_decoder_lib(), const_cast(openfpga_ctx), g_vpr_ctx.device(), cmd_context.option_enable(cmd, opt_compress_routing), cmd_context.option_enable(cmd, opt_duplicate_grid_pin), + predefined_fabric_key, cmd_context.option_enable(cmd, opt_gen_random_fabric_key), cmd_context.option_enable(cmd, opt_verbose)); diff --git a/openfpga/src/fabric/build_device_module.cpp b/openfpga/src/fabric/build_device_module.cpp index 36769636a..b988e1e29 100644 --- a/openfpga/src/fabric/build_device_module.cpp +++ b/openfpga/src/fabric/build_device_module.cpp @@ -32,6 +32,7 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, const DeviceContext& vpr_device_ctx, const bool& compress_routing, const bool& duplicate_grid_pin, + const FabricKey& fabric_key, const bool& generate_random_fabric_key, const bool& verbose) { vtr::ScopedStartFinishTimer timer("Build fabric module graph"); @@ -117,7 +118,8 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, openfpga_ctx.arch().arch_direct, openfpga_ctx.arch().config_protocol.type(), sram_model, - compress_routing, duplicate_grid_pin, generate_random_fabric_key); + compress_routing, duplicate_grid_pin, + fabric_key, generate_random_fabric_key); /* Now a critical correction has to be done! * In the module construction, we always use prefix of ports because they are binded diff --git a/openfpga/src/fabric/build_device_module.h b/openfpga/src/fabric/build_device_module.h index 7b8a6bd2b..34d30b997 100644 --- a/openfpga/src/fabric/build_device_module.h +++ b/openfpga/src/fabric/build_device_module.h @@ -6,6 +6,7 @@ *******************************************************************/ #include "vpr_context.h" #include "openfpga_context.h" +#include "fabric_key.h" /******************************************************************** * Function declaration @@ -20,6 +21,7 @@ ModuleManager build_device_module_graph(IoLocationMap& io_location_map, const DeviceContext& vpr_device_ctx, const bool& compress_routing, const bool& duplicate_grid_pin, + const FabricKey& fabric_key, const bool& generate_random_fabric_key, const bool& verbose); diff --git a/openfpga/src/fabric/build_top_module.cpp b/openfpga/src/fabric/build_top_module.cpp index a751834ef..6c2d94a00 100644 --- a/openfpga/src/fabric/build_top_module.cpp +++ b/openfpga/src/fabric/build_top_module.cpp @@ -322,6 +322,7 @@ void build_top_module(ModuleManager& module_manager, const CircuitModelId& sram_model, const bool& compact_routing_hierarchy, const bool& duplicate_grid_pin, + const FabricKey& fabric_key, const bool& generate_random_fabric_key) { vtr::ScopedStartFinishTimer timer("Build FPGA fabric module"); @@ -363,12 +364,21 @@ void build_top_module(ModuleManager& module_manager, */ add_module_gpio_ports_from_child_modules(module_manager, top_module); - /* Organize the list of memory modules and instances */ - organize_top_module_memory_modules(module_manager, top_module, - circuit_lib, sram_orgz_type, sram_model, - grids, grid_instance_ids, - device_rr_gsb, sb_instance_ids, cb_instance_ids, - compact_routing_hierarchy); + /* Organize the list of memory modules and instances + * If we have an empty fabric key, we organize the memory modules as routine + * Otherwise, we will load the fabric key directly + */ + if (true == fabric_key.empty()) { + organize_top_module_memory_modules(module_manager, top_module, + circuit_lib, sram_orgz_type, sram_model, + grids, grid_instance_ids, + device_rr_gsb, sb_instance_ids, cb_instance_ids, + compact_routing_hierarchy); + } else { + VTR_ASSERT_SAFE(false == fabric_key.empty()); + load_top_module_memory_modules_from_fabric_key(module_manager, top_module, + fabric_key); + } /* Shuffle the configurable children in a random sequence */ if (true == generate_random_fabric_key) { diff --git a/openfpga/src/fabric/build_top_module.h b/openfpga/src/fabric/build_top_module.h index fca3ea841..50bf6e611 100644 --- a/openfpga/src/fabric/build_top_module.h +++ b/openfpga/src/fabric/build_top_module.h @@ -16,6 +16,7 @@ #include "arch_direct.h" #include "module_manager.h" #include "io_location_map.h" +#include "fabric_key.h" /******************************************************************** * Function declaration @@ -37,6 +38,7 @@ void build_top_module(ModuleManager& module_manager, const CircuitModelId& sram_model, const bool& compact_routing_hierarchy, const bool& duplicate_grid_pin, + const FabricKey& fabric_key, const bool& generate_random_fabric_key); } /* end namespace openfpga */ diff --git a/openfpga/src/fabric/build_top_module_memory.cpp b/openfpga/src/fabric/build_top_module_memory.cpp index 2ac546218..158a0f44a 100644 --- a/openfpga/src/fabric/build_top_module_memory.cpp +++ b/openfpga/src/fabric/build_top_module_memory.cpp @@ -401,6 +401,50 @@ void shuffle_top_module_configurable_children(ModuleManager& module_manager, } } +/******************************************************************** + * Load configurable children from a fabric key to top-level module + * + * Note: + * - This function will overwrite any exisiting configurable children + * under the top module + * + * Return 0 - Success + * Return 1 - Fatal errors + ********************************************************************/ +int load_top_module_memory_modules_from_fabric_key(ModuleManager& module_manager, + const ModuleId& top_module, + const FabricKey& fabric_key) { + /* Ensure a clean start */ + module_manager.clear_configurable_children(top_module); + + for (const FabricKeyId& key : fabric_key.keys()) { + /* Find if the module name exist */ + ModuleId child_module = module_manager.find_module(fabric_key.key_name(key)); + if (false == module_manager.valid_module_id(child_module)) { + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid key name '%s'!\n", + fabric_key.key_name(key).c_str()); + return 1; + } + + /* Find if instance id is valid */ + size_t child_instance = fabric_key.key_value(key); + if (child_instance >= module_manager.num_instance(top_module, child_module)) { + VTR_LOGF_ERROR(__FILE__, __LINE__, + "Invalid key value '%ld'!\n", + child_instance); + return 1; + } + + /* Now we can add the child to configurable children of the top module */ + module_manager.add_configurable_child(top_module, + child_module, + child_instance); + } + + return 0; +} + /******************************************************************** * Add a list of ports that are used for SRAM configuration to the FPGA * top-level module diff --git a/openfpga/src/fabric/build_top_module_memory.h b/openfpga/src/fabric/build_top_module_memory.h index 1c6dd56e5..c4a1ff7f6 100644 --- a/openfpga/src/fabric/build_top_module_memory.h +++ b/openfpga/src/fabric/build_top_module_memory.h @@ -14,6 +14,7 @@ #include "decoder_library.h" #include "device_grid.h" #include "device_rr_gsb.h" +#include "fabric_key.h" /******************************************************************** * Function declaration @@ -37,6 +38,10 @@ void organize_top_module_memory_modules(ModuleManager& module_manager, void shuffle_top_module_configurable_children(ModuleManager& module_manager, const ModuleId& top_module); +int load_top_module_memory_modules_from_fabric_key(ModuleManager& module_manager, + const ModuleId& top_module, + const FabricKey& fabric_key); + void add_top_module_sram_ports(ModuleManager& module_manager, const ModuleId& module_id, const CircuitLibrary& circuit_lib, From 2d35848cfa80290eef657e3d205ab2510910fa85 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 12 Jun 2020 13:11:21 -0600 Subject: [PATCH 179/180] add external key test cases --- ...re_fabric_from_key_example_script.openfpga | 74 +++++++++++++++++++ .../fabric_keys/k4_N4_2x2_sample_key.xml | 36 +++++++++ .../load_external_key/config/task.conf | 36 +++++++++ 3 files changed, 146 insertions(+) create mode 100644 openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_from_key_example_script.openfpga create mode 100644 openfpga_flow/fabric_keys/k4_N4_2x2_sample_key.xml create mode 100644 openfpga_flow/tasks/openfpga_shell/fabric_key/load_external_key/config/task.conf diff --git a/openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_from_key_example_script.openfpga b/openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_from_key_example_script.openfpga new file mode 100644 index 000000000..a61336d61 --- /dev/null +++ b/openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_from_key_example_script.openfpga @@ -0,0 +1,74 @@ +# Run VPR for the 'and' design +#--write_rr_graph example_rr_graph.xml +vpr ${VPR_ARCH_FILE} ${VPR_TESTBENCH_BLIF} --clock_modeling route + +# Read OpenFPGA architecture definition +read_openfpga_arch -f ${OPENFPGA_ARCH_FILE} + +# Read OpenFPGA simulation settings +read_openfpga_simulation_setting -f ${OPENFPGA_SIM_SETTING_FILE} + +# Annotate the OpenFPGA architecture to VPR data base +# to debug use --verbose options +link_openfpga_arch --activity_file ${ACTIVITY_FILE} --sort_gsb_chan_node_in_edges + +# Check and correct any naming conflicts in the BLIF netlist +check_netlist_naming_conflict --fix --report ./netlist_renaming.xml + +# Apply fix-up to clustering nets based on routing results +pb_pin_fixup --verbose + +# Apply fix-up to Look-Up Table truth tables based on packing results +lut_truth_table_fixup + +# Build the module graph +# - Enabled compression on routing architecture modules +# - Enable pin duplication on grid modules +build_fabric --compress_routing \ + --load_fabric_key ${EXTERNAL_FABRIC_KEY_FILE} \ + --write_fabric_key ./fabric_key.xml + #--verbose + +# Write the fabric hierarchy of module graph to a file +# This is used by hierarchical PnR flows +write_fabric_hierarchy --file ./fabric_hierarchy.txt + +# Repack the netlist to physical pbs +# This must be done before bitstream generator and testbench generation +# Strongly recommend it is done after all the fix-up have been applied +repack #--verbose + +# Build the bitstream +# - Output the fabric-independent bitstream to a file +build_architecture_bitstream --verbose --file fabric_indepenent_bitstream.xml + +# Build fabric-dependent bitstream +build_fabric_bitstream --verbose + +# Write the Verilog netlist for FPGA fabric +# - Enable the use of explicit port mapping in Verilog netlist +write_fabric_verilog --file ./SRC --explicit_port_mapping --include_timing --include_signal_init --support_icarus_simulator --print_user_defined_template --verbose + +# Write the Verilog testbench for FPGA fabric +# - We suggest the use of same output directory as fabric Verilog netlists +# - Must specify the reference benchmark file if you want to output any testbenches +# - Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA +# - Enable pre-configured top-level testbench which is a fast verification skipping programming phase +# - Simulation ini file is optional and is needed only when you need to interface different HDL simulators using openfpga flow-run scripts +write_verilog_testbench --file ./SRC --reference_benchmark_file_path ${REFERENCE_VERILOG_TESTBENCH} --print_top_testbench --print_preconfig_top_testbench --print_simulation_ini ./SimulationDeck/simulation_deck.ini --explicit_port_mapping + +# Write the SDC files for PnR backend +# - Turn on every options here +write_pnr_sdc --file ./SDC + +# Write SDC to disable timing for configure ports +write_sdc_disable_timing_configure_ports --file ./SDC/disable_configure_ports.sdc + +# Write the SDC to run timing analysis for a mapped FPGA fabric +write_analysis_sdc --file ./SDC_analysis + +# Finish and exit OpenFPGA +exit + +# Note : +# To run verification at the end of the flow maintain source in ./SRC directory diff --git a/openfpga_flow/fabric_keys/k4_N4_2x2_sample_key.xml b/openfpga_flow/fabric_keys/k4_N4_2x2_sample_key.xml new file mode 100644 index 000000000..e149a311d --- /dev/null +++ b/openfpga_flow/fabric_keys/k4_N4_2x2_sample_key.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openfpga_flow/tasks/openfpga_shell/fabric_key/load_external_key/config/task.conf b/openfpga_flow/tasks/openfpga_shell/fabric_key/load_external_key/config/task.conf new file mode 100644 index 000000000..4be35916c --- /dev/null +++ b/openfpga_flow/tasks/openfpga_shell/fabric_key/load_external_key/config/task.conf @@ -0,0 +1,36 @@ +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# Configuration file for running experiments +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs +# Each job execute fpga_flow script on combination of architecture & benchmark +# timeout_each_job is timeout for each job +# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +[GENERAL] +run_engine=openfpga_shell +openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/generate_secure_fabric_from_key_example_script.openfpga +power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml +power_analysis = true +spice_output=false +verilog_output=true +timeout_each_job = 20*60 +fpga_flow=vpr_blif +openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml +openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml +external_fabric_key_file=${PATH:OPENFPGA_PATH}/openfpga_flow/fabric_keys/k4_N4_2x2_sample_key.xml + +[ARCHITECTURES] +arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/arch/vpr_only_templates/k4_N4_tileable_40nm.xml + +[BENCHMARKS] +bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + +[SYNTHESIS_PARAM] +bench0_top = and2 +bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act +bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v +bench0_chan_width = 300 + +[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] +end_flow_with_test= +#vpr_fpga_verilog_formal_verification_top_netlist= From ba38120093ce0da37505dbbf16556ddd54c7e9c9 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 12 Jun 2020 16:15:16 -0600 Subject: [PATCH 180/180] add documentation for fabric key and reorganize command references --- docs/source/manual/arch_lang/fabric_key.rst | 69 +++++ docs/source/manual/arch_lang/index.rst | 2 +- docs/source/manual/openfpga_shell/index.rst | 2 +- .../openfpga_shell/openfpga_commands.rst | 280 ------------------ .../openfpga_commands/basic_commands.rst | 15 + .../fpga_bitstream_commands.rst | 31 ++ .../openfpga_commands/fpga_sdc_commands.rst | 84 ++++++ .../fpga_verilog_commands.rst | 44 +++ .../openfpga_commands/index.rst | 21 ++ .../openfpga_commands/setup_commands.rst | 127 ++++++++ .../openfpga_commands/vpr_commands.rst | 11 + 11 files changed, 404 insertions(+), 282 deletions(-) create mode 100644 docs/source/manual/arch_lang/fabric_key.rst delete mode 100644 docs/source/manual/openfpga_shell/openfpga_commands.rst create mode 100644 docs/source/manual/openfpga_shell/openfpga_commands/basic_commands.rst create mode 100644 docs/source/manual/openfpga_shell/openfpga_commands/fpga_bitstream_commands.rst create mode 100644 docs/source/manual/openfpga_shell/openfpga_commands/fpga_sdc_commands.rst create mode 100644 docs/source/manual/openfpga_shell/openfpga_commands/fpga_verilog_commands.rst create mode 100644 docs/source/manual/openfpga_shell/openfpga_commands/index.rst create mode 100644 docs/source/manual/openfpga_shell/openfpga_commands/setup_commands.rst create mode 100644 docs/source/manual/openfpga_shell/openfpga_commands/vpr_commands.rst diff --git a/docs/source/manual/arch_lang/fabric_key.rst b/docs/source/manual/arch_lang/fabric_key.rst new file mode 100644 index 000000000..1739551b7 --- /dev/null +++ b/docs/source/manual/arch_lang/fabric_key.rst @@ -0,0 +1,69 @@ +Fabric Key +~~~~~~~~~~ + +Fabric key is a secure key for users to generate bitstream for a specific FPGA fabric. +With this key, OpenFPGA can generate correct bitstreams for the FPGA. +Using a wrong key, OpenFPGA may error out or generate wrong bitstreams. +The fabric key support allows users to build secured/classified FPGA chips even with an open-source tool. + +.. note:: Users are the only owner of the key. OpenFPGA will not store or replicate the key. + +Key Generation +`````````````` +A fabric key can be achieved in the following ways: + +- OpenFPGA can auto-generate a fabric key using random algorithms (see detail in :ref:`cmd_build_fabric`) + +- Users can craft a fabric key based on auto-generated file by following the file format description. + +File Format +``````````` + +A fabric key follows an XML format. As shown in the following XML code, the key file includes the organization of configurable memory blocks in the top-level FPGA fabric: + + - ``id`` indicates the sequence of the configurable memory block in the top-level FPGA fabric. + + - ``name`` indicates the module name of the configurable memory block. + + - ``value`` indicates the instance id of the configurable memory block in the top-level FPGA fabric. + +The following is an example of a fabric key generate by OpenFPGA for a 2 :math:`\times` 2 FPGA. + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/manual/arch_lang/index.rst b/docs/source/manual/arch_lang/index.rst index f2fd146fb..bcd6287e3 100644 --- a/docs/source/manual/arch_lang/index.rst +++ b/docs/source/manual/arch_lang/index.rst @@ -25,4 +25,4 @@ OpenFPGA Architecture Description annotate_vpr_arch - + fabric_key diff --git a/docs/source/manual/openfpga_shell/index.rst b/docs/source/manual/openfpga_shell/index.rst index 24512f67d..406fc0ddf 100644 --- a/docs/source/manual/openfpga_shell/index.rst +++ b/docs/source/manual/openfpga_shell/index.rst @@ -11,4 +11,4 @@ OpenFPGA Shell openfpga_script - openfpga_commands + openfpga_commands/index diff --git a/docs/source/manual/openfpga_shell/openfpga_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands.rst deleted file mode 100644 index eb5929861..000000000 --- a/docs/source/manual/openfpga_shell/openfpga_commands.rst +++ /dev/null @@ -1,280 +0,0 @@ -.. _openfpga_commands: - -Commands --------- - -As OpenFPGA integrates various tools, the commands are categorized into different classes: - -Basic Commands -~~~~~~~~~~~~~~ - -.. option:: help - - Show help desk to list all the available commands - -.. option:: exit - - Exit OpenFPGA shell - -VPR -~~~ - -.. option:: vpr - - OpenFPGA allows users to call ``vpr`` in the standard way as documented in vtr project. - -Setup OpenFPGA -~~~~~~~~~~~~~~ - -.. option:: read_openfpga_arch - - Read the XML file about architecture description (see details in :ref:`arch_generality`) - - - ``--file`` or ``-f`` Specify the file name - - - ``--verbose`` Show verbose log - -.. option:: write_openfpga_arch - - Write the OpenFPGA XML architecture file to a file - - - ``--file`` or ``-f`` Specify the file name - - - ``--verbose`` Show verbose log - -.. option:: read_openfpga_simulation_setting - - Read the XML file about simulation settings (see details in :ref:`simulation_setting`) - - - ``--file`` or ``-f`` Specify the file name - - - ``--verbose`` Show verbose log - -.. option:: write_openfpga_simulation_setting - - Write the OpenFPGA XML simulation settings to a file - - - ``--file`` or ``-f`` Specify the file name - - - ``--verbose`` Show verbose log - -.. option:: link_openfpga_arch - - Annotate the OpenFPGA architecture to VPR data base - - - ``--activity_file`` Specify the signal activity file - - - ``--sort_gsb_chan_node_in_edges`` Sort the edges for the routing tracks in General Switch Blocks (GSBs). Strongly recommand to turn this on for uniquifying the routing modules - - - ``--verbose`` Show verbose log - -.. option:: write_gsb_to_xml - - Write the internal structure of General Switch Blocks (GSBs) across a FPGA fabric, including the interconnection between the nodes and node-level details, to XML files - - - ``--file`` or ``-f`` Specify the output directory of the XML files. Each GSB will be written to an indepedent XML file - - - ``--verbose`` Show verbose log - - .. note:: This command is used to help users to study the difference between GSBs - -.. option:: check_netlist_naming_conflict - - Check and correct any naming conflicts in the BLIF netlist - This is strongly recommended. Otherwise, the outputted Verilog netlists may not be compiled successfully. - - .. warning:: This command may be deprecated in future when it is merged to VPR upstream - - - ``--fix`` Apply fix-up to the names that violate the syntax - - - ``--report <.xml>`` Report the naming fix-up to a log file - -.. option:: pb_pin_fixup - - Apply fix-up to clustering nets based on routing results - This is strongly recommended. Otherwise, the bitstream generation may be wrong - - .. warning:: This command may be deprecated in future when it is merged to VPR upstream - - - ``--verbose`` Show verbose log - -.. option:: lut_truth_table_fixup - - Apply fix-up to Look-Up Table truth tables based on packing results - - .. warning:: This command may be deprecated in future when it is merged to VPR upstream - - - ``--verbose`` Show verbose log - -.. option:: build_fabric - - Build the module graph. - - - ``--compress_routing`` Enable compression on routing architecture modules. Strongly recommend this as it will minimize the number of routing modules to be outputted. It can reduce the netlist size significantly. - - - ``--duplicate_grid_pin`` Enable pin duplication on grid modules. This is optional unless ultra-dense layout generation is needed - - - ``--verbose`` Show verbose log - - .. note:: This is a must-run command before launching FPGA-Verilog, FPGA-Bitstream, FPGA-SDC and FPGA-SPICE - -.. option:: write_fabric_hierarchy - - Write the hierarchy of FPGA fabric graph to a plain-text file - - - ``--file`` or ``-f`` Specify the file name to write the hierarchy. - - - ``--depth`` Specify at which depth of the fabric module graph should the writer stop outputting. The root module start from depth 0. For example, if you want a two-level hierarchy, you should specify depth as 1. - - - ``--verbose`` Show verbose log - - .. note:: This file is designed for hierarchical PnR flow, which requires the tree of Multiple-Instanced-Blocks (MIBs). - -FPGA-Bitstream -~~~~~~~~~~~~~~ - -.. option:: repack - - Repack the netlist to physical pbs - This must be done before bitstream generator and testbench generation - Strongly recommend it is done after all the fix-up have been applied - - - ``--verbose`` Show verbose log - -.. option:: build_architecture_bitstream - - Decode VPR implementing results to an fabric-independent bitstream database - - - ``--file`` or ``-f`` Output the fabric-independent bitstream to an XML file - - - ``--verbose`` Show verbose log - -.. option:: build_fabric_bitstream - - Build a sequence for every configuration bits in the bitstream database for a specific FPGA fabric - - - ``--file`` or ``-f`` Output the fabric bitstream to an plain text file (only 0 or 1) - - - ``--verbose`` Show verbose log - -.. _openfpga_verilog_commands: - -FPGA-Verilog -~~~~~~~~~~~~ - -.. option:: write_fabric_verilog - - Write the Verilog netlist for FPGA fabric based on module graph - - - ``--file`` or ``-f`` Specify the output directory for the Verilog netlists - - - ``--explicit_port_mapping`` Use explicit port mapping when writing the Verilog netlists - - - ``--include_timing`` Output timing information to Verilog netlists for primitive modules - - - ``--include_signal_init`` Output signal initialization to Verilog netlists for primitive modules - - - ``--support_icarus_simulator`` Output Verilog netlists with syntax that iVerilog simulatorcan accept - - - ``--print_user_defined_template`` Output a template Verilog netlist for all the user-defined ``circuit models`` in :ref:`circuit_library`. This aims to help engineers to check what is the port sequence required by top-level Verilog netlists - - - ``--verbose`` Show verbose log - -.. option:: write_verilog_testbench - - Write the Verilog testbench for FPGA fabric - - - ``--file`` or ``-f`` The output directory for all the testbench netlists. We suggest the use of same output directory as fabric Verilog netlists - - - ``--reference_benchmark_file_path`` Must specify the reference benchmark Verilog file if you want to output any testbenches - - - ``--fast_configuration`` Enable fast configuration phase for the top-level testbench in order to reduce runtime of simulations. It is applicable to memory bank and frame-based configuration protocols. When enabled, all the zero configuration bits will be skipped. So ensure that your memory cells can be correctly reset to zero with a reset signal. - - - ``--print_top_testbench`` Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA - - - ``--print_formal_verification_top_netlist`` Generate a top-level module which can be used in formal verification - - - ``--print_preconfig_top_testbench`` Enable pre-configured top-level testbench which is a fast verification skipping programming phase - - - ``--print_simulation_ini`` Output an exchangeable simulation ini file, which is needed only when you need to interface different HDL simulators using openfpga flow-run scripts - - - ``--explicit_port_mapping`` Use explicit port mapping when writing the Verilog netlists - -FPGA-SDC -~~~~~~~~ - -.. option:: write_pnr_sdc - - Write the SDC files for PnR backend - - - ``--file`` or ``-f`` Specify the output directory for SDC files - - - ``--hierarchical`` Output SDC files without full path in hierarchy - - - ``--flatten_names`` Use flatten names (no wildcards) in SDC files - - - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). - - - ``--output_hierarchy`` Output hierarchy of Multiple-Instance-Blocks(MIBs) to plain text file. This is applied to constrain timing for grids, Switch Blocks and Connection Blocks. - - .. note:: Valid only when ``compress_routing`` is enabled in ``build_fabric`` - - - ``--constrain_global_port`` Constrain all the global ports of FPGA fabric. - - - ``--constrain_non_clock_global_port`` Constrain all the non-clock global ports as clocks ports of FPGA fabric - - .. note:: ``constrain_global_port`` will treat these global ports in Clock Tree Synthesis (CTS), in purpose of balancing the delay to each sink. Be carefull to enable ``constrain_non_clock_global_port``, this may significanly increase the runtime of CTS as it is supposed to be routed before any other nets. This may cause routing congestion as well. - - - ``--constrain_grid`` Constrain all the grids of FPGA fabric - - - ``--constrain_sb`` Constrain all the switch blocks of FPGA fabric - - - ``--constrain_cb`` Constrain all the connection blocks of FPGA fabric - - - ``--constrain_configurable_memory_outputs`` Constrain all the outputs of configurable memories of FPGA fabric - - - ``--constrain_routing_multiplexer_outputs`` Constrain all the outputs of routing multiplexer of FPGA fabric - - - ``--constrain_switch_block_outputs`` Constrain all the outputs of switch blocks of FPGA fabric - - - ``--constrain_zero_delay_paths`` Constrain all the zero-delay paths in FPGA fabric - - .. note:: Zero-delay path may cause errors in some PnR tools as it is considered illegal - - - ``--verbose`` Enable verbose output - -.. option:: write_configuration_chain_sdc - - Write the SDC file to constrain the timing for configuration chain. The timing constraints will always start from the first output (Q) of a Configuration Chain Flip-flop (CCFF) and ends at the inputs of the next CCFF in the chain. Note that Qb of CCFF will not be constrained! - - - ``--file`` or ``-f`` Specify the output SDC file - - - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). - - - - ``--max_delay`` Specify the maximum delay to be used. The timing value should follow the time unit defined in this command. - - - ``--min_delay`` Specify the minimum delay to be used. The timing value should follow the time unit defined in this command. - - .. note:: - Only applicable when configuration chain is used as configuration protocol - -.. option:: write_sdc_disable_timing_configure_ports - - Write the SDC file to disable timing for configure ports of programmable modules. The SDC aims to break the combinational loops across FPGAs and avoid false path timing to be visible to timing analyzers - - - ``--file`` or ``-f`` Specify the output SDC file - - - ``--flatten_names`` Use flatten names (no wildcards) in SDC files - - - ``--verbose`` Show verbose log - -.. option:: write_analysis_sdc - - Write the SDC to run timing analysis for a mapped FPGA fabric - - - ``--file`` or ``-f`` Specify the output directory for SDC files - - - ``--flatten_names`` Use flatten names (no wildcards) in SDC files - - - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). diff --git a/docs/source/manual/openfpga_shell/openfpga_commands/basic_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands/basic_commands.rst new file mode 100644 index 000000000..727448a61 --- /dev/null +++ b/docs/source/manual/openfpga_shell/openfpga_commands/basic_commands.rst @@ -0,0 +1,15 @@ +.. _openfpga_basic_commands: + +Basic Commands +-------------- + +help +~~~~ + + Show help desk to list all the available commands + +exit +~~~~ + + Exit OpenFPGA shell + diff --git a/docs/source/manual/openfpga_shell/openfpga_commands/fpga_bitstream_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands/fpga_bitstream_commands.rst new file mode 100644 index 000000000..62ab8bec4 --- /dev/null +++ b/docs/source/manual/openfpga_shell/openfpga_commands/fpga_bitstream_commands.rst @@ -0,0 +1,31 @@ +.. _openfpga_bitstream_commands: + +FPGA-Bitstream +-------------- + +repack +~~~~~~ + + Repack the netlist to physical pbs + This must be done before bitstream generator and testbench generation + Strongly recommend it is done after all the fix-up have been applied + + - ``--verbose`` Show verbose log + +build_architecture_bitstream +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Decode VPR implementing results to an fabric-independent bitstream database + + - ``--file`` or ``-f`` Output the fabric-independent bitstream to an XML file + + - ``--verbose`` Show verbose log + +build_fabric_bitstream +~~~~~~~~~~~~~~~~~~~~~~ + + Build a sequence for every configuration bits in the bitstream database for a specific FPGA fabric + + - ``--file`` or ``-f`` Output the fabric bitstream to an plain text file (only 0 or 1) + + - ``--verbose`` Show verbose log diff --git a/docs/source/manual/openfpga_shell/openfpga_commands/fpga_sdc_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands/fpga_sdc_commands.rst new file mode 100644 index 000000000..f5f0b83af --- /dev/null +++ b/docs/source/manual/openfpga_shell/openfpga_commands/fpga_sdc_commands.rst @@ -0,0 +1,84 @@ +.. _openfpga_sdc_commands: + +FPGA-SDC +-------- + +write_pnr_sdc +~~~~~~~~~~~~~ + + Write the SDC files for PnR backend + + - ``--file`` or ``-f`` Specify the output directory for SDC files + + - ``--hierarchical`` Output SDC files without full path in hierarchy + + - ``--flatten_names`` Use flatten names (no wildcards) in SDC files + + - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). + + - ``--output_hierarchy`` Output hierarchy of Multiple-Instance-Blocks(MIBs) to plain text file. This is applied to constrain timing for grids, Switch Blocks and Connection Blocks. + + .. note:: Valid only when ``compress_routing`` is enabled in ``build_fabric`` + + - ``--constrain_global_port`` Constrain all the global ports of FPGA fabric. + + - ``--constrain_non_clock_global_port`` Constrain all the non-clock global ports as clocks ports of FPGA fabric + + .. note:: ``constrain_global_port`` will treat these global ports in Clock Tree Synthesis (CTS), in purpose of balancing the delay to each sink. Be carefull to enable ``constrain_non_clock_global_port``, this may significanly increase the runtime of CTS as it is supposed to be routed before any other nets. This may cause routing congestion as well. + + - ``--constrain_grid`` Constrain all the grids of FPGA fabric + + - ``--constrain_sb`` Constrain all the switch blocks of FPGA fabric + + - ``--constrain_cb`` Constrain all the connection blocks of FPGA fabric + + - ``--constrain_configurable_memory_outputs`` Constrain all the outputs of configurable memories of FPGA fabric + + - ``--constrain_routing_multiplexer_outputs`` Constrain all the outputs of routing multiplexer of FPGA fabric + + - ``--constrain_switch_block_outputs`` Constrain all the outputs of switch blocks of FPGA fabric + + - ``--constrain_zero_delay_paths`` Constrain all the zero-delay paths in FPGA fabric + + .. note:: Zero-delay path may cause errors in some PnR tools as it is considered illegal + + - ``--verbose`` Enable verbose output + +write_configuration_chain_sdc +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Write the SDC file to constrain the timing for configuration chain. The timing constraints will always start from the first output (Q) of a Configuration Chain Flip-flop (CCFF) and ends at the inputs of the next CCFF in the chain. Note that Qb of CCFF will not be constrained! + + - ``--file`` or ``-f`` Specify the output SDC file + + - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). + + + - ``--max_delay`` Specify the maximum delay to be used. The timing value should follow the time unit defined in this command. + + - ``--min_delay`` Specify the minimum delay to be used. The timing value should follow the time unit defined in this command. + + .. note:: + Only applicable when configuration chain is used as configuration protocol + +write_sdc_disable_timing_configure_ports +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Write the SDC file to disable timing for configure ports of programmable modules. The SDC aims to break the combinational loops across FPGAs and avoid false path timing to be visible to timing analyzers + + - ``--file`` or ``-f`` Specify the output SDC file + + - ``--flatten_names`` Use flatten names (no wildcards) in SDC files + + - ``--verbose`` Show verbose log + +write_analysis_sdc +~~~~~~~~~~~~~~~~~~ + + Write the SDC to run timing analysis for a mapped FPGA fabric + + - ``--file`` or ``-f`` Specify the output directory for SDC files + + - ``--flatten_names`` Use flatten names (no wildcards) in SDC files + + - ``--time_unit`` Specify a time unit to be used in SDC files. Acceptable values are string: ``as`` | ``fs`` | ``ps`` | ``ns`` | ``us`` | ``ms`` | ``ks`` | ``Ms``. By default, we will consider second (``s``). diff --git a/docs/source/manual/openfpga_shell/openfpga_commands/fpga_verilog_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands/fpga_verilog_commands.rst new file mode 100644 index 000000000..de4aecad8 --- /dev/null +++ b/docs/source/manual/openfpga_shell/openfpga_commands/fpga_verilog_commands.rst @@ -0,0 +1,44 @@ +.. _openfpga_verilog_commands: + +FPGA-Verilog +------------ + +write_fabric_verilog +~~~~~~~~~~~~~~~~~~~~ + + Write the Verilog netlist for FPGA fabric based on module graph + + - ``--file`` or ``-f`` Specify the output directory for the Verilog netlists + + - ``--explicit_port_mapping`` Use explicit port mapping when writing the Verilog netlists + + - ``--include_timing`` Output timing information to Verilog netlists for primitive modules + + - ``--include_signal_init`` Output signal initialization to Verilog netlists for primitive modules + + - ``--support_icarus_simulator`` Output Verilog netlists with syntax that iVerilog simulatorcan accept + + - ``--print_user_defined_template`` Output a template Verilog netlist for all the user-defined ``circuit models`` in :ref:`circuit_library`. This aims to help engineers to check what is the port sequence required by top-level Verilog netlists + + - ``--verbose`` Show verbose log + +write_verilog_testbench +~~~~~~~~~~~~~~~~~~~~~~~ + + Write the Verilog testbench for FPGA fabric + + - ``--file`` or ``-f`` The output directory for all the testbench netlists. We suggest the use of same output directory as fabric Verilog netlists + + - ``--reference_benchmark_file_path`` Must specify the reference benchmark Verilog file if you want to output any testbenches + + - ``--fast_configuration`` Enable fast configuration phase for the top-level testbench in order to reduce runtime of simulations. It is applicable to memory bank and frame-based configuration protocols. When enabled, all the zero configuration bits will be skipped. So ensure that your memory cells can be correctly reset to zero with a reset signal. + + - ``--print_top_testbench`` Enable top-level testbench which is a full verification including programming circuit and core logic of FPGA + + - ``--print_formal_verification_top_netlist`` Generate a top-level module which can be used in formal verification + + - ``--print_preconfig_top_testbench`` Enable pre-configured top-level testbench which is a fast verification skipping programming phase + + - ``--print_simulation_ini`` Output an exchangeable simulation ini file, which is needed only when you need to interface different HDL simulators using openfpga flow-run scripts + + - ``--explicit_port_mapping`` Use explicit port mapping when writing the Verilog netlists diff --git a/docs/source/manual/openfpga_shell/openfpga_commands/index.rst b/docs/source/manual/openfpga_shell/openfpga_commands/index.rst new file mode 100644 index 000000000..2a9f871b6 --- /dev/null +++ b/docs/source/manual/openfpga_shell/openfpga_commands/index.rst @@ -0,0 +1,21 @@ +Commands +-------- + +As OpenFPGA integrates various tools, the commands are categorized into different classes: + +.. _openfpga_commands: + +.. toctree:: + :maxdepth: 2 + + basic_commands + + vpr_commands + + setup_commands + + fpga_bitstream_commands + + fpga_verilog_commands + + fpga_sdc_commands diff --git a/docs/source/manual/openfpga_shell/openfpga_commands/setup_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands/setup_commands.rst new file mode 100644 index 000000000..aa0018476 --- /dev/null +++ b/docs/source/manual/openfpga_shell/openfpga_commands/setup_commands.rst @@ -0,0 +1,127 @@ +.. _openfpga_setup_commands: + +Setup OpenFPGA +-------------- + +read_openfpga_arch +~~~~~~~~~~~~~~~~~~ + + Read the XML file about architecture description (see details in :ref:`arch_generality`) + + - ``--file`` or ``-f`` Specify the file name + + - ``--verbose`` Show verbose log + +write_openfpga_arch +~~~~~~~~~~~~~~~~~~~ + + Write the OpenFPGA XML architecture file to a file + + - ``--file`` or ``-f`` Specify the file name + + - ``--verbose`` Show verbose log + +read_openfpga_simulation_setting +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Read the XML file about simulation settings (see details in :ref:`simulation_setting`) + + - ``--file`` or ``-f`` Specify the file name + + - ``--verbose`` Show verbose log + +write_openfpga_simulation_setting +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Write the OpenFPGA XML simulation settings to a file + + - ``--file`` or ``-f`` Specify the file name + + - ``--verbose`` Show verbose log + +link_openfpga_arch +~~~~~~~~~~~~~~~~~~ + + Annotate the OpenFPGA architecture to VPR data base + + - ``--activity_file`` Specify the signal activity file + + - ``--sort_gsb_chan_node_in_edges`` Sort the edges for the routing tracks in General Switch Blocks (GSBs). Strongly recommand to turn this on for uniquifying the routing modules + + - ``--verbose`` Show verbose log + +write_gsb_to_xml +~~~~~~~~~~~~~~~~ + + Write the internal structure of General Switch Blocks (GSBs) across a FPGA fabric, including the interconnection between the nodes and node-level details, to XML files + + - ``--file`` or ``-f`` Specify the output directory of the XML files. Each GSB will be written to an indepedent XML file + + - ``--verbose`` Show verbose log + + .. note:: This command is used to help users to study the difference between GSBs + +check_netlist_naming_conflict +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Check and correct any naming conflicts in the BLIF netlist + This is strongly recommended. Otherwise, the outputted Verilog netlists may not be compiled successfully. + + .. warning:: This command may be deprecated in future when it is merged to VPR upstream + + - ``--fix`` Apply fix-up to the names that violate the syntax + + - ``--report <.xml>`` Report the naming fix-up to a log file + +pb_pin_fixup +~~~~~~~~~~~~ + + Apply fix-up to clustering nets based on routing results + This is strongly recommended. Otherwise, the bitstream generation may be wrong + + .. warning:: This command may be deprecated in future when it is merged to VPR upstream + + - ``--verbose`` Show verbose log + +lut_truth_table_fixup +~~~~~~~~~~~~~~~~~~~~~ + + Apply fix-up to Look-Up Table truth tables based on packing results + + .. warning:: This command may be deprecated in future when it is merged to VPR upstream + + - ``--verbose`` Show verbose log + +.. _cmd_build_fabric: + +build_fabric +~~~~~~~~~~~~ + + Build the module graph. + + - ``--compress_routing`` Enable compression on routing architecture modules. Strongly recommend this as it will minimize the number of routing modules to be outputted. It can reduce the netlist size significantly. + + - ``--duplicate_grid_pin`` Enable pin duplication on grid modules. This is optional unless ultra-dense layout generation is needed + + - ``--load_fabric_key `` Load an external fabric key from an XML file. + + - ``--generate_fabric_key`` Generate a fabric key in a random way + + - ``--write_fabric_key `` Output current fabric key to an XML file + + - ``--verbose`` Show verbose log + + .. note:: This is a must-run command before launching FPGA-Verilog, FPGA-Bitstream, FPGA-SDC and FPGA-SPICE + +write_fabric_hierarchy +~~~~~~~~~~~~~~~~~~~~~~ + + Write the hierarchy of FPGA fabric graph to a plain-text file + + - ``--file`` or ``-f`` Specify the file name to write the hierarchy. + + - ``--depth`` Specify at which depth of the fabric module graph should the writer stop outputting. The root module start from depth 0. For example, if you want a two-level hierarchy, you should specify depth as 1. + + - ``--verbose`` Show verbose log + + .. note:: This file is designed for hierarchical PnR flow, which requires the tree of Multiple-Instanced-Blocks (MIBs). diff --git a/docs/source/manual/openfpga_shell/openfpga_commands/vpr_commands.rst b/docs/source/manual/openfpga_shell/openfpga_commands/vpr_commands.rst new file mode 100644 index 000000000..cbdad4a53 --- /dev/null +++ b/docs/source/manual/openfpga_shell/openfpga_commands/vpr_commands.rst @@ -0,0 +1,11 @@ +.. _openfpga_vpr_commands: + +VPR Commands +------------ + +vpr +~~~ + + OpenFPGA allows users to call ``vpr`` in the standard way as documented in the vtr_project_. + +.. _vtr_project: https://github.com/verilog-to-routing/vtr-verilog-to-routing