|
|
|
/**
|
|
|
|
*
|
|
|
|
* \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.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SRSRAN_PHY_CFG_NR_H
|
|
|
|
#define SRSRAN_PHY_CFG_NR_H
|
|
|
|
|
|
|
|
#include "srsran/config.h"
|
|
|
|
#include "srsran/srsran.h"
|
|
|
|
#include <array>
|
|
|
|
#include <srsran/adt/bounded_vector.h>
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
namespace srsran {
|
|
|
|
|
|
|
|
/***************************
|
|
|
|
* PHY Config
|
|
|
|
**************************/
|
|
|
|
|
|
|
|
struct phy_cfg_nr_t {
|
|
|
|
/**
|
|
|
|
* SSB configuration
|
|
|
|
*/
|
|
|
|
struct ssb_cfg_t {
|
|
|
|
uint32_t periodicity_ms = 0;
|
|
|
|
std::array<bool, SRSRAN_SSB_NOF_CANDIDATES> position_in_burst = {};
|
|
|
|
srsran_subcarrier_spacing_t scs = srsran_subcarrier_spacing_30kHz;
|
|
|
|
srsran_ssb_patern_t pattern = SRSRAN_SSB_PATTERN_A;
|
|
|
|
};
|
|
|
|
|
|
|
|
srsran_duplex_config_nr_t duplex = {};
|
|
|
|
srsran_sch_hl_cfg_nr_t pdsch = {};
|
|
|
|
srsran_sch_hl_cfg_nr_t pusch = {};
|
|
|
|
srsran_pucch_nr_hl_cfg_t pucch = {};
|
|
|
|
srsran_prach_cfg_t prach = {};
|
|
|
|
srsran_pdcch_cfg_nr_t pdcch = {};
|
|
|
|
srsran_harq_ack_cfg_hl_t harq_ack = {};
|
|
|
|
srsran_csi_hl_cfg_t csi = {};
|
|
|
|
srsran_carrier_nr_t carrier = {};
|
|
|
|
ssb_cfg_t ssb;
|
|
|
|
|
|
|
|
phy_cfg_nr_t() {}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Computes the DCI configuration for the current UE configuration
|
|
|
|
*/
|
|
|
|
srsran_dci_cfg_nr_t get_dci_cfg() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Asserts that the PDCCH configuration is valid for a given Search Space identifier
|
|
|
|
* @param ss_id Identifier
|
|
|
|
* @return true if the configuration is valid, false otherwise
|
|
|
|
*/
|
|
|
|
bool assert_ss_id(uint32_t ss_id) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Calculates the DCI location candidates for a given search space and aggregation level
|
|
|
|
* @param slot_idx Slot index
|
|
|
|
* @param rnti UE temporal identifier
|
|
|
|
* @param ss_id Search Space identifier
|
|
|
|
* @param L Aggregation level
|
|
|
|
* @param[out] locations DCI candidate locations
|
|
|
|
* @return true if the configuration is valid, false otherwise
|
|
|
|
*/
|
|
|
|
bool get_dci_locations(
|
|
|
|
const uint32_t& slot_idx,
|
|
|
|
const uint16_t& rnti,
|
|
|
|
const uint32_t& ss_id,
|
|
|
|
const uint32_t& L,
|
|
|
|
srsran::bounded_vector<srsran_dci_location_t, SRSRAN_SEARCH_SPACE_MAX_NOF_CANDIDATES_NR>& locations) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Selects a valid DCI format for scheduling PDSCH and given Search Space identifier
|
|
|
|
* @param ss_id Identifier
|
|
|
|
* @return A valid DCI format if available, SRSRAN_DCI_FORMAT_NR_COUNT otherwise
|
|
|
|
*/
|
|
|
|
srsran_dci_format_nr_t get_dci_format_pdsch(uint32_t ss_id) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Selects a valid DCI format for scheduling PUSCH and given Search Space identifier
|
|
|
|
* @param ss_id Identifier
|
|
|
|
* @return A valid DCI format if available, SRSRAN_DCI_FORMAT_NR_COUNT otherwise
|
|
|
|
*/
|
|
|
|
srsran_dci_format_nr_t get_dci_format_pusch(uint32_t ss_id) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Fills PDSCH DCI context for C-RNTI using a search space identifier, DCI candidate location and RNTI
|
|
|
|
*/
|
|
|
|
bool get_dci_ctx_pdsch_rnti_c(uint32_t ss_id,
|
|
|
|
const srsran_dci_location_t& location,
|
|
|
|
const uint16_t& rnti,
|
|
|
|
srsran_dci_ctx_t& ctx) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Fills PUSCH DCI context for C-RNTI using a search space identifier, DCI candidate location and RNTI
|
|
|
|
*/
|
|
|
|
bool get_dci_ctx_pusch_rnti_c(uint32_t ss_id,
|
|
|
|
const srsran_dci_location_t& location,
|
|
|
|
const uint16_t& rnti,
|
|
|
|
srsran_dci_ctx_t& ctx) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get PDSCH configuration for a given slot and DCI
|
|
|
|
*/
|
|
|
|
bool
|
|
|
|
get_pdsch_cfg(const srsran_slot_cfg_t& slot_cfg, const srsran_dci_dl_nr_t& dci, srsran_sch_cfg_nr_t& pdsch_cfg) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get PUSCH configuration for a given slot and DCI
|
|
|
|
*/
|
|
|
|
bool
|
|
|
|
get_pusch_cfg(const srsran_slot_cfg_t& slot_cfg, const srsran_dci_ul_nr_t& dci, srsran_sch_cfg_nr_t& pdsch_cfg) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get PDSCH ACK resource for a given PDSCH transmission
|
|
|
|
*/
|
|
|
|
bool get_pdsch_ack_resource(const srsran_dci_dl_nr_t& dci_dl, srsran_harq_ack_resource_t& ack_resource) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Compute UCI configuration for the given slot from the pending PDSCH ACK resources, periodic CSI,
|
|
|
|
* periodic SR resources and so on.
|
|
|
|
*/
|
|
|
|
bool get_uci_cfg(const srsran_slot_cfg_t& slot_cfg,
|
|
|
|
const srsran_pdsch_ack_nr_t& pdsch_ack,
|
|
|
|
srsran_uci_cfg_nr_t& uci_cfg) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Compute UCI configuration for PUCCH for the given slot from the pending PDSCH ACK resources, periodic CSI,
|
|
|
|
* periodic SR resources and so on.
|
|
|
|
*/
|
|
|
|
bool get_pucch_uci_cfg(const srsran_slot_cfg_t& slot_cfg,
|
|
|
|
const srsran_uci_cfg_nr_t& uci_cfg,
|
|
|
|
srsran_pucch_nr_common_cfg_t& cfg,
|
|
|
|
srsran_pucch_nr_resource_t& resource) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Compute UCI configuration for PUSCH for the given slot from the pending PDSCH ACK resources, periodic CSI,
|
|
|
|
* periodic SR resources and so on.
|
|
|
|
*/
|
|
|
|
bool get_pusch_uci_cfg(const srsran_slot_cfg_t& slot_cfg,
|
|
|
|
const srsran_uci_cfg_nr_t& uci_cfg,
|
|
|
|
srsran_sch_cfg_nr_t& pusch_cfg) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace srsran
|
|
|
|
|
|
|
|
#endif // SRSRAN_PHY_CFG_NR_H
|