Skip to content
Snippets Groups Projects
Commit 2cd4d9f6 authored by sebastian's avatar sebastian
Browse files

Updated packed LDPC output format to be compliant with 38.321

parent 2daf95a0
No related branches found
No related tags found
10 merge requests!1757Draft: Use pMAX value in configuration file, instead of hardcoded '23' in asn1_msg.c,!1493fix DL arq errors in UE,!1093Issue in generating NR PRACH for High Speed case,!1074PBCH test case support for non-zero bchpyload,!918Develop nfapi,!847Nr vcd,!782Oai ubuntu docker,!730Nr rlc,!691Integration develop nr 2019w42,!690ldpc endian
...@@ -47,7 +47,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc ...@@ -47,7 +47,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
int8_t* bnProcBufRes = p_procBuf->bnProcBufRes; int8_t* bnProcBufRes = p_procBuf->bnProcBufRes;
int8_t* llrRes = p_procBuf->llrRes; int8_t* llrRes = p_procBuf->llrRes;
int8_t* llrProcBuf = p_procBuf->llrProcBuf; int8_t* llrProcBuf = p_procBuf->llrProcBuf;
__m128i* p_bnProcBuf; __m128i* p_bnProcBuf;
__m256i* p_bnProcBufRes; __m256i* p_bnProcBufRes;
__m128i* p_llrProcBuf; __m128i* p_llrProcBuf;
...@@ -1693,7 +1693,7 @@ static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBu ...@@ -1693,7 +1693,7 @@ static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBu
int8_t* bnProcBuf = p_procBuf->bnProcBuf; int8_t* bnProcBuf = p_procBuf->bnProcBuf;
int8_t* bnProcBufRes = p_procBuf->bnProcBufRes; int8_t* bnProcBufRes = p_procBuf->bnProcBufRes;
int8_t* llrRes = p_procBuf->llrRes; int8_t* llrRes = p_procBuf->llrRes;
__m256i* p_bnProcBuf; __m256i* p_bnProcBuf;
__m256i* p_bnProcBufRes; __m256i* p_bnProcBufRes;
__m256i* p_llrRes; __m256i* p_llrRes;
...@@ -2775,24 +2775,37 @@ static inline void nrLDPC_llr2bit(int8_t* out, int8_t* llrOut, uint16_t numLLR) ...@@ -2775,24 +2775,37 @@ static inline void nrLDPC_llr2bit(int8_t* out, int8_t* llrOut, uint16_t numLLR)
} }
/** /**
\brief Performs hard-decision on output LLRs and packs the output in 32 bit values. \brief Performs hard-decision on output LLRs and packs the output in byte aligned output according to TS 38.321 Section 6.1.1.
i = 0,1,2,...
IN[i] : a0, a1, a2, ..., a_{A-1}
OUT[i]: a7,a6,a5,a4,a3,a2,a1,a0|a15,14,...,a8|a23,a22,...,a16|a31,a30,...,a24|...
\param out Pointer hard-decision output, every int8_t contains 8 bits \param out Pointer hard-decision output, every int8_t contains 8 bits
\param llrOut Pointer to output LLRs \param llrOut Pointer to output LLRs
\param numLLR Number of LLRs \param numLLR Number of LLRs
*/ */
static inline void nrLDPC_llr2bitPacked(int8_t* out, int8_t* llrOut, uint16_t numLLR) static inline void nrLDPC_llr2bitPacked(int8_t* out, int8_t* llrOut, uint16_t numLLR)
{ {
/** Vector for moving LSB 1 to MSB 1 */
const uint8_t const127_256_epu8[32] __attribute__ ((aligned(32))) = {127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127};
/** Vector of indices for shuffling input */
const uint8_t constShuffle_256_epi8[32] __attribute__ ((aligned(32))) = {7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8};
__m256i* p_llrOut = (__m256i*) llrOut; __m256i* p_llrOut = (__m256i*) llrOut;
uint32_t* p_bits = (uint32_t*) out; uint32_t* p_bits = (uint32_t*) out;
__m256i inPerm;
int8_t* p_llrOut8; int8_t* p_llrOut8;
uint32_t bitsTmp = 0; uint32_t bitsTmp = 0;
uint32_t i; uint32_t i;
uint32_t M = numLLR>>5; uint32_t M = numLLR>>5;
uint32_t Mr = numLLR&31; uint32_t Mr = numLLR&31;
const __m256i* p_127 = (__m256i*) const127_256_epu8;
const __m256i* p_shuffle = (__m256i*) constShuffle_256_epi8;
for (i=0; i<M; i++) for (i=0; i<M; i++)
{ {
*p_bits++ = _mm256_movemask_epi8(*p_llrOut); inPerm = _mm256_shuffle_epi8(*p_llrOut,*p_shuffle);
*p_bits++ = _mm256_movemask_epi8(_mm256_adds_epu8(inPerm, *p_127));
p_llrOut++; p_llrOut++;
} }
...@@ -2805,11 +2818,11 @@ static inline void nrLDPC_llr2bitPacked(int8_t* out, int8_t* llrOut, uint16_t nu ...@@ -2805,11 +2818,11 @@ static inline void nrLDPC_llr2bitPacked(int8_t* out, int8_t* llrOut, uint16_t nu
{ {
if (p_llrOut8[i] < 0) if (p_llrOut8[i] < 0)
{ {
bitsTmp |= (1<<i); bitsTmp |= (1<<((7-i) + (16*(i/8))));
} }
else else
{ {
bitsTmp &= (0<<i); bitsTmp |= (0<<((7-i) + (16*(i/8))));
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment