ADD_LIBRARY( JFJochHLSCores STATIC
        jf_conversion.cpp
        data_collection_fsm.cpp
        timer.cpp
        hls_jfjoch.h
        ../pcie_driver/jfjoch_fpga.h
        load_calibration.cpp
        host_writer.cpp
        ethernet.cpp
        ipv4.cpp
        icmp.cpp
        arp.cpp
        ip_header_checksum.h
        udp.cpp
        sls_detector.cpp
        frame_generator.cpp
        save_to_hbm.cpp
        load_from_hbm.cpp
        integration.cpp
        mask_missing.cpp
        spot_finder.cpp
        axis_broadcast.cpp
        adu_histo.cpp
        axis_helpers.cpp
        frame_summation.cpp
        frame_summation_reorder_compl.cpp
        stream512to768.cpp
        stream768to512.cpp
        spot_finder_merge.cpp
        spot_finder_connectivity.cpp
        spot_finder_mask.cpp
        save_to_hbm_data.cpp
        eiger_reorder.cpp
        roi_calc.cpp
        pixel_sqrt.cpp
        pixel_threshold.cpp
        pixel_mask.cpp
        pixel_calc.cpp
        ptp.cpp)

TARGET_COMPILE_DEFINITIONS(JFJochHLSCores PUBLIC -DJFJOCH_HLS_NOSYNTH)
TARGET_INCLUDE_DIRECTORIES(JFJochHLSCores SYSTEM PUBLIC ../include)

IF(VIVADO_HLS)
    IF(NOT HLS_SOLUTION_NAME)
        SET(HLS_SOLUTION_NAME base1)
    ENDIF()

    SET (HLS_IPS "")

    FUNCTION( MAKE_HLS_MODULE FUNCTION_NAME SRC_FILE TB_FILE)
        ADD_CUSTOM_COMMAND(OUTPUT psi_ch_hls_${FUNCTION_NAME}_1_0.zip
                COMMAND ${CMAKE_COMMAND} -E env SRC_DIR=${CMAKE_CURRENT_SOURCE_DIR} HLS_FILE=${SRC_FILE} HLS_TOP_FUNCTION=${FUNCTION_NAME} HLS_TB_FILE=${TB_FILE} ${VIVADO_HLS} -f ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/synth_hls_function.tcl > hls_${FUNCTION_NAME}.log
                COMMAND ${CMAKE_COMMAND} -E env HLS_DIR=${CMAKE_CURRENT_BINARY_DIR}/${FUNCTION_NAME}/solution1 CURR_DIR=${CMAKE_CURRENT_BINARY_DIR} bash ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/check_hls.sh ${FUNCTION_NAME}
                COMMAND ${CMAKE_COMMAND} -E copy ${FUNCTION_NAME}/solution1/impl/ip/psi_ch_hls_${FUNCTION_NAME}_1_0.zip .
                DEPENDS ${SRC_FILE} hls_jfjoch.h ../pcie_driver/jfjoch_fpga.h)
        SET (HLS_IPS ${HLS_IPS} psi_ch_hls_${FUNCTION_NAME}_1_0.zip PARENT_SCOPE)
    ENDFUNCTION(MAKE_HLS_MODULE)

    MAKE_HLS_MODULE(data_collection_fsm data_collection_fsm.cpp "")
    MAKE_HLS_MODULE(timer_host timer.cpp "")
    MAKE_HLS_MODULE(jf_conversion jf_conversion.cpp "")
    MAKE_HLS_MODULE(load_calibration load_calibration.cpp "")
    MAKE_HLS_MODULE(host_writer host_writer.cpp "")
    MAKE_HLS_MODULE(pixel_sqrt pixel_sqrt.cpp pixel_sqrt_tb.cpp)
    MAKE_HLS_MODULE(icmp icmp.cpp "")
    MAKE_HLS_MODULE(ipv4 ipv4.cpp "")
    MAKE_HLS_MODULE(ethernet ethernet.cpp "")
    MAKE_HLS_MODULE(arp arp.cpp "")
    MAKE_HLS_MODULE(udp udp.cpp "")
    MAKE_HLS_MODULE(ptp ptp.cpp "")
    MAKE_HLS_MODULE(sls_detector sls_detector.cpp "")
    MAKE_HLS_MODULE(frame_generator frame_generator.cpp "")
    MAKE_HLS_MODULE(load_from_hbm load_from_hbm.cpp "")
    MAKE_HLS_MODULE(save_to_hbm save_to_hbm.cpp "")
    MAKE_HLS_MODULE(save_to_hbm_data save_to_hbm_data.cpp "")
    MAKE_HLS_MODULE(mask_missing mask_missing.cpp "")
    MAKE_HLS_MODULE(integration integration.cpp integration_tb.cpp)
    MAKE_HLS_MODULE(spot_finder spot_finder.cpp spot_finder_tb.cpp)
    MAKE_HLS_MODULE(axis_broadcast axis_broadcast.cpp "")
    MAKE_HLS_MODULE(axis_64_to_512 axis_helpers.cpp "")
    MAKE_HLS_MODULE(axis_32_to_512 axis_helpers.cpp "")
    MAKE_HLS_MODULE(adu_histo adu_histo.cpp "")
    MAKE_HLS_MODULE(frame_summation frame_summation.cpp frame_summation_tb_2.cpp)
    MAKE_HLS_MODULE(frame_summation_reorder_compl frame_summation_reorder_compl.cpp "")
    MAKE_HLS_MODULE(stream768to512 stream768to512.cpp stream768to512_tb.cpp)
    MAKE_HLS_MODULE(stream512to768 stream512to768.cpp stream512to768_tb.cpp)
    MAKE_HLS_MODULE(spot_finder_mask spot_finder_mask.cpp "")
    MAKE_HLS_MODULE(spot_finder_merge spot_finder_merge.cpp "")
    MAKE_HLS_MODULE(spot_finder_connectivity spot_finder_connectivity.cpp "")
    MAKE_HLS_MODULE(eiger_reorder eiger_reorder.cpp "")
    MAKE_HLS_MODULE(roi_calc roi_calc.cpp "")
    MAKE_HLS_MODULE(pixel_threshold pixel_threshold.cpp pixel_threshold_tb.cpp)
    MAKE_HLS_MODULE(pixel_mask pixel_mask.cpp "")
    MAKE_HLS_MODULE(pixel_calc pixel_calc.cpp "")

    SET (HLS_IPS ${HLS_IPS} PARENT_SCOPE)
    ADD_CUSTOM_TARGET(hls DEPENDS ${HLS_IPS})

ENDIF()
