-
Notifications
You must be signed in to change notification settings - Fork 415
timing_builder: allow dangling combinational nodes #643
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
timing_builder: allow dangling combinational nodes #643
Conversation
@kmurray, @vaughnbetz FYI |
@acomodi Can you give more context for why this is needed? Usually dangling combinational nodes means something is odd in the netlist, which is why it gets flagged by default. I'm hesitant to always suppress it, since it often indicates real issues which would otherwise go undetected. |
@acomodi a dangling combinational node should indicate that the netlist has combinational logic that doesn't go anywhere, rather than a tile (physical block) that has no combinational sink. |
@vaughnbetz I believe the timing graph throws an exception during its consistency check, but the message doesn't appear in the log posted @acomodi The following warnings look suspicious:
They indicate that there are ports with no timing specifications which means the timing graph builder does not know what to do with them (no edges to add, not marked as sequential ports). As a result the timing graph consistency checks will fail. I suspect fixing the architecture is a better approach than disabling the timing graph consistency checks universally, since they are aimed at catching these kinds of issues. |
@kmurray Many of these definitely look suspicious and I agree they should be fixed. |
Historically we've only ever had 'regular' primitives act as constant generators -- that is blocks which otherwise have a 'well formed' timing model (edges/sources etc.) which can be inferred from the section of the architecture. Whether any pins were constant (e.g. a block with no inputs) was handled as part of the timing constraints. VPR has existing code which detects constant generators from the netlist, and marks them as such in the timing constraints. Any timing nodes marked as constant generators are treated as sources launching data at t = -infinity. For dedicated constant generators (i.e. tie-off primitives) we could extend the section to allow tagging the ports as such, and update the timing graph builder to just create SOURCE tnodes in those cases. That should ensure the timing graph produced passes all the legality checks within tatum. The existing constant generator inference code should handle tagging those pins as constants in the timing constraints. However I wonder if it would be possible to model the tie-offs differently which would bypass this issue. |
Because the fabric provides constant sources in many places in the graph (including within a site). For example, all LUT pins default to the VCC source by default (and consuming no routing resources). Every INT switch box has it's own dedicate GND source. Internal to sites are tieoff muxes, like the SR_GND and CE_VCC sources. In the case of the DSP block, there a special tieoff block dedicated for the DSP IPINs. As for the constant-generator 0-LUTs, that is a pretty poor constant solutions, as that LUT gets routed across the entire fabric, consuming routing resources as it goes. |
After further reflection, I think the long term fix is to properly model tie-offs in the architecture (i.e. #163), and update the packer/router to be aware of them. That would remove the need to create special constant-generator primitives in the netlist as you do now (which is really just a work around for not having #163). In the short term, making this a new command-line option (i.e. |
In the XC7 architecture, the tie-offs generally speaking need to be routed. When I implemented the tie-offs as I did, I considered whether how a more specialize approach to #163 would go. In my head, I was unable to justify the complexity of adding explicit modelling support for tie-offs, versus just treating constant nets as nets. Can you expand on how you would implement #163 that is different from adding blackbox's that are constant sources? |
In the netlist I would have a 0-LUT for gnd and a 0-LUT for vcc. All primitive pins which are driven by constants would connect to one of those nets. This describes precisely and consistently the logical behaviour desired. Allowing stages which only care about the logical behaviour (e.g. timing graph) to be correct by construction. With the tie-off modelling of #163 how that logical behaviour is actually implemented is architecture dependent optimization choice. Pin tie-offs (which are really just additional inputs to the pin's input mux) would be modelled in the RR graph (e.g. intra-cluster RR graph) as additional SOURCE->IPIN connections. If a pin was tie-able to VCC/GND the pin would be connected to the VCC/GND SOURCE node. The standard router can then be invoked with only the VCC/GND source initialized. The two implementation extremes are:
Of course, most architecture would be somewhere in between with some tie-able pins and others which must have constants routed to them. This modelling approach handles the extreme and intermediate cases uniformly in a data-driven way. |
I agree that this is logically correct. However doing this requires VPR explicitly modelling that net as something other than a LUT.
Almost none of the 7-series tie-offs look like this. There are 4 "https://github.com/verilog-to-routing/vtr-verilog-to-routing/issues/654types" of tie-offs seen:
I was able to express this construct (this is the CE_VCC blackbox) using the existing architecture.
|
ee8f42a
to
619dbca
Compare
4b19a7e
to
5f33dda
Compare
@kmurray @vaughnbetz ping |
5f33dda
to
37fc051
Compare
37fc051
to
803d75a
Compare
@kmurray @vaughnbetz Ping |
803d75a
to
4b57277
Compare
4b57277
to
9511de5
Compare
@kmurray ping. I have rebased with the most recent updates on VTR |
Signed-off-by: Alessandro Comodi <[email protected]>
9511de5
to
e3d8b21
Compare
Thanks! |
Signed-off-by: Alessandro Comodi [email protected]
Description
In the SymbiFlow architectures, some of the tiles do not have combination sinks. This fix is needed to allow the architecture to have no combination sinks for specific tiles. Without this addition, the Timing graph builder would produce a
tatum
error and the failure of the VPR flow.It may be better to have this fix under a command line option (e.g. --allow_non_combination_sinks).
Motivation and Context
Avoid Tatum error while building the Timing Graph within VPR.
Types of changes
Checklist: