[core] fixed the bug which causes wrong fpga top connections and failed in fpga sdc
This commit is contained in:
parent
63ee0c980e
commit
a4f26798b0
|
@ -154,7 +154,7 @@ int add_fpga_core_to_device_module_graph(ModuleManager& module_manager,
|
||||||
|
|
||||||
/* Create a wrapper module under the existing fpga_top */
|
/* Create a wrapper module under the existing fpga_top */
|
||||||
ModuleId new_top_module = module_manager.create_wrapper_module(
|
ModuleId new_top_module = module_manager.create_wrapper_module(
|
||||||
top_module, top_module_name, core_inst_name, frame_view);
|
top_module, top_module_name, core_inst_name, !frame_view);
|
||||||
if (!module_manager.valid_module_id(new_top_module)) {
|
if (!module_manager.valid_module_id(new_top_module)) {
|
||||||
VTR_LOGV_ERROR(verbose,
|
VTR_LOGV_ERROR(verbose,
|
||||||
"Failed to create a wrapper module '%s' on top of '%s'!\n",
|
"Failed to create a wrapper module '%s' on top of '%s'!\n",
|
||||||
|
|
|
@ -1257,9 +1257,6 @@ ModuleId ModuleManager::create_wrapper_module(
|
||||||
reserve_module_nets(wrapper_module, num_nets_to_reserve);
|
reserve_module_nets(wrapper_module, num_nets_to_reserve);
|
||||||
for (ModulePortId new_port : module_ports(wrapper_module)) {
|
for (ModulePortId new_port : module_ports(wrapper_module)) {
|
||||||
BasicPort new_port_info = module_port(wrapper_module, new_port);
|
BasicPort new_port_info = module_port(wrapper_module, new_port);
|
||||||
/* Create new net */
|
|
||||||
ModuleNetId new_net = create_module_net(wrapper_module);
|
|
||||||
VTR_ASSERT(valid_module_net_id(wrapper_module, new_net));
|
|
||||||
/* For each input pin, create a new source */
|
/* For each input pin, create a new source */
|
||||||
ModuleManager::e_module_port_type new_port_type =
|
ModuleManager::e_module_port_type new_port_type =
|
||||||
port_type(wrapper_module, new_port);
|
port_type(wrapper_module, new_port);
|
||||||
|
@ -1267,26 +1264,28 @@ ModuleId ModuleManager::create_wrapper_module(
|
||||||
ModulePortId existing_port = port_map[new_port];
|
ModulePortId existing_port = port_map[new_port];
|
||||||
BasicPort existing_port_info = module_port(existing_module, existing_port);
|
BasicPort existing_port_info = module_port(existing_module, existing_port);
|
||||||
VTR_ASSERT(existing_port_info == new_port_info);
|
VTR_ASSERT(existing_port_info == new_port_info);
|
||||||
reserve_module_net_sources(wrapper_module, new_net,
|
|
||||||
new_port_info.pins().size());
|
|
||||||
reserve_module_net_sinks(wrapper_module, new_net,
|
|
||||||
new_port_info.pins().size());
|
|
||||||
if (new_port_type !=
|
if (new_port_type !=
|
||||||
ModuleManager::e_module_port_type::MODULE_OUTPUT_PORT) {
|
ModuleManager::e_module_port_type::MODULE_OUTPUT_PORT) {
|
||||||
for (auto pin : new_port_info.pins()) {
|
for (size_t ipin = 0; ipin < new_port_info.pins().size(); ++ipin) {
|
||||||
|
/* Create new net */
|
||||||
|
ModuleNetId new_net = create_module_net(wrapper_module);
|
||||||
|
VTR_ASSERT(valid_module_net_id(wrapper_module, new_net));
|
||||||
add_module_net_source(wrapper_module, new_net, wrapper_module, 0,
|
add_module_net_source(wrapper_module, new_net, wrapper_module, 0,
|
||||||
new_port, pin);
|
new_port, new_port_info.pins()[ipin]);
|
||||||
add_module_net_sink(wrapper_module, new_net, existing_module, 0,
|
add_module_net_sink(wrapper_module, new_net, existing_module, 0,
|
||||||
existing_port, pin);
|
existing_port, existing_port_info.pins()[ipin]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
VTR_ASSERT_SAFE(new_port_type ==
|
VTR_ASSERT_SAFE(new_port_type ==
|
||||||
ModuleManager::e_module_port_type::MODULE_OUTPUT_PORT);
|
ModuleManager::e_module_port_type::MODULE_OUTPUT_PORT);
|
||||||
for (auto pin : new_port_info.pins()) {
|
for (size_t ipin = 0; ipin < new_port_info.pins().size(); ++ipin) {
|
||||||
|
/* Create new net */
|
||||||
|
ModuleNetId new_net = create_module_net(wrapper_module);
|
||||||
|
VTR_ASSERT(valid_module_net_id(wrapper_module, new_net));
|
||||||
add_module_net_source(wrapper_module, new_net, existing_module, 0,
|
add_module_net_source(wrapper_module, new_net, existing_module, 0,
|
||||||
existing_port, pin);
|
existing_port, new_port_info.pins()[ipin]);
|
||||||
add_module_net_sink(wrapper_module, new_net, wrapper_module, 0,
|
add_module_net_sink(wrapper_module, new_net, wrapper_module, 0,
|
||||||
new_port, pin);
|
new_port, existing_port_info.pins()[ipin]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,6 +258,15 @@ void print_analysis_sdc(const AnalysisSdcOption& option,
|
||||||
ModuleId top_module =
|
ModuleId top_module =
|
||||||
openfpga_ctx.module_graph().find_module(generate_fpga_top_module_name());
|
openfpga_ctx.module_graph().find_module(generate_fpga_top_module_name());
|
||||||
VTR_ASSERT(true == openfpga_ctx.module_graph().valid_module_id(top_module));
|
VTR_ASSERT(true == openfpga_ctx.module_graph().valid_module_id(top_module));
|
||||||
|
/* Use the core module as the top when the fpga_core is added */
|
||||||
|
std::string core_block_name = generate_fpga_core_module_name();
|
||||||
|
const ModuleId& core_module =
|
||||||
|
openfpga_ctx.module_graph().find_module(core_block_name);
|
||||||
|
if (openfpga_ctx.module_graph().valid_module_id(core_module)) {
|
||||||
|
/* Now we use the core_block as the top-level block for the remaining
|
||||||
|
* functions */
|
||||||
|
top_module = core_module;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create clock and set I/O ports with input/output delays
|
/* Create clock and set I/O ports with input/output delays
|
||||||
* FIXME: Now different I/Os have different delays due to multiple clock
|
* FIXME: Now different I/Os have different delays due to multiple clock
|
||||||
|
|
|
@ -351,6 +351,15 @@ void print_pnr_sdc(const PnrSdcOption& sdc_options,
|
||||||
ModuleId top_module = module_manager.find_module(top_module_name);
|
ModuleId top_module = module_manager.find_module(top_module_name);
|
||||||
VTR_ASSERT(true == module_manager.valid_module_id(top_module));
|
VTR_ASSERT(true == module_manager.valid_module_id(top_module));
|
||||||
|
|
||||||
|
/* Use the core module as the top when the fpga_core is added */
|
||||||
|
std::string core_block_name = generate_fpga_core_module_name();
|
||||||
|
const ModuleId& core_module = module_manager.find_module(core_block_name);
|
||||||
|
if (module_manager.valid_module_id(core_module)) {
|
||||||
|
/* Now we use the core_block as the top-level block for the remaining
|
||||||
|
* functions */
|
||||||
|
top_module = core_module;
|
||||||
|
}
|
||||||
|
|
||||||
/* Constrain global ports */
|
/* Constrain global ports */
|
||||||
if (true == sdc_options.constrain_global_port()) {
|
if (true == sdc_options.constrain_global_port()) {
|
||||||
print_pnr_sdc_global_ports(sdc_options, module_manager, top_module,
|
print_pnr_sdc_global_ports(sdc_options, module_manager, top_module,
|
||||||
|
|
Loading…
Reference in New Issue