From 51c4af4fb73018b0e33063f56f005163a7159c05 Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Tue, 20 May 2025 14:01:18 +0300 Subject: [PATCH 1/8] add show-resource-usage mode --- vpr/src/base/read_options.cpp | 3 +++ vpr/src/base/read_options.h | 1 + vpr/src/base/vpr_api.cpp | 46 +++++++++++++++++++++++++++++++++++ vpr/src/base/vpr_api.h | 3 +++ vpr/src/main.cpp | 6 +++++ 5 files changed, 59 insertions(+) diff --git a/vpr/src/base/read_options.cpp b/vpr/src/base/read_options.cpp index 553a964d306..cdb46330c8e 100644 --- a/vpr/src/base/read_options.cpp +++ b/vpr/src/base/read_options.cpp @@ -1584,6 +1584,9 @@ argparse::ArgumentParser create_arg_parser(const std::string& prog_name, t_optio .help("Show version information then exit") .action(argparse::Action::VERSION); + gen_grp.add_argument(args.show_resource_usage_only_mode, "--show_resource_usage") + .help("Show resource usage then exit"); + gen_grp.add_argument(args.device_layout, "--device") .help( "Controls which device layout/floorplan is used from the architecture file." diff --git a/vpr/src/base/read_options.h b/vpr/src/base/read_options.h index 5e26d36725b..4eaabc3d9c8 100644 --- a/vpr/src/base/read_options.h +++ b/vpr/src/base/read_options.h @@ -68,6 +68,7 @@ struct t_options { /* General options */ argparse::ArgValue show_help; argparse::ArgValue show_version; + argparse::ArgValue show_resource_usage_only_mode; argparse::ArgValue num_workers; argparse::ArgValue timing_analysis; argparse::ArgValue timing_update_type; diff --git a/vpr/src/base/vpr_api.cpp b/vpr/src/base/vpr_api.cpp index 4dc4732c90c..d0c297cc931 100644 --- a/vpr/src/base/vpr_api.cpp +++ b/vpr/src/base/vpr_api.cpp @@ -388,6 +388,52 @@ static void unset_port_equivalences(DeviceContext& device_ctx) { } } +void vpr_show_resource_usage(const t_vpr_setup& vpr_setup, const t_arch& Arch) +{ + vtr::ScopedStartFinishTimer timer("Build Device Grid"); + /* Read in netlist file for placement and routing */ + auto& device_ctx = g_vpr_ctx.mutable_device(); + + device_ctx.arch = &Arch; + + /* + *Load the device grid + */ + + //Record the resource requirement + std::map num_type_instances; + + //Build the device + for (const auto& l: Arch.grid_layouts) { + std::string device_layout_variant = l.name; + + float target_device_utilization = vpr_setup.PackerOpts.target_device_utilization; + device_ctx.grid = create_device_grid(device_layout_variant, Arch.grid_layouts, num_type_instances, target_device_utilization); + + /* + *Report on the device + */ + size_t num_grid_tiles = count_grid_tiles(device_ctx.grid); + VTR_LOG("FPGA sized to %zu x %zu: %zu grid tiles (%s)\n", device_ctx.grid.width(), device_ctx.grid.height(), num_grid_tiles, device_ctx.grid.name().c_str()); + + std::string title("\nResource usage for device layout " + device_layout_variant + "...\n"); + VTR_LOG(title.c_str()); + for (const auto& type : device_ctx.logical_block_types) { + if (is_empty_type(&type)) continue; + + VTR_LOG("\tArchitecture\n"); + for (const auto equivalent_tile : type.equivalent_tiles) { + auto num_instances = 0; + //get the number of equivalent tile across all layers + num_instances = (int)device_ctx.grid.num_instances(equivalent_tile, -1); + + VTR_LOG("\t\t%d\tblocks of type: %s\n", + num_instances, equivalent_tile->name.c_str()); + } + } + } +} + bool vpr_flow(t_vpr_setup& vpr_setup, t_arch& arch) { if (vpr_setup.exit_before_pack) { VTR_LOG_WARN("Exiting before packing as requested.\n"); diff --git a/vpr/src/base/vpr_api.h b/vpr/src/base/vpr_api.h index 02fb56a46b4..3e1dfc72e64 100644 --- a/vpr/src/base/vpr_api.h +++ b/vpr/src/base/vpr_api.h @@ -136,6 +136,9 @@ void vpr_analysis(const Netlist<>& net_list, ///@brief Create the device (grid + rr graph) void vpr_create_device(t_vpr_setup& vpr_setup, const t_arch& Arch); +/// @brief Show resource usage +void vpr_show_resource_usage(const t_vpr_setup& vpr_setup, const t_arch& Arch); + ///@brief Create the device grid void vpr_create_device_grid(const t_vpr_setup& vpr_setup, const t_arch& Arch); diff --git a/vpr/src/main.cpp b/vpr/src/main.cpp index 6643de94840..2a4e74a4641 100644 --- a/vpr/src/main.cpp +++ b/vpr/src/main.cpp @@ -58,6 +58,12 @@ int main(int argc, const char** argv) { return SUCCESS_EXIT_CODE; } + if (Options.show_resource_usage_only_mode) { + vpr_show_resource_usage(vpr_setup, Arch); + vpr_free_all(Arch, vpr_setup); + return SUCCESS_EXIT_CODE; + } + bool flow_succeeded = vpr_flow(vpr_setup, Arch); if (!flow_succeeded) { VTR_LOG("VPR failed to implement circuit\n"); From 4e9c684f4c352b05a607fbf25d6bf0c5b7e0778f Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Tue, 20 May 2025 14:36:47 +0300 Subject: [PATCH 2/8] add --show_resource_usage to command_line_usage.rst --- doc/src/vpr/command_line_usage.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/src/vpr/command_line_usage.rst b/doc/src/vpr/command_line_usage.rst index c420ef40f80..6af463f7622 100644 --- a/doc/src/vpr/command_line_usage.rst +++ b/doc/src/vpr/command_line_usage.rst @@ -2222,6 +2222,16 @@ The following options are used to enable server mode in VPR. .. seealso:: :ref:`interactive_path_analysis_client` + +Show Resource Usage Mode +^^^^^^^^^^^^^^^^^^^^^^^^ +.. option:: --show_resource_usage { on | off } + + Print the device resource usage report and exit normally. + + **Default:** ``off`` + + Command-line Auto Completion ---------------------------- From 9336b78fceb18751fa2c4e377dcd0b0b90a02914 Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Tue, 20 May 2025 15:21:38 +0300 Subject: [PATCH 3/8] run 'make format' --- vpr/src/base/vpr_api.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/vpr/src/base/vpr_api.cpp b/vpr/src/base/vpr_api.cpp index d0c297cc931..bbc86cc719b 100644 --- a/vpr/src/base/vpr_api.cpp +++ b/vpr/src/base/vpr_api.cpp @@ -388,8 +388,7 @@ static void unset_port_equivalences(DeviceContext& device_ctx) { } } -void vpr_show_resource_usage(const t_vpr_setup& vpr_setup, const t_arch& Arch) -{ +void vpr_show_resource_usage(const t_vpr_setup& vpr_setup, const t_arch& Arch) { vtr::ScopedStartFinishTimer timer("Build Device Grid"); /* Read in netlist file for placement and routing */ auto& device_ctx = g_vpr_ctx.mutable_device(); @@ -404,15 +403,15 @@ void vpr_show_resource_usage(const t_vpr_setup& vpr_setup, const t_arch& Arch) std::map num_type_instances; //Build the device - for (const auto& l: Arch.grid_layouts) { + for (const auto& l : Arch.grid_layouts) { std::string device_layout_variant = l.name; float target_device_utilization = vpr_setup.PackerOpts.target_device_utilization; device_ctx.grid = create_device_grid(device_layout_variant, Arch.grid_layouts, num_type_instances, target_device_utilization); /* - *Report on the device - */ + *Report on the device + */ size_t num_grid_tiles = count_grid_tiles(device_ctx.grid); VTR_LOG("FPGA sized to %zu x %zu: %zu grid tiles (%s)\n", device_ctx.grid.width(), device_ctx.grid.height(), num_grid_tiles, device_ctx.grid.name().c_str()); From 5d8345199eb5bd846d804d4f2dd12bea2e3c39dd Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Wed, 21 May 2025 20:59:22 +0300 Subject: [PATCH 4/8] rename vpr_show_resource_usage to vpr_print_arch_resources, to not confuse with existed print_resource_usage(). the new name more clear explain function flow. --- doc/src/vpr/command_line_usage.rst | 6 +++--- vpr/src/base/read_options.cpp | 6 ++++-- vpr/src/base/read_options.h | 2 +- vpr/src/base/vpr_api.cpp | 2 +- vpr/src/base/vpr_api.h | 4 ++-- vpr/src/main.cpp | 4 ++-- 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/doc/src/vpr/command_line_usage.rst b/doc/src/vpr/command_line_usage.rst index 6af463f7622..78338d75c56 100644 --- a/doc/src/vpr/command_line_usage.rst +++ b/doc/src/vpr/command_line_usage.rst @@ -2223,11 +2223,11 @@ The following options are used to enable server mode in VPR. .. seealso:: :ref:`interactive_path_analysis_client` -Show Resource Usage Mode +Show Architecture Resources ^^^^^^^^^^^^^^^^^^^^^^^^ -.. option:: --show_resource_usage { on | off } +.. option:: --show_arch_resources - Print the device resource usage report and exit normally. + Print the architecture resource report for each device layout and exit normally. **Default:** ``off`` diff --git a/vpr/src/base/read_options.cpp b/vpr/src/base/read_options.cpp index cdb46330c8e..75d63409733 100644 --- a/vpr/src/base/read_options.cpp +++ b/vpr/src/base/read_options.cpp @@ -1584,8 +1584,10 @@ argparse::ArgumentParser create_arg_parser(const std::string& prog_name, t_optio .help("Show version information then exit") .action(argparse::Action::VERSION); - gen_grp.add_argument(args.show_resource_usage_only_mode, "--show_resource_usage") - .help("Show resource usage then exit"); + gen_grp.add_argument(args.show_arch_resources, "--show_arch_resources") + .help("Show architecture resources then exit") + .action(argparse::Action::STORE_TRUE) + .default_value("off"); gen_grp.add_argument(args.device_layout, "--device") .help( diff --git a/vpr/src/base/read_options.h b/vpr/src/base/read_options.h index 4eaabc3d9c8..bf320e87080 100644 --- a/vpr/src/base/read_options.h +++ b/vpr/src/base/read_options.h @@ -68,7 +68,7 @@ struct t_options { /* General options */ argparse::ArgValue show_help; argparse::ArgValue show_version; - argparse::ArgValue show_resource_usage_only_mode; + argparse::ArgValue show_arch_resources; argparse::ArgValue num_workers; argparse::ArgValue timing_analysis; argparse::ArgValue timing_update_type; diff --git a/vpr/src/base/vpr_api.cpp b/vpr/src/base/vpr_api.cpp index bbc86cc719b..b37f264f531 100644 --- a/vpr/src/base/vpr_api.cpp +++ b/vpr/src/base/vpr_api.cpp @@ -388,7 +388,7 @@ static void unset_port_equivalences(DeviceContext& device_ctx) { } } -void vpr_show_resource_usage(const t_vpr_setup& vpr_setup, const t_arch& Arch) { +void vpr_print_arch_resources(const t_vpr_setup& vpr_setup, const t_arch& Arch) { vtr::ScopedStartFinishTimer timer("Build Device Grid"); /* Read in netlist file for placement and routing */ auto& device_ctx = g_vpr_ctx.mutable_device(); diff --git a/vpr/src/base/vpr_api.h b/vpr/src/base/vpr_api.h index 3e1dfc72e64..68652afcd82 100644 --- a/vpr/src/base/vpr_api.h +++ b/vpr/src/base/vpr_api.h @@ -136,8 +136,8 @@ void vpr_analysis(const Netlist<>& net_list, ///@brief Create the device (grid + rr graph) void vpr_create_device(t_vpr_setup& vpr_setup, const t_arch& Arch); -/// @brief Show resource usage -void vpr_show_resource_usage(const t_vpr_setup& vpr_setup, const t_arch& Arch); +/// @brief Print architecture resources +void vpr_print_arch_resources(const t_vpr_setup& vpr_setup, const t_arch& Arch); ///@brief Create the device grid void vpr_create_device_grid(const t_vpr_setup& vpr_setup, const t_arch& Arch); diff --git a/vpr/src/main.cpp b/vpr/src/main.cpp index 2a4e74a4641..3d4607473a2 100644 --- a/vpr/src/main.cpp +++ b/vpr/src/main.cpp @@ -58,8 +58,8 @@ int main(int argc, const char** argv) { return SUCCESS_EXIT_CODE; } - if (Options.show_resource_usage_only_mode) { - vpr_show_resource_usage(vpr_setup, Arch); + if (Options.show_arch_resources) { + vpr_print_arch_resources(vpr_setup, Arch); vpr_free_all(Arch, vpr_setup); return SUCCESS_EXIT_CODE; } From c817dccb90e8188703d98e2d48f135fdb080b9b1 Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Wed, 21 May 2025 21:01:21 +0300 Subject: [PATCH 5/8] remove unnecessary shortcut std::string device_layout_variant = l.name in vpr_print_arch_resources() --- vpr/src/base/vpr_api.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/vpr/src/base/vpr_api.cpp b/vpr/src/base/vpr_api.cpp index b37f264f531..179ebd4491d 100644 --- a/vpr/src/base/vpr_api.cpp +++ b/vpr/src/base/vpr_api.cpp @@ -404,10 +404,8 @@ void vpr_print_arch_resources(const t_vpr_setup& vpr_setup, const t_arch& Arch) //Build the device for (const auto& l : Arch.grid_layouts) { - std::string device_layout_variant = l.name; - float target_device_utilization = vpr_setup.PackerOpts.target_device_utilization; - device_ctx.grid = create_device_grid(device_layout_variant, Arch.grid_layouts, num_type_instances, target_device_utilization); + device_ctx.grid = create_device_grid(l.name, Arch.grid_layouts, num_type_instances, target_device_utilization); /* *Report on the device @@ -415,7 +413,7 @@ void vpr_print_arch_resources(const t_vpr_setup& vpr_setup, const t_arch& Arch) size_t num_grid_tiles = count_grid_tiles(device_ctx.grid); VTR_LOG("FPGA sized to %zu x %zu: %zu grid tiles (%s)\n", device_ctx.grid.width(), device_ctx.grid.height(), num_grid_tiles, device_ctx.grid.name().c_str()); - std::string title("\nResource usage for device layout " + device_layout_variant + "...\n"); + std::string title("\nResource usage for device layout " + l.name + "...\n"); VTR_LOG(title.c_str()); for (const auto& type : device_ctx.logical_block_types) { if (is_empty_type(&type)) continue; From b03315901b1c861a7e074984561b0fa079103cfc Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Wed, 21 May 2025 21:03:08 +0300 Subject: [PATCH 6/8] remove "auto num_instances = 0;" in vpr_print_arch_resources --- vpr/src/base/vpr_api.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vpr/src/base/vpr_api.cpp b/vpr/src/base/vpr_api.cpp index 179ebd4491d..b987a52e866 100644 --- a/vpr/src/base/vpr_api.cpp +++ b/vpr/src/base/vpr_api.cpp @@ -420,9 +420,8 @@ void vpr_print_arch_resources(const t_vpr_setup& vpr_setup, const t_arch& Arch) VTR_LOG("\tArchitecture\n"); for (const auto equivalent_tile : type.equivalent_tiles) { - auto num_instances = 0; //get the number of equivalent tile across all layers - num_instances = (int)device_ctx.grid.num_instances(equivalent_tile, -1); + int num_instances = (int)device_ctx.grid.num_instances(equivalent_tile, -1); VTR_LOG("\t\t%d\tblocks of type: %s\n", num_instances, equivalent_tile->name.c_str()); From 003ac5bcc633215c29fa98d6cf8cb6b7984d6691 Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Wed, 21 May 2025 21:05:09 +0300 Subject: [PATCH 7/8] replace auto with specific type in expression "for (const auto equivalent_tile : type.equivalent_tiles" --- vpr/src/base/vpr_api.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vpr/src/base/vpr_api.cpp b/vpr/src/base/vpr_api.cpp index b987a52e866..ba3eae59b59 100644 --- a/vpr/src/base/vpr_api.cpp +++ b/vpr/src/base/vpr_api.cpp @@ -419,7 +419,7 @@ void vpr_print_arch_resources(const t_vpr_setup& vpr_setup, const t_arch& Arch) if (is_empty_type(&type)) continue; VTR_LOG("\tArchitecture\n"); - for (const auto equivalent_tile : type.equivalent_tiles) { + for (const t_physical_tile_type_ptr equivalent_tile : type.equivalent_tiles) { //get the number of equivalent tile across all layers int num_instances = (int)device_ctx.grid.num_instances(equivalent_tile, -1); From 42f8df87f8af1193927c1015aec6de6e1ab83582 Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Wed, 21 May 2025 21:07:14 +0300 Subject: [PATCH 8/8] get red of keyword auto in vpr_print_arch_resources method --- vpr/src/base/vpr_api.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vpr/src/base/vpr_api.cpp b/vpr/src/base/vpr_api.cpp index ba3eae59b59..3d992d9138d 100644 --- a/vpr/src/base/vpr_api.cpp +++ b/vpr/src/base/vpr_api.cpp @@ -403,7 +403,7 @@ void vpr_print_arch_resources(const t_vpr_setup& vpr_setup, const t_arch& Arch) std::map num_type_instances; //Build the device - for (const auto& l : Arch.grid_layouts) { + for (const t_grid_def& l : Arch.grid_layouts) { float target_device_utilization = vpr_setup.PackerOpts.target_device_utilization; device_ctx.grid = create_device_grid(l.name, Arch.grid_layouts, num_type_instances, target_device_utilization); @@ -415,7 +415,7 @@ void vpr_print_arch_resources(const t_vpr_setup& vpr_setup, const t_arch& Arch) std::string title("\nResource usage for device layout " + l.name + "...\n"); VTR_LOG(title.c_str()); - for (const auto& type : device_ctx.logical_block_types) { + for (const t_logical_block_type& type : device_ctx.logical_block_types) { if (is_empty_type(&type)) continue; VTR_LOG("\tArchitecture\n");