dci_nr.c 81.1 KB
Newer Older
Agustin's avatar
Agustin committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/*
 * 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
 */

/*! \file PHY/LTE_TRANSPORT/dci_nr.c
 * \brief Implements PDCCH physical channel TX/RX procedures (36.211) and DCI encoding/decoding (36.212/36.213). Current LTE compliance V8.6 2009-03.
 * \author R. Knopp, A. Mico Pereperez
 * \date 2018
 * \version 0.1
 * \company Eurecom
 * \email: knopp@eurecom.fr
 * \note
 * \warning
 */
32

Agustin's avatar
Agustin committed
33
#ifdef USER_MODE
34 35 36
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
Agustin's avatar
Agustin committed
37
#endif
38

39 40
#include <LAYER2/NR_MAC_UE/mac_defs.h>
#include <LAYER2/NR_MAC_UE/mac_proto.h>
41 42
#include "executables/softmodem-common.h"

43
#include "nr_transport_proto_ue.h"
hongzhi wang's avatar
hongzhi wang committed
44
#include "PHY/CODING/nrPolar_tools/nr_polar_dci_defs.h"
hongzhi wang's avatar
hongzhi wang committed
45 46
#include "PHY/phy_extern_nr_ue.h"
#include "PHY/CODING/coding_extern.h"
Agustin's avatar
Agustin committed
47
#include "PHY/sse_intrin.h"
Francesco Mani's avatar
Francesco Mani committed
48
#include "PHY/NR_TRANSPORT/nr_dci.h"
Agustin's avatar
Agustin committed
49

50
#include "assertions.h"
Agustin's avatar
Agustin committed
51 52
#include "T.h"

53
//#define DEBUG_DCI_DECODING 1
Agustin's avatar
Agustin committed
54 55 56

//#define NR_LTE_PDCCH_DCI_SWITCH
#define NR_PDCCH_DCI_RUN              // activates new nr functions
Florian Kaltenberger's avatar
Florian Kaltenberger committed
57
//#define NR_PDCCH_DCI_DEBUG            // activates NR_PDCCH_DCI_DEBUG logs
58
#ifdef NR_PDCCH_DCI_DEBUG
59 60 61
#define LOG_DNL(a, ...) printf("\n\t\t<-NR_PDCCH_DCI_DEBUG (%s)-> " a, __func__, ##__VA_ARGS__ )
#define LOG_DD(a, ...) printf("\t<-NR_PDCCH_DCI_DEBUG (%s)-> " a, __func__, ##__VA_ARGS__ )
#define LOG_DDD(a, ...) printf("\t\t<-NR_PDCCH_DCI_DEBUG (%s)-> " a, __func__, ##__VA_ARGS__ )
62 63 64 65 66
#else
#define LOG_DNL(a...)
#define LOG_DD(a...)
#define LOG_DDD(a...)
#endif
Agustin's avatar
Agustin committed
67 68 69 70
#define NR_NBR_CORESET_ACT_BWP 3      // The number of CoreSets per BWP is limited to 3 (including initial CORESET: ControlResourceId 0)
#define NR_NBR_SEARCHSPACE_ACT_BWP 10 // The number of SearSpaces per BWP is limited to 10 (including initial SEARCHSPACE: SearchSpaceId 0)


71
#ifdef LOG_I
72 73
  #undef LOG_I
  #define LOG_I(A,B...) printf(B)
74
#endif
Agustin's avatar
Agustin committed
75

76
#ifdef NR_PDCCH_DCI_RUN
Agustin's avatar
Agustin committed
77

78 79

//static const int16_t conjugate[8]__attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1};
Agustin's avatar
Agustin committed
80 81


82 83
void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
                                       uint32_t *z,
hongzhi wang's avatar
hongzhi wang committed
84 85 86 87
                                       uint8_t coreset_time_dur,
                                       uint32_t coreset_nbr_rb,
                                       uint8_t reg_bundle_size_L,
                                       uint8_t coreset_interleaver_size_R,
rmagueta's avatar
rmagueta committed
88 89 90 91
                                       uint8_t n_shift,
                                       uint8_t number_of_candidates,
                                       uint16_t *CCE,
                                       uint8_t *L) {
92 93 94 95
  /*
   * This function will do demapping and deinterleaving from llr containing demodulated symbols
   * Demapping will regroup in REG and bundles
   * Deinterleaving will order the bundles
96
   *
97 98 99
   * In the following example we can see the process. The llr contains the demodulated IQs, but they are not ordered from REG 0,1,2,..
   * In e_rx (z) we will order the REG ids and group them into bundles.
   * Then we will put the bundles in the correct order as indicated in subclause 7.3.2.2
100
   *
101 102 103 104 105 106 107 108
   llr --------------------------> e_rx (z) ----> e_rx (z)
   |   ...
   |   ...
   |   REG 26
   symbol 2    |   ...
   |   ...
   |   REG 5
   |   REG 2
109

110 111 112 113 114 115 116
   |   ...
   |   ...
   |   REG 25
   symbol 1    |   ...
   |   ...
   |   REG 4
   |   REG 1
117

118 119 120 121 122 123 124 125 126
   |   ...
   |   ...                           ...              ...
   |   REG 24 (bundle 7)             ...              ...
   symbol 0    |   ...                           bundle 3         bundle 6
   |   ...                           bundle 2         bundle 1
   |   REG 3                         bundle 1         bundle 7
   |   REG 0  (bundle 0)             bundle 0         bundle 0

  */
rmagueta's avatar
rmagueta committed
127 128 129
  int c = 0, r = 0;
  uint16_t bundle_j = 0, f_bundle_j = 0, f_reg = 0;
  uint32_t coreset_C = 0;
hongzhi wang's avatar
hongzhi wang committed
130 131
  uint16_t index_z, index_llr;
  int coreset_interleaved = 0;
132

rmagueta's avatar
rmagueta committed
133 134
  if (reg_bundle_size_L != 0) { // interleaving will be done only if reg_bundle_size_L != 0
    coreset_interleaved = 1;
135
    coreset_C = (uint32_t) (coreset_nbr_rb / (coreset_interleaver_size_R * reg_bundle_size_L));
hongzhi wang's avatar
hongzhi wang committed
136
  } else {
rmagueta's avatar
rmagueta committed
137
    reg_bundle_size_L = 6;
hongzhi wang's avatar
hongzhi wang committed
138
  }
Agustin's avatar
Agustin committed
139

rmagueta's avatar
rmagueta committed
140

141
  int f_bundle_j_list[NR_MAX_PDCCH_AGG_LEVEL] = {};
rmagueta's avatar
rmagueta committed
142

143
  for (int reg = 0; reg < coreset_nbr_rb; reg++) {
rmagueta's avatar
rmagueta committed
144
    if ((reg % reg_bundle_size_L) == 0) {
hongzhi wang's avatar
hongzhi wang committed
145
      if (r == coreset_interleaver_size_R) {
rmagueta's avatar
rmagueta committed
146
        r = 0;
hongzhi wang's avatar
hongzhi wang committed
147
        c++;
Agustin's avatar
Agustin committed
148
      }
149

rmagueta's avatar
rmagueta committed
150
      bundle_j = (c * coreset_interleaver_size_R) + r;
151
      f_bundle_j = ((r * coreset_C) + c + n_shift) % (coreset_nbr_rb / reg_bundle_size_L);
rmagueta's avatar
rmagueta committed
152 153 154 155 156 157 158 159

      if (coreset_interleaved == 0) f_bundle_j = bundle_j;

      f_bundle_j_list[reg / 6] = f_bundle_j;

    }
    if ((reg % reg_bundle_size_L) == 0) r++;
  }
160

rmagueta's avatar
rmagueta committed
161 162
  // Get cce_list indices by reg_idx in ascending order
  int f_bundle_j_list_id = 0;
163
  int f_bundle_j_list_ord[NR_MAX_PDCCH_AGG_LEVEL] = {};
rmagueta's avatar
rmagueta committed
164 165
  for (int c_id = 0; c_id < number_of_candidates; c_id++ ) {
    f_bundle_j_list_id = CCE[c_id];
166
    for (int p = 0; p < NR_MAX_PDCCH_AGG_LEVEL; p++) {
rmagueta's avatar
rmagueta committed
167 168 169 170 171 172 173
      for (int p2 = CCE[c_id]; p2 < CCE[c_id] + L[c_id]; p2++) {
        if (f_bundle_j_list[p2] == p) {
          f_bundle_j_list_ord[f_bundle_j_list_id] = p;
          f_bundle_j_list_id++;
          break;
        }
      }
Agustin's avatar
Agustin committed
174
    }
rmagueta's avatar
rmagueta committed
175 176
  }

177 178 179 180 181
  int rb = 0;
  for (int c_id = 0; c_id < number_of_candidates; c_id++ ) {
    for (int symbol_idx = 0; symbol_idx < coreset_time_dur; symbol_idx++) {
      for (int cce_count = CCE[c_id/coreset_time_dur]+c_id%coreset_time_dur; cce_count < CCE[c_id/coreset_time_dur]+c_id%coreset_time_dur+L[c_id]; cce_count += coreset_time_dur) {
        for (int reg_in_cce_idx = 0; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx++) {
182

183 184 185
          f_reg = (f_bundle_j_list_ord[cce_count] * reg_bundle_size_L) + reg_in_cce_idx;
          index_z = 9 * rb;
          index_llr = (uint16_t) (f_reg + symbol_idx * coreset_nbr_rb) * 9;
186

187 188
          for (int i = 0; i < 9; i++) {
            z[index_z + i] = llr[index_llr + i];
189
#ifdef NR_PDCCH_DCI_DEBUG
190 191 192
            LOG_I(PHY,"[cce_count=%d,reg_in_cce_idx=%d,bundle_j=%d,symbol_idx=%d,candidate=%d] z[%d]=(%d,%d) <-> \t[f_reg=%d,fbundle_j=%d] llr[%d]=(%d,%d) \n",
                  cce_count,reg_in_cce_idx,bundle_j,symbol_idx,c_id,(index_z + i),*(int16_t *) &z[index_z + i],*(1 + (int16_t *) &z[index_z + i]),
                   f_reg,f_bundle_j,(index_llr + i),*(int16_t *) &llr[index_llr + i], *(1 + (int16_t *) &llr[index_llr + i]));
193
#endif
194 195 196 197
          }
          rb++;
        }
      }
hongzhi wang's avatar
hongzhi wang committed
198
    }
Agustin's avatar
Agustin committed
199
  }
hongzhi wang's avatar
hongzhi wang committed
200
}
Agustin's avatar
Agustin committed
201 202 203 204 205

#endif

#ifdef NR_PDCCH_DCI_RUN
int32_t nr_pdcch_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp,
206 207
                     int16_t *pdcch_llr, uint8_t symbol,uint32_t coreset_nbr_rb) {
  int16_t *rxF = (int16_t *) &rxdataF_comp[0][(symbol * coreset_nbr_rb * 12)];
208
  int32_t i;
209 210
  int16_t *pdcch_llrp;
  pdcch_llrp = &pdcch_llr[2 * symbol * coreset_nbr_rb * 9];
Agustin's avatar
Agustin committed
211

212
  if (!pdcch_llrp) {
213
    LOG_E(PHY,"pdcch_qpsk_llr: llr is null, symbol %d\n", symbol);
214 215
    return (-1);
  }
216

217
  LOG_DDD("llr logs: pdcch qpsk llr for symbol %d (pos %d), llr offset %ld\n",symbol,(symbol*frame_parms->N_RB_DL*12),pdcch_llrp-pdcch_llr);
218

219 220 221
  //for (i = 0; i < (frame_parms->N_RB_DL * ((symbol == 0) ? 16 : 24)); i++) {
  for (i = 0; i < (coreset_nbr_rb * ((symbol == 0) ? 18 : 18)); i++) {
    if (*rxF > 31)
222
      *pdcch_llrp = 31;
223
    else if (*rxF < -32)
224
      *pdcch_llrp = -32;
225
    else
226
      *pdcch_llrp = (*rxF);
227

228
    LOG_DDD("llr logs: rb=%d i=%d *rxF:%d => *pdcch_llrp:%d\n",i/18,i,*rxF,*pdcch_llrp);
229
    rxF++;
230
    pdcch_llrp++;
231
  }
Agustin's avatar
Agustin committed
232

233
  return (0);
Agustin's avatar
Agustin committed
234 235 236 237
}
#endif


238
#if 0
Agustin's avatar
Agustin committed
239 240 241
int32_t pdcch_llr(NR_DL_FRAME_PARMS *frame_parms,
                  int32_t **rxdataF_comp,
                  char *pdcch_llr,
242 243
                  uint8_t symbol) {
  int16_t *rxF= (int16_t *) &rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
Agustin's avatar
Agustin committed
244 245 246 247 248
  int32_t i;
  char *pdcch_llr8;
  pdcch_llr8 = &pdcch_llr[2*symbol*frame_parms->N_RB_DL*12];

  if (!pdcch_llr8) {
249
    LOG_E(PHY,"pdcch_qpsk_llr: llr is null, symbol %d\n",symbol);
Agustin's avatar
Agustin committed
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
    return(-1);
  }

  //    printf("pdcch qpsk llr for symbol %d (pos %d), llr offset %d\n",symbol,(symbol*frame_parms->N_RB_DL*12),pdcch_llr8-pdcch_llr);

  for (i=0; i<(frame_parms->N_RB_DL*((symbol==0) ? 16 : 24)); i++) {
    if (*rxF>31)
      *pdcch_llr8=31;
    else if (*rxF<-32)
      *pdcch_llr8=-32;
    else
      *pdcch_llr8 = (char)(*rxF);

    //    printf("%d %d => %d\n",i,*rxF,*pdcch_llr8);
    rxF++;
    pdcch_llr8++;
  }

  return(0);
}
270
#endif
Agustin's avatar
Agustin committed
271 272 273 274

//__m128i avg128P;

//compute average channel_level on each (TX,RX) antenna pair
275
void nr_pdcch_channel_level(int32_t **dl_ch_estimates_ext,
Agustin's avatar
Agustin committed
276 277
                         NR_DL_FRAME_PARMS *frame_parms,
                         int32_t *avg,
278
                         uint8_t nb_rb) {
Agustin's avatar
Agustin committed
279
  int16_t rb;
280
  uint8_t aarx;
Agustin's avatar
Agustin committed
281 282 283 284 285 286 287
#if defined(__x86_64__) || defined(__i386__)
  __m128i *dl_ch128;
  __m128i avg128P;
#elif defined(__arm__)
  int16x8_t *dl_ch128;
  int32x4_t *avg128P;
#endif
288

289 290
  for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
    //clear average level
Agustin's avatar
Agustin committed
291
#if defined(__x86_64__) || defined(__i386__)
292 293
    avg128P = _mm_setzero_si128();
    dl_ch128=(__m128i *)&dl_ch_estimates_ext[aarx][0];
Agustin's avatar
Agustin committed
294
#elif defined(__arm__)
frtabu's avatar
frtabu committed
295
    dl_ch128=(int16x8_t *)&dl_ch_estimates_ext[aarx][0];
Agustin's avatar
Agustin committed
296
#endif
297

298
    for (rb=0; rb<(nb_rb*3)>>2; rb++) {
Agustin's avatar
Agustin committed
299
#if defined(__x86_64__) || defined(__i386__)
300 301 302
      avg128P = _mm_add_epi32(avg128P,_mm_madd_epi16(dl_ch128[0],dl_ch128[0]));
      avg128P = _mm_add_epi32(avg128P,_mm_madd_epi16(dl_ch128[1],dl_ch128[1]));
      avg128P = _mm_add_epi32(avg128P,_mm_madd_epi16(dl_ch128[2],dl_ch128[2]));
Agustin's avatar
Agustin committed
303 304
#elif defined(__arm__)
#endif
Raymond Knopp's avatar
Raymond Knopp committed
305
      //      for (int i=0;i<24;i+=2) printf("pdcch channel re %d (%d,%d)\n",(rb*12)+(i>>1),((int16_t*)dl_ch128)[i],((int16_t*)dl_ch128)[i+1]);
306 307
      dl_ch128+=3;
      /*
308 309 310 311 312
      if (rb==0) {
      print_shorts("dl_ch128",&dl_ch128[0]);
      print_shorts("dl_ch128",&dl_ch128[1]);
      print_shorts("dl_ch128",&dl_ch128[2]);
      }
313
      */
Agustin's avatar
Agustin committed
314
    }
315

316 317 318 319 320
    DevAssert( nb_rb );
    avg[aarx] = (((int32_t *)&avg128P)[0] +
                 ((int32_t *)&avg128P)[1] +
                 ((int32_t *)&avg128P)[2] +
                 ((int32_t *)&avg128P)[3])/(nb_rb*9);
321 322
    //            printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
  }
Agustin's avatar
Agustin committed
323 324 325 326 327 328 329 330

#if defined(__x86_64__) || defined(__i386__)
  _mm_empty();
  _m_empty();
#endif
}

#if defined(__x86_64) || defined(__i386__)
331
  __m128i mmtmpPD0,mmtmpPD1,mmtmpPD2,mmtmpPD3;
Agustin's avatar
Agustin committed
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
#elif defined(__arm__)

#endif




#ifdef NR_PDCCH_DCI_RUN
// This function will extract the mapped DM-RS PDCCH REs as per 38.211 Section 7.4.1.3.2 (Mapping to physical resources)
void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
                                 int32_t **dl_ch_estimates,
                                 int32_t **rxdataF_ext,
                                 int32_t **dl_ch_estimates_ext,
                                 uint8_t symbol,
                                 NR_DL_FRAME_PARMS *frame_parms,
347
                                 uint8_t *coreset_freq_dom,
Agustin's avatar
Agustin committed
348 349
                                 uint32_t coreset_nbr_rb,
                                 uint32_t n_BWP_start) {
350 351 352 353 354 355 356 357 358 359
  /*
   * This function is demapping DM-RS PDCCH RE
   * Implementing 38.211 Section 7.4.1.3.2 Mapping to physical resources
   * PDCCH DM-RS signals are mapped on RE a_k_l where:
   * k = 12*n + 4*kprime + 1
   * n=0,1,..
   * kprime=0,1,2
   * According to this equations, DM-RS PDCCH are mapped on k where k%12==1 || k%12==5 || k%12==9
   *
   */
Agustin's avatar
Agustin committed
360
  // the bitmap coreset_frq_domain contains 45 bits
361
#define CORESET_FREQ_DOMAIN_BITMAP_SIZE   45
Agustin's avatar
Agustin committed
362
  // each bit is associated to 6 RBs
363 364
#define BIT_TO_NBR_RB_CORESET_FREQ_DOMAIN  6
#define NBR_RE_PER_RB_WITH_DMRS           12
Agustin's avatar
Agustin committed
365
  // after removing the 3 DMRS RE, the RB contains 9 RE with PDCCH
366
#define NBR_RE_PER_RB_WITHOUT_DMRS         9
367 368
  uint16_t c_rb, nb_rb = 0;
  //uint8_t rb_count_bit;
cig's avatar
cig committed
369
  uint8_t i, j, aarx;
Agustin's avatar
Agustin committed
370
  int32_t *dl_ch0, *dl_ch0_ext, *rxF, *rxF_ext;
371

372
#ifdef DEBUG_DCI_DECODING
373
  uint8_t symbol_mod = (symbol >= (7 - frame_parms->Ncp)) ? symbol - (7 - frame_parms->Ncp) : symbol;
374 375
  LOG_I(PHY, "extract_rbs_single: symbol_mod %d\n",symbol_mod);
#endif
Agustin's avatar
Agustin committed
376 377

  for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
378 379
    dl_ch0 = &dl_ch_estimates[aarx][0];
    LOG_DDD("dl_ch0 = &dl_ch_estimates[aarx = (%d)][0]\n",aarx);
Agustin's avatar
Agustin committed
380

381
    dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITH_DMRS)];
382
    LOG_DDD("dl_ch0_ext = &dl_ch_estimates_ext[aarx = (%d)][symbol * (frame_parms->N_RB_DL * 9) = (%d)]\n",
383
           aarx,symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITH_DMRS));
384
    rxF_ext = &rxdataF_ext[aarx][symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITH_DMRS)];
385
    LOG_DDD("rxF_ext = &rxdataF_ext[aarx = (%d)][symbol * (frame_parms->N_RB_DL * 9) = (%d)]\n",
386
           aarx,symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITH_DMRS));
387

388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
    /*
     * The following for loop handles treatment of PDCCH contained in table rxdataF (in frequency domain)
     * In NR the PDCCH IQ symbols are contained within RBs in the CORESET defined by higher layers which is located within the BWP
     * Lets consider that the first RB to be considered as part of the CORESET and part of the PDCCH is n_BWP_start
     * Several cases have to be handled differently as IQ symbols are situated in different parts of rxdataF:
     * 1. Number of RBs in the system bandwidth is even
     *    1.1 The RB is <  than the N_RB_DL/2 -> IQ symbols are in the second half of the rxdataF (from first_carrier_offset)
     *    1.2 The RB is >= than the N_RB_DL/2 -> IQ symbols are in the first half of the rxdataF (from element 0)
     * 2. Number of RBs in the system bandwidth is odd
     * (particular case when the RB with DC as it is treated differently: it is situated in symbol borders of rxdataF)
     *    2.1 The RB is <= than the N_RB_DL/2   -> IQ symbols are in the second half of the rxdataF (from first_carrier_offset)
     *    2.2 The RB is >  than the N_RB_DL/2+1 -> IQ symbols are in the first half of the rxdataF (from element 0 + 2nd half RB containing DC)
     *    2.3 The RB is == N_RB_DL/2+1          -> IQ symbols are in the lower border of the rxdataF for first 6 IQ element and the upper border of the rxdataF for the last 6 IQ elements
     * If the first RB containing PDCCH within the UE BWP and within the CORESET is higher than half of the system bandwidth (N_RB_DL),
     * then the IQ symbol is going to be found at the position 0+c_rb-N_RB_DL/2 in rxdataF and
     * we have to point the pointer at (1+c_rb-N_RB_DL/2) in rxdataF
     */
Agustin's avatar
Agustin committed
405

406
    LOG_DDD("n_BWP_start=%d, coreset_nbr_rb=%d\n",n_BWP_start,coreset_nbr_rb);
407
    int c_rb_by6;
rmagueta's avatar
rmagueta committed
408
    c_rb = 0;
409 410
    for (int rb=0;rb<coreset_nbr_rb;rb++,c_rb++) {
      c_rb_by6 = c_rb/6;
Francesco Mani's avatar
Francesco Mani committed
411

412
      // skip zeros in frequency domain bitmap
413
      while ((coreset_freq_dom[c_rb_by6>>3] & (1<<(7-(c_rb_by6&7)))) == 0) {
Francesco Mani's avatar
Francesco Mani committed
414 415 416
        c_rb+=6;
        c_rb_by6 = c_rb/6;
      }
Agustin's avatar
Agustin committed
417

418
      LOG_DDD("c_rb=%d\n",c_rb);
laurent's avatar
laurent committed
419
      rxF=NULL;
420

Agustin's avatar
Agustin committed
421
      // first we set initial conditions for pointer to rxdataF depending on the situation of the first RB within the CORESET (c_rb = n_BWP_start)
rmagueta's avatar
rmagueta committed
422
      if (((c_rb + n_BWP_start) < (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) == 0)) {
Agustin's avatar
Agustin committed
423
        //if RB to be treated is lower than middle system bandwidth then rxdataF pointed at (offset + c_br + symbol * ofdm_symbol_size): even case
rmagueta's avatar
rmagueta committed
424
        rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))+n_BWP_start*12];
425
        LOG_DDD("in even case c_rb (%d) is lower than half N_RB_DL -> rxF = &rxdataF[aarx = (%d)][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n",
426
               c_rb,aarx,(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))));
Agustin's avatar
Agustin committed
427
      }
428

rmagueta's avatar
rmagueta committed
429
      if (((c_rb + n_BWP_start) >= (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) == 0)) {
Agustin's avatar
Agustin committed
430 431
        // number of RBs is even  and c_rb is higher than half system bandwidth (we don't skip DC)
        // if these conditions are true the pointer has to be situated at the 1st part of the rxdataF
rmagueta's avatar
rmagueta committed
432
        rxF = &rxdataF[aarx][(12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size)))+n_BWP_start*12]; // we point at the 1st part of the rxdataF in symbol
433
        LOG_DDD("in even case c_rb (%d) is higher than half N_RB_DL (not DC) -> rxF = &rxdataF[aarx = (%d)][(12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n",
Agustin's avatar
Agustin committed
434 435 436
               c_rb,aarx,(12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size))));
        //rxF = &rxdataF[aarx][(1 + 12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size)))]; // we point at the 1st part of the rxdataF in symbol
        //#ifdef NR_PDCCH_DCI_DEBUG
437
        //  LOG_DDD("in even case c_rb (%d) is higher than half N_RB_DL (not DC) -> rxF = &rxdataF[aarx = (%d)][(1 + 12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n",
Agustin's avatar
Agustin committed
438 439 440
        //         c_rb,aarx,(1 + 12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size))));
        //#endif
      }
441

rmagueta's avatar
rmagueta committed
442
      if (((c_rb + n_BWP_start) < (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) != 0)) {
Agustin's avatar
Agustin committed
443
        //if RB to be treated is lower than middle system bandwidth then rxdataF pointed at (offset + c_br + symbol * ofdm_symbol_size): odd case
rmagueta's avatar
rmagueta committed
444
        rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))+n_BWP_start*12];
445 446
#ifdef NR_PDCCH_DCI_DEBUG
        LOG_D(PHY,"in odd case c_rb (%d) is lower or equal than half N_RB_DL -> rxF = &rxdataF[aarx = (%d)][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n",
447
               c_rb,aarx,(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))));
448
#endif
Agustin's avatar
Agustin committed
449
      }
450

rmagueta's avatar
rmagueta committed
451
      if (((c_rb + n_BWP_start) > (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) != 0)) {
Agustin's avatar
Agustin committed
452 453
        // number of RBs is odd  and   c_rb is higher than half system bandwidth + 1
        // if these conditions are true the pointer has to be situated at the 1st part of the rxdataF just after the first IQ symbols of the RB containing DC
rmagueta's avatar
rmagueta committed
454
        rxF = &rxdataF[aarx][(12*(c_rb - (frame_parms->N_RB_DL>>1)) - 6 + (symbol * (frame_parms->ofdm_symbol_size)))+n_BWP_start*12]; // we point at the 1st part of the rxdataF in symbol
455 456
#ifdef NR_PDCCH_DCI_DEBUG
        LOG_D(PHY,"in odd case c_rb (%d) is higher than half N_RB_DL (not DC) -> rxF = &rxdataF[aarx = (%d)][(12*(c_rb - frame_parms->N_RB_DL) - 5 + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n",
457
               c_rb,aarx,(12*(c_rb - (frame_parms->N_RB_DL>>1)) - 6 + (symbol * (frame_parms->ofdm_symbol_size))));
458
#endif
Agustin's avatar
Agustin committed
459
      }
