[core] now bitgen uses config child types
This commit is contained in:
parent
3331540ed6
commit
5618f1d567
|
@ -241,7 +241,7 @@ ModuleManager::region_configurable_child_coordinates(
|
||||||
for (const size_t& child_id :
|
for (const size_t& child_id :
|
||||||
config_region_children_[parent_module][region]) {
|
config_region_children_[parent_module][region]) {
|
||||||
region_config_child_coordinates.push_back(
|
region_config_child_coordinates.push_back(
|
||||||
logical_configurable_child_coordinates_[parent_module][child_id]);
|
physical_configurable_child_coordinates_[parent_module][child_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return region_config_child_coordinates;
|
return region_config_child_coordinates;
|
||||||
|
@ -657,6 +657,21 @@ bool ModuleManager::net_sink_exist(const ModuleId& module,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ModuleManager::unified_configurable_children(const ModuleId& curr_module) const {
|
||||||
|
if (logical_configurable_children_[curr_module].size() != physical_configurable_children_[curr_module].size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (size_t ichild = 0; ichild < logical_configurable_children_[curr_module].size(); ++ichild) {
|
||||||
|
if (logical_configurable_children_[curr_module][ichild] != physical_configurable_children_[curr_module][ichild]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (logical_configurable_child_instances_[curr_module][ichild] != physical_configurable_child_instances_[curr_module][ichild]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Private Accessors
|
* Private Accessors
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
|
@ -323,6 +323,9 @@ class ModuleManager {
|
||||||
const ModuleId& sink_module, const size_t& instance_id,
|
const ModuleId& sink_module, const size_t& instance_id,
|
||||||
const ModulePortId& sink_port, const size_t& sink_pin);
|
const ModulePortId& sink_port, const size_t& sink_pin);
|
||||||
|
|
||||||
|
/** @brief Check if the configurable children under a given module are unified or not. If unified, it means that the logical configurable children are the same as the physical configurable children */
|
||||||
|
bool unified_configurable_children(const ModuleId& curr_module) const;
|
||||||
|
|
||||||
private: /* Private accessors */
|
private: /* Private accessors */
|
||||||
size_t find_child_module_index_in_parent_module(
|
size_t find_child_module_index_in_parent_module(
|
||||||
const ModuleId& parent_module, const ModuleId& child_module) const;
|
const ModuleId& parent_module, const ModuleId& child_module) const;
|
||||||
|
|
|
@ -74,12 +74,12 @@ static void rec_build_module_fabric_dependent_chain_bitstream(
|
||||||
} else {
|
} else {
|
||||||
for (size_t child_id = 0;
|
for (size_t child_id = 0;
|
||||||
child_id <
|
child_id <
|
||||||
module_manager.logical_configurable_children(parent_module).size();
|
module_manager.configurable_children(parent_module, ModuleManager::e_config_child_type::PHYSICAL).size();
|
||||||
++child_id) {
|
++child_id) {
|
||||||
ModuleId child_module =
|
ModuleId child_module =
|
||||||
module_manager.logical_configurable_children(parent_module)[child_id];
|
module_manager.configurable_children(parent_module, ModuleManager::e_config_child_type::PHYSICAL)[child_id];
|
||||||
size_t child_instance =
|
size_t child_instance =
|
||||||
module_manager.logical_configurable_child_instances(parent_module)[child_id];
|
module_manager.configurable_child_instances(parent_module, ModuleManager::e_config_child_type::PHYSICAL)[child_id];
|
||||||
/* Get the instance name and ensure it is not empty */
|
/* Get the instance name and ensure it is not empty */
|
||||||
std::string instance_name = module_manager.instance_name(
|
std::string instance_name = module_manager.instance_name(
|
||||||
parent_module, child_module, child_instance);
|
parent_module, child_module, child_instance);
|
||||||
|
@ -196,7 +196,7 @@ static void rec_build_module_fabric_dependent_memory_bank_bitstream(
|
||||||
* - no need to exclude decoders as they are not there
|
* - no need to exclude decoders as they are not there
|
||||||
*/
|
*/
|
||||||
std::vector<ModuleId> configurable_children =
|
std::vector<ModuleId> configurable_children =
|
||||||
module_manager.logical_configurable_children(parent_module);
|
module_manager.configurable_children(parent_module, ModuleManager::e_config_child_type::PHYSICAL);
|
||||||
|
|
||||||
size_t num_configurable_children = configurable_children.size();
|
size_t num_configurable_children = configurable_children.size();
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ static void rec_build_module_fabric_dependent_memory_bank_bitstream(
|
||||||
++child_id) {
|
++child_id) {
|
||||||
ModuleId child_module = configurable_children[child_id];
|
ModuleId child_module = configurable_children[child_id];
|
||||||
size_t child_instance =
|
size_t child_instance =
|
||||||
module_manager.logical_configurable_child_instances(parent_module)[child_id];
|
module_manager.configurable_child_instances(parent_module, ModuleManager::e_config_child_type::PHYSICAL)[child_id];
|
||||||
|
|
||||||
/* Get the instance name and ensure it is not empty */
|
/* Get the instance name and ensure it is not empty */
|
||||||
std::string instance_name = module_manager.instance_name(
|
std::string instance_name = module_manager.instance_name(
|
||||||
|
@ -324,9 +324,9 @@ static void rec_build_module_fabric_dependent_frame_bitstream(
|
||||||
} else {
|
} else {
|
||||||
VTR_ASSERT(top_module != parent_module);
|
VTR_ASSERT(top_module != parent_module);
|
||||||
configurable_children =
|
configurable_children =
|
||||||
module_manager.logical_configurable_children(parent_module);
|
module_manager.configurable_children(parent_module, ModuleManager::e_config_child_type::PHYSICAL);
|
||||||
configurable_child_instances =
|
configurable_child_instances =
|
||||||
module_manager.logical_configurable_child_instances(parent_module);
|
module_manager.configurable_child_instances(parent_module, ModuleManager::e_config_child_type::PHYSICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t num_configurable_children = configurable_children.size();
|
size_t num_configurable_children = configurable_children.size();
|
||||||
|
@ -361,9 +361,9 @@ static void rec_build_module_fabric_dependent_frame_bitstream(
|
||||||
* configurable children in all the regions
|
* configurable children in all the regions
|
||||||
*/
|
*/
|
||||||
for (const ModuleId& child_module :
|
for (const ModuleId& child_module :
|
||||||
module_manager.logical_configurable_children(parent_module)) {
|
module_manager.configurable_children(parent_module, ModuleManager::e_config_child_type::PHYSICAL)) {
|
||||||
/* Bypass any decoder module (which no configurable children */
|
/* Bypass any decoder module (which no configurable children */
|
||||||
if (module_manager.logical_configurable_children(child_module).empty()) {
|
if (module_manager.configurable_children(child_module, ModuleManager::e_config_child_type::PHYSICAL).empty()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const ModulePortId& child_addr_port_id =
|
const ModulePortId& child_addr_port_id =
|
||||||
|
@ -494,7 +494,7 @@ static void rec_build_module_fabric_dependent_frame_bitstream(
|
||||||
} else {
|
} else {
|
||||||
VTR_ASSERT(top_module != parent_modules.back());
|
VTR_ASSERT(top_module != parent_modules.back());
|
||||||
configurable_children =
|
configurable_children =
|
||||||
module_manager.logical_configurable_children(parent_modules.back());
|
module_manager.configurable_children(parent_modules.back(), ModuleManager::e_config_child_type::PHYSICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ModuleId decoder_module = configurable_children.back();
|
ModuleId decoder_module = configurable_children.back();
|
||||||
|
|
|
@ -123,7 +123,7 @@ static void rec_build_module_fabric_dependent_ql_memory_bank_regional_bitstream(
|
||||||
* - no need to exclude decoders as they are not there
|
* - no need to exclude decoders as they are not there
|
||||||
*/
|
*/
|
||||||
std::vector<ModuleId> configurable_children =
|
std::vector<ModuleId> configurable_children =
|
||||||
module_manager.logical_configurable_children(parent_module);
|
module_manager.configurable_children(parent_module, ModuleManager::e_config_child_type::PHYSICAL);
|
||||||
|
|
||||||
size_t num_configurable_children = configurable_children.size();
|
size_t num_configurable_children = configurable_children.size();
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ static void rec_build_module_fabric_dependent_ql_memory_bank_regional_bitstream(
|
||||||
++child_id) {
|
++child_id) {
|
||||||
ModuleId child_module = configurable_children[child_id];
|
ModuleId child_module = configurable_children[child_id];
|
||||||
size_t child_instance =
|
size_t child_instance =
|
||||||
module_manager.logical_configurable_child_instances(parent_module)[child_id];
|
module_manager.configurable_child_instances(parent_module, ModuleManager::e_config_child_type::PHYSICAL)[child_id];
|
||||||
|
|
||||||
/* Get the instance name and ensure it is not empty */
|
/* Get the instance name and ensure it is not empty */
|
||||||
std::string instance_name = module_manager.instance_name(
|
std::string instance_name = module_manager.instance_name(
|
||||||
|
|
|
@ -644,16 +644,18 @@ static void rec_build_physical_block_bitstream(
|
||||||
* manager */
|
* manager */
|
||||||
std::string pb_block_name = generate_physical_block_instance_name(
|
std::string pb_block_name = generate_physical_block_instance_name(
|
||||||
physical_pb_type, pb_graph_node_index);
|
physical_pb_type, pb_graph_node_index);
|
||||||
ConfigBlockId pb_configurable_block =
|
/* If there are no physical memory blocks under the current module, use the previous module, which is the physical memory block */
|
||||||
bitstream_manager.add_block(pb_block_name);
|
ConfigBlockId pb_configurable_block = parent_configurable_block;
|
||||||
bitstream_manager.add_child_block(parent_configurable_block,
|
if (0 < module_manager.num_configurable_children(pb_module, ModuleManager::e_config_child_type::PHYSICAL)) {
|
||||||
pb_configurable_block);
|
pb_configurable_block = bitstream_manager.add_block(pb_block_name);
|
||||||
|
bitstream_manager.add_child_block(parent_configurable_block,
|
||||||
/* Reserve child blocks for new created block */
|
pb_configurable_block);
|
||||||
bitstream_manager.reserve_child_blocks(
|
/* Reserve child blocks for new created block */
|
||||||
parent_configurable_block,
|
bitstream_manager.reserve_child_blocks(
|
||||||
count_module_manager_module_configurable_children(module_manager,
|
parent_configurable_block,
|
||||||
pb_module, ModuleManager::e_config_child_type::PHYSICAL));
|
count_module_manager_module_configurable_children(module_manager,
|
||||||
|
pb_module, ModuleManager::e_config_child_type::PHYSICAL));
|
||||||
|
}
|
||||||
|
|
||||||
/* 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)) {
|
||||||
|
@ -772,6 +774,15 @@ static void build_physical_block_bitstream(
|
||||||
grid_configurable_block, count_module_manager_module_configurable_children(
|
grid_configurable_block, count_module_manager_module_configurable_children(
|
||||||
module_manager, grid_module, ModuleManager::e_config_child_type::PHYSICAL));
|
module_manager, grid_module, ModuleManager::e_config_child_type::PHYSICAL));
|
||||||
|
|
||||||
|
/* Create a dedicated block for the non-unified configurable child */
|
||||||
|
if (!module_manager.unified_configurable_children(grid_module)) {
|
||||||
|
VTR_ASSERT(1 == module_manager.configurable_children(grid_module, ModuleManager::e_config_child_type::PHYSICAL).size());
|
||||||
|
std::string phy_mem_instance_name = module_manager.instance_name(grid_module, module_manager.configurable_children(grid_module, ModuleManager::e_config_child_type::PHYSICAL)[0], module_manager.configurable_child_instances(grid_module, ModuleManager::e_config_child_type::PHYSICAL)[0]);
|
||||||
|
ConfigBlockId grid_grouped_config_block = bitstream_manager.add_child_block(phy_mem_instance_name);
|
||||||
|
bitstream_manager.add_child_block(grid_configurable_block, grid_grouped_config_block);
|
||||||
|
grid_configurable_block = grid_grouped_config_block;
|
||||||
|
}
|
||||||
|
|
||||||
/* 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.
|
||||||
|
|
|
@ -487,7 +487,7 @@ static void build_connection_block_bitstreams(
|
||||||
|
|
||||||
/* Bypass empty blocks which have none configurable children */
|
/* Bypass empty blocks which have none configurable children */
|
||||||
if (0 == count_module_manager_module_configurable_children(module_manager,
|
if (0 == count_module_manager_module_configurable_children(module_manager,
|
||||||
cb_module)) {
|
cb_module, ModuleManager::e_config_child_type::LOGICAL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,7 +528,16 @@ static void build_connection_block_bitstreams(
|
||||||
bitstream_manager.reserve_child_blocks(
|
bitstream_manager.reserve_child_blocks(
|
||||||
cb_configurable_block,
|
cb_configurable_block,
|
||||||
count_module_manager_module_configurable_children(module_manager,
|
count_module_manager_module_configurable_children(module_manager,
|
||||||
cb_module));
|
cb_module, ModuleManager::e_config_child_type::PHYSICAL));
|
||||||
|
|
||||||
|
/* Create a dedicated block for the non-unified configurable child */
|
||||||
|
if (!module_manager.unified_configurable_children(cb_module)) {
|
||||||
|
VTR_ASSERT(1 == module_manager.configurable_children(cb_module, ModuleManager::e_config_child_type::PHYSICAL).size());
|
||||||
|
std::string phy_mem_instance_name = module_manager.instance_name(cb_module, module_manager.configurable_children(cb_module, ModuleManager::e_config_child_type::PHYSICAL)[0], module_manager.configurable_child_instances(cb_module, ModuleManager::e_config_child_type::PHYSICAL)[0]);
|
||||||
|
ConfigBlockId cb_grouped_config_block = bitstream_manager.add_child_block(phy_mem_instance_name);
|
||||||
|
bitstream_manager.add_child_block(cb_configurable_block, cb_grouped_config_block);
|
||||||
|
cb_configurable_block = cb_grouped_config_block;
|
||||||
|
}
|
||||||
|
|
||||||
build_connection_block_bitstream(
|
build_connection_block_bitstream(
|
||||||
bitstream_manager, cb_configurable_block, module_manager, circuit_lib,
|
bitstream_manager, cb_configurable_block, module_manager, circuit_lib,
|
||||||
|
@ -594,7 +603,7 @@ void build_routing_bitstream(
|
||||||
|
|
||||||
/* Bypass empty blocks which have none configurable children */
|
/* Bypass empty blocks which have none configurable children */
|
||||||
if (0 == count_module_manager_module_configurable_children(module_manager,
|
if (0 == count_module_manager_module_configurable_children(module_manager,
|
||||||
sb_module)) {
|
sb_module, ModuleManager::e_config_child_type::LOGICAL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -630,7 +639,16 @@ void build_routing_bitstream(
|
||||||
bitstream_manager.reserve_child_blocks(
|
bitstream_manager.reserve_child_blocks(
|
||||||
sb_configurable_block,
|
sb_configurable_block,
|
||||||
count_module_manager_module_configurable_children(module_manager,
|
count_module_manager_module_configurable_children(module_manager,
|
||||||
sb_module));
|
sb_module, ModuleManager::e_config_child_type::PHYSICAL));
|
||||||
|
|
||||||
|
/* Create a dedicated block for the non-unified configurable child */
|
||||||
|
if (!module_manager.unified_configurable_children(sb_module)) {
|
||||||
|
VTR_ASSERT(1 == module_manager.configurable_children(sb_module, ModuleManager::e_config_child_type::PHYSICAL).size());
|
||||||
|
std::string phy_mem_instance_name = module_manager.instance_name(sb_module, module_manager.configurable_children(sb_module, ModuleManager::e_config_child_type::PHYSICAL)[0], module_manager.configurable_child_instances(sb_module, ModuleManager::e_config_child_type::PHYSICAL)[0]);
|
||||||
|
ConfigBlockId sb_grouped_config_block = bitstream_manager.add_child_block(phy_mem_instance_name);
|
||||||
|
bitstream_manager.add_child_block(sb_configurable_block, sb_grouped_config_block);
|
||||||
|
sb_configurable_block = sb_grouped_config_block;
|
||||||
|
}
|
||||||
|
|
||||||
build_switch_block_bitstream(bitstream_manager, sb_configurable_block,
|
build_switch_block_bitstream(bitstream_manager, sb_configurable_block,
|
||||||
module_manager, circuit_lib, mux_lib,
|
module_manager, circuit_lib, mux_lib,
|
||||||
|
|
Loading…
Reference in New Issue