nextpnr portable FPGA place and route tool
ISC License
nextpnr aims to be a vendor neutral, timing driven, FOSS FPGA place and route tool.
Currently nextpnr supports:
There is some work in progress towards support for Xilinx devices but it is not upstream and not intended for end users at the present time. We hope to see more FPGA families supported in the future. We would love your help in developing this awesome new project!
A brief (academic) paper describing the Yosys+nextpnr flow can be found on arXiv.
Here is a screenshot of nextpnr for iCE40. Build instructions and getting started notes can be found below.
See also:
The following packages need to be installed for building nextpnr, independent of the selected architecture:
clang-format
required for development)python3-dev
for Ubuntu)
nextpnr-himbaechel
libboost-dev libboost-filesystem-dev libboost-thread-dev libboost-program-options-dev libboost-iostreams-dev libboost-dev
or libboost-all-dev
for Ubuntu)libeigen3-dev
for Ubuntu) is required to build the analytic placervcpkg install boost-filesystem boost-program-options boost-thread eigen3
vcpkg install boost-filesystem:x64-windows boost-program-options:x64-windows boost-thread:x64-windows eigen3:x64-windows
-static
to each of the package names. For example, change eigen3:x64-windows
to eigen3:x64-windows-static
python36.zip
within the embeddable zip file to a new directory called "Lib".brew install cmake python boost eigen
For iCE40 support, install Project IceStorm to /usr/local
or another location, which should be passed as -DICESTORM_INSTALL_PREFIX=/usr
to CMake. Then build and install nextpnr-ice40
using the following commands:
cmake . -DARCH=ice40
make -j$(nproc)
sudo make install
On Windows, you may specify paths explicitly:
cmake . -DARCH=ice40 -DICESTORM_INSTALL_PREFIX=C:/ProgramData/icestorm -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -G "Visual Studio 15 2017 Win64" -DPython3_EXECUTABLE=C:/Python364/python.exe -DPython3_LIBRARY=C:/vcpkg/packages/python3_x64-windows/lib/python36.lib -DPython3_INCLUDE_DIR=C:/vcpkg/packages/python3_x64-windows/include/python3.6 .
cmake --build . --config Release
To build a static release, change the target triplet from x64-windows
to x64-windows-static
and add -DBUILD_STATIC=ON
.
A simple example that runs on the iCEstick dev board can be found in ice40/examples/blinky/blinky.*
.
Usage example:
cd ice40/examples/blinky
yosys -p 'synth_ice40 -top blinky -json blinky.json' blinky.v # synthesize into blinky.json
nextpnr-ice40 --hx1k --json blinky.json --pcf blinky.pcf --asc blinky.asc # run place and route
icepack blinky.asc blinky.bin # generate binary bitstream file
iceprog blinky.bin # upload design to iCEstick
Running nextpnr in GUI mode (see below for instructions on building nextpnr with GUI support):
nextpnr-ice40 --json blinky.json --pcf blinky.pcf --asc blinky.asc --gui
(Use the toolbar buttons or the Python command console to perform actions such as pack, place, route, and write output files.)
For ECP5 support, install Project Trellis to /usr/local
or another location, which should be passed as -DTRELLIS_INSTALL_PREFIX=/usr/local
to CMake. Then build and install nextpnr-ecp5
using the following commands:
cmake . -DARCH=ecp5 -DTRELLIS_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
For Nexus support, install Project Oxide to $HOME/.cargo
or another location, which should be passed as -DOXIDE_INSTALL_PREFIX=$HOME/.cargo
to CMake. Then build and install nextpnr-nexus
using the following commands:
cmake . -DARCH=nexus -DOXIDE_INSTALL_PREFIX=$HOME/.cargo
make -j$(nproc)
sudo make install
Nexus support is currently experimental, and has only been tested with engineering sample silicon.
The generic target allows running placement and routing for arbitrary custom architectures.
cmake . -DARCH=generic
make -j$(nproc)
sudo make install
An example of how to use the generic flow is in generic/examples. See also the Generic Architecture docs.
The himbaechel target allows running placement and routing for larger architectures that share a common structure.
For Gowin support, install Project Apicula
cmake . -DARCH="himbaechel" -DHIMBAECHEL_GOWIN_DEVICES="all"
make -j$(nproc)
sudo make install
The nextpnr GUI is not built by default, to reduce the number of dependencies for a standard headless build. To enable it, add -DBUILD_GUI=ON
to the CMake command line and ensure that Qt5 and OpenGL are available:
qtcreator qtbase5-dev qt5-qmake
qt5-default
qt5-base
(32-bit) or qt5-base:x64-windows
(64-bit)qt5
and add qt5 in path: echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile
To build nextpnr for multiple architectures at once, a semicolon-separated list can be used with -DARCH
.
cmake . -DARCH="ice40;ecp5"
make -j$(nproc)
sudo make install
To build every available stable architecture, use -DARCH=all
. To include experimental arches (currently nexus), use -DARCH=all+alpha
.
It is possible to pre-generate chip databases (.bba
files). This can come in handy when building on time-constrained cloud instances, or in situations where Python is unable to use modules. To do this, build the architecture as a standalone project, which will produce the chip database alone. For example, for iCE40:
cd ice40
cmake .
make
This will create a chipdb
directory with .bba
files. Provide the path to this directory when building nextpnr by using -D<arch>_CHIPDB=/path/to/chipdb
.
Apart from chip databases, nextpnr requires the bba
tool to be compiled for the build system. This tool can be compiled as a separate project:
cd bba
cmake .
make
This will create a bba-export.cmake
file. Provide the path to this file when cross-building nextpnr by using -DBBA_IMPORT=/path/to/bba-export.cmake
.
The following runs a debug build of the iCE40 architecture without GUI, without Python support, without the HeAP analytic placer and only HX1K support:
cmake . -DARCH=ice40 -DCMAKE_BUILD_TYPE=Debug -DBUILD_PYTHON=OFF -DICE40_HX1K_ONLY=1
make -j$(nproc)
To make static build release for iCE40 architecture use the following:
cmake . -DARCH=ice40 -DBUILD_PYTHON=OFF -DSTATIC_BUILD=ON
make -j$(nproc)
The HeAP placer's solver can optionally use OpenMP for a speedup on very large designs. Enable this by passing -DUSE_OPENMP=yes
to cmake (compiler support may vary).
You can change the location where nextpnr will be installed (this will usually default to /usr/local
) by using -DCMAKE_INSTALL_PREFIX=/install/prefix
.
clang-format
according to the style rules in .clang-format
(LLVM based withmake clangformat
.ffmpeg -f image2 -r 1 -i movie_%05d.png -c:v libx264 nextpnr.mp4
-DBUILD_TESTS=ON
and after make
run make test
to run them, or you can run separate binaries.cmake
options:
-DSANITIZE_ADDRESS=ON
-DSANITIZE_MEMORY=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
-DSANITIZE_THREAD=ON
-DSANITIZE_UNDEFINED=ON
valgrind --leak-check=yes --tool=memcheck ./nextpnr-ice40 --json ice40/blinky.json
-DBUILD_TESTS=ON -DCOVERAGE
and after make
run make ice40-coverage
ice40-coverage/index.html
in your browser to view the coverage reportlcov
is needed in order to generate reports