Code indexing in gitaly is broken and leads to code not being visible to the user. We work on the issue with highest priority.

Skip to content
Snippets Groups Projects

Improvement in internal frame generator

Merged leonarski_f requested to merge dev231218-parallel_hls into dev231218
4 files
+ 64
31
Compare changes
  • Side-by-side
  • Inline
Files
4
@@ -151,6 +151,8 @@ void HLSSimulatedDevice::FPGA_StartAction(const DiffractionExperiment &experimen
datamover_out.ClearCompletedDescriptors();
action_thread = std::thread(&HLSSimulatedDevice::HLSMainThread, this );
if (experiment.IsUsingInternalPacketGen()) {
auto ret = frame_generator(din_frame_generator,
hbm.data(),
@@ -170,7 +172,6 @@ void HLSSimulatedDevice::FPGA_StartAction(const DiffractionExperiment &experimen
throw JFJochException(JFJochExceptionCategory::AcquisitionDeviceError,
"Error running internal packet generator");
}
action_thread = std::thread(&HLSSimulatedDevice::HLSMainThread, this );
}
void HLSSimulatedDevice::FPGA_EndAction() {
@@ -290,10 +291,14 @@ void HLSSimulatedDevice::HLSMainThread() {
ap_uint<1> frame_summation_idle;
volatile bool done = false;
volatile bool udp_done = false; // done AND udp_idle
volatile bool sls_done = false; // done AND sls_idle
// Sent gratuitous ARP message
arp(arp1, dout_eth, mac_addr, ipv4_addr, 1, 1);
Logger logger_hls("HLS");
volatile rcv_state_t state = RCV_INIT;
// Start data collection
data_collection_fsm(raw0, raw1,
@@ -322,48 +327,57 @@ void HLSSimulatedDevice::HLSMainThread() {
cfg.nsummation, state);
hls_cores.emplace_back([&] {
while (!done || !din_eth.empty() || !din_eth_4x10G.empty() || !din_frame_generator.empty()) {
while (!udp_done) {
if (din_eth.empty() && din_eth_4x10G.empty() && din_frame_generator.empty())
std::this_thread::sleep_for(std::chrono::microseconds(10));
else
stream_merge(din_eth, din_eth_4x10G, din_frame_generator, network0, data_source);
}
logger_hls.Info("Stream_merge done");
});
hls_cores.emplace_back([&] {
while (!done || (!network0.empty())) {
while (!udp_done) {
if (network0.empty())
std::this_thread::sleep_for(std::chrono::microseconds(10));
else
ethernet(network0, ip1, arp1, mac_addr, eth_packets, clear_counters);
}
logger_hls.Info("ethernet done");
});
hls_cores.emplace_back([&] {
while (!done || !ip1.empty()) {
while (!udp_done) {
if (ip1.empty())
std::this_thread::sleep_for(std::chrono::microseconds(10));
else
ipv4(ip1, udp1, icmp1, ipv4_addr);
}
logger_hls.Info("ipv4 done");
});
hls_cores.emplace_back([&] {
while (!done || !udp1.empty()) {
ap_uint<1> udp_idle = 1;
while (!done || !udp_idle) {
if (udp1.empty())
std::this_thread::sleep_for(std::chrono::microseconds(10));
else
udp(udp1, udp2, udp_metadata, udp_packets, clear_counters);
udp(udp1, udp2, udp_metadata, udp_packets, clear_counters, udp_idle);
}
udp_done = true;
logger_hls.Info("udp done");
});
hls_cores.emplace_back([&] {
while (!done || !udp2.empty()) {
ap_uint<1> sls_idle = 1;
while (!done || !sls_idle) {
if (udp2.empty())
std::this_thread::sleep_for(std::chrono::milliseconds (10));
std::this_thread::sleep_for(std::chrono::microseconds (10));
else
sls_detector(udp2, udp_metadata, raw0, addr0, sls_packets, udp_eth_err, udp_len_err, clear_counters);
sls_detector(udp2, udp_metadata, raw0, addr0, sls_packets, udp_eth_err, udp_len_err, clear_counters, sls_idle);
}
sls_done = true;
logger_hls.Info("sls_detector done");
});
// 1. Parse incoming UDP packets
@@ -383,6 +397,8 @@ void HLSSimulatedDevice::HLSMainThread() {
state);
}
done = true;
logger_hls.Info("data collection done");
});
// 2. Cache images in HBM
@@ -466,8 +482,8 @@ void HLSSimulatedDevice::HLSMainThread() {
// reset static counter
arp(arp1, dout_eth, mac_addr, ipv4_addr, 0, 1);
try {
if (!din_eth.empty())
throw std::runtime_error("din_eth queue not empty");
while (!din_eth.empty())
din_eth.read();
if (!addr1.empty())
throw std::runtime_error("Addr1 queue not empty");
Loading