-
Notifications
You must be signed in to change notification settings - Fork 1
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
Benchmark status #23
Comments
Hmm, sounds like I'm creating the ROUTETHROUGH LUTs incorrectly. I'm not
sure I even though to check if the other BEL was being used and what
pins it might be using.
…On 11/16/18 5:25 PM, Dallon wrote:
As you know, the bgm benchmark can't finish packing. I spent some time
looking at it and will describe what I noticed here in hopes of it
being helpful.
The error:
|Exception in thread "main"
edu.byu.ece.rapidSmith.cad.pack.rsvpack.CadException: No valid pack
unit for clusterChain fract_out_q_reg[3]_i_1 at
edu.byu.ece.rapidSmith.cad.pack.rsvpack._RSVPack.packNetlist(RSVPack.kt:195)
at
edu.byu.ece.rapidSmith.cad.pack.rsvpack._RSVPack.pack(RSVPack.kt:83)
at edu.byu.ece.rapidSmith.cad.pack.rsvpack.RSVPack.pack(RSVPack.kt:35)
at
edu.byu.ece.rapidSmith.cad.families.artix7.SiteCadFlow.run(Artix7.kt:55)
at
edu.byu.ece.rapidSmith.cad.families.artix7.SiteCadFlow$Companion.main(Artix7.kt:86)
at edu.byu.ece.rapidSmith.cad.families.artix7.SiteCadFlow.main(Artix7.kt) |
Here is a snapshot of how Vivado packs this cell.:
image
<https://user-images.githubusercontent.com/16548246/48649694-b2517980-e9b0-11e8-9564-587580fe143b.png>
clusterChain fract_out_q_reg[3]_i_1 is the CARRY4 cell and is the seed
cell. The Force Routing Prepacker adds cells to the D6, C6, B6, and A6
LUTs. In RSVPack, the A6 LUT cell is a route-through that has been
converted into a 1LUT cell. The Table-Based Routability Checker finds
two conditional cells: fract_out_q[3]_i_2 and
a0_add/fract_out_q_reg[0]. (In Vivado, the fract_out_q[3]_i_2 cell is
placed on the A5 LUT BEL and the a0_add/fract_out_q_reg[0] cell is
placed on the AFF BEL).
The packer ends up failing when it gets back to the Table-Based
Routability checker because it thinks both the A5LUT cell and the
A6LUT cells both need to be driven by a different net on the A1 bel pin.
I tried to figure out what was going wrong here for a while and also
tried inserting some manual code to force the pass-through cell on the
A6LUT Bel to use a different pin, but the packer then ran into another
situation almost identical to this one, but with two non-routethrough
cells on the fracturable ALUT bel.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#23>, or mute the thread
<https://github.com/notifications/unsubscribe-auth/AMdCwp_Y_Ng3pq5CyUNoa8c3dtZGrNNsks5uvztTgaJpZM4YnEHU>.
|
If it helps, this is the place in the code where the routing was ultimately deemed infeasible:
This is in TableBasedRoutabilityChecker.kt, starting at line 558 in master. |
Here is what is occurring. The error is occurring from a combination of the LUT-ROUTETHROUGH (Artix7.kt) inserter and the PinMapper (Artix7.kt). Prior to packing, to remove the trouble of LUT routethroughs, the algorithm creates a LUT for each CARRY4 (C4) input that is not driven by a LUT. This guarantees that a LUT exists just before the C4 inputs and the routing feasibility check (rfc) does not need to support route throughs. This insertion is performed by looking at each of the inputs to a C4 or MUXF7 cell and, if the cell preceding it is not a LUT, creating a LUT1 cell programmed with the identity function with the net driving the C4 pin as the input and inserting it between the net and the C4 pin. When packing, just prior to performing the rfc, the cell pin -> bel pin mappings have to be ascertained to determine what paths through the cluster are needed. Typically, this mapping is trivial, but in a few cases where multiple mappings exist for some cells, some predictions are required. The packer currently performs these predictions for the C4 CIN input, but the LUT inputs are performed via a dumb I0-A1, I1-A2, etc type mapping. In the case we're seeing, a LUT route through has been inserted for the 6LUT but not for the 5LUT. I'm not sure if this is because the design originally had
I'm guessing the 2nd case is what's happening, but I haven't confirmed that. Either way, while packing the cluster of interest, the C4 requires adding both the LUT cell in front of the DI# pin, cell X, (which will end up on the 5LUT BEL) and the inserted route through LUT in front of the S# pin, cell Y, (which will end up on the 6LUT BEL). Upon reaching the rfc, the pins will be assigned. Using the naive approach mentioned above, the pin mappings will be something like cell X.I0 -> A1, X.I1 ->A2, etc and cell Y.IO -> A1. These nets requesting A1 are obviously going to be different resulting in a resource conflict on the pin. This is then causing the rfc to fail (as it should) |
Thoughts on fixes.
Possible paths for fixes -- not all of these (or maybe even any of these) are complete solutions by themselves:
Let me know your thoughts if you have any on this. |
Your description of the problem makes sense. It is what I thought was happening until I tried forcing the route-through to use a different pin and I ran into another problem.
In the case we're seeing, the LUT on the 5bel was not a route-through (it was an inverter). The S# pin on the CARRY4 was driven by a FF and so a route-through was inserted.
This is one of the cases I have observed most often - where one portion is used normally and the other is a LUT. So I don't think we can make that assumption. I'm not sure which of your proposed solutions sounds best to me yet. But I also got the impression that the the packer needs some sort of pin permutability. Since this also caused you problems with LUTNMs, I think an ideal solution would address this and not just be limited to the route-through issue. Could you describe a bit more of the challenges you faced with LUTNMs? Was the problem with both SOFT_HLUTNM and HLUTNM properties, or just SOFT_HLUTNM properties? |
I've updated this to reflect benchmark status now. |
Question: where do we sit w.r.t. pin permutability? The benchmark circuits go through the packer now but are they correct or do they need pin permutability code added? |
Pin permutability should already be merged into the main branch.
…On 12/10/18 5:05 AM, nelsobe wrote:
Question: where do we sit w.r.t. pin permutability? The benchmark
circuits go through the packer now but are they correct or do they
need pin permutability code added?
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#23 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AMdCwt3yOhqumGMu9-L6QtRjaKXk6YHjks5u3jHqgaJpZM4YnEHU>.
|
viterbi decoder -- passing
bgm -- passing
-- Fill in the remainder --
As you know, the bgm benchmark can't finish packing. I spent some time looking at it and will describe what I noticed here in hopes of it being helpful.
The error:
Here is a snapshot of how Vivado packs this cell.:
clusterChain fract_out_q_reg[3]_i_1 is the CARRY4 cell and is the seed cell. The Force Routing Prepacker adds cells to the D6, C6, B6, and A6 LUTs. In RSVPack, the A6 LUT cell is a route-through that has been converted into a 1LUT cell. The Table-Based Routability Checker finds two conditional cells: fract_out_q[3]_i_2 and a0_add/fract_out_q_reg[0]. (In Vivado, the fract_out_q[3]_i_2 cell is placed on the A5 LUT BEL and the a0_add/fract_out_q_reg[0] cell is placed on the AFF BEL).
The packer ends up failing when it gets back to the Table-Based Routability checker because it thinks both the A5LUT cell and the A6LUT cells both need to be driven by a different net on the A1 bel pin.
I tried to figure out what was going wrong here for a while and also tried inserting some manual code to force the pass-through cell on the A6LUT Bel to use a different pin, but the packer then ran into another situation almost identical to this one, but with two non-routethrough cells on the fracturable ALUT.
The text was updated successfully, but these errors were encountered: