diff --git a/openfpga/src/base/openfpga_build_fabric_template.h b/openfpga/src/base/openfpga_build_fabric_template.h index 4140a15d2..848742933 100644 --- a/openfpga/src/base/openfpga_build_fabric_template.h +++ b/openfpga/src/base/openfpga_build_fabric_template.h @@ -441,7 +441,7 @@ int write_fabric_pin_physical_location_template( std::string file_name = cmd_context.option_value(cmd, opt_file); - std::string module_name; + std::string module_name("*"); /* Use a wildcard for everything */ CommandOptionId opt_module = cmd.option("module"); if (true == cmd_context.option_enable(cmd, opt_module)) { module_name = cmd_context.option_value(cmd, opt_module).empty(); diff --git a/openfpga/src/fabric/write_xml_fabric_pin_physical_location.cpp b/openfpga/src/fabric/write_xml_fabric_pin_physical_location.cpp index 0cca2d934..ccc9fd613 100644 --- a/openfpga/src/fabric/write_xml_fabric_pin_physical_location.cpp +++ b/openfpga/src/fabric/write_xml_fabric_pin_physical_location.cpp @@ -6,6 +6,7 @@ #include #include #include +#include /* Headers from vtrutil library */ #include "vtr_assert.h" @@ -142,24 +143,18 @@ int write_xml_fabric_pin_physical_location(const char* fname, /* If module name is not specified, walk through all the modules and write * physical pin location when any is specified */ short cnt = 0; - if (module_name.empty()) { - for (ModuleId curr_module : module_manager.modules()) { - int err_code = write_xml_fabric_module_pin_phy_loc( - fp, module_manager, curr_module, show_invalid_side, verbose); - if (err_code != CMD_EXEC_SUCCESS) { - return CMD_EXEC_FATAL_ERROR; - } - cnt++; - } - } else { - /* Check if the module name is valid or not, if not, error out */ - ModuleId curr_module = module_manager.find_module(module_name); - if (!module_manager.valid_module_id(curr_module)) { - VTR_LOG_ERROR( - "Invalid module name '%s' which does not exist in current fabric!\n", - module_name.c_str()); - return CMD_EXEC_FATAL_ERROR; + /* Use regular expression to capture the module whose name matches the pattern */ + for (ModuleId curr_module : module_manager.modules()) { + std::string curr_module_name = module_manager.module_name(curr_module); + std::string pattern = module_name; + std::regex star_replace("\\*"); + std::regex questionmark_replace("\\?"); + std::string wildcard_pattern = std::regex_replace(std::regex_replace(pattern, star_replace, ".*"), questionmark_replace, "."); + std::regex wildcard_regex(wildcard_pattern); + if (!std::regex_match(curr_module_name, wildcard_regex)) { + continue; } + VTR_LOGV(verbose, "Output pin physical location of module '%s'.\n", curr_module_name.c_str()); /* Write the pin physical location for this module */ int err_code = write_xml_fabric_module_pin_phy_loc( fp, module_manager, curr_module, show_invalid_side, verbose); @@ -176,6 +171,13 @@ int write_xml_fabric_pin_physical_location(const char* fname, /* Close the file stream */ fp.close(); + /* If there is no match, error out! */ + if (cnt == 0) { + VTR_LOG_ERROR("Invalid regular expression for module name '%s' which does not match any in current fabric!\n", + module_name.c_str()); + return CMD_EXEC_FATAL_ERROR; + } + VTR_LOGV(verbose, "Outputted %lu modules with pin physical location.\n", cnt); return CMD_EXEC_SUCCESS;