nr_transport_ue.h 12.5 KB
Newer Older
Wang's avatar
Wang 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
32
33
/*
 * 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/NR_TRANSPORT/defs.h
* \brief data structures for PDSCH/DLSCH/PUSCH/ULSCH physical and transport channel descriptors (TX/RX)
* \author R. Knopp
* \date 2011
* \version 0.1
* \company Eurecom
* \email: raymond.knopp@eurecom.fr, florian.kaltenberger@eurecom.fr, oscar.tonelli@yahoo.it
* \note
* \warning
*/
#ifndef __NR_TRANSPORT_UE__H__
#define __NR_TRANSPORT_UE__H__
34
35
#include <limits.h>
#include "PHY/impl_defs_top.h"
Jacques's avatar
Jacques committed
36

Sebastian Wagner's avatar
Sebastian Wagner committed
37
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
38

39
//#include "PHY/defs_nr_UE.h"
Hongzhi Wang's avatar
Hongzhi Wang committed
40
#include "../NR_TRANSPORT/nr_transport_common_proto.h"
knopp's avatar
knopp committed
41
/*#ifndef STANDALONE_COMPILE
Wang's avatar
Wang committed
42
43
#include "UTIL/LISTS/list.h"
#endif
knopp's avatar
knopp committed
44
*/
45
#include "openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h"
46

Wang's avatar
Wang committed
47
48
49
50
51
52
53

// structures below implement 36-211 and 36-212

/** @addtogroup _PHY_TRANSPORT_
 * @{
 */

Jacques's avatar
Jacques committed
54
55
56
57
58
typedef enum {
 NEW_TRANSMISSION_HARQ,
 RETRANSMISSION_HARQ
} harq_result_t;

Wang's avatar
Wang committed
59
typedef struct {
60
61
  /// NDAPI struct for UE
  nfapi_nr_ue_pusch_pdu_t pusch_pdu;
Wang's avatar
Wang committed
62
63
  /// Indicator of first transmission
  uint8_t first_tx;
Jacques's avatar
Jacques committed
64
65
  /// HARQ tx status
  harq_result_t tx_status;
Wang's avatar
Wang committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  /// Status Flag indicating for this ULSCH (idle,active,disabled)
  SCH_status_t status;
  /// Subframe scheduling indicator (i.e. Transmission opportunity indicator)
  uint8_t subframe_scheduling_flag;
  /// Subframe cba scheduling indicator (i.e. Transmission opportunity indicator)
  uint8_t subframe_cba_scheduling_flag;
  /// Last TPC command
  uint8_t TPC;
  /// The payload + CRC size in bits, "B" from 36-212
  uint32_t B;
  /// Length of ACK information (bits)
  uint8_t O_ACK;
  /// Index of current HARQ round for this ULSCH
  uint8_t round;
Sakthivel Velumani's avatar
Sakthivel Velumani committed
80
81
  /// Last Ndi for this harq process
  uint8_t ndi;
82
  /// pointer to pdu from MAC interface (TS 36.212 V15.4.0, Sec 5.1 p. 8)
83
  unsigned char *a;
84
85
86
87
  /// Pointer to the payload + CRC 
  uint8_t *b;
  /// Pointers to transport block segments
  uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS];
88
89
  /// LDPC-code outputs
  uint8_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
90
  /// LDPC-code outputs (TS 36.212 V15.4.0, Sec 5.3.2 p. 17)
91
  uint8_t *e; 
92
  /// Rate matching (Interleaving) outputs (TS 36.212 V15.4.0, Sec 5.4.2.2 p. 30)
93
  uint8_t *f; 
Hongzhi Wang's avatar
Hongzhi Wang committed
94
  /// Number of code segments
Wang's avatar
Wang committed
95
  uint32_t C;
Hongzhi Wang's avatar
Hongzhi Wang committed
96
97
  /// Number of bits in code segments
  uint32_t K;
Wang's avatar
Wang committed
98
99
  /// Total number of bits across all segments
  uint32_t sumKr;
Hongzhi Wang's avatar
Hongzhi Wang committed
100
  /// Number of "Filler" bits
Wang's avatar
Wang committed
101
  uint32_t F;
Hongzhi Wang's avatar
Hongzhi Wang committed
102
  /// n_DMRS  for cyclic shift of DMRS
Wang's avatar
Wang committed
103
  uint8_t n_DMRS;
Hongzhi Wang's avatar
Hongzhi Wang committed
104
  /// n_DMRS2 for cyclic shift of DMRS
Wang's avatar
Wang committed
105
106
107
108
109
110
111
  uint8_t n_DMRS2;
  /// Flag to indicate that this is a control only ULSCH (i.e. no MAC SDU)
  uint8_t control_only;
  /// Flag to indicate that this is a calibration ULSCH (i.e. no MAC SDU and filled with TDD calibration information)
  //  int calibration_flag;
  /// Number of soft channel bits
  uint32_t G;
Khalid Ahmed's avatar
Khalid Ahmed committed
112
  // Number of modulated symbols carrying data
113
  uint32_t num_of_mod_symbols;
Wang's avatar
Wang committed
114
115
  // decode phich
  uint8_t decode_phich;
116
117
  // Encoder BG
  uint8_t BG;
118
119
  // LDPC lifting size
  uint32_t Z;
Wang's avatar
Wang committed
120
121
122
123
} NR_UL_UE_HARQ_t;

typedef struct {
  /// SRS active flag
124
125
126
127
128
  uint8_t srs_active; 
//#if defined(UPGRADE_RAT_NR)
#if 1
  // Pointers to HARQ processes for the ULSCH
  NR_UL_UE_HARQ_t *harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES];
Jacques's avatar
Jacques committed
129
  int harq_process_id[NR_MAX_SLOTS_PER_FRAME];
130
131
132
  // UL number of harq processes
  uint8_t number_harq_processes_for_pusch;
#endif 
133
  /*
Wang's avatar
Wang committed
134
135
136
137
138
139
140
141
142
143
144
145
  /// Pointer to CQI data (+1 for 8 bits crc)
  uint8_t o[1+MAX_CQI_BYTES];
  /// Length of CQI data (bits)
  uint8_t O;
  /// Format of CQI data
  UCI_format_t uci_format;
  /// Rank information
  uint8_t o_RI[2];
  /// Length of rank information (bits)
  uint8_t O_RI;
  /// Pointer to ACK
  uint8_t o_ACK[4];
146
  */
Wang's avatar
Wang committed
147
148
149
150
  /// Minimum number of CQI bits for PUSCH (36-212 r8.6, Sec 5.2.4.1 p. 37)
  uint8_t O_CQI_MIN;
  /// ACK/NAK Bundling flag
  uint8_t bundling;
151
152
  /// Concatenated "g"-sequences (for definition see 36-212 V15.4.0 2018-12, p.31)
  uint8_t g[MAX_NUM_NR_CHANNEL_BITS];
Wang's avatar
Wang committed
153
  /// Interleaved "h"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18)
154
  uint8_t h[MAX_NUM_NR_CHANNEL_BITS];
Wang's avatar
Wang committed
155
  /// Scrambled "b"-sequences (for definition see 36-211 V8.6 2009-03, p.14)
156
  uint8_t b_tilde[MAX_NUM_NR_CHANNEL_BITS];
Wang's avatar
Wang committed
157
  /// Modulated "d"-sequences (for definition see 36-211 V8.6 2009-03, p.14)
158
  int32_t d_mod[MAX_NUM_NR_RE] __attribute__ ((aligned(16)));
159
  /// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4)
160
  int32_t y[MAX_NUM_NR_RE] __attribute__ ((aligned(16)));
161
  /*
Wang's avatar
Wang committed
162
163
  /// "q" sequences for CQI/PMI (for definition see 36-212 V8.6 2009-03, p.27)
  uint8_t q[MAX_CQI_PAYLOAD];
164
  
Wang's avatar
Wang committed
165
166
167
168
169
170
171
172
  /// coded and interleaved CQI bits
  uint8_t o_w[(MAX_CQI_BITS+8)*3];
  /// coded CQI bits
  uint8_t o_d[96+((MAX_CQI_BITS+8)*3)];
  /// coded ACK bits
  uint8_t q_ACK[MAX_ACK_PAYLOAD];
  /// coded RI bits
  uint8_t q_RI[MAX_RI_PAYLOAD];
173
  */
Wang's avatar
Wang committed
174
175
176
177
178
179
180
181
182
183
  /// beta_offset_cqi times 8
  uint16_t beta_offset_cqi_times8;
  /// beta_offset_ri times 8
  uint16_t beta_offset_ri_times8;
  /// beta_offset_harqack times 8
  uint16_t beta_offset_harqack_times8;
  /// power_offset
  uint8_t power_offset;
  // for cooperative communication
  uint8_t cooperation_flag;
Jacques's avatar
Jacques committed
184
185
  /// RNTI type
  uint8_t rnti_type;
186
187
  /// Cell ID
  int     Nid_cell;
Wang's avatar
Wang committed
188
189
190
191
192
193
194
195
196
197
  /// f_PUSCH parameter for PUSCH power control
  int16_t f_pusch;
  /// Po_PUSCH - target output power for PUSCH
  int16_t Po_PUSCH;
  /// PHR - current power headroom (based on last PUSCH transmission)
  int16_t PHR;
  /// Po_SRS - target output power for SRS
  int16_t Po_SRS;
  /// num active cba group
  uint8_t num_active_cba_groups;
adk's avatar
adk committed
198
199
  /// bit mask of PT-RS ofdm symbol indicies
  uint16_t ptrs_symbols;
Wang's avatar
Wang committed
200
  /// num dci found for cba
201
  //uint8_t num_cba_dci[10];
Wang's avatar
Wang committed
202
  /// allocated CBA RNTI
203
  //uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP];
Wang's avatar
Wang committed
204
  /// UL max-harq-retransmission
205
  uint16_t Mlimit;
Wang's avatar
Wang committed
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
} NR_UE_ULSCH_t;

typedef struct {
  /// Indicator of first transmission
  uint8_t first_tx;
  /// Last Ndi received for this process on DCI (used for C-RNTI only)
  uint8_t DCINdi;
  /// DLSCH status flag indicating
  SCH_status_t status;
  /// Transport block size
  uint32_t TBS;
  /// The payload + CRC size in bits
  uint32_t B;
  /// Pointer to the payload
  uint8_t *b;
  /// Pointers to transport block segments
Hongzhi Wang's avatar
Hongzhi Wang committed
222
  uint8_t *c[MAX_NUM_NR_DLSCH_SEGMENTS];
Wang's avatar
Wang committed
223
224
  /// Index of current HARQ round for this DLSCH
  uint8_t round;
225
226
  /// MCS table for this DLSCH
  uint8_t mcs_table;
Wang's avatar
Wang committed
227
228
229
230
  /// MCS format for this DLSCH
  uint8_t mcs;
  /// Qm (modulation order) for this DLSCH
  uint8_t Qm;
231
232
  /// target code rate R x 1024
  uint16_t R;
Wang's avatar
Wang committed
233
234
235
  /// Redundancy-version of the current sub-frame
  uint8_t rvidx;
  /// MIMO mode for this DLSCH
Hongzhi Wang's avatar
Hongzhi Wang committed
236
  MIMO_nrmode_t mimo_mode;
Wang's avatar
Wang committed
237
  /// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
238
  int16_t *w[MAX_NUM_NR_DLSCH_SEGMENTS];
Wang's avatar
Wang committed
239
  /// for abstraction soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
Thomas Laurent's avatar
fixes    
Thomas Laurent committed
240
  //double w_abs[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448];
Wang's avatar
Wang committed
241
  /// soft bits for each received segment ("d"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
Hongzhi Wang's avatar
Hongzhi Wang committed
242
  int16_t *d[MAX_NUM_NR_DLSCH_SEGMENTS];
243
  /// LDPC processing buffers
244
  t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_DLSCH_SEGMENTS];
Hongzhi Wang's avatar
Hongzhi Wang committed
245
  /// Number of code segments 
Wang's avatar
Wang committed
246
  uint32_t C;
Hongzhi Wang's avatar
Hongzhi Wang committed
247
248
249
  /// Number of bits in code segments
  uint32_t K;
  /// Number of "Filler" bits 
Wang's avatar
Wang committed
250
  uint32_t F;
Hongzhi Wang's avatar
Hongzhi Wang committed
251
252
  /// LDPC lifting factor
  uint32_t Z;
Hongzhi Wang's avatar
Hongzhi Wang committed
253
  /// Number of MIMO layers (streams) 
Wang's avatar
Wang committed
254
255
256
257
258
  uint8_t Nl;
  /// current delta_pucch
  int8_t delta_PUCCH;
  /// Number of soft channel bits
  uint32_t G;
259
260
261
262
  /// Start PRB of BWP
  uint16_t BWPStart;
  /// Number of PRBs in BWP
  uint16_t BWPSize;
Wang's avatar
Wang committed
263
264
  /// Current Number of RBs
  uint16_t nb_rb;
265
266
267
268
  /// Starting RB number
  uint16_t start_rb;
  /// Number of Symbols
  uint16_t nb_symbols;
269
270
271
272
  /// DMRS symbol positions
  uint16_t dlDmrsSymbPos;
  /// DMRS Configuration Type
  uint8_t dmrsConfigType;
Francesco Mani's avatar
Francesco Mani committed
273
274
  // Number of DMRS CDM groups with no data
  uint8_t n_dmrs_cdm_groups;
275
276
  /// Starting Symbol number
  uint16_t start_symbol;
Wang's avatar
Wang committed
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
  /// Current subband PMI allocation
  uint16_t pmi_alloc;
  /// Current RB allocation (even slots)
  uint32_t rb_alloc_even[4];
  /// Current RB allocation (odd slots)
  uint32_t rb_alloc_odd[4];
  /// distributed/localized flag
  vrb_t vrb_type;
  /// downlink power offset field
  uint8_t dl_power_off;
  /// trials per round statistics
  uint32_t trials[8];
  /// error statistics per round
  uint32_t errors[8];
  /// codeword this transport block is mapped to
  uint8_t codeword;
293
  /// HARQ-ACKs
294
  uint8_t ack;
295
296
297
298
299
300
301
302
303
304
305
306
307
  /// PTRS Frequency Density
  uint8_t PTRSFreqDensity;
  /// PTRS Time Density
  uint8_t PTRSTimeDensity;
  uint8_t PTRSPortIndex ;
  uint8_t nEpreRatioOfPDSCHToPTRS;
  uint8_t PTRSReOffset;
  /// bit mask of PT-RS ofdm symbol indicies
  uint16_t ptrs_symbols;
  // PTRS symbol index, to be updated every PTRS symbol within a slot.
  uint8_t ptrs_symbol_index;
  /// PDU BITMAP 
  uint16_t pduBitmap;
Wang's avatar
Wang committed
308
309
310
311
312
} NR_DL_UE_HARQ_t;

typedef struct {
  /// RNTI
  uint16_t rnti;
Jacques's avatar
Jacques committed
313
314
  /// RNTI type
  uint8_t rnti_type;
Wang's avatar
Wang committed
315
316
  /// Active flag for DLSCH demodulation
  uint8_t active;
317
318
  /// accumulated tx power adjustment for PUCCH
  int8_t g_pucch;
Wang's avatar
Wang committed
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
  /// Transmission mode
  uint8_t mode1_flag;
  /// amplitude of PDSCH (compared to RS) in symbols without pilots
  int16_t sqrt_rho_a;
  /// amplitude of PDSCH (compared to RS) in symbols containing pilots
  int16_t sqrt_rho_b;
  /// Current HARQ process id threadRx Odd and threadRx Even
  uint8_t current_harq_pid;
  /// Current subband antenna selection
  uint32_t antenna_alloc;
  /// Current subband RI allocation
  uint32_t ri_alloc;
  /// Current subband CQI1 allocation
  uint32_t cqi_alloc1;
  /// Current subband CQI2 allocation
  uint32_t cqi_alloc2;
  /// saved subband PMI allocation from last PUSCH/PUCCH report
  uint16_t pmi_alloc;
337
338
339
340
341
342
343
344
  /// Pointers to up to HARQ processes
  NR_DL_UE_HARQ_t *harq_processes[NR_MAX_DLSCH_HARQ_PROCESSES];
  // DL number of harq processes
  uint8_t number_harq_processes_for_pdsch;
  /* higher layer parameter for reception of two transport blocks TS 38.213 9.1.3.1 Type-2 HARQ-ACK codebook dtermination */
  uint8_t Number_MCS_HARQ_DL_DCI;
  /* spatial bundling of PUCCH */
  uint8_t HARQ_ACK_spatial_bundling_PUCCH;
Wang's avatar
Wang committed
345
346
347
348
349
350
  /// Maximum number of HARQ processes(for definition see 36-212 V8.6 2009-03, p.17
  uint8_t Mdlharq;
  /// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
  uint8_t Kmimo;
  /// Nsoft parameter related to UE Category
  uint32_t Nsoft;
Hongzhi Wang's avatar
Hongzhi Wang committed
351
352
  /// Maximum number of LDPC iterations
  uint8_t max_ldpc_iterations;
Wang's avatar
Wang committed
353
  /// number of iterations used in last turbo decoding
Sebastian Wagner's avatar
Sebastian Wagner committed
354
  uint8_t last_iteration_cnt;  
355
356
  /// Maximum number of HARQ rounds 
  uint8_t Mlimit;
Wang's avatar
Wang committed
357
358
} NR_UE_DLSCH_t;

Agustin's avatar
Agustin committed
359
360
361
362
363
364
365
366
367
typedef enum {format0_0,
              format0_1,
              format1_0,
              format1_1,
              format2_0,
              format2_1,
              format2_2,
              format2_3
             } NR_DCI_format_t;
Wang's avatar
Wang committed
368
369


Agustin's avatar
Agustin committed
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
typedef enum {nr_pucch_format0=0,
              nr_pucch_format1,
              nr_pucch_format2,
              nr_pucch_format3,
              nr_pucch_format4
             } NR_PUCCH_FMT_t;

typedef struct {
  /// Length of DCI in bits
  uint8_t dci_length;
  /// Aggregation level
  uint8_t L;
  /// Position of first CCE of the dci
  int firstCCE;
  /// flag to indicate that this is a RA response
  boolean_t ra_flag;
  /// rnti
  rnti_t rnti;
388
389
  /// rnti type
  //crc_scrambled_t rnti_type;
Agustin's avatar
Agustin committed
390
391
392
393
394
  /// Format
  NR_DCI_format_t format;
  /// search space
  dci_space_t search_space;
  /// DCI pdu
Guy De Souza's avatar
Guy De Souza committed
395
  uint64_t dci_pdu[2];
396
397
398
399
400
401
402
//#if defined(UPGRADE_RAT_NR)
#if 1
  /// harq information
  uint8_t harq_pid_pusch;
  /// delay between current slot and slot to transmit
  uint8_t number_slots_rx_to_tx;
#endif
Agustin's avatar
Agustin committed
403
404
} NR_DCI_ALLOC_t;

Wang's avatar
Wang committed
405
406
407

/**@}*/
#endif