blob: 611f237a600b56dc8d7d20b5059430c18056550d [file] [log] [blame] [edit]
# This target makes Kokoro complat that the Ninja version is too low.
#add_custom_target(all_xc7_iologic_vivado_diff_fasm)
# =============================================================================
function(xc7_iologic_design)
# ~~~
# XC7_IOLOGIC_DESIGN (
# BOARD <board>
# IOB_TYPE <iob_type>
# [USE_IDELAY <boolean>]
# [ILOGIC_MODE <ilogic_mode>]
# [OLOGIC_MODE <ologic_mode>]
# )
# ~~~
#
# Generates a design that requires packing together an IOB+ILOGIC and
# IOB+OLOGIC for the given IOB type and ILOGIC/OLOGIC mode of operation
#
# Allowed IOB_TYPE values are:
# - IBUF
# - IBUFDS
# - OBUF
# - OBUFT
# - OBUFDS
# - OBUFTDS
# - IOBUF
# - IOBUFDS
#
# Allowed ILOGIC operation modes:
# - NONE (or not given)
# - ISERDES
#
# Allowed OLOGIC operation modes:
# - NONE (or not given)
# - OSERDES
#
# TODO: Add support for IDDR and ODDR
#
# The BOARD parameter specifies the pinout variant. Please refer to the
# generate.py script for the list of legal values.
#
# IMPORTANT: Please also note that designs generated by this function are
# not meant to run on an actual hardware!
#
# Parse arguments
set(OPTION_ARGS
)
set(ONE_VALUE_ARGS
BOARD
IOB_TYPE
USE_IDELAY
ILOGIC_MODE
OLOGIC_MODE
)
set(MULTI_VALUE_ARGS
)
cmake_parse_arguments(
XC7_IOLOGIC_DESIGN
"${OPTION_ARGS}"
"${ONE_VALUE_ARGS}"
"${MULTI_VALUE_ARGS}"
${ARGN}
)
# Get args
set(BOARD ${XC7_IOLOGIC_DESIGN_BOARD})
set(IOB_TYPE ${XC7_IOLOGIC_DESIGN_IOB_TYPE})
set(USE_IDELAY ${XC7_IOLOGIC_DESIGN_USE_IDELAY})
set(ILOGIC_MODE ${XC7_IOLOGIC_DESIGN_ILOGIC_MODE})
set(OLOGIC_MODE ${XC7_IOLOGIC_DESIGN_OLOGIC_MODE})
# Format the design name
set(DESIGN iologic_${IOB_TYPE})
if (${USE_IDELAY})
set(DESIGN ${DESIGN}_IDELAY)
endif()
if (ILOGIC_MODE)
set(DESIGN ${DESIGN}_${ILOGIC_MODE})
endif()
if (OLOGIC_MODE)
set(DESIGN ${DESIGN}_${OLOGIC_MODE})
endif()
# Generate the design
set(VERILOG_FILE ${DESIGN}.v)
set(PCF_FILE ${DESIGN}.pcf)
set(XDC_FILE ${DESIGN}.xdc)
add_file_target(FILE ${VERILOG_FILE} GENERATED)
add_file_target(FILE ${PCF_FILE} GENERATED)
add_file_target(FILE ${XDC_FILE} GENERATED)
set(IOLOGIC_OPTS "")
if (${USE_IDELAY})
set(IOLOGIC_OPTS ${IOLOGIC_OPTS} "--idelay")
endif()
if ("${ILOGIC_MODE}" STREQUAL "ISERDES")
set(IOLOGIC_OPTS ${IOLOGIC_OPTS} "--iserdes")
endif()
if ("${OLOGIC_MODE}" STREQUAL "OSERDES")
set(IOLOGIC_OPTS ${IOLOGIC_OPTS} "--oserdes")
endif()
add_custom_command(
OUTPUT ${VERILOG_FILE} ${PCF_FILE} ${XDC_FILE}
COMMAND ${PYTHON3} ${CMAKE_CURRENT_SOURCE_DIR}/generate.py
--board ${BOARD}
--iob ${IOB_TYPE}
-o ${DESIGN}
${IOLOGIC_OPTS}
DEPENDS ${PYTHON3} ${PYTHON3_TARGET} generate.py
)
# Add target
add_fpga_target(
NAME ${DESIGN}
BOARD ${BOARD}
INPUT_IO_FILE ${PCF_FILE}
INPUT_XDC_FILES ${XDC_FILE}
SOURCES ${VERILOG_FILE}
EXPLICIT_ADD_FILE_TARGET
)
add_vivado_target(
NAME ${DESIGN}_vivado
PARENT_NAME ${DESIGN}
XDC ${XDC_FILE}
)
# add_dependencies(all_xc7_iologic_vivado_diff_fasm ${DESIGN}_vivado_diff_fasm)
endfunction()
# =============================================================================
# Has to run on a chip with all IOBs bonded (eg. the "arty" board). Can be
# run on "basys3-bottom" once https://github.com/SymbiFlow/prjxray/issues/1329
# is fixed.
set(BOARD "arty-full")
# Generate all combinations
#
# Disabled for now. There are 32 combinations, most of them fail due to lack
# of correct pack-patterns.
#foreach(IOB_TYPE IBUF IBUFDS)
# foreach(USE_IDELAY 0 1)
# foreach(USE_ISERDES 0 1)
# xc7_iologic_design(${BOARD} ${IOB_TYPE} ${USE_IDELAY} ${USE_ISERDES} 0)
# endforeach()
# endforeach()
#endforeach()
#
#foreach(IOB_TYPE OBUF OBUFT OBUFDS OBUFTDS)
# foreach(USE_OSERDES 0 1)
# xc7_iologic_design(${BOARD} ${IOB_TYPE} 0 0 ${USE_OSERDES})
# endforeach()
#endforeach()
#
#foreach(IOB_TYPE IOBUF IOBUFDS)
# foreach(USE_IDELAY 0 1)
# foreach(USE_ISERDES 0 1)
# foreach(USE_OSERDES 0 1)
# xc7_iologic_design(${BOARD} ${IOB_TYPE} ${USE_IDELAY} ${USE_ISERDES} ${USE_OSERDES})
# endforeach()
# endforeach()
# endforeach()
#endforeach()
# These tests succeed:
# Inputs
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IBUF USE_IDELAY 0)
# Inouts
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUF USE_IDELAY 0)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUF USE_IDELAY 0 ILOGIC_MODE ISERDES OLOGIC_MODE OSERDES)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUF USE_IDELAY 1 ILOGIC_MODE ISERDES OLOGIC_MODE OSERDES)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUF USE_IDELAY 0 OLOGIC_MODE OSERDES)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUFDS USE_IDELAY 0)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUFDS USE_IDELAY 0 OLOGIC_MODE OSERDES)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUFDS USE_IDELAY 0 ILOGIC_MODE ISERDES)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUFDS USE_IDELAY 0 ILOGIC_MODE ISERDES OLOGIC_MODE OSERDES)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUFDS USE_IDELAY 1 ILOGIC_MODE ISERDES)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE IOBUFDS USE_IDELAY 1 ILOGIC_MODE ISERDES OLOGIC_MODE OSERDES)
# Outputs
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE OBUF)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE OBUF OLOGIC_MODE OSERDES)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE OBUFDS)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE OBUFDS OLOGIC_MODE OSERDES)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE OBUFTDS)
xc7_iologic_design(BOARD ${BOARD} IOB_TYPE OBUFTDS OLOGIC_MODE OSERDES)