use wildcard in SDC generation for multiple-instanced-blocks
This commit is contained in:
parent
1e2226e1c3
commit
facd87dafe
|
@ -3,6 +3,9 @@
|
||||||
* fabric using SDC commands
|
* fabric using SDC commands
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
|
||||||
|
/* Headers from vtrutil library */
|
||||||
|
#include "vtr_assert.h"
|
||||||
|
|
||||||
/* Headers from openfpgautil library */
|
/* Headers from openfpgautil library */
|
||||||
#include "openfpga_digest.h"
|
#include "openfpga_digest.h"
|
||||||
|
|
||||||
|
@ -26,17 +29,30 @@ void rec_print_pnr_sdc_disable_configurable_memory_module_output(std::fstream& f
|
||||||
const ModuleId& parent_module,
|
const ModuleId& parent_module,
|
||||||
const std::string& parent_module_path) {
|
const std::string& parent_module_path) {
|
||||||
|
|
||||||
|
/* Keep tracking multiple-instanced-blocks (MIB)
|
||||||
|
* if they should be skipped as the unique module has been visited already
|
||||||
|
*/
|
||||||
|
std::map<ModuleId, bool> skip_mib;
|
||||||
/* For each configurable child, we will go one level down in priority */
|
/* For each configurable child, we will go one level down in priority */
|
||||||
for (size_t child_index = 0; child_index < module_manager.configurable_children(parent_module).size(); ++child_index) {
|
for (size_t child_index = 0; child_index < module_manager.configurable_children(parent_module).size(); ++child_index) {
|
||||||
std::string child_module_path = parent_module_path;
|
std::string child_module_path = parent_module_path;
|
||||||
ModuleId child_module_id = module_manager.configurable_children(parent_module)[child_index];
|
ModuleId child_module_id = module_manager.configurable_children(parent_module)[child_index];
|
||||||
size_t child_instance_id = module_manager.configurable_child_instances(parent_module)[child_index];
|
size_t child_instance_id = module_manager.configurable_child_instances(parent_module)[child_index];
|
||||||
if (true == module_manager.instance_name(parent_module, child_module_id, child_instance_id).empty()) {
|
if (true == module_manager.instance_name(parent_module, child_module_id, child_instance_id).empty()) {
|
||||||
|
if (0 < skip_mib.count(child_module_id)) {
|
||||||
|
VTR_ASSERT(skip_mib.at(child_module_id) = true);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
/* Give a default name <module_name>_<instance_id>_ */
|
/* Give a default name <module_name>_<instance_id>_ */
|
||||||
child_module_path += module_manager.module_name(child_module_id);
|
child_module_path += module_manager.module_name(child_module_id);
|
||||||
child_module_path += "_";
|
child_module_path += "_";
|
||||||
child_module_path += std::to_string(child_instance_id);
|
child_module_path += "*";
|
||||||
|
//child_module_path += std::to_string(child_instance_id);
|
||||||
child_module_path += "_";
|
child_module_path += "_";
|
||||||
|
/* If we use wild card to disable all the other instance
|
||||||
|
* So we can skip later if there is no specific instance name
|
||||||
|
*/
|
||||||
|
skip_mib[child_module_id] = true;
|
||||||
} else {
|
} else {
|
||||||
child_module_path += module_manager.instance_name(parent_module, child_module_id, child_instance_id);
|
child_module_path += module_manager.instance_name(parent_module, child_module_id, child_instance_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
|
||||||
|
/* Headers from vtrutil library */
|
||||||
|
#include "vtr_assert.h"
|
||||||
|
|
||||||
/* Headers from openfpgautil library */
|
/* Headers from openfpgautil library */
|
||||||
#include "openfpga_digest.h"
|
#include "openfpga_digest.h"
|
||||||
|
|
||||||
|
@ -46,10 +49,21 @@ std::string generate_sdc_port(const BasicPort& port) {
|
||||||
/* Only connection require a format of <port_name>[<lsb>:<msb>]
|
/* Only connection require a format of <port_name>[<lsb>:<msb>]
|
||||||
* others require a format of <port_type> [<lsb>:<msb>] <port_name>
|
* others require a format of <port_type> [<lsb>:<msb>] <port_name>
|
||||||
*/
|
*/
|
||||||
/* When LSB == MSB, we can use a simplified format <port_type>[<lsb>]*/
|
/* When LSB == MSB, we can use a simplified format
|
||||||
if ( 1 == port.get_width()) {
|
* If LSB != 0, we need to give explicit pin number
|
||||||
size_str = "[" + std::to_string(port.get_lsb()) + "]";
|
* <port_type>[<lsb>]
|
||||||
|
* Otherwise, we can keep a compact format
|
||||||
|
* <port_type>
|
||||||
|
*/
|
||||||
|
if (1 == port.get_width()) {
|
||||||
|
if (0 != port.get_lsb()) {
|
||||||
|
size_str = "[" + std::to_string(port.get_lsb()) + "]";
|
||||||
|
} else {
|
||||||
|
VTR_ASSERT(0 == port.get_lsb());
|
||||||
|
size_str.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sdc_line = port.get_name() + size_str;
|
sdc_line = port.get_name() + size_str;
|
||||||
|
|
||||||
return sdc_line;
|
return sdc_line;
|
||||||
|
|
Loading…
Reference in New Issue