// Copyright (2019-2023) Paul Scherrer Institute #ifndef JUNGFRAUJOCH_HLSSIMULATEDDEVICE_H #define JUNGFRAUJOCH_HLSSIMULATEDDEVICE_H #include #include "../fpga/hls/hls_jfjoch.h" #include "../fpga/hls/datamover_model.h" #include "../common/DiffractionExperiment.h" #include "FPGAAcquisitionDevice.h" #include "../jungfrau/jf_packet.h" uint16_t checksum(const uint16_t *addr, size_t count); class HLSSimulatedDevice : public FPGAAcquisitionDevice { AXI_STREAM din_eth; AXI_STREAM din_frame_generator; AXI_STREAM dout_eth; ap_int<16> count_threshold = INT16_MAX; ap_uint<8> snr_threshold = 0; DataCollectionConfig cfg; volatile bool idle; constexpr static const size_t hbm_if_count = 22; constexpr static const size_t hbm_if_size = 32*1024*1024LU; std::vector> hbm; hls::stream > work_request_stream; hls::stream > completion_stream; std::thread action_thread; Datamover<512> datamover_in; Datamover<512> datamover_out; Datamover<256> datamover_in_hbm_0; Datamover<256> datamover_in_hbm_1; Datamover<256, 16> datamover_out_hbm_0; Datamover<256, 16> datamover_out_hbm_1; ap_uint<1> run_data_collection; ap_uint<1> cancel_data_collection; volatile ap_uint<1> host_writer_idle; uint64_t calibration_addr_bram[LOAD_CALIBRATION_BRAM_SIZE]; void HW_ReadActionRegister(DataCollectionConfig *job) override; void HW_WriteActionRegister(const DataCollectionConfig *job) override; void FPGA_StartAction(const DiffractionExperiment &experiment) override; void FPGA_EndAction() override; bool HW_IsIdle() const override; bool HW_ReadMailbox(uint32_t values[16]) override; bool HW_SendWorkRequest(uint32_t handle) override; void HW_LoadCalibration(uint32_t modules, uint32_t storage_cells) override; void HW_LoadIntegrationMap(uint32_t modules) override; void HW_LoadInternalGeneratorFrame(uint32_t modules) override; void HW_GetStatus(DataCollectionStatus *status) const override; void HW_SetSpotFinderParameters(const SpotFinderParameters ¶ms) override; void HLSMainThread() ; public: HLSSimulatedDevice(uint16_t data_stream, size_t in_frame_buffer_size_modules, int16_t numa_node = -1); ~HLSSimulatedDevice() override; void SendPacket(char *buffer, int len, uint8_t user = 0); void CreatePacketJF(const DiffractionExperiment& experiment, uint64_t frame_number, uint32_t eth_packet, uint32_t module_number, const uint16_t *data, bool trigger, int8_t adjust_axis = 0, uint8_t user = 0); void CreatePackets(const DiffractionExperiment& experiment, uint64_t frame_number_0, uint64_t frames, uint32_t module_number, const uint16_t *data, bool trigger, int8_t adjust_axis = 0, uint8_t user = 0); void CreateFinalPacket(const DiffractionExperiment& experiment); AXI_STREAM &OutputStream(); void Cancel() override; uint32_t GetCompletedDescriptors() const override; }; #endif //JUNGFRAUJOCH_HLSSIMULATEDDEVICE_H