85 lines
3.1 KiB
C++
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;
|
|
}
|