Merge pull request #60 from LNIS-Projects/dev

Bug fix in reserve configuration blocks for bitstream manager to optimize memory usage
This commit is contained in:
tangxifan 2020-07-03 23:30:18 -06:00 committed by GitHub
commit 5032c663f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 107 additions and 10 deletions

View File

@ -13,6 +13,8 @@
#include "openfpga_naming.h" #include "openfpga_naming.h"
#include "module_manager_utils.h"
#include "build_grid_bitstream.h" #include "build_grid_bitstream.h"
#include "build_routing_bitstream.h" #include "build_routing_bitstream.h"
#include "build_device_bitstream.h" #include "build_device_bitstream.h"
@ -146,7 +148,7 @@ BitstreamManager build_device_bitstream(const VprContext& vpr_ctx,
/* Reserve child blocks for the top level block */ /* Reserve child blocks for the top level block */
bitstream_manager.reserve_child_blocks(top_block, bitstream_manager.reserve_child_blocks(top_block,
openfpga_ctx.module_graph().configurable_children(top_module).size()); count_module_manager_module_configurable_children(openfpga_ctx.module_graph(), top_module));
/* Create bitstream from grids */ /* Create bitstream from grids */
VTR_LOGV(verbose, "Building grid bitstream...\n"); VTR_LOGV(verbose, "Building grid bitstream...\n");
@ -172,7 +174,8 @@ BitstreamManager build_device_bitstream(const VprContext& vpr_ctx,
openfpga_ctx.vpr_device_annotation(), openfpga_ctx.vpr_device_annotation(),
openfpga_ctx.vpr_routing_annotation(), openfpga_ctx.vpr_routing_annotation(),
vpr_ctx.device().rr_graph, vpr_ctx.device().rr_graph,
openfpga_ctx.device_rr_gsb()); openfpga_ctx.device_rr_gsb(),
openfpga_ctx.flow_manager().compress_routing());
VTR_LOGV(verbose, "Done\n"); VTR_LOGV(verbose, "Done\n");
VTR_LOGV(verbose, VTR_LOGV(verbose,
@ -180,8 +183,8 @@ BitstreamManager build_device_bitstream(const VprContext& vpr_ctx,
bitstream_manager.num_bits(), bitstream_manager.num_bits(),
bitstream_manager.num_blocks()); bitstream_manager.num_blocks());
//VTR_ASSERT(num_blocks_to_reserve == bitstream_manager.num_blocks()); VTR_ASSERT(num_blocks_to_reserve == bitstream_manager.num_blocks());
//VTR_ASSERT(num_bits_to_reserve == bitstream_manager.num_bits()); VTR_ASSERT(num_bits_to_reserve == bitstream_manager.num_bits());
return bitstream_manager; return bitstream_manager;
} }

View File

