On a high level, the whole bitstream is split into "areas". Each FB
of the device corresponds two areas, one of which contains the UIM wire-AND
configuration, and the other (main area) contains everything else.
The main area of a FB is made of 72 "rows". Each row is made of 15 "columns".
Each column is made of 6 or 8 bits: columns 0-8 are made of 8 bits, while
columns 9-14 are made of 6 bits.
The low 6 bits of every column are used to store product term masks, and
the high 2 bits of columns 0-8 are used to store everything else.
The UIM wire-AND area of a FB is, in turn, made of "subareas", one for each
FB of the device. Each subarea is in turn made of 18 rows. Each row
is made of 5 columns. Column 0 is made of 8 bits, while columns 1-4 are made
of 7 bits, making for 36 total bits per row.
When programmed or read via JTAG, the bitstream is transmitted as bytes,
which are 6-8 bits long. Each byte of the bitstream has its address.
Not all addresses are valid, and valid addresses are not contiguous.
Address is 17 bits long, and is split to several fields:
bits 13-16: FB index
bit 12: area kind
0: main FB config
1: UIM wire-AND config
for main FB config area:
bits 5-11: row
bits 3-4: column / 5
bits 0-2: column % 5
for UIM wire-AND config area:
bits 8-11: subarea (source FB index)
bits 3-7: row
bits 0-2: column
The unprogrammed state of a bit on XC9500 is 1.
The programmed state is 0. Thus, whenever a boolean fuse is mentioned
in the documentation, the "true" value is actually represented as 0
in the bitstream. This includes the USERCODE bits.
In the JED format, all fuses of the device are simply concatenated in order,
skipping over invalid addresses. The bytes are not padded to 8 bits, but
have their native size. Thus, converting from JED fuse index to device
address involves some complex calculations::
Per-MC config fuses (that are not product term masks) are stored in bits 6-7 of
columns 0-8 of rows 12-54 of the main area. The formulas are as follows:
The FB input mux configuraton is stored in rows 55-66, columns 0-8, bits 6-7.
The exact bit assignments are irregular and should be obtained from the database.
On XC95288, the IBUF_UIM_ENABLE fuses are stored in rows (1, 2, 5, 8, 9),
columns 0-8, bits 6-7 of FBs (0, 1, 14, 15) in an irregular manner. Each
fuse is duplicated twice: once in FBs (0, 1) and once in FBs (14, 15).
The purpose of this duplication is unknown. Consult the database for exact
bit assignments.