diff --git a/ci-scripts/cls_cluster.py b/ci-scripts/cls_cluster.py index 9e0988c323..648d132b9e 100644 --- a/ci-scripts/cls_cluster.py +++ b/ci-scripts/cls_cluster.py @@ -263,7 +263,6 @@ class Cluster: baseTag = 'develop' forceBaseImageBuild = False - imageTag = 'develop' if self.ranAllowMerge: # merging MR branch into develop -> temporary image imageTag = f'{self.ranBranch}-{self.ranCommitID[0:8]}' if self.ranTargetBranch == 'develop': @@ -273,6 +272,7 @@ class Cluster: forceBaseImageBuild = True baseTag = 'ci-temp' else: + imageTag = f'develop-{self.ranCommitID[0:8]}' forceBaseImageBuild = True # logging to OC Cluster and then switch to corresponding project @@ -332,11 +332,18 @@ class Cluster: ranbuild_job = self._start_build('ran-build') attemptedImages += ['ran-build'] - wait = ranbuild_job is not None and physim_job is not None and self._wait_build_end([ranbuild_job, physim_job], 1200) - if not wait: logging.error('error during build of ranbuild_job or physim_job') + self._recreate_is_tag('oai-clang', imageTag, 'openshift/oai-clang-is.yaml') + self._recreate_bc('oai-clang', imageTag, 'openshift/oai-clang-bc.yaml') + self._retag_image_statement('ran-base', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-base', baseTag, 'docker/Dockerfile.clang.rhel8.2') + clang_job = self._start_build('oai-clang') + attemptedImages += ['oai-clang'] + + wait = ranbuild_job is not None and physim_job is not None and clang_job is not None and self._wait_build_end([ranbuild_job, physim_job, clang_job], 1200) + if not wait: logging.error('error during build of ranbuild_job or physim_job or clang_job') status = status and wait self.cmd.run(f'oc logs {ranbuild_job} &> cmake_targets/log/ran-build.log') self.cmd.run(f'oc logs {physim_job} &> cmake_targets/log/oai-physim.log') + self.cmd.run(f'oc logs {clang_job} &> cmake_targets/log/oai-clang.log') self.cmd.run(f'oc get pods.metrics.k8s.io &>> cmake_targets/log/build-metrics.log', '\$', 10) if status: diff --git a/ci-scripts/cls_physim1.py b/ci-scripts/cls_physim1.py index 0a45f945a2..2306db513f 100644 --- a/ci-scripts/cls_physim1.py +++ b/ci-scripts/cls_physim1.py @@ -114,7 +114,7 @@ class PhySim: logging.debug('Merging with the target branch: ' + self.ranTargetBranch) mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 30) else: - imageTag = "develop" + imageTag = f'develop-{self.ranCommitID[0:8]}' # logging to OC Cluster and then switch to corresponding project mySSH.command(f'oc login -u {ocUserName} -p {ocPassword} --server https://api.oai.cs.eurecom.fr:6443', '\$', 30) diff --git a/ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf b/ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf index 2e3b4e3f0c..9da10eefbd 100644 --- a/ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf +++ b/ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf @@ -199,7 +199,7 @@ MACRLCs = ( tr_n_preference = "local_RRC"; pusch_TargetSNRx10 = 200; pucch_TargetSNRx10 = 200; - ulsch_max_frame_inactivity=0; + ulsch_max_frame_inactivity = 10; ul_max_mcs = 15; } ); diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 7840e89e28..934726a6c3 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -289,11 +289,13 @@ (Test10: Format 2 9-bit 2/106 PRB), (Test11: Format 2 10-bit 2/106 PRB), (Test12: Format 2 11-bit 2/106 PRB), - (Test13: Format 2 12-bit 8/106 PRB), - (Test14: Format 2 19-bit 8/106 PRB), - (Test15: Format 2 32-bit 8/106 PRB), - (Test16: Format 2 32-bit 16/106 PRB), - (Test17: Format 2 64-bit 16/106 PRB) + (Test13: Format 2 12-bit 4/106 PRB), + (Test14: Format 2 19-bit 4/106 PRB), + (Test15: Format 2 12-bit 8/106 PRB), + (Test16: Format 2 19-bit 8/106 PRB), + (Test17: Format 2 32-bit 8/106 PRB), + (Test18: Format 2 32-bit 16/106 PRB), + (Test19: Format 2 64-bit 16/106 PRB) nr_pucchsim -R 106 -i 1 -P 0 -b 1 -s-2 -n1000 -R 106 -i 1 -P 0 -b 2 -s-2 -n1000 @@ -307,12 +309,14 @@ -R 106 -i 1 -P 2 -b 9 -s5 -n1000 -R 106 -i 1 -P 2 -b 10 -s6 -n1000 -R 106 -i 1 -P 2 -b 11 -s6 -n1000 + -R 106 -i 1 -P 2 -q4 -b 12 -s-3 -n1000 + -R 106 -i 1 -P 2 -q4 -b 19 -s-3 -n1000 -R 106 -i 1 -P 2 -q8 -b 12 -s-3 -n1000 -R 106 -i 1 -P 2 -q8 -b 19 -s-3 -n1000 -R 106 -i 1 -P 2 -q8 -b 32 -s-3 -n1000 -R 106 -i 1 -P 2 -q16 -b 32 -s-3 -n1000 -R 106 -i 1 -P 2 -q16 -b 64 -s-3 -n1000 - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 + test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 PUCCH test OK segmentation fault|assertion|exiting|fatal 3 @@ -351,22 +355,24 @@ - nr_ulsim Test cases. (Test1: MCS 9, 106 PRBs), - (Test2: MCS 16, 50 PRBs), - (Test3: MCS 28, 50 PRBs), - (Test4: MCS 9, 217 PRBs), - (Test5: MCS 9, 273 PRBs), - (Test6: PUSCH Type A, 2 DMRS Symbols), - (Test7: PUSCH Type A, 3 DMRS, 4 PTRS, 5 Interpolated Symbols), - (Test8: PUSCH Type B, 3 DMRS, 2 PTRS, 7 Interpolated Symbols), - (Test9: PUSCH Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols), - (Test10: 25 PRBs, 15 kHz SCS), - (Test11: MCS 0, low SNR performance) - (Test12: MCS 28, 106 PRBs, Time shift 8) + nr_ulsim Test cases. (Test1: MCS 9 106 PRBs), + (Test2: MCS 16 50 PRBs), + (Test3: MCS 28 50 PRBs), + (Test4: MCS 27 50 PRBs 256QAM), + (Test5: MCS 9 217 PRBs), + (Test6: MCS 9 273 PRBs), + (Test7: PUSCH Type A, 2 DMRS Symbols), + (Test8: PUSCH Type A, 3 DMRS, 4 PTRS, 5 Interpolated Symbols), + (Test9: PUSCH Type B, 3 DMRS, 2 PTRS, 7 Interpolated Symbols), + (Test10: PUSCH Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols), + (Test11: 25 PRBs, 15 kHz SCS), + (Test12: MCS 0, low SNR performance) + (Test13: MCS 28, 106 PRBs, Time shift 8) nr_ulsim -n100 -m9 -r106 -s5 -n100 -m16 -s10 -n100 -m28 -s20 + -n100 -m27 -s25 -q1 -n100 -m9 -R217 -r217 -s5 -n100 -m9 -R273 -r273 -s5 -n100 -s5 -U 0,1,1,1 @@ -376,7 +382,7 @@ -n100 -u0 -m0 -R25 -r25 -i 1,0 -n100 -m0 -S -0.6 -i 1,0 -n100 -m 28 -R106 -r106 -t90 -s24 -S24 -d 8 - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 + test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 PUSCH test OK segmentation fault|assertion|exiting|fatal 3 diff --git a/common/platform_constants.h b/common/platform_constants.h index 8fc8d9c237..8e17c18343 100644 --- a/common/platform_constants.h +++ b/common/platform_constants.h @@ -81,7 +81,7 @@ #define RLC_TX_MAXSIZE 10000000 #define RLC_RX_MAXSIZE 10000000 #define SEND_MRW_ON 240 - +#define MAX_ANT 8 // CBA constant #define NUM_MAX_CBA_GROUP 4 diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 25586abe82..4c60d21e4e 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -49,8 +49,8 @@ int get_supported_band_index(int scs, int band, int n_rbs) int scs_index = scs; if (band > 256) scs_index++; - for (int i = 0; i < 11; i++) { - if(n_rbs == tables_5_3_2[scs][i]) + for (int i = 0; i < 12; i++) { + if(n_rbs == tables_5_3_2[scs_index][i]) return i; } return (-1); // not found @@ -130,34 +130,34 @@ const nr_bandentry_t nr_bandtable[] = { {261,27500040,28350000,27500040,28350000, 2,2070833, 120} }; -int get_supported_bw_khz(frequency_range_t frequency_range, int bw_index) +int get_supported_bw_mhz(frequency_range_t frequency_range, int bw_index) { if (frequency_range == FR1) { switch (bw_index) { case 0 : - return 5000; // 5MHz + return 5; // 5MHz case 1 : - return 10000; + return 10; case 2 : - return 15000; + return 15; case 3 : - return 20000; + return 20; case 4 : - return 25000; + return 25; case 5 : - return 30000; + return 30; case 6 : - return 40000; + return 40; case 7 : - return 50000; + return 50; case 8 : - return 60000; + return 60; case 9 : - return 80000; + return 80; case 10 : - return 90000; + return 90; case 11 : - return 100000; + return 100; default : AssertFatal(false, "Invalid band index for FR1 %d\n", bw_index); } @@ -165,13 +165,13 @@ int get_supported_bw_khz(frequency_range_t frequency_range, int bw_index) else { switch (bw_index) { case 0 : - return 50000; // 50MHz + return 50; // 50MHz case 1 : - return 100000; + return 100; case 2 : - return 200000; + return 200; case 3 : - return 400000; + return 400; default : AssertFatal(false, "Invalid band index for FR2 %d\n", bw_index); } @@ -184,7 +184,7 @@ bool compare_relative_ul_channel_bw(int nr_band, int scs, int nb_ul, frame_type_ // Relative channel bandwidth <= 4% for TDD bands and <= 3% for FDD bands int index = get_nr_table_idx(nr_band, scs); int bw_index = get_supported_band_index(scs, nr_band, nb_ul); - int band_size_khz = get_supported_bw_khz(nr_band > 256 ? FR2 : FR1, bw_index); + int band_size_khz = get_supported_bw_mhz(nr_band > 256 ? FR2 : FR1, bw_index) * 1000; float limit = frame_type == TDD ? 0.04 : 0.03; float rel_bw = (float) (2 * band_size_khz) / (float) (nr_bandtable[index].ul_max + nr_bandtable[index].ul_min); return rel_bw <= limit; @@ -382,118 +382,6 @@ int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index) return delta_duplex; } -uint16_t config_bandwidth(int mu, int nb_rb, int nr_band) -{ - - if (nr_band < 100) { //FR1 - switch(mu) { - case 0 : - if (nb_rb<=25) - return 5; - if (nb_rb<=52) - return 10; - if (nb_rb<=79) - return 15; - if (nb_rb<=106) - return 20; - if (nb_rb<=133) - return 25; - if (nb_rb<=160) - return 30; - if (nb_rb<=216) - return 40; - if (nb_rb<=270) - return 50; - AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band); - break; - case 1 : - if (nb_rb<=11) - return 5; - if (nb_rb<=24) - return 10; - if (nb_rb<=38) - return 15; - if (nb_rb<=51) - return 20; - if (nb_rb<=65) - return 25; - if (nb_rb<=78) - return 30; - if (nb_rb<=106) - return 40; - if (nb_rb<=133) - return 50; - if (nb_rb<=162) - return 60; - if (nb_rb<=189) - return 70; - if (nb_rb<=217) - return 80; - if (nb_rb<=245) - return 90; - if (nb_rb<=273) - return 100; - AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band); - break; - case 2 : - if (nb_rb<=11) - return 10; - if (nb_rb<=18) - return 15; - if (nb_rb<=24) - return 20; - if (nb_rb<=31) - return 25; - if (nb_rb<=38) - return 30; - if (nb_rb<=51) - return 40; - if (nb_rb<=65) - return 50; - if (nb_rb<=79) - return 60; - if (nb_rb<=93) - return 70; - if (nb_rb<=107) - return 80; - if (nb_rb<=121) - return 90; - if (nb_rb<=135) - return 100; - AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band); - break; - default: - AssertFatal(1==0,"Numerology %d undefined for band %d in FR1\n", mu,nr_band); - } - } - else { - switch(mu) { - case 2 : - if (nb_rb<=66) - return 50; - if (nb_rb<=132) - return 100; - if (nb_rb<=264) - return 200; - AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band); - break; - case 3 : - if (nb_rb<=32) - return 50; - if (nb_rb<=66) - return 100; - if (nb_rb<=132) - return 200; - if (nb_rb<=264) - return 400; - AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band); - break; - default: - AssertFatal(1==0,"Numerology %d undefined for band %d in FR1\n", mu,nr_band); - } - } -} - // Returns the corresponding row index of the NR table int get_nr_table_idx(int nr_bandP, uint8_t scs_index) { int scs_khz = 15 << scs_index; diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index 9c3ba88be2..9f258ea448 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -76,7 +76,6 @@ int get_first_ul_slot(int nrofDownlinkSlots, int nrofDownlinkSymbols, int nrofUp int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs); int get_SLIV(uint8_t S, uint8_t L); void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset); -uint16_t config_bandwidth(int mu, int nb_rb, int nr_band); int get_nr_table_idx(int nr_bandP, uint8_t scs_index); int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index); frame_type_t get_frame_type(uint16_t nr_bandP, uint8_t scs_index); @@ -94,6 +93,7 @@ int get_supported_band_index(int scs, int band, int n_rbs); long rrc_get_max_nr_csrs(const int max_rbs, long b_SRS); void get_K1_K2(int N1, int N2, int *K1, int *K2); bool compare_relative_ul_channel_bw(int nr_band, int scs, int nb_ul, frame_type_t frame_type); +int get_supported_bw_mhz(frequency_range_t frequency_range, int bw_index); void get_samplerate_and_bw(int mu, int n_rb, int8_t threequarter_fs, diff --git a/common/utils/telnetsrv/telnetsrv_5Gue_measurements.c b/common/utils/telnetsrv/telnetsrv_5Gue_measurements.c index 969521b3c5..ae04666c95 100644 --- a/common/utils/telnetsrv/telnetsrv_5Gue_measurements.c +++ b/common/utils/telnetsrv/telnetsrv_5Gue_measurements.c @@ -96,10 +96,7 @@ void measurcmd_display_phyta(telnet_printfunc_t prnt) PHY_VARS_NR_UE *UE = PHY_vars_UE_g[0][0]; prnt("%s PHY TA stats\n", HDR); prnt("N_TA_offset %d\n", UE->N_TA_offset); - for (int i = 0; i < UE->n_connected_gNB; ++i) { - NR_UL_TIME_ALIGNMENT_t *ta = &UE->ul_time_alignment[i]; - prnt("gNB %d TA command %d TA total %d TAG ID %d\n", i, ta->ta_command, ta->ta_total, ta->tag_id); - } + prnt("TA command %d\n", UE->ta_command); prnt("timing_advance %d (samples)\n", UE->timing_advance); } /* diff --git a/common/utils/time_meas.h b/common/utils/time_meas.h index 1bca9c3466..3b5e194c2c 100644 --- a/common/utils/time_meas.h +++ b/common/utils/time_meas.h @@ -153,15 +153,17 @@ static inline void start_meas(time_stats_t *ts) { static inline void stop_meas(time_stats_t *ts) { if (opp_enabled) { long long out = rdtsc_oai(); - ts->diff += (out-ts->in); - /// process duration is the difference between two clock points - ts->p_time = (out-ts->in); - ts->diff_square += ((double)out-ts->in)*((double)out-ts->in); + if (ts->in) { + ts->diff += (out - ts->in); + /// process duration is the difference between two clock points + ts->p_time = (out - ts->in); + ts->diff_square += ((double)out - ts->in) * ((double)out - ts->in); - if ((out-ts->in) > ts->max) - ts->max = out-ts->in; + if ((out - ts->in) > ts->max) + ts->max = out - ts->in; - ts->meas_flag=0; + ts->meas_flag = 0; + } } } diff --git a/doc/FEATURE_SET.md b/doc/FEATURE_SET.md index 726fe84a74..b3ca79c070 100644 --- a/doc/FEATURE_SET.md +++ b/doc/FEATURE_SET.md @@ -259,6 +259,7 @@ The following features are valid for the gNB and the 5G-NR UE. - PTRS support - Support for 1, 2 and 4 TX antennas - Support for up to 2 layers (currently limited to DMRS configuration type 2) + - Support for 256 QAM * NR-CSIRS Generation of sequence at PHY * NR-PUSCH (including Segmentation, LDPC encoding, rate matching, scrambling, modulation, RB mapping, etc). - PUSCH mapping type A and B @@ -267,6 +268,7 @@ The following features are valid for the gNB and the 5G-NR UE. - PTRS support - Support for up to 2 RX antenna - Support for up to 2 layers + - Support for 256 QAM * NR-PUCCH - Format 0 (2 bits, for ACK/NACK and SR) - Format 2 (up to 11 bits, mainly for CSI feedback) diff --git a/docker/Dockerfile.clang.rhel8.2 b/docker/Dockerfile.clang.rhel8.2 new file mode 100644 index 0000000000..11ead620ee --- /dev/null +++ b/docker/Dockerfile.clang.rhel8.2 @@ -0,0 +1,43 @@ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ +#--------------------------------------------------------------------- +# +# Dockerfile for the Open-Air-Interface BUILD service +# Valid for RHEL8 +# +#--------------------------------------------------------------------- + +FROM ran-base:latest AS oai-clang + +RUN rm -Rf /oai-ran +WORKDIR /oai-ran +COPY . . + +#only install LLVM (clang, ...) for this container, the others don't need it +RUN yum install -y llvm-toolset + +#run build_oai to build the target image +RUN /bin/sh oaienv && \ + cd cmake_targets && \ + mkdir -p log && \ + export CC=/usr/bin/clang && \ + export CXX=/usr/bin/clang++ && \ + ./build_oai --phy_simulators --gNB --eNB --nrUE --UE --ninja --verbose-ci --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror diff --git a/docker/Dockerfile.phySim.rhel8.2 b/docker/Dockerfile.phySim.rhel8.2 index ad0944f02b..df1e5af51c 100644 --- a/docker/Dockerfile.phySim.rhel8.2 +++ b/docker/Dockerfile.phySim.rhel8.2 @@ -31,16 +31,14 @@ RUN rm -Rf /oai-ran WORKDIR /oai-ran COPY . . -#only install address sanitizer and LLVM (clang, ...) for this container, the others don't need it -RUN yum install -y libasan llvm-toolset +#only install address and undefined behavior sanitizer for this container, the others don't need it +RUN yum install -y libasan libubsan #run build_oai to build the target image RUN /bin/sh oaienv && \ cd cmake_targets && \ mkdir -p log && \ - export CC=/usr/bin/clang && \ - export CXX=/usr/bin/clang++ && \ - ./build_oai --phy_simulators --gNB --eNB --nrUE --UE --ninja --verbose-ci --sanitize-address --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror + ./build_oai --phy_simulators --ninja --verbose-ci --sanitize --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror #start from scratch for target executable FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim @@ -89,6 +87,7 @@ COPY --from=phy-sim-build \ /lib64/libexslt.so.0 \ /lib64/libxslt.so.1 \ /usr/lib64/libasan.so.5 \ + /usr/lib64/libubsan.so.1 \ /oai-ran/cmake_targets/ran_build/build/libdfts.so \ /oai-ran/cmake_targets/ran_build/build/libldpc.so \ /oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \ diff --git a/executables/nr-ue.c b/executables/nr-ue.c index b4510b1f53..5860d7c64d 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -154,7 +154,6 @@ void init_nr_ue_vars(PHY_VARS_NR_UE *ue, int nb_connected_gNB = 1; ue->Mod_id = UE_id; - ue->mac_enabled = 1; ue->if_inst = nr_ue_if_module_init(0); ue->dci_thres = 0; ue->target_Nid_cell = -1; @@ -259,8 +258,6 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) reset_queue(&nr_ul_dci_req_queue); reset_queue(&nr_ul_tti_req_queue); - NR_UL_TIME_ALIGNMENT_t ul_time_alignment; - memset(&ul_time_alignment, 0, sizeof(ul_time_alignment)); int last_sfn_slot = -1; uint16_t sfn_slot = 0; @@ -305,7 +302,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) if (get_softmodem_params()->sa && mac->mib == NULL) { LOG_D(NR_MAC, "We haven't gotten MIB. Lets see if we received it\n"); - nr_ue_dl_indication(&mac->dl_info, &ul_time_alignment); + nr_ue_dl_indication(&mac->dl_info); process_queued_nr_nfapi_msgs(mac, sfn_slot); } if (mac->scc == NULL && mac->scc_SIB == NULL) { @@ -347,7 +344,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) mac->dl_info.slot = slot; mac->dl_info.dci_ind = NULL; mac->dl_info.rx_ind = NULL; - nr_ue_dl_indication(&mac->dl_info, &ul_time_alignment); + nr_ue_dl_indication(&mac->dl_info); } if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort(); @@ -628,7 +625,7 @@ nr_phy_data_t UE_dl_preprocessing(PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) { if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL) { nr_downlink_indication_t dl_indication; nr_fill_dl_indication(&dl_indication, NULL, NULL, proc, UE, &phy_data); - UE->if_inst->dl_indication(&dl_indication, NULL); + UE->if_inst->dl_indication(&dl_indication); } uint64_t a=rdtsc_oai(); diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h index 6d40752a9a..276f417fbb 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h @@ -50,7 +50,8 @@ #define FAPI_NR_DL_CONFIG_TYPE_P_DLSCH 0x05 #define FAPI_NR_DL_CONFIG_TYPE_CSI_RS 0x06 #define FAPI_NR_DL_CONFIG_TYPE_CSI_IM 0x07 -#define FAPI_NR_DL_CONFIG_TYPES 0x07 +#define FAPI_NR_CONFIG_TA_COMMAND 0x08 +#define FAPI_NR_DL_CONFIG_TYPES 0x08 #define FAPI_NR_CCE_REG_MAPPING_TYPE_INTERLEAVED 0x01 #define FAPI_NR_CCE_REG_MAPPING_TYPE_NON_INTERLEAVED 0x02 diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h index 87fe5b82bc..95ae91b4d4 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h @@ -526,6 +526,11 @@ typedef struct { fapi_nr_dl_config_csiim_pdu_rel15_t csiim_config_rel15; } fapi_nr_dl_config_csiim_pdu; +typedef struct { + int ta_frame; + int ta_slot; + int ta_command; +} fapi_nr_ta_command_pdu; typedef struct { uint8_t pdu_type; @@ -534,6 +539,7 @@ typedef struct { fapi_nr_dl_config_dlsch_pdu dlsch_config_pdu; fapi_nr_dl_config_csirs_pdu csirs_config_pdu; fapi_nr_dl_config_csiim_pdu csiim_config_pdu; + fapi_nr_ta_command_pdu ta_command_pdu; }; } fapi_nr_dl_config_request_pdu_t; diff --git a/openair1/PHY/CODING/TESTBENCH/polartest.c b/openair1/PHY/CODING/TESTBENCH/polartest.c index 72762ba441..7c1534ca51 100644 --- a/openair1/PHY/CODING/TESTBENCH/polartest.c +++ b/openair1/PHY/CODING/TESTBENCH/polartest.c @@ -127,7 +127,7 @@ int main(int argc, char *argv[]) time_t currentTime; char fileName[512], currentTimeInfo[25]; char folderName[] = "."; - FILE *logFile; + FILE *logFile = NULL; /*folderName=getenv("HOME"); strcat(folderName,"/Desktop/polartestResults");*/ diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index 604c316093..6b1fcebd80 100644 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -44,16 +44,16 @@ /*ref 36-212 v8.6.0 , pp 8-9 */ /* the highest degree is set by default */ -unsigned int poly24a = 0x864cfb00; // 1000 0110 0100 1100 1111 1011 - // D^24 + D^23 + D^18 + D^17 + D^14 + D^11 + D^10 + D^7 + D^6 + D^5 + D^4 + D^3 + D + 1 -unsigned int poly24b = 0x80006300; // 1000 0000 0000 0000 0110 0011 - // D^24 + D^23 + D^6 + D^5 + D + 1 -unsigned int poly24c = 0xb2b11700; // 1011 0010 1011 0001 0001 0111 - // D^24+D^23+D^21+D^20+D^17+D^15+D^13+D^12+D^8+D^4+D^2+D+1 +uint32_t poly24a = 0x864cfb00; // 1000 0110 0100 1100 1111 1011 + // D^24 + D^23 + D^18 + D^17 + D^14 + D^11 + D^10 + D^7 + D^6 + D^5 + D^4 + D^3 + D + 1 +uint32_t poly24b = 0x80006300; // 1000 0000 0000 0000 0110 0011 + // D^24 + D^23 + D^6 + D^5 + D + 1 +uint32_t poly24c = 0xb2b11700; // 1011 0010 1011 0001 0001 0111 + // D^24+D^23+D^21+D^20+D^17+D^15+D^13+D^12+D^8+D^4+D^2+D+1 -unsigned int poly16 = 0x10210000; // 0001 0000 0010 0001 D^16 + D^12 + D^5 + 1 -unsigned int poly12 = 0x80F00000; // 1000 0000 1111 D^12 + D^11 + D^3 + D^2 + D + 1 -unsigned int poly8 = 0x9B000000; // 1001 1011 D^8 + D^7 + D^4 + D^3 + D + 1 +uint32_t poly16 = 0x10210000; // 0001 0000 0010 0001 D^16 + D^12 + D^5 + 1 +uint32_t poly12 = 0x80F00000; // 1000 0000 1111 D^12 + D^11 + D^3 + D^2 + D + 1 +uint32_t poly8 = 0x9B000000; // 1001 1011 D^8 + D^7 + D^4 + D^3 + D + 1 uint32_t poly6 = 0x84000000; // 10000100000... -> D^6+D^5+1 uint32_t poly11 = 0xc4200000; //11000100001000... -> D^11+D^10+D^9+D^5+1 @@ -65,14 +65,12 @@ For initialization && verification purposes, The first bit is in the MSB of each byte *********************************************************/ -unsigned int crcbit (unsigned char * inputptr, - int octetlen, - unsigned int poly) +uint32_t crcbit(unsigned char* inputptr, int octetlen, uint32_t poly) { - unsigned int i, crc = 0, c; + uint32_t i, crc = 0, c; while (octetlen-- > 0) { - c = ((unsigned int)(*inputptr++)) << 24; + c = ((uint32_t)(*inputptr++)) << 24; for (i = 8; i != 0; i--) { if ((1U << 31) & (c ^ crc)) @@ -92,14 +90,14 @@ unsigned int crcbit (unsigned char * inputptr, crc table initialization *********************************************************/ -static unsigned int crc24aTable[256]; -static unsigned int crc24bTable[256]; -static unsigned int crc24cTable[256]; -static unsigned short crc16Table[256]; -static unsigned short crc12Table[256]; -static unsigned short crc11Table[256]; -static unsigned char crc8Table[256]; -static unsigned char crc6Table[256]; +static uint32_t crc24aTable[256]; +static uint32_t crc24bTable[256]; +static uint32_t crc24cTable[256]; +static uint32_t crc16Table[256]; +static uint32_t crc12Table[256]; +static uint32_t crc11Table[256]; +static uint32_t crc8Table[256]; +static uint32_t crc6Table[256]; #if USE_INTEL_CRC static DECLARE_ALIGNED(struct crc_pclmulqdq_ctx lte_crc24a_pclmulqdq, 16) = { @@ -131,11 +129,11 @@ void crcTableInit (void) crc24aTable[c] = crcbit (&c, 1, poly24a); crc24bTable[c] = crcbit (&c, 1, poly24b); crc24cTable[c] = crcbit (&c, 1, poly24c); - crc16Table[c] = (unsigned short) (crcbit (&c, 1, poly16) >> 16); - crc12Table[c] = (unsigned short) (crcbit (&c, 1, poly12) >> 16); - crc11Table[c] = (unsigned short) (crcbit (&c, 1, poly11) >> 16); - crc8Table[c] = (unsigned char) (crcbit (&c, 1, poly8) >> 24); - crc6Table[c] = (unsigned char) (crcbit (&c, 1, poly6) >> 24); + crc16Table[c] = crcbit(&c, 1, poly16) >> 16; + crc12Table[c] = crcbit(&c, 1, poly12) >> 16; + crc11Table[c] = crcbit(&c, 1, poly11) >> 16; + crc8Table[c] = crcbit(&c, 1, poly8) >> 24; + crc6Table[c] = crcbit(&c, 1, poly6) >> 24; } while (++c); #if USE_INTEL_CRC crc_xmm_be_le_swap128 = _mm_setr_epi32(0x0c0d0e0f, 0x08090a0b, @@ -151,19 +149,18 @@ assuming initial byte is 0 padded (in MSB) if necessary can use SIMD optimized Intel CRC for LTE/NR 24a/24b variants *********************************************************/ -unsigned int crc24a (unsigned char * inptr, - int bitlen) +uint32_t crc24a(unsigned char* inptr, int bitlen) { int octetlen = bitlen / 8; /* Change in octets */ if ( bitlen % 8 || !USE_INTEL_CRC ) { - unsigned int crc = 0; - int resbit= (bitlen % 8); + uint32_t crc = 0; + int resbit = (bitlen % 8); - while (octetlen-- > 0) { - // printf("crc24a: in %x => crc %x\n",crc,*inptr); - crc = (crc << 8) ^ crc24aTable[(*inptr++) ^ (crc >> 24)]; - } + while (octetlen-- > 0) { + // printf("crc24a: in %x => crc %x\n",crc,*inptr); + crc = (crc << 8) ^ crc24aTable[(*inptr++) ^ (crc >> 24)]; + } if (resbit > 0) crc = (crc << resbit) ^ crc24aTable[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))]; @@ -188,19 +185,18 @@ static DECLARE_ALIGNED(struct crc_pclmulqdq_ctx lte_crc24b_pclmulqdq, 16) = { 0ULL /**< res */ }; #endif -unsigned int crc24b (unsigned char * inptr, - int bitlen) +uint32_t crc24b(unsigned char* inptr, int bitlen) { int octetlen = bitlen / 8; /* Change in octets */ if ( bitlen % 8 || !USE_INTEL_CRC ) { - unsigned int crc = 0; - int resbit = (bitlen % 8); + uint32_t crc = 0; + int resbit = (bitlen % 8); - while (octetlen-- > 0) { - // printf("crc24b: in %x => crc %x (%x)\n",crc,*inptr,crc24bTable[(*inptr) ^ (crc >> 24)]); - crc = (crc << 8) ^ crc24bTable[(*inptr++) ^ (crc >> 24)]; - } + while (octetlen-- > 0) { + // printf("crc24b: in %x => crc %x (%x)\n",crc,*inptr,crc24bTable[(*inptr) ^ (crc >> 24)]); + crc = (crc << 8) ^ crc24bTable[(*inptr++) ^ (crc >> 24)]; + } if (resbit > 0) crc = (crc << resbit) ^ crc24bTable[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))]; @@ -215,11 +211,10 @@ unsigned int crc24b (unsigned char * inptr, #endif } -unsigned int crc24c (unsigned char * inptr, - int bitlen) +uint32_t crc24c(unsigned char* inptr, int bitlen) { int octetlen, resbit; - unsigned int crc = 0; + uint32_t crc = 0; octetlen = bitlen / 8; /* Change in octets */ resbit = (bitlen % 8); @@ -234,11 +229,10 @@ unsigned int crc24c (unsigned char * inptr, return crc; } -unsigned int -crc16 (unsigned char * inptr, int bitlen) +uint32_t crc16(unsigned char* inptr, int bitlen) { int octetlen, resbit; - unsigned int crc = 0; + uint32_t crc = 0; octetlen = bitlen / 8; /* Change in octets */ resbit = (bitlen % 8); @@ -253,11 +247,10 @@ crc16 (unsigned char * inptr, int bitlen) return crc; } -unsigned int -crc12 (unsigned char * inptr, int bitlen) +uint32_t crc12(unsigned char* inptr, int bitlen) { int octetlen, resbit; - unsigned int crc = 0; + uint32_t crc = 0; octetlen = bitlen / 8; /* Change in octets */ resbit = (bitlen % 8); @@ -271,11 +264,10 @@ crc12 (unsigned char * inptr, int bitlen) return crc; } -unsigned int -crc11 (unsigned char * inptr, int bitlen) +uint32_t crc11(unsigned char* inptr, int bitlen) { int octetlen, resbit; - unsigned int crc = 0; + uint32_t crc = 0; octetlen = bitlen / 8; /* Change in octets */ resbit = (bitlen % 8); @@ -289,29 +281,27 @@ crc11 (unsigned char * inptr, int bitlen) return crc; } -unsigned int -crc8 (unsigned char * inptr, int bitlen) +uint32_t crc8(unsigned char* inptr, int bitlen) { int octetlen, resbit; - unsigned int crc = 0; + uint32_t crc = 0; octetlen = bitlen / 8; /* Change in octets */ resbit = (bitlen % 8); while (octetlen-- > 0) { - crc = ((unsigned int)crc8Table[(*inptr++) ^ (crc >> 24)]) << 24; + crc = ((uint32_t)crc8Table[(*inptr++) ^ (crc >> 24)]) << 24; } if (resbit > 0) - crc = (crc << resbit) ^ ((unsigned int)(crc8Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))]) << 24); + crc = (crc << resbit) ^ ((uint32_t)(crc8Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))]) << 24); return crc; } -unsigned int -crc6 (unsigned char * inptr, int bitlen) +uint32_t crc6(unsigned char* inptr, int bitlen) { int octetlen, resbit; - unsigned int crc = 0; + uint32_t crc = 0; octetlen = bitlen / 8; /* Change in octets */ resbit = (bitlen % 8); diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init.h index ea031dc2da..a000b0218d 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init.h @@ -30,10 +30,25 @@ #ifndef __NR_LDPC_INIT__H__ #define __NR_LDPC_INIT__H__ - +#include #include "nrLDPC_lut.h" #include "nrLDPCdecoder_defs.h" +#define expandArr8(namE) \ + (const arr8_t) \ + { \ + (uint8_t*)namE, sizeof(namE) / sizeof(*namE), sizeof(*namE) / sizeof(**namE) \ + } +#define expandArr16(namE) \ + (const arr16_t) \ + { \ + (uint16_t*)namE, sizeof(namE) / sizeof(*namE), sizeof(*namE) / sizeof(**namE) \ + } +#define expandArr32(namE) \ + (const arr32_t) \ + { \ + (uint32_t*)namE, sizeof(namE) / sizeof(*namE), sizeof(*namE) / sizeof(**namE) \ + } /** \brief Initializes the decoder and sets correct LUTs \param p_decParams Pointer to decoder parameters @@ -46,118 +61,90 @@ static inline uint32_t nrLDPC_init(t_nrLDPC_dec_params* p_decParams, t_nrLDPC_lu uint8_t BG = p_decParams->BG; uint16_t Z = p_decParams->Z; uint8_t R = p_decParams->R; - + memset(p_lut, 0, sizeof(*p_lut)); if (BG == 2) { // LUT that only depend on BG p_lut->startAddrCnGroups = lut_startAddrCnGroups_BG2; - - p_lut->posBnInCnProcBuf[0] = (const uint8_t**) posBnInCnProcBuf_BG2_CNG3; - p_lut->posBnInCnProcBuf[1] = (const uint8_t**) posBnInCnProcBuf_BG2_CNG4; - p_lut->posBnInCnProcBuf[2] = (const uint8_t**) posBnInCnProcBuf_BG2_CNG5; - p_lut->posBnInCnProcBuf[3] = (const uint8_t**) posBnInCnProcBuf_BG2_CNG6; - p_lut->posBnInCnProcBuf[4] = (const uint8_t**) posBnInCnProcBuf_BG2_CNG8; - p_lut->posBnInCnProcBuf[5] = (const uint8_t**) posBnInCnProcBuf_BG2_CNG10; - p_lut->posBnInCnProcBuf[6] = NULL; - p_lut->posBnInCnProcBuf[7] = NULL; - p_lut->posBnInCnProcBuf[8] = NULL; + p_lut->posBnInCnProcBuf[0] = expandArr8(posBnInCnProcBuf_BG2_CNG3); + p_lut->posBnInCnProcBuf[1] = expandArr8(posBnInCnProcBuf_BG2_CNG4); + p_lut->posBnInCnProcBuf[2] = expandArr8(posBnInCnProcBuf_BG2_CNG5); + p_lut->posBnInCnProcBuf[3] = expandArr8(posBnInCnProcBuf_BG2_CNG6); + p_lut->posBnInCnProcBuf[4] = expandArr8(posBnInCnProcBuf_BG2_CNG8); + p_lut->posBnInCnProcBuf[5] = expandArr8(posBnInCnProcBuf_BG2_CNG10); // LUT that only depend on R if (R == 15) { - p_lut->startAddrBnProcBuf[0] = (const uint32_t**) startAddrBnProcBuf_BG2_R15_CNG3; - p_lut->startAddrBnProcBuf[1] = (const uint32_t**) startAddrBnProcBuf_BG2_R15_CNG4; - p_lut->startAddrBnProcBuf[2] = (const uint32_t**) startAddrBnProcBuf_BG2_R15_CNG5; - p_lut->startAddrBnProcBuf[3] = (const uint32_t**) startAddrBnProcBuf_BG2_R15_CNG6; - p_lut->startAddrBnProcBuf[4] = (const uint32_t**) startAddrBnProcBuf_BG2_R15_CNG8; - p_lut->startAddrBnProcBuf[5] = (const uint32_t**) startAddrBnProcBuf_BG2_R15_CNG10; - p_lut->startAddrBnProcBuf[6] = NULL; - p_lut->startAddrBnProcBuf[7] = NULL; - p_lut->startAddrBnProcBuf[8] = NULL; + p_lut->startAddrBnProcBuf[0] = expandArr32(startAddrBnProcBuf_BG2_R15_CNG3); + p_lut->startAddrBnProcBuf[1] = expandArr32(startAddrBnProcBuf_BG2_R15_CNG4); + p_lut->startAddrBnProcBuf[2] = expandArr32(startAddrBnProcBuf_BG2_R15_CNG5); + p_lut->startAddrBnProcBuf[3] = expandArr32(startAddrBnProcBuf_BG2_R15_CNG6); + p_lut->startAddrBnProcBuf[4] = expandArr32(startAddrBnProcBuf_BG2_R15_CNG8); + p_lut->startAddrBnProcBuf[5] = expandArr32(startAddrBnProcBuf_BG2_R15_CNG10); - p_lut->bnPosBnProcBuf[0] = (const uint8_t**) bnPosBnProcBuf_BG2_R15_CNG3; - p_lut->bnPosBnProcBuf[1] = (const uint8_t**) bnPosBnProcBuf_BG2_R15_CNG4; - p_lut->bnPosBnProcBuf[2] = (const uint8_t**) bnPosBnProcBuf_BG2_R15_CNG5; - p_lut->bnPosBnProcBuf[3] = (const uint8_t**) bnPosBnProcBuf_BG2_R15_CNG6; - p_lut->bnPosBnProcBuf[4] = (const uint8_t**) bnPosBnProcBuf_BG2_R15_CNG8; - p_lut->bnPosBnProcBuf[5] = (const uint8_t**) bnPosBnProcBuf_BG2_R15_CNG10; - p_lut->bnPosBnProcBuf[6] = NULL; - p_lut->bnPosBnProcBuf[7] = NULL; - p_lut->bnPosBnProcBuf[8] = NULL; + p_lut->bnPosBnProcBuf[0] = expandArr8(bnPosBnProcBuf_BG2_R15_CNG3); + p_lut->bnPosBnProcBuf[1] = expandArr8(bnPosBnProcBuf_BG2_R15_CNG4); + p_lut->bnPosBnProcBuf[2] = expandArr8(bnPosBnProcBuf_BG2_R15_CNG5); + p_lut->bnPosBnProcBuf[3] = expandArr8(bnPosBnProcBuf_BG2_R15_CNG6); + p_lut->bnPosBnProcBuf[4] = expandArr8(bnPosBnProcBuf_BG2_R15_CNG8); + p_lut->bnPosBnProcBuf[5] = expandArr8(bnPosBnProcBuf_BG2_R15_CNG10); - p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG2_R15; - p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG2_R15; + p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG2_R15; + p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG2_R15; - p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG2_R15; - p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG2_R15; - p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG2_R15; - p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15; + p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG2_R15; + p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG2_R15; + p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG2_R15; + p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15; - numLLR = NR_LDPC_NCOL_BG2_R15*Z; + numLLR = NR_LDPC_NCOL_BG2_R15 * Z; } else if (R == 13) { - p_lut->startAddrBnProcBuf[0] = NULL; - p_lut->startAddrBnProcBuf[1] = (const uint32_t**) startAddrBnProcBuf_BG2_R13_CNG4; - p_lut->startAddrBnProcBuf[2] = (const uint32_t**) startAddrBnProcBuf_BG2_R13_CNG5; - p_lut->startAddrBnProcBuf[3] = (const uint32_t**) startAddrBnProcBuf_BG2_R13_CNG6; - p_lut->startAddrBnProcBuf[4] = (const uint32_t**) startAddrBnProcBuf_BG2_R13_CNG8; - p_lut->startAddrBnProcBuf[5] = (const uint32_t**) startAddrBnProcBuf_BG2_R13_CNG10; - p_lut->startAddrBnProcBuf[6] = NULL; - p_lut->startAddrBnProcBuf[7] = NULL; - p_lut->startAddrBnProcBuf[8] = NULL; + p_lut->startAddrBnProcBuf[1] = expandArr32(startAddrBnProcBuf_BG2_R13_CNG4); + p_lut->startAddrBnProcBuf[2] = expandArr32(startAddrBnProcBuf_BG2_R13_CNG5); + p_lut->startAddrBnProcBuf[3] = expandArr32(startAddrBnProcBuf_BG2_R13_CNG6); + p_lut->startAddrBnProcBuf[4] = expandArr32(startAddrBnProcBuf_BG2_R13_CNG8); + p_lut->startAddrBnProcBuf[5] = expandArr32(startAddrBnProcBuf_BG2_R13_CNG10); - p_lut->bnPosBnProcBuf[0] = NULL; - p_lut->bnPosBnProcBuf[1] = (const uint8_t**) bnPosBnProcBuf_BG2_R13_CNG4; - p_lut->bnPosBnProcBuf[2] = (const uint8_t**) bnPosBnProcBuf_BG2_R13_CNG5; - p_lut->bnPosBnProcBuf[3] = (const uint8_t**) bnPosBnProcBuf_BG2_R13_CNG6; - p_lut->bnPosBnProcBuf[4] = (const uint8_t**) bnPosBnProcBuf_BG2_R13_CNG8; - p_lut->bnPosBnProcBuf[5] = (const uint8_t**) bnPosBnProcBuf_BG2_R13_CNG10; - p_lut->bnPosBnProcBuf[6] = NULL; - p_lut->bnPosBnProcBuf[7] = NULL; - p_lut->bnPosBnProcBuf[8] = NULL; + p_lut->bnPosBnProcBuf[1] = expandArr8(bnPosBnProcBuf_BG2_R13_CNG4); + p_lut->bnPosBnProcBuf[2] = expandArr8(bnPosBnProcBuf_BG2_R13_CNG5); + p_lut->bnPosBnProcBuf[3] = expandArr8(bnPosBnProcBuf_BG2_R13_CNG6); + p_lut->bnPosBnProcBuf[4] = expandArr8(bnPosBnProcBuf_BG2_R13_CNG8); + p_lut->bnPosBnProcBuf[5] = expandArr8(bnPosBnProcBuf_BG2_R13_CNG10); - p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG2_R13; - p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG2_R13; + p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG2_R13; + p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG2_R13; - p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG2_R13; - p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG2_R13; - p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG2_R13; - p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13; + p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG2_R13; + p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG2_R13; + p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG2_R13; + p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13; - numLLR = NR_LDPC_NCOL_BG2_R13*Z; + numLLR = NR_LDPC_NCOL_BG2_R13 * Z; } else if (R == 23) { - p_lut->startAddrBnProcBuf[0] = NULL; - p_lut->startAddrBnProcBuf[1] = (const uint32_t**) startAddrBnProcBuf_BG2_R23_CNG4; - p_lut->startAddrBnProcBuf[2] = NULL; - p_lut->startAddrBnProcBuf[3] = (const uint32_t**) startAddrBnProcBuf_BG2_R23_CNG6; - p_lut->startAddrBnProcBuf[4] = (const uint32_t**) startAddrBnProcBuf_BG2_R23_CNG8; - p_lut->startAddrBnProcBuf[5] = (const uint32_t**) startAddrBnProcBuf_BG2_R23_CNG10; - p_lut->startAddrBnProcBuf[6] = NULL; - p_lut->startAddrBnProcBuf[7] = NULL; - p_lut->startAddrBnProcBuf[8] = NULL; + p_lut->startAddrBnProcBuf[1] = expandArr32(startAddrBnProcBuf_BG2_R23_CNG4); + p_lut->startAddrBnProcBuf[3] = expandArr32(startAddrBnProcBuf_BG2_R23_CNG6); + p_lut->startAddrBnProcBuf[4] = expandArr32(startAddrBnProcBuf_BG2_R23_CNG8); + p_lut->startAddrBnProcBuf[5] = expandArr32(startAddrBnProcBuf_BG2_R23_CNG10); - p_lut->bnPosBnProcBuf[0] = NULL; - p_lut->bnPosBnProcBuf[1] = (const uint8_t**) bnPosBnProcBuf_BG2_R23_CNG4; - p_lut->bnPosBnProcBuf[2] = NULL; - p_lut->bnPosBnProcBuf[3] = (const uint8_t**) bnPosBnProcBuf_BG2_R23_CNG6; - p_lut->bnPosBnProcBuf[4] = (const uint8_t**) bnPosBnProcBuf_BG2_R23_CNG8; - p_lut->bnPosBnProcBuf[5] = (const uint8_t**) bnPosBnProcBuf_BG2_R23_CNG10; - p_lut->bnPosBnProcBuf[6] = NULL; - p_lut->bnPosBnProcBuf[7] = NULL; - p_lut->bnPosBnProcBuf[8] = NULL; + p_lut->bnPosBnProcBuf[1] = expandArr8(bnPosBnProcBuf_BG2_R23_CNG4); + p_lut->bnPosBnProcBuf[3] = expandArr8(bnPosBnProcBuf_BG2_R23_CNG6); + p_lut->bnPosBnProcBuf[4] = expandArr8(bnPosBnProcBuf_BG2_R23_CNG8); + p_lut->bnPosBnProcBuf[5] = expandArr8(bnPosBnProcBuf_BG2_R23_CNG10); - p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG2_R23; - p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG2_R23; + p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG2_R23; + p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG2_R23; - p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG2_R23; - p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG2_R23; - p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG2_R23; - p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23; + p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG2_R23; + p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG2_R23; + p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG2_R23; + p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23; - numLLR = NR_LDPC_NCOL_BG2_R23*Z; + numLLR = NR_LDPC_NCOL_BG2_R23 * Z; } // LUT that depend on Z and R @@ -165,678 +152,515 @@ static inline uint32_t nrLDPC_init(t_nrLDPC_dec_params* p_decParams, t_nrLDPC_lu { case 2: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z2_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z2_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z2_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z2_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z2_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z2_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z2_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z2_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z2_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z2_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z2_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z2_CNG10); + break; } case 3: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z3_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z3_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z3_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z3_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z3_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z3_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z3_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z3_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z3_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z3_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z3_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z3_CNG10); + break; } case 4: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z4_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z4_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z4_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z4_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z4_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z4_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z4_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z4_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z4_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z4_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z4_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z4_CNG10); + break; } case 5: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z5_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z5_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z5_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z5_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z5_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z5_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z5_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z5_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z5_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z5_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z5_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z5_CNG10); + break; } case 6: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z6_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z6_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z6_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z6_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z6_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z6_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z6_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z6_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z6_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z6_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z6_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z6_CNG10); + break; } case 7: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z7_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z7_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z7_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z7_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z7_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z7_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z7_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z7_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z7_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z7_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z7_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z7_CNG10); + break; } case 8: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z8_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z8_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z8_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z8_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z8_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z8_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z8_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z8_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z8_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z8_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z8_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z8_CNG10); + break; } case 9: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z9_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z9_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z9_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z9_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z9_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z9_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z9_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z9_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z9_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z9_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z9_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z9_CNG10); + break; } case 10: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z10_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z10_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z10_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z10_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z10_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z10_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z10_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z10_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z10_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z10_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z10_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z10_CNG10); + break; } case 11: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z11_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z11_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z11_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z11_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z11_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z11_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z11_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z11_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z11_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z11_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z11_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z11_CNG10); + break; } case 12: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z12_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z12_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z12_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z12_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z12_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z12_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z12_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z12_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z12_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z12_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z12_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z12_CNG10); + break; } case 13: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z13_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z13_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z13_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z13_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z13_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z13_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z13_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z13_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z13_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z13_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z13_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z13_CNG10); + break; } case 14: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z14_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z14_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z14_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z14_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z14_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z14_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z14_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z14_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z14_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z14_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z14_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z14_CNG10); + break; } case 15: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z15_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z15_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z15_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z15_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z15_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z15_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z15_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z15_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z15_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z15_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z15_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z15_CNG10); + break; } case 16: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z16_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z16_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z16_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z16_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z16_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z16_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z16_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z16_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z16_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z16_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z16_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z16_CNG10); + break; } case 18: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z18_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z18_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z18_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z18_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z18_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z18_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z18_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z18_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z18_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z18_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z18_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z18_CNG10); + break; } case 20: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z20_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z20_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z20_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z20_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z20_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z20_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z20_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z20_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z20_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z20_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z20_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z20_CNG10); + break; } case 22: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z22_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z22_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z22_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z22_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z22_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z22_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z22_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z22_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z22_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z22_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z22_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z22_CNG10); + break; } case 24: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z24_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z24_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z24_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z24_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z24_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z24_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z24_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z24_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z24_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z24_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z24_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z24_CNG10); + break; } case 26: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z26_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z26_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z26_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z26_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z26_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z26_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z26_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z26_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z26_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z26_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z26_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z26_CNG10); + break; } case 28: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z28_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z28_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z28_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z28_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z28_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z28_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z28_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z28_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z28_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z28_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z28_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z28_CNG10); + break; } case 30: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z30_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z30_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z30_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z30_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z30_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z30_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z30_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z30_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z30_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z30_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z30_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z30_CNG10); + break; } case 32: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z32_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z32_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z32_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z32_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z32_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z32_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z32_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z32_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z32_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z32_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z32_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z32_CNG10); + break; } case 36: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z36_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z36_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z36_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z36_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z36_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z36_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z36_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z36_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z36_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z36_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z36_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z36_CNG10); + break; } case 40: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z40_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z40_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z40_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z40_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z40_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z40_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z40_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z40_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z40_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z40_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z40_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z40_CNG10); + break; } case 44: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z44_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z44_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z44_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z44_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z44_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z44_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z44_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z44_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z44_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z44_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z44_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z44_CNG10); + break; } case 48: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z48_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z48_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z48_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z48_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z48_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z48_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z48_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z48_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z48_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z48_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z48_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z48_CNG10); + break; } case 52: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z52_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z52_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z52_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z52_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z52_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z52_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z52_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z52_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z52_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z52_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z52_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z52_CNG10); + break; } case 56: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z56_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z56_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z56_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z56_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z56_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z56_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z56_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z56_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z56_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z56_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z56_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z56_CNG10); + break; } case 60: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z60_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z60_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z60_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z60_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z60_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z60_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z60_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z60_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z60_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z60_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z60_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z60_CNG10); + break; } case 64: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z64_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z64_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z64_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z64_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z64_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z64_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z64_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z64_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z64_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z64_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z64_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z64_CNG10); + break; } case 72: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z72_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z72_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z72_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z72_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z72_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z72_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z72_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z72_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z72_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z72_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z72_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z72_CNG10); + break; } case 80: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z80_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z80_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z80_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z80_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z80_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z80_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z80_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z80_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z80_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z80_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z80_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z80_CNG10); + break; } case 88: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z88_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z88_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z88_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z88_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z88_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z88_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z88_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z88_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z88_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z88_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z88_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z88_CNG10); + break; } case 96: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z96_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z96_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z96_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z96_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z96_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z96_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z96_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z96_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z96_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z96_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z96_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z96_CNG10); + break; } case 104: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z104_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z104_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z104_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z104_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z104_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z104_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z104_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z104_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z104_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z104_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z104_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z104_CNG10); + break; } case 112: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z112_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z112_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z112_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z112_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z112_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z112_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z112_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z112_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z112_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z112_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z112_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z112_CNG10); + break; } case 120: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z120_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z120_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z120_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z120_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z120_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z120_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z120_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z120_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z120_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z120_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z120_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z120_CNG10); + break; } case 128: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z128_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z128_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z128_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z128_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z128_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z128_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z128_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z128_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z128_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z128_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z128_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z128_CNG10); + break; } case 144: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z144_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z144_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z144_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z144_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z144_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z144_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z144_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z144_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z144_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z144_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z144_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z144_CNG10); + break; } case 160: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z160_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z160_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z160_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z160_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z160_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z160_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z160_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z160_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z160_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z160_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z160_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z160_CNG10); + break; } case 176: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z176_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z176_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z176_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z176_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z176_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z176_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z176_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z176_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z176_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z176_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z176_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z176_CNG10); + break; } case 192: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z192_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z192_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z192_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z192_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z192_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z192_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z192_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z192_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z192_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z192_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z192_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z192_CNG10); + break; } case 208: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z208_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z208_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z208_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z208_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z208_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z208_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z208_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z208_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z208_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z208_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z208_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z208_CNG10); + break; } case 224: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z224_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z224_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z224_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z224_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z224_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z224_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z224_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z224_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z224_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z224_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z224_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z224_CNG10); + break; } case 240: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z240_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z240_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z240_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z240_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z240_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z240_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z240_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z240_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z240_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z240_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z240_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z240_CNG10); + break; } case 256: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z256_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z256_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z256_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z256_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z256_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z256_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z256_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z256_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z256_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z256_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z256_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z256_CNG10); + break; } case 288: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z288_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z288_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z288_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z288_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z288_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z288_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z288_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z288_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z288_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z288_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z288_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z288_CNG10); + break; } case 320: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z320_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z320_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z320_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z320_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z320_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z320_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z320_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z320_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z320_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z320_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z320_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z320_CNG10); + break; } case 352: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z352_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z352_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z352_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z352_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z352_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z352_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z352_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z352_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z352_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z352_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z352_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z352_CNG10); + break; } case 384: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG2_Z384_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG2_Z384_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG2_Z384_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG2_Z384_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG2_Z384_CNG8; - p_lut->circShift[5] = (const uint16_t**) circShift_BG2_Z384_CNG10; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; - break; + p_lut->circShift[0] = expandArr16(circShift_BG2_Z384_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG2_Z384_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG2_Z384_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG2_Z384_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG2_Z384_CNG8); + p_lut->circShift[5] = expandArr16(circShift_BG2_Z384_CNG10); + break; } - default: - { - p_lut->circShift[0] = NULL; - p_lut->circShift[1] = NULL; - p_lut->circShift[2] = NULL; - p_lut->circShift[3] = NULL; - p_lut->circShift[4] = NULL; - p_lut->circShift[5] = NULL; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; + default: { } } } @@ -845,112 +669,89 @@ static inline uint32_t nrLDPC_init(t_nrLDPC_dec_params* p_decParams, t_nrLDPC_lu // LUT that only depend on BG p_lut->startAddrCnGroups = lut_startAddrCnGroups_BG1; - p_lut->posBnInCnProcBuf[0] = (const uint8_t**) posBnInCnProcBuf_BG1_CNG3; - p_lut->posBnInCnProcBuf[1] = (const uint8_t**) posBnInCnProcBuf_BG1_CNG4; - p_lut->posBnInCnProcBuf[2] = (const uint8_t**) posBnInCnProcBuf_BG1_CNG5; - p_lut->posBnInCnProcBuf[3] = (const uint8_t**) posBnInCnProcBuf_BG1_CNG6; - p_lut->posBnInCnProcBuf[4] = (const uint8_t**) posBnInCnProcBuf_BG1_CNG7; - p_lut->posBnInCnProcBuf[5] = (const uint8_t**) posBnInCnProcBuf_BG1_CNG8; - p_lut->posBnInCnProcBuf[6] = (const uint8_t**) posBnInCnProcBuf_BG1_CNG9; - p_lut->posBnInCnProcBuf[7] = (const uint8_t**) posBnInCnProcBuf_BG1_CNG10; - p_lut->posBnInCnProcBuf[8] = (const uint8_t**) posBnInCnProcBuf_BG1_CNG19; + p_lut->posBnInCnProcBuf[0] = expandArr8(posBnInCnProcBuf_BG1_CNG3); + p_lut->posBnInCnProcBuf[1] = expandArr8(posBnInCnProcBuf_BG1_CNG4); + p_lut->posBnInCnProcBuf[2] = expandArr8(posBnInCnProcBuf_BG1_CNG5); + p_lut->posBnInCnProcBuf[3] = expandArr8(posBnInCnProcBuf_BG1_CNG6); + p_lut->posBnInCnProcBuf[4] = expandArr8(posBnInCnProcBuf_BG1_CNG7); + p_lut->posBnInCnProcBuf[5] = expandArr8(posBnInCnProcBuf_BG1_CNG8); + p_lut->posBnInCnProcBuf[6] = expandArr8(posBnInCnProcBuf_BG1_CNG9); + p_lut->posBnInCnProcBuf[7] = expandArr8(posBnInCnProcBuf_BG1_CNG10); + p_lut->posBnInCnProcBuf[8] = expandArr8(posBnInCnProcBuf_BG1_CNG19); // LUT that only depend on R if (R == 13) { - p_lut->startAddrBnProcBuf[0] = (const uint32_t**) startAddrBnProcBuf_BG1_R13_CNG3; - p_lut->startAddrBnProcBuf[1] = (const uint32_t**) startAddrBnProcBuf_BG1_R13_CNG4; - p_lut->startAddrBnProcBuf[2] = (const uint32_t**) startAddrBnProcBuf_BG1_R13_CNG5; - p_lut->startAddrBnProcBuf[3] = (const uint32_t**) startAddrBnProcBuf_BG1_R13_CNG6; - p_lut->startAddrBnProcBuf[4] = (const uint32_t**) startAddrBnProcBuf_BG1_R13_CNG7; - p_lut->startAddrBnProcBuf[5] = (const uint32_t**) startAddrBnProcBuf_BG1_R13_CNG8; - p_lut->startAddrBnProcBuf[6] = (const uint32_t**) startAddrBnProcBuf_BG1_R13_CNG9; - p_lut->startAddrBnProcBuf[7] = (const uint32_t**) startAddrBnProcBuf_BG1_R13_CNG10; - p_lut->startAddrBnProcBuf[8] = (const uint32_t**) startAddrBnProcBuf_BG1_R13_CNG19; + p_lut->startAddrBnProcBuf[0] = expandArr32(startAddrBnProcBuf_BG1_R13_CNG3); + p_lut->startAddrBnProcBuf[1] = expandArr32(startAddrBnProcBuf_BG1_R13_CNG4); + p_lut->startAddrBnProcBuf[2] = expandArr32(startAddrBnProcBuf_BG1_R13_CNG5); + p_lut->startAddrBnProcBuf[3] = expandArr32(startAddrBnProcBuf_BG1_R13_CNG6); + p_lut->startAddrBnProcBuf[4] = expandArr32(startAddrBnProcBuf_BG1_R13_CNG7); + p_lut->startAddrBnProcBuf[5] = expandArr32(startAddrBnProcBuf_BG1_R13_CNG8); + p_lut->startAddrBnProcBuf[6] = expandArr32(startAddrBnProcBuf_BG1_R13_CNG9); + p_lut->startAddrBnProcBuf[7] = expandArr32(startAddrBnProcBuf_BG1_R13_CNG10); + p_lut->startAddrBnProcBuf[8] = expandArr32(startAddrBnProcBuf_BG1_R13_CNG19); - p_lut->bnPosBnProcBuf[0] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[1] = (const uint8_t**) bnPosBnProcBuf_BG1_R13_CNG4; - p_lut->bnPosBnProcBuf[2] = (const uint8_t**) bnPosBnProcBuf_BG1_R13_CNG5; - p_lut->bnPosBnProcBuf[3] = (const uint8_t**) bnPosBnProcBuf_BG1_R13_CNG6; - p_lut->bnPosBnProcBuf[4] = (const uint8_t**) bnPosBnProcBuf_BG1_R13_CNG7; - p_lut->bnPosBnProcBuf[5] = (const uint8_t**) bnPosBnProcBuf_BG1_R13_CNG8; - p_lut->bnPosBnProcBuf[6] = (const uint8_t**) bnPosBnProcBuf_BG1_R13_CNG9; - p_lut->bnPosBnProcBuf[7] = (const uint8_t**) bnPosBnProcBuf_BG1_R13_CNG10; - p_lut->bnPosBnProcBuf[8] = (const uint8_t**) bnPosBnProcBuf_BG1_R13_CNG19; + p_lut->bnPosBnProcBuf[1] = expandArr8(bnPosBnProcBuf_BG1_R13_CNG4); + p_lut->bnPosBnProcBuf[2] = expandArr8(bnPosBnProcBuf_BG1_R13_CNG5); + p_lut->bnPosBnProcBuf[3] = expandArr8(bnPosBnProcBuf_BG1_R13_CNG6); + p_lut->bnPosBnProcBuf[4] = expandArr8(bnPosBnProcBuf_BG1_R13_CNG7); + p_lut->bnPosBnProcBuf[5] = expandArr8(bnPosBnProcBuf_BG1_R13_CNG8); + p_lut->bnPosBnProcBuf[6] = expandArr8(bnPosBnProcBuf_BG1_R13_CNG9); + p_lut->bnPosBnProcBuf[7] = expandArr8(bnPosBnProcBuf_BG1_R13_CNG10); + p_lut->bnPosBnProcBuf[8] = expandArr8(bnPosBnProcBuf_BG1_R13_CNG19); - p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG1_R13; - p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG1_R13; + p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG1_R13; + p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG1_R13; - p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; - p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG1_R13; - p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG1_R13; - p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13; + p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; + p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG1_R13; + p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG1_R13; + p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13; - numLLR = NR_LDPC_NCOL_BG1_R13*Z; + numLLR = NR_LDPC_NCOL_BG1_R13 * Z; } else if (R == 23) { - p_lut->startAddrBnProcBuf[0] = (const uint32_t**) startAddrBnProcBuf_BG1_R23_CNG3; - p_lut->startAddrBnProcBuf[1] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[2] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[3] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[4] = (const uint32_t**) startAddrBnProcBuf_BG1_R23_CNG7; - p_lut->startAddrBnProcBuf[5] = (const uint32_t**) startAddrBnProcBuf_BG1_R23_CNG8; - p_lut->startAddrBnProcBuf[6] = (const uint32_t**) startAddrBnProcBuf_BG1_R23_CNG9; - p_lut->startAddrBnProcBuf[7] = (const uint32_t**) startAddrBnProcBuf_BG1_R23_CNG10; - p_lut->startAddrBnProcBuf[8] = (const uint32_t**) startAddrBnProcBuf_BG1_R23_CNG19; + p_lut->startAddrBnProcBuf[0] = expandArr32(startAddrBnProcBuf_BG1_R23_CNG3); + p_lut->startAddrBnProcBuf[4] = expandArr32(startAddrBnProcBuf_BG1_R23_CNG7); + p_lut->startAddrBnProcBuf[5] = expandArr32(startAddrBnProcBuf_BG1_R23_CNG8); + p_lut->startAddrBnProcBuf[6] = expandArr32(startAddrBnProcBuf_BG1_R23_CNG9); + p_lut->startAddrBnProcBuf[7] = expandArr32(startAddrBnProcBuf_BG1_R23_CNG10); + p_lut->startAddrBnProcBuf[8] = expandArr32(startAddrBnProcBuf_BG1_R23_CNG19); - p_lut->bnPosBnProcBuf[0] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[1] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[2] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[3] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[4] = (const uint8_t**) bnPosBnProcBuf_BG1_R23_CNG7; - p_lut->bnPosBnProcBuf[5] = (const uint8_t**) bnPosBnProcBuf_BG1_R23_CNG8; - p_lut->bnPosBnProcBuf[6] = (const uint8_t**) bnPosBnProcBuf_BG1_R23_CNG9; - p_lut->bnPosBnProcBuf[7] = (const uint8_t**) bnPosBnProcBuf_BG1_R23_CNG10; - p_lut->bnPosBnProcBuf[8] = (const uint8_t**) bnPosBnProcBuf_BG1_R23_CNG19; + p_lut->bnPosBnProcBuf[4] = expandArr8(bnPosBnProcBuf_BG1_R23_CNG7); + p_lut->bnPosBnProcBuf[5] = expandArr8(bnPosBnProcBuf_BG1_R23_CNG8); + p_lut->bnPosBnProcBuf[6] = expandArr8(bnPosBnProcBuf_BG1_R23_CNG9); + p_lut->bnPosBnProcBuf[7] = expandArr8(bnPosBnProcBuf_BG1_R23_CNG10); + p_lut->bnPosBnProcBuf[8] = expandArr8(bnPosBnProcBuf_BG1_R23_CNG19); - p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG1_R23; - p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG1_R23; + p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG1_R23; + p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG1_R23; - p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; - p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG1_R23; - p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG1_R23; - p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23; + p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; + p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG1_R23; + p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG1_R23; + p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23; - numLLR = NR_LDPC_NCOL_BG1_R23*Z; + numLLR = NR_LDPC_NCOL_BG1_R23 * Z; } else if (R == 89) { - p_lut->startAddrBnProcBuf[0] = (const uint32_t**) startAddrBnProcBuf_BG1_R89_CNG3; - p_lut->startAddrBnProcBuf[1] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[2] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[3] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[4] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[5] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[6] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[7] = (const uint32_t**) NULL; - p_lut->startAddrBnProcBuf[8] = (const uint32_t**) startAddrBnProcBuf_BG1_R89_CNG19; + p_lut->startAddrBnProcBuf[0] = expandArr32(startAddrBnProcBuf_BG1_R89_CNG3); + p_lut->startAddrBnProcBuf[8] = expandArr32(startAddrBnProcBuf_BG1_R89_CNG19); - p_lut->bnPosBnProcBuf[0] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[1] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[2] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[3] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[4] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[5] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[6] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[7] = (const uint8_t**) NULL; - p_lut->bnPosBnProcBuf[8] = (const uint8_t**) bnPosBnProcBuf_BG1_R89_CNG19; + p_lut->bnPosBnProcBuf[8] = expandArr8(bnPosBnProcBuf_BG1_R89_CNG19); - p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG1_R89; - p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG1_R89; + p_lut->llr2llrProcBufAddr = llr2llrProcBufAddr_BG1_R89; + p_lut->llr2llrProcBufBnPos = llr2llrProcBufBnPos_BG1_R89; - p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; - p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG1_R89; - p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG1_R89; - p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89; + p_lut->numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; + p_lut->numBnInBnGroups = lut_numBnInBnGroups_BG1_R89; + p_lut->startAddrBnGroups = lut_startAddrBnGroups_BG1_R89; + p_lut->startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89; - numLLR = NR_LDPC_NCOL_BG1_R89*Z; + numLLR = NR_LDPC_NCOL_BG1_R89 * Z; } // LUT that depend on Z and R @@ -958,678 +759,668 @@ static inline uint32_t nrLDPC_init(t_nrLDPC_dec_params* p_decParams, t_nrLDPC_lu { case 2: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z2_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z2_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z2_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z2_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z2_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z2_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z2_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z2_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z2_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z2_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z2_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z2_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z2_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z2_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z2_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z2_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z2_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z2_CNG19); + break; } case 3: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z3_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z3_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z3_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z3_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z3_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z3_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z3_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z3_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z3_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z3_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z3_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z3_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z3_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z3_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z3_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z3_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z3_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z3_CNG19); + break; } case 4: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z4_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z4_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z4_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z4_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z4_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z4_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z4_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z4_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z4_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z4_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z4_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z4_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z4_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z4_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z4_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z4_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z4_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z4_CNG19); + break; } case 5: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z5_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z5_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z5_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z5_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z5_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z5_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z5_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z5_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z5_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z5_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z5_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z5_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z5_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z5_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z5_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z5_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z5_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z5_CNG19); + break; } case 6: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z6_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z6_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z6_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z6_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z6_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z6_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z6_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z6_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z6_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z6_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z6_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z6_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z6_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z6_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z6_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z6_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z6_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z6_CNG19); + break; } case 7: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z7_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z7_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z7_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z7_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z7_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z7_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z7_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z7_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z7_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z7_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z7_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z7_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z7_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z7_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z7_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z7_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z7_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z7_CNG19); + break; } case 8: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z8_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z8_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z8_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z8_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z8_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z8_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z8_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z8_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z8_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z8_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z8_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z8_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z8_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z8_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z8_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z8_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z8_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z8_CNG19); + break; } case 9: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z9_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z9_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z9_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z9_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z9_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z9_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z9_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z9_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z9_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z9_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z9_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z9_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z9_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z9_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z9_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z9_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z9_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z9_CNG19); + break; } case 10: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z10_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z10_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z10_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z10_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z10_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z10_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z10_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z10_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z10_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z10_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z10_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z10_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z10_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z10_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z10_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z10_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z10_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z10_CNG19); + break; } case 11: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z11_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z11_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z11_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z11_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z11_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z11_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z11_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z11_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z11_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z11_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z11_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z11_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z11_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z11_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z11_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z11_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z11_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z11_CNG19); + break; } case 12: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z12_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z12_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z12_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z12_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z12_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z12_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z12_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z12_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z12_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z12_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z12_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z12_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z12_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z12_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z12_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z12_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z12_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z12_CNG19); + break; } case 13: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z13_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z13_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z13_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z13_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z13_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z13_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z13_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z13_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z13_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z13_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z13_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z13_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z13_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z13_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z13_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z13_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z13_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z13_CNG19); + break; } case 14: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z14_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z14_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z14_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z14_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z14_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z14_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z14_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z14_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z14_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z14_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z14_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z14_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z14_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z14_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z14_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z14_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z14_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z14_CNG19); + break; } case 15: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z15_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z15_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z15_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z15_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z15_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z15_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z15_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z15_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z15_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z15_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z15_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z15_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z15_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z15_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z15_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z15_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z15_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z15_CNG19); + break; } case 16: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z16_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z16_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z16_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z16_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z16_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z16_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z16_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z16_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z16_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z16_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z16_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z16_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z16_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z16_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z16_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z16_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z16_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z16_CNG19); + break; } case 18: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z18_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z18_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z18_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z18_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z18_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z18_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z18_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z18_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z18_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z18_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z18_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z18_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z18_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z18_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z18_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z18_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z18_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z18_CNG19); + break; } case 20: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z20_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z20_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z20_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z20_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z20_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z20_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z20_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z20_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z20_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z20_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z20_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z20_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z20_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z20_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z20_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z20_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z20_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z20_CNG19); + break; } case 22: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z22_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z22_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z22_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z22_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z22_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z22_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z22_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z22_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z22_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z22_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z22_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z22_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z22_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z22_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z22_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z22_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z22_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z22_CNG19); + break; } case 24: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z24_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z24_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z24_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z24_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z24_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z24_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z24_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z24_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z24_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z24_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z24_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z24_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z24_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z24_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z24_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z24_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z24_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z24_CNG19); + break; } case 26: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z26_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z26_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z26_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z26_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z26_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z26_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z26_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z26_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z26_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z26_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z26_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z26_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z26_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z26_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z26_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z26_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z26_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z26_CNG19); + break; } case 28: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z28_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z28_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z28_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z28_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z28_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z28_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z28_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z28_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z28_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z28_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z28_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z28_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z28_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z28_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z28_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z28_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z28_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z28_CNG19); + break; } case 30: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z30_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z30_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z30_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z30_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z30_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z30_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z30_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z30_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z30_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z30_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z30_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z30_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z30_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z30_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z30_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z30_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z30_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z30_CNG19); + break; } case 32: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z32_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z32_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z32_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z32_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z32_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z32_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z32_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z32_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z32_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z32_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z32_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z32_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z32_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z32_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z32_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z32_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z32_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z32_CNG19); + break; } case 36: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z36_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z36_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z36_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z36_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z36_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z36_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z36_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z36_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z36_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z36_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z36_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z36_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z36_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z36_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z36_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z36_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z36_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z36_CNG19); + break; } case 40: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z40_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z40_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z40_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z40_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z40_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z40_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z40_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z40_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z40_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z40_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z40_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z40_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z40_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z40_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z40_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z40_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z40_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z40_CNG19); + break; } case 44: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z44_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z44_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z44_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z44_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z44_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z44_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z44_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z44_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z44_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z44_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z44_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z44_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z44_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z44_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z44_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z44_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z44_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z44_CNG19); + break; } case 48: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z48_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z48_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z48_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z48_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z48_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z48_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z48_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z48_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z48_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z48_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z48_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z48_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z48_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z48_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z48_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z48_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z48_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z48_CNG19); + break; } case 52: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z52_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z52_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z52_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z52_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z52_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z52_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z52_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z52_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z52_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z52_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z52_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z52_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z52_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z52_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z52_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z52_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z52_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z52_CNG19); + break; } case 56: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z56_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z56_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z56_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z56_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z56_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z56_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z56_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z56_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z56_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z56_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z56_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z56_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z56_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z56_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z56_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z56_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z56_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z56_CNG19); + break; } case 60: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z60_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z60_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z60_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z60_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z60_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z60_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z60_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z60_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z60_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z60_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z60_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z60_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z60_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z60_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z60_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z60_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z60_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z60_CNG19); + break; } case 64: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z64_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z64_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z64_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z64_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z64_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z64_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z64_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z64_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z64_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z64_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z64_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z64_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z64_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z64_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z64_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z64_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z64_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z64_CNG19); + break; } case 72: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z72_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z72_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z72_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z72_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z72_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z72_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z72_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z72_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z72_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z72_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z72_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z72_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z72_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z72_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z72_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z72_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z72_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z72_CNG19); + break; } case 80: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z80_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z80_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z80_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z80_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z80_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z80_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z80_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z80_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z80_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z80_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z80_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z80_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z80_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z80_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z80_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z80_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z80_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z80_CNG19); + break; } case 88: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z88_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z88_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z88_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z88_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z88_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z88_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z88_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z88_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z88_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z88_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z88_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z88_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z88_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z88_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z88_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z88_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z88_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z88_CNG19); + break; } case 96: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z96_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z96_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z96_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z96_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z96_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z96_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z96_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z96_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z96_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z96_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z96_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z96_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z96_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z96_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z96_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z96_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z96_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z96_CNG19); + break; } case 104: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z104_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z104_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z104_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z104_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z104_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z104_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z104_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z104_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z104_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z104_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z104_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z104_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z104_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z104_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z104_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z104_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z104_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z104_CNG19); + break; } case 112: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z112_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z112_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z112_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z112_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z112_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z112_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z112_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z112_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z112_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z112_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z112_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z112_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z112_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z112_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z112_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z112_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z112_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z112_CNG19); + break; } case 120: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z120_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z120_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z120_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z120_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z120_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z120_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z120_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z120_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z120_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z120_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z120_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z120_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z120_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z120_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z120_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z120_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z120_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z120_CNG19); + break; } case 128: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z128_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z128_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z128_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z128_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z128_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z128_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z128_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z128_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z128_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z128_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z128_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z128_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z128_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z128_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z128_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z128_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z128_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z128_CNG19); + break; } case 144: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z144_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z144_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z144_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z144_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z144_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z144_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z144_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z144_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z144_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z144_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z144_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z144_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z144_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z144_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z144_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z144_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z144_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z144_CNG19); + break; } case 160: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z160_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z160_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z160_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z160_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z160_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z160_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z160_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z160_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z160_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z160_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z160_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z160_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z160_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z160_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z160_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z160_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z160_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z160_CNG19); + break; } case 176: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z176_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z176_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z176_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z176_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z176_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z176_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z176_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z176_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z176_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z176_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z176_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z176_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z176_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z176_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z176_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z176_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z176_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z176_CNG19); + break; } case 192: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z192_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z192_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z192_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z192_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z192_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z192_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z192_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z192_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z192_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z192_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z192_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z192_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z192_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z192_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z192_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z192_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z192_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z192_CNG19); + break; } case 208: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z208_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z208_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z208_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z208_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z208_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z208_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z208_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z208_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z208_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z208_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z208_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z208_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z208_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z208_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z208_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z208_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z208_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z208_CNG19); + break; } case 224: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z224_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z224_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z224_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z224_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z224_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z224_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z224_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z224_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z224_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z224_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z224_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z224_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z224_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z224_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z224_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z224_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z224_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z224_CNG19); + break; } case 240: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z240_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z240_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z240_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z240_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z240_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z240_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z240_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z240_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z240_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z240_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z240_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z240_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z240_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z240_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z240_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z240_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z240_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z240_CNG19); + break; } case 256: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z256_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z256_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z256_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z256_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z256_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z256_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z256_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z256_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z256_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z256_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z256_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z256_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z256_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z256_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z256_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z256_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z256_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z256_CNG19); + break; } case 288: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z288_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z288_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z288_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z288_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z288_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z288_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z288_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z288_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z288_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z288_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z288_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z288_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z288_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z288_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z288_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z288_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z288_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z288_CNG19); + break; } case 320: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z320_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z320_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z320_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z320_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z320_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z320_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z320_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z320_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z320_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z320_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z320_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z320_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z320_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z320_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z320_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z320_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z320_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z320_CNG19); + break; } case 352: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z352_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z352_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z352_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z352_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z352_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z352_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z352_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z352_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z352_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z352_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z352_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z352_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z352_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z352_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z352_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z352_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z352_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z352_CNG19); + break; } case 384: { - p_lut->circShift[0] = (const uint16_t**) circShift_BG1_Z384_CNG3; - p_lut->circShift[1] = (const uint16_t**) circShift_BG1_Z384_CNG4; - p_lut->circShift[2] = (const uint16_t**) circShift_BG1_Z384_CNG5; - p_lut->circShift[3] = (const uint16_t**) circShift_BG1_Z384_CNG6; - p_lut->circShift[4] = (const uint16_t**) circShift_BG1_Z384_CNG7; - p_lut->circShift[5] = (const uint16_t**) circShift_BG1_Z384_CNG8; - p_lut->circShift[6] = (const uint16_t**) circShift_BG1_Z384_CNG9; - p_lut->circShift[7] = (const uint16_t**) circShift_BG1_Z384_CNG10; - p_lut->circShift[8] = (const uint16_t**) circShift_BG1_Z384_CNG19; - break; + p_lut->circShift[0] = expandArr16(circShift_BG1_Z384_CNG3); + p_lut->circShift[1] = expandArr16(circShift_BG1_Z384_CNG4); + p_lut->circShift[2] = expandArr16(circShift_BG1_Z384_CNG5); + p_lut->circShift[3] = expandArr16(circShift_BG1_Z384_CNG6); + p_lut->circShift[4] = expandArr16(circShift_BG1_Z384_CNG7); + p_lut->circShift[5] = expandArr16(circShift_BG1_Z384_CNG8); + p_lut->circShift[6] = expandArr16(circShift_BG1_Z384_CNG9); + p_lut->circShift[7] = expandArr16(circShift_BG1_Z384_CNG10); + p_lut->circShift[8] = expandArr16(circShift_BG1_Z384_CNG19); + break; } - default: - { - p_lut->circShift[0] = NULL; - p_lut->circShift[1] = NULL; - p_lut->circShift[2] = NULL; - p_lut->circShift[3] = NULL; - p_lut->circShift[4] = NULL; - p_lut->circShift[5] = NULL; - p_lut->circShift[6] = NULL; - p_lut->circShift[7] = NULL; - p_lut->circShift[8] = NULL; + default: { } } } diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h index ecbcac638d..de3bf58831 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h @@ -27,6 +27,7 @@ #define __NR_LDPC_MPASS__H__ #include +#include "common/utils/utils.h" #include "nrLDPCdecoder_defs.h" //#include /** @@ -42,6 +43,7 @@ \param cshift Circular shift */ +#define arrPos(a, b) a.d + b* a.dim2 static inline void *nrLDPC_inv_circ_memcpy(int8_t *str1, const int8_t *str2, uint16_t Z, uint16_t cshift) { uint16_t rem = Z - cshift; @@ -95,30 +97,25 @@ static inline void *nrLDPC_circ_memcpy(int8_t *str1, const int8_t *str2, uint16_ */ static inline void nrLDPC_llr2llrProcBuf(t_nrLDPC_lut* p_lut, int8_t* llr, int8_t* llrProcBuf, uint16_t Z, uint8_t BG) { - uint32_t i; - const uint8_t numBn2CnG1 = p_lut->numBnInBnGroups[0]; - uint32_t startColParity = (BG ==1 ) ? (NR_LDPC_START_COL_PARITY_BG1) : (NR_LDPC_START_COL_PARITY_BG2); + const uint8_t numBn2CnG1 = p_lut->numBnInBnGroups[0]; + uint32_t startColParity = (BG == 1) ? (NR_LDPC_START_COL_PARITY_BG1) : (NR_LDPC_START_COL_PARITY_BG2); - uint32_t colG1 = startColParity*Z; + uint32_t colG1 = startColParity * Z; - const uint16_t* lut_llr2llrProcBufAddr = p_lut->llr2llrProcBufAddr; - const uint8_t* lut_llr2llrProcBufBnPos = p_lut->llr2llrProcBufBnPos; + const uint16_t* lut_llr2llrProcBufAddr = p_lut->llr2llrProcBufAddr; + const uint8_t* lut_llr2llrProcBufBnPos = p_lut->llr2llrProcBufBnPos; - uint32_t idxBn; + // Copy LLRs connected to 1 CN + if (numBn2CnG1 > 0) { + memcpy(&llrProcBuf[0], &llr[colG1], numBn2CnG1 * Z); + } - // Copy LLRs connected to 1 CN - if (numBn2CnG1 > 0) - { - memcpy(&llrProcBuf[0], &llr[colG1], numBn2CnG1*Z); - } - - // First 2 columns might be set to zero directly if it's true they always belong to the groups with highest number of connected CNs... - for (i=0; icircShift[0]; - const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG1_R13[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[1]]) p_lut->circShift[1]; - const uint16_t (*lut_circShift_CNG5) [lut_numCnInCnGroups_BG1_R13[2]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[2]]) p_lut->circShift[2]; - const uint16_t (*lut_circShift_CNG6) [lut_numCnInCnGroups_BG1_R13[3]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[3]]) p_lut->circShift[3]; - const uint16_t (*lut_circShift_CNG7) [lut_numCnInCnGroups_BG1_R13[4]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[4]]) p_lut->circShift[4]; - const uint16_t (*lut_circShift_CNG8) [lut_numCnInCnGroups_BG1_R13[5]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[5]]) p_lut->circShift[5]; - const uint16_t (*lut_circShift_CNG9) [lut_numCnInCnGroups_BG1_R13[6]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[6]]) p_lut->circShift[6]; - const uint16_t (*lut_circShift_CNG10)[lut_numCnInCnGroups_BG1_R13[7]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[7]]) p_lut->circShift[7]; - const uint16_t (*lut_circShift_CNG19)[lut_numCnInCnGroups_BG1_R13[8]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[8]]) p_lut->circShift[8]; + const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; + const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - const uint8_t (*lut_posBnInCnProcBuf_CNG3) [lut_numCnInCnGroups_BG1_R13[0]] = (const uint8_t(*)[lut_numCnInCnGroups_BG1_R13[0]]) p_lut->posBnInCnProcBuf[0]; - const uint8_t (*lut_posBnInCnProcBuf_CNG4) [lut_numCnInCnGroups_BG1_R13[1]] = (const uint8_t(*)[lut_numCnInCnGroups_BG1_R13[1]]) p_lut->posBnInCnProcBuf[1]; - const uint8_t (*lut_posBnInCnProcBuf_CNG5) [lut_numCnInCnGroups_BG1_R13[2]] = (const uint8_t(*)[lut_numCnInCnGroups_BG1_R13[2]]) p_lut->posBnInCnProcBuf[2]; - const uint8_t (*lut_posBnInCnProcBuf_CNG6) [lut_numCnInCnGroups_BG1_R13[3]] = (const uint8_t(*)[lut_numCnInCnGroups_BG1_R13[3]]) p_lut->posBnInCnProcBuf[3]; - const uint8_t (*lut_posBnInCnProcBuf_CNG7) [lut_numCnInCnGroups_BG1_R13[4]] = (const uint8_t(*)[lut_numCnInCnGroups_BG1_R13[4]]) p_lut->posBnInCnProcBuf[4]; - const uint8_t (*lut_posBnInCnProcBuf_CNG8) [lut_numCnInCnGroups_BG1_R13[5]] = (const uint8_t(*)[lut_numCnInCnGroups_BG1_R13[5]]) p_lut->posBnInCnProcBuf[5]; - const uint8_t (*lut_posBnInCnProcBuf_CNG9) [lut_numCnInCnGroups_BG1_R13[6]] = (const uint8_t(*)[lut_numCnInCnGroups_BG1_R13[6]]) p_lut->posBnInCnProcBuf[6]; - const uint8_t (*lut_posBnInCnProcBuf_CNG10)[lut_numCnInCnGroups_BG1_R13[7]] = (const uint8_t(*)[lut_numCnInCnGroups_BG1_R13[7]]) p_lut->posBnInCnProcBuf[7]; - const uint8_t (*lut_posBnInCnProcBuf_CNG19)[lut_numCnInCnGroups_BG1_R13[8]] = (const uint8_t(*)[lut_numCnInCnGroups_BG1_R13[8]]) p_lut->posBnInCnProcBuf[8]; + uint32_t bitOffsetInGroup; - const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; - const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; + // ===================================================================== + // CN group with 3 BNs - uint32_t i; - uint32_t j; + bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0] * NR_LDPC_ZMAX; - uint32_t idxBn = 0; - int8_t* p_cnProcBuf; - uint32_t bitOffsetInGroup; + for (int j = 0; j < 3; j++) { + const uint16_t* lut_circShift_CNG3 = p_lut->circShift[0].d; + int8_t* p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j * bitOffsetInGroup]; + const uint8_t* lut_posBnInCnProcBuf_CNG3 = p_lut->posBnInCnProcBuf[0].d; - // ===================================================================== - // CN group with 3 BNs + const int idxBn = lut_posBnInCnProcBuf_CNG3[j] * Z; - bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX; + nrLDPC_circ_memcpy(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG3[j]); + } + // ===================================================================== + // CN group with BNs + int BNs[] = {3, 4, 5, 6, 7, 8, 9, 10, 19}; + for (int bn = 1; bn < sizeofArray(BNs); bn++) { + bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[bn] * NR_LDPC_ZMAX; + for (int j = 0; j < BNs[bn]; j++) { + int8_t* p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[bn] + j * bitOffsetInGroup]; + const uint16_t* lut_circShift = arrPos(p_lut->circShift[bn], j); + const uint8_t* lut_posBnInCnProcBuf = arrPos(p_lut->posBnInCnProcBuf[bn], j); + for (int i = 0; i < lut_numCnInCnGroups[bn]; i++) { + const int idxBn = lut_posBnInCnProcBuf[i] * Z; - for (j=0; j<3; j++) - { - p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j*bitOffsetInGroup]; + nrLDPC_circ_memcpy(p_cnProcBuf, &llr[idxBn], Z, lut_circShift[i]); - idxBn = lut_posBnInCnProcBuf_CNG3[j][0]*Z; - - nrLDPC_circ_memcpy(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG3[j][0]); + p_cnProcBuf += Z; + } } - - // ===================================================================== - // CN group with 4 BNs - - bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX; - - for (j=0; j<4; j++) - { - p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[1] + j*bitOffsetInGroup]; - - for (i=0; icircShift[0]; - const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG2_R15[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[1]]) p_lut->circShift[1]; - const uint16_t (*lut_circShift_CNG5) [lut_numCnInCnGroups_BG2_R15[2]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[2]]) p_lut->circShift[2]; - const uint16_t (*lut_circShift_CNG6) [lut_numCnInCnGroups_BG2_R15[3]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[3]]) p_lut->circShift[3]; - const uint16_t (*lut_circShift_CNG8) [lut_numCnInCnGroups_BG2_R15[4]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[4]]) p_lut->circShift[4]; - const uint16_t (*lut_circShift_CNG10) [lut_numCnInCnGroups_BG2_R15[5]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[5]]) p_lut->circShift[5]; + const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; + const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - const uint8_t (*lut_posBnInCnProcBuf_CNG3) [lut_numCnInCnGroups_BG2_R15[0]] = (const uint8_t(*)[lut_numCnInCnGroups_BG2_R15[0]]) p_lut->posBnInCnProcBuf[0]; - const uint8_t (*lut_posBnInCnProcBuf_CNG4) [lut_numCnInCnGroups_BG2_R15[1]] = (const uint8_t(*)[lut_numCnInCnGroups_BG2_R15[1]]) p_lut->posBnInCnProcBuf[1]; - const uint8_t (*lut_posBnInCnProcBuf_CNG5) [lut_numCnInCnGroups_BG2_R15[2]] = (const uint8_t(*)[lut_numCnInCnGroups_BG2_R15[2]]) p_lut->posBnInCnProcBuf[2]; - const uint8_t (*lut_posBnInCnProcBuf_CNG6) [lut_numCnInCnGroups_BG2_R15[3]] = (const uint8_t(*)[lut_numCnInCnGroups_BG2_R15[3]]) p_lut->posBnInCnProcBuf[3]; - const uint8_t (*lut_posBnInCnProcBuf_CNG8) [lut_numCnInCnGroups_BG2_R15[4]] = (const uint8_t(*)[lut_numCnInCnGroups_BG2_R15[4]]) p_lut->posBnInCnProcBuf[4]; - const uint8_t (*lut_posBnInCnProcBuf_CNG10) [lut_numCnInCnGroups_BG2_R15[5]] = (const uint8_t(*)[lut_numCnInCnGroups_BG2_R15[5]]) p_lut->posBnInCnProcBuf[5]; + uint32_t bitOffsetInGroup; - const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; - const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; + // ===================================================================== + // CN group with BNs + int BNs[] = {3, 4, 5, 6, 8, 10}; + for (int bn = 0; bn < sizeofArray(BNs); bn++) { + bitOffsetInGroup = lut_numCnInCnGroups_BG2_R15[bn] * NR_LDPC_ZMAX; - uint32_t i; - uint32_t j; + for (int j = 0; j < BNs[bn]; j++) { + int8_t* p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[bn] + j * bitOffsetInGroup]; + const uint16_t* lut_circShift = arrPos(p_lut->circShift[bn], j); + const uint8_t* lut_posBnInCnProcBuf = arrPos(p_lut->posBnInCnProcBuf[bn], j); - uint32_t idxBn = 0; - int8_t* p_cnProcBuf; - uint32_t bitOffsetInGroup; - - // ===================================================================== - // CN group with 3 BNs - - bitOffsetInGroup = lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX; - - for (j=0; j<3; j++) - { - p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j*bitOffsetInGroup]; - - for (i=0; inumCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - const uint16_t (*lut_circShift_CNG3) [lut_numCnInCnGroups_BG2_R15[0]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[0]]) p_lut->circShift[0]; - const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG2_R15[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[1]]) p_lut->circShift[1]; - const uint16_t (*lut_circShift_CNG5) [lut_numCnInCnGroups_BG2_R15[2]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[2]]) p_lut->circShift[2]; - const uint16_t (*lut_circShift_CNG6) [lut_numCnInCnGroups_BG2_R15[3]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[3]]) p_lut->circShift[3]; - const uint16_t (*lut_circShift_CNG8) [lut_numCnInCnGroups_BG2_R15[4]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[4]]) p_lut->circShift[4]; - const uint16_t (*lut_circShift_CNG10) [lut_numCnInCnGroups_BG2_R15[5]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[5]]) p_lut->circShift[5]; - - const uint32_t (*lut_startAddrBnProcBuf_CNG3) [lut_numCnInCnGroups[0]] = (const uint32_t(*)[lut_numCnInCnGroups[0]]) p_lut->startAddrBnProcBuf[0]; - const uint32_t (*lut_startAddrBnProcBuf_CNG4) [lut_numCnInCnGroups[1]] = (const uint32_t(*)[lut_numCnInCnGroups[1]]) p_lut->startAddrBnProcBuf[1]; - const uint32_t (*lut_startAddrBnProcBuf_CNG5) [lut_numCnInCnGroups[2]] = (const uint32_t(*)[lut_numCnInCnGroups[2]]) p_lut->startAddrBnProcBuf[2]; - const uint32_t (*lut_startAddrBnProcBuf_CNG6) [lut_numCnInCnGroups[3]] = (const uint32_t(*)[lut_numCnInCnGroups[3]]) p_lut->startAddrBnProcBuf[3]; - const uint32_t (*lut_startAddrBnProcBuf_CNG8) [lut_numCnInCnGroups[4]] = (const uint32_t(*)[lut_numCnInCnGroups[4]]) p_lut->startAddrBnProcBuf[4]; - const uint32_t (*lut_startAddrBnProcBuf_CNG10) [lut_numCnInCnGroups[5]] = (const uint32_t(*)[lut_numCnInCnGroups[5]]) p_lut->startAddrBnProcBuf[5]; - - const uint8_t (*lut_bnPosBnProcBuf_CNG3) [lut_numCnInCnGroups[0]] = (const uint8_t(*)[lut_numCnInCnGroups[0]]) p_lut->bnPosBnProcBuf[0]; - const uint8_t (*lut_bnPosBnProcBuf_CNG4) [lut_numCnInCnGroups[1]] = (const uint8_t(*)[lut_numCnInCnGroups[1]]) p_lut->bnPosBnProcBuf[1]; - const uint8_t (*lut_bnPosBnProcBuf_CNG5) [lut_numCnInCnGroups[2]] = (const uint8_t(*)[lut_numCnInCnGroups[2]]) p_lut->bnPosBnProcBuf[2]; - const uint8_t (*lut_bnPosBnProcBuf_CNG6) [lut_numCnInCnGroups[3]] = (const uint8_t(*)[lut_numCnInCnGroups[3]]) p_lut->bnPosBnProcBuf[3]; - const uint8_t (*lut_bnPosBnProcBuf_CNG8) [lut_numCnInCnGroups[4]] = (const uint8_t(*)[lut_numCnInCnGroups[4]]) p_lut->bnPosBnProcBuf[4]; - const uint8_t (*lut_bnPosBnProcBuf_CNG10) [lut_numCnInCnGroups[5]] = (const uint8_t(*)[lut_numCnInCnGroups[5]]) p_lut->bnPosBnProcBuf[5]; - - int8_t* p_cnProcBufRes; uint32_t bitOffsetInGroup; - uint32_t i; - uint32_t j; - uint32_t idxBn = 0; // ===================================================================== // CN group with 3 BNs + int BNs[] = {3, 4, 5, 6, 8, 10}; + for (int bn = 0; bn < sizeofArray(BNs); bn++) { + bitOffsetInGroup = lut_numCnInCnGroups_BG2_R15[bn] * NR_LDPC_ZMAX; - bitOffsetInGroup = lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX; + for (int j = 0; j < BNs[bn]; j++) { + int8_t* p_cnProcBufRes = &cnProcBufRes[lut_startAddrCnGroups[bn] + j * bitOffsetInGroup]; + const uint16_t* lut_circShift = arrPos(p_lut->circShift[bn], j); + const uint32_t* lut_startAddrBnProcBuf = arrPos(p_lut->startAddrBnProcBuf[bn], j); + const uint8_t* lut_bnPosBnProcBuf = arrPos(p_lut->bnPosBnProcBuf[bn], j); - for (j=0; j<3; j++) - { - p_cnProcBufRes = &cnProcBufRes[lut_startAddrCnGroups[0] + j*bitOffsetInGroup]; - for (i=0; inumCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - - const uint16_t (*lut_circShift_CNG3) [lut_numCnInCnGroups_BG1_R13[0]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[0]]) p_lut->circShift[0]; - const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG1_R13[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[1]]) p_lut->circShift[1]; - const uint16_t (*lut_circShift_CNG5) [lut_numCnInCnGroups_BG1_R13[2]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[2]]) p_lut->circShift[2]; - const uint16_t (*lut_circShift_CNG6) [lut_numCnInCnGroups_BG1_R13[3]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[3]]) p_lut->circShift[3]; - const uint16_t (*lut_circShift_CNG7) [lut_numCnInCnGroups_BG1_R13[4]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[4]]) p_lut->circShift[4]; - const uint16_t (*lut_circShift_CNG8) [lut_numCnInCnGroups_BG1_R13[5]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[5]]) p_lut->circShift[5]; - const uint16_t (*lut_circShift_CNG9) [lut_numCnInCnGroups_BG1_R13[6]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[6]]) p_lut->circShift[6]; - const uint16_t (*lut_circShift_CNG10)[lut_numCnInCnGroups_BG1_R13[7]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[7]]) p_lut->circShift[7]; - const uint16_t (*lut_circShift_CNG19)[lut_numCnInCnGroups_BG1_R13[8]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[8]]) p_lut->circShift[8]; - - const uint32_t (*lut_startAddrBnProcBuf_CNG3) [lut_numCnInCnGroups[0]] = (const uint32_t(*)[lut_numCnInCnGroups[0]]) p_lut->startAddrBnProcBuf[0]; - const uint32_t (*lut_startAddrBnProcBuf_CNG4) [lut_numCnInCnGroups[1]] = (const uint32_t(*)[lut_numCnInCnGroups[1]]) p_lut->startAddrBnProcBuf[1]; - const uint32_t (*lut_startAddrBnProcBuf_CNG5) [lut_numCnInCnGroups[2]] = (const uint32_t(*)[lut_numCnInCnGroups[2]]) p_lut->startAddrBnProcBuf[2]; - const uint32_t (*lut_startAddrBnProcBuf_CNG6) [lut_numCnInCnGroups[3]] = (const uint32_t(*)[lut_numCnInCnGroups[3]]) p_lut->startAddrBnProcBuf[3]; - const uint32_t (*lut_startAddrBnProcBuf_CNG7) [lut_numCnInCnGroups[4]] = (const uint32_t(*)[lut_numCnInCnGroups[4]]) p_lut->startAddrBnProcBuf[4]; - const uint32_t (*lut_startAddrBnProcBuf_CNG8) [lut_numCnInCnGroups[5]] = (const uint32_t(*)[lut_numCnInCnGroups[5]]) p_lut->startAddrBnProcBuf[5]; - const uint32_t (*lut_startAddrBnProcBuf_CNG9) [lut_numCnInCnGroups[6]] = (const uint32_t(*)[lut_numCnInCnGroups[6]]) p_lut->startAddrBnProcBuf[6]; - const uint32_t (*lut_startAddrBnProcBuf_CNG10)[lut_numCnInCnGroups[7]] = (const uint32_t(*)[lut_numCnInCnGroups[7]]) p_lut->startAddrBnProcBuf[7]; - const uint32_t (*lut_startAddrBnProcBuf_CNG19)[lut_numCnInCnGroups[8]] = (const uint32_t(*)[lut_numCnInCnGroups[8]]) p_lut->startAddrBnProcBuf[8]; - - const uint8_t (*lut_bnPosBnProcBuf_CNG4) [lut_numCnInCnGroups[1]] = (const uint8_t(*)[lut_numCnInCnGroups[1]]) p_lut->bnPosBnProcBuf[1]; - const uint8_t (*lut_bnPosBnProcBuf_CNG5) [lut_numCnInCnGroups[2]] = (const uint8_t(*)[lut_numCnInCnGroups[2]]) p_lut->bnPosBnProcBuf[2]; - const uint8_t (*lut_bnPosBnProcBuf_CNG6) [lut_numCnInCnGroups[3]] = (const uint8_t(*)[lut_numCnInCnGroups[3]]) p_lut->bnPosBnProcBuf[3]; - const uint8_t (*lut_bnPosBnProcBuf_CNG7) [lut_numCnInCnGroups[4]] = (const uint8_t(*)[lut_numCnInCnGroups[4]]) p_lut->bnPosBnProcBuf[4]; - const uint8_t (*lut_bnPosBnProcBuf_CNG8) [lut_numCnInCnGroups[5]] = (const uint8_t(*)[lut_numCnInCnGroups[5]]) p_lut->bnPosBnProcBuf[5]; - const uint8_t (*lut_bnPosBnProcBuf_CNG9) [lut_numCnInCnGroups[6]] = (const uint8_t(*)[lut_numCnInCnGroups[6]]) p_lut->bnPosBnProcBuf[6]; - const uint8_t (*lut_bnPosBnProcBuf_CNG10)[lut_numCnInCnGroups[7]] = (const uint8_t(*)[lut_numCnInCnGroups[7]]) p_lut->bnPosBnProcBuf[7]; - const uint8_t (*lut_bnPosBnProcBuf_CNG19)[lut_numCnInCnGroups[8]] = (const uint8_t(*)[lut_numCnInCnGroups[8]]) p_lut->bnPosBnProcBuf[8]; - - int8_t* p_cnProcBufRes; uint32_t bitOffsetInGroup; - uint32_t i; - uint32_t j; - uint32_t idxBn = 0; // ===================================================================== // CN group with 3 BNs bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX; - for (j=0; j<3; j++) - { - p_cnProcBufRes = &cnProcBufRes[lut_startAddrCnGroups[0] + j*bitOffsetInGroup]; - nrLDPC_inv_circ_memcpy(&bnProcBuf[lut_startAddrBnProcBuf_CNG3[j][0]],p_cnProcBufRes,Z,lut_circShift_CNG3[j][0]); + for (int j = 0; j < 3; j++) { + const uint16_t* lut_circShift_CNG3 = arrPos(p_lut->circShift[0], j); + const uint32_t* lut_startAddrBnProcBuf_CNG3 = arrPos(p_lut->startAddrBnProcBuf[0], j); + int8_t* p_cnProcBufRes = &cnProcBufRes[lut_startAddrCnGroups[0] + j * bitOffsetInGroup]; + nrLDPC_inv_circ_memcpy(&bnProcBuf[lut_startAddrBnProcBuf_CNG3[0]], p_cnProcBufRes, Z, lut_circShift_CNG3[0]); } // ===================================================================== // CN group with 4 BNs + // CN group with 3 BNs + int BNs[] = {3, 4, 5, 6, 7, 8, 9, 10, 19}; + for (int bn = 1; bn < sizeofArray(BNs); bn++) { + bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[bn] * NR_LDPC_ZMAX; - bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX; + for (int j = 0; j < BNs[bn]; j++) { + int8_t* p_cnProcBufRes = &cnProcBufRes[lut_startAddrCnGroups[bn] + j * bitOffsetInGroup]; + const uint16_t* lut_circShift_CNG = arrPos(p_lut->circShift[bn], j); + const uint32_t* lut_startAddrBnProcBuf_CNG = arrPos(p_lut->startAddrBnProcBuf[bn], j); + const uint8_t* lut_bnPosBnProcBuf_CNG = arrPos(p_lut->bnPosBnProcBuf[bn], j); - for (j=0; j<4; j++) - { - p_cnProcBufRes = &cnProcBufRes[lut_startAddrCnGroups[1] + j*bitOffsetInGroup]; - - for (i=0; inumCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - const uint16_t (*lut_circShift_CNG3) [lut_numCnInCnGroups_BG2_R15[0]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[0]]) p_lut->circShift[0]; - const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG2_R15[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[1]]) p_lut->circShift[1]; - const uint16_t (*lut_circShift_CNG5) [lut_numCnInCnGroups_BG2_R15[2]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[2]]) p_lut->circShift[2]; - const uint16_t (*lut_circShift_CNG6) [lut_numCnInCnGroups_BG2_R15[3]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[3]]) p_lut->circShift[3]; - const uint16_t (*lut_circShift_CNG8) [lut_numCnInCnGroups_BG2_R15[4]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[4]]) p_lut->circShift[4]; - const uint16_t (*lut_circShift_CNG10) [lut_numCnInCnGroups_BG2_R15[5]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[5]]) p_lut->circShift[5]; - - const uint32_t (*lut_startAddrBnProcBuf_CNG3) [lut_numCnInCnGroups[0]] = (const uint32_t(*)[lut_numCnInCnGroups[0]]) p_lut->startAddrBnProcBuf[0]; - const uint32_t (*lut_startAddrBnProcBuf_CNG4) [lut_numCnInCnGroups[1]] = (const uint32_t(*)[lut_numCnInCnGroups[1]]) p_lut->startAddrBnProcBuf[1]; - const uint32_t (*lut_startAddrBnProcBuf_CNG5) [lut_numCnInCnGroups[2]] = (const uint32_t(*)[lut_numCnInCnGroups[2]]) p_lut->startAddrBnProcBuf[2]; - const uint32_t (*lut_startAddrBnProcBuf_CNG6) [lut_numCnInCnGroups[3]] = (const uint32_t(*)[lut_numCnInCnGroups[3]]) p_lut->startAddrBnProcBuf[3]; - const uint32_t (*lut_startAddrBnProcBuf_CNG8) [lut_numCnInCnGroups[4]] = (const uint32_t(*)[lut_numCnInCnGroups[4]]) p_lut->startAddrBnProcBuf[4]; - const uint32_t (*lut_startAddrBnProcBuf_CNG10) [lut_numCnInCnGroups[5]] = (const uint32_t(*)[lut_numCnInCnGroups[5]]) p_lut->startAddrBnProcBuf[5]; - - const uint8_t (*lut_bnPosBnProcBuf_CNG3) [lut_numCnInCnGroups[0]] = (const uint8_t(*)[lut_numCnInCnGroups[0]]) p_lut->bnPosBnProcBuf[0]; - const uint8_t (*lut_bnPosBnProcBuf_CNG4) [lut_numCnInCnGroups[1]] = (const uint8_t(*)[lut_numCnInCnGroups[1]]) p_lut->bnPosBnProcBuf[1]; - const uint8_t (*lut_bnPosBnProcBuf_CNG5) [lut_numCnInCnGroups[2]] = (const uint8_t(*)[lut_numCnInCnGroups[2]]) p_lut->bnPosBnProcBuf[2]; - const uint8_t (*lut_bnPosBnProcBuf_CNG6) [lut_numCnInCnGroups[3]] = (const uint8_t(*)[lut_numCnInCnGroups[3]]) p_lut->bnPosBnProcBuf[3]; - const uint8_t (*lut_bnPosBnProcBuf_CNG8) [lut_numCnInCnGroups[4]] = (const uint8_t(*)[lut_numCnInCnGroups[4]]) p_lut->bnPosBnProcBuf[4]; - const uint8_t (*lut_bnPosBnProcBuf_CNG10) [lut_numCnInCnGroups[5]] = (const uint8_t(*)[lut_numCnInCnGroups[5]]) p_lut->bnPosBnProcBuf[5]; - - int8_t* p_cnProcBuf; uint32_t bitOffsetInGroup; - uint32_t i; - uint32_t j; - uint32_t idxBn = 0; // For CN groups 3 to 6 no need to send the last BN back since it's single edge // and BN processing does not change the value already in the CN proc buf // ===================================================================== // CN group with 3 BNs + int BNs[] = {2, 3, 4, 5, 8, 10}; + for (int bn = 0; bn < sizeofArray(BNs); bn++) { + bitOffsetInGroup = lut_numCnInCnGroups_BG2_R15[bn] * NR_LDPC_ZMAX; - bitOffsetInGroup = lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX; + for (int j = 0; j < BNs[bn]; j++) { + int8_t* p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[bn] + j * bitOffsetInGroup]; + const uint16_t* lut_circShift_CNG = arrPos(p_lut->circShift[bn], j); + const uint32_t* lut_startAddrBnProcBuf_CNG = arrPos(p_lut->startAddrBnProcBuf[bn], j); + const uint8_t* lut_bnPosBnProcBuf_CNG = arrPos(p_lut->bnPosBnProcBuf[bn], j); - for (j=0; j<2; j++) - { - p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j*bitOffsetInGroup]; - for (i=0; inumCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - - const uint16_t (*lut_circShift_CNG3) [lut_numCnInCnGroups_BG1_R13[0]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[0]]) p_lut->circShift[0]; - const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG1_R13[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[1]]) p_lut->circShift[1]; - const uint16_t (*lut_circShift_CNG5) [lut_numCnInCnGroups_BG1_R13[2]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[2]]) p_lut->circShift[2]; - const uint16_t (*lut_circShift_CNG6) [lut_numCnInCnGroups_BG1_R13[3]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[3]]) p_lut->circShift[3]; - const uint16_t (*lut_circShift_CNG7) [lut_numCnInCnGroups_BG1_R13[4]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[4]]) p_lut->circShift[4]; - const uint16_t (*lut_circShift_CNG8) [lut_numCnInCnGroups_BG1_R13[5]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[5]]) p_lut->circShift[5]; - const uint16_t (*lut_circShift_CNG9) [lut_numCnInCnGroups_BG1_R13[6]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[6]]) p_lut->circShift[6]; - const uint16_t (*lut_circShift_CNG10)[lut_numCnInCnGroups_BG1_R13[7]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[7]]) p_lut->circShift[7]; - const uint16_t (*lut_circShift_CNG19)[lut_numCnInCnGroups_BG1_R13[8]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[8]]) p_lut->circShift[8]; - - const uint32_t (*lut_startAddrBnProcBuf_CNG3) [lut_numCnInCnGroups[0]] = (const uint32_t(*)[lut_numCnInCnGroups[0]]) p_lut->startAddrBnProcBuf[0]; - const uint32_t (*lut_startAddrBnProcBuf_CNG4) [lut_numCnInCnGroups[1]] = (const uint32_t(*)[lut_numCnInCnGroups[1]]) p_lut->startAddrBnProcBuf[1]; - const uint32_t (*lut_startAddrBnProcBuf_CNG5) [lut_numCnInCnGroups[2]] = (const uint32_t(*)[lut_numCnInCnGroups[2]]) p_lut->startAddrBnProcBuf[2]; - const uint32_t (*lut_startAddrBnProcBuf_CNG6) [lut_numCnInCnGroups[3]] = (const uint32_t(*)[lut_numCnInCnGroups[3]]) p_lut->startAddrBnProcBuf[3]; - const uint32_t (*lut_startAddrBnProcBuf_CNG7) [lut_numCnInCnGroups[4]] = (const uint32_t(*)[lut_numCnInCnGroups[4]]) p_lut->startAddrBnProcBuf[4]; - const uint32_t (*lut_startAddrBnProcBuf_CNG8) [lut_numCnInCnGroups[5]] = (const uint32_t(*)[lut_numCnInCnGroups[5]]) p_lut->startAddrBnProcBuf[5]; - const uint32_t (*lut_startAddrBnProcBuf_CNG9) [lut_numCnInCnGroups[6]] = (const uint32_t(*)[lut_numCnInCnGroups[6]]) p_lut->startAddrBnProcBuf[6]; - const uint32_t (*lut_startAddrBnProcBuf_CNG10)[lut_numCnInCnGroups[7]] = (const uint32_t(*)[lut_numCnInCnGroups[7]]) p_lut->startAddrBnProcBuf[7]; - const uint32_t (*lut_startAddrBnProcBuf_CNG19)[lut_numCnInCnGroups[8]] = (const uint32_t(*)[lut_numCnInCnGroups[8]]) p_lut->startAddrBnProcBuf[8]; - - const uint8_t (*lut_bnPosBnProcBuf_CNG4) [lut_numCnInCnGroups[1]] = (const uint8_t(*)[lut_numCnInCnGroups[1]]) p_lut->bnPosBnProcBuf[1]; - const uint8_t (*lut_bnPosBnProcBuf_CNG5) [lut_numCnInCnGroups[2]] = (const uint8_t(*)[lut_numCnInCnGroups[2]]) p_lut->bnPosBnProcBuf[2]; - const uint8_t (*lut_bnPosBnProcBuf_CNG6) [lut_numCnInCnGroups[3]] = (const uint8_t(*)[lut_numCnInCnGroups[3]]) p_lut->bnPosBnProcBuf[3]; - const uint8_t (*lut_bnPosBnProcBuf_CNG7) [lut_numCnInCnGroups[4]] = (const uint8_t(*)[lut_numCnInCnGroups[4]]) p_lut->bnPosBnProcBuf[4]; - const uint8_t (*lut_bnPosBnProcBuf_CNG8) [lut_numCnInCnGroups[5]] = (const uint8_t(*)[lut_numCnInCnGroups[5]]) p_lut->bnPosBnProcBuf[5]; - const uint8_t (*lut_bnPosBnProcBuf_CNG9) [lut_numCnInCnGroups[6]] = (const uint8_t(*)[lut_numCnInCnGroups[6]]) p_lut->bnPosBnProcBuf[6]; - const uint8_t (*lut_bnPosBnProcBuf_CNG10)[lut_numCnInCnGroups[7]] = (const uint8_t(*)[lut_numCnInCnGroups[7]]) p_lut->bnPosBnProcBuf[7]; - const uint8_t (*lut_bnPosBnProcBuf_CNG19)[lut_numCnInCnGroups[8]] = (const uint8_t(*)[lut_numCnInCnGroups[8]]) p_lut->bnPosBnProcBuf[8]; - - int8_t* p_cnProcBuf; uint32_t bitOffsetInGroup; - uint32_t i; - uint32_t j; - uint32_t idxBn = 0; // For CN groups 3 to 19 no need to send the last BN back since it's single edge // and BN processing does not change the value already in the CN proc buf @@ -1001,147 +355,32 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX; - for (j=0;j<2; j++) - { - p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j*bitOffsetInGroup]; - nrLDPC_circ_memcpy(p_cnProcBuf, &bnProcBufRes[lut_startAddrBnProcBuf_CNG3[j][0]], Z, lut_circShift_CNG3[j][0]); + for (int j = 0; j < 2; j++) { + const uint16_t* lut_circShift_CNG3 = arrPos(p_lut->circShift[0], j); + const uint32_t* lut_startAddrBnProcBuf_CNG3 = arrPos(p_lut->startAddrBnProcBuf[0], j); + int8_t* p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j * bitOffsetInGroup]; + nrLDPC_circ_memcpy(p_cnProcBuf, &bnProcBufRes[lut_startAddrBnProcBuf_CNG3[0]], Z, lut_circShift_CNG3[0]); } // ===================================================================== // CN group with 4 BNs + int BNs[] = {2, 3, 4, 5, 6, 7, 8, 9, 19}; + for (int bn = 1; bn < sizeofArray(BNs); bn++) { + bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[bn] * NR_LDPC_ZMAX; - bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX; - - for (j=0; j<3; j++) - { - p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[1] + j*bitOffsetInGroup]; + for (int j = 0; j < BNs[bn]; j++) { + int8_t* p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[bn] + j * bitOffsetInGroup]; + const uint16_t* lut_circShift_CNG = arrPos(p_lut->circShift[bn], j); + const uint32_t* lut_startAddrBnProcBuf_CNG = arrPos(p_lut->startAddrBnProcBuf[bn], j); + const uint8_t* lut_bnPosBnProcBuf_CNG = arrPos(p_lut->bnPosBnProcBuf[bn], j); - for (i=0; inumBnInBnGroups[0]; - uint32_t startColParity = (BG ==1 ) ? (NR_LDPC_START_COL_PARITY_BG1) : (NR_LDPC_START_COL_PARITY_BG2); + const uint8_t numBn2CnG1 = p_lut->numBnInBnGroups[0]; + uint32_t startColParity = (BG == 1) ? (NR_LDPC_START_COL_PARITY_BG1) : (NR_LDPC_START_COL_PARITY_BG2); - uint32_t colG1 = startColParity*Z; + uint32_t colG1 = startColParity * Z; - const uint16_t* lut_llr2llrProcBufAddr = p_lut->llr2llrProcBufAddr; - const uint8_t* lut_llr2llrProcBufBnPos = p_lut->llr2llrProcBufBnPos; + const uint16_t* lut_llr2llrProcBufAddr = p_lut->llr2llrProcBufAddr; + const uint8_t* lut_llr2llrProcBufBnPos = p_lut->llr2llrProcBufBnPos; - int8_t* p_llrOut = &llrOut[0]; - uint32_t idxBn; + int8_t* p_llrOut = &llrOut[0]; - // Copy LLRs connected to 1 CN - if (numBn2CnG1 > 0) - { - memcpy(&llrOut[colG1], llrRes, numBn2CnG1*Z); - } - - for (i=0; i 0) { + memcpy(&llrOut[colG1], llrRes, numBn2CnG1 * Z); + } + for (int i = 0; i < startColParity; i++) { + const int idxBn = lut_llr2llrProcBufAddr[i] + lut_llr2llrProcBufBnPos[i] * Z; + memcpy(p_llrOut, &llrRes[idxBn], Z); + p_llrOut += Z; + } } #endif diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h index 226af8017e..513bcb1732 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h @@ -34,6 +34,21 @@ #include "time_meas.h" #endif #include "nrLDPCdecoder_defs.h" +typedef struct { + uint8_t* d; + int dim1; + int dim2; +} arr8_t; +typedef struct { + uint16_t* d; + int dim1; + int dim2; +} arr16_t; +typedef struct { + uint32_t* d; + int dim1; + int dim2; +} arr32_t; // ============================================================================== // TYPES @@ -46,12 +61,12 @@ typedef struct nrLDPC_lut { const uint8_t* numBnInBnGroups; /**< Number of CNs in every BN group */ const uint32_t* startAddrBnGroups; /**< Start addresses for BN groups in BN processing buffer */ const uint16_t* startAddrBnGroupsLlr; /**< Start addresses for BN groups in LLR processing buffer */ - const uint16_t** circShift[NR_LDPC_NUM_CN_GROUPS_BG1]; /**< LUT for circular shift values for all CN groups and Zs */ - const uint32_t** startAddrBnProcBuf[NR_LDPC_NUM_CN_GROUPS_BG1]; /**< LUT of start addresses of CN groups in BN proc buffer */ - const uint8_t** bnPosBnProcBuf[NR_LDPC_NUM_CN_GROUPS_BG1]; /**< LUT of BN positions in BG for CN groups */ + arr16_t circShift[NR_LDPC_NUM_CN_GROUPS_BG1]; /**< LUT for circular shift values for all CN groups and Zs */ + arr32_t startAddrBnProcBuf[NR_LDPC_NUM_CN_GROUPS_BG1]; /**< LUT of start addresses of CN groups in BN proc buffer */ + arr8_t bnPosBnProcBuf[NR_LDPC_NUM_CN_GROUPS_BG1]; /**< LUT of BN positions in BG for CN groups */ const uint16_t* llr2llrProcBufAddr; /**< LUT for transferring input LLRs to LLR processing buffer */ const uint8_t* llr2llrProcBufBnPos; /**< LUT BN position in BG */ - const uint8_t** posBnInCnProcBuf[NR_LDPC_NUM_CN_GROUPS_BG1]; /**< LUT for llr2cnProcBuf */ + arr8_t posBnInCnProcBuf[NR_LDPC_NUM_CN_GROUPS_BG1]; /**< LUT for llr2cnProcBuf */ } t_nrLDPC_lut; /** diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c index 4cba3fe078..ad77a61a02 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c +++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c @@ -342,7 +342,8 @@ void build_polar_tables(t_nrPolar_params *polarParams) { } } - AssertFatal(polarParams->N==512 || polarParams->N==256 || polarParams->N==128,"N = %d, not done yet\n",polarParams->N); + AssertFatal(polarParams->N == 512 || polarParams->N == 256 || polarParams->N == 128 || polarParams->N == 64, "N = %d, not done yet\n", polarParams->N); + // build G bit vectors for information bit positions and convert the bit as bytes tables in nr_polar_kronecker_power_matrices.c to 64 bit packed vectors. // keep only rows of G which correspond to information/crc bits polarParams->G_N_tab = (uint64_t **)calloc((polarParams->K + polarParams->n_pc),sizeof(int64_t *)); @@ -410,19 +411,34 @@ void build_polar_tables(t_nrPolar_params *polarParams) { firstingroup_in,firstingroup_in+ccnt, firstingroup_out,firstingroup_out+ccnt); #endif - AssertFatal(mingroupsize==4 || mingroupsize==8 || mingroupsize==16,"mingroupsize %d, needs to be handled\n",mingroupsize); - polarParams->groupsize=mingroupsize; - int shift=3; - if (mingroupsize == 16) shift=4; - else if (mingroupsize == 4) shift=2; + polarParams->groupsize = mingroupsize; + + int shift = 0; + switch (mingroupsize) { + case 2: + shift = 1; + break; + case 4: + shift = 2; + break; + case 8: + shift = 3; + break; + case 16: + shift = 4; + break; + default: + AssertFatal(1 == 0, "mingroupsize = %i is not supported\n", mingroupsize); + break; + } + + polarParams->rm_tab = (int *)malloc(sizeof(int) * (polarParams->encoderLength >> shift)); - polarParams->rm_tab=(int *)malloc(sizeof(int)*polarParams->encoderLength/mingroupsize); // rerun again to create groups - int tcnt=0; - - for (int outpos=0; outposencoderLength; outpos+=mingroupsize,tcnt++) - polarParams->rm_tab[tcnt] = polarParams->rate_matching_pattern[outpos]>>shift; + int tcnt = 0; + for (int outpos = 0; outpos < polarParams->encoderLength; outpos += mingroupsize, tcnt++) + polarParams->rm_tab[tcnt] = polarParams->rate_matching_pattern[outpos] >> shift; } void polar_encoder_fast(uint64_t *A, @@ -699,6 +715,11 @@ void polar_encoder_fast(uint64_t *A, #endif } } + } else if (polarParams->N == 64) { + for (int i = 0; i < ((len > 63) ? 64 : len); i++) { + Cprime_i = -((Cprime[0] >> i) & 1); + D[0] ^= (Cprime_i & polarParams->G_N_tab[off + i][0]); + } } memset((void*)out,0,polarParams->encoderLength>>3); polar_rate_matching(polarParams,(void *)D, out); diff --git a/openair1/PHY/CODING/nr_polar_init.c b/openair1/PHY/CODING/nr_polar_init.c index 38a1ae86ae..4a88417a13 100644 --- a/openair1/PHY/CODING/nr_polar_init.c +++ b/openair1/PHY/CODING/nr_polar_init.c @@ -85,10 +85,8 @@ static void nr_polar_delete(void) { pthread_mutex_unlock(&PolarListMutex); } -t_nrPolar_params * nr_polar_params(int8_t messageType, - uint16_t messageLength, - uint8_t aggregation_level, - int decoder_flag) { +t_nrPolar_params *nr_polar_params(int8_t messageType, uint16_t messageLength, uint8_t aggregation_level, int decoder_flag) +{ // The lock is weak, because we never delete in the list, only at exit time // therefore, returning t_nrPolar_params * from the list is safe for future usage pthread_mutex_lock(&PolarListMutex); @@ -123,8 +121,8 @@ t_nrPolar_params * nr_polar_params(int8_t messageType, newPolarInitNode->idx = PolarKey; newPolarInitNode->nextPtr = NULL; //printf("newPolarInitNode->idx %d, (%d,%d,%d:%d)\n",newPolarInitNode->idx,messageType,messageLength,aggregation_prime,aggregation_level); - - if (messageType == 0) { //PBCH + + if (messageType == NR_POLAR_PBCH_MESSAGE_TYPE) { newPolarInitNode->n_max = NR_POLAR_PBCH_N_MAX; newPolarInitNode->i_il = NR_POLAR_PBCH_I_IL; newPolarInitNode->i_seg = NR_POLAR_PBCH_I_SEG; @@ -135,9 +133,10 @@ t_nrPolar_params * nr_polar_params(int8_t messageType, newPolarInitNode->payloadBits = NR_POLAR_PBCH_PAYLOAD_BITS; newPolarInitNode->encoderLength = NR_POLAR_PBCH_E; newPolarInitNode->crcCorrectionBits = NR_POLAR_PBCH_CRC_ERROR_CORRECTION_BITS; - newPolarInitNode->crc_generator_matrix = crc24c_generator_matrix(newPolarInitNode->payloadBits);//G_P + newPolarInitNode->crc_generator_matrix = crc24c_generator_matrix(newPolarInitNode->payloadBits); // G_P //printf("Initializing polar parameters for PBCH (K %d, E %d)\n",newPolarInitNode->payloadBits,newPolarInitNode->encoderLength); - } else if (messageType == 1) { //DCI + + } else if (messageType == NR_POLAR_DCI_MESSAGE_TYPE) { newPolarInitNode->n_max = NR_POLAR_DCI_N_MAX; newPolarInitNode->i_il = NR_POLAR_DCI_I_IL; newPolarInitNode->i_seg = NR_POLAR_DCI_I_SEG; @@ -146,40 +145,55 @@ t_nrPolar_params * nr_polar_params(int8_t messageType, newPolarInitNode->i_bil = NR_POLAR_DCI_I_BIL; newPolarInitNode->crcParityBits = NR_POLAR_DCI_CRC_PARITY_BITS; newPolarInitNode->payloadBits = messageLength; - newPolarInitNode->encoderLength = aggregation_level*108; + newPolarInitNode->encoderLength = aggregation_level * 108; newPolarInitNode->crcCorrectionBits = NR_POLAR_DCI_CRC_ERROR_CORRECTION_BITS; - newPolarInitNode->crc_generator_matrix=crc24c_generator_matrix(newPolarInitNode->payloadBits+newPolarInitNode->crcParityBits);//G_P + newPolarInitNode->crc_generator_matrix = crc24c_generator_matrix(newPolarInitNode->payloadBits + newPolarInitNode->crcParityBits); // G_P //printf("Initializing polar parameters for DCI (K %d, E %d, L %d)\n",newPolarInitNode->payloadBits,newPolarInitNode->encoderLength,aggregation_level); - } else if (messageType == 2) { //UCI PUCCH2 - AssertFatal(aggregation_level>2,"Aggregation level (%d) for PUCCH 2 encoding is NPRB and should be > 2\n",aggregation_level); - AssertFatal(messageLength>11,"Message length %d is too short for polar encoding of UCI\n",messageLength); - newPolarInitNode->n_max = NR_POLAR_PUCCH_N_MAX; - newPolarInitNode->i_il = NR_POLAR_PUCCH_I_IL; + + } else if (messageType == NR_POLAR_UCI_PUCCH_MESSAGE_TYPE) { + AssertFatal(aggregation_level > 2, "Aggregation level (%d) for PUCCH 2 encoding is NPRB and should be > 2\n", aggregation_level); + AssertFatal(messageLength > 11, "Message length %d is too short for polar encoding of UCI\n", messageLength); + + // TS 38.212 - Section 6.3.1.2.1 UCI encoded by Polar code + int L = 0; + if (messageLength >= 12 && messageLength <= 19) { + L = 6; + } else if (messageLength >= 20) { + L = 11; + } else { + AssertFatal(1 == 0, "L = %i is an invalid value\n", L); + } newPolarInitNode->encoderLength = aggregation_level * 16; - newPolarInitNode->i_seg = 0; - - if ((messageLength >= 360 && newPolarInitNode->encoderLength >= 1088)|| - (messageLength >= 1013)) newPolarInitNode->i_seg = 1; - - newPolarInitNode->crcParityBits = 11; - newPolarInitNode->n_pc = 0; - newPolarInitNode->n_pc_wm = 0; - - if (messageLength < 20) { - newPolarInitNode->crcParityBits = 6; - newPolarInitNode->n_pc = 3; - if ((newPolarInitNode->encoderLength - messageLength - 6 + 3) < 193) newPolarInitNode->n_pc_wm = 1; + if ((messageLength >= 360 && newPolarInitNode->encoderLength >= 1088) || (messageLength >= 1013)) { + newPolarInitNode->i_seg = 1; + AssertFatal(1 == 0, "Segmentation is not supported yet (i_seg = %i)\n", newPolarInitNode->i_seg); } - + // TS 38.212 - Section 6.3.1.3.1 UCI encoded by Polar code + newPolarInitNode->n_max = NR_POLAR_PUCCH_N_MAX; + newPolarInitNode->i_il = NR_POLAR_PUCCH_I_IL; + newPolarInitNode->crcParityBits = L; + int Kr = messageLength + L; + if (Kr >= 18 && Kr <= 25) { + newPolarInitNode->n_pc = 3; + if ((newPolarInitNode->encoderLength - Kr + 3) > 192) { + newPolarInitNode->n_pc_wm = 1; + } else { + newPolarInitNode->n_pc_wm = 0; + } + } else if (Kr > 30) { + newPolarInitNode->n_pc = 0; + newPolarInitNode->n_pc_wm = 0; + } else { + AssertFatal(1 == 0, "Kr = %i is an invalid value\n", Kr); + } newPolarInitNode->i_bil = NR_POLAR_PUCCH_I_BIL; - newPolarInitNode->payloadBits = messageLength; newPolarInitNode->crcCorrectionBits = NR_POLAR_PUCCH_CRC_ERROR_CORRECTION_BITS; - //newPolarInitNode->crc_generator_matrix=crc24c_generator_matrix(newPolarInitNode->payloadBits+newPolarInitNode->crcParityBits);//G_P //LOG_D(PHY,"New polar node, encoderLength %d, aggregation_level %d\n",newPolarInitNode->encoderLength,aggregation_level); + } else { AssertFatal(1 == 0, "[nr_polar_init] Incorrect Message Type(%d)", messageType); } diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 36561b110c..3d5268b363 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -706,23 +706,24 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB) pusch->rxdataF_comp = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); pusch->ul_ch_mag0 = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); pusch->ul_ch_magb0 = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); + pusch->ul_ch_magc0 = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); pusch->ul_ch_mag = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); pusch->ul_ch_magb = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); + pusch->ul_ch_magc = (int32_t **)malloc16(n_buf * sizeof(int32_t *)); pusch->rho = (int32_t ***)malloc16(Prx * sizeof(int32_t **)); pusch->llr_layers = (int16_t **)malloc16(max_ul_mimo_layers * sizeof(int32_t *)); - - for (i=0; irxdataF_ext[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); pusch->rho[i] = (int32_t **)malloc16_clear(NR_MAX_NB_LAYERS * NR_MAX_NB_LAYERS * sizeof(int32_t *)); - for (int j=0; j< max_ul_mimo_layers; j++) { - for (int k=0; krho[i][j * max_ul_mimo_layers + k] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); } } } - for (i=0; iul_ch_estimates[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * fp->ofdm_symbol_size * fp->symbols_per_slot); pusch->ul_ch_estimates_ext[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); pusch->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * fp->ofdm_symbol_size); @@ -730,8 +731,10 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB) pusch->rxdataF_comp[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); pusch->ul_ch_mag0[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); pusch->ul_ch_magb0[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); + pusch->ul_ch_magc0[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); pusch->ul_ch_mag[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); pusch->ul_ch_magb[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); + pusch->ul_ch_magc[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot); } for (i=0; i< max_ul_mimo_layers; i++) { @@ -753,7 +756,9 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) const int Prx = gNB->gNB_config.carrier_config.num_rx_ant.value; const int max_ul_mimo_layers = 4; // taken from phy_init_nr_gNB() const int n_buf = Prx * max_ul_mimo_layers; - + PHY_MEASUREMENTS_gNB *meas=&gNB->measurements; + free_and_zero(meas->n0_subband_power); + free_and_zero(meas->n0_subband_power_dB); int max_dl_mimo_layers =(fp->nb_antennas_txnb_antennas_tx : NR_MAX_NB_LAYERS; if (fp->nb_antennas_tx>1) { for (int nl = 0; nl < max_dl_mimo_layers; nl++) { @@ -867,8 +872,10 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) free_and_zero(pusch_vars->rxdataF_comp[i]); free_and_zero(pusch_vars->ul_ch_mag0[i]); free_and_zero(pusch_vars->ul_ch_magb0[i]); + free_and_zero(pusch_vars->ul_ch_magc0[i]); free_and_zero(pusch_vars->ul_ch_mag[i]); free_and_zero(pusch_vars->ul_ch_magb[i]); + free_and_zero(pusch_vars->ul_ch_magc[i]); } free_and_zero(pusch_vars->llr_layers); free_and_zero(pusch_vars->rxdataF_ext); @@ -880,8 +887,10 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) free_and_zero(pusch_vars->rxdataF_comp); free_and_zero(pusch_vars->ul_ch_mag0); free_and_zero(pusch_vars->ul_ch_magb0); + free_and_zero(pusch_vars->ul_ch_magc0); free_and_zero(pusch_vars->ul_ch_mag); free_and_zero(pusch_vars->ul_ch_magb); + free_and_zero(pusch_vars->ul_ch_magc); free_and_zero(pusch_vars->rho); free_and_zero(pusch_vars->llr); @@ -954,7 +963,8 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB, } fp->threequarter_fs = 0; - gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band); + int bw_index = get_supported_band_index(mu, fp->nr_band, N_RB_DL); + gNB_config->carrier_config.dl_bandwidth.value = get_supported_bw_mhz(fp->nr_band > 256 ? FR2 : FR1, bw_index); nr_init_frame_parms(gNB_config, fp); diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 65d3f86f7a..6c65f6a803 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -234,9 +234,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) ue->bitrate[gNB_id] = 0; ue->total_received_bits[gNB_id] = 0; - ue->ul_time_alignment[gNB_id].apply_ta = 0; - ue->ul_time_alignment[gNB_id].ta_frame = -1; - ue->ul_time_alignment[gNB_id].ta_slot = -1; } // init NR modulation lookup tables nr_generate_modulation_table(); @@ -691,6 +688,8 @@ void init_N_TA_offset(PHY_VARS_NR_UE *ue){ } ue->N_TA_offset = (int)(N_TA_offset * factor); + ue->ta_frame = -1; + ue->ta_slot = -1; LOG_I(PHY,"UE %d Setting N_TA_offset to %d samples (factor %f, UL Freq %lu, N_RB %d, mu %d)\n", ue->Mod_id, ue->N_TA_offset, factor, fp->ul_CarrierFreq, fp->N_RB_DL, fp->numerology_index); } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 6735e251ba..68d7b87984 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -1024,7 +1024,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue, #elif defined(__arm__) || defined(__aarch64__) int16x8_t *dl_ch0_128, *dl_ch1_128; #endif - int *dl_ch0,*dl_ch1; + int *dl_ch0=NULL,*dl_ch1=NULL; LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; int nb_subbands,subband_size,last_subband_size; diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c b/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c index 0addfdf14c..19686eec6f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c @@ -352,16 +352,16 @@ void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t if (ra_header==0) { for (i=16; i>0; i--) { - if ((rb_alloc&(1<>5] |= (7<<((3*(16-i))%32)); + if ((rb_alloc & (1 << i)) != 0) + rb_alloc2[(3 * (16 - i)) >> 5] |= (7U << ((3 * (16 - i)) % 32)); } // bit mask across if ((rb_alloc2[0]>>31)==1) - rb_alloc2[1] |= 1; + rb_alloc2[1] |= 1; if ((rb_alloc&1) != 0) - rb_alloc2[1] |= (3<<16); + rb_alloc2[1] |= (3 << 16); } else { LOG_W(PHY,"resource type 1 not supported for N_RB_DL=50\n"); @@ -371,10 +371,10 @@ void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t case 100: if (ra_header==0) { for (i=0; i<25; i++) { - if ((rb_alloc&(1<<(24-i))) != 0) - rb_alloc2[(4*i)>>5] |= (0xf<<((4*i)%32)); + if ((rb_alloc & (1 << (24 - i))) != 0) + rb_alloc2[(4 * i) >> 5] |= (0xfU << ((4 * i) % 32)); - // printf("rb_alloc2[%d] (type 0) %x (%d)\n",(4*i)>>5,rb_alloc2[(4*i)>>5],rb_alloc&(1<>5,rb_alloc2[(4*i)>>5],rb_alloc&(1<tdd_config); - ret=255; + LOG_E(PHY, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", subframe, frame_parms->tdd_config); + ret = 255; } else ret = (subframe/7); break; @@ -996,8 +996,7 @@ uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t } } - AssertFatal(ret!=255, - "invalid harq_pid(%d) at SFN/SF = %d/%d\n", (int8_t)ret, frame, subframe); + AssertFatal(ret != 255, "invalid harq_pid(%d) at SFN/SF = %d/%d\n", (int8_t)ret, frame, subframe); return ret; } diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index 4b1cf2cbee..35408c28d5 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -840,16 +840,16 @@ int allocate_REs_in_RB_no_pilots_16QAM_tm2(PHY_VARS_eNB* phy_vars_eNB, (((uint32_t)x0p[4])<<5)|(((uint32_t)x0p[6])<<4)| (((uint32_t)x0p[5])<<7)|(((uint32_t)x0p[7])<<6); - txF0[0]=qam_table16_0[qam16_table_offset]; - txF1[0]=qam_table16_1[qam16_table_offset]; + memcpy(txF0, &qam_table16_0[qam16_table_offset], sizeof(*txF0)); + memcpy(txF1, &qam_table16_1[qam16_table_offset], sizeof(*txF1)); x0p+=8; qam16_table_offset=(((uint32_t)x0p[0])<<1)|(((uint32_t)x0p[2]))| (((uint32_t)x0p[1])<<3)|(((uint32_t)x0p[3])<<2) | (((uint32_t)x0p[4])<<5)|(((uint32_t)x0p[6])<<4) | (((uint32_t)x0p[5])<<7)|(((uint32_t)x0p[7])<<6); - txF0[1]=qam_table16_0[qam16_table_offset]; - txF1[1]=qam_table16_1[qam16_table_offset]; + memcpy(txF0 + 1, &qam_table16_0[qam16_table_offset], sizeof(*txF0)); + memcpy(txF1 + 1, &qam_table16_1[qam16_table_offset], sizeof(*txF1)); x0p+=8; qam16_table_offset=(((uint32_t)x0p[0])<<1)|(((uint32_t)x0p[2]))| @@ -857,8 +857,8 @@ int allocate_REs_in_RB_no_pilots_16QAM_tm2(PHY_VARS_eNB* phy_vars_eNB, (((uint32_t)x0p[4])<<5)|(((uint32_t)x0p[6])<<4) | (((uint32_t)x0p[5])<<7)|(((uint32_t)x0p[7])<<6); - txF0[2]=qam_table16_0[qam16_table_offset]; - txF1[2]=qam_table16_1[qam16_table_offset]; + memcpy(txF0 + 2, &qam_table16_0[qam16_table_offset], sizeof(*txF0)); + memcpy(txF1 + 2, &qam_table16_1[qam16_table_offset], sizeof(*txF1)); if(skip_half==0) { if (skip_dc>0) { @@ -872,23 +872,23 @@ int allocate_REs_in_RB_no_pilots_16QAM_tm2(PHY_VARS_eNB* phy_vars_eNB, (((uint32_t)x0p[4])<<5)|(((uint32_t)x0p[6])<<4) | (((uint32_t)x0p[5])<<7)|(((uint32_t)x0p[7])<<6); - txF0[3]=qam_table16_0[qam16_table_offset]; - txF1[3]=qam_table16_1[qam16_table_offset]; + memcpy(txF0 + 3, &qam_table16_0[qam16_table_offset], sizeof(*txF0)); + memcpy(txF1 + 3, &qam_table16_1[qam16_table_offset], sizeof(*txF1)); x0p+=8; qam16_table_offset=(((uint32_t)x0p[0])<<1)|(((uint32_t)x0p[2]))| (((uint32_t)x0p[1])<<3)|(((uint32_t)x0p[3])<<2) | (((uint32_t)x0p[4])<<5)|(((uint32_t)x0p[6])<<4) | (((uint32_t)x0p[5])<<7)|(((uint32_t)x0p[7])<<6); - txF0[4]=qam_table16_0[qam16_table_offset]; - txF1[4]=qam_table16_1[qam16_table_offset]; + memcpy(txF0 + 4, &qam_table16_0[qam16_table_offset], sizeof(*txF0)); + memcpy(txF1 + 4, &qam_table16_1[qam16_table_offset], sizeof(*txF1)); x0p+=8; qam16_table_offset=(((uint32_t)x0p[0])<<1)|(((uint32_t)x0p[2]))| (((uint32_t)x0p[1])<<3)|(((uint32_t)x0p[3])<<2) | (((uint32_t)x0p[4])<<5)|(((uint32_t)x0p[6])<<4) | (((uint32_t)x0p[5])<<7)|(((uint32_t)x0p[7])<<6); - txF0[5]=qam_table16_0[qam16_table_offset]; - txF1[5]=qam_table16_1[qam16_table_offset]; + memcpy(txF0 + 5, &qam_table16_0[qam16_table_offset], sizeof(*txF0)); + memcpy(txF1 + 5, &qam_table16_1[qam16_table_offset], sizeof(*txF1)); } if(skip_half!=0) { diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c index 9e646bd793..54633fbc18 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c @@ -4706,7 +4706,8 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } if (rb_alloc_ind==1) { - *pmi_ext = (pmi>>((rb>>2)<<1))&3; + uint32_t tmp = (rb >> 2) << 1; + *pmi_ext = tmp >= 16 ? 0 : (pmi >> tmp) & 3; memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); /* diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index bf2466d2f2..a26a1d0574 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -146,7 +146,19 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb PHY_MEASUREMENTS_gNB *measurements = &gNB->measurements; int rb, nb_symb[275]={0}; - memset(measurements->n0_subband_power, 0, sizeof(measurements->n0_subband_power)); + allocCast2D(n0_subband_power, + unsigned int, + gNB->measurements.n0_subband_power, + frame_parms->nb_antennas_rx, + frame_parms->N_RB_UL, + false); + clearArray(gNB->measurements.n0_subband_power, unsigned int); + allocCast2D(n0_subband_power_dB, + unsigned int, + gNB->measurements.n0_subband_power_dB, + frame_parms->nb_antennas_rx, + frame_parms->N_RB_UL, + false); for (int s=first_symb;s<(first_symb+num_symb);s++) { int offset0 = ((slot&3)*frame_parms->symbols_per_slot + s) * frame_parms->ofdm_symbol_size; @@ -166,7 +178,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb } else { signal_energy = signal_energy_nodc(ul_ch, 12); } - measurements->n0_subband_power[aarx][rb] += signal_energy; + n0_subband_power[aarx][rb] += signal_energy; LOG_D(PHY,"slot %d symbol %d RB %d aarx %d n0_subband_power %d\n", slot, s, rb, aarx, signal_energy); } //antenna } @@ -182,10 +194,10 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb int32_t n0_subband_tot_perPRB=0; if (nb_symb[rb] > 0) { for (int aarx=0;aarxnb_antennas_rx;aarx++) { - measurements->n0_subband_power[aarx][rb]/=nb_symb[rb]; - measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]); - n0_subband_tot_perPRB+=measurements->n0_subband_power[aarx][rb]; - n0_subband_tot_perANT[aarx]+=measurements->n0_subband_power[aarx][rb]; + n0_subband_power[aarx][rb] /= nb_symb[rb]; + n0_subband_power_dB[aarx][rb] = dB_fixed(n0_subband_power[aarx][rb]); + n0_subband_tot_perPRB += n0_subband_power[aarx][rb]; + n0_subband_tot_perANT[aarx] += n0_subband_power[aarx][rb]; } n0_subband_tot_perPRB/=frame_parms->nb_antennas_rx; measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_subband_tot_perPRB); @@ -218,30 +230,31 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, unsigned short rx_power_avg_dB; unsigned short rx_power_tot_dB; - double rx_gain = openair0_cfg[0].rx_gain[0]; - double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0]; + double rx_gain = openair0_cfg[0].rx_gain[0]; + double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0]; PHY_MEASUREMENTS_gNB *meas = &gNB->measurements; - NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; - int ch_offset = fp->ofdm_symbol_size * symbol; + NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; + int ch_offset = fp->ofdm_symbol_size * symbol; int N_RB_UL = ulsch->harq_process->ulsch_pdu.rb_size; ulsch_measurements_gNB *ulsch_measurements = &ulsch->ulsch_measurements; int rx_power[fp->nb_antennas_rx]; + allocCast2D(rx_spatial_power, int, ulsch_measurements->rx_spatial_power, nrOfLayers, fp->nb_antennas_rx, true); + allocCast2D(rx_spatial_power_dB, unsigned short, ulsch_measurements->rx_spatial_power_dB, nrOfLayers, fp->nb_antennas_rx, true); for (int aarx = 0; aarx < fp->nb_antennas_rx; aarx++){ rx_power[aarx] = 0; for (int aatx = 0; aatx < nrOfLayers; aatx++){ - ulsch_measurements->rx_spatial_power[aatx][aarx] = + rx_spatial_power[aatx][aarx] = (signal_energy_nodc(&pusch_vars->ul_ch_estimates[aatx * fp->nb_antennas_rx + aarx][ch_offset], N_RB_UL * NR_NB_SC_PER_RB)); - if (ulsch_measurements->rx_spatial_power[aatx][aarx] < 0) { - ulsch_measurements->rx_spatial_power[aatx][aarx] = 0; + if (rx_spatial_power[aatx][aarx] < 0) { + rx_spatial_power[aatx][aarx] = 0; } - ulsch_measurements->rx_spatial_power_dB[aatx][aarx] = - (unsigned short)dB_fixed(ulsch_measurements->rx_spatial_power[aatx][aarx]); - rx_power[aarx] += ulsch_measurements->rx_spatial_power[aatx][aarx]; + rx_spatial_power_dB[aatx][aarx] = (unsigned short)dB_fixed(rx_spatial_power[aatx][aarx]); + rx_power[aarx] += rx_spatial_power[aatx][aarx]; } LOG_D(PHY, "[RNTI %04x] RX power in antenna %d = %d\n", ulsch->rnti, aarx, rx_power[aarx]); diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h index 4611e363e5..8b9da28abc 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.h +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h @@ -72,7 +72,11 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, uint16_t dmrs_bitmap, uint16_t num_rbs); -static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask ) { return ((dmrsSymbMask >> l) & 0x1); } +static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask) +{ + DevAssert(l < 32); + return ((dmrsSymbMask >> l) & 0x1); +} #undef EXTERN #endif /* DMRS_NR_H */ diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.c b/openair1/PHY/NR_REFSIG/ptrs_nr.c index 5df4a25656..d941543821 100644 --- a/openair1/PHY/NR_REFSIG/ptrs_nr.c +++ b/openair1/PHY/NR_REFSIG/ptrs_nr.c @@ -373,7 +373,7 @@ int8_t nr_ptrs_process_slot(uint16_t dmrsSymbPos, } /* check for left side first */ /* right side a DMRS symbol then we need to left extrapolate */ - if(is_dmrs_symbol(rightRef,dmrsSymbPos)) { + if (rightRef != -1 && is_dmrs_symbol(rightRef, dmrsSymbPos)) { /* calculate slope from next valid estimates*/ tmp = get_next_estimate_in_slot(ptrsSymbPos,dmrsSymbPos,rightRef+1,symbInSlot); /* Special case when DMRS is not followed by PTRS symbol then reuse old slope */ @@ -382,22 +382,19 @@ int8_t nr_ptrs_process_slot(uint16_t dmrsSymbPos, } ptrs_estimate_from_slope(estPerSymb,slope_p,leftRef, rightRef); symb = rightRef -1; - } - else if(is_ptrs_symbol(rightRef,ptrsSymbPos)) { + } else if (rightRef != -1 && is_ptrs_symbol(rightRef, ptrsSymbPos)) { /* calculate slope from next valid estimates */ get_slope_from_estimates(leftRef,rightRef,estPerSymb, slope_p); ptrs_estimate_from_slope(estPerSymb,slope_p,leftRef, rightRef); symb = rightRef -1; - } - else if((rightRef ==-1) && (symb ofdm_symbol_size+start_sc)<<1)]; + __m128i *txF = (__m128i *)&txdataF_precoding[nl][((l * frame_parms->ofdm_symbol_size + start_sc) << 1)]; - __m64 *txl = (__m64*)&tx_layers[nl][m<<1]; - __m64 amp64=_mm_set1_pi16(amp); - for (int i=0; i<(upper_limit>>1); i++) { - - txF[i] = _mm_mulhrs_pi16(amp64,txl[i]); + __m128i *txl = (__m128i *)&tx_layers[nl][m << 1]; + __m128i amp64 = _mm_set1_epi16(amp); + int i; + for (i = 0; i < (upper_limit >> 2); i++) { + const __m128i txL = _mm_loadu_si128(txl + i); + _mm_storeu_si128(txF + i, _mm_mulhrs_epi16(amp64, txL)); #ifdef DEBUG_DLSCH_MAPPING if ((i&1) > 0) - printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", - m, l, start_sc+(i>>1), txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + start_sc+(i>>1))<<1)], - txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + start_sc+(i>>1))<<1) + 1]); + printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", + m, + l, + start_sc + (i >> 1), + txdataF_precoding[nl][((l * frame_parms->ofdm_symbol_size + start_sc + (i >> 1)) << 1)], + txdataF_precoding[nl][((l * frame_parms->ofdm_symbol_size + start_sc + (i >> 1)) << 1) + 1]); #endif /* handle this, mute RE */ /*else { txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = 0; txdataF_precoding[anl][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = 0; - }*/ - } //RE loop, first part + }*/ + } + if (i * 4 != upper_limit) { + c16_t *txFc = (c16_t *)&txdataF_precoding[nl][((l * frame_parms->ofdm_symbol_size + start_sc) << 1)]; + c16_t *txlc = (c16_t *)&tx_layers[nl][m << 1]; + for (i = (upper_limit >> 2) << 2; i < upper_limit; i++) { + txFc[i].r = ((txlc[i].r * amp) >> 14) + 1; + txFc[i].i = ((txlc[i].i * amp) >> 14) + 1; + } + } m+=upper_limit; if (remaining_re > 0) { - txF = (__m64*)&txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size)<<1)]; - txl = (__m64*)&tx_layers[nl][m<<1]; - for (int i=0; i<(remaining_re>>1); i++) { - txF[i] = _mm_mulhrs_pi16(amp64,txl[i]); + txF = (__m128i *)&txdataF_precoding[nl][((l * frame_parms->ofdm_symbol_size) << 1)]; + txl = (__m128i *)&tx_layers[nl][m << 1]; + int i; + for (i = 0; i < (remaining_re >> 2); i++) { + const __m128i txL = _mm_loadu_si128(txl + i); + _mm_storeu_si128(txF + i, _mm_mulhrs_epi16(amp64, txL)); #ifdef DEBUG_DLSCH_MAPPING - if ((i&1) > 0) - printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", - m, l, i>>1, txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + (i>>1))<<1) ], - txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + (i>>1))<<1) + 1]); + if ((i & 1) > 0) + printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", + m, + l, + i >> 1, + txdataF_precoding[nl][((l * frame_parms->ofdm_symbol_size + (i >> 1)) << 1)], + txdataF_precoding[nl][((l * frame_parms->ofdm_symbol_size + (i >> 1)) << 1) + 1]); #endif - /* handle this, mute RE */ - /*else { - txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = 0; - txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = 0; - }*/ - } //RE loop, second part + /* handle this, mute RE */ + /*else { + txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = 0; + txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = 0; + }*/ + } // RE loop, second part + if (i * 4 != remaining_re) { + c16_t *txFc = (c16_t *)&txdataF_precoding[nl][((l * frame_parms->ofdm_symbol_size) << 1)]; + c16_t *txlc = (c16_t *)&tx_layers[nl][m << 1]; + for (i = (remaining_re >> 2) << 2; i < remaining_re; i++) { + txFc[i].r = ((txlc[i].r * amp) >> 14) + 1; + txFc[i].i = ((txlc[i].i * amp) >> 14) + 1; + } + } } // m+=remaining_re; } // N_RB_DL even diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index cb7cd35516..0509ce7acf 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -176,8 +176,9 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext, /** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation. In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation) @param rxdataF_ext Frequency-domain received signal in RBs to be demodulated @param ul_ch_estimates_ext Frequency-domain channel estimates in RBs to be demodulated - @param ul_ch_mag First Channel magnitudes (16QAM/64QAM) - @param ul_ch_magb Second weighted Channel magnitudes (64QAM) + @param ul_ch_mag First Channel magnitudes (16QAM/64QAM/256QAM) + @param ul_ch_magb Second weighted Channel magnitudes (64QAM/256QAM) + @param ul_ch_magc Third weighted Channel magnitudes (256QAM) @param rxdataF_comp Compensated received waveform @param frame_parms Pointer to frame descriptor @param symbol Symbol on which to operate @@ -189,6 +190,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, int **ul_ch_estimates_ext, int **ul_ch_mag, int **ul_ch_magb, + int **ul_ch_magc, int **rxdataF_comp, int ***rho, NR_DL_FRAME_PARMS *frame_parms, @@ -250,6 +252,23 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, uint32_t nb_re, uint8_t symbol); +/** \brief This function generates log-likelihood ratios (decoder input) for single-stream 256 QAM received waveforms. + @param rxdataF_comp Compensated channel output + @param ul_ch_mag uplink channel magnitude multiplied by the 1st amplitude threshold in QAM 256 + @param ul_ch_magb uplink channel magnitude multiplied by the 2bd amplitude threshold in QAM 256 + @param ul_ch_magc uplink channel magnitude multiplied by the 3rd amplitude threshold in QAM 256 + @param ulsch_llr llr output + @param nb_re number of REs for this allocation + @param symbol OFDM symbol index in sub-frame +*/ +void nr_ulsch_256qam_llr(int32_t *rxdataF_comp, + int32_t **ul_ch_mag, + int32_t **ul_ch_magb, + int32_t **ul_ch_magc, + int16_t *ulsch_llr, + uint32_t nb_rb, + uint32_t nb_re, + uint8_t symbol); /** \brief This function computes the log-likelihood ratios for 4, 16, and 64 QAM @param rxdataF_comp Compensated channel output @@ -263,6 +282,7 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, void nr_ulsch_compute_llr(int32_t *rxdataF_comp, int32_t *ul_ch_mag, int32_t *ul_ch_magb, + int32_t *ul_ch_magc, int16_t *ulsch_llr, uint32_t nb_rb, uint32_t nb_re, diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c index e7863d3820..352967c7f5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c @@ -88,8 +88,7 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_pusch_pdu_t harq->round++; memcpy(&ulsch->harq_process->ulsch_pdu, ulsch_pdu, sizeof(ulsch->harq_process->ulsch_pdu)); - - LOG_D(PHY, "Initializing nFAPI for ULSCH, harq_pid %d\n", harq_pid); + LOG_D(PHY, "Initializing nFAPI for ULSCH, harq_pid %d, layers %d\n", harq_pid, ulsch_pdu->nrOfLayers); } void reset_active_ulsch(PHY_VARS_gNB *gNB, int frame) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 410ffc89d5..bcd73c58a9 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -93,7 +93,7 @@ NR_gNB_ULSCH_t new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL) } uint32_t ulsch_bytes = a_segments * 1056; // allocated bytes per segment - NR_gNB_ULSCH_t ulsch; + NR_gNB_ULSCH_t ulsch = {0}; ulsch.max_ldpc_iterations = max_ldpc_iterations; ulsch.harq_pid = -1; diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index bb213c595b..8cf4226922 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -568,6 +568,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, int **ul_ch_estimates_ext, int **ul_ch_mag, int **ul_ch_magb, + int **ul_ch_magc, int **rxdataF_comp, int ***rho, NR_DL_FRAME_PARMS *frame_parms, @@ -625,8 +626,8 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, unsigned short rb; unsigned char aatx,aarx; - __m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128; - __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0}; + __m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*ul_ch_mag128c,*rxdataF128,*rxdataF_comp128,*rho128; + __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0},QAM_amp128c={0}; QAM_amp128b = _mm_setzero_si128(); uint32_t nb_rb_0 = length/12 + ((length%12)?1:0); @@ -634,10 +635,17 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, if (mod_order == 4) { QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10) QAM_amp128b = _mm_setzero_si128(); + QAM_amp128c = _mm_setzero_si128(); } else if (mod_order == 6) { QAM_amp128 = _mm_set1_epi16(QAM64_n1); // QAM_amp128b = _mm_set1_epi16(QAM64_n2); + QAM_amp128c = _mm_setzero_si128(); + } + else if (mod_order == 8) { + QAM_amp128 = _mm_set1_epi16(QAM256_n1); // + QAM_amp128b = _mm_set1_epi16(QAM256_n2); + QAM_amp128c = _mm_set1_epi16(QAM256_n3); } // printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol); @@ -646,6 +654,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; ul_ch_mag128 = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; ul_ch_mag128b = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; + ul_ch_mag128c = (__m128i *)&ul_ch_magc[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*(off+(nb_rb*12))]; rxdataF_comp128 = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; @@ -668,37 +677,32 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, ul_ch_mag128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0); ul_ch_mag128b[0] = ul_ch_mag128[0]; - ul_ch_mag128[0] = _mm_mulhi_epi16(ul_ch_mag128[0],QAM_amp128); - ul_ch_mag128[0] = _mm_slli_epi16(ul_ch_mag128[0],1); - - ul_ch_mag128b[0] = _mm_mulhi_epi16(ul_ch_mag128b[0],QAM_amp128b); - ul_ch_mag128b[0] = _mm_slli_epi16(ul_ch_mag128b[0],1); + ul_ch_mag128c[0] = ul_ch_mag128[0]; + ul_ch_mag128[0] = _mm_mulhrs_epi16(ul_ch_mag128[0],QAM_amp128); + ul_ch_mag128b[0] = _mm_mulhrs_epi16(ul_ch_mag128b[0],QAM_amp128b); + ul_ch_mag128c[0] = _mm_mulhrs_epi16(ul_ch_mag128c[0],QAM_amp128c); // print_ints("ch: = ",(int32_t*)&mmtmpD0); // print_shorts("QAM_amp:",(int16_t*)&QAM_amp128); // print_shorts("mag:",(int16_t*)&ul_ch_mag128[0]); - ul_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); + ul_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); ul_ch_mag128b[1] = ul_ch_mag128[1]; - ul_ch_mag128[1] = _mm_mulhi_epi16(ul_ch_mag128[1],QAM_amp128); - ul_ch_mag128[1] = _mm_slli_epi16(ul_ch_mag128[1],1); - - ul_ch_mag128b[1] = _mm_mulhi_epi16(ul_ch_mag128b[1],QAM_amp128b); - ul_ch_mag128b[1] = _mm_slli_epi16(ul_ch_mag128b[1],1); + ul_ch_mag128c[1] = ul_ch_mag128[1]; + ul_ch_mag128[1] = _mm_mulhrs_epi16(ul_ch_mag128[1],QAM_amp128); + ul_ch_mag128b[1] = _mm_mulhrs_epi16(ul_ch_mag128b[1],QAM_amp128b); + ul_ch_mag128c[1] = _mm_mulhrs_epi16(ul_ch_mag128c[1],QAM_amp128c); mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128[2]); mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); - ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1); + ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1); ul_ch_mag128b[2] = ul_ch_mag128[2]; + ul_ch_mag128c[2] = ul_ch_mag128[2]; - ul_ch_mag128[2] = _mm_mulhi_epi16(ul_ch_mag128[2],QAM_amp128); - ul_ch_mag128[2] = _mm_slli_epi16(ul_ch_mag128[2],1); - - - ul_ch_mag128b[2] = _mm_mulhi_epi16(ul_ch_mag128b[2],QAM_amp128b); - ul_ch_mag128b[2] = _mm_slli_epi16(ul_ch_mag128b[2],1); - + ul_ch_mag128[2] = _mm_mulhrs_epi16(ul_ch_mag128[2],QAM_amp128); + ul_ch_mag128b[2] = _mm_mulhrs_epi16(ul_ch_mag128b[2],QAM_amp128b); + ul_ch_mag128c[2] = _mm_mulhrs_epi16(ul_ch_mag128c[2],QAM_amp128c); } // Multiply received data by conjugated channel @@ -709,6 +713,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, ul_ch128 += 3; ul_ch_mag128 += 3; ul_ch_mag128b += 3; + ul_ch_mag128c += 3; rxdataF128 += 3; rxdataF_comp128 += 3; } @@ -1075,6 +1080,7 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **ul_ch_mag, int32_t **ul_ch_magb, + int32_t **ul_ch_magc, int32_t ***rho, uint8_t nrOfLayers, uint8_t symbol, @@ -1082,7 +1088,7 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, int length) { int n_rx = frame_parms->nb_antennas_rx; #if defined(__x86_64__) || defined(__i386__) - __m128i *rxdataF_comp128[2],*ul_ch_mag128[2],*ul_ch_mag128b[2]; + __m128i *rxdataF_comp128[2],*ul_ch_mag128[2],*ul_ch_mag128b[2],*ul_ch_mag128c[2]; #elif defined(__arm__) || defined(__aarch64__) int16x8_t *rxdataF_comp128_0,*ul_ch_mag128_0,*ul_ch_mag128_0b; int16x8_t *rxdataF_comp128_1,*ul_ch_mag128_1,*ul_ch_mag128_1b; @@ -1100,17 +1106,20 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, rxdataF_comp128[0] = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))]; ul_ch_mag128[0] = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))]; ul_ch_mag128b[0] = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))]; + ul_ch_mag128c[0] = (__m128i *)&ul_ch_magc[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))]; for (int aa=1;aa < n_rx;aa++) { rxdataF_comp128[1] = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))]; ul_ch_mag128[1] = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))]; ul_ch_mag128b[1] = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))]; + ul_ch_mag128c[1] = (__m128i *)&ul_ch_magc[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))]; // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) for (i=0; i2) { + if (mod_order > 2) { if (mod_order == 4) { - QAM_amp128 = _mm_set1_epi16(QAM16_n1); //2/sqrt(10) + QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10) QAM_amp128b = _mm_setzero_si128(); + QAM_amp128c = _mm_setzero_si128(); } else if (mod_order == 6) { - QAM_amp128 = _mm_set1_epi16(QAM64_n1); //4/sqrt{42} - QAM_amp128b = _mm_set1_epi16(QAM64_n2); //2/sqrt{42} + QAM_amp128 = _mm_set1_epi16(QAM64_n1); // 4/sqrt{42} + QAM_amp128b = _mm_set1_epi16(QAM64_n2); // 2/sqrt{42} + QAM_amp128c = _mm_setzero_si128(); + } else if (mod_order == 8) { + QAM_amp128 = _mm_set1_epi16(QAM256_n1); + QAM_amp128b = _mm_set1_epi16(QAM256_n2); + QAM_amp128c = _mm_set1_epi16(QAM256_n3); } ul_ch_mag128_0 = (__m128i *)&ul_ch_mag[0][symbol * (off + nb_rb * 12)]; ul_ch_mag128b_0 = (__m128i *)&ul_ch_magb[0][symbol * (off + nb_rb * 12)]; + ul_ch_mag128c_0 = (__m128i *)&ul_ch_magc[0][symbol * (off + nb_rb * 12)]; ul_ch_mag128_1 = (__m128i *)&ul_ch_mag[frame_parms->nb_antennas_rx][symbol * (off + nb_rb * 12)]; ul_ch_mag128b_1 = (__m128i *)&ul_ch_magb[frame_parms->nb_antennas_rx][symbol * (off + nb_rb * 12)]; + ul_ch_mag128c_1 = (__m128i *)&ul_ch_magc[frame_parms->nb_antennas_rx][symbol * (off + nb_rb * 12)]; } for (int rb = 0; rb < 3 * nb_rb_0; rb++) { @@ -1790,18 +1808,24 @@ uint8_t nr_ulsch_mmse_2layers(NR_DL_FRAME_PARMS *frame_parms, // Layer 0 ul_ch_mag128_0[0] = mmtmpD2; ul_ch_mag128b_0[0] = mmtmpD2; + ul_ch_mag128c_0[0] = mmtmpD2; ul_ch_mag128_0[0] = _mm_mulhi_epi16(ul_ch_mag128_0[0], QAM_amp128); ul_ch_mag128_0[0] = _mm_slli_epi16(ul_ch_mag128_0[0], 1); ul_ch_mag128b_0[0] = _mm_mulhi_epi16(ul_ch_mag128b_0[0], QAM_amp128b); ul_ch_mag128b_0[0] = _mm_slli_epi16(ul_ch_mag128b_0[0], 1); + ul_ch_mag128c_0[0] = _mm_mulhi_epi16(ul_ch_mag128c_0[0], QAM_amp128c); + ul_ch_mag128c_0[0] = _mm_slli_epi16(ul_ch_mag128c_0[0], 1); // Layer 1 ul_ch_mag128_1[0] = mmtmpD2; ul_ch_mag128b_1[0] = mmtmpD2; + ul_ch_mag128c_1[0] = mmtmpD2; ul_ch_mag128_1[0] = _mm_mulhi_epi16(ul_ch_mag128_1[0], QAM_amp128); ul_ch_mag128_1[0] = _mm_slli_epi16(ul_ch_mag128_1[0], 1); ul_ch_mag128b_1[0] = _mm_mulhi_epi16(ul_ch_mag128b_1[0], QAM_amp128b); ul_ch_mag128b_1[0] = _mm_slli_epi16(ul_ch_mag128b_1[0], 1); + ul_ch_mag128c_1[0] = _mm_mulhi_epi16(ul_ch_mag128c_1[0], QAM_amp128c); + ul_ch_mag128c_1[0] = _mm_slli_epi16(ul_ch_mag128c_1[0], 1); } // multiply by channel Inv @@ -1834,6 +1858,8 @@ uint8_t nr_ulsch_mmse_2layers(NR_DL_FRAME_PARMS *frame_parms, ul_ch_mag128_1 += 1; ul_ch_mag128b_0 += 1; ul_ch_mag128b_1 += 1; + ul_ch_mag128c_0 += 1; + ul_ch_mag128c_1 += 1; rxdataF_comp128_0 += 1; rxdataF_comp128_1 += 1; after_mf_a_128 += 1; @@ -1905,7 +1931,12 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, } nr_gnb_measurements(gNB, ulsch, pusch_vars, symbol, rel15_ul->nrOfLayers); - + allocCast2D(n0_subband_power, + unsigned int, + gNB->measurements.n0_subband_power, + frame_parms->nb_antennas_rx, + frame_parms->N_RB_UL, + false); for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { if (symbol == rel15_ul->start_symbol_index) { pusch_vars->ulsch_power[aarx] = 0; @@ -1918,7 +1949,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, } for (int rb = 0; rb < rel15_ul->rb_size; rb++) { pusch_vars->ulsch_noise_power[aarx] += - gNB->measurements.n0_subband_power[aarx][rel15_ul->bwp_start + rel15_ul->rb_start + rb] / rel15_ul->rb_size; + n0_subband_power[aarx][rel15_ul->bwp_start + rel15_ul->rb_start + rb] / rel15_ul->rb_size; } LOG_D(PHY, "aa %d, bwp_start%d, rb_start %d, rb_size %d: ulsch_power %d, ulsch_noise_power %d\n", @@ -2030,11 +2061,12 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, //--------------------- Channel Compensation --------------- //---------------------------------------------------------- start_meas(&gNB->ulsch_channel_compensation_stats); - LOG_D(PHY, "Doing channel compensations log2_maxh %d, avgs %d (%d,%d)\n", pusch_vars->log2_maxh, avgs, avg[0], avg[1]); + LOG_D(PHY, "Doing channel compensations log2_maxh %d, avgs %d (%d,%d)\n" ,pusch_vars->log2_maxh, avgs,avg[0], avg[1]); nr_ulsch_channel_compensation(pusch_vars->rxdataF_ext, pusch_vars->ul_ch_estimates_ext, pusch_vars->ul_ch_mag0, pusch_vars->ul_ch_magb0, + pusch_vars->ul_ch_magc0, pusch_vars->rxdataF_comp, (rel15_ul->nrOfLayers > 1) ? pusch_vars->rho : NULL, frame_parms, @@ -2052,6 +2084,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, pusch_vars->rxdataF_comp, pusch_vars->ul_ch_mag0, pusch_vars->ul_ch_magb0, + pusch_vars->ul_ch_magc0, (rel15_ul->nrOfLayers > 1) ? pusch_vars->rho : NULL, rel15_ul->nrOfLayers, symbol, @@ -2064,6 +2097,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, pusch_vars->rxdataF_comp, pusch_vars->ul_ch_mag0, pusch_vars->ul_ch_magb0, + pusch_vars->ul_ch_magc0, pusch_vars->ul_ch_estimates_ext, rel15_ul->rb_size, frame_parms->nb_antennas_rx, @@ -2110,15 +2144,15 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, /*-----------------------------------------------------------------------------------------------------*/ start_meas(&gNB->ulsch_llr_stats); for (aatx=0; aatx < rel15_ul->nrOfLayers; aatx++) { - nr_ulsch_compute_llr( - &pusch_vars->rxdataF_comp[aatx * frame_parms->nb_antennas_rx][symbol * (off + rel15_ul->rb_size * NR_NB_SC_PER_RB)], - pusch_vars->ul_ch_mag0[aatx * frame_parms->nb_antennas_rx], - pusch_vars->ul_ch_magb0[aatx * frame_parms->nb_antennas_rx], - &pusch_vars->llr_layers[aatx][rxdataF_ext_offset * rel15_ul->qam_mod_order], - rel15_ul->rb_size, - pusch_vars->ul_valid_re_per_slot[symbol], - symbol, - rel15_ul->qam_mod_order); + nr_ulsch_compute_llr(&pusch_vars->rxdataF_comp[aatx*frame_parms->nb_antennas_rx][symbol * (off + rel15_ul->rb_size * NR_NB_SC_PER_RB)], + pusch_vars->ul_ch_mag0[aatx*frame_parms->nb_antennas_rx], + pusch_vars->ul_ch_magb0[aatx*frame_parms->nb_antennas_rx], + pusch_vars->ul_ch_magc0[aatx*frame_parms->nb_antennas_rx], + &pusch_vars->llr_layers[aatx][rxdataF_ext_offset * rel15_ul->qam_mod_order], + rel15_ul->rb_size, + pusch_vars->ul_valid_re_per_slot[symbol], + symbol, + rel15_ul->qam_mod_order); } stop_meas(&gNB->ulsch_llr_stats); rxdataF_ext_offset += pusch_vars->ul_valid_re_per_slot[symbol]; diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c index 42fc1820ac..4d4c81a986 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c @@ -352,10 +352,118 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, #endif } +void nr_ulsch_256qam_llr(int32_t *rxdataF_comp, + int32_t *ul_ch_mag, + int32_t *ul_ch_magb, + int32_t *ul_ch_magc, + int16_t *ulsch_llr, + uint32_t nb_rb, + uint32_t nb_re, + uint8_t symbol) +{ + int off = ((nb_rb&1) == 1)? 4:0; + simde__m256i *rxF = (simde__m256i*)rxdataF_comp; + simde__m256i *ch_mag,*ch_magb,*ch_magc; + register simde__m256i xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6; + simde__m256i *llr256=(simde__m256i*)ulsch_llr; + + ch_mag = (simde__m256i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))]; + ch_magb = (simde__m256i*)&ul_ch_magb[(symbol*(off+(nb_rb*12)))]; + ch_magc = (simde__m256i*)&ul_ch_magc[(symbol*(off+(nb_rb*12)))]; + int len_mod8 = nb_re&7; + int nb_re256 = nb_re>>3; // length in 256-bit words (8 REs) + + for (int i=0; i |y_R|, registers of odd index in xmm0-> |y_I| + xmm0 = simde_mm256_subs_epi16(ch_mag[i],xmm0); // registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2 + // xmmtmpD2 contains 16 LLRs + xmm1 = simde_mm256_abs_epi16(xmm0); + xmm1 = simde_mm256_subs_epi16(ch_magb[i],xmm1); // contains 16 LLRs + xmm2 = simde_mm256_abs_epi16(xmm1); + xmm2 = simde_mm256_subs_epi16(ch_magc[i],xmm2); // contains 16 LLRs + // rxF[i] A0 A1 A2 A3 A4 A5 A6 A7 bits 7,6 + // xmm0 B0 B1 B2 B3 B4 B5 B6 B7 bits 5,4 + // xmm1 C0 C1 C2 C3 C4 C5 C6 C7 bits 3,2 + // xmm2 D0 D1 D2 D3 D4 D5 D6 D7 bits 1,0 + xmm3 = simde_mm256_unpacklo_epi32(rxF[i],xmm0); // A0 B0 A1 B1 A4 B4 A5 B5 + xmm4 = simde_mm256_unpackhi_epi32(rxF[i],xmm0); // A2 B2 A3 B3 A6 B6 A7 B7 + xmm5 = simde_mm256_unpacklo_epi32(xmm1,xmm2); // C0 D0 C1 D1 C4 D4 C5 D5 + xmm6 = simde_mm256_unpackhi_epi32(xmm1,xmm2); // C2 D2 C3 D3 C6 D6 C7 D7 + + xmm0 = simde_mm256_unpacklo_epi64(xmm3,xmm5); // A0 B0 C0 D0 A4 B4 C4 D4 + xmm1 = simde_mm256_unpackhi_epi64(xmm3,xmm5); // A1 B1 C1 D1 A5 B5 C5 D5 + xmm2 = simde_mm256_unpacklo_epi64(xmm4,xmm6); // A2 B2 C2 D2 A6 B6 C6 D6 + xmm3 = simde_mm256_unpackhi_epi64(xmm4,xmm6); // A3 B3 C3 D3 A7 B7 C7 D7 + llr256[0] = simde_mm256_permute2x128_si256(xmm0, xmm1, 0x20); // A0 B0 C0 D0 A1 B1 C1 D1 + llr256[1] = simde_mm256_permute2x128_si256(xmm2, xmm3, 0x20); // A2 B2 C2 D2 A3 B3 C3 D3 + llr256[2] = simde_mm256_permute2x128_si256(xmm0, xmm1, 0x31); // A4 B4 C4 D4 A5 B5 C5 D5 + llr256[3] = simde_mm256_permute2x128_si256(xmm2, xmm3, 0x31); // A6 B6 C6 D6 A7 B7 C7 D7 + llr256+=4; + + } + simde__m128i *llr128 = (simde__m128i*)llr256; + if (len_mod8 >= 4) { + int nb_re128 = nb_re>>2; + simde__m128i xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6; + simde__m128i *rxF = (simde__m128i*)rxdataF_comp; + simde__m128i *ch_mag = (simde__m128i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))]; + simde__m128i *ch_magb = (simde__m128i*)&ul_ch_magb[(symbol*(off+(nb_rb*12)))]; + simde__m128i *ch_magc = (simde__m128i*)&ul_ch_magc[(symbol*(off+(nb_rb*12)))]; + + xmm0 = simde_mm_abs_epi16(rxF[nb_re128-1]); // registers of even index in xmm0-> |y_R|, registers of odd index in xmm0-> |y_I| + xmm0 = simde_mm_subs_epi16(ch_mag[nb_re128-1],xmm0); // registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2 + // xmmtmpD2 contains 8 LLRs + xmm1 = simde_mm_abs_epi16(xmm0); + xmm1 = simde_mm_subs_epi16(ch_magb[nb_re128-1],xmm1); // contains 8 LLRs + xmm2 = simde_mm_abs_epi16(xmm1); + xmm2 = simde_mm_subs_epi16(ch_magc[nb_re128-1],xmm2); // contains 8 LLRs + // rxF[i] A0 A1 A2 A3 + // xmm0 B0 B1 B2 B3 + // xmm1 C0 C1 C2 C3 + // xmm2 D0 D1 D2 D3 + xmm3 = simde_mm_unpacklo_epi32(rxF[nb_re128-1],xmm0); // A0 B0 A1 B1 + xmm4 = simde_mm_unpackhi_epi32(rxF[nb_re128-1],xmm0); // A2 B2 A3 B3 + xmm5 = simde_mm_unpacklo_epi32(xmm1,xmm2); // C0 D0 C1 D1 + xmm6 = simde_mm_unpackhi_epi32(xmm1,xmm2); // C2 D2 C3 D3 + + llr128[0] = simde_mm_unpacklo_epi64(xmm3,xmm5); // A0 B0 C0 D0 + llr128[1] = simde_mm_unpackhi_epi64(xmm3,xmm5); // A1 B1 C1 D1 + llr128[2] = simde_mm_unpacklo_epi64(xmm4,xmm6); // A2 B2 C2 D2 + llr128[3] = simde_mm_unpackhi_epi64(xmm4,xmm6); // A3 B3 C3 D3 + llr128+=4; + } + if (len_mod8 == 6) { + int nb_re64 = nb_re>>1; + simde__m64 *llr64 = (simde__m64 *)llr128; + simde__m64 xmm0,xmm1,xmm2; + simde__m64 *rxF = (simde__m64*)rxdataF_comp; + simde__m64 *ch_mag = (simde__m64*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))]; + simde__m64 *ch_magb = (simde__m64*)&ul_ch_magb[(symbol*(off+(nb_rb*12)))]; + simde__m64 *ch_magc = (simde__m64*)&ul_ch_magc[(symbol*(off+(nb_rb*12)))]; + + xmm0 = simde_mm_abs_pi16(rxF[nb_re64-1]); // registers of even index in xmm0-> |y_R|, registers of odd index in xmm0-> |y_I| + xmm0 = simde_mm_subs_pi16(ch_mag[nb_re-1],xmm0); // registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2 + // xmmtmpD2 contains 4 LLRs + xmm1 = simde_mm_abs_pi16(xmm0); + xmm1 = simde_mm_subs_pi16(ch_magb[nb_re64-1],xmm1); // contains 4 LLRs + xmm2 = simde_mm_abs_pi16(xmm1); + xmm2 = simde_mm_subs_pi16(ch_magc[nb_re64-1],xmm2); // contains 4 LLRs + // rxF[i] A0 A1 + // xmm0 B0 B1 + // xmm1 C0 C1 + // xmm2 D0 D1 + llr64[0] = simde_m_punpckldq(rxF[nb_re64-1],xmm0); // A0 B0 + llr64[2] = simde_m_punpckhdq(rxF[nb_re64-1],xmm0); // A1 B1 + llr64[1] = simde_m_punpckldq(xmm1,xmm2); // C0 D0 + llr64[3] = simde_m_punpckhdq(xmm1,xmm2); // C1 D1 + } + +} void nr_ulsch_compute_llr(int32_t *rxdataF_comp, int32_t *ul_ch_mag, int32_t *ul_ch_magb, + int32_t *ul_ch_magc, int16_t *ulsch_llr, uint32_t nb_rb, uint32_t nb_re, @@ -386,8 +494,18 @@ void nr_ulsch_compute_llr(int32_t *rxdataF_comp, nb_re, symbol); break; + case 8: + nr_ulsch_256qam_llr(rxdataF_comp, + ul_ch_mag, + ul_ch_magb, + ul_ch_magc, + ulsch_llr, + nb_rb, + nb_re, + symbol); + break; default: - LOG_E(PHY,"nr_ulsch_compute_llr: invalid Qm value, symbol = %d, Qm = %d\n",symbol, mod_order); + AssertFatal(1==0,"nr_ulsch_compute_llr: invalid Qm value, symbol = %d, Qm = %d\n",symbol, mod_order); break; } } diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c index 71db65a14e..3dadbb79c8 100644 --- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c +++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c @@ -1704,8 +1704,10 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB, ((int16_t*)&llrs[half_prb])[7]); } // half_prb } // symb + // run polar decoder on llrs - decoderState = polar_decoder_int16((int16_t*)llrs, decodedPayload, 0, 2,nb_bit,pucch_pdu->prb_size); + decoderState = polar_decoder_int16((int16_t *)llrs, decodedPayload, 0, NR_POLAR_UCI_PUCCH_MESSAGE_TYPE, nb_bit, pucch_pdu->prb_size); + LOG_D(PHY,"UCI decoderState %d, payload[0] %llu\n",decoderState,(unsigned long long)decodedPayload[0]); if (decoderState>0) decoderState=1; corr_dB = dB_fixed64(corr); @@ -1774,7 +1776,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB, } bit_left = pucch_pdu->bit_len_csi_part1-((csi_part1_bytes-1)<<3); uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<>= pucch_pdu->bit_len_csi_part1; + decodedPayload[0] = pucch_pdu->bit_len_csi_part1 < 64 ? decodedPayload[0] >> pucch_pdu->bit_len_csi_part1 : 0; } if (pucch_pdu->bit_len_csi_part2>0) { diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c index 78dc616d07..be1515072d 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c @@ -88,6 +88,21 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue, ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx; + allocCast3D(rx_spatial_power, + int, + ue->measurements.rx_spatial_power, + NUMBER_OF_CONNECTED_gNB_MAX, + frame_parms->nb_antenna_ports_gNB, + frame_parms->nb_antennas_rx, + false); + allocCast3D(rx_spatial_power_dB, + unsigned short, + ue->measurements.rx_spatial_power_dB, + NUMBER_OF_CONNECTED_gNB_MAX, + frame_parms->nb_antenna_ports_gNB, + frame_parms->nb_antennas_rx, + false); + // signal measurements for (gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++){ @@ -98,15 +113,14 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue, ue->measurements.rx_power[gNB_id][aarx] = 0; for (aatx = 0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++){ + const int z=signal_energy_nodc(&dl_ch_estimates[gNB_id][ch_offset], N_RB_DL * NR_NB_SC_PER_RB); + rx_spatial_power[gNB_id][aatx][aarx] = z; - ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = (signal_energy_nodc(&dl_ch_estimates[gNB_id][ch_offset], N_RB_DL*NR_NB_SC_PER_RB)); - - if (ue->measurements.rx_spatial_power[gNB_id][aatx][aarx]<0) - ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = 0; - - ue->measurements.rx_spatial_power_dB[gNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[gNB_id][aatx][aarx]); - ue->measurements.rx_power[gNB_id][aarx] += ue->measurements.rx_spatial_power[gNB_id][aatx][aarx]; + if (rx_spatial_power[gNB_id][aatx][aarx] < 0) + rx_spatial_power[gNB_id][aatx][aarx] = 0; + rx_spatial_power_dB[gNB_id][aatx][aarx] = (unsigned short)dB_fixed(rx_spatial_power[gNB_id][aatx][aarx]); + ue->measurements.rx_power[gNB_id][aarx] += rx_spatial_power[gNB_id][aatx][aarx]; } ue->measurements.rx_power_dB[gNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[gNB_id][aarx]); diff --git a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c index 0e5ba62da7..02f087b2ef 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c +++ b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c @@ -980,9 +980,8 @@ int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t r fapi_nr_rx_indication_t rx_ind = {0}; nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, NULL); nr_fill_rx_indication(&rx_ind, FAPI_NR_CSIRS_IND, ue, NULL, NULL, 1, proc, (void *)&csirs_measurements, NULL); - if (ue->if_inst && ue->if_inst->dl_indication) { - ue->if_inst->dl_indication(&dl_indication, NULL); - } + if (ue->if_inst && ue->if_inst->dl_indication) + ue->if_inst->dl_indication(&dl_indication); return 0; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index da99ba7405..e81f8551c0 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -515,7 +515,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, } // if stand alone and sync on ssb do sib1 detection as part of initial sync - if (sa==1 && ret==0) { + if (sa == 1 && ret == 0) { nr_ue_dlsch_init(phy_data.dlsch, 1, ue->max_ldpc_iterations); bool dec = false; proc->gNB_id = 0; //FIXME @@ -524,7 +524,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, int32_t pdcch_est_size = ((((fp->symbols_per_slot*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH))+15)/16)*16); __attribute__ ((aligned(16))) int32_t pdcch_dl_ch_estimates[4*fp->nb_antennas_rx][pdcch_est_size]; - for(int n_ss = 0; n_ssnb_search_space; n_ss++) { + for(int n_ss = 0; n_ss < phy_pdcch_config->nb_search_space; n_ss++) { proc->nr_slot_rx = phy_pdcch_config->slot; // setting PDCCH slot to proc uint8_t nb_symb_pdcch = phy_pdcch_config->pdcch_config[n_ss].coreset.duration; int start_symb = phy_pdcch_config->pdcch_config[n_ss].coreset.StartSymbolIndex; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 2fa9ca37ef..8195f6bcb2 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -520,7 +520,7 @@ int nr_rx_pbch(PHY_VARS_NR_UE *ue, nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, phy_data); nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, ue, NULL, NULL, number_pdus, proc, NULL, NULL); if (ue->if_inst && ue->if_inst->dl_indication) - ue->if_inst->dl_indication(&dl_indication, NULL); + ue->if_inst->dl_indication(&dl_indication); return(decoderState); } // printf("polar decoder output 0x%08x\n",pbch_a_prime); @@ -591,7 +591,7 @@ int nr_rx_pbch(PHY_VARS_NR_UE *ue, nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, ue, NULL, NULL, number_pdus, proc, (void *)result, NULL); if (ue->if_inst && ue->if_inst->dl_indication) - ue->if_inst->dl_indication(&dl_indication, NULL); + ue->if_inst->dl_indication(&dl_indication); return 0; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c index 7b602c2e81..2cbd2afbd5 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c @@ -403,7 +403,7 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, LOG_I(NR_PHY,"(%d) \t%i\t%i\n", subcarrier_log, (int16_t)(r_real_amp&0xFFFF), (int16_t)(r_imag_amp&0xFFFF)); #endif - txdataF[p_index][symbol_offset+l_line_offset+subcarrier] = (r_real_amp & 0xFFFF) + ((r_imag_amp<<16)&0xFFFF0000); + *(c16_t *)&txdataF[p_index][symbol_offset + l_line_offset + subcarrier] = (c16_t){r_real_amp, r_imag_amp}; // Subcarrier increment subcarrier += K_TC; diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 3079e5029c..e584d9f492 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -34,6 +34,7 @@ #include #include "PHY/sse_intrin.h" #include "common/utils/assertions.h" +#include "common/utils/utils.h" #if defined(__x86_64__) || defined(__i386__) #define simd_q15_t __m128i @@ -94,6 +95,79 @@ extern "C" { int64_t i; } c64_t; + typedef struct { + int dim1; + int dim2; + int dim3; + int dim4; + uint8_t data[]; + } fourDimArray_t; + + static inline fourDimArray_t *allocateFourDimArray(int elmtSz, int dim1, int dim2, int dim3, int dim4) + { + int sz = elmtSz; + DevAssert(dim1 > 0); + sz *= dim1; + if (dim2) { + sz *= dim2; + if (dim3) { + sz *= dim3; + if (dim4) + sz *= dim4; + } + } + fourDimArray_t *tmp = (fourDimArray_t *)malloc16_clear(sizeof(*tmp) + sz); + AssertFatal(tmp, "no more memory\n"); + *tmp = (fourDimArray_t){dim1, dim2, dim3, dim4}; + return tmp; + } + +#define CheckArrAllocated(workingVar, elementType, ArraY, diM1, diM2, diM3, diM4, resizeAllowed) \ + if (!(ArraY)) \ + ArraY = allocateFourDimArray(sizeof(elementType), diM1, diM2, diM3, diM4); \ + else { \ + if ((resizeAllowed) \ + && ((diM1) != (ArraY)->dim1 || (diM2) != (ArraY)->dim2 || (diM3) != (ArraY)->dim3 || (diM4) != (ArraY)->dim4)) { \ + LOG_I(PHY, "resizing %s to %d/%d/%d/%d\n", #ArraY, (diM1), (diM2), (diM3), (diM4)); \ + free(ArraY); \ + ArraY = allocateFourDimArray(sizeof(elementType), diM1, diM2, diM3, diM4); \ + } else \ + DevAssert((diM1) == (ArraY)->dim1 && (diM2) == (ArraY)->dim2 && (diM3) == (ArraY)->dim3 && (diM4) == (ArraY)->dim4); \ + } + +#define cast1Darray(workingVar, elementType, ArraY) elementType *workingVar = (elementType *)((ArraY)->data); + +#define allocCast1D(workingVar, elementType, ArraY, dim1, resizeAllowed) \ + CheckArrAllocated(workingVar, elementType, ArraY, dim1, 0, 0, 0, resizeAllowed); \ + cast1Darray(workingVar, elementType, ArraY); + +#define cast2Darray(workingVar, elementType, ArraY) \ + elementType(*workingVar)[(ArraY)->dim2] = (elementType(*)[(ArraY)->dim2])((ArraY)->data); + +#define allocCast2D(workingVar, elementType, ArraY, dim1, dim2, resizeAllowed) \ + CheckArrAllocated(workingVar, elementType, ArraY, dim1, dim2, 0, 0, resizeAllowed); \ + cast2Darray(workingVar, elementType, ArraY); + +#define cast3Darray(workingVar, elementType, ArraY) \ + elementType(*workingVar)[(ArraY)->dim2][(ArraY)->dim3] = (elementType(*)[(ArraY)->dim2][(ArraY)->dim3])((ArraY)->data); + +#define allocCast3D(workingVar, elementType, ArraY, dim1, dim2, dim3, resizeAllowed) \ + CheckArrAllocated(workingVar, elementType, ArraY, dim1, dim2, dim3, 0, resizeAllowed); \ + cast3Darray(workingVar, elementType, ArraY); + +#define cast4Darray(workingVar, elementType, ArraY) \ + elementType(*workingVar)[(ArraY)->dim2][(ArraY)->dim3][(ArraY)->dim4] = \ + (elementType(*)[(ArraY)->dim2][(ArraY)->dim3][(ArraY)->dim4])((ArraY)->data); + +#define allocCast4D(workingVar, elementType, ArraY, dim1, dim2, dim3, dim4, resizeAllowed) \ + CheckArrAllocated(workingVar, elementType, ArraY, dim1, dim2, dim3, dim4, resizeAllowed); \ + cast4Darray(workingVar, elementType, ArraY); + +#define clearArray(ArraY, elementType) \ + memset((ArraY)->data, \ + 0, \ + sizeof(elementType) * (ArraY)->dim1 * max((ArraY)->dim2, 1) * max((ArraY)->dim3, 1) * max((ArraY)->dim4, 1)) + #define squaredMod(a) ((a).r*(a).r + (a).i*(a).i) #define csum(res, i1, i2) (res).r = (i1).r + (i2).r ; (res).i = (i1).i + (i2).i diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 71853765af..d9c4ad69e0 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -103,8 +103,8 @@ typedef struct { int total_bytes_rx; int current_Qm; int current_RI; - int power[NB_ANTENNAS_RX]; - int noise_power[NB_ANTENNAS_RX]; + int power[MAX_ANT]; + int noise_power[MAX_ANT]; int DTX; int sync_pos; } NR_gNB_SCH_STATS_t; @@ -229,9 +229,9 @@ typedef struct { typedef struct { //! estimated received spatial signal power (linear) - unsigned int rx_spatial_power[NB_ANTENNAS_TX][NB_ANTENNAS_RX]; + fourDimArray_t * rx_spatial_power; //! estimated received spatial signal power (dB) - unsigned int rx_spatial_power_dB[NB_ANTENNAS_TX][NB_ANTENNAS_RX]; + fourDimArray_t * rx_spatial_power_dB; //! estimated rssi (dBm) int rx_rssi_dBm; //! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation) @@ -353,28 +353,40 @@ typedef struct { /// - first index: rx antenna id [0..nb_antennas_rx[ /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **ul_ch_magb; + /// \brief Magnitude of the UL channel estimates scaled for 4th bit level thresholds in LLR computation + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ + int32_t **ul_ch_magc; /// \brief Cross-correlation of two UE signals. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: symbol [0..] int32_t ***rho; /// \f$\log_2(\max|H_i|^2)\f$ int16_t log2_maxh; - /// \brief Magnitude of Uplink Channel first layer (16QAM level/First 64QAM level). + /// \brief Magnitude of Uplink Channel first layer (16QAM level/First 64QAM level/First 256QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_UL[ int32_t **ul_ch_mag0; - /// \brief Magnitude of Uplink Channel second layer (16QAM level/First 64QAM level). + /// \brief Magnitude of Uplink Channel second layer (16QAM level/First 64QAM level/First 256QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_UL[ int32_t **ul_ch_mag1[8][8]; - /// \brief Magnitude of Uplink Channel, first layer (2nd 64QAM level). + /// \brief Magnitude of Uplink Channel, first layer (2nd 64QAM/256QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_UL[ int32_t **ul_ch_magb0; - /// \brief Magnitude of Uplink Channel second layer (2nd 64QAM level). + /// \brief Magnitude of Uplink Channel second layer (2nd 64QAM/256QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_UL[ int32_t **ul_ch_magb1[8][8]; + /// \brief Magnitude of Uplink Channel, first layer (3rd 256QAM level). + /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - second index: ? [0..168*N_RB_UL[ + int32_t **ul_ch_magc0; + /// \brief Magnitude of Uplink Channel second layer (3rd 256QAM level). + /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - second index: ? [0..168*N_RB_UL[ + int32_t **ul_ch_magc1[8][8]; /// measured RX power based on DRS int ulsch_power[8]; /// total signal over antennas @@ -546,9 +558,9 @@ typedef struct { //! estimated avg noise power (dB) unsigned int n0_power_tot_dB; //! estimated avg noise power per RB per RX ant (lin) - unsigned int n0_subband_power[NB_ANTENNAS_RX][275]; + fourDimArray_t *n0_subband_power; //! estimated avg noise power per RB per RX ant (dB) - unsigned int n0_subband_power_dB[NB_ANTENNAS_RX][275]; + fourDimArray_t *n0_subband_power_dB; //! estimated avg subband noise power (dB) unsigned int n0_subband_power_avg_dB; //! estimated avg subband noise power per antenna (dB) @@ -557,7 +569,6 @@ typedef struct { int n0_subband_power_tot_dB[275]; //! estimated avg noise power per RB (dBm) int n0_subband_power_tot_dBm[275]; - /// PRACH background noise level int prach_I0; diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 1543c81e00..aa8af44199 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -151,9 +151,9 @@ typedef struct { // UE measurements //! estimated received spatial signal power (linear) - int rx_spatial_power[NUMBER_OF_CONNECTED_gNB_MAX][2][2]; + fourDimArray_t *rx_spatial_power; //! estimated received spatial signal power (dB) - unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_gNB_MAX][2][2]; + fourDimArray_t *rx_spatial_power_dB; /// estimated received signal power (sum over all TX antennas) int rx_power[NUMBER_OF_CONNECTED_gNB_MAX][NB_ANTENNAS_RX]; @@ -358,18 +358,6 @@ typedef struct UE_NR_SCAN_INFO_s { int32_t freq_offset_Hz[3][10]; } UE_NR_SCAN_INFO_t; -typedef struct NR_UL_TIME_ALIGNMENT { - /// flag used by MAC to inform PHY about a TA to be applied - unsigned char apply_ta; - /// frame and slot when to apply the TA as stated in TS 38.213 setion 4.2 - int16_t ta_frame; - char ta_slot; - /// TA command and TAGID received from the gNB - uint16_t ta_command; - uint32_t ta_total; - uint8_t tag_id; -} NR_UL_TIME_ALIGNMENT_t; - /// Top-level PHY Data Structure for UE typedef struct { /// \brief Module ID indicator for this instance @@ -519,7 +507,6 @@ typedef struct { int dlsch_mcch_trials[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_gNB_MAX]; int dlsch_mtch_trials[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_gNB_MAX]; int current_dlsch_cqi[NUMBER_OF_CONNECTED_gNB_MAX]; - unsigned char first_run_timing_advance[NUMBER_OF_CONNECTED_gNB_MAX]; uint8_t decode_SIB; uint8_t decode_MIB; uint8_t init_sync_frame; @@ -533,9 +520,11 @@ typedef struct { /// Timing Advance updates variables /// Timing advance update computed from the TA command signalled from gNB - int timing_advance; - int N_TA_offset; ///timing offset used in TDD - NR_UL_TIME_ALIGNMENT_t ul_time_alignment[NUMBER_OF_CONNECTED_gNB_MAX]; + int timing_advance; + int N_TA_offset; ///timing offset used in TDD + int ta_frame; + int ta_slot; + int ta_command; /// Flag to tell if UE is secondary user (cognitive mode) unsigned char is_secondary_ue; @@ -546,9 +535,6 @@ typedef struct { /// holds the maximum channel/precoder coefficient char log2_maxp; - /// if ==0 enables phy only test mode - int mac_enabled; - /// Flag to initialize averaging of PHY measurements int init_averaging; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index e48d9f30a4..efeba1d546 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1360,7 +1360,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) { rb<=ulsch_harq->nb_rb; rb++) { int rb2 = rb+ulsch_harq->first_rb; - eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); + eNB->rb_mask_ul[rb2>>5] |= (1L<<(rb2&31)); } LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d \n", eNB->Mod_id, frame, subframe, i); diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 24cacd092f..0b37171aac 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -631,7 +631,8 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu; for(int symbol = 0; symbol<(1<num_symbols); symbol++) { for(rb = srs_pdu->bwp_start; rb < (srs_pdu->bwp_start+srs_pdu->bwp_size); rb++) { - gNB->rb_mask_ul[gNB->frame_parms.symbols_per_slot-srs_pdu->time_start_position-1+symbol][rb>>5] |= 1<<(rb&31); + gNB->rb_mask_ul[gNB->frame_parms.symbols_per_slot - srs_pdu->time_start_position - 1 + symbol][rb >> 5] |= 1U + << (rb & 31); } } } diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index adc5a013e6..3b9bb25d75 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -40,10 +40,11 @@ #include "PHY/impl_defs_nr.h" #include "utils.h" #include "openair2/PHY_INTERFACE/queue_t.h" +#include "SCHED_NR_UE/phy_sch_processing_time.h" extern PHY_VARS_NR_UE ***PHY_vars_UE_g; -const char *dl_pdu_type[]={"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH", "CSI_RS", "CSI_IM"}; +const char *dl_pdu_type[]={"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH", "CSI_RS", "CSI_IM", "TA"}; const char *ul_pdu_type[]={"PRACH", "PUCCH", "PUSCH", "SRS"}; queue_t nr_rx_ind_queue; queue_t nr_crc_ind_queue; @@ -331,6 +332,62 @@ void configure_dlsch(NR_UE_DLSCH_t *dlsch0, } +void configure_ta_command(PHY_VARS_NR_UE *ue, fapi_nr_ta_command_pdu *ta_command_pdu) +{ + + /* Time Alignment procedure + // - UE processing capability 1 + // - Setting the TA update to be applied after the reception of the TA command + // - Timing adjustment computed according to TS 38.213 section 4.2 + // - Durations of N1 and N2 symbols corresponding to PDSCH and PUSCH are + // computed according to sections 5.3 and 6.4 of TS 38.214 */ + const int numerology = ue->frame_parms.numerology_index; + const int ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size; + const int nb_prefix_samples = ue->frame_parms.nb_prefix_samples; + const int samples_per_subframe = ue->frame_parms.samples_per_subframe; + const int slots_per_frame = ue->frame_parms.slots_per_frame; + const int slots_per_subframe = ue->frame_parms.slots_per_subframe; + + const double tc_factor = 1.0 / samples_per_subframe; + // convert time factor "16 * 64 * T_c / (2^mu)" in N_TA calculation in TS38.213 section 4.2 to samples by multiplying with samples per second + // 16 * 64 * T_c / (2^mu) * samples_per_second + // = 16 * T_s / (2^mu) * samples_per_second + // = 16 * 1 / (15 kHz * 2048) / (2^mu) * (15 kHz * 2^mu * ofdm_symbol_size) + // = 16 * 1 / 2048 * ofdm_symbol_size + // = 16 * ofdm_symbol_size / 2048 + uint16_t bw_scaling = 16 * ofdm_symbol_size / 2048; + + const int Ta_max = 3846; // Max value of 12 bits TA Command + const double N_TA_max = Ta_max * bw_scaling * tc_factor; + + // symbols corresponding to a PDSCH processing time for UE processing capability 1 + // when additional PDSCH DM-RS is configured + int N_1 = pdsch_N_1_capability_1[numerology][3]; + + /* PUSCH preapration time N_2 for processing capability 1 */ + const int N_2 = pusch_N_2_timing_capability_1[numerology][1]; + + /* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time + // N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */ + double N_t_1 = N_1 * (ofdm_symbol_size + nb_prefix_samples) * tc_factor; + double N_t_2 = N_2 * (ofdm_symbol_size + nb_prefix_samples) * tc_factor; + + /* Time alignment procedure */ + // N_t_1 + N_t_2 + N_TA_max must be in msec + const double t_subframe = 1.0; // subframe duration of 1 msec + const int ul_tx_timing_adjustment = 1 + (int)ceil(slots_per_subframe*(N_t_1 + N_t_2 + N_TA_max + 0.5)/t_subframe); + + ue->ta_slot = (ta_command_pdu->ta_slot + ul_tx_timing_adjustment) % slots_per_frame; + if (ta_command_pdu->ta_slot + ul_tx_timing_adjustment > slots_per_frame) + ue->ta_frame = (ta_command_pdu->ta_frame + 1) % 1024; + else + ue->ta_frame = ta_command_pdu->ta_frame; + + ue->ta_command = ta_command_pdu->ta_command; + LOG_D(PHY,"TA command received in Frame.Slot %d.%d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n", + ta_command_pdu->ta_frame, ta_command_pdu->ta_slot, ue->ta_frame, ue->ta_slot); +} + int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ bool found = false; @@ -341,9 +398,6 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ int slot = scheduled_response->slot; // Note: we have to handle the thread IDs for this. To be revisited completely. - NR_UE_DLSCH_t *dlsch0 = &((nr_phy_data_t *)scheduled_response->phy_data)->dlsch[0]; - NR_UE_ULSCH_t *ulsch = &((nr_phy_data_tx_t *)scheduled_response->phy_data)->ulsch; - NR_UE_PUCCH *pucch_vars = &((nr_phy_data_tx_t *)scheduled_response->phy_data)->pucch_vars; NR_UE_CSI_IM *csiim_vars = PHY_vars_UE_g[module_id][cc_id]->csiim_vars[0]; NR_UE_CSI_RS *csirs_vars = PHY_vars_UE_g[module_id][cc_id]->csirs_vars[0]; NR_UE_PDCCH_CONFIG *phy_pdcch_config = NULL; @@ -384,26 +438,32 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ memcpy((void*)&(csirs_vars->csirs_config_pdu), (void*)csirs_config_pdu, sizeof(fapi_nr_dl_config_csirs_pdu_rel15_t)); csirs_vars->active = true; break; - case FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH: + case FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH: { dlsch_config_pdu = &dl_config->dl_config_list[i].dlsch_config_pdu.dlsch_config_rel15; + NR_UE_DLSCH_t *dlsch0 = &((nr_phy_data_t *)scheduled_response->phy_data)->dlsch[0]; dlsch0->rnti_type = _RA_RNTI_; dlsch0->dlsch_config = *dlsch_config_pdu; configure_dlsch(dlsch0, PHY_vars_UE_g[module_id][cc_id]->dl_harq_processes[0], dlsch_config_pdu, module_id, dl_config->dl_config_list[i].dlsch_config_pdu.rnti); - break; - case FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH: + } break; + case FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH: { dlsch_config_pdu = &dl_config->dl_config_list[i].dlsch_config_pdu.dlsch_config_rel15; + NR_UE_DLSCH_t *dlsch0 = &((nr_phy_data_t *)scheduled_response->phy_data)->dlsch[0]; dlsch0->rnti_type = _SI_RNTI_; dlsch0->dlsch_config = *dlsch_config_pdu; configure_dlsch(dlsch0, PHY_vars_UE_g[module_id][cc_id]->dl_harq_processes[0], dlsch_config_pdu, module_id, dl_config->dl_config_list[i].dlsch_config_pdu.rnti); - break; - case FAPI_NR_DL_CONFIG_TYPE_DLSCH: + } break; + case FAPI_NR_DL_CONFIG_TYPE_DLSCH: { dlsch_config_pdu = &dl_config->dl_config_list[i].dlsch_config_pdu.dlsch_config_rel15; + NR_UE_DLSCH_t *dlsch0 = &((nr_phy_data_t *)scheduled_response->phy_data)->dlsch[0]; dlsch0->rnti_type = _C_RNTI_; dlsch0->dlsch_config = *dlsch_config_pdu; configure_dlsch(dlsch0, PHY_vars_UE_g[module_id][cc_id]->dl_harq_processes[0], dlsch_config_pdu, module_id, dl_config->dl_config_list[i].dlsch_config_pdu.rnti); + } break; + case FAPI_NR_CONFIG_TA_COMMAND: + configure_ta_command(PHY_vars_UE_g[module_id][cc_id], &dl_config->dl_config_list[i].ta_command_pdu); break; } } @@ -435,90 +495,136 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ fapi_nr_ul_config_srs_pdu *srs_config_pdu; switch (pdu_type){ + case FAPI_NR_UL_CONFIG_TYPE_PUSCH: { + // pusch config pdu + pusch_config_pdu = &ul_config->ul_config_list[i].pusch_config_pdu; + current_harq_pid = pusch_config_pdu->pusch_data.harq_process_id; + NR_UL_UE_HARQ_t *harq_process_ul_ue = &PHY_vars_UE_g[module_id][cc_id]->ul_harq_processes[current_harq_pid]; + NR_UE_ULSCH_t *ulsch = &((nr_phy_data_tx_t *)scheduled_response->phy_data)->ulsch; + nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &ulsch->pusch_pdu; - case (FAPI_NR_UL_CONFIG_TYPE_PUSCH): - // pusch config pdu - pusch_config_pdu = &ul_config->ul_config_list[i].pusch_config_pdu; - current_harq_pid = pusch_config_pdu->pusch_data.harq_process_id; - NR_UL_UE_HARQ_t *harq_process_ul_ue = &PHY_vars_UE_g[module_id][cc_id]->ul_harq_processes[current_harq_pid]; + LOG_D(PHY, + "In %s i %d: copy pusch_config_pdu nrOfLayers:%d, num_dmrs_cdm_grps_no_data:%d \n", + __FUNCTION__, + i, + pusch_config_pdu->nrOfLayers, + pusch_config_pdu->num_dmrs_cdm_grps_no_data); - nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &ulsch->pusch_pdu; + memcpy(pusch_pdu, pusch_config_pdu, sizeof(nfapi_nr_ue_pusch_pdu_t)); + if (scheduled_response->tx_request) { + for (int j = 0; j < scheduled_response->tx_request->number_of_pdus; j++) { + fapi_nr_tx_request_body_t *tx_req_body = &scheduled_response->tx_request->tx_request_body[j]; + if ((tx_req_body->pdu_index == i) && (tx_req_body->pdu_length > 0)) { + LOG_D(PHY, + "%d.%d Copying %d bytes to harq_process_ul_ue->a (harq_pid %d)\n", + scheduled_response->frame, + slot, + tx_req_body->pdu_length, + current_harq_pid); + memcpy(harq_process_ul_ue->a, tx_req_body->pdu, tx_req_body->pdu_length); + break; + } + } - LOG_D(PHY, "In %s i %d: copy pusch_config_pdu nrOfLayers:%d, num_dmrs_cdm_grps_no_data:%d \n", __FUNCTION__, i, pusch_config_pdu->nrOfLayers,pusch_config_pdu->num_dmrs_cdm_grps_no_data); + harq_process_ul_ue->status = ACTIVE; + ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more + pdu_done++; + LOG_D(PHY, + "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", + scheduled_response->frame, + slot, + ul_config, + pdu_type, + pdu_done, + ul_config->number_pdus); - memcpy(pusch_pdu, pusch_config_pdu, sizeof(nfapi_nr_ue_pusch_pdu_t)); - if (scheduled_response->tx_request) { - for (int j=0; jtx_request->number_of_pdus; j++) { - fapi_nr_tx_request_body_t *tx_req_body = &scheduled_response->tx_request->tx_request_body[j]; - if ((tx_req_body->pdu_index == i) && (tx_req_body->pdu_length > 0)) { - LOG_D(PHY,"%d.%d Copying %d bytes to harq_process_ul_ue->a (harq_pid %d)\n",scheduled_response->frame,slot,tx_req_body->pdu_length,current_harq_pid); - memcpy(harq_process_ul_ue->a, tx_req_body->pdu, tx_req_body->pdu_length); + } else { + LOG_E(PHY, "[phy_procedures_nrUE_TX] harq_process_ul_ue is NULL !!\n"); + return -1; + } + } break; + + case FAPI_NR_UL_CONFIG_TYPE_PUCCH: { + NR_UE_PUCCH *pucch_vars = &((nr_phy_data_tx_t *)scheduled_response->phy_data)->pucch_vars; + found = false; + pucch_config_pdu = &ul_config->ul_config_list[i].pucch_config_pdu; + for (int j = 0; j < 2; j++) { + if (pucch_vars->active[j] == false) { + LOG_D(PHY, "%d.%d Copying pucch pdu to UE PHY\n", scheduled_response->frame, slot); + memcpy((void *)&(pucch_vars->pucch_pdu[j]), (void *)pucch_config_pdu, sizeof(fapi_nr_ul_config_pucch_pdu)); + pucch_vars->active[j] = true; + found = true; + ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more + pdu_done++; + LOG_D(PHY, + "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", + scheduled_response->frame, + slot, + ul_config, + pdu_type, + pdu_done, + ul_config->number_pdus); break; } } + if (!found) + LOG_E(PHY, "Couldn't find allocation for PUCCH PDU in PUCCH VARS\n"); + } break; - harq_process_ul_ue->status = ACTIVE; + case FAPI_NR_UL_CONFIG_TYPE_PRACH: + // prach config pdu + prach_config_pdu = &ul_config->ul_config_list[i].prach_config_pdu; + memcpy((void *)&(PHY_vars_UE_g[module_id][cc_id]->prach_vars[gNB_id]->prach_pdu), + (void *)prach_config_pdu, + sizeof(fapi_nr_ul_config_prach_pdu)); + PHY_vars_UE_g[module_id][cc_id]->prach_vars[gNB_id]->active = true; ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more pdu_done++; - LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", scheduled_response->frame, slot, ul_config, pdu_type, pdu_done, ul_config->number_pdus); + LOG_D(PHY, + "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", + scheduled_response->frame, + slot, + ul_config, + pdu_type, + pdu_done, + ul_config->number_pdus); + break; - } else { + case FAPI_NR_UL_CONFIG_TYPE_DONE: + pdu_done++; // count the no of pdu processed + LOG_D(PHY, + "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", + scheduled_response->frame, + slot, + ul_config, + pdu_type, + pdu_done, + ul_config->number_pdus); + break; - LOG_E(PHY, "[phy_procedures_nrUE_TX] harq_process_ul_ue is NULL !!\n"); - return -1; + case FAPI_NR_UL_CONFIG_TYPE_SRS: + // srs config pdu + srs_config_pdu = &ul_config->ul_config_list[i].srs_config_pdu; + memcpy((void *)&(PHY_vars_UE_g[module_id][cc_id]->srs_vars[gNB_id]->srs_config_pdu), + (void *)srs_config_pdu, + sizeof(fapi_nr_ul_config_srs_pdu)); + PHY_vars_UE_g[module_id][cc_id]->srs_vars[gNB_id]->active = true; + ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more + pdu_done++; + break; - } - - break; - - case (FAPI_NR_UL_CONFIG_TYPE_PUCCH): - found = false; - pucch_config_pdu = &ul_config->ul_config_list[i].pucch_config_pdu; - for(int j=0; j<2; j++) { - if(pucch_vars->active[j] == false) { - LOG_D(PHY,"%d.%d Copying pucch pdu to UE PHY\n",scheduled_response->frame,slot); - memcpy((void*)&(pucch_vars->pucch_pdu[j]), (void*)pucch_config_pdu, sizeof(fapi_nr_ul_config_pucch_pdu)); - pucch_vars->active[j] = true; - found = true; - ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more - pdu_done++; - LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", scheduled_response->frame, slot, ul_config, pdu_type, pdu_done, ul_config->number_pdus); - break; - } - } - if (!found) - LOG_E(PHY, "Couldn't find allocation for PUCCH PDU in PUCCH VARS\n"); - break; - - case (FAPI_NR_UL_CONFIG_TYPE_PRACH): - // prach config pdu - prach_config_pdu = &ul_config->ul_config_list[i].prach_config_pdu; - memcpy((void*)&(PHY_vars_UE_g[module_id][cc_id]->prach_vars[gNB_id]->prach_pdu), (void*)prach_config_pdu, sizeof(fapi_nr_ul_config_prach_pdu)); - PHY_vars_UE_g[module_id][cc_id]->prach_vars[gNB_id]->active = true; - ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more - pdu_done++; - LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", scheduled_response->frame, slot, ul_config, pdu_type, pdu_done, ul_config->number_pdus); - break; - - case (FAPI_NR_UL_CONFIG_TYPE_DONE): - pdu_done++; // count the no of pdu processed - LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", scheduled_response->frame, slot, ul_config, pdu_type, pdu_done, ul_config->number_pdus); - break; - - case (FAPI_NR_UL_CONFIG_TYPE_SRS): - // srs config pdu - srs_config_pdu = &ul_config->ul_config_list[i].srs_config_pdu; - memcpy((void*)&(PHY_vars_UE_g[module_id][cc_id]->srs_vars[gNB_id]->srs_config_pdu), (void*)srs_config_pdu, sizeof(fapi_nr_ul_config_srs_pdu)); - PHY_vars_UE_g[module_id][cc_id]->srs_vars[gNB_id]->active = true; - ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more - pdu_done++; - break; - - default: - ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more - pdu_done++; // count the no of pdu processed - LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", scheduled_response->frame, slot, ul_config, pdu_type, pdu_done, ul_config->number_pdus); - break; + default: + ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more + pdu_done++; // count the no of pdu processed + LOG_D(PHY, + "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", + scheduled_response->frame, + slot, + ul_config, + pdu_type, + pdu_done, + ul_config->number_pdus); + break; } } diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 664cddcfdf..8dec02b0a1 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -50,7 +50,6 @@ #endif #include "executables/softmodem-common.h" #include "executables/nr-uesoftmodem.h" -#include "LAYER2/NR_MAC_UE/mac_proto.h" #include "SCHED_NR_UE/pucch_uci_ue_nr.h" #include @@ -87,8 +86,8 @@ void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind, fapi_nr_rx_indication_t *rx_ind, UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, - void *phy_data){ - + void *phy_data) +{ memset((void*)dl_ind, 0, sizeof(nr_downlink_indication_t)); dl_ind->gNB_index = proc->gNB_id; @@ -223,49 +222,37 @@ int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL){ return (amp_x_100); } -// convert time factor "16 * 64 * T_c / (2^mu)" in N_TA calculation in TS38.213 section 4.2 to samples by multiplying with samples per second -// 16 * 64 * T_c / (2^mu) * samples_per_second -// = 16 * T_s / (2^mu) * samples_per_second -// = 16 * 1 / (15 kHz * 2048) / (2^mu) * (15 kHz * 2^mu * ofdm_symbol_size) -// = 16 * 1 / 2048 * ofdm_symbol_size -// = 16 * ofdm_symbol_size / 2048 -static inline -uint16_t get_bw_scaling(uint16_t ofdm_symbol_size){ - return 16 * ofdm_symbol_size / 2048; -} - // UL time alignment procedures: -// - If the current tx frame and slot match the TA configuration in ul_time_alignment +// - If the current tx frame and slot match the TA configuration // then timing advance is processed and set to be applied in the next UL transmission // - Application of timing adjustment according to TS 38.213 p4.2 // todo: // - handle RAR TA application as per ch 4.2 TS 38.213 -void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){ +void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx) +{ + if (frame_tx == ue->ta_frame && slot_tx == ue->ta_slot) { - if (ue->mac_enabled == 1) { + uint16_t ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size; - uint8_t gNB_id = 0; - NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &ue->ul_time_alignment[gNB_id]; + // convert time factor "16 * 64 * T_c / (2^mu)" in N_TA calculation in TS38.213 section 4.2 to samples by multiplying with samples per second + // 16 * 64 * T_c / (2^mu) * samples_per_second + // = 16 * T_s / (2^mu) * samples_per_second + // = 16 * 1 / (15 kHz * 2048) / (2^mu) * (15 kHz * 2^mu * ofdm_symbol_size) + // = 16 * 1 / 2048 * ofdm_symbol_size + // = 16 * ofdm_symbol_size / 2048 + uint16_t bw_scaling = 16 * ofdm_symbol_size / 2048; - if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) { + ue->timing_advance += (ue->ta_command - 31) * bw_scaling; - uint16_t ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size; - uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size); + LOG_D(PHY, "[UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n", + ue->Mod_id, + frame_tx, + slot_tx, + ue->ta_command, + ue->timing_advance); - ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling; - - LOG_D(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n", - __FUNCTION__, - ue->Mod_id, - frame_tx, - slot_tx, - ul_time_alignment->ta_command, - ue->timing_advance); - - ul_time_alignment->ta_frame = -1; - ul_time_alignment->ta_slot = -1; - - } + ue->ta_frame = -1; + ue->ta_slot = -1; } } @@ -516,7 +503,7 @@ int nr_ue_pdcch_procedures(PHY_VARS_NR_UE *ue, // fill dl_indication message nr_fill_dl_indication(&dl_indication, &dci_ind, NULL, proc, ue, phy_data); // send to mac - ue->if_inst->dl_indication(&dl_indication, NULL); + ue->if_inst->dl_indication(&dl_indication); stop_meas(&ue->dlsch_rx_pdcch_stats); @@ -544,7 +531,7 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, if (!(NR_MAX_NB_LAYERS>4)) { NR_UE_DLSCH_t *dlsch0 = &dlsch[0]; int harq_pid = dlsch0->dlsch_config.harq_process_nbr; - NR_DL_UE_HARQ_t *dlsch0_harq = ue->dl_harq_processes[harq_pid]; + NR_DL_UE_HARQ_t *dlsch0_harq = &ue->dl_harq_processes[0][harq_pid]; uint16_t BWPStart = dlsch0->dlsch_config.BWPStart; uint16_t pdsch_start_rb = dlsch0->dlsch_config.start_rb; uint16_t pdsch_nb_rb = dlsch0->dlsch_config.number_rbs; @@ -705,13 +692,10 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, nr_downlink_indication_t dl_indication; fapi_nr_rx_indication_t rx_ind = {0}; uint16_t number_pdus = 1; - // params for UL time alignment procedure - NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &ue->ul_time_alignment[gNB_id]; uint8_t is_cw0_active = dl_harq0->status; uint8_t is_cw1_active = dl_harq1->status; uint16_t nb_symb_sch = dlsch[0].dlsch_config.number_symbols; - uint16_t start_symbol = dlsch[0].dlsch_config.start_symbol; uint8_t dmrs_type = dlsch[0].dlsch_config.dmrsConfigType; uint8_t nb_re_dmrs; @@ -805,7 +789,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, NULL); nr_fill_rx_indication(&rx_ind, ind_type, ue, &dlsch[0], NULL, number_pdus, proc, NULL, p_b); - LOG_D(PHY, "In %s DL PDU length in bits: %d, in bytes: %d \n", __FUNCTION__, dlsch[0].dlsch_config.TBS, dlsch[0].dlsch_config.TBS / 8); + LOG_D(PHY, "DL PDU length in bits: %d, in bytes: %d \n", dlsch[0].dlsch_config.TBS, dlsch[0].dlsch_config.TBS / 8); stop_meas(&ue->dlsch_decoding_stats); if (cpumeas(CPUMEAS_GETSTATE)) { @@ -857,9 +841,10 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, } LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch[1].dlsch_config.TBS); } + // send to mac if (ue->if_inst && ue->if_inst->dl_indication) { - ue->if_inst->dl_indication(&dl_indication, ul_time_alignment); + ue->if_inst->dl_indication(&dl_indication); } // DLSCH decoding finished! don't wait anymore @@ -869,135 +854,6 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, if (ue->phy_sim_dlsch_b) memcpy(ue->phy_sim_dlsch_b, p_b, dlsch_bytes); - if (ue->mac_enabled == 1) { // TODO: move this from PHY to MAC layer! - - /* Time Alignment procedure - // - UE processing capability 1 - // - Setting the TA update to be applied after the reception of the TA command - // - Timing adjustment computed according to TS 38.213 section 4.2 - // - Durations of N1 and N2 symbols corresponding to PDSCH and PUSCH are - // computed according to sections 5.3 and 6.4 of TS 38.214 */ - const int numerology = ue->frame_parms.numerology_index; - const int ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size; - const int nb_prefix_samples = ue->frame_parms.nb_prefix_samples; - const int samples_per_subframe = ue->frame_parms.samples_per_subframe; - const int slots_per_frame = ue->frame_parms.slots_per_frame; - const int slots_per_subframe = ue->frame_parms.slots_per_subframe; - - const double tc_factor = 1.0 / samples_per_subframe; - const uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size); - - const int Ta_max = 3846; // Max value of 12 bits TA Command - const double N_TA_max = Ta_max * bw_scaling * tc_factor; - - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - NR_BWP_Id_t ul_bwp = mac->current_UL_BWP.bwp_id; - - NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL; - if(ul_bwp){ - if (mac->ULbwp[ul_bwp-1] && - mac->ULbwp[ul_bwp-1]->bwp_Dedicated && - mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config && - mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup && - mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) { - pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup; - } - else if (mac->ULbwp[ul_bwp-1] && - mac->ULbwp[ul_bwp-1]->bwp_Common && - mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon && - mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup && - mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) { - pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; - } - } - else if (mac->scc_SIB && - mac->scc_SIB->uplinkConfigCommon && - mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon && - mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup && - mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) { - pusch_TimeDomainAllocationList = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; - } - long mapping_type_ul = pusch_TimeDomainAllocationList ? pusch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeA; - - NR_PDSCH_Config_t *pdsch_Config = mac->current_DL_BWP.pdsch_Config; - NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = mac->current_DL_BWP.tdaList_Common; - long mapping_type_dl = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA; - - NR_DMRS_DownlinkConfig_t *NR_DMRS_dlconfig = NULL; - if (pdsch_Config) { - if (mapping_type_dl == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA) - NR_DMRS_dlconfig = (NR_DMRS_DownlinkConfig_t *)pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup; - else - NR_DMRS_dlconfig = (NR_DMRS_DownlinkConfig_t *)pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup; - } - - pdsch_dmrs_AdditionalPosition_t add_pos_dl = pdsch_dmrs_pos2; - if (NR_DMRS_dlconfig && NR_DMRS_dlconfig->dmrs_AdditionalPosition) - add_pos_dl = *NR_DMRS_dlconfig->dmrs_AdditionalPosition; - - /* PDSCH decoding time N_1 for processing capability 1 */ - int N_1; - - if (add_pos_dl == pdsch_dmrs_pos0) - N_1 = pdsch_N_1_capability_1[numerology][1]; - else if (add_pos_dl == pdsch_dmrs_pos1 || add_pos_dl == pdsch_dmrs_pos2) - N_1 = pdsch_N_1_capability_1[numerology][2]; - else - N_1 = pdsch_N_1_capability_1[numerology][3]; - - /* PUSCH preapration time N_2 for processing capability 1 */ - const int N_2 = pusch_N_2_timing_capability_1[numerology][1]; - - /* d_1_1 depending on the number of PDSCH symbols allocated */ - const int d = 0; // TODO number of overlapping symbols of the scheduling PDCCH and the scheduled PDSCH - int d_1_1 = 0; - if (mapping_type_dl == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA) - if (nb_symb_sch + start_symbol < 7) - d_1_1 = 7 - (nb_symb_sch + start_symbol); - else - d_1_1 = 0; - else // mapping type B - switch (nb_symb_sch){ - case 7: d_1_1 = 0; break; - case 4: d_1_1 = 3; break; - case 2: d_1_1 = 3 + d; break; - default: break; - } - - /* d_2_1 */ - int d_2_1; - if (mapping_type_ul == NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB && start_symbol != 0) - d_2_1 = 0; - else - d_2_1 = 1; - - /* d_2_2 */ - const double d_2_2 = pusch_d_2_2_timing_capability_1[numerology][1]; - - /* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time - // N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */ - double N_t_1 = (N_1 + d_1_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor; - double N_t_2 = (N_2 + d_2_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor; - if (N_t_2 < d_2_2) N_t_2 = d_2_2; - - /* Time alignment procedure */ - // N_t_1 + N_t_2 + N_TA_max must be in msec - const double t_subframe = 1.0; // subframe duration of 1 msec - const int ul_tx_timing_adjustment = 1 + (int)ceil(slots_per_subframe*(N_t_1 + N_t_2 + N_TA_max + 0.5)/t_subframe); - - if (ul_time_alignment->apply_ta == 1){ - ul_time_alignment->ta_slot = (nr_slot_rx + ul_tx_timing_adjustment) % slots_per_frame; - if (nr_slot_rx + ul_tx_timing_adjustment > slots_per_frame){ - ul_time_alignment->ta_frame = (frame_rx + 1) % 1024; - } else { - ul_time_alignment->ta_frame = frame_rx; - } - // reset TA flag - ul_time_alignment->apply_ta = 0; - LOG_D(PHY,"Frame %d slot %d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n", - frame_rx, nr_slot_rx, ul_time_alignment->ta_frame, ul_time_alignment->ta_slot); - } - } return dec; } diff --git a/openair1/SCHED_NR_UE/phy_sch_processing_time.h b/openair1/SCHED_NR_UE/phy_sch_processing_time.h index 81cc4496a2..896c93b9ee 100644 --- a/openair1/SCHED_NR_UE/phy_sch_processing_time.h +++ b/openair1/SCHED_NR_UE/phy_sch_processing_time.h @@ -50,7 +50,7 @@ // when PDSCH DM-RS position l1 for the additional DM-RS is != 1,2 */ -int8_t pdsch_N_1_capability_1[4][4] = { +static const int8_t pdsch_N_1_capability_1[4][4] = { /* mu A B C */ { 0, 8, 14, 13 }, { 1, 10, 13, 13 }, @@ -69,7 +69,7 @@ int8_t pdsch_N_1_capability_1[4][4] = { // dmrs-DownlinkForPDSCH-MappingTypeA and dmrs-DownlinkForPDSCH-MappingTypeB // mu == 2 is for FR1 only */ -float pdsch_N_1_capability_2[3][2] = { +static const float pdsch_N_1_capability_2[3][2] = { /* mu A */ { 0, 3 }, { 1, 4.5 }, @@ -84,7 +84,7 @@ float pdsch_N_1_capability_2[3][2] = { // carrying the DCI scheduling the PUSCH was transmitted // mu_UL is the SCS of the UL channel with which PUSCH to be transmitted */ -int8_t pusch_N_2_timing_capability_1[4][2] = { +static const int8_t pusch_N_2_timing_capability_1[4][2] = { /* mu N_2 */ { 0, 10 }, { 1, 12 }, @@ -101,7 +101,7 @@ int8_t pusch_N_2_timing_capability_1[4][2] = { // mu_UL is the SCS of the UL channel with which PUSCH to be transmitted // mu == 2 is for FR1 only */ -float pusch_N_2_timing_capability_2[3][2] = { +static const float pusch_N_2_timing_capability_2[3][2] = { /* mu N_2 */ { 0, 5 }, { 1, 5.5 }, @@ -116,7 +116,7 @@ float pusch_N_2_timing_capability_2[3][2] = { // carrying the DCI scheduling the PUSCH was transmitted // mu_UL is the SCS of the UL channel with which PUSCH to be transmitted */ -float pusch_d_2_2_timing_capability_1[4][2] = { +static const float pusch_d_2_2_timing_capability_1[4][2] = { /* mu d_2_2 */ { 0, 1 }, { 1, 2 }, @@ -132,7 +132,7 @@ float pusch_d_2_2_timing_capability_1[4][2] = { // carrying the DCI scheduling the PUSCH was transmitted // mu_UL is the SCS of the UL channel with which PUSCH to be transmitted */ -float pusch_d_2_2_timing_capability_2[4][2] = { +static const float pusch_d_2_2_timing_capability_2[4][2] = { /* mu d_2_2 */ { 0, 3 }, { 1, 5 }, diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index f8b1e359e5..c7e4f27f70 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -2080,9 +2080,7 @@ int main(int argc, char **argv) { squareRoot(&UE->dlsch_demodulation_stats), median(table_rx_demod), q1(table_rx_demod), q3(table_rx_demod)); //fprintf(time_meas_fd,"DEC;\n"); - fprintf(time_meas_fd,"%f;%f;%f;%f\n", - squareRoot(&UE->dlsch_decoding_stats[subframe]), - median(table_rx_dec), q1(table_rx_dec), q3(table_rx_dec)); + fprintf(time_meas_fd, "%f;%f;%f;%f\n", squareRoot(&UE->dlsch_decoding_stats[UE->current_thread_id[subframe]]), median(table_rx_dec), q1(table_rx_dec), q3(table_rx_dec)); printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate ); test_passed = 1; break; diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index a0286ad719..f3c2352084 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -53,8 +53,7 @@ #include "executables/lte-softmodem.h" #include "common/ran_context.h" #include "PHY/LTE_ESTIMATION/lte_estimation.h" -#include "openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h" - +#include "openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h" const char *__asan_default_options() { /* don't do leak checking in ulsim, not finished yet */ @@ -806,7 +805,7 @@ int main(int argc, char **argv) { if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O; - rate = (double)dlsch_tbs25[get_I_TBS(mcs)][nb_rb-1]/(coded_bits_per_codeword); + rate = (double)TBStable[get_I_TBS(mcs)][nb_rb - 1] / (coded_bits_per_codeword); printf("Rate = %f (mod %d), coded bits %u\n",rate,get_Qm_ul(mcs),coded_bits_per_codeword); for (ch_realization=0; ch_realizationframe_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); UE->frame_parms.nb_antennas_rx = n_rx; + UE->frame_parms.nb_antenna_ports_gNB = n_tx; UE->max_ldpc_iterations = max_ldpc_iterations; if (run_initial_sync==1) @@ -1372,16 +1373,11 @@ int main(int argc, char **argv) void update_ptrs_config(NR_CellGroupConfig_t *secondaryCellGroup, uint16_t *rbSize, uint8_t *mcsIndex, int8_t *ptrs_arg) { NR_BWP_Downlink_t *bwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[0]; - int *ptrsFreqDenst = calloc(2, sizeof(long)); - ptrsFreqDenst[0]= 25; - ptrsFreqDenst[1]= 115; - int *ptrsTimeDenst = calloc(3, sizeof(long)); - ptrsTimeDenst[0]= 2; - ptrsTimeDenst[1]= 4; - ptrsTimeDenst[2]= 10; + long ptrsFreqDenst[] = {25, 115}; + long ptrsTimeDenst[] = {2, 4, 10}; - int epre_Ratio = 0; - int reOffset = 0; + long epre_Ratio = 0; + long reOffset = 0; if(ptrs_arg[0] ==0) { ptrsTimeDenst[2]= *mcsIndex -1; diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index f16f8fc5f1..492fbdeafd 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -172,7 +172,8 @@ void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB, else fp->nr_band = 78; fp->threequarter_fs= 0; - gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band); + int bw_index = get_supported_band_index(mu, fp->nr_band, N_RB_DL); + gNB_config->carrier_config.dl_bandwidth.value = get_supported_bw_mhz(fp->nr_band > 256 ? FR2 : FR1, bw_index); fp->ofdm_offset_divisor = UINT_MAX; nr_init_frame_parms(gNB_config, fp); diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index a0631767ba..f773b201fd 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -401,7 +401,7 @@ int main(int argc, char **argv) srand(time(NULL)); // Initialization, should only be called once. actual_payload = rand(); // Returns a pseudo-random integer between 0 and RAND_MAX. } - actual_payload &= ((1<pusch_pdu.rnti = n_rnti; + ulsch_ue->pusch_pdu.mcs_table = mcs_table; ulsch_ue->pusch_pdu.mcs_index = Imcs; ulsch_ue->pusch_pdu.nrOfLayers = Nl; ulsch_ue->pusch_pdu.rb_size = nb_rb; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index f660e9559c..6aaa79bb76 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -631,6 +631,10 @@ int main(int argc, char **argv) NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t)); prepare_scd(scd); + NR_UE_NR_Capability_t* UE_Capability_nr = CALLOC(1,sizeof(NR_UE_NR_Capability_t)); + prepare_sim_uecap(UE_Capability_nr,scc,mu, + N_RB_UL,0,mcs_table); + // TODO do a UECAP for phy-sim const gNB_RrcConfigurationReq conf = { .pdsch_AntennaPorts = { .N1 = 1, .N2 = 1, .XP = 1 }, @@ -640,7 +644,8 @@ int main(int argc, char **argv) .do_SRS = 0, .force_256qam_off = false }; - NR_CellGroupConfig_t *secondaryCellGroup = get_default_secondaryCellGroup(scc, scd, NULL, 0, 1, &conf, 0); + + NR_CellGroupConfig_t *secondaryCellGroup = get_default_secondaryCellGroup(scc, scd, UE_Capability_nr, 0, 1, &conf, 0); /* RRC parameter validation for secondaryCellGroup */ fix_scd(scd); @@ -873,7 +878,7 @@ int main(int argc, char **argv) if (input_fd != NULL || n_trials == 1) max_rounds=1; - if(1<= nb_symb_sch) + if (enable_ptrs && 1 << ptrs_time_density >= nb_symb_sch) pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS printf("\n"); diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c index 12d50065fa..c19680c6d0 100644 --- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c @@ -869,7 +869,6 @@ uint32_t tst_ue_get_SR(module_id_t module_idP,int CC_id,frame_t frameP,uint8_t e *********************************************************************/ void tst_set_sr_config(PHY_VARS_NR_UE *ue, int gNB_id) { - ue->mac_enabled = 1; ue->scheduling_request_config[gNB_id].sr_ConfigIndex = 0; p_nr_ue_get_SR = tst_ue_get_SR; } diff --git a/openair1/SIMULATION/TOOLS/rangen_double.c b/openair1/SIMULATION/TOOLS/rangen_double.c index df45199006..ddc453de9c 100644 --- a/openair1/SIMULATION/TOOLS/rangen_double.c +++ b/openair1/SIMULATION/TOOLS/rangen_double.c @@ -190,7 +190,7 @@ void tableNor(unsigned long seed) return; } -double __attribute__ ((no_sanitize_address)) gaussZiggurat(double mean, double variance) +double __attribute__ ((no_sanitize("address", "undefined"))) gaussZiggurat(double mean, double variance) { if (!tableNordDone) { // let's make reasonnable constant tables @@ -200,7 +200,7 @@ double __attribute__ ((no_sanitize_address)) gaussZiggurat(double mean, double v } hz = SHR3; iz = hz & 127; - return abs(hz) < kn[iz] ? hz * wn[iz] : nfix(); + return hz != INT32_MIN && abs(hz) < kn[iz] ? hz * wn[iz] : nfix(); } #ifdef MAIN diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index d766e10ac8..97b5fd388b 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -2764,8 +2764,8 @@ uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint * *********************************************************************/ -uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB) { - +uint8_t get_K_ptrs(uint32_t nrb0, uint32_t nrb1, uint32_t N_RB) +{ if (N_RB < nrb0) { LOG_D(PHY,"PUSH PT-RS is not present.\n"); return -1; @@ -3836,7 +3836,7 @@ uint8_t get_pusch_mcs_table(long *mcs_Table, if (*mcs_Table == NR_PUSCH_Config__mcs_Table_qam256) return 1; else - return (2+(is_tp<<1)); + return (2 + (is_tp << 1)); } else { if ((*mcs_Table == NR_PUSCH_Config__mcs_Table_qam256) && @@ -3847,14 +3847,12 @@ uint8_t get_pusch_mcs_table(long *mcs_Table, if ((*mcs_Table == NR_PUSCH_Config__mcs_Table_qam64LowSE) && (target_ss == NR_SearchSpace__searchSpaceType_PR_ue_Specific) && ((rnti_type == NR_RNTI_C ) || (rnti_type == NR_RNTI_SP_CSI))) - return (2+(is_tp<<1)); + return (2 + (is_tp << 1)); if (rnti_type == NR_RNTI_MCS_C) - return (2+(is_tp<<1)); - AssertFatal(1==0,"Invalid configuration to set MCS table"); + return (2 + (is_tp << 1)); } } - else - return (0+(is_tp*3)); + return (0 + (is_tp * 3)); } diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h index 0fa747c3c4..7e3c233228 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h @@ -176,7 +176,7 @@ uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position); int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmrs_AdditionalPosition_t additional_pos, pusch_maxLength_t pusch_maxLength, uint8_t start_symbolt, uint8_t dmrs_typeA_position); uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint8_t mcs_table); -uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB); +uint8_t get_K_ptrs(uint32_t nrb0, uint32_t nrb1, uint32_t N_RB); uint32_t nr_compute_tbs(uint16_t Qm, uint16_t R, diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 43194b324f..c82e363074 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -117,7 +117,6 @@ void set_tdd_config_nr_ue(fapi_nr_config_request_t *cfg, } - void config_common_ue_sa(NR_UE_MAC_INST_t *mac, module_id_t module_id, int cc_idP) { @@ -131,18 +130,20 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac, LOG_D(MAC, "Entering SA UE Config Common\n"); // carrier config - cfg->carrier_config.dl_bandwidth = config_bandwidth(scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, - scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth, - *scc->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR); + NR_FrequencyInfoDL_SIB_t *frequencyInfoDL = &scc->downlinkConfigCommon.frequencyInfoDL; + int bw_index = get_supported_band_index(frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, + *frequencyInfoDL->frequencyBandList.list.array[0]->freqBandIndicatorNR, + frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth); + cfg->carrier_config.dl_bandwidth = get_supported_bw_mhz(*frequencyInfoDL->frequencyBandList.list.array[0]->freqBandIndicatorNR > 256 ? FR2 : FR1, bw_index); - uint64_t dl_bw_khz = (12*scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth)* - (15<downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing); + uint64_t dl_bw_khz = (12 * frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth) * + (15 << frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing); cfg->carrier_config.dl_frequency = (downlink_frequency[cc_idP][0]/1000) - (dl_bw_khz>>1); for (int i=0; i<5; i++) { - if (i==scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { - cfg->carrier_config.dl_grid_size[i] = scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth; - cfg->carrier_config.dl_k0[i] = scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->offsetToCarrier; + if (i == frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { + cfg->carrier_config.dl_grid_size[i] = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + cfg->carrier_config.dl_k0[i] = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; } else { cfg->carrier_config.dl_grid_size[i] = 0; @@ -150,23 +151,25 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac, } } - cfg->carrier_config.uplink_bandwidth = config_bandwidth(scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, - scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth, - scc->uplinkConfigCommon->frequencyInfoUL.frequencyBandList==NULL ? - *scc->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR : - *scc->uplinkConfigCommon->frequencyInfoUL.frequencyBandList->list.array[0]->freqBandIndicatorNR); + NR_FrequencyInfoUL_SIB_t *frequencyInfoUL = &scc->uplinkConfigCommon->frequencyInfoUL; + int UL_band_ind = frequencyInfoUL->frequencyBandList == NULL ? + *frequencyInfoDL->frequencyBandList.list.array[0]->freqBandIndicatorNR : + *frequencyInfoUL->frequencyBandList->list.array[0]->freqBandIndicatorNR; + bw_index = get_supported_band_index(frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, + UL_band_ind, + frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth); + cfg->carrier_config.uplink_bandwidth = get_supported_bw_mhz(UL_band_ind > 256 ? FR2 : FR1, bw_index); - - if (scc->uplinkConfigCommon->frequencyInfoUL.absoluteFrequencyPointA == NULL) + if (frequencyInfoUL->absoluteFrequencyPointA == NULL) cfg->carrier_config.uplink_frequency = cfg->carrier_config.dl_frequency; else // TODO check if corresponds to what reported in SIB1 cfg->carrier_config.uplink_frequency = (downlink_frequency[cc_idP][0]/1000) + uplink_frequency_offset[cc_idP][0]; - for (int i=0; i<5; i++) { - if (i==scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { - cfg->carrier_config.ul_grid_size[i] = scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth; - cfg->carrier_config.ul_k0[i] = scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->offsetToCarrier; + for (int i = 0; i < 5; i++) { + if (i == frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { + cfg->carrier_config.ul_grid_size[i] = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + cfg->carrier_config.ul_k0[i] = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; } else { cfg->carrier_config.ul_grid_size[i] = 0; @@ -185,7 +188,7 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac, cfg->ssb_config.scs_common = get_softmodem_params()->numerology; // SSB Table config - cfg->ssb_table.ssb_offset_point_a = scc->downlinkConfigCommon.frequencyInfoDL.offsetToPointA; + cfg->ssb_table.ssb_offset_point_a = frequencyInfoDL->offsetToPointA; cfg->ssb_table.ssb_period = scc->ssb_PeriodicityServingCell; cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset; @@ -203,26 +206,27 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac, // TDD Table Configuration if (cfg->cell_config.frame_duplex_type == TDD){ set_tdd_config_nr_ue(cfg, - scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, + frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, scc->tdd_UL_DL_ConfigurationCommon); } // PRACH configuration uint8_t nb_preambles = 64; - if(scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles != NULL) - nb_preambles = *scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles; + NR_RACH_ConfigCommon_t *rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup; + if(rach_ConfigCommon->totalNumberOfRA_Preambles != NULL) + nb_preambles = *rach_ConfigCommon->totalNumberOfRA_Preambles; - cfg->prach_config.prach_sequence_length = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present-1; + cfg->prach_config.prach_sequence_length = rach_ConfigCommon->prach_RootSequenceIndex.present-1; - if (scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing) - cfg->prach_config.prach_sub_c_spacing = *scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing; + if (rach_ConfigCommon->msg1_SubcarrierSpacing) + cfg->prach_config.prach_sub_c_spacing = *rach_ConfigCommon->msg1_SubcarrierSpacing; else - cfg->prach_config.prach_sub_c_spacing = scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; + cfg->prach_config.prach_sub_c_spacing = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; - cfg->prach_config.restricted_set_config = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->restrictedSetConfig; + cfg->prach_config.restricted_set_config = rach_ConfigCommon->restrictedSetConfig; - switch (scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM) { + switch (rach_ConfigCommon->rach_ConfigGeneric.msg1_FDM) { case 0 : cfg->prach_config.num_prach_fd_occasions = 1; break; @@ -236,25 +240,26 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac, cfg->prach_config.num_prach_fd_occasions = 8; break; default: - AssertFatal(1==0,"msg1 FDM identifier %ld undefined (0,1,2,3) \n", scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM); + AssertFatal(1==0,"msg1 FDM identifier %ld undefined (0,1,2,3) \n", rach_ConfigCommon->rach_ConfigGeneric.msg1_FDM); } cfg->prach_config.num_prach_fd_occasions_list = (fapi_nr_num_prach_fd_occasions_t *) malloc(cfg->prach_config.num_prach_fd_occasions*sizeof(fapi_nr_num_prach_fd_occasions_t)); for (int i=0; iprach_config.num_prach_fd_occasions; i++) { - cfg->prach_config.num_prach_fd_occasions_list[i].num_prach_fd_occasions = i; + fapi_nr_num_prach_fd_occasions_t *prach_fd_occasion = &cfg->prach_config.num_prach_fd_occasions_list[i]; + prach_fd_occasion->num_prach_fd_occasions = i; if (cfg->prach_config.prach_sequence_length) - cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139; + prach_fd_occasion->prach_root_sequence_index = rach_ConfigCommon->prach_RootSequenceIndex.choice.l139; else - cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; - cfg->prach_config.num_prach_fd_occasions_list[i].k1 = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + - scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + - (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); - cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; - cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup, - nb_preambles, mac->frame_type, mac->frequency_range); - //cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ??? + prach_fd_occasion->prach_root_sequence_index = rach_ConfigCommon->prach_RootSequenceIndex.choice.l839; + prach_fd_occasion->k1 = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + + rach_ConfigCommon->rach_ConfigGeneric.msg1_FrequencyStart + + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + prach_fd_occasion->prach_zero_corr_conf = rach_ConfigCommon->rach_ConfigGeneric.zeroCorrelationZoneConfig; + prach_fd_occasion->num_root_sequences = compute_nr_root_seq(rach_ConfigCommon, + nb_preambles, mac->frame_type, mac->frequency_range); + //prach_fd_occasion->num_unused_root_sequences = ??? } - cfg->prach_config.ssb_per_rach = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present-1; + cfg->prach_config.ssb_per_rach = rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present-1; } @@ -264,7 +269,6 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, { fapi_nr_config_request_t *cfg = &mac->phy_config.config_req; NR_ServingCellConfigCommon_t *scc = mac->scc; - int i; mac->phy_config.Mod_id = module_id; mac->phy_config.CC_id = cc_idP; @@ -272,124 +276,127 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, // carrier config LOG_D(MAC, "Entering UE Config Common\n"); - AssertFatal(scc!=NULL,"scc cannot be null\n"); + AssertFatal(scc != NULL, "scc cannot be null\n"); - if (scc) { - cfg->carrier_config.dl_bandwidth = config_bandwidth(scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, - scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth, - *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]); + struct NR_FrequencyInfoDL *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL; + int bw_index = get_supported_band_index(frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, + *frequencyInfoDL->frequencyBandList.list.array[0], + frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth); + cfg->carrier_config.dl_bandwidth = get_supported_bw_mhz(*frequencyInfoDL->frequencyBandList.list.array[0] > 256 ? FR2 : FR1, bw_index); - cfg->carrier_config.dl_frequency = from_nrarfcn(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], - *scc->ssbSubcarrierSpacing, - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA)/1000; // freq in kHz + cfg->carrier_config.dl_frequency = from_nrarfcn(*frequencyInfoDL->frequencyBandList.list.array[0], + *scc->ssbSubcarrierSpacing, + frequencyInfoDL->absoluteFrequencyPointA)/1000; // freq in kHz - for (i=0; i<5; i++) { - if (i==scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { - cfg->carrier_config.dl_grid_size[i] = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; - cfg->carrier_config.dl_k0[i] = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; - } - else { - cfg->carrier_config.dl_grid_size[i] = 0; - cfg->carrier_config.dl_k0[i] = 0; - } + for (int i = 0; i < 5; i++) { + if (i == frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { + cfg->carrier_config.dl_grid_size[i] = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + cfg->carrier_config.dl_k0[i] = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; } - - cfg->carrier_config.uplink_bandwidth = config_bandwidth(scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, - scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth, - *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]); - - int UL_pointA; - if (scc->uplinkConfigCommon->frequencyInfoUL->absoluteFrequencyPointA == NULL) - UL_pointA = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA; - else - UL_pointA = *scc->uplinkConfigCommon->frequencyInfoUL->absoluteFrequencyPointA; - - cfg->carrier_config.uplink_frequency = from_nrarfcn(*scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0], - *scc->ssbSubcarrierSpacing, - UL_pointA)/1000; // freq in kHz - - - for (i=0; i<5; i++) { - if (i==scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { - cfg->carrier_config.ul_grid_size[i] = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; - cfg->carrier_config.ul_k0[i] = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; - } - else { - cfg->carrier_config.ul_grid_size[i] = 0; - cfg->carrier_config.ul_k0[i] = 0; - } + else { + cfg->carrier_config.dl_grid_size[i] = 0; + cfg->carrier_config.dl_k0[i] = 0; } - - uint32_t band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; - mac->frequency_range = band<100?FR1:FR2; - - frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing); - - // cell config - - cfg->cell_config.phy_cell_id = *scc->physCellId; - cfg->cell_config.frame_duplex_type = frame_type; - - // SSB config - cfg->ssb_config.ss_pbch_power = scc->ss_PBCH_BlockPower; - cfg->ssb_config.scs_common = *scc->ssbSubcarrierSpacing; - - // SSB Table config - int scs_scaling = 1<<(cfg->ssb_config.scs_common); - if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000) - scs_scaling = scs_scaling*3; - if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666) - scs_scaling = scs_scaling>>2; - uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); - cfg->ssb_table.ssb_offset_point_a = absolute_diff/(12*scs_scaling) - 10; - cfg->ssb_table.ssb_period = *scc->ssb_periodicityServingCell; + } - // NSA -> take ssb offset from SCS - cfg->ssb_table.ssb_subcarrier_offset = absolute_diff%(12*scs_scaling); - - switch (scc->ssb_PositionsInBurst->present) { - case 1 : - cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24; - cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; - break; - case 2 : - cfg->ssb_table.ssb_mask_list[0].ssb_mask = ((uint32_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]) << 24; - cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; - break; - case 3 : - cfg->ssb_table.ssb_mask_list[0].ssb_mask = 0; - cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; - for (i=0; i<4; i++) { - cfg->ssb_table.ssb_mask_list[0].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[3-i]<ssb_table.ssb_mask_list[1].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[7-i]<ssb_PositionsInBurst->present); - } - - // TDD Table Configuration - if (cfg->cell_config.frame_duplex_type == TDD){ - set_tdd_config_nr_ue(cfg, - scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, - scc->tdd_UL_DL_ConfigurationCommon); - } + struct NR_FrequencyInfoUL *frequencyInfoUL = scc->uplinkConfigCommon->frequencyInfoUL; + bw_index = get_supported_band_index(frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, + *frequencyInfoUL->frequencyBandList->list.array[0], + frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth); + cfg->carrier_config.uplink_bandwidth = get_supported_bw_mhz(*frequencyInfoUL->frequencyBandList->list.array[0] > 256 ? FR2 : FR1, bw_index); - // PRACH configuration - uint8_t nb_preambles = 64; - if(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles != NULL) - nb_preambles = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles; + int UL_pointA; + if (frequencyInfoUL->absoluteFrequencyPointA == NULL) + UL_pointA = frequencyInfoDL->absoluteFrequencyPointA; + else + UL_pointA = *frequencyInfoUL->absoluteFrequencyPointA; + + cfg->carrier_config.uplink_frequency = from_nrarfcn(*frequencyInfoUL->frequencyBandList->list.array[0], + *scc->ssbSubcarrierSpacing, + UL_pointA) / 1000; // freq in kHz + + for (int i = 0; i < 5; i++) { + if (i == frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { + cfg->carrier_config.ul_grid_size[i] = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + cfg->carrier_config.ul_k0[i] = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; + } + else { + cfg->carrier_config.ul_grid_size[i] = 0; + cfg->carrier_config.ul_k0[i] = 0; + } + } + + uint32_t band = *frequencyInfoDL->frequencyBandList.list.array[0]; + mac->frequency_range = band<100?FR1:FR2; + + frame_type_t frame_type = get_frame_type(*frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing); + + // cell config + + cfg->cell_config.phy_cell_id = *scc->physCellId; + cfg->cell_config.frame_duplex_type = frame_type; + + // SSB config + cfg->ssb_config.ss_pbch_power = scc->ss_PBCH_BlockPower; + cfg->ssb_config.scs_common = *scc->ssbSubcarrierSpacing; + + // SSB Table config + int scs_scaling = 1<<(cfg->ssb_config.scs_common); + if (frequencyInfoDL->absoluteFrequencyPointA < 600000) + scs_scaling = scs_scaling*3; + if (frequencyInfoDL->absoluteFrequencyPointA > 2016666) + scs_scaling = scs_scaling>>2; + uint32_t absolute_diff = (*frequencyInfoDL->absoluteFrequencySSB - frequencyInfoDL->absoluteFrequencyPointA); + cfg->ssb_table.ssb_offset_point_a = absolute_diff/(12*scs_scaling) - 10; + cfg->ssb_table.ssb_period = *scc->ssb_periodicityServingCell; + + // NSA -> take ssb offset from SCS + cfg->ssb_table.ssb_subcarrier_offset = absolute_diff%(12*scs_scaling); + + switch (scc->ssb_PositionsInBurst->present) { + case 1 : + cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24; + cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; + break; + case 2 : + cfg->ssb_table.ssb_mask_list[0].ssb_mask = ((uint32_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]) << 24; + cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; + break; + case 3 : + cfg->ssb_table.ssb_mask_list[0].ssb_mask = 0; + cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; + for (int i = 0; i < 4; i++) { + cfg->ssb_table.ssb_mask_list[0].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[3-i]<ssb_table.ssb_mask_list[1].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[7-i]<ssb_PositionsInBurst->present); + } + + // TDD Table Configuration + if (cfg->cell_config.frame_duplex_type == TDD){ + set_tdd_config_nr_ue(cfg, + frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, + scc->tdd_UL_DL_ConfigurationCommon); + } + + // PRACH configuration + uint8_t nb_preambles = 64; + NR_RACH_ConfigCommon_t *rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup; + if(rach_ConfigCommon->totalNumberOfRA_Preambles != NULL) + nb_preambles = *rach_ConfigCommon->totalNumberOfRA_Preambles; + + cfg->prach_config.prach_sequence_length = rach_ConfigCommon->prach_RootSequenceIndex.present-1; + + if (rach_ConfigCommon->msg1_SubcarrierSpacing) + cfg->prach_config.prach_sub_c_spacing = *rach_ConfigCommon->msg1_SubcarrierSpacing; + else + cfg->prach_config.prach_sub_c_spacing = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; + + cfg->prach_config.restricted_set_config = rach_ConfigCommon->restrictedSetConfig; - cfg->prach_config.prach_sequence_length = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present-1; - - if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing) - cfg->prach_config.prach_sub_c_spacing = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing; - else - cfg->prach_config.prach_sub_c_spacing = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; - - cfg->prach_config.restricted_set_config = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->restrictedSetConfig; - - switch (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM) { + switch (rach_ConfigCommon->rach_ConfigGeneric.msg1_FDM) { case 0 : cfg->prach_config.num_prach_fd_occasions = 1; break; @@ -403,28 +410,28 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, cfg->prach_config.num_prach_fd_occasions = 8; break; default: - AssertFatal(1==0,"msg1 FDM identifier %ld undefined (0,1,2,3) \n", scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM); - } - - cfg->prach_config.num_prach_fd_occasions_list = (fapi_nr_num_prach_fd_occasions_t *) malloc(cfg->prach_config.num_prach_fd_occasions*sizeof(fapi_nr_num_prach_fd_occasions_t)); - for (i=0; iprach_config.num_prach_fd_occasions; i++) { - cfg->prach_config.num_prach_fd_occasions_list[i].num_prach_fd_occasions = i; - if (cfg->prach_config.prach_sequence_length) - cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139; - else - cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; - - cfg->prach_config.num_prach_fd_occasions_list[i].k1 = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart; - cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; - cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup, - nb_preambles, frame_type,mac->frequency_range); - //cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ??? - } + AssertFatal(1==0,"msg1 FDM identifier %ld undefined (0,1,2,3) \n", rach_ConfigCommon->rach_ConfigGeneric.msg1_FDM); + } - cfg->prach_config.ssb_per_rach = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present-1; - - } // scc - + cfg->prach_config.num_prach_fd_occasions_list = (fapi_nr_num_prach_fd_occasions_t *) malloc(cfg->prach_config.num_prach_fd_occasions*sizeof(fapi_nr_num_prach_fd_occasions_t)); + for (int i = 0; i < cfg->prach_config.num_prach_fd_occasions; i++) { + fapi_nr_num_prach_fd_occasions_t *prach_fd_occasion = &cfg->prach_config.num_prach_fd_occasions_list[i]; + prach_fd_occasion->num_prach_fd_occasions = i; + if (cfg->prach_config.prach_sequence_length) + prach_fd_occasion->prach_root_sequence_index = rach_ConfigCommon->prach_RootSequenceIndex.choice.l139; + else + prach_fd_occasion->prach_root_sequence_index = rach_ConfigCommon->prach_RootSequenceIndex.choice.l839; + + prach_fd_occasion->k1 = rach_ConfigCommon->rach_ConfigGeneric.msg1_FrequencyStart; + prach_fd_occasion->prach_zero_corr_conf = rach_ConfigCommon->rach_ConfigGeneric.zeroCorrelationZoneConfig; + prach_fd_occasion->num_root_sequences = compute_nr_root_seq(rach_ConfigCommon, + nb_preambles, + frame_type, + mac->frequency_range); + //prach_fd_occasion->num_unused_root_sequences = ??? + } + + cfg->prach_config.ssb_per_rach = rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present-1; } /** \brief This function is relavant for the UE procedures for control. It loads the search spaces, the BWPs and the CORESETs into the MAC instance and diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 5418d81e92..e5ffe9c356 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -378,6 +378,16 @@ typedef struct { } NR_SSB_meas_t; +typedef struct NR_UL_TIME_ALIGNMENT { + /// TA command and TAGID received from the gNB + bool ta_apply; + int ta_command; + int ta_total; + uint32_t tag_id; + int frame; + int slot; +} NR_UL_TIME_ALIGNMENT_t; + /*!\brief Top level UE MAC structure */ typedef struct { NR_UE_L2_STATE_t state; @@ -400,11 +410,12 @@ typedef struct { NR_UE_DL_BWP_t current_DL_BWP; NR_UE_UL_BWP_t current_UL_BWP; + NR_UL_TIME_ALIGNMENT_t ul_time_alignment; - NR_BWP_Downlink_t *DLbwp[MAX_NUM_BWP_UE]; - NR_BWP_Uplink_t *ULbwp[MAX_NUM_BWP_UE]; - NR_ControlResourceSet_t *coreset[MAX_NUM_BWP_UE][FAPI_NR_MAX_CORESET_PER_BWP]; - NR_SearchSpace_t *SSpace[MAX_NUM_BWP_UE][FAPI_NR_MAX_SS]; + NR_BWP_Downlink_t *DLbwp[MAX_NUM_BWP_UE]; + NR_BWP_Uplink_t *ULbwp[MAX_NUM_BWP_UE]; + NR_ControlResourceSet_t *coreset[MAX_NUM_BWP_UE][FAPI_NR_MAX_CORESET_PER_BWP]; + NR_SearchSpace_t *SSpace[MAX_NUM_BWP_UE][FAPI_NR_MAX_SS]; bool phy_config_request_sent; frame_type_t frame_type; diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index 867f44e640..0c69ee7d5f 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -232,11 +232,9 @@ uint8_t get_rsrp_diff_index(int best_rsrp,int current_rsrp); @returns void */ void nr_ue_send_sdu(nr_downlink_indication_t *dl_info, - NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id); void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, - NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id); int nr_write_ce_ulsch_pdu(uint8_t *mac_ce, @@ -322,6 +320,7 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, void *phy_data); void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot); void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot); +void schedule_ta_command(fapi_nr_dl_config_request_t *dl_config, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment); /* \brief This function schedules the Msg3 transmission @param @@ -356,7 +355,7 @@ random-access procedure @param selected_rar_buffer the output buffer for storing the selected RAR header and RAR payload @returns timing advance or 0xffff if preamble doesn't match */ -int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id); +int nr_ue_process_rar(nr_downlink_indication_t *dl_info, int pdu_id); void nr_ue_contention_resolution(module_id_t module_id, int cc_id, frame_t frame, int slot, NR_PRACH_RESOURCES_t *prach_resources); diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c index 90775a1029..96a9a3e072 100644 --- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c +++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c @@ -51,16 +51,10 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) { //LOG_I(MAC, "[MAIN] init UE MAC functions \n"); //init mac here - nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(sizeof(NR_UE_MAC_INST_t),NB_NR_UE_MAC_INST); - nr_ue_mac_inst->first_sync_frame = -1; - nr_ue_mac_inst->sib1_decoded = false; - nr_ue_mac_inst->phy_config_request_sent = false; - nr_ue_mac_inst->state = UE_NOT_SYNC; - memset(&nr_ue_mac_inst->ssb_measurements, 0, sizeof(nr_ue_mac_inst->ssb_measurements)); + nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(sizeof(NR_UE_MAC_INST_t), NB_NR_UE_MAC_INST); - for (int j=0;jscell_group_config) { diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 3c4fe6c2ee..2cde4d3c07 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -151,9 +151,8 @@ const initial_pucch_resource_t initial_pucch_resource[16] = { }; -void nr_ue_init_mac(module_id_t module_idP) { - int i; - +void nr_ue_init_mac(module_id_t module_idP) +{ NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP); // default values as deined in 38.331 sec 9.2.2 LOG_I(NR_MAC, "[UE%d] Applying default macMainConfig\n", module_idP); @@ -182,7 +181,7 @@ void nr_ue_init_mac(module_id_t module_idP) { // mac->scheduling_info.PathlossChange_db = nr_get_db_dl_PathlossChange(mac->scheduling_info.PathlossChange); // mac->PHR_reporting_active = 0; - for (i = 0; i < NR_MAX_NUM_LCID; i++) { + for (int i = 0; i < NR_MAX_NUM_LCID; i++) { LOG_D(NR_MAC, "[UE%d] Applying default logical channel config for LCGID %d\n", module_idP, i); mac->scheduling_info.Bj[i] = -1; @@ -196,8 +195,16 @@ void nr_ue_init_mac(module_id_t module_idP) { mac->scheduling_info.LCID_status[i] = LCID_EMPTY; mac->scheduling_info.LCID_buffer_remain[i] = 0; - for (int i=0;ifirst_ul_tx[i]=1; + for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) + mac->first_ul_tx[i] = 1; } + + mac->first_sync_frame = -1; + mac->sib1_decoded = false; + mac->phy_config_request_sent = false; + mac->state = UE_NOT_SYNC; + memset(&mac->ssb_measurements, 0, sizeof(mac->ssb_measurements)); + memset(&mac->ul_time_alignment, 0, sizeof(mac->ul_time_alignment)); } NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id) { @@ -2609,6 +2616,7 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, int ssbri_bits = ceil(log2(nb_ssb)); int ssb_rsrp[2][nb_meas]; // the array contains index and RSRP of each SSB to be reported (nb_meas highest RSRPs) + memset(ssb_rsrp, 0, sizeof(ssb_rsrp)); //TODO replace the following 2 lines with a function to order the nb_meas highest SSB RSRPs for (int i=0; iframe, dl_info->slot); @@ -2818,10 +2826,10 @@ void nr_ue_send_sdu(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *u // it parses MAC CEs subheaders, MAC CEs, SDU subheaderds and SDUs switch (dl_info->rx_ind->rx_indication_body[pdu_id].pdu_type){ case FAPI_NR_RX_PDU_TYPE_DLSCH: - nr_ue_process_mac_pdu(dl_info, ul_time_alignment, pdu_id); + nr_ue_process_mac_pdu(dl_info, pdu_id); break; case FAPI_NR_RX_PDU_TYPE_RAR: - nr_ue_process_rar(dl_info, ul_time_alignment, pdu_id); + nr_ue_process_rar(dl_info, pdu_id); break; default: break; @@ -3535,8 +3543,8 @@ static uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, // R: Reserved bit, set to zero. //////////////////////////////// void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, - NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, - int pdu_id){ + int pdu_id) +{ module_id_t module_idP = dl_info->module_id; frame_t frameP = dl_info->frame; @@ -3656,11 +3664,14 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, const int ta = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND; const int tag = ((NR_MAC_CE_TA *)pduP)[1].TAGID; - ul_time_alignment->apply_ta = 1; - ul_time_alignment->ta_command = ta; //here + + NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &mac->ul_time_alignment; ul_time_alignment->ta_total += ta - 31; ul_time_alignment->tag_id = tag; - + ul_time_alignment->ta_command = ta; + ul_time_alignment->frame = frameP; + ul_time_alignment->slot = slot; + ul_time_alignment->ta_apply = true; /* #ifdef DEBUG_HEADER_PARSING LOG_D(MAC, "[UE] CE %d : UE Timing Advance : %d\n", i, pduP[1]); @@ -3943,8 +3954,8 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce, // - b buffer // - ulsch power offset // - optimize: mu_pusch, j and table_6_1_2_1_1_2_time_dom_res_alloc_A are already defined in nr_ue_procedures -int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){ - +int nr_ue_process_rar(nr_downlink_indication_t *dl_info, int pdu_id) +{ module_id_t mod_id = dl_info->module_id; frame_t frame = dl_info->frame; int slot = dl_info->slot; @@ -4029,12 +4040,12 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t #endif // TA command - ul_time_alignment->apply_ta = 1; + NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &mac->ul_time_alignment; const int ta = rar->TA2 + (rar->TA1 << 5); ul_time_alignment->ta_command = 31 + ta; ul_time_alignment->ta_total = ta; - LOG_W(MAC, "received TA command %d\n", ul_time_alignment->ta_command); - + ul_time_alignment->ta_apply = true; + LOG_W(MAC, "received TA command %d\n", 31 + ta); #ifdef DEBUG_RAR // CSI csi_req = (unsigned char) (rar->UL_GRANT_4 & 0x01); @@ -4102,7 +4113,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t mod_id, rar_grant.Msg3_t_alloc, rar_grant.Msg3_f_alloc, - ul_time_alignment->ta_command, + ta_command, rar_grant.mcs, rar_grant.freq_hopping, tpc_command, @@ -4148,10 +4159,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t } } else { - ra->t_crnti = 0; - ul_time_alignment->ta_command = (0xffff); - } return ret; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index e5c6fb0e3c..94067924d1 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -1024,6 +1024,8 @@ void nr_ue_dl_scheduler(nr_downlink_indication_t *dl_info) nr_ue_dcireq(&dcireq); //to be replaced with function pointer later *dl_config = dcireq.dl_config_req; + if(mac->ul_time_alignment.ta_apply) + schedule_ta_command(dl_config, &mac->ul_time_alignment); nr_schedule_csirs_reception(mac, rx_frame, rx_slot); nr_schedule_csi_for_im(mac, rx_frame, rx_slot); dcireq.dl_config_req = *dl_config; @@ -1037,6 +1039,8 @@ void nr_ue_dl_scheduler(nr_downlink_indication_t *dl_info) else if (mac->state == UE_PERFORMING_RA) { // this is for Msg2/Msg4 if (mac->ra.ra_state >= WAIT_RAR) { + if(mac->ul_time_alignment.ta_apply) + schedule_ta_command(dl_config, &mac->ul_time_alignment); fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15; rel15->num_dci_options = mac->ra.ra_state == WAIT_RAR ? 1 : 2; rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; @@ -3171,5 +3175,15 @@ uint8_t nr_ue_get_sdu(module_id_t module_idP, #endif return num_sdus > 0 ? 1 : 0; +} +void schedule_ta_command(fapi_nr_dl_config_request_t *dl_config, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment) +{ + fapi_nr_ta_command_pdu *ta = &dl_config->dl_config_list[dl_config->number_pdus].ta_command_pdu; + ta->ta_frame = ul_time_alignment->frame; + ta->ta_slot = ul_time_alignment->slot; + ta->ta_command = ul_time_alignment->ta_command; + dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_CONFIG_TA_COMMAND; + dl_config->number_pdus += 1; + ul_time_alignment->ta_apply = false; } diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 96c3a85b98..a647dcd21c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -170,24 +170,25 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn nrmac->common_channels[0].ServingCellConfigCommon = scc; // Carrier configuration - - cfg->carrier_config.dl_bandwidth.value = config_bandwidth(scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, - scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth, - *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]); + struct NR_FrequencyInfoDL *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL; + int bw_index = get_supported_band_index(frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, + *frequencyInfoDL->frequencyBandList.list.array[0], + frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth); + cfg->carrier_config.dl_bandwidth.value = get_supported_bw_mhz(*frequencyInfoDL->frequencyBandList.list.array[0] > 256 ? FR2 : FR1, bw_index); cfg->carrier_config.dl_bandwidth.tl.tag = NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG; //temporary cfg->num_tlv++; LOG_I(NR_MAC,"%s() dl_BandwidthP:%d\n", __FUNCTION__, cfg->carrier_config.dl_bandwidth.value); - cfg->carrier_config.dl_frequency.value = from_nrarfcn(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], + cfg->carrier_config.dl_frequency.value = from_nrarfcn(*frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing, - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA)/1000; // freq in kHz + frequencyInfoDL->absoluteFrequencyPointA)/1000; // freq in kHz cfg->carrier_config.dl_frequency.tl.tag = NFAPI_NR_CONFIG_DL_FREQUENCY_TAG; cfg->num_tlv++; - for (int i=0; i<5; i++) { - if (i==scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { - cfg->carrier_config.dl_grid_size[i].value = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; - cfg->carrier_config.dl_k0[i].value = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; + for (int i = 0; i < 5; i++) { + if (i == frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { + cfg->carrier_config.dl_grid_size[i].value = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + cfg->carrier_config.dl_k0[i].value = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; cfg->carrier_config.dl_grid_size[i].tl.tag = NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG; cfg->carrier_config.dl_k0[i].tl.tag = NFAPI_NR_CONFIG_DL_K0_TAG; cfg->num_tlv++; @@ -198,30 +199,31 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn cfg->carrier_config.dl_k0[i].value = 0; } } - - cfg->carrier_config.uplink_bandwidth.value = config_bandwidth(scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, - scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth, - *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]); + struct NR_FrequencyInfoUL *frequencyInfoUL = scc->uplinkConfigCommon->frequencyInfoUL; + bw_index = get_supported_band_index(frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, + *frequencyInfoUL->frequencyBandList->list.array[0], + frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth); + cfg->carrier_config.uplink_bandwidth.value = get_supported_bw_mhz(*frequencyInfoUL->frequencyBandList->list.array[0] > 256 ? FR2 : FR1, bw_index); cfg->carrier_config.uplink_bandwidth.tl.tag = NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG; //temporary cfg->num_tlv++; LOG_I(NR_MAC,"%s() dl_BandwidthP:%d\n", __FUNCTION__, cfg->carrier_config.uplink_bandwidth.value); int UL_pointA; - if (scc->uplinkConfigCommon->frequencyInfoUL->absoluteFrequencyPointA == NULL) - UL_pointA = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA; + if (frequencyInfoUL->absoluteFrequencyPointA == NULL) + UL_pointA = frequencyInfoDL->absoluteFrequencyPointA; else - UL_pointA = *scc->uplinkConfigCommon->frequencyInfoUL->absoluteFrequencyPointA; + UL_pointA = *frequencyInfoUL->absoluteFrequencyPointA; - cfg->carrier_config.uplink_frequency.value = from_nrarfcn(*scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0], + cfg->carrier_config.uplink_frequency.value = from_nrarfcn(*frequencyInfoUL->frequencyBandList->list.array[0], *scc->ssbSubcarrierSpacing, UL_pointA)/1000; // freq in kHz cfg->carrier_config.uplink_frequency.tl.tag = NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG; cfg->num_tlv++; - for (int i=0; i<5; i++) { - if (i==scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { - cfg->carrier_config.ul_grid_size[i].value = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; - cfg->carrier_config.ul_k0[i].value = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; + for (int i = 0; i < 5; i++) { + if (i == frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) { + cfg->carrier_config.ul_grid_size[i].value = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + cfg->carrier_config.ul_k0[i].value = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier; cfg->carrier_config.ul_grid_size[i].tl.tag = NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG; cfg->carrier_config.ul_k0[i].tl.tag = NFAPI_NR_CONFIG_UL_K0_TAG; cfg->num_tlv++; @@ -233,10 +235,10 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn } } - uint32_t band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; + uint32_t band = *frequencyInfoDL->frequencyBandList.list.array[0]; frequency_range_t frequency_range = band<100?FR1:FR2; - frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing); + frame_type_t frame_type = get_frame_type(*frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing); nrmac->common_channels[0].frame_type = frame_type; // Cell configuration @@ -265,27 +267,28 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn // PRACH configuration uint8_t nb_preambles = 64; - if(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles != NULL) - nb_preambles = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles; + NR_RACH_ConfigCommon_t *rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup; + if(rach_ConfigCommon->totalNumberOfRA_Preambles != NULL) + nb_preambles = *rach_ConfigCommon->totalNumberOfRA_Preambles; - cfg->prach_config.prach_sequence_length.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present-1; + cfg->prach_config.prach_sequence_length.value = rach_ConfigCommon->prach_RootSequenceIndex.present-1; cfg->prach_config.prach_sequence_length.tl.tag = NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG; - cfg->num_tlv++; + cfg->num_tlv++; - if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing) - cfg->prach_config.prach_sub_c_spacing.value = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing; - else - cfg->prach_config.prach_sub_c_spacing.value = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; + if (rach_ConfigCommon->msg1_SubcarrierSpacing) + cfg->prach_config.prach_sub_c_spacing.value = *rach_ConfigCommon->msg1_SubcarrierSpacing; + else + cfg->prach_config.prach_sub_c_spacing.value = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; cfg->prach_config.prach_sub_c_spacing.tl.tag = NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG; cfg->num_tlv++; - cfg->prach_config.restricted_set_config.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->restrictedSetConfig; + cfg->prach_config.restricted_set_config.value = rach_ConfigCommon->restrictedSetConfig; cfg->prach_config.restricted_set_config.tl.tag = NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG; cfg->num_tlv++; - cfg->prach_config.prach_ConfigurationIndex.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex; + cfg->prach_config.prach_ConfigurationIndex.value = rach_ConfigCommon->rach_ConfigGeneric.prach_ConfigurationIndex; cfg->prach_config.prach_ConfigurationIndex.tl.tag = NFAPI_NR_CONFIG_PRACH_CONFIG_INDEX_TAG; cfg->num_tlv++; - switch (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM) { + switch (rach_ConfigCommon->rach_ConfigGeneric.msg1_FDM) { case 0 : cfg->prach_config.num_prach_fd_occasions.value = 1; break; @@ -299,48 +302,57 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn cfg->prach_config.num_prach_fd_occasions.value = 8; break; default: - AssertFatal(1==0,"msg1 FDM identifier %ld undefined (0,1,2,3) \n", scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM); + AssertFatal(1==0,"msg1 FDM identifier %ld undefined (0,1,2,3) \n", rach_ConfigCommon->rach_ConfigGeneric.msg1_FDM); } cfg->prach_config.num_prach_fd_occasions.tl.tag = NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG; cfg->num_tlv++; - cfg->prach_config.prach_ConfigurationIndex.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex; + cfg->prach_config.prach_ConfigurationIndex.value = rach_ConfigCommon->rach_ConfigGeneric.prach_ConfigurationIndex; cfg->prach_config.prach_ConfigurationIndex.tl.tag = NFAPI_NR_CONFIG_PRACH_CONFIG_INDEX_TAG; cfg->num_tlv++; cfg->prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *) malloc(cfg->prach_config.num_prach_fd_occasions.value*sizeof(nfapi_nr_num_prach_fd_occasions_t)); for (int i=0; iprach_config.num_prach_fd_occasions.value; i++) { -// cfg->prach_config.num_prach_fd_occasions_list[i].num_prach_fd_occasions = i; + nfapi_nr_num_prach_fd_occasions_t *prach_fd_occasion = &cfg->prach_config.num_prach_fd_occasions_list[i]; + // prach_fd_occasion->num_prach_fd_occasions = i; if (cfg->prach_config.prach_sequence_length.value) - cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139; + prach_fd_occasion->prach_root_sequence_index.value = rach_ConfigCommon->prach_RootSequenceIndex.choice.l139; else - cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839; - cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index.tl.tag = NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG; + prach_fd_occasion->prach_root_sequence_index.value = rach_ConfigCommon->prach_RootSequenceIndex.choice.l839; + prach_fd_occasion->prach_root_sequence_index.tl.tag = NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG; cfg->num_tlv++; - cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + prach_fd_occasion->k1.value = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + + rach_ConfigCommon->rach_ConfigGeneric.msg1_FrequencyStart + + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); if (get_softmodem_params()->sa) { - cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + prach_fd_occasion->k1.value = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + + rach_ConfigCommon->rach_ConfigGeneric.msg1_FrequencyStart + + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); } else { - cfg->prach_config.num_prach_fd_occasions_list[i].k1.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB( cfg->prach_config.prach_sub_c_spacing.value, scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); + prach_fd_occasion->k1.value = rach_ConfigCommon->rach_ConfigGeneric.msg1_FrequencyStart + + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i); } - cfg->prach_config.num_prach_fd_occasions_list[i].k1.tl.tag = NFAPI_NR_CONFIG_K1_TAG; + prach_fd_occasion->k1.tl.tag = NFAPI_NR_CONFIG_K1_TAG; cfg->num_tlv++; - cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig; - cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf.tl.tag = NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG; + prach_fd_occasion->prach_zero_corr_conf.value = rach_ConfigCommon->rach_ConfigGeneric.zeroCorrelationZoneConfig; + prach_fd_occasion->prach_zero_corr_conf.tl.tag = NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG; cfg->num_tlv++; - cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences.value = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup,nb_preambles, frame_type, frequency_range); - cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences.tl.tag = NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG; + prach_fd_occasion->num_root_sequences.value = compute_nr_root_seq(rach_ConfigCommon, + nb_preambles, + frame_type, + frequency_range); + prach_fd_occasion->num_root_sequences.tl.tag = NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG; cfg->num_tlv++; - cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences.value = 1; + prach_fd_occasion->num_unused_root_sequences.value = 1; } - cfg->prach_config.ssb_per_rach.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present-1; + cfg->prach_config.ssb_per_rach.value = rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present-1; cfg->prach_config.ssb_per_rach.tl.tag = NFAPI_NR_CONFIG_SSB_PER_RACH_TAG; cfg->num_tlv++; // SSB Table Configuration - uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); - const int scaling_5khz = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1; + uint32_t absolute_diff = (*frequencyInfoDL->absoluteFrequencySSB - frequencyInfoDL->absoluteFrequencyPointA); + const int scaling_5khz = frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1; int sco = (absolute_diff/scaling_5khz) % 24; if(frequency_range == FR2) sco >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for @@ -428,7 +440,7 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn } LOG_I(NR_MAC, "Setting TDD configuration period to %d\n", cfg->tdd_table.tdd_period.value); int periods_per_frame = set_tdd_config_nr(cfg, - scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, + frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots, scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols, scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots, @@ -441,7 +453,6 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn nrmac->tdd_beam_association = (int16_t *)malloc16(periods_per_frame*sizeof(int16_t)); } } - } int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP, rnti_t rnti, NR_SubcarrierSpacing_t subcarrierSpacing, uint32_t rrc_reconfiguration_delay) { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index d08d2fefb3..5adb036931 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -715,7 +715,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ul_bwp->tdaList_Common; int mu = ul_bwp->scs; uint8_t K2 = *pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->k2; - const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]); + const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu])) % 1024; const int sched_slot = (slot + K2) % nr_slots_per_frame[mu]; if (is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot)) { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 7d16783416..71b4499c55 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -108,10 +108,8 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP, AssertFatal(timing_advance_cmd < 64, "timing_advance_cmd %d > 63\n", timing_advance_cmd); ((NR_MAC_CE_TA *) ce_ptr)->TA_COMMAND = timing_advance_cmd; //(timing_advance_cmd+31)&0x3f; - if (gNB->tag->tag_Id != 0) { - tag_id = gNB->tag->tag_Id; - ((NR_MAC_CE_TA *) ce_ptr)->TAGID = tag_id; - } + tag_id = gNB->tag->tag_Id; + ((NR_MAC_CE_TA *) ce_ptr)->TAGID = tag_id; LOG_D(NR_MAC, "NR MAC CE timing advance command = %d (%d) TAG ID = %d\n", timing_advance_cmd, ((NR_MAC_CE_TA *) ce_ptr)->TA_COMMAND, tag_id); mac_ce_size = sizeof(NR_MAC_CE_TA); @@ -1191,7 +1189,7 @@ void nr_schedule_ue_spec(module_id_t module_id, T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_INT(harq->round), T_BUFFER(harq->transportBlock, TBS)); UE->mac_stats.dl.total_rbs_retx += sched_pdsch->rbSize; } else { /* initial transmission */ - LOG_D(NR_MAC, "[%s] Initial HARQ transmission in %d.%d\n", __FUNCTION__, frame, slot); + LOG_D(NR_MAC, "Initial HARQ transmission in %d.%d\n", frame, slot); uint8_t *buf = (uint8_t *) harq->transportBlock; /* first, write all CEs that might be there */ int written = nr_write_ce_dlsch_pdu(module_id, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 6ed327e125..e1a4e716ef 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1662,7 +1662,8 @@ void pf_ul(module_id_t module_id, } const NR_bler_options_t *bo = &nrmac->ul_bler; - const int max_mcs = bo->max_mcs; /* no per-user maximum MCS yet */ + const int max_mcs_table = (current_BWP->mcs_table == 0 || current_BWP->mcs_table == 2) ? 28 : 27; + const int max_mcs = min(bo->max_mcs, max_mcs_table); /* no per-user maximum MCS yet */ if (bo->harq_round_max == 1) sched_pusch->mcs = max_mcs; else @@ -2102,7 +2103,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, n sched_ctrl->last_ul_slot = sched_pusch->slot; LOG_D(NR_MAC, - "ULSCH/PUSCH: %4d.%2d RNTI %04x UL sched %4d.%2d DCI L %d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS %2d nrOfLayers %2d num_dmrs_cdm_grps_no_data %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d TPC %d\n", + "ULSCH/PUSCH: %4d.%2d RNTI %04x UL sched %4d.%2d DCI L %d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS Table %2d MCS %2d nrOfLayers %2d num_dmrs_cdm_grps_no_data %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d TPC %d\n", frame, slot, rnti, @@ -2114,6 +2115,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, n sched_pusch->tda_info.startSymbolIndex, sched_pusch->tda_info.nrOfSymbols, sched_pusch->dmrs_info.ul_dmrs_symb_pos, + current_BWP->mcs_table, sched_pusch->mcs, sched_pusch->nrOfLayers, sched_pusch->dmrs_info.num_dmrs_cdm_grps_no_data, diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_pdu.c b/openair2/LAYER2/nr_rlc/nr_rlc_pdu.c index b42410ab72..c5b1eb04e7 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_pdu.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_pdu.c @@ -151,7 +151,7 @@ void nr_rlc_pdu_encoder_init(nr_rlc_pdu_encoder_t *encoder, { encoder->byte = 0; encoder->bit = 0; - encoder->buffer = buffer; + encoder->buffer = (unsigned char *)buffer; encoder->size = size; } diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_pdu.h b/openair2/LAYER2/nr_rlc/nr_rlc_pdu.h index 8e9872522f..0f5cd6c6d0 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_pdu.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_pdu.h @@ -71,7 +71,7 @@ int nr_rlc_pdu_decoder_get_bits(nr_rlc_pdu_decoder_t *decoder, int count); typedef struct { int byte; /* next byte to encode */ int bit; /* next bit in next byte to encode */ - char *buffer; + unsigned char *buffer; int size; } nr_rlc_pdu_encoder_t; diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 7312eeeef2..187976753d 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -443,9 +443,7 @@ static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_ rx_ind->sfn = dl_tti_request->SFN; rx_ind->slot = dl_tti_request->Slot; fill_mib_in_rx_ind(pdu_list, rx_ind, 0, FAPI_NR_RX_PDU_TYPE_SSB); - NR_UL_TIME_ALIGNMENT_t ul_time_alignment; - memset(&ul_time_alignment, 0, sizeof(ul_time_alignment)); - nr_ue_dl_indication(&mac->dl_info, &ul_time_alignment); + nr_ue_dl_indication(&mac->dl_info); } } dl_info->slot = dl_tti_request->Slot; @@ -729,15 +727,12 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, return; } - - NR_UL_TIME_ALIGNMENT_t ul_time_alignment; - memset(&ul_time_alignment, 0, sizeof(ul_time_alignment)); if (dl_tti_request || tx_data_request || ul_dci_request) { fapi_nr_dl_config_request_t *dl_config = get_dl_config_request(mac, slot); fill_dci_from_dl_config(&mac->dl_info, dl_config); } nr_ue_dl_scheduler(&mac->dl_info); - nr_ue_dl_indication(&mac->dl_info, &ul_time_alignment); + nr_ue_dl_indication(&mac->dl_info); if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort(); @@ -1085,7 +1080,8 @@ void handle_ssb_meas(NR_UE_MAC_INST_t *mac, uint8_t ssb_index, int16_t rsrp_dbm) // L2 Abstraction Layer // Note: sdu should always be processed because data and timing advance updates are transmitted by the UE -int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){ +int8_t handle_dlsch(nr_downlink_indication_t *dl_info, int pdu_id) +{ /* L1 assigns harq_pid, but in emulated L1 mode we need to assign the harq_pid based on the saved global g_harq_pid. Because we are emulating L1, no antenna measurements are conducted to calculate @@ -1097,7 +1093,7 @@ int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *u dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid, dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack); if(dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack) - nr_ue_send_sdu(dl_info, ul_time_alignment, pdu_id); + nr_ue_send_sdu(dl_info, pdu_id); return 0; } @@ -1142,8 +1138,8 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info) return 0; } -int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment){ - +int nr_ue_dl_indication(nr_downlink_indication_t *dl_info) +{ pthread_mutex_lock(&mac_IF_mutex); uint32_t ret_mask = 0x0; module_id_t module_id = dl_info->module_id; @@ -1193,13 +1189,12 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ if (dl_info->rx_ind != NULL) { - for (int i=0; irx_ind->number_pdus; ++i) { + for (int i = 0; i < dl_info->rx_ind->number_pdus; ++i) { fapi_nr_rx_indication_body_t rx_indication_body = dl_info->rx_ind->rx_indication_body[i]; - LOG_D(NR_MAC, "In %s sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs \n", - __FUNCTION__, - rx_indication_body.pdu_type, - dl_info->rx_ind->number_pdus); + LOG_D(NR_MAC, "Sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs \n", + rx_indication_body.pdu_type, + dl_info->rx_ind->number_pdus); switch(rx_indication_body.pdu_type){ case FAPI_NR_RX_PDU_TYPE_SSB: @@ -1226,10 +1221,10 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ rx_indication_body.pdsch_pdu.pdu_length)) << FAPI_NR_RX_PDU_TYPE_SIB; break; case FAPI_NR_RX_PDU_TYPE_DLSCH: - ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_DLSCH; + ret_mask |= (handle_dlsch(dl_info, i)) << FAPI_NR_RX_PDU_TYPE_DLSCH; break; case FAPI_NR_RX_PDU_TYPE_RAR: - ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_RAR; + ret_mask |= (handle_dlsch(dl_info, i)) << FAPI_NR_RX_PDU_TYPE_RAR; break; case FAPI_NR_CSIRS_IND: ret_mask |= (handle_csirs_measurements(dl_info->module_id, diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h index 91775794ed..e80459ee5f 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h @@ -195,7 +195,7 @@ typedef void (nr_ue_synch_request_f)(nr_synch_request_t *synch_request); * -1: Failed to consume bytes. Abort the mission. * Non-negative return values indicate success, and ignored. */ -typedef int (nr_ue_dl_indication_f)(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment); +typedef int (nr_ue_dl_indication_f)(nr_downlink_indication_t *dl_info); /* * Generic type of an application-defined callback to return various @@ -256,7 +256,7 @@ int nr_ue_if_module_kill(uint32_t module_id); /**\brief interface between L1/L2, indicating the downlink related information, like dci_ind and rx_req \param dl_info including dci_ind and rx_request messages*/ -int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment); +int nr_ue_dl_indication(nr_downlink_indication_t *dl_info); int nr_ue_ul_indication(nr_uplink_indication_t *ul_info); diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 5bee6db0f1..1f14eae9f6 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -489,7 +489,7 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr // DRB Configuration for (int i = bearer_id_start; i < bearer_id_start + nb_bearers_to_setup; i++ ){ const NR_RLC_Config_PR rlc_conf = use_rlc_um_for_drb ? NR_RLC_Config_PR_um_Bi_Directional : NR_RLC_Config_PR_am; - NR_RLC_BearerConfig_t *rlc_BearerConfig = get_DRB_RLC_BearerConfig(3 + i, i, rlc_conf, priority[0]); // Fixme: priority hardcoded see caller function, all is wrong + NR_RLC_BearerConfig_t *rlc_BearerConfig = get_DRB_RLC_BearerConfig(3 + i, i, rlc_conf, priority[i - 1]); asn1cSeqAdd(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig); asn1cSeqAdd(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig); } diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 54b2ae48c4..46627636de 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -619,7 +619,8 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, NR_ServingCellConfigCommon_t *scc, int numerology, int rbsize, - int mcs_table) { + int mcs_table_dl, + int mcs_table_ul) { NR_Phy_Parameters_t *phy_Parameters = &cap->phy_Parameters; int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; @@ -627,10 +628,15 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, nr_bandnr->bandNR = band; asn1cSeqAdd(&cap->rf_Parameters.supportedBandListNR.list, nr_bandnr); - if (mcs_table == 1) { + NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[0]; + + if (mcs_table_ul == 1) { + bandNRinfo->pusch_256QAM = CALLOC(1,sizeof(*bandNRinfo->pusch_256QAM)); + *bandNRinfo->pusch_256QAM = NR_BandNR__pusch_256QAM_supported; + } + if (mcs_table_dl == 1) { int bw = get_supported_band_index(numerology, band, rbsize); if (band>256) { - NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[0]; bandNRinfo->pdsch_256QAM_FR2 = CALLOC(1,sizeof(*bandNRinfo->pdsch_256QAM_FR2)); *bandNRinfo->pdsch_256QAM_FR2 = NR_BandNR__pdsch_256QAM_FR2_supported; } @@ -949,11 +955,54 @@ static void scheduling_request_config(const NR_ServingCellConfigCommon_t *scc, N asn1cSeqAdd(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig); } +static void set_ul_mcs_table(const NR_UE_NR_Capability_t *cap, + const NR_ServingCellConfigCommon_t *scc, + NR_PUSCH_Config_t *pusch_Config) +{ + + if (cap == NULL){ + pusch_Config->mcs_Table = NULL; + return; + } + + int band; + if (scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList) + band = *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]; + else + band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; + bool supported = false; + for (int i=0;irf_Parameters.supportedBandListNR.list.count;i++) { + NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[i]; + if(bandNRinfo->bandNR == band && bandNRinfo->pusch_256QAM) { + supported = true; + break; + } + } + if (supported) { + if(pusch_Config->transformPrecoder == NULL || + *pusch_Config->transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) { + if(pusch_Config->mcs_Table == NULL) + pusch_Config->mcs_Table = calloc(1, sizeof(*pusch_Config->mcs_Table)); + *pusch_Config->mcs_Table = NR_PUSCH_Config__mcs_Table_qam256; + } + else { + if(pusch_Config->mcs_TableTransformPrecoder == NULL) + pusch_Config->mcs_TableTransformPrecoder = calloc(1, sizeof(*pusch_Config->mcs_TableTransformPrecoder)); + *pusch_Config->mcs_TableTransformPrecoder = NR_PUSCH_Config__mcs_TableTransformPrecoder_qam256; + } + } + else { + pusch_Config->mcs_Table = NULL; + pusch_Config->mcs_TableTransformPrecoder = NULL; + } +} + static void set_dl_mcs_table(int scs, const NR_UE_NR_Capability_t *cap, NR_BWP_DownlinkDedicated_t *bwp_Dedicated, const NR_ServingCellConfigCommon_t *scc) { + if (cap == NULL){ bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; return; @@ -992,7 +1041,9 @@ static void set_dl_mcs_table(int scs, bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; } -static struct NR_SetupRelease_PUSCH_Config *config_pusch(NR_PUSCH_Config_t *pusch_Config) +static struct NR_SetupRelease_PUSCH_Config *config_pusch(NR_PUSCH_Config_t *pusch_Config, + const NR_ServingCellConfigCommon_t *scc, + const NR_UE_NR_Capability_t *uecap) { struct NR_SetupRelease_PUSCH_Config *setup_puschconfig = calloc(1, sizeof(*setup_puschconfig)); setup_puschconfig->present = NR_SetupRelease_PUSCH_Config_PR_setup; @@ -1057,8 +1108,7 @@ static struct NR_SetupRelease_PUSCH_Config *config_pusch(NR_PUSCH_Config_t *pusc pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1; pusch_Config->pusch_TimeDomainAllocationList = NULL; pusch_Config->pusch_AggregationFactor = NULL; - pusch_Config->mcs_Table = NULL; - pusch_Config->mcs_TableTransformPrecoder = NULL; + set_ul_mcs_table(uecap, scc, pusch_Config); pusch_Config->transformPrecoder = NULL; if (!pusch_Config->codebookSubset) pusch_Config->codebookSubset = calloc(1, sizeof(*pusch_Config->codebookSubset)); @@ -1261,7 +1311,7 @@ static void config_uplinkBWP(NR_BWP_Uplink_t *ubwp, bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) { pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Dedicated->pusch_Config->choice.setup; } - ubwp->bwp_Dedicated->pusch_Config = config_pusch(pusch_Config); + ubwp->bwp_Dedicated->pusch_Config = config_pusch(pusch_Config, scc, configuration->force_256qam_off ? NULL : uecap); long maxMIMO_Layers = servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig @@ -2057,7 +2107,7 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid, config_pucch_resset1(pucch_Config, NULL); set_pucch_power_config(pucch_Config, configuration->do_CSIRS); - initialUplinkBWP->pusch_Config = config_pusch(NULL); + initialUplinkBWP->pusch_Config = config_pusch(NULL, scc, NULL); long maxMIMO_Layers = uplinkConfig && uplinkConfig->pusch_ServingCellConfig && uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 @@ -2385,6 +2435,10 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, configuration->force_256qam_off ? NULL : uecap, bwp_Dedicated, scc); + + NR_BWP_UplinkDedicated_t *ul_bwp_Dedicated = SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP; + set_ul_mcs_table(configuration->force_256qam_off ? NULL : uecap, scc, ul_bwp_Dedicated->pusch_Config->choice.setup); + struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; struct NR_UplinkConfig__uplinkBWP_ToAddModList *UL_BWP_list = uplinkConfig->uplinkBWP_ToAddModList; @@ -2395,12 +2449,13 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, bwp->bwp_Dedicated, scc); } } - if (configuration->do_SRS && UL_BWP_list) { + if (UL_BWP_list) { for (int i = 0; i < UL_BWP_list->list.count; i++) { NR_BWP_Uplink_t *ul_bwp = UL_BWP_list->list.array[i]; int bwp_size = NRRIV2BW(ul_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); if (ul_bwp->bwp_Dedicated->pusch_Config) { NR_PUSCH_Config_t *pusch_Config = ul_bwp->bwp_Dedicated->pusch_Config->choice.setup; + set_ul_mcs_table(configuration->force_256qam_off ? NULL : uecap, scc, pusch_Config); if (pusch_Config->maxRank == NULL) { pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank)); } @@ -2609,7 +2664,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup; } - initialUplinkBWP->pusch_Config = config_pusch(pusch_Config); + initialUplinkBWP->pusch_Config = config_pusch(pusch_Config, servingcellconfigcommon, uecap); long maxMIMO_Layers = servingcellconfigdedicated->uplinkConfig && servingcellconfigdedicated->uplinkConfig->pusch_ServingCellConfig diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index bf8a22a9e7..592d14bf01 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -44,8 +44,8 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, NR_ServingCellConfigCommon_t *scc, int numerology, int rbsize, - int mcs_table); - + int mcs_table_dl, + int mcs_table_ul); NR_BCCH_BCH_Message_t *get_new_MIB_NR(const NR_ServingCellConfigCommon_t *scc); void free_MIB_NR(NR_BCCH_BCH_Message_t *mib); @@ -80,5 +80,4 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC const gNB_RrcConfigurationReq *configuration, int uid); - #endif diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h index 6497874ab6..87d786b773 100644 --- a/openair2/RRC/NR/nr_rrc_proto.h +++ b/openair2/RRC/NR/nr_rrc_proto.h @@ -121,7 +121,7 @@ void nr_rrc_trigger(protocol_ctxt_t *ctxt, int CC_id, int frame, int subframe); \ *ptrsMcs Pointer to L_ptrs MCS related parameters \ *epre_Ratio Pointer to ep_ratio \ *reOffset Pointer to RE Offset Value */ -void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, int *ptrsNrb, int *ptrsMcs, int *epre_Ratio, int * reOffset); +void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, long *ptrsNrb, long *ptrsMcs, long *epre_Ratio, long *reOffset); void nr_rrc_mac_remove_ue(rnti_t rntiP); void nr_rrc_mac_update_cellgroup(rnti_t rntiMaybeUEid, NR_CellGroupConfig_t *cgc); diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index a3dd0891f5..dff2da86c8 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -664,7 +664,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( //----------------------------------------------------------------------------- { gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id]; - long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future) + long drb_priority[NGAP_MAX_DRBS_PER_UE]; NR_CellGroupConfig_t *cellGroupConfig = NULL; int xid = -1; @@ -696,6 +696,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( } xid = ue_p->pduSession[j].xid; + drb_priority[DRB_config->drb_Identity - 1] = 13; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future) } /* If list is empty free the list and reset the address */ diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index ffe8d0438a..bb107d8592 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -77,36 +77,39 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon } /* Function to set or overwrite PTRS DL RRC parameters */ -void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, int *ptrsNrb, int *ptrsMcs, int *epre_Ratio, int * reOffset) +void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, long *ptrsNrb, long *ptrsMcs, long *epre_Ratio, long *reOffset) { int i=0; + NR_DMRS_DownlinkConfig_t *tmp = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup; + // struct NR_SetupRelease_PTRS_DownlinkConfig *tmp=bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS; /* check for memory allocation */ - if(bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS == NULL) { - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup= calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio = calloc(1,sizeof(long)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset = calloc(1,sizeof(long)); + if (tmp->phaseTrackingRS == NULL) { + asn1cCalloc(tmp->phaseTrackingRS, TrackingRS); + TrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup; + asn1cCalloc(TrackingRS->choice.setup, setup); + asn1cCalloc(setup->frequencyDensity, freqD); /* Fill the given values */ for(i = 0; i < 2; i++) { - asn1cSeqAdd(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list,&ptrsNrb[i]); + asn1cSequenceAdd(freqD->list, long, nbr); + *nbr = ptrsNrb[i]; } + asn1cCalloc(setup->timeDensity, timeD); for(i = 0; i < 3; i++) { - asn1cSeqAdd(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list,&ptrsMcs[i]); + asn1cSequenceAdd(timeD->list, long, mcs); + *mcs = ptrsMcs[i]; } - }// if memory exist then over write the old values - else { + asn1cCallocOne(setup->epre_Ratio, epre_Ratio[0]); + asn1cCallocOne(setup->resourceElementOffset, reOffset[0]); + } else { + NR_PTRS_DownlinkConfig_t *TrackingRS = tmp->phaseTrackingRS->choice.setup; for(i = 0; i < 2; i++) { - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] = ptrsNrb[i]; + *TrackingRS->frequencyDensity->list.array[i] = ptrsNrb[i]; } for(i = 0; i < 3; i++) { - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] = ptrsMcs[i]; + *TrackingRS->timeDensity->list.array[i] = ptrsMcs[i]; } + *TrackingRS->epre_Ratio = epre_Ratio[0]; + *TrackingRS->resourceElementOffset = reOffset[0]; } - - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio = *epre_Ratio; - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset = *reOffset; } #endif diff --git a/openair3/NAS/COMMON/EMM/MSG/FGSUplinkNasTransport.c b/openair3/NAS/COMMON/EMM/MSG/FGSUplinkNasTransport.c index d94df434b2..741ec095c3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/FGSUplinkNasTransport.c +++ b/openair3/NAS/COMMON/EMM/MSG/FGSUplinkNasTransport.c @@ -55,9 +55,11 @@ int encode_fgs_payload_container(FGSPayloadContainer *paycontainer, uint8_t iei, encoded += encode_result; } if(iei > 0){ - *(uint16_t*) (buffer+1) = htons(encoded - 3); + uint16_t tmp = htons(encoded - 3); + memcpy(buffer + 1, &tmp, sizeof(tmp)); } else { - *(uint16_t*) (buffer) = htons(encoded - 2); + uint16_t tmp = htons(encoded - 2); + memcpy(buffer, &tmp, sizeof(tmp)); } return encoded; diff --git a/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishmentAccept.c b/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishmentAccept.c index ddda52e5f7..72dedb3f7a 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishmentAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishmentAccept.c @@ -35,14 +35,18 @@ void capture_pdu_session_establishment_accept_msg(uint8_t *buffer, uint32_t msg_ pdu_session_establishment_accept_msg_t psea_msg; sec_nas_hdr.epd = *(buffer + (offset++)); sec_nas_hdr.sht = *(buffer + (offset++)); - sec_nas_hdr.mac = htonl(*(uint32_t *)(buffer + offset)); + uint32_t tmp; + memcpy(&tmp, buffer + offset, sizeof(tmp)); + sec_nas_hdr.mac = htonl(tmp); offset+=sizeof(sec_nas_hdr.mac); sec_nas_hdr.sqn = *(buffer + (offset++)); sec_nas_msg.epd = *(buffer + (offset++)); sec_nas_msg.sht = *(buffer + (offset++)); sec_nas_msg.msg_type = *(buffer + (offset++)); sec_nas_msg.payload_type = *(buffer + (offset++)); - sec_nas_msg.payload_len = htons(*(uint16_t *)(buffer + offset)); + uint16_t tmp16; + memcpy(&tmp16, buffer + offset, sizeof(tmp16)); + sec_nas_msg.payload_len = htons(tmp16); offset+=sizeof(sec_nas_msg.payload_len); /* Mandatory Presence IEs */ psea_msg.epd = *(buffer + (offset++)); @@ -51,12 +55,14 @@ void capture_pdu_session_establishment_accept_msg(uint8_t *buffer, uint32_t msg_ psea_msg.msg_type = *(buffer + (offset++)); psea_msg.pdu_type = *(buffer + offset) & 0x0f; psea_msg.ssc_mode = (*(buffer + (offset++)) & 0xf0) >> 4; - psea_msg.qos_rules.length = htons(*(uint16_t *)(buffer + offset)); + memcpy(&tmp16, buffer + offset, sizeof(tmp16)); + psea_msg.qos_rules.length = htons(tmp16); offset+=sizeof(psea_msg.qos_rules.length); /* Supports the capture of only one QoS Rule, it should be changed for multiple QoS Rules */ qos_rule_t qos_rule; qos_rule.id = *(buffer + (offset++)); - qos_rule.length = htons(*(uint16_t *)(buffer + offset)); + memcpy(&tmp16, buffer + offset, sizeof(tmp16)); + qos_rule.length = htons(tmp16); offset+=sizeof(qos_rule.length); qos_rule.oc = (*(buffer + offset) & 0xE0) >> 5; qos_rule.dqr = (*(buffer + offset) & 0x10) >> 4; diff --git a/openair3/NAS/COMMON/IES/FGCNasMessageContainer.c b/openair3/NAS/COMMON/IES/FGCNasMessageContainer.c index 874f61e7b3..4e8de951a5 100644 --- a/openair3/NAS/COMMON/IES/FGCNasMessageContainer.c +++ b/openair3/NAS/COMMON/IES/FGCNasMessageContainer.c @@ -76,7 +76,8 @@ int encode_fgc_nas_message_container(FGCNasMessageContainer *nasmessagecontainer if ((encode_result = encode_octet_string(&nasmessagecontainer->nasmessagecontainercontents, buffer + encoded, len - encoded)) < 0) { return encode_result; } else { - *(uint16_t*) (buffer+1) = htons(encoded + encode_result - 3); + uint16_t tmp = htons(encoded + encode_result - 3); + memcpy(buffer + 1, &tmp, sizeof(tmp)); encoded += encode_result; } diff --git a/openair3/NAS/COMMON/IES/FGSMobileIdentity.c b/openair3/NAS/COMMON/IES/FGSMobileIdentity.c index 872fc8e53c..ea877481e6 100644 --- a/openair3/NAS/COMMON/IES/FGSMobileIdentity.c +++ b/openair3/NAS/COMMON/IES/FGSMobileIdentity.c @@ -53,8 +53,9 @@ int decode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei CHECK_IEI_DECODER(iei, *buffer); decoded++; } - - ielen = *(uint16_t*)(buffer + decoded); /* length is two bytes */ + uint16_t tmp; + memcpy(&tmp, buffer + decoded, sizeof(tmp)); + ielen = (uint8_t)tmp; decoded += 2; CHECK_LENGTH_DECODER(len - decoded, ielen); @@ -106,9 +107,11 @@ int encode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei } if(iei > 0){ - *(uint16_t*) (buffer+1) = htons(encoded + encoded_rc - 3); + uint16_t tmp = htons(encoded + encoded_rc - 3); + memcpy(buffer + 1, &tmp, sizeof(tmp)); } else { - *(uint16_t*) buffer = htons(encoded + encoded_rc - 2); + uint16_t tmp = htons(encoded + encoded_rc - 2); + memcpy(buffer, &tmp, sizeof(tmp)); } return (encoded + encoded_rc); diff --git a/openair3/NAS/COMMON/UTIL/TLVDecoder.h b/openair3/NAS/COMMON/UTIL/TLVDecoder.h index e8dce87d8d..941cbd850b 100644 --- a/openair3/NAS/COMMON/UTIL/TLVDecoder.h +++ b/openair3/NAS/COMMON/UTIL/TLVDecoder.h @@ -41,9 +41,13 @@ vALUE = ntohl(*(uint32_t*)(bUFFER)) >> 8; \ sIZE += sizeof(uint8_t) + sizeof(uint16_t) -#define DECODE_U32(bUFFER, vALUE, sIZE) \ - vALUE = ntohl(*(uint32_t*)(bUFFER)); \ - sIZE += sizeof(uint32_t) +#define DECODE_U32(bUFFER, vALUE, sIZE) \ + { \ + uint32_t v; \ + memcpy(&v, bUFFER, sizeof(v)); \ + vALUE = ntohl(v); \ + } \ + sIZE += sizeof(uint32_t) #if (BYTE_ORDER == LITTLE_ENDIAN) # define DECODE_LENGTH_U16(bUFFER, vALUE, sIZE) \ diff --git a/openair3/NAS/COMMON/UTIL/TLVEncoder.h b/openair3/NAS/COMMON/UTIL/TLVEncoder.h index df5b58a07f..a46de3fbba 100644 --- a/openair3/NAS/COMMON/UTIL/TLVEncoder.h +++ b/openair3/NAS/COMMON/UTIL/TLVEncoder.h @@ -36,9 +36,12 @@ *(uint32_t*)(buffer) = htonl(value); \ size += sizeof(uint8_t) + sizeof(uint16_t) -#define ENCODE_U32(buffer, value, size) \ - *(uint32_t*)(buffer) = htonl(value); \ - size += sizeof(uint32_t) +#define ENCODE_U32(buffer, value, size) \ + { \ + uint32_t tmp = htonl(value); \ + memcpy(buffer, &tmp, sizeof(tmp)); \ + } \ + size += sizeof(uint32_t) #define IES_ENCODE_U8(buffer, encoded, value) \ ENCODE_U8(buffer + encoded, value, encoded) diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.c b/openair3/NAS/NR_UE/nr_nas_msg_sim.c index e20a0fc99e..e57e3800de 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg_sim.c +++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.c @@ -883,7 +883,9 @@ uint8_t get_msg_type(uint8_t *pdu_buffer, uint32_t length) { msg_type = ((mm_msg_header_t *)(pdu_buffer + offset))->message_type; if (msg_type == FGS_DOWNLINK_NAS_TRANSPORT) { - msg_type = ((dl_nas_transport_t *)(pdu_buffer+ offset))->sm_nas_msg_header.message_type; + dl_nas_transport_t tmp; + memcpy(&tmp, pdu_buffer + offset, sizeof(tmp)); + msg_type = tmp.sm_nas_msg_header.message_type; } } } else { // plain 5GS NAS message diff --git a/openshift/oai-clang-bc.yaml b/openshift/oai-clang-bc.yaml new file mode 100644 index 0000000000..f882df8700 --- /dev/null +++ b/openshift/oai-clang-bc.yaml @@ -0,0 +1,39 @@ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ +#--------------------------------------------------------------------- + +kind: BuildConfig +apiVersion: build.openshift.io/v1 +metadata: + name: "oai-clang" +spec: + runPolicy: "Serial" + nodeSelector: + kubernetes.io/hostname: theseus + source: + type: "Binary" + strategy: + dockerStrategy: + dockerfilePath: "docker/Dockerfile.clang.rhel8.2" + output: + to: + kind: "ImageStreamTag" + name: "oai-clang:latest" diff --git a/openshift/oai-clang-is.yaml b/openshift/oai-clang-is.yaml new file mode 100644 index 0000000000..d1d4c477f4 --- /dev/null +++ b/openshift/oai-clang-is.yaml @@ -0,0 +1,30 @@ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ +#--------------------------------------------------------------------- +# +apiVersion: image.openshift.io/v1 +kind: ImageStream +metadata: + name: oai-clang + namespace: oaicicd-ran +spec: + lookupPolicy: + local: true