diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab
index 6ffac9a806..023b8ec154 100644
--- a/ci-scripts/Jenkinsfile-gitlab
+++ b/ci-scripts/Jenkinsfile-gitlab
@@ -362,7 +362,7 @@ pipeline {
stage ("Test physical simulators") {
steps {
script {
- timeout (time: 20, unit: 'MINUTES') {
+ timeout (time: 45, unit: 'MINUTES') {
try {
gitlabCommitStatus(name: "Test phy-sim") {
sh "./ci-scripts/oai-ci-vm-tool test --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
diff --git a/ci-scripts/Jenkinsfile-poll-gNB-UE b/ci-scripts/Jenkinsfile-poll-gNB-UE
index 80df21f62d..88dff2b102 100644
--- a/ci-scripts/Jenkinsfile-poll-gNB-UE
+++ b/ci-scripts/Jenkinsfile-poll-gNB-UE
@@ -51,14 +51,10 @@ def eNB_Repository
def eNB_Branch
def eNB_CommitID
def eNB_AllowMergeRequestProcess = false
-def eNB_TargetBranch
-def PROJECT_NAME = "test-boris"
-def GIT_COMMIT_AUTHORi
+def eNB_TargetBranch = "develop-nr"
+def GIT_COMMIT_AUTHOR
def GIT_COMMIT_EMAIL
def testStageName
-// Reversing list because pop() will take the last (right-most) element
-//def modeList = ['TesteNB', 'TestUE', 'TesteNB'].reverse()
-
// Global Parameters not to break the main.py command line and code.
def ADB_IPAddress = "none"
def ADB_Username = "none"
@@ -201,12 +197,12 @@ pipeline {
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.UE_Credentials}", usernameVariable: 'UE_Username', passwordVariable: 'UE_Password']
]) {
- sh "python3 main.py --mode=InitiateHtml --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --ADBIPAddress=${ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} ${mainPythonAllXmlFiles}"
+ sh "python3 main.py --mode=InitiateHtml --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --eNBTargetBranch=${eNB_TargetBranch} --ADBIPAddress=${ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} ${mainPythonAllXmlFiles}"
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
for (xmlFile in myXmlTestSuite) {
if (fileExists(xmlFile)) {
try {
- sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --UEIPAddress=${params.eNB_IPAddress} --UEUserName=${eNB_Username} --UEPassword=${eNB_Password} --eNBBranch=${eNB_Branch} --eNBSourceCodePath=${params.eNB_SourceCodePath} --UESourceCodePath=${params.eNB_SourceCodePath} --eNBRepository=${eNB_Repository} --eNBCommitID=${eNB_CommitID} --ADBIPAddress=${ADB_IPAddress} --EPCIPAddress=${EPC_IPAddress} --XMLTestFile=${xmlFile}"
+ sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --UEIPAddress=${params.eNB_IPAddress} --UEUserName=${eNB_Username} --UEPassword=${eNB_Password} --UESourceCodePath=${params.eNB_SourceCodePath} --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --eNBTargetBranch=${eNB_TargetBranch} --ADBIPAddress=${ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --EPCIPAddress=${EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=/tmp/${EPC_Username} --EPCType=ltebox --XMLTestFile=${xmlFile}"
} catch (Exception e) {
currentBuild.result = 'FAILURE'
buildStageStatus = false
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index d465e7075c..88ba4e1a9a 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -56,6 +56,7 @@ OAI_UE_PROCESS_COULD_NOT_SYNC = -21
OAI_UE_PROCESS_ASSERTION = -22
OAI_UE_PROCESS_FAILED = -23
OAI_UE_PROCESS_NO_TUNNEL_INTERFACE = -24
+OAI_UE_PROCESS_SEG_FAULT = -25
OAI_UE_PROCESS_OK = +6
UE_STATUS_DETACHED = 0
@@ -175,7 +176,6 @@ class SSHConnection():
self.UELogFile = ''
self.Build_OAI_UE_args = ''
self.Initialize_OAI_UE_args = ''
- self.Initialize_OAI_eNB_args = ''
self.clean_repository = True
self.flexranCtrlInstalled = False
self.flexranCtrlStarted = False
@@ -762,13 +762,18 @@ class SSHConnection():
self.command('echo "ulimit -c unlimited && ./ran_build/build/' + self.air_interface + '-softmodem -O ' + lSourcePath + '/' + ci_full_config_file + extra_options + '" > ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5)
self.command('chmod 775 ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5)
self.command('echo ' + lPassWord + ' | sudo -S rm -Rf enb_' + self.testCase_id + '.log', '\$', 5)
- self.command('echo ' + lPassWord + ' | sudo -S -E daemon --inherit --unsafe --name=enb' + str(self.eNB_instance) + '_daemon --chdir=' + lSourcePath + '/cmake_targets -o ' + lSourcePath + '/cmake_targets/enb_' + self.testCase_id + '.log ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5)
+ self.command('hostnamectl','\$', 5)
+ result = re.search('CentOS Linux 7', str(self.ssh.before))
+ if result is not None:
+ self.command('echo $USER; nohup sudo ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh > ' + lSourcePath + '/cmake_targets/enb_' + self.testCase_id + '.log 2>&1 &', lUserName, 10)
+ else:
+ self.command('echo ' + lPassWord + ' | sudo -S -E daemon --inherit --unsafe --name=enb' + str(self.eNB_instance) + '_daemon --chdir=' + lSourcePath + '/cmake_targets -o ' + lSourcePath + '/cmake_targets/enb_' + self.testCase_id + '.log ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5)
self.eNBLogFiles[int(self.eNB_instance)] = 'enb_' + self.testCase_id + '.log'
if extra_options != '':
self.eNBOptions[int(self.eNB_instance)] = extra_options
time.sleep(6)
doLoop = True
- loopCounter = 10
+ loopCounter = 20
while (doLoop):
loopCounter = loopCounter - 1
if (loopCounter == 0):
@@ -983,14 +988,20 @@ class SSHConnection():
tunnelInterfaceStatus = False
else:
tunnelInterfaceStatus = True
+ else:
+ tunnelInterfaceStatus = True
self.close()
if fullSyncStatus and gotSyncStatus and tunnelInterfaceStatus:
self.CreateHtmlTestRow(self.Initialize_OAI_UE_args, 'OK', ALL_PROCESSES_OK, 'OAI UE')
logging.debug('\u001B[1m Initialize OAI UE Completed\u001B[0m')
else:
- self.htmlUEFailureMsg = 'oaitun_ue1 interface is either NOT mounted or NOT configured'
- self.CreateHtmlTestRow(self.Initialize_OAI_UE_args, 'KO', OAI_UE_PROCESS_NO_TUNNEL_INTERFACE, 'OAI UE')
+ if self.air_interface == 'lte':
+ self.htmlUEFailureMsg = 'oaitun_ue1 interface is either NOT mounted or NOT configured'
+ self.CreateHtmlTestRow(self.Initialize_OAI_UE_args, 'KO', OAI_UE_PROCESS_NO_TUNNEL_INTERFACE, 'OAI UE')
+ else:
+ self.htmlUEFailureMsg = 'nr-uesoftmodem did NOT synced'
+ self.CreateHtmlTestRow(self.Initialize_OAI_UE_args, 'KO', OAI_UE_PROCESS_COULD_NOT_SYNC, 'OAI UE')
logging.error('\033[91mInitialize OAI UE Failed! \033[0m')
self.AutoTerminateUEandeNB()
@@ -2557,7 +2568,8 @@ class SSHConnection():
multi_jobs = []
status_queue = SimpleQueue()
# in noS1 config, no need to check status from EPC
- result = re.search('noS1', str(self.Initialize_eNB_args))
+ # in gNB also currently no need to check
+ result = re.search('noS1|band78', str(self.Initialize_eNB_args))
if result is None:
p = Process(target = SSH.CheckHSSProcess, args = (status_queue,))
p.daemon = True
@@ -3129,6 +3141,10 @@ class SSHConnection():
statMsg = 'UE showed ' + str(nrCRCOK) + ' PDSCH decoding message(s)'
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
self.htmlUEFailureMsg += statMsg + '\n'
+ if not frequency_found:
+ statMsg = 'NR-UE could NOT synch!'
+ logging.error('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
+ self.htmlUEFailureMsg += statMsg + '\n'
if uciStatMsgCount > 0:
statMsg = 'UE showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
@@ -3143,20 +3159,32 @@ class SSHConnection():
self.htmlUEFailureMsg += statMsg + '\n'
if foundSegFault:
logging.debug('\u001B[1;37;41m UE ended with a Segmentation Fault! \u001B[0m')
- return ENB_PROCESS_SEG_FAULT
+ if not nrUEFlag:
+ return OAI_UE_PROCESS_SEG_FAULT
+ else:
+ if not frequency_found:
+ return OAI_UE_PROCESS_SEG_FAULT
if foundAssertion:
logging.debug('\u001B[1;30;43m UE showed an assertion! \u001B[0m')
self.htmlUEFailureMsg += 'UE showed an assertion!\n'
- if not mib_found or not frequency_found:
- return OAI_UE_PROCESS_ASSERTION
+ if not nrUEFlag:
+ if not mib_found or not frequency_found:
+ return OAI_UE_PROCESS_ASSERTION
+ else:
+ if not frequency_found:
+ return OAI_UE_PROCESS_ASSERTION
if foundRealTimeIssue:
logging.debug('\u001B[1;37;41m UE faced real time issues! \u001B[0m')
self.htmlUEFailureMsg += 'UE faced real time issues!\n'
#return ENB_PROCESS_REALTIME_ISSUE
- if no_cell_sync_found and not mib_found:
- logging.debug('\u001B[1;37;41m UE could not synchronize ! \u001B[0m')
- self.htmlUEFailureMsg += 'UE could not synchronize!\n'
- return OAI_UE_PROCESS_COULD_NOT_SYNC
+ if nrUEFlag:
+ if not frequency_found:
+ return OAI_UE_PROCESS_COULD_NOT_SYNC
+ else:
+ if no_cell_sync_found and not mib_found:
+ logging.debug('\u001B[1;37;41m UE could not synchronize ! \u001B[0m')
+ self.htmlUEFailureMsg += 'UE could not synchronize!\n'
+ return OAI_UE_PROCESS_COULD_NOT_SYNC
return 0
def TerminateeNB(self):
@@ -3379,13 +3407,16 @@ class SSHConnection():
logging.debug('\u001B[1m' + ueAction + ' Failed \u001B[0m')
self.htmlUEFailureMsg = '' + ueAction + ' Failed\n' + self.htmlUEFailureMsg
self.CreateHtmlTestRow('N/A', 'KO', logStatus, 'UE')
- # for NR-UE at the moment keep running
if self.air_interface == 'lte':
# In case of sniffing on commercial eNBs we have random results
# Not an error then
if (logStatus != OAI_UE_PROCESS_COULD_NOT_SYNC) or (ueAction != 'Sniffing'):
self.Initialize_OAI_UE_args = ''
self.AutoTerminateUEandeNB()
+ else:
+ if (logStatus == OAI_UE_PROCESS_COULD_NOT_SYNC):
+ self.Initialize_OAI_UE_args = ''
+ self.AutoTerminateUEandeNB()
else:
logging.debug('\u001B[1m' + ueAction + ' Completed \u001B[0m')
self.htmlUEFailureMsg = '' + ueAction + ' Completed\n' + self.htmlUEFailureMsg
@@ -3938,7 +3969,7 @@ class SSHConnection():
self.htmlFile.write('
KO - eNB process not found | \n')
elif (processesStatus == OAI_UE_PROCESS_FAILED):
self.htmlFile.write(' KO - OAI UE process not found | \n')
- elif (processesStatus == ENB_PROCESS_SEG_FAULT):
+ elif (processesStatus == ENB_PROCESS_SEG_FAULT) or (processesStatus == OAI_UE_PROCESS_SEG_FAULT):
self.htmlFile.write(' KO - ' + machine + ' process ended in Segmentation Fault | \n')
elif (processesStatus == ENB_PROCESS_ASSERTION) or (processesStatus == OAI_UE_PROCESS_ASSERTION):
self.htmlFile.write(' KO - ' + machine + ' process ended in Assertion | \n')
diff --git a/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml b/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml
index 12d06ac456..ec63e11322 100644
--- a/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml
+++ b/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml
@@ -24,15 +24,16 @@
run-OAI-gNB-NR-UE-USRP
run OAI gNB and OAI NR UE USRP
tasks
+ 4
090101 000001 090102 000002 090108 090109
- Initialize_OAI_eNB
+ Initialize_eNB
Initialize gNB USRP
- -O ../../../ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
+ -O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
NR
diff --git a/ci-scripts/xml_files/gnb_nr_ue_usrp_terminate.xml b/ci-scripts/xml_files/gnb_nr_ue_usrp_terminate.xml
new file mode 100644
index 0000000000..e7a6295b9e
--- /dev/null
+++ b/ci-scripts/xml_files/gnb_nr_ue_usrp_terminate.xml
@@ -0,0 +1,44 @@
+
+
+ run-OAI-gNB-NR-UE-USRP
+ run OAI gNB and OAI NR UE USRP
+ tasks
+
+090108 090109
+
+
+
+
+ Terminate_OAI_UE
+ Terminate NR UE
+ NR
+
+
+
+ Terminate_eNB
+ Terminate gNB
+ NR
+
+
+
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 0d50595c5d..44006dc4ba 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -244,6 +244,7 @@ add_boolean_option(TEST_OMG False "???")
add_boolean_option(DEBUG_OMG False "???")
add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
add_boolean_option(T_TRACER True "Activate the T tracer, a debugging/monitoring framework" )
+add_boolean_option(ENABLE_VCD True "always true now, time measurements of proc calls and var displays")
add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs")
add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace")
add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace")
@@ -1032,7 +1033,7 @@ set(UTIL_SRC
${OPENAIR2_DIR}/UTIL/LISTS/list.c
${OPENAIR2_DIR}/UTIL/LISTS/list2.c
${OPENAIR_DIR}/common/utils/LOG/log.c
-# ${OPENAIR2_DIR}/UTIL/LOG/vcd_signal_dumper.c
+ ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c
${OPENAIR2_DIR}/UTIL/MATH/oml.c
# ${OPENAIR2_DIR}/UTIL/MEM/mem_block.c
# ${OPENAIR2_DIR}/UTIL/OCG/OCG.c
@@ -2575,6 +2576,7 @@ add_executable(nr-uesoftmodem
${OPENAIR_DIR}/common/utils/system.c
${XFORMS_SOURCE_NR}
${T_SOURCE}
+ ${UTIL_SRC}
${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
)
@@ -2689,42 +2691,51 @@ add_executable(nr_dlschsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
${OPENAIR_DIR}/common/utils/backtrace.c
${OPENAIR_DIR}/common/utils/system.c
+ ${UTIL_SRC}
${T_SOURCE})
-target_link_libraries(nr_dlschsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl)
+target_link_libraries(nr_dlschsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
add_executable(nr_pbchsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c
${OPENAIR_DIR}/common/utils/backtrace.c
${OPENAIR_DIR}/common/utils/system.c
+ ${UTIL_SRC}
${T_SOURCE})
-target_link_libraries(nr_pbchsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl)
+target_link_libraries(nr_pbchsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
#PUCCH ---> Prashanth
add_executable(nr_pucchsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c
${OPENAIR_DIR}/common/utils/backtrace.c
+ ${OPENAIR_DIR}/common/utils/system.c
+ ${UTIL_SRC}
${T_SOURCE})
-target_link_libraries(nr_pucchsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl)
+target_link_libraries(nr_pucchsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
#PUCCH ---> Prashanth
add_executable(nr_dlsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c
${OPENAIR_DIR}/common/utils/backtrace.c
${OPENAIR_DIR}/common/utils/system.c
+ ${UTIL_SRC}
${T_SOURCE})
-target_link_libraries(nr_dlsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_NR -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl)
+target_link_libraries(nr_dlsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_NR -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
add_executable(nr_ulschsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
${OPENAIR_DIR}/common/utils/backtrace.c
+ ${OPENAIR_DIR}/common/utils/system.c
+ ${UTIL_SRC}
${T_SOURCE})
-target_link_libraries(nr_ulschsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl)
+target_link_libraries(nr_ulschsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
add_executable(nr_ulsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim.c
${OPENAIR_DIR}/common/utils/backtrace.c
+ ${OPENAIR_DIR}/common/utils/system.c
+ ${UTIL_SRC}
${T_SOURCE})
-target_link_libraries(nr_ulsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_NR -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl)
+target_link_libraries(nr_ulsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_NR -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
diff --git a/common/utils/LOG/vcd_signal_dumper.c b/common/utils/LOG/vcd_signal_dumper.c
index 1d80670324..d25b78be04 100644
--- a/common/utils/LOG/vcd_signal_dumper.c
+++ b/common/utils/LOG/vcd_signal_dumper.c
@@ -343,6 +343,7 @@ const char* eurecomFunctionsNames[] = {
"phy_procedures_ue_tx",
"phy_procedures_ue_rx",
"phy_procedures_ue_tx_ulsch_uespec",
+ "phy_procedures_nr_ue_tx_ulsch_uespec",
"phy_procedures_ue_tx_pucch",
"phy_procedures_ue_tx_ulsch_common",
"phy_procedures_ue_tx_prach",
@@ -366,6 +367,11 @@ const char* eurecomFunctionsNames[] = {
"dlsch_decoding5",
"dlsch_decoding6",
"dlsch_decoding7",
+ "dlsch_segmentation",
+ "dlsch_deinterleaving",
+ "dlsch_rate_matching",
+ "dlsch_ldpc",
+ "dlsch_compine_seg",
"dlsch_pmch_decoding",
"rx_pdcch",
"dci_decoding",
diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h
index 33af6cbeef..a7c4c10fe3 100644
--- a/common/utils/LOG/vcd_signal_dumper.h
+++ b/common/utils/LOG/vcd_signal_dumper.h
@@ -324,6 +324,7 @@ typedef enum {
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_NR_UE_TX_ULSCH_UESPEC,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PUCCH,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_COMMON,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH,
@@ -347,6 +348,11 @@ typedef enum {
VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING5,
VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING6,
VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING7,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG,
VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PMCH_DECODING,
VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH,
VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING,
@@ -549,12 +555,20 @@ extern int ouput_vcd;
#include "T.h"
+#define VCD_SIGNAL_DUMPER_INIT(x) /* nothing */
+#define VCD_SIGNAL_DUMPER_CLOSE() /* nothing */
+#define VCD_SIGNAL_DUMPER_CREATE_HEADER() /* nothing */
#define VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(var, val) T_VCD_VARIABLE(var, val)
#define VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(var, val) T_VCD_FUNCTION(var, val)
-#else
-#define VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(var, val)
-#define VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(var, val)
+#else /* T_TRACER */
+
+#define VCD_SIGNAL_DUMPER_INIT(aRgUmEnT) vcd_signal_dumper_init(aRgUmEnT)
+#define VCD_SIGNAL_DUMPER_CLOSE() vcd_signal_dumper_close()
+#define VCD_SIGNAL_DUMPER_CREATE_HEADER() vcd_signal_dumper_create_header()
+#define VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(vAr1,vAr2) vcd_signal_dumper_dump_variable_by_name(vAr1,vAr2)
+#define VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(vAr1,vAr2) vcd_signal_dumper_dump_function_by_name(vAr1,vAr2)
+
#endif /* T_TRACER */
diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h
index 7d55d9b336..4f2b10c3ae 100644
--- a/common/utils/T/T_defs.h
+++ b/common/utils/T/T_defs.h
@@ -73,7 +73,7 @@ typedef struct {
} T_cache_t;
/* number of VCD functions (to be kept up to date! see in T_messages.txt) */
-#define VCD_NUM_FUNCTIONS (231)
+#define VCD_NUM_FUNCTIONS (237)//(232)
/* number of VCD variables (to be kept up to date! see in T_messages.txt) */
#define VCD_NUM_VARIABLES (185)
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index 5af1f1232f..0b10b6e25e 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -2493,6 +2493,11 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
GROUP = ALL:VCD:UE:VCD_FUNCTION
FORMAT = int,value
VCD_NAME = phy_procedures_ue_tx_ulsch_uespec
+ID = VCD_FUNCTION_PHY_PROCEDURES_NR_UE_TX_ULSCH_UESPEC
+ DESC = VCD function PHY_PROCEDURES_NR_UE_TX_ULSCH_UESPEC
+ GROUP = ALL:VCD:UE:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = phy_procedures_nr_ue_tx_ulsch_uespec
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PUCCH
DESC = VCD function PHY_PROCEDURES_UE_TX_PUCCH
GROUP = ALL:VCD:UE:VCD_FUNCTION
@@ -2608,6 +2613,31 @@ ID = VCD_FUNCTION_DLSCH_DECODING7
GROUP = ALL:VCD:ENB:VCD_FUNCTION
FORMAT = int,value
VCD_NAME = dlsch_decoding7
+ID = VCD_FUNCTION_DLSCH_SEGMENTATION
+ DESC = VCD function DLSCH_SEGMENTATION
+ GROUP = ALL:VCD:ENB:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = dlsch_segmentation
+ID = VCD_FUNCTION_DLSCH_DEINTERLEAVING
+ DESC = VCD function DLSCH_DEINTERLEAVING
+ GROUP = ALL:VCD:ENB:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = dlsch_deinterleaving
+ID = VCD_FUNCTION_DLSCH_RATE_MATCHING
+ DESC = VCD function DLSCH_RATE_MATCHING
+ GROUP = ALL:VCD:ENB:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = dlsch_rate_matching
+ID = VCD_FUNCTION_DLSCH_LDPC
+ DESC = VCD function DLSCH_LDPC
+ GROUP = ALL:VCD:ENB:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = dlsch_ldpc
+ID = VCD_FUNCTION_DLSCH_COMBINE_SEG
+ DESC = VCD function DLSCH_COMBINE_SEG
+ GROUP = ALL:VCD:ENB:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = dlsch_compine_seg
ID = VCD_FUNCTION_DLSCH_PMCH_DECODING
DESC = VCD function DLSCH_PMCH_DECODING
GROUP = ALL:VCD:ENB:VCD_FUNCTION
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 945dc9bc18..87ff9afd7a 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -682,6 +682,27 @@ static void* gNB_thread_prach( void* param ) {
extern void init_td_thread(PHY_VARS_gNB *);
extern void init_te_thread(PHY_VARS_gNB *);
+static void* process_stats_thread(void* param) {
+
+ PHY_VARS_gNB *gNB = (PHY_VARS_gNB*)param;
+
+ reset_meas(&gNB->dlsch_encoding_stats);
+ reset_meas(&gNB->dlsch_scrambling_stats);
+ reset_meas(&gNB->dlsch_modulation_stats);
+
+ wait_sync("process_stats_thread");
+
+ while(!oai_exit)
+ {
+ sleep(1);
+ print_meas(&gNB->dlsch_encoding_stats, "pdsch_encoding", NULL, NULL);
+ print_meas(&gNB->dlsch_scrambling_stats, "pdsch_scrambling", NULL, NULL);
+ print_meas(&gNB->dlsch_modulation_stats, "pdsch_modulation", NULL, NULL);
+ }
+ return(NULL);
+}
+
+
void init_gNB_proc(int inst) {
int i=0;
int CC_id;
@@ -729,6 +750,7 @@ void init_gNB_proc(int inst) {
threadCreate( &L1_proc_tx->pthread, gNB_L1_thread_tx, gNB,"L1_proc_tx", -1, OAI_PRIORITY_RT);
}
+ if(opp_enabled == 1) threadCreate(&proc->L1_stats_thread, process_stats_thread,(void *)gNB, "time_meas", -1, OAI_PRIORITY_RT_LOW);
//pthread_create( &proc->pthread_prach, attr_prach, gNB_thread_prach, gNB );
char name[16];
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index c73b2fa277..d22c558eea 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -1077,30 +1077,39 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
cfg->rx_bw = 1.5e6;
} else AssertFatal(1==0,"Unknown N_RB %d\n",N_RB);
} else if (mu == NR_MU_1) {
- if(N_RB == 217) {
+ if(N_RB == 273) {
if (fp->threequarter_fs) {
- cfg->sample_rate=92.16e6;
- cfg->samples_per_frame = 921600;
- cfg->tx_bw = 40e6;
- cfg->rx_bw = 40e6;
+ AssertFatal(0 == 1,"three quarter sampling not supported for N_RB 273\n");
} else {
cfg->sample_rate=122.88e6;
cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 40e6;
- cfg->rx_bw = 40e6;
+ cfg->tx_bw = 100e6;
+ cfg->rx_bw = 100e6;
+ }
+ } else if(N_RB == 217) {
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=92.16e6;
+ cfg->samples_per_frame = 921600;
+ cfg->tx_bw = 80e6;
+ cfg->rx_bw = 80e6;
+ } else {
+ cfg->sample_rate=122.88e6;
+ cfg->samples_per_frame = 1228800;
+ cfg->tx_bw = 80e6;
+ cfg->rx_bw = 80e6;
}
} else if(N_RB == 106) {
if (fp->threequarter_fs) {
cfg->sample_rate=46.08e6;
cfg->samples_per_frame = 460800;
- cfg->tx_bw = 20e6;
- cfg->rx_bw = 20e6;
+ cfg->tx_bw = 40e6;
+ cfg->rx_bw = 40e6;
}
else {
cfg->sample_rate=61.44e6;
cfg->samples_per_frame = 614400;
- cfg->tx_bw = 20e6;
- cfg->rx_bw = 20e6;
+ cfg->tx_bw = 40e6;
+ cfg->rx_bw = 40e6;
}
} else {
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
@@ -1623,7 +1632,7 @@ extern void nr_feptx_ofdm(RU_t *ru,int frame_tx,int tti_tx);
extern void nr_feptx_ofdm_2thread(RU_t *ru,int frame_tx,int tti_tx);
extern void feptx_prec(RU_t *ru, int frame_tx,int tti_tx);
extern void init_fep_thread(RU_t *ru);
-extern void init_nr_feptx_thread(RU_t *ru);
+extern void nr_init_feptx_thread(RU_t *ru);
void init_RU_proc(RU_t *ru) {
int i=0;
@@ -1688,7 +1697,7 @@ void init_RU_proc(RU_t *ru) {
threadCreate( &proc->pthread_prach, ru_thread_prach, (void *)ru,"RACH", -1, OAI_PRIORITY_RT );
}
- if (get_nprocs()>=2) {
+ if (get_thread_worker_conf() == WORKER_ENABLE) {
if (ru->feprx) init_fep_thread(ru);
if (ru->feptx_ofdm) nr_init_feptx_thread(ru);
@@ -1982,8 +1991,8 @@ void set_function_spec_param(RU_t *ru) {
ru->fh_north_out = fh_if4p5_north_out; // send_IF4p5 on reception
ru->fh_south_out = tx_rf; // send output to RF
ru->fh_north_asynch_in = fh_if4p5_north_asynch_in; // TX packets come asynchronously
- ru->feprx = (get_nprocs()<=2) ? fep_full :ru_fep_full_2thread; // RX DFTs
- ru->feptx_ofdm = (get_nprocs()<=2) ? nr_feptx_ofdm : nr_feptx_ofdm_2thread; // this is fep with idft only (no precoding in RRU)
+ ru->feprx = (get_thread_worker_conf() == WORKER_ENABLE) ? ru_fep_full_2thread : fep_full; // RX DFTs
+ ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm; // this is fep with idft only (no precoding in RRU)
ru->feptx_prec = NULL;
ru->nr_start_if = nr_start_if; // need to start the if interface for if4p5
ru->ifdevice.host_type = RRU_HOST;
@@ -2004,8 +2013,8 @@ void set_function_spec_param(RU_t *ru) {
malloc_IF4p5_buffer(ru);
} else if (ru->function == gNodeB_3GPP) {
ru->do_prach = 0; // no prach processing in RU
- ru->feprx = (get_nprocs()<=2) ? fep_full : ru_fep_full_2thread; // RX DFTs
- ru->feptx_ofdm = (get_nprocs()<=2) ? nr_feptx_ofdm : nr_feptx_ofdm_2thread; // this is fep with idft and precoding
+ ru->feprx = (get_thread_worker_conf() == WORKER_ENABLE) ? ru_fep_full_2thread : fep_full; // RX DFTs
+ ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm; // this is fep with idft and precoding
ru->feptx_prec = NULL; // this is fep with idft and precoding
ru->fh_north_in = NULL; // no incoming fronthaul from north
ru->fh_north_out = NULL; // no outgoing fronthaul to north
@@ -2034,13 +2043,13 @@ void set_function_spec_param(RU_t *ru) {
case REMOTE_IF5: // the remote unit is IF5 RRU
ru->do_prach = 0;
- ru->feprx = (get_nprocs()<=2) ? fep_full : fep_full; // this is frequency-shift + DFTs
- ru->feptx_prec = feptx_prec; // need to do transmit Precoding + IDFTs
- ru->feptx_ofdm = (get_nprocs()<=2) ? nr_feptx_ofdm : nr_feptx_ofdm_2thread; // need to do transmit Precoding + IDFTs
- ru->fh_south_in = fh_if5_south_in; // synchronous IF5 reception
- ru->fh_south_out = fh_if5_south_out; // synchronous IF5 transmission
- ru->fh_south_asynch_in = NULL; // no asynchronous UL
- ru->start_rf = NULL; // no local RF
+ ru->feprx = fep_full; // this is frequency-shift + DFTs
+ ru->feptx_prec = feptx_prec; // need to do transmit Precoding + IDFTs
+ ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm; // need to do transmit Precoding + IDFTs
+ ru->fh_south_in = fh_if5_south_in; // synchronous IF5 reception
+ ru->fh_south_out = fh_if5_south_out; // synchronous IF5 transmission
+ ru->fh_south_asynch_in = NULL; // no asynchronous UL
+ ru->start_rf = NULL; // no local RF
ru->stop_rf = NULL;
ru->nr_start_if = nr_start_if; // need to start if interface for IF5
ru->ifdevice.host_type = RAU_HOST;
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 7da3b626c9..dc1beb1ba8 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -122,6 +122,7 @@ int threequarter_fs=0;
uint32_t downlink_frequency[MAX_NUM_CCs][4];
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
+
extern int16_t nr_dlsch_demod_shift;
int UE_scan = 0;
@@ -399,7 +400,7 @@ int16_t dlsch_demod_shift;
static void get_options(void) {
int CC_id;
- int tddflag=0, nonbiotflag;
+ int tddflag=0, nonbiotflag, vcdflag=0;
char *loopfile=NULL;
int dumpframe=0;
uint32_t online_log_messages;
@@ -470,6 +471,9 @@ static void get_options(void) {
frame_parms[CC_id]->frame_type = TDD;
}
+ if (vcdflag > 0)
+ ouput_vcd = 1;
+
/*if (frame_parms[0]->N_RB_DL !=0) {
if ( frame_parms[0]->N_RB_DL < 6 ) {
frame_parms[0]->N_RB_DL = 6;
@@ -731,7 +735,11 @@ int main( int argc, char **argv ) {
if(IS_SOFTMODEM_NOS1)
init_pdcp();
- /*
+ if (ouput_vcd) {
+ vcd_signal_dumper_init("/tmp/openair_dump_nrUE.vcd");
+ }
+
+/*
#ifdef PDCP_USE_NETLINK
netlink_init();
#if defined(PDCP_USE_NETLINK_QUEUES)
@@ -826,5 +834,8 @@ int main( int argc, char **argv ) {
while(true)
sleep(3600);
+ if (ouput_vcd)
+ vcd_signal_dumper_close();
+
return 0;
}
diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
index ddac4fe9bc..3edffc30e1 100644
--- a/executables/nr-uesoftmodem.h
+++ b/executables/nr-uesoftmodem.h
@@ -79,6 +79,7 @@
{"q" , CONFIG_HLP_STMON, PARAMFLAG_BOOL, iptr:&opp_enabled, defintval:0, TYPE_INT, 0}, \
{"S" , CONFIG_HLP_MSLOTS, PARAMFLAG_BOOL, u8ptr:&exit_missed_slots, defintval:1, TYPE_UINT8, 0}, \
{"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \
+ {"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, iptr:&vcdflag, defintval:0, TYPE_INT, 0}, \
{"numerology" , CONFIG_HLP_NUMEROLOGY, PARAMFLAG_BOOL, iptr:&numerology, defintval:0, TYPE_INT, 0}, \
{"emulate-rf" , CONFIG_HLP_EMULATE_RF, PARAMFLAG_BOOL, iptr:&emulate_rf, defintval:0, TYPE_INT, 0}, \
{"parallel-config", CONFIG_HLP_PARALLEL_CMD,0, strptr:(char **)¶llel_config, defstrval:NULL, TYPE_STRING, 0}, \
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
index d299cbdbaf..aad688c9d4 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
@@ -574,44 +574,44 @@ typedef struct {
} nfapi_nr_dl_config_bch_pdu;
typedef struct {
- nfapi_tl_t tl;
- uint16_t length;
- uint8_t pdu_index;
- uint16_t rnti;
- uint16_t nb_mod_symbols;
- uint8_t time_allocation_type;
- uint8_t freq_allocation_type;
- uint8_t start_prb;
- uint8_t n_prb;
- uint8_t start_symbol;
- uint8_t nb_symbols;
- uint8_t mcs_idx;
- uint8_t ndi;
- uint8_t nb_codewords;
- uint8_t nb_layers;
- uint16_t coding_rate;
- uint8_t modulation;
- uint8_t modulation_order;
- uint16_t transport_block_size;
- uint8_t nb_re_dmrs;
- uint8_t time_alloc_list_flag;
- uint8_t time_alloc_list;
- uint8_t rbg_list;
- uint8_t virtual_resource_block_assignment_flag;
- uint32_t resource_block_coding;
- uint8_t redundancy_version;
- uint8_t transport_blocks;
- uint8_t transmission_scheme;
- uint8_t number_of_subbands;
- uint8_t codebook_index[NFAPI_MAX_NUM_SUBBANDS];
- uint8_t ue_category_capacity;
- uint8_t pa;
- uint8_t delta_power_offset_index;
- uint8_t ngap;
- uint8_t transmission_mode;
- uint8_t num_bf_prb_per_subband;
- uint8_t num_bf_vector;
- nfapi_bf_vector_t bf_vector[NFAPI_MAX_BF_VECTORS];
+ nfapi_tl_t tl;
+ uint16_t length;
+ uint8_t pdu_index;
+ uint16_t rnti;
+ uint16_t nb_mod_symbols;
+ uint8_t time_allocation_type;
+ uint8_t freq_allocation_type;
+ uint16_t start_prb;
+ uint16_t n_prb;
+ uint8_t start_symbol;
+ uint8_t nb_symbols;
+ uint8_t mcs_idx;
+ uint8_t ndi;
+ uint8_t nb_codewords;
+ uint8_t nb_layers;
+ uint16_t coding_rate;
+ uint8_t modulation;
+ uint8_t modulation_order;
+ uint16_t transport_block_size;
+ uint8_t nb_re_dmrs;
+ uint8_t time_alloc_list_flag;
+ uint8_t time_alloc_list;
+ uint8_t rbg_list;
+ uint8_t virtual_resource_block_assignment_flag;
+ uint32_t resource_block_coding;
+ uint8_t redundancy_version;
+ uint8_t transport_blocks;
+ uint8_t transmission_scheme;
+ uint8_t number_of_subbands;
+ uint8_t codebook_index[NFAPI_MAX_NUM_SUBBANDS];
+ uint8_t ue_category_capacity;
+ uint8_t pa;
+ uint8_t delta_power_offset_index;
+ uint8_t ngap;
+ uint8_t transmission_mode;
+ uint8_t num_bf_prb_per_subband;
+ uint8_t num_bf_vector;
+ nfapi_bf_vector_t bf_vector[NFAPI_MAX_BF_VECTORS];
}nfapi_nr_dl_config_dlsch_pdu_rel15_t;
#define NFAPI_NR_DL_CONFIG_REQUEST_DLSCH_PDU_REL15_TAG
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
index 985a6f830a..394bfc58ff 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
@@ -376,9 +376,11 @@ int send_mac_subframe_indications(vnf_p7_t* vnf_p7)
if(curr->in_sync == 1)
{
// ask for subframes in the future
- uint16_t sfn_sf_adv = increment_sfn_sf_by(curr->sfn_sf, 2);
+ //uint16_t sfn_sf_adv = increment_sfn_sf_by(curr->sfn_sf, 2);
- vnf_p7->_public.subframe_indication(&(vnf_p7->_public), curr->phy_id, sfn_sf_adv);
+ //vnf_p7->_public.subframe_indication(&(vnf_p7->_public), curr->phy_id, sfn_sf_adv);
+ // suggestion fix by Haruki NAOI
+ vnf_p7->_public.subframe_indication(&(vnf_p7->_public), curr->phy_id, curr->sfn_sf);
}
curr = curr->next;
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
index 4466fc8eea..d5a815333e 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
@@ -271,17 +271,17 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
memset(c,0,sizeof(unsigned char) * ncols * Zc);
memset(d,0,sizeof(unsigned char) * nrows * Zc);
- start_meas(tinput);
+ if(tinput != NULL) start_meas(tinput);
for (i=0; i>(i&7);
//printf("c(%d,%d)=%d\n",j,i,temp);
}
- stop_meas(tinput);
+ if(tinput != NULL) stop_meas(tinput);
if ((BG==1 && Zc>176) || (BG==2 && Zc>64)) {
// extend matrix
- start_meas(tprep);
+ if(tprep != NULL) start_meas(tprep);
for (i1=0; i1 < ncols; i1++)
{
memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char));
@@ -296,11 +296,11 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
printf("\n");
*/
}
- stop_meas(tprep);
+ if(tprep != NULL) stop_meas(tprep);
//parity check part
- start_meas(tparity);
+ if(tparity != NULL) start_meas(tparity);
encode_parity_check_part_optim(c_extension, d, BG, Zc, Kb);
- stop_meas(tparity);
+ if(tparity != NULL) stop_meas(tparity);
}
else {
if (encode_parity_check_part_orig(c, d, BG, Zc, Kb, block_length)!=0) {
@@ -308,12 +308,12 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
return(-1);
}
}
- start_meas(toutput);
+ if(toutput != NULL) start_meas(toutput);
// information part and puncture columns
memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char));
memcpy(&channel_input[block_length-2*Zc], &d[0], ((nrows-no_punctured_columns) * Zc-removed_bit)*sizeof(unsigned char));
- stop_meas(toutput);
+ if(toutput != NULL) stop_meas(toutput);
return 0;
}
@@ -408,7 +408,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
memset(c,0,sizeof(unsigned char) * ncols * Zc);
memset(d,0,sizeof(unsigned char) * nrows * Zc);
- start_meas(tinput);
+ if(tinput != NULL) start_meas(tinput);
#if 0
for (i=0; i176) || (BG==2 && Zc>64)) {
// extend matrix
- start_meas(tprep);
+ if(tprep != NULL) start_meas(tprep);
for (i1=0; i1 < ncols; i1++)
{
memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char));
@@ -460,11 +460,11 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
printf("\n");
*/
}
- stop_meas(tprep);
+ if(tprep != NULL) stop_meas(tprep);
//parity check part
- start_meas(tparity);
+ if(tparity != NULL) start_meas(tparity);
encode_parity_check_part_optim(c_extension, d, BG, Zc, Kb);
- stop_meas(tparity);
+ if(tparity != NULL) stop_meas(tparity);
}
else {
if (encode_parity_check_part_orig(c, d, BG, Zc, Kb, block_length)!=0) {
@@ -472,7 +472,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
return(-1);
}
}
- start_meas(toutput);
+ if(toutput != NULL) start_meas(toutput);
// information part and puncture columns
/*
memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char));
@@ -513,7 +513,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
AssertFatal(1==0,"Need AVX2 for now\n");
#endif
- stop_meas(toutput);
+ if(toutput != NULL) stop_meas(toutput);
return 0;
}
@@ -613,7 +613,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
memset(c,0,sizeof(unsigned char) * ncols * Zc);
memset(d,0,sizeof(unsigned char) * nrows * Zc);
- start_meas(tinput);
+ if(tinput != NULL) start_meas(tinput);
#if 0
for (i=0; i176) || (BG==2 && Zc>64)) {
// extend matrix
- start_meas(tprep);
+ if(tprep != NULL) start_meas(tprep);
for (i1=0; i1 < ncols; i1++)
{
memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char));
@@ -668,11 +668,11 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
printf("\n");
*/
}
- stop_meas(tprep);
+ if(tprep != NULL) stop_meas(tprep);
//parity check part
- start_meas(tparity);
+ if(tparity != NULL) start_meas(tparity);
encode_parity_check_part_optim(c_extension, d, BG, Zc, Kb);
- stop_meas(tparity);
+ if(tparity != NULL) stop_meas(tparity);
}
else {
if (encode_parity_check_part_orig(c, d, BG, Zc, Kb, block_length)!=0) {
@@ -680,7 +680,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
return(-1);
}
}
- start_meas(toutput);
+ if(toutput != NULL) start_meas(toutput);
// information part and puncture columns
/*
memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char));
@@ -726,7 +726,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
AssertFatal(1==0,"Need AVX2 for now\n");
#endif
- stop_meas(toutput);
+ if(toutput != NULL) stop_meas(toutput);
return 0;
}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 9a4df38895..aa75bd6555 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -74,7 +74,10 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
int frame,
uint8_t slot,
NR_DL_FRAME_PARMS *frame_parms,
- nfapi_nr_config_request_t *config) {
+ nfapi_nr_config_request_t *config,
+ time_stats_t *dlsch_encoding_stats,
+ time_stats_t *dlsch_scrambling_stats,
+ time_stats_t *dlsch_modulation_stats) {
NR_DL_gNB_HARQ_t *harq = dlsch->harq_processes[dci_alloc->harq_pid];
nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &harq->dlsch_pdu.dlsch_pdu_rel15;
@@ -89,7 +92,9 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
/// CRC, coding, interleaving and rate matching
AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
+ start_meas(dlsch_encoding_stats);
nr_dlsch_encoding(harq->pdu, frame, slot, dlsch, frame_parms);
+ stop_meas(dlsch_encoding_stats);
#ifdef DEBUG_DLSCH
printf("PDSCH encoding:\nPayload:\n");
for (int i=0; iB>>7; i++) {
@@ -107,6 +112,7 @@ printf("\n");
#endif
/// scrambling
+ start_meas(dlsch_scrambling_stats);
for (int q=0; qnb_codewords; q++)
memset((void*)scrambled_output[q], 0, (encoded_length>>5)*sizeof(uint32_t));
uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \
@@ -120,6 +126,7 @@ printf("\n");
Nid,
n_RNTI,
scrambled_output[q]);
+ stop_meas(dlsch_scrambling_stats);
#ifdef DEBUG_DLSCH
printf("PDSCH scrambling:\n");
for (int i=0; i>8; i++) {
@@ -130,12 +137,13 @@ for (int i=0; i>8; i++) {
#endif
/// Modulation
-
+ start_meas(dlsch_modulation_stats);
for (int q=0; qnb_codewords; q++)
nr_modulation(scrambled_output[q],
encoded_length,
Qm,
mod_symbs[q]);
+ stop_meas(dlsch_modulation_stats);
#ifdef DEBUG_DLSCH
printf("PDSCH Modulation: Qm %d(%d)\n", Qm, nb_symbols);
for (int i=0; i>3; i++) {
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
index 7c3e22a9e7..3419be30fa 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
@@ -74,7 +74,11 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
int frame,
uint8_t slot,
NR_DL_FRAME_PARMS *frame_parms,
- nfapi_nr_config_request_t *config);
+ nfapi_nr_config_request_t *config,
+ time_stats_t *dlsch_encoding_stats,
+ time_stats_t *dlsch_scrambling_stats,
+ time_stats_t *dlsch_modulation_stats);
+
void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index b3ce80d1ae..04098a8440 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -366,7 +366,6 @@ int nr_dlsch_encoding(unsigned char *a,int frame,
//printf("segment Z %d k %d Kr %d BG %d\n", *pz,dlsch->harq_processes[harq_pid]->K,Kr,BG);
- //start_meas(te_stats);
for (r=0; rharq_processes[harq_pid]->C; r++) {
//d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0];
//channel_input[r] = &dlsch->harq_processes[harq_pid]->d[r][0];
@@ -398,7 +397,6 @@ int nr_dlsch_encoding(unsigned char *a,int frame,
//ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,dlsch->harq_processes[harq_pid]->d,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
- //stop_meas(te_stats);
//printf("end ldpc encoder -- output\n");
#ifdef DEBUG_DLSCH_CODING
@@ -425,7 +423,6 @@ int nr_dlsch_encoding(unsigned char *a,int frame,
mod_order,nb_rb);
#endif
- //start_meas(rm_stats);
#ifdef DEBUG_DLSCH_CODING
printf("rvidx in encoding = %d\n", rel15.redundancy_version);
#endif
@@ -447,14 +444,11 @@ int nr_dlsch_encoding(unsigned char *a,int frame,
for (int i =0; i<16; i++)
printf("output ratematching e[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->e[i+r_offset], r_offset);
#endif
- //stop_meas(rm_stats);
- //start_meas(i_stats);
nr_interleaving_ldpc(E,
mod_order,
dlsch->harq_processes[harq_pid]->e+r_offset,
dlsch->harq_processes[harq_pid]->f+r_offset);
- //stop_meas(i_stats);
#ifdef DEBUG_DLSCH_CODING
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 20f3574ee2..aff4479114 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -30,6 +30,7 @@
* \warning
*/
+#include "common/utils/LOG/vcd_signal_dumper.h"
#include "PHY/defs_nr_UE.h"
#include "PHY/phy_extern_nr_ue.h"
#include "PHY/CODING/coding_extern.h"
@@ -307,6 +308,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
LOG_I(PHY,"DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
+
if (harq_process->round == 0) {
// This is a new packet, so compute quantities regarding segmentation
harq_process->B = A+24;
@@ -324,6 +327,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
#endif
}
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
+
p_decParams->Z = harq_process->Z;
//printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z);
@@ -406,11 +411,16 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
#if UE_TIMING_TRACE
start_meas(dlsch_deinterleaving_stats);
#endif
+
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
+
nr_deinterleaving_ldpc(E,
harq_process->Qm,
harq_process->w[r], // [hna] w is e
dlsch_llr+r_offset);
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT);
+
//for (int i =0; i<16; i++)
// printf("rx output deinterleaving w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset);
@@ -434,6 +444,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
harq_process->round);
#endif
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN);
+
if (nr_rate_matching_ldpc_rx(Ilbrm,
Tbslbrm,
p_decParams->BG,
@@ -444,12 +456,15 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
harq_process->rvidx,
(harq_process->round==0)?1:0,
E)==-1) {
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT);
#if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats);
#endif
LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
return(dlsch->max_ldpc_iterations + 1);
} else {
+
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT);
#if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats);
#endif
@@ -515,12 +530,16 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
}
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
+
no_iteration_ldpc = nrLDPC_decoder(p_decParams,
(int8_t*)&pl[0],
llrProcBuf,
p_nrLDPC_procBuf[r],
p_procTime);
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
+
// Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) {
printf("\x1B[34m" "Segment %d CRC OK\n",r);
@@ -644,6 +663,9 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3);
printf("C %d\n",harq_process->C);
*/
+
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_IN);
+
for (r=0; rC; r++) {
memcpy(harq_process->b+offset,
@@ -674,6 +696,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
}
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_OUT);
+
dlsch->last_iteration_cnt = ret;
return(ret);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index fcfa394d79..2b59f93160 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -36,6 +36,7 @@
#include "PHY/MODULATION/nr_modulation.h"
#include "PHY/MODULATION/modulation_common.h"
#include "common/utils/assertions.h"
+#include "common/utils/LOG/vcd_signal_dumper.h"
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
#include "PHY/defs_nr_common.h"
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 5d618b60c7..e79f9f28ac 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -465,6 +465,8 @@ typedef struct gNB_L1_proc_t_s {
pthread_t pthread_single;
/// pthread structure for asychronous RX/TX processing thread
pthread_t pthread_asynch_rxtx;
+ /// pthread structure for printing time meas
+ pthread_t L1_stats_thread;
/// flag to indicate first RX acquisition
int first_rx;
/// flag to indicate first TX transmission
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index d2a3739a1f..cb6cb7900e 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -196,7 +196,11 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
&gNB->pdcch_vars.dci_alloc[0],
gNB->nr_gold_pdsch_dmrs[slot],
gNB->common_vars.txdataF,
- AMP, frame, slot, fp, cfg);
+ AMP, frame, slot, fp, cfg,
+ &gNB->dlsch_encoding_stats,
+ &gNB->dlsch_scrambling_stats,
+ &gNB->dlsch_modulation_stats);
+
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0);
}
}
diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c
index 09ef2ff3f3..2a6d6d04ad 100644
--- a/openair1/SIMULATION/NR_PHY/dlschsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlschsim.c
@@ -28,6 +28,8 @@
#include "common/ran_context.h"
#include "common/config/config_userapi.h"
#include "common/utils/LOG/log.h"
+#include "common/utils/LOG/vcd_signal_dumper.h"
+#include "T.h"
#include "PHY/defs_gNB.h"
#include "PHY/defs_nr_common.h"
#include "PHY/defs_nr_UE.h"
@@ -115,7 +117,7 @@ int main(int argc, char **argv)
//logInit();
randominit(0);
- while ((c = getopt(argc, argv, "df:hpg:i:j:n:l:m:r:s:S:y:z:M:N:F:R:P:L:")) != -1) {
+ while ((c = getopt(argc, argv, "df:hpVg:i:j:n:l:m:r:s:S:y:z:M:N:F:R:P:L:")) != -1) {
switch (c) {
/*case 'f':
write_output_file = 1;
@@ -188,6 +190,10 @@ int main(int argc, char **argv)
#endif
break;
+ case 'V':
+ ouput_vcd = 1;
+ break;
+
case 'S':
snr1 = atof(optarg);
snr1set = 1;
@@ -286,6 +292,7 @@ int main(int argc, char **argv)
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]);
printf("-h This message\n");
printf("-p Use extended prefix mode\n");
+ printf("-V Enable VCD dumb functions\n");
//printf("-d Use TDD\n");
printf("-n Number of frames to simulate\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
@@ -317,6 +324,9 @@ int main(int argc, char **argv)
if (snr1set == 0)
snr1 = snr0 + 10;
+ if (ouput_vcd)
+ vcd_signal_dumper_init("/tmp/openair_dump_nr_dlschsim.vcd");
+
gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model,
61.44e6, //N_RB2sampling_rate(N_RB_DL),
40e6, //N_RB2channel_bandwidth(N_RB_DL),
@@ -525,10 +535,15 @@ int main(int argc, char **argv)
printf("\n");
exit(-1);
#endif
+
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0, VCD_FUNCTION_IN);
+
ret = nr_dlsch_decoding(UE, channel_output_fixed, &UE->frame_parms,
dlsch0_ue, dlsch0_ue->harq_processes[0], frame, nb_symb_sch,
slot,harq_pid, is_crnti, llr8_flag);
+ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0, VCD_FUNCTION_OUT);
+
if (ret > dlsch0_ue->max_ldpc_iterations)
n_errors++;
@@ -622,6 +637,9 @@ int main(int argc, char **argv)
if (input_fd)
fclose(input_fd);
+ if (ouput_vcd)
+ vcd_signal_dumper_close();
+
return (n_errors);
}
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 4f515946d6..aca129623e 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -608,6 +608,8 @@ int main(int argc, char **argv)
dl_config->dl_config_list[0].dci_config_pdu.dci_config_rel15.coreset.cce_reg_interleaved_shift_index = cell_id;
dl_config->dl_config_list[0].dci_config_pdu.dci_config_rel15.coreset.precoder_granularity = PRECODER_GRANULARITY_SAME_AS_REG_BUNDLE;
dl_config->dl_config_list[0].dci_config_pdu.dci_config_rel15.coreset.pdcch_dmrs_scrambling_id = cell_id;
+ uint8_t gnb_start_symbol = Sched_INFO.DL_req->dl_config_request_body.dl_config_pdu_list[1].dlsch_pdu.dlsch_pdu_rel15.start_symbol;
+ dl_config->dl_config_list[0].dlsch_config_pdu.dlsch_config_rel15.start_symbol = gnb_start_symbol;
uint32_t number_of_search_space_per_slot=1;
uint32_t first_symbol_index=0;