Merge pull request #999 from CAS-Atlantic/simulation_mem_leak_model_name Simulation mem leak - model->name
diff --git a/vpr/src/base/SetupVPR.cpp b/vpr/src/base/SetupVPR.cpp index 5c74449..2bd4384 100644 --- a/vpr/src/base/SetupVPR.cpp +++ b/vpr/src/base/SetupVPR.cpp
@@ -486,6 +486,8 @@ PlacerOpts->write_placement_delay_lookup = Options.write_placement_delay_lookup; PlacerOpts->read_placement_delay_lookup = Options.read_placement_delay_lookup; + + PlacerOpts->allowed_tiles_for_delay_model = Options.allowed_tiles_for_delay_model; } static void SetupAnalysisOpts(const t_options& Options, t_analysis_opts& analysis_opts) {
diff --git a/vpr/src/base/read_options.cpp b/vpr/src/base/read_options.cpp index 576eb62..6166ab1 100644 --- a/vpr/src/base/read_options.cpp +++ b/vpr/src/base/read_options.cpp
@@ -1384,6 +1384,14 @@ .default_value("") .show_in(argparse::ShowIn::HELP_ONLY); + place_timing_grp.add_argument(args.allowed_tiles_for_delay_model, "--allowed_tiles_for_delay_model") + .help( + "Names of allowed tile types that can be sampled during delay " + "modelling. Default is to allow all tiles. Can be used to " + "exclude specialized tiles from placer delay sampling.") + .default_value("") + .show_in(argparse::ShowIn::HELP_ONLY); + auto& route_grp = parser.add_argument_group("routing options"); route_grp.add_argument(args.max_router_iterations, "--max_router_iterations")
diff --git a/vpr/src/base/read_options.h b/vpr/src/base/read_options.h index 55142a5..d1f45e5 100644 --- a/vpr/src/base/read_options.h +++ b/vpr/src/base/read_options.h
@@ -115,6 +115,7 @@ argparse::ArgValue<std::string> post_place_timing_report_file; argparse::ArgValue<PlaceDelayModelType> place_delay_model; argparse::ArgValue<e_reducer> place_delay_model_reducer; + argparse::ArgValue<std::string> allowed_tiles_for_delay_model; /* Router Options */ argparse::ArgValue<int> max_router_iterations;
diff --git a/vpr/src/base/vpr_types.h b/vpr/src/base/vpr_types.h index 01dca22..1eb4ffb 100644 --- a/vpr/src/base/vpr_types.h +++ b/vpr/src/base/vpr_types.h
@@ -808,6 +808,12 @@ std::string write_placement_delay_lookup; std::string read_placement_delay_lookup; + + // Tile types that should be used during delay sampling. + // + // Useful for excluding tiles that have abnormal delay behavior, e.g. + // clock tree elements like PLL's, global/local clock buffers, etc. + std::string allowed_tiles_for_delay_model; }; /* All the parameters controlling the router's operation are in this *
diff --git a/vpr/src/place/timing_place_lookup.cpp b/vpr/src/place/timing_place_lookup.cpp index 0254225..c3c4fac 100644 --- a/vpr/src/place/timing_place_lookup.cpp +++ b/vpr/src/place/timing_place_lookup.cpp
@@ -87,7 +87,8 @@ int end_x, int end_y, const t_router_opts& router_opts, - bool measure_directconnect); + bool measure_directconnect, + const std::set<std::string>& allowed_types); static vtr::Matrix<float> compute_delta_delays( const RouterDelayProfiler& route_profiler, @@ -351,7 +352,8 @@ int end_x, int end_y, const t_router_opts& router_opts, - bool measure_directconnect) { + bool measure_directconnect, + const std::set<std::string>& allowed_types) { int delta_x, delta_y; int sink_x, sink_y; @@ -368,7 +370,9 @@ bool src_or_target_empty = (src_type == device_ctx.EMPTY_TYPE || sink_type == device_ctx.EMPTY_TYPE); - if (src_or_target_empty) { + bool is_allowed_type = allowed_types.empty() || allowed_types.find(src_type->name) != allowed_types.end(); + + if (src_or_target_empty || !is_allowed_type) { if (matrix[delta_x][delta_y].empty()) { //Only set empty target if we don't already have a valid delta delay matrix[delta_x][delta_y].push_back(EMPTY_DELTA); @@ -427,6 +431,14 @@ size_t high_x = std::max(grid.width() - longest_length, mid_x); size_t high_y = std::max(grid.height() - longest_length, mid_y); + std::set<std::string> allowed_types; + if (!placer_opts.allowed_tiles_for_delay_model.empty()) { + auto allowed_types_vector = vtr::split(placer_opts.allowed_tiles_for_delay_model, ","); + for (const auto& type : allowed_types_vector) { + allowed_types.insert(type); + } + } + // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // + | | + // + A | B | C + @@ -462,6 +474,9 @@ auto type = grid[x][y].type; if (type != device_ctx.EMPTY_TYPE) { + if (!allowed_types.empty() && allowed_types.find(std::string(type->name)) == allowed_types.end()) { + continue; + } src_type = type; break; } @@ -480,7 +495,7 @@ x, y, grid.width() - 1, grid.height() - 1, router_opts, - measure_directconnect); + measure_directconnect, allowed_types); //Find the lowest x location on the bottom edge with a non-empty block src_type = nullptr; @@ -489,6 +504,9 @@ auto type = grid[x][y].type; if (type != device_ctx.EMPTY_TYPE) { + if (!allowed_types.empty() && allowed_types.find(std::string(type->name)) == allowed_types.end()) { + continue; + } src_type = type; break; } @@ -506,7 +524,7 @@ x, y, grid.width() - 1, grid.height() - 1, router_opts, - measure_directconnect); + measure_directconnect, allowed_types); //Since the other delta delay values may have suffered from edge effects, //we recalculate deltas within regions B, C, E, F @@ -518,7 +536,7 @@ low_x, low_y, grid.width() - 1, grid.height() - 1, router_opts, - measure_directconnect); + measure_directconnect, allowed_types); //Since the other delta delay values may have suffered from edge effects, //we recalculate deltas within regions D, E, G, H @@ -530,7 +548,7 @@ 0, 0, high_x, high_y, router_opts, - measure_directconnect); + measure_directconnect, allowed_types); //Since the other delta delay values may have suffered from edge effects, //we recalculate deltas within regions A, B, D, E @@ -542,7 +560,7 @@ 0, low_y, high_x, grid.height() - 1, router_opts, - measure_directconnect); + measure_directconnect, allowed_types); //Since the other delta delay values may have suffered from edge effects, //we recalculate deltas within regions E, F, H, I @@ -554,7 +572,7 @@ low_x, 0, grid.width() - 1, high_y, router_opts, - measure_directconnect); + measure_directconnect, allowed_types); vtr::Matrix<float> delta_delays({grid.width(), grid.height()}); for (size_t dx = 0; dx < sampled_delta_delays.dim_size(0); ++dx) {
diff --git a/vpr/src/route/route_timing.cpp b/vpr/src/route/route_timing.cpp index 25b4d58..5e2f358 100644 --- a/vpr/src/route/route_timing.cpp +++ b/vpr/src/route/route_timing.cpp
@@ -2033,6 +2033,11 @@ //Update total cost float expected_cost = router_lookahead.get_expected_cost(to_node, target_node, cost_params, to->R_upstream); + VTR_LOGV_DEBUG(f_router_debug && !std::isfinite(expected_cost), + " Lookahead from %s (%s) to %s (%s) is non-finite, expected_cost = %f, to->R_upstream = %f\n", + rr_node_arch_name(to_node).c_str(), describe_rr_node(to_node).c_str(), + rr_node_arch_name(target_node).c_str(), describe_rr_node(target_node).c_str(), + expected_cost, to->R_upstream); total_cost = to->backward_path_cost + cost_params.astar_fac * expected_cost; to->cost = total_cost;
diff --git a/vpr/valgrind.supp b/vpr/valgrind.supp new file mode 100644 index 0000000..6bd7272 --- /dev/null +++ b/vpr/valgrind.supp
@@ -0,0 +1,711 @@ +# +# Valgrind suppression file for EZGL +# + +#pango +{ + libpango + Memcheck:Leak + ... + obj:/usr/lib*/libpango* +} + +#GTK +{ + g_type_register + Memcheck:Leak + fun:*alloc + ... + fun:g_type_register_* + ... + fun:_dl_init + ... +} + +{ + g_quark_from_static_string + Memcheck:Leak + fun:*alloc + ... + fun:g_quark_from_static_string + ... + fun:_dl_init + ... +} + +{ + g_main_thread + Memcheck:Leak + fun:*alloc + ... + fun:g_main* + ... + fun:start_thread + fun:clone +} + +{ + g_closure + Memcheck:Leak + match-leak-kinds:possible + fun:*alloc + ... + fun:g_cclosure_new + fun:g_signal_connect_data + ... +} + +# +{ + g_object + Memcheck:Leak + match-leak-kinds:possible + ... + fun:g_object_new + ... +} + +{ + g_type_register_static + Memcheck:Leak + match-leak-kinds:possible + ... + fun:g_type_register_static + ... +} + +{ + g_signal_connect_closure + Memcheck:Leak + match-leak-kinds:possible + ... + fun:g_signal_connect_closure + fun:gtk_*group* + ... +} + +{ + gtk_module_init + Memcheck:Leak + + fun:*alloc + ... + fun:gtk_module_init + ... +} + +{ + g_closure_invoke + Memcheck:Leak + + fun:*alloc + ... + fun:g_closure_invoke + ... +} + +{ + gtk_style_context_set_state + Memcheck:Leak + + fun:*alloc + ... + fun:gtk_style_context_set_state + ... +} + +# +{ + call_init + Memcheck:Leak + + fun:*alloc + ... + fun:call_init + fun:_dl_init + ... +} + +{ + XML_ParseBuffer + Memcheck:Leak + fun:*alloc + ... + fun:XML_ParseBuffer + ... +} + +{ + FcConfigParseAndLoad + Memcheck:Leak + fun:*alloc + ... + fun:FcConfigParseAndLoad + ... +} + +# +{ + g_objectv + Memcheck:Leak + + ... + fun:g_object_newv + ... +} + +{ + g_type_add_interface_static + Memcheck:Leak + match-leak-kinds:possible + ... + fun:g_type_add_interface_static + ... +} + +{ + gtk_container_get_children + Memcheck:Leak + fun:*alloc + ... + fun:gtk_container_get_children + ... +} + +{ + cairo_select_font_face + Memcheck:Leak + fun:*alloc + ... + fun:cairo_select_font_face + ... +} + +{ + libfontconfig + Memcheck:Leak + fun:*alloc + ... + obj:*libfontconfig.so.* + ... +} + +{ + X11_XGetDefault + Memcheck:Leak + fun:realloc + obj:*libX11.so.6.3.0 + obj:*libX11.so.6.3.0 + obj:*libX11.so.6.3.0 + fun:_XlcCreateLC + fun:_XlcDefaultLoader + fun:_XOpenLC + fun:_XrmInitParseInfo + obj:*libX11.so.6.3.0 + fun:XrmGetStringDatabase + obj:*libX11.so.6.3.0 + fun:XGetDefault +} + +{ + XInternAtom_via_event_loop + Memcheck:Leak + fun:*alloc + fun:_XEnq + obj:*libX11.so.6.3.0 + fun:_XReply + fun:XInternAtom + ... +} + +{ + cairo_deep_*alloc + Memcheck:Leak + fun:*alloc + obj:*libcairo.* + ... +} + +#openmp +{ + GOMP_parallel + Memcheck:Leak + + fun:*alloc + fun:allocate_dtv + fun:_dl_allocate_tls + fun:allocate_stack + fun:pthread_create@@GLIBC_2.2.5 + ... +} + + +#GTK engines +{ + engines + Memcheck:Leak + fun:*alloc + ... + obj:/usr/lib*/gtk*/*/engines* + ... + obj:/usr/lib*/libgtk* +} + +#nvidia +{ + libGL + Memcheck:Leak + ... + obj:/usr/lib*/libGL.so* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_socket_create_source + ... + fun:g_main_context_dispatch +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + ... + fun:gtk_init_check + fun:gtk_init + obj:*libgtk-3* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_markup_parse_context_parse + obj:*libgtk-3* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_socket_new + obj:*libgio-2* + fun:g_socket_client_connect + obj:*libgio-2* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:atk_add_focus_tracker + obj:*libgtk-3* + ... + fun:gtk_parse_args + fun:gtk_init_check +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:m*alloc + ... + fun:g_bus_get_sync + ... + fun:g_application_register + obj:*libgio-2* + fun:g_application_run +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + obj:*libgtk-3* + fun:g_closure_invoke + ... + fun:g_signal_emit_valist + fun:g_signal_emit +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_simple_async_result_complete + ... + fun:g_main_context_dispatch + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + ... + fun:atk_add_focus_tracker + obj:*libgtk-3* + ... + fun:g_option_context_parse +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + fun:atk_add_focus_tracker + obj:*libgtk-3* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_dbus_proxy_new_sync + obj:*libgtk-3* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + obj:*libgobject-2* + fun:g_type_class_ref + fun:g_object_new_valist + fun:g_initable_new_valist + fun:g_initable_new +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + obj:*libgtk-3* + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + obj:*libgtk-3* + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + fun:atk_add_focus_tracker + obj:*libgtk-3* + ... + fun:g_option_context_parse +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + + fun:*alloc + ... + fun:g_signal_new_class_handler + obj:*libgtk-3* + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_connect_data + obj:*libgtk-3* + ... + fun:gtk_widget_show + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + fun:g_object_new_valist + fun:g_initable_new_valist + fun:g_initable_new + fun:gvfs_dbus_mount_tracker_proxy_new_for_bus_sync + ... + fun:g_type_create_instance +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + fun:g_*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... + fun:g_markup_parse_context_parse +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... + fun:g_option_context_parse + fun:gtk_parse_args + fun:gtk_init_check +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + fun:atk_bridge_adaptor_init + obj:*libgtk-3* + ... + fun:g_option_context_parse + fun:gtk_parse_args + fun:gtk_init_check + fun:gtk_init +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* + fun:atk_add_focus_tracker + obj:*libgtk-3* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_initable_new +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + obj:*libgtk-3* + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new + ... + fun:g_type_class_ref + obj:*libgio-2.0.so.0.4002.0 + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_new_class_handler + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_signal_connect_data + ... + fun:gtk_widget_show + obj:*libgtk-3* + ... +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_initable_new + ... + fun:g_type_create_instance +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... + fun:g_markup_parse_context_parse +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:malloc + ... + fun:g_type_class_ref + obj:*libgtk-3* + ... + fun:gtk_init_check +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:malloc + ... + fun:atk_bridge_adaptor_init + obj:*libgtk-3* + ... + fun:gtk_init +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_application_register + obj:*libgio-2* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_thread_new + obj:*libgio-2* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + fun:*alloc + ... + fun:g_thread_pool_push + ... + fun:g_bus_get + fun:g_bus_watch_name +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + match-leak-kinds: possible + fun:*alloc + ... + fun:g_param_spec_enum + ... + fun:g_bus_get_sync + obj:*libgio-* + fun:g_application_register +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + match-leak-kinds: possible + fun:*alloc + fun:g_realloc + ... + fun:gtk_button_set_image_position + fun:g_object_setv + ... + obj:*libgtk-3* +} +{ + <insert_a_suppression_name_here> + Memcheck:Leak + match-leak-kinds: possible + fun:*alloc + ... + fun:gtk_cell_renderer_render + ... + obj:*libgtk-3* +} \ No newline at end of file
diff --git a/vtr_flow/scripts/run_vtr_flow.pl b/vtr_flow/scripts/run_vtr_flow.pl index ba384cd..b298769 100755 --- a/vtr_flow/scripts/run_vtr_flow.pl +++ b/vtr_flow/scripts/run_vtr_flow.pl
@@ -109,7 +109,7 @@ my $limit_memory_usage = -1; my $timeout = 14 * 24 * 60 * 60; # 14 day execution timeout my $valgrind = 0; -my @valgrind_args = ("--leak-check=full", "--errors-for-leak-kinds=none", "--error-exitcode=1", "--track-origins=yes"); +my @valgrind_args = ("--leak-check=full", "--suppressions=$vtr_flow_path/../vpr/valgrind.supp", "--error-exitcode=1", "--errors-for-leak-kinds=none", "--track-origins=yes", "--log-file=valgrind.log","--error-limit=no"); my $abc_quote_addition = 0; my @forwarded_vpr_args; # VPR arguments that pass through the script my $verify_rr_graph = 0;