dci_nr.c 82.5 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 54 55 56 57 58 59 60 61 62
char nr_dci_format_string[8][30] = {
  "NR_DL_DCI_FORMAT_1_0",
  "NR_DL_DCI_FORMAT_1_1",
  "NR_DL_DCI_FORMAT_2_0",
  "NR_DL_DCI_FORMAT_2_1",
  "NR_DL_DCI_FORMAT_2_2",
  "NR_DL_DCI_FORMAT_2_3",
  "NR_UL_DCI_FORMAT_0_0",
  "NR_UL_DCI_FORMAT_0_1"};

63
//#define DEBUG_DCI_DECODING 1
Agustin's avatar
Agustin committed
64 65 66

//#define NR_LTE_PDCCH_DCI_SWITCH
#define NR_PDCCH_DCI_RUN              // activates new nr functions
Florian Kaltenberger's avatar
Florian Kaltenberger committed
67
//#define NR_PDCCH_DCI_DEBUG            // activates NR_PDCCH_DCI_DEBUG logs
68
#ifdef NR_PDCCH_DCI_DEBUG
69 70 71
#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__ )
72 73 74 75 76
#else
#define LOG_DNL(a...)
#define LOG_DD(a...)
#define LOG_DDD(a...)
#endif
Agustin's avatar
Agustin committed
77 78 79 80
#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)


81
#ifdef LOG_I
82 83
  #undef LOG_I
  #define LOG_I(A,B...) printf(B)
84
#endif
Agustin's avatar
Agustin committed
85

86
#ifdef NR_PDCCH_DCI_RUN
Agustin's avatar
Agustin committed
87

88 89

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


92 93
void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
                                       uint32_t *z,
hongzhi wang's avatar
hongzhi wang committed
94 95 96 97
                                       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
98 99 100 101
                                       uint8_t n_shift,
                                       uint8_t number_of_candidates,
                                       uint16_t *CCE,
                                       uint8_t *L) {
102 103 104 105
  /*
   * This function will do demapping and deinterleaving from llr containing demodulated symbols
   * Demapping will regroup in REG and bundles
   * Deinterleaving will order the bundles
106
   *
107 108 109
   * 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
110
   *
111 112 113 114 115 116 117 118
   llr --------------------------> e_rx (z) ----> e_rx (z)
   |   ...
   |   ...
   |   REG 26
   symbol 2    |   ...
   |   ...
   |   REG 5
   |   REG 2
119

120 121 122 123 124 125 126
   |   ...
   |   ...
   |   REG 25
   symbol 1    |   ...
   |   ...
   |   REG 4
   |   REG 1
127

128 129 130 131 132 133 134 135 136
   |   ...
   |   ...                           ...              ...
   |   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
137 138 139
  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
140 141
  uint16_t index_z, index_llr;
  int coreset_interleaved = 0;
142

rmagueta's avatar
rmagueta committed
143 144
  if (reg_bundle_size_L != 0) { // interleaving will be done only if reg_bundle_size_L != 0
    coreset_interleaved = 1;
145
    coreset_C = (uint32_t) (coreset_nbr_rb / (coreset_interleaver_size_R * reg_bundle_size_L));
hongzhi wang's avatar
hongzhi wang committed
146
  } else {
rmagueta's avatar
rmagueta committed
147
    reg_bundle_size_L = 6;
hongzhi wang's avatar
hongzhi wang committed
148
  }
Agustin's avatar
Agustin committed
149

rmagueta's avatar
rmagueta committed
150

Eurecom's avatar
Eurecom committed
151
  int f_bundle_j_list[(2*NR_MAX_PDCCH_AGG_LEVEL) - 1] = {};
rmagueta's avatar
rmagueta committed
152

153
  for (int reg = 0; reg < coreset_nbr_rb; reg++) {
rmagueta's avatar
rmagueta committed
154
    if ((reg % reg_bundle_size_L) == 0) {
hongzhi wang's avatar
hongzhi wang committed
155
      if (r == coreset_interleaver_size_R) {
rmagueta's avatar
rmagueta committed
156
        r = 0;
hongzhi wang's avatar
hongzhi wang committed
157
        c++;
Agustin's avatar
Agustin committed
158
      }
159

rmagueta's avatar
rmagueta committed
160
      bundle_j = (c * coreset_interleaver_size_R) + r;
161
      f_bundle_j = ((r * coreset_C) + c + n_shift) % (coreset_nbr_rb / reg_bundle_size_L);
rmagueta's avatar
rmagueta committed
162 163 164 165 166 167 168 169

      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++;
  }
170

rmagueta's avatar
rmagueta committed
171 172
  // Get cce_list indices by reg_idx in ascending order
  int f_bundle_j_list_id = 0;
Eurecom's avatar
Eurecom committed
173
  int f_bundle_j_list_ord[(2*NR_MAX_PDCCH_AGG_LEVEL)-1] = {};
rmagueta's avatar
rmagueta committed
174 175
  for (int c_id = 0; c_id < number_of_candidates; c_id++ ) {
    f_bundle_j_list_id = CCE[c_id];
176
    for (int p = 0; p < NR_MAX_PDCCH_AGG_LEVEL; p++) {
rmagueta's avatar
rmagueta committed
177
      for (int p2 = CCE[c_id]; p2 < CCE[c_id] + L[c_id]; p2++) {
Eurecom's avatar
Eurecom committed
178
        AssertFatal(p2<2*NR_MAX_PDCCH_AGG_LEVEL,"number_of_candidates %d : p2 %d,  CCE[%d] %d, L[%d] %d\n",number_of_candidates,p2,c_id,CCE[c_id],c_id,L[c_id]);
rmagueta's avatar
rmagueta committed
179
        if (f_bundle_j_list[p2] == p) {
Eurecom's avatar
Eurecom committed
180
          AssertFatal(f_bundle_j_list_id < 2*NR_MAX_PDCCH_AGG_LEVEL,"f_bundle_j_list_id %d\n",f_bundle_j_list_id);
rmagueta's avatar
rmagueta committed
181 182 183 184 185
          f_bundle_j_list_ord[f_bundle_j_list_id] = p;
          f_bundle_j_list_id++;
          break;
        }
      }
Agustin's avatar
Agustin committed
186
    }
rmagueta's avatar
rmagueta committed
187 188
  }

189 190 191 192 193
  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++) {
194

195 196 197
          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;
198

199 200
          for (int i = 0; i < 9; i++) {
            z[index_z + i] = llr[index_llr + i];
201
#ifdef NR_PDCCH_DCI_DEBUG
202 203 204
            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]));
205
#endif
206 207 208 209
          }
          rb++;
        }
      }
hongzhi wang's avatar
hongzhi wang committed
210
    }
Agustin's avatar
Agustin committed
211
  }
hongzhi wang's avatar
hongzhi wang committed
212
}
Agustin's avatar
Agustin committed
213 214 215 216 217

#endif

#ifdef NR_PDCCH_DCI_RUN
int32_t nr_pdcch_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp,
218 219
                     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)];
220
  int32_t i;
221 222
  int16_t *pdcch_llrp;
  pdcch_llrp = &pdcch_llr[2 * symbol * coreset_nbr_rb * 9];
Agustin's avatar
Agustin committed
223

224
  if (!pdcch_llrp) {
225
    LOG_E(PHY,"pdcch_qpsk_llr: llr is null, symbol %d\n", symbol);
226 227
    return (-1);
  }
228

229
  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);
230

231 232 233
  //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)
234
      *pdcch_llrp = 31;
235
    else if (*rxF < -32)
236
      *pdcch_llrp = -32;
237
    else
238
      *pdcch_llrp = (*rxF);
239

240
    LOG_DDD("llr logs: rb=%d i=%d *rxF:%d => *pdcch_llrp:%d\n",i/18,i,*rxF,*pdcch_llrp);
241
    rxF++;
242
    pdcch_llrp++;
243
  }
Agustin's avatar
Agustin committed
244

245
  return (0);
Agustin's avatar
Agustin committed
246 247 248 249
}
#endif


250
#if 0
Agustin's avatar
Agustin committed
251 252 253
int32_t pdcch_llr(NR_DL_FRAME_PARMS *frame_parms,
                  int32_t **rxdataF_comp,
                  char *pdcch_llr,
254 255
                  uint8_t symbol) {
  int16_t *rxF= (int16_t *) &rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
Agustin's avatar
Agustin committed
256 257 258 259 260
  int32_t i;
  char *pdcch_llr8;
  pdcch_llr8 = &pdcch_llr[2*symbol*frame_parms->N_RB_DL*12];

  if (!pdcch_llr8) {
261
    LOG_E(PHY,"pdcch_qpsk_llr: llr is null, symbol %d\n",symbol);
Agustin's avatar
Agustin committed
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
    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);
}
282
#endif
Agustin's avatar
Agustin committed
283 284 285 286

//__m128i avg128P;

//compute average channel_level on each (TX,RX) antenna pair
287
void nr_pdcch_channel_level(int32_t **dl_ch_estimates_ext,
Agustin's avatar
Agustin committed
288 289
                         NR_DL_FRAME_PARMS *frame_parms,
                         int32_t *avg,
290
                         uint8_t nb_rb) {
Agustin's avatar
Agustin committed
291
  int16_t rb;
292
  uint8_t aarx;
Agustin's avatar
Agustin committed
293 294 295 296 297 298 299
#if defined(__x86_64__) || defined(__i386__)
  __m128i *dl_ch128;
  __m128i avg128P;
#elif defined(__arm__)
  int16x8_t *dl_ch128;
  int32x4_t *avg128P;
#endif
300

301 302
  for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
    //clear average level
Agustin's avatar
Agustin committed
303
#if defined(__x86_64__) || defined(__i386__)
304 305
    avg128P = _mm_setzero_si128();
    dl_ch128=(__m128i *)&dl_ch_estimates_ext[aarx][0];
Agustin's avatar
Agustin committed
306
#elif defined(__arm__)
frtabu's avatar
frtabu committed
307
    dl_ch128=(int16x8_t *)&dl_ch_estimates_ext[aarx][0];
Agustin's avatar
Agustin committed
308
#endif
309

310
    for (rb=0; rb<(nb_rb*3)>>2; rb++) {
Agustin's avatar
Agustin committed
311
#if defined(__x86_64__) || defined(__i386__)
312 313 314
      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
315 316
#elif defined(__arm__)
#endif
Raymond Knopp's avatar
Raymond Knopp committed
317
      //      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]);
318 319
      dl_ch128+=3;
      /*
320 321 322 323 324
      if (rb==0) {
      print_shorts("dl_ch128",&dl_ch128[0]);
      print_shorts("dl_ch128",&dl_ch128[1]);
      print_shorts("dl_ch128",&dl_ch128[2]);
      }
325
      */
Agustin's avatar
Agustin committed
326
    }
327

328 329 330 331 332
    DevAssert( nb_rb );
    avg[aarx] = (((int32_t *)&avg128P)[0] +
                 ((int32_t *)&avg128P)[1] +
                 ((int32_t *)&avg128P)[2] +
                 ((int32_t *)&avg128P)[3])/(nb_rb*9);
333 334
    //            printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
  }
Agustin's avatar
Agustin committed
335 336 337 338 339 340 341 342

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

#if defined(__x86_64) || defined(__i386__)
343
  __m128i mmtmpPD0,mmtmpPD1,mmtmpPD2,mmtmpPD3;
Agustin's avatar
Agustin committed
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
#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,
359
                                 uint8_t *coreset_freq_dom,
Agustin's avatar
Agustin committed
360 361
                                 uint32_t coreset_nbr_rb,
                                 uint32_t n_BWP_start) {
362 363 364 365 366 367 368 369 370 371
  /*
   * 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
372
  // the bitmap coreset_frq_domain contains 45 bits
373
#define CORESET_FREQ_DOMAIN_BITMAP_SIZE   45
Agustin's avatar
Agustin committed
374
  // each bit is associated to 6 RBs
375 376
#define BIT_TO_NBR_RB_CORESET_FREQ_DOMAIN  6
#define NBR_RE_PER_RB_WITH_DMRS           12
Agustin's avatar
Agustin committed
377
  // after removing the 3 DMRS RE, the RB contains 9 RE with PDCCH
378
#define NBR_RE_PER_RB_WITHOUT_DMRS         9
379 380
  uint16_t c_rb, nb_rb = 0;
  //uint8_t rb_count_bit;
cig's avatar
cig committed
381
  uint8_t i, j, aarx;
Agustin's avatar
Agustin committed
382
  int32_t *dl_ch0, *dl_ch0_ext, *rxF, *rxF_ext;
383

384
#ifdef DEBUG_DCI_DECODING
385
  uint8_t symbol_mod = (symbol >= (7 - frame_parms->Ncp)) ? symbol - (7 - frame_parms->Ncp) : symbol;
386 387
  LOG_I(PHY, "extract_rbs_single: symbol_mod %d\n",symbol_mod);
#endif
Agustin's avatar
Agustin committed
388 389

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

393
    dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITH_DMRS)];
394
    LOG_DDD("dl_ch0_ext = &dl_ch_estimates_ext[aarx = (%d)][symbol * (frame_parms->N_RB_DL * 9) = (%d)]\n",
395
           aarx,symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITH_DMRS));
396
    rxF_ext = &rxdataF_ext[aarx][symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITH_DMRS)];
397
    LOG_DDD("rxF_ext = &rxdataF_ext[aarx = (%d)][symbol * (frame_parms->N_RB_DL * 9) = (%d)]\n",
398
           aarx,symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITH_DMRS));
399

400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
    /*
     * 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
417

418
    int c_rb_by6;
rmagueta's avatar
rmagueta committed
419
    c_rb = 0;
420 421
    for (int rb=0;rb<coreset_nbr_rb;rb++,c_rb++) {
      c_rb_by6 = c_rb/6;
Francesco Mani's avatar
Francesco Mani committed
422

423
      // skip zeros in frequency domain bitmap
424
      while ((coreset_freq_dom[c_rb_by6>>3] & (1<<(7-(c_rb_by6&7)))) == 0) {
Francesco Mani's avatar
Francesco Mani committed
425 426 427
        c_rb+=6;
        c_rb_by6 = c_rb/6;
      }
Agustin's avatar
Agustin committed
428

laurent's avatar
laurent committed
429
      rxF=NULL;
430

Agustin's avatar
Agustin committed
431
      // 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
432
      if (((c_rb + n_BWP_start) < (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) == 0)) {
Agustin's avatar
Agustin committed
433
        //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
434
        rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))+n_BWP_start*12];
435
        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",
436
               c_rb,aarx,(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))));
Agustin's avatar
Agustin committed
437
      }
438

rmagueta's avatar
rmagueta committed
439
      if (((c_rb + n_BWP_start) >= (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) == 0)) {
Agustin's avatar
Agustin committed
440 441
        // 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
442
        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
443
        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
444 445 446
               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
447
        //  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
448 449 450
        //         c_rb,aarx,(1 + 12*(c_rb - (frame_parms->N_RB_DL>>1)) + (symbol * (frame_parms->ofdm_symbol_size))));
        //#endif
      }
451

rmagueta's avatar
rmagueta committed
452
      if (((c_rb + n_BWP_start) < (frame_parms->N_RB_DL >> 1)) && ((frame_parms->N_RB_DL & 1) != 0)) {
Agustin's avatar
Agustin committed
453
        //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
454
        rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))+n_BWP_start*12];
455 456
#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",
457
               c_rb,aarx,(frame_parms->first_carrier_offset + 12 * c_rb + (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)) {
Agustin's avatar
Agustin committed
462 463
        // 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
464
        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
465 466
#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",
467
               c_rb,aarx,(12*(c_rb - (frame_parms->N_RB_DL>>1)) - 6 + (symbol * (frame_parms->ofdm_symbol_size))));
468
#endif
Agustin's avatar
Agustin committed
469
      }
470

rmagueta's avatar
rmagueta committed
471
      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
472 473
        // 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
474
        rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size)))+n_BWP_start*12];
475 476
#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",
477
               c_rb,aarx,(frame_parms->first_carrier_offset + 12 * c_rb + (symbol * (frame_parms->ofdm_symbol_size))));
478
#endif
Agustin's avatar
Agustin committed
479
        j = 0;
480

Agustin's avatar
Agustin committed
481 482 483 484 485 486 487
        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]));
          }
        }
488

Agustin's avatar
Agustin committed
489 490
        // 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
491 492
#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",
493
               c_rb,aarx,(symbol * (frame_parms->ofdm_symbol_size)));
494
#endif
Agustin's avatar
Agustin committed
495 496 497 498 499 500 501
        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]));
          }
        }
502

Agustin's avatar
Agustin committed
503 504 505 506
        nb_rb++;
        dl_ch0_ext += NBR_RE_PER_RB_WITHOUT_DMRS;
        rxF_ext += NBR_RE_PER_RB_WITHOUT_DMRS;
        dl_ch0 += 12;
507 508 509
        //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
510 511 512
        //}
      } else { // treatment of any RB that does not contain the DC
        j = 0;
513

Agustin's avatar
Agustin committed
514 515 516
        for (i = 0; i < 12; i++) {
          if ((i != 1) && (i != 5) && (i != 9)) {
            rxF_ext[j] = rxF[i];
517 518
#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",
519 520
                   c_rb, i, j, *(short *) &rxF_ext[j],*(1 + (short *) &rxF_ext[j]), i,
                   *(short *) &rxF[i], *(1 + (short *) &rxF[i]));
521
#endif
hongzhi wang's avatar
hongzhi wang committed
522
            dl_ch0_ext[j] = dl_ch0[i];
523

524
            //LOG_DDD("ch %d => dl_ch0(%d,%d)\n", i, *(short *) &dl_ch0[i], *(1 + (short*) &dl_ch0[i]));
525
            //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
526
            j++;
Agustin's avatar
Agustin committed
527
          } else {
528 529
#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",
530 531
                   c_rb, i, j, *(short *) &rxF_ext[j], *(1 + (short *) &rxF_ext[j]), i,
                   *(short *) &rxF[i], *(1 + (short *) &rxF[i]));
532
#endif
Agustin's avatar
Agustin committed
533 534
          }
        }
535

Agustin's avatar
Agustin committed
536 537 538 539
        nb_rb++;
        dl_ch0_ext += NBR_RE_PER_RB_WITHOUT_DMRS;
        rxF_ext += NBR_RE_PER_RB_WITHOUT_DMRS;
        dl_ch0 += 12;
540
        //rxF += 12;
Agustin's avatar
Agustin committed
541 542 543 544 545 546 547 548 549
        //}
      }
    }
  }
}

#endif


Eurecom's avatar
Eurecom committed
550
#define print_shorts(s,x) printf("%s %d,%d,%d,%d,%d,%d,%d,%d\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7])
Agustin's avatar
Agustin committed
551 552 553 554 555 556 557 558

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,
559
                                   uint32_t coreset_nbr_rb) {
hongzhi wang's avatar
hongzhi wang committed
560
  uint16_t rb; //,nb_rb=20;
561
  uint8_t aarx;
562
#if defined(__x86_64__) || defined(__i386__)
563
  __m128i mmtmpP0,mmtmpP1,mmtmpP2,mmtmpP3;
564
#elif defined(__arm__)
565
  int16x8_t mmtmpP0,mmtmpP1,mmtmpP2,mmtmpP3;
566
#endif
hongzhi wang's avatar
hongzhi wang committed
567 568
#if defined(__x86_64__) || defined(__i386__)
  __m128i *dl_ch128,*rxdataF128,*rxdataF_comp128;
Agustin's avatar
Agustin committed
569 570 571
#elif defined(__arm__)
#endif

572
  for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
Agustin's avatar
Agustin committed
573
#if defined(__x86_64__) || defined(__i386__)
574 575 576 577 578
    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);
579
    //printf("rxdataf_comp addr %p\n",&rxdataF_comp[(aatx<<1)+aarx][symbol*20*12]);
Agustin's avatar
Agustin committed
580
#elif defined(__arm__)
581
    // to be filled in
Agustin's avatar
Agustin committed
582
#endif
583

584
    for (rb=0; rb<(coreset_nbr_rb*3)>>2; rb++) {
Agustin's avatar
Agustin committed
585
#if defined(__x86_64__) || defined(__i386__)
586 587
      // multiply by conjugated channel
      mmtmpP0 = _mm_madd_epi16(dl_ch128[0],rxdataF128[0]);
Eurecom's avatar
Eurecom committed
588
      //print_ints("re",&mmtmpP0);
589 590 591
      // 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));
592
      mmtmpP1 = _mm_sign_epi16(mmtmpP1,*(__m128i *)&conjugate[0]);
Eurecom's avatar
Eurecom committed
593
      //print_ints("im",&mmtmpP1);
594 595 596 597 598 599 600 601
      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);
Eurecom's avatar
Eurecom committed
602 603
      //print_ints("c0",&mmtmpP2);
      //print_ints("c1",&mmtmpP3);
604
      rxdataF_comp128[0] = _mm_packs_epi32(mmtmpP2,mmtmpP3);
Eurecom's avatar
Eurecom committed
605 606 607
//      print_shorts("rx:",(int16_t*)rxdataF128);
//      print_shorts("ch:",(int16_t*)dl_ch128);
//      print_shorts("pack:",(int16_t*)rxdataF_comp128);
608 609 610 611 612
      // 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));
613
      mmtmpP1 = _mm_sign_epi16(mmtmpP1,*(__m128i *)&conjugate[0]);
614 615 616 617 618 619 620 621 622 623 624 625 626 627 628
      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));
629
      mmtmpP1 = _mm_sign_epi16(mmtmpP1,*(__m128i *)&conjugate[0]);
630 631 632 633 634 635 636 637 638 639 640
      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);
641

642
      for (int i=0; i<12 ; i++)
643
        LOG_DDD("rxdataF128[%d]=(%d,%d) X dlch[%d]=(%d,%d) rxdataF_comp128[%d]=(%d,%d)\n",
644 645 646 647
               (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)]);

648 649 650
      dl_ch128+=3;
      rxdataF128+=3;
      rxdataF_comp128+=3;
hongzhi wang's avatar
hongzhi wang committed
651
#elif defined(__arm__)
652
      // to be filled in
Agustin's avatar
Agustin committed
653
#endif
hongzhi wang's avatar
hongzhi wang committed
654
    }
655
  }
656

Agustin's avatar
Agustin committed
657
#if defined(__x86_64__) || defined(__i386__)
hongzhi wang's avatar
hongzhi wang committed
658 659
  _mm_empty();
  _m_empty();
Agustin's avatar
Agustin committed
660 661 662 663
#endif
}


664
void nr_pdcch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
Agustin's avatar
Agustin committed
665
                         int32_t **rxdataF_comp,
666
                         uint8_t symbol) {
Agustin's avatar
Agustin committed
667 668 669
#if defined(__x86_64__) || defined(__i386__)
  __m128i *rxdataF_comp128_0,*rxdataF_comp128_1;
#elif defined(__arm__)
670
  int16x8_t *rxdataF_comp128_0,*rxdataF_comp128_1;
Agustin's avatar
Agustin committed
671 672 673 674 675
#endif
  int32_t i;

  if (frame_parms->nb_antennas_rx>1) {
#if defined(__x86_64__) || defined(__i386__)
676 677
    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
678
#elif defined(__arm__)
679 680
    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
681
#endif
682

683 684
    // MRC on each re of rb
    for (i=0; i<frame_parms->N_RB_DL*3; i++) {
Agustin's avatar
Agustin committed
685
#if defined(__x86_64__) || defined(__i386__)
686
      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
687
#elif defined(__arm__)
688
      rxdataF_comp128_0[i] = vhaddq_s16(rxdataF_comp128_0[i],rxdataF_comp128_1[i]);
Agustin's avatar
Agustin committed
689 690 691 692 693 694 695 696 697 698
#endif
    }
  }

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

699
#if 0
Agustin's avatar
Agustin committed
700 701
void pdcch_siso(NR_DL_FRAME_PARMS *frame_parms,
                int32_t **rxdataF_comp,
702
                uint8_t l) {
Agustin's avatar
Agustin committed
703 704 705 706 707 708 709 710 711 712 713
  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++;
    }
  }
}
714
#endif
Agustin's avatar
Agustin committed
715 716

#ifdef NR_PDCCH_DCI_RUN
717
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
718 719
                    UE_nr_rxtx_proc_t *proc,
                    fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) {
720

721 722
  uint32_t frame = proc->frame_rx;
  uint32_t slot  = proc->nr_slot_rx;
723 724
  NR_UE_COMMON *common_vars      = &ue->common_vars;
  NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
725
  NR_UE_PDCCH *pdcch_vars        = ue->pdcch_vars[proc->thread_id][0];
726 727 728 729

  uint8_t log2_maxh, aarx;
  int32_t avgs;
  int32_t avgP[4];
730 731
  int n_rb,rb_offset;
  get_coreset_rballoc(rel15->coreset.frequency_domain_resource,&n_rb,&rb_offset);
732 733
  LOG_D(PHY,"pdcch coreset: freq %x, n_rb %d, rb_offset %d\n",
        rel15->coreset.frequency_domain_resource[0],n_rb,rb_offset);
734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759
  for (int s=rel15->coreset.StartSymbolIndex; s<(rel15->coreset.StartSymbolIndex+rel15->coreset.duration); s++) {
    LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");

    nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
                                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);

    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");
    // compute channel level based on ofdm symbol 0
    nr_pdcch_channel_level(pdcch_vars->dl_ch_estimates_ext,
                           frame_parms,
                           avgP,
                           n_rb);
    avgs = 0;

    for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
      avgs = cmax(avgs, avgP[aarx]);

    log2_maxh = (log2_approx(avgs) / 2) + 5;  //+frame_parms->nb_antennas_rx;
760

761
#ifdef UE_DEBUG_TRACE
762
    LOG_D(PHY,"slot %d: pdcch log2_maxh = %d (%d,%d)\n",slot,log2_maxh,avgP[0],avgs);
763 764
#endif
#if T_TRACER
765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782
    T(T_UE_PHY_PDCCH_ENERGY, T_INT(0), T_INT(0), T_INT(frame%1024), T_INT(slot),
      T_INT(avgP[0]), T_INT(avgP[1]), T_INT(avgP[2]), T_INT(avgP[3]));
#endif
    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");
    // compute LLRs for ofdm symbol 0 only
    nr_pdcch_channel_compensation(pdcch_vars->rxdataF_ext,
                                  pdcch_vars->dl_ch_estimates_ext,
                                  pdcch_vars->rxdataF_comp,
                                  NULL,
                                  frame_parms,
                                  s,
                                  log2_maxh,
                                  n_rb); // log2_maxh+I0_shift
    if (frame_parms->nb_antennas_rx > 1) {
      LOG_D(PHY,"we enter nr_pdcch_detection_mrc(frame_parms->nb_antennas_rx=%d)\n", frame_parms->nb_antennas_rx);
      nr_pdcch_detection_mrc(frame_parms, pdcch_vars->rxdataF_comp,s);
    }
783

784 785 786 787 788 789 790
    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");
    nr_pdcch_llr(frame_parms,
                 pdcch_vars->rxdataF_comp,
                 pdcch_vars->llr,
                 s,
                 n_rb);
791 792
#if T_TRACER
    
793 794 795
    //  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));
796 797 798
    
#endif
#ifdef DEBUG_DCI_DECODING
799
    printf("demapping: slot %d, mi %d\n",slot,get_mi(frame_parms,slot));
800
#endif
801
  }
802

Eurecom's avatar
Eurecom committed
803
  LOG_D(PHY,"we enter nr_pdcch_demapping_deinterleaving(), number of candidates %d\n",rel15->number_of_candidates);
804 805 806 807 808 809 810 811 812 813
  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,
                                    rel15->coreset.ShiftIndex,
                                    rel15->number_of_candidates,
                                    rel15->CCE,
                                    rel15->L);
814
    /*
Francesco Mani's avatar
Francesco Mani committed
815 816 817 818 819 820 821
    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);
822
    */
823 824
  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
825 826

  return (0);
827
}
Agustin's avatar
Agustin committed
828 829 830

#endif

zhenghuangkun's avatar
zhenghuangkun committed
831 832
#if 0
void nr_pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
833
                      uint8_t nr_slot_rx,
834 835
                      uint8_t *e,
                      uint32_t length) {
Agustin's avatar
Agustin committed
836 837 838 839 840
  int i;
  uint8_t reset;
  uint32_t x1, x2, s=0;
  reset = 1;
  // x1 is set in lte_gold_generic
841
  x2 = (nr_slot_rx<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2
842

Agustin's avatar
Agustin committed
843 844 845 846 847 848
  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;
    }
849

Agustin's avatar
Agustin committed
850 851 852 853 854
    //    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
855
#endif
Agustin's avatar
Agustin committed
856 857 858 859


#ifdef NR_PDCCH_DCI_RUN

cig's avatar
cig committed
860 861 862 863 864
void nr_pdcch_unscrambling(int16_t *z,
                           uint16_t scrambling_RNTI,
                           uint32_t length,
                           uint16_t pdcch_DMRS_scrambling_id,
                           int16_t *z2) {
865 866 867
  int i;
  uint8_t reset;
  uint32_t x1, x2, s = 0;
868
  uint16_t n_id; //{0,1,...,65535}
cig's avatar
cig committed
869
  uint32_t rnti = (uint32_t) scrambling_RNTI;
870 871
  reset = 1;
  // x1 is set in first call to lte_gold_generic
cig's avatar
cig committed
872 873
  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
874

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

877 878 879 880 881
  for (i = 0; i < length; i++) {
    if ((i & 0x1f) == 0) {
      s = lte_gold_generic(&x1, &x2, reset);
      reset = 0;
    }
882

883 884
    if (((s >> (i % 32)) & 1) == 1) z2[i] = -z[i];
    else z2[i]=z[i];
885
  }
886
}
Agustin's avatar
Agustin committed
887

888
#endif
Agustin's avatar
Agustin committed
889 890 891


#ifdef NR_PDCCH_DCI_RUN
892 893 894 895 896
/* 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
897
                            const t_nrPolar_params *polar_param,
898 899 900 901
                            int encoded_length,
                            int rnti) {

  uint32_t encoder_output[NR_MAX_DCI_SIZE_DWORD];
rmagueta's avatar
rmagueta committed
902
  polar_encoder_fast(dci, (void*)encoder_output, rnti, 1, (t_nrPolar_params *)polar_param);
903
  uint8_t *enout_p = (uint8_t*)encoder_output;
904 905 906 907 908 909 910 911 912 913 914 915 916 917 918
  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;
}

919
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
920
                                  UE_nr_rxtx_proc_t *proc,
921 922
                                  fapi_nr_dci_indication_t *dci_ind,
                                  fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) {
923

924 925 926 927 928 929 930 931 932 933 934 935
  NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];

  //int gNB_id = 0;
  int16_t tmp_e[16*108];
  rnti_t n_rnti;

  for (int j=0;j<rel15->number_of_candidates;j++) {
    int CCEind = rel15->CCE[j];
    int L = rel15->L[j];

    // Loop over possible DCI lengths
    for (int k = 0; k < rel15->num_dci_options; k++) {
936 937 938 939 940 941 942 943 944 945 946
      // skip this candidate if we've already found one with the
      // same rnti and format at a different aggregation level
      int dci_found=0;
      for (int ind=0;ind < dci_ind->number_of_dcis ; ind++) {
        if (rel15->rnti== dci_ind->dci_list[ind].rnti &&
            rel15->dci_format_options[k]==dci_ind->dci_list[ind].dci_format) {
           dci_found=1;
           break;
        }
      }
      if (dci_found==1) continue;
947 948 949 950
      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);

951
      LOG_D(PHY, "Trying DCI candidate %d of %d number of candidates, CCE %d (%d), L %d, length %d, format %s\n", j, rel15->number_of_candidates, CCEind, CCEind*9*6*2, L, dci_length,nr_dci_format_string[rel15->dci_format_options[k]]);
952 953 954 955 956 957 958 959

      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
960
        }
961
      }
962 963 964 965 966 967 968 969
#endif

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

      n_rnti = rel15->rnti;
970 971
      LOG_D(PHY, "(%i.%i) dci indication (rnti %x,dci format %s,n_CCE %d,payloadSize %d)\n",
            proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length);
972
      if (crc == n_rnti) {
973
        LOG_D(PHY, "(%i.%i) Received dci indication (rnti %x,dci format %s,n_CCE %d,payloadSize %d,payload %llx)\n",
974
              proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length,*(unsigned long long*)dci_estimation);
975 976 977 978 979 980 981 982 983 984 985
        uint16_t mb = nr_dci_false_detection(dci_estimation,tmp_e,currentPtrDCI,L*108,n_rnti);
        ue->dci_thres = (ue->dci_thres + mb) / 2;
        if (mb > (ue->dci_thres+20)) {
          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);
          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;
986
          dci_ind->dci_list[dci_ind->number_of_dcis].N_CCE       = L;
987 988 989 990 991
          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
cig's avatar
cig committed
992
        }
993 994 995
      } else {
        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]);
      }
996 997
    }
  }
francescomani's avatar
francescomani committed
998
  pdcch_vars->nb_search_space = 0;
999 1000 1001 1002
  return(dci_ind->number_of_dcis);
}

/*
1003 1004 1005 1006 1007 1008
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,
1009
                                uint8_t nr_slot_rx,
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
                                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
1028
  uint32_t crc, CCEind, nCCE[3];
Agustin's avatar
Agustin committed
1029
  uint32_t *CCEmap = NULL, CCEmap_mask = 0;
hongzhi wang's avatar
hongzhi wang committed
1030
  uint8_t L2 = (1 << L);
Agustin's avatar
Agustin committed
1031 1032
  unsigned int Yk, nb_candidates = 0, i, m;
  unsigned int CCEmap_cand;
Guy De Souza's avatar
Guy De Souza committed
1033
  uint32_t decoderState=0;
Agustin's avatar
Agustin committed
1034
  // A[p], p is the current active CORESET
1035
  uint16_t A[3]= {39827,39829,39839};
Agustin's avatar
Agustin committed
1036 1037 1038
  //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
1039
  //uint8_t cce_max_slot_pdcch_Table10_1_3 [4] = {56,56,48,32};
Agustin's avatar
Agustin committed
1040
  int coreset_nbr_cce_per_symbol=0;
1041
  LOG_DDD("format_found is %d \n", *format_found);
1042 1043
  //if (mode == NO_DCI) {
  //  #ifdef NR_PDCCH_DCI_DEBUG
1044
  //    LOG_DDD("skip DCI decoding: expect no DCIs at nr_slot_rx %d in current searchSpace\n", nr_slot_rx);
1045 1046 1047
  //  #endif
  //  return;
  //}
1048
  LOG_DDD("frequencyDomainResources=%lx, duration=%d\n",
1049 1050
         pdcch_vars[eNB_id]->coreset[p].frequencyDomainResources, pdcch_vars[eNB_id]->coreset[p].duration);

Agustin's avatar
Agustin committed
1051 1052 1053 1054 1055
  // 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++;
  }
1056

Agustin's avatar
Agustin committed
1057 1058 1059 1060 1061 1062
  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)
1063
  LOG_DDD("nCCE[%d]=%d\n",p,nCCE[p]);
Agustin's avatar
Agustin committed
1064

1065 1066 1067 1068 1069 1070
  //  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;
 // }
1071

1072 1073 1074 1075 1076 1077
//  if (nCCE < L2) {
//  LOG_D(PHY, "skip DCI decoding: nCCE=%d < L2=%d\n", nCCE, L2);
//  return;
//  }

//  if (mode == NO_DCI) {
1078 1079
//  LOG_D(PHY, "skip DCI decoding: expect no DCIs at nr_slot_rx %d\n",
//  nr_slot_rx);
1080 1081
//  return;
//  }
1082

Agustin's avatar
Agustin committed
1083 1084
  if (do_common == 1) {
    Yk = 0;
1085

Agustin's avatar
Agustin committed
1086
    if (pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.common_dci_formats == cformat2_0) {
1087 1088
      // for dci_format_2_0, the nb_candidates is obtained from a different variable
      switch (L2) {
1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
        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;
1111
      }
Agustin's avatar
Agustin committed
1112
    } else if (pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.common_dci_formats == cformat2_3) {
1113 1114
      // 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
1115 1116
    } else {
      nb_candidates = (L2 == 4) ? 4 : ((L2 == 8)? 2 : 1); // according to Table 10.1-1 (38.213 section 10.1)
1117
      LOG_DDD("we are in common searchSpace and nb_candidates=%u for L2=%d\n", nb_candidates, L2);
Agustin's avatar
Agustin committed
1118 1119 1120
    }
  } else {
    switch (L2) {
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142
      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
1143
    }
1144

Agustin's avatar
Agustin committed
1145 1146 1147 1148
    // 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;
1149

1150
    for (i = 0; i <= nr_slot_rx; i++)
1151
      Yk = (Yk * A[p%3]) % 65537;
Agustin's avatar
Agustin committed
1152
  }
1153

1154
  LOG_DDD("L2(%d) | nCCE[%d](%d) | Yk(%u) | nb_candidates(%u)\n", L2, p, nCCE[p], Yk, nb_candidates);
1155 1156 1157
  //  for (CCEind=0;
  //    CCEind<nCCE2;
  //    CCEind+=(1<<L)) {
1158 1159
  //  if (nb_candidates * L2 > nCCE[p])
  //    nb_candidates = nCCE[p] / L2;
1160
  // 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
1161
  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);
1162

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

1165
  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]);
1166

Agustin's avatar
Agustin committed
1167 1168
  for (m = 0; m < nb_candidates; m++) {
    int n_ci = 0;
1169

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

1172 1173
  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
1174
  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
1175
  LOG_DDD("CCEind(%u) = (((Yk(%u) + ((m(%u)*nCCE[p](%u))/(L2(%d)*m_p_s_L_max(%d)))) %% (nCCE[p] / L2)) * L2)\n",
1176
            CCEind,Yk,m,nCCE[p],L2,m_p_s_L_max);
frtabu's avatar
frtabu committed
1177
  LOG_DDD("n_candidate(m)=%u | CCEind=%u |",m,CCEind);
1178

Agustin's avatar
Agustin committed
1179 1180 1181 1182 1183 1184
    if (CCEind < 32)
      CCEmap = CCEmap0;
    else if (CCEind < 64)
      CCEmap = CCEmap1;
    else if (CCEind < 96)
      CCEmap = CCEmap2;
frtabu's avatar
frtabu committed
1185
    else AssertFatal(1==0,"Illegal CCEind %u (Yk %u, m %u, nCCE %u, L2 %u\n", CCEind, Yk, m, nCCE[p], L2);
1186

Agustin's avatar
Agustin committed
1187
    switch (L2) {
1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211
      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
1212
    }
1213

Agustin's avatar
Agustin committed
1214 1215
    CCEmap_cand = (*CCEmap) & CCEmap_mask;
    // CCE is not allocated yet
1216
    LOG_DDD("CCEmap_cand=%u \n",CCEmap_cand);
1217

1218
    if (CCEmap_cand == 0) {
1219
#ifdef DEBUG_DCI_DECODING
1220

1221
      if (do_common == 1)
1222 1223
        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);
1224
      else
1225 1226 1227
        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);

1228
#endif
1229 1230
      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");
1231
      //      for (int m=0; m < (nCCE[p]*6*9*2); m++)
frtabu's avatar
frtabu committed
1232
      LOG_DDD("(polar decoding)-> polar intput (with coreset_time_dur=%d, coreset_nbr_rb=%d, p=%d, CCEind=%u): \n",
1233
             coreset_time_dur,coreset_nbr_rb,p,CCEind);
1234 1235 1236 1237 1238 1239
      
      //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++){
1240
      //polar_input[reg_p+i] = (pdcch_vars[eNB_id]->e_rx[((CCEind*9*6*2) + reg_e + i)]>0) ? (1.0):(-1.0);
1241
      //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));
1242 1243 1244 1245
      //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)]);
1246 1247
      //}
      //}
1248

1249 1250 1251 1252 1253 1254
      //#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++;
1255
      //polar_hex[j] = (polar_hex[j]<<1) + ((polar_input[i]==-1)? 1:0);
1256 1257 1258 1259 1260
      //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
      
1261
      uint64_t dci_estimation[2]= {0};
Raymond Knopp's avatar
Raymond Knopp committed
1262
      const t_nrPolar_params *currentPtrDCI=nr_polar_params(1, sizeof_bits, L2,1);
1263
      decoderState = polar_decoder_int16(&pdcch_vars[eNB_id]->e_rx[CCEind*9*6*2],
1264
                                         dci_estimation,
1265
                                         1,
1266
                                         currentPtrDCI);
Guy De Souza's avatar
Guy De Souza committed
1267
      crc = decoderState;
1268
      //crc = (crc16(&dci_decoded_output[current_thread_id][0], sizeof_bits) >> 16) ^ extract_crc(&dci_decoded_output[current_thread_id][0], sizeof_bits);
1269 1270
      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");
1271
#ifdef DEBUG_DCI_DECODING
1272
      LOG_DDD("(nr_dci_decoding_procedure0: crc =>%d\n",crc);
1273
#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
1274 1275
      LOG_DDD("format_found=%d\n",*format_found);
      LOG_DDD("crc_scrambled=%d\n",*crc_scrambled);
1276 1277

      if (crc == crc_scrambled_values[_C_RNTI_])  {
1278 1279
        *crc_scrambled =_c_rnti;
        *format_found=1;
1280
      }
1281

1282
      if (crc == crc_scrambled_values[_CS_RNTI_])  {
1283 1284
        *crc_scrambled =_cs_rnti;
        *format_found=1;
1285
      }
1286

1287
      if (crc == crc_scrambled_values[_NEW_RNTI_])  {
1288 1289
        *crc_scrambled =_new_rnti;
        *format_found=1;
1290
      }
1291

1292
      if (crc == crc_scrambled_values[_TC_RNTI_])  {
1293 1294
        *crc_scrambled =_tc_rnti;
        *format_found=_format_1_0_found;
Agustin's avatar
Agustin committed
1295
      }
1296

1297
      if (crc == crc_scrambled_values[_P_RNTI_])  {
1298 1299
        *crc_scrambled =_p_rnti;
        *format_found=_format_1_0_found;
1300
      }
1301

1302
      if (crc == crc_scrambled_values[_SI_RNTI_])  {
1303 1304
        *crc_scrambled =_si_rnti;
        *format_found=_format_1_0_found;
1305
      }
1306

1307
      if (crc == crc_scrambled_values[_RA_RNTI_])  {
1308 1309
        *crc_scrambled =_ra_rnti;
        *format_found=_format_1_0_found;
1310
      }
1311

1312
      if (crc == crc_scrambled_values[_SP_CSI_RNTI_])  {
1313 1314
        *crc_scrambled =_sp_csi_rnti;
        *format_found=_format_0_1_found;
1315
      }
1316

1317
      if (crc == crc_scrambled_values[_SFI_RNTI_])  {
1318 1319
        *crc_scrambled =_sfi_rnti;
        *format_found=_format_2_0_found;
1320
      }
1321

1322
      if (crc == crc_scrambled_values[_INT_RNTI_])  {
1323 1324
        *crc_scrambled =_int_rnti;
        *format_found=_format_2_1_found;
1325
      }
1326

1327
      if (crc == crc_scrambled_values[_TPC_PUSCH_RNTI_]) {
1328 1329
        *crc_scrambled =_tpc_pusch_rnti;
        *format_found=_format_2_2_found;
1330
      }
1331

1332
      if (crc == crc_scrambled_values[_TPC_PUCCH_RNTI_]) {
1333 1334
        *crc_scrambled =_tpc_pucch_rnti;
        *format_found=_format_2_2_found;
1335
      }
1336

1337
      if (crc == crc_scrambled_values[_TPC_SRS_RNTI_]) {
1338 1339
        *crc_scrambled =_tpc_srs_rnti;
        *format_found=_format_2_3_found;
1340
      }
1341

1342

1343 1344
      LOG_DDD("format_found=%d\n",*format_found);
      LOG_DDD("crc_scrambled=%d\n",*crc_scrambled);
1345

1346
      if (*format_found!=255) {
1347 1348 1349 1350
        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;
1351 1352
        memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_estimation,8);

1353
        LOG_DDD("rnti matches -> DCI FOUND !!! crc =>0x%x, sizeof_bits %d, sizeof_bytes %d \n",
1354
                dci_alloc[*dci_cnt].rnti, dci_alloc[*dci_cnt].dci_length, sizeof_bytes);
1355
        LOG_DDD("dci_cnt %d (format_css %d crc_scrambled %d) L %d, firstCCE %d pdu[0] 0x%lx pdu[1] 0x%lx \n",
1356 1357 1358 1359 1360 1361
                *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;
1362
            //      LOG_DDD("a format1_0=%d and dci_cnt=%d\n",*format_found,*dci_cnt);
1363 1364 1365 1366 1367
          } 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;
1368
              //        LOG_DDD("b format0_0=%d and dci_cnt=%d\n",*format_found,*dci_cnt);
1369 1370 1371 1372 1373 1374
            }

            if ((dci_estimation[0]&1) == 1) {
              dci_alloc[*dci_cnt].format = format1_0;
              *dci_cnt = *dci_cnt + 1;
              *format_found=_format_1_0_found;
1375
              //        LOG_DDD("c format1_0=%d and dci_cnt=%d\n",*format_found,*dci_cnt);
1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418
            }
          }
        }

        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
1419
        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1420

1421 1422 1423 1424 1425 1426 1427 1428 1429
        //        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
1430
        //        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1431 1432 1433 1434 1435 1436 1437 1438 1439 1440
        //        *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;
1441
        //        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1442 1443 1444 1445
        //        }
        //        } else if (format_c == format0) { // this is a format 1A DCI
        //        dci_alloc[*dci_cnt].format = format1A;
        //        *dci_cnt = *dci_cnt + 1;
1446
        //        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1447 1448 1449 1450 1451 1452
        //        } 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;
1453
        //        pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
1454 1455 1456
        //        }
        //        }
        //        }
1457
        //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);
1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479
        //  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
1480

1481 1482 1483 1484 1485
#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
1486
#endif
1487
        return;
Agustin's avatar
Agustin committed
1488 1489
      } // rnti match
    } else { // CCEmap_cand == 0
1490 1491
      printf("\n");
    }
1492

1493 1494 1495 1496 1497 1498 1499 1500
    
    //  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
1501
  } // candidate loop
1502

1503
  LOG_DDD("end candidate loop\n");
Agustin's avatar
Agustin committed
1504 1505
}
*/
1506
#endif
1507 1508


1509

1510 1511 1512 1513




Agustin's avatar
Agustin committed
1514

1515
#if 0
Agustin's avatar
Agustin committed
1516 1517 1518


uint8_t nr_dci_decoding_procedure(int s,
1519 1520 1521 1522 1523
                                  int p,
                                  PHY_VARS_NR_UE *ue,
                                  NR_DCI_ALLOC_t *dci_alloc,
                                  NR_SEARCHSPACE_TYPE_t searchSpacetype,
                                  int16_t eNB_id,
1524
                                  uint8_t nr_slot_rx,
1525 1526 1527 1528 1529 1530
                                  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]) {
1531
  //                                  uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
1532 1533
  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
1534 1535 1536 1537
  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
1538 1539
  uint8_t dci_cnt = 0, old_dci_cnt = 0;
  uint32_t CCEmap0 = 0, CCEmap1 = 0, CCEmap2 = 0;
1540 1541
  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
1542 1543 1544
  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;
1545
  uint16_t coreset_nbr_rb=0;
1546

hongzhi wang's avatar
hongzhi wang committed
1547 1548 1549
  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
1550
  }
1551

hongzhi wang's avatar
hongzhi wang committed
1552 1553
  coreset_nbr_rb = 6 * coreset_nbr_rb;
  // coreset_time_dur,coreset_nbr_rb,
Agustin's avatar
Agustin committed
1554
  NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
1555
  //uint8_t mi;// = get_mi(&ue->frame_parms, nr_slot_rx);
1556 1557
  //uint8_t tmode = ue->transmission_mode[eNB_id];
  //uint8_t frame_type = frame_parms->frame_type;
1558 1559 1560 1561 1562 1563
  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
1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578
  /*
   *
   * 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
1579 1580
  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
1581 1582 1583 1584 1585 1586 1587 1588 1589
  // 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
   */
1590
  //dci_detect_mode_t mode = 3; //dci_detect_mode_select(&ue->frame_parms, nr_slot_rx);
1591 1592
  LOG_DD("searSpaceType=%d\n",do_common);
  LOG_DD("%s_dci_format=%d\n",do_common?"uss":"css",css_dci_format);
1593 1594


Agustin's avatar
Agustin committed
1595
  // 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
1596
  if (do_common==0) { // COMMON SearchSpaceType assigned to current SearchSpace/CORESET
Agustin's avatar
Agustin committed
1597
    // Type0-PDCCH  common search space for a DCI format with CRC scrambled by a SI-RNTI
1598 1599 1600 1601 1602 1603
    // 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
1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618
    // 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!
1619
      // for format0_0 and format1_0, first we calculate dci pdu size
1620
      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);
1621
      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);
1622
      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",
1623 1624
             css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);

1625
      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) { // We fix aggregationLevel to 3 for testing=> nbr of CCE=8
1626 1627
        //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
1628
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1629 1630
               css_dci_format,(1<<aggregationLevel));
        old_dci_cnt = dci_cnt;
1631
        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,
1632 1633 1634 1635 1636 1637 1638 1639
                                   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;
1640
          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,
1641 1642 1643 1644 1645 1646 1647
                                     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];
        }
1648
      }
Agustin's avatar
Agustin committed
1649 1650 1651 1652 1653 1654
    }

    // 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
1655
      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);
1656
      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);
1657
      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",
1658 1659 1660
             css_dci_format,format_2_0_size_bits,format_2_0_size_bytes);

      for (int aggregationLevelSFI = 0; aggregationLevelSFI<5 ; aggregationLevelSFI++) {
1661
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1662 1663 1664
               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;
1665
        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,
1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679
                                   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];
        }
1680
      }
Agustin's avatar
Agustin committed
1681
    }
1682

Agustin's avatar
Agustin committed
1683 1684
    if (css_dci_format == cformat2_1) {
      // for format2_1, first we calculate dci pdu size
1685
      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);
1686
      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);
1687
      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",
1688 1689 1690
             css_dci_format,format_2_1_size_bits,format_2_1_size_bytes);

      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) {
1691
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1692 1693 1694
               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;
1695
        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,
1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
                                   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];
        }
1710
      }
Agustin's avatar
Agustin committed
1711
    }
1712

Agustin's avatar
Agustin committed
1713 1714
    if (css_dci_format == cformat2_2) {
      // for format2_2, first we calculate dci pdu size
1715
      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);
1716
      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);
1717
      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",
1718 1719 1720
             css_dci_format,format_2_2_size_bits,format_2_2_size_bytes);

      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) {
1721
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1722 1723 1724
               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;
1725
        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,
1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739
                                   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];
        }
1740
      }
Agustin's avatar
Agustin committed
1741
    }
1742

Agustin's avatar
Agustin committed
1743 1744
    if (css_dci_format == cformat2_3) {
      // for format2_1, first we calculate dci pdu size
1745
      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);
1746
      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);
1747
      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",
1748
             css_dci_format,format_2_3_size_bits,format_2_3_size_bytes);
Agustin's avatar
Agustin committed
1749

1750
      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) {
1751
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1752 1753 1754
               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;
1755
        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,
1756 1757 1758 1759 1760 1761 1762 1763 1764
                                   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
1765

1766 1767 1768 1769 1770 1771
          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
1772 1773 1774
  } 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) {
1775
      // for format0_0 and format1_0, first we calculate dci pdu size
1776
      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);
1777
      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);
1778
      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",
