Skip to content

Commit 56b321e

Browse files
committed
2 parents b0d7458 + 9cc02c3 commit 56b321e

24 files changed

+290
-226
lines changed

doc/src/quickstart/index.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ On most unix-like systems you can run:
4848
4949
> make
5050
51+
The default front-end for VTR is :ref:`Parmys<parmys>`, but you can build with ODIN II instead using the command below. This is required to run :ref:`Synthesizing with ODIN II<synthesizing_with_odin_ii>`.
52+
53+
.. code-block:: bash
54+
55+
> make CMAKE_PARAMS="-DWITH_ODIN=on"
56+
5157
from the VTR root directory (hereafter referred to as :term:`$VTR_ROOT`) to build VTR.
5258

5359
.. note::
@@ -63,6 +69,8 @@ from the VTR root directory (hereafter referred to as :term:`$VTR_ROOT`) to buil
6369
* define VTR_ROOT as a variable in your shell (e.g. if ``~/trees/vtr`` is the path to the VTR source tree on your machine, run the equivalent of ``VTR_ROOT=~/trees/vtr`` in BASH) which will allow you to run the commands as written in this guide, or
6470
* manually replace `$VTR_ROOT` in the example commands below with your path to the VTR source tree.
6571

72+
73+
6674
For more details on building VTR on various operating systems/platforms see :doc:`Building VTR</BUILDING>`.
6775

6876

@@ -235,6 +243,7 @@ Next we need to run the three main sets of tools:
235243
* :ref:`ABC` performs 'logic optimization' which simplifies the circuit logic, and 'technology mapping' which converts logic equations into the Look-Up-Tables (LUTs) available on an FPGA, and
236244
* :ref:`VPR` which performs packing, placement and routing of the circuit to implement it on the targetted FPGA architecture.
237245

246+
.. _synthesizing_with_odin_ii:
238247
Synthesizing with ODIN II
239248
~~~~~~~~~~~~~~~~~~~~~~~~~
240249

