Skip to content

[Router] Enhanced the Connection Router by Optimizing the Heap Structure #2720

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversation

ueqri
Copy link
Contributor

@ueqri ueqri commented Sep 12, 2024

image

  • The heap node structure in the connection router is simplified by only maintaining the node index (int32) and node total cost (fp32).
  • Eliminated dynamic memory allocation for the heap node structure.
  • The above optimization leads to an algorithmic change for path search; specifically, we need to update node states right before pushing and modify the prune functions.

The RCV feature also works when using --routing_budgets_algorithm yoyo for the VPR launch.

Where does the Speedup Come from

  • Major: Updating the node states inside the neighbor expansion, such that better node states are visible early. This leads to more effective and aggressive pruning. (Results of the comparison of number of heap push/pop)
  • The simplification of the heap data structure.

Summary of the Results

  • QoR is comparable (CPD variation < ~1%, WL < ~0.1%) regardless of whether the RCV is on or off
  • Routing time shows a ~18% (geomean) improvement when RCV is off (default setting); ~13% when RCV is on
    • Including SSSP time (path search), path reconstruction, timing analysis, graph congestion cost updates, and resetting global node costs
  • SSSP (path search) time shows a ~35% improvement when RCV is off; ~28% when RCV is on

Result Tables

The baseline is built on commit 21d01. Both implementations use 4-ary heap for path search in the connection router. The following results are collected on the wintemute server.

RCV feature disabled (using default CLI settings for both runs)

VTR BenchmarkKoios Large BenchmarkTitan Benchmark
CPDWLRouting Time (ms)SSSP Time (ms)CPDWLRouting TimeSSSP TimeCPDWLRouting TimeSSSP Time
Baseline20.57298712.088.601.988.691781719.8867.0033.6417.183200094.23270.76157.94
Enhanced20.57298434.667.951.608.781781008.3654.5824.2416.993199679.37216.74110.25
Speedup1.081.241.231.391.251.43

RCV feature enabled

Use --routing_budgets_algorithm yoyo to enable RCV feature. All others CLI settings are set by default.

VTR BenchmarkKoios Large BenchmarkTitan Benchmark
CPDWLRouting TimeSSSP TimeCPDWLRouting TimeSSSP TimeCPDWLRouting TimeSSSP Time
Baseline20.49340001.6184.525.378.661927268.24567.76144.7517.333911501.282206.44758.17
Enhanced20.49340339.5379.094.118.581925658.47493.63110.3517.133913722.321895.40613.08
Speedup1.071.311.151.311.161.24

- The heap node structure in the connection router is simplified by only
maintaining the node index (int32) and node total cost (fp32).
- Eliminated dynamic memory allocation for the heap node structure.
- The above optimization leads to an algorithmic change for path search;
specifically, we need to update node states right before pushing and
modify the prune functions.

The RCV feature also works when using `--routing_budgets_algorithm yoyo`
for the VPR launch.
@ueqri ueqri self-assigned this Sep 12, 2024
@github-actions github-actions bot added VPR VPR FPGA Placement & Routing Tool lang-cpp C/C++ code labels Sep 12, 2024
Simplified the RCV `path_data` pointer in `t_heap`
data structure by replacing it with a float value,
which is the only variable used after `t_heap` is
returned following a successful connection route.
The `R_upstream` field added to the `t_rr_node_route_inf` structure for
convenience in commit b11b2 is removed and kept inside the connection
router class instead.

This allows the size of each `t_rr_node_route_inf` to be as minimal as
possible, which tends to be more cache-friendly when accessing the large
RR node route info data, leading to higher performance.
- Changed APIs in the `HeapInterface` class.
- Removed the `HeapStorage` class (used for dynamic memory allocations).
- Removed the deprecated bucket heap implementation.
- Replaced the prior k-ary heap implementation with the enhanced d-ary
  heap introduced in commit b11b2e.
The `t_heap` data structure is no longer needed as the "heap node
structure" due to the algorithmic changes in the connection router in
commit b11b2eb.

However, `t_heap` is used in many places as a holder for the return
values of the route routines.

This commit refactored the `t_heap`, renamed it to `RTExploredNode`, and
combined it with the other similar node info data structure, `node_t`,
in the connection router to fit the changes since commit b11b2eb.
@github-actions github-actions bot added the docs Documentation label Sep 17, 2024
The option to turn on the YOYO routing budgets algorithm (i.e., using
RCV) was previously missing in both the VPR CLI and the documents, and
this commit fixed the issues.

