use sorted edges in building routing modules
This commit is contained in:
parent
7a7f8374b3
commit
5558932762
|
@ -17,6 +17,25 @@
|
||||||
/* begin namespace openfpga */
|
/* begin namespace openfpga */
|
||||||
namespace openfpga {
|
namespace openfpga {
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* Find the configurable driver nodes for a node in the rr_graph
|
||||||
|
***********************************************************************/
|
||||||
|
std::vector<RRNodeId> get_rr_gsb_chan_node_configurable_driver_nodes(const RRGraph& rr_graph,
|
||||||
|
const RRGSB& rr_gsb,
|
||||||
|
const e_side& chan_side,
|
||||||
|
const size_t& track_id) {
|
||||||
|
std::vector<RRNodeId> driver_nodes;
|
||||||
|
for (const RREdgeId& edge : rr_gsb.get_chan_node_in_edges(rr_graph, chan_side, track_id)) {
|
||||||
|
/* Bypass non-configurable edges */
|
||||||
|
if (false == rr_graph.edge_is_configurable(edge)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
driver_nodes.push_back(rr_graph.edge_src_node(edge));
|
||||||
|
}
|
||||||
|
|
||||||
|
return driver_nodes;
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* Generate a port for a routing track of a swtich block
|
* Generate a port for a routing track of a swtich block
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
|
@ -17,6 +17,11 @@
|
||||||
/* begin namespace openfpga */
|
/* begin namespace openfpga */
|
||||||
namespace openfpga {
|
namespace openfpga {
|
||||||
|
|
||||||
|
std::vector<RRNodeId> get_rr_gsb_chan_node_configurable_driver_nodes(const RRGraph& rr_graph,
|
||||||
|
const RRGSB& rr_gsb,
|
||||||
|
const e_side& chan_side,
|
||||||
|
const size_t& track_id);
|
||||||
|
|
||||||
ModulePortId find_switch_block_module_chan_port(const ModuleManager& module_manager,
|
ModulePortId find_switch_block_module_chan_port(const ModuleManager& module_manager,
|
||||||
const ModuleId& sb_module,
|
const ModuleId& sb_module,
|
||||||
const RRGraph& rr_graph,
|
const RRGraph& rr_graph,
|
||||||
|
|
|
@ -227,7 +227,7 @@ void build_switch_block_interc_modules(ModuleManager& module_manager,
|
||||||
|
|
||||||
/* Determine if the interc lies inside a channel wire, that is interc between segments */
|
/* Determine if the interc lies inside a channel wire, that is interc between segments */
|
||||||
if (false == rr_gsb.is_sb_node_passing_wire(rr_graph, chan_side, chan_node_id)) {
|
if (false == rr_gsb.is_sb_node_passing_wire(rr_graph, chan_side, chan_node_id)) {
|
||||||
driver_rr_nodes = get_rr_graph_configurable_driver_nodes(rr_graph, cur_rr_node);
|
driver_rr_nodes = get_rr_gsb_chan_node_configurable_driver_nodes(rr_graph, rr_gsb, chan_side, chan_node_id);
|
||||||
/* Special: if there are zero-driver nodes. We skip here */
|
/* Special: if there are zero-driver nodes. We skip here */
|
||||||
if (0 == driver_rr_nodes.size()) {
|
if (0 == driver_rr_nodes.size()) {
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue