defs_nr_UE.h 45.3 KB
Newer Older
Guy De Souza's avatar
Guy De Souza committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * 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
 */

Wang's avatar
Wang committed
22
/*! \file PHY/defs_nr_UE.h
Guido Casati's avatar
Guido Casati committed
23
 \brief Top-level constants and data structures definitions for NR UE
Agustin's avatar
Agustin committed
24
 \author Guy De Souza, H. WANG, A. Mico Pereperez
25
26
27
28
29
30
31
 \date 2018
 \version 0.1
 \company Eurecom
 \email: desouza@eurecom.fr
 \note
 \warning
*/
Wang's avatar
Wang committed
32
33
#ifndef __PHY_DEFS_NR_UE__H__
#define __PHY_DEFS_NR_UE__H__
34
35
36


#include "defs_nr_common.h"
Hongzhi Wang's avatar
Hongzhi Wang committed
37
38
#include "CODING/nrPolar_tools/nr_polar_pbch_defs.h"

39

40
#define _GNU_SOURCE
Wang's avatar
Wang committed
41
42
43
44
45
46
47
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
#include "common_lib.h"
#include "msc.h"
48
#include "fapi_nr_ue_interface.h"
Wang's avatar
Wang committed
49
#include "assertions.h"
Guido Casati's avatar
Guido Casati committed
50

Wang's avatar
Wang committed
51
#ifdef MEX
52
  #define msg mexPrintf
Wang's avatar
Wang committed
53
#else
54
55
  #ifdef OPENAIR2
    #if ENABLE_RAL
56
      #include "common/utils/hashtable/hashtable.h"
57
58
59
60
61
62
63
      #include "COMMON/ral_messages_types.h"
      #include "UTIL/queue.h"
    #endif
    #define msg(aRGS...) LOG_D(PHY, ##aRGS)
  #else
    #define msg printf
  #endif
Wang's avatar
Wang committed
64
65
66
67
68
#endif
//use msg in the real-time thread context
#define msg_nrt printf
//use msg_nrt in the non real-time context (for initialization, ...)
#ifndef malloc16
69
70
71
72
73
  #ifdef __AVX2__
    #define malloc16(x) memalign(32,x)
  #else
    #define malloc16(x) memalign(16,x)
  #endif
Wang's avatar
Wang committed
74
75
76
77
78
79
80
#endif
#define free16(y,x) free(y)
#define bigmalloc malloc
#define bigmalloc16 malloc16
#define openair_free(y,x) free((y))
#define PAGE_SIZE 4096

81
82
83
84
85
86
87
88
89
#ifdef NR_UNIT_TEST
  #define FILE_NAME                " "
  #define LINE_FILE                (0)
  #define NR_TST_PHY_PRINTF(...)   printf(__VA_ARGS__)
#else
  #define FILE_NAME                (__FILE__)
  #define LINE_FILE                (__LINE__)
  #define NR_TST_PHY_PRINTF(...)
#endif
Wang's avatar
Wang committed
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

#define PAGE_MASK 0xfffff000
#define virt_to_phys(x) (x)
#define openair_sched_exit() exit(-1)

#define bzero(s,n) (memset((s),0,(n)))
#define cmax(a,b)  ((a>b) ? (a) : (b))
#define cmin(a,b)  ((a<b) ? (a) : (b))
#define cmax3(a,b,c) ((cmax(a,b)>c) ? (cmax(a,b)) : (c))
/// suppress compiler warning for unused arguments
#define UNUSED(x) (void)x;

#include "impl_defs_top.h"
#include "impl_defs_nr.h"
#include "PHY/TOOLS/time_meas.h"
#include "PHY/CODING/coding_defs.h"
#include "PHY/TOOLS/tools_defs.h"
#include "platform_types.h"
#include "NR_UE_TRANSPORT/nr_transport_ue.h"

#if defined(UPGRADE_RAT_NR)
111
  #include "PHY/NR_REFSIG/ss_pbch_nr.h"
Wang's avatar
Wang committed
112
113
#endif

Agustin's avatar
Agustin committed
114
#include "PHY/NR_UE_TRANSPORT/dci_nr.h"
Wang's avatar
Wang committed
115
116
117
#include <pthread.h>
#include "targets/ARCH/COMMON/common_lib.h"

Guido Casati's avatar
Guido Casati committed
118
/// Context data structure for gNB subframe processing
Wang's avatar
Wang committed
119
120
121
122
123
124
125
typedef struct {
  /// Component Carrier index
  uint8_t              CC_id;
  /// Last RX timestamp
  openair0_timestamp timestamp_rx;
} UE_nr_proc_t;

Hongzhi Wang's avatar
Hongzhi Wang committed
126
127
128
129
130
131
132
typedef enum {
  NR_PBCH_EST=0,
  NR_PDCCH_EST,
  NR_PDSCH_EST,
  NR_SSS_EST,
} NR_CHANNEL_EST_t;

Wang's avatar
Wang committed
133
134
135
136
137
138
139
140
141
142
143
144
#define debug_msg if (((mac_xface->frame%100) == 0) || (mac_xface->frame < 50)) msg

typedef struct {

  // RRC measurements
  uint32_t rssi;
  int n_adj_cells;
  unsigned int adj_cell_id[6];
  uint32_t rsrq[7];
  uint32_t rsrp[7];
  float rsrp_filtered[7]; // after layer 3 filtering
  float rsrq_filtered[7];
145
  short rsrp_dBm[7];
Wang's avatar
Wang committed
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  // common measurements
  //! estimated noise power (linear)
  unsigned int   n0_power[NB_ANTENNAS_RX];
  //! estimated noise power (dB)
  unsigned short n0_power_dB[NB_ANTENNAS_RX];
  //! total estimated noise power (linear)
  unsigned int   n0_power_tot;
  //! total estimated noise power (dB)
  unsigned short n0_power_tot_dB;
  //! average estimated noise power (linear)
  unsigned int   n0_power_avg;
  //! average estimated noise power (dB)
  unsigned short n0_power_avg_dB;
  //! total estimated noise power (dBm)
  short n0_power_tot_dBm;

  // UE measurements
  //! estimated received spatial signal power (linear)
Guido Casati's avatar
Guido Casati committed
164
  int            rx_spatial_power[NUMBER_OF_CONNECTED_gNB_MAX][2][2];
Wang's avatar
Wang committed
165
  //! estimated received spatial signal power (dB)
Guido Casati's avatar
Guido Casati committed
166
  unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_gNB_MAX][2][2];
Wang's avatar
Wang committed
167
168

  /// estimated received signal power (sum over all TX antennas)
Guido Casati's avatar
Guido Casati committed
169
  int            rx_power[NUMBER_OF_CONNECTED_gNB_MAX][NB_ANTENNAS_RX];
Wang's avatar
Wang committed
170
  /// estimated received signal power (sum over all TX antennas)
Guido Casati's avatar
Guido Casati committed
171
  unsigned short rx_power_dB[NUMBER_OF_CONNECTED_gNB_MAX][NB_ANTENNAS_RX];
Wang's avatar
Wang committed
172
173

  /// estimated received signal power (sum over all TX/RX antennas)
Guido Casati's avatar
Guido Casati committed
174
  int            rx_power_tot[NUMBER_OF_CONNECTED_gNB_MAX]; //NEW
Wang's avatar
Wang committed
175
  /// estimated received signal power (sum over all TX/RX antennas)
Guido Casati's avatar
Guido Casati committed
176
  unsigned short rx_power_tot_dB[NUMBER_OF_CONNECTED_gNB_MAX]; //NEW
Wang's avatar
Wang committed
177
178

  //! estimated received signal power (sum of all TX/RX antennas, time average)
Guido Casati's avatar
Guido Casati committed
179
  int            rx_power_avg[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
180
  //! estimated received signal power (sum of all TX/RX antennas, time average, in dB)
Guido Casati's avatar
Guido Casati committed
181
  unsigned short rx_power_avg_dB[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
182
183

  /// SINR (sum of all TX/RX antennas, in dB)
Guido Casati's avatar
Guido Casati committed
184
  int            wideband_cqi_tot[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
185
  /// SINR (sum of all TX/RX antennas, time average, in dB)
Guido Casati's avatar
Guido Casati committed
186
  int            wideband_cqi_avg[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
187
188

  //! estimated rssi (dBm)
Guido Casati's avatar
Guido Casati committed
189
  short          rx_rssi_dBm[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
190
  //! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
191
  int            rx_correlation[NUMBER_OF_CONNECTED_gNB_MAX][4][4];
Wang's avatar
Wang committed
192
  //! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
Guido Casati's avatar
Guido Casati committed
193
  int            rx_correlation_dB[NUMBER_OF_CONNECTED_gNB_MAX][2];
Wang's avatar
Wang committed
194
195

  /// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (3,4,5,6), up to 4 spatial streams)
Guido Casati's avatar
Guido Casati committed
196
  int            precoded_cqi_dB[NUMBER_OF_CONNECTED_gNB_MAX+1][4];
Wang's avatar
Wang committed
197
  /// Subband CQI per RX antenna (= SINR)
Guido Casati's avatar
Guido Casati committed
198
  int            subband_cqi[NUMBER_OF_CONNECTED_gNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX];
Wang's avatar
Wang committed
199
  /// Total Subband CQI  (= SINR)
Guido Casati's avatar
Guido Casati committed
200
  int            subband_cqi_tot[NUMBER_OF_CONNECTED_gNB_MAX][NUMBER_OF_SUBBANDS_MAX];
Wang's avatar
Wang committed
201
  /// Subband CQI in dB (= SINR dB)
Guido Casati's avatar
Guido Casati committed
202
  int            subband_cqi_dB[NUMBER_OF_CONNECTED_gNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX];
Wang's avatar
Wang committed
203
  /// Total Subband CQI
Guido Casati's avatar
Guido Casati committed
204
  int            subband_cqi_tot_dB[NUMBER_OF_CONNECTED_gNB_MAX][NUMBER_OF_SUBBANDS_MAX];
Wang's avatar
Wang committed
205
  /// Wideband PMI for each RX antenna
Guido Casati's avatar
Guido Casati committed
206
  int            wideband_pmi_re[NUMBER_OF_CONNECTED_gNB_MAX][NB_ANTENNAS_RX];
Wang's avatar
Wang committed
207
  /// Wideband PMI for each RX antenna
Guido Casati's avatar
Guido Casati committed
208
  int            wideband_pmi_im[NUMBER_OF_CONNECTED_gNB_MAX][NB_ANTENNAS_RX];
Wang's avatar
Wang committed
209
  ///Subband PMI for each RX antenna
Guido Casati's avatar
Guido Casati committed
210
  int            subband_pmi_re[NUMBER_OF_CONNECTED_gNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX];
Wang's avatar
Wang committed
211
  ///Subband PMI for each RX antenna
Guido Casati's avatar
Guido Casati committed
212
  int            subband_pmi_im[NUMBER_OF_CONNECTED_gNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX];
Wang's avatar
Wang committed
213
  /// chosen RX antennas (1=Rx antenna 1, 2=Rx antenna 2, 3=both Rx antennas)
Guido Casati's avatar
Guido Casati committed
214
  unsigned char           selected_rx_antennas[NUMBER_OF_CONNECTED_gNB_MAX][NUMBER_OF_SUBBANDS_MAX];
Wang's avatar
Wang committed
215
  /// Wideband Rank indication
Guido Casati's avatar
Guido Casati committed
216
  unsigned char  rank[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
217
218
219
220
221
222
223
224
225
  /// Number of RX Antennas
  unsigned char  nb_antennas_rx;
  /// DLSCH error counter
  // short          dlsch_errors;

} PHY_NR_MEASUREMENTS;

typedef struct {

226
227
228
229
230
231
  /// \brief Holds the received data in the frequency domain.
  /// - first index: rx antenna [0..nb_antennas_rx[
  /// - second index: symbol [0..28*ofdm_symbol_size[
  int32_t **rxdataF;

} NR_UE_COMMON_PER_THREAD;
Wang's avatar
Wang committed
232

233
234
235
236
237
typedef struct {
  /// TX buffers for multiple layers
  int32_t *txdataF_layers[NR_MAX_NB_LAYERS];
  } NR_UE_PUSCH;

Wang's avatar
Wang committed
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
typedef struct {
  /// \brief Holds the transmit data in time domain.
  /// For IFFT_FPGA this points to the same memory as PHY_vars->tx_vars[a].TX_DMA_BUFFER.
  /// - first index: tx antenna [0..nb_antennas_tx[
  /// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES[
  int32_t **txdata;
  /// \brief Holds the transmit data in the frequency domain.
  /// For IFFT_FPGA this points to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER.
  /// - first index: tx antenna [0..nb_antennas_tx[
  /// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX[
  int32_t **txdataF;

  /// \brief Holds the received data in time domain.
  /// Should point to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER.
  /// - first index: rx antenna [0..nb_antennas_rx[
253
  /// - second index: sample [0..2*FRAME_LENGTH_COMPLEX_SAMPLES+2048[
Wang's avatar
Wang committed
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
  int32_t **rxdata;

  NR_UE_COMMON_PER_THREAD common_vars_rx_data_per_thread[RX_NB_TH_MAX];

  /// holds output of the sync correlator
  int32_t *sync_corr;
  /// estimated frequency offset (in radians) for all subcarriers
  int32_t freq_offset;
  /// eNb_id user is synched to
  int32_t eNb_id;
} NR_UE_COMMON;

typedef struct {
  /// \brief Received frequency-domain signal after extraction.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **rxdataF_ext;
  /// \brief Received frequency-domain ue specific pilots.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..12*N_RB_DL[
  int32_t **rxdataF_uespec_pilots;
  /// \brief Received frequency-domain signal after extraction and channel compensation.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **rxdataF_comp0;
  /// \brief Received frequency-domain signal after extraction and channel compensation for the second stream. For the SIC receiver we need to store the history of this for each harq process and round
  /// - first index: ? [0..7] (hard coded) accessed via \c harq_pid
  /// - second index: ? [0..7] (hard coded) accessed via \c round
  /// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - fourth index: ? [0..168*N_RB_DL[
  int32_t **rxdataF_comp1[8][8];
285
286
287
288
  /// \brief Hold the channel estimates in frequency domain.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
  int32_t **dl_ch_estimates;
Wang's avatar
Wang committed
289
290
291
292
  /// \brief Downlink channel estimates extracted in PRBS.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_estimates_ext;
293
294
295
296
  /// \brief Downlink channel estimates extracted in PRBS.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_ptrs_estimates_ext;
Wang's avatar
Wang committed
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
  /// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS. For the SIC receiver we need to store the history of this for each harq process and round
  /// - first index: ? [0..7] (hard coded) accessed via \c harq_pid
  /// - second index: ? [0..7] (hard coded) accessed via \c round
  /// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - fourth index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_rho_ext[8][8];
  /// \brief Downlink beamforming channel estimates in frequency domain.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
  int32_t **dl_bf_ch_estimates;
  /// \brief Downlink beamforming channel estimates.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_bf_ch_estimates_ext;
  /// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_rho2_ext;
  /// \brief Downlink PMIs extracted in PRBS and grouped in subbands.
  /// - first index: ressource block [0..N_RB_DL[
  uint8_t *pmi_ext;
  /// \brief Magnitude of Downlink Channel first layer (16QAM level/First 64QAM level).
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_mag0;
  /// \brief Magnitude of Downlink Channel second layer (16QAM level/First 64QAM level).
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_mag1[8][8];
  /// \brief Magnitude of Downlink Channel, first layer (2nd 64QAM level).
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_magb0;
  /// \brief Magnitude of Downlink Channel second layer (2nd 64QAM level).
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_magb1[8][8];
334
335
  /// \brief Magnitude of Downlink Channel, first layer (256QAM level).
  int32_t **dl_ch_magr0;
336
337
  /// \brief Cross-correlation Matrix of the gNB Tx channel signals.
  /// - first index: aatx*n_rx+aarx for all aatx=[0..n_tx[ and aarx=[0..nb_rx[
Wang's avatar
Wang committed
338
  /// - second index: symbol [0..]
339
  int32_t ***rho;
Wang's avatar
Wang committed
340
341
342
343
  /// \brief Pointers to llr vectors (2 TBs).
  /// - first index: ? [0..1] (hard coded)
  /// - second index: ? [0..1179743] (hard coded)
  int16_t *llr[2];
344
345
  /// Pointers to layer llr vectors (4 layers).
  int16_t *layer_llr[4];
Wang's avatar
Wang committed
346
347
  /// \f$\log_2(\max|H_i|^2)\f$
  int16_t log2_maxh;
348
  /// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer1 channel compensation
Wang's avatar
Wang committed
349
  int16_t log2_maxh0;
350
  /// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer2 channel commpensation
Wang's avatar
Wang committed
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
  int16_t log2_maxh1;
  /// \brief LLR shifts for subband scaling.
  /// - first index: ? [0..168*N_RB_DL[
  uint8_t *llr_shifts;
  /// \brief Pointer to LLR shifts.
  /// - first index: ? [0..168*N_RB_DL[
  uint8_t *llr_shifts_p;
  /// \brief Pointers to llr vectors (128-bit alignment).
  /// - first index: ? [0..0] (hard coded)
  /// - second index: ? [0..]
  int16_t **llr128;
  /// \brief Pointers to llr vectors (128-bit alignment).
  /// - first index: ? [0..0] (hard coded)
  /// - second index: ? [0..]
  int16_t **llr128_2ndstream;
  //uint32_t *rb_alloc;
  //uint8_t Qm[2];
  //MIMO_mode_t mimo_mode;
  // llr offset per ofdm symbol
  uint32_t llr_offset[14];
  // llr length per ofdm symbol
  uint32_t llr_length[14];
373
374
375
376
377
378
379
380
381
382
  // llr offset per ofdm symbol
  uint32_t dl_valid_re[14];
  /// \brief Estimated phase error based upon PTRS on each symbol .
  /// - first index: ? [0..7] Number of Antenna
  /// - second index: ? [0...14] smybol per slot
  int32_t **ptrs_phase_per_slot;
  /// \brief Estimated phase error based upon PTRS on each symbol .
  /// - first index: ? [0..7] Number of Antenna
  /// - second index: ? [0...14] smybol per slot
  int32_t **ptrs_re_per_slot;
Wang's avatar
Wang committed
383
384
} NR_UE_PDSCH;

Agustin's avatar
Agustin committed
385
#define NR_PDCCH_DEFS_NR_UE
386
387
#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 SearchSpaces per BWP is limited to 10 (including initial SEARCHSPACE: SearchSpaceId 0)
Agustin's avatar
Agustin committed
388
389
#ifdef NR_PDCCH_DEFS_NR_UE

390
#define MAX_NR_DCI_DECODED_SLOT     10    // This value is not specified
391

392
393
394
395
396
397
398
399
400
401


typedef enum {
  _format_0_0_found=0,
  _format_0_1_found=1,
  _format_1_0_found=2,
  _format_1_1_found=3,
  _format_2_0_found=4,
  _format_2_1_found=5,
  _format_2_2_found=6,
402
403
  _format_2_3_found=7
} format_found_t;
404
405
406
407
408
409
410
411
412
413
414
415
416
417
#define TOTAL_NBR_SCRAMBLED_VALUES 13
#define _C_RNTI_           0
#define _CS_RNTI_          1
#define _NEW_RNTI_         2
#define _TC_RNTI_          3
#define _P_RNTI_           4
#define _SI_RNTI_          5
#define _RA_RNTI_          6
#define _SP_CSI_RNTI_      7
#define _SFI_RNTI_         8
#define _INT_RNTI_         9
#define _TPC_PUSCH_RNTI_  10
#define _TPC_PUCCH_RNTI_  11
#define _TPC_SRS_RNTI_    12
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
typedef enum {                          /* see 38.321  Table 7.1-2  RNTI usage */
  _c_rnti         = _C_RNTI_,         /* Cell RNTI */
  _cs_rnti        = _CS_RNTI_,        /* Configured Scheduling RNTI */
  _new_rnti       = _NEW_RNTI_,       /* ? */
  _tc_rnti        = _TC_RNTI_,        /* Temporary C-RNTI */
  _p_rnti         = _P_RNTI_,         /* Paging RNTI */
  _si_rnti        = _SI_RNTI_,        /* System information RNTI */
  _ra_rnti        = _RA_RNTI_,        /* Random Access RNTI */
  _sp_csi_rnti    = _SP_CSI_RNTI_,    /* Semipersistent CSI reporting on PUSCH */
  _sfi_rnti       = _SFI_RNTI_,       /* Slot Format Indication on the given cell */
  _int_rnti       = _INT_RNTI_,       /* Indication pre-emption in DL */
  _tpc_pusch_rnti = _TPC_PUSCH_RNTI_, /* PUSCH power control */
  _tpc_pucch_rnti = _TPC_PUCCH_RNTI_, /* PUCCH power control */
  _tpc_srs_rnti   = _TPC_SRS_RNTI_
} crc_scrambled_t;
433

Agustin's avatar
Agustin committed
434
435
436
437
438
439
440
441
442
443
444
445
446
447
typedef enum {bundle_n2=2,bundle_n3=3,bundle_n6=6} NR_UE_CORESET_REG_bundlesize_t;

typedef enum {interleave_n2=2,interleave_n3=3,interleave_n6=6} NR_UE_CORESET_interleaversize_t;

typedef struct {
  //Corresponds to L1 parameter 'CORESET-REG-bundle-size' (see 38.211, section FFS_Section)
  NR_UE_CORESET_REG_bundlesize_t reg_bundlesize;
  //Corresponds to L1 parameter 'CORESET-interleaver-size' (see 38.211, 38.213, section FFS_Section)
  NR_UE_CORESET_interleaversize_t interleaversize;
  //Corresponds to L1 parameter 'CORESET-shift-index' (see 38.211, section 7.3.2.2)
  int shiftIndex;
} NR_UE_CORESET_CCE_REG_MAPPING_t;

typedef enum {allContiguousRBs=0,sameAsREGbundle=1} NR_UE_CORESET_precoder_granularity_t;
448
typedef enum {tciPresentInDCI_enabled = 1} tciPresentInDCI_t;
Agustin's avatar
Agustin committed
449
450
451
452
typedef struct {
  /*
   * define CORESET structure according to 38.331
   *
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
   * controlResourceSetId:    Corresponds to L1 parameter 'CORESET-ID'
   *              Value 0 identifies the common CORESET configured in MIB and in ServingCellConfigCommon
   *                          Values 1..maxNrofControlResourceSets-1 identify CORESETs configured by dedicated signalling
   * frequencyDomainResources:  BIT STRING (SIZE (45))
   *              Corresponds to L1 parameter 'CORESET-freq-dom'(see 38.211, section 7.3.2.2)
   *              Frequency domain resources for the CORESET. Each bit corresponds a group of 6 RBs, with grouping starting from PRB 0,
   *              which is fully contained in the bandwidth part within which the CORESET is configured.
   * duration:          INTEGER (1..maxCoReSetDuration)
   *              Corresponds to L1 parameter 'CORESET-time-duration' (see 38.211, section 7.3.2.2FFS_Section)
   *              Contiguous time duration of the CORESET in number of symbols
   * cce-REG-MappingType:   interleaved
   *                reg-BundleSize: ENUMERATED {n2, n3, n6}
   *                interleaverSize: ENUMERATED {n2, n3, n6}
   *                shiftIndex: INTEGER
   *              nonInterleaved NULL
   * precoderGranularity:   ENUMERATED {sameAsREG-bundle, allContiguousRBs}
   *              Corresponds to L1 parameter 'CORESET-precoder-granuality' (see 38.211, sections 7.3.2.2 and 7.4.1.3.2)
   * tci-StatesPDCCH:     SEQUENCE(SIZE (1..maxNrofTCI-StatesPDCCH)) OF TCI-StateId OPTIONAL
   *              A subset of the TCI states defined in TCI-States used for providing QCL relationships between the DL RS(s)
   *              in one RS Set (TCI-State) and the PDCCH DMRS ports.
   *              Corresponds to L1 parameter 'TCI-StatesPDCCH' (see 38.214, section FFS_Section)
   * tci-PresentInDCI:      ENUMERATED {enabled} OPTIONAL
   *              Corresponds to L1 parameter 'TCI-PresentInDCI' (see 38,213, section 5.1.5)
   * pdcch-DMRS-ScramblingID: BIT STRING (SIZE (16)) OPTIONAL
   *              PDCCH DMRS scrambling initalization.
   *              Corresponds to L1 parameter 'PDCCH-DMRS-Scrambling-ID' (see 38.214, section 5.1)
   *              When the field is absent the UE applies the value '0'.
Agustin's avatar
Agustin committed
480
481
482
483
484
485
486
   */
  int controlResourceSetId;
  uint64_t frequencyDomainResources;
  int duration;
  NR_UE_CORESET_CCE_REG_MAPPING_t cce_reg_mappingType;
  NR_UE_CORESET_precoder_granularity_t precoderGranularity;
  int tciStatesPDCCH;
487
  tciPresentInDCI_t tciPresentInDCI;
Agustin's avatar
Agustin committed
488
  uint16_t pdcchDMRSScramblingID;
489
  uint16_t rb_offset;
Agustin's avatar
Agustin committed
490
491
492
} NR_UE_PDCCH_CORESET;

// Slots for PDCCH Monitoring configured as periodicity and offset
493
typedef enum {nr_sl1=1,nr_sl2=2,nr_sl4=4,nr_sl5=5,nr_sl8=8,nr_sl10=10,nr_sl16=16,nr_sl20=20,nr_sl40=40,nr_sl80=80,nr_sl160=160,nr_sl320=320,nr_sl640=640,nr_sl1280=1280,nr_sl2560=2560} NR_UE_SLOT_PERIOD_OFFSET_t;
Agustin's avatar
Agustin committed
494
495
496
497
498
499
500
501
502
typedef enum {nc0=0,nc1=1,nc2=2,nc3=3,nc4=4,nc5=5,nc6=6,nc8=8} NR_UE_SEARCHSPACE_nbrCAND_t;
typedef enum {nsfi1=1,nsfi2=2} NR_UE_SEARCHSPACE_nbrCAND_SFI_t;
typedef enum {n2_3_1=1,n2_3_2=2} NR_UE_SEARCHSPACE_nbrCAND_2_3_t;
typedef enum {cformat0_0_and_1_0=0,cformat2_0=2,cformat2_1=3,cformat2_2=4,cformat2_3=5} NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t;
typedef enum {uformat0_0_and_1_0=0,uformat0_1_and_1_1=1} NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t;
// Monitoring periodicity of SRS PDCCH in number of slots for DCI format 2-3
// Corresponds to L1 parameter 'SRS-Num-PDCCH-cand' (see 38.212, 38.213, section 7.3.1, 11.3)
typedef enum {mp1=1,mp2=2,mp4=4,mp5=5,mp8=8,mp10=10,mp16=16,mp20=20} NR_UE_SEARCHSPACE_MON_PERIOD_t;
//typedef enum {n1=1,n2=2} NR_UE_SEARCHSPACE_nbrCAND_2_3_t;
503
504
// The number of PDCCH candidates for DCI format 2-3 for the configured aggregation level.
// Corresponds to L1 parameter 'SRS-Num-PDCCH-cand' (see 38.212, 38.213, section 7.3.1, 11.3)
Agustin's avatar
Agustin committed
505
506
507
508
typedef enum {common=0,ue_specific=1} NR_SEARCHSPACE_TYPE_t;

typedef struct {

509
510
511
512
513
514
515
516
517
  /*
   * searchSpaceType:      Indicates whether this is a common search space (present) or a UE specific search space (CHOICE)
   *                       as well as DCI formats to monitor for (description in struct NR_UE_PDCCH_SEARCHSPACE_TYPE
   *      common:          Configures this search space as common search space (CSS) and DCI formats to monitor
   *      ue-Specific:     Configures this search space as UE specific search space (USS)
   *                       The UE monitors the DCI format with CRC scrambled by
   *                       C-RNTI, CS-RNTI (if configured), TC-RNTI (if a certain condition is met),
   *                       and SP-CSI-RNTI (if configured)
   */
Agustin's avatar
Agustin committed
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533

  NR_SEARCHSPACE_TYPE_t type;
  NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t  common_dci_formats;
  //NR_UE_SEARCHSPACE_nbrCAND_t nrofCandidates_SFI_aggr_level[5]; // FIXME! A table of five enum elements
  NR_UE_SEARCHSPACE_nbrCAND_SFI_t sfi_nrofCandidates_aggrlevel1;
  NR_UE_SEARCHSPACE_nbrCAND_SFI_t sfi_nrofCandidates_aggrlevel2;
  NR_UE_SEARCHSPACE_nbrCAND_SFI_t sfi_nrofCandidates_aggrlevel4;
  NR_UE_SEARCHSPACE_nbrCAND_SFI_t sfi_nrofCandidates_aggrlevel8;
  NR_UE_SEARCHSPACE_nbrCAND_SFI_t sfi_nrofCandidates_aggrlevel16;
  NR_UE_SEARCHSPACE_MON_PERIOD_t  srs_monitoringPeriodicity2_3;
  NR_UE_SEARCHSPACE_nbrCAND_2_3_t srs_nrofCandidates;
  NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t  ue_specific_dci_formats;

} NR_UE_PDCCH_SEARCHSPACE_TYPE;

typedef struct {
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
  /*
   * define SearchSpace structure according to 38.331
   *
   * searchSpaceId:        Identity of the search space. SearchSpaceId = 0 identifies the SearchSpace configured via PBCH (MIB)
   *                       The searchSpaceId is unique among the BWPs of a Serving Cell
   * controlResourceSetId: CORESET applicable for this SearchSpace
   *                       0 identifies the common CORESET configured in MIB
   *                       1..maxNrofControlResourceSets-1 identify CORESETs configured by dedicated signalling
   * monitoringSlotPeriodicityAndOffset:
   *                       Slots for PDCCH Monitoring configured as periodicity and offset.
   *                       Corresponds to L1 parameters 'Montoring-periodicity-PDCCH-slot' and
   *                       'Montoring-offset-PDCCH-slot' (see 38.213, section 10)
   * monitoringSymbolsWithinSlot:
   *                       Symbols for PDCCH monitoring in the slots configured for PDCCH monitoring
   *                       The most significant (left) bit represents the first OFDM in a slot
   *
   * nrofCandidates:       Number of PDCCH candidates per aggregation level
   *
   * searchSpaceType:      Indicates whether this is a common search space (present) or a UE specific search space
   *                       as well as DCI formats to monitor for (description in struct NR_UE_PDCCH_SEARCHSPACE_TYPE
   *      common:          Configures this search space as common search space (CSS) and DCI formats to monitor
   *      ue-Specific:     Configures this search space as UE specific search space (USS)
   *                       The UE monitors the DCI format with CRC scrambled by
   *                       C-RNTI, CS-RNTI (if configured), TC-RNTI (if a certain condition is met),
   *                       and SP-CSI-RNTI (if configured)
   */
Agustin's avatar
Agustin committed
560
561
562
563
  // INTEGER (0..maxNrofSearchSpaces-1) (0..40-1)
  int searchSpaceId;
  int controlResourceSetId;
  NR_UE_SLOT_PERIOD_OFFSET_t monitoringSlotPeriodicityAndOffset;
564
565
566
567
568
  uint16_t monitoringSlotPeriodicityAndOffset_offset;
  // duration is number of consecutive slots that a SearchSpace lasts in every occasion, i.e., upon every period as given in the periodicityAndOffset
  // if the field is absent, the UE applies the value 1 slot
  // the maximum valid duration is peridicity-1 (periodicity as given in the monitoringSlotPeriodicityAndOffset)
  uint16_t duration;
Agustin's avatar
Agustin committed
569
570
571
572
573
574
575
576
577
578
579
580
  // bit string size 14. Bitmap to indicate symbols within slot where PDCCH has to be monitored
  // the MSB (left) bit represents first OFDM in slot
  uint16_t monitoringSymbolWithinSlot;
  NR_UE_SEARCHSPACE_nbrCAND_t nrofCandidates_aggrlevel1;
  NR_UE_SEARCHSPACE_nbrCAND_t nrofCandidates_aggrlevel2;
  NR_UE_SEARCHSPACE_nbrCAND_t nrofCandidates_aggrlevel4;
  NR_UE_SEARCHSPACE_nbrCAND_t nrofCandidates_aggrlevel8;
  NR_UE_SEARCHSPACE_nbrCAND_t nrofCandidates_aggrlevel16;
  NR_UE_PDCCH_SEARCHSPACE_TYPE searchSpaceType;

} NR_UE_PDCCH_SEARCHSPACE;
#endif
Wang's avatar
Wang committed
581
582
583
584
585
586
587
588
589
typedef struct {
  /// \brief Pointers to extracted PDCCH symbols in frequency-domain.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **rxdataF_ext;
  /// \brief Pointers to extracted and compensated PDCCH symbols in frequency-domain.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **rxdataF_comp;
590
591
592
593
594
595
596
597
  /// \brief Hold the channel estimates in frequency domain.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
  int32_t **dl_ch_estimates;
  /// \brief Hold the channel estimates in time domain (used for tracking).
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: samples? [0..2*ofdm_symbol_size[
  int32_t **dl_ch_estimates_time;
Wang's avatar
Wang committed
598
599
600
601
  /// \brief Pointers to extracted channel estimates of PDCCH symbols.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_estimates_ext;
Guido Casati's avatar
Guido Casati committed
602
  /// \brief Pointers to channel cross-correlation vectors for multi-gNB detection.
Wang's avatar
Wang committed
603
604
605
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..168*N_RB_DL[
  int32_t **dl_ch_rho_ext;
Guido Casati's avatar
Guido Casati committed
606
  /// \brief Pointers to channel cross-correlation vectors for multi-gNB detection.
Wang's avatar
Wang committed
607
608
609
610
611
  /// - first index: rx antenna [0..nb_antennas_rx[
  /// - second index: ? [0..]
  int32_t **rho;
  /// \brief Pointer to llrs, 4-bit resolution.
  /// - first index: ? [0..48*N_RB_DL[
612
  int16_t *llr;
Wang's avatar
Wang committed
613
614
  /// \brief Pointer to llrs, 16-bit resolution.
  /// - first index: ? [0..96*N_RB_DL[
615
  int16_t *llr16;
Wang's avatar
Wang committed
616
617
  /// \brief \f$\overline{w}\f$ from 36-211.
  /// - first index: ? [0..48*N_RB_DL[
618
  int16_t *wbar;
Wang's avatar
Wang committed
619
620
  /// \brief PDCCH/DCI e-sequence (input to rate matching).
  /// - first index: ? [0..96*N_RB_DL[
621
  int16_t *e_rx;
Wang's avatar
Wang committed
622
623
624
625
626
627
628
629
  /// Total number of PDU errors (diagnostic mode)
  uint32_t dci_errors;
  /// Total number of PDU received
  uint32_t dci_received;
  /// Total number of DCI False detection (diagnostic mode)
  uint32_t dci_false;
  /// Total number of DCI missed (diagnostic mode)
  uint32_t dci_missed;
630
  /// nCCE for PDCCH per subframe
Wang's avatar
Wang committed
631
632
633
634
  uint8_t nCCE[10];
  //Check for specific DCIFormat and AgregationLevel
  uint8_t dciFormat;
  uint8_t agregationLevel;
635
636
637
  int nb_search_space;
  fapi_nr_dl_config_dci_dl_pdu_rel15_t pdcch_config[FAPI_NR_MAX_SS_PER_CORESET];
  /*
638
#ifdef NR_PDCCH_DEFS_NR_UE
639
  int nb_searchSpaces;
Agustin's avatar
Agustin committed
640
641
642
  // CORESET structure, where maximum number of CORESETs to be handled is 3 (according to 38.331 V15.1.0)
  NR_UE_PDCCH_CORESET coreset[NR_NBR_CORESET_ACT_BWP];
  // SEARCHSPACE structure, where maximum number of SEARCHSPACEs to be handled is 10 (according to 38.331 V15.1.0)
643
  // Each SearchSpace is associated with one ControlResourceSet
Agustin's avatar
Agustin committed
644
  NR_UE_PDCCH_SEARCHSPACE searchSpace[NR_NBR_SEARCHSPACE_ACT_BWP];
645

knopp's avatar
knopp committed
646
  int n_RB_BWP[NR_NBR_SEARCHSPACE_ACT_BWP];
647
  uint32_t nb_search_space;
648
  #endif*/
Wang's avatar
Wang committed
649
650
651
652
653
654
655
656
657
658
659
660
661
} NR_UE_PDCCH;

#define PBCH_A 24

typedef struct {
  /// \brief Pointers to extracted PBCH symbols in frequency-domain.
  /// - first index: rx antenna [0..nb_antennas_rx[
  /// - second index: ? [0..287] (hard coded)
  int32_t **rxdataF_ext;
  /// \brief Pointers to extracted and compensated PBCH symbols in frequency-domain.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..287] (hard coded)
  int32_t **rxdataF_comp;
662
663
664
665
  /// \brief Hold the channel estimates in frequency domain.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
  int32_t **dl_ch_estimates;
Wang's avatar
Wang committed
666
667
668
669
  /// \brief Pointers to downlink channel estimates in frequency-domain extracted in PRBS.
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: ? [0..287] (hard coded)
  int32_t **dl_ch_estimates_ext;
Hongzhi Wang's avatar
Hongzhi Wang committed
670
671
672
673
  /// \brief Hold the channel estimates in time domain (used for tracking).
  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
  /// - second index: samples? [0..2*ofdm_symbol_size[
  int32_t **dl_ch_estimates_time;
knopp's avatar
knopp committed
674
  int log2_maxh;
675
  uint8_t pbch_a[NR_POLAR_PBCH_PAYLOAD_BITS>>3];
676
677
  uint32_t pbch_a_interleaved;
  uint32_t pbch_a_prime;
678
  uint8_t pbch_e[NR_POLAR_PBCH_E];
679
  int16_t  demod_pbch_e[NR_POLAR_PBCH_E];
Wang's avatar
Wang committed
680
681
  /// \brief Pointer to PBCH llrs.
  /// - first index: ? [0..1919] (hard coded)
682
  int16_t *llr;
Wang's avatar
Wang committed
683
684
685
  /// \brief Pointer to PBCH decoded output.
  /// - first index: ? [0..63] (hard coded)
  uint8_t *decoded_output;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
686
687
  /// \brief PBCH additional bits
  uint8_t xtra_byte;
Wang's avatar
Wang committed
688
689
690
691
692
693
694
695
696
697
698
699
700
701
  /// \brief Total number of PDU errors.
  uint32_t pdu_errors;
  /// \brief Total number of PDU errors 128 frames ago.
  uint32_t pdu_errors_last;
  /// \brief Total number of consecutive PDU errors.
  uint32_t pdu_errors_conseq;
  /// \brief FER (in percent) .
  uint32_t pdu_fer;
} NR_UE_PBCH;

typedef struct {
  int16_t amp;
  int16_t *prachF;
  int16_t *prach;
702
  fapi_nr_ul_config_prach_pdu prach_pdu;
Wang's avatar
Wang committed
703
704
} NR_UE_PRACH;

705
706
707
708
709
710
711
// structure used for multiple SSB detection
typedef struct NR_UE_SSB {
  uint8_t i_ssb;   // i_ssb between 0 and 7 (it corresponds to ssb_index only for Lmax=4,8)
  uint8_t n_hf;    // n_hf = 0,1 for Lmax =4 or n_hf = 0 for Lmax =8,64
  uint32_t metric; // metric to order SSB hypothesis
  uint32_t c_re;
  uint32_t c_im;
712
  struct NR_UE_SSB *next_ssb;
713
714
} NR_UE_SSB;

Wang's avatar
Wang committed
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
/*typedef enum {
  /// do not detect any DCIs in the current subframe
  NO_DCI = 0x0,
  /// detect only downlink DCIs in the current subframe
  UL_DCI = 0x1,
  /// detect only uplink DCIs in the current subframe
  DL_DCI = 0x2,
  /// detect both uplink and downlink DCIs in the current subframe
  UL_DL_DCI = 0x3} nr_dci_detect_mode_t;*/

typedef struct UE_NR_SCAN_INFO_s {
  /// 10 best amplitudes (linear) for each pss signals
  int32_t amp[3][10];
  /// 10 frequency offsets (kHz) corresponding to best amplitudes, with respect do minimum DL frequency in the band
  int32_t freq_offset_Hz[3][10];
} UE_NR_SCAN_INFO_t;

732
typedef struct NR_UL_TIME_ALIGNMENT {
733
734
735
  /// flag used by MAC to inform PHY about a TA to be applied
  unsigned char    apply_ta;
  /// frame and slot when to apply the TA as stated in TS 38.213 setion 4.2
736
737
  int16_t          ta_frame;
  char             ta_slot;
738
  /// TA command and TAGID received from the gNB
Guido Casati's avatar
Guido Casati committed
739
  uint16_t         ta_command;
740
741
  uint8_t          tag_id;
} NR_UL_TIME_ALIGNMENT_t;
Thomas Laurent's avatar
fixes    
Thomas Laurent committed
742
743
744

#include "NR_IF_Module.h"

Wang's avatar
Wang committed
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
/// Top-level PHY Data Structure for UE
typedef struct {
  /// \brief Module ID indicator for this instance
  uint8_t Mod_id;
  /// \brief Component carrier ID for this PHY instance
  uint8_t CC_id;
  /// \brief Mapping of CC_id antennas to cards
  openair0_rf_map      rf_map;
  //uint8_t local_flag;
  /// \brief Indicator of current run mode of UE (normal_txrx, rx_calib_ue, no_L2_connect, debug_prach)
  runmode_t mode;
  /// \brief Indicator that UE should perform band scanning
  int UE_scan;
  /// \brief Indicator that UE should perform coarse scanning around carrier
  int UE_scan_carrier;
760
761
  /// \brief Indicator that UE should enable estimation and compensation of frequency offset
  int UE_fo_compensation;
762
  /// \brief Indicator that UE is synchronized to a gNB
Wang's avatar
Wang committed
763
  int is_synchronized;
764
765
  /// \brief Indicates on which frame is synchronized in a two frame synchronization
  int is_synchronized_on_frame;
Wang's avatar
Wang committed
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
  /// Data structure for UE process scheduling
  UE_nr_proc_t proc;
  /// Flag to indicate the UE shouldn't do timing correction at all
  int no_timing_correction;
  /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna)
  uint32_t tx_total_gain_dB;
  /// \brief Total gain of the RX chain (antenna to baseband I/Q) This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card.
  uint32_t rx_total_gain_dB;
  /// \brief Total gains with maximum RF gain stage (ExpressMIMO2/Lime)
  uint32_t rx_gain_max[4];
  /// \brief Total gains with medium RF gain stage (ExpressMIMO2/Lime)
  uint32_t rx_gain_med[4];
  /// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime)
  uint32_t rx_gain_byp[4];
  /// \brief Current transmit power
Jacques's avatar
Jacques committed
781
  int16_t tx_power_dBm[NR_MAX_SLOTS_PER_FRAME];
Wang's avatar
Wang committed
782
  /// \brief Total number of REs in current transmission
Jacques's avatar
Jacques committed
783
  int tx_total_RE[NR_MAX_SLOTS_PER_FRAME];
Wang's avatar
Wang committed
784
785
  /// \brief Maximum transmit power
  int8_t tx_power_max_dBm;
786
787
  /// \brief Number of gNB seen by UE
  uint8_t n_connected_gNB;
Wang's avatar
Wang committed
788
789
790
791
792
793
794
795
796
797
798
  /// \brief indicator that Handover procedure has been initiated
  uint8_t ho_initiated;
  /// \brief indicator that Handover procedure has been triggered
  uint8_t ho_triggered;
  /// \brief Measurement variables.
  PHY_NR_MEASUREMENTS measurements;
  NR_DL_FRAME_PARMS  frame_parms;
  /// \brief Frame parame before ho used to recover if ho fails.
  NR_DL_FRAME_PARMS  frame_parms_before_ho;
  NR_UE_COMMON    common_vars;

799
  nr_ue_if_module_t *if_inst;
800

801
802
  fapi_nr_config_request_t nrUE_config;

803
  t_nrPolar_params *polarList;
Guido Casati's avatar
Guido Casati committed
804
805
806
807
808
809
810
811
812
813
814
  NR_UE_PDSCH     *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX+1]; // two RxTx Threads
  NR_UE_PBCH      *pbch_vars[NUMBER_OF_CONNECTED_gNB_MAX];
  NR_UE_PDCCH     *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
  NR_UE_PRACH     *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX];
  NR_UE_PUSCH     *pusch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
  NR_UE_DLSCH_t   *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two RxTx Threads
  NR_UE_ULSCH_t   *ulsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two code words
  NR_UE_DLSCH_t   *dlsch_SI[NUMBER_OF_CONNECTED_gNB_MAX];
  NR_UE_DLSCH_t   *dlsch_ra[NUMBER_OF_CONNECTED_gNB_MAX];
  NR_UE_DLSCH_t   *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX];
  NR_UE_DLSCH_t   *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX];
815

Wang's avatar
Wang committed
816
817
818
819
  //Paging parameters
  uint32_t              IMSImod1024;
  uint32_t              PF;
  uint32_t              PO;
820

Wang's avatar
Wang committed
821
822
823
824
  // For abstraction-purposes only
  uint8_t               sr[10];
  uint8_t               pucch_sel[10];
  uint8_t               pucch_payload[22];
825

826
  UE_MODE_t           UE_mode[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
827
  /// cell-specific reference symbols
828
  //uint32_t lte_gold_table[7][20][2][14];
Wang's avatar
Wang committed
829
830
831
832
833
834
835

#if defined(UPGRADE_RAT_NR)

  /// demodulation reference signal for NR PBCH
  uint32_t dmrs_pbch_bitmap_nr[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE];

#endif
knopp's avatar
knopp committed
836

Wang's avatar
Wang committed
837

Hongzhi Wang's avatar
Hongzhi Wang committed
838
839
  /// PBCH DMRS sequence
  uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD];
Wang's avatar
Wang committed
840

Hongzhi Wang's avatar
Hongzhi Wang committed
841
  /// PDSCH DMRS
842
  uint32_t ****nr_gold_pdsch[NUMBER_OF_CONNECTED_eNB_MAX];
Wang's avatar
Wang committed
843

844
  // Scrambling IDs used in PDSCH DMRS
845
846
  uint16_t scramblingID[2];

Hongzhi Wang's avatar
Hongzhi Wang committed
847
  /// PDCCH DMRS
848
  uint32_t ***nr_gold_pdcch[NUMBER_OF_CONNECTED_eNB_MAX];
Wang's avatar
Wang committed
849

850
851
852
  // Scrambling IDs used in PDCCH DMRS
  uint16_t scramblingID_pdcch;

853
854
855
  /// PUSCH DMRS sequence
  uint32_t ****nr_gold_pusch_dmrs;

Wang's avatar
Wang committed
856
857
858
859
860
  uint32_t X_u[64][839];

  uint32_t high_speed_flag;
  uint32_t perfect_ce;
  int16_t ch_est_alpha;
Guido Casati's avatar
Guido Casati committed
861
  int generate_ul_signal[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
862
863
864

  UE_NR_SCAN_INFO_t scan_info[NB_BANDS_MAX];

Guido Casati's avatar
Guido Casati committed
865
  char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_gNB_MAX];
866

867
  NR_PRACH_RESOURCES_t *prach_resources[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
868
869
  int turbo_iterations, turbo_cntl_iterations;
  /// \brief ?.
Guido Casati's avatar
Guido Casati committed
870
871
  /// - first index: gNB [0..NUMBER_OF_CONNECTED_gNB_MAX[ (hard coded)
  uint32_t total_TBS[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
872
  /// \brief ?.
Guido Casati's avatar
Guido Casati committed
873
874
  /// - first index: gNB [0..NUMBER_OF_CONNECTED_gNB_MAX[ (hard coded)
  uint32_t total_TBS_last[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
875
  /// \brief ?.
Guido Casati's avatar
Guido Casati committed
876
877
  /// - first index: gNB [0..NUMBER_OF_CONNECTED_gNB_MAX[ (hard coded)
  uint32_t bitrate[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
878
  /// \brief ?.
Guido Casati's avatar
Guido Casati committed
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
  /// - first index: gNB [0..NUMBER_OF_CONNECTED_gNB_MAX[ (hard coded)
  uint32_t total_received_bits[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_errors[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_errors_last[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_received[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_received_last[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_fer[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_SI_received[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_SI_errors[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_ra_received[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_ra_errors[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_p_received[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_p_errors[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_mch_received_sf[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_mch_received[NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_mcch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_mtch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_mcch_errors[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_mtch_errors[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_mcch_trials[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_gNB_MAX];
  int dlsch_mtch_trials[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_gNB_MAX];
  int current_dlsch_cqi[NUMBER_OF_CONNECTED_gNB_MAX];
  unsigned char first_run_timing_advance[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
902
903
  uint8_t               decode_SIB;
  uint8_t               decode_MIB;
904
  uint8_t               init_sync_frame;
knopp's avatar
knopp committed
905
906
  /// temporary offset during cell search prior to MIB decoding
  int              ssb_offset;
907
  uint16_t	   symbol_offset; // offset in terms of symbols for detected ssb in sync
Wang's avatar
Wang committed
908
909
910
  int              rx_offset; /// Timing offset
  int              rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
  int              time_sync_cell;
911
912
913
914
915
916
917

  /// Timing Advance updates variables
  /// Timing advance update computed from the TA command signalled from gNB
  int                      timing_advance;
  int                      N_TA_offset; ///timing offset used in TDD
  NR_UL_TIME_ALIGNMENT_t   ul_time_alignment[NUMBER_OF_CONNECTED_gNB_MAX];

Wang's avatar
Wang committed
918
919
  /// Flag to tell if UE is secondary user (cognitive mode)
  unsigned char    is_secondary_ue;
Guido Casati's avatar
Guido Casati committed
920
  /// Flag to tell if secondary gNB has channel estimates to create NULL-beams from.
Wang's avatar
Wang committed
921
  unsigned char    has_valid_precoder;
Guido Casati's avatar
Guido Casati committed
922
  /// hold the precoder for NULL beam to the primary gNB
Wang's avatar
Wang committed
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
  int              **ul_precoder_S_UE;
  /// holds the maximum channel/precoder coefficient
  char             log2_maxp;

  /// if ==0 enables phy only test mode
  int mac_enabled;

  /// Flag to initialize averaging of PHY measurements
  int init_averaging;

  /// \brief sinr for all subcarriers of the current link (used only for abstraction).
  /// - first index: ? [0..12*N_RB_DL[
  double *sinr_dB;

  /// \brief sinr for all subcarriers of first symbol for the CQI Calculation.
  /// - first index: ? [0..12*N_RB_DL[
  double *sinr_CQI_dB;

  /// sinr_effective used for CQI calulcation
  double sinr_eff;

  /// N0 (used for abstraction)
  double N0;

  /// PDSCH Varaibles
Guido Casati's avatar
Guido Casati committed
948
  PDSCH_CONFIG_DEDICATED pdsch_config_dedicated[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
949
950

  /// PUSCH Varaibles
Guido Casati's avatar
Guido Casati committed
951
  PUSCH_CONFIG_DEDICATED pusch_config_dedicated[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
952
953
954
955
956
957

  /// PUSCH contention-based access vars
  PUSCH_CA_CONFIG_DEDICATED  pusch_ca_config_dedicated[NUMBER_OF_eNB_MAX]; // lola

  /// PUCCH variables

Guido Casati's avatar
Guido Casati committed
958
  PUCCH_CONFIG_DEDICATED pucch_config_dedicated[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
959

960
  //#if defined(UPGRADE_RAT_NR)
961
962
963
964
965
966
967
968
#if 1

  SystemInformationBlockType1_nr_t systemInformationBlockType1_nr;

  CellGroupConfig_t          cell_group_config;
  PDSCH_ServingCellConfig_t  PDSCH_ServingCellConfig;
  PDSCH_Config_t             PDSCH_Config;

Guido Casati's avatar
Guido Casati committed
969
970
  PUCCH_ConfigCommon_nr_t    pucch_config_common_nr[NUMBER_OF_CONNECTED_gNB_MAX];
  PUCCH_Config_t             pucch_config_dedicated_nr[NUMBER_OF_CONNECTED_gNB_MAX];
971
972

  PUSCH_Config_t             pusch_config;
973
974
975
976
977
978
979
  SRS_NR                     srs;

  crossCarrierSchedulingConfig_t crossCarrierSchedulingConfig;
  supplementaryUplink_t supplementaryUplink;
  dmrs_DownlinkConfig_t dmrs_DownlinkConfig;
  csi_MeasConfig_t csi_MeasConfig;
  PUSCH_ServingCellConfig_t PUSCH_ServingCellConfig;
980
981
982

#endif

Wang's avatar
Wang committed
983
984
985
  uint8_t ncs_cell[20][7];

  /// UL-POWER-Control
Guido Casati's avatar
Guido Casati committed
986
  UL_POWER_CONTROL_DEDICATED ul_power_control_dedicated[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
987
988

  /// TPC
Guido Casati's avatar
Guido Casati committed
989
990
  TPC_PDCCH_CONFIG tpc_pdcch_config_pucch[NUMBER_OF_CONNECTED_gNB_MAX];
  TPC_PDCCH_CONFIG tpc_pdcch_config_pusch[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
991
992

  /// CQI reporting
Guido Casati's avatar
Guido Casati committed
993
  CQI_REPORT_CONFIG cqi_report_config[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
994
995

  /// SRS Variables
Guido Casati's avatar
Guido Casati committed
996
  SOUNDINGRS_UL_CONFIG_DEDICATED soundingrs_ul_config_dedicated[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
997
998

  /// Scheduling Request Config
Guido Casati's avatar
Guido Casati committed
999
  SCHEDULING_REQUEST_CONFIG scheduling_request_config[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
1000

1001
  //#if defined(UPGRADE_RAT_NR)
1002
#if 1
Guido Casati's avatar
Guido Casati committed
1003
  scheduling_request_config_t scheduling_request_config_nr[NUMBER_OF_CONNECTED_gNB_MAX];
1004
1005
1006

#endif

Guido Casati's avatar
Guido Casati committed
1007
1008
  /// Transmission mode per gNB
  uint8_t transmission_mode[NUMBER_OF_CONNECTED_gNB_MAX];
Wang's avatar
Wang committed
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071

  time_stats_t phy_proc[RX_NB_TH];
  time_stats_t phy_proc_tx;
  time_stats_t phy_proc_rx[RX_NB_TH];

  uint32_t use_ia_receiver;

  time_stats_t ofdm_mod_stats;
  time_stats_t ulsch_encoding_stats;
  time_stats_t ulsch_modulation_stats;
  time_stats_t ulsch_segmentation_stats;
  time_stats_t ulsch_rate_matching_stats;
  time_stats_t ulsch_turbo_encoding_stats;
  time_stats_t ulsch_interleaving_stats;
  time_stats_t ulsch_multiplexing_stats;

  time_stats_t generic_stat;
  time_stats_t generic_stat_bis[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
  time_stats_t ue_front_end_stat[RX_NB_TH];
  time_stats_t ue_front_end_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
  time_stats_t pdcch_procedures_stat[RX_NB_TH];
  time_stats_t pdsch_procedures_stat[RX_NB_TH];
  time_stats_t pdsch_procedures_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
  time_stats_t dlsch_procedures_stat[RX_NB_TH];

  time_stats_t ofdm_demod_stats;
  time_stats_t dlsch_rx_pdcch_stats;
  time_stats_t rx_dft_stats;
  time_stats_t dlsch_channel_estimation_stats;
  time_stats_t dlsch_freq_offset_estimation_stats;
  time_stats_t dlsch_decoding_stats[2];
  time_stats_t dlsch_demodulation_stats;
  time_stats_t dlsch_rate_unmatching_stats;
  time_stats_t dlsch_turbo_decoding_stats;
  time_stats_t dlsch_deinterleaving_stats;
  time_stats_t dlsch_llr_stats;
  time_stats_t dlsch_llr_stats_parallelization[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
  time_stats_t dlsch_unscrambling_stats;
  time_stats_t dlsch_rate_matching_stats;
  time_stats_t dlsch_turbo_encoding_stats;
  time_stats_t dlsch_interleaving_stats;
  time_stats_t dlsch_tc_init_stats;
  time_stats_t dlsch_tc_alpha_stats;
  time_stats_t dlsch_tc_beta_stats;
  time_stats_t dlsch_tc_gamma_stats;
  time_stats_t dlsch_tc_ext_stats;
  time_stats_t dlsch_tc_intl1_stats;
  time_stats_t dlsch_tc_intl2_stats;
  time_stats_t tx_prach;

  /// RF and Interface devices per CC
  openair0_device rfdevice;
  time_stats_t dlsch_encoding_SIC_stats;
  time_stats_t dlsch_scrambling_SIC_stats;
  time_stats_t dlsch_modulation_SIC_stats;
  time_stats_t dlsch_llr_stripping_unit_SIC_stats;
  time_stats_t dlsch_unscrambling_SIC_stats;

#if ENABLE_RAL
  hash_table_t    *ral_thresholds_timed;
  SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
  SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
#endif
1072
  
Sakthivel Velumani's avatar
Sakthivel Velumani committed
1073
  int dl_stats[5];
Wang's avatar
Wang committed
1074
1075
1076
1077
1078
1079

} PHY_VARS_NR_UE;

/* this structure is used to pass both UE phy vars and
 * proc to the function UE_thread_rxn_txnp4
 */
1080
1081
typedef struct nr_rxtx_thread_data_s {
  UE_nr_rxtx_proc_t proc;
Wang's avatar
Wang committed
1082
  PHY_VARS_NR_UE    *UE;
1083
}  nr_rxtx_thread_data_t;
Wang's avatar
Wang committed
1084
1085

#include "SIMULATION/ETH_TRANSPORT/defs.h"
Guy De Souza's avatar
Guy De Souza committed
1086
#endif