Skip to content

Commit a958d7e

Browse files
committed
improved comments and code structure
1 parent 9970b2e commit a958d7e

14 files changed

+257
-126
lines changed

vpr/src/draw/draw_basic.cpp

Lines changed: 65 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ void draw_partial_route(const std::vector<RRNodeId>& rr_nodes_to_draw, ezgl::ren
612612
auto& device_ctx = g_vpr_ctx.device();
613613
const auto& rr_graph = device_ctx.rr_graph;
614614

615-
// Draw Pins
615+
// Draw RR Nodes
616616
for (size_t i = 1; i < rr_nodes_to_draw.size(); ++i) {
617617
RRNodeId inode = rr_nodes_to_draw[i];
618618
auto rr_type = rr_graph.node_type(inode);
@@ -637,7 +637,7 @@ void draw_partial_route(const std::vector<RRNodeId>& rr_nodes_to_draw, ezgl::ren
637637
continue;
638638
}
639639

640-
// Draw IO Pins
640+
// Draw cluster-level IO Pins
641641
if (rr_type == e_rr_type::OPIN || rr_type == e_rr_type::IPIN) {
642642
draw_rr_pin(inode, color, g);
643643
continue;
@@ -671,7 +671,7 @@ void draw_partial_route(const std::vector<RRNodeId>& rr_nodes_to_draw, ezgl::ren
671671
continue;
672672
}
673673

674-
// Skip drawing sources and sinks
674+
// Skip drawing edges to or from sources and sinks
675675
if (rr_type == e_rr_type::SINK || rr_type == e_rr_type::SOURCE || prev_type == e_rr_type::SINK || prev_type == e_rr_type::SOURCE) {
676676
continue;
677677
}
@@ -688,71 +688,78 @@ void draw_partial_route(const std::vector<RRNodeId>& rr_nodes_to_draw, ezgl::ren
688688
continue;
689689
}
690690

691-
auto iedge = find_edge(prev_node, inode);
692-
auto switch_type = rr_graph.edge_switch(RRNodeId(prev_node), iedge);
691+
draw_inter_cluster_rr_edge(inode, prev_node, rr_type, prev_type, rr_graph, g);
693692

694-
switch (rr_type) {
695-
case e_rr_type::IPIN: {
696-
if (rr_graph.node_type(prev_node) == e_rr_type::OPIN) {
697-
draw_pin_to_pin(prev_node, inode, g);
698-
} else {
699-
draw_pin_to_chan_edge(inode, prev_node, g);
700-
}
701-
break;
693+
}
694+
}
695+
696+
void draw_inter_cluster_rr_edge(RRNodeId inode, RRNodeId prev_node, e_rr_type rr_type, e_rr_type prev_type, const RRGraphView& rr_graph, ezgl::renderer* g) {
697+
698+
auto iedge = find_edge(prev_node, inode);
699+
auto switch_type = rr_graph.edge_switch(RRNodeId(prev_node), iedge);
700+
701+
switch (rr_type) {
702+
case e_rr_type::IPIN: {
703+
if (prev_type == e_rr_type::OPIN) {
704+
draw_pin_to_pin(prev_node, inode, g);
705+
} else {
706+
draw_pin_to_chan_edge(inode, prev_node, g);
702707
}
703-
case e_rr_type::CHANX: {
704-
switch (prev_type) {
705-
case e_rr_type::CHANX: {
706-
draw_chanx_to_chanx_edge(prev_node, inode, switch_type, g);
707-
break;
708-
}
709-
case e_rr_type::CHANY: {
710-
draw_chanx_to_chany_edge(inode, prev_node, FROM_Y_TO_X, switch_type, g);
711-
break;
712-
}
713-
case e_rr_type::OPIN: {
714-
draw_pin_to_chan_edge(prev_node, inode, g);
715-
break;
716-
}
717-
default: {
718-
VPR_ERROR(VPR_ERROR_OTHER,
719-
"Unexpected connection from an rr_node of type %d to one of type %d.\n",
720-
prev_type, rr_type);
721-
}
708+
break;
709+
}
710+
case e_rr_type::CHANX: {
711+
switch (prev_type) {
712+
case e_rr_type::CHANX: {
713+
draw_chanx_to_chanx_edge(prev_node, inode, switch_type, g);
714+
break;
715+
}
716+
case e_rr_type::CHANY: {
717+
draw_chanx_to_chany_edge(inode, prev_node, FROM_Y_TO_X, switch_type, g);
718+
break;
719+
}
720+
case e_rr_type::OPIN: {
721+
draw_pin_to_chan_edge(prev_node, inode, g);
722+
break;
723+
}
724+
default: {
725+
VPR_ERROR(VPR_ERROR_OTHER,
726+
"Unexpected connection from an rr_node of type %d to one of type %d.\n",
727+
prev_type, rr_type);
722728
}
723-
break;
724729
}
725-
case e_rr_type::CHANY: {
726-
switch (prev_type) {
727-
case e_rr_type::CHANX: {
728-
draw_chanx_to_chany_edge(prev_node, inode,
729-
FROM_X_TO_Y, switch_type, g);
730-
break;
731-
}
732-
case e_rr_type::CHANY: {
733-
draw_chany_to_chany_edge(RRNodeId(prev_node), RRNodeId(inode),
734-
switch_type, g);
735-
break;
736-
}
737-
case e_rr_type::OPIN: {
738-
draw_pin_to_chan_edge(prev_node, inode, g);
730+
break;
731+
}
732+
case e_rr_type::CHANY: {
733+
switch (prev_type) {
734+
case e_rr_type::CHANX: {
735+
draw_chanx_to_chany_edge(prev_node, inode,
736+
FROM_X_TO_Y, switch_type, g);
737+
break;
738+
}
739+
case e_rr_type::CHANY: {
740+
draw_chany_to_chany_edge(RRNodeId(prev_node), RRNodeId(inode),
741+
switch_type, g);
742+
break;
743+
}
744+
case e_rr_type::OPIN: {
745+
draw_pin_to_chan_edge(prev_node, inode, g);
739746

740-
break;
741-
}
742-
default: {
743-
VPR_ERROR(VPR_ERROR_OTHER,
744-
"Unexpected connection from an rr_node of type %d to one of type %d.\n",
745-
prev_type, rr_type);
746-
}
747+
break;
748+
}
749+
default: {
750+
VPR_ERROR(VPR_ERROR_OTHER,
751+
"Unexpected connection from an rr_node of type %d to one of type %d.\n",
752+
prev_type, rr_type);
747753
}
748-
break;
749-
}
750-
default: {
751-
break;
752754
}
755+
break;
756+
}
757+
default: {
758+
break;
753759
}
754760
}
755761
}
762+
756763

757764
/* Helper function that checks whether the edges between the current and previous nodes can be drawn
758765
* based on whether the cross-layer connections option is enabled and whether the layer on which the

vpr/src/draw/draw_basic.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ void draw_routed_net(ParentNetId net, ezgl::renderer* g);
5757
void draw_partial_route(const std::vector<RRNodeId>& rr_nodes_to_draw,
5858
ezgl::renderer* g);
5959

60+
/** @brief Draws an edge between two rr_nodes, which are both intra-cluster nodes.
61+
* @param inode The current rr_node id
62+
* @param prev_node The previous rr_node id
63+
* @param g The ezgl renderer
64+
*/
65+
void draw_inter_cluster_rr_edge(RRNodeId inode, RRNodeId prev_node, e_rr_type rr_type, e_rr_type prev_type, const RRGraphView& rr_graph, ezgl::renderer* g);
6066
/**
6167
* @brief Returns the layer number of a timing path node
6268
* @param node

vpr/src/draw/draw_rr.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,8 @@ RRNodeId draw_check_rr_node_hit(float click_x, float click_y) {
727727

728728
continue;
729729
}
730+
731+
// Check for inter cluster nodes
730732
switch (rr_graph.node_type(inode)) {
731733
case e_rr_type::IPIN:
732734
case e_rr_type::OPIN: {

vpr/src/draw/draw_rr.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ void draw_rr_edges(RRNodeId from_node, ezgl::renderer* g);
2727

2828
void draw_rr_chan(RRNodeId inode, const ezgl::color color, ezgl::renderer* g);
2929

30+
/**
31+
* @brief Draws the intra-cluster pin for a given RRNodeId when flat routing is enabled.
32+
*/
3033
void draw_rr_intrapin(RRNodeId inode, const ezgl::color& color, ezgl::renderer* g);
3134
/* Draws an IPIN or OPIN rr_node. Note that the pin can appear on more
3235
* than one side of a clb. Also note that this routine can change the

vpr/src/draw/draw_rr_edges.cpp

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -287,17 +287,17 @@ void draw_intrapin_to_intrapin(RRNodeId inode, RRNodeId prev_node, ezgl::rendere
287287
return;
288288
}
289289

290-
auto blk_id_pin_id1 = get_rr_node_cluster_blk_id_pb_graph_pin(inode);
291-
auto blk_id_pin_id2 = get_rr_node_cluster_blk_id_pb_graph_pin(prev_node);
290+
auto [blk_id, pin_id] = get_rr_node_cluster_blk_id_pb_graph_pin(inode);
291+
auto [prev_blk_id, prev_pin_id] = get_rr_node_cluster_blk_id_pb_graph_pin(prev_node);
292292

293-
ezgl::point2d p2 = draw_coords->get_absolute_pin_location(blk_id_pin_id1.first, blk_id_pin_id1.second);
294-
ezgl::point2d p1 = draw_coords->get_absolute_pin_location(blk_id_pin_id2.first, blk_id_pin_id2.second);
293+
ezgl::point2d icoord = draw_coords->get_absolute_pin_location(blk_id, pin_id);
294+
ezgl::point2d prev_coord = draw_coords->get_absolute_pin_location(prev_blk_id, prev_pin_id);
295295

296-
g->draw_line(p1, p2);
296+
g->draw_line(prev_coord, icoord);
297297

298-
float xend = p2.x + (p1.x - p2.x) / 10.;
299-
float yend = p2.y + (p1.y - p2.y) / 10.;
300-
draw_triangle_along_line(g, xend, yend, p1.x, p2.x, p1.y, p2.y);
298+
float triangle_coord_x = icoord.x + (prev_coord.x - icoord.x) / 10.;
299+
float triangle_coord_y = icoord.y + (prev_coord.y - icoord.y) / 10.;
300+
draw_triangle_along_line(g, triangle_coord_x, triangle_coord_y, prev_coord.x, icoord.x, prev_coord.y, icoord.y);
301301
}
302302

303303
void draw_intrapin_to_pin(RRNodeId inode, RRNodeId prev_node, ezgl::renderer* g) {
@@ -307,35 +307,44 @@ void draw_intrapin_to_pin(RRNodeId inode, RRNodeId prev_node, ezgl::renderer* g)
307307
if (!draw_state->is_flat) {
308308
return;
309309
}
310+
310311
const auto& rr_graph = g_vpr_ctx.device().rr_graph;
311312

312-
bool swapped = false;
313-
if (!is_inter_cluster_node(rr_graph, inode) && is_inter_cluster_node(rr_graph, prev_node)) {
314-
//Swap the nodes so that the inter-cluster node is always the current node
315-
std::swap(inode, prev_node);
316-
swapped = true;
317-
}
313+
ezgl::point2d prev_coord, icoord;
314+
float temp_x, temp_y; // temporary variables to hold coordinates to cast into ezgl::point2d
318315

319-
auto blk_id_pin_id = get_rr_node_cluster_blk_id_pb_graph_pin(prev_node);
320-
float x1, y1;
321-
ezgl::point2d p2 = draw_coords->get_absolute_pin_location(blk_id_pin_id.first, blk_id_pin_id.second);
316+
// get the location of the nodes based on whether inode is an inter-cluster or intra-cluster pin.
317+
if (!is_inter_cluster_node(rr_graph, inode)) {
322318

323-
for (const e_side& pin_side : TOTAL_2D_SIDES) {
324-
if (!rr_graph.is_node_on_specific_side(RRNodeId(inode), pin_side)) {
325-
continue;
326-
}
327-
draw_get_rr_pin_coords(inode, &x1, &y1, pin_side);
328-
ezgl::point2d p1 = {x1, y1};
319+
auto [blk_id, pin_id] = get_rr_node_cluster_blk_id_pb_graph_pin(inode);
320+
icoord = draw_coords->get_absolute_pin_location(blk_id, pin_id);
329321

330-
if (!swapped) {
331-
std::swap(p1, p2);
322+
for (const e_side& pin_side : TOTAL_2D_SIDES) {
323+
if (!rr_graph.is_node_on_specific_side(RRNodeId(prev_node), pin_side)) {
324+
continue;
325+
}
326+
draw_get_rr_pin_coords(prev_node, &temp_x, &temp_y, pin_side);
327+
prev_coord = {temp_x, temp_y};
332328
}
329+
} else {
330+
331+
auto [prev_blk_id, prev_pin_id] = get_rr_node_cluster_blk_id_pb_graph_pin(prev_node);
332+
prev_coord = draw_coords->get_absolute_pin_location(prev_blk_id, prev_pin_id);
333333

334-
g->draw_line(p1, p2);
335-
float xend = p2.x + (p1.x - p2.x) / 10.;
336-
float yend = p2.y + (p1.y - p2.y) / 10.;
337-
draw_triangle_along_line(g, xend, yend, p1.x, p2.x, p1.y, p2.y);
334+
for (const e_side& pin_side : TOTAL_2D_SIDES) {
335+
if (!rr_graph.is_node_on_specific_side(RRNodeId(inode), pin_side)) {
336+
continue;
337+
}
338+
draw_get_rr_pin_coords(inode, &temp_x, &temp_y, pin_side);
339+
icoord = {temp_x, temp_y};
340+
}
338341
}
342+
343+
g->draw_line(prev_coord, icoord);
344+
float triangle_coord_x = icoord.x + (prev_coord.x - icoord.x) / 10.;
345+
float triangle_coord_y = icoord.y + (prev_coord.y - icoord.y) / 10.;
346+
draw_triangle_along_line(g, triangle_coord_x, triangle_coord_y, prev_coord.x, icoord.x, prev_coord.y, icoord.y);
347+
339348
}
340349

341350
void draw_pin_to_pin(RRNodeId opin_node, RRNodeId ipin_node, ezgl::renderer* g) {

vpr/src/draw/draw_rr_edges.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,53 @@
1717

1818
#include "ezgl/graphics.hpp"
1919

20+
/**
21+
* @brief Draws the edge between two vertical channel nodes
22+
*/
2023
void draw_chany_to_chany_edge(RRNodeId from_node, RRNodeId to_node, short switch_type, ezgl::renderer* g);
24+
25+
/**
26+
* @brief Draws the edge between two horizontal channel nodes
27+
*/
2128
void draw_chanx_to_chanx_edge(RRNodeId from_node, RRNodeId to_node, short switch_type, ezgl::renderer* g);
29+
30+
/**
31+
* @brief Draws the edge between a horizontal channel node and a vertical channel node
32+
* @param chanx_node The horizontal channel node
33+
* @param chany_node The vertical channel node
34+
* @param edge_dir The direction of the edge, FROM_X_TO_Y or FROM_Y_TO_X
35+
* @param switch_type The type of switch used for the connection
36+
* @param g The ezgl renderer
37+
*/
2238
void draw_chanx_to_chany_edge(RRNodeId chanx_node, RRNodeId chany_node, enum e_edge_dir edge_dir, short switch_type, ezgl::renderer* g);
39+
40+
/**
41+
* @brief Draws the edge between an intra-cluster pin and a pin when flat routing is enabled. It does not matter whether prev_node is the intra-cluster pin or whether inode is the intra-cluster pin.
42+
* @param inode The current node to draw to
43+
* @param prev_node The previous node to draw from
44+
* @param g The ezgl renderer
45+
*/
2346
void draw_intrapin_to_pin(RRNodeId inode, RRNodeId prev_node, ezgl::renderer* g);
47+
/**
48+
* @brief Draws the edge between two intra-cluster pins when flat routing is enabled.
49+
* @param inode The current node to draw to
50+
* @param prev_node The previous node to draw from
51+
* @param g The ezgl renderer
52+
*/
2453
void draw_intrapin_to_intrapin(RRNodeId inode, RRNodeId prev_node, ezgl::renderer* g);
54+
55+
/**
56+
* @brief This routine directly draws an edge from an inter-cluster output pin to an inter-cluster input pin.
57+
*/
2558
void draw_pin_to_pin(RRNodeId opin, RRNodeId ipin, ezgl::renderer* g);
59+
60+
//TODO: These two functions currently do not draw correctly after rearranging the block locations. They need an update.
2661
void draw_pin_to_sink(RRNodeId ipin_node, RRNodeId sink_node, ezgl::renderer* g);
2762
void draw_source_to_pin(RRNodeId source_node, RRNodeId opin_node, ezgl::renderer* g);
63+
64+
/**
65+
* @brief Draws an edge from a inter-cluster pin node to a channel node (CHANX or CHANY).
66+
*/
2867
void draw_pin_to_chan_edge(RRNodeId pin_node, RRNodeId chan_node, ezgl::renderer* g);
2968

3069
#endif /* NO_GRAPHICS */

vpr/src/draw/draw_searchbar.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ void draw_highlight_blocks_color(t_logical_block_type_ptr type,
131131
/* If an rr_node has been clicked on, it will be highlighted in MAGENTA.
132132
* If so, and toggle nets is selected, highlight the whole net in that colour.
133133
*/
134-
void highlight_net(char* message, RRNodeId hit_node) {
134+
void highlight_nets(char* message, RRNodeId hit_node) {
135135
auto& cluster_ctx = g_vpr_ctx.clustering();
136136
auto& atom_ctx = g_vpr_ctx.atom();
137137
auto& route_ctx = g_vpr_ctx.routing();
@@ -154,33 +154,35 @@ void highlight_net(char* message, RRNodeId hit_node) {
154154
application.update_message(message);
155155
}
156156

157-
void check_node_highlight_net(char* message, ParentNetId parent_id, RRNodeId hit_node) {
157+
std::string draw_get_net_name(ParentNetId parent_id) {
158+
if (!g_vpr_ctx.routing().is_flat) {
159+
return g_vpr_ctx.clustering().clb_nlist.net_name(convert_to_cluster_net_id(parent_id));
160+
} else {
161+
return g_vpr_ctx.atom().netlist().net_name(convert_to_atom_net_id(parent_id));
162+
}
163+
}
164+
165+
void check_node_highlight_net(char* message, ParentNetId parent_net_id, RRNodeId hit_node) {
158166
auto& route_ctx = g_vpr_ctx.routing();
159167
t_draw_state* draw_state = get_draw_state_vars();
160168

161-
if (!route_ctx.route_trees[parent_id])
169+
if (!route_ctx.route_trees[parent_net_id])
162170
return;
163171

164-
for (auto& rt_node : route_ctx.route_trees[parent_id].value().all_nodes()) {
172+
for (auto& rt_node : route_ctx.route_trees[parent_net_id].value().all_nodes()) {
165173
RRNodeId inode = rt_node.inode;
166174
if (draw_state->draw_rr_node[inode].color == ezgl::MAGENTA) {
167-
draw_state->net_color[parent_id] = draw_state->draw_rr_node[inode].color;
175+
draw_state->net_color[parent_net_id] = draw_state->draw_rr_node[inode].color;
168176
if (inode == hit_node) {
169177
std::string orig_msg(message);
170-
std::string net_name;
171-
if (!route_ctx.is_flat) {
172-
net_name = g_vpr_ctx.clustering().clb_nlist.net_name(convert_to_cluster_net_id(parent_id));
173-
} else {
174-
net_name = g_vpr_ctx.atom().netlist().net_name(convert_to_atom_net_id(parent_id));
175-
}
176178
sprintf(message, "%s || Net: %zu (%s)", orig_msg.c_str(),
177-
size_t(parent_id),
178-
net_name.c_str());
179+
size_t(parent_net_id),
180+
draw_get_net_name(parent_net_id).c_str());
179181
}
180182
} else if (draw_state->draw_rr_node[inode].color
181183
== ezgl::WHITE) {
182184
// If node is de-selected.
183-
draw_state->net_color[parent_id] = ezgl::BLACK;
185+
draw_state->net_color[parent_net_id] = ezgl::BLACK;
184186
break;
185187
}
186188
}

0 commit comments

Comments
 (0)