function(QUICKLOGIC_DEFINE_QLF_ARCH)
  # ~~~
  # QUICKLOGIC_DEFINE_QLF_ARCH(
  #   FAMILY <family>
  #   ARCH <arch>
  #   VPR_ARGS <VPR args common to the architecture>
  #   ROUTE_CHAN_WIDTH <channel width>
  #
  # The ROUTE_CHAN_WIDTH parameter specifies the channel width for the
  # architecture. It may be overriden per each device.

  set(options)
  set(oneValueArgs FAMILY ARCH ROUTE_CHAN_WIDTH)
  set(multiValueArgs VPR_ARGS)

  cmake_parse_arguments(
    QUICKLOGIC_DEFINE_QLF_ARCH
    "${options}"
    "${oneValueArgs}"
    "${multiValueArgs}"
    ${ARGN}
  )

  set(FAMILY   ${QUICKLOGIC_DEFINE_QLF_ARCH_FAMILY})
  set(ARCH     ${QUICKLOGIC_DEFINE_QLF_ARCH_ARCH})
  set(VPR_ARGS ${QUICKLOGIC_DEFINE_QLF_ARCH_VPR_ARGS})

  set(FAMILY_DIR ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/${FAMILY})

  get_target_property_required(QLF_FASM env QLF_FASM)

  if("${FAMILY}" STREQUAL "qlf_k4n8")
    set(REPACKER_PATH "python3 -m f4pga.utils.quicklogic.repacker.repack")
  else()
    set(REPACKER_PATH )
  endif()

  set(ARCH_DIR ${QLF_FPGA_PLUGINS_DIR}/${ARCH})
  set(ARCH_DIR_REL ${QLF_FPGA_DATABASE_DIR}/${ARCH})
  set(QLFPGA_FASM_DATABASE_LOC ${ARCH_DIR}/fasm_database)
  set(QLFPGA_FASM_DATABASE_LOC_REL ${f4pga-arch-defs_BINARY_DIR}/${ARCH_DIR_REL}/fasm_database)

  set(FASM_TO_BIT_DEPS "")
  append_file_dependency(FASM_TO_BIT_DEPS /${QLFPGA_FASM_DATABASE_LOC})

  # Define the architecture
  define_arch(
    FAMILY ${FAMILY}
    ARCH ${ARCH}
    YOSYS_TECHMAP ${FAMILY_DIR}/techmap
    DEVICE_FULL_TEMPLATE \${DEVICE}
    VPR_ARCH_ARGS ${VPR_ARGS}
    CELLS_SIM ${FAMILY_DIR}/techmap/cells_sim.v

    RR_GRAPH_EXT ".bin"

    # FIXME: Make common for k4n8 and k6n10
    PLACE_TOOL_CMD "${CMAKE_COMMAND} -E env \
      PYTHONPATH=${f4pga-arch-defs_SOURCE_DIR}/utils:$PYTHONPATH:${f4pga-arch-defs_SOURCE_DIR}/quicklogic/common/utils \
      python3 -m f4pga.utils.quicklogic.qlf_k4n8.create_ioplace \
          --pinmap_xml \${PINMAP_XML} \
          --blif \${OUT_EBLIF} \
          --pcf \${INPUT_IO_FILE} \
          --net \${OUT_NET} \
          --csv_file \${PINMAP}"

    NO_TEST_PINS
    NO_PLACE_CONSTR

    SDC_PATCH_TOOL
      ${SDC_PATCH_TOOL}
    SDC_PATCH_TOOL_CMD "${CMAKE_COMMAND} -E env \
      PYTHONPATH=${f4pga-arch-defs_SOURCE_DIR}/utils \
      \${QUIET_CMD} \${PYTHON3} \${SDC_PATCH_TOOL} \
         --sdc-in \${IN_SDC} \
         --pcf \${INPUT_IO_FILE} \
         --eblif \${OUT_EBLIF} \
         --pin-map \${PINMAP} \
         --sdc-out \${OUT_SDC}"

    NET_PATCH_TOOL
      ${REPACKER_PATH}
    NET_PATCH_TOOL_CMD "${CMAKE_COMMAND} -E env \
      PYTHONPATH=${f4pga-arch-defs_SOURCE_DIR}/utils \
      \${QUIET_CMD} \${NET_PATCH_TOOL} \
         --net-in \${IN_NET} \
         --eblif-in \${IN_EBLIF} \
         --place-in \${IN_PLACE} \
         --net-out \${OUT_NET} \
         --eblif-out \${OUT_EBLIF} \
         --place-out \${OUT_PLACE} \
         --vpr-arch \${VPR_ARCH} \
         --log \${OUT_NET}.log \
         --log-level DEBUG \
         --absorb_buffer_luts on"

    BITSTREAM_EXTENSION bit
    FASM_TO_BIT ${QLF_FASM}
    FASM_TO_BIT_CMD "${CMAKE_COMMAND} -E env \
      PYTHONPATH=${f4pga-arch-defs_BINARY_DIR}/env/conda/lib/python3.7/site-packages \
      \${QUIET_CMD} \${FASM_TO_BIT} \
        --db-root ${QLFPGA_FASM_DATABASE_LOC_REL} \
        --assemble \
        --format 4byte \
        \${OUT_FASM} \
        \${OUT_BITSTREAM} "
    FASM_TO_BIT_DEPS ${FASM_TO_BIT_DEPS}

    BIN_EXTENSION bin
    BIT_TO_BIN ${QLF_FASM}
    BIT_TO_BIN_CMD "${CMAKE_COMMAND} -E env \
      PYTHONPATH=${f4pga-arch-defs_BINARY_DIR}/env/conda/lib/python3.7/site-packages \
      \${QUIET_CMD} \${FASM_TO_BIT} \
        --db-root ${QLFPGA_FASM_DATABASE_LOC_REL} \
        --assemble \
        --format txt \
        \${OUT_FASM} \
        \${OUT_BIN} "

    BIT_TO_FASM ${QLF_FASM}
    BIT_TO_FASM_CMD "${CMAKE_COMMAND} -E env \
      PYTHONPATH=${f4pga-arch-defs_BINARY_DIR}/env/conda/lib/python3.7/site-packages \
      \${QUIET_CMD} \${BIT_TO_FASM} \
        --db-root ${QLFPGA_FASM_DATABASE_LOC_REL} \
        --disassemble \
        --format 4byte \
        \${OUT_BITSTREAM} \
        \${OUT_BIT_FASM} "

    NO_BIT_TO_V
    NO_BIT_TIME
    USE_FASM

    ROUTE_CHAN_WIDTH ${QUICKLOGIC_DEFINE_QLF_ARCH_ROUTE_CHAN_WIDTH}
  )

endfunction()
