+ FAIL() << "Invalid Section Type - " << m_sectionType << std::endl;
+ }
+
+ m_numSections = get_input_subsection_size("sections");
+ ASSERT_FALSE(m_numSections == 0);
+
+ m_sections = new struct sectinfo [m_numSections];
+ for(i=0; i<m_numSections; i++) {
+ m_sections[i].sectionId = get_input_parameter<uint16_t>("sections", i, "sectionId");
+ m_sections[i].rb = get_input_parameter<uint16_t>("sections", i, "rb");
+ m_sections[i].symInc = get_input_parameter<uint16_t>("sections", i, "symInc");
+ m_sections[i].startPrbc = get_input_parameter<uint16_t>("sections", i, "startPrbc");
+ m_sections[i].numPrbc = get_input_parameter<uint16_t>("sections", i, "numPrbc");
+ m_sections[i].reMask = get_input_parameter<uint16_t>("sections", i, "reMask");
+ m_sections[i].numSymbol = get_input_parameter<uint16_t>("sections", i, "numSymbol");
+ m_sections[i].beamId = get_input_parameter<uint16_t>("sections", i, "beamId");
+
+ switch(m_sectionType) {
+ case XRAN_CP_SECTIONTYPE_3:
+ m_sections[i].freqOffset = get_input_parameter<uint16_t>("sections", i, "freqOffset");
+ break;
+ }
+
+ m_sections[i].exts = get_input_parameter<std::vector<uint8_t>>("sections", i, "exts");
+ }
+
+ /* reading configurations of section extension */
+ m_nextcfgs = get_input_subsection_size("extensions");
+ if(m_nextcfgs) {
+ m_extcfgs = new struct extcfginfo [m_nextcfgs];
+
+ for(i=0; i < m_nextcfgs; i++) {
+ std::vector<uint16_t> csf;
+ std::vector<uint16_t> mcScaleReMask;
+ std::vector<uint16_t> mcScaleOffset;
+
+ m_extcfgs[i].type = get_input_parameter<int>("extensions", i, "type");
+ m_extcfgs[i].name = get_input_parameter<std::string>("extensions", i, "name");
+
+ switch(m_extcfgs[i].type) {
+ case XRAN_CP_SECTIONEXTCMD_1:
+ /* Skip section extension type 1 since it has separate function */
+ std::cout << "### Skip Extension 1 configuration !!\n" << std::endl;
+ continue;
+
+ case XRAN_CP_SECTIONEXTCMD_2:
+ m_extcfgs[i].u.ext2.bfAzPtWidth = get_input_parameter<uint8_t>("extensions", i, "bfAzPtWidth") & 0x7;
+ m_extcfgs[i].u.ext2.bfAzPt = get_input_parameter<uint8_t>("extensions", i, "bfAzPt") & 0xf;
+ m_extcfgs[i].u.ext2.bfZePtWidth = get_input_parameter<uint8_t>("extensions", i, "bfZePtWidth") & 0x7;
+ m_extcfgs[i].u.ext2.bfZePt = get_input_parameter<uint8_t>("extensions", i, "bfZePt") & 0xf;
+ m_extcfgs[i].u.ext2.bfAz3ddWidth = get_input_parameter<uint8_t>("extensions", i, "bfAz3ddWidth") & 0x7;
+ m_extcfgs[i].u.ext2.bfAz3dd = get_input_parameter<uint8_t>("extensions", i, "bfAz3dd") & 0xf;
+ m_extcfgs[i].u.ext2.bfZe3ddWidth = get_input_parameter<uint8_t>("extensions", i, "bfZe3ddWidth") & 0x7;
+ m_extcfgs[i].u.ext2.bfZe3dd = get_input_parameter<uint8_t>("extensions", i, "bfZe3dd") & 0xf;
+ m_extcfgs[i].u.ext2.bfAzSI = get_input_parameter<uint8_t>("extensions", i, "bfAzSI") & 0x7;
+ m_extcfgs[i].u.ext2.bfZeSI = get_input_parameter<uint8_t>("extensions", i, "bfZeSI") & 0x7;
+ break;
+
+ case XRAN_CP_SECTIONEXTCMD_3:
+ m_extcfgs[i].u.ext3.codebookIdx = get_input_parameter<uint8_t> ("extensions", i, "codebookIdx");
+ m_extcfgs[i].u.ext3.layerId = get_input_parameter<uint8_t> ("extensions", i, "layerId") & 0xf;
+ m_extcfgs[i].u.ext3.numLayers = get_input_parameter<uint8_t> ("extensions", i, "numLayers") & 0xf;
+ m_extcfgs[i].u.ext3.txScheme = get_input_parameter<uint8_t> ("extensions", i, "txScheme") & 0xf;
+ m_extcfgs[i].u.ext3.crsReMask = get_input_parameter<uint16_t>("extensions", i, "crsReMask") & 0xfff;
+ m_extcfgs[i].u.ext3.crsShift = get_input_parameter<uint8_t> ("extensions", i, "crsShift") & 0x1;
+ m_extcfgs[i].u.ext3.crsSymNum = get_input_parameter<uint8_t> ("extensions", i, "crsSymNum") & 0xf;
+ m_extcfgs[i].u.ext3.numAntPort = get_input_parameter<uint16_t>("extensions", i, "numAntPort");
+ m_extcfgs[i].u.ext3.beamIdAP1 = get_input_parameter<uint16_t>("extensions", i, "beamIdAP1");
+ m_extcfgs[i].u.ext3.beamIdAP2 = get_input_parameter<uint16_t>("extensions", i, "beamIdAP2");
+ m_extcfgs[i].u.ext3.beamIdAP3 = get_input_parameter<uint16_t>("extensions", i, "beamIdAP3");
+ break;
+
+ case XRAN_CP_SECTIONEXTCMD_4:
+ m_extcfgs[i].u.ext4.csf = get_input_parameter<uint8_t> ("extensions", i, "csf") & 0xf;
+ m_extcfgs[i].u.ext4.modCompScaler= get_input_parameter<uint16_t>("extensions", i, "modCompScaler") & 0x7fff;
+ break;
+
+ case XRAN_CP_SECTIONEXTCMD_5:
+ m_extcfgs[i].u.ext5.num_sets = get_input_parameter<uint8_t>("extensions", i, "num_sets");
+ if(m_extcfgs[i].u.ext5.num_sets > XRAN_MAX_MODCOMP_ADDPARMS)
+ FAIL() << "Invalid number of sets in extension 5!";
+
+ csf = get_input_parameter<std::vector<uint16_t>>("extensions", i, "csf");
+ mcScaleReMask = get_input_parameter<std::vector<uint16_t>>("extensions", i, "mcScaleReMask");
+ mcScaleOffset = get_input_parameter<std::vector<uint16_t>>("extensions", i, "mcScaleOffset");
+
+ if(csf.size() != m_extcfgs[i].u.ext5.num_sets
+ || mcScaleReMask.size() != m_extcfgs[i].u.ext5.num_sets
+ || mcScaleOffset.size() != m_extcfgs[i].u.ext5.num_sets)
+ FAIL() << "Invalid configuration in extension 5 - different size!";
+
+ for(int ii=0; ii < m_extcfgs[i].u.ext5.num_sets; ii++) {
+ m_extcfgs[i].u.ext5.mc[ii].csf = csf[ii];
+ m_extcfgs[i].u.ext5.mc[ii].mcScaleReMask = mcScaleReMask[ii];
+ m_extcfgs[i].u.ext5.mc[ii].mcScaleOffset = mcScaleOffset[ii];
+ }
+ break;
+
+ default:
+ FAIL() << "Invalid Section Type Extension - " << m_extcfgs[i].type << std::endl;
+ continue;
+ } /* switch(m_extcfgs[i].type) */
+ } /* for(i=0; i < m_nextcfgs; i++) */
+ }
+ else {
+ m_extcfgs = nullptr;