nr_transport_ue.h 13.4 KB
Newer Older
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

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

39
//#include "PHY/defs_nr_UE.h"
Hongzhi Wang's avatar
Hongzhi Wang committed
40
#include "../NR_TRANSPORT/nr_transport_common_proto.h"
41 42 43 44 45 46 47 48 49 50 51 52
#ifndef STANDALONE_COMPILE
#include "UTIL/LISTS/list.h"
#endif

//#include "../LTE_TRANSPORT/transport_common.h"

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

/** @addtogroup _PHY_TRANSPORT_
 * @{
 */

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

58 59 60 61 62
//#if defined(UPGRADE_RAT_NR)
#if 1
typedef struct {
  /// HARQ process id
  uint8_t harq_id;
Jacques's avatar
Jacques committed
63 64
  /// HARQ rx status
  harq_result_t rx_status;
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
  /// ACK bits (after decoding) 0:NACK / 1:ACK / 2:DTX
  uint8_t ack;
  /// send status (for PUCCH)
  uint8_t send_harq_status;
  /// nCCE (for PUCCH)
  uint8_t nCCE;
  /// DAI value detected from DCI1/1a/1b/1d/2/2a/2b/2c. 0xff indicates not touched
  uint8_t vDAI_DL;
  /// DAI value detected from DCI0/4. 0xff indicates not touched
  uint8_t vDAI_UL;
  /// allow to define pucch parameters TS 38.213 9.2.3 UE procedure for reporting HARQ-ACK
  uint8_t  pucch_resource_indicator;
  /// slot on which feedback ack should be send to network
  uint16_t slot_for_feedback_ack;
  /// index of a first CCE for the PDCCH reception
  uint8_t  n_CCE;
  /// number of CCEs in a control resource set of a PDCCH reception conveying DCI format 1_0
  uint8_t  N_CCE;
} NR_UE_HARQ_STATUS_t;
#endif
85 86 87 88 89 90

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;
Jacques's avatar
Jacques committed
91 92
  /// HARQ tx status
  harq_result_t tx_status;
93 94 95 96 97 98 99 100 101 102 103 104
  /// Flag indicating that this ULSCH has a new packet (start of new round)
  //  uint8_t Ndi;
  /// 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;
  /// First Allocated RB
  uint16_t first_rb;
  /// Current Number of RBs
  uint16_t nb_rb;
105 106
  /// number of layers
  uint8_t Nl;
107 108 109 110 111 112 113 114 115 116 117 118 119 120
  /// Last TPC command
  uint8_t TPC;
  /// Transport block size
  uint32_t TBS;
  /// 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;
  /// MCS format of this ULSCH
  uint8_t mcs;
  /// Redundancy-version of the current sub-frame
  uint8_t rvidx;
121
  /// pointer to pdu from MAC interface (TS 36.212 V15.4.0, Sec 5.1 p. 8)
122
  unsigned char *a;
123 124 125 126
  /// Pointer to the payload + CRC 
  uint8_t *b;
  /// Pointers to transport block segments
  uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS];
127 128
  /// LDPC-code outputs
  uint8_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
129
  /// LDPC-code outputs (TS 36.212 V15.4.0, Sec 5.3.2 p. 17)
130
  uint8_t *e; 
131
  /// Rate matching (Interleaving) outputs (TS 36.212 V15.4.0, Sec 5.4.2.2 p. 30)
132
  uint8_t *f; 
Hongzhi Wang's avatar
Hongzhi Wang committed
133
  /// Number of code segments
134
  uint32_t C;
Hongzhi Wang's avatar
Hongzhi Wang committed
135 136
  /// Number of bits in code segments
  uint32_t K;
137 138
  /// Total number of bits across all segments
  uint32_t sumKr;
Hongzhi Wang's avatar
Hongzhi Wang committed
139
  /// Number of "Filler" bits
140
  uint32_t F;
Hongzhi Wang's avatar
Hongzhi Wang committed
141
  /// n_DMRS  for cyclic shift of DMRS
142
  uint8_t n_DMRS;
Hongzhi Wang's avatar
Hongzhi Wang committed
143
  /// n_DMRS2 for cyclic shift of DMRS
144 145 146 147 148 149 150
  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
151
  // Number of modulated symbols carrying data
152
  uint32_t num_of_mod_symbols;
Khalid Ahmed's avatar
Khalid Ahmed committed
153 154 155
  // This is "L" in  TS 38.214 V15.4.0 subclause 6.1.2.1
  uint8_t number_of_symbols;
  // This is "S" in  TS 38.214 V15.4.0 subclause 6.1.2.1
156
  uint8_t start_symbol;
157 158 159 160 161
  // decode phich
  uint8_t decode_phich;
} NR_UL_UE_HARQ_t;

typedef struct {
162 163
  /// number of DMRS resource elements
  uint8_t nb_re_dmrs;
Khalid Ahmed's avatar
Khalid Ahmed committed
164 165
  /// DMRS length
  uint8_t length_dmrs;
166
  /// SRS active flag
167 168 169 170 171
  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
172
  int harq_process_id[NR_MAX_SLOTS_PER_FRAME];
173 174 175
  // UL number of harq processes
  uint8_t number_harq_processes_for_pusch;
#endif 
176
  /*
177 178 179 180 181 182 183 184 185 186 187 188
  /// 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];
189
  */
190 191 192 193
  /// 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;
194 195
  /// Concatenated "g"-sequences (for definition see 36-212 V15.4.0 2018-12, p.31)
  uint8_t g[MAX_NUM_NR_CHANNEL_BITS];
196
  /// Interleaved "h"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18)
197
  uint8_t h[MAX_NUM_NR_CHANNEL_BITS];
198
  /// Scrambled "b"-sequences (for definition see 36-211 V8.6 2009-03, p.14)
199
  uint8_t b_tilde[MAX_NUM_NR_CHANNEL_BITS];
200
  /// Modulated "d"-sequences (for definition see 36-211 V8.6 2009-03, p.14)
201
  uint32_t d_mod[MAX_NUM_NR_RE];
202
  /// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4)
203
  uint32_t y[MAX_NUM_NR_RE] __attribute__ ((aligned(16)));
204
  /*
205 206
  /// "q" sequences for CQI/PMI (for definition see 36-212 V8.6 2009-03, p.27)
  uint8_t q[MAX_CQI_PAYLOAD];
207
  
208 209 210 211 212 213 214 215
  /// 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];
216
  */
217 218 219 220 221 222 223 224 225 226 227 228
  /// 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;
  /// RNTI attributed to this ULSCH
  uint16_t rnti;
Jacques's avatar
Jacques committed
229 230
  /// RNTI type
  uint8_t rnti_type;
231 232
  /// Cell ID
  int     Nid_cell;
233 234 235 236 237 238 239 240 241 242 243
  /// 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;
  /// num dci found for cba
244
  //uint8_t num_cba_dci[10];
245
  /// allocated CBA RNTI
246
  //uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP];
247
  /// UL max-harq-retransmission
248
  uint16_t Mlimit;
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
} 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
265
  uint8_t *c[MAX_NUM_NR_DLSCH_SEGMENTS];
266 267
  /// Index of current HARQ round for this DLSCH
  uint8_t round;
268 269
  /// MCS table for this DLSCH
  uint8_t mcs_table;
270 271 272 273
  /// MCS format for this DLSCH
  uint8_t mcs;
  /// Qm (modulation order) for this DLSCH
  uint8_t Qm;
274 275
  /// target code rate R x 1024
  uint16_t R;
276 277 278
  /// Redundancy-version of the current sub-frame
  uint8_t rvidx;
  /// MIMO mode for this DLSCH
Hongzhi Wang's avatar
Hongzhi Wang committed
279
  MIMO_nrmode_t mimo_mode;
280
  /// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
281
  int16_t *w[MAX_NUM_NR_DLSCH_SEGMENTS];
282
  /// for abstraction soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
laurent's avatar
fixes  
laurent committed
283
  //double w_abs[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448];
284
  /// 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
285
  int16_t *d[MAX_NUM_NR_DLSCH_SEGMENTS];
286
  /// LDPC processing buffers
287
  t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_DLSCH_SEGMENTS];
Hongzhi Wang's avatar
Hongzhi Wang committed
288
  /// Number of code segments 
289
  uint32_t C;
Hongzhi Wang's avatar
Hongzhi Wang committed
290 291 292
  /// Number of bits in code segments
  uint32_t K;
  /// Number of "Filler" bits 
293
  uint32_t F;
Hongzhi Wang's avatar
Hongzhi Wang committed
294 295
  /// LDPC lifting factor
  uint32_t Z;
Hongzhi Wang's avatar
Hongzhi Wang committed
296
  /// Number of MIMO layers (streams) 
297 298 299 300 301
  uint8_t Nl;
  /// current delta_pucch
  int8_t delta_PUCCH;
  /// Number of soft channel bits
  uint32_t G;
302 303 304 305
  /// Start PRB of BWP
  uint16_t BWPStart;
  /// Number of PRBs in BWP
  uint16_t BWPSize;
306 307
  /// Current Number of RBs
  uint16_t nb_rb;
308 309 310 311
  /// Starting RB number
  uint16_t start_rb;
  /// Number of Symbols
  uint16_t nb_symbols;
312 313 314 315
  /// DMRS symbol positions
  uint16_t dlDmrsSymbPos;
  /// DMRS Configuration Type
  uint8_t dmrsConfigType;
316 317
  /// Starting Symbol number
  uint16_t start_symbol;
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
  /// 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;
334 335
  /// HARQ-ACKs
  NR_UE_HARQ_STATUS_t harq_ack;
336 337 338 339 340
} NR_DL_UE_HARQ_t;

typedef struct {
  /// RNTI
  uint16_t rnti;
Jacques's avatar
Jacques committed
341 342
  /// RNTI type
  uint8_t rnti_type;
343 344
  /// Active flag for DLSCH demodulation
  uint8_t active;
345 346
  /// accumulated tx power adjustment for PUCCH
  int8_t g_pucch;
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
  /// 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;
365 366 367 368 369 370 371 372
  /// 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;
373 374 375 376 377 378
  /// 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
379 380
  /// Maximum number of LDPC iterations
  uint8_t max_ldpc_iterations;
381
  /// number of iterations used in last turbo decoding
382
  uint8_t last_iteration_cnt;  
383 384
  /// Maximum number of HARQ rounds 
  uint8_t Mlimit;
385 386
} NR_UE_DLSCH_t;

Agustin's avatar
Agustin committed
387 388 389 390 391 392 393 394 395
typedef enum {format0_0,
              format0_1,
              format1_0,
              format1_1,
              format2_0,
              format2_1,
              format2_2,
              format2_3
             } NR_DCI_format_t;
396 397


Agustin's avatar
Agustin committed
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
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;
416 417
  /// rnti type
  //crc_scrambled_t rnti_type;
Agustin's avatar
Agustin committed
418 419 420 421 422
  /// Format
  NR_DCI_format_t format;
  /// search space
  dci_space_t search_space;
  /// DCI pdu
Guy De Souza's avatar
Guy De Souza committed
423
  uint64_t dci_pdu[2];
424 425 426 427 428 429 430
//#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
431 432
} NR_DCI_ALLOC_t;

433 434 435

/**@}*/
#endif