#define MAX_NB_PRACH_CONF_PERIOD_IN_ASSOCIATION_PERIOD (16) // Maximum association period is 16
#define MAX_NB_PRACH_CONF_PERIOD_IN_ASSOCIATION_PATTERN_PERIOD (16) // Max association pattern period is 160ms and minimum PRACH configuration period is 10ms
#define MAX_NB_ASSOCIATION_PERIOD_IN_ASSOCIATION_PATTERN_PERIOD (16) // Max nb of association periods in an association pattern period of 160ms
#define MAX_NB_FRAMES_IN_PRACH_CONF_PERIOD (16) // Max PRACH configuration period is 160ms and frame is 10ms
#define MAX_NB_SLOTS_IN_FRAME (160) // Max number of slots in a frame (@ SCS 240kHz = 160)
#define MAX_NB_FRAMES_IN_ASSOCIATION_PATTERN_PERIOD (16) // Maximum number of frames in the maximum association pattern period
#define MAX_NB_SSBS (64) // Maximum number of possible SSB indexes
#define MAX_RO_PER_SSB (8) // Maximum number of consecutive ROs that can be mapped to an SSB according to the ssb_per_RACH config
// Maximum number of ROs that can be mapped to an SSB in an association pattern
// This is to reserve enough elements in the SSBs list for each mapped ROs for a single SSB
// An arbitrary maximum number is chosen to be safe: maximum number of slots in an association pattern * maximum number of ROs in a slot
uint8_tnb_of_assoc_periods;// Nb of association periods within the association pattern
uint8_tnb_of_prach_conf_periods_in_max_period;// Nb of PRACH configuration periods within the maximum association pattern period (according to the size of the configured PRACH
uint8_tnb_of_frames;// Total number of frames included in the association pattern period (after mapping the SSBs and determining the real association pattern length)
}prach_association_pattern_t;
// SSB details
typedefstructssb_info{
boolean_ttransmitted;// True if the SSB index is transmitted according to the SSB positions map configuration
prach_occasion_info_t*mapped_ros[MAX_NB_ROS_PER_SSB_IN_ASSOCIATION_PATTERN];// List of mapped RACH Occasions to this SSB index
uint16_tnb_mapped_ros;// Total number of mapped ROs to this SSB index
}ssb_info_t;
// List of all the possible SSBs and their details
uint8_tnb_of_assoc_periods;// Nb of association periods within the association pattern
uint8_tnb_of_prach_conf_periods_in_max_period;// Nb of PRACH configuration periods within the maximum association pattern period (according to the size of the configured PRACH
uint8_tnb_of_frames;// Total number of frames included in the association pattern period (after mapping the SSBs and determining the real association pattern length)
}prach_association_pattern_t;
// SSB details
typedefstructssb_info{
boolean_ttransmitted;// True if the SSB index is transmitted according to the SSB positions map configuration
prach_occasion_info_t*mapped_ros[MAX_NB_SSBS_IN_ASSOCIATION_PATTERN];// List of mapped RACH Occasions
uint8_tnb_mapped_ros;
}ssb_info_t;
// List of all the possible SSBs and their details
// WIP-IDCC: Assumption for now is that all the PRACH configuration periods within a maximum association pattern period have the same number of PRACH occasions
// (No PRACH occasions are conflicting with SSBs nor TDD_UL_DL_ConfigurationCommon schedule)
// WIP: Assumption for now is that all the PRACH configuration periods within a maximum association pattern period have the same number of PRACH occasions
// (No PRACH occasions are conflicting with SSBs nor TDD_UL_DL_ConfigurationCommon schedule)
// WIP: make sure that the calculated required_nb_of_prach_conf_periods ratio is <= 16
AssertFatal(16>=required_nb_of_prach_conf_periods,"Invalid number of PRACH config periods within an association period %d\n",required_nb_of_prach_conf_periods);
// WIP: for now we assume that all PRACH occasions within the PRACH Configuration periods are identical throughout the maximum association pattern period (160ms)
// It means that only one association period will be necessary to create an association pattern
prach_assoc_pattern.nb_of_assoc_periods=1;
prach_assoc_pattern.nb_of_assoc_periods=1;// WIP-IDCC: only one possible association period
AssertFatal(MAX_NB_ROS_PER_SSB_IN_ASSOCIATION_PATTERN>ssb_list.tx_ssb[ssb_idx].nb_mapped_ros,"Too many mapped ROs (%d) to a single SSB\n",ssb_list.tx_ssb[ssb_idx].nb_mapped_ros);
// If all the required SSBs are mapped to this RO, exit the loop of SSBs
// Exit the loop of ROs if there is no more SSB to map
if(MAX_NB_SSBS==ssb_idx)break;
}// for ro_in_freq
// Exit the loop if there is no more SSBs to map
// Exit the loop of ROs if there is no more SSB to map
if(MAX_NB_SSBS==ssb_idx)break;
}// for ro_in_time
// Exit the loop if there is no more SSBs to map
// Exit the loop of slots if there is no more SSB to map
if(MAX_NB_SSBS==ssb_idx)break;
}// for slot
// Exit the loop if there is no more SSBs to map
// Exit the loop frames if there is no more SSB to map
if(MAX_NB_SSBS==ssb_idx)break;
}// for frame
// Exit the loop if there is no more SSBs to map
// Exit the loop of PRACH configurations if there is no more SSB to map
if(MAX_NB_SSBS==ssb_idx)break;
}// for n_prach_conf
// WIP: If association_period is ever reached in this loop, the mapping should be completed: all SSB_idx are mapped to the required number of ROs
// WIP-IDCC: note that there is no re-mapping of the SSBs within the association period since there is no invalid ROs in the PRACH config periods that would create this situation
}// if multiple_ssbs_per_ro
else{
// --------------------
// --------------------
// Multiple ROs per SSB
// --------------------
// --------------------
n_prach_conf=0;
// Go through the list of transmitted SSBs
for(ssb_idx=0;ssb_idx<MAX_NB_SSBS;ssb_idx++){
uint8_tnb_mapped_ros_in_association_period=0;
uint8_tnb_mapped_ros_in_association_period=0;// Reset the nb of mapped ROs for the new SSB index
AssertFatal(MAX_NB_ROS_PER_SSB_IN_ASSOCIATION_PATTERN>ssb_list.tx_ssb[ssb_idx].nb_mapped_ros,"Too many mapped ROs (%d) to a single SSB\n",ssb_list.tx_ssb[ssb_idx].nb_mapped_ros);
nb_mapped_ros_in_association_period++;
// Exit the loop if this SSB has been mapped to all the required ROs
#define MAX_NB_PRACH_ASSOC_PERIOD_IN_ASSOCIATION_PATTERN_PERIOD (16) // Maximum number of association periods in max association pattern period (160ms)
#define MAX_NB_PRACH_CONF_PERIOD_IN_ASSOCIATION_PERIOD (16) // Maximum association period is 16
#define MAX_NB_PRACH_CONF_PERIOD_IN_ASSOCIATION_PATTERN_PERIOD (16) // Max association pattern period is 160ms and minimum PRACH configuration period is 10ms
#define MAX_NB_FRAMES_IN_PRACH_CONF_PERIOD (16) // Max PRACH configuration period is 160ms and frame is 10ms
#define MAX_NB_SLOTS_IN_FRAME (160) // Max number of slots in a frame (@ SCS 240kHz = 160)
#define MAX_NB_PRACH_OCCASIONS_IN_TIME (7) // Max number of PRACH occasions in time per slot
#define MAX_NB_PRACH_OCCASIONS_IN_FREQ (8) // Max number of PRACH occasions in frequency per slot
#define MAX_NB_FRAMES_IN_ASSOCIATION_PATTERN_PERIOD (16) // Maximum number of frames in the maximum association pattern period
#define MAX_NB_ASSOCIATION_PERIOD_IN_ASSOCIATION_PATTERN_PERIOD (16) // Max nb of association periods in an association pattern period of 160ms
#define MAX_FDM (8) // Maximum nb of PRACH occasions FDMed in a slot
#define MAX_NB_SSBS (64)
#define MAX_RO_PER_SSB_RATIO (8)
#define MAX_SSB_PER_RO_RATIO (16)
// Maximum number of SSBs that can be mapped in an association pattern
// Here we chose an arbitrary maximum number - maximum number of slots in an association pattern * maximum number of ROs in a slot
uint8_tfdm;// 1, 2, 4 or 8 (possible values of msg1-FDM)
uint8_tslot;// 0 - 159 (maximum number of slots in a 10ms frame - @ 240kHz)
uint8_tframe;// 0 - 15 (maximum number of frames in a 160ms association pattern)
uint8_tmapped_ssb_idx[MAX_SSB_PER_RO_RATIO];// List of mapped SSBs
uint8_tmapped_ssb_idx[MAX_SSB_PER_RO];// List of mapped SSBs
uint8_tnb_mapped_ssbs;
uint16_tformat;// RO preamble format
}prach_occasion_info_t;
// PRACH occasions details in a slot
// PRACH occasion slot details
// A PRACH occasion slot is a series of PRACH occasions in time (symbols) and frequency
typedefstructprach_occasion_slot{
prach_occasion_info_tprach_occasion[MAX_NB_PRACH_OCCASIONS_IN_TIME][MAX_FDM];// Starting symbol of each PRACH occasions in a slot - 0Xff when no more valid PRACH occasion in that slot
prach_occasion_info_tprach_occasion[MAX_TDM][MAX_FDM];// Starting symbol of each PRACH occasions in a slot