460

rmagueta's avatar
rmagueta committed
461
      if (((c_rb + n_BWP_start) == (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) != 0)) { // treatment of RB containing the DC
Agustin's avatar
Agustin committed
462 463
        // if odd number RBs in system bandwidth and first RB to be treated is higher than middle system bandwidth (around DC)
        // we have to treat the RB in two parts: first part from i=0 to 5, the data is at the end of rxdataF (pointing at the end of the table)
rmagueta's avatar
rmagueta committed
464
        rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))+n_BWP_start*12];
465 466
#ifdef NR_PDCCH_DCI_DEBUG
        LOG_D(PHY,"in odd case c_rb (%d) is half N_RB_DL + 1 we treat DC case -> rxF = &rxdataF[aarx = (%d)][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))) = (%d)]\n",
467
               c_rb,aarx,(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))));
468
#endif
Agustin's avatar
Agustin committed
469
        j = 0;
470

Agustin's avatar
Agustin committed
471 472 473 474 475 476 477
        for (i = 0; i < 6; i++) { //treating first part of the RB note that i=5 would correspond to DC. We treat it in NR
          if ((i != 1) && (i != 5)) {
            dl_ch0_ext[j] = dl_ch0[i];
            rxF_ext[j++] = rxF[i];
            //              printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1]));
          }
        }
478

Agustin's avatar
Agustin committed
479 480
        // then we point at the begining of the symbol part of rxdataF do process second part of RB
        rxF = &rxdataF[aarx][((symbol * (frame_parms->ofdm_symbol_size)))]; // we point at the 1st part of the rxdataF in symbol
481 482
#ifdef NR_PDCCH_DCI_DEBUG
        LOG_D(PHY,"in odd case c_rb (%d) is half N_RB_DL +1 we treat DC case -> rxF = &rxdataF[aarx = (%d)][(symbol * (frame_parms->ofdm_symbol_size)) = (%d)]\n",
483
               c_rb,aarx,(symbol * (frame_parms->ofdm_symbol_size)));
484
#endif
Agustin's avatar
Agustin committed
485 486 487 488 489 490 491
        for (; i < 12; i++) {
          if ((i != 9)) {
            dl_ch0_ext[j] = dl_ch0[i];
            rxF_ext[j++] = rxF[(1 + i - 6)];
            //              printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1]));
          }
        }
492

Agustin's avatar
Agustin committed
493 494 495 496
        nb_rb++;
        dl_ch0_ext += NBR_RE_PER_RB_WITHOUT_DMRS;
        rxF_ext += NBR_RE_PER_RB_WITHOUT_DMRS;
        dl_ch0 += 12;
497 498 499
        //rxF += 7;
        //c_rb++;
        //n_BWP_start++; // We have to increment this variable here to be consequent in the for loop afterwards
Agustin's avatar
Agustin committed
500 501 502
        //}
      } else { // treatment of any RB that does not contain the DC
        j = 0;
503

Agustin's avatar
Agustin committed
504 505 506
        for (i = 0; i < 12; i++) {
          if ((i != 1) && (i != 5) && (i != 9)) {
            rxF_ext[j] = rxF[i];
507 508
#ifdef NR_PDCCH_DCI_DEBUG
            LOG_D(PHY,"RB[c_rb %d] \t RE[re %d] => rxF_ext[%d]=(%d,%d)\t rxF[%d]=(%d,%d)\n",
509 510
                   c_rb, i, j, *(short *) &rxF_ext[j],*(1 + (short *) &rxF_ext[j]), i,
                   *(short *) &rxF[i], *(1 + (short *) &rxF[i]));
511
#endif
hongzhi wang's avatar
hongzhi wang committed
512
            dl_ch0_ext[j] = dl_ch0[i];
513

514
            //LOG_DDD("ch %d => dl_ch0(%d,%d)\n", i, *(short *) &dl_ch0[i], *(1 + (short*) &dl_ch0[i]));
515
            //printf("\t-> dl_ch0[%d] => dl_ch0_ext[%d](%d,%d)\n", i,j, *(short *) &dl_ch0[i], *(1 + (short*) &dl_ch0[i]));
hongzhi wang's avatar
hongzhi wang committed
516
            j++;
Agustin's avatar
Agustin committed
517
          } else {
518 519
#ifdef NR_PDCCH_DCI_DEBUG
            LOG_D(PHY,"RB[c_rb %d] \t RE[re %d] => rxF_ext[%d]=(%d,%d)\t rxF[%d]=(%d,%d) \t\t <==> DM-RS PDCCH, this is a pilot symbol\n",
520 521
                   c_rb, i, j, *(short *) &rxF_ext[j], *(1 + (short *) &rxF_ext[j]), i,
                   *(short *) &rxF[i], *(1 + (short *) &rxF[i]));
522
#endif
Agustin's avatar
Agustin committed
523 524
          }
        }
525

Agustin's avatar
Agustin committed
526 527 528 529
        nb_rb++;
        dl_ch0_ext += NBR_RE_PER_RB_WITHOUT_DMRS;
        rxF_ext += NBR_RE_PER_RB_WITHOUT_DMRS;
        dl_ch0 += 12;
530
        //rxF += 12;
Agustin's avatar
Agustin committed
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
        //}
      }
    }
  }
}

#endif



void nr_pdcch_channel_compensation(int32_t **rxdataF_ext,
                                   int32_t **dl_ch_estimates_ext,
                                   int32_t **rxdataF_comp,
                                   int32_t **rho,
                                   NR_DL_FRAME_PARMS *frame_parms,
                                   uint8_t symbol,
                                   uint8_t output_shift,
548
                                   uint32_t coreset_nbr_rb) {
hongzhi wang's avatar
hongzhi wang committed
549
  uint16_t rb; //,nb_rb=20;
550
  uint8_t aarx;
551
#if defined(__x86_64__) || defined(__i386__)
552
  __m128i mmtmpP0,mmtmpP1,mmtmpP2,mmtmpP3;
553
#elif defined(__arm__)
554
  int16x8_t mmtmpP0,mmtmpP1,mmtmpP2,mmtmpP3;
555
#endif
hongzhi wang's avatar
hongzhi wang committed
556 557
#if defined(__x86_64__) || defined(__i386__)
  __m128i *dl_ch128,*rxdataF128,*rxdataF_comp128;
Agustin's avatar
Agustin committed
558 559 560
#elif defined(__arm__)
#endif

561
  for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
Agustin's avatar
Agustin committed
562
#if defined(__x86_64__) || defined(__i386__)
563 564 565 566 567
    dl_ch128          = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*coreset_nbr_rb*12];
    rxdataF128        = (__m128i *)&rxdataF_ext[aarx][symbol*coreset_nbr_rb*12];
    rxdataF_comp128   = (__m128i *)&rxdataF_comp[aarx][symbol*coreset_nbr_rb*12];
    //printf("ch compensation dl_ch ext addr %p \n", &dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*20*12]);
    //printf("rxdataf ext addr %p symbol %d\n", &rxdataF_ext[aarx][symbol*20*12], symbol);
568
    //printf("rxdataf_comp addr %p\n",&rxdataF_comp[(aatx<<1)+aarx][symbol*20*12]);
Agustin's avatar
Agustin committed
569
#elif defined(__arm__)
570
    // to be filled in
Agustin's avatar
Agustin committed
571
#endif
572

573 574
    for (rb=0; rb<(coreset_nbr_rb*3)>>2; rb++) {
      //printf("rb %d\n",rb);
Agustin's avatar
Agustin committed
575
#if defined(__x86_64__) || defined(__i386__)
576 577 578 579 580 581
      // multiply by conjugated channel
      mmtmpP0 = _mm_madd_epi16(dl_ch128[0],rxdataF128[0]);
      //  print_ints("re",&mmtmpP0);
      // mmtmpP0 contains real part of 4 consecutive outputs (32-bit)
      mmtmpP1 = _mm_shufflelo_epi16(dl_ch128[0],_MM_SHUFFLE(2,3,0,1));
      mmtmpP1 = _mm_shufflehi_epi16(mmtmpP1,_MM_SHUFFLE(2,3,0,1));
582
      mmtmpP1 = _mm_sign_epi16(mmtmpP1,*(__m128i *)&conjugate[0]);
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
      //  print_ints("im",&mmtmpP1);
      mmtmpP1 = _mm_madd_epi16(mmtmpP1,rxdataF128[0]);
      // mmtmpP1 contains imag part of 4 consecutive outputs (32-bit)
      mmtmpP0 = _mm_srai_epi32(mmtmpP0,output_shift);
      //  print_ints("re(shift)",&mmtmpP0);
      mmtmpP1 = _mm_srai_epi32(mmtmpP1,output_shift);
      //  print_ints("im(shift)",&mmtmpP1);
      mmtmpP2 = _mm_unpacklo_epi32(mmtmpP0,mmtmpP1);
      mmtmpP3 = _mm_unpackhi_epi32(mmtmpP0,mmtmpP1);
      //      print_ints("c0",&mmtmpP2);
      //  print_ints("c1",&mmtmpP3);
      rxdataF_comp128[0] = _mm_packs_epi32(mmtmpP2,mmtmpP3);
      //print_shorts("rx:",rxdataF128);
      //print_shorts("ch:",dl_ch128);
      //print_shorts("pack:",rxdataF_comp128);
      // multiply by conjugated channel
      mmtmpP0 = _mm_madd_epi16(dl_ch128[1],rxdataF128[1]);
      // mmtmpP0 contains real part of 4 consecutive outputs (32-bit)
      mmtmpP1 = _mm_shufflelo_epi16(dl_ch128[1],_MM_SHUFFLE(2,3,0,1));
      mmtmpP1 = _mm_shufflehi_epi16(mmtmpP1,_MM_SHUFFLE(2,3,0,1));
603
      mmtmpP1 = _mm_sign_epi16(mmtmpP1,*(__m128i *)&conjugate[0]);
604 605 606 607 608 609 610 611 612 613 614 615 616 617 618
      mmtmpP1 = _mm_madd_epi16(mmtmpP1,rxdataF128[1]);
      // mmtmpP1 contains imag part of 4 consecutive outputs (32-bit)
      mmtmpP0 = _mm_srai_epi32(mmtmpP0,output_shift);
      mmtmpP1 = _mm_srai_epi32(mmtmpP1,output_shift);
      mmtmpP2 = _mm_unpacklo_epi32(mmtmpP0,mmtmpP1);
      mmtmpP3 = _mm_unpackhi_epi32(mmtmpP0,mmtmpP1);
      rxdataF_comp128[1] = _mm_packs_epi32(mmtmpP2,mmtmpP3);
      //print_shorts("rx:",rxdataF128+1);
      //print_shorts("ch:",dl_ch128+1);
      //print_shorts("pack:",rxdataF_comp128+1);
      // multiply by conjugated channel
      mmtmpP0 = _mm_madd_epi16(dl_ch128[2],rxdataF128[2]);
      // mmtmpP0 contains real part of 4 consecutive outputs (32-bit)
      mmtmpP1 = _mm_shufflelo_epi16(dl_ch128[2],_MM_SHUFFLE(2,3,0,1));
      mmtmpP1 = _mm_shufflehi_epi16(mmtmpP1,_MM_SHUFFLE(2,3,0,1));
619
      mmtmpP1 = _mm_sign_epi16(mmtmpP1,*(__m128i *)&conjugate[0]);
620 621 622 623 624 625 626 627 628 629 630
      mmtmpP1 = _mm_madd_epi16(mmtmpP1,rxdataF128[2]);
      // mmtmpP1 contains imag part of 4 consecutive outputs (32-bit)
      mmtmpP0 = _mm_srai_epi32(mmtmpP0,output_shift);
      mmtmpP1 = _mm_srai_epi32(mmtmpP1,output_shift);
      mmtmpP2 = _mm_unpacklo_epi32(mmtmpP0,mmtmpP1);
      mmtmpP3 = _mm_unpackhi_epi32(mmtmpP0,mmtmpP1);
      rxdataF_comp128[2] = _mm_packs_epi32(mmtmpP2,mmtmpP3);
      ///////////////////////////////////////////////////////////////////////////////////////////////
      //print_shorts("rx:",rxdataF128+2);
      //print_shorts("ch:",dl_ch128+2);
      //print_shorts("pack:",rxdataF_comp128+2);
631

632
      for (int i=0; i<12 ; i++)
633
        LOG_DDD("rxdataF128[%d]=(%d,%d) X dlch[%d]=(%d,%d) rxdataF_comp128[%d]=(%d,%d)\n",
634 635 636 637
               (rb*12)+i, ((short *)rxdataF128)[i<<1],((short *)rxdataF128)[1+(i<<1)],
               (rb*12)+i, ((short *)dl_ch128)[i<<1],((short *)dl_ch128)[1+(i<<1)],
               (rb*12)+i, ((short *)rxdataF_comp128)[i<<1],((short *)rxdataF_comp128)[1+(i<<1)]);

638 639 640
      dl_ch128+=3;
      rxdataF128+=3;
      rxdataF_comp128+=3;
hongzhi wang's avatar
hongzhi wang committed
641
#elif defined(__arm__)
642
      // to be filled in
Agustin's avatar
Agustin committed
643
#endif
hongzhi wang's avatar
hongzhi wang committed
644
    }