@ -24,6 +24,7 @@
#include "mux_bitstream_constants.h" #include "mux_bitstream_constants.h"
#include "pb_type_utils.h" #include "pb_type_utils.h"
#include "lut_utils.h" #include "lut_utils.h"
#include "module_manager_utils.h"
#include "build_mux_bitstream.h" #include "build_mux_bitstream.h"
#include "build_grid_bitstream.h" #include "build_grid_bitstream.h"
@ -492,11 +493,25 @@ void rec_build_physical_block_bitstream(BitstreamManager& bitstream_manager,
/* Find the mode that define_idle_mode*/ /* Find the mode that define_idle_mode*/
t_mode* physical_mode = device_annotation.physical_mode(physical_pb_type); t_mode* physical_mode = device_annotation.physical_mode(physical_pb_type);
/* Early exit if this parent module has no configurable child modules */
std::string pb_module_name = generate_physical_block_module_name(physical_pb_type);
ModuleId pb_module = module_manager.find_module(pb_module_name);
VTR_ASSERT(true == module_manager.valid_module_id(pb_module));
/* Skip module with no configurable children */
if (0 == module_manager.configurable_children(pb_module).size()) {
return;
}
/* Create a block for the physical block under the grid block in bitstream manager */ /* Create a block for the physical block under the grid block in bitstream manager */
std::string pb_block_name = generate_physical_block_instance_name(physical_pb_type, pb_graph_node_index); std::string pb_block_name = generate_physical_block_instance_name(physical_pb_type, pb_graph_node_index);
ConfigBlockId pb_configurable_block = bitstream_manager.add_block(pb_block_name); ConfigBlockId pb_configurable_block = bitstream_manager.add_block(pb_block_name);
bitstream_manager.add_child_block(parent_configurable_block, pb_configurable_block); bitstream_manager.add_child_block(parent_configurable_block, pb_configurable_block);
/* Reserve child blocks for new created block */
bitstream_manager.reserve_child_blocks(parent_configurable_block,
count_module_manager_module_configurable_children(module_manager, pb_module));
/* Recursively finish all the child pb_types*/ /* Recursively finish all the child pb_types*/
if (false == is_primitive_pb_type(physical_pb_type)) { if (false == is_primitive_pb_type(physical_pb_type)) {
for (int ipb = 0; ipb < physical_mode->num_pb_type_children; ++ipb) { for (int ipb = 0; ipb < physical_mode->num_pb_type_children; ++ipb) {
@ -583,11 +598,27 @@ void build_physical_block_bitstream(BitstreamManager& bitstream_manager,
/* Create a block for the grid in bitstream manager */ /* Create a block for the grid in bitstream manager */
t_physical_tile_type_ptr grid_type = grids[grid_coord.x()][grid_coord.y()].type; t_physical_tile_type_ptr grid_type = grids[grid_coord.x()][grid_coord.y()].type;
std::string grid_module_name_prefix(GRID_MODULE_NAME_PREFIX); std::string grid_module_name_prefix(GRID_MODULE_NAME_PREFIX);
/* Early exit if this parent module has no configurable child modules */
std::string grid_module_name = generate_grid_block_module_name(grid_module_name_prefix, std::string(grid_type->name),
is_io_type(grid_type), border_side);
ModuleId grid_module = module_manager.find_module(grid_module_name);
VTR_ASSERT(true == module_manager.valid_module_id(grid_module));
/* Skip module with no configurable children */
if (0 == module_manager.configurable_children(grid_module).size()) {
return;
}
std::string grid_block_name = generate_grid_block_instance_name(grid_module_name_prefix, std::string(grid_type->name), std::string grid_block_name = generate_grid_block_instance_name(grid_module_name_prefix, std::string(grid_type->name),
is_io_type(grid_type), border_side, grid_coord); is_io_type(grid_type), border_side, grid_coord);
ConfigBlockId grid_configurable_block = bitstream_manager.add_block(grid_block_name); ConfigBlockId grid_configurable_block = bitstream_manager.add_block(grid_block_name);
bitstream_manager.add_child_block(top_block, grid_configurable_block); bitstream_manager.add_child_block(top_block, grid_configurable_block);
/* Reserve child blocks for new created block */
bitstream_manager.reserve_child_blocks(grid_configurable_block,
count_module_manager_module_configurable_children(module_manager, grid_module));
/* Iterate over the capacity of the grid /* Iterate over the capacity of the grid
* Now each physical tile may have a number of logical blocks * Now each physical tile may have a number of logical blocks
* OpenFPGA only considers the physical implementation of the tiles. * OpenFPGA only considers the physical implementation of the tiles.

View File

@ -18,6 +18,7 @@
#include "openfpga_reserved_words.h" #include "openfpga_reserved_words.h"
#include "openfpga_naming.h" #include "openfpga_naming.h"
#include "openfpga_rr_graph_utils.h" #include "openfpga_rr_graph_utils.h"
#include "module_manager_utils.h"
#include "mux_bitstream_constants.h" #include "mux_bitstream_constants.h"
#include "build_mux_bitstream.h" #include "build_mux_bitstream.h"
@ -403,6 +404,7 @@ void build_connection_block_bitstreams(BitstreamManager& bitstream_manager,
const VprRoutingAnnotation& routing_annotation, const VprRoutingAnnotation& routing_annotation,
const RRGraph& rr_graph, const RRGraph& rr_graph,
const DeviceRRGSB& device_rr_gsb, const DeviceRRGSB& device_rr_gsb,
const bool& compact_routing_hierarchy,
const t_rr_type& cb_type) { const t_rr_type& cb_type) {
vtr::Point<size_t> cb_range = device_rr_gsb.get_gsb_range(); vtr::Point<size_t> cb_range = device_rr_gsb.get_gsb_range();
@ -421,12 +423,30 @@ void build_connection_block_bitstreams(BitstreamManager& bitstream_manager,
if (true == connection_block_contain_only_routing_tracks(rr_gsb, cb_type)) { if (true == connection_block_contain_only_routing_tracks(rr_gsb, cb_type)) {
continue; continue;
} }
/* Create a block for the bitstream which corresponds to the Switch block */
/* Find the cb module so that we can precisely reserve child blocks */
vtr::Point<size_t> cb_coord(rr_gsb.get_cb_x(cb_type), rr_gsb.get_cb_y(cb_type)); vtr::Point<size_t> cb_coord(rr_gsb.get_cb_x(cb_type), rr_gsb.get_cb_y(cb_type));
std::string cb_module_name = generate_connection_block_module_name(cb_type, cb_coord);
if (true == compact_routing_hierarchy) {
vtr::Point<size_t> unique_cb_coord(ix, iy);
/* Note: use GSB coordinate when inquire for unique modules!!! */
const RRGSB& unique_mirror = device_rr_gsb.get_cb_unique_module(cb_type, unique_cb_coord);
unique_cb_coord.set_x(unique_mirror.get_cb_x(cb_type));
unique_cb_coord.set_y(unique_mirror.get_cb_y(cb_type));
cb_module_name = generate_connection_block_module_name(cb_type, unique_cb_coord);
}
ModuleId cb_module = module_manager.find_module(cb_module_name);
VTR_ASSERT(true == module_manager.valid_module_id(cb_module));
/* Create a block for the bitstream which corresponds to the Switch block */
ConfigBlockId cb_configurable_block = bitstream_manager.add_block(generate_connection_block_module_name(cb_type, cb_coord)); ConfigBlockId cb_configurable_block = bitstream_manager.add_block(generate_connection_block_module_name(cb_type, cb_coord));
/* Set switch block as a child of top block */ /* Set switch block as a child of top block */
bitstream_manager.add_child_block(top_configurable_block, cb_configurable_block); bitstream_manager.add_child_block(top_configurable_block, cb_configurable_block);
/* Reserve child blocks for new created block */
bitstream_manager.reserve_child_blocks(cb_configurable_block,
count_module_manager_module_configurable_children(module_manager, cb_module));
build_connection_block_bitstream(bitstream_manager, cb_configurable_block, module_manager, build_connection_block_bitstream(bitstream_manager, cb_configurable_block, module_manager,
circuit_lib, mux_lib, circuit_lib, mux_lib,
atom_ctx, device_annotation, routing_annotation, atom_ctx, device_annotation, routing_annotation,
@ -451,7 +471,8 @@ void build_routing_bitstream(BitstreamManager& bitstream_manager,
const VprDeviceAnnotation& device_annotation, const VprDeviceAnnotation& device_annotation,
const VprRoutingAnnotation& routing_annotation, const VprRoutingAnnotation& routing_annotation,
const RRGraph& rr_graph, const RRGraph& rr_graph,
const DeviceRRGSB& device_rr_gsb) { const DeviceRRGSB& device_rr_gsb,
const bool& compact_routing_hierarchy) {
/* Generate bitstream for each switch blocks /* Generate bitstream for each switch blocks
* To organize the bitstream in blocks, we create a block for each switch block * To organize the bitstream in blocks, we create a block for each switch block
@ -470,12 +491,29 @@ void build_routing_bitstream(BitstreamManager& bitstream_manager,
continue; continue;
} }
/* Create a block for the bitstream which corresponds to the Switch block */
vtr::Point<size_t> sb_coord(rr_gsb.get_sb_x(), rr_gsb.get_sb_y()); vtr::Point<size_t> sb_coord(rr_gsb.get_sb_x(), rr_gsb.get_sb_y());
/* Find the sb module so that we can precisely reserve child blocks */
std::string sb_module_name = generate_switch_block_module_name(sb_coord);
if (true == compact_routing_hierarchy) {
vtr::Point<size_t> unique_sb_coord(ix, iy);
const RRGSB& unique_mirror = device_rr_gsb.get_sb_unique_module(sb_coord);
unique_sb_coord.set_x(unique_mirror.get_sb_x());
unique_sb_coord.set_y(unique_mirror.get_sb_y());
sb_module_name = generate_switch_block_module_name(unique_sb_coord);
}
ModuleId sb_module = module_manager.find_module(sb_module_name);
VTR_ASSERT(true == module_manager.valid_module_id(sb_module));
/* Create a block for the bitstream which corresponds to the Switch block */
ConfigBlockId sb_configurable_block = bitstream_manager.add_block(generate_switch_block_module_name(sb_coord)); ConfigBlockId sb_configurable_block = bitstream_manager.add_block(generate_switch_block_module_name(sb_coord));
/* Set switch block as a child of top block */ /* Set switch block as a child of top block */
bitstream_manager.add_child_block(top_configurable_block, sb_configurable_block); bitstream_manager.add_child_block(top_configurable_block, sb_configurable_block);
/* Reserve child blocks for new created block */
bitstream_manager.reserve_child_blocks(sb_configurable_block,
count_module_manager_module_configurable_children(module_manager, sb_module));
build_switch_block_bitstream(bitstream_manager, sb_configurable_block, module_manager, build_switch_block_bitstream(bitstream_manager, sb_configurable_block, module_manager,
circuit_lib, mux_lib, circuit_lib, mux_lib,
atom_ctx, device_annotation, routing_annotation, atom_ctx, device_annotation, routing_annotation,
@ -495,7 +533,9 @@ void build_routing_bitstream(BitstreamManager& bitstream_manager,
circuit_lib, mux_lib, circuit_lib, mux_lib,
atom_ctx, device_annotation, routing_annotation, atom_ctx, device_annotation, routing_annotation,
rr_graph, rr_graph,
device_rr_gsb, CHANX); device_rr_gsb,
compact_routing_hierarchy,
CHANX);
VTR_LOG("Done\n"); VTR_LOG("Done\n");
VTR_LOG("Generating bitstream for Y-direction Connection blocks ..."); VTR_LOG("Generating bitstream for Y-direction Connection blocks ...");
@ -504,7 +544,9 @@ void build_routing_bitstream(BitstreamManager& bitstream_manager,
circuit_lib, mux_lib, circuit_lib, mux_lib,
atom_ctx, device_annotation, routing_annotation, atom_ctx, device_annotation, routing_annotation,
rr_graph, rr_graph,
device_rr_gsb, CHANY); device_rr_gsb,
compact_routing_hierarchy,
CHANY);
VTR_LOG("Done\n"); VTR_LOG("Done\n");
} }

View File

@ -33,7 +33,8 @@ void build_routing_bitstream(BitstreamManager& bitstream_manager,
const VprDeviceAnnotation& device_annotation, const VprDeviceAnnotation& device_annotation,
const VprRoutingAnnotation& routing_annotation, const VprRoutingAnnotation& routing_annotation,
const RRGraph& rr_graph, const RRGraph& rr_graph,
const DeviceRRGSB& device_rr_gsb); const DeviceRRGSB& device_rr_gsb,
const bool& compact_routing_hierarchy);
} /* end namespace openfpga */ } /* end namespace openfpga */

View File

@ -76,6 +76,23 @@ void reserve_module_manager_module_nets(ModuleManager& module_manager,
module_manager.reserve_module_nets(parent_module, num_nets); module_manager.reserve_module_nets(parent_module, num_nets);
} }
/******************************************************************************
* Count the 'actual' number of configurable children for a module in module manager
* A 'true' configurable children should have a number of configurable children as well
******************************************************************************/
size_t count_module_manager_module_configurable_children(const ModuleManager& module_manager,
const ModuleId& module) {
size_t num_config_children = 0;
for (const ModuleId& child : module_manager.configurable_children(module)) {
if (0 != module_manager.configurable_children(child).size()) {
num_config_children++;
}
}
return num_config_children;
}
/****************************************************************************** /******************************************************************************
* Add a module to the module manager based on the circuit-level * Add a module to the module manager based on the circuit-level
* description of a circuit model * description of a circuit model

View File

@ -34,6 +34,9 @@ namespace openfpga {
void reserve_module_manager_module_nets(ModuleManager& module_manager, void reserve_module_manager_module_nets(ModuleManager& module_manager,
const ModuleId& module); const ModuleId& module);
size_t count_module_manager_module_configurable_children(const ModuleManager& module_manager,
const ModuleId& module);
ModuleId add_circuit_model_to_module_manager(ModuleManager& module_manager, ModuleId add_circuit_model_to_module_manager(ModuleManager& module_manager,
const CircuitLibrary& circuit_lib, const CircuitModelId& circuit_model, const CircuitLibrary& circuit_lib, const CircuitModelId& circuit_model,
const std::string& module_name); const std::string& module_name);