doc/src/tutorials/flow/basic_flow.rst

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,9 @@ The following steps show you to run the VTR design flow to map a sample circuit
1717
1818
$VTR_ROOT/vtr_flow/scripts/run_vtr_task.py basic_no_timing
1919
20-
The subdirectory ``regression_tests/vtr_reg_basic`` contains tests that are to be run before each commit. They check for basic functionallity to make sure nothing was extremely out of order. This command runs the VTR flow on a set of circuits and a single architecture.
20+
The subdirectory ``regression_tests/vtr_reg_basic`` contains tests that are to be run before each commit. They check for basic functionality to make sure nothing was extremely out of order. This command runs the VTR flow on a set of circuits and a single architecture.
2121
The files generated from the run are stored in ``basic_no_timing/run[#]`` where ``[#]`` is the number of runs you have done.
22-
If this is your first time running the flow, the results will be stored in basic_no_timing/run001.
23-
When the script completes, enter the following command:
24-
25-
.. code-block:: shell
26-
27-
../../../scripts/python_libs/vtr/parse_vtr_task.py basic_no_timing/
28-
29-
This parses out the information of the VTR run and outputs the results in a text file called ``run[#]/parse_results.txt``.
22+
If this is your first time running the flow, the results will be stored in basic_no_timing/run001. The command parses out the information of the VTR run and outputs the results in a text file called ``run[#]/parse_results.txt``.
3023

3124
More info on how to run the flow on multiple circuits and architectures along with different options later.
3225
Before that, we need to ensure that the run that you have done works.

doc/src/vpr/basic_flow.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Basic flow
44
The Place and Route process in VPR consists of several steps:
55

66
- Packing (combinines primitives into complex blocks)
7-
- Placment (places complex blocks within the FPGA grid)
7+
- Placement (places complex blocks within the FPGA grid)
88
- Routing (determines interconnections between blocks)
99
- Analysis (analyzes the implementation)
1010

doc/src/vpr/command_line_usage.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,6 +1298,14 @@ The following options are only valid when the router is in timing-driven mode (t
12981298

12991299
**Default:** ``1.2``
13001300

1301+
.. option:: --router_profiler_astar_fac <float>
1302+
1303+
Controls the directedness of the timing-driven router's exploration when doing router delay profiling of an architecture.
1304+
The router delay profiling step is currently used to calculate the place delay matrix lookup.
1305+
Values between 1 and 2 are resonable; higher values trade some quality for reduced run-time.
1306+
1307+
**Default:** ``1.2``
1308+
13011309
.. option:: --max_criticality <float>
13021310

13031311
Sets the maximum fraction of routing cost that can come from delay (vs. coming from routability) for any net.

libs/libarchfpga/src/device_grid.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
#include "device_grid.h"
22

3+
#include <utility>
4+
35
DeviceGrid::DeviceGrid(std::string grid_name, vtr::NdMatrix<t_grid_tile, 3> grid)
4-
: name_(grid_name)
5-
, grid_(grid) {
6+
: name_(std::move(grid_name))
7+
, grid_(std::move(grid)) {
68
count_instances();
79
}
810

911
DeviceGrid::DeviceGrid(std::string grid_name, vtr::NdMatrix<t_grid_tile, 3> grid, std::vector<t_logical_block_type_ptr> limiting_res)
10-
: DeviceGrid(grid_name, grid) {
11-
limiting_resources_ = limiting_res;
12+
: DeviceGrid(std::move(grid_name), std::move(grid)) {
13+
limiting_resources_ = std::move(limiting_res);
1214
}
1315

1416
size_t DeviceGrid::num_instances(t_physical_tile_type_ptr type, int layer_num) const {

libs/libvtrutil/src/vtr_ndmatrix.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ class NdMatrixBase {
288288
data_ = std::make_unique<T[]>(size());
289289
}
290290

291-
///@brief Returns the size of the matrix (number of elements) calucated from the current dimensions
291+
///@brief Returns the size of the matrix (number of elements) calculated from the current dimensions
292292
size_t calc_size() const {
293293
///@brief Size is the product of all dimension sizes
294294
size_t cnt = dim_size(0);
@@ -310,7 +310,7 @@ class NdMatrixBase {
310310
*
311311
* Examples:
312312
*
313-
* //A 2-dimensional matrix with indicies [0..4][0..9]
313+
* //A 2-dimensional matrix with indices [0..4][0..9]
314314
* NdMatrix<int,2> m1({5,10});
315315
*
316316
* //Accessing an element
@@ -319,17 +319,17 @@ class NdMatrixBase {
319319
* //Setting an element
320320
* m1[2][8] = 0;
321321
*
322-
* //A 3-dimensional matrix with indicies [0..4][0..9][0..19]
322+
* //A 3-dimensional matrix with indices [0..4][0..9][0..19]
323323
* NdMatrix<int,3> m2({5,10,20});
324324
*
325-
* //A 2-dimensional matrix with indicies [0..4][0..9], with all entries
325+
* //A 2-dimensional matrix with indices [0..4][0..9], with all entries
326326
* //initialized to 42
327327
* NdMatrix<int,2> m3({5,10}, 42);
328328
*
329329
* //Filling all entries with value 101
330330
* m3.fill(101);
331331
*
332-
* //Resizing an existing matrix (all values reset to default constucted value)
332+
* //Resizing an existing matrix (all values reset to default constructed value)
333333
* m3.resize({5,5})
334334
*
335335
* //Resizing an existing matrix (all elements set to value 88)

odin_ii/src/verilog/verilog_bison.y

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ int yylex(void);
5252
%define parse.error verbose
5353

5454
%locations
55+
%expect 2
5556

5657
%union{
5758
char *id_name;
@@ -208,6 +209,8 @@ int yylex(void);
208209
%type <node> list_of_generate_block_items generate_item generate_block_item generate loop_generate_construct if_generate_construct
209210
%type <node> case_generate_construct case_generate_item_list case_generate_items generate_block generate_localparam_declaration generate_defparam_declaration
210211

212+
213+
211214
/* capture wether an operation is signed or not */
212215
%type <op> var_signedness
213216

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ psutil
44

55
# Python linter and formatter
66
click==8.0.2 # Our version of black needs an older version of click (https://stackoverflow.com/questions/71673404/importerror-cannot-import-name-unicodefun-from-click)
7-
black==20.8b1
7+
black==21.4b0
88
pylint==2.7.4
99

1010
# Surelog

vpr/src/base/CheckSetup.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,33 +31,39 @@ void CheckSetup(const t_packer_opts& PackerOpts,
3131
"This is allowed, but strange, and circuit speed will suffer.\n");
3232
}
3333

34-
if ((false == Timing.timing_analysis_enabled)
34+
if (!Timing.timing_analysis_enabled
3535
&& (PlacerOpts.place_algorithm.is_timing_driven())) {
3636
/* May work, not tested */
3737
VPR_FATAL_ERROR(VPR_ERROR_OTHER,
3838
"Timing analysis must be enabled for timing-driven placement.\n");
3939
}
4040

41-
if (!PlacerOpts.doPlacement && ("" != PlacerOpts.constraints_file)) {
41+
if (!PlacerOpts.doPlacement && (!PlacerOpts.constraints_file.empty())) {
4242
VPR_FATAL_ERROR(VPR_ERROR_OTHER,
4343
"A block location file requires that placement is enabled.\n");
4444
}
4545

46-
if (PlacerOpts.place_static_move_prob.size() != NUM_PL_MOVE_TYPES) {
46+
if (PlacerOpts.place_algorithm.is_timing_driven() &&
47+
PlacerOpts.place_static_move_prob.size() > NUM_PL_MOVE_TYPES) {
4748
VPR_FATAL_ERROR(VPR_ERROR_OTHER,
48-
"The number of placer move probabilities should equal to the total number of supported moves. %d\n", PlacerOpts.place_static_move_prob.size());
49+
"The number of provided placer move probabilities (%d) should equal or less than the total number of supported moves (%d).\n",
50+
PlacerOpts.place_static_move_prob.size(),
51+
NUM_PL_MOVE_TYPES);
4952
}
5053

51-
if (PlacerOpts.place_static_notiming_move_prob.size() != NUM_PL_NONTIMING_MOVE_TYPES) {
54+
if (!PlacerOpts.place_algorithm.is_timing_driven() &&
55+
PlacerOpts.place_static_move_prob.size() > NUM_PL_NONTIMING_MOVE_TYPES) {
5256
VPR_FATAL_ERROR(VPR_ERROR_OTHER,
53-
"The number of placer non timing move probabilities should equal to the total number of supported moves. %d\n", PlacerOpts.place_static_notiming_move_prob.size());
57+
"The number of placer non timing move probabilities (%d) should equal to or less than the total number of supported moves (%d).\n",
58+
PlacerOpts.place_static_move_prob.size(),
59+
NUM_PL_MOVE_TYPES);
5460
}
5561

5662
if (RouterOpts.doRouting) {
5763
if (!Timing.timing_analysis_enabled
5864
&& (DEMAND_ONLY != RouterOpts.base_cost_type && DEMAND_ONLY_NORMALIZED_LENGTH != RouterOpts.base_cost_type)) {
5965
VPR_FATAL_ERROR(VPR_ERROR_OTHER,
60-
"base_cost_type must be demand_only or demand_only_normailzed_length when timing analysis is disabled.\n");
66+
"base_cost_type must be demand_only or demand_only_normalized_length when timing analysis is disabled.\n");
6167
}
6268
}
6369

vpr/src/base/SetupGrid.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ using vtr::t_formula_data;
3131

3232
static DeviceGrid auto_size_device_grid(const std::vector<t_grid_def>& grid_layouts, const std::map<t_logical_block_type_ptr, size_t>& minimum_instance_counts, float maximum_device_utilization);
3333
static std::vector<t_logical_block_type_ptr> grid_overused_resources(const DeviceGrid& grid, std::map<t_logical_block_type_ptr, size_t> instance_counts);
34-
static bool grid_satisfies_instance_counts(const DeviceGrid& grid, std::map<t_logical_block_type_ptr, size_t> instance_counts, float maximum_utilization);
35-
static DeviceGrid build_device_grid(const t_grid_def& grid_def, size_t width, size_t height, bool warn_out_of_range = true, std::vector<t_logical_block_type_ptr> limiting_resources = std::vector<t_logical_block_type_ptr>());
34+
static bool grid_satisfies_instance_counts(const DeviceGrid& grid, const std::map<t_logical_block_type_ptr, size_t>& instance_counts, float maximum_utilization);
35+
static DeviceGrid build_device_grid(const t_grid_def& grid_def, size_t width, size_t height, bool warn_out_of_range = true, const std::vector<t_logical_block_type_ptr>& limiting_resources = std::vector<t_logical_block_type_ptr>());
3636

3737
static void CheckGrid(const DeviceGrid& grid);
3838

@@ -316,8 +316,8 @@ static std::vector<t_logical_block_type_ptr> grid_overused_resources(const Devic
316316
return overused_resources;
317317
}
318318

319-
static bool grid_satisfies_instance_counts(const DeviceGrid& grid, std::map<t_logical_block_type_ptr, size_t> instance_counts, float maximum_utilization) {
320-
//Are the resources satisified?
319+
static bool grid_satisfies_instance_counts(const DeviceGrid& grid, const std::map<t_logical_block_type_ptr, size_t>& instance_counts, float maximum_utilization) {
320+
//Are the resources satisfied?
321321
auto overused_resources = grid_overused_resources(grid, instance_counts);
322322

323323
if (!overused_resources.empty()) {
@@ -335,7 +335,7 @@ static bool grid_satisfies_instance_counts(const DeviceGrid& grid, std::map<t_lo
335335
}
336336

337337
///@brief Build the specified device grid
338-
static DeviceGrid build_device_grid(const t_grid_def& grid_def, size_t grid_width, size_t grid_height, bool warn_out_of_range, const std::vector<t_logical_block_type_ptr> limiting_resources) {
338+
static DeviceGrid build_device_grid(const t_grid_def& grid_def, size_t grid_width, size_t grid_height, bool warn_out_of_range, const std::vector<t_logical_block_type_ptr>& limiting_resources) {
339339
if (grid_def.grid_type == GridDefType::FIXED) {
340340
if (grid_def.width != int(grid_width) || grid_def.height != int(grid_height)) {
341341
VPR_FATAL_ERROR(VPR_ERROR_OTHER,
@@ -754,7 +754,7 @@ static void CheckGrid(const DeviceGrid& grid) {
754754
}
755755
}
756756

757-
float calculate_device_utilization(const DeviceGrid& grid, std::map<t_logical_block_type_ptr, size_t> instance_counts) {
757+
float calculate_device_utilization(const DeviceGrid& grid, const std::map<t_logical_block_type_ptr, size_t>& instance_counts) {
758758
//Record the resources of the grid
759759
std::map<t_physical_tile_type_ptr, size_t> grid_resources;
760760
for (int layer_num = 0; layer_num < grid.get_num_layers(); ++layer_num) {

vpr/src/base/SetupGrid.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ DeviceGrid create_device_grid(std::string layout_name, const std::vector<t_grid_
2727
* Calculate the device utilization (i.e. fraction of used grid tiles)
2828
* foor the specified grid and resource requirements
2929
*/
30-
float calculate_device_utilization(const DeviceGrid& grid, std::map<t_logical_block_type_ptr, size_t> instance_counts);
30+
float calculate_device_utilization(const DeviceGrid& grid, const std::map<t_logical_block_type_ptr, size_t>& instance_counts);
3131

3232
/**
3333
* @brief Returns the effective size of the device

vpr/src/base/SetupVPR.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -661,8 +661,8 @@ static void SetupPlacerOpts(const t_options& Options, t_placer_opts* PlacerOpts)
661661
PlacerOpts->effort_scaling = Options.place_effort_scaling;
662662
PlacerOpts->timing_update_type = Options.timing_update_type;
663663
PlacerOpts->enable_analytic_placer = Options.enable_analytic_placer;
664-
PlacerOpts->place_static_move_prob = Options.place_static_move_prob;
665-
PlacerOpts->place_static_notiming_move_prob = Options.place_static_notiming_move_prob;
664+
PlacerOpts->place_static_move_prob = vtr::vector<e_move_type, float>(Options.place_static_move_prob.value().begin(),
665+
Options.place_static_move_prob.value().end());
666666
PlacerOpts->place_high_fanout_net = Options.place_high_fanout_net;
667667
PlacerOpts->place_bounding_box_mode = Options.place_bounding_box_mode;
668668
PlacerOpts->RL_agent_placement = Options.RL_agent_placement;

vpr/src/base/read_options.cpp

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,7 +1889,7 @@ argparse::ArgumentParser create_arg_parser(const std::string& prog_name, t_optio
18891889
"What algorithm should be used to compute the place delta matrix.\n"
18901890
"\n"
18911891
" * astar : Find delta delays between OPIN's and IPIN's using\n"
1892-
" the router with the current --astar_fac.\n"
1892+
" the router with the current --router_profiler_astar_fac.\n"
18931893
" * dijkstra : Use Dijkstra's algorithm to find all shortest paths \n"
18941894
" from sampled OPIN's to all IPIN's.\n")
18951895
.default_value("astar")
@@ -2032,23 +2032,17 @@ argparse::ArgumentParser create_arg_parser(const std::string& prog_name, t_optio
20322032

20332033
place_grp.add_argument(args.place_static_move_prob, "--place_static_move_prob")
20342034
.help(
2035-
"The percentage probabilities of different moves in Simulated Annealing placement."
2036-
"This option is only effective for timing-driven placement."
2037-
"The numbers listed are interpreted as the percentage probabilities of {uniformMove, MedianMove, CentroidMove, WeightedCentroid, WeightedMedian, Timing feasible Region(TFR), Critical UniformMove}, in that order.")
2035+
"The percentage probabilities of different moves in Simulated Annealing placement. "
2036+
"For non-timing-driven placement, only the first 3 probabilities should be provided. "
2037+
"For timing-driven placement, all probabilities should be provided. "
2038+
"When the number of provided probabilities is less then the number of move types, zero probability "
2039+
"is assumed."
2040+
"The numbers listed are interpreted as the percentage probabilities of {UniformMove, MedianMove, CentroidMove, "
2041+
"WeightedCentroid, WeightedMedian, Critical UniformMove, Timing feasible Region(TFR)}, in that order.")
20382042
.nargs('+')
2039-
.default_value({"100", "0", "0", "0", "0", "0", "0"})
2040-
2043+
.default_value({"100"})
20412044
.show_in(argparse::ShowIn::HELP_ONLY);
20422045

2043-
place_grp.add_argument(args.place_static_notiming_move_prob, "--place_static_notiming_move_prob")
2044-
.help(
2045-
"The Probability of different non timing move in Simulated Annealing."
2046-
"This option is only effective for nontiming driven placement."
2047-
" The numbers listed are interpreted as the percentage probabilities of {uniformMove, MedianMove, CentroidMove}, in that order.")
2048-
.nargs('+')
2049-
.default_value({"100", "0", "0"})
2050-
2051-
.show_in(argparse::ShowIn::HELP_ONLY);
20522046

20532047
place_grp.add_argument(args.place_high_fanout_net, "--place_high_fanout_net")
20542048
.help(
@@ -2479,7 +2473,7 @@ argparse::ArgumentParser create_arg_parser(const std::string& prog_name, t_optio
24792473
route_timing_grp.add_argument(args.router_profiler_astar_fac, "--router_profiler_astar_fac")
24802474
.help(
24812475
"Controls the directedness of the timing-driven router's exploration"
2482-
" when doing router delay profiling."
2476+
" when doing router delay profiling of an architecture."
24832477
" The router delay profiling step is currently used to calculate the place delay matrix lookup."
24842478
" Values between 1 and 2 are resonable; higher values trade some quality for reduced run-time")
24852479
.default_value("1.2")

vpr/src/base/read_options.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ struct t_options {
126126
argparse::ArgValue<e_place_delta_delay_algorithm> place_delta_delay_matrix_calculation_method;
127127
argparse::ArgValue<bool> enable_analytic_placer;
128128
argparse::ArgValue<std::vector<float>> place_static_move_prob;
129-
argparse::ArgValue<std::vector<float>> place_static_notiming_move_prob;
130129
argparse::ArgValue<int> place_high_fanout_net;
131130
argparse::ArgValue<e_place_bounding_box_mode> place_bounding_box_mode;
132131

0 commit comments

Comments
 (0)