From 5a7f2275138a30c95444d950627cdda3cd802f9b Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 8 Sep 2022 10:00:23 -0400 Subject: [PATCH 1/3] Change LDPC decoder rate based on round/rv --- openair1/PHY/CODING/coding_defs.h | 7 ++++ openair1/PHY/CODING/nr_rate_matching.c | 33 +++++++++++++++++++ openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 6 ++++ .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 6 ++++ .../PHY/NR_UE_TRANSPORT/nr_transport_ue.h | 3 ++ openair1/PHY/defs_gNB.h | 3 ++ 6 files changed, 58 insertions(+) diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h index 1854f28fa7..2f5749df07 100644 --- a/openair1/PHY/CODING/coding_defs.h +++ b/openair1/PHY/CODING/coding_defs.h @@ -472,6 +472,13 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f); void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f); +int nr_get_R_ldpc_decoder(int rvidx, + int E, + int BG, + int Z, + int *llrLen, + int round); + int nr_rate_matching_ldpc(uint32_t Tbslbrm, uint8_t BG, uint16_t Z, diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c index c99bd02fb2..ac3ad1bbea 100644 --- a/openair1/PHY/CODING/nr_rate_matching.c +++ b/openair1/PHY/CODING/nr_rate_matching.c @@ -386,6 +386,39 @@ void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f) } +int nr_get_R_ldpc_decoder(int rvidx, + int E, + int BG, + int Z, + int *llrLen, + int round) { + AssertFatal(BG == 1 || BG == 2, "Unknown BG %d\n", BG); + + int Ncb = (BG==1)?(66*Z):(50*Z); + int infoBits = (index_k0[BG-1][rvidx] * Z + E); + + if (round == 0) *llrLen = infoBits; + if (infoBits > Ncb) infoBits = Ncb; + if (infoBits > *llrLen) *llrLen = infoBits; + + int sysBits = (BG==1)?(22*Z):(10*Z); + float decoderR = (float)sysBits/(infoBits + 2*Z); + + if (BG == 2) + if (decoderR < 0.3333) + return 15; + else if (decoderR < 0.6667) + return 13; + else + return 23; + else + if (decoderR < 0.6667) + return 13; + else if (decoderR < 0.8889) + return 23; + else + return 89; +} int nr_rate_matching_ldpc(uint32_t Tbslbrm, uint8_t BG, diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index e9038f25d8..ff7706d0f5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -234,6 +234,12 @@ void nr_processULSegment(void* arg) { short* ulsch_llr = rdata->ulsch_llr; int max_ldpc_iterations = p_decoderParms->numMaxIter; int8_t llrProcBuf[OAI_UL_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))); + p_decoderParms->R = nr_get_R_ldpc_decoder(rv_index, + E, + p_decoderParms->BG, + p_decoderParms->Z, + &ulsch_harq->llrLen, + ulsch_harq->round); int16_t z [68*384 + 16] __attribute__ ((aligned(16))); int8_t l [68*384 + 16] __attribute__ ((aligned(16))); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 0087a307ef..bba37a34c3 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -251,6 +251,12 @@ void nr_processDLSegment(void* arg) { short* dlsch_llr = rdata->dlsch_llr; rdata->decodeIterations = dlsch->max_ldpc_iterations + 1; int8_t llrProcBuf[OAI_UL_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))); + p_decoderParms->R = nr_get_R_ldpc_decoder(rdata->rv_index, + E, + p_decoderParms->BG, + p_decoderParms->Z, + &harq_process->llrLen, + harq_process->DLround); int16_t z [68*384 + 16] __attribute__ ((aligned(16))); int8_t l [68*384 + 16] __attribute__ ((aligned(16))); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h index 96f31a1624..dc9ca67de4 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h @@ -259,6 +259,9 @@ typedef struct { uint16_t dlDmrsScramblingId; /// PDU BITMAP uint16_t pduBitmap; + /// Last index of LLR buffer that contains information. + /// Used for computing LDPC decoder R + int llrLen; } NR_DL_UE_HARQ_t; typedef struct { diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 675c41c6be..c60baf07ef 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -337,6 +337,9 @@ typedef struct { int16_t q_RI[MAX_RI_PAYLOAD]; /// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled uint8_t h[MAX_NUM_CHANNEL_BITS]; + /// Last index of LLR buffer that contains information. + /// Used for computing LDPC decoder R + int llrLen; ////////////////////////////////////////////////////////////// } NR_UL_gNB_HARQ_t; From f3ee87416d4beaf11d8a69e1b4a33fb6c6ad600d Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 15 Sep 2022 12:24:08 -0400 Subject: [PATCH 2/3] Remove old decoder R computations --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 18 ------------------ .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 16 ---------------- 2 files changed, 34 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index ff7706d0f5..4118145f64 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -471,26 +471,8 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, int kc; if (p_decParams->BG == 2){ kc = 52; - if (Coderate < 0.3333) { - p_decParams->R = 15; - } - else if (Coderate <0.6667) { - p_decParams->R = 13; - } - else { - p_decParams->R = 23; - } } else { kc = 68; - if (Coderate < 0.6667) { - p_decParams->R = 13; - } - else if (Coderate <0.8889) { - p_decParams->R = 23; - } - else { - p_decParams->R = 89; - } } NR_gNB_SCH_STATS_t *stats=NULL; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index bba37a34c3..e858e8d564 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -482,25 +482,9 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, if ((A <=292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) { p_decParams->BG = 2; kc = 52; - - if (Coderate < 0.3333) { - p_decParams->R = 15; - } else if (Coderate <0.6667) { - p_decParams->R = 13; - } else { - p_decParams->R = 23; - } } else { p_decParams->BG = 1; kc = 68; - - if (Coderate < 0.6667) { - p_decParams->R = 13; - } else if (Coderate <0.8889) { - p_decParams->R = 23; - } else { - p_decParams->R = 89; - } } if (harq_process->first_rx == 1) { From d5cdf6d3d858bf9f6df5f4a0deec7b43bae61daa Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 28 Sep 2022 16:57:26 +0200 Subject: [PATCH 3/3] Update timing thresholds --- ci-scripts/datalog_rt_stats.1x1.60.yaml | 8 ++++---- ci-scripts/datalog_rt_stats.default.yaml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ci-scripts/datalog_rt_stats.1x1.60.yaml b/ci-scripts/datalog_rt_stats.1x1.60.yaml index 264b38775a..492a3bd8bf 100644 --- a/ci-scripts/datalog_rt_stats.1x1.60.yaml +++ b/ci-scripts/datalog_rt_stats.1x1.60.yaml @@ -13,12 +13,12 @@ Ref : feptx_total : 59.0 L1 Tx processing : 210.0 DLSCH encoding : 129.0 - L1 Rx processing : 287.0 + L1 Rx processing : 359.0 PUSCH inner-receiver : 166.0 - PUSCH decoding : 176.0 - Schedule Response : 42.0 + PUSCH decoding : 270.0 + Schedule Response : 52.0 DL & UL scheduling timing : 13.0 - UL Indication : 55.0 + UL Indication : 65.0 Threshold : feprx : 1.25 feptx_prec : 1.25 diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml index cddb26d531..079da93fab 100644 --- a/ci-scripts/datalog_rt_stats.default.yaml +++ b/ci-scripts/datalog_rt_stats.default.yaml @@ -13,12 +13,12 @@ Ref : feptx_total : 62.0 L1 Tx processing : 170.0 DLSCH encoding : 118.0 - L1 Rx processing : 223.0 + L1 Rx processing : 275.0 PUSCH inner-receiver : 107.0 - PUSCH decoding : 170.0 - Schedule Response : 15.0 + PUSCH decoding : 246.0 + Schedule Response : 22.0 DL & UL scheduling timing : 10.0 - UL Indication : 27.0 + UL Indication : 34.0 Threshold : feprx : 1.25 feptx_prec : 1.25