Additionally, this commit added regression tests for the YOYO option.
@vaughnbetz
Copy link
Contributor

Strange CI QoR failures that seem to indicate the critical path routing time isn't parsed properly. There is an extra . at the start of the line in the output -- try removing that (although it shouldn't cause this, something is!).

@vaughnbetz
Copy link
Contributor

@vaughnbetz : need to review.

@vaughnbetz
Copy link
Contributor

If you have the energy to create an RCV test:

  • Run a few circuits normally vs. with RCV on. Measure route time, cpd, routed wire. Can just do a fixed channel width
  • Repeat this, but now run on an architecture where you set the Th for registers in the logic blocks to be (say) 500 ps. Measure the worst case hold and number of hold violations, as well as the cpd, routed wire, route time
  • These could then be turned into a reg test.

@ueqri ueqri marked this pull request as ready for review September 20, 2024 20:42
Fixed the output of the SSSP time of the connection router, which caused
VTR flow log parser issues and made CI mad.

Reverted the changes for RCV tests, which are not working and appear to
be too simple to be useful. It needs more time and effort to make a
comprehensive set of regression tests for the RCV technique. We tend to
postpone this task since it is not the main purpose of this PR.
Replaced the pointer (dynamic memory allocations) of the priority queue
in d_ary_heap.h with the priority queue object in order to make the
coarse-grained parallel netlist router happy.

Previously, when using pointers, as in commit 084fb54, the parallel
netlist router would always throw weird double-free errors. After
debugging with GDB and Valgrind, it appeared that the issues came from
the Intel OneTBB deallocation process. However, there is no convincing
evidence of the problems.
@ueqri
Copy link
Contributor Author

ueqri commented Sep 24, 2024

The weird double-free errors I encounter during the parallel netlist router regression tests:

When running the strong regression tests on 084fb54, all tests/tasks using --router_algorithm parallel (specifically, strong_multiclock, strong_timing, strong_flat_router, strong_timing_update_type, and koios_test) raised double-free issues. The errors are throwed during the Intel OneTBB deallocation process according the backtraces in GDB. Have no clue what happened.

free(): double free detected in tcache 2

Thread 1 "vpr" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff4e797f1 in __GI_abort () at abort.c:79
#2  0x00007ffff4ec2837 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ffff4fefa7b "%s\n") at ../sysdeps/posix/libc_fatal.c:181
#3  0x00007ffff4ec98ba in malloc_printerr (str=str@entry=0x7ffff4ff16e8 "free(): double free detected in tcache 2") at malloc.c:5342
#4  0x00007ffff4ed10ed in _int_free (have_lock=0, p=0x5555569d9f70, av=0x7ffff5224c40 <main_arena>) at malloc.c:4195
#5  __GI___libc_free (mem=0x5555569d9f80) at malloc.c:3134
#6  0x000055555571a358 in ConnectionRouter<DAryHeap<4u> >::~ConnectionRouter() ()
#7  0x0000555555744b3a in tbb::detail::d1::callback_leaf<tbb::detail::d1::construct_by_exemplar<ConnectionRouter<DAryHeap<4u> > > >::destroy() ()
#8  0x0000555555746342 in ParallelNetlistRouter<DAryHeap<4u> >::~ParallelNetlistRouter() ()
#9  0x0000555555743800 in route(Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, int, t_router_opts const&, t_analysis_opts const&, t_det_routing_arch*, std::vector<t_segment_inf, std::allocator<t_segment_inf> >&, vtr::FlatRaggedMatrix<float, vtr::StrongId<general_net_id_tag, int, -1>, int>&, std::shared_ptr<SetupHoldTimingInfo>, std::shared_ptr<PostClusterDelayCalculator>, t_chan_width_dist, t_direct_inf*, int, ScreenUpdatePriority, bool) ()
#10 0x00005555558817e8 in binary_search_place_and_route(Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, t_placer_opts const&, t_annealing_sched const&, t_router_opts const&, t_analysis_opts const&, t_noc_opts const&, t_file_name_opts const&, t_arch const*, bool, int, t_det_routing_arch*, std::vector<t_segment_inf, std::allocator<t_segment_inf> >&, vtr::FlatRaggedMatrix<float, vtr::StrongId<general_net_id_tag, int, -1>, int>&, std::shared_ptr<SetupHoldTimingInfo> const&, std::shared_ptr<PostClusterDelayCalculator> const&, bool) ()
#11 0x000055555561f1fb in vpr_route_min_W(Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, t_vpr_setup&, t_arch const&, std::shared_ptr<SetupHoldTimingInfo>, std::shared_ptr<PostClusterDelayCalculator>, vtr::FlatRaggedMatrix<float, vtr::StrongId<general_net_id_tag, int, -1>, int>&, bool) ()
#12 0x000055555561fd85 in vpr_route_flow(Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, t_vpr_setup&, t_arch const&, bool) ()
#13 0x000055555561ff52 in vpr_flow(t_vpr_setup&, t_arch&) ()
#14 0x00005555555c6be4 in main ()

