# SymbiFlow for QuickLogic FPGAs

Currently, the supported families are:

- pp3 (EOS-S3 SoC)
- qlf_k4n8

## Quickstart guide

### 1. Build F4PGA Architecture Definitions

Clone the repository:

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

Set up the environment:

```bash
make env
```

The command will automatically clone all GIT submodules, setup a Conda environment with all the necessary packages and generate the build system by invoking CMake.

### 2. Generate a bitstream for a sample design

Once the SymbiFlow environment is set up, you can perform the implementation (synthesis, placement and routing) of an example FPGA designs.

Go to the `quicklogic/<family>/tests` directory and choose a design you want to implement e.g:

```bash
cd quicklogic/pp3/tests/counter
make counter-ql-chandalar_bit
```

This will generate a binary bitstream file for the design. The resulting bitstream will be written to the `top.bit` file in the working directory of the design.

Currently supported basic designs in pp3 faimly are:

- btn_counter
- consts
- counter
- lut
- wire

For details of each of the test design please refer to its `README.md` file.

### 3. Programming the EOS S3 SoC

To simplify the programming process, some helper scripts were integrated with the flow.
The scripts can automatically configure the IOMUX of the SoC so that all top-level IO ports of the design are routed to the physical pads of the chip.

In order to generate the JLink programming script, build the following target:

```bash
make counter-ql-chandalar_jlink
```

or to generate OpenOCD script:

```bash
make counter-ql-chandalar_openocd
```

The script will contain both the bitstream and IOMUX configuration.

## Naming convention

The naming convention of all build targets is: `<design_name>-<board_name>_<stage_name>`

The `<design_name>` corresponds to the name of the design.
The `<board_name>` defines the board that the design is targetted for, possible values are `ql-chandalar` and `ql-quickfeather`
The last part `<stage_name>` defines the last stage of the flow that is to be executed.

The most important stages are:

- **eblif**
    Runs Yosys synthesis and generates an EBLIF file suitable for VPR. The output EBLIF file is named `top.eblif`

- **pack**
    Runs VPR packing stage. The packed design is written to the `top.net` file.

- **place**
    Runs VPR placement stage. Design placement is stored in the `top.place` file. IO placement constraints for VPR are written to the `top_io.place` file.

- **route**
    Runs VPR pack, place and route flow. The packed design is written to the `top.net` file. design placement and routing data is stored in the `top.place` and `top.route` files respectively. IO placement constraints for VPR are written to the `top_io.place` file.

- **analysis**
    Runs VPR analysis, writes post-route netlists in BLIF and Verilog format plus an SDF file with post routing timing analysis.

- **fasm**
    Generates the FPGA assembly file (a.k.a. FASM) using the routed design. The FASM file is named `top.fasm`.

- **bit**
    Generates a binary bitstream file from the FASM file using the `qlfasm.py` tool. The bitstream is ready to be loaded to the FPGA.

- **jlink**
    For convenience of programming the EOS S3 SoC, the `jlink` stage generates a command script which configures the IOMUX of the SoC and loads the bitstream to the FPGA. The script is ready to be executed via the *JLink commander* tool.

- **openocd**
    The `openocd` stage generates an OpenOCD script with `load_bitstream` process which configures the IOMUX of the SoC and loads the bitstream to the FPGA. The script is ready to be executed via the *GDB* tool. To do so, connect to target with OpenOCD, append the generated script to command set: `-f top.openocd` and execute in GDB session `monitor load_bitstream`.

- **bit_v**
    Runs the `fasm2bels` tool on the bitstream generated by the `bit` target. The ``fasm2bels`` tool converts a bitstream or a FASM file to a Verilog file containing basic elements (BELs) and connections between them. The resulting file is named `top_bit.v`

Executing a particular stage implies that all stages before it will be executed as well (if needed). They form a dependency chain.

Note: stages **jlink**, **openocd**, **bit_v** are available only for the pp3 family.

## Adding new designs to SymbiFlow

To to add a new design to the flow, and use it as a test follow the guide:

1. Create a subfolder for your design under the `quicklogic/<family>/tests` folder.

1. Add inclusion of the folder in the `quicklogic/<family>/tests/CMakeLists.txt` by adding the following line to it:

    ```plaintext
    add_subdirectory(<your_directory_name>)
    ```

1. Add a `CMakeLists.txt` file to your design. Specify your design settings inside it:

    ```plaintext
    add_fpga_target(
      NAME            <your_design_name>
      BOARD           <target_board_name>
      SOURCES         <verilog sources list>
      INPUT_IO_FILE   <PCF file with IO constraints>
      SDC_FILE        <SDC file with timing constraints>
      )
    ```

    The design name can be anything. For available board names please refer to the `quicklogic/<family>/boards.cmake` file. Input IO constraints have to be given in the *PCF* format. The *SDC* file argument is optional.
    Please also refer to CMake files for existing designs.
    All the files passed to `add_fpga_target` have to be added to the flow with `add_file_target` e.g:

    ```plaintext
    add_file_target(FILE counter.v SCANNER_TYPE verilog)
    add_file_target(FILE chandalar.pcf)
    ```

    The verilog scanner will automatically add all the verilog dependecies explicitely included in the added file.

1. Once this is done go back to the SymbiFlow root directory and re-run the make env command to update build targets:

   ```bash
   make env
   ```

1. Now enter the build directory of your project and run the appropriate target as described:

   ```bash
   cd build/quicklogic/<family>/tests/<your_directory_name>
   make <your_design_name>-<target_board_name>_bit
   ```