645
  }
646

Agustin's avatar
Agustin committed
647
#if defined(__x86_64__) || defined(__i386__)
hongzhi wang's avatar
hongzhi wang committed
648 649
  _mm_empty();
  _m_empty();
Agustin's avatar
Agustin committed
650 651 652 653
#endif
}


654
void nr_pdcch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
Agustin's avatar
Agustin committed
655
                         int32_t **rxdataF_comp,
656
                         uint8_t symbol) {
Agustin's avatar
Agustin committed
657 658 659
#if defined(__x86_64__) || defined(__i386__)
  __m128i *rxdataF_comp128_0,*rxdataF_comp128_1;
#elif defined(__arm__)
660
  int16x8_t *rxdataF_comp128_0,*rxdataF_comp128_1;
Agustin's avatar
Agustin committed
661 662 663 664 665
#endif
  int32_t i;

  if (frame_parms->nb_antennas_rx>1) {
#if defined(__x86_64__) || defined(__i386__)
666 667
    rxdataF_comp128_0   = (__m128i *)&rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12];
    rxdataF_comp128_1   = (__m128i *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12];
Agustin's avatar
Agustin committed
668
#elif defined(__arm__)
669 670
    rxdataF_comp128_0   = (int16x8_t *)&rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12];
    rxdataF_comp128_1   = (int16x8_t *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12];
Agustin's avatar
Agustin committed
671
#endif
672

673 674
    // MRC on each re of rb
    for (i=0; i<frame_parms->N_RB_DL*3; i++) {
Agustin's avatar
Agustin committed
675
#if defined(__x86_64__) || defined(__i386__)
676
      rxdataF_comp128_0[i] = _mm_adds_epi16(_mm_srai_epi16(rxdataF_comp128_0[i],1),_mm_srai_epi16(rxdataF_comp128_1[i],1));
Agustin's avatar
Agustin committed
677
#elif defined(__arm__)
678
      rxdataF_comp128_0[i] = vhaddq_s16(rxdataF_comp128_0[i],rxdataF_comp128_1[i]);
Agustin's avatar
Agustin committed
679 680 681 682 683 684 685 686 687 688
#endif
    }
  }

#if defined(__x86_64__) || defined(__i386__)
  _mm_empty();
  _m_empty();
#endif
}

689
#if 0
Agustin's avatar
Agustin committed
690 691
void pdcch_siso(NR_DL_FRAME_PARMS *frame_parms,
                int32_t **rxdataF_comp,
692
                uint8_t l) {
Agustin's avatar
Agustin committed
693 694 695 696 697 698 699 700 701 702 703
  uint8_t rb,re,jj,ii;
  jj=0;
  ii=0;

  for (rb=0; rb<frame_parms->N_RB_DL; rb++) {
    for (re=0; re<12; re++) {
      rxdataF_comp[0][jj++] = rxdataF_comp[0][ii];
      ii++;
    }
  }
}
704
#endif
Agustin's avatar
Agustin committed
705 706

#ifdef NR_PDCCH_DCI_RUN
707
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
708
                    UE_nr_rxtx_proc_t *proc) {
709

710 711
  uint32_t frame = proc->frame_rx;
  uint32_t slot  = proc->nr_slot_rx;
712 713
  NR_UE_COMMON *common_vars      = &ue->common_vars;
  NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
714
  NR_UE_PDCCH *pdcch_vars        = ue->pdcch_vars[proc->thread_id][0];
715 716 717 718 719 720 721 722 723 724
  fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;

  uint8_t log2_maxh, aarx;
  int32_t avgs;
  int32_t avgP[4];
  for (int i=0;i<pdcch_vars->nb_search_space;i++) {

    rel15 = &pdcch_vars->pdcch_config[i];
    int n_rb,rb_offset;
    get_coreset_rballoc(rel15->coreset.frequency_domain_resource,&n_rb,&rb_offset);
cig's avatar
cig committed
725
    for (int s=rel15->coreset.StartSymbolIndex; s<(rel15->coreset.StartSymbolIndex+rel15->coreset.duration); s++) {
726
      LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
cig's avatar
cig committed
727

728
      nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
729 730 731 732 733 734 735 736 737
				  pdcch_vars->dl_ch_estimates,
				  pdcch_vars->rxdataF_ext,
				  pdcch_vars->dl_ch_estimates_ext,
				  s,
				  frame_parms,
				  rel15->coreset.frequency_domain_resource,
				  n_rb,
				  rel15->BWPStart);

738 739
      LOG_D(PHY,"we enter nr_pdcch_channel_level(avgP=%d) => compute channel level based on ofdm symbol 0, pdcch_vars[eNB_id]->dl_ch_estimates_ext\n",*avgP);
      LOG_D(PHY,"in nr_pdcch_channel_level(dl_ch_estimates_ext -> dl_ch_estimates_ext)\n");
740
      // compute channel level based on ofdm symbol 0
cig's avatar
cig committed
741 742 743 744
      nr_pdcch_channel_level(pdcch_vars->dl_ch_estimates_ext,
                             frame_parms,
                             avgP,
                             n_rb);
745
      avgs = 0;
cig's avatar
cig committed
746

747
      for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
cig's avatar
cig committed
748
        avgs = cmax(avgs, avgP[aarx]);
749

Francesco Mani's avatar
Francesco Mani committed
750
      log2_maxh = (log2_approx(avgs) / 2) + 5;  //+frame_parms->nb_antennas_rx;
751 752 753 754 755
#ifdef UE_DEBUG_TRACE
      LOG_D(PHY,"slot %d: pdcch log2_maxh = %d (%d,%d)\n",slot,log2_maxh,avgP[0],avgs);
#endif
#if T_TRACER
      T(T_UE_PHY_PDCCH_ENERGY, T_INT(0), T_INT(0), T_INT(frame%1024), T_INT(slot),
cig's avatar
cig committed
756
	    T_INT(avgP[0]), T_INT(avgP[1]), T_INT(avgP[2]), T_INT(avgP[3]));
757
#endif
758 759
      LOG_D(PHY,"we enter nr_pdcch_channel_compensation(log2_maxh=%d)\n",log2_maxh);
      LOG_D(PHY,"in nr_pdcch_channel_compensation(rxdataF_ext x dl_ch_estimates_ext -> rxdataF_comp)\n");
760 761
      // compute LLRs for ofdm symbol 0 only
      nr_pdcch_channel_compensation(pdcch_vars->rxdataF_ext,
cig's avatar
cig committed
762 763 764 765 766 767 768
                                    pdcch_vars->dl_ch_estimates_ext,
                                    pdcch_vars->rxdataF_comp,
                                    NULL,
                                    frame_parms,
                                    s,
                                    log2_maxh,
                                    n_rb); // log2_maxh+I0_shift
Francesco Mani's avatar
Francesco Mani committed
769
      if (frame_parms->nb_antennas_rx > 1) {
770
        LOG_D(PHY,"we enter nr_pdcch_detection_mrc(frame_parms->nb_antennas_rx=%d)\n", frame_parms->nb_antennas_rx);
cig's avatar
cig committed
771
        nr_pdcch_detection_mrc(frame_parms, pdcch_vars->rxdataF_comp,s);
Francesco Mani's avatar
Francesco Mani committed
772
      }
773

774 775
      LOG_D(PHY,"we enter nr_pdcch_llr(for symbol %d), pdcch_vars[eNB_id]->rxdataF_comp ---> pdcch_vars[eNB_id]->llr \n",s);
      LOG_D(PHY,"in nr_pdcch_llr(rxdataF_comp -> llr)\n");
Francesco Mani's avatar
Francesco Mani committed
776 777 778 779 780
      nr_pdcch_llr(frame_parms,
                   pdcch_vars->rxdataF_comp,
                   pdcch_vars->llr,
                   s,
                   n_rb);
781 782
#if T_TRACER
    
Francesco Mani's avatar
Francesco Mani committed
783 784 785
      //  T(T_UE_PHY_PDCCH_IQ, T_INT(frame_parms->N_RB_DL), T_INT(frame_parms->N_RB_DL),
      //  T_INT(n_pdcch_symbols),
      //  T_BUFFER(pdcch_vars[eNB_id]->rxdataF_comp, frame_parms->N_RB_DL*12*n_pdcch_symbols* 4));
786 787 788
    
#endif
#ifdef DEBUG_DCI_DECODING
Francesco Mani's avatar
Francesco Mani committed
789
      printf("demapping: slot %d, mi %d\n",slot,get_mi(frame_parms,slot));
790 791 792
#endif
    }

793
    LOG_D(PHY,"we enter nr_pdcch_demapping_deinterleaving()\n");
Francesco Mani's avatar
Francesco Mani committed
794 795 796 797 798 799
    nr_pdcch_demapping_deinterleaving((uint32_t *) pdcch_vars->llr,
                                      (uint32_t *) pdcch_vars->e_rx,
                                      rel15->coreset.duration,
                                      n_rb,
                                      rel15->coreset.RegBundleSize,
                                      rel15->coreset.InterleaverSize,
rmagueta's avatar
rmagueta committed
800 801 802 803
                                      rel15->coreset.ShiftIndex,
                                      rel15->number_of_candidates,
                                      rel15->CCE,
                                      rel15->L);
804
    /*
Francesco Mani's avatar
Francesco Mani committed
805 806 807 808 809 810 811
    nr_pdcch_unscrambling(rel15->rnti,
                          frame_parms,
                          slot,
                          pdcch_vars->e_rx,
                          rel15->coreset.duration*n_rb*9*2,
                          // get_nCCE(n_pdcch_symbols, frame_parms, mi) * 72,
                          rel15->coreset.pdcch_dmrs_scrambling_id);
812 813 814
    */
    LOG_D(PHY,"we end nr_pdcch_unscrambling()\n");
    LOG_D(PHY,"Ending nr_rx_pdcch() function\n");
Francesco Mani's avatar
Francesco Mani committed
815 816 817

  }
  return (0);
818
}
Agustin's avatar
Agustin committed
819 820 821

#endif

zhenghuangkun's avatar
zhenghuangkun committed
822 823
#if 0
void nr_pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
824
                      uint8_t nr_slot_rx,
