diff options
| author | gatecat <gatecat@ds0.me> | 2021-03-25 12:51:19 +0000 | 
|---|---|---|
| committer | gatecat <gatecat@ds0.me> | 2021-03-30 16:31:51 +0100 | 
| commit | ecfaae7f9ea9bfad4b9af08495ac72cb5f6972ec (patch) | |
| tree | e8a13f1726289990439ce968ca14ccbe6860ce5b /fpga_interchange | |
| parent | b6b89593971bcddc874b3839dc5d107f975f1404 (diff) | |
| download | nextpnr-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.cmake | 86 | ||||
| -rw-r--r-- | fpga_interchange/examples/tests.cmake | 40 | ||||
| -rw-r--r-- | fpga_interchange/examples/tests/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | fpga_interchange/examples/tests/lut_nexus/CMakeLists.txt | 10 | ||||
| -rw-r--r-- | fpga_interchange/examples/tests/lut_nexus/empty.xdc | 0 | ||||
| -rw-r--r-- | fpga_interchange/examples/tests/lut_nexus/lut.v | 7 | ||||
| -rw-r--r-- | fpga_interchange/examples/tests/lut_nexus/run.tcl | 14 | 
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) | 
