# SymbiFlow for QuickLogic FPGAs

Currently, the supported families are:

- pp3 (EOS-S3 SoC)
- qlf_k4n8

## Quickstart guide

### 1. Build SymbiFlow

Clone the SymbiFlow repository:

```bash
git clone https://github.com/SymbiFlow/symbiflow-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
   ```

