diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 3dad62dda7..4ca616537f 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -32,6 +32,7 @@ #include #include "assertions.h" +#include "common/utils/assertions.h" #include "nr_common.h" #include @@ -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, 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 uint64_t reverse_bits(uint64_t in, int n_bits) { diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index 9066edbaee..7b790978a3 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -34,6 +34,7 @@ #define __COMMON_UTILS_NR_NR_COMMON__H__ #include +#include #include "assertions.h" #include "PHY/defs_common.h" @@ -175,8 +176,11 @@ static inline int get_num_dmrs(uint16_t dmrs_mask ) { } 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); 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 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); diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h b/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h index 490b24860d..5628bfe5ca 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h +++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h @@ -282,7 +282,7 @@ void nr_polar_generate_u(uint64_t *u, uint16_t N, 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, const uint8_t *u, diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c index 0a5982049b..335510953f 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c +++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c @@ -485,12 +485,13 @@ void build_polar_tables(t_nrPolar_params *polarParams) { polarParams->rm_tab[tcnt] = polarParams->rate_matching_pattern[outpos] >> shift; } + void polar_encoder_fast(uint64_t *A, void *out, - int32_t crcmask, - uint8_t ones_flag, - int8_t messageType, - uint16_t messageLength, + int32_t crcmask, + uint8_t ones_flag, + int8_t messageType, + uint16_t messageLength, uint8_t aggregation_level) { t_nrPolar_params *polarParams=nr_polar_params(messageType, messageLength, aggregation_level, false); @@ -687,8 +688,8 @@ void polar_encoder_fast(uint64_t *A, printf("\n"); #endif - uint64_t D[8] = {0}; - nr_polar_uxG(D, u, polarParams->G_N_tab, polarParams->N); + uint64_t D[8]; + nr_polar_uxG((uint8_t *)u, polarParams->N, (uint8_t *)D); #ifdef POLAR_CODING_DEBUG printf("d: "); @@ -701,6 +702,7 @@ void polar_encoder_fast(uint64_t *A, printf("%lu", (D[n1] >> n2) & 1); } printf("\n"); + fflush(stdout); #endif memset((void*)out,0,polarParams->encoderLength>>3); diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c index bf0a0ffee5..7a62d6d48f 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c +++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_procedures.c @@ -30,8 +30,12 @@ * \warning */ +#include "common/utils/nr/nr_common.h" #include "PHY/CODING/nrPolar_tools/nr_polar_defs.h" +#include +#include +#include // TS 38.212 - Section 5.3.1.2 Polar encoding void nr_polar_generate_u(uint64_t *u, @@ -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) { - const int N64 = N / 64; - cast2Darray(g_n, uint64_t, G_N_tab); - for (int n = 0; n < N; n++) { - const uint64_t *Gn = g_n[N - 1 - n]; + // *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; +} - int n_ones = 0; - for (int a = 0; a < N64; a++) - n_ones += count_bits_set(u[a] & Gn[a]); - - int n1 = n / 64; - int n2 = n - (n1 * 64); - D[n1] |= ((uint64_t)n_ones & 1) << n2; +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) +{ + if(x == 0) + return 0; + uint32_t clz = __builtin_clz(x); + return 31U - clz; +} + +static +void polar_encode_bytes(uint8_t* in_out, size_t N) +{ + size_t brnch_sz = 1; + size_t n_brnch = N >> 4; + 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, uint8_t *output, uint16_t N,