| libtrellis Overview | |
| ==================== | |
| libtrellis is a C++ library containing utilities to manipulate ECP5 bitstreams, and the databases that correspond tile | |
| bits to functionality (routing and configuration). Although libtrellis can be used as a standard shared library, its | |
| primary use in Project Trellis is as a Python module (called pytrellis), imported by the fuzzing and utility scripts. | |
| The C++ classes are bound to Python using Boost::Python. | |
| Bitstream | |
| --------- | |
| This class provides functionality to read and write Lattice bitstream files, parse their commands, and convert them | |
| into a chip's configuration memory (in terms of frames and bits). | |
| To read a bitstream, use ``read_bit`` to create a ``Bitstream`` object, then call ``deserialise_chip`` on that to | |
| create a ``Chip``. | |
| Chip | |
| ----- | |
| This represents a configured FPGA, in terms of its configuration memory (``CRAM``), tiles and metadata. You can either | |
| use ``deserialise_chip`` on a bitstream to construct a Chip from an existing bitstream, or construct a Chip by device | |
| name or IDCODE. | |
| The ``ChipInfo`` structure contains information for a particular FPGA device. | |
| CRAM | |
| ----- | |
| This class stores the entire configuration data of the FPGA, as a 2D array (frames and bits). Although the array can be | |
| accessed directly, many cases will use ``CRAMView`` instead. ``CRAMView`` provides a read/write view of a window of the | |
| CRAM. This is usually used to represent the configuration memory of a single tile, and takes frame and bit offsets | |
| and lengths. | |
| Subtracting two ``CRAMView`` s, if they are the same size, will produce a ``CRAMDelta``, a list of the changes between | |
| the two memories. This is useful for fuzzing or comparing bitstreams. | |
| Tile | |
| ----- | |
| This represents a tile of the FPGA. It includes a ``CRAMView`` to represent the configuration memory of the tile. | |
| TileConfig | |
| ----------- | |
| This represents the actual configuration of a tile, in terms of arcs (programmable connections), config words (such as | |
| LUT initialisation) and config enums (such as IO type). It is the result of decoding the tile CRAM content using the bit | |
| database, and can be converted to a FASM-like format. | |
| The contents of ``TileConfig`` are ``ConfigArc`` for connections, ``ConfigWord`` for non-routing configuration words | |
| (which also includes single config bits), ``ConfigEnum`` for enum configurations with multiple textual values, and | |
| ``ConfigUnknown`` for unknown bits not found in the database, which are simply stored as a frame, bit reference. | |
| The contents of a tile's configuration RAM can be converted to and from a ``TileConfig`` by using the ``tile_cram_to_config`` | |
| and ``config_to_tile_cram`` methods on the ``TileBitDatabase`` instance for the tile. | |
| TileBitDatabase | |
| ---------------- | |
| There will always be only one ``TileBitDatabase`` for each tile type, which is enforced by requiring calling the | |
| function ``get_tile_bitdata`` (in ``Database.cpp``) to obtain a ``shared_ptr`` to the ``TileBitDatabase``. | |
| The ``TileBitDatabase`` stored the function of all bits in the tile, in terms of the following constructs: | |
| - Muxes (``MuxBits``) specify a list of arcs that can drive a given node. Each arc (``ArcData``) contains | |
| specifies source, sink and the list of bits that enable it as a ``BitGroup``. | |
| - Config words (``WordSettingBits``) specify non-routing configuration settings that are arranged as one or more bits. | |
| Each config bit has an associated list of bits that enable it. This would be used both for single-bit settings | |
| and configuration such as LUT initialisation and PLL dividers. | |
| - Config enums (``EnumSettingBits``) specify non-routing configuration settings that have a set of possible textual | |
| values, used for either modes/types (i.e. IO type) or occasionally "special" muxes not part of general routing. These | |
| are specified as a map between possible values and the bits that enable those values. | |
| ``TileBitDatabase`` instances can be modified during runtime, in a thread-safe way, to enable parallel fuzzing. They can | |
| be saved back to disk using the ``save`` method. | |
| They can also be used to convert between tile CRAM data and higher level tile config, as described above. | |
| RoutingGraph | |
| ------------- | |
| ``RoutingGraph`` and related structures are designed to store a complete routing graph for the Chip. ``RoutingWire`` | |
| represents wires, ``RoutingArc`` represents arcs between wires and ``RoutingBel`` represents a Bel (logic element). | |
| To reduce memory usage, ``ident_t``, an index into a string store, is used instead of using strings directly. Use | |
| ``RoutingGraph.ident`` to convert from string to ``ident_t``, and ``RoutingGraph.to_str`` to convert to a string. | |
| DedupChipdb | |
| ----------- | |
| This is an experimental part of libtrellis to "deduplicate" the repetition in the routing graph, by converting it to | |
| relative coordinates and then storing identical tile locations only once. The data produced is intended to be exported | |
| to a database for a place and route tool using the Python API. | |
| ChipConfig | |
| ---------- | |
| ChipConfig contains the high-level configuration for the entire chip, including all tiles and metadata. It can be | |
| directly converted to or from a high-level configuration text file. For more information see | |
| :doc:`Text Config Documentation <textconfig>`. |