Skip to content

Commit ef70be3

Browse files
Merge branch 'master' into temp_place_est_chan_util
2 parents b1e78f0 + 87eefdb commit ef70be3

File tree

109 files changed

+469
-3131
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+469
-3131
lines changed

CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ option(VTR_ENABLE_CAPNPROTO "Enable capnproto binary serialization support in VP
4242
#Allow the user to decide whether to compile the server module
4343
option(VPR_USE_SERVER "Specify whether vpr enables the server mode" ON)
4444

45-
#Allow the user to enable/disable VPR analytic placement
46-
#VPR option --enable_analytic_placer is also required for Analytic Placement
47-
option(VPR_ANALYTIC_PLACE "Enable analytic placement in VPR." ON)
4845
option(VPR_ENABLE_INTERCHANGE "Enable FPGA interchange." ON)
4946
option(VPR_ENABLE_NOC_SAT_ROUTING "Enable NoC SAT routing." OFF)
5047

README.developers.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,29 @@ For large scale reformatting (should only be performed by VTR maintainers) the s
179179

180180
Python files are automatically checked using `pylint` to ensure they follow established Python conventions. You can run `pylint` on the entire repository by running `./dev/pylint_check.py`. Certain files which were created before we adopted Python lint checking are grandfathered and are not checked. To check *all* files, provide the `--check_grandfathered` argument. You can also manually check individual files using `./dev/pylint_check.py <path_to_file1> <path_to_file2> ...`.
181181

182+
# Sanitizing Includes
183+
184+
You can use include-what-you-use or the clangd language server to make sure includes are correct and you don't have missing or unused includes.
185+
186+
## include-what-you-use
187+
188+
First, install include-what-you-use. Ubuntu/Debian users can run `sudo apt install iwyu` and Fedora/RHEL users can run `sudo dnf install iwyu`. You can then compile VTR with include-what-you-use enabled to get diagnostic messages about includes in all files with the following command:
189+
190+
```
191+
make CMAKE_PARAMS="-DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=include-what-you-use"
192+
```
193+
194+
Note that this method checks all source files and the diagnostic messages can be very long.
195+
196+
## clangd language server
197+
198+
Alternatively, if your editor supports clangd, you can use it to get diagnostic messages for the specific file you are working with. Visual Studio Code users can use the clangd extension to use clangd instead of Microsoft's C/C++ extension. To enable include diagnostics, create a file named `.clangd` in VTR root directory and add the following lines to it:
199+
```
200+
Diagnostics:
201+
UnusedIncludes: Strict
202+
MissingIncludes: Strict
203+
```
204+
182205
# Running Tests
183206

184207
VTR has a variety of tests which are used to check for correctness, performance and Quality of Result (QoR).

doc/src/vpr/command_line_usage.rst

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,12 @@ General Options
223223

224224
If this option is not specified it may be set from the ``VPR_NUM_WORKERS`` environment variable; otherwise the default is used.
225225

226+
If this option is set to something other than 1, the following algorithms can be run in parallel:
227+
228+
* Timing Analysis
229+
* Routing (If routing algorithm is set to parallel or parallel_decomp; See :option:`--router_algorithm`)
230+
* Portions of analytical placement (If using the analytical placement flow and compiled VPR with Eigen enabled; See :option:`--analytical_place`)
231+
226232
.. note:: To compile VPR to allow the usage of parallel workers, ``libtbb-dev`` must be installed in the system.
227233

228234
**Default:** ``1``
@@ -1517,6 +1523,35 @@ VPR uses a negotiated congestion algorithm (based on Pathfinder) to perform rout
15171523
* `swns` - setup Worst Negative Slack (sWNS) [ns]
15181524
* `stns` - Setup Total Negative Slack (sTNS) [ns]
15191525

1526+
1527+
.. option:: --generate_net_timing_report {on | off}
1528+
1529+
Generates a report that lists the bounding box, slack, and delay of every routed connection in a design in CSV format (``report_net_timing.csv``). Each row in the CSV corresponds to a single net.
1530+
1531+
The report can later be used by other tools to enable further optimizations. For example, the Synopsys synthesis tool (Synplify) can use this information to re-synthesize the design and improve the Quality of Results (QoR).
1532+
1533+
Fields in the report are:
1534+
1535+
.. code-block:: none
1536+
1537+
netname : The name assigned to the net in the atom netlist
1538+
Fanout : Net's fanout (number of sinks)
1539+
bb_xmin : X coordinate of the net's bounding box's bottom-left corner
1540+
bb_ymin : Y coordinate of the net's bounding box's bottom-left corner
1541+
bb_layer_min : Lowest layer number of the net's bounding box
1542+
bb_xmax : X coordinate of the net's bounding box's top-right corner
1543+
bb_ymax : Y coordinate of the net's bounding box's top-right corner
1544+
bb_layer_max : Highest layer number of the net's bounding box
1545+
src_pin_name : Name of the net's source pin
1546+
src_pin_slack : Setup slack of the net's source pin
1547+
sinks : A semicolon-separated list of sink pin entries, each in the format:
1548+
<sink_pin_name>,<sink_pin_slack>,<sink_pin_delay>
1549+
1550+
Example value for the ``sinks`` field:
1551+
``"U2.B,0.12,0.5;U3.C,0.10,0.6;U4.D,0.08,0.7"``
1552+
1553+
**Default:** ``off``
1554+
15201555
.. option:: --route_verbosity <int>
15211556

15221557
Controls the verbosity of routing output.

libs/libarchfpga/src/arch_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#define TOKENS " \t\n"
1717

1818
/* Value for UNDEFINED data */
19-
constexpr int UNDEFINED = -1;
19+
constexpr int ARCH_FPGA_UNDEFINED_VAL = -1;
2020

2121
/* Maximum value for minimum channel width to avoid overflows of short data type. */
2222
constexpr int MAX_CHANNEL_WIDTH = 8000;

libs/libarchfpga/src/arch_util.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ t_physical_tile_type get_empty_physical_type(const char* name /*= EMPTY_BLOCK_NA
444444
type.capacity = 0;
445445
type.num_drivers = 0;
446446
type.num_receivers = 0;
447-
type.area = UNDEFINED;
447+
type.area = ARCH_FPGA_UNDEFINED_VAL;
448448
type.switchblock_locations = vtr::Matrix<e_sb_type>({{size_t(type.width), size_t(type.height)}}, e_sb_type::FULL);
449449
type.switchblock_switch_overrides = vtr::Matrix<int>({{size_t(type.width), size_t(type.height)}}, DEFAULT_SWITCH);
450450
type.is_input_type = false;

libs/libarchfpga/src/read_xml_arch_file.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2887,7 +2887,7 @@ static void ProcessChanWidthDistrDir(pugi::xml_node Node, t_chan* chan, const pu
28872887
"Unknown property %s for chan_width_distr x\n", Prop);
28882888
}
28892889

2890-
chan->peak = get_attribute(Node, "peak", loc_data).as_float(UNDEFINED);
2890+
chan->peak = get_attribute(Node, "peak", loc_data).as_float(ARCH_FPGA_UNDEFINED_VAL);
28912891
chan->width = get_attribute(Node, "width", loc_data, hasWidth).as_float(0);
28922892
chan->xpeak = get_attribute(Node, "xpeak", loc_data, hasXpeak).as_float(0);
28932893
chan->dc = get_attribute(Node, "dc", loc_data, hasDc).as_float(0);
@@ -2994,7 +2994,7 @@ static void ProcessTileProps(pugi::xml_node Node,
29942994
/* Load properties */
29952995
PhysicalTileType->width = get_attribute(Node, "width", loc_data, ReqOpt::OPTIONAL).as_uint(1);
29962996
PhysicalTileType->height = get_attribute(Node, "height", loc_data, ReqOpt::OPTIONAL).as_uint(1);
2997-
PhysicalTileType->area = get_attribute(Node, "area", loc_data, ReqOpt::OPTIONAL).as_float(UNDEFINED);
2997+
PhysicalTileType->area = get_attribute(Node, "area", loc_data, ReqOpt::OPTIONAL).as_float(ARCH_FPGA_UNDEFINED_VAL);
29982998

29992999
if (atof(Prop) < 0) {
30003000
archfpga_throw(loc_data.filename_c_str(), loc_data.line(Node),
@@ -4264,8 +4264,8 @@ static std::vector<t_arch_switch_inf> ProcessSwitches(pugi::xml_node Parent,
42644264
static void ProcessSwitchTdel(pugi::xml_node Node, const bool timing_enabled, t_arch_switch_inf& arch_switch, const pugiutil::loc_data& loc_data) {
42654265
/* check if switch node has the Tdel property */
42664266
bool has_Tdel_prop = false;
4267-
float Tdel_prop_value = get_attribute(Node, "Tdel", loc_data, ReqOpt::OPTIONAL).as_float(UNDEFINED);
4268-
if (Tdel_prop_value != UNDEFINED) {
4267+
float Tdel_prop_value = get_attribute(Node, "Tdel", loc_data, ReqOpt::OPTIONAL).as_float(ARCH_FPGA_UNDEFINED_VAL);
4268+
if (Tdel_prop_value != ARCH_FPGA_UNDEFINED_VAL) {
42694269
has_Tdel_prop = true;
42704270
}
42714271

libs/librrgraph/src/base/rr_graph_builder.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,31 +31,29 @@ void RRGraphBuilder::add_node_to_all_locs(RRNodeId node) {
3131
short node_layer = node_storage_.node_layer(node);
3232
short node_twist = node_storage_.node_ptc_twist(node);
3333
int node_offset = 0;
34+
3435
for (int ix = node_storage_.node_xlow(node); ix <= node_storage_.node_xhigh(node); ix++) {
3536
for (int iy = node_storage_.node_ylow(node); iy <= node_storage_.node_yhigh(node); iy++) {
3637
node_ptc_num += node_twist * node_offset;
3738
node_offset++;
39+
3840
switch (node_type) {
3941
case e_rr_type::SOURCE:
4042
case e_rr_type::SINK:
4143
case e_rr_type::CHANY:
42-
node_lookup_.add_node(node, node_layer, ix, iy, node_type, node_ptc_num, TOTAL_2D_SIDES[0]);
43-
break;
4444
case e_rr_type::CHANX:
45-
/* Currently need to swap x and y for CHANX because of chan, seg convention
46-
* TODO: Once the builders is reworked for use consistent (x, y) convention,
47-
* the following swapping can be removed
48-
*/
49-
node_lookup_.add_node(node, node_layer, iy, ix, node_type, node_ptc_num, TOTAL_2D_SIDES[0]);
45+
node_lookup_.add_node(node, node_layer, ix, iy, node_type, node_ptc_num, TOTAL_2D_SIDES[0]);
5046
break;
47+
5148
case e_rr_type::OPIN:
5249
case e_rr_type::IPIN:
53-
for (const e_side& side : TOTAL_2D_SIDES) {
50+
for (const e_side side : TOTAL_2D_SIDES) {
5451
if (node_storage_.is_node_on_specific_side(node, side)) {
5552
node_lookup_.add_node(node,node_layer, ix, iy, node_type, node_ptc_num, side);
5653
}
5754
}
5855
break;
56+
5957
default:
6058
VTR_LOG_ERROR("Invalid node type for node '%lu' in the routing resource graph file", size_t(node));
6159
break;

libs/librrgraph/src/base/rr_graph_storage.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ size_t t_rr_graph_storage::count_rr_switches(
464464

465465
if (arch_switch_inf[iswitch].fixed_Tdel()) {
466466
//If delay is independent of fanin drop the unique fanin info
467-
fanin = UNDEFINED;
467+
fanin = ARCH_FPGA_UNDEFINED_VAL;
468468
}
469469

470470
if (arch_switch_fanins[iswitch].count(fanin) == 0) { //New fanin for this switch
@@ -482,7 +482,7 @@ size_t t_rr_graph_storage::count_rr_switches(
482482
for(size_t iswitch = 0; iswitch < arch_switch_counts.size(); ++iswitch) {
483483
if(arch_switch_fanins[iswitch].empty()){
484484
if(arch_switch_inf[iswitch].fixed_Tdel()){
485-
arch_switch_fanins[iswitch][UNDEFINED] = num_rr_switches++;
485+
arch_switch_fanins[iswitch][ARCH_FPGA_UNDEFINED_VAL] = num_rr_switches++;
486486
}
487487
}
488488
}
@@ -504,8 +504,8 @@ void t_rr_graph_storage::remap_rr_node_switch_indices(const t_arch_switch_fanin&
504504
int switch_index = edge_switch_[edge];
505505
int fanin = node_fan_in_[to_node];
506506

507-
if (switch_fanin[switch_index].count(UNDEFINED) == 1) {
508-
fanin = UNDEFINED;
507+
if (switch_fanin[switch_index].count(ARCH_FPGA_UNDEFINED_VAL) == 1) {
508+
fanin = ARCH_FPGA_UNDEFINED_VAL;
509509
}
510510

511511
auto itr = switch_fanin[switch_index].find(fanin);

libs/librrgraph/src/base/rr_graph_view.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ class RRGraphView {
351351

352352
start_x = " (" + std::to_string(node_xhigh(node)) + ","; //start coordinates have large value
353353
start_y = std::to_string(node_yhigh(node)) + ",";
354-
start_layer_str = std::to_string(node_layer_num);
354+
start_layer_str = std::to_string(node_layer_num) + ")";
355355
end_x = " (" + std::to_string(node_xlow(node)) + ","; //end coordinates have smaller value
356356
end_y = std::to_string(node_ylow(node)) + ",";
357357
end_layer_str = std::to_string(node_layer_num) + ")";
@@ -360,7 +360,7 @@ class RRGraphView {
360360
else { // signal travels in increasing direction, stays at same point, or can travel both directions
361361
start_x = " (" + std::to_string(node_xlow(node)) + ","; //start coordinates have smaller value
362362
start_y = std::to_string(node_ylow(node)) + ",";
363-
start_layer_str = std::to_string(node_layer_num);
363+
start_layer_str = std::to_string(node_layer_num) + ")";
364364
end_x = " (" + std::to_string(node_xhigh(node)) + ","; //end coordinates have larger value
365365
end_y = std::to_string(node_yhigh(node)) + ",";
366366
end_layer_str = std::to_string(node_layer_num) + ")"; //layer number

libs/librrgraph/src/base/rr_spatial_lookup.cpp

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
#include "vtr_assert.h"
22
#include "rr_spatial_lookup.h"
33

4-
RRSpatialLookup::RRSpatialLookup() {
5-
}
6-
74
RRNodeId RRSpatialLookup::find_node(int layer,
85
int x,
96
int y,
@@ -33,18 +30,6 @@ RRNodeId RRSpatialLookup::find_node(int layer,
3330
return RRNodeId::INVALID();
3431
}
3532

36-
/* Currently need to swap x and y for CHANX because of chan, seg convention
37-
* This is due to that the fast look-up builders uses (y, x) coordinate when
38-
* registering a CHANX node in the look-up
39-
* TODO: Once the builders is reworked for use consistent (x, y) convention,
40-
* the following swapping can be removed
41-
*/
42-
size_t node_x = x;
43-
size_t node_y = y;
44-
if (type == e_rr_type::CHANX) {
45-
std::swap(node_x, node_y);
46-
}
47-
4833
VTR_ASSERT_SAFE(4 == rr_node_indices_[type].ndims());
4934

5035
/* Sanity check to ensure the layer, x, y, side and ptc are in range
@@ -59,23 +44,23 @@ RRNodeId RRSpatialLookup::find_node(int layer,
5944
return RRNodeId::INVALID();
6045
}
6146

62-
if (node_x >= rr_node_indices_[type].dim_size(1)) {
47+
if (size_t(x) >= rr_node_indices_[type].dim_size(1)) {
6348
return RRNodeId::INVALID();
6449
}
6550

66-
if(node_y >= rr_node_indices_[type].dim_size(2)){
51+
if (size_t(y) >= rr_node_indices_[type].dim_size(2)){
6752
return RRNodeId::INVALID();
6853
}
6954

7055
if (node_side >= rr_node_indices_[type].dim_size(3)) {
7156
return RRNodeId::INVALID();
7257
}
7358

74-
if (size_t(ptc) >= rr_node_indices_[type][layer][node_x][node_y][node_side].size()) {
59+
if (size_t(ptc) >= rr_node_indices_[type][layer][x][y][node_side].size()) {
7560
return RRNodeId::INVALID();
7661
}
7762

78-
return rr_node_indices_[type][layer][node_x][node_y][node_side][ptc];
63+
return rr_node_indices_[type][layer][x][y][node_side][ptc];
7964
}
8065

8166
std::vector<RRNodeId> RRSpatialLookup::find_nodes_in_range(int layer,
@@ -114,18 +99,6 @@ std::vector<RRNodeId> RRSpatialLookup::find_nodes(int layer,
11499
return nodes;
115100
}
116101

117-
/* Currently need to swap x and y for CHANX because of chan, seg convention
118-
* This is due to that the fast look-up builders uses (y, x) coordinate when
119-
* registering a CHANX node in the look-up
120-
* TODO: Once the builders is reworked for use consistent (x, y) convention,
121-
* the following swapping can be removed
122-
*/
123-
size_t node_x = x;
124-
size_t node_y = y;
125-
if (type == e_rr_type::CHANX) {
126-
std::swap(node_x, node_y);
127-
}
128-
129102
VTR_ASSERT_SAFE(4 == rr_node_indices_[type].ndims());
130103

131104
/* Sanity check to ensure the x, y, side are in range
@@ -140,11 +113,11 @@ std::vector<RRNodeId> RRSpatialLookup::find_nodes(int layer,
140113
return nodes;
141114
}
142115

143-
if (node_x >= rr_node_indices_[type].dim_size(1)) {
116+
if (size_t(x) >= rr_node_indices_[type].dim_size(1)) {
144117
return nodes;
145118
}
146119

147-
if(node_y >= rr_node_indices_[type].dim_size(2)){
120+
if (size_t(y) >= rr_node_indices_[type].dim_size(2)){
148121
return nodes;
149122
}
150123

@@ -154,14 +127,14 @@ std::vector<RRNodeId> RRSpatialLookup::find_nodes(int layer,
154127

155128
/* Reserve space to avoid memory fragmentation */
156129
size_t num_nodes = 0;
157-
for (const auto& node : rr_node_indices_[type][layer][node_x][node_y][side]) {
130+
for (RRNodeId node : rr_node_indices_[type][layer][x][y][side]) {
158131
if (node.is_valid()) {
159132
num_nodes++;
160133
}
161134
}
162135

163136
nodes.reserve(num_nodes);
164-
for (const auto& node : rr_node_indices_[type][layer][node_x][node_y][side]) {
137+
for (RRNodeId node : rr_node_indices_[type][layer][x][y][side]) {
165138
if (node.is_valid()) {
166139
nodes.emplace_back(node);
167140
}
@@ -338,7 +311,7 @@ void RRSpatialLookup::resize_nodes(int layer,
338311
|| (x >= int(rr_node_indices_[type].dim_size(1)))
339312
|| (y >= int(rr_node_indices_[type].dim_size(2)))
340313
|| (size_t(side) >= rr_node_indices_[type].dim_size(3))) {
341-
rr_node_indices_[type].resize({std::max(rr_node_indices_[type].dim_size(0),size_t(layer)+1),
314+
rr_node_indices_[type].resize({std::max(rr_node_indices_[type].dim_size(0), size_t(layer)+1),
342315
std::max(rr_node_indices_[type].dim_size(1), size_t(x) + 1),
343316
std::max(rr_node_indices_[type].dim_size(2), size_t(y) + 1),
344317
std::max(rr_node_indices_[type].dim_size(3), size_t(side) + 1)});
@@ -352,7 +325,7 @@ void RRSpatialLookup::reorder(const vtr::vector<RRNodeId, RRNodeId>& dest_order)
352325
for (size_t x = 0; x < grid.dim_size(1); x++) {
353326
for (size_t y = 0; y < grid.dim_size(2); y++) {
354327
for (size_t s = 0; s < grid.dim_size(3); s++) {
355-
for (auto &node: grid[l][x][y][s]) {
328+
for (RRNodeId &node: grid[l][x][y][s]) {
356329
if (node.is_valid()) {
357330
node = dest_order[node];
358331
}

libs/librrgraph/src/base/rr_spatial_lookup.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
#ifndef RR_SPATIAL_LOOKUP_H
2-
#define RR_SPATIAL_LOOKUP_H
1+
#pragma once
32

43
/**
54
* @file
@@ -25,7 +24,7 @@ class RRSpatialLookup {
2524
/* -- Constructors -- */
2625
public:
2726
/* Explicitly define the only way to create an object */
28-
explicit RRSpatialLookup();
27+
explicit RRSpatialLookup() = default;
2928

3029
/* Disable copy constructors and copy assignment operator
3130
* This is to avoid accidental copy because it could be an expensive operation considering that the
@@ -293,5 +292,3 @@ class RRSpatialLookup {
293292
/* Fast look-up: TODO: Should rework the data type. Currently it is based on a 3-dimensional array mater where some dimensions must always be accessed with a specific index. Such limitation should be overcome */
294293
t_rr_node_indices rr_node_indices_;
295294
};
296-
297-
#endif

libs/librrgraph/src/io/rr_graph_uxsdcxx_serializer.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,16 +1848,11 @@ class RrGraphSerializer final : public uxsd::RrGraphBase<RrGraphContextTypes> {
18481848

18491849
/* Alloc the lookup table */
18501850
for (e_rr_type rr_type : RR_TYPES) {
1851-
if (rr_type == e_rr_type::CHANX) {
1852-
rr_graph_builder.node_lookup().resize_nodes(grid_.get_num_layers(), grid_.height(), grid_.width(), rr_type, NUM_2D_SIDES);
1853-
} else {
1854-
rr_graph_builder.node_lookup().resize_nodes(grid_.get_num_layers(), grid_.width(), grid_.height(), rr_type, NUM_2D_SIDES);
1855-
}
1851+
rr_graph_builder.node_lookup().resize_nodes(grid_.get_num_layers(), grid_.width(), grid_.height(), rr_type, NUM_2D_SIDES);
18561852
}
18571853

18581854
/* Add the correct node into the vector */
1859-
for (size_t inode = 0; inode < rr_nodes_->size(); inode++) {
1860-
auto node = (*rr_nodes_)[inode];
1855+
for (const t_rr_node& node : *rr_nodes_) {
18611856
rr_graph_builder.add_node_to_all_locs(node.id());
18621857
}
18631858
}

0 commit comments

Comments
 (0)