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()
