aboutsummaryrefslogtreecommitdiffstats
path: root/fpga_interchange
diff options
context:
space:
mode:
authorgatecat <gatecat@ds0.me>2021-03-25 12:51:19 +0000
committergatecat <gatecat@ds0.me>2021-03-30 16:31:51 +0100
commitecfaae7f9ea9bfad4b9af08495ac72cb5f6972ec (patch)
treee8a13f1726289990439ce968ca14ccbe6860ce5b /fpga_interchange
parentb6b89593971bcddc874b3839dc5d107f975f1404 (diff)
downloadnextpnr-ecfaae7f9ea9bfad4b9af08495ac72cb5f6972ec.tar.gz
nextpnr-ecfaae7f9ea9bfad4b9af08495ac72cb5f6972ec.tar.bz2
nextpnr-ecfaae7f9ea9bfad4b9af08495ac72cb5f6972ec.zip
interchange: Add Nexus LUT test
Signed-off-by: gatecat <gatecat@ds0.me>
Diffstat (limited to 'fpga_interchange')
-rw-r--r--fpga_interchange/examples/chipdb.cmake86
-rw-r--r--fpga_interchange/examples/tests.cmake40
-rw-r--r--fpga_interchange/examples/tests/CMakeLists.txt1
-rw-r--r--fpga_interchange/examples/tests/lut_nexus/CMakeLists.txt10
-rw-r--r--fpga_interchange/examples/tests/lut_nexus/empty.xdc0
-rw-r--r--fpga_interchange/examples/tests/lut_nexus/lut.v7
-rw-r--r--fpga_interchange/examples/tests/lut_nexus/run.tcl14
7 files changed, 139 insertions, 19 deletions
diff --git a/fpga_interchange/examples/chipdb.cmake b/fpga_interchange/examples/chipdb.cmake
index 5ac0ce78..201c9bac 100644
--- a/fpga_interchange/examples/chipdb.cmake
+++ b/fpga_interchange/examples/chipdb.cmake
@@ -108,6 +108,8 @@ function(create_prjoxide_device_db)
interchange-export
${device}
${prjoxide_device_db}
+ DEPENDS
+ ${PRJOXIDE_PREFIX}/bin/prjoxide
)
add_custom_target(prjoxide-${device}-device DEPENDS ${prjoxide_device_db})
@@ -208,6 +210,80 @@ function(create_patched_device_db)
endif()
endfunction()
+function(patch_device_with_prim_lib)
+ # ~~~
+ # patch_device_with_prim_lib(
+ # device <common device>
+ # yosys_script <yosys script>
+ # input_device <input device target>
+ # output_target <output device target>
+ # )
+ # ~~~
+ #
+ # Generates a patched device database starting from an input device
+ #
+ # If output_target is specified, the variable named as the output_target
+ # parameter value is set to the generated output_device_file target.
+ #
+ # Arguments:
+ # - device: common device name of a set of parts. E.g. xc7a35tcsg324-1 and xc7a35tcpg236-1
+ # share the same xc7a35t device prefix.
+ # - yosys_script: yosys script to produce cell library
+ # - input_device: target for the device that needs to be patched
+ # - output_target: variable name that will hold the output device target for the parent scope
+ #
+ # Targets generated:
+ # - prims-<device>-device
+
+ set(options)
+ set(oneValueArgs device yosys_script input_device output_target)
+ set(multiValueArgs)
+
+ cmake_parse_arguments(
+ patch_device_with_prim_lib
+ "${options}"
+ "${oneValueArgs}"
+ "${multiValueArgs}"
+ ${ARGN}
+ )
+
+ set(device ${patch_device_with_prim_lib_device})
+ set(yosys_script ${patch_device_with_prim_lib_yosys_script})
+ set(input_device ${patch_device_with_prim_lib_input_device})
+ set(output_target ${patch_device_with_prim_lib_output_target})
+
+ get_target_property(input_device_loc ${input_device} LOCATION)
+ set(output_device_file ${CMAKE_CURRENT_BINARY_DIR}/${device}_prim_lib.device)
+ set(output_json_file ${CMAKE_CURRENT_BINARY_DIR}/${device}_prim_lib.json)
+
+ add_custom_command(
+ OUTPUT ${output_json_file}
+ COMMAND
+ yosys -p '${yosys_script}\; write_json ${output_json_file}'
+ )
+
+ add_custom_command(
+ OUTPUT ${output_device_file}
+ COMMAND
+ ${PYTHON_EXECUTABLE} -mfpga_interchange.add_prim_lib
+ --schema_dir ${INTERCHANGE_SCHEMA_PATH}
+ ${input_device_loc}
+ ${output_json_file}
+ ${output_device_file}
+ DEPENDS
+ ${input_device}
+ ${input_device_loc}
+ ${output_json_file}
+ )
+
+ add_custom_target(prims-${device}-device DEPENDS ${output_device_file})
+ set_property(TARGET prims-${device}-device PROPERTY LOCATION ${output_device_file})
+
+ if (DEFINED output_target)
+ set(${output_target} prims-${device}-device PARENT_SCOPE)
+ endif()
+endfunction()
+
function(generate_xc7_device_db)
# ~~~
# generate_xc7_device_db(
@@ -316,10 +392,16 @@ function(generate_nexus_device_db)
output_target prjoxide_device
)
- # TODO: any patching that is needed
+ # Add primitive library
+ patch_device_with_prim_lib(
+ device ${device}
+ yosys_script synth_nexus
+ input_device ${prjoxide_device}
+ output_target prjoxide_prims_device
+ )
if(DEFINED device_target)
- set(${device_target} ${prjoxide_device} PARENT_SCOPE)
+ set(${device_target} ${prjoxide_prims_device} PARENT_SCOPE)
endif()
endfunction()
diff --git a/fpga_interchange/examples/tests.cmake b/fpga_interchange/examples/tests.cmake
index 115b4a36..930682a5 100644
--- a/fpga_interchange/examples/tests.cmake
+++ b/fpga_interchange/examples/tests.cmake
@@ -34,7 +34,7 @@ function(add_interchange_test)
# - test-fpga_interchange-<name>-phys : interchange physical netlist
# - test-fpga_interchange-<name>-dcp : design checkpoint with RapidWright
- set(options)
+ set(options skip_dcp)
set(oneValueArgs name family device package tcl xdc top techmap)
set(multiValueArgs sources)
@@ -50,6 +50,7 @@ function(add_interchange_test)
set(family ${add_interchange_test_family})
set(device ${add_interchange_test_device})
set(package ${add_interchange_test_package})
+ set(skip_dcp ${add_interchange_test_skip_dcp})
set(top ${add_interchange_test_top})
set(tcl ${CMAKE_CURRENT_SOURCE_DIR}/${add_interchange_test_tcl})
set(xdc ${CMAKE_CURRENT_SOURCE_DIR}/${add_interchange_test_xdc})
@@ -246,23 +247,28 @@ function(add_interchange_test)
add_custom_target(test-${family}-${name}-phys-yaml DEPENDS ${phys_yaml})
- set(dcp ${CMAKE_CURRENT_BINARY_DIR}/${name}.dcp)
- add_custom_command(
- OUTPUT ${dcp}
- COMMAND
- RAPIDWRIGHT_PATH=${RAPIDWRIGHT_PATH}
- ${INVOKE_RAPIDWRIGHT} ${JAVA_HEAP_SPACE}
- com.xilinx.rapidwright.interchange.PhysicalNetlistToDcp
- ${netlist} ${phys} ${xdc} ${dcp}
- DEPENDS
- ${INVOKE_RAPIDWRIGHT}
- ${phys}
- ${netlist}
- )
+ if(skip_dcp)
+ add_dependencies(all-${family}-tests test-${family}-${name}-phys-yaml)
+ add_dependencies(all-${device}-tests test-${family}-${name}-phys-yaml)
+ else()
+ set(dcp ${CMAKE_CURRENT_BINARY_DIR}/${name}.dcp)
+ add_custom_command(
+ OUTPUT ${dcp}
+ COMMAND
+ RAPIDWRIGHT_PATH=${RAPIDWRIGHT_PATH}
+ ${INVOKE_RAPIDWRIGHT} ${JAVA_HEAP_SPACE}
+ com.xilinx.rapidwright.interchange.PhysicalNetlistToDcp
+ ${netlist} ${phys} ${xdc} ${dcp}
+ DEPENDS
+ ${INVOKE_RAPIDWRIGHT}
+ ${phys}
+ ${netlist}
+ )
- add_custom_target(test-${family}-${name}-dcp DEPENDS ${dcp})
- add_dependencies(all-${family}-tests test-${family}-${name}-dcp)
- add_dependencies(all-${device}-tests test-${family}-${name}-dcp)
+ add_custom_target(test-${family}-${name}-dcp DEPENDS ${dcp})
+ add_dependencies(all-${family}-tests test-${family}-${name}-dcp)
+ add_dependencies(all-${device}-tests test-${family}-${name}-dcp)
+ endif()
endfunction()
function(add_interchange_group_test)
diff --git a/fpga_interchange/examples/tests/CMakeLists.txt b/fpga_interchange/examples/tests/CMakeLists.txt
index 40ec8a75..f58adc70 100644
--- a/fpga_interchange/examples/tests/CMakeLists.txt
+++ b/fpga_interchange/examples/tests/CMakeLists.txt
@@ -4,3 +4,4 @@ add_subdirectory(counter)
add_subdirectory(ram)
add_subdirectory(ff)
add_subdirectory(lut)
+add_subdirectory(lut_nexus)
diff --git a/fpga_interchange/examples/tests/lut_nexus/CMakeLists.txt b/fpga_interchange/examples/tests/lut_nexus/CMakeLists.txt
new file mode 100644
index 00000000..1c65d87e
--- /dev/null
+++ b/fpga_interchange/examples/tests/lut_nexus/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_interchange_test(
+ name lut_nexus
+ family ${family}
+ device LIFCL-17
+ package QFN72
+ tcl run.tcl
+ xdc empty.xdc
+ sources lut.v
+ skip_dcp
+)
diff --git a/fpga_interchange/examples/tests/lut_nexus/empty.xdc b/fpga_interchange/examples/tests/lut_nexus/empty.xdc
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/fpga_interchange/examples/tests/lut_nexus/empty.xdc
diff --git a/fpga_interchange/examples/tests/lut_nexus/lut.v b/fpga_interchange/examples/tests/lut_nexus/lut.v
new file mode 100644
index 00000000..5913aff1
--- /dev/null
+++ b/fpga_interchange/examples/tests/lut_nexus/lut.v
@@ -0,0 +1,7 @@
+module top;
+ wire x, y;
+ (*keep*)
+ LUT4 lut_0(.A(x), .B(x), .C(x), .D(x), .Z(y));
+ (*keep*)
+ LUT4 lut_1(.A(y), .B(y), .C(y), .D(y), .Z(x));
+endmodule \ No newline at end of file
diff --git a/fpga_interchange/examples/tests/lut_nexus/run.tcl b/fpga_interchange/examples/tests/lut_nexus/run.tcl
new file mode 100644
index 00000000..4aa56c13
--- /dev/null
+++ b/fpga_interchange/examples/tests/lut_nexus/run.tcl
@@ -0,0 +1,14 @@
+yosys -import
+
+read_verilog $::env(SOURCES)
+
+synth_nexus -noccu2 -nobram -nolutram -nowidelut
+
+# opt_expr -undriven makes sure all nets are driven, if only by the $undef
+# net.
+opt_expr -undriven
+opt_clean
+
+setundef -zero -params
+
+write_json $::env(OUT_JSON)