Commit 171d9950 authored by Robert Schmidt's avatar Robert Schmidt

Merge remote-tracking branch 'origin/perf_improv_polar_encoder' into integration_2024_w14

parents 5f652b17 a0e77330
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <stdint.h> #include <stdint.h>
#include "assertions.h" #include "assertions.h"
#include "common/utils/assertions.h"
#include "nr_common.h" #include "nr_common.h"
#include <complex.h> #include <complex.h>
...@@ -52,6 +53,15 @@ static const uint8_t bit_reverse_table_256[] = { ...@@ -52,6 +53,15 @@ static const uint8_t bit_reverse_table_256[] = {
0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF}; 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF};
void reverse_bits_u8(uint8_t const* in, size_t sz, uint8_t* out)
{
DevAssert(in != NULL);
DevAssert(out != NULL);
for(size_t i = 0; i < sz; ++i)
out[i] = bit_reverse_table_256[in[i]];
}
// Reverse bits implementation based on http://graphics.stanford.edu/~seander/bithacks.html // Reverse bits implementation based on http://graphics.stanford.edu/~seander/bithacks.html
uint64_t reverse_bits(uint64_t in, int n_bits) uint64_t reverse_bits(uint64_t in, int n_bits)
{ {
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#define __COMMON_UTILS_NR_NR_COMMON__H__ #define __COMMON_UTILS_NR_NR_COMMON__H__
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>
#include "assertions.h" #include "assertions.h"
#include "PHY/defs_common.h" #include "PHY/defs_common.h"
...@@ -175,8 +176,11 @@ static inline int get_num_dmrs(uint16_t dmrs_mask ) { ...@@ -175,8 +176,11 @@ static inline int get_num_dmrs(uint16_t dmrs_mask ) {
} }
uint64_t reverse_bits(uint64_t in, int n_bits); uint64_t reverse_bits(uint64_t in, int n_bits);
void reverse_bits_u8(uint8_t const* in, size_t sz, uint8_t* out);
uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn); uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn);
uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, uint32_t bw); uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, uint32_t bw);
int get_first_ul_slot(int nrofDownlinkSlots, int nrofDownlinkSymbols, int nrofUplinkSymbols); int get_first_ul_slot(int nrofDownlinkSlots, int nrofDownlinkSymbols, int nrofUplinkSymbols);
int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs); int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs);
int get_SLIV(uint8_t S, uint8_t L); int get_SLIV(uint8_t S, uint8_t L);
......
...@@ -282,7 +282,7 @@ void nr_polar_generate_u(uint64_t *u, ...@@ -282,7 +282,7 @@ void nr_polar_generate_u(uint64_t *u,
uint16_t N, uint16_t N,
uint8_t n_pc); uint8_t n_pc);
void nr_polar_uxG(uint64_t *D, const uint64_t *u, const fourDimArray_t *G_N_tab, uint16_t N); void nr_polar_uxG(uint8_t const* u, size_t N, uint8_t* D);
void nr_polar_info_extraction_from_u(uint64_t *Cprime, void nr_polar_info_extraction_from_u(uint64_t *Cprime,
const uint8_t *u, const uint8_t *u,
......
...@@ -485,12 +485,13 @@ void build_polar_tables(t_nrPolar_params *polarParams) { ...@@ -485,12 +485,13 @@ void build_polar_tables(t_nrPolar_params *polarParams) {
polarParams->rm_tab[tcnt] = polarParams->rate_matching_pattern[outpos] >> shift; polarParams->rm_tab[tcnt] = polarParams->rate_matching_pattern[outpos] >> shift;
} }
void polar_encoder_fast(uint64_t *A, void polar_encoder_fast(uint64_t *A,
void *out, void *out,
int32_t crcmask, int32_t crcmask,
uint8_t ones_flag, uint8_t ones_flag,
int8_t messageType, int8_t messageType,
uint16_t messageLength, uint16_t messageLength,
uint8_t aggregation_level) { uint8_t aggregation_level) {
t_nrPolar_params *polarParams=nr_polar_params(messageType, messageLength, aggregation_level, false); t_nrPolar_params *polarParams=nr_polar_params(messageType, messageLength, aggregation_level, false);
...@@ -687,8 +688,8 @@ void polar_encoder_fast(uint64_t *A, ...@@ -687,8 +688,8 @@ void polar_encoder_fast(uint64_t *A,
printf("\n"); printf("\n");
#endif #endif
uint64_t D[8] = {0}; uint64_t D[8];
nr_polar_uxG(D, u, polarParams->G_N_tab, polarParams->N); nr_polar_uxG((uint8_t *)u, polarParams->N, (uint8_t *)D);
#ifdef POLAR_CODING_DEBUG #ifdef POLAR_CODING_DEBUG
printf("d: "); printf("d: ");
...@@ -701,6 +702,7 @@ void polar_encoder_fast(uint64_t *A, ...@@ -701,6 +702,7 @@ void polar_encoder_fast(uint64_t *A,
printf("%lu", (D[n1] >> n2) & 1); printf("%lu", (D[n1] >> n2) & 1);
} }
printf("\n"); printf("\n");
fflush(stdout);
#endif #endif
memset((void*)out,0,polarParams->encoderLength>>3); memset((void*)out,0,polarParams->encoderLength>>3);
......
...@@ -30,8 +30,12 @@ ...@@ -30,8 +30,12 @@
* \warning * \warning
*/ */
#include "common/utils/nr/nr_common.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h" #include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
#include <assert.h>
#include <stdlib.h>
#include <stdint.h>
// TS 38.212 - Section 5.3.1.2 Polar encoding // TS 38.212 - Section 5.3.1.2 Polar encoding
void nr_polar_generate_u(uint64_t *u, void nr_polar_generate_u(uint64_t *u,
...@@ -119,23 +123,71 @@ void nr_polar_info_extraction_from_u(uint64_t *Cprime, ...@@ -119,23 +123,71 @@ void nr_polar_info_extraction_from_u(uint64_t *Cprime,
} }
} }
void nr_polar_uxG(uint64_t *D, const uint64_t *u, const fourDimArray_t *G_N_tab, uint16_t N)
static
void encode_packed_byte(uint8_t* in_out)
{
// *in_out ^= 0xAA & (*in_out << 1);
// *in_out ^= 0xCC & (*in_out << 2);
// *in_out ^= *in_out in_out << 4;
//
*in_out ^= 0x55 & (*in_out >> 1);
*in_out ^= 0x33 & (*in_out >> 2);
*in_out ^= *in_out >> 4;
}
static
void polar_encode_bits(uint8_t* in_out, size_t N)
{
size_t const num_bytes_per_block = N >> 3;
for(size_t i = 0; i < num_bytes_per_block; ++i){
encode_packed_byte(&in_out[i]);
}
}
static
uint32_t log2_floor(uint32_t x)
{ {
const int N64 = N / 64; if(x == 0)
cast2Darray(g_n, uint64_t, G_N_tab); return 0;
for (int n = 0; n < N; n++) { uint32_t clz = __builtin_clz(x);
const uint64_t *Gn = g_n[N - 1 - n]; return 31U - clz;
}
int n_ones = 0;
for (int a = 0; a < N64; a++) static
n_ones += count_bits_set(u[a] & Gn[a]); void polar_encode_bytes(uint8_t* in_out, size_t N)
{
int n1 = n / 64; size_t brnch_sz = 1;
int n2 = n - (n1 * 64); size_t n_brnch = N >> 4;
D[n1] |= ((uint64_t)n_ones & 1) << n2; size_t const blck_pwr = log2_floor(N);
for (size_t stage = 3; stage < blck_pwr; ++stage) {
for (size_t brnch = 0; brnch < n_brnch; ++brnch) {
for(size_t byte = 0; byte < brnch_sz; ++byte){
size_t const dst = 2*brnch_sz*brnch + byte;
in_out[dst] ^= in_out[dst + brnch_sz];
}
}
n_brnch >>= 1;
brnch_sz <<= 1;
} }
} }
void nr_polar_uxG(uint8_t const *u, size_t N, uint8_t *D2)
{
assert(N > 7);
uint8_t tmp[N/8];
for(int i = 0; i < N/8; ++i)
tmp[i] = u[N/8 - 1 - i];
reverse_bits_u8(tmp, N/8, D2);
// Do the encoding/xor for the bottom 3 levels of the tree.
// Thus, data remaining to encode, is in 2^3 type.
polar_encode_bits(D2, N);
// Xor the remaining tree levels. Use bytes for it
polar_encode_bytes(D2, N);
}
void nr_polar_bit_insertion(uint8_t *input, void nr_polar_bit_insertion(uint8_t *input,
uint8_t *output, uint8_t *output,
uint16_t N, uint16_t N,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment