aboutsummaryrefslogtreecommitdiffstats
path: root/docs/io_tile.html
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2015-07-18 13:10:40 +0200
committerClifford Wolf <clifford@clifford.at>2015-07-18 13:10:40 +0200
commit48154cb6f452d3bdb4da36cc267b4b6c45588dc9 (patch)
tree3ec3be9ef7e8db1fb7c764ed8202e0215a8eb7c7 /docs/io_tile.html
parent13e63e6b65e044e348356731b55610d02cb308b9 (diff)
downloadicestorm-48154cb6f452d3bdb4da36cc267b4b6c45588dc9.tar.gz
icestorm-48154cb6f452d3bdb4da36cc267b4b6c45588dc9.tar.bz2
icestorm-48154cb6f452d3bdb4da36cc267b4b6c45588dc9.zip
Imported full dev sources
Diffstat (limited to 'docs/io_tile.html')
-rw-r--r--docs/io_tile.html496
1 files changed, 496 insertions, 0 deletions
diff --git a/docs/io_tile.html b/docs/io_tile.html
new file mode 100644
index 0000000..0324ac8
--- /dev/null
+++ b/docs/io_tile.html
@@ -0,0 +1,496 @@
+<title>Project IceStorm &ndash; IO Tile Documentation</title>
+<h1>Project IceStorm &ndash; IO Tile Documentation</h1>
+
+<p>
+<i><a href=".">Project IceStorm</a> aims at documenting the bitstream format of Lattice iCE40
+FPGAs and providing simple tools for analyzing and creating bitstream files.
+This is work in progress.</i>
+</p>
+
+<h2>Span-4 and Span-12 Wires</h2>
+
+<p><a href="iosp.svg"><img style="float:right; padding:1em; padding-top:0" height="200" src="iosp.svg" border="0"></a></p>
+
+<p>
+The image on the right shows the span-wires of a left (or right) io cell (click to enlarge).
+</p>
+
+<p>
+A left/right io cell has 16 connections named <tt>span4_vert_t_0</tt> to <tt>span4_vert_t_15</tt> on its top edge and
+16 connections named <tt>span4_vert_b_0</tt> to <tt>span4_vert_b_15</tt> on its bottom edge. The nets <tt>span4_vert_t_0</tt>
+to <tt>span4_vert_t_11</tt> are connected to <tt>span4_vert_b_4</tt> to <tt>span4_vert_b_15</tt>. The span-4 and span-12 wires
+of the adjacent logic cell are connected to the nets <tt>span4_horz_0</tt> to <tt>span4_horz_47</tt> and <tt>span12_horz_0</tt>
+to <tt>span12_horz_23</tt>.
+</p>
+
+<p>
+A top/bottom io cell has 16 connections named <tt>span4_vert_l_0</tt> to <tt>span4_vert_l_15</tt> on its top edge and
+16 connections named <tt>span4_vert_r_0</tt> to <tt>span4_vert_r_15</tt> on its bottom edge. The nets <tt>span4_vert_l_0</tt>
+to <tt>span4_vert_l_11</tt> are connected to <tt>span4_vert_r_4</tt> to <tt>span4_vert_r_15</tt>. The span-4 and span-12 wires
+of the adjacent logic cell are connected to the nets <tt>span4_vert_0</tt> to <tt>span4_vert_47</tt> and <tt>span12_vert_0</tt>
+to <tt>span12_vert_23</tt>.
+</p>
+
+<p>
+The vertical span4 wires of left/right io cells are connected "around the corner" to the horizontal span4 wires of the top/bottom
+io cells. For example <tt>span4_vert_b_0</tt> of IO cell (0 1) is connected to <tt>span4_horz_l_0</tt> (<tt>span4_horz_r_4</tt>)
+of IO cell (1 0).
+</p>
+
+<p>
+Note that unlike the span-wires connection LOGIC and RAM tiles, the span-wires
+connecting IO tiles to each other are not pairwised crossed out.
+</p>
+
+<h2>IO Blocks</h2>
+
+<p>
+Each IO tile contains two IO blocks. Each IO block essentially implements the <tt>SB_IO</tt>
+primitive from the <a href="http://www.latticesemi.com/~/media/Documents/TechnicalBriefs/iCETechnologyLibrary.PDF">Lattice iCE Technology Library</a>.
+Some inputs are shared between the two IO blocks. The following table lists how the
+wires in the logic tile map to the <tt>SB_IO</tt> primitive ports:
+</p>
+
+<p align="center">
+<table cellpadding="3" border>
+<tr><th>SB_IO Port</th><th>IO Block 0</th><th>IO Block 1</th></tr>
+<tr><td>D_IN_0</td><td><tt>io_0/D_IN_0</tt></td><td><tt>io_1/D_IN_0</tt></td></tr>
+<tr><td>D_IN_1</td><td><tt>io_0/D_IN_1</tt></td><td><tt>io_1/D_IN_1</tt></td></tr>
+<tr><td>D_OUT_0</td><td><tt>io_0/D_OUT_0</tt></td><td><tt>io_1/D_OUT_0</tt></td></tr>
+<tr><td>D_OUT_1</td><td><tt>io_0/D_OUT_1</tt></td><td><tt>io_1/D_OUT_1</tt></td></tr>
+<tr><td>OUTPUT_ENABLE</td><td><tt>io_0/OUT_ENB</tt></td><td><tt>io_1/OUT_ENB</tt></td></tr>
+<tr><td>CLOCK_ENABLE</td><td colspan="2"><tt>io_global/cen</tt></td></tr>
+<tr><td>INPUT_CLK</td><td colspan="2"><tt>io_global/inclk</tt></td></tr>
+<tr><td>OUTPUT_CLK</td><td colspan="2"><tt>io_global/outclk</tt></td></tr>
+<tr><td>LATCH_INPUT_VALUE</td><td colspan="2"><tt>io_global/latch</tt></td></tr>
+</table>
+</p>
+
+<p>
+Like the inputs to logic cells, the inputs to IO blocks are routed to the IO block via a two-stage process. A signal
+is first routed to one of 16 local tracks in the IO tile and then from the local track to the IO block.
+</p>
+
+<p>
+The <tt>io_global/latch</tt> signal is shared among all IO tiles on an edge of the chip and is driven by <tt>wire_gbuf/in</tt>
+from one dedicated IO tile on that edge. For the HX1K chips the tiles driving the <tt>io_global/latch</tt> signal are:
+(0, 7), (13, 10), (5, 0), and (8, 17)
+</p>
+
+<p>
+A logic tile sends the output of its eight logic cells to its neighbour tiles. An IO tile does the same thing with the four <tt>D_IN</tt>
+signals created by its two IO blocks. The <tt>D_IN</tt> signals map to logic function indices as follows:
+</p>
+
+<p align="center">
+<table cellpadding="3" border>
+<tr><th>Function Index</th><th>D_IN Wire</th></tr>
+<tr><td>0</td><td><tt>io_0/D_IN_0</tt></td></tr>
+<tr><td>1</td><td><tt>io_0/D_IN_1</tt></td></tr>
+<tr><td>2</td><td><tt>io_1/D_IN_0</tt></td></tr>
+<tr><td>3</td><td><tt>io_1/D_IN_1</tt></td></tr>
+<tr><td>4</td><td><tt>io_0/D_IN_0</tt></td></tr>
+<tr><td>5</td><td><tt>io_0/D_IN_1</tt></td></tr>
+<tr><td>6</td><td><tt>io_1/D_IN_0</tt></td></tr>
+<tr><td>7</td><td><tt>io_1/D_IN_1</tt></td></tr>
+</table>
+</p>
+
+<p>
+For example the signal <tt>io_1/D_IN_0</tt> in IO tile (0, 5) can be seen as <tt>neigh_op_lft_2</tt> and <tt>neigh_op_lft_6</tt> in LOGIC tile (1, 5).
+</p>
+
+<p>
+Each IO Tile has 2 <tt>NegClk</tt> configuration bits, suggesting that the
+clock signals can be inverted independently for the the two IO blocks in the
+tile. However, the Lattice tools refuse to pack to IO blocks with different block
+polarity into the same IO tile. In our tests we only managed to either set or clear
+both NegClk bits.
+</p>
+
+<p>
+Each IO block has two <tt>IoCtrl IE</tt> bits that enable the input buffers and
+two <tt>IoCtrl REN</tt> bits that enable the pull up resistors. Both bits are active
+low, i.e. an unused IO tile will have both IE bits set and both REN bits cleared (the
+default behavior is to enable pullup resistors on all unused pins). Note that
+<tt>icebox_explain.py</tt> will ignore all IO tiles that only have the two <tt>IoCtrl
+IE</tt> bits set.
+</p>
+
+<p>
+However, the <tt>IoCtrl IE_0/IE_1</tt> and <tt>IoCtrl REN_0/REN_1</tt> do not
+necessarily configure the IO PIN that are connected to the IO block in the same tile,
+and if they do the numbers (0/1) do not necessarily match. As a general rule, the pins
+on the right and bottom side of the chips match up with the IO blocks and for the pins
+on the left and top side the numbers must be swapped. But in some cases the IO block
+and the set of <tt>IE/REN</tt> are not even located in the same tile. The following
+table lists the correlation between IO blocks and <tt>IE/REN</tt> bits for the
+1K chip:
+</p>
+
+<p align="center">
+<table cellpadding="10">
+<tr><td valign="top">
+
+<table cellpadding="3" border>
+<tr><th>IO Block</th><th>IE/REN Block</th></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 14 1</td><td align="center">0 14 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 14 0</td><td align="center">0 14 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 13 1</td><td align="center">0 13 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 13 0</td><td align="center">0 13 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 12 1</td><td align="center">0 12 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 12 0</td><td align="center">0 12 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 11 1</td><td align="center">0 11 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 11 0</td><td align="center">0 11 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 10 1</td><td align="center">0 10 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 10 0</td><td align="center">0 10 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 9 1</td><td align="center">0 9 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 9 0</td><td align="center">0 9 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 8 1</td><td align="center">0 8 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 8 0</td><td align="center">0 8 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 6 1</td><td align="center">0 6 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 6 0</td><td align="center">0 6 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 5 1</td><td align="center">0 5 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 5 0</td><td align="center">0 5 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 4 1</td><td align="center">0 4 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 4 0</td><td align="center">0 4 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 3 1</td><td align="center">0 3 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 3 0</td><td align="center">0 3 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 2 1</td><td align="center">0 2 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0 2 0</td><td align="center">0 2 1</td></tr>
+</table>
+
+</td><td valign="top">
+
+<table cellpadding="3" border>
+<tr><th>IO Block</th><th>IE/REN Block</th></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 1 0 0</td><td align="center"> 1 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 1 0 1</td><td align="center"> 1 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 2 0 0</td><td align="center"> 2 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 2 0 1</td><td align="center"> 2 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 3 0 0</td><td align="center"> 3 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 3 0 1</td><td align="center"> 3 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 4 0 0</td><td align="center"> 4 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 4 0 1</td><td align="center"> 4 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 5 0 0</td><td align="center"> 5 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 5 0 1</td><td align="center"> 5 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 6 0 1</td><td align="center"> 6 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 7 0 0</td><td align="center"> 6 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 6 0 0</td><td align="center"> 7 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 7 0 1</td><td align="center"> 7 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 8 0 0</td><td align="center"> 8 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 8 0 1</td><td align="center"> 8 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 9 0 0</td><td align="center"> 9 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 9 0 1</td><td align="center"> 9 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">10 0 0</td><td align="center">10 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">10 0 1</td><td align="center">10 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">11 0 0</td><td align="center">11 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">11 0 1</td><td align="center">11 0 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">12 0 0</td><td align="center">12 0 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">12 0 1</td><td align="center">12 0 1</td></tr>
+</table>
+
+</td><td valign="top">
+
+<table cellpadding="3" border>
+<tr><th>IO Block</th><th>IE/REN Block</th></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 1 0</td><td align="center">13 1 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 1 1</td><td align="center">13 1 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 2 0</td><td align="center">13 2 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 2 1</td><td align="center">13 2 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 3 1</td><td align="center">13 3 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 4 0</td><td align="center">13 4 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 4 1</td><td align="center">13 4 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 6 0</td><td align="center">13 6 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 6 1</td><td align="center">13 6 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 7 0</td><td align="center">13 7 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 7 1</td><td align="center">13 7 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 8 0</td><td align="center">13 8 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 8 1</td><td align="center">13 8 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 9 0</td><td align="center">13 9 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 9 1</td><td align="center">13 9 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 11 0</td><td align="center">13 10 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 11 1</td><td align="center">13 10 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 12 0</td><td align="center">13 11 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 12 1</td><td align="center">13 11 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 13 0</td><td align="center">13 13 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 13 1</td><td align="center">13 13 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 14 0</td><td align="center">13 14 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 14 1</td><td align="center">13 14 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 15 0</td><td align="center">13 15 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">13 15 1</td><td align="center">13 15 1</td></tr>
+</table>
+
+</td><td valign="top">
+
+<table cellpadding="3" border>
+<tr><th>IO Block</th><th>IE/REN Block</th></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">12 17 1</td><td align="center">12 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">12 17 0</td><td align="center">12 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">11 17 1</td><td align="center">11 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">11 17 0</td><td align="center">11 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">10 17 1</td><td align="center"> 9 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">10 17 0</td><td align="center"> 9 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 9 17 1</td><td align="center">10 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 9 17 0</td><td align="center">10 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 8 17 1</td><td align="center"> 8 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 8 17 0</td><td align="center"> 8 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 7 17 1</td><td align="center"> 7 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 7 17 0</td><td align="center"> 7 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 6 17 1</td><td align="center"> 6 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 5 17 1</td><td align="center"> 5 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 5 17 0</td><td align="center"> 5 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 4 17 1</td><td align="center"> 4 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 4 17 0</td><td align="center"> 4 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 3 17 1</td><td align="center"> 3 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 3 17 0</td><td align="center"> 3 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 2 17 1</td><td align="center"> 2 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 2 17 0</td><td align="center"> 2 17 0</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 1 17 1</td><td align="center"> 1 17 1</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center"> 1 17 0</td><td align="center"> 1 17 0</td></tr>
+</table>
+
+</table>
+</p>
+
+<p>
+When an input pin pair is used as LVDS pair (IO standard
+<tt>SB_LVDS_INPUT</tt>, bank 3 / left edge only), then the four bits
+<tt>IoCtrl IE_0/IE_1</tt> and <tt>IoCtrl REN_0/REN_1</tt> are all set, as well
+as the <tt>IoCtrl LVDS</tt> bit.
+</p>
+
+<p>
+In the iCE 8k devices the <tt>IoCtrl IE</tt> bits are active high. So an unused
+IO tile on an 8k chip has all bits cleared.
+</p>
+
+<h2>Global Nets</h2>
+
+<p>
+iCE40 FPGAs have 8 global nets. Each global net can be driven directly from an
+IO pin. In the FPGA bitstream, routing of external signals to global nets is
+not controlled by bits in the IO tile. Instead bits that do not belong to any
+tile are used. In IceBox nomenclature such bits are called "extra bits".
+</p>
+
+<p>
+The following table lists which pins / IO blocks may be used to drive
+which global net, and what <tt>.extra</tt> statements in the IceBox ASCII file
+format to represent the corresponding configuration bits:
+</p>
+
+
+<p align="center">
+<table cellpadding="3" border>
+<tr><th>Glb Net</th><th>Pin<br/>(HX1K-TQ144)</th><th>IO Tile +<br/>Block #</th><th>IceBox Statement</th></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">0</td><td align="center"> 93</td><td align="center">13 8 1</td><td align="center">.extra_bit 0 330 142</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">1</td><td align="center"> 21</td><td align="center"> 0 8 1</td><td align="center">.extra_bit 0 331 142</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">2</td><td align="center">128</td><td align="center"> 7 17 0</td><td align="center">.extra_bit 1 330 143</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">3</td><td align="center"> 50</td><td align="center"> 7 0 0</td><td align="center">.extra_bit 1 331 143</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">4</td><td align="center"> 20</td><td align="center"> 0 9 0</td><td align="center">.extra_bit 1 330 142</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">5</td><td align="center"> 94</td><td align="center">13 9 0</td><td align="center">.extra_bit 1 331 142</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">6</td><td align="center"> 49</td><td align="center"> 6 0 1</td><td align="center">.extra_bit 0 330 143</td></tr>
+<tr style="white-space: pre; font-family: monospace"><td align="center">7</td><td align="center">129</td><td align="center"> 6 17 1</td><td align="center">.extra_bit 0 331 143</td></tr>
+</table>
+</p>
+
+<p>
+Signals internal to the FPGA can also be routed to the global nets. This is done by routing the signal
+to the <tt>wire_gbuf/in</tt> net on an IO tile. The same set of I/O tiles is used for this, but in this
+case each of the I/O tiles corresponds to a different global net:
+</p>
+
+<p align="center">
+<table cellpadding="3" border>
+<tr><th>Glb Net</th>
+<td align="center">0</td>
+<td align="center">1</td>
+<td align="center">2</td>
+<td align="center">3</td>
+<td align="center">4</td>
+<td align="center">5</td>
+<td align="center">6</td>
+<td align="center">7</td></tr>
+<tr><th>IO Tile</th>
+<td style="white-space: pre; font-family: monospace" align="center"> 7 0</td>
+<td style="white-space: pre; font-family: monospace" align="center"> 7 17</td>
+<td style="white-space: pre; font-family: monospace" align="center">13 9</td>
+<td style="white-space: pre; font-family: monospace" align="center"> 0 9</td>
+<td style="white-space: pre; font-family: monospace" align="center"> 6 17</td>
+<td style="white-space: pre; font-family: monospace" align="center"> 6 0</td>
+<td style="white-space: pre; font-family: monospace" align="center"> 0 8</td>
+<td style="white-space: pre; font-family: monospace" align="center">13 8</td></tr>
+</table>
+</p>
+
+<p><a href="colbuf.svg"><img style="float:right; padding:1em; padding-top:0" height="200" src="colbuf.svg" border="0"></a></p>
+
+<h3>Column Buffer Control Bits</h3>
+
+<p>
+Each LOGIC, IO, and RAMB tile has 8 ColBufCtrl bits, one for each global net. In most tiles this
+bits have no function, but in tiles in rows 4, 5, 12, and 13 (for RAM columns: rows 3, 5, 11, and 13) this bits
+control which global nets are driven to the column of tiles below and/or above that tile (including that tile),
+as illustrated in the image to the right (click to enlarge).
+</p>
+
+<p>
+In 8k chips the rows 8, 9, 24, and 25 contain the column buffers. 8k RAMB and
+RAMT tiles can control column buffers, so the pattern looks the same for RAM, LOGIC, and
+IO columns.
+</p>
+
+<h2>Warmboot</h2>
+
+<p>
+The <tt>SB_WARMBOOT</tt> primitive in iCE40 FPGAs has three inputs and no outputs. The three inputs of that cell
+are driven by the <tt>wire_gbuf/in</tt> signal from three IO tiles. In HX1K chips the tiles connected to the
+<tt>SB_WARMBOOT</tt> primitive are:
+</p>
+
+<p align="center">
+<table cellpadding="3" border>
+<tr><th>Warmboot Pin</th><th>IO Tile</th></tr>
+<tr><td>BOOT</td><td><tt>12 0</tt></td></tr>
+<tr><td>S0</td><td><tt>13 1</tt></td></tr>
+<tr><td>S1</td><td><tt>13 2</tt></td></tr>
+</table>
+</p>
+
+<h2>PLL Cores</h2>
+
+<p>
+The PLL primitives in iCE40 FPGAs are configured using the <tt>PLLCONFIG_*</tt>
+bits in the IO tiles. The configuration for a single PLL cell is spread out
+over many IO tiles. For example, the PLL cell in the 1K chip are configured as
+follows (bits listed from LSB to MSB):
+</p>
+
+<p align="center">
+<table cellpadding="10"><tr><td valign="top">
+
+<table cellpadding="3" border>
+<tr><th>IO Tile</th><th>Config Bit</th><th>SB_PLL40_* Parameter</th></tr>
+
+<tr><td>0 3</td><td><tt>PLLCONFIG_5</tt></td><td rowspan="3">Select PLL Type:<br/>
+000 = DISABLED<br/>
+010 = SB_PLL40_PAD<br/>
+100 = SB_PLL40_2_PAD<br/>
+110 = SB_PLL40_2F_PAD<br/>
+011 = SB_PLL40_CORE<br/>
+111 = SB_PLL40_2F_CORE</td></tr>
+<tr><td>0 5</td><td><tt>PLLCONFIG_1</tt></td></tr>
+<tr><td>0 5</td><td><tt>PLLCONFIG_3</tt></td></tr>
+
+<tr><td>0 5</td><td><tt>PLLCONFIG_5</tt></td><td rowspan="3"><tt>FEEDBACK_PATH</tt><br/>
+000 = "DELAY"<br/>
+001 = "SIMPLE"<br/>
+010 = "PHASE_AND_DELAY"<br/>
+110 = "EXTERNAL"</td></tr>
+<tr><td>0 2</td><td><tt>PLLCONFIG_9</tt></td></tr>
+<tr><td>0 3</td><td><tt>PLLCONFIG_1</tt></td></tr>
+
+<tr><td>0 4</td><td><tt>PLLCONFIG_4</tt></td><td rowspan="1"><tt>DELAY_ADJUSTMENT_MODE_FEEDBACK</tt><br/>
+0 = "FIXED"<br/>
+1 = "DYNAMIC"</td></tr>
+
+<tr><td>0 4</td><td><tt>PLLCONFIG_9</tt></td><td rowspan="1"><tt>DELAY_ADJUSTMENT_MODE_RELATIVE</tt><br/>
+0 = "FIXED"<br/>
+1 = "DYNAMIC"</td></tr>
+
+<tr><td>0 3</td><td><tt>PLLCONFIG_6</tt></td><td rowspan="2"><tt>PLLOUT_SELECT<br/>PLLOUT_SELECT_PORTA</tt><br/>
+00 = "GENCLK"<br/>
+01 = "GENCLK_HALF"<br/>
+10 = "SHIFTREG_90deg"<br/>
+11 = "SHIFTREG_0deg"</td></tr>
+<tr><td>0 3</td><td><tt>PLLCONFIG_7</tt></td></tr>
+
+<tr><td>0 3</td><td><tt>PLLCONFIG_2</tt></td><td rowspan="2"><tt>PLLOUT_SELECT_PORTB</tt><br/>
+00 = "GENCLK"<br/>
+01 = "GENCLK_HALF"<br/>
+10 = "SHIFTREG_90deg"<br/>
+11 = "SHIFTREG_0deg"</td></tr>
+<tr><td>0 3</td><td><tt>PLLCONFIG_3</tt></td></tr>
+
+<tr><td>0 3</td><td><tt>PLLCONFIG_4</tt></td><td rowspan="1"><tt>SHIFTREG_DIV_MODE</tt></td></tr>
+
+<tr><td>0 3</td><td><tt>PLLCONFIG_8</tt></td><td rowspan="1"><tt>TEST_MODE</tt></td></tr>
+
+</table></td><td valign="top">
+
+<table cellpadding="3" border>
+<tr><th>IO Tile</th><th>Config Bit</th><th>SB_PLL40_* Parameter</th></tr>
+
+<tr><td>0 3</td><td><tt>PLLCONFIG_9</tt></td><td rowspan="4"><tt>FDA_FEEDBACK</tt></td></tr>
+<tr><td>0 4</td><td><tt>PLLCONFIG_1</tt></td></tr>
+<tr><td>0 4</td><td><tt>PLLCONFIG_2</tt></td></tr>
+<tr><td>0 4</td><td><tt>PLLCONFIG_3</tt></td></tr>
+
+<tr><td>0 5</td><td><tt>PLLCONFIG_5</tt></td><td rowspan="4"><tt>FDA_RELATIVE</tt></td></tr>
+<tr><td>0 4</td><td><tt>PLLCONFIG_6</tt></td></tr>
+<tr><td>0 4</td><td><tt>PLLCONFIG_7</tt></td></tr>
+<tr><td>0 4</td><td><tt>PLLCONFIG_8</tt></td></tr>
+
+<tr><td>0 1</td><td><tt>PLLCONFIG_1</tt></td><td rowspan="4"><tt>DIVR</tt></td></tr>
+<tr><td>0 1</td><td><tt>PLLCONFIG_2</tt></td></tr>
+<tr><td>0 1</td><td><tt>PLLCONFIG_3</tt></td></tr>
+<tr><td>0 1</td><td><tt>PLLCONFIG_4</tt></td></tr>
+
+<tr><td>0 1</td><td><tt>PLLCONFIG_5</tt></td><td rowspan="7"><tt>DIVF</tt></td></tr>
+<tr><td>0 1</td><td><tt>PLLCONFIG_6</tt></td></tr>
+<tr><td>0 1</td><td><tt>PLLCONFIG_7</tt></td></tr>
+<tr><td>0 1</td><td><tt>PLLCONFIG_8</tt></td></tr>
+<tr><td>0 1</td><td><tt>PLLCONFIG_9</tt></td></tr>
+<tr><td>0 2</td><td><tt>PLLCONFIG_1</tt></td></tr>
+<tr><td>0 2</td><td><tt>PLLCONFIG_2</tt></td></tr>
+
+<tr><td>0 2</td><td><tt>PLLCONFIG_3</tt></td><td rowspan="3"><tt>DIVQ</tt></td></tr>
+<tr><td>0 2</td><td><tt>PLLCONFIG_4</tt></td></tr>
+<tr><td>0 2</td><td><tt>PLLCONFIG_5</tt></td></tr>
+
+<tr><td>0 2</td><td><tt>PLLCONFIG_6</tt></td><td rowspan="3"><tt>FILTER_RANGE</tt></td></tr>
+<tr><td>0 2</td><td><tt>PLLCONFIG_7</tt></td></tr>
+<tr><td>0 2</td><td><tt>PLLCONFIG_8</tt></td></tr>
+
+</table>
+</table>
+</p>
+
+<p>
+The PLL inputs are routed to the PLL via the <tt>wire_gbuf/in</tt> signal from various IO tiles. The non-clock
+PLL outputs are routed via otherwise unused <tt>neigh_op_*</tt> signals in fabric corners. For example in case
+of the 1k chip:
+</p>
+
+<p align="center">
+<table cellpadding="3" border>
+<tr><th>Tile</th><th>Net-Segment</th><th>SB_PLL40_* Port Name</th></tr>
+<tr><td>0 1</td><td><tt>wire_gbuf/in</tt></td><td rowspan="1"><tt>REFERENCECLK</tt></td></tr>
+<tr><td>0 2</td><td><tt>wire_gbuf/in</tt></td><td rowspan="1"><tt>EXTFEEDBACK</tt></td></tr>
+<tr><td>0 4</td><td><tt>wire_gbuf/in</tt></td><td rowspan="8"><tt>DYNAMICDELAY</tt></td></tr>
+<tr><td>0 5</td><td><tt>wire_gbuf/in</tt></td></tr>
+<tr><td>0 6</td><td><tt>wire_gbuf/in</tt></td></tr>
+<tr><td>0 10</td><td><tt>wire_gbuf/in</tt></td></tr>
+<tr><td>0 11</td><td><tt>wire_gbuf/in</tt></td></tr>
+<tr><td>0 12</td><td><tt>wire_gbuf/in</tt></td></tr>
+<tr><td>0 13</td><td><tt>wire_gbuf/in</tt></td></tr>
+<tr><td>0 14</td><td><tt>wire_gbuf/in</tt></td></tr>
+<tr><td>1 1</td><td><tt>neigh_op_bnl_1</tt></td><td rowspan="1"><tt>LOCK</tt></td></tr>
+<tr><td>1 0</td><td><tt>wire_gbuf/in</tt></td><td rowspan="1"><tt>BYPASS</tt></td></tr>
+<tr><td>2 0</td><td><tt>wire_gbuf/in</tt></td><td rowspan="1"><tt>RESETB</tt></td></tr>
+<tr><td>5 0</td><td><tt>wire_gbuf/in</tt></td><td rowspan="1"><tt>LATCHINPUTVALUE</tt></td></tr>
+<tr><td>12 1</td><td><tt>neigh_op_bnl_1</tt></td><td rowspan="1"><tt>SDO</tt></td></tr>
+<tr><td>4 0</td><td><tt>wire_gbuf/in</tt></td><td rowspan="1"><tt>SDI</tt></td></tr>
+<tr><td>5 0</td><td><tt>wire_gbuf/in</tt></td><td rowspan="1"><tt>SCLK</tt></td></tr>
+</table>
+</p>
+
+<p>
+The PLL clock outputs are fed directly into the input path of certain IO tiles.
+In case of the 1k chip the PORTA clock is fed into PIO 1 of IO Tile (6 0) and
+the PORTB clock is fed into PIO 0 of IO Tile (7 0). Because of this, those two
+PIOs can only be used as output Pins by the FPGA fabric when the PLL ports
+are being used.
+</p>
+