.. _Development:GettingStarted:

Getting Started with F4PGA Toolchain development
################################################

.. IMPORTANT::
   This documentation explains the first steps in the development of the toolchain itself: generating definitions about
   the primitives and routing infrastructure of the architectures.
   If you are looking for the **user documentation**, i.e. how to generate bitstreams from HDL designs, please look at
   :doc:`f4pga:index` and :doc:`examples:index` instead.

.. WARNING::
  Generating Architecture Definition files is expected to take a long time to build, even on fast machines.
  To run the tests in this repository, please make sure these resources are available:

  * Memory: 5.5G
  * Disk space: 20G


This section provides an introduction on how to get started with the development of the F4PGA toolchain.
Each FPGA architecture has its own toolchain backend that will be called during build.
The aim of this repository is to gather the knowledge from those backends and generate useful human and machine readable
documentation to be used by tools such as yosys, vpr and/or vpr.
See `Project X-Ray <https://prjxray.readthedocs.io/en/latest/>`_
and `Project Trellis <https://prjtrellis.readthedocs.io/en/latest/>`_ for more information.

In order to generate architecture definitions, any intermediate file format or bitstreams, you can use one of the
toolchain tests in this repository.
The following steps describe the whole process:


Prepare the environment
=======================

Clone the repository:

.. sourcecode:: bash

    git clone https://github.com/f4pga/f4pga-arch-defs.git

Bootstrap an isolated Conda environment with all the necessary dependencies:

.. sourcecode:: bash

    cd f4pga-arch-defs
    make env

.. HINT::
  This also checks out all the submodules and generates the build system (``Make`` or ``Ninja``) from the CMake
  configuration.
  If you want to use the ``Ninja`` build tool add this line before calling ``make env``:

  .. sourcecode:: bash

      export CMAKE_FLAGS="-GNinja"


Build the tests
===============

While different architectures provide different build targets, there are some targets that should exist for all
architectures.

For development purposes a set of test designs are included for each supported architecture.
In order to perform a build of a test design with the ``Make`` build system, enter the appropriate test build directory
specific to your target architecture and invoke the desired target.

Assuming that you would like to generate the bitstream ``.bit`` file with the counter example for the Arty board, which
uses Xilinx Artix-7 FPGA, you will execute the following:

.. sourcecode:: bash

  cd build/xilinx/xc7/tests/counter
  make counter_arty_bit

If you use ``Ninja``, the target is accessible from the root of the build directory:

.. sourcecode:: bash

  cd build
  ninja counter_arty_bit

.. NOTE::
 Test design target names are based on the following naming convention: ``<design>_<platform>_<target_step>``,
 where ``<target_step>`` is the actual step to be done, e.g.: ``bit``, ``place``, ``route``, ``prog``.

There are targets to run multiple tests at once:

.. sourcecode:: bash

  # Build all demo bitstreams, targetting all architectures
  make all_demos

  # Build all Xilinx 7-series demo bitstreams
  make all_xc7

  # Build all Lattice ICE40 demo bitstreams
  make all_ice40

  # Build all QuickLogic demo bitstreams
  make all_quicklogic

Specific bitstreams can be built by specifying their target name, followed by a suffix specifying the desired output.
For example, the LUT-RAM test for the RAM64X1D primative is called `dram_test_64x1d`.
Example targets are:

.. sourcecode:: bash

  # Just run synthesis on the input Verilog
  make dram_test_64x1d_eblif

  # Complete synthesis and place and route the circuit
  make dram_test_64x1d_route

  # Create the output bitstream (including synthesis and place and route)
  make dram_test_64x1d_bin

  # Run bitstream back into Vivado for timing checks, etc.
  make dram_test_64x1d_vivado


Load the bitstreams
===================

The last step to test the whole flow is to load the bitstream to your platform.
The final output file can be found in the appropriate test directory, i.e:
``build/xilinx/xc7/tests/counter/counter_arty/artix7-xc7a50t-arty-swbut-roi-virt-xc7a50t-arty-swbut-test/top.bit``

Programming tools used in F4PGA are either provided as a conda package during the environment setup, or are automatically
downloaded and referenced by ``CMake``.

For convenience, the ``prog`` targets are provided for loading the bitstream, e.g.:

.. sourcecode:: bash

    make counter_arty_prog

or for ``Ninja``:

.. sourcecode:: bash

    ninja counter_arty_prog

Find further details about loading bitstreams in :ref:`f4pga:GettingStarted:LoadingBitstreams`.