825 826
                      uint8_t *e,
                      uint32_t length) {
Agustin's avatar
Agustin committed
827 828 829 830 831
  int i;
  uint8_t reset;
  uint32_t x1, x2, s=0;
  reset = 1;
  // x1 is set in lte_gold_generic
832
  x2 = (nr_slot_rx<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2
833

Agustin's avatar
Agustin committed
834 835 836 837 838 839
  for (i=0; i<length; i++) {
    if ((i&0x1f)==0) {
      s = lte_gold_generic(&x1, &x2, reset);
      //printf("lte_gold[%d]=%x\n",i,s);
      reset = 0;
    }
840

Agustin's avatar
Agustin committed
841 842 843 844 845
    //    printf("scrambling %d : e %d, c %d\n",i,e[i],((s>>(i&0x1f))&1));
    if (e[i] != 2) // <NIL> element is 2
      e[i] = (e[i]&1) ^ ((s>>(i&0x1f))&1);
  }
}
zhenghuangkun's avatar
zhenghuangkun committed
846
#endif
Agustin's avatar
Agustin committed
847 848 849 850


#ifdef NR_PDCCH_DCI_RUN

cig's avatar
cig committed
851 852 853 854 855
void nr_pdcch_unscrambling(int16_t *z,
                           uint16_t scrambling_RNTI,
                           uint32_t length,
                           uint16_t pdcch_DMRS_scrambling_id,
                           int16_t *z2) {
856 857 858
  int i;
  uint8_t reset;
  uint32_t x1, x2, s = 0;
859
  uint16_t n_id; //{0,1,...,65535}
cig's avatar
cig committed
860
  uint32_t rnti = (uint32_t) scrambling_RNTI;
861 862
  reset = 1;
  // x1 is set in first call to lte_gold_generic
cig's avatar
cig committed
863 864
  n_id = pdcch_DMRS_scrambling_id;
  x2 = ((rnti<<16) + n_id); //mod 2^31 is implicit //this is c_init in 38.211 v15.1.0 Section 7.3.2.3
865

cig's avatar
cig committed
866
  LOG_D(PHY,"PDCCH Unscrambling x2 %x : scrambling_RNTI %x\n", x2, rnti);
867

868 869 870 871 872
  for (i = 0; i < length; i++) {
    if ((i & 0x1f) == 0) {
      s = lte_gold_generic(&x1, &x2, reset);
      reset = 0;
    }
873

874 875
    if (((s >> (i % 32)) & 1) == 1) z2[i] = -z[i];
    else z2[i]=z[i];
876
  }
877
}
Agustin's avatar
Agustin committed
878

879
#endif
Agustin's avatar
Agustin committed
880 881 882


#ifdef NR_PDCCH_DCI_RUN
883 884 885 886 887
/* This function compares the received DCI bits with
 * re-encoded DCI bits and returns the number of mismatched bits
 */
uint16_t nr_dci_false_detection(uint64_t *dci,
                            int16_t *soft_in,
Sakthivel Velumani's avatar
Sakthivel Velumani committed
888
                            const t_nrPolar_params *polar_param,
889 890 891 892 893
                            int encoded_length,
                            int rnti) {

  uint32_t encoder_output[NR_MAX_DCI_SIZE_DWORD];
  polar_encoder_fast(dci, (void*)encoder_output, rnti, 1, polar_param);
894
  uint8_t *enout_p = (uint8_t*)encoder_output;
895 896 897 898 899 900 901 902 903 904 905 906 907 908 909
  uint16_t x = 0;

  for (int i=0; i<encoded_length/8; i++) {
    x += ( enout_p[i] & 1 ) ^ ( ( soft_in[i*8] >> 15 ) & 1);
    x += ( ( enout_p[i] >> 1 ) & 1 ) ^ ( ( soft_in[i*8+1] >> 15 ) & 1 );
    x += ( ( enout_p[i] >> 2 ) & 1 ) ^ ( ( soft_in[i*8+2] >> 15 ) & 1 );
    x += ( ( enout_p[i] >> 3 ) & 1 ) ^ ( ( soft_in[i*8+3] >> 15 ) & 1 );
    x += ( ( enout_p[i] >> 4 ) & 1 ) ^ ( ( soft_in[i*8+4] >> 15 ) & 1 );
    x += ( ( enout_p[i] >> 5 ) & 1 ) ^ ( ( soft_in[i*8+5] >> 15 ) & 1 );
    x += ( ( enout_p[i] >> 6 ) & 1 ) ^ ( ( soft_in[i*8+6] >> 15 ) & 1 );
    x += ( ( enout_p[i] >> 7 ) & 1 ) ^ ( ( soft_in[i*8+7] >> 15 ) & 1 );
  }
  return x;
}

910
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
911 912
                                  UE_nr_rxtx_proc_t *proc,
                                  fapi_nr_dci_indication_t *dci_ind) {
913

914
  NR_UE_PDCCH *pdcch_vars        = ue->pdcch_vars[proc->thread_id][0];
915 916 917 918
  fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
  for (int i=0;i<pdcch_vars->nb_search_space;i++) {

    rel15 = &pdcch_vars->pdcch_config[i];
919
    //int gNB_id = 0;
920
    int16_t tmp_e[16*108];
921
    rnti_t n_rnti;
922

923 924 925
    for (int j=0;j<rel15->number_of_candidates;j++) {
      int CCEind = rel15->CCE[j];
      int L = rel15->L[j];
cig's avatar
cig committed
926

927 928 929 930 931
      // Loop over possible DCI lengths
      for (int k = 0; k < rel15->num_dci_options; k++) {
        int dci_length = rel15->dci_length_options[k];
        uint64_t dci_estimation[2]= {0};
        const t_nrPolar_params *currentPtrDCI = nr_polar_params(NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L, 1, &ue->polarList);
cig's avatar
cig committed
932

933
        LOG_D(PHY, "Trying DCI candidate %d of %d number of candidates, CCE %d (%d), L %d\n", j, rel15->number_of_candidates, CCEind, CCEind*9*6*2, L);
cig's avatar
cig committed
934

935 936 937 938 939 940 941 942
        nr_pdcch_unscrambling(&pdcch_vars->e_rx[CCEind*108], rel15->coreset.scrambling_rnti, L*108, rel15->coreset.pdcch_dmrs_scrambling_id, tmp_e);

        #ifdef DEBUG_DCI_DECODING
          uint32_t * z = (uint32_t *) &pdcch_vars->e_rx[CCEind*108];
          for (int index_z = 0; index_z < 96; index_z++){
            for (int i=0; i<9; i++) {
              LOG_D(PHY,"z[%d]=(%d,%d) \n", (9*index_z + i), *(int16_t *) &z[index_z + i],*(1 + (int16_t *) &z[index_z + i]));
            }
cig's avatar
cig committed
943
          }
944 945 946 947 948 949 950 951 952 953
        #endif

        uint16_t crc = polar_decoder_int16(tmp_e,
                                          dci_estimation,
                                          1,
                                          currentPtrDCI);

        n_rnti = rel15->rnti;

        if (crc == n_rnti) {
Thomas Schlichter's avatar
Thomas Schlichter committed
954
          LOG_D(PHY, "(%i.%i) Received dci indication (rnti %x,dci format %d,n_CCE %d,payloadSize %d,payload %llx)\n",
rmagueta's avatar
rmagueta committed
955
                proc->frame_rx, proc->nr_slot_rx,n_rnti,rel15->dci_format_options[k],CCEind,dci_length,*(unsigned long long*)dci_estimation);
956
          uint16_t mb = nr_dci_false_detection(dci_estimation,tmp_e,currentPtrDCI,L*108,n_rnti);
957
          ue->dci_thres = (ue->dci_thres + mb) / 2;
958
          if (mb > (ue->dci_thres+20)) {
959
            LOG_W(PHY,"DCI false positive. Dropping DCI index %d. Mismatched bits: %d/%d. Current DCI threshold: %d\n",j,mb,L*108,ue->dci_thres);
960 961 962 963 964 965 966 967 968 969 970 971 972
            continue;
          }
          else {
            dci_ind->SFN = proc->frame_rx;
            dci_ind->slot = proc->nr_slot_rx;
            dci_ind->dci_list[dci_ind->number_of_dcis].rnti        = n_rnti;
            dci_ind->dci_list[dci_ind->number_of_dcis].n_CCE       = CCEind;
            dci_ind->dci_list[dci_ind->number_of_dcis].dci_format  = rel15->dci_format_options[k];
            dci_ind->dci_list[dci_ind->number_of_dcis].payloadSize = dci_length;
            memcpy((void*)dci_ind->dci_list[dci_ind->number_of_dcis].payloadBits,(void*)dci_estimation,8);
            dci_ind->number_of_dcis++;
            break;    // If DCI is found, no need to check for remaining DCI lengths
          }
973
        } else {
rmagueta's avatar
rmagueta committed
974
          LOG_D(PHY,"(%i.%i) Decoded crc %x does not match rnti %x for DCI format %d\n", proc->frame_rx, proc->nr_slot_rx, crc, n_rnti, rel15->dci_format_options[k]);
cig's avatar
cig committed
975
        }
976 977 978 979 980 981 982
      }
    }
  }
  return(dci_ind->number_of_dcis);
}

