36 uint16_t, std::map<uint16_t, std::map<uint32_t, uint32_t>
41 sorted_samples(digis.getNumSamplesPerDigi());
53 for (
auto digi : digis) {
57 for (std::size_t i_bx{0}; i_bx < digis.getNumSamplesPerDigi(); i_bx++) {
58 sorted_samples[i_bx][eid.fiber()][eid.elink()][eid.channel()] =
73 std::vector<uint32_t> buffer;
77 for (
auto const& bunch : sorted_samples) {
82 uint32_t bunch_id =
event.getEventNumber();
84 uint32_t orbit =
event.getEventHeader().getRun();
87 for (
auto const& [fpga_id, links] : bunch) {
99 std::vector<uint32_t> link_lengths;
100 for (
auto const& [link_id, channels] : links) {
101 link_lengths.push_back(3 + 1 + channels.size() + 1);
114 uint32_t n_linkwords =
115 link_lengths.size() / 4 + (link_lengths.size() % 4 != 0);
116 uint32_t total_length{2 + n_linkwords + 1};
117 for (uint32_t
const& link_len : link_lengths) {
118 total_length += link_len;
139 word |= (1 << (12 + 1 + 6 + 8));
140 word |= (fpga_id & packing::utility::MASK<8>) << (12 + 1 + 6);
141 word |= (links.size() & packing::utility::MASK<6>) << (12 + 1);
142 word |= (total_length & packing::utility::MASK<12>);
143 buffer.push_back(word);
147 word |= (bunch_id & packing::utility::MASK<12>) << 20;
148 word |= (rreq & packing::utility::MASK<10>) << 10;
149 word |= (orbit & packing::utility::MASK<10>);
150 buffer.push_back(word);
156 for (uint32_t i_linkword{0}; i_linkword < n_linkwords; i_linkword++) {
158 for (uint32_t i_linklen{0}; i_linklen < 4; i_linklen++) {
159 uint32_t i_link = 4 * i_linkword + i_linklen;
160 if (i_link <= link_lengths.size()) {
162 word |= (((0b11 << 6) +
163 (link_lengths.at(i_link) & packing::utility::MASK<6>))
167 buffer.push_back(word);
172 for (
auto const& [link_id, channels] : links) {
176 std::bitset<40> ro_map;
180 for (
auto const& [channel, sample] : channels) {
195 word |= (link_id & packing::utility::MASK<16>) << 16;
198 word |= (ro_map >> 32).to_ulong();
200 buffer.push_back(word);
205 word = (ro_map.to_ulong() & 0xFFFFFFFF);
206 buffer.push_back(word);
212 word |= 0b0101 << 28;
213 word |= (bunch_id & packing::utility::MASK<12>) << 16;
214 word |= (rreq & packing::utility::MASK<6>) << 10;
215 word |= (orbit & packing::utility::MASK<3>) << 7;
219 buffer.push_back(word);
232 for (
auto const& [channel, sample] : channels) {
233 buffer.push_back(sample);
237 buffer.push_back(link_crc.
get());
238 fpga_crc << link_crc.
get();