1779 1780
             css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);

1781
      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) { // We fix aggregationLevel to 3 for testing=> nbr of CCE=8
1782 1783
        //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
1784
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1785 1786
               css_dci_format,(1<<aggregationLevel));
        old_dci_cnt = dci_cnt;
1787
        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,
1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801
                                   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];
        }
1802
      }
1803
    }
Agustin's avatar
Agustin committed
1804

1805 1806
    if (uss_dci_format == uformat0_1_and_1_1) {
      // for format0_0 and format1_0, first we calculate dci pdu size
1807
      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);
1808
      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);
1809
      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",
1810 1811
             css_dci_format,format_0_1_1_1_size_bits,format_0_1_1_1_size_bytes);

1812
      for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) { // We fix aggregationLevel to 3 for testing=> nbr of CCE=8
1813 1814
        //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
1815
        LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
1816 1817
               css_dci_format,(1<<aggregationLevel));
        old_dci_cnt = dci_cnt;
1818
        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,
1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832
                                   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];
        }
1833
      }
Agustin's avatar
Agustin committed
1834
    }
1835
  }
1836

1837 1838
  *crc_scrambled = crc_scrambled_;
  *format_found  = format_found_;
1839 1840
  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
1841 1842
  return(dci_cnt);
}
1843

Agustin's avatar
Agustin committed
1844
#endif