Commit 803b0289 authored by Laurent THOMAS's avatar Laurent THOMAS Committed by Robert Schmidt

Use gold cache in code word (un)scrambling

parent f207ac12
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include "nr_transport_common_proto.h" #include "nr_transport_common_proto.h"
#include "PHY/NR_REFSIG/nr_refsig.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" #include "common/utils/LOG/vcd_signal_dumper.h"
#define DEBUG_SCRAMBLING(a) #define DEBUG_SCRAMBLING(a)
//#define DEBUG_SCRAMBLING(a) a //#define DEBUG_SCRAMBLING(a) a
...@@ -32,45 +31,32 @@ void nr_codeword_scrambling(uint8_t *in, ...@@ -32,45 +31,32 @@ void nr_codeword_scrambling(uint8_t *in,
uint32_t n_RNTI, uint32_t n_RNTI,
uint32_t* out) uint32_t* out)
{ {
uint32_t x1; const int roundedSz = (size + 31) / 32;
uint32_t x2 = (n_RNTI << 15) + (q << 14) + Nid; uint32_t *seq = gold_cache((n_RNTI << 15) + (q << 14) + Nid, roundedSz);
uint32_t s = lte_gold_generic(&x1, &x2, 1); for (int i = 0; i < roundedSz; i++) {
for (int i = 0; i < ((size >> 5) + ((size & 0x1f) > 0 ? 1 : 0)); i++) {
simde__m256i c = ((simde__m256i*)in)[i]; simde__m256i c = ((simde__m256i*)in)[i];
uint32_t in32 = simde_mm256_movemask_epi8(simde_mm256_slli_epi16(c, 7)); 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])); 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) void nr_codeword_unscrambling(int16_t* llr, uint32_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI)
{ {
uint32_t x1; const int roundedSz = (size + 31) / 32;
uint32_t x2 = (n_RNTI << 15) + (q << 14) + Nid; uint32_t *seq = gold_cache((n_RNTI << 15) + (q << 14) + Nid, roundedSz);
uint32_t s = 0;
#if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__) #if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)
uint8_t *s8=(uint8_t *)&s;
simde__m128i *llr128 = (simde__m128i*)llr; simde__m128i *llr128 = (simde__m128i*)llr;
s = lte_gold_generic(&x1, &x2, 1); for (int i = 0, j = 0; i < roundedSz; i++, j += 4) {
uint8_t *s8 = (uint8_t *)(seq + i);
for (int i = 0, j = 0; i < ((size >> 5) + ((size & 0x1f) > 0 ? 1 : 0)); i++, j += 4) {
llr128[j] = simde_mm_mullo_epi16(llr128[j],byte2m128i[s8[0]]); 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+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+2] = simde_mm_mullo_epi16(llr128[j+2],byte2m128i[s8[2]]);
llr128[j+3] = simde_mm_mullo_epi16(llr128[j+3],byte2m128i[s8[3]]); llr128[j + 3] = simde_mm_mullo_epi16(llr128[j + 3], byte2m128i[s8[3]]);
s = lte_gold_generic(&x1, &x2, 0);
} }
#else #else
uint8_t reset = 1;
for (uint32_t i=0; i<size; i++) { for (uint32_t i=0; i<size; i++) {
if ((i&0x1f)==0) { if (seq[i / 32] & (1U << (i % 32)))
s = lte_gold_generic(&x1, &x2, reset);
reset = 0;
}
if (((s>>(i&0x1f))&1)==1)
llr[i] = -llr[i]; llr[i] = -llr[i];
} }
#endif #endif
...@@ -78,18 +64,14 @@ void nr_codeword_unscrambling(int16_t* llr, uint32_t size, uint8_t q, uint32_t N ...@@ -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) void nr_codeword_unscrambling_init(int16_t *s2, uint32_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI)
{ {
uint32_t x1; const int roundedSz = (size + 31) / 32;
uint32_t x2 = (n_RNTI << 15) + (q << 14) + Nid; uint32_t *seq = gold_cache((n_RNTI << 15) + (q << 14) + Nid, roundedSz);
simde__m128i *s128=(simde__m128i *)s2; simde__m128i *s128=(simde__m128i *)s2;
for (int i = 0; i < roundedSz; i++) {
uint32_t s = lte_gold_generic(&x1, &x2, 1); uint8_t *s8 = (uint8_t *)(seq + i);
uint8_t *s8=(uint8_t *)&s;
for (int i = 0; i < (size +31) >> 5; i++) {
*s128++ = byte2m128i[s8[0]]; *s128++ = byte2m128i[s8[0]];
*s128++ = byte2m128i[s8[1]]; *s128++ = byte2m128i[s8[1]];
*s128++ = byte2m128i[s8[2]]; *s128++ = byte2m128i[s8[2]];
*s128++ = byte2m128i[s8[3]]; *s128++ = byte2m128i[s8[3]];
s = lte_gold_generic(&x1, &x2, 0);
} }
} }
...@@ -57,34 +57,22 @@ ...@@ -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) 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 *seq = gold_cache((n_RNTI << 15) + Nid, (size + 31) / 32);
uint32_t x1 = 0, x2 = 0, s = 0, temp_out = 0;
reset = 1;
x2 = (n_RNTI<<15) + Nid;
for (int i=0; i<size; i++) { for (int i=0; i<size; i++) {
b_idx = i&0x1f; int idx = i / 32;
if (b_idx==0) { int b_idx = i % 32;
s = lte_gold_generic(&x1, &x2, reset);
reset = 0;
if (i)
out++;
}
if (in[i]==NR_PUSCH_x) if (in[i]==NR_PUSCH_x)
*out ^= 1<<b_idx; out[idx] ^= 1 << b_idx;
else if (in[i]==NR_PUSCH_y){ else if (in[i]==NR_PUSCH_y){
if (b_idx!=0) if (b_idx)
*out ^= (*out & (1<<(b_idx-1)))<<1; out[idx] ^= (out[idx] & (1 << (b_idx - 1))) << 1;
else{ else{
uint32_t temp_out = out[idx - 1];
temp_out = *(out-1); out[idx] ^= temp_out >> 31;
*out ^= temp_out>>31;
} }
} }
else 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); //printf("i %d b_idx %d in %d s 0x%08x out 0x%08x\n", i, b_idx, in[i], s, *out);
} }
} }
......
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