Files
Jungfraujoch/fpga/hls/spot_finder_connectivity.cpp
2024-11-22 21:25:20 +01:00

86 lines
3.1 KiB
C++

// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: CERN-OHL-S-2.0
#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<32>> &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<32> output = 0;
for (int i = 0; i < 32; i++) {
size_t pos = col * 32 + i;
ap_uint<1> connect_mat = 0;
if (pos != 0) {
connect_mat |= top_line[pos - 1];
connect_mat |= mid_line[pos - 1];
connect_mat |= bottom_line[pos - 1];
}
connect_mat |= top_line[pos];
connect_mat |= bottom_line[pos];
if (pos != RAW_MODULE_COLS - 1) {
connect_mat |= top_line[pos + 1];
connect_mat |= mid_line[pos + 1];
connect_mat |= bottom_line[pos + 1];
}
output[i] = 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<32> output = 0;
for (int i = 0; i < 32; i++) {
size_t pos = col * 32 + i;
ap_uint<1> connect_mat = 0;
if (pos != 0) {
connect_mat |= top_line[pos - 1];
connect_mat |= mid_line[pos - 1];
}
connect_mat |= top_line[pos];
if (pos != RAW_MODULE_COLS - 1) {
connect_mat |= top_line[pos + 1];
connect_mat |= mid_line[pos + 1];
}
output[i] = connect_mat;
}
connectivity_out << output;
}
}
data_out << val;
}