aboutsummaryrefslogtreecommitdiffstats
path: root/fpga_interchange/examples/tests.cmake
blob: a550fb8fad82927111031e6a5d804b4d8d9ac044 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
function(add_interchange_test)
    # ~~~
    # add_interchange_test(
    #    name <name>
    #    part <part>
    #    part <package>
    #    tcl <tcl>
    #    xdc <xdc>
    #    top <top name>
    #    sources <sources list>
    # )
    # ~~~

    set(options)
    set(oneValueArgs name part package tcl xdc top)
    set(multiValueArgs sources)

    cmake_parse_arguments(
        add_interchange_test
        "${options}"
        "${oneValueArgs}"
        "${multiValueArgs}"
        ${ARGN}
    )

    set(name ${add_interchange_test_name})
    set(part ${add_interchange_test_part})
    set(package ${add_interchange_test_package})
    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})

    set(sources)
    foreach(source ${add_interchange_test_sources})
        list(APPEND sources ${CMAKE_CURRENT_SOURCE_DIR}/${source})
    endforeach()

    if (NOT DEFINED top)
        # Setting default top value
        set(top "top")
    endif()

    # Synthesis
    set(synth_json ${CMAKE_CURRENT_BINARY_DIR}/${name}.json)
    add_custom_command(
        OUTPUT ${synth_json}
        COMMAND
            SOURCES=${sources}
            OUT_JSON=${synth_json}
            yosys -c ${tcl}
        DEPENDS ${sources}
    )

    add_custom_target(test-${family}-${name}-json DEPENDS ${synth_json})

    # Logical Netlist
    set(device_target constraints-luts-${part}-device)
    get_property(device_loc TARGET constraints-luts-${part}-device PROPERTY LOCATION)

    set(netlist ${CMAKE_CURRENT_BINARY_DIR}/${name}.netlist)
    add_custom_command(
        OUTPUT ${netlist}
        COMMAND
            python3 -mfpga_interchange.yosys_json
                --schema_dir ${INTERCHANGE_SCHEMA_PATH}
                --device ${device_loc}
                --top ${top}
                ${synth_json}
                ${netlist}
        DEPENDS
            ${synth_json}
            ${device_target}
    )

    add_custom_target(test-${family}-${name}-netlist DEPENDS ${netlist})

    set(chipdb_target chipdb-${part}-bba)

    # Physical Netlist
    set(phys ${CMAKE_CURRENT_BINARY_DIR}/${name}.phys)
    add_custom_command(
        OUTPUT ${phys}
        COMMAND
            nextpnr-fpga_interchange
                --chipdb ${chipdb_dir}/chipdb-${part}.bba
                --xdc ${xdc}
                --netlist ${netlist}
                --phys ${phys}
                --package ${package}
        DEPENDS
            ${netlist}
            ${chipdb_target}
    )

    add_custom_target(test-${family}-${name}-phys DEPENDS ${phys})

    set(dcp ${CMAKE_CURRENT_BINARY_DIR}/${name}.dcp)
    add_custom_command(
        OUTPUT ${dcp}
        COMMAND
            RAPIDWRIGHT_PATH=${RAPIDWRIGHT_PATH}
            ${RAPIDWRIGHT_PATH}/scripts/invoke_rapidwright.sh
            com.xilinx.rapidwright.interchange.PhysicalNetlistToDcp
            ${netlist} ${phys} ${xdc} ${dcp}
        DEPENDS
            ${phys}
            ${netlist}
    )

    add_custom_target(test-${family}-${name}-dcp DEPENDS ${dcp})
    add_dependencies(all-${family}-tests test-${family}-${name}-dcp)
endfunction()

add_custom_target(all-${family}-tests)
add_subdirectory(${family}/examples/tests)