|
VPR-6.0
|
This graph shows which files directly or indirectly include this file:Go to the source code of this file.
Data Structures | |
| struct | s_mst_edge |
Typedefs | |
| typedef struct s_mst_edge | t_mst_edge |
Functions | |
| t_mst_edge * | get_mst_of_net (int inet) |
| typedef struct s_mst_edge t_mst_edge |
| t_mst_edge* get_mst_of_net | ( | int | inet | ) |
given the net number, find and return its minimum spanning tree
Definition at line 16 of file mst.c.
{
int i, ipin, node_dist, num_pins_on_net, num_edges, blk1, blk2;
int nearest_node;
t_mst_edge *min_spantree;
boolean *in_mst;
int *edge_weight_with_curr_mst, *nearest_node_with_curr_mst;
num_pins_on_net = (clb_net[inet].num_sinks + 1);
if(num_pins_on_net > USHRT_MAX)
{
printf("Error: num_pins_on_net (%d) > USHRT_MAX(%u)\n",
num_pins_on_net, USHRT_MAX);
exit(1);
}
/* minimum spanning tree represented by a set of edges */
min_spantree =
(t_mst_edge *) my_malloc(sizeof(t_mst_edge) * (num_pins_on_net - 1));
in_mst = (boolean *) my_malloc(sizeof(boolean) * (num_pins_on_net));
edge_weight_with_curr_mst = (int *) my_malloc(sizeof(int) * (num_pins_on_net));
nearest_node_with_curr_mst = (int *) my_malloc(sizeof(int) * (num_pins_on_net));
/* identifier for minimum spanning tree by nodes */
in_mst[0] = TRUE;
for(ipin = 1; ipin < num_pins_on_net; ipin++) {
in_mst[ipin] = FALSE;
blk1 = clb_net[inet].node_block[0];
blk2 = clb_net[inet].node_block[ipin];
edge_weight_with_curr_mst[ipin] = ABS_DIFF(block[blk1].x, block[blk2].x) +
ABS_DIFF(block[blk1].y, block[blk2].y);
nearest_node_with_curr_mst[ipin] = 0;
}
num_edges = 0;
/* need to add num_pins - 1 number of edges */
for(i = 1; i < num_pins_on_net; i++)
{
/* look at remaining num_pins - 1 pins, and add them to the mst one at a time */
nearest_node = -1;
for(ipin = 1; ipin < num_pins_on_net; ipin++)
{
/* look at each pin not in the mst, find the nearest to the current partial mst */
if(!in_mst[ipin])
{
if(nearest_node == -1 || edge_weight_with_curr_mst[ipin] <= edge_weight_with_curr_mst[nearest_node]) {
nearest_node = ipin;
}
}
}
/* found the nearest to the current partial mst, so add an edge to mst */
min_spantree[num_edges].from_node = nearest_node_with_curr_mst[nearest_node];
min_spantree[num_edges].to_node = nearest_node;
num_edges++;
in_mst[nearest_node] = TRUE;
for(ipin = 1; ipin < num_pins_on_net; ipin++)
{
/* Update closest node to partial mst */
if(!in_mst[ipin])
{
blk1 = clb_net[inet].node_block[nearest_node];
blk2 = clb_net[inet].node_block[ipin];
node_dist = ABS_DIFF(block[blk1].x, block[blk2].x) +
ABS_DIFF(block[blk1].y, block[blk2].y);
if(node_dist < edge_weight_with_curr_mst[ipin]) {
edge_weight_with_curr_mst[ipin] = node_dist;
nearest_node_with_curr_mst[ipin] = nearest_node;
}
}
}
}
free(in_mst);
free(edge_weight_with_curr_mst);
free(nearest_node_with_curr_mst);
return min_spantree;
}
Here is the call graph for this function:
Here is the caller graph for this function: