srsLTE/lib/include/srsran/phy/fec/ldpc/base_graph.h

105 lines
4.1 KiB
C

/**
*
* \section COPYRIGHT
*
* Copyright 2013-2021 Software Radio Systems Limited
*
* By using this file, you agree to the terms and conditions set
* forth in the LICENSE file which can be found at the top level of
* the distribution.
*
*/
/*!
* \file base_graph.h
* \brief Declaration of the two LDPC base graphs employed in the 5G NR
* standard.
* \author David Gregoratti
* \date 2020
*
* This file declares the dimensions of the base graphs and provides an interface
* for obtaining the set index and the permutation matrix corresponding to a
* given *lifting size*.
*
* \copyright Software Radio Systems Limited
*
*/
#ifndef SRSRAN_BASEGRAPH_H
#define SRSRAN_BASEGRAPH_H
#include "srsran/config.h"
#include <stdint.h>
#define SRSRAN_LDPC_BG1_MAX_LEN_CB 8448 /*!< \brief Maximum code block size for LDPC BG1 */
#define SRSRAN_LDPC_BG2_MAX_LEN_CB 3840 /*!< \brief Maximum code block size for LDPC BG2 */
#define SRSRAN_LDPC_MAX_LEN_CB SRSRAN_LDPC_BG1_MAX_LEN_CB /*!< \brief Maximum code block size for LDPC BG1 or BG2 */
#define BG1Nfull 68 /*!< \brief Number of variable nodes in BG1. */
#define BG1N 66 /*!< \brief Number of variable nodes in BG1 after puncturing. */
#define BG1M 46 /*!< \brief Number of check nodes in BG1. */
#define BG1K 22 /*!< \brief Number of "uncoded bits" in BG1. */
#define BG2Nfull 52 /*!< \brief Number of variable nodes in BG2. */
#define BG2N 50 /*!< \brief Number of variable nodes in BG2 after puncturing. */
#define BG2M 42 /*!< \brief Number of check nodes in BG2. */
#define BG2K 10 /*!< \brief Number of "uncoded bits" in BG2. */
#define MAX_CNCT 20 /*!< \brief Maximum number (+1) of connected variables per check node. */
#define NOF_LIFTSIZE 8 /*!< \brief Number of possible lifting size indices. */
#define MAX_LIFTSIZE 384 /*!< \brief Maximum lifting size. */
#define SRSRAN_LDPC_MAX_LEN_ENCODED_CB (MAX_LIFTSIZE * SRSRAN_MAX(BG1N, BG2N))
#define VOID_LIFTSIZE 255 /*!< \brief Identifies an invalid lifting size in the lookup table. */
/*!
* \brief Identifies a missing connection between a check node and a variable node
* in the protograph. */
#define NO_CNCT 0xFFFF
/*! \brief Possible base graphs, BG1 or BG2. */
typedef enum SRSRAN_API {
BG1 = 0, /*!< \brief Base Graph 1 */
BG2, /*!< \brief Base Graph 2 */
} srsran_basegraph_t;
/*!
* Creates the parity-check matrix for the given base graph and lifting size
* in the compact form (a normalized permutation matrix). Also returns the
* indices of the variable nodes associated to each check node.
* \param[out] pcm The compact parity-check matrix: entry \f$(m,n)\f$ is an
* integer between 0 and LS-1 if check-node \f$m\f$ is
* connected to variable node \f$n\f$ in the protograph.
* This number specifies the order of the circular
* rotation applied to the identity matrix in the full
* graph (see also Section 3.4.1 of Deliverable 1). This
* pointer can be safely cast to 'uint16_t(*)[BGbgNfull]'
* (see also ::BG1Nfull and ::BG2Nfull) to get an BGbgM x
* BGbgNfull matrix.
* \param[out] positions For each check node, the corresponding row of this
* matrix contains the indices of the connected variable
* nodes (see also ::BG1_positions and ::BG2_positions).
* \param[in] bg The desired base graph (BG1 or BG2).
* \param[in] ls The desired lifting size.
* \return An integer: 0 if the function executes correctly, -1 otherwise.
*/
SRSRAN_API int create_compact_pcm(uint16_t* pcm, int8_t (*positions)[MAX_CNCT], srsran_basegraph_t bg, uint16_t ls);
/*!
* Reads the lookup table and returns the set index corresponding to the given
* lifting size.
* \param[in] ls A lifting size.
* \return An integer between 0 and 7 (included), ::VOID_LIFTSIZE if ls is an
* invalid lifting size
*/
static inline uint8_t get_ls_index(uint16_t ls)
{
extern const uint8_t LSindex[];
return (ls <= MAX_LIFTSIZE ? LSindex[ls] : VOID_LIFTSIZE);
}
#endif // SRSRAN_BASEGRAPH_H