| .. _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`. |