Skip to content

Unable to Describe Diagonal Wires with Current VPR architecture description #2043

Closed
@WhiteNinjaZ

Description

@WhiteNinjaZ

Current Behaviour

Several current FPGA's utilize diagonal routing in their architectures (specifically Xilinx parts). Currently, VPR has no way to implement this functionality. The proposal has been made that diagonal wires could be implemented by using a combination of shorted segments and custom switch blocks. However, there is a major issue with this:
The issue is that switchpoints in vtr are currently referenced as 0->1->2->...->0 (i.e. both ends have a 0 index). Custom SB allow for unique specification of interconnect for each switch-point, but because both ends are specified with a zero index there is no way to uniquely specify an interconnect for the two ends. To demonstrate why this is an issue, lets assume we want to create a diagonal wire that goes up/down 4 and over 2 (i.e. vertical length 4 wires and horizontal length 2 wires). The desired functionality would be to have each end of vertical L4 wires connect to each begining of horizontal L2 wires via a short and for the beginning of the L4 wire and the end of the L2 wire to have "normal" interconnect (i.e. able to connect to other wire types), as shown in the drawing bellow:
image0
However, with the current iteration of VTR it is impossible to differentiate between the start and end of each wire segment in the architecture description since both the start and end are only accessible via their switch-points at the 0th index. The most you can do with the current architecture description is to short multiple diagonal segments together.

Possible Solution

This problem could be remedied by just changing how wire segments are represented (i.e. for a length y wire the start switchpoint has index 0 and the end switch point has index y), however, the assumption that both wire ends have index 0 is pretty deeply ingrained in the code used to build switch blocks and parse wire segments as well as in previously created architecture descriptions. The use case is also unique enough that I wonder if it would just be better to create a new diagonal segment type. I am currently going through the code base to determine the best way to implement diagonal wires and will post here once I have a better understanding of a good approach. The main purpose for this issue is to provide a place to discuss ideas for how diagonal wires should be implemented and how they should be represented in the xml if we go that route.

Update: after thinking about diagonal wires for a while and working through some proofs using set theory, it appears that there is actually a way to build a rough approximation for diagonal wires using only custom SBs and a very small change to the code base (I believe the issue stated above was an error on my part and also due to me trying to implement diagonal wires in a bi-directional architecture). In the case of unidirectional architectures at least, all that is needed is to specify that the wires being driven by the vertical component of a diagonal segment have a arch_wire_switch that is of type "short" (i.e. in a L4->L2 diagonal wire, the L2 wire wire switch is overridden to be a short). However, this technique for specifying a diagonal wire in all four Intercardinal directions (NE,NW,SE,SW) requires a high level of verbosity. At least eight segments are needed and four custom switch blocks to specify a single diagonal wire. Additionally, there are certain aspects of diagonal wires that make their routing and interconnection unique and difficult or impossible to describe in the current architecture description. In light of this, I still think it would be a good idea to create a special way to describe diagonal wires in the architecture.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions