Configurable Logic Block

Note

This document describes Spartan 3 and Virtex 4 CLBs, since they are very similar.

The main logic resource in Spartan 3 and Virtex 4 devices is the CLB (Configurable Logic Block). It is based on the Virtex 2 CLB, but has significant changes, particularly to the LUT RAM structures.

A CLB corresponds one-to-one with the INT.CLB interconnect tile (on Spartan 3), or to an INT interconnect tile (on Virtex 4). Every CLB has four SLICEs. The SLICEs come in two kinds:

  • SLICEM: the full-featured version of SLICE, with LUT RAM capability

  • SLICEL: logic-only SLICE, without LUT RAM capability; it is a strict subset of SLICEM

The SLICEs within a CLB are organized as follows (this is different from Virtex 2):

  • SLICE0: SLICEM, on the bottom left of the CLB

  • SLICE1: SLICEL, to the right of SLICE0

  • SLICE2: SLICEM, above SLICE0

  • SLICE3: SLICEL, to the right of SLICE2 and above SLICE1

Every slice has:

  • two 4-input LUTs, named F and G

    • each of them has four inputs, named F[1-4] and G[1-4]

    • in SLICEMs, each LUT can be used as LUT RAM or shift register

  • two “bypass inputs” used for various purposes

    • BX, associated with the F LUT

    • BY, associated with the G LUT

  • two wide multiplexers

    • F5, associated with the F LUT, multiplexing F and G

    • FX, associated with the G LUT, multiplexing F5 and FX outputs of this and other SLICEs

  • carry logic with a carry chain, going vertically upwards through the CLB column

  • two main combinational outputs

    • X, associated with the F LUT

    • Y, associated with the G LUT

  • (Virtex 4 only) two secondary combinational outputs

    • XMUX, associated with the F LUT

    • YMUX, associated with the G LUT

  • two “bypass” combinational outputs, used for long shift registers and carry chains

    • XB, associated with the F LUT

    • YB, associated with the G LUT

  • two registers and their outputs

    • FFX and XQ, associated with the F LUT

    • FFY and YQ, associated with the G LUT

  • shared control inputs:

    • CLK, the clock input

    • SR, the set/reset input (also used as LUT RAM write enable in SLICEM)

    • CE, the clock enable input

In summary, a single SLICE has the following pins:

  • F[1-4] and G[1-4]: general interconnect inputs, used as LUT inputs and LUT RAM write address

  • BX and BY: general interconnect freely-invertible inputs, used for various purposes

  • CLK, SR, CE: general interconnect freely-invertible inputs

  • X, Y, XQ, YQ, XB, YB: general interconnect outputs

  • (Virtex 4 only) XMUX, YMUX: general interconnect outputs

  • COUT: dedicated output (carry output)

  • CIN: dedicated input (carry input), routed from COUT of the slice below

  • SHIFTOUT: dedicated output (shift register output)

  • SHIFTIN: dedicated input (shift register input), routed from SHIFTOUT of the previous slice in sequence

  • F5 and FX: dedicated outputs (wide multiplexer outputs)

  • FXINA and FXINB: dedicated inputs (wide multiplexer inputs), routed from F5 and FX of neighbouring slices

  • DIG: dedicated output (SLICEM only)

  • ALTDIG: dedicated input (SLICEM only)

Additionally, some pins and circuitry are shared between SLICEMs within the same CLB.

Note that on Virtex 4, the CLB tile is interconnect-limitted: only up to 16 out of the [XY]Q, [XY]MUX, and [XY]B outputs within a single CLB can be used at a time due to the OMUX bottleneck. The main [XY] outputs don’t count towards that limit, since they can use other interconnect resources.

The CLK, SR, and CE inputs are invertible on the interconnect level.

The BX and BY inputs are invertible within the CLB. The BXINV attribute, if set, inverts the BX signal from the interconnect. Likewise, BYINV inverts the BY signal.

LUTs

There are two 4-input LUTs in each slice, F and G. The F LUT has inputs F[1-4], with F1 being the LSB and F4 being the MSB. The G LUT likewise has inputs G[1-4].

The initial LUT contents are determined by the F and G attributes in the bitstream.

The LUT outputs go to:

  • (Spartan 3) the FXMUX and GYMUX multiplexers

  • (Virtex 4) the F output goes directly to the X output; the G output goes directly to the Y output

  • (Virtex 4) the FFX and FFY registers, via DXMUX and DYMUX multiplexers

  • the carry logic

  • the F5 wide multiplexer

LUT RAM

This section is only applicable to SLICEM. SLICELs don’t have LUT RAM capability.

The F_RAM and G_RAM attributes, when set, turn F and G (respectively) into LUT RAM mode.

The signals used in RAM mode are:

  • CLK is the write clock

  • SR is the write enable

  • G[1-4] are write address for both the F and G LUTs

  • DIF and DIG are the data input for the F and G LUTs, respectively

  • BX: bit 4 of the write address, when enabled

  • SLICEWE1: bit 5 of the write address, when enabled

The DIF_MUX determines the value of DIF:

  • BX: use the BX pin (used for 16×X single-port RAMs)

  • ALT: use the DIG value (used for dual-port RAMs, 32×X RAMs, or 64×1 RAMs)

The DIG_MUX determines the value of DIG:

  • BY: use the BY pin (used for 16×X and 32×X RAMs and SLICE2 in 64×X RAMs)

  • ALT: use the ALTDIG value (used for SLICE0 in 64×1 RAMs)

ALTDIG is determined as follows:

  • SLICE0.ALTDIG is connected to SLICE2.DIG

  • SLICE2.ALTDIG is indeterminate (and should not be used)

Note that DI[FG]_MUX attributes are also used in the shift register mode, but with different meaning.

On Spartan 3, when SLICEWE0USED is set, the BX signal is used as bit 4 of write address. The F LUT is written when it is 1, the G LUT is written when it is 0. Otherwise, the signal is ignored, and both LUTs are written at the same time.

On Virtex 4, the attribute is replaced with F_SLICEWE0USED and G_SLICEWE0USED, which are per-LUT.

The SLICEWE1 signal is routed as follows:

SLICE0.SLICEWE1 = SLICE0.BY SLICE2.SLICEWE1 = !SLICE0.BY

On Spartan 3, if SLICE0.SLICEWE1USED is set, both SLICEMs within the CLB will use their SLICEWE1 signal as a write enable — the LUTs are only written when SLICEWE1 is 1. Otherwise, all SLICEWE1 signals are ignored.

Note that SLICE2 doesn’t have a SLICEWE1USED bit — it is controlled by the same configuration bit as SLICE0.

On Virtex 4, the attribute is replaced with F_SLICEWE1USED and G_SLICEWE1USED, which are per-LUT, and appear in both slices.

Single-port 16×X RAM

Single-port 16×X RAM can be implemented as follows:

  • pick a SLICEM

  • pick a LUT within the slice for each 16×1 subblock

    • G can always be used

    • F can be used if G is also used with the same address

  • connect CLK to write clock

  • connect SR to write enable

  • for the 16×1 slice in F LUT:

    • connect F[1-4] to the read/write address

    • connect BX to write data

    • set DIF_MUX to BX

    • use F output as read data

  • for the 16×1 slice in G LUT:

    • connect G[1-4] to the read/write address

    • connect BY to write data

    • set DIG_MUX to BY

    • use G output as read data

Dual-port 16×X RAM

Dual-port 16×X RAM can be implemented as follows:

  • pick a SLICEM

  • connect CLK to write clock

  • connect SR to write enable

  • connect G[1-4] to the write address

  • connect F[1-4] to the read address

  • connect BY to write data

  • set DIF_MUX to ALT

  • set DIG_MUX to BY

  • use F and G outputs as read data

Single-port 32×X RAM

Single-port 32×X RAM can be implemented as follows:

  • pick a SLICEM

  • connect CLK to write clock

  • connect SR to write enable

  • F LUT corresponds to addresses 0x0X

  • G LUT corresponds to addresses 0x1X

  • connect F[1-4] and G[1-4] to low 4 bits of the read/write address

  • connect BX to bit 4 of read/write address

  • set SLICEWE0USED

  • connect BY to write data

  • set DIF_MUX to ALT

  • set DIG_MUX to BY

  • use F5 output as read data

Single-port 64×1 RAM

Single-port 64×1 RAM can be implemented as follows:

  • use both SLICE0 and SLICE2

  • connect CLK to write clock

  • connect SR to write enable

  • SLICE0.G LUT corresponds to addresses 0x0X

  • SLICE0.F LUT corresponds to addresses 0x1X

  • connect F[1-4] and G[1-4] to low 4 bits of the read/write address

  • connect both BX to bit 4 of read/write address

  • set SLICEWE0USED

  • connect SLICE0.BY to bit 5 of read/write address

  • set SLICE0.SLICEWE1USED

  • connect SLICE2.BY to write data

  • set DIF_MUX to ALT

  • set SLICE2.DIG_MUX to BY

  • set SLICE0.DIG_MUX to ALT

  • use SLICE0.FX output as read data

Shift registers

This section is only applicable to SLICEM. SLICELs don’t have LUT RAM capability.

The F_SHIFT and G_SHIFT attributes, when set, turn F and G (respectively) into shift register mode.

The signals used in shift register mode are:

  • CLK is the write clock

  • SR is the write enable

  • DIF and DIG are the data input for the F and G LUTs, respectively

The LUTs in shift register mode have shift-out outputs, FMC15 and GMC15, which are the next bit to be shifted out. They can be connected to another LUT’s data input to assemble larger shift registers.

The DIF_MUX determines the value of DIF:

  • BX: use the BX pin

  • ALT: use the GMC15 value

The DIG_MUX determines the value of DIG:

  • BY: use the BY pin

  • ALT: use the SHIFTIN pin

SHIFTIN is routed as follows:

  • SLICE0.SHIFTIN = SLICE2.SHIFTOUT = SLICE2.FMC15

  • SLICE2.SHIFTIN is indeterminate.

Note that DI[FG]_MUX attributes are also used in the LUT RAM mode, but with different meaning.

The external write data is written to bit 0 of the LUT. Bit 15 is shifted out.

Todo

do LUT RAM and shift register modes interfere within a SLICE?

Wide multiplexers

Every SLICE has two wide multiplexers: F5 and FX, used to combine smaller LUTs into larger LUTs. Their function is hardwired:

  • F5 = BX ? F : G

  • FX = BY ? FXINA : FXINB

The F5 output goes to the FXMUX multiplexer, and further wide multiplexers. The FX output goes to the GYMUX multiplexer, and further wide multiplexers.

The FXINA and FXINB inputs are routed as follows:

SLICE

FXINA

FXINB

effective primitive

SLICE0

SLICE0.F5

SLICE2.F5

MUXF6

SLICE1

SLICE1.F5

SLICE3.F5

MUXF6

SLICE2

SLICE0.FX

SLICE1.FX

MUXF7

SLICE3

SLICE2.FX

SLICE2.FX, from CLB above

MUXF8

Note

The routing is different from Virtex 2.

The FX output isn’t connected across any interconnect holes — a MUXF8 cannot be made of two CLBs separated by a hole.

Carry logic

The carry logic implements the MUXCY and XORCY primitives described in Xilinx documentation. There are several bitstream attributes controlling carry logic operation.

The CYINIT mux determines the start of the carry chain in the slice:

  • CIN: connected from COUT of the SLICE below

  • BX

On Spartan 3, the CYSELF mux determines the “propagate” (or select) input of the lower MUXCY:

  • F: propagate is connected to F LUT output

  • 1: propagate is connected to const-1 (ie. the MUXCY is effectively skipped from the chain)

On Virtex 4, the CYSELF mux doesn’t exist, and the propagate signal is hardwired to F output.

The CY0F mux determines the “generate” input of the lower MUXCY:

  • 0 (constant)

  • 1 (constant)

  • (Spartan 3) F1

  • F2

  • (Virtex 4) F3

  • BX

  • (Spartan 3) PROD: equal to F1 & F2, implementing the MULT_AND primitive

  • (Virtex 4) PROD: equal to F2 & F3, implementing the MULT_AND primitive

On Spartan 3, the CYSELG mux determines the “propagate” (or select) input of the upper MUXCY:

  • G: propagate is connected to G LUT output

  • 1: propagate is connected to const-1 (ie. the MUXCY is effectively skipped from the chain)

On Virtex 4, the CYSELG mux doesn’t exist, and the propagate signal is hardwired to F output.

The CY0G mux determines the “generate” input of the upper MUXCY:

  • 0 (constant)

  • 1 (constant)

  • (Spartan 3) G1

  • G2

  • (Virtex 4) G3

  • BY

  • (Spartan 3) PROD: equal to G1 & G2, implementing the MULT_AND primitive

  • (Virtex 4) PROD: equal to G2 & G3, implementing the MULT_AND primitive

The hardwired logic implemented is:

  • (Spartan 3) FCY = CYSELF ? CY0F : CIN (lower MUXCY)

  • (Spartan 3) COUT = GCY = CYSELG ? CY0G : FCY (upper MUXCY)

  • (Virtex 4) FCY = F ? CY0F : CIN (lower MUXCY)

  • (Virtex 4) COUT = GCY = G ? CY0G : FCY (upper MUXCY)

  • FXOR = F ^ CIN (lower XORCY)

  • GXOR = G ^ FCY (upper XORCY)

The dedicated CIN input is routed from:

  • SLICE0.CIN: from SLICE2.COUT of CLB below

  • SLICE1.CIN: from SLICE3.COUT of CLB below

  • SLICE2.CIN: from SLICE0.COUT

  • SLICE3.CIN: from SLICE1.COUT

The carry chains are not connected over interconnect holes. The SLICE[01].CIN inputs in the row above bottom IOI or any kind of interconnect hole are indeterminate.

The sum-of-products feature of Virtex 2 no longer exists on Spartan 3 and Virtex 4.

Output multiplexers — Spartan 3

The Spartan 3 output multiplexers are unchanged from Virtex 2, except for SOPOUT removal.

The FXMUX multiplexer controls the X output. It has three inputs:

  • F (the LUT output)

  • F5

  • FXOR

The GYMUX multiplexer controls the Y output. It has three inputs:

  • G (the LUT output)

  • FX

  • GXOR

The XBMUX multiplexer controls the XB output. It has two inputs:

  • FCY

  • FMC15: shift register output of F

The YBMUX multiplexer controls the YB output. It has two inputs:

  • GCY (equal to COUT)

  • GMC15: shift register output of G

The DXMUX mulitplexer controls the FFX data input. It has two inputs:

  • X (the FXMUX output)

  • BX

The DYMUX mulitplexer controls the FFY data input. It has two inputs:

  • Y (the GYMUX output)

  • BY

Output multiplexers — Virtex 4

The FXMUX multiplexer controls the XMUX output. It has two inputs:

  • F5

  • FXOR

The GYMUX multiplexer controls the YMUX output. It has two inputs:

  • FX

  • GXOR

The X output is directly connected to F output and doesn’t have a mux. Likewise, Y output is directly connected to G output.

The XBMUX multiplexer controls the XB output. It has two inputs:

  • FCY

  • FMC15: shift register output of F

The YBMUX multiplexer controls the YB output. It has two inputs:

  • GCY (equal to COUT)

  • GMC15: shift register output of G

The DXMUX mulitplexer controls the FFX data input. It has five inputs:

  • X (the F output)

  • F5

  • FXOR

  • XB

  • BX

The DYMUX mulitplexer controls the FFY data input. It has five inputs:

  • Y (the G output)

  • FX

  • GXOR

  • YB

  • BY

Registers

The registers are unchanged from Virtex 2.

A SLICE contains two registers:

  • FFX, with input determined by DXMUX and output connected to XQ

  • FFY, with input determined by DYMUX and output connected to YQ

Both registers share the same control signals:

  • CLK: posedge-triggered clock in FF mode or active-low gate in latch mode

  • CE: active-high clock or gate enable

  • SR: if FF_SR_EN, the set/reset signal

  • BY: if FF_REV_EN, the alternate set/reset signal

The following attributes determine register function:

  • FF_LATCH: if set, the registers are latches and CLK behaves as active-low gate; otherwise, the registers are flip-flops and CLK is a posedge-triggered clock

  • FF_SYNC: if set, the SR and BY (if enabled) implement synchronous set/reset (with priority over CE); otherwise, they implement asynchronous set/reset; should not be set together with FF_LATCH

  • FF[XY]_INIT: determines the initial or captured value of given register

    • when the global GSR signal is pulsed (for example, as part of the configuration process), the register is set to the value of this bit

    • when the global GCAP signal is pulsed (for example, by the CAPTURE primitive), this bit captures the current state of the register

  • FF[XY]_SRVAL: determines the set/reset value of given register

  • FF_SR_EN: if set, SR is used as the set/reset signal for both registers, setting them to their FF[XY]_SRVAL

  • FF_REV_EN: if set, BY behaves as secondary set/reset signal for both registers, setting them to the opposite of their FF[XY]_SRVAL

Bitstream

The data for a CLB is located in the same bitstream tile as the associated INT.CLB tile.

CLB bittile 0
RowColumn
012345
0 ~SLICE0:F[15]SLICE0:CYSELFSLICE1:CYSELF~SLICE1:F[15]--
1 ~SLICE0:F[14]SLICE0:XBMUX-~SLICE1:F[14]--
2 ~SLICE0:F[13]SLICE0:FXMUX[0]SLICE1:FXMUX[0]~SLICE1:F[13]--
3 ~SLICE0:F[12]SLICE0:CYSELGSLICE1:CYSELG~SLICE1:F[12]--
4 ~SLICE0:F[11]SLICE0:CYINITSLICE1:CYINIT~SLICE1:F[11]--
5 ~SLICE0:F[10]SLICE0:YBMUX-~SLICE1:F[10]--
6 ~SLICE0:F[9]~SLICE0:G_SHIFT-~SLICE1:F[9]--
7 ~SLICE0:F[8]SLICE0:CY0F[1]SLICE1:CY0F[1]~SLICE1:F[8]--
8 ~SLICE0:F[7]~SLICE0:F_SHIFT-~SLICE1:F[7]--
9 ~SLICE0:F[6]SLICE0:CY0F[0]SLICE1:CY0F[0]~SLICE1:F[6]--
10 ~SLICE0:F[5]SLICE0:CY0F[2]SLICE1:CY0F[2]~SLICE1:F[5]--
11 ~SLICE0:F[4]SLICE0:DXMUXSLICE1:DXMUX~SLICE1:F[4]--
12 ~SLICE0:F[3]~SLICE0:G_RAM-~SLICE1:F[3]--
13 ~SLICE0:F[2]~SLICE0:F_RAM-~SLICE1:F[2]--
14 ~SLICE0:F[1]~SLICE0:FFX_SRVAL~SLICE1:FFX_SRVAL~SLICE1:F[1]-SLICE0:INV.BX
15 ~SLICE0:F[0]SLICE0:DIF_MUX-~SLICE1:F[0]--
16 ~SLICE0:G[15]SLICE0:FXMUX[1]SLICE1:FXMUX[1]~SLICE1:G[15]--
17 ~SLICE0:G[14]~SLICE0:FF_SR_ENABLESLICE0:SLICEWE0USED~SLICE1:G[14]--
18 ~SLICE0:G[13]~SLICE0:FFX_INIT~SLICE1:FFX_INIT~SLICE1:G[13]--
19 ~SLICE0:G[12]SLICE0:FF_SYNCSLICE1:FF_SYNC~SLICE1:G[12]--
20 ~SLICE0:G[11]SLICE0:SLICEWE1USED-~SLICE1:G[11]--
21 ~SLICE0:G[10]~SLICE0:FFY_INIT~SLICE1:FFY_INIT~SLICE1:G[10]--
22 ~SLICE0:G[9]SLICE0:FF_LATCHSLICE1:FF_LATCH~SLICE1:G[9]--
23 ~SLICE0:G[8]SLICE0:FF_REV_ENABLESLICE1:FF_REV_ENABLE~SLICE1:G[8]--
24 ~SLICE0:G[7]~SLICE0:FFY_SRVAL~SLICE1:FFY_SRVAL~SLICE1:G[7]--
25 ~SLICE0:G[6]SLICE0:GYMUX[0]SLICE1:GYMUX[0]~SLICE1:G[6]--
26 ~SLICE0:G[5]SLICE0:DIG_MUX-~SLICE1:G[5]--
27 ~SLICE0:G[4]SLICE0:DYMUXSLICE1:DYMUX~SLICE1:G[4]-SLICE0:INV.BY
28 ~SLICE0:G[3]SLICE0:GYMUX[1]SLICE1:GYMUX[1]~SLICE1:G[3]-SLICE1:INV.BX
29 ~SLICE0:G[2]SLICE0:CY0G[0]SLICE1:CY0G[0]~SLICE1:G[2]--
30 ~SLICE0:G[1]SLICE0:CY0G[2]SLICE1:CY0G[2]~SLICE1:G[1]--
31 ~SLICE0:G[0]SLICE0:CY0G[1]SLICE1:CY0G[1]~SLICE1:G[0]-SLICE1:INV.BY
32 ~SLICE2:F[15]SLICE2:CYSELFSLICE3:CYSELF~SLICE3:F[15]-SLICE2:INV.BX
33 ~SLICE2:F[14]SLICE2:XBMUX-~SLICE3:F[14]--
34 ~SLICE2:F[13]SLICE2:FXMUX[0]SLICE3:FXMUX[0]~SLICE3:F[13]--
35 ~SLICE2:F[12]SLICE2:CYSELGSLICE3:CYSELG~SLICE3:F[12]-SLICE2:INV.BY
36 ~SLICE2:F[11]SLICE2:CYINITSLICE3:CYINIT~SLICE3:F[11]-SLICE3:INV.BX
37 ~SLICE2:F[10]SLICE2:YBMUX-~SLICE3:F[10]--
38 ~SLICE2:F[9]~SLICE2:G_SHIFT-~SLICE3:F[9]--
39 ~SLICE2:F[8]SLICE2:CY0F[1]SLICE3:CY0F[1]~SLICE3:F[8]--
40 ~SLICE2:F[7]~SLICE2:F_SHIFT-~SLICE3:F[7]--
41 ~SLICE2:F[6]SLICE2:CY0F[0]SLICE3:CY0F[0]~SLICE3:F[6]--
42 ~SLICE2:F[5]SLICE2:CY0F[2]SLICE3:CY0F[2]~SLICE3:F[5]--
43 ~SLICE2:F[4]SLICE2:DXMUXSLICE3:DXMUX~SLICE3:F[4]--
44 ~SLICE2:F[3]~SLICE2:G_RAM-~SLICE3:F[3]--
45 ~SLICE2:F[2]~SLICE2:F_RAM-~SLICE3:F[2]--
46 ~SLICE2:F[1]~SLICE2:FFX_SRVAL~SLICE3:FFX_SRVAL~SLICE3:F[1]--
47 ~SLICE2:F[0]SLICE2:DIF_MUX-~SLICE3:F[0]--
48 ~SLICE2:G[15]SLICE2:FXMUX[1]SLICE3:FXMUX[1]~SLICE3:G[15]--
49 ~SLICE2:G[14]~SLICE2:FF_SR_ENABLESLICE2:SLICEWE0USED~SLICE3:G[14]-SLICE3:INV.BY
50 ~SLICE2:G[13]~SLICE2:FFX_INIT~SLICE3:FFX_INIT~SLICE3:G[13]--
51 ~SLICE2:G[12]SLICE2:FF_SYNCSLICE3:FF_SYNC~SLICE3:G[12]--
52 ~SLICE2:G[11]--~SLICE3:G[11]--
53 ~SLICE2:G[10]~SLICE2:FFY_INIT~SLICE3:FFY_INIT~SLICE3:G[10]--
54 ~SLICE2:G[9]SLICE2:FF_LATCHSLICE3:FF_LATCH~SLICE3:G[9]--
55 ~SLICE2:G[8]SLICE2:FF_REV_ENABLESLICE3:FF_REV_ENABLE~SLICE3:G[8]--
56 ~SLICE2:G[7]~SLICE2:FFY_SRVAL~SLICE3:FFY_SRVAL~SLICE3:G[7]--
57 ~SLICE2:G[6]SLICE2:GYMUX[0]SLICE3:GYMUX[0]~SLICE3:G[6]--
58 ~SLICE2:G[5]SLICE2:DIG_MUX-~SLICE3:G[5]--
59 ~SLICE2:G[4]SLICE2:DYMUXSLICE3:DYMUX~SLICE3:G[4]--
60 ~SLICE2:G[3]SLICE2:GYMUX[1]SLICE3:GYMUX[1]~SLICE3:G[3]--
61 ~SLICE2:G[2]SLICE2:CY0G[0]SLICE3:CY0G[0]~SLICE3:G[2]--
62 ~SLICE2:G[1]SLICE2:CY0G[2]SLICE3:CY0G[2]~SLICE3:G[1]--
63 ~SLICE2:G[0]SLICE2:CY0G[1]SLICE3:CY0G[1]~SLICE3:G[0]--
SLICE0:F[0, 0, 0][0, 0, 1][0, 0, 2][0, 0, 3][0, 0, 4][0, 0, 5][0, 0, 6][0, 0, 7][0, 0, 8][0, 0, 9][0, 0, 10][0, 0, 11][0, 0, 12][0, 0, 13][0, 0, 14][0, 0, 15]
SLICE0:G[0, 0, 16][0, 0, 17][0, 0, 18][0, 0, 19][0, 0, 20][0, 0, 21][0, 0, 22][0, 0, 23][0, 0, 24][0, 0, 25][0, 0, 26][0, 0, 27][0, 0, 28][0, 0, 29][0, 0, 30][0, 0, 31]
SLICE1:F[0, 3, 0][0, 3, 1][0, 3, 2][0, 3, 3][0, 3, 4][0, 3, 5][0, 3, 6][0, 3, 7][0, 3, 8][0, 3, 9][0, 3, 10][0, 3, 11][0, 3, 12][0, 3, 13][0, 3, 14][0, 3, 15]
SLICE1:G[0, 3, 16][0, 3, 17][0, 3, 18][0, 3, 19][0, 3, 20][0, 3, 21][0, 3, 22][0, 3, 23][0, 3, 24][0, 3, 25][0, 3, 26][0, 3, 27][0, 3, 28][0, 3, 29][0, 3, 30][0, 3, 31]
SLICE2:F[0, 0, 32][0, 0, 33][0, 0, 34][0, 0, 35][0, 0, 36][0, 0, 37][0, 0, 38][0, 0, 39][0, 0, 40][0, 0, 41][0, 0, 42][0, 0, 43][0, 0, 44][0, 0, 45][0, 0, 46][0, 0, 47]
SLICE2:G[0, 0, 48][0, 0, 49][0, 0, 50][0, 0, 51][0, 0, 52][0, 0, 53][0, 0, 54][0, 0, 55][0, 0, 56][0, 0, 57][0, 0, 58][0, 0, 59][0, 0, 60][0, 0, 61][0, 0, 62][0, 0, 63]
SLICE3:F[0, 3, 32][0, 3, 33][0, 3, 34][0, 3, 35][0, 3, 36][0, 3, 37][0, 3, 38][0, 3, 39][0, 3, 40][0, 3, 41][0, 3, 42][0, 3, 43][0, 3, 44][0, 3, 45][0, 3, 46][0, 3, 47]
SLICE3:G[0, 3, 48][0, 3, 49][0, 3, 50][0, 3, 51][0, 3, 52][0, 3, 53][0, 3, 54][0, 3, 55][0, 3, 56][0, 3, 57][0, 3, 58][0, 3, 59][0, 3, 60][0, 3, 61][0, 3, 62][0, 3, 63]
Inverted~[15]~[14]~[13]~[12]~[11]~[10]~[9]~[8]~[7]~[6]~[5]~[4]~[3]~[2]~[1]~[0]
SLICE0:CYSELF[0, 1, 0]
SLICE1:CYSELF[0, 2, 0]
SLICE2:CYSELF[0, 1, 32]
SLICE3:CYSELF[0, 2, 32]
10
F1
SLICE0:XBMUX[0, 1, 1]
SLICE2:XBMUX[0, 1, 33]
FCY0
FMC151
SLICE0:FXMUX[0, 1, 16][0, 1, 2]
SLICE1:FXMUX[0, 2, 16][0, 2, 2]
SLICE2:FXMUX[0, 1, 48][0, 1, 34]
SLICE3:FXMUX[0, 2, 48][0, 2, 34]
F00
F501
FXOR11
SLICE0:CYSELG[0, 1, 3]
SLICE1:CYSELG[0, 2, 3]
SLICE2:CYSELG[0, 1, 35]
SLICE3:CYSELG[0, 2, 35]
10
G1
SLICE0:CYINIT[0, 1, 4]
SLICE1:CYINIT[0, 2, 4]
SLICE2:CYINIT[0, 1, 36]
SLICE3:CYINIT[0, 2, 36]
BX0
CIN1
SLICE0:YBMUX[0, 1, 5]
SLICE2:YBMUX[0, 1, 37]
GCY0
GMC151
SLICE0:FFX_INIT[0, 1, 18]
SLICE0:FFX_SRVAL[0, 1, 14]
SLICE0:FFY_INIT[0, 1, 21]
SLICE0:FFY_SRVAL[0, 1, 24]
SLICE0:FF_SR_ENABLE[0, 1, 17]
SLICE0:F_RAM[0, 1, 13]
SLICE0:F_SHIFT[0, 1, 8]
SLICE0:G_RAM[0, 1, 12]
SLICE0:G_SHIFT[0, 1, 6]
SLICE1:FFX_INIT[0, 2, 18]
SLICE1:FFX_SRVAL[0, 2, 14]
SLICE1:FFY_INIT[0, 2, 21]
SLICE1:FFY_SRVAL[0, 2, 24]
SLICE2:FFX_INIT[0, 1, 50]
SLICE2:FFX_SRVAL[0, 1, 46]
SLICE2:FFY_INIT[0, 1, 53]
SLICE2:FFY_SRVAL[0, 1, 56]
SLICE2:FF_SR_ENABLE[0, 1, 49]
SLICE2:F_RAM[0, 1, 45]
SLICE2:F_SHIFT[0, 1, 40]
SLICE2:G_RAM[0, 1, 44]
SLICE2:G_SHIFT[0, 1, 38]
SLICE3:FFX_INIT[0, 2, 50]
SLICE3:FFX_SRVAL[0, 2, 46]
SLICE3:FFY_INIT[0, 2, 53]
SLICE3:FFY_SRVAL[0, 2, 56]
Inverted~[0]
SLICE0:CY0F[0, 1, 10][0, 1, 7][0, 1, 9]
SLICE1:CY0F[0, 2, 10][0, 2, 7][0, 2, 9]
SLICE2:CY0F[0, 1, 42][0, 1, 39][0, 1, 41]
SLICE3:CY0F[0, 2, 42][0, 2, 39][0, 2, 41]
BX000
F2001
F1011
PROD100
1101
0111
SLICE0:DXMUX[0, 1, 11]
SLICE1:DXMUX[0, 2, 11]
SLICE2:DXMUX[0, 1, 43]
SLICE3:DXMUX[0, 2, 43]
BX0
X1
SLICE0:DIF_MUX[0, 1, 15]
SLICE2:DIF_MUX[0, 1, 47]
ALT0
BX1
SLICE0:FF_LATCH[0, 1, 22]
SLICE0:FF_REV_ENABLE[0, 1, 23]
SLICE0:FF_SYNC[0, 1, 19]
SLICE0:INV.BX[0, 5, 14]
SLICE0:INV.BY[0, 5, 27]
SLICE0:SLICEWE0USED[0, 2, 17]
SLICE0:SLICEWE1USED[0, 1, 20]
SLICE1:FF_LATCH[0, 2, 22]
SLICE1:FF_REV_ENABLE[0, 2, 23]
SLICE1:FF_SYNC[0, 2, 19]
SLICE1:INV.BX[0, 5, 28]
SLICE1:INV.BY[0, 5, 31]
SLICE2:FF_LATCH[0, 1, 54]
SLICE2:FF_REV_ENABLE[0, 1, 55]
SLICE2:FF_SYNC[0, 1, 51]
SLICE2:INV.BX[0, 5, 32]
SLICE2:INV.BY[0, 5, 35]
SLICE2:SLICEWE0USED[0, 2, 49]
SLICE3:FF_LATCH[0, 2, 54]
SLICE3:FF_REV_ENABLE[0, 2, 55]
SLICE3:FF_SYNC[0, 2, 51]
SLICE3:INV.BX[0, 5, 36]
SLICE3:INV.BY[0, 5, 49]
Non-inverted[0]
SLICE0:GYMUX[0, 1, 28][0, 1, 25]
SLICE1:GYMUX[0, 2, 28][0, 2, 25]
SLICE2:GYMUX[0, 1, 60][0, 1, 57]
SLICE3:GYMUX[0, 2, 60][0, 2, 57]
G00
FX01
GXOR11
SLICE0:DIG_MUX[0, 1, 26]
SLICE2:DIG_MUX[0, 1, 58]
ALT0
BY1
SLICE0:DYMUX[0, 1, 27]
SLICE1:DYMUX[0, 2, 27]
SLICE2:DYMUX[0, 1, 59]
SLICE3:DYMUX[0, 2, 59]
BY0
Y1
SLICE0:CY0G[0, 1, 30][0, 1, 31][0, 1, 29]
SLICE1:CY0G[0, 2, 30][0, 2, 31][0, 2, 29]
SLICE2:CY0G[0, 1, 62][0, 1, 63][0, 1, 61]
SLICE3:CY0G[0, 2, 62][0, 2, 63][0, 2, 61]
BY000
G2001
G1011
PROD100
1101
0111

RESERVED_ANDOR

TODO: wtf is this even

RANDOR

This tile overlaps IOI.*.

RANDOR bittile 0
RowColumn
0123
0 ----
1 ----
2 ----
3 ----
4 ----
5 ----
6 ----
7 ----
8 ----
9 ----
10 ----
11 ----
12 ----
13 ----
14 ----
15 ----
16 ----
17 ----
18 ----
19 ---RANDOR:MODE
RANDOR:MODE[0, 3, 19]
OR0
AND1

RANDOR_INIT

This tile overlaps top-left interconnect tile.

RANDOR_INIT bittile 0
RowColumn
0
0 RANDOR_INIT:MODE
RANDOR_INIT:MODE[0, 0, 0]
OR0
AND1