2023-09-16 01:22:31 -05:00
/* Headers from vtrutil library */
2023-09-16 01:32:40 -05:00
# include "rename_modules.h"
2023-09-16 01:22:31 -05:00
# include "command_exit_codes.h"
# include "openfpga_naming.h"
2023-09-16 01:32:40 -05:00
# include "vtr_assert.h"
# include "vtr_log.h"
# include "vtr_time.h"
2023-09-16 01:22:31 -05:00
/* begin namespace openfpga */
namespace openfpga {
2023-09-16 01:32:40 -05:00
/** @brief Initialize a module name map with the existing module names from a
* module manager . In this case , all the built - in names are the same as
* customized names */
int init_fabric_module_name_map ( ModuleNameMap & module_name_map ,
const ModuleManager & module_manager ,
const bool & verbose ) {
2023-09-16 01:22:31 -05:00
int status = CMD_EXEC_SUCCESS ;
/* the module name map should be empty! */
module_name_map . clear ( ) ;
size_t cnt = 0 ;
for ( ModuleId curr_module : module_manager . modules ( ) ) {
2023-09-16 01:32:40 -05:00
status = module_name_map . set_tag_to_name_pair (
module_manager . module_name ( curr_module ) ,
module_manager . module_name ( curr_module ) ) ;
2023-09-16 01:22:31 -05:00
if ( status ! = CMD_EXEC_SUCCESS ) {
return CMD_EXEC_SUCCESS ;
}
cnt + + ;
}
VTR_LOGV ( verbose , " Initialized module name map for '%lu' modules \n " , cnt ) ;
return CMD_EXEC_SUCCESS ;
}
2023-09-16 01:32:40 -05:00
int update_module_map_name_with_indexing_names ( ModuleNameMap & module_name_map ,
const DeviceRRGSB & device_rr_gsb ,
const FabricTile & fabric_tile ,
const bool & verbose ) {
2023-09-16 01:22:31 -05:00
int status = CMD_EXEC_SUCCESS ;
/* Walk through the device rr gsb on the unique routing modules */
for ( size_t isb = 0 ; isb < device_rr_gsb . get_num_sb_unique_module ( ) ; + + isb ) {
const RRGSB & unique_mirror = device_rr_gsb . get_sb_unique_module ( isb ) ;
2023-09-16 01:32:40 -05:00
vtr : : Point < size_t > gsb_coordinate ( unique_mirror . get_sb_x ( ) ,
unique_mirror . get_sb_y ( ) ) ;
std : : string name_using_coord =
generate_switch_block_module_name ( gsb_coordinate ) ;
std : : string name_using_index =
generate_switch_block_module_name_using_index ( isb ) ;
status =
module_name_map . set_tag_to_name_pair ( name_using_coord , name_using_index ) ;
2023-09-16 01:22:31 -05:00
if ( status ! = CMD_EXEC_SUCCESS ) {
return CMD_EXEC_SUCCESS ;
}
2023-09-16 01:32:40 -05:00
VTR_LOGV ( verbose , " Now use indexing name for module '%s' (was '%s') \n " ,
name_using_index . c_str ( ) , name_using_coord . c_str ( ) ) ;
2023-09-16 01:22:31 -05:00
}
for ( t_rr_type cb_type : { CHANX , CHANY } ) {
for ( size_t icb = 0 ; icb < device_rr_gsb . get_num_cb_unique_module ( cb_type ) ;
+ + icb ) {
2023-09-16 01:32:40 -05:00
const RRGSB & unique_mirror =
device_rr_gsb . get_cb_unique_module ( cb_type , icb ) ;
2023-09-16 01:22:31 -05:00
vtr : : Point < size_t > gsb_coordinate ( unique_mirror . get_cb_x ( cb_type ) ,
unique_mirror . get_cb_y ( cb_type ) ) ;
2023-09-16 01:32:40 -05:00
std : : string name_using_coord =
generate_connection_block_module_name ( cb_type , gsb_coordinate ) ;
std : : string name_using_index =
generate_connection_block_module_name_using_index ( cb_type , icb ) ;
status = module_name_map . set_tag_to_name_pair ( name_using_coord ,
name_using_index ) ;
2023-09-16 01:22:31 -05:00
if ( status ! = CMD_EXEC_SUCCESS ) {
return CMD_EXEC_SUCCESS ;
}
2023-09-16 01:32:40 -05:00
VTR_LOGV ( verbose , " Now use indexing name for module '%s' (was '%s') \n " ,
name_using_index . c_str ( ) , name_using_coord . c_str ( ) ) ;
2023-09-16 01:22:31 -05:00
}
}
/* Walk through the fabric tile on the unique routing modules */
for ( size_t itile = 0 ; itile < fabric_tile . unique_tiles ( ) . size ( ) ; + + itile ) {
FabricTileId fabric_tile_id = fabric_tile . unique_tiles ( ) [ itile ] ;
vtr : : Point < size_t > tile_coord = fabric_tile . tile_coordinate ( fabric_tile_id ) ;
std : : string name_using_coord = generate_tile_module_name ( tile_coord ) ;
2023-09-16 01:30:34 -05:00
std : : string name_using_index = generate_tile_module_name_using_index ( itile ) ;
2023-09-16 01:32:40 -05:00
status =
module_name_map . set_tag_to_name_pair ( name_using_coord , name_using_index ) ;
2023-09-16 01:22:31 -05:00
if ( status ! = CMD_EXEC_SUCCESS ) {
return CMD_EXEC_SUCCESS ;
}
2023-09-16 01:32:40 -05:00
VTR_LOGV ( verbose , " Now use indexing name for module '%s' (was '%s') \n " ,
name_using_index . c_str ( ) , name_using_coord . c_str ( ) ) ;
2023-09-16 01:22:31 -05:00
}
return CMD_EXEC_SUCCESS ;
}
2023-09-23 14:15:31 -05:00
/** @brief Apply module renaming for all the modules. Require the module name map cover all the modules */
2023-09-16 01:32:40 -05:00
int rename_fabric_modules ( ModuleManager & module_manager ,
const ModuleNameMap & module_name_map ,
const bool & verbose ) {
2023-09-16 01:22:31 -05:00
int status = CMD_EXEC_SUCCESS ;
size_t cnt = 0 ;
for ( ModuleId curr_module : module_manager . modules ( ) ) {
2023-09-23 13:51:31 -05:00
std : : string curr_module_name = module_manager . module_name ( curr_module ) ;
/* Error out if the new name does not exist ! */
if ( ! module_name_map . name_exist ( curr_module_name ) ) {
VTR_LOG_ERROR ( " The built-in module name '%s' does not exist! Abort renaming... \n " , curr_module_name . c_str ( ) ) ;
return CMD_EXEC_FATAL_ERROR ;
}
2023-09-16 01:32:40 -05:00
std : : string new_name =
2023-09-23 13:51:31 -05:00
module_name_map . name ( curr_module_name ) ;
if ( new_name ! = curr_module_name ) {
2023-09-16 01:32:40 -05:00
VTR_LOGV ( verbose , " Rename module '%s' to its new name '%s' \n " ,
2023-09-23 13:51:31 -05:00
curr_module_name . c_str ( ) ,
2023-09-16 01:32:40 -05:00
new_name . c_str ( ) ) ;
2023-09-16 01:22:31 -05:00
module_manager . set_module_name ( curr_module , new_name ) ;
}
cnt + + ;
}
VTR_LOG ( " Renamed %lu modules \n " , cnt ) ;
return status ;
2023-09-16 01:32:40 -05:00
}
2023-09-16 01:22:31 -05:00
2023-09-23 14:15:31 -05:00
/** @brief Apply module renaming based on the pairs given by module name map only. So not all the modules are renamed. So the module name map just cover a subset of modules */
int partial_rename_fabric_modules ( ModuleManager & module_manager ,
const ModuleNameMap & module_name_map ,
const bool & verbose ) {
int status = CMD_EXEC_SUCCESS ;
size_t cnt = 0 ;
for ( std : : string built_in_name : module_name_map . tags ( ) ) {
ModuleId curr_module = module_manager . find_module ( built_in_name ) ;
if ( ! module_manager . valid_module_id ( curr_module ) ) {
VTR_LOG_ERROR ( " The built-in module name '%s' does not exist! Abort renaming... \n " , built_in_name . c_str ( ) ) ;
return CMD_EXEC_FATAL_ERROR ;
}
std : : string new_name =
module_name_map . name ( built_in_name ) ;
if ( new_name ! = built_in_name ) {
VTR_LOGV ( verbose , " Rename module '%s' to its new name '%s' \n " ,
built_in_name . c_str ( ) ,
new_name . c_str ( ) ) ;
module_manager . set_module_name ( curr_module , new_name ) ;
}
cnt + + ;
}
VTR_LOG ( " Renamed %lu modules \n " , cnt ) ;
return status ;
}
2023-09-23 13:51:31 -05:00
/** @brief The module name map kept in openfpga context always has a built-in name with coordinates.
* while users apply renaming or other internal renaming is applied , e . g . , through option ' - - name_module_using_index ' , the module name in the module graph can be changed . So in the user ' s version , the built - in name may become index or anything else .
* We have to keep the built - in name consistent ( use coordinates , otherwise other engines may not work , which rely on this convention ) while the given name should follow the users ' definition . So we need an update here
* For example :
* the current module name map is ' tile_1__1_ ' - > ' tile_4_ '
* the user ' s module name map is ' tile_4_ ' - > ' tile_big '
* The resulting module name map is ' tile_1__1_ ' - > ' tile_big '
*/
int update_module_name_map_with_user_version ( ModuleNameMap & curr_module_name_map ,
const ModuleNameMap & user_module_name_map ,
const bool & verbose ) {
int status = CMD_EXEC_SUCCESS ;
size_t cnt = 0 ;
for ( std : : string user_tag : user_module_name_map . tags ( ) ) {
if ( ! curr_module_name_map . tag_exist ( user_tag ) ) {
VTR_LOG_ERROR ( " The built-in module name '%s' given by user does not exist in current module name map! Abort updating... \n " , user_tag . c_str ( ) ) ;
return CMD_EXEC_FATAL_ERROR ;
}
std : : string built_in_tag = curr_module_name_map . tag ( user_tag ) ;
curr_module_name_map . set_tag_to_name_pair ( built_in_tag , user_module_name_map . name ( user_tag ) ) ;
VTR_LOGV ( verbose , " Now module built-in name '%s' is pointed to its new name '%s' (old name '%s' is deleted) \n " ,
built_in_tag . c_str ( ) ,
user_module_name_map . name ( user_tag ) . c_str ( ) ,
user_tag . c_str ( ) ) ;
cnt + + ;
}
VTR_LOGV ( verbose , " Update %lu built-in-to-name pairs \n " , cnt ) ;
return status ;
}
2023-09-16 01:22:31 -05:00
} /* end namespace openfpga */