Each ``<pb_type>`` should contain a ``<mode>`` that describes the physical implementation of the ``<pb_type>``. Note that this is fully compatible to the VPR architecture XML syntax.
This is mainly used for the mode that describes the physical implementation, which is typically not packable. Disable it in the packing and signficantly accelerate the packing runtime.
Tileable routing architecture can minimize the number of unique modules in FPGA fabric to be physically implemented.
Technical details can be found in :cite:`XTang_FPT_2019`.
..note:: Strongly recommend to enable the tileable routing architecture when you want to PnR large FPGA fabrics, which can effectively reduce the runtime.
..option:: through_channel="<bool>"
Allow routing channels to pass through multi-width and multi-height programable blocks. This is mainly used in heterogeneous FPGAs to increase routability, as illustrated in :numref:`fig_thru_channel`.
..warning:: You cannot use ``spread`` pin location for the ``height > 1`` or ``width >1`` tiles when using the tileable routing resource graph!!! Otherwise, it will cause undriven pins in your device!!!
Remove all the routing wires in empty regions. This is mainly used in non-rectangle FPGAs to avoid redundant routing wires in blank area, as illustrated in :numref:`fig_shrink_boundary`.
By default, it is ``false``.
.._fig_shrink_boundary:
..figure:: ./figures/shrink_boundary.png
:width:100%
:alt:Impact of shrink boundary
Impact on routing architecture when shrink-boundary: (a) disabled; (b) enabled.
..warning:: Do NOT enable ``shrink_boundary`` if you are not using the tileable routing resource graph generator!
Allow connection blocks to appear around the perimeter programmable block (mainly I/Os). This is designed to enhance routability of I/Os on perimeter. Also strongly recommended when programmable clock network is required to touch clock pins on I/Os. As illustrated in :numref:`fig_perimeter_cb`, routing tracks can access three sides of each I/O when perimeter connection blocks are created.
By default, it is ``false``.
..warning:: When enabled, please only place outputs at one side of I/Os. For example, outputs of an I/O on the top side can only occur on the bottom side of the I/O tile. Otherwise, routability loss may be expected, leading to some pins cannot be reachable. Enable the ``opin2all_sides`` to recover routability loss.
.._fig_perimeter_cb:
..figure:: ./figures/perimeter_cb.png
:width:100%
:alt:Impact of perimeter_cb
Impact on routing architecture when perimeter connection blocks are : (a) disabled; (b) enabled.
..warning:: Do NOT enable ``perimeter_cb`` if you are not using the tileable routing resource graph generator!
Allow each output pin of a programmable block to drive the routing tracks on all the sides of its adjacent switch block (see an illustrative example in :numref:`fig_opin2all_sides`). This can improve the routability of an FPGA fabric with an increase in the sizes of routing multiplexers in each switch block.
By default, it is ``false``.
.._fig_opin2all_sides:
..figure:: ./figures/opin2all_sides.svg
:width:100%
:alt:Impact of opin2all_sides
Impact on routing architecture when the opin-to-all-sides: (a) disabled; (b) enabled.
..warning:: Do NOT enable ``opin2all_sides`` if you are not using the tileable routing resource graph generator!
..option:: concat_wire="<bool>"
In each switch block, allow each routing track which ends to drive another routing track on the opposite side, as such a wire can be continued in the same direction (see an illustrative example in :numref:`fig_concat_wire`). In other words, routing wires can be concatenated in the same direction across an FPGA fabric. This can improve the routability of an FPGA fabric with an increase in the sizes of routing multiplexers in each switch block.
By default, it is ``false``.
.._fig_concat_wire:
..figure:: ./figures/concat_wire.svg
:width:100%
:alt:Impact of concat_wire
Impact on routing architecture when the wire concatenation: (a) disabled; (b) enabled.
..warning:: Do NOT enable ``concat_wire`` if you are not using the tileable routing resource graph generator!
..option:: concat_pass_wire="<bool>"
In each switch block, allow each routing track which passes to drive another routing track on the opposite side, as such a pass wire can be continued in the same direction (see an illustrative example in :numref:`fig_concat_pass_wire`). This can improve the routability of an FPGA fabric with an increase in the sizes of routing multiplexers in each switch block.
By default, it is ``false``.
..warning:: Please enable this option if you are looking for device support which is created by any release which is before v1.1.541!!!
.._fig_concat_wire:
..figure:: ./figures/concat_pass_wire.svg
:width:100%
:alt:Impact of concat_pass_wire
Impact on routing architecture when the pass wire concatenation: (a) disabled; (b) enabled.
..warning:: Do NOT enable ``concat_pass_wire`` if you are not using the tileable routing resource graph generator!