Skip to content

Commit 366234c

Browse files
committed
phy: review UL-SCH demux
1 parent 37ad285 commit 366234c

File tree

6 files changed

+122
-115
lines changed

6 files changed

+122
-115
lines changed

include/srsran/phy/upper/channel_processors/ulsch_demultiplex.h

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,15 @@
1919

2020
namespace srsran {
2121

22-
/// \brief Uplink Shared Channel demultiplexer interface.
22+
/// \brief User interface of the Uplink Shared Channel (UL-SCH) demultiplexer.
2323
///
24-
/// User interface of the Uplink Shared Channel (UL-SCH) demultiplexer.
24+
/// Note that for calculating CSI Part 2 report size, it is necessary to decode the CSI Part 1. Consequently, the CSI
25+
/// Part 1 report soft bits can be demultiplexed alone (see \ref ulsch_demultiplex::demultiplex_csi_part1).
26+
/// Additionally, it is possible to demultiplex all fields except the CSI Part 1 report (see \ref
27+
/// ulsch_demultiplex::demultiplex_sch_harq_ack_and_csi_part2).
28+
///
29+
/// All fields can be demultiplexed simultaneously if CSI Part 2 is not present (see \ref
30+
/// ulsch_demultiplex::demultiplex).
2531
class ulsch_demultiplex
2632
{
2733
public:
@@ -66,44 +72,41 @@ class ulsch_demultiplex
6672
/// Default destructor.
6773
virtual ~ulsch_demultiplex() = default;
6874

69-
/// \brief Demultiplexes HARQ-ACK information bits and CSI Part 1 report from the UL-SCH transmission.
70-
///
71-
/// \param[out] harq_ack Destination of HARQ-ACK information soft bits.
72-
/// \param[out] csi_part1 Destination CSI Part 1 report soft bits.
73-
/// \param[in] input Input soft bits to demultiplex.
74-
/// \param[in] config UL-SCH demultiplexing parameters.
75-
virtual void demultiplex_harq_ack_and_csi_part1(span<log_likelihood_ratio> harq_ack,
76-
span<log_likelihood_ratio> csi_part1,
77-
span<const log_likelihood_ratio> input,
78-
const configuration& config) = 0;
75+
/// \brief Demultiplexes CSI Part 1 report from the UL-SCH transmission.
76+
/// \param[out] csi_part1 CSI Part 1 report soft bits.
77+
/// \param[in] input Input soft bits to demultiplex.
78+
/// \param[in] nof_enc_harq_ack_bits Number of HARQ-ACK information bits multiplexed in the PUSCH message. Parameter
79+
/// \f$O_\textup{HARQ-ACK}\f$.
80+
/// \param[in] config UL-SCH demultiplexing parameters.
81+
virtual void demultiplex_csi_part1(span<log_likelihood_ratio> csi_part1,
82+
span<const log_likelihood_ratio> input,
83+
unsigned nof_enc_harq_ack_bits,
84+
const configuration& config) = 0;
7985

80-
/// \brief Demultiplexes Share Channel (SCH) data and CSI Part 2 report from the UL-SCH transmission.
81-
///
82-
/// It demultiplexes HARQ-ACK information bits and CSI Part 1 from the UL-SCH.
83-
///
84-
/// \param[out] sch_data Destination of the resultant shared channel data soft bits.
85-
/// \param[out] csi_part2 Destination CSI Part 2 report soft bits.
86+
/// \brief Demultiplexes Share Channel (SCH) data, HARQ-ACK information bits and CSI Part 2 report from the UL-SCH
87+
/// transmission.
88+
/// \param[out] sch_data Shared channel data soft bits.
89+
/// \param[out] harq_ack HARQ-ACK information soft bits.
90+
/// \param[out] csi_part2 CSI Part 2 report soft bits.
8691
/// \param[in] input Input soft bits to demultiplex.
87-
/// \param[in] nof_enc_harq_ack_bits Number of HARQ-ACK information bits multiplexed in the PUSCH message. Parameter
88-
/// \f$O_\textup{HARQ-ACK}\f$.
8992
/// \param[in] nof_enc_csi_part1_bits Number of HARQ-ACK information bits multiplexed in the PUSCH message. Parameter
90-
/// \f$O_\textup{HARQ-ACK}\f$.
93+
/// \f$O_\textup{CSI-1}\f$.
9194
/// \param[in] config UL-SCH demultiplexing parameters.
92-
virtual void demultiplex_sch_and_csi_part2(span<log_likelihood_ratio> sch_data,
93-
span<log_likelihood_ratio> csi_part2,
94-
span<const log_likelihood_ratio> input,
95-
unsigned nof_enc_harq_ack_bits,
96-
unsigned nof_csi_part1_bits,
97-
const configuration& config) = 0;
95+
virtual void demultiplex_sch_harq_ack_and_csi_part2(span<log_likelihood_ratio> sch_data,
96+
span<log_likelihood_ratio> harq_ack,
97+
span<log_likelihood_ratio> csi_part2,
98+
span<const log_likelihood_ratio> input,
99+
unsigned nof_csi_part1_bits,
100+
const configuration& config) = 0;
98101

99102
/// \brief Demultiplexes Uplink Shared Channel (UL-SCH).
100103
///
101104
/// Demultiplexes the different information fields from the UL-SCH transmission.
102105
///
103-
/// \param[out] sch_data Destination of the resultant shared channel data soft bits.
104-
/// \param[out] harq_ack Destination of HARQ-ACK information soft bits.
105-
/// \param[out] csi_part1 Destination CSI Part 1 report soft bits.
106-
/// \param[out] csi_part2 Destination CSI Part 2 report soft bits.
106+
/// \param[out] sch_data Shared channel data soft bits.
107+
/// \param[out] harq_ack HARQ-ACK information soft bits.
108+
/// \param[out] csi_part1 CSI Part 1 report soft bits.
109+
/// \param[out] csi_part2 CSI Part 2 report soft bits.
107110
/// \param[in] input Input soft bits to demultiplex.
108111
/// \param[in] config UL-SCH demultiplexing parameters.
109112
virtual void demultiplex(span<log_likelihood_ratio> sch_data,

lib/phy/upper/channel_processors/pusch_processor_impl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ void pusch_processor_impl::process(span<uint8_t> data,
245245
// Depending on CSI Part 2 report.
246246
if (pdu.uci.nof_csi_part2 > 0) {
247247
// Demultiplex HARQ-ACK and CSI Part 1.
248-
demultiplex->demultiplex_harq_ack_and_csi_part1(harq_ack_llr, csi_part1_llr, codeword_llr, demux_config);
248+
demultiplex->demultiplex_csi_part1(csi_part1_llr, codeword_llr, info.nof_harq_ack_bits.value(), demux_config);
249249
} else {
250250
// Demultiplex SCH data, HARQ-ACK and CSI Part 1.
251251
demultiplex->demultiplex(sch_llr, harq_ack_llr, csi_part1_llr, {}, codeword_llr, demux_config);
@@ -278,8 +278,8 @@ void pusch_processor_impl::process(span<uint8_t> data,
278278
span<log_likelihood_ratio>(temp_csi_part2_llr).first(nof_enc_csi_part2);
279279

280280
// Demultiplex SCH data and CSI Part 2 bits.
281-
demultiplex->demultiplex_sch_and_csi_part2(
282-
sch_llr, csi_part2_llr, codeword_llr, harq_ack_llr.size(), csi_part1_llr.size(), demux_config);
281+
demultiplex->demultiplex_sch_harq_ack_and_csi_part2(
282+
sch_llr, harq_ack_llr, csi_part2_llr, codeword_llr, csi_part1_llr.size(), demux_config);
283283

284284
// Decode CSI Part 2.
285285
result_uci.csi_part2 = decode_uci_field(csi_part2_llr, nof_csi_part2, uci_dec_config);

lib/phy/upper/channel_processors/ulsch_demultiplex_impl.cpp

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -301,34 +301,30 @@ void ulsch_demultiplex_generic(FuncSchData& func_sch_
301301

302302
} // namespace
303303

304-
void ulsch_demultiplex_impl::demultiplex_harq_ack_and_csi_part1(span<log_likelihood_ratio> harq_ack,
305-
span<log_likelihood_ratio> csi_part1,
306-
span<const log_likelihood_ratio> input,
307-
const ulsch_demultiplex::configuration& config)
304+
void ulsch_demultiplex_impl::demultiplex_csi_part1(span<log_likelihood_ratio> csi_part1,
305+
span<const log_likelihood_ratio> input,
306+
unsigned nof_enc_harq_ack_bits,
307+
const configuration& config)
308308
{
309309
// Skip demultiplexing if no UCI is multiplexed.
310-
if (harq_ack.empty() && csi_part1.empty()) {
310+
if ((nof_enc_harq_ack_bits == 0) && csi_part1.empty()) {
311311
return;
312312
}
313313

314314
unsigned nof_bits_per_re = get_bits_per_symbol(config.modulation) * config.nof_layers;
315315

316316
// Function to ignore input data.
317-
auto func_ignore = [&input, &nof_bits_per_re](bool is_reserved) {
317+
auto func_ignore = [&input, &nof_bits_per_re]() { input = input.last(input.size() - nof_bits_per_re); };
318+
319+
// Function to ignore input data.
320+
auto func_ignore2 = [&input, &nof_bits_per_re](bool is_reserved) {
318321
if (is_reserved) {
319322
return;
320323
}
321324

322325
input = input.last(input.size() - nof_bits_per_re);
323326
};
324327

325-
// Function to demultiplex HARQ-ACK bits.
326-
auto func_harq_ack = [&harq_ack, &input, &nof_bits_per_re]() {
327-
srsvec::copy(harq_ack.first(nof_bits_per_re), input.first(nof_bits_per_re));
328-
input = input.last(input.size() - nof_bits_per_re);
329-
harq_ack = harq_ack.last(harq_ack.size() - nof_bits_per_re);
330-
};
331-
332328
// Function to demultiplex CSI Part 1 bits.
333329
auto func_csi_part1 = [&csi_part1, &input, &nof_bits_per_re]() {
334330
srsvec::copy(csi_part1.first(nof_bits_per_re), input.first(nof_bits_per_re));
@@ -337,23 +333,22 @@ void ulsch_demultiplex_impl::demultiplex_harq_ack_and_csi_part1(span<log_likelih
337333
};
338334

339335
ulsch_demultiplex_generic(
340-
func_ignore, func_harq_ack, func_csi_part1, func_ignore, harq_ack.size(), csi_part1.size(), 0, config);
336+
func_ignore2, func_ignore, func_csi_part1, func_ignore2, nof_enc_harq_ack_bits, csi_part1.size(), 0, config);
341337

342338
// Assert that input buffers have been consumed.
343-
srsran_assert(harq_ack.empty(), "{} soft bits have not been multiplexed for HARQ-ACK.", harq_ack.size());
344339
srsran_assert(csi_part1.empty(), "{} soft bits have not been multiplexed for CSI Part 1.", csi_part1.size());
345340
srsran_assert(input.empty(), "{} input soft bits have not been multiplexed.", input.size());
346341
}
347342

348-
void ulsch_demultiplex_impl::demultiplex_sch_and_csi_part2(span<log_likelihood_ratio> sch_data,
349-
span<log_likelihood_ratio> csi_part2,
350-
span<const log_likelihood_ratio> input,
351-
unsigned nof_enc_harq_ack_bits,
352-
unsigned nof_csi_part1_bits,
353-
const ulsch_demultiplex::configuration& config)
343+
void ulsch_demultiplex_impl::demultiplex_sch_harq_ack_and_csi_part2(span<log_likelihood_ratio> sch_data,
344+
span<log_likelihood_ratio> harq_ack,
345+
span<log_likelihood_ratio> csi_part2,
346+
span<const log_likelihood_ratio> input,
347+
unsigned nof_csi_part1_bits,
348+
const configuration& config)
354349
{
355350
// Skip demultiplexing if no UCI is multiplexed.
356-
if ((nof_enc_harq_ack_bits == 0) && (nof_csi_part1_bits == 0) && csi_part2.empty()) {
351+
if (harq_ack.empty() && (nof_csi_part1_bits == 0) && csi_part2.empty()) {
357352
srsran_assert(sch_data.size() == input.size(),
358353
"SCH data number of soft bits (i.e. {}) must be equal to the number of input soft bits (i.e., {}).",
359354
sch_data.size(),
@@ -380,6 +375,13 @@ void ulsch_demultiplex_impl::demultiplex_sch_and_csi_part2(span<log_likelihood_r
380375
sch_data = sch_data.last(sch_data.size() - nof_bits_per_re);
381376
};
382377

378+
// Function to demultiplex HARQ ACK.
379+
auto func_harq_ack = [&harq_ack, &input, &nof_bits_per_re]() {
380+
srsvec::copy(harq_ack.first(nof_bits_per_re), input.first(nof_bits_per_re));
381+
input = input.last(input.size() - nof_bits_per_re);
382+
harq_ack = harq_ack.last(harq_ack.size() - nof_bits_per_re);
383+
};
384+
383385
// Function to demultiplex CSI Part 2 bits.
384386
auto func_csi_part2 = [&csi_part2, &input, &nof_bits_per_re](bool is_reserved) {
385387
if (is_reserved) {
@@ -394,10 +396,10 @@ void ulsch_demultiplex_impl::demultiplex_sch_and_csi_part2(span<log_likelihood_r
394396
};
395397

396398
ulsch_demultiplex_generic(func_sch_data,
397-
func_ignore,
399+
func_harq_ack,
398400
func_ignore,
399401
func_csi_part2,
400-
nof_enc_harq_ack_bits,
402+
harq_ack.size(),
401403
nof_csi_part1_bits,
402404
csi_part2.size(),
403405
config);

lib/phy/upper/channel_processors/ulsch_demultiplex_impl.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@ class ulsch_demultiplex_impl : public ulsch_demultiplex
1818
{
1919
public:
2020
// See interface for documentation.
21-
void demultiplex_harq_ack_and_csi_part1(span<log_likelihood_ratio> harq_ack,
22-
span<log_likelihood_ratio> csi_part1,
23-
span<const log_likelihood_ratio> input,
24-
const configuration& config) override;
21+
void demultiplex_csi_part1(span<log_likelihood_ratio> csi_part1,
22+
span<const log_likelihood_ratio> input,
23+
unsigned nof_enc_harq_ack_bits,
24+
const configuration& config) override;
2525

2626
// See interface for documentation.
27-
void demultiplex_sch_and_csi_part2(span<log_likelihood_ratio> sch_data,
28-
span<log_likelihood_ratio> csi_part2,
29-
span<const log_likelihood_ratio> input,
30-
unsigned nof_enc_harq_ack_bits,
31-
unsigned nof_csi_part1_bits,
32-
const configuration& config) override;
27+
void demultiplex_sch_harq_ack_and_csi_part2(span<log_likelihood_ratio> sch_data,
28+
span<log_likelihood_ratio> harq_ack,
29+
span<log_likelihood_ratio> csi_part2,
30+
span<const log_likelihood_ratio> input,
31+
unsigned nof_csi_part1_bits,
32+
const configuration& config) override;
3333

3434
// See interface for documentation.
3535
void demultiplex(span<log_likelihood_ratio> sch_data,

tests/unittests/phy/upper/channel_processors/ulsch_demultiplex_test.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -144,30 +144,26 @@ TEST_P(UlschDemultiplexFixture, AllFromVector)
144144
ASSERT_EQ(nof_x_placeholders_max, expected_nof_x_placeholders);
145145
}
146146

147-
TEST_P(UlschDemultiplexFixture, HarqAckAndCsiPart1FromVector)
147+
TEST_P(UlschDemultiplexFixture, CsiPart1FromVector)
148148
{
149149
const test_case_t& test_case = GetParam();
150150

151151
// Load codeword input.
152152
std::vector<log_likelihood_ratio> input = test_case.input.read();
153153

154-
// Load HARQ-ACK output.
155-
std::vector<log_likelihood_ratio> expected_harq_ack = test_case.output_harq_ack.read();
156-
std::vector<log_likelihood_ratio> harq_ack(expected_harq_ack.size());
157-
158154
// Load CSI Part 1 output.
159155
std::vector<log_likelihood_ratio> expected_csi_part1 = test_case.output_csi_part1.read();
160156
std::vector<log_likelihood_ratio> csi_part1(expected_csi_part1.size());
161157

162158
// Demultiplex.
163-
demultiplexer->demultiplex_harq_ack_and_csi_part1(harq_ack, csi_part1, input, test_case.context.config);
159+
demultiplexer->demultiplex_csi_part1(
160+
csi_part1, input, test_case.context.msg_info.nof_enc_harq_ack_bits, test_case.context.config);
164161

165162
// Verify results.
166-
ASSERT_EQ(span<const log_likelihood_ratio>(harq_ack), span<const log_likelihood_ratio>(expected_harq_ack));
167163
ASSERT_EQ(span<const log_likelihood_ratio>(csi_part1), span<const log_likelihood_ratio>(expected_csi_part1));
168164
}
169165

170-
TEST_P(UlschDemultiplexFixture, SchDataAndCsiPart2FromVector)
166+
TEST_P(UlschDemultiplexFixture, SchDataHrqAckAndCsiPart2FromVector)
171167
{
172168
const test_case_t& test_case = GetParam();
173169

@@ -178,22 +174,24 @@ TEST_P(UlschDemultiplexFixture, SchDataAndCsiPart2FromVector)
178174
std::vector<log_likelihood_ratio> expected_sch_data = test_case.output_ulsch.read();
179175
std::vector<log_likelihood_ratio> sch_data(expected_sch_data.size());
180176

181-
// Get the number HARQ-ACK encoded bits.
182-
unsigned nof_enc_harq_ack_bits = test_case.context.msg_info.nof_enc_harq_ack_bits;
183-
184177
// Get the number CSI Part 1 encoded bits.
185178
unsigned nof_enc_csi_part1_bits = test_case.context.msg_info.nof_enc_csi_part1_bits;
186179

180+
// Load CSI Part 2 output.
181+
std::vector<log_likelihood_ratio> expected_harq_ack = test_case.output_harq_ack.read();
182+
std::vector<log_likelihood_ratio> harq_ack(expected_harq_ack.size());
183+
187184
// Load CSI Part 2 output.
188185
std::vector<log_likelihood_ratio> expected_csi_part2 = test_case.output_csi_part2.read();
189186
std::vector<log_likelihood_ratio> csi_part2(expected_csi_part2.size());
190187

191188
// Demultiplex.
192-
demultiplexer->demultiplex_sch_and_csi_part2(
193-
sch_data, csi_part2, input, nof_enc_harq_ack_bits, nof_enc_csi_part1_bits, test_case.context.config);
189+
demultiplexer->demultiplex_sch_harq_ack_and_csi_part2(
190+
sch_data, harq_ack, csi_part2, input, nof_enc_csi_part1_bits, test_case.context.config);
194191

195192
// Verify results.
196193
ASSERT_EQ(span<const log_likelihood_ratio>(sch_data), span<const log_likelihood_ratio>(expected_sch_data));
194+
ASSERT_EQ(span<const log_likelihood_ratio>(harq_ack), span<const log_likelihood_ratio>(expected_harq_ack));
197195
ASSERT_EQ(span<const log_likelihood_ratio>(csi_part2), span<const log_likelihood_ratio>(expected_csi_part2));
198196
}
199197

0 commit comments

Comments
 (0)