diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/Makefile b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/Makefile new file mode 100644 index 0000000000..f58b8b490b --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/Makefile @@ -0,0 +1,27 @@ +C=gcc +CFLAGS=-W -Wall -mavx2 +LDFLAGS= +EXEC=cnProc_gen +SRC= $(wildcard *.c) +OBJ= $(SRC:.c=.o) + +all: $(EXEC) + +cnProc_gen: $(OBJ) + $(CC) -o $@ $^ $(LDFLAGS) + +main.o: cnProc_gen.h + +%.o: %.c + $(CC) -o $@ -c $< $(CFLAGS) + +.PHONY: clean mrproper + +clean: + rm -rf *.o + +mrproper: clean + rm -rf $(EXEC) + +zip: + tar -zcvf sauvegarde.tar.gz main.c cnProc_gen.c cnProc_geno.h Makefile diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/cnProc_gen.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/cnProc_gen.c new file mode 100644 index 0000000000..31c907d8e9 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/cnProc_gen.c @@ -0,0 +1,641 @@ + +#include +#include +#include "../nrLDPCdecoder_defs.h" +#include "../nrLDPC_types.h" +#include "../nrLDPC_init.h" +#include "../nrLDPC_mPass.h" +//#include "nrLDPC_cnProc.h" +#include "../nrLDPC_bnProc.h" +#include "cnProc_gen.h" + +void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +{ + printf("void nrLDPC_cnProc_BG1_Z%d\n",Z); + + const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; + const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; + + int8_t* cnProcBuf = p_procBuf->cnProcBuf; + int8_t* cnProcBufRes = p_procBuf->cnProcBufRes; + + //__m256i* p_cnProcBuf; + //__m256i* p_cnProcBufRes; + + // Number of CNs in Groups + uint32_t M; + uint32_t i; + uint32_t j; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t bitOffsetInGroup; + + //__m256i ymm0, min, sgn; + //__m256i* p_cnProcBufResBit; + + // const __m256i* p_ones = (__m256i*) ones256_epi8; + // const __m256i* p_maxLLR = (__m256i*) maxLLR256_epi8; + + // LUT with offsets for bits that need to be processed + // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. + // Offsets are in units of bitOffsetInGroup (1*384/32) +// const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; + + // ===================================================================== + // Process group with 3 BNs + + // LUT with offsets for bits that need to be processed + // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. + // Offsets are in units of bitOffsetInGroup (1*384/32) + const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; + + printf(" __m256i ymm0, min, sgn;\n"); + printf(" const __m256i* p_ones = (__m256i*) ones256_epi8;\n"); + printf(" const __m256i* p_maxLLR = (__m256i*) maxLLR256_epi8;\n"); + + if (lut_numCnInCnGroups[0] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[0]*Z + 31)>>5; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 3 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[0]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[0]]; + + // Loop over every BN + int iprime=0; + for (j=0; j<3; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[1]*Z + 31)>>5; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + int iprime=0; + for (j=0; j<4; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[2]*Z + 31)>>5; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + int iprime=0; + for (j=0; j<5; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[3]*Z + 31)>>5; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + int iprime=0; + for (j=0; j<6; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[4]*Z + 31)>>5; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + int iprime=0; + for (j=0; j<7; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[5]*Z + 31)>>5; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + int iprime=0; + for (j=0; j<8; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[6]*Z + 31)>>5; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 9 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + int iprime=0; + for (j=0; j<9; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[7]*Z + 31)>>5; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 10 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + int iprime=0; + for (j=0; j<10; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[8]*Z + 31)>>5; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 19 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + int iprime=0; + for (j=0; j<19; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i +#include +//#include "../nrLDPCdecoder_defs.h" +#include "../nrLDPC_types.h" +#include "../nrLDPC_init.h" +#include "../nrLDPC_mPass.h" +//#include "../nrLDPC_cnProc.h" +#include "../nrLDPC_bnProc.h" +#include "cnProc_gen.h" + +int main(int argc, char *argv[]) +{ + //short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384}; +// unsigned int errors, errors_bit, crc_misses; + // double errors_bit_uncoded; + //short block_length=8448; // decoder supports length: 1201 -> 1280, 2401 -> 2560 + + // short No_iteration=5; + //int n_segments=1; + //double rate=0.333; + //int nom_rate=1; + //int denom_rate=3; + //double SNR0=-2.0,SNR,SNR_lin; + //unsigned char qbits=8; + // unsigned int decoded_errors[10000]; // initiate the size of matrix equivalent to size of SNR + //int c,i=0, i1 = 0; + + // int n_trials = 1; + // double SNR_step = 0.1; + +// randominit(0); + //int test_uncoded= 0; + + //short BG=1,Zc,Kb; + + +// cpu_freq_GHz = get_cpu_freq_GHz(); + //printf("the decoder supports BG2, Kb=10, Z=128 & 256\n"); + //printf(" range of blocklength: 1201 -> 1280, 2401 -> 2560\n"); + // printf("block length %d: \n", block_length); + //printf("n_trials %d: \n", n_trials); + // printf("SNR0 %f: \n", SNR0); + + //find minimum value in all sets of lifting size + /* Zc=0; + + for (i1=0; i1 < 51; i1++) + { + if (lift_size[i1] >= (double) block_length/Kb) + { + Zc = lift_size[i1]; + //printf("%d\n",Zc); + break; + } + }*/ + // Allocate LDPC decoder buffers + // p_nrLDPC_procBuf = nrLDPC_init_mem(); + t_nrLDPC_procBuf cnProcBuf; + t_nrLDPC_procBuf* p_procBuf = &cnProcBuf; + +// load_nrLDPClib(); + t_nrLDPC_lut lut_numCnInCnGroups; + t_nrLDPC_lut* p_lut = &lut_numCnInCnGroups; + +// load_nrLDPClib_ref("_orig", &encoder_orig); + + nrLDPC_cnProc_BG1(p_lut,p_procBuf,384); + //nrLDPC_cnProc_BG1(&lut_numCnInCnGroups, &cnProcBuf, 380); + //for (block_length=8;block_length<=MAX_BLOCK_LENGTH;block_length+=8) + + //determine number of bits in codeword +/* + char fname[200]; + sprintf(fname,"cnProc_BG1_Zc_%d.c",384); + FILE *fd=fopen(fname,"w"); +// AssertFatal(fd!=NULL,"cannot open %s\n",fname); +*/ + //fclose(fd); + + return(0); +}