Use gold cache in code word (un)scrambling
This commit is contained in:
committed by
Robert Schmidt
parent
f207ac12be
commit
803b0289a6
@@ -21,7 +21,6 @@
|
||||
|
||||
#include "nr_transport_common_proto.h"
|
||||
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||
#include "openair1/PHY/LTE_TRANSPORT/transport_proto.h" // for lte_gold_generic()
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#define DEBUG_SCRAMBLING(a)
|
||||
//#define DEBUG_SCRAMBLING(a) a
|
||||
@@ -32,45 +31,32 @@ void nr_codeword_scrambling(uint8_t *in,
|
||||
uint32_t n_RNTI,
|
||||
uint32_t* out)
|
||||
{
|
||||
uint32_t x1;
|
||||
uint32_t x2 = (n_RNTI << 15) + (q << 14) + Nid;
|
||||
uint32_t s = lte_gold_generic(&x1, &x2, 1);
|
||||
for (int i = 0; i < ((size >> 5) + ((size & 0x1f) > 0 ? 1 : 0)); i++) {
|
||||
const int roundedSz = (size + 31) / 32;
|
||||
uint32_t *seq = gold_cache((n_RNTI << 15) + (q << 14) + Nid, roundedSz);
|
||||
for (int i = 0; i < roundedSz; i++) {
|
||||
simde__m256i c = ((simde__m256i*)in)[i];
|
||||
uint32_t in32 = simde_mm256_movemask_epi8(simde_mm256_slli_epi16(c, 7));
|
||||
out[i] = (in32 ^ s);
|
||||
out[i] = in32 ^ seq[i];
|
||||
DEBUG_SCRAMBLING(LOG_D(PHY, "in[%d] %x => %x\n", i, in32, out[i]));
|
||||
s = lte_gold_generic(&x1, &x2, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void nr_codeword_unscrambling(int16_t* llr, uint32_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI)
|
||||
{
|
||||
uint32_t x1;
|
||||
uint32_t x2 = (n_RNTI << 15) + (q << 14) + Nid;
|
||||
uint32_t s = 0;
|
||||
|
||||
const int roundedSz = (size + 31) / 32;
|
||||
uint32_t *seq = gold_cache((n_RNTI << 15) + (q << 14) + Nid, roundedSz);
|
||||
#if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)
|
||||
uint8_t *s8=(uint8_t *)&s;
|
||||
simde__m128i *llr128 = (simde__m128i*)llr;
|
||||
s = lte_gold_generic(&x1, &x2, 1);
|
||||
|
||||
for (int i = 0, j = 0; i < ((size >> 5) + ((size & 0x1f) > 0 ? 1 : 0)); i++, j += 4) {
|
||||
for (int i = 0, j = 0; i < roundedSz; i++, j += 4) {
|
||||
uint8_t *s8 = (uint8_t *)(seq + i);
|
||||
llr128[j] = simde_mm_mullo_epi16(llr128[j],byte2m128i[s8[0]]);
|
||||
llr128[j+1] = simde_mm_mullo_epi16(llr128[j+1],byte2m128i[s8[1]]);
|
||||
llr128[j+2] = simde_mm_mullo_epi16(llr128[j+2],byte2m128i[s8[2]]);
|
||||
llr128[j+3] = simde_mm_mullo_epi16(llr128[j+3],byte2m128i[s8[3]]);
|
||||
s = lte_gold_generic(&x1, &x2, 0);
|
||||
llr128[j + 3] = simde_mm_mullo_epi16(llr128[j + 3], byte2m128i[s8[3]]);
|
||||
}
|
||||
#else
|
||||
uint8_t reset = 1;
|
||||
|
||||
for (uint32_t i=0; i<size; i++) {
|
||||
if ((i&0x1f)==0) {
|
||||
s = lte_gold_generic(&x1, &x2, reset);
|
||||
reset = 0;
|
||||
}
|
||||
if (((s>>(i&0x1f))&1)==1)
|
||||
if (seq[i / 32] & (1U << (i % 32)))
|
||||
llr[i] = -llr[i];
|
||||
}
|
||||
#endif
|
||||
@@ -78,18 +64,14 @@ void nr_codeword_unscrambling(int16_t* llr, uint32_t size, uint8_t q, uint32_t N
|
||||
|
||||
void nr_codeword_unscrambling_init(int16_t *s2, uint32_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI)
|
||||
{
|
||||
uint32_t x1;
|
||||
uint32_t x2 = (n_RNTI << 15) + (q << 14) + Nid;
|
||||
const int roundedSz = (size + 31) / 32;
|
||||
uint32_t *seq = gold_cache((n_RNTI << 15) + (q << 14) + Nid, roundedSz);
|
||||
simde__m128i *s128=(simde__m128i *)s2;
|
||||
|
||||
uint32_t s = lte_gold_generic(&x1, &x2, 1);
|
||||
uint8_t *s8=(uint8_t *)&s;
|
||||
|
||||
for (int i = 0; i < (size +31) >> 5; i++) {
|
||||
for (int i = 0; i < roundedSz; i++) {
|
||||
uint8_t *s8 = (uint8_t *)(seq + i);
|
||||
*s128++ = byte2m128i[s8[0]];
|
||||
*s128++ = byte2m128i[s8[1]];
|
||||
*s128++ = byte2m128i[s8[2]];
|
||||
*s128++ = byte2m128i[s8[3]];
|
||||
s = lte_gold_generic(&x1, &x2, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,34 +57,22 @@
|
||||
|
||||
void nr_pusch_codeword_scrambling_uci(uint8_t *in, uint32_t size, uint32_t Nid, uint32_t n_RNTI, uint32_t* out)
|
||||
{
|
||||
uint8_t reset, b_idx;
|
||||
uint32_t x1 = 0, x2 = 0, s = 0, temp_out = 0;
|
||||
|
||||
reset = 1;
|
||||
x2 = (n_RNTI<<15) + Nid;
|
||||
|
||||
uint32_t *seq = gold_cache((n_RNTI << 15) + Nid, (size + 31) / 32);
|
||||
for (int i=0; i<size; i++) {
|
||||
b_idx = i&0x1f;
|
||||
if (b_idx==0) {
|
||||
s = lte_gold_generic(&x1, &x2, reset);
|
||||
reset = 0;
|
||||
if (i)
|
||||
out++;
|
||||
}
|
||||
int idx = i / 32;
|
||||
int b_idx = i % 32;
|
||||
if (in[i]==NR_PUSCH_x)
|
||||
*out ^= 1<<b_idx;
|
||||
out[idx] ^= 1 << b_idx;
|
||||
else if (in[i]==NR_PUSCH_y){
|
||||
if (b_idx!=0)
|
||||
*out ^= (*out & (1<<(b_idx-1)))<<1;
|
||||
if (b_idx)
|
||||
out[idx] ^= (out[idx] & (1 << (b_idx - 1))) << 1;
|
||||
else{
|
||||
|
||||
temp_out = *(out-1);
|
||||
*out ^= temp_out>>31;
|
||||
|
||||
uint32_t temp_out = out[idx - 1];
|
||||
out[idx] ^= temp_out >> 31;
|
||||
}
|
||||
}
|
||||
else
|
||||
*out ^= (((in[i])&1) ^ ((s>>b_idx)&1))<<b_idx;
|
||||
out[idx] ^= (((in[i]) & 1) ^ ((seq[idx] >> b_idx) & 1)) << b_idx;
|
||||
//printf("i %d b_idx %d in %d s 0x%08x out 0x%08x\n", i, b_idx, in[i], s, *out);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user