You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/src/fpga.md
+30-7Lines changed: 30 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -128,20 +128,43 @@ The usual convention is to consider the segment where the wire is driven (here:
128
128
129
129
## Wires, wire segments, connectors — Project Combine model
130
130
131
-
In Project Combine, the interconnect database describes a number (usually between ~100 and ~1000) of *wire slots*, which are identified by `WireSlotId`. A *wire segment* is uniquely identified by a tuple of `(CellCoord, WireSlotId)`, which is also known as `WireCoord`. A *wire* is identified by the `WireCoord` of its canonical segment.
131
+
In Project Combine, the interconnect database describes a number (usually between ~100 and ~1000) of *wire slots*, which are identified by `WireSlotId`. A *wire segment* is uniquely identified by a tuple of `(CellCoord, WireSlotId)`, which is also known as `WireCoord`. Thus, logically, a *wire slot* is replicated across all cells.
132
+
133
+
As mentioned before, a *wire* is identified by the `WireCoord` of its canonical segment.
134
+
135
+
To make this clearer, consider [example 1](#example-1--simple-bidirectional-quad-wire) again:
136
+
137
+

138
+

139
+
140
+
Here, there are five *wire slots*, named `QUAD_H_[0-4]`. Notice how the combination of wire slot and cell coordinates uniquely identifies a specific wire segment.
141
+
142
+
In order to figure out which wire segments are actually connected together (and therefore to find the canonical segment of the wire), we need to consider the *wire kind* of the segment. The interconnect database specifies the *wire kind* of each *wire slot*, thus each wire segment with a particular `WireSlotId` has the same wire kind.
132
143
133
144
### Regions
134
145
135
-
Since the device may contain many kinds of regional wires with varying scopes, the interconnect database describes a number of *region slots*, identified by `RegionSlotId`. Every regional wire slot is associated with such a region slot, and every cell of the expanded grid contains a mapping from `RegionSlotId` to a `CellCoord` where the canonical segment of all associated regional wires is located. Thus, to describe [example 4](#example-4--regional-wires) above, one would allocate a single region slot, associate wire slot `GCLK0` with it, then store the following canonical coordinate for each cell:
146
+
One of the simpler wire kinds are *regional wires*. Because regional wires tend to come in "bundles", wherein a group of wires runs in parallel across an entire region, it is these regions that are actually represented within the database.
147
+
148
+
However, since a wire slot and its wire kind is global across all cells, `WireKind::Regional` cannot directly point to a specific region. Instead, it specifies a `RegionSlotId`. A *region slot* can be thought as the "type" of a region, or its place in some kind of hierarchy.
149
+
150
+

151
+

136
152
137
-
-`X[0-3]Y[0-3]`: `X3Y3` is the canonical cell
138
-
-`X[4-7]Y[0-3]`: `X4Y3` is the canonical cell
139
-
-`X[0-3]Y[4-7]`: `X3Y4` is the canonical cell
140
-
-`X[4-7]Y[4-7]`: `X4Y4` is the canonical cell
153
+
However, the region structure doesn't necessarily need to be hierarchical. For example, some devices have interconnect which can be described with a set of staggered region slots:
154
+
155
+

156
+

157
+
158
+
Thus, to describe [example 4](#example-4--regional-wires), we would:
159
+
- allocate a region slot, e.g. `RSLOT0`;
160
+
- in each cell, store the coordinates of the canonical wire segment as the *region root* for `RSLOT0`;
161
+
- assign wire slot `GCLK0` to wire kind `Regional(RSLOT0)`.
141
162
142
163
### Connectors
143
164
144
-
For other kinds of wires, the connections between wire segments in (usually adjacent) cells are described by *connectors* and *connector classes*.
165
+
KEY OBSERVATION: There is a lot of complexity here, however it is motivated by *the desire to deduplicate data*.
166
+
167
+
For wire kinds other than regional, the connections between wire segments in (usually adjacent) cells are described by *connectors* and *connector classes*.
145
168
146
169
The interconnect database describes a small number of *connector slots*, identified by `ConnectorSlotId`. For most databases, there are four connector slots, corresponding to the four directions, but some devices (such as versal) require more complex descriptions.
0 commit comments