blob: 866d62f277d3a48bfff9006f62ec2f434cf54a20 [file] [log] [blame]
set(
ICESTORM_DB
${f4pga-arch-defs_SOURCE_DIR}/third_party/icestorm/icebox/icebox.py
CACHE FILEPATH "Path to icebox.py module"
)
set(
ICEBOX_PATH
${f4pga-arch-defs_SOURCE_DIR}/third_party/icestorm/icebox
CACHE PATH "Path to icebox directory"
)
set(ICE_UTILS_DIR ${f4pga-arch-defs_SOURCE_DIR}/lattice/ice40/utils)
set(ICESTORM_LAYOUT_LIST ${ICE_UTILS_DIR}/ice40_list_layout_in_icebox.py)
set(ICESTORM_LAYOUT_IMPORT ${ICE_UTILS_DIR}/ice40_import_layout_from_icebox.py)
function(generate_all_icebox_layouts)
# Use system python during configure time. Conda is setup during build time.
execute_process(
COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${ICEBOX_PATH}
${PYTHON_EXECUTABLE} ${ICESTORM_LAYOUT_LIST}
OUTPUT_VARIABLE ICESTORM_LAYOUT_PARTS
RESULT_VARIABLE ERROR_CODE
ERROR_VARIABLE ERROR_MESSAGES
WORKING_DIRECTORY ${f4pga-arch-defs_SOURCE_DIR}/lattice/ice40/utils/
)
if(NOT ${ERROR_CODE} EQUAL 0)
message(FATAL_ERROR "Error getting layout list: ${ERROR_CODE} ${ERROR_MESSAGES}")
endif()
string(
REPLACE
"\n"
";"
ICESTORM_LAYOUT_PARTS_LIST
"${ICESTORM_LAYOUT_PARTS}"
)
set(OUTPUTS "")
foreach(PART ${ICESTORM_LAYOUT_PARTS_LIST})
list(APPEND OUTPUTS ${PART}.fixed_layout.xml)
list(APPEND OUTPUTS ${PART}.pinmap.csv)
endforeach()
get_target_property_required(PYTHON3 env PYTHON3)
get_target_property_required(QUIET_CMD env QUIET_CMD)
add_custom_command(
OUTPUT ${OUTPUTS}
COMMAND ${QUIET_CMD} ${CMAKE_COMMAND} -E env PYTHONPATH=${ICEBOX_PATH}:${PYUTILS_PATH}
${PYTHON3} ${ICESTORM_LAYOUT_IMPORT}
DEPENDS
${QUIET_CMD}
${PYTHON3}
${ICESTORM_LAYOUT_IMPORT} ${ICESTORM_LAYOUT_LIST} ${ICESTORM_DB}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
foreach(OUTPUT ${OUTPUTS})
add_file_target(FILE ${OUTPUT} GENERATED)
endforeach()
endfunction()
function(ADD_ICEBOX_LAYOUTS)
set(options)
set(oneValueArgs DEVICE PACKAGES)
set(multiValueArgs)
cmake_parse_arguments(
SET_ICEBOX_LAYOUT
"${options}"
"${oneValueArgs}"
"${multiValueArgs}"
${ARGN}
)
set(DEVICE ${SET_ICEBOX_LAYOUT_DEVICE})
get_target_property_required(ARCH ${DEVICE} ARCH)
foreach(PACKAGE ${SET_ICEBOX_LAYOUT_PACKAGES})
set(PINMAP ${f4pga-arch-defs_SOURCE_DIR}/lattice/ice40/devices/layouts/icebox/${DEVICE}.${PACKAGE}.pinmap.csv)
set_target_properties(
${DEVICE}
PROPERTIES
${PACKAGE}_PINMAP
${PINMAP}
)
# Set pinmap for dummy board
set_target_properties(
dummy_${ARCH}_${DEVICE}_${PACKAGE}
PROPERTIES
PINMAP ${PINMAP})
endforeach()
endfunction()
generate_all_icebox_layouts()