rename and take out gold generic function from lte files to specific file to avoid cross-compilation

This commit is contained in:
francescomani
2026-03-31 16:45:25 +02:00
parent a71cd36248
commit f94dad6893
24 changed files with 99 additions and 106 deletions
-4
View File
@@ -41,10 +41,6 @@ int lte_dl_cell_spec_NB_IoT(PHY_VARS_eNB_NB_IoT *phy_vars_eNB,
unsigned char p,
unsigned short RB_IoT_ID);
unsigned int lte_gold_generic_NB_IoT(unsigned int *x1,
unsigned int *x2,
unsigned char reset);
void generate_ul_ref_sigs_rx_NB_IoT(void);
+1 -1
View File
@@ -10,7 +10,7 @@
#define __LTE_REFSIG_DEFS__H__
#include "PHY/defs_eNB.h"
#include "PHY/defs_UE.h"
#include "PHY/gold.h"
/** @ingroup _PHY_REF_SIG
* @{
*/
+2 -2
View File
@@ -184,12 +184,12 @@ void pdcch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
uint32_t x1 = 0, x2 = 0, s = 0;
//LOG_D(PHY, "%s(fp, subframe:%d, e, length:%d)\n", __FUNCTION__, subframe, length);
reset = 1;
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
x2 = (subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2
for (i=0; i<length; i++) {
if ((i&0x1f)==0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
//printf("lte_gold[%d]=%x\n",i,s);
reset = 0;
}
@@ -70,7 +70,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
j = (i - i0)/Nacc;
// reset = 1;
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
if (mbsfn_flag == 0) {
#ifdef PHY_TX_THREAD
@@ -89,7 +89,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
x2 = ((Ns>>1)<<9) + frame_parms->Nid_cell_mbsfn; //this is c_init in 36.211 Sec 6.3.1 for PMCH
}
s = lte_gold_generic(&x1, &x2, 1);
s = gold_generic(&x1, &x2, 1);
for (n=0; n<(1+(G>>5)); n++) {
#ifdef DEBUG_SCRAMBLING
@@ -132,7 +132,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
// This is not faster for some unknown reason
// ((simde__m128i *)e)[0] = simde_mm_xor_si128(((simde__m128i *)e)[0],((simde__m128i *)scrambling_lut)[s&65535]);
// ((simde__m128i *)e)[1] = simde_mm_xor_si128(((simde__m128i *)e)[1],((simde__m128i *)scrambling_lut)[s>>16]);
s = lte_gold_generic(&x1, &x2, 0);
s = gold_generic(&x1, &x2, 0);
e += 32;
}
@@ -163,7 +163,7 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
uint32_t x1, x2, s=0;
// reset = 1;
// x1 is set in first call to lte_gold_generic
// x1 is set in first call to gold_generic
if (mbsfn_flag == 0)
x2 = (dlsch->rnti<<14) + (q<<13) + ((Ns>>1)<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1
@@ -173,7 +173,7 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
#ifdef DEBUG_SCRAMBLING
printf("unscrambling: rnti %x, q %d, Ns %d, Nid_cell %d G %d, x2 %x\n",dlsch->rnti,q,Ns,frame_parms->Nid_cell,G,x2);
#endif
s = lte_gold_generic(&x1, &x2, 1);
s = gold_generic(&x1, &x2, 1);
for (i=0; i<(1+(G>>5)); i++) {
for (j=0; j<32; j++,k++) {
@@ -186,7 +186,7 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
#endif
}
s = lte_gold_generic(&x1, &x2, 0);
s = gold_generic(&x1, &x2, 0);
}
}
+4 -4
View File
@@ -38,7 +38,7 @@ void mpdcch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, mDCI_ALLOC_t *mdci, uint
uint16_t i0 = mdci->i0;
// Note: we could actually not do anything if i-i0 < Nacc, save it for later
reset = 1;
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
if ((mdci->rnti == 0xFFFE) || (mdci->ce_mode == 2)) // CEModeB Note: also for mdci->rnti==SC_RNTI
Nacc = frame_parms->frame_type == FDD ? 4 : 10;
@@ -59,7 +59,7 @@ void mpdcch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, mDCI_ALLOC_t *mdci, uint
for (n = 0; n < length; n++) {
if ((n & 0x1f) == 0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
//printf("lte_gold[%d]=%x\n",i,s);
reset = 0;
}
@@ -354,7 +354,7 @@ void generate_mdci_top(PHY_VARS_eNB *eNB, int frame, int subframe, int16_t amp,
// pilot scrambling initiatlization (note: this is for a single repetition)
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
// rule for BL/CE UEs from Section 6.10.3A.1 in 36.211
@@ -394,7 +394,7 @@ void generate_mdci_top(PHY_VARS_eNB *eNB, int frame, int subframe, int16_t amp,
for (int mprime=0; mprime<3; mprime++,ii+=2) {
if ((ii & 0x1f) == 0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
reset = 0;
}
+3 -3
View File
@@ -34,7 +34,7 @@ void generate_grouphop(LTE_DL_FRAME_PARMS *frame_parms)
}
else {
if ((ns&3) == 0) {
s = lte_gold_generic(&x1,&x2,reset);
s = gold_generic(&x1,&x2,reset);
reset = 0;
}
@@ -62,7 +62,7 @@ void generate_seqhop(LTE_DL_FRAME_PARMS *frame_parms)
x2 = (32*(frame_parms->Nid_cell/30) + fss_pusch)%30;
s = lte_gold_generic(&x1,&x2,reset);
s = gold_generic(&x1,&x2,reset);
#ifdef DEBUG_GROUPHOP
printf("[PHY] SeqHop:");
#endif
@@ -105,7 +105,7 @@ void generate_nPRS(LTE_DL_FRAME_PARMS *frame_parms)
for (n=0; n<(20*Nsymb_UL); n++) { //loop over total number of bytes to generate
if ((n&3) == 0) {
s = lte_gold_generic(&x1,&x2,reset);
s = gold_generic(&x1,&x2,reset);
reset = 0;
// printf("n %d : s (%d,%d,%d,%d)\n",n,((uint8_t*)&s)[0],((uint8_t*)&s)[1],((uint8_t*)&s)[2],((uint8_t*)&s)[3]);
}
+4 -4
View File
@@ -125,13 +125,13 @@ void pbch_scrambling_fembms(LTE_DL_FRAME_PARMS *frame_parms,
uint32_t x1 = 0, x2 = 0, s = 0;
reset = 1;
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
x2 = frame_parms->Nid_cell + (1<<9); //this is c_init for FeMBMS in 36.211 Sec 6.6.1
// msg("pbch_scrambling: Nid_cell = %d\n",x2);
for (i=0; i<length; i++) {
if ((i&0x1f)==0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
// printf("lte_gold[%d]=%x\n",i,s);
reset = 0;
}
@@ -404,13 +404,13 @@ void pbch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
uint32_t x1 = 0, x2 = 0, s = 0;
reset = 1;
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
x2 = frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.6.1
// msg("pbch_scrambling: Nid_cell = %d\n",x2);
for (i=0; i<length; i++) {
if ((i&0x1f)==0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
// printf("lte_gold[%d]=%x\n",i,s);
reset = 0;
}
+2 -2
View File
@@ -18,12 +18,12 @@ void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms, uint8_t subframe, const
uint32_t x1=0, x2, s=0;
reset = 1;
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
x2 = ((((2*frame_parms->Nid_cell)+1)*(1+subframe))<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.7.1
for (i=0; i<32; i++) {
if ((i&0x1f)==0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
//printf("lte_gold[%d]=%x\n",i,s);
reset = 0;
}
+2 -2
View File
@@ -60,10 +60,10 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms,
// c = (1-(2*HI))*SSS_AMP;
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
x2 = (((subframe+1)*((frame_parms->Nid_cell<<1)+1))<<9) + frame_parms->Nid_cell;
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
// compute scrambling sequence
for (i=0; i<12; i++) {
+2 -2
View File
@@ -645,8 +645,8 @@ uint16_t pucchfmt3_Descramble( int16_t IFFTOutData_Fmt3[2][12][2],
uint32_t x1;
uint32_t s,s0,s1;
cinit = (subframe + 1) * ((2 * Nid_cell + 1)<<16) + rnti;
s0 = lte_gold_generic(&x1,&cinit,1);
s1 = lte_gold_generic(&x1,&cinit,0);
s0 = gold_generic(&x1,&cinit,1);
s1 = gold_generic(&x1,&cinit,0);
i=0;
for (m=0; m<D_NSLT1SF; m++) {
+1 -1
View File
@@ -30,7 +30,7 @@ void init_ncs_cell(LTE_DL_FRAME_PARMS *frame_parms,uint8_t ncs_cell[20][7])
for (i=0; i<8; i++) {
if ((j%32) == 0) {
s = lte_gold_generic(&x1,&x2,reset);
s = gold_generic(&x1,&x2,reset);
// printf("s %x\n",s);
reset=0;
}
@@ -607,53 +607,5 @@ int find_dlsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type);
int find_ulsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type);
int find_uci(uint16_t rnti, int frame, int subframe, PHY_VARS_eNB *eNB,find_type_t type);
static inline uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset)
{
int32_t n;
// 3GPP 3x.211
// Nc = 1600
// c(n) = [x1(n+Nc) + x2(n+Nc)]mod2
// x1(n+31) = [x1(n+3) + x1(n)]mod2
// x2(n+31) = [x2(n+3) + x2(n+2) + x2(n+1) + x2(n)]mod2
if (reset)
{
// Init value for x1: x1(0) = 1, x1(n) = 0, n=1,2,...,30
// x1(31) = [x1(3) + x1(0)]mod2 = 1
*x1 = 1 + (1U<<31);
// Init value for x2: cinit = sum_{i=0}^30 x2*2^i
// x2(31) = [x2(3) + x2(2) + x2(1) + x2(0)]mod2
// = (*x2>>3) ^ (*x2>>2) + (*x2>>1) + *x2
*x2 = *x2 ^ ((*x2 ^ (*x2>>1) ^ (*x2>>2) ^ (*x2>>3))<<31);
// x1 and x2 contain bits n = 0,1,...,31
// Nc = 1600 bits are skipped at the beginning
// i.e., 1600 / 32 = 50 32bit words
for (n = 1; n < 50; n++)
{
// Compute x1(0),...,x1(27)
*x1 = (*x1>>1) ^ (*x1>>4);
// Compute x1(28),..,x1(31) and xor
*x1 = *x1 ^ (*x1<<31) ^ (*x1<<28);
// Compute x2(0),...,x2(27)
*x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4);
// Compute x2(28),..,x2(31) and xor
*x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28);
}
}
*x1 = (*x1>>1) ^ (*x1>>4);
*x1 = *x1 ^ (*x1<<31) ^ (*x1<<28);
*x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4);
*x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28);
// c(n) = [x1(n+Nc) + x2(n+Nc)]mod2
return(*x1^*x2);
}
/**@}*/
#endif
+1 -1
View File
@@ -405,7 +405,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
else
harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe);
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
uint32_t x2 =
((uint32_t)ulsch->rnti << 14) + ((uint32_t)subframe << 9) + frame_parms->Nid_cell; // this is c_init in 36.211 Sec 6.3.1
LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
+2 -2
View File
@@ -1199,13 +1199,13 @@ void pdcch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
uint32_t x1 = 0, x2 = 0, s = 0;
reset = 1;
// x1 is set in first call to lte_gold_generic
// x1 is set in first call to gold_generic
x2 = (subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2
for (i=0; i<length; i++) {
if ((i&0x1f)==0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
// printf("lte_gold[%d]=%x\n",i,s);
reset = 0;
}
+4 -4
View File
@@ -221,13 +221,13 @@ void pbch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t reset;
uint32_t x1 = 0, x2 = 0, s = 0;
reset = 1;
// x1 is set in first call to lte_gold_generic
// x1 is set in first call to gold_generic
x2 = frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.6.1
// msg("pbch_unscrambling: Nid_cell = %d\n",x2);
for (i=0; i<length; i++) {
if (i%32==0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
// printf("lte_gold[%d]=%x\n",i,s);
reset = 0;
}
@@ -425,13 +425,13 @@ void pbch_unscrambling_fembms(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t reset;
uint32_t x1 = 0, x2 = 0, s = 0;
reset = 1;
// x1 is set in first call to lte_gold_generic
// x1 is set in first call to gold_generic
x2 = frame_parms->Nid_cell+(1<<9); //this is c_init for FeMBMS in 36.211 Sec 6.6.1
//msg("pbch_unscrambling: Nid_cell = %d, x2 = %d, frame_mod4 %d length %d\n",frame_parms->Nid_cell,x2,frame_mod4,length);
for (i=0; i<length; i++) {
if (i%32==0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
// printf("lte_gold[%d]=%x\n",i,s);
reset = 0;
}
+2 -2
View File
@@ -17,14 +17,14 @@ void pcfich_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
{
uint8_t reset = 1;
uint32_t x1 = 0; // x1 is set in lte_gold_generic
uint32_t x1 = 0; // x1 is set in gold_generic
uint32_t s = 0;
uint32_t x2 = ((((2*frame_parms->Nid_cell)+1)*(1+subframe))<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.7.1
for (uint32_t i=0; i<32; i++) {
if ((i&0x1f)==0) {
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
//printf("lte_gold[%d]=%x\n",i,s);
reset = 0;
}
+2 -2
View File
@@ -111,10 +111,10 @@ void rx_phich(PHY_VARS_UE *ue,
memset(d,0,24*sizeof(int8_t));
phich_d_ptr = phich_d;
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
x2 = (((subframe+1)*((frame_parms->Nid_cell<<1)+1))<<9) + frame_parms->Nid_cell;
s = lte_gold_generic(&x1, &x2, reset);
s = gold_generic(&x1, &x2, reset);
// compute scrambling sequence
for (i=0; i<12; i++) {
+3 -3
View File
@@ -321,7 +321,7 @@ static inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16
uint8_t c;
x2 = (rnti) + ((uint32_t)(1+subframe)<<16)*(1+(fp->Nid_cell<<1)); //this is c_init in 36.211 Sec 6.3.1
s = lte_gold_generic(&x1, &x2, 1);
s = gold_generic(&x1, &x2, 1);
for (i=0;i<19;i++) {
c = (uint8_t)((s>>i)&1);
btilde[i] = (((B>>i)&1) ^ c);
@@ -632,8 +632,8 @@ void generate_pucch3x(int32_t **txdataF,
// Scrambling
cinit = (subframe + 1) * ((2 * frame_parms->Nid_cell + 1)<<16) + rnti;
s0 = lte_gold_generic(&x1,&cinit,1);
s1 = lte_gold_generic(&x1,&cinit,0);
s0 = gold_generic(&x1,&cinit,1);
s1 = gold_generic(&x1,&cinit,0);
for (i=0; i<48; i++) {
s = (i<32)? s0:s1;
@@ -164,7 +164,7 @@ void ulsch_modulation(int32_t **txdataF,
return;
}
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
x2 = (ulsch->rnti<<14) + (subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1
if (harq_pid>=8) {
@@ -203,7 +203,7 @@ void ulsch_modulation(int32_t **txdataF,
// scrambling (Note the placeholding bits are handled in ulsch_coding.c directly!)
//printf("ulsch bits: ");
s = lte_gold_generic(&x1, &x2, 1);
s = gold_generic(&x1, &x2, 1);
k=0;
//printf("G %d\n",G);
@@ -224,7 +224,7 @@ void ulsch_modulation(int32_t **txdataF,
}
s = lte_gold_generic(&x1, &x2, 0);
s = gold_generic(&x1, &x2, 0);
}
//printf("\n");
+2 -2
View File
@@ -3,7 +3,7 @@
*/
#include "sl_refsig_defs.h"
#include "openair1/PHY/LTE_TRANSPORT/transport_proto.h" // for lte_gold_generic()
#include "openair1/PHY/gold.h"
void sl_init_psbch_dmrs_gold_sequences(PHY_VARS_NR_UE *UE)
{
@@ -20,7 +20,7 @@ void sl_init_psbch_dmrs_gold_sequences(PHY_VARS_NR_UE *UE)
#endif
for (uint8_t n = 0; n < SL_NR_NUM_PSBCH_DMRS_RE_DWORD; n++) {
UE->SL_UE_PHY_PARAMS.init_params.psbch_dmrs_gold_sequences[slss_id][n] = lte_gold_generic(&x1, &x2, reset);
UE->SL_UE_PHY_PARAMS.init_params.psbch_dmrs_gold_sequences[slss_id][n] = gold_generic(&x1, &x2, reset);
reset = 0;
#ifdef SL_DEBUG_INIT_DATA
+3 -3
View File
@@ -3,7 +3,7 @@
*/
#include "nr_refsig.h"
#include "openair1/PHY/LTE_TRANSPORT/transport_proto.h" // for lte_gold_generic()
#include "openair1/PHY/gold.h"
#define REFRESH_RATE (1000 * 100)
@@ -141,9 +141,9 @@ uint32_t *gold_cache(uint32_t key, int length)
*new = (gold_cache_t){.key = key, .length = length, .usage = 1};
unsigned int x1 = 0, x2 = key;
uint32_t *sequence = firstFree + roundedHeaderSz;
*sequence++ = lte_gold_generic(&x1, &x2, 1);
*sequence++ = gold_generic(&x1, &x2, 1);
for (int n = 1; n < length; n++)
*sequence++ = lte_gold_generic(&x1, &x2, 0);
*sequence++ = gold_generic(&x1, &x2, 0);
LOG_D(PHY, "created a gold sequence, start %d; len %d\n", key, length);
return firstFree + roundedHeaderSz;
}
+4 -3
View File
@@ -7,6 +7,7 @@
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
#include "PHY/CODING/nrPolar_tools/nr_polar_psbch_defs.h"
#include "PHY/MODULATION/nr_modulation.h"
#include "PHY/gold.h"
// #define SL_DEBUG
@@ -19,7 +20,7 @@
void sl_psbch_scrambling(uint32_t *output, uint32_t id, uint16_t length)
{
uint32_t x1, x2, s = 0;
// x1 is set in lte_gold_generic
// x1 is set in gold_generic
x2 = id; // C_INIT
#ifdef SL_DEBUG
@@ -29,7 +30,7 @@ void sl_psbch_scrambling(uint32_t *output, uint32_t id, uint16_t length)
#endif
// get initial 32 scrambing bits
s = lte_gold_generic(&x1, &x2, 1);
s = gold_generic(&x1, &x2, 1);
#ifdef SL_DEBUG
printf("s: %04x\t", s);
#endif
@@ -40,7 +41,7 @@ void sl_psbch_scrambling(uint32_t *output, uint32_t id, uint16_t length)
output[i >> 5] ^= s;
i += 32;
s = lte_gold_generic(&x1, &x2, 0);
s = gold_generic(&x1, &x2, 0);
#ifdef SL_DEBUG
printf("s: %04x\t", s);
#endif
@@ -11,8 +11,6 @@
#include "SCHED_NR_UE/defs.h"
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
#include <math.h>
#include "nfapi_interface.h"
#include <openair1/PHY/LTE_TRANSPORT/transport_proto.h>
#define NR_PUSCH_x 2 // UCI placeholder bit TS 38.212 V15.4.0 subclause 5.3.3.1
#define NR_PUSCH_y 3 // UCI placeholder bit
+46
View File
@@ -0,0 +1,46 @@
/*
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
*/
#ifndef __openair_GOLD_H__
#define __openair_GOLD_H__
static inline uint32_t gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset)
{
int32_t n;
// 3GPP 3x.211
// Nc = 1600
// c(n) = [x1(n+Nc) + x2(n+Nc)]mod2
// x1(n+31) = [x1(n+3) + x1(n)]mod2
// x2(n+31) = [x2(n+3) + x2(n+2) + x2(n+1) + x2(n)]mod2
if (reset) {
// Init value for x1: x1(0) = 1, x1(n) = 0, n=1,2,...,30
// x1(31) = [x1(3) + x1(0)]mod2 = 1
*x1 = 1 + (1U << 31);
// Init value for x2: cinit = sum_{i=0}^30 x2*2^i
// x2(31) = [x2(3) + x2(2) + x2(1) + x2(0)]mod2
// = (*x2>>3) ^ (*x2>>2) + (*x2>>1) + *x2
*x2 = *x2 ^ ((*x2 ^ (*x2 >> 1) ^ (*x2 >> 2) ^ (*x2 >> 3)) << 31);
// x1 and x2 contain bits n = 0,1,...,31
// Nc = 1600 bits are skipped at the beginning
// i.e., 1600 / 32 = 50 32bit words
for (n = 1; n < 50; n++) {
// Compute x1(0),...,x1(27)
*x1 = (*x1 >> 1) ^ (*x1 >> 4);
// Compute x1(28),..,x1(31) and xor
*x1 = *x1 ^ (*x1 << 31) ^ (*x1 << 28);
// Compute x2(0),...,x2(27)
*x2 = (*x2 >> 1) ^ (*x2 >> 2) ^ (*x2 >> 3) ^ (*x2 >> 4);
// Compute x2(28),..,x2(31) and xor
*x2 = *x2 ^ (*x2 << 31) ^ (*x2 << 30) ^ (*x2 << 29) ^ (*x2 << 28);
}
}
*x1 = (*x1 >> 1) ^ (*x1 >> 4);
*x1 = *x1 ^ (*x1 << 31) ^ (*x1 << 28);
*x2 = (*x2 >> 1) ^ (*x2 >> 2) ^ (*x2 >> 3) ^ (*x2 >> 4);
*x2 = *x2 ^ (*x2 << 31) ^ (*x2 << 30) ^ (*x2 << 29) ^ (*x2 << 28);
// c(n) = [x1(n+Nc) + x2(n+Nc)]mod2
return(*x1 ^ *x2);
}
#endif