Merge pull request #1001 from CAS-Atlantic/simulation_mem_leak_stage_num_children

Simulation mem leak - num_children in stage struct
diff --git a/ODIN_II/SRC/read_blif.cpp b/ODIN_II/SRC/read_blif.cpp
index 9807d05..849a888 100644
--- a/ODIN_II/SRC/read_blif.cpp
+++ b/ODIN_II/SRC/read_blif.cpp
@@ -1785,6 +1785,7 @@
 	free_hard_block_ports(model->input_ports);
 	free_hard_block_ports(model->output_ports);
 
+	vtr::free(model->name); 
 	vtr::free(model);
 }
 
diff --git a/ODIN_II/SRC/simulate_blif.cpp b/ODIN_II/SRC/simulate_blif.cpp
index b334418..e7f5113 100644
--- a/ODIN_II/SRC/simulate_blif.cpp
+++ b/ODIN_II/SRC/simulate_blif.cpp
@@ -3380,6 +3380,8 @@
 						vtr::free(l->lines[l->count]->name);
 					if(l->lines[l->count]->pins)
 						vtr::free(l->lines[l->count]->pins);
+					if(l->lines[l->count]->pin_numbers)
+						vtr::free(l->lines[l->count]->pin_numbers);
 					vtr::free(l->lines[l->count]);
 				}
 			}
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/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;