/*
983 984 985 986 987 988
void nr_dci_decoding_procedure0(int s,
                                int p,
                                int coreset_time_dur,
                                uint16_t coreset_nbr_rb,
                                NR_UE_PDCCH **pdcch_vars,
                                int do_common,
989
                                uint8_t nr_slot_rx,
990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
                                NR_DCI_ALLOC_t *dci_alloc,
                                int16_t eNB_id,
                                uint8_t current_thread_id,
                                NR_DL_FRAME_PARMS *frame_parms,
                                //uint8_t mi,
                                uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES],
                                uint8_t L,
                                NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t format_css,
                                NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t format_uss,
                                uint8_t sizeof_bits,
                                uint8_t sizeof_bytes,
                                uint8_t *dci_cnt,
                                crc_scrambled_t *crc_scrambled,
                                format_found_t *format_found,
                                uint16_t pdcch_DMRS_scrambling_id,
                                uint32_t *CCEmap0,
                                uint32_t *CCEmap1,
                                uint32_t *CCEmap2) {
Guy De Souza's avatar
Guy De Souza committed
1008
  uint32_t crc, CCEind, nCCE[3];
Agustin's avatar
Agustin committed
1009
  uint32_t *CCEmap = NULL, CCEmap_mask = 0;
hongzhi wang's avatar
hongzhi wang committed
1010
  uint8_t L2 = (1 << L);
Agustin's avatar
Agustin committed
1011 1012
  unsigned int Yk, nb_candidates = 0, i, m;
  unsigned int CCEmap_cand;
Guy De Souza's avatar
Guy De Souza committed
1013
  uint32_t decoderState=0;
Agustin's avatar
Agustin committed
1014
  // A[p], p is the current active CORESET
1015
  uint16_t A[3]= {39827,39829,39839};
Agustin's avatar
Agustin committed
1016 1017 1018
  //Table 10.1-2: Maximum number of PDCCH candidates    per slot and per serving cell as a function of the subcarrier spacing value 2^mu*15 KHz, mu {0,1,2,3}
  uint8_t m_max_slot_pdcch_Table10_1_2 [4] = {44,36,22,20};
  //Table 10.1-3: Maximum number of non-overlapped CCEs per slot and per serving cell as a function of the subcarrier spacing value 2^mu*15 KHz, mu {0,1,2,3}
yilmazt's avatar
yilmazt committed
1019
  //uint8_t cce_max_slot_pdcch_Table10_1_3 [4] = {56,56,48,32};
Agustin's avatar
Agustin committed
1020
  int coreset_nbr_cce_per_symbol=0;
1021
  LOG_DDD("format_found is %d \n", *format_found);
1022 1023
  //if (mode == NO_DCI) {
  //  #ifdef NR_PDCCH_DCI_DEBUG
1024
  //    LOG_DDD("skip DCI decoding: expect no DCIs at nr_slot_rx %d in current searchSpace\n", nr_slot_rx);
1025 1026 1027
  //  #endif
  //  return;
  //}
1028
  LOG_DDD("frequencyDomainResources=%lx, duration=%d\n",
1029 1030
         pdcch_vars[eNB_id]->coreset[p].frequencyDomainResources, pdcch_vars[eNB_id]->coreset[p].duration);

Agustin's avatar
Agustin committed
1031 1032 1033 1034 1035
  // nCCE = get_nCCE(pdcch_vars[eNB_id]->num_pdcch_symbols, frame_parms, mi);
  for (int i = 0; i < 45; i++) {
    // this loop counts each bit of the bit map coreset_freq_dom, and increments nbr_RB_coreset for each bit set to '1'
    if (((pdcch_vars[eNB_id]->coreset[p].frequencyDomainResources & 0x1FFFFFFFFFFF) >> i) & 0x1) coreset_nbr_cce_per_symbol++;
  }
1036

Agustin's avatar
Agustin committed
1037 1038 1039 1040 1041 1042
  nCCE[p] = pdcch_vars[eNB_id]->coreset[p].duration*coreset_nbr_cce_per_symbol; // 1 CCE = 6 RB
  // p is the current CORESET we are currently monitoring (among the 3 possible CORESETs in a BWP)
  // the number of CCE in the current CORESET is:
  //   the number of symbols in the CORESET (pdcch_vars[eNB_id]->coreset[p].duration)
  //   multiplied by the number of bits set to '1' in the frequencyDomainResources bitmap
  //   (1 bit set to '1' corresponds to 6 RB and 1 CCE = 6 RB)
1043
  LOG_DDD("nCCE[%d]=%d\n",p,nCCE[p]);
Agustin's avatar
Agustin committed
1044

1045 1046 1047 1048 1049 1050
  //  if (nCCE > get_nCCE(3, frame_parms, 1)) {
  //LOG_D(PHY,
  //"skip DCI decoding: nCCE=%d > get_nCCE(3,frame_parms,1)=%d\n",
  //nCCE, get_nCCE(3, frame_parms, 1));
  //return;
 // }
1051

1052 1053 1054 1055 1056 1057
//  if (nCCE < L2) {
//  LOG_D(PHY, "skip DCI decoding: nCCE=%d < L2=%d\n", nCCE, L2);
//  return;
//  }

//  if (mode == NO_DCI) {
1058 1059
//  LOG_D(PHY, "skip DCI decoding: expect no DCIs at nr_slot_rx %d\n",
//  nr_slot_rx);
1060 1061
//  return;
//  }
1062

Agustin's avatar
Agustin committed
1063 1064
  if (do_common == 1) {
    Yk = 0;
1065

Agustin's avatar
Agustin committed
1066
    if (pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.common_dci_formats == cformat2_0) {
1067 1068
      // for dci_format_2_0, the nb_candidates is obtained from a different variable
      switch (L2) {
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
        case 1:
          nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel1;
          break;

        case 2:
          nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel2;
          break;

        case 4:
          nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel4;
          break;

        case 8:
          nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel8;
          break;

        case 16:
          nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel16;
          break;

        default:
          break;
1091
      }
Agustin's avatar
Agustin committed
1092
    } else if (pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.common_dci_formats == cformat2_3) {
1093 1094
      // for dci_format_2_3, the nb_candidates is obtained from a different variable
      nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.srs_nrofCandidates;
Agustin's avatar
Agustin committed
1095 1096
    } else {
      nb_candidates = (L2 == 4) ? 4 : ((L2 == 8)? 2 : 1); // according to Table 10.1-1 (38.213 section 10.1)
1097
      LOG_DDD("we are in common searchSpace and nb_candidates=%u for L2=%d\n", nb_candidates, L2);
Agustin's avatar
Agustin committed
1098 1099 1100
    }
  } else {
    switch (L2) {
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122
      case 1:
        nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel1;
        break;

      case 2:
        nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel2;
        break;

      case 4:
        nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel4;
        break;

      case 8:
        nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel8;
        break;

      case 16:
        nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel16;
        break;

      default:
        break;
Agustin's avatar
Agustin committed
1123
    }
1124

Agustin's avatar
Agustin committed
1125 1126 1127 1128
    // Find first available in ue specific search space
    // according to procedure in Section 10.1 of 38.213
    // compute Yk
    Yk = (unsigned int) pdcch_vars[eNB_id]->crnti;
1129

1130
    for (i = 0; i <= nr_slot_rx; i++)
1131
      Yk = (Yk * A[p%3]) % 65537;
Agustin's avatar
Agustin committed
1132
  }
1133

1134
  LOG_DDD("L2(%d) | nCCE[%d](%d) | Yk(%u) | nb_candidates(%u)\n", L2, p, nCCE[p], Yk, nb_candidates);
1135 1136 1137
  //  for (CCEind=0;
  //    CCEind<nCCE2;
  //    CCEind+=(1<<L)) {
1138 1139
  //  if (nb_candidates * L2 > nCCE[p])
  //    nb_candidates = nCCE[p] / L2;
1140
  // In the next code line there is maybe a bug. The spec is not comparing Table 10.1-2 with nb_candidates, but with total number of candidates for all s and all p
1141
  int m_p_s_L_max = (m_max_slot_pdcch_Table10_1_2[1]<=nb_candidates ? m_max_slot_pdcch_Table10_1_2[1] : nb_candidates);
1142

Agustin's avatar
Agustin committed
1143
  if (L==4) m_p_s_L_max=1; // Table 10.1-2 is not defined for L=4
1144

1145
  if(0 <= L && L < 4) LOG_DDD("m_max_slot_pdcch_Table10_1_2(%d)=%d\n",L,m_max_slot_pdcch_Table10_1_2[L]);
1146

Agustin's avatar
Agustin committed
1147 1148
  for (m = 0; m < nb_candidates; m++) {
    int n_ci = 0;
1149

1150
    if (nCCE[p] < L2) return;
yilmazt's avatar
yilmazt committed
1151

1152 1153
  LOG_DDD("debug1(%d)=nCCE[p]/L2 | nCCE[%d](%d) | L2(%d)\n",nCCE[p] / L2,p,nCCE[p],L2);
  LOG_DDD("debug2(%d)=L2*m_p_s_L_max | L2(%d) | m_p_s_L_max(%d)\n",L2*m_p_s_L_max,L2,m_p_s_L_max);
yilmazt's avatar
yilmazt committed
1154
  CCEind = (((Yk + (uint16_t)(floor((m*nCCE[p])/(L2*m_p_s_L_max))) + n_ci) % (uint16_t)(floor(nCCE[p] / L2))) * L2);
frtabu's avatar
frtabu committed
1155
  LOG_DDD("CCEind(%u) = (((Yk(%u) + ((m(%u)*nCCE[p](%u))/(L2(%d)*m_p_s_L_max(%d)))) %% (nCCE[p] / L2)) * L2)\n",
1156
            CCEind,Yk,m,nCCE[p],L2,m_p_s_L_max);
frtabu's avatar
frtabu committed
1157
  LOG_DDD("n_candidate(m)=%u | CCEind=%u |",m,CCEind);
1158

Agustin's avatar
Agustin committed
1159 1160 1161 1162 1163 1164
    if (CCEind < 32)
      CCEmap = CCEmap0;
    else if (CCEind < 64)
      CCEmap = CCEmap1;
    else if (CCEind < 96)
      CCEmap = CCEmap2;
frtabu's avatar
frtabu committed
1165
    else AssertFatal(1==0,"Illegal CCEind %u (Yk %u, m %u, nCCE %u, L2 %u\n", CCEind, Yk, m, nCCE[p], L2);
1166

Agustin's avatar
Agustin committed
1167
    switch (L2) {
1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
      case 1:
        CCEmap_mask = (1 << (CCEind & 0x1f));
        break;

      case 2:
        CCEmap_mask = (3 << (CCEind & 0x1f));
        break;

      case 4:
        CCEmap_mask = (0xf << (CCEind & 0x1f));
        break;

      case 8:
        CCEmap_mask = (0xff << (CCEind & 0x1f));
        break;

      case 16:
        CCEmap_mask = (0xfff << (CCEind & 0x1f));
        break;

      default:
        LOG_E(PHY, "Illegal L2 value %d\n", L2);
        //mac_xface->macphy_exit("Illegal L2\n");
        return; // not reached
Agustin's avatar
Agustin committed
1192
    }
1193

Agustin's avatar
Agustin committed
1194 1195
    CCEmap_cand = (*CCEmap) & CCEmap_mask;
    // CCE is not allocated yet
1196
    LOG_DDD("CCEmap_cand=%u \n",CCEmap_cand);
1197

1198
    if (CCEmap_cand == 0) {
1199
#ifdef DEBUG_DCI_DECODING
1200

1201
      if (do_common == 1)
1202 1203
        LOG_I(PHY,"[DCI search nPdcch %d - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",
              pdcch_vars[eNB_id]->num_pdcch_symbols,m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask);
1204
      else
1205 1206 1207
        LOG_I(PHY,"[DCI search nPdcch %d - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x) format %d\n",
              pdcch_vars[eNB_id]->num_pdcch_symbols,m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask,format_uss);

1208
#endif
1209 1210
      LOG_DDD("... we enter function dci_decoding(sizeof_bits=%d L=%d) -----\n",sizeof_bits,L);
      LOG_DDD("... we have to replace this part of the code by polar decoding\n");
1211
      //      for (int m=0; m < (nCCE[p]*6*9*2); m++)
frtabu's avatar
frtabu committed
1212
      LOG_DDD("(polar decoding)-> polar intput (with coreset_time_dur=%d, coreset_nbr_rb=%d, p=%d, CCEind=%u): \n",
1213
             coreset_time_dur,coreset_nbr_rb,p,CCEind);
1214 1215 1216 1217 1218 1219
      
      //int reg_p=0,reg_e=0;
      //for (int m=0; m < (L2*6); m++){
      //reg_p = (((int)floor(m/coreset_time_dur))+((m%coreset_time_dur)*(L2*6/coreset_time_dur)))*9*2;
      //reg_e = m*9*2;
      //for (int i=0; i<9*2; i++){
1220
      //polar_input[reg_p+i] = (pdcch_vars[eNB_id]->e_rx[((CCEind*9*6*2) + reg_e + i)]>0) ? (1.0):(-1.0);
1221
      //polar_input[reg_e+i] = (pdcch_vars[eNB_id]->e_rx[((CCEind*9*6*2) + reg_e + i)]>0) ? (1/sqrt(2)):((-1)/sqrt(2));
1222 1223 1224 1225
      //printf("\t m=%d \tpolar_input[%d]=%lf <-> e_rx[%d]=%d\n",m,reg_e+i,polar_input[reg_e+i],
      //        ((CCEind*9*6*2) + reg_e + i),pdcch_vars[eNB_id]->e_rx[((CCEind*9*6*2) + reg_e + i)]);
      //printf("\t m=%d \tpolar_input[%d]=%lf <-> e_rx[%d]=%d\n",m,reg_p+i,polar_input[reg_p+i],
      //        ((CCEind*9*6*2) + reg_e + i),pdcch_vars[eNB_id]->e_rx[((CCEind*9*6*2) + reg_e + i)]);
1226 1227
      //}
      //}
1228

1229 1230 1231 1232 1233 1234
      //#ifdef NR_PDCCH_DCI_DEBUG
      //printf("\n");
      //int j=0;
      //uint32_t polar_hex[27] = {0};
      //for (int i=0; i<L2*9*6*2; i++){2
      //if ((i%32 == 0) && (i!=0)) j++;
1235
      //polar_hex[j] = (polar_hex[j]<<1) + ((polar_input[i]==-1)? 1:0);
1236 1237 1238 1239 1240
      //polar_hex[j] = polar_hex[j] + (((polar_input[i]==((-1)/sqrt(2)))?1:0)<<(i%32));
      //}
      //for (j=0;j<27;j++) LOG_DDD("polar_hex[%d]=%x\n",j,polar_hex[j]);
      //#endif
      
1241
      uint64_t dci_estimation[2]= {0};
Raymond Knopp's avatar
Raymond Knopp committed
1242
      const t_nrPolar_params *currentPtrDCI=nr_polar_params(1, sizeof_bits, L2,1);
1243
      decoderState = polar_decoder_int16(&pdcch_vars[eNB_id]->e_rx[CCEind*9*6*2],
1244
                                         dci_estimation,
1245
                                         1,
1246
                                         currentPtrDCI);
Guy De Souza's avatar
Guy De Souza committed
1247
      crc = decoderState;
1248
      //crc = (crc16(&dci_decoded_output[current_thread_id][0], sizeof_bits) >> 16) ^ extract_crc(&dci_decoded_output[current_thread_id][0], sizeof_bits);
1249 1250
      LOG_DDD("... we end function dci_decoding() with crc=%x\n",crc);
      LOG_DDD("... we have to replace this part of the code by polar decoding\n");
1251
#ifdef DEBUG_DCI_DECODING
1252
      LOG_DDD("(nr_dci_decoding_procedure0: crc =>%d\n",crc);
1253
#endif //uint16_t tc_rnti, uint16_t int_rnti, uint16_t sfi_rnti, uint16_t tpc_pusch_rnti, uint16_t tpc_pucch_rnti, uint16_t tpc_srs__rnti
1254 1255
      LOG_DDD("format_found=%d\n",*format_found);
      LOG_DDD("crc_scrambled=%d\n",*crc_scrambled);
1256 1257

      if (crc == crc_scrambled_values[_C_RNTI_])  {
1258 1259
        *crc_scrambled =_c_rnti;
        *format_found=1;
1260
      }
1261

1262
      if (crc == crc_scrambled_values[_CS_RNTI_])  {
1263 1264
        *crc_scrambled =_cs_rnti;
        *format_found=1;
1265
      }
1266

1267
      if (crc == crc_scrambled_values[_NEW_RNTI_])  {
1268 1269
        *crc_scrambled =_new_rnti;
        *format_found=1;
1270
      }
1271

1272
      if (crc == crc_scrambled_values[_TC_RNTI_])  {
1273 1274
        *crc_scrambled =_tc_rnti;
        *format_found=_format_1_0_found;
Agustin's avatar
Agustin committed
1275
      }
1276

1277
      if (crc == crc_scrambled_values[_P_RNTI_])  {
1278 1279
        *crc_scrambled =_p_rnti;
        *format_found=_format_1_0_found;
1280
      }
1281

1282
      if (crc == crc_scrambled_values[_SI_RNTI_])  {
1283 1284
        *crc_scrambled =_si_rnti;
        *format_found=_format_1_0_found;
1285
      }
1286

1287
      if (crc == crc_scrambled_values[_RA_RNTI_])  {
1288 1289
        *crc_scrambled =_ra_rnti;
        *format_found=_format_1_0_found;
1290
      }
1291

1292
      if (crc == crc_scrambled_values[_SP_CSI_RNTI_])  {
1293 1294
        *crc_scrambled =_sp_csi_rnti;
        *format_found=_format_0_1_found;
1295
      }
1296

1297
      if (crc == crc_scrambled_values[_SFI_RNTI_])  {
1298 1299
        *crc_scrambled =_sfi_rnti;
        *format_found=_format_2_0_found;
1300
      }
1301

1302
      if (crc == crc_scrambled_values[_INT_RNTI_])  {
1303 1304
        *crc_scrambled =_int_rnti;
        *format_found=_format_2_1_found;
1305
      }
1306

1307
      if (crc == crc_scrambled_values[_TPC_PUSCH_RNTI_]) {
1308 1309
        *crc_scrambled =_tpc_pusch_rnti;
        *format_found=_format_2_2_found;
1310
      }
1311

1312
      if (crc == crc_scrambled_values[_TPC_PUCCH_RNTI_]) {
1313 1314
        *crc_scrambled =_tpc_pucch_rnti;
        *format_found=_format_2_2_found;
1315
      }
1316

1317
      if (crc == crc_scrambled_values[_TPC_SRS_RNTI_]) {
1318 1319
        *crc_scrambled =_tpc_srs_rnti;
        *format_found=_format_2_3_found;
1320
      }
1321

1322

1323 1324
      LOG_DDD("format_found=%d\n",*format_found);
      LOG_DDD("crc_scrambled=%d\n",*crc_scrambled);
1325

1326
      if (*format_found!=255) {
1327 1328 1329 1330
        dci_alloc[*dci_cnt].dci_length = sizeof_bits;
        dci_alloc[*dci_cnt].rnti = crc;
        dci_alloc[*dci_cnt].L = L;
        dci_alloc[*dci_cnt].firstCCE = CCEind;
1331 1332
        memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_estimation,8);

1333
        LOG_DDD("rnti matches -> DCI FOUND !!! crc =>0x%x, sizeof_bits %d, sizeof_bytes %d \n",
1334
                dci_alloc[*dci_cnt].rnti, dci_alloc[*dci_cnt].dci_length, sizeof_bytes);
1335
        LOG_DDD("dci_cnt %d (format_css %d crc_scrambled %d) L %d, firstCCE %d pdu[0] 0x%lx pdu[1] 0x%lx \n",
1336 1337 1338 1339 1340 1341
                *dci_cnt, format_css,*crc_scrambled,dci_alloc[*dci_cnt].L, dci_alloc[*dci_cnt].firstCCE,dci_alloc[*dci_cnt].dci_pdu[0],dci_alloc[*dci_cnt].dci_pdu[1]);
        if ((format_css == cformat0_0_and_1_0) || (format_uss == uformat0_0_and_1_0)) {
          if ((*crc_scrambled == _p_rnti) || (*crc_scrambled == _si_rnti) || (*crc_scrambled == _ra_rnti)) {
            dci_alloc[*dci_cnt].format = format1_0;
            *dci_cnt = *dci_cnt + 1;
            *format_found=_format_1_0_found;
1342
            //      LOG_DDD("a format1_0=%d and dci_cnt=%d\n",*format_found,*dci_cnt);
1343 1344 1345 1346 1347
          } else {
            if ((dci_estimation[0]&1) == 0) {
              dci_alloc[*dci_cnt].format = format0_0;
              *dci_cnt = *dci_cnt + 1;
              *format_found=_format_0_0_found;
1348
              //        LOG_DDD("b format0_0=%d and dci_cnt=%d\n",*format_found,*dci_cnt);
1349 1350 1351 1352 1353 1354
            }

            if ((dci_estimation[0]&1) == 1) {
              dci_alloc[*dci_cnt].format = format1_0;
              *dci_cnt = *dci_cnt + 1;
              *format_found=_format_1_0_found;
1355
              //        LOG_DDD("c format1_0=%d and dci_cnt=%d\n",*format_found,*dci_cnt);
1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398
            }
          }
        }

        if (format_css == cformat2_0) {
          dci_alloc[*dci_cnt].format = format2_0;
          *dci_cnt = *dci_cnt + 1;
          *format_found=_format_2_0_found;
        }

        if (format_css == cformat2_1) {
          dci_alloc[*dci_cnt].format = format2_1;
          *dci_cnt = *dci_cnt + 1;
          *format_found=_format_2_1_found;
        }

        if (format_css == cformat2_2) {
          dci_alloc[*dci_cnt].format = format2_2;
          *dci_cnt = *dci_cnt + 1;
          *format_found=_format_2_2_found;
        }

        if (format_css == cformat2_3) {
          dci_alloc[*dci_cnt].format = format2_3;
          *dci_cnt = *dci_cnt + 1;
          *format_found=_format_2_3_found;
        }

        if (format_uss == uformat0_1_and_1_1) {
          if ((dci_estimation[0]&1) == 0) {
            dci_alloc[*dci_cnt].format = format0_1;
            *dci_cnt = *dci_cnt + 1;
            *format_found=_format_0_1_found;
          }

          if ((dci_estimation[0]&1) == 1) {
            dci_alloc[*dci_cnt].format = format1_1;
            *dci_cnt = *dci_cnt + 1;
            *format_found=_format_1_1_found;
          }
        }

        // store first nCCE of group for PUCCH transmission of ACK/NAK
1399
        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1400

1401 1402 1403 1404 1405 1406 1407 1408 1409
        //        if (crc == si_rnti) {
        //        dci_alloc[*dci_cnt].format = format_si;
        //        *dci_cnt = *dci_cnt + 1;
        //        } else if (crc == p_rnti) {
        //        dci_alloc[*dci_cnt].format = format_p;
        //        *dci_cnt = *dci_cnt + 1;
        //        } else if (crc == ra_rnti) {
        //        dci_alloc[*dci_cnt].format = format_ra;
        //        // store first nCCE of group for PUCCH transmission of ACK/NAK
1410
        //        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1411 1412 1413 1414 1415 1416 1417 1418 1419 1420
        //        *dci_cnt = *dci_cnt + 1;
        //        } else if (crc == pdcch_vars[eNB_id]->crnti) {

        //        if ((mode & UL_DCI) && (format_c == format0)
        //        && ((dci_decoded_output[current_thread_id][0] & 0x80)
        //        == 0)) { // check if pdu is format 0 or 1A
        //        if (*format0_found == 0) {
        //        dci_alloc[*dci_cnt].format = format0;
        //        *format0_found = 1;
        //        *dci_cnt = *dci_cnt + 1;
1421
        //        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1422 1423 1424 1425
        //        }
        //        } else if (format_c == format0) { // this is a format 1A DCI
        //        dci_alloc[*dci_cnt].format = format1A;
        //        *dci_cnt = *dci_cnt + 1;
1426
        //        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1427 1428 1429 1430 1431 1432
        //        } else {
        //        // store first nCCE of group for PUCCH transmission of ACK/NAK
        //        if (*format_c_found == 0) {
        //        dci_alloc[*dci_cnt].format = format_c;
        //        *dci_cnt = *dci_cnt + 1;
        //        *format_c_found = 1;
1433
        //        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1434 1435 1436
        //        }
        //        }
        //        }
1437
        //LOG_I(PHY,"DCI decoding CRNTI  [format: %d, nCCE[nr_slot_rx: %d]: %d ], AggregationLevel %d \n",format_c, nr_slot_rx, pdcch_vars[eNB_id]->nCCE[nr_slot_rx],L2);
1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459
        //  memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_decoded_output,sizeof_bytes);
        switch (1 << L) {
          case 1:
            *CCEmap |= (1 << (CCEind & 0x1f));
            break;

          case 2:
            *CCEmap |= (1 << (CCEind & 0x1f));
            break;

          case 4:
            *CCEmap |= (1 << (CCEind & 0x1f));
            break;

          case 8:
            *CCEmap |= (1 << (CCEind & 0x1f));
            break;

          case 16:
            *CCEmap |= (1 << (CCEind & 0x1f));
            break;
        }
Agustin's avatar
Agustin committed
1460

1461 1462 1463 1464 1465
#ifdef DEBUG_DCI_DECODING
        LOG_I(PHY,"[DCI search] Found DCI %d rnti %x Aggregation %d length %d format %d in CCE %d (CCEmap %x) candidate %d / %d \n",
              *dci_cnt,crc,1<<L,sizeof_bits,dci_alloc[*dci_cnt-1].format,CCEind,*CCEmap,m,nb_candidates );
        //  nr_extract_dci_into(
        //  dump_dci(frame_parms,&dci_alloc[*dci_cnt-1]);
Agustin's avatar
Agustin committed
1466
#endif
1467
        return;
Agustin's avatar
Agustin committed
1468 1469
      } // rnti match
    } else { // CCEmap_cand == 0
1470 1471
      printf("\n");
    }
1472

1473 1474 1475 1476 1477 1478 1479 1480
    
    //  if ( agregationLevel != 0xFF &&
    //  (format_c == format0 && m==0 && si_rnti != SI_RNTI))
    //  {
    //  //Only valid for OAI : Save some processing time when looking for DCI format0. From the log we see the DCI only on candidate 0.
    //  return;
    //  }
    
Agustin's avatar
Agustin committed
1481
  } // candidate loop
1482

1483
  LOG_DDD("end candidate loop\n");
Agustin's avatar
Agustin committed
1484 1485
}
*/
1486
#endif
1487 1488


1489

1490 1491 1492 1493




Agustin's avatar
Agustin committed
1494

1495
#if 0
Agustin's avatar
Agustin committed
1496 1497 1498


uint8_t nr_dci_decoding_procedure(int s,
1499 1500 1501 1502 1503
                                  int p,
                                  PHY_VARS_NR_UE *ue,
                                  NR_DCI_ALLOC_t *dci_alloc,
                                  NR_SEARCHSPACE_TYPE_t searchSpacetype,
                                  int16_t eNB_id,
1504
                                  uint8_t nr_slot_rx,
1505 1506 1507 1508 1509 1510
                                  uint8_t dci_fields_sizes_cnt[MAX_NR_DCI_DECODED_SLOT][NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
                                  uint16_t n_RB_ULBWP,
                                  uint16_t n_RB_DLBWP,
                                  crc_scrambled_t *crc_scrambled,
                                  format_found_t *format_found,
                                  uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES]) {
1511
  //                                  uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
1512 1513
  LOG_DD("(nr_dci_decoding_procedure) nr_slot_rx=%d n_RB_ULBWP=%d n_RB_DLBWP=%d format_found=%d\n",
         nr_slot_rx,n_RB_ULBWP,n_RB_DLBWP,*format_found);
hongzhi wang's avatar
hongzhi wang committed
1514 1515 1516 1517
  int do_common = (int)searchSpacetype;
  uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS];
  crc_scrambled_t crc_scrambled_ = *crc_scrambled;
  format_found_t format_found_   = *format_found;
Agustin's avatar
Agustin committed
1518 1519
  uint8_t dci_cnt = 0, old_dci_cnt = 0;
  uint32_t CCEmap0 = 0, CCEmap1 = 0, CCEmap2 = 0;
1520 1521
  NR_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_slot_rx]];
  NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_slot_rx]][eNB_id];
hongzhi wang's avatar
hongzhi wang committed
1522 1523 1524
  uint16_t pdcch_DMRS_scrambling_id = pdcch_vars2->coreset[p].pdcchDMRSScramblingID;
  uint64_t coreset_freq_dom = pdcch_vars2->coreset[p].frequencyDomainResources;
  int coreset_time_dur = pdcch_vars2->coreset[p].duration;
1525
  uint16_t coreset_nbr_rb=0;
1526

hongzhi wang's avatar
hongzhi wang committed
1527 1528 1529
  for (int i = 0; i < 45; i++) {
    // this loop counts each bit of the bit map coreset_freq_dom, and increments nbr_RB_coreset for each bit set to '1'
    if (((coreset_freq_dom & 0x1FFFFFFFFFFF) >> i) & 0x1) coreset_nbr_rb++;
Agustin's avatar
Agustin committed
1530
  }
1531

hongzhi wang's avatar
hongzhi wang committed
1532 1533
  coreset_nbr_rb = 6 * coreset_nbr_rb;
  // coreset_time_dur,coreset_nbr_rb,
Agustin's avatar
Agustin committed
1534
  NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
1535
  //uint8_t mi;// = get_mi(&ue->frame_parms, nr_slot_rx);
1536 1537
  //uint8_t tmode = ue->transmission_mode[eNB_id];
  //uint8_t frame_type = frame_parms->frame_type;
1538 1539 1540 1541 1542 1543
  uint8_t format_0_0_1_0_size_bits = 0, format_0_0_1_0_size_bytes = 0; //FIXME
  uint8_t format_0_1_1_1_size_bits = 0, format_0_1_1_1_size_bytes = 0; //FIXME
  uint8_t format_2_0_size_bits = 0, format_2_0_size_bytes = 0; //FIXME
  uint8_t format_2_1_size_bits = 0, format_2_1_size_bytes = 0; //FIXME
  uint8_t format_2_2_size_bits = 0, format_2_2_size_bytes = 0; //FIXME
  uint8_t format_2_3_size_bits = 0, format_2_3_size_bytes = 0; //FIXME
Agustin's avatar
Agustin committed
1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558
  /*
   *
   * The implementation of this function will depend on the information given by the searchSpace IE
   *
   * In LTE the UE has no knowledge about:
   * - the type of search (common or ue-specific)
   * - the DCI format it is going to be decoded when performing the PDCCH monitoring
   * So the blind decoding has to be done for common and ue-specific searchSpaces for each aggregation level and for each dci format
   *
   * In NR the UE has a knowledge about the search Space type and the DCI format it is going to be decoded,
   * so in the blind decoding we can call the function nr_dci_decoding_procedure0 with the searchSpace type and the dci format parameter
   * We will call this function as many times as aggregation levels indicated in searchSpace
   * Implementation according to 38.213 v15.1.0 Section 10.
   *
   */
hongzhi wang's avatar
hongzhi wang committed
1559 1560
  NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t css_dci_format = pdcch_vars2->searchSpace[s].searchSpaceType.common_dci_formats;       //FIXME!!!
  NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t uss_dci_format = pdcch_vars2->searchSpace[s].searchSpaceType.ue_specific_dci_formats;  //FIXME!!!
Agustin's avatar
Agustin committed
1561 1562 1563 1564 1565 1566 1567 1568 1569
  // The following initialization is only for test purposes. To be removed
  // NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t
  css_dci_format = cformat0_0_and_1_0;
  //NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t
  uss_dci_format = uformat0_0_and_1_0;
  /*
   * Possible overlap between RE for SS/PBCH blocks (described in section 10, 38.213) has not been implemented yet
   * This can be implemented by setting variable 'mode = NO_DCI' when overlap occurs
   */
1570
  //dci_detect_mode_t mode = 3; //dci_detect_mode_select(&ue->frame_parms, nr_slot_rx);
1571 1572
  LOG_DD("searSpaceType=%d\n",do_common);
  LOG_DD("%s_dci_format=%d\n",do_common?"uss":"css",css_dci_format);
1573 1574


Agustin's avatar
Agustin committed
1575
  // A set of PDCCH candidates for a UE to monitor is defined in terms of PDCCH search spaces