If I temporarily delete ConnectionRouter<DAryHeap<4u> >::~ConnectionRouter() () (the destruction function I wrote only contains a log output), the errors will go like this:

free(): double free detected in tcache 2

Thread 1 "vpr" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff4e797f1 in __GI_abort () at abort.c:79
#2  0x00007ffff4ec2837 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ffff4fefa7b "%s\n") at ../sysdeps/posix/libc_fatal.c:181
#3  0x00007ffff4ec98ba in malloc_printerr (str=str@entry=0x7ffff4ff16e8 "free(): double free detected in tcache 2") at malloc.c:5342
#4  0x00007ffff4ed10ed in _int_free (have_lock=0, p=0x5555569daf70, av=0x7ffff5224c40 <main_arena>) at malloc.c:4195
#5  __GI___libc_free (mem=0x5555569daf80) at malloc.c:3134
#6  0x00005555557455e7 in tbb::detail::d1::callback_leaf<tbb::detail::d1::construct_by_exemplar<ConnectionRouter<DAryHeap<4u> > > >::~callback_leaf() ()
#7  0x0000555555744a2a in tbb::detail::d1::callback_leaf<tbb::detail::d1::construct_by_exemplar<ConnectionRouter<DAryHeap<4u> > > >::destroy() ()
#8  0x0000555555746a83 in ParallelNetlistRouter<DAryHeap<4u> >::~ParallelNetlistRouter() ()
#9  0x00005555557436f0 in route(Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, int, t_router_opts const&, t_analysis_opts const&, t_det_routing_arch*, std::vector<t_segment_inf, std::allocator<t_segment_inf> >&, vtr::FlatRaggedMatrix<float, vtr::StrongId<general_net_id_tag, int, -1>, int>&, std::shared_ptr<SetupHoldTimingInfo>, std::shared_ptr<PostClusterDelayCalculator>, t_chan_width_dist, t_direct_inf*, int, ScreenUpdatePriority, bool) ()
#10 0x0000555555882d48 in binary_search_place_and_route(Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, t_placer_opts const&, t_annealing_sched const&, t_router_opts const&, t_analysis_opts const&, t_noc_opts const&, t_file_name_opts const&, t_arch const*, bool, int, t_det_routing_arch*, std::vector<t_segment_inf, std::allocator<t_segment_inf> >&, vtr::FlatRaggedMatrix<float, vtr::StrongId<general_net_id_tag, int, -1>, int>&, std::shared_ptr<SetupHoldTimingInfo> const&, std::shared_ptr<PostClusterDelayCalculator> const&, bool) ()
#11 0x000055555561f1cb in vpr_route_min_W(Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, t_vpr_setup&, t_arch const&, std::shared_ptr<SetupHoldTimingInfo>, std::shared_ptr<PostClusterDelayCalculator>, vtr::FlatRaggedMatrix<float, vtr::StrongId<general_net_id_tag, int, -1>, int>&, bool) ()
#12 0x000055555561fd55 in vpr_route_flow(Netlist<vtr::StrongId<general_blk_id_tag, int, -1>, vtr::StrongId<general_port_id_tag, int, -1>, vtr::StrongId<general_pin_id_tag, int, -1>, vtr::StrongId<general_net_id_tag, int, -1> > const&, t_vpr_setup&, t_arch const&, bool) ()
#13 0x000055555561ff22 in vpr_flow(t_vpr_setup&, t_arch&) ()
#14 0x00005555555c6bb4 in main ()

The workaround to fix it:

The way I made this PR compatible with parallel netlist router is by replacing the pointer (to heap) used inside DAryHeap with an object; no changes were made to the parallel router. The details are on 599e06e. It doesn't make sense to me (since the previous connection router and the heap it used actively use pointers and dynamic memory allocations and no harm to the parallel router), but it works.

@duck2 Hi, Fahrican. Did you encounter this before?

ueqri added a commit to ueqri/vtr-verilog-to-routing that referenced this pull request Sep 27, 2024
Updated the golden results of the following three regression tests for
PR verilog-to-routing#2720:
- vtr_reg_strong/strong_bidir
- vtr_reg_strong/strong_place_delay_model
- vtr_reg_nightly_test1/arithmetic_tasks/multless_consts
Updated the golden results of the following three regression tests for
PR verilog-to-routing#2720:
- vtr_reg_strong/strong_bidir
- vtr_reg_strong/strong_place_delay_model
- vtr_reg_nightly_test1/arithmetic_tasks/multless_consts
@duck2
Copy link
Contributor

duck2 commented Sep 30, 2024

Interesting... should check

@duck2
Copy link
Contributor

duck2 commented Oct 1, 2024

Looks like having a pointer in there could break tbb::detail::d1::callback_leaf<tbb::detail::d1::construct_by_exemplar<ConnectionRouter<DAryHeap<4u> > > >. The parallel router provides an exemplar object to TBB to copy as needed for any additional threads:

bool is_flat)
: _routers_th(_make_router(router_lookahead, is_flat))
, _net_list(net_list)

It's possible the copy didn't work with the pointer and the refactored code? but it makes sense it would work with an object, I guess that fixes the default constructor or whatever TBB uses to copy the ConnectionRouter

@ueqri
Copy link
Contributor Author

ueqri commented Oct 1, 2024

Looks like having a pointer in there could break tbb::detail::d1::callback_leaf<tbb::detail::d1::construct_by_exemplar<ConnectionRouter<DAryHeap<4u> > > >. The parallel router provides an exemplar object to TBB to copy as needed for any additional threads:

bool is_flat)
: _routers_th(_make_router(router_lookahead, is_flat))
, _net_list(net_list)

It's possible the copy didn't work with the pointer and the refactored code? but it makes sense it would work with an object, I guess that fixes the default constructor or whatever TBB uses to copy the ConnectionRouter

@duck2 Hey Fahrican, thank you for your explanation! It totally makes sense.

I have confirmed that the tbb::enumerable_thread_specific we used in

tbb::enumerable_thread_specific<ConnectionRouter<HeapType>> _routers_th;
is not compatible with a class that contains a pointer.

The proof of concept is here ueqri/oneTBB@78fcb05. I added a pointer to a class used by enumerable_thread_specific in an official TBB example. It will throw double-free issues, regardless of where the pointer is placed inside the class (i.e., whether it is just the member of the outer class, or part of a nested class inside the outer class). The PoC shows the case where the pointer is a member of the outer class and can be run as follows:

git clone https://github.com/ueqri/oneTBB.git && cd oneTBB
git checkout verify-enumerable-thread-specific-issues
cd examples/parallel_for/polygon_overlay
mkdir build && cd build
cmake .. && make light_test_polygon_overlay

Copy link
Contributor

@vaughnbetz vaughnbetz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks very good @ueqri ! A few commenting and code cleanup suggestions.

Resolved the comments in the PR code reviews, mostly addressing the code
comments and coding style issues.

Fixed the RCV pre-push prune condition such that when RCV is on, the
connection router prunes based on the RCV-specific total path cost to
allow detours in order to achieve better QoR.
@ueqri
Copy link
Contributor Author

ueqri commented Oct 8, 2024

@vaughnbetz Hi Vaughn, the code has been cleaned according to your suggestions and is ready for review again!

Before merging this PR, there are still a few things left for me to be done. For the new result table, I am still waiting for my local run to be finished. I will update the result table when it is done. Also, I will wait for the CI to complete to see if it is needed to update the golden results.

@vaughnbetz
Copy link
Contributor

Sounds good, thanks. It doesn't gate this PR, but as time permits it would be good to make an RCV test and try the two different pruning conditions.

ueqri added 4 commits October 15, 2024 11:31
Added Vaughn's detailed comments explaining the RCV technique and how
the post-pop prune function in the connection router works for RCV.
After changing the API of `evaluate_timing_driven_node_costs`, there was
a typo (or bug) left inside an ifdef block.

This commit fixed the bug and changed the typo to the correct variable
name.
`strong_place_delay_calc_method` and `strong_place_delay_model` tests
had QoR failures after rebasing to master at commit 5925e69.

This commit updated the corresponding golden results to make the
regression tests happy.
@vaughnbetz
Copy link
Contributor

The only failure is a spurious assert that @AlexandreSinger just fixed. Updating the PR so CI re-runs; it should pass this time (except nightly*, which are down).
I believe the QoR results above have been updated to the latest code (and look good), but @ueqri please add an explicit statement about that here.

All my code comments have been addressed. @duck2 : this PR is a significant update to the core connection router and heap. It may conflict some with your parallel changes (although not in any fundamental way I don't think). It removes dynamic memory allocation of the items placed on the heap, so that may simplify your life / improve things. It also speeds up the path search by ~1.4x (route time by ~1.24x), which may cut your parallel speedups a bit.

We should discuss what order to merge these in during the VTR meeting today. Since this one is ready to go I think I should merge it very soon, but wanted to give you a heads up and get your thoughts.

@ueqri
Copy link
Contributor Author

ueqri commented Oct 17, 2024

Yes. The QoR results in the #2720 (comment) are the latest. (The previous data is also kept in the comment revision history.)

I am currently re-running all the nightly tests locally, and found (unrouteable) issues causing the tests to fail. (I think these issues were introduced at some point before when I rebased to master; all nightly tests did pass at c360f71). I am verifying these nightly test failures and will update here soon.

@vaughnbetz
Copy link
Contributor

Thanks Hang. If you can add in log files with the failures we could potentially discuss / brainstorm them in the VTR meeting. I'll forward the invite in case you want to attend (at 1 pm today).

@ueqri
Copy link
Contributor Author

ueqri commented Oct 17, 2024

Thanks, Vaughn! Discussing in VTR meeting will be really helpful.

Notes of the nightly test failures (except these, all other nightly tests, including vtr_reg_nightly_test[1-7] and vtr_reg_night_test[1-4]_odin passed):

Issues:

  • weird signal 6 (SIGABRT), exit code 134, for vtr_reg_nightly_test7/titan_other_run_flat/stratixiv_arch.timing.xml/CH_DFSIN_stratixiv_arch_timing.blif
  • All other failures got unrouteable circuit errors (exit code 2).

ueqri added 2 commits October 17, 2024 23:26
The bug was introduced by me in commit 2966d66; I merged two adjacent
if-bodies with conditions that appeared the same, but were in fact not.

A simplified example is:
`if (A == 0) { ... A might be modified ... } if (A == 0) { return ; }`

Merging the if-bodies would be problematic if A is modified in the first
if-body and is no longer 0.

This mistake caused tons of nightly test failures, as mentioned in the
comments in PR#2720. So glad that the nightly tests CAUGHT this bug,
which was not detected by the VTR strong regression tests.
@vaughnbetz
Copy link
Contributor

Let's talk about this today in our meeting @ueqri as I'd like to get it merged sooner rather than later. If you've found a bug and fixed it, I suggest re-launching the nightly tests to start gathering data on them if you haven't already.
There is also an easy-to-resolve conflict with Amin's renaming of a variable in another merge.

@ueqri
Copy link
Contributor Author

ueqri commented Oct 18, 2024

No problem! I have fixed the bug at commit d9f18cd. The re-launched nightly tests are almost done; I will summarize the results in our meeting today (and paste here afterwards).

The conflicts with Amin's renaming has been resolved.

@vaughnbetz
Copy link
Contributor

If you can paste the nightly test results in here that would be great @ueqri .
From what you showed me, we have one tiny circuit (3 bit adder) that randomly failed to route at the relaxed channel width (after routing at min chan width). Please comment that one out of its task list.
Other failures are small designs with QoR somewhat out of tolerance (3 CLBs instead of 2, 4 instead of 5, etc.). You are going to make a relaxed_qor_pass file (or some such) if they aren't already pointing at such a file, and make them pass by relaxing the tolerance.

@vaughnbetz vaughnbetz merged commit f4f46d5 into verilog-to-routing:master Oct 18, 2024
37 of 53 checks passed
@ueqri
Copy link
Contributor Author

ueqri commented Oct 21, 2024

If you can paste the nightly test results in here that would be great @ueqri . From what you showed me, we have one tiny circuit (3 bit adder) that randomly failed to route at the relaxed channel width (after routing at min chan width). Please comment that one out of its task list. Other failures are small designs with QoR somewhat out of tolerance (3 CLBs instead of 2, 4 instead of 5, etc.). You are going to make a relaxed_qor_pass file (or some such) if they aren't already pointing at such a file, and make them pass by relaxing the tolerance.

Hi Vaughn. The summarized results (including the links to the logs) have been updated here.

I ran a clean nightly test on wintermute after this PR was merged. The logs and the fixes (applying your suggestions) for the test failures are included in the new PR #2785.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
docs Documentation lang-cpp C/C++ code VPR VPR FPGA Placement & Routing Tool
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants