Files
Jungfraujoch/fpga/hls/spot_finder_connectivity.cpp

85 lines
3.1 KiB
C++

// Copyright (2019-2024) Paul Scherrer Institute
#include "hls_jfjoch.h"
void spot_finder_connectivity(hls::stream<ap_axiu<32,1,1,1>> &data_in,
hls::stream<ap_axiu<32,1,1,1>> &data_out,
hls::stream<ap_uint<256>> &connectivity_out) {
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE axis register both port=data_in
#pragma HLS INTERFACE axis register both port=data_out
#pragma HLS INTERFACE axis register both port=connectivity_out
ap_uint<RAW_MODULE_COLS> top_line;
ap_uint<RAW_MODULE_COLS> mid_line;
ap_uint<RAW_MODULE_COLS> bottom_line;
ap_axiu<32,1,1,1> val;
data_in >> val;
while (!val.user) {
top_line = 0;
mid_line = 0;
bottom_line = 0;
for (int line = 0; line < RAW_MODULE_LINES; line++) {
#pragma HLS PIPELINE II=32
for (int col = 0; col < RAW_MODULE_COLS / 32; col++) {
bottom_line(col * 32 + 31, col * 32) = val.data;
data_out << val;
data_in >> val;
}
if (line != 0) {
for (int col = 0; col < RAW_MODULE_COLS / 32; col++) {
ap_uint<256> output = 0;
for (int i = 0; i < 32; i++) {
size_t pos = col * 32 + i;
ap_uint<8> connect_mat = 0;
if (pos != 0) {
connect_mat[0] = top_line[pos - 1];
connect_mat[1] = mid_line[pos - 1];
connect_mat[2] = bottom_line[pos - 1];
}
connect_mat[3] = top_line[pos];
connect_mat[4] = bottom_line[pos];
if (pos != RAW_MODULE_COLS - 1) {
connect_mat[5] = top_line[pos + 1];
connect_mat[6] = mid_line[pos + 1];
connect_mat[7] = bottom_line[pos + 1];
}
output(i*8+7, i*8) = connect_mat;
}
connectivity_out << output;
}
}
top_line = mid_line;
mid_line = bottom_line;
}
for (int i = 0; i < 16; i++) {
data_out << val;
data_in >> val;
}
for (int col = 0; col < RAW_MODULE_COLS / 32; col++) {
#pragma HLS PIPELINE II=1
ap_uint<256> output = 0;
for (int i = 0; i < 32; i++) {
size_t pos = col * 32 + i;
ap_uint<8> connect_mat = 0;
if (pos != 0) {
connect_mat[0] = top_line[pos - 1];
connect_mat[1] = mid_line[pos - 1];
}
connect_mat[3] = top_line[pos];
if (pos != RAW_MODULE_COLS - 1) {
connect_mat[5] = top_line[pos + 1];
connect_mat[6] = mid_line[pos + 1];
}
output(i*8+7, i*8) = connect_mat;
}
connectivity_out << output;
}
}
data_out << val;
}