hongzhi wang's avatar
hongzhi wang committed
1576
  if (do_common==0) { // COMMON SearchSpaceType assigned to current SearchSpace/CORESET
Agustin's avatar
Agustin committed
1577
    // Type0-PDCCH  common search space for a DCI format with CRC scrambled by a SI-RNTI
1578 1579 1580 1581 1582 1583
    // number of consecutive resource blocks and a number of consecutive symbols for
    // the control resource set of the Type0-PDCCH common search space from
    // the four most significant bits of RMSI-PDCCH-Config as described in Tables 13-1 through 13-10
    // and determines PDCCH monitoring occasions
    // from the four least significant bits of RMSI-PDCCH-Config,
    // included in MasterInformationBlock, as described in Tables 13-11 through 13-15
Agustin's avatar
Agustin committed
1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598
    // Type0A-PDCCH common search space for a DCI format with CRC scrambled by a SI-RNTI
    // Type1-PDCCH  common search space for a DCI format with CRC scrambled by a RA-RNTI, or a TC-RNTI, or a C-RNTI
    // Type2-PDCCH  common search space for a DCI format with CRC scrambled by a P-RNTI
    if (css_dci_format == cformat0_0_and_1_0) {
      // 38.213 v15.1.0 Table 10.1-1: CCE aggregation levels and maximum number of PDCCH candidates per CCE
      // aggregation level for Type0/Type0A/Type2-PDCCH common search space
      //   CCE Aggregation Level    Number of Candidates
      //           4                       4
      //           8                       2
      //           16                      1
      // FIXME
      // We shall consider Table 10.1-1 to calculate the blind decoding only for Type0/Type0A/Type2-PDCCH
      // Shall we consider the nrofCandidates in SearSpace IE that considers Aggregation Levels 1,2,4,8,16? Our implementation considers Table 10.1-1
      // blind decoding (Type0-PDCCH,Type0A-PDCCH,Type1-PDCCH,Type2-PDCCH)
      // for format0_0 => we are NOT implementing format0_0 for common search spaces. FIXME!
1599
      // for format0_0 and format1_0, first we calculate dci pdu size
1600
      format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
1601
      format_0_0_1_0_size_bytes = (format_0_0_1_0_size_bits%8 == 0) ? (uint8_t)floor(format_0_0_1_0_size_bits/8) : (uint8_t)(floor(format_0_0_1_0_size_bits/8) + 1);
1602
      LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
1603 1604
             css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);

1605
      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) { // We fix aggregationLevel to 3 for testing=> nbr of CCE=8
1606 1607
        //for (int aggregationLevel = 2; aggregationLevel<5 ; aggregationLevel++) {
        // for aggregation level aggregationLevel. The number of candidates (for L2= 2^aggregationLevel) will be calculated in function nr_dci_decoding_procedure0
1608
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1609 1610
               css_dci_format,(1<<aggregationLevel));
        old_dci_cnt = dci_cnt;
1611
        nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
1612 1613 1614 1615 1616 1617 1618 1619
                                   crc_scrambled_values, aggregationLevel,
                                   cformat0_0_and_1_0, uformat0_0_and_1_0,
                                   format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
                                   &crc_scrambled_, &format_found_, pdcch_DMRS_scrambling_id,&CCEmap0, &CCEmap1, &CCEmap2);

        if (dci_cnt != old_dci_cnt) {
          // we will exit the loop as we have found the DCI
          aggregationLevel = 5;
1620
          format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,crc_scrambled_,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,
1621 1622 1623 1624 1625 1626 1627
                                     0); // after decoding dci successfully we recalculate dci pdu size with correct crc scrambled to get the right field sizes
          old_dci_cnt = dci_cnt;

          for (int i=0; i<NBR_NR_DCI_FIELDS; i++)
            for (int j=0; j<NBR_NR_FORMATS; j++)
              dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
        }
1628
      }
Agustin's avatar
Agustin committed
1629 1630 1631 1632 1633 1634
    }

    // Type3-PDCCH  common search space for a DCI format with CRC scrambled by INT-RNTI, or SFI-RNTI,
    //    or TPC-PUSCH-RNTI, or TPC-PUCCH-RNTI, or TPC-SRS-RNTI, or C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
    if (css_dci_format == cformat2_0) {
      // for format2_0, first we calculate dci pdu size
1635
      format_2_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_sfi_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,4);
1636
      format_2_0_size_bytes = (format_2_0_size_bits%8 == 0) ? (uint8_t)floor(format_2_0_size_bits/8) : (uint8_t)(floor(format_2_0_size_bits/8) + 1);
1637
      LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_0_size_bits=%d, format2_0_size_bytes=%d\n",
1638 1639 1640
             css_dci_format,format_2_0_size_bits,format_2_0_size_bytes);

      for (int aggregationLevelSFI = 0; aggregationLevelSFI<5 ; aggregationLevelSFI++) {
1641
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1642 1643 1644
               css_dci_format,(1<<aggregationLevelSFI));
        // for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
        old_dci_cnt = dci_cnt;
1645
        nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659
                                   crc_scrambled_values, aggregationLevelSFI,
                                   cformat2_0, uformat0_0_and_1_0,
                                   format_2_0_size_bits, format_2_0_size_bytes, &dci_cnt,
                                   &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);

        if (dci_cnt != old_dci_cnt) {
          // we will exit the loop as we have found the DCI
          aggregationLevelSFI = 5;
          old_dci_cnt = dci_cnt;

          for (int i=0; i<NBR_NR_DCI_FIELDS; i++)
            for (int j=0; j<NBR_NR_FORMATS; j++)
              dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
        }
1660
      }
Agustin's avatar
Agustin committed
1661
    }
1662

Agustin's avatar
Agustin committed
1663 1664
    if (css_dci_format == cformat2_1) {
      // for format2_1, first we calculate dci pdu size
1665
      format_2_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_int_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,5);
1666
      format_2_1_size_bytes = (format_2_1_size_bits%8 == 0) ? (uint8_t)floor(format_2_1_size_bits/8) : (uint8_t)(floor(format_2_1_size_bits/8) + 1);
1667
      LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_1_size_bits=%d, format2_1_size_bytes=%d\n",
1668 1669 1670
             css_dci_format,format_2_1_size_bits,format_2_1_size_bytes);

      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) {
1671
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1672 1673 1674
               css_dci_format,(1<<aggregationLevel));
        // for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
        old_dci_cnt = dci_cnt;
1675
        nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689
                                   crc_scrambled_values, aggregationLevel,
                                   cformat2_1, uformat0_0_and_1_0,
                                   format_2_1_size_bits, format_2_1_size_bytes, &dci_cnt,
                                   &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);

        if (dci_cnt != old_dci_cnt) {
          // we will exit the loop as we have found the DCI
          aggregationLevel = 5;
          old_dci_cnt = dci_cnt;

          for (int i=0; i<NBR_NR_DCI_FIELDS; i++)
            for (int j=0; j<NBR_NR_FORMATS; j++)
              dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
        }
1690
      }
Agustin's avatar
Agustin committed
1691
    }
1692

Agustin's avatar
Agustin committed
1693 1694
    if (css_dci_format == cformat2_2) {
      // for format2_2, first we calculate dci pdu size
1695
      format_2_2_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_tpc_pucch_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,6);
1696
      format_2_2_size_bytes = (format_2_2_size_bits%8 == 0) ? (uint8_t)floor(format_2_2_size_bits/8) : (uint8_t)(floor(format_2_2_size_bits/8) + 1);
1697
      LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_2_size_bits=%d, format2_2_size_bytes=%d\n",
1698 1699 1700
             css_dci_format,format_2_2_size_bits,format_2_2_size_bytes);

      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) {
1701
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1702 1703 1704
               css_dci_format,(1<<aggregationLevel));
        // for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
        old_dci_cnt = dci_cnt;
1705
        nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719
                                   crc_scrambled_values, aggregationLevel,
                                   cformat2_2, uformat0_0_and_1_0,
                                   format_2_2_size_bits, format_2_2_size_bytes, &dci_cnt,
                                   &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);

        if (dci_cnt != old_dci_cnt) {
          // we will exit the loop as we have found the DCI
          aggregationLevel = 5;
          old_dci_cnt = dci_cnt;

          for (int i=0; i<NBR_NR_DCI_FIELDS; i++)
            for (int j=0; j<NBR_NR_FORMATS; j++)
              dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
        }
1720
      }
Agustin's avatar
Agustin committed
1721
    }
1722

Agustin's avatar
Agustin committed
1723 1724
    if (css_dci_format == cformat2_3) {
      // for format2_1, first we calculate dci pdu size
1725
      format_2_3_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_tpc_srs_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,7);
1726
      format_2_3_size_bytes = (format_2_3_size_bits%8 == 0) ? (uint8_t)floor(format_2_3_size_bits/8) : (uint8_t)(floor(format_2_3_size_bits/8) + 1);
1727
      LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_3_size_bits=%d, format2_3_size_bytes=%d\n",
1728
             css_dci_format,format_2_3_size_bits,format_2_3_size_bytes);
Agustin's avatar
Agustin committed
1729

1730
      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) {
1731
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1732 1733 1734
               css_dci_format,(1<<aggregationLevel));
        // for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
        old_dci_cnt = dci_cnt;
1735
        nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
1736 1737 1738 1739 1740 1741 1742 1743 1744
                                   crc_scrambled_values, aggregationLevel,
                                   cformat2_3, uformat0_0_and_1_0,
                                   format_2_3_size_bits, format_2_3_size_bytes, &dci_cnt,
                                   &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);

        if (dci_cnt != old_dci_cnt) {
          // we will exit the loop as we have found the DCI
          aggregationLevel = 5;
          old_dci_cnt = dci_cnt;
Agustin's avatar
Agustin committed
1745

1746 1747 1748 1749 1750 1751
          for (int i=0; i<NBR_NR_DCI_FIELDS; i++)
            for (int j=0; j<NBR_NR_FORMATS; j++)
              dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
        }
      }
    }
Agustin's avatar
Agustin committed
1752 1753 1754
  } else { // UE-SPECIFIC SearchSpaceType assigned to current SearchSpace/CORESET
    // UE-specific search space for a DCI format with CRC scrambled by C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
    if (uss_dci_format == uformat0_0_and_1_0) {
1755
      // for format0_0 and format1_0, first we calculate dci pdu size
1756
      format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
1757
      format_0_0_1_0_size_bytes = (format_0_0_1_0_size_bits%8 == 0) ? (uint8_t)floor(format_0_0_1_0_size_bits/8) : (uint8_t)(floor(format_0_0_1_0_size_bits/8) + 1);
1758
      LOG_DD("calculating dci format size for UE-specific searchSpaces with format uss_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
1759 1760
             css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);

1761
      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) { // We fix aggregationLevel to 3 for testing=> nbr of CCE=8
1762 1763
        //for (int aggregationLevel = 2; aggregationLevel<5 ; aggregationLevel++) {
        // for aggregation level aggregationLevel. The number of candidates (for L2= 2^aggregationLevel) will be calculated in function nr_dci_decoding_procedure0
1764
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1765 1766
               css_dci_format,(1<<aggregationLevel));
        old_dci_cnt = dci_cnt;
1767
        nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 0, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781
                                   crc_scrambled_values, aggregationLevel,
                                   cformat0_0_and_1_0, uformat0_0_and_1_0,
                                   format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
                                   &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);

        if (dci_cnt != old_dci_cnt) {
          // we will exit the loop as we have found the DCI
          aggregationLevel = 5;
          old_dci_cnt = dci_cnt;

          for (int i=0; i<NBR_NR_DCI_FIELDS; i++)
            for (int j=0; j<NBR_NR_FORMATS; j++)
              dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
        }
1782
      }
1783
    }
Agustin's avatar
Agustin committed
1784

1785 1786
    if (uss_dci_format == uformat0_1_and_1_1) {
      // for format0_0 and format1_0, first we calculate dci pdu size
1787
      format_0_1_1_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,1);
1788
      format_0_1_1_1_size_bytes = (format_0_1_1_1_size_bits%8 == 0) ? (uint8_t)floor(format_0_1_1_1_size_bits/8) : (uint8_t)(floor(format_0_1_1_1_size_bits/8) + 1);
1789
      LOG_DD("calculating dci format size for UE-specific searchSpaces with format uss_dci_format=%d, format_0_1_1_1_size_bits=%d, format_0_1_1_1_size_bytes=%d\n",
1790 1791
             css_dci_format,format_0_1_1_1_size_bits,format_0_1_1_1_size_bytes);

1792
      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) { // We fix aggregationLevel to 3 for testing=> nbr of CCE=8
1793 1794
        //for (int aggregationLevel = 2; aggregationLevel<5 ; aggregationLevel++) {
        // for aggregation level aggregationLevel. The number of candidates (for L2= 2^aggregationLevel) will be calculated in function nr_dci_decoding_procedure0
1795
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1796 1797
               css_dci_format,(1<<aggregationLevel));
        old_dci_cnt = dci_cnt;
1798
        nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 0, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812
                                   crc_scrambled_values, aggregationLevel,
                                   cformat0_0_and_1_0, uformat0_1_and_1_1,
                                   format_0_1_1_1_size_bits, format_0_1_1_1_size_bytes, &dci_cnt,
                                   &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);

        if (dci_cnt != old_dci_cnt) {
          // we will exit the loop as we have found the DCI
          aggregationLevel = 5;
          old_dci_cnt = dci_cnt;

          for (int i=0; i<NBR_NR_DCI_FIELDS; i++)
            for (int j=0; j<NBR_NR_FORMATS; j++)
              dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
        }
1813
      }
Agustin's avatar
Agustin committed
1814
    }
1815
  }
1816

1817 1818
  *crc_scrambled = crc_scrambled_;
  *format_found  = format_found_;
1819 1820
  LOG_DD("at the end crc_scrambled=%d and format_found=%d\n",*crc_scrambled,*format_found);
  LOG_DD("at the end dci_cnt=%d \n",dci_cnt);
Agustin's avatar
Agustin committed
1821 1822
  return(dci_cnt);
}
1823

Agustin's avatar
Agustin committed
1824
#endif