| function(ADD_OPENOCD_OUTPUT) |
| # ~~~ |
| # ADD_OPENOCD_OUTPUT( |
| # PARENT <fpga target name> |
| # IOMUX_JSON <json iomux config> |
| # ) |
| # ~~~ |
| set(options) |
| set(oneValueArgs PARENT IOMUX_JSON) |
| set(multiValueArgs) |
| cmake_parse_arguments( |
| ADD_OPENOCD_OUTPUT |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| ${ARGN} |
| ) |
| |
| set(PARENT ${ADD_OPENOCD_OUTPUT_PARENT}) |
| set(IOMUX_JSON ${ADD_OPENOCD_OUTPUT_IOMUX_JSON}) |
| |
| get_target_property_required(PYTHON3 env PYTHON3) |
| |
| get_target_property_required(EBLIF ${PARENT} EBLIF) |
| get_target_property_required(PCF ${PARENT} INPUT_IO_FILE) |
| get_target_property_required(BITSTREAM ${PARENT} BIT) |
| get_target_property_required(TOP ${PARENT} TOP) |
| |
| # Get the output directory |
| get_file_location(BITSTREAM_LOC ${BITSTREAM}) |
| get_filename_component(WORK_DIR ${BITSTREAM_LOC} DIRECTORY) |
| file(RELATIVE_PATH WORK_DIR_REL ${CMAKE_CURRENT_BINARY_DIR} ${WORK_DIR}) |
| |
| get_file_location(EBLIF_LOC ${EBLIF}) |
| get_file_location(PCF_LOC ${PCF}) |
| get_target_property_required(BOARD ${PARENT} BOARD) |
| |
| set(PINMAP ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/pp3/${BOARD}_pinmap.csv) |
| get_file_target(PINMAP_TARGET ${PINMAP}) |
| get_file_location(PINMAP_LOC ${PINMAP}) |
| |
| # Generate a OpenOCD script that sets IOMUX configuration. |
| set(IOMUX_CONFIG "${TOP}_iomux.openocd") |
| |
| set(IOMUX_CONFIG_DEPS) |
| set(IOMUX_CONFIG_ARGS "") |
| if(DEFINED IOMUX_JSON) |
| get_file_location(JSON_LOC ${IOMUX_JSON}) |
| get_file_target(JSON_DEP ${IOMUX_JSON}) |
| set(IOMUX_CONFIG_ARGS --json ${JSON_LOC}) |
| set(IOMUX_CONFIG_DEPS ${JSON_DEP}) |
| else() |
| set(IOMUX_CONFIG_ARGS --eblif ${EBLIF_LOC} --pcf ${PCF_LOC}) |
| set(IOMUX_CONFIG_DEPS ${EBLIF} ${PCF}) |
| endif() |
| |
| add_custom_command( |
| OUTPUT ${WORK_DIR}/${IOMUX_CONFIG} |
| COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${f4pga-arch-defs_SOURCE_DIR}/utils:$PYTHONPATH |
| python3 -m f4pga.utils.quicklogic.pp3.eos-s3.iomux_config |
| ${IOMUX_CONFIG_ARGS} |
| --map ${PINMAP_LOC} |
| --output-format openocd |
| >${WORK_DIR}/${IOMUX_CONFIG} |
| DEPENDS ${IOMUX_CONFIG_DEPS} ${PINMAP_TARGET} |
| ) |
| |
| add_file_target(FILE ${WORK_DIR_REL}/${IOMUX_CONFIG} GENERATED) |
| |
| # Convert the binary bitstream to a OpenOCD script |
| set(OUT_OPENOCD "${TOP}.openocd") |
| |
| add_custom_command( |
| OUTPUT ${WORK_DIR}/${OUT_OPENOCD} |
| COMMAND ${PYTHON3} -m quicklogic_fasm.bitstream_to_openocd ${BITSTREAM_LOC} ${WORK_DIR}/${OUT_OPENOCD} |
| DEPENDS ${BITSTREAM} ${WORK_DIR}/${IOMUX_CONFIG} |
| ) |
| |
| add_file_target(FILE ${WORK_DIR_REL}/${OUT_OPENOCD} GENERATED) |
| |
| add_custom_target(${PARENT}_openocd DEPENDS ${WORK_DIR}/${OUT_OPENOCD}) |
| |
| set(VERIFY_SCRIPT ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/pp3/utils/verify_jlink_openocd.sh) |
| set(DUPLICATES_OPENOCD "duplicates.openocd") |
| add_custom_command( |
| OUTPUT ${WORK_DIR}/${DUPLICATES_OPENOCD} |
| COMMAND ${VERIFY_SCRIPT} ${WORK_DIR}/${OUT_OPENOCD} ${WORK_DIR}/${DUPLICATES_OPENOCD} |
| DEPENDS ${WORK_DIR}/${OUT_OPENOCD} |
| ) |
| |
| add_file_target(FILE ${WORK_DIR_REL}/${DUPLICATES_OPENOCD} GENERATED) |
| add_custom_target(${PARENT}_openocd_test DEPENDS ${WORK_DIR}/${DUPLICATES_OPENOCD}) |
| |
| endfunction() |