fpga_intrchange: add cmake infrastructure to generate chipdbs

Signed-off-by: Alessandro Comodi <acomodi@antmicro.com>
This commit is contained in:
Alessandro Comodi 2021-03-12 12:25:41 +01:00
parent 701587241f
commit d77d0ff34a
6 changed files with 122 additions and 133 deletions

View File

@ -0,0 +1,112 @@
function(create_rapidwright_device_db)
set(options)
set(oneValueArgs part)
set(multiValueArgs)
cmake_parse_arguments(
create_rapidwright_device_db
"${options}"
"${oneValueArgs}"
"${multiValueArgs}"
${ARGN}
)
set(part ${create_rapidwright_device_db_part})
set(rapidwright_device_db ${CMAKE_CURRENT_BINARY_DIR}/${part}.device)
add_custom_command(
OUTPUT ${rapidwright_device_db}
COMMAND
RAPIDWRIGHT_PATH=${RAPIDWRIGHT_PATH}
${RAPIDWRIGHT_PATH}/scripts/invoke_rapidwright.sh
com.xilinx.rapidwright.interchange.DeviceResourcesExample
${part}
DEPENDS
${RAPIDWRIGHT_PATH}/scripts/invoke_rapidwright.sh
)
add_custom_target(rapidwright-${part}-device DEPENDS ${rapidwright_device_db})
set_property(TARGET rapidwright-${part}-device PROPERTY LOCATION ${rapidwright_device_db})
endfunction()
function(generate_chipdb)
set(options)
set(oneValueArgs part)
set(multiValueArgs)
cmake_parse_arguments(
generate_chipdb
"${options}"
"${oneValueArgs}"
"${multiValueArgs}"
${ARGN}
)
set(part ${generate_chipdb_part})
create_rapidwright_device_db(part ${part})
set(rapidwright_device_target rapidwright-${part}-device)
get_property(rapidwright_device_loc TARGET ${rapidwright_device_target} PROPERTY LOCATION)
set(constraints_device ${CMAKE_CURRENT_BINARY_DIR}/${part}_constraints.device)
add_custom_command(
OUTPUT ${constraints_device}
COMMAND
python3 -mfpga_interchange.patch
--schema_dir ${INTERCHANGE_SCHEMA_PATH}
--schema device
--patch_path constraints
--patch_format yaml
${rapidwright_device_loc}
${PYTHON_INTERCHANGE_PATH}/test_data/series7_constraints.yaml
${constraints_device}
DEPENDS
${rapidwright_device_target}
)
add_custom_target(constraints-${part}-device DEPENDS ${constraints_device})
set(constraints_luts_device ${CMAKE_CURRENT_BINARY_DIR}/${part}_constraints_luts.device)
add_custom_command(
OUTPUT ${constraints_luts_device}
COMMAND
python3 -mfpga_interchange.patch
--schema_dir ${INTERCHANGE_SCHEMA_PATH}
--schema device
--patch_path lutDefinitions
--patch_format yaml
${constraints_device}
${PYTHON_INTERCHANGE_PATH}/test_data/series7_luts.yaml
${constraints_luts_device}
DEPENDS
${constraints_device}
)
add_custom_target(constraints-luts-${part}-device DEPENDS ${constraints_luts_device})
set_property(TARGET constraints-luts-${part}-device PROPERTY LOCATION ${constraints_luts_device})
set(chipdb_bba ${chipdb_dir}/chipdb-${part}.bba)
add_custom_command(
OUTPUT ${chipdb_bba}
COMMAND
python3 -mfpga_interchange.nextpnr_emit
--schema_dir ${INTERCHANGE_SCHEMA_PATH}
--output_dir ${chipdb_dir}
--bel_bucket_seeds ${PYTHON_INTERCHANGE_PATH}/test_data/series7_bel_buckets.yaml
--device ${constraints_luts_device}
COMMAND
mv ${chipdb_dir}/chipdb.bba ${chipdb_bba}
DEPENDS
${constraints_luts_device}
)
add_custom_target(chipdb-${part}-bba DEPENDS ${chipdb_bba})
add_dependencies(chipdb-${family}-bbas chipdb-${part}-bba)
endfunction()
set(chipdb_dir ${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb)
file(MAKE_DIRECTORY ${chipdb_dir})
add_custom_target(chipdb-${family}-bbas)
add_subdirectory(${family}/examples/devices)

View File

@ -1,93 +0,0 @@
#
# nextpnr -- Next Generation Place and Route
#
# Copyright (C) 2021 Symbiflow Authors
#
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# This Makefile provides a streamlined way to create an example
# FPGA interchange BBA suitable for placing and routing on Xilinx A35 parts.
#
# FPGA interchange device database is generated via RapidWright.
#
# Currently FPGA interchange physical netlist (e.g. place and route route) to
# FASM support is not done, so bitstream generation relies on RapidWright to
# convert FPGA interchange logical and physical netlist into a Vivado DCP.
include ../common.mk
.DELETE_ON_ERROR:
.PHONY: all chipdb test debug_test
all: chipdb
build:
mkdir build
build/RapidWright: | build
cd build && git clone https://github.com/Xilinx/RapidWright.git
build/env: | build
python3 -mvenv build/env
build/python-fpga-interchange: | build
cd build && git clone https://github.com/SymbiFlow/python-fpga-interchange.git
build/fpga-interchange-schema: | build
cd build && git clone https://github.com/SymbiFlow/fpga-interchange-schema.git
build/.setup: | build/env build/fpga-interchange-schema build/python-fpga-interchange build/RapidWright
source build/env/bin/activate && \
cd build/python-fpga-interchange/ && \
pip install -r requirements.txt
touch build/.setup
$(NEXTPNR_PATH)/build:
mkdir $(NEXTPNR_PATH)/build
$(NEXTPNR_PATH)/build/bba/bbasm: | $(NEXTPNR_PATH)/build
cd $(NEXTPNR_PATH)/build && cmake -DARCH=fpga_interchange ..
make -j -C $(NEXTPNR_PATH)/build
build/nextpnr/fpga_interchange/chipdb.bba: build/.setup
mkdir -p build/nextpnr/fpga_interchange
source build/env/bin/activate && \
cd build/python-fpga-interchange/ && \
make \
-f Makefile.rapidwright \
NEXTPNR_PATH=$(realpath .)/build/nextpnr \
RAPIDWRIGHT_PATH=$(RAPIDWRIGHT_PATH) \
INTERCHANGE_PATH=$(INTERCHANGE_PATH)
$(BBA_PATH): $(NEXTPNR_PATH)/build/bba/bbasm build/nextpnr/fpga_interchange/chipdb.bba
$(NEXTPNR_PATH)/build/bba/bbasm -l build/nextpnr/fpga_interchange/chipdb.bba $(BBA_PATH)
chipdb: $(BBA_PATH)
test: chipdb
$(NEXTPNR_PATH)/build/nextpnr-fpga_interchange \
--chipdb $(BBA_PATH) \
--package csg324 \
--test
debug_test: chipdb
gdb --args $(NEXTPNR_PATH)/build/nextpnr-fpga_interchange \
--chipdb $(BBA_PATH) \
--package csg324 \
--test
clean:
rm -rf build

View File

@ -1,40 +0,0 @@
## Makefile-driven BBA creation
This Makefile will generate a Xilinx A35 chipdb if java, capnproto and
capnproto-java are installed.
### Installing dependencies
Install java and javac if not already installed:
```
# Or equivalent for your local system.
sudo apt-get install openjdk-10-jdk
```
Install capnproto if not already installed:
```
# Or equivalent for your local system.
sudo apt-get install capnproto libcapnp-dev
```
Install capnproto-java if not already installed:
```
git clone https://github.com/capnproto/capnproto-java.git
cd capnproto-java
make
sudo make install
```
### Instructions
Once dependencies are installed, just run "make". This should download
remaining dependencies and build the chipdb and build nextpnr if not built.
#### Re-building the chipdb
```
# Remove the text BBA
rm build/nextpnr/fpga_interchange/chipdb.bba
# Build the BBA
make
```

View File

@ -0,0 +1 @@
add_subdirectory(xc7a35t)

View File

@ -0,0 +1,2 @@
generate_chipdb(part xc7a35tcsg324-1)
generate_chipdb(part xc7a35tcpg236-1)

View File

@ -5,7 +5,14 @@ endif()
find_package(ZLIB REQUIRED)
set(RAPIDWRIGHT_PATH $ENV{HOME}/RapidWright CACHE PATH "Path to RapidWright")
# FIXME: Make patch data available in the python package and remove this cached var
set(PYTHON_INTERCHANGE_PATH $ENV{HOME}/python-fpga-interchange CACHE PATH "Path to the FPGA interchange python library")
set(INTERCHANGE_SCHEMA_PATH $ENV{HOME}/fpga_interchange_schema CACHE PATH "Path to the FPGA interchange schema dir")
add_subdirectory(3rdparty/fpga-interchange-schema/cmake/cxx_static)
include(${family}/examples/chipdb.cmake)
include(${family}/examples/tests.cmake)
foreach (target ${family_targets})
target_include_directories(${target} PRIVATE ${TCL_INCLUDE_PATH})