function(ADD_JLINK_OUTPUT)
  # ~~~
  # ADD_JLINK_OUTPUT(
  #   PARENT <fpga target name>
  #   IOMUX_JSON <json iomux config>
  #   )
  # ~~~
  set(options)
  set(oneValueArgs PARENT IOMUX_JSON)
  set(multiValueArgs)
  cmake_parse_arguments(
    ADD_JLINK_OUTPUT
    "${options}"
    "${oneValueArgs}"
    "${multiValueArgs}"
    ${ARGN}
  )

  set(PARENT ${ADD_JLINK_OUTPUT_PARENT})
  set(IOMUX_JSON ${ADD_JLINK_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 JLINK script that sets IOMUX configuration.
  set(IOMUX_CONFIG "${TOP}_iomux.jlink")

  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 jlink
        >${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 JLINK script
  set(OUT_JLINK "${TOP}.jlink")
  add_custom_command(
    OUTPUT ${WORK_DIR}/${OUT_JLINK}
    COMMAND ${PYTHON3} -m quicklogic_fasm.bitstream_to_jlink ${BITSTREAM_LOC} ${WORK_DIR}/${OUT_JLINK}
    DEPENDS ${BITSTREAM} ${WORK_DIR}/${IOMUX_CONFIG}
  )

  add_file_target(FILE ${WORK_DIR_REL}/${OUT_JLINK} GENERATED)

  add_custom_target(${PARENT}_jlink DEPENDS ${WORK_DIR}/${OUT_JLINK})


  set(DESIGN_CMDS "jlink_cmds.txt")
  set(OUT_JLINK_COPY "jlink_cmds_copy.txt")
  set(JLINK_SCRIPT "jlink_script.sh")
  set(JLINK_GOLD "jlink_out_gold")
  add_custom_command(
    OUTPUT ${WORK_DIR}/${OUT_JLINK_COPY}
    DEPENDS ${WORK_DIR}/${OUT_JLINK} ${DESIGN_CMDS} ${JLINK_SCRIPT} ${JLINK_GOLD}
  )

  add_custom_target(${PARENT}_jlink_copy DEPENDS ${WORK_DIR}/${OUT_JLINK_COPY} )

  set(OUT_JLINK_HARDWARE "${TOP}.jlink_hardware")
  set(JLINK_EXE "/usr/bin/JLinkExe")
  add_custom_command(
    OUTPUT ${WORK_DIR}/${OUT_JLINK_HARDWARE}
    COMMAND cp ${WORK_DIR}/${OUT_JLINK} ${WORK_DIR}/../../${OUT_JLINK}
    COMMAND bash ${WORK_DIR}/../../${JLINK_SCRIPT}
    COMMAND ${JLINK_EXE} -Device Cortex-M4 -If SWD -Speed 4000 -commandFile "${TOP}.jlink"
    COMMAND ${JLINK_EXE} -Device Cortex-M4 -If SWD -Speed 4000 -commandFile "jlink_cmds.txt" >jlink_out
    COMMAND sed -i '/VTref/d' jlink_out
    COMMAND diff jlink_out jlink_out_gold > top.jlink_hardware 2>&1
    DEPENDS ${WORK_DIR}/${OUT_JLINK}
  )

  add_custom_target(${PARENT}_jlink_hardware DEPENDS ${PARENT}_jlink_copy ${WORK_DIR}/${OUT_JLINK_HARDWARE})

  set(VERIFY_SCRIPT ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/pp3/utils/verify_jlink_openocd.sh)
  set(DUPLICATES_JLINK "duplicates.jlink")
  add_custom_command(
    OUTPUT ${WORK_DIR}/${DUPLICATES_JLINK}
    COMMAND ${VERIFY_SCRIPT} ${WORK_DIR}/${OUT_JLINK} ${WORK_DIR}/${DUPLICATES_JLINK}
    DEPENDS ${WORK_DIR}/${OUT_JLINK}
  )

  add_file_target(FILE ${WORK_DIR_REL}/${DUPLICATES_JLINK} GENERATED)
  add_custom_target(${PARENT}_jlink_test DEPENDS ${WORK_DIR}/${DUPLICATES_JLINK})

endfunction()
