Merge tag '2017.w10' into bugfix-189-rlc-am-fixes

This commit is contained in:
fnabet
2017-03-13 16:13:07 +01:00
43 changed files with 6185 additions and 659 deletions
+8
View File
@@ -130,6 +130,9 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1) file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1)
if (CPUINFO MATCHES "avx2") if (CPUINFO MATCHES "avx2")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
set(COMPILATION_AVX2 "True")
else()
set(COMPILATION_AVX2 "False")
endif() endif()
if (CPUINFO MATCHES "sse4_1") if (CPUINFO MATCHES "sse4_1")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1")
@@ -1116,6 +1119,11 @@ set(PHY_SRC
if (${SMBV}) if (${SMBV})
set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c") set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c")
endif (${SMBV}) endif (${SMBV})
if (${COMPILATION_AVX2} STREQUAL "True")
set(PHY_SRC ${PHY_SRC} ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.c)
endif ()
add_library(PHY ${PHY_SRC}) add_library(PHY ${PHY_SRC})
#Layer 2 library #Layer 2 library
+31 -5
View File
@@ -213,7 +213,7 @@ Obj.# Case# Test# Description
01 63 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 63 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
01 63 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX 01 63 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
01 65 00 lte-softmodem tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX 01 65 lte-softmodem tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX
01 65 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 65 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
01 65 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 65 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
01 65 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX 01 65 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
@@ -222,7 +222,7 @@ Obj.# Case# Test# Description
01 65 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX 01 65 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
01 70 00 lte-softmodem tests with SoDeRa RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX 01 70 lte-softmodem tests with SoDeRa RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
01 70 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 70 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
01 70 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 70 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
01 70 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX 01 70 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
@@ -231,7 +231,7 @@ Obj.# Case# Test# Description
01 70 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX 01 70 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
01 75 00 lte-softmodem + RRU (NGFI IF4P5, RAW) tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX 01 75 lte-softmodem + RRU (NGFI IF4P5, RAW) tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
01 75 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 75 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
01 75 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 75 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
01 75 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX 01 75 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
@@ -239,7 +239,7 @@ Obj.# Case# Test# Description
01 75 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 75 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
01 75 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX 01 75 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
01 80 00 lte-softmodem + RRU (NGFI) tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX 01 80 lte-softmodem + RRU (NGFI) tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
01 80 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 80 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
01 80 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 80 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
01 80 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX 01 80 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
@@ -247,7 +247,7 @@ Obj.# Case# Test# Description
01 80 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 80 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
01 80 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX 01 80 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
01 85 00 lte-softmodem + RRU (NGFI) tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX 01 85 lte-softmodem + RRU (NGFI) tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
01 85 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 85 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
01 85 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 85 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
01 85 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX 01 85 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
@@ -255,6 +255,32 @@ Obj.# Case# Test# Description
01 85 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 85 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
01 85 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX 01 85 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
01 86 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Huawei e3276 COTS UE for 1TX/1RX (TM1), 2TX/2RX (TM2)
01 86 00 Band 38 TDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
01 86 01 Band 38 TDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
01 86 02 Band 38 TDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
01 86 03 Band 38 TDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
01 86 04 Band 38 TDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
01 86 05 Band 38 TDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
01 86 06 Band 38 TDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
01 86 07 Band 38 TDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
01 86 08 Band 38 TDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
01 86 09 Band 38 TDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
01 86 10 Band 38 TDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
01 86 11 Band 38 TDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
01 86 12 Band 38 TDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
01 86 13 Band 38 TDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
01 86 14 Band 38 TDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
01 86 15 Band 38 TDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 86 16 Band 38 TDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 86 17 Band 38 TDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 86 18 Band 38 TDD 5MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
01 86 19 Band 38 TDD 10MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
01 86 20 Band 38 TDD 20MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
01 86 21 Band 38 TDD 5MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
01 86 22 Band 38 TDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
01 86 23 Band 38 TDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
02 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Sony Experia M4 COTS UE for 1TX/1RX and 2TX/2RX (TM2) 02 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Sony Experia M4 COTS UE for 1TX/1RX and 2TX/2RX (TM2)
02 55 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 02 55 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
02 55 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 02 55 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
@@ -8664,6 +8664,30 @@ c
<nruns>10</nruns> <nruns>10</nruns>
</testCase> </testCase>
<testCase id="018600"></testCase>
<testCase id="018601"></testCase>
<testCase id="018602"></testCase>
<testCase id="018603"></testCase>
<testCase id="018604"></testCase>
<testCase id="018605"></testCase>
<testCase id="018606"></testCase>
<testCase id="018607"></testCase>
<testCase id="018608"></testCase>
<testCase id="018609"></testCase>
<testCase id="018610"></testCase>
<testCase id="018611"></testCase>
<testCase id="018612"></testCase>
<testCase id="018613"></testCase>
<testCase id="018614"></testCase>
<testCase id="018615"></testCase>
<testCase id="018616"></testCase>
<testCase id="018617"></testCase>
<testCase id="018618"></testCase>
<testCase id="018619"></testCase>
<testCase id="018620"></testCase>
<testCase id="018621"></testCase>
<testCase id="018622"></testCase>
<testCase id="018623"></testCase>
<testCase id="025500" > <testCase id="025500" >
<class>lte-softmodem</class> <class>lte-softmodem</class>
@@ -0,0 +1,11 @@
#enable control+C reception (to be refined if it does not work)
stty isig intr ^C
cd /tmp/oai_test_setup/oai
source oaienv
cd cmake_targets/autotests/v2/actions
sudo python start_3276.py
sudo wvdial -C wvdial.3276.conf || true
sudo python stop_3276.py
@@ -0,0 +1,59 @@
import time
from modem import quit, Modem
try:
modem = Modem("/dev/ttyUSB0")
#test that modem is there
print "INFO: check modem's presence"
modem.send('AT')
if modem.wait().ret != True:
print "ERROR: no modem?"
quit(1)
#first deactivate
print "INFO: deactivate the modem"
modem.send('AT+CFUN=0')
if modem.wait().ret != True:
print "ERROR: failed deactivating the modem"
quit(1)
#activate the modem
print "INFO: activate the modem"
modem.send('AT+CFUN=1')
if modem.wait().ret != True:
print "ERROR: failed asking modem for activation"
quit(1)
#wait for modem to be connected
#timeout after one minute
print "INFO: wait for modem to be connected (timeout: one minute)"
start_time = time.time()
while True:
modem.send('AT+CGATT?')
r = modem.wait()
if r.ret != True:
print "ERROR: failed checking attachment status of modem"
quit(1)
if "+CGATT: 1" in r.data:
break
if not "CGATT: 0" in r.data:
print "ERROR: bad data when checking attachment status of modem"
quit(1)
time.sleep(0.1)
if time.time() > start_time + 60:
print "ERROR: modem not connected after one minute, close modem"
modem.send('AT+CFUN=0')
r = modem.wait()
if r.ret != True:
print "ERROR: closing modem failed"
quit(1)
print "INFO: modem is connected"
except BaseException, e:
print "ERROR: " + str(e)
quit(1)
quit(0)
@@ -0,0 +1,29 @@
import time
from modem import quit, Modem
try:
modem = Modem("/dev/ttyUSB0")
#test that modem is there
print "INFO: check modem's presence"
modem.send('AT')
r = modem.wait()
if r.ret != True and "NO CARRIER" not in r.data:
print "ERROR: no modem?"
quit(1)
if "NO CARRIER" in r.data:
print "WARNING: 'NO CARRIER' detected, not sure if handled correctly"
#deactivate the modem
print "INFO: deactivate the modem"
modem.send('AT+CFUN=0')
if modem.wait().ret != True:
print "ERROR: failed asking modem for deactivation"
quit(1)
except BaseException, e:
print "ERROR: " + str(e)
quit(1)
quit(0)
@@ -0,0 +1,27 @@
[Dialer Defaults]
Modem = /dev/ttyUSB0
ISDN = off
Modem Type = Analog Modem
Baud = 9600
Init1 = ATZ
Init2 = AT&F &D2 &C1
Init3 = AT+CGDCONT=1,"IP","oai.ipv4"
Phone = *99#
Phone1 =
Phone2 =
Phone3 =
Phone4 =
Ask Password = off
Password = ''
Username = ImaginLab
Auto Reconnect = off
Abort on Busy = off
Carrier Check = on
Check Def Route = on
Abort on No Dialtone = on
Stupid Mode = on
Idle Seconds = 0
Auto DNS = on
;Minimize = off
;Dock = off
;Do NOT edit this file by hand!
+94 -71
View File
@@ -102,7 +102,7 @@ class alu_test:
# compile_enb # compile_enb
########################################################################## ##########################################################################
def compile_enb(self, build_arguments): def compile_enb(self, build_arguments):
log("INFO: ALU test: compile softmodem") log("INFO: ALU test: compile softmodem on " + self.enb_machine)
envcomp = list(self.env) envcomp = list(self.env)
envcomp.append('BUILD_ARGUMENTS="' + build_arguments + '"') envcomp.append('BUILD_ARGUMENTS="' + build_arguments + '"')
#we don't care about BUILD_OUTPUT but required (TODO: change that) #we don't care about BUILD_OUTPUT but required (TODO: change that)
@@ -163,24 +163,24 @@ class alu_test:
#os._exit(1) #os._exit(1)
########################################################################## ##########################################################################
# start_bandrich_ue # start_ue
########################################################################## ##########################################################################
def start_bandrich_ue(self): def start_ue(self, ue):
log("INFO: ALU test: start bandrich UE") log("INFO: ALU test: start " + ue + " UE")
self.task_ue = Task("actions/start_bandrich.bash", self.task_ue = Task("actions/start_" + ue + ".bash",
"start_bandrich", "start_" + ue,
self.ue_machine, self.ue_machine,
self.oai_user, self.oai_user,
self.oai_password, self.oai_password,
self.env, self.env,
self.logdir + "/start_bandrich." + self.ue_machine, self.logdir + "/start_" + ue + "." + self.ue_machine,
event=self.event) event=self.event)
self.task_ue.waitlog("local IP address", event=self.event) self.task_ue.waitlog("local IP address", event=self.event)
self.event.wait() self.event.wait()
#at this point one task has died or we have the line in the log #at this point one task has died or we have the line in the log
if self.task_ue.waitlog_state != WAITLOG_SUCCESS: if self.task_ue.waitlog_state != WAITLOG_SUCCESS:
log("ERROR: ALU test: bandrich UE did not connect") log("ERROR: ALU test: " + ue + " UE did not connect")
raise TestFailed() raise TestFailed()
self.event.clear() self.event.clear()
@@ -191,21 +191,21 @@ class alu_test:
log("ERROR: ALU test: eNB, HSS or UE task died") log("ERROR: ALU test: eNB, HSS or UE task died")
raise TestFailed() raise TestFailed()
#get bandrich UE IP #get UE IP
l = open(self.task_ue.logfile, "r").read() l = open(self.task_ue.logfile, "r").read()
self.bandrich_ue_ip = re.search("local IP address (.*)\n", l) \ self.ue_ip = re.search("local IP address (.*)\n", l) \
.groups()[0] .groups()[0]
log("INFO: ALU test: bandrich UE IP address: " + self.bandrich_ue_ip) log("INFO: ALU test: " + ue + " UE IP address: " + self.ue_ip)
########################################################################## ##########################################################################
# stop_bandrich_ue # stop_ue
########################################################################## ##########################################################################
def stop_bandrich_ue(self): def stop_ue(self, ue):
log("INFO: ALU test: stop bandrich UE") log("INFO: ALU test: stop " + ue + " UE")
self.task_ue.sendnow("%c" % 3) self.task_ue.sendnow("%c" % 3)
ret = self.task_ue.wait() ret = self.task_ue.wait()
if ret != 0: if ret != 0:
log("ERROR: ALU test: task bandrich UE failed") log("ERROR: ALU test: task " + ue + " UE failed")
#not sure if we have to quit here or not #not sure if we have to quit here or not
#os._exit(1) #os._exit(1)
@@ -286,47 +286,47 @@ class alu_test:
########################################################################## ##########################################################################
# dl_tcp # dl_tcp
########################################################################## ##########################################################################
def dl_tcp(self): def dl_tcp(self, ue):
self._do_traffic("bandrich downlink TCP", self._do_traffic(ue + " downlink TCP",
"server_tcp", self.ue_machine, self.bandrich_ue_ip, "server_tcp", self.ue_machine, self.ue_ip,
"client_tcp", self.epc_machine, "client_tcp", self.epc_machine,
"Server listening on TCP port 5001", "Server listening on TCP port 5001",
"bandrich_downlink_tcp_server", ue + "_downlink_tcp_server",
"bandrich_downlink_tcp_client") ue + "_downlink_tcp_client")
########################################################################## ##########################################################################
# ul_tcp # ul_tcp
########################################################################## ##########################################################################
def ul_tcp(self): def ul_tcp(self, ue):
self._do_traffic("bandrich uplink TCP", self._do_traffic(ue + " uplink TCP",
"server_tcp", self.epc_machine, "192.172.0.1", "server_tcp", self.epc_machine, "192.172.0.1",
"client_tcp", self.ue_machine, "client_tcp", self.ue_machine,
"Server listening on TCP port 5001", "Server listening on TCP port 5001",
"bandrich_uplink_tcp_server", ue + "_uplink_tcp_server",
"bandrich_uplink_tcp_client") ue + "_uplink_tcp_client")
########################################################################## ##########################################################################
# dl_udp # dl_udp
########################################################################## ##########################################################################
def dl_udp(self, bandwidth): def dl_udp(self, ue, bandwidth):
self._do_traffic("bandrich downlink UDP", self._do_traffic(ue + " downlink UDP",
"server_udp", self.ue_machine, self.bandrich_ue_ip, "server_udp", self.ue_machine, self.ue_ip,
"client_udp", self.epc_machine, "client_udp", self.epc_machine,
"Server listening on UDP port 5001", "Server listening on UDP port 5001",
"bandrich_downlink_udp_server", ue + "_downlink_udp_server",
"bandrich_downlink_udp_client", ue + "_downlink_udp_client",
udp_bandwidth=bandwidth) udp_bandwidth=bandwidth)
########################################################################## ##########################################################################
# ul_udp # ul_udp
########################################################################## ##########################################################################
def ul_udp(self, bandwidth): def ul_udp(self, ue, bandwidth):
self._do_traffic("bandrich uplink UDP", self._do_traffic(ue + " uplink UDP",
"server_udp", self.epc_machine, "192.172.0.1", "server_udp", self.epc_machine, "192.172.0.1",
"client_udp", self.ue_machine, "client_udp", self.ue_machine,
"Server listening on UDP port 5001", "Server listening on UDP port 5001",
"bandrich_uplink_udp_server", ue + "_uplink_udp_server",
"bandrich_uplink_udp_client", ue + "_uplink_udp_client",
udp_bandwidth=bandwidth) udp_bandwidth=bandwidth)
############################################################################## ##############################################################################
@@ -337,19 +337,33 @@ def run_b210_alu(tests, openair_dir, oai_user, oai_password, env):
if not do_tests(tests['b210']['alu']): if not do_tests(tests['b210']['alu']):
return return
#compile eNB #compile eNB (two cases: one for FDD and one for TDD)
alu = alu_test(epc='amerique', enb='hutch', ue='stevens', if do_tests(tests['b210']['alu']['fdd']):
openair=openair_dir, alu = alu_test(epc='amerique', enb='hutch', ue='stevens',
user=oai_user, password=oai_password, openair=openair_dir,
log_subdir='enb_tests/b210_alu/compile_enb', user=oai_user, password=oai_password,
env=env) log_subdir='enb_tests/b210_alu/compile_enb_fdd',
env=env)
try: try:
alu.compile_enb("--eNB -w USRP -x -c --disable-cpu-affinity") alu.compile_enb("--eNB -w USRP -x -c --disable-cpu-affinity")
except BaseException, e: except BaseException, e:
log("ERROR: ALU test failed: eNB compilation failed: " + str(e)) log("ERROR: ALU test failed: eNB compilation failed: " + str(e))
return return
if do_tests(tests['b210']['alu']['tdd']):
alu = alu_test(epc='amerique', enb='calisson', ue='mozart',
openair=openair_dir,
user=oai_user, password=oai_password,
log_subdir='enb_tests/b210_alu/compile_enb_tdd',
env=env)
try:
alu.compile_enb("--eNB -w USRP -x -c --disable-cpu-affinity")
except BaseException, e:
log("ERROR: ALU test failed: eNB compilation failed: " + str(e))
return
#run tests #run tests
@@ -361,29 +375,38 @@ def run_b210_alu(tests, openair_dir, oai_user, oai_password, env):
"10" : "15M", "10" : "15M",
"20" : "15M" } "20" : "15M" }
for bw in ('5', '10', '20'): ue_machine = { "fdd" : "stevens",
if do_tests(tests['b210']['alu'][bw]): "tdd" : "mozart" }
log("INFO: ALU test: run tests for bandwidth " + bw + " MHz")
ctest = tests['b210']['alu'][bw] enb_machine = { "fdd" : "hutch",
alu = alu_test(epc='amerique', enb='hutch', ue='stevens', "tdd" : "calisson" }
openair=openair_dir,
user=oai_user, password=oai_password, band = { "fdd" : "7",
log_subdir='enb_tests/b210_alu/' + bw, "tdd" : "38" }
env=env)
try: for mode in ('fdd', 'tdd'):
alu.start_epc() for bw in ('5', '10', '20'):
alu.start_enb("enb.band7.tm1.usrpb210." + bw + "MHz.conf") if do_tests(tests['b210']['alu'][mode][bw]):
if do_tests(ctest['bandrich']): log("INFO: ALU test: run tests for bandwidth " + bw + " MHz")
alu.start_bandrich_ue() ctest = tests['b210']['alu'][mode][bw]
if do_tests(ctest['bandrich']['tcp']['dl']): alu.dl_tcp() alu = alu_test(epc='amerique', enb=enb_machine[mode], ue=ue_machine[mode],
if do_tests(ctest['bandrich']['tcp']['ul']): alu.ul_tcp() openair=openair_dir,
if do_tests(ctest['bandrich']['udp']['dl']): user=oai_user, password=oai_password,
alu.dl_udp(udp_dl_bandwidth[bw]) log_subdir='enb_tests/b210_alu/' + mode + "/" + bw,
if do_tests(ctest['bandrich']['udp']['ul']): env=env)
alu.ul_udp(udp_ul_bandwidth[bw]) try:
alu.stop_bandrich_ue() alu.start_epc()
alu.stop_enb() alu.start_enb("enb.band" + band[mode] + ".tm1.usrpb210." + mode + "." + bw + "MHz.conf")
alu.stop_epc() for ue in ('bandrich', '3276'):
except BaseException, e: if ue in ctest and do_tests(ctest[ue]):
log("ERROR: ALU test failed: " + str(e)) alu.start_ue(ue)
alu.finish() if do_tests(ctest[ue]['tcp']['dl']): alu.dl_tcp(ue)
if do_tests(ctest[ue]['tcp']['ul']): alu.ul_tcp(ue)
if do_tests(ctest[ue]['udp']['dl']): alu.dl_udp(ue, udp_dl_bandwidth[bw])
if do_tests(ctest[ue]['udp']['ul']): alu.ul_udp(ue, udp_ul_bandwidth[bw])
alu.stop_ue(ue)
alu.stop_enb()
alu.stop_epc()
except BaseException, e:
log("ERROR: ALU test failed: " + str(e))
alu.finish()
@@ -0,0 +1,175 @@
Active_eNBs = ( "eNB_Eurecom_LTEBox");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
eNBs =
(
{
////////// Identification parameters:
eNB_ID = 0xe00;
cell_type = "CELL_MACRO_ENB";
eNB_name = "eNB_Eurecom_LTEBox";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = "1";
mobile_country_code = "208";
mobile_network_code = "92";
////////// Physical parameters:
component_carriers = (
{
node_function = "eNodeB_3GPP";
node_timing = "synch_to_ext_device";
node_synch_ref = 0;
frame_type = "TDD";
tdd_config = 3;
tdd_config_s = 0;
prefix_type = "NORMAL";
eutra_band = 38;
downlink_frequency = 2580000000L;
uplink_frequency_offset = 0;
Nid_cell = 0;
N_RB_DL = 50;
Nid_cell_mbsfn = 0;
nb_antenna_ports = 1;
nb_antennas_tx = 1;
nb_antennas_rx = 1;
tx_gain = 90;
rx_gain = 125;
prach_root = 0;
prach_config_index = 0;
prach_high_speed = "DISABLE";
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
pucch_nRB_CQI = 1;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
pdsch_p_b = 0;
pusch_n_SB = 1;
pusch_enable64QAM = "DISABLE";
pusch_hoppingMode = "interSubFrame";
pusch_hoppingOffset = 0;
pusch_groupHoppingEnabled = "ENABLE";
pusch_groupAssignment = 0;
pusch_sequenceHoppingEnabled = "DISABLE";
pusch_nDMRS1 = 1;
phich_duration = "NORMAL";
phich_resource = "ONESIXTH";
srs_enable = "DISABLE";
/* srs_BandwidthConfig =;
srs_SubframeConfig =;
srs_ackNackST =;
srs_MaxUpPts =;*/
pusch_p0_Nominal = -90;
pusch_alpha = "AL1";
pucch_p0_Nominal = -96;
msg3_delta_Preamble = 6;
pucch_deltaF_Format1 = "deltaF2";
pucch_deltaF_Format1b = "deltaF3";
pucch_deltaF_Format2 = "deltaF0";
pucch_deltaF_Format2a = "deltaF0";
pucch_deltaF_Format2b = "deltaF0";
rach_numberOfRA_Preambles = 64;
rach_preamblesGroupAConfig = "DISABLE";
/*
rach_sizeOfRA_PreamblesGroupA = ;
rach_messageSizeGroupA = ;
rach_messagePowerOffsetGroupB = ;
*/
rach_powerRampingStep = 4;
rach_preambleInitialReceivedTargetPower = -104;
rach_preambleTransMax = 10;
rach_raResponseWindowSize = 10;
rach_macContentionResolutionTimer = 48;
rach_maxHARQ_Msg3Tx = 4;
pcch_default_PagingCycle = 128;
pcch_nB = "oneT";
bcch_modificationPeriodCoeff = 2;
ue_TimersAndConstants_t300 = 1000;
ue_TimersAndConstants_t301 = 1000;
ue_TimersAndConstants_t310 = 1000;
ue_TimersAndConstants_t311 = 10000;
ue_TimersAndConstants_n310 = 20;
ue_TimersAndConstants_n311 = 1;
ue_TransmissionMode = 1;
}
);
srb1_parameters :
{
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
timer_poll_retransmit = 80;
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
timer_reordering = 35;
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
timer_status_prohibit = 0;
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
poll_pdu = 4;
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
poll_byte = 99999;
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
max_retx_threshold = 4;
}
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
////////// MME parameters:
mme_ip_address = ( { ipv4 = "192.168.12.26";
ipv6 = "192:168:30::17";
active = "yes";
preference = "ipv4";
}
);
NETWORK_INTERFACES :
{
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
};
log_config :
{
global_log_level ="info";
global_log_verbosity ="medium";
hw_log_level ="info";
hw_log_verbosity ="medium";
phy_log_level ="info";
phy_log_verbosity ="medium";
mac_log_level ="info";
mac_log_verbosity ="high";
rlc_log_level ="info";
rlc_log_verbosity ="medium";
pdcp_log_level ="info";
pdcp_log_verbosity ="medium";
rrc_log_level ="info";
rrc_log_verbosity ="medium";
};
}
);
@@ -0,0 +1,175 @@
Active_eNBs = ( "eNB_Eurecom_LTEBox");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
eNBs =
(
{
////////// Identification parameters:
eNB_ID = 0xe00;
cell_type = "CELL_MACRO_ENB";
eNB_name = "eNB_Eurecom_LTEBox";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = "1";
mobile_country_code = "208";
mobile_network_code = "92";
////////// Physical parameters:
component_carriers = (
{
node_function = "eNodeB_3GPP";
node_timing = "synch_to_ext_device";
node_synch_ref = 0;
frame_type = "TDD";
tdd_config = 3;
tdd_config_s = 0;
prefix_type = "NORMAL";
eutra_band = 38;
downlink_frequency = 2580000000L;
uplink_frequency_offset = 0;
Nid_cell = 0;
N_RB_DL = 100;
Nid_cell_mbsfn = 0;
nb_antenna_ports = 1;
nb_antennas_tx = 1;
nb_antennas_rx = 1;
tx_gain = 90;
rx_gain = 125;
prach_root = 0;
prach_config_index = 0;
prach_high_speed = "DISABLE";
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
pucch_nRB_CQI = 1;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
pdsch_p_b = 0;
pusch_n_SB = 1;
pusch_enable64QAM = "DISABLE";
pusch_hoppingMode = "interSubFrame";
pusch_hoppingOffset = 0;
pusch_groupHoppingEnabled = "ENABLE";
pusch_groupAssignment = 0;
pusch_sequenceHoppingEnabled = "DISABLE";
pusch_nDMRS1 = 1;
phich_duration = "NORMAL";
phich_resource = "ONESIXTH";
srs_enable = "DISABLE";
/* srs_BandwidthConfig =;
srs_SubframeConfig =;
srs_ackNackST =;
srs_MaxUpPts =;*/
pusch_p0_Nominal = -90;
pusch_alpha = "AL1";
pucch_p0_Nominal = -96;
msg3_delta_Preamble = 6;
pucch_deltaF_Format1 = "deltaF2";
pucch_deltaF_Format1b = "deltaF3";
pucch_deltaF_Format2 = "deltaF0";
pucch_deltaF_Format2a = "deltaF0";
pucch_deltaF_Format2b = "deltaF0";
rach_numberOfRA_Preambles = 64;
rach_preamblesGroupAConfig = "DISABLE";
/*
rach_sizeOfRA_PreamblesGroupA = ;
rach_messageSizeGroupA = ;
rach_messagePowerOffsetGroupB = ;
*/
rach_powerRampingStep = 4;
rach_preambleInitialReceivedTargetPower = -104;
rach_preambleTransMax = 10;
rach_raResponseWindowSize = 10;
rach_macContentionResolutionTimer = 48;
rach_maxHARQ_Msg3Tx = 4;
pcch_default_PagingCycle = 128;
pcch_nB = "oneT";
bcch_modificationPeriodCoeff = 2;
ue_TimersAndConstants_t300 = 1000;
ue_TimersAndConstants_t301 = 1000;
ue_TimersAndConstants_t310 = 1000;
ue_TimersAndConstants_t311 = 10000;
ue_TimersAndConstants_n310 = 20;
ue_TimersAndConstants_n311 = 1;
ue_TransmissionMode = 1;
}
);
srb1_parameters :
{
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
timer_poll_retransmit = 80;
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
timer_reordering = 35;
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
timer_status_prohibit = 0;
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
poll_pdu = 4;
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
poll_byte = 99999;
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
max_retx_threshold = 4;
}
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
////////// MME parameters:
mme_ip_address = ( { ipv4 = "192.168.12.26";
ipv6 = "192:168:30::17";
active = "yes";
preference = "ipv4";
}
);
NETWORK_INTERFACES :
{
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
};
log_config :
{
global_log_level ="info";
global_log_verbosity ="medium";
hw_log_level ="info";
hw_log_verbosity ="medium";
phy_log_level ="info";
phy_log_verbosity ="medium";
mac_log_level ="info";
mac_log_verbosity ="high";
rlc_log_level ="info";
rlc_log_verbosity ="medium";
pdcp_log_level ="info";
pdcp_log_verbosity ="medium";
rrc_log_level ="info";
rrc_log_verbosity ="medium";
};
}
);
@@ -0,0 +1,175 @@
Active_eNBs = ( "eNB_Eurecom_LTEBox");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
eNBs =
(
{
////////// Identification parameters:
eNB_ID = 0xe00;
cell_type = "CELL_MACRO_ENB";
eNB_name = "eNB_Eurecom_LTEBox";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = "1";
mobile_country_code = "208";
mobile_network_code = "92";
////////// Physical parameters:
component_carriers = (
{
node_function = "eNodeB_3GPP";
node_timing = "synch_to_ext_device";
node_synch_ref = 0;
frame_type = "TDD";
tdd_config = 3;
tdd_config_s = 0;
prefix_type = "NORMAL";
eutra_band = 38;
downlink_frequency = 2580000000L;
uplink_frequency_offset = 0;
Nid_cell = 0;
N_RB_DL = 25;
Nid_cell_mbsfn = 0;
nb_antenna_ports = 1;
nb_antennas_tx = 1;
nb_antennas_rx = 1;
tx_gain = 90;
rx_gain = 125;
prach_root = 0;
prach_config_index = 0;
prach_high_speed = "DISABLE";
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
pucch_nRB_CQI = 1;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
pdsch_p_b = 0;
pusch_n_SB = 1;
pusch_enable64QAM = "DISABLE";
pusch_hoppingMode = "interSubFrame";
pusch_hoppingOffset = 0;
pusch_groupHoppingEnabled = "ENABLE";
pusch_groupAssignment = 0;
pusch_sequenceHoppingEnabled = "DISABLE";
pusch_nDMRS1 = 1;
phich_duration = "NORMAL";
phich_resource = "ONESIXTH";
srs_enable = "DISABLE";
/* srs_BandwidthConfig =;
srs_SubframeConfig =;
srs_ackNackST =;
srs_MaxUpPts =;*/
pusch_p0_Nominal = -90;
pusch_alpha = "AL1";
pucch_p0_Nominal = -96;
msg3_delta_Preamble = 6;
pucch_deltaF_Format1 = "deltaF2";
pucch_deltaF_Format1b = "deltaF3";
pucch_deltaF_Format2 = "deltaF0";
pucch_deltaF_Format2a = "deltaF0";
pucch_deltaF_Format2b = "deltaF0";
rach_numberOfRA_Preambles = 64;
rach_preamblesGroupAConfig = "DISABLE";
/*
rach_sizeOfRA_PreamblesGroupA = ;
rach_messageSizeGroupA = ;
rach_messagePowerOffsetGroupB = ;
*/
rach_powerRampingStep = 4;
rach_preambleInitialReceivedTargetPower = -104;
rach_preambleTransMax = 10;
rach_raResponseWindowSize = 10;
rach_macContentionResolutionTimer = 48;
rach_maxHARQ_Msg3Tx = 4;
pcch_default_PagingCycle = 128;
pcch_nB = "oneT";
bcch_modificationPeriodCoeff = 2;
ue_TimersAndConstants_t300 = 1000;
ue_TimersAndConstants_t301 = 1000;
ue_TimersAndConstants_t310 = 1000;
ue_TimersAndConstants_t311 = 10000;
ue_TimersAndConstants_n310 = 20;
ue_TimersAndConstants_n311 = 1;
ue_TransmissionMode = 1;
}
);
srb1_parameters :
{
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
timer_poll_retransmit = 80;
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
timer_reordering = 35;
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
timer_status_prohibit = 0;
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
poll_pdu = 4;
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
poll_byte = 99999;
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
max_retx_threshold = 4;
}
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
////////// MME parameters:
mme_ip_address = ( { ipv4 = "192.168.12.26";
ipv6 = "192:168:30::17";
active = "yes";
preference = "ipv4";
}
);
NETWORK_INTERFACES :
{
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
};
log_config :
{
global_log_level ="info";
global_log_verbosity ="medium";
hw_log_level ="info";
hw_log_verbosity ="medium";
phy_log_level ="info";
phy_log_verbosity ="medium";
mac_log_level ="info";
mac_log_verbosity ="high";
rlc_log_level ="info";
rlc_log_verbosity ="medium";
pdcp_log_level ="info";
pdcp_log_verbosity ="medium";
rrc_log_level ="info";
rrc_log_verbosity ="medium";
};
}
);
+72 -33
View File
@@ -283,27 +283,41 @@ machine_list.wait_all_free()
tests = { tests = {
'b210' : { 'b210' : {
'alu' : { 'alu' : {
'5' : { 'fdd' : {
'bandrich' : { '5' : {
'tcp' : { 'ul': False, 'dl' : False }, 'bandrich' : {
'udp' : { 'ul': False, 'dl' : False }}, 'tcp' : { 'ul': False, 'dl' : False },
'sony' : { 'udp' : { 'ul': False, 'dl' : False }},
'tcp' : { 'ul': False, 'dl' : False }, 'sony' : {
'udp' : { 'ul': False, 'dl' : False }}}, 'tcp' : { 'ul': False, 'dl' : False },
'10' : { 'udp' : { 'ul': False, 'dl' : False }}},
'bandrich' : { '10' : {
'tcp' : { 'ul': False, 'dl' : False }, 'bandrich' : {
'udp' : { 'ul': False, 'dl' : False }}, 'tcp' : { 'ul': False, 'dl' : False },
'sony' : { 'udp' : { 'ul': False, 'dl' : False }},
'tcp' : { 'ul': False, 'dl' : False }, 'sony' : {
'udp' : { 'ul': False, 'dl' : False }}}, 'tcp' : { 'ul': False, 'dl' : False },
'20' : { 'udp' : { 'ul': False, 'dl' : False }}},
'bandrich' : { '20' : {
'tcp' : { 'ul': False, 'dl' : False }, 'bandrich' : {
'udp' : { 'ul': False, 'dl' : False }}, 'tcp' : { 'ul': False, 'dl' : False },
'sony' : { 'udp' : { 'ul': False, 'dl' : False }},
'tcp' : { 'ul': False, 'dl' : False }, 'sony' : {
'udp' : { 'ul': False, 'dl' : False }}}}, 'tcp' : { 'ul': False, 'dl' : False },
'udp' : { 'ul': False, 'dl' : False }}}},
'tdd' : {
'5' : {
'3276' : {
'tcp' : { 'ul': False, 'dl' : False },
'udp' : { 'ul': False, 'dl' : False }}},
'10' : {
'3276' : {
'tcp' : { 'ul': False, 'dl' : False },
'udp' : { 'ul': False, 'dl' : False }}},
'20' : {
'3276' : {
'tcp' : { 'ul': False, 'dl' : False },
'udp' : { 'ul': False, 'dl' : False }}}}},
'openair-cn' : {} 'openair-cn' : {}
}, },
'x310' : { 'x310' : {
@@ -321,24 +335,24 @@ for test in todo_tests:
todo_tests_ids.append(test.get('id')) todo_tests_ids.append(test.get('id'))
for test in todo_tests_ids: for test in todo_tests_ids:
if test=='015500':tests['b210']['alu'][ '5']['bandrich']['udp']['ul']=True if test=='015500':tests['b210']['alu']['fdd'][ '5']['bandrich']['udp']['ul']=True
if test=='015501':tests['b210']['alu']['10']['bandrich']['udp']['ul']=True if test=='015501':tests['b210']['alu']['fdd']['10']['bandrich']['udp']['ul']=True
if test=='015502':tests['b210']['alu']['20']['bandrich']['udp']['ul']=True if test=='015502':tests['b210']['alu']['fdd']['20']['bandrich']['udp']['ul']=True
if test=='015503':tests['b210']['alu'][ '5']['bandrich']['udp']['dl']=True if test=='015503':tests['b210']['alu']['fdd'][ '5']['bandrich']['udp']['dl']=True
if test=='015504':tests['b210']['alu']['10']['bandrich']['udp']['dl']=True if test=='015504':tests['b210']['alu']['fdd']['10']['bandrich']['udp']['dl']=True
if test=='015505':tests['b210']['alu']['20']['bandrich']['udp']['dl']=True if test=='015505':tests['b210']['alu']['fdd']['20']['bandrich']['udp']['dl']=True
if test=='015506':log('WARNING: skip test ' + test) #TODO if test=='015506':log('WARNING: skip test ' + test) #TODO
if test=='015507':log('WARNING: skip test ' + test) #TODO if test=='015507':log('WARNING: skip test ' + test) #TODO
if test=='015508':log('WARNING: skip test ' + test) #TODO if test=='015508':log('WARNING: skip test ' + test) #TODO
if test=='015509':log('WARNING: skip test ' + test) #TODO if test=='015509':log('WARNING: skip test ' + test) #TODO
if test=='015510':log('WARNING: skip test ' + test) #TODO if test=='015510':log('WARNING: skip test ' + test) #TODO
if test=='015511':log('WARNING: skip test ' + test) #TODO if test=='015511':log('WARNING: skip test ' + test) #TODO
if test=='015512':tests['b210']['alu'][ '5']['bandrich']['tcp']['ul']=True if test=='015512':tests['b210']['alu']['fdd'][ '5']['bandrich']['tcp']['ul']=True
if test=='015513':tests['b210']['alu']['10']['bandrich']['tcp']['ul']=True if test=='015513':tests['b210']['alu']['fdd']['10']['bandrich']['tcp']['ul']=True
if test=='015514':tests['b210']['alu']['20']['bandrich']['tcp']['ul']=True if test=='015514':tests['b210']['alu']['fdd']['20']['bandrich']['tcp']['ul']=True
if test=='015515':tests['b210']['alu'][ '5']['bandrich']['tcp']['dl']=True if test=='015515':tests['b210']['alu']['fdd'][ '5']['bandrich']['tcp']['dl']=True
if test=='015516':tests['b210']['alu']['10']['bandrich']['tcp']['dl']=True if test=='015516':tests['b210']['alu']['fdd']['10']['bandrich']['tcp']['dl']=True
if test=='015517':tests['b210']['alu']['20']['bandrich']['tcp']['dl']=True if test=='015517':tests['b210']['alu']['fdd']['20']['bandrich']['tcp']['dl']=True
if test=='015518':log('WARNING: skip test ' + test) #TODO if test=='015518':log('WARNING: skip test ' + test) #TODO
if test=='015519':log('WARNING: skip test ' + test) #TODO if test=='015519':log('WARNING: skip test ' + test) #TODO
if test=='015520':log('WARNING: skip test ' + test) #TODO if test=='015520':log('WARNING: skip test ' + test) #TODO
@@ -441,6 +455,31 @@ for test in todo_tests_ids:
if test=='018504':log('WARNING: skip test ' + test) #TODO if test=='018504':log('WARNING: skip test ' + test) #TODO
if test=='018505':log('WARNING: skip test ' + test) #TODO if test=='018505':log('WARNING: skip test ' + test) #TODO
if test=='018600':tests['b210']['alu']['tdd'][ '5']['3276']['udp']['ul']=True
if test=='018601':tests['b210']['alu']['tdd']['10']['3276']['udp']['ul']=True
if test=='018602':tests['b210']['alu']['tdd']['20']['3276']['udp']['ul']=True
if test=='018603':tests['b210']['alu']['tdd'][ '5']['3276']['udp']['dl']=True
if test=='018604':tests['b210']['alu']['tdd']['10']['3276']['udp']['dl']=True
if test=='018605':tests['b210']['alu']['tdd']['20']['3276']['udp']['dl']=True
if test=='018606':log('WARNING: skip test ' + test) #TODO
if test=='018607':log('WARNING: skip test ' + test) #TODO
if test=='018608':log('WARNING: skip test ' + test) #TODO
if test=='018609':log('WARNING: skip test ' + test) #TODO
if test=='018610':log('WARNING: skip test ' + test) #TODO
if test=='018611':log('WARNING: skip test ' + test) #TODO
if test=='018612':tests['b210']['alu']['tdd'][ '5']['3276']['tcp']['ul']=True
if test=='018613':tests['b210']['alu']['tdd']['10']['3276']['tcp']['ul']=True
if test=='018614':tests['b210']['alu']['tdd']['20']['3276']['tcp']['ul']=True
if test=='018615':tests['b210']['alu']['tdd'][ '5']['3276']['tcp']['dl']=True
if test=='018616':tests['b210']['alu']['tdd']['10']['3276']['tcp']['dl']=True
if test=='018617':tests['b210']['alu']['tdd']['20']['3276']['tcp']['dl']=True
if test=='018618':log('WARNING: skip test ' + test) #TODO
if test=='018619':log('WARNING: skip test ' + test) #TODO
if test=='018620':log('WARNING: skip test ' + test) #TODO
if test=='018621':log('WARNING: skip test ' + test) #TODO
if test=='018622':log('WARNING: skip test ' + test) #TODO
if test=='018623':log('WARNING: skip test ' + test) #TODO
if test=='025500':log('WARNING: skip test ' + test) #TODO if test=='025500':log('WARNING: skip test ' + test) #TODO
if test=='025501':log('WARNING: skip test ' + test) #TODO if test=='025501':log('WARNING: skip test ' + test) #TODO
if test=='025502':log('WARNING: skip test ' + test) #TODO if test=='025502':log('WARNING: skip test ' + test) #TODO
+9
View File
@@ -948,6 +948,11 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
// fill cqi parameters for periodic CQI reporting // fill cqi parameters for periodic CQI reporting
get_cqipmiri_params(phy_vars_ue,eNB_id); get_cqipmiri_params(phy_vars_ue,eNB_id);
// disable MIB SIB decoding once we are on connected mode
LOG_I(PHY,"Disabling SIB MIB decoding \n");
phy_vars_ue->decode_SIB = 0;
phy_vars_ue->decode_MIB = 0;
} }
void phy_config_cba_rnti (module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uint8_t index, rnti_t cba_rnti, uint8_t cba_group_id, uint8_t num_active_cba_groups) void phy_config_cba_rnti (module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uint8_t index, rnti_t cba_rnti, uint8_t cba_group_id, uint8_t num_active_cba_groups)
@@ -1306,6 +1311,10 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
ue->high_speed_flag = 1; ue->high_speed_flag = 1;
ue->ch_est_alpha = 24576; ue->ch_est_alpha = 24576;
// enable MIB/SIB decoding by default
ue->decode_MIB = 1;
ue->decode_SIB = 1;
init_prach_tables(839); init_prach_tables(839);
@@ -51,10 +51,10 @@ int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
int uespec_pilot[300]; int uespec_pilot[300];
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch[eNB_id]; LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch[(Ns>>1)&0x1][eNB_id];
LTE_DL_UE_HARQ_t *dlsch0_harq; LTE_DL_UE_HARQ_t *dlsch0_harq;
harq_pid = dlsch_ue[0]->current_harq_pid; harq_pid = dlsch_ue[0]->current_harq_pid;
dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) || if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) ||
+56 -29
View File
@@ -2893,15 +2893,15 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
break; break;
case 2: case 2:
*CCEmap|=(0x03<<(CCEind&0x1f)); *CCEmap|=(1<<(CCEind&0x1f));
break; break;
case 4: case 4:
*CCEmap|=(0x0f<<(CCEind&0x1f)); *CCEmap|=(1<<(CCEind&0x1f));
break; break;
case 8: case 8:
*CCEmap|=(0xff<<(CCEind&0x1f)); *CCEmap|=(1<<(CCEind&0x1f));
break; break;
} }
@@ -3149,7 +3149,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0) ,
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
2, 2,
@@ -3177,7 +3177,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
2, 2,
@@ -3209,7 +3209,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
P_RNTI, P_RNTI,
ra_rnti, ra_rnti,
3, 3,
@@ -3237,7 +3237,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
3, 3,
@@ -3271,7 +3271,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
0, 0,
@@ -3300,7 +3300,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
1, 1,
@@ -3333,7 +3333,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
2, 2,
@@ -3362,7 +3362,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
3, 3,
@@ -3395,7 +3395,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
0, 0,
@@ -3426,7 +3426,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
1, 1,
@@ -3458,7 +3458,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
2, 2,
@@ -3490,7 +3490,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
3, 3,
@@ -3518,16 +3518,18 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
} else if (tmode == 3) { } else if (tmode == 3) {
LOG_D(PHY," Now check UE_SPEC format 2A_2A search aggregation 1\n");
// Now check UE_SPEC format 2A_2A search spaces at aggregation 1 // Now check UE_SPEC format 2A_2A search spaces at aggregation 1
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
0, 0,
format1A, format1A,
format1A, format1A,
@@ -3542,21 +3544,25 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
&CCEmap1, &CCEmap1,
&CCEmap2); &CCEmap2);
LOG_D(PHY," format 2A_2A search CCEmap0 %x, format0_found %d, format_c_found %d \n", CCEmap0, format0_found, format_c_found);
if ((CCEmap0==0xffff)|| if ((CCEmap0==0xffff)||
((format0_found==1)&&(format_c_found==1))) ((format0_found==1)&&(format_c_found==1)))
return(dci_cnt); return(dci_cnt);
LOG_D(PHY," format 2A_2A search dci_cnt %d, old_dci_cn t%d \n", dci_cnt, old_dci_cnt);
if (dci_cnt>old_dci_cnt) if (dci_cnt>old_dci_cnt)
return(dci_cnt); return(dci_cnt);
// Now check UE_SPEC format 2 search spaces at aggregation 2 // Now check UE_SPEC format 2 search spaces at aggregation 2
LOG_D(PHY," Now check UE_SPEC format 2A_2A search aggregation 2\n");
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
1, 1,
@@ -3577,19 +3583,22 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
((format0_found==1)&&(format_c_found==1))) ((format0_found==1)&&(format_c_found==1)))
return(dci_cnt); return(dci_cnt);
LOG_D(PHY," format 2A_2A search dci_cnt %d, old_dci_cn t%d \n", dci_cnt, old_dci_cnt);
if (dci_cnt>old_dci_cnt) if (dci_cnt>old_dci_cnt)
return(dci_cnt); return(dci_cnt);
// Now check UE_SPEC format 2_2A search spaces at aggregation 4 // Now check UE_SPEC format 2_2A search spaces at aggregation 4
LOG_D(PHY," Now check UE_SPEC format 2_2A search spaces at aggregation 4 \n");
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
2, 2,
format1A, format1A,
format1A, format1A,
@@ -3608,18 +3617,21 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
((format0_found==1)&&(format_c_found==1))) ((format0_found==1)&&(format_c_found==1)))
return(dci_cnt); return(dci_cnt);
LOG_D(PHY," format 2A_2A search dci_cnt %d, old_dci_cn t%d \n", dci_cnt, old_dci_cnt);
if (dci_cnt>old_dci_cnt) if (dci_cnt>old_dci_cnt)
return(dci_cnt); return(dci_cnt);
//#ifdef ALL_AGGREGATION //#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 2_2A search spaces at aggregation 8 // Now check UE_SPEC format 2_2A search spaces at aggregation 8
LOG_D(PHY," Now check UE_SPEC format 2_2A search spaces at aggregation 8 \n");
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
3, 3,
@@ -3636,16 +3648,24 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
&CCEmap1, &CCEmap1,
&CCEmap2); &CCEmap2);
//#endif //#endif
if ((CCEmap0==0xffff)||
((format0_found==1)&&(format_c_found==1)))
return(dci_cnt);
LOG_D(PHY," format 2A_2A search dci_cnt %d, old_dci_cn t%d \n", dci_cnt, old_dci_cnt);
if (dci_cnt>old_dci_cnt)
return(dci_cnt);
} else if (tmode == 4) { } else if (tmode == 4) {
// Now check UE_SPEC format 2_2A search spaces at aggregation 1 // Now check UE_SPEC format 2_2A search spaces at aggregation 1
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
0, 0,
@@ -3670,13 +3690,14 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
return(dci_cnt); return(dci_cnt);
// Now check UE_SPEC format 2 search spaces at aggregation 2 // Now check UE_SPEC format 2 search spaces at aggregation 2
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
1, 1,
@@ -3701,13 +3722,14 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
return(dci_cnt); return(dci_cnt);
// Now check UE_SPEC format 2_2A search spaces at aggregation 4 // Now check UE_SPEC format 2_2A search spaces at aggregation 4
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
2, 2,
@@ -3733,13 +3755,14 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
//#ifdef ALL_AGGREGATION //#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 2_2A search spaces at aggregation 8 // Now check UE_SPEC format 2_2A search spaces at aggregation 8
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
3, 3,
@@ -3762,13 +3785,14 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
#ifdef DEBUG_DCI_DECODING #ifdef DEBUG_DCI_DECODING
LOG_I(PHY," MU-MIMO check UE_SPEC format 1E_2A_M10PRB\n"); LOG_I(PHY," MU-MIMO check UE_SPEC format 1E_2A_M10PRB\n");
#endif #endif
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
0, 0,
@@ -3794,13 +3818,14 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
return(dci_cnt); return(dci_cnt);
// Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 2 // Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 2
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
1, 1,
@@ -3825,13 +3850,14 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
return(dci_cnt); return(dci_cnt);
// Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 4 // Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 4
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
2, 2,
@@ -3858,13 +3884,14 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
//#ifdef ALL_AGGREGATION //#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 1E_2A_M10PRB search spaces at aggregation 8 // Now check UE_SPEC format 1E_2A_M10PRB search spaces at aggregation 8
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode, dci_decoding_procedure0(pdcch_vars,0,mode,
subframe, subframe,
dci_alloc, dci_alloc,
eNB_id, eNB_id,
frame_parms, frame_parms,
mi, mi,
SI_RNTI, ((ue->decode_SIB == 1) ? SI_RNTI : 0),
ra_rnti, ra_rnti,
P_RNTI, P_RNTI,
3, 3,
+97 -39
View File
@@ -4763,22 +4763,26 @@ int check_dci_format1_1a_coherency(DCI_format_t dci_format,
uint16_t si_rnti, uint16_t si_rnti,
uint16_t ra_rnti, uint16_t ra_rnti,
uint16_t p_rnti, uint16_t p_rnti,
uint32_t frame,
uint8_t subframe,
DCI_INFO_EXTRACTED_t *pdci_info_extarcted, DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
LTE_DL_UE_HARQ_t *pdlsch0_harq) LTE_DL_UE_HARQ_t *pdlsch0_harq)
{ {
uint8_t harq_pid = pdci_info_extarcted->harq_pid; uint8_t harq_pid = pdci_info_extarcted->harq_pid;
uint32_t rballoc = pdci_info_extarcted->rballoc; uint32_t rballoc = pdci_info_extarcted->rballoc;
uint8_t mcs1 = pdci_info_extarcted->mcs1; uint8_t mcs1 = pdci_info_extarcted->mcs1;
uint8_t rv1 = pdci_info_extarcted->rv1;
uint8_t ndi1 = pdci_info_extarcted->ndi1;
uint8_t TPC = pdci_info_extarcted->TPC; uint8_t TPC = pdci_info_extarcted->TPC;
uint8_t rah = pdci_info_extarcted->rah; uint8_t rah = pdci_info_extarcted->rah;
#ifdef DEBUG_DCI
uint8_t rv1 = pdci_info_extarcted->rv1;
uint8_t ndi1 = pdci_info_extarcted->ndi1;
#endif
uint8_t NPRB = 0; uint8_t NPRB = 0;
long long int RIV_max = 0; long long int RIV_max = 0;
#ifdef DEBUG_DCI #ifdef DEBUG_DCI
LOG_I(PHY,"[DCI-FORMAT-1-1A] dci_format %d\n", dci_format); LOG_I(PHY,"[DCI-FORMAT-1-1A] AbsSubframe %d.%d dci_format %d\n", frame, subframe, dci_format);
LOG_I(PHY,"[DCI-FORMAT-1-1A] rnti %x\n", rnti); LOG_I(PHY,"[DCI-FORMAT-1-1A] rnti %x\n", rnti);
LOG_I(PHY,"[DCI-FORMAT-1-1A] harq_pid %d\n", harq_pid); LOG_I(PHY,"[DCI-FORMAT-1-1A] harq_pid %d\n", harq_pid);
LOG_I(PHY,"[DCI-FORMAT-1-1A] rah %d\n", rah); LOG_I(PHY,"[DCI-FORMAT-1-1A] rah %d\n", rah);
@@ -4983,24 +4987,30 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
uint8_t rv2 = pdci_info_extarcted->rv2; uint8_t rv2 = pdci_info_extarcted->rv2;
uint8_t harq_pid = pdci_info_extarcted->harq_pid; uint8_t harq_pid = pdci_info_extarcted->harq_pid;
uint32_t rballoc = pdci_info_extarcted->rballoc; uint32_t rballoc = pdci_info_extarcted->rballoc;
#ifdef DEBUG_DCI
uint8_t ndi1 = pdci_info_extarcted->ndi1; uint8_t ndi1 = pdci_info_extarcted->ndi1;
uint8_t ndi2 = pdci_info_extarcted->ndi2; uint8_t ndi2 = pdci_info_extarcted->ndi2;
#endif
uint8_t NPRB = 0; uint8_t NPRB = 0;
long long RIV_max = 0; long long RIV_max = 0;
#ifdef DEBUG_DCI
LOG_I(PHY, "extarcted dci - dci_format %d \n", dci_format); LOG_I(PHY, "extarcted dci - dci_format %d \n", dci_format);
LOG_I(PHY, "extarcted dci - rnti %d \n", rnti);
LOG_I(PHY, "extarcted dci - rah %d \n", rah); LOG_I(PHY, "extarcted dci - rah %d \n", rah);
LOG_I(PHY, "extarcted dci - mcs1 %d \n", mcs1); LOG_I(PHY, "extarcted dci - mcs1 %d \n", mcs1);
LOG_I(PHY, "extarcted dci - mcs2 %d \n", mcs2); LOG_I(PHY, "extarcted dci - mcs2 %d \n", mcs2);
LOG_I(PHY, "extarcted dci - rv1 %d \n", rv1); LOG_I(PHY, "extarcted dci - rv1 %d \n", rv1);
LOG_I(PHY, "extarcted dci - rv2 %d \n", rv2); LOG_I(PHY, "extarcted dci - rv2 %d \n", rv2);
LOG_I(PHY, "extarcted dci - ndi1 %d \n", ndi1); //LOG_I(PHY, "extarcted dci - ndi1 %d \n", ndi1);
LOG_I(PHY, "extarcted dci - ndi2 %d \n", ndi2); //LOG_I(PHY, "extarcted dci - ndi2 %d \n", ndi2);
LOG_I(PHY, "extarcted dci - rballoc %x \n", rballoc); LOG_I(PHY, "extarcted dci - rballoc %x \n", rballoc);
LOG_I(PHY, "extarcted dci - harq pif %d \n", harq_pid); LOG_I(PHY, "extarcted dci - harq pid %d \n", harq_pid);
LOG_I(PHY, "extarcted dci - round0 %d \n", pdlsch0_harq->round); LOG_I(PHY, "extarcted dci - round0 %d \n", pdlsch0_harq->round);
LOG_I(PHY, "extarcted dci - round1 %d \n", pdlsch1_harq->round); LOG_I(PHY, "extarcted dci - round1 %d \n", pdlsch1_harq->round);
#endif
// I- check dci content minimum coherency // I- check dci content minimum coherency
if(harq_pid >8) if(harq_pid >8)
@@ -5043,6 +5053,21 @@ int check_dci_format2_2a_coherency(DCI_format_t dci_format,
}*/ }*/
if((pdlsch0_harq->round == 0) && (rv1 > 0))
{
// DCI false detection
LOG_I(PHY,"bad rv1\n");
return(0);
}
if((pdlsch1_harq->round == 0) && (rv2 > 0))
{
// DCI false detection
LOG_I(PHY,"bad rv2\n");
return(0);
}
switch (N_RB_DL) { switch (N_RB_DL) {
case 6: case 6:
if (rah == 0) if (rah == 0)
@@ -5606,6 +5631,7 @@ void compute_precoding_info_format2A(uint8_t tpmi,
void prepare_dl_decoding_format2_2A(DCI_format_t dci_format, void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
DCI_INFO_EXTRACTED_t *pdci_info_extarcted, DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
LTE_DL_FRAME_PARMS *frame_parms, LTE_DL_FRAME_PARMS *frame_parms,
uint16_t rnti,
uint8_t subframe, uint8_t subframe,
LTE_DL_UE_HARQ_t *dlsch0_harq, LTE_DL_UE_HARQ_t *dlsch0_harq,
LTE_DL_UE_HARQ_t *dlsch1_harq, LTE_DL_UE_HARQ_t *dlsch1_harq,
@@ -5663,15 +5689,17 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch1_harq->dl_power_off = 1; dlsch1_harq->dl_power_off = 1;
pdlsch0->current_harq_pid = harq_pid; pdlsch0->current_harq_pid = harq_pid;
pdlsch0->harq_ack[subframe].harq_id = harq_pid; pdlsch0->harq_ack[subframe].harq_id = harq_pid;
pdlsch1->current_harq_pid = harq_pid; pdlsch1->current_harq_pid = harq_pid;
pdlsch1->harq_ack[subframe].harq_id = harq_pid; pdlsch1->harq_ack[subframe].harq_id = harq_pid;
// assume two CW are active // assume two CW are active
dlsch0_harq->status = ACTIVE; dlsch0_harq->status = ACTIVE;
dlsch1_harq->status = ACTIVE; dlsch1_harq->status = ACTIVE;
pdlsch0->active = 1; pdlsch0->active = 1;
pdlsch1->active = 1; pdlsch1->active = 1;
pdlsch0->rnti = rnti;
pdlsch1->rnti = rnti;
if (TB0_active && TB1_active && tbswap==1) { if (TB0_active && TB1_active && tbswap==1) {
@@ -5682,20 +5710,16 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
if (TB0_active==0) { if (TB0_active==0) {
dlsch0_harq->status = SCH_IDLE; dlsch0_harq->status = SCH_IDLE;
pdlsch0->active = 0; pdlsch0->active = 0;
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf("[DCI UE]: TB0 is deactivated, retransmit TB1 transmit in TM6\n"); printf("[DCI UE]: TB0 is deactivated, retransmit TB1 transmit in TM6\n");
#endif #endif
} }
if (TB1_active==0) { if (TB1_active==0) {
dlsch1_harq->status = SCH_IDLE; dlsch1_harq->status = SCH_IDLE;
pdlsch1->active = 0; pdlsch1->active = 0;
#ifdef DEBUG_HARQ
printf("[DCI UE]: TB1 is deactivated, retransmit TB0 transmit in TM6\n");
#endif
} }
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf("[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status); printf("[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
#endif #endif
@@ -5727,6 +5751,9 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3]; dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3];
dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
//dlsch0_harq->Nl = 1;
//dlsch1_harq->Nl = 1;
} }
} else if ((TB0_active == 0) && (TB1_active == 1)){ } else if ((TB0_active == 0) && (TB1_active == 1)){
@@ -5774,38 +5801,57 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
if ((ndi1!=dlsch0_harq->DCINdi) || (dlsch0_harq->first_tx==1)) { if ((ndi1!=dlsch0_harq->DCINdi) || (dlsch0_harq->first_tx==1)) {
dlsch0_harq->round = 0; dlsch0_harq->round = 0;
//LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW0 subframe %d (pid %d, round %d)\n",
// subframe,harq_pid,dlsch0_harq->round);
if ( dlsch0_harq->first_tx==1) { if ( dlsch0_harq->first_tx==1) {
LOG_D(PHY,"Format 2 DCI First TX0: Clearing flag\n"); LOG_D(PHY,"Format 2 DCI First TX0: Clearing flag\n");
dlsch0_harq->first_tx = 0; dlsch0_harq->first_tx = 0;
} }
}else{ }else{
if(dlsch0_harq->round == 0) { if(dlsch0_harq->round == 0) {
#if 0
// skip pdsch decoding and report ack // skip pdsch decoding and report ack
dlsch0_harq->status = SCH_IDLE; dlsch0_harq->status = SCH_IDLE;
pdlsch0->active = 0; pdlsch0->active = 0;
pdlsch0->harq_ack[subframe].ack = 1; pdlsch0->harq_ack[subframe].ack = 1;
pdlsch0->harq_ack[subframe].harq_id = harq_pid; pdlsch0->harq_ack[subframe].harq_id = harq_pid;
pdlsch0->harq_ack[subframe].send_harq_status = 1; pdlsch0->harq_ack[subframe].send_harq_status = 1;
#endif
} }
} }
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; // if Imcs in [29..31] TBS is assumed to be as determined from DCI transported in the latest
if(dlsch0_harq->Nl == 2) // PDCCH for the same trasport block using Imcs in [0 .. 28]
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; if(dlsch0_harq->mcs <= 28)
if (mcs1 <= 28) {
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
LOG_D(PHY,"[UE] DLSCH: New TBS CW0 subframe %d (pid %d, round %d) TBS %d \n",
subframe,harq_pid,dlsch0_harq->round, dlsch0_harq->TBS);
}
else
{
LOG_D(PHY,"[UE] DLSCH: Keep the same TBS CW0 subframe %d (pid %d, round %d) TBS %d \n",
subframe,harq_pid,dlsch0_harq->round, dlsch0_harq->TBS);
}
//if(dlsch0_harq->Nl == 2)
//dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
if (mcs1 <= 28)
dlsch0_harq->Qm = get_Qm(mcs1); dlsch0_harq->Qm = get_Qm(mcs1);
else if (mcs1<=31) else if (mcs1<=31)
dlsch0_harq->Qm = (mcs1-28)<<1; dlsch0_harq->Qm = (mcs1-28)<<1;
} }
if (TB1_active) { if (TB1_active) {
if ((ndi2!=dlsch1_harq->DCINdi) || (dlsch1_harq->first_tx==1)) { if ((ndi2!=dlsch1_harq->DCINdi) || (dlsch1_harq->first_tx==1)) {
dlsch1_harq->round = 0; dlsch1_harq->round = 0;
//LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW1 subframe %d (pid %d, round %d)\n",
// subframe,harq_pid,dlsch0_harq->round);
if (dlsch1_harq->first_tx==1) { if (dlsch1_harq->first_tx==1) {
LOG_D(PHY,"Format 2 DCI First TX1: Clearing flag\n"); LOG_D(PHY,"Format 2 DCI First TX1: Clearing flag\n");
dlsch1_harq->first_tx = 0; dlsch1_harq->first_tx = 0;
} }
}else{ }else{
#if 0
if(dlsch1_harq->round == 0) { if(dlsch1_harq->round == 0) {
// skip pdsch decoding and report ack // skip pdsch decoding and report ack
dlsch1_harq->status = SCH_IDLE; dlsch1_harq->status = SCH_IDLE;
@@ -5814,15 +5860,25 @@ void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
pdlsch1->harq_ack[subframe].harq_id = harq_pid; pdlsch1->harq_ack[subframe].harq_id = harq_pid;
pdlsch1->harq_ack[subframe].send_harq_status = 1; pdlsch1->harq_ack[subframe].send_harq_status = 1;
} }
#endif
} }
dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; // if Imcs in [29..31] TBS is assumed to be as determined from DCI transported in the latest
if(dlsch0_harq->Nl == 2) // PDCCH for the same trasport block using Imcs in [0 .. 28]
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; if(dlsch1_harq->mcs <= 28)
{
if (mcs2 <= 28) dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
LOG_D(PHY,"[UE] DLSCH: New TBS CW1 subframe %d (pid %d, round %d) TBS %d \n",
subframe,harq_pid,dlsch1_harq->round, dlsch1_harq->TBS);
}
else
{
LOG_D(PHY,"[UE] DLSCH: Keep the same TBS CW1 subframe %d (pid %d, round %d) TBS %d \n",
subframe,harq_pid,dlsch1_harq->round, dlsch1_harq->TBS);
}
if (mcs2 <= 28)
dlsch1_harq->Qm = get_Qm(mcs2); dlsch1_harq->Qm = get_Qm(mcs2);
else if (mcs1<=31) else if (mcs1<=31)
dlsch1_harq->Qm = (mcs2-28)<<1; dlsch1_harq->Qm = (mcs2-28)<<1;
} }
@@ -5920,7 +5976,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
tc_rnti, tc_rnti,
si_rnti, si_rnti,
ra_rnti, ra_rnti,
p_rnti, p_rnti,frame,subframe,
&dci_info_extarcted, &dci_info_extarcted,
dlsch0_harq); dlsch0_harq);
if(status == 0) if(status == 0)
@@ -6020,7 +6076,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
tc_rnti, tc_rnti,
si_rnti, si_rnti,
ra_rnti, ra_rnti,
p_rnti, p_rnti,frame,subframe,
&dci_info_extarcted, &dci_info_extarcted,
dlsch0_harq); dlsch0_harq);
if(status == 0) if(status == 0)
@@ -6047,7 +6103,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
case format2: case format2:
{ {
// extract dci infomation // extract dci infomation
LOG_I(PHY,"[DCI-format2] extract dci infomation \n"); //LOG_I(PHY,"[DCI-format2] AbsSubframe %d.%d extract dci infomation \n", frame, subframe);
extract_dci2_info(frame_parms->N_RB_DL, extract_dci2_info(frame_parms->N_RB_DL,
frame_type, frame_type,
frame_parms->nb_antenna_ports_eNB, frame_parms->nb_antenna_ports_eNB,
@@ -6069,7 +6125,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch0->harq_processes[harq_pid]; dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid]; dlsch1_harq = dlsch1->harq_processes[harq_pid];
LOG_I(PHY,"[DCI-format2] check dci content \n"); //LOG_I(PHY,"[DCI-format2] check dci content \n");
status = check_dci_format2_2a_coherency(format2, status = check_dci_format2_2a_coherency(format2,
frame_parms->N_RB_DL, frame_parms->N_RB_DL,
&dci_info_extarcted, &dci_info_extarcted,
@@ -6083,10 +6139,11 @@ int generate_ue_dlsch_params_from_dci(int frame,
return(-1); return(-1);
// dci is correct ==> update internal structure and prepare dl decoding // dci is correct ==> update internal structure and prepare dl decoding
LOG_I(PHY,"[DCI-format2] update internal structure and prepare dl decoding \n"); //LOG_I(PHY,"[DCI-format2] update internal structure and prepare dl decoding \n");
prepare_dl_decoding_format2_2A(format2, prepare_dl_decoding_format2_2A(format2,
&dci_info_extarcted, &dci_info_extarcted,
frame_parms, frame_parms,
rnti,
subframe, subframe,
dlsch0_harq, dlsch0_harq,
dlsch1_harq, dlsch1_harq,
@@ -6099,7 +6156,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
case format2A: case format2A:
{ {
// extract dci infomation // extract dci infomation
LOG_I(PHY,"[DCI-format2A] extract dci infomation \n"); //LOG_I(PHY,"[DCI-format2] AbsSubframe %d.%d extract dci infomation \n", frame%1024, subframe);
extract_dci2A_info(frame_parms->N_RB_DL, extract_dci2A_info(frame_parms->N_RB_DL,
frame_type, frame_type,
frame_parms->nb_antenna_ports_eNB, frame_parms->nb_antenna_ports_eNB,
@@ -6107,10 +6164,10 @@ int generate_ue_dlsch_params_from_dci(int frame,
&dci_info_extarcted); &dci_info_extarcted);
// check dci content // check dci content
LOG_I(PHY,"[DCI-format2A] check dci content \n"); //LOG_I(PHY,"[DCI-format2A] check dci content \n");
LOG_I(PHY,"[DCI-format2A] tb_swap %d harq_pid %d\n", dci_info_extarcted.tb_swap, dci_info_extarcted.harq_pid); //LOG_I(PHY,"[DCI-format2A] tb_swap %d harq_pid %d\n", dci_info_extarcted.tb_swap, dci_info_extarcted.harq_pid);
dlsch[0]->active = 0; //dlsch[0]->active = 0;
dlsch[1]->active = 0; //dlsch[1]->active = 0;
if (dci_info_extarcted.tb_swap == 0) { if (dci_info_extarcted.tb_swap == 0) {
dlsch0 = dlsch[0]; dlsch0 = dlsch[0];
@@ -6122,7 +6179,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch0->harq_processes[dci_info_extarcted.harq_pid]; dlsch0_harq = dlsch0->harq_processes[dci_info_extarcted.harq_pid];
dlsch1_harq = dlsch1->harq_processes[dci_info_extarcted.harq_pid]; dlsch1_harq = dlsch1->harq_processes[dci_info_extarcted.harq_pid];
LOG_I(PHY,"[DCI-format2A] check dci content \n"); //LOG_I(PHY,"[DCI-format2A] check dci content \n");
status = check_dci_format2_2a_coherency(format2A, status = check_dci_format2_2a_coherency(format2A,
frame_parms->N_RB_DL, frame_parms->N_RB_DL,
&dci_info_extarcted, &dci_info_extarcted,
@@ -6136,10 +6193,11 @@ int generate_ue_dlsch_params_from_dci(int frame,
return(-1); return(-1);
// dci is correct ==> update internal structure and prepare dl decoding // dci is correct ==> update internal structure and prepare dl decoding
LOG_I(PHY,"[DCI-format2A] update internal structure and prepare dl decoding \n"); //LOG_I(PHY,"[DCI-format2A] update internal structure and prepare dl decoding \n");
prepare_dl_decoding_format2_2A(format2A, prepare_dl_decoding_format2_2A(format2A,
&dci_info_extarcted, &dci_info_extarcted,
frame_parms, frame_parms,
rnti,
subframe, subframe,
dlsch0_harq, dlsch0_harq,
dlsch1_harq, dlsch1_harq,
@@ -7142,7 +7200,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
uint8_t transmission_mode = ue->transmission_mode[eNB_id]; uint8_t transmission_mode = ue->transmission_mode[eNB_id];
ANFBmode_t AckNackFBMode; ANFBmode_t AckNackFBMode;
LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
LTE_UE_DLSCH_t **dlsch = ue->dlsch[0]; LTE_UE_DLSCH_t **dlsch = ue->dlsch[subframe&0x1][0];
PHY_MEASUREMENTS *meas = &ue->measurements; PHY_MEASUREMENTS *meas = &ue->measurements;
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
// uint32_t current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id]; // uint32_t current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
@@ -7947,7 +8005,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
if (frame_parms->frame_type == FDD) { if (frame_parms->frame_type == FDD) {
int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4); int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4);
if (ue->dlsch[eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission if (ue->dlsch[dl_subframe&0x1][eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission
ulsch->harq_processes[harq_pid]->O_ACK = 1; ulsch->harq_processes[harq_pid]->O_ACK = 1;
} else { } else {
ulsch->harq_processes[harq_pid]->O_ACK = 0; ulsch->harq_processes[harq_pid]->O_ACK = 0;
+1 -1
View File
@@ -708,7 +708,7 @@ typedef struct {
int16_t sqrt_rho_a; int16_t sqrt_rho_a;
/// amplitude of PDSCH (compared to RS) in symbols containing pilots /// amplitude of PDSCH (compared to RS) in symbols containing pilots
int16_t sqrt_rho_b; int16_t sqrt_rho_b;
/// Current HARQ process id /// Current HARQ process id threadRx Odd and threadRx Even
uint8_t current_harq_pid; uint8_t current_harq_pid;
/// Current subband antenna selection /// Current subband antenna selection
uint32_t antenna_alloc; uint32_t antenna_alloc;
+28 -11
View File
@@ -38,6 +38,7 @@
#include "SIMULATION/TOOLS/defs.h" #include "SIMULATION/TOOLS/defs.h"
//#define DEBUG_DLSCH_DECODING //#define DEBUG_DLSCH_DECODING
extern double cpuf;
void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch) void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
{ {
@@ -270,7 +271,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
return(max_turbo_iterations); return(max_turbo_iterations);
}*/ }*/
/*harq_pid = dlsch->current_harq_pid; /*harq_pid = dlsch->current_harq_pid[subframe&0x1];
if (harq_pid >= 8) { if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid); printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_turbo_iterations); return(max_turbo_iterations);
@@ -341,6 +342,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
printf("Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->Kplus); printf("Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->Kplus);
#endif #endif
opp_enabled=1;
for (r=0; r<harq_process->C; r++) { for (r=0; r<harq_process->C; r++) {
@@ -376,7 +379,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
(r==0) ? harq_process->F : 0); (r==0) ? harq_process->F : 0);
#ifdef DEBUG_DLSCH_DECODING #ifdef DEBUG_DLSCH_DECODING
LOG_I(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
harq_pid,r, G, harq_pid,r, G,
Kr*3, Kr*3,
harq_process->TBS, harq_process->TBS,
@@ -459,6 +462,10 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
#if 1 #if 1
if (err_flag == 0) { if (err_flag == 0) {
LOG_D(PHY, "turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,
harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_turbo_iterations);
if (llr8_flag) { if (llr8_flag) {
AssertFatal (Kr >= 256, "turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n", AssertFatal (Kr >= 256, "turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round); Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
@@ -605,6 +612,13 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
stop_meas(dlsch_turbo_decoding_stats); stop_meas(dlsch_turbo_decoding_stats);
/*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f \n",
harq_process->C,
r,
dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0),
dlsch_deinterleaving_stats->p_time/(cpuf*1000.0),
dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/
} }
} }
} }
@@ -636,25 +650,28 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
harq_process->round++; harq_process->round++;
if(is_crnti)
{
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS);
}
// printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round); // printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
if (harq_process->round >= dlsch->Mdlharq) { if (harq_process->round >= dlsch->Mdlharq) {
harq_process->status = SCH_IDLE; harq_process->status = SCH_IDLE;
harq_process->round = 0;
}
if(is_crnti)
{
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
} }
return((1+dlsch->max_turbo_iterations)); return((1+dlsch->max_turbo_iterations));
} else { } else {
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, round %d, subframe %d)\n",
phy_vars_ue->Mod_id, frame_rx_prev, subframe_rx_prev, harq_pid, harq_process->round, subframe);
harq_process->status = SCH_IDLE; harq_process->status = SCH_IDLE;
harq_process->round = 0; harq_process->round = 0;
dlsch->harq_ack[subframe].ack = 1; dlsch->harq_ack[subframe].ack = 1;
dlsch->harq_ack[subframe].harq_id = harq_pid; dlsch->harq_ack[subframe].harq_id = harq_pid;
dlsch->harq_ack[subframe].send_harq_status = 1; dlsch->harq_ack[subframe].send_harq_status = 1;
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, pid status %d, round %d, subframe %d)\n",
phy_vars_ue->Mod_id, frame_rx_prev, subframe_rx_prev, harq_pid, harq_process->status, harq_process->round, subframe);
if(is_crnti) if(is_crnti)
{ {
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS); LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS);
@@ -908,7 +925,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
break; break;
case PDSCH: // TB0 case PDSCH: // TB0
dlsch_ue = phy_vars_ue->dlsch[eNB_id][0]; dlsch_ue = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0];
harq_pid = dlsch_ue->current_harq_pid; harq_pid = dlsch_ue->current_harq_pid;
ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->pdcch_vars[(uint32_t)eNB_id]->crnti,PHY_vars_eNB_g[eNB_id2][CC_id]); ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->pdcch_vars[(uint32_t)eNB_id]->crnti,PHY_vars_eNB_g[eNB_id2][CC_id]);
DevAssert( ue_id != (uint32_t)-1 ); DevAssert( ue_id != (uint32_t)-1 );
@@ -954,7 +971,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
break; break;
case PDSCH1: { // TB1 case PDSCH1: { // TB1
dlsch_ue = phy_vars_ue->dlsch[eNB_id][1]; dlsch_ue = phy_vars_ue->dlsch[subframe&0x1][eNB_id][1];
harq_pid = dlsch_ue->current_harq_pid; harq_pid = dlsch_ue->current_harq_pid;
int8_t UE_id = find_ue( phy_vars_ue->pdcch_vars[eNB_id]->crnti, PHY_vars_eNB_g[eNB_id2][CC_id] ); int8_t UE_id = find_ue( phy_vars_ue->pdcch_vars[eNB_id]->crnti, PHY_vars_eNB_g[eNB_id2][CC_id] );
DevAssert( UE_id != -1 ); DevAssert( UE_id != -1 );
@@ -1008,7 +1025,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
break; break;
default: default:
dlsch_ue = phy_vars_ue->dlsch[eNB_id][0]; dlsch_ue = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0];
LOG_E(PHY,"dlsch_decoding_emul: FATAL, unknown DLSCH_id %d\n",dlsch_id); LOG_E(PHY,"dlsch_decoding_emul: FATAL, unknown DLSCH_id %d\n",dlsch_id);
dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations; dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations;
return(1+dlsch_ue->max_turbo_iterations); return(1+dlsch_ue->max_turbo_iterations);
+100 -33
View File
@@ -42,6 +42,12 @@
#define NOCYGWIN_STATIC #define NOCYGWIN_STATIC
#endif #endif
/* dynamic shift for LLR computation for TM3/4
* set as command line argument, see lte-softmodem.c
* default value: 0
*/
int16_t dlsch_demod_shift = 0;
//#define DEBUG_HARQ //#define DEBUG_HARQ
//#undef LOG_D //#undef LOG_D
@@ -138,16 +144,18 @@ int rx_pdsch(PHY_VARS_UE *ue,
case PDSCH: case PDSCH:
pdsch_vars = &ue->pdsch_vars[subframe&0x1][eNB_id]; pdsch_vars = &ue->pdsch_vars[subframe&0x1][eNB_id];
dlsch = ue->dlsch[eNB_id]; dlsch = ue->dlsch[subframe&0x1][eNB_id];
LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n",
frame,subframe,symbol,harq_pid,
dlsch[0]->harq_processes[harq_pid]->status,
dlsch[1]->harq_processes[harq_pid]->status);
if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) && if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) &&
(dlsch[1]->harq_processes[harq_pid]->status == ACTIVE)){ (dlsch[1]->harq_processes[harq_pid]->status == ACTIVE)){
codeword_TB0 = dlsch[0]->harq_processes[harq_pid]->codeword; codeword_TB0 = dlsch[0]->harq_processes[harq_pid]->codeword;
codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword; codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword;
dlsch0_harq = dlsch[codeword_TB0]->harq_processes[harq_pid]; dlsch0_harq = dlsch[codeword_TB0]->harq_processes[harq_pid];
dlsch1_harq = dlsch[codeword_TB1]->harq_processes[harq_pid]; dlsch1_harq = dlsch[codeword_TB1]->harq_processes[harq_pid];
#ifdef DEBUG_HARQ
printf("I am assuming both CW active\n");
#endif
} }
else if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) && else if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) &&
(dlsch[1]->harq_processes[harq_pid]->status != ACTIVE) ) { (dlsch[1]->harq_processes[harq_pid]->status != ACTIVE) ) {
@@ -159,8 +167,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
else if ((dlsch[0]->harq_processes[harq_pid]->status != ACTIVE) && else if ((dlsch[0]->harq_processes[harq_pid]->status != ACTIVE) &&
(dlsch[1]->harq_processes[harq_pid]->status == ACTIVE) ){ (dlsch[1]->harq_processes[harq_pid]->status == ACTIVE) ){
codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword; codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword;
dlsch0_harq = dlsch[1]->harq_processes[harq_pid]; dlsch0_harq = dlsch[1]->harq_processes[harq_pid];
dlsch1_harq = NULL; dlsch1_harq = NULL;
codeword_TB0 = -1; codeword_TB0 = -1;
} }
else { else {
@@ -336,7 +344,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n"); LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n");
} }
// printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id); //printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id);
if (nb_rb==0) { if (nb_rb==0) {
LOG_D(PHY,"dlsch_demodulation.c: nb_rb=0\n"); LOG_D(PHY,"dlsch_demodulation.c: nb_rb=0\n");
return(-1); return(-1);
@@ -357,12 +365,18 @@ int rx_pdsch(PHY_VARS_UE *ue,
symbol, symbol,
nb_rb); nb_rb);
if ((dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) && (rx_type==rx_IC_single_stream) && (eNB_id_i==ue->n_connected_eNB) && (dlsch0_harq->dl_power_off==0)) // TM5 two-user if ((dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) &&
(rx_type==rx_IC_single_stream) &&
(eNB_id_i==ue->n_connected_eNB) &&
(dlsch0_harq->dl_power_off==0)
) // TM5 two-user
{
dlsch_scale_channel(pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch_scale_channel(pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
frame_parms, frame_parms,
dlsch, dlsch,
symbol, symbol,
nb_rb); nb_rb);
}
if (first_symbol_flag==1) { if (first_symbol_flag==1) {
if (beamforming_mode==0){ if (beamforming_mode==0){
@@ -392,21 +406,23 @@ int rx_pdsch(PHY_VARS_UE *ue,
nb_rb, nb_rb,
dlsch0_harq->mimo_mode); dlsch0_harq->mimo_mode);
LOG_D(PHY,"Channel Level TM34 avg_0 %d, avg_1 %d, rx_type %d, rx_standard %d, interf_unaw_shift %d \n", avg_0[0],
avg_1[0], rx_type, rx_standard, interf_unaw_shift);
if (rx_type>rx_standard) { if (rx_type>rx_standard) {
avg_0[0] = (log2_approx(avg_0[0])/2) -13 + interf_unaw_shift; avg_0[0] = (log2_approx(avg_0[0])/2) + dlsch_demod_shift;// + 2 ;//+ 4;
avg_1[0] = (log2_approx(avg_1[0])/2) -13 + interf_unaw_shift; avg_1[0] = (log2_approx(avg_1[0])/2) + dlsch_demod_shift;// + 2 ;//+ 4;
pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0); pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0);
pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0); pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0);
//printf("TM4 I-A log2_maxh0 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh0); //printf("TM4 I-A log2_maxh0 = %d\n", pdsch_vars[eNB_id]->log2_maxh0);
//printf("TM4 I-A log2_maxh1 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh1); //printf("TM4 I-A log2_maxh1 = %d\n", pdsch_vars[eNB_id]->log2_maxh1);
} }
else { else {
avg_0[0] = (log2_approx(avg_0[0])/2) - 13 + interf_unaw_shift; avg_0[0] = (log2_approx(avg_0[0])/2) - 13 + interf_unaw_shift;
avg_1[0] = (log2_approx(avg_1[0])/2) - 13 + interf_unaw_shift; avg_1[0] = (log2_approx(avg_1[0])/2) - 13 + interf_unaw_shift;
pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0); pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0);
pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0); pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0);
//printf("TM4 I-UA log2_maxh0 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh0); //printf("TM4 I-UA log2_maxh0 = %d\n", pdsch_vars[eNB_id]->log2_maxh0);
//printf("TM4 I-UA log2_maxh1 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh1); //printf("TM4 I-UA log2_maxh1 = %d\n", pdsch_vars[eNB_id]->log2_maxh1);
} }
} }
else if (dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding (TM5, TM6) else if (dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding (TM5, TM6)
@@ -448,8 +464,11 @@ int rx_pdsch(PHY_VARS_UE *ue,
symbol, symbol,
nb_rb); nb_rb);
#ifdef DEBUG_PHY #ifdef DEBUG_PHY
LOG_D(PHY,"[DLSCH] log2_maxh = %d (%d,%d)\n",pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs); LOG_I(PHY,"[DLSCH] log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",pdsch_vars[eNB_id]->log2_maxh,
LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode); pdsch_vars[eNB_id]->log2_maxh0,
pdsch_vars[eNB_id]->log2_maxh1,
avg[0],avgs);
LOG_I(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
#endif #endif
} }
@@ -1023,6 +1042,44 @@ int rx_pdsch(PHY_VARS_UE *ue,
} }
} }
// Please keep it: useful for debugging
#if 0
if( (symbol == 13) && (dlsch0_harq->mimo_mode == 2) )
{
LOG_E(PHY,"Dump Phy Chan Est \n");
if(subframe&0x1)
{
#if 1
//write_output("rxdataF0.m" , "rxdataF0", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("rxdataF1.m" , "rxdataF1", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("dl_ch_estimates00.m", "dl_ch_estimates00", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("dl_ch_estimates01.m", "dl_ch_estimates01", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("dl_ch_estimates10.m", "dl_ch_estimates10", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("dl_ch_estimates11.m", "dl_ch_estimates11", &common_vars->common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][0],14*frame_parms->ofdm_symbol_size,1,1);
//write_output("rxdataF_ext00.m" , "rxdataF_ext00", &pdsch_vars[eNB_id]->rxdataF_ext[0][0],14*frame_parms->N_RB_DL*12,1,1);
//write_output("rxdataF_ext01.m" , "rxdataF_ext01", &pdsch_vars[eNB_id]->rxdataF_ext[1][0],14*frame_parms->N_RB_DL*12,1,1);
//write_output("rxdataF_ext10.m" , "rxdataF_ext10", &pdsch_vars[eNB_id]->rxdataF_ext[2][0],14*frame_parms->N_RB_DL*12,1,1);
//write_output("rxdataF_ext11.m" , "rxdataF_ext11", &pdsch_vars[eNB_id]->rxdataF_ext[3][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext00.m", "dl_ch_estimates_ext00", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext01.m", "dl_ch_estimates_ext01", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[1][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext10.m", "dl_ch_estimates_ext10", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[2][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("dl_ch_estimates_ext11.m", "dl_ch_estimates_ext11", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[3][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp00.m","rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp01.m","rxdataF_comp01", &pdsch_vars[eNB_id]->rxdataF_comp0[1][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp10.m","rxdataF_comp10", &pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][0][0],14*frame_parms->N_RB_DL*12,1,1);
write_output("rxdataF_comp11.m","rxdataF_comp11", &pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][1][0],14*frame_parms->N_RB_DL*12,1,1);
#endif
write_output("llr0.m","llr0", &pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
write_output("llr1.m","llr1", &pdsch_vars[eNB_id]->llr[1][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
AssertFatal(0," ");
}
}
#endif
#if T_TRACER #if T_TRACER
T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(ue->Mod_id), T_INT(frame%1024), T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(ue->Mod_id), T_INT(frame%1024),
@@ -1609,9 +1666,7 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
__m128i tmp0,tmp1; __m128i tmp0,tmp1;
// sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b, //_mm_mulhi_epi16
//so divide by 2 is replaced by divide by sqrt(2).
// print_shorts("prec2A_TM3 ch0 (before):",ch0); // print_shorts("prec2A_TM3 ch0 (before):",ch0);
// print_shorts("prec2A_TM3 ch1 (before):",ch1); // print_shorts("prec2A_TM3 ch1 (before):",ch1);
@@ -1622,17 +1677,22 @@ void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
ch0[0] = _mm_adds_epi16(ch0[0],tmp1); ch0[0] = _mm_adds_epi16(ch0[0],tmp1);
ch1[0] = _mm_subs_epi16(tmp0,tmp1); ch1[0] = _mm_subs_epi16(tmp0,tmp1);
ch0[0] = _mm_mulhi_epi16(ch0[0],amp);
ch0[0] = _mm_slli_epi16(ch0[0],1);
ch1[0] = _mm_mulhi_epi16(ch1[0],amp);
ch1[0] = _mm_slli_epi16(ch1[0],1);
// print_shorts("prec2A_TM3 ch0 (mid):",&tmp0); // print_shorts("prec2A_TM3 ch0 (mid):",&tmp0);
// print_shorts("prec2A_TM3 ch1 (mid):",ch1); // print_shorts("prec2A_TM3 ch1 (mid):",ch1);
ch0[0] = _mm_mulhi_epi16(ch0[0],amp); //ch0[0] = _mm_mulhi_epi16(ch0[0],amp);
ch0[0] = _mm_slli_epi16(ch0[0],1); //ch0[0] = _mm_slli_epi16(ch0[0],1);
ch1[0] = _mm_mulhi_epi16(ch1[0],amp); //ch1[0] = _mm_mulhi_epi16(ch1[0],amp);
ch1[0] = _mm_slli_epi16(ch1[0],1); //ch1[0] = _mm_slli_epi16(ch1[0],1);
// ch0[0] = _mm_srai_epi16(ch0[0],1); //ch0[0] = _mm_srai_epi16(ch0[0],1);
// ch1[0] = _mm_srai_epi16(ch1[0],1); //ch1[0] = _mm_srai_epi16(ch1[0],1);
// print_shorts("prec2A_TM3 ch0 (after):",ch0); // print_shorts("prec2A_TM3 ch0 (after):",ch0);
// print_shorts("prec2A_TM3 ch1 (after):",ch1); // print_shorts("prec2A_TM3 ch1 (after):",ch1);
@@ -3301,7 +3361,7 @@ ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a));
//compute average channel_level on each (TX,RX) antenna pair //compute average channel_level on each (TX,RX) antenna pair
void dlsch_channel_level(int **dl_ch_estimates_ext, void dlsch_channel_level(int **dl_ch_estimates_ext,
LTE_DL_FRAME_PARMS *frame_parms, LTE_DL_FRAME_PARMS *frame_parms,
int *avg, int32_t *avg,
uint8_t symbol, uint8_t symbol,
unsigned short nb_rb) unsigned short nb_rb)
{ {
@@ -3310,10 +3370,16 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
short rb; short rb;
unsigned char aatx,aarx,nre=12,symbol_mod; unsigned char aatx,aarx,nre=12,symbol_mod;
__m128i *dl_ch128, avg128D; __m128i *dl_ch128, avg128D, coeff128;
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
float one_over_nb_re = 0;
one_over_nb_re = 1/(nb_rb *12);
int16_t one_over_nb_re_q1_15 = (int16_t)(one_over_nb_re * (float)(1<<15) );
coeff128 = _mm_set_epi16(one_over_nb_re_q1_15,one_over_nb_re_q1_15,one_over_nb_re_q1_15,one_over_nb_re_q1_15,
one_over_nb_re_q1_15,one_over_nb_re_q1_15,one_over_nb_re_q1_15,one_over_nb_re_q1_15);
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++)
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
//clear average level //clear average level
@@ -3325,8 +3391,9 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
for (rb=0;rb<nb_rb;rb++) { for (rb=0;rb<nb_rb;rb++) {
// printf("rb %d : ",rb); // printf("rb %d : ",rb);
// print_shorts("ch",&dl_ch128[0]); // print_shorts("ch",&dl_ch128[0]);
avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[0],dl_ch128[0])); avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[0],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[0], coeff128),15)));
avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[1],dl_ch128[1])); avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[1],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[1], coeff128),15)));
if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) { if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) {
dl_ch128+=2; dl_ch128+=2;
} }
@@ -3350,10 +3417,10 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
else else
nre=12; nre=12;
avg[(aatx<<1)+aarx] = (((int*)&avg128D)[0] + avg[(aatx<<1)+aarx] =(((int32_t*)&avg128D)[0] +
((int*)&avg128D)[1] + ((int32_t*)&avg128D)[1] +
((int*)&avg128D)[2] + ((int32_t*)&avg128D)[2] +
((int*)&avg128D)[3])/(nb_rb*nre); ((int32_t*)&avg128D)[3]);
// printf("Channel level : %d\n",avg[(aatx<<1)+aarx]); // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
} }
@@ -8831,6 +8831,37 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
len = (nb_rb*12) - pbch_pss_sss_adjust; len = (nb_rb*12) - pbch_pss_sss_adjust;
} }
#ifdef __AVX2__
// Round length up to multiple of 16 words
uint32_t len256i = ((len+16)>>4)*16;
int32_t *rxF_256i = (int32_t*) malloc16_clear(len256i*4);
int32_t *rxF_i_256i = (int32_t*) malloc16_clear(len256i*4);
int32_t *ch_mag_256i = (int32_t*) malloc16_clear(len256i*4);
int32_t *ch_mag_i_256i = (int32_t*) malloc16_clear(len256i*4);
int32_t *rho_256i = (int32_t*) malloc16_clear(len256i*4);
memcpy(rxF_256i, rxF, len*4);
memcpy(rxF_i_256i, rxF_i, len*4);
memcpy(ch_mag_256i, ch_mag, len*4);
memcpy(ch_mag_i_256i, ch_mag_i, len*4);
memcpy(rho_256i, rho, len*4);
qam64_qam64_avx2((int32_t *)rxF_256i,
(int32_t *)rxF_i_256i,
(int32_t *)ch_mag_256i,
(int32_t *)ch_mag_i_256i,
(int16_t *)llr16,
(int32_t *) rho_256i,
len);
free16(rxF_256i, sizeof(rxF_256i));
free16(rxF_i_256i, sizeof(rxF_i_256i));
free16(ch_mag_256i, sizeof(ch_mag_256i));
free16(ch_mag_i_256i, sizeof(ch_mag_i_256i));
free16(rho_256i, sizeof(rho_256i));
#else
qam64_qam64((short *)rxF, qam64_qam64((short *)rxF,
(short *)rxF_i, (short *)rxF_i,
(short *)ch_mag, (short *)ch_mag,
@@ -8838,6 +8869,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
(short *)llr16, (short *)llr16,
(short *)rho, (short *)rho,
len); len);
#endif
llr16 += (6*len); llr16 += (6*len);
*llr16p = (short *)llr16; *llr16p = (short *)llr16;
File diff suppressed because it is too large Load Diff
+11 -11
View File
@@ -107,9 +107,9 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
len += sprintf(&buffer[len], "[UE PROC] Po_PUCCH = %d dBm (Po_NOMINAL_PUCCH %d dBm, g_pucch %d dB)\n", len += sprintf(&buffer[len], "[UE PROC] Po_PUCCH = %d dBm (Po_NOMINAL_PUCCH %d dBm, g_pucch %d dB)\n",
get_PL(ue->Mod_id,ue->CC_id,0)+ get_PL(ue->Mod_id,ue->CC_id,0)+
ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+
ue->dlsch[0][0]->g_pucch, ue->dlsch[0][0][0]->g_pucch,
ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
ue->dlsch[0][0]->g_pucch); ue->dlsch[0][0][0]->g_pucch);
} }
//for (eNB=0;eNB<NUMBER_OF_eNB_MAX;eNB++) { //for (eNB=0;eNB<NUMBER_OF_eNB_MAX;eNB++) {
for (eNB=0; eNB<1; eNB++) { for (eNB=0; eNB<1; eNB++) {
@@ -482,24 +482,24 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
len += sprintf(&buffer[len], "[UE PROC] Mode 6 Wideband CQI eNB %d : %d dB\n",eNB,ue->measurements.precoded_cqi_dB[eNB][0]); len += sprintf(&buffer[len], "[UE PROC] Mode 6 Wideband CQI eNB %d : %d dB\n",eNB,ue->measurements.precoded_cqi_dB[eNB][0]);
for (harq_pid=0;harq_pid<8;harq_pid++) { for (harq_pid=0;harq_pid<8;harq_pid++) {
len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 0 harq_pid %d, mcs %d:",eNB,harq_pid,ue->dlsch[0][0]->harq_processes[harq_pid]->mcs); len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 0 harq_pid %d, mcs %d:",eNB,harq_pid,ue->dlsch[0][0][0]->harq_processes[harq_pid]->mcs);
for (round=0;round<8;round++) for (round=0;round<8;round++)
len+=sprintf(&buffer[len],"%d/%d ", len+=sprintf(&buffer[len],"%d/%d ",
ue->dlsch[0][0]->harq_processes[harq_pid]->errors[round], ue->dlsch[0][0][0]->harq_processes[harq_pid]->errors[round],
ue->dlsch[0][0]->harq_processes[harq_pid]->trials[round]); ue->dlsch[0][0][0]->harq_processes[harq_pid]->trials[round]);
len+=sprintf(&buffer[len],"\n"); len+=sprintf(&buffer[len],"\n");
} }
if (ue->dlsch[0] && ue->dlsch[0][0] && ue->dlsch[0][1]) { if (ue->dlsch[0][0] && ue->dlsch[0][0][0] && ue->dlsch[0][0][1]) {
len += sprintf(&buffer[len], "[UE PROC] Saved PMI for DLSCH eNB %d : %jx (%p)\n",eNB,pmi2hex_2Ar1(ue->dlsch[0][0]->pmi_alloc),ue->dlsch[0][0]); len += sprintf(&buffer[len], "[UE PROC] Saved PMI for DLSCH eNB %d : %jx (%p)\n",eNB,pmi2hex_2Ar1(ue->dlsch[0][0][0]->pmi_alloc),ue->dlsch[0][0][0]);
len += sprintf(&buffer[len], "[UE PROC] eNB %d: dl_power_off = %d\n",eNB,ue->dlsch[0][0]->harq_processes[0]->dl_power_off); len += sprintf(&buffer[len], "[UE PROC] eNB %d: dl_power_off = %d\n",eNB,ue->dlsch[0][0][0]->harq_processes[0]->dl_power_off);
for (harq_pid=0;harq_pid<8;harq_pid++) { for (harq_pid=0;harq_pid<8;harq_pid++) {
len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 1 harq_pid %d, mcs %d:",eNB,harq_pid,ue->dlsch[0][1]->harq_processes[0]->mcs); len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 1 harq_pid %d, mcs %d:",eNB,harq_pid,ue->dlsch[0][0][1]->harq_processes[0]->mcs);
for (round=0;round<8;round++) for (round=0;round<8;round++)
len+=sprintf(&buffer[len],"%d/%d ", len+=sprintf(&buffer[len],"%d/%d ",
ue->dlsch[0][1]->harq_processes[harq_pid]->errors[round], ue->dlsch[0][0][1]->harq_processes[harq_pid]->errors[round],
ue->dlsch[0][1]->harq_processes[harq_pid]->trials[round]); ue->dlsch[0][0][1]->harq_processes[harq_pid]->trials[round]);
len+=sprintf(&buffer[len],"\n"); len+=sprintf(&buffer[len],"\n");
} }
} }
+32
View File
@@ -704,6 +704,22 @@ void qam64_qam16(short *stream0_in,
short *rho01, short *rho01,
int length); int length);
/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/16QAM reception.
@param stream0_in Input from channel compensated (MR combined) stream 0
@param stream1_in Input from channel compensated (MR combined) stream 1
@param ch_mag Input from scaled channel magnitude square of h0'*g0
@param ch_mag_i Input from scaled channel magnitude square of h0'*g1
@param stream0_out Output from LLR unit for stream0
@param rho01 Cross-correlation between channels (MR combined)
@param length in complex channel outputs*/
void qam64_qam16_avx2(short *stream0_in,
short *stream1_in,
short *ch_mag,
short *ch_mag_i,
short *stream0_out,
short *rho01,
int length);
/** \brief This function perform LLR computation for dual-stream (64QAM/16QAM) transmission. /** \brief This function perform LLR computation for dual-stream (64QAM/16QAM) transmission.
@param frame_parms Frame descriptor structure @param frame_parms Frame descriptor structure
@param rxdataF_comp Compensated channel output @param rxdataF_comp Compensated channel output
@@ -746,6 +762,22 @@ void qam64_qam64(short *stream0_in,
short *rho01, short *rho01,
int length); int length);
/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/64QAM reception.
@param stream0_in Input from channel compensated (MR combined) stream 0
@param stream1_in Input from channel compensated (MR combined) stream 1
@param ch_mag Input from scaled channel magnitude square of h0'*g0
@param ch_mag_i Input from scaled channel magnitude square of h0'*g1
@param stream0_out Output from LLR unit for stream0
@param rho01 Cross-correlation between channels (MR combined)
@param length in complex channel outputs*/
void qam64_qam64_avx2(int32_t *stream0_in,
int32_t *stream1_in,
int32_t *ch_mag,
int32_t *ch_mag_i,
int16_t *stream0_out,
int32_t *rho01,
int length);
/** \brief This function perform LLR computation for dual-stream (64QAM/64QAM) transmission. /** \brief This function perform LLR computation for dual-stream (64QAM/64QAM) transmission.
@param frame_parms Frame descriptor structure @param frame_parms Frame descriptor structure
@param rxdataF_comp Compensated channel output @param rxdataF_comp Compensated channel output
+2 -2
View File
@@ -233,7 +233,7 @@ uint32_t ulsch_encoding(uint8_t *a,
LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
PHY_MEASUREMENTS *meas = &ue->measurements; PHY_MEASUREMENTS *meas = &ue->measurements;
LTE_UE_ULSCH_t *ulsch=ue->ulsch[eNB_id]; LTE_UE_ULSCH_t *ulsch=ue->ulsch[eNB_id];
LTE_UE_DLSCH_t **dlsch = ue->dlsch[eNB_id]; LTE_UE_DLSCH_t **dlsch = ue->dlsch[0][eNB_id];
uint16_t rnti = 0xffff; uint16_t rnti = 0xffff;
if (!ulsch) { if (!ulsch) {
@@ -966,7 +966,7 @@ int ulsch_encoding_emul(uint8_t *ulsch_buffer,
{ {
LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
LTE_UE_DLSCH_t **dlsch = ue->dlsch[eNB_id]; LTE_UE_DLSCH_t **dlsch = ue->dlsch[0][eNB_id];
PHY_MEASUREMENTS *meas = &ue->measurements; PHY_MEASUREMENTS *meas = &ue->measurements;
uint8_t tmode = ue->transmission_mode[eNB_id]; uint8_t tmode = ue->transmission_mode[eNB_id];
uint16_t rnti=ue->pdcch_vars[eNB_id]->crnti; uint16_t rnti=ue->pdcch_vars[eNB_id]->crnti;
+1 -1
View File
@@ -2066,7 +2066,7 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc,
// get local ue's ack // get local ue's ack
if ((UE_index >= oai_emulation.info.first_ue_local) ||(UE_index <(oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local))) { if ((UE_index >= oai_emulation.info.first_ue_local) ||(UE_index <(oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local))) {
get_ack(&eNB->frame_parms, get_ack(&eNB->frame_parms,
PHY_vars_UE_g[UE_id][CC_id]->dlsch[0][0]->harq_ack, PHY_vars_UE_g[UE_id][CC_id]->dlsch[0][0][0]->harq_ack,
subframe, subframe,
eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK,0); eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK,0);
} else { // get remote UEs' ack } else { // get remote UEs' ack
+1
View File
@@ -7,6 +7,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_coding.o
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_modulation.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_modulation.o
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_demodulation.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_demodulation.o
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_llr_computation.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_llr_computation.o
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.o
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/power_control.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/power_control.o
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_decoding.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_decoding.o
PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_scrambling.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_scrambling.o
+8 -8
View File
@@ -510,16 +510,16 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0; int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) { if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]!=NULL) {
harq_pid = phy_vars_ue->dlsch[eNB_id][0]->current_harq_pid; harq_pid = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid;
if (harq_pid>=8) if (harq_pid>=8)
return; return;
mcs = phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs; mcs = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->mcs;
// Button 0 // Button 0
if(!phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { if(!phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
// we are in TM5 // we are in TM5
fl_show_object(form->button_0); fl_show_object(form->button_0);
} }
@@ -530,12 +530,12 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
} }
// coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) { if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]!=NULL) {
coded_bits_per_codeword = get_G(frame_parms, coded_bits_per_codeword = get_G(frame_parms,
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb, phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
get_Qm(mcs), get_Qm(mcs),
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl, phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->Nl,
num_pdcch_symbols, num_pdcch_symbols,
frame, frame,
subframe, subframe,
+14 -14
View File
@@ -448,11 +448,11 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
int mcs1=0; int mcs1=0;
unsigned char harq_pid = 0; unsigned char harq_pid = 0;
int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0; int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) { if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]!=NULL) {
harq_pid = phy_vars_ue->dlsch[eNB_id][0]->current_harq_pid; harq_pid = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid;
if (harq_pid>=8) if (harq_pid>=8)
return; return;
mcs0 = phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs; mcs0 = phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->mcs;
// Button 0 // Button 0
/* /*
if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
@@ -461,23 +461,23 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
} }
*/ */
} }
if (phy_vars_ue->dlsch[eNB_id][1]!=NULL) { if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]!=NULL) {
harq_pid = phy_vars_ue->dlsch[eNB_id][1]->current_harq_pid; harq_pid = phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->current_harq_pid;
if (harq_pid>=8) if (harq_pid>=8)
return; return;
mcs1 = phy_vars_ue->dlsch[eNB_id][1]->harq_processes[harq_pid]->mcs; mcs1 = phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->harq_processes[harq_pid]->mcs;
} }
if (phy_vars_ue->pdcch_vars[eNB_id]!=NULL) { if (phy_vars_ue->pdcch_vars[eNB_id]!=NULL) {
num_pdcch_symbols = phy_vars_ue->pdcch_vars[eNB_id]->num_pdcch_symbols; num_pdcch_symbols = phy_vars_ue->pdcch_vars[eNB_id]->num_pdcch_symbols;
} }
// coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) { if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]!=NULL) {
mod0 = get_Qm(mcs0); mod0 = get_Qm(mcs0);
coded_bits_per_codeword0 = get_G(frame_parms, coded_bits_per_codeword0 = get_G(frame_parms,
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb, phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
get_Qm(mcs0), get_Qm(mcs0),
phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl, phy_vars_ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->Nl,
num_pdcch_symbols, num_pdcch_symbols,
frame, frame,
subframe, subframe,
@@ -486,13 +486,13 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
coded_bits_per_codeword0 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); coded_bits_per_codeword0 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
mod0=0; mod0=0;
} }
if (phy_vars_ue->dlsch[eNB_id][1]!=NULL) { if (phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]!=NULL) {
mod1 = get_Qm(mcs1); mod1 = get_Qm(mcs1);
coded_bits_per_codeword1 = get_G(frame_parms, coded_bits_per_codeword1 = get_G(frame_parms,
phy_vars_ue->dlsch[eNB_id][1]->harq_processes[harq_pid]->nb_rb, phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->harq_processes[harq_pid]->nb_rb,
phy_vars_ue->dlsch[eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even, phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even,
get_Qm(mcs1), get_Qm(mcs1),
phy_vars_ue->dlsch[eNB_id][1]->harq_processes[harq_pid]->Nl, phy_vars_ue->dlsch[subframe&0x1][eNB_id][1]->harq_processes[harq_pid]->Nl,
num_pdcch_symbols, num_pdcch_symbols,
frame, frame,
subframe, subframe,
+9 -3
View File
@@ -706,7 +706,7 @@ typedef struct {
LTE_DL_FRAME_PARMS frame_parms_before_ho; LTE_DL_FRAME_PARMS frame_parms_before_ho;
LTE_UE_COMMON common_vars; LTE_UE_COMMON common_vars;
LTE_UE_PDSCH *pdsch_vars[2][NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars[2][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
@@ -715,7 +715,7 @@ typedef struct {
LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
LTE_UE_PDCCH *pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_PDCCH *pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
LTE_UE_DLSCH_t *dlsch[NUMBER_OF_CONNECTED_eNB_MAX][2]; LTE_UE_DLSCH_t *dlsch[2][NUMBER_OF_CONNECTED_eNB_MAX][2]; // two RxTx Threads
LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX];
LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX];
LTE_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX];
@@ -802,6 +802,8 @@ typedef struct {
uint8_t prach_cnt; uint8_t prach_cnt;
uint8_t prach_PreambleIndex; uint8_t prach_PreambleIndex;
// uint8_t prach_timer; // uint8_t prach_timer;
uint8_t decode_SIB;
uint8_t decode_MIB;
int rx_offset; /// Timing offset int rx_offset; /// Timing offset
int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
int timing_advance; ///timing advance signalled from eNB int timing_advance; ///timing advance signalled from eNB
@@ -872,7 +874,7 @@ typedef struct {
time_stats_t phy_proc; time_stats_t phy_proc;
time_stats_t phy_proc_tx; time_stats_t phy_proc_tx;
time_stats_t phy_proc_rx; time_stats_t phy_proc_rx[2];
uint32_t use_ia_receiver; uint32_t use_ia_receiver;
@@ -885,6 +887,10 @@ typedef struct {
time_stats_t ulsch_interleaving_stats; time_stats_t ulsch_interleaving_stats;
time_stats_t ulsch_multiplexing_stats; time_stats_t ulsch_multiplexing_stats;
time_stats_t generic_stat;
time_stats_t pdsch_procedures_stat;
time_stats_t dlsch_procedures_stat;
time_stats_t ofdm_demod_stats; time_stats_t ofdm_demod_stats;
time_stats_t dlsch_rx_pdcch_stats; time_stats_t dlsch_rx_pdcch_stats;
time_stats_t rx_dft_stats; time_stats_t rx_dft_stats;
+268 -102
View File
@@ -75,6 +75,7 @@ fifo_dump_emos_UE emos_dump_UE;
extern int oai_exit; extern int oai_exit;
extern double cpuf;
@@ -90,10 +91,10 @@ void dump_dlsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subf
uint8_t nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12; uint8_t nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12;
coded_bits_per_codeword = get_G(&ue->frame_parms, coded_bits_per_codeword = get_G(&ue->frame_parms,
ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb, ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm, ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->Qm,
ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl, ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[harq_pid]->Nl,
ue->pdcch_vars[eNB_id]->num_pdcch_symbols, ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
proc->frame_rx, proc->frame_rx,
subframe, subframe,
@@ -268,37 +269,39 @@ void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
uint8_t i,j,k,s; uint8_t i,j,k,s;
PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
//[NUMBER_OF_CONNECTED_eNB_MAX][2]; //[NUMBER_OF_RX_THREAD=2][NUMBER_OF_CONNECTED_eNB_MAX][2];
for(i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) { for(int l=0; l<2; l++) {
for(j=0; j<2; j++) { for(i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) {
//DL HARQ for(j=0; j<2; j++) {
if(ue->dlsch[i][j]) { //DL HARQ
for(k=0; k<NUMBER_OF_HARQ_PID_MAX && ue->dlsch[i][j]->harq_processes[k]; k++) { if(ue->dlsch[l][i][j]) {
ue->dlsch[i][j]->harq_processes[k]->status = SCH_IDLE; for(k=0; k<NUMBER_OF_HARQ_PID_MAX && ue->dlsch[l][i][j]->harq_processes[k]; k++) {
for (s=0; s<10; s++) { ue->dlsch[l][i][j]->harq_processes[k]->status = SCH_IDLE;
// reset ACK/NACK bit to DTX for all subframes s = 0..9 for (s=0; s<10; s++) {
ue->dlsch[i][j]->harq_ack[s].ack = 2; // reset ACK/NACK bit to DTX for all subframes s = 0..9
ue->dlsch[i][j]->harq_ack[s].send_harq_status = 0; ue->dlsch[l][i][j]->harq_ack[s].ack = 2;
ue->dlsch[i][j]->harq_ack[s].vDAI_UL = 0xff; ue->dlsch[l][i][j]->harq_ack[s].send_harq_status = 0;
ue->dlsch[i][j]->harq_ack[s].vDAI_DL = 0xff; ue->dlsch[l][i][j]->harq_ack[s].vDAI_UL = 0xff;
ue->dlsch[l][i][j]->harq_ack[s].vDAI_DL = 0xff;
}
}
}
} }
}
}
}
//UL HARQ //UL HARQ
if(ue->ulsch[i]) { if(ue->ulsch[i]) {
for(k=0; k<NUMBER_OF_HARQ_PID_MAX && ue->ulsch[i]->harq_processes[k]; k++) { for(k=0; k<NUMBER_OF_HARQ_PID_MAX && ue->ulsch[i]->harq_processes[k]; k++) {
ue->ulsch[i]->harq_processes[k]->status = SCH_IDLE; ue->ulsch[i]->harq_processes[k]->status = SCH_IDLE;
//Set NDIs for all UL HARQs to 0 //Set NDIs for all UL HARQs to 0
// ue->ulsch[i]->harq_processes[k]->Ndi = 0; // ue->ulsch[i]->harq_processes[k]->Ndi = 0;
}
}
// flush Msg3 buffer
ue->ulsch_Msg3_active[i] = 0;
} }
}
// flush Msg3 buffer
ue->ulsch_Msg3_active[i] = 0;
} }
} }
@@ -327,7 +330,8 @@ void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
for (i=0; i<8; i++) { for (i=0; i<8; i++) {
if (PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]) { if (PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]) {
PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]->status=IDLE; PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]->status=IDLE;
PHY_vars_UE_g[Mod_id][CC_id]->dlsch[eNB_index][0]->harq_processes[i]->round=0; PHY_vars_UE_g[Mod_id][CC_id]->dlsch[0][eNB_index][0]->harq_processes[i]->round=0;
PHY_vars_UE_g[Mod_id][CC_id]->dlsch[1][eNB_index][0]->harq_processes[i]->round=0;
} }
} }
@@ -638,7 +642,7 @@ void ue_compute_srs_occasion(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id
uint8_t pucch_ack_payload[2]; uint8_t pucch_ack_payload[2];
if (get_ack(&ue->frame_parms, if (get_ack(&ue->frame_parms,
ue->dlsch[eNB_id][0]->harq_ack, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->harq_ack,
subframe_tx,pucch_ack_payload,0) > 0) subframe_tx,pucch_ack_payload,0) > 0)
{ {
is_sr_an_subframe = 1; is_sr_an_subframe = 1;
@@ -790,6 +794,7 @@ PUCCH_FMT_t get_pucch_format(lte_frame_type_t frame_type,
return pucch_format2; return pucch_format2;
} }
} }
return pucch_format1a;
} }
uint16_t get_n1_pucch(PHY_VARS_UE *ue, uint16_t get_n1_pucch(PHY_VARS_UE *ue,
UE_rxtx_proc_t *proc, UE_rxtx_proc_t *proc,
@@ -929,11 +934,11 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
// set ACK/NAK to values if not DTX // set ACK/NAK to values if not DTX
if (ue->dlsch[eNB_id][0]->harq_ack[(6+last_dl)%10].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed if (ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->harq_ack[(6+last_dl)%10].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed
harq_ack1 = ue->dlsch[eNB_id][0]->harq_ack[(6+last_dl)%10].ack; harq_ack1 = ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->harq_ack[(6+last_dl)%10].ack;
if (ue->dlsch[eNB_id][0]->harq_ack[5+last_dl].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed if (ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->harq_ack[5+last_dl].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed
harq_ack0 = ue->dlsch[eNB_id][0]->harq_ack[5+last_dl].ack; harq_ack0 = ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->harq_ack[5+last_dl].ack;
if (harq_ack1!=2) { // n-6 // subframe 6,8,0 and maybe 5,7,9 is to be ACK/NAKed if (harq_ack1!=2) { // n-6 // subframe 6,8,0 and maybe 5,7,9 is to be ACK/NAKed
@@ -1336,7 +1341,8 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
uint8_t ulsch_input_buffer[5477] __attribute__ ((aligned(32))); uint8_t ulsch_input_buffer[5477] __attribute__ ((aligned(32)));
uint8_t access_mode; uint8_t access_mode;
uint8_t Nbundled=0; uint8_t Nbundled=0;
uint8_t ack_status=0; uint8_t ack_status_cw0=0;
uint8_t ack_status_cw1=0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC,VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC,VCD_FUNCTION_IN);
@@ -1437,11 +1443,16 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0;
} }
ack_status = reset_ack(&ue->frame_parms, ack_status_cw0 = reset_ack(&ue->frame_parms,
ue->dlsch[eNB_id][0]->harq_ack, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->harq_ack,
subframe_tx, subframe_tx,
ue->ulsch[eNB_id]->o_ACK,0); ue->ulsch[eNB_id]->o_ACK,0);
Nbundled = ack_status; ack_status_cw1 = reset_ack(&ue->frame_parms,
ue->dlsch[proc->subframe_rx&0x1][eNB_id][1]->harq_ack,
subframe_tx,
ue->ulsch[eNB_id]->o_ACK,1);
Nbundled = ack_status_cw0;
first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb; first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb;
nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb;
@@ -1449,24 +1460,24 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
if (ack_status > 0) { if (ack_status_cw0 > 0) {
// check if we received a PDSCH at subframe_tx - 4 // check if we received a PDSCH at subframe_tx - 4
// ==> send ACK/NACK on PUSCH // ==> send ACK/NACK on PUSCH
ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK = 1; ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK = ack_status_cw0 + ack_status_cw1;
#if T_TRACER #if T_TRACER
if(ue->ulsch[eNB_id]->o_ACK[0]) if(ue->ulsch[eNB_id]->o_ACK[0])
{ {
LOG_I(PHY,"PUSCH ACK\n"); LOG_I(PHY,"PUSCH ACK\n");
T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(Mod_id), T_INT(ue->dlsch[eNB_id][0]->rnti), T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(Mod_id), T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti),
T_INT(ue->dlsch[eNB_id][0]->current_harq_pid)); T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->current_harq_pid));
} }
else else
{ {
LOG_I(PHY,"PUSCH NACK\n"); LOG_I(PHY,"PUSCH NACK\n");
T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(Mod_id), T_INT(ue->dlsch[eNB_id][0]->rnti), T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(Mod_id), T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti),
T_INT(ue->dlsch[eNB_id][0]->current_harq_pid)); T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->current_harq_pid));
} }
#endif #endif
@@ -1530,6 +1541,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
mac_xface->macphy_exit("Error in ulsch_coding"); mac_xface->macphy_exit("Error in ulsch_coding");
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
stop_meas(&ue->phy_proc_tx); stop_meas(&ue->phy_proc_tx);
//printf("------FULL TX PROC : %5.2f ------\n",ue->phy_proc_tx.p_time/(cpuf*1000.0));
return; return;
} }
} }
@@ -1770,13 +1782,13 @@ void get_pucch_param(PHY_VARS_UE *ue,
{ {
pucch_resource[0] = get_n1_pucch(ue, pucch_resource[0] = get_n1_pucch(ue,
proc, proc,
ue->dlsch[eNB_id][0]->harq_ack, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->harq_ack,
eNB_id, eNB_id,
ack_payload, ack_payload,
SR); SR);
pucch_payload[0] = ack_payload[0]; pucch_payload[0] = ack_payload[0];
//pucch_payload[1] = ack_payload[1]; pucch_payload[1] = ack_payload[1];
pucch_payload[1] = 1; //pucch_payload[1] = 1;
} }
break; break;
@@ -1785,7 +1797,7 @@ void get_pucch_param(PHY_VARS_UE *ue,
pucch_resource[0] = ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex; pucch_resource[0] = ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex;
if(cqi_report) if(cqi_report)
{ {
pucch_payload[0] = get_pucch2_cqi(ue,eNB_id,plength); pucch_payload[0] = get_pucch2_cqi(ue,eNB_id,(int*)plength);
} }
else else
{ {
@@ -1806,14 +1818,12 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
uint8_t pucch_ack_payload[2]; uint8_t pucch_ack_payload[2];
uint8_t n1_pucch,n2_pucch; uint8_t n2_pucch;
uint16_t pucch_resource; uint16_t pucch_resource;
ANFBmode_t bundling_flag; ANFBmode_t bundling_flag;
PUCCH_FMT_t format; PUCCH_FMT_t format;
uint8_t SR_payload; uint8_t SR_payload;
uint16_t CQI_payload;
uint16_t RI_payload;
uint8_t pucch_payload[2]; uint8_t pucch_payload[2];
uint16_t len; uint16_t len;
@@ -1824,13 +1834,11 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
int CC_id = ue->CC_id; int CC_id = ue->CC_id;
int tx_amp; int tx_amp;
int16_t Po_PUCCH; int16_t Po_PUCCH;
uint8_t ack_status=0;
uint8_t ack_status_cw0=0; uint8_t ack_status_cw0=0;
uint8_t ack_status_cw1=0; uint8_t ack_status_cw1=0;
uint8_t nb_cw=0; uint8_t nb_cw=0;
uint8_t cqi_status=0; uint8_t cqi_status=0;
uint8_t ri_status=0; uint8_t ri_status=0;
uint8_t ack_sr_generated = 0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PUCCH,VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PUCCH,VCD_FUNCTION_IN);
@@ -1891,13 +1899,13 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
} }
ack_status_cw0 = reset_ack(&ue->frame_parms, ack_status_cw0 = reset_ack(&ue->frame_parms,
ue->dlsch[eNB_id][0]->harq_ack, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->harq_ack,
subframe_tx, subframe_tx,
pucch_ack_payload, pucch_ack_payload,
0); 0);
ack_status_cw1 = reset_ack(&ue->frame_parms, ack_status_cw1 = reset_ack(&ue->frame_parms,
ue->dlsch[eNB_id][1]->harq_ack, ue->dlsch[proc->subframe_rx&0x1][eNB_id][1]->harq_ack,
subframe_tx, subframe_tx,
pucch_ack_payload, pucch_ack_payload,
1); 1);
@@ -1936,11 +1944,11 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
SR_payload, SR_payload,
cqi_status, cqi_status,
&pucch_resource, &pucch_resource,
&pucch_payload, (uint8_t *)&pucch_payload,
&len); &len);
LOG_D(PHY,"PUCCH feedback AbsSubframe %d.%d SR %d NbCW %d AckNack %d.%d CQI %d RI %d format %d pucch_resource %d pucch_payload %d %d \n", LOG_D(PHY,"PUCCH feedback AbsSubframe %d.%d SR %d NbCW %d AckNack %d.%d CQI %d RI %d format %d pucch_resource %d pucch_payload %d %d \n",
frame_tx%1024, subframe_tx, SR_payload, nb_cw, pucch_ack_payload[0], pucch_ack_payload[1], cqi_status, ri_status, format, pucch_resource,pucch_payload[0],pucch_payload[1]); frame_tx%1024, subframe_tx, SR_payload, nb_cw, pucch_ack_payload[0], pucch_ack_payload[1], cqi_status, ri_status, format, pucch_resource,pucch_payload[0],pucch_payload[1]);
// Part - IV // Part - IV
@@ -1971,13 +1979,13 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
#endif #endif
#if T_TRACER #if T_TRACER
T(T_UE_PHY_PUCCH_TX_POWER, T_INT(eNB_id),T_INT(Mod_id), T_INT(frame_tx%1024), T_INT(subframe_tx),T_INT(ue->tx_power_dBm[subframe_tx]), T(T_UE_PHY_PUCCH_TX_POWER, T_INT(eNB_id),T_INT(Mod_id), T_INT(frame_tx%1024), T_INT(subframe_tx),T_INT(ue->tx_power_dBm[subframe_tx]),
T_INT(tx_amp),T_INT(ue->dlsch[eNB_id][0]->g_pucch),T_INT(get_PL(ue->Mod_id,ue->CC_id,eNB_id))); T_INT(tx_amp),T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->g_pucch),T_INT(get_PL(ue->Mod_id,ue->CC_id,eNB_id)));
#endif #endif
if(format == pucch_format1) if(format == pucch_format1)
{ {
LOG_D(PHY,"[UE %d][SR %x] AbsSubframe %d.%d Generating PUCCH 1 (SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH %d\n", LOG_D(PHY,"[UE %d][SR %x] AbsSubframe %d.%d Generating PUCCH 1 (SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH %d\n",
Mod_id, Mod_id,
ue->dlsch[eNB_id][0]->rnti, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti,
frame_tx, subframe_tx, frame_tx, subframe_tx,
frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission, frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission,
isShortenPucch, isShortenPucch,
@@ -1989,7 +1997,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
if (SR_payload>0) { if (SR_payload>0) {
LOG_D(PHY,"[UE %d][SR %x] AbsSubFrame %d.%d Generating PUCCH %s payload %d,%d (with SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH %d, amp %d\n", LOG_D(PHY,"[UE %d][SR %x] AbsSubFrame %d.%d Generating PUCCH %s payload %d,%d (with SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH %d, amp %d\n",
Mod_id, Mod_id,
ue->dlsch[eNB_id][0]->rnti, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti,
frame_tx % 1024, subframe_tx, frame_tx % 1024, subframe_tx,
(format == pucch_format1a? "1a": ( (format == pucch_format1a? "1a": (
format == pucch_format1b? "1b" : "??")), format == pucch_format1b? "1b" : "??")),
@@ -2002,7 +2010,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
} else { } else {
LOG_D(PHY,"[UE %d][PDSCH %x] AbsSubFrame %d.%d rx_offset_diff: %d, Generating PUCCH %s, an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n", LOG_D(PHY,"[UE %d][PDSCH %x] AbsSubFrame %d.%d rx_offset_diff: %d, Generating PUCCH %s, an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n",
Mod_id, Mod_id,
ue->dlsch[eNB_id][0]->rnti, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti,
frame_tx%1024, subframe_tx,ue->rx_offset_diff, frame_tx%1024, subframe_tx,ue->rx_offset_diff,
(format == pucch_format1a? "1a": ( (format == pucch_format1a? "1a": (
format == pucch_format1b? "1b" : "??")), format == pucch_format1b? "1b" : "??")),
@@ -2017,13 +2025,13 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
#if T_TRACER #if T_TRACER
if(pucch_payload[0]) if(pucch_payload[0])
{ {
T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(Mod_id), T_INT(ue->dlsch[eNB_id][0]->rnti), T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(Mod_id), T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti),
T_INT(ue->dlsch[eNB_id][0]->current_harq_pid)); T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->current_harq_pid));
} }
else else
{ {
T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(Mod_id), T_INT(ue->dlsch[eNB_id][0]->rnti), T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(Mod_id), T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti),
T_INT(ue->dlsch[eNB_id][0]->current_harq_pid)); T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->current_harq_pid));
} }
#endif #endif
@@ -2076,12 +2084,12 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
#endif #endif
#if T_TRACER #if T_TRACER
T(T_UE_PHY_PUCCH_TX_POWER, T_INT(eNB_id),T_INT(Mod_id), T_INT(frame_tx%1024), T_INT(subframe_tx),T_INT(ue->tx_power_dBm[subframe_tx]), T(T_UE_PHY_PUCCH_TX_POWER, T_INT(eNB_id),T_INT(Mod_id), T_INT(frame_tx%1024), T_INT(subframe_tx),T_INT(ue->tx_power_dBm[subframe_tx]),
T_INT(tx_amp),T_INT(ue->dlsch[eNB_id][0]->g_pucch),T_INT(get_PL(ue->Mod_id,ue->CC_id,eNB_id))); T_INT(tx_amp),T_INT(ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->g_pucch),T_INT(get_PL(ue->Mod_id,ue->CC_id,eNB_id)));
#endif #endif
LOG_D(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2 (RI or CQI), n2_pucch %d, Po_PUCCH %d, isShortenPucch %d, amp %d\n", LOG_D(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2 (RI or CQI), n2_pucch %d, Po_PUCCH %d, isShortenPucch %d, amp %d\n",
Mod_id, Mod_id,
ue->dlsch[eNB_id][0]->rnti, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti,
frame_tx%1024, subframe_tx, frame_tx%1024, subframe_tx,
n2_pucch, n2_pucch,
Po_PUCCH, Po_PUCCH,
@@ -2106,13 +2114,13 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
case pucch_format2a: case pucch_format2a:
LOG_I(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2a (RI or CQI) Ack/Nack 1bit \n", LOG_I(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2a (RI or CQI) Ack/Nack 1bit \n",
Mod_id, Mod_id,
ue->dlsch[eNB_id][0]->rnti, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti,
frame_tx%1024, subframe_tx); frame_tx%1024, subframe_tx);
break; break;
case pucch_format2b: case pucch_format2b:
LOG_I(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2b (RI or CQI) Ack/Nack 2bits\n", LOG_I(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2b (RI or CQI) Ack/Nack 2bits\n",
Mod_id, Mod_id,
ue->dlsch[eNB_id][0]->rnti, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti,
frame_tx%1024, subframe_tx); frame_tx%1024, subframe_tx);
break; break;
default: default:
@@ -2254,7 +2262,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui
// reset DL ACK/NACK status // reset DL ACK/NACK status
reset_ack(&ue->frame_parms, reset_ack(&ue->frame_parms,
ue->dlsch[eNB_id][0]->harq_ack, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->harq_ack,
subframe_tx, subframe_tx,
ue->ulsch[eNB_id]->o_ACK,0); ue->ulsch[eNB_id]->o_ACK,0);
@@ -2451,8 +2459,8 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id)
emos_dump_UE.total_TBS_last = ue->total_TBS_last[eNB_id]; emos_dump_UE.total_TBS_last = ue->total_TBS_last[eNB_id];
emos_dump_UE.bitrate = ue->bitrate[eNB_id]; emos_dump_UE.bitrate = ue->bitrate[eNB_id];
emos_dump_UE.total_received_bits = ue->total_received_bits[eNB_id]; emos_dump_UE.total_received_bits = ue->total_received_bits[eNB_id];
emos_dump_UE.pmi_saved = ue->dlsch[eNB_id][0]->pmi_alloc; emos_dump_UE.pmi_saved = ue->dlsch[subframe&0x1][eNB_id][0]->pmi_alloc;
emos_dump_UE.mcs = ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs; emos_dump_UE.mcs = ue->dlsch[subframe&0x1][eNB_id][0]->harq_processes[ue->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->mcs;
emos_dump_UE.use_ia_receiver = openair_daq_vars.use_ia_receiver; emos_dump_UE.use_ia_receiver = openair_daq_vars.use_ia_receiver;
bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_UE, sizeof(fifo_dump_emos_UE)); bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_UE, sizeof(fifo_dump_emos_UE));
@@ -2859,7 +2867,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
(void *)&dci_alloc_rx[i].dci_pdu, (void *)&dci_alloc_rx[i].dci_pdu,
ue->pdcch_vars[eNB_id]->crnti, ue->pdcch_vars[eNB_id]->crnti,
dci_alloc_rx[i].format, dci_alloc_rx[i].format,
ue->dlsch[eNB_id], ue->dlsch[subframe_rx&0x1][eNB_id],
&ue->frame_parms, &ue->frame_parms,
ue->pdsch_config_dedicated, ue->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -2876,7 +2884,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
(dci_alloc_rx[i].format == format2A) || (dci_alloc_rx[i].format == format2A) ||
(dci_alloc_rx[i].format == format2B)) (dci_alloc_rx[i].format == format2B))
{ {
ue->dlsch[eNB_id][0]->g_pucch += ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->delta_PUCCH; ue->dlsch[subframe_rx&0x1][eNB_id][0]->g_pucch += ue->dlsch[subframe_rx&0x1][eNB_id][0]->harq_processes[ue->dlsch[subframe_rx&0x1][eNB_id][0]->current_harq_pid]->delta_PUCCH;
} }
ue->dlsch_received[eNB_id]++; ue->dlsch_received[eNB_id]++;
@@ -2884,7 +2892,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
#ifdef DEBUG_PHY_PROC #ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format); LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format);
dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d=> %d\n",ue->Mod_id,subframe_rx,ue->dlsch[eNB_id][0]->active); LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d=> %d\n",ue->Mod_id,subframe_rx,ue->dlsch[subframe_rx&0x1][eNB_id][0]->active);
#endif #endif
// we received a CRNTI, so we're in PUSCH // we received a CRNTI, so we're in PUSCH
@@ -3262,7 +3270,14 @@ void ue_pdsch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, PDSC
dual_stream_UE = 1; dual_stream_UE = 1;
eNB_id_i = ue->n_connected_eNB; eNB_id_i = ue->n_connected_eNB;
i_mod = dlsch0->harq_processes[harq_pid]->Qm; i_mod = dlsch0->harq_processes[harq_pid]->Qm;
} else { }
else if((pdsch==PDSCH) && (ue->transmission_mode[eNB_id]==3))
{
dual_stream_UE = rx_IC_dual_stream;
eNB_id_i = eNB_id;
i_mod = 0;
}
else {
dual_stream_UE = 0; dual_stream_UE = 0;
eNB_id_i = eNB_id+1; eNB_id_i = eNB_id+1;
i_mod = 0; i_mod = 0;
@@ -3401,11 +3416,34 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
int harq_pid; int harq_pid;
int frame_rx = proc->frame_rx; int frame_rx = proc->frame_rx;
int subframe_rx = proc->subframe_rx; int subframe_rx = proc->subframe_rx;
int ret=0; int ret=0, ret1=0;
int CC_id = ue->CC_id; int CC_id = ue->CC_id;
LTE_UE_PDSCH *pdsch_vars; LTE_UE_PDSCH *pdsch_vars;
uint8_t is_cw0_active = 0;
uint8_t is_cw1_active = 0;
if (dlsch0 && (!dlsch1)) { if (dlsch0==NULL)
AssertFatal(0,"dlsch0 should be defined at this level \n");
harq_pid = dlsch0->current_harq_pid;
is_cw0_active = dlsch0->harq_processes[harq_pid]->status;
if(dlsch1)
is_cw1_active = dlsch1->harq_processes[harq_pid]->status;
LOG_D(PHY,"AbsSubframe %d.%d Start Turbo Decoder for CW0 [harq_pid %d] ? %d \n", frame_rx%1024, subframe_rx, harq_pid, is_cw0_active);
LOG_D(PHY,"AbsSubframe %d.%d Start Turbo Decoder for CW1 [harq_pid %d] ? %d \n", frame_rx%1024, subframe_rx, harq_pid, is_cw1_active);
if(is_cw0_active && is_cw1_active)
{
dlsch0->Kmimo = 2;
dlsch1->Kmimo = 2;
}
else
{
dlsch0->Kmimo = 1;
}
if (1) {
switch (pdsch) { switch (pdsch) {
case SI_PDSCH: case SI_PDSCH:
pdsch_vars = ue->pdsch_vars_SI[eNB_id]; pdsch_vars = ue->pdsch_vars_SI[eNB_id];
@@ -3431,8 +3469,6 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
break; break;
} }
harq_pid = dlsch0->current_harq_pid;
if (frame_rx < *dlsch_errors) if (frame_rx < *dlsch_errors)
*dlsch_errors=0; *dlsch_errors=0;
@@ -3449,6 +3485,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
if (abstraction_flag == 0) { if (abstraction_flag == 0) {
// start turbo decode for CW 0
dlsch0->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, dlsch0->harq_processes[harq_pid]->G = get_G(&ue->frame_parms,
dlsch0->harq_processes[harq_pid]->nb_rb, dlsch0->harq_processes[harq_pid]->nb_rb,
dlsch0->harq_processes[harq_pid]->rb_alloc_even, dlsch0->harq_processes[harq_pid]->rb_alloc_even,
@@ -3468,6 +3505,13 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
subframe_rx<<1); subframe_rx<<1);
stop_meas(&ue->dlsch_unscrambling_stats); stop_meas(&ue->dlsch_unscrambling_stats);
//LOG_I(PHY,"start turbo decode for CW 0 --> nb_rb %d \n", dlsch0->harq_processes[harq_pid]->nb_rb);
//LOG_I(PHY,"start turbo decode for CW 0 --> rb_alloc_even %x \n", dlsch0->harq_processes[harq_pid]->rb_alloc_even);
//LOG_I(PHY,"start turbo decode for CW 0 --> Qm %d \n", dlsch0->harq_processes[harq_pid]->Qm);
//LOG_I(PHY,"start turbo decode for CW 0 --> Nl %d \n", dlsch0->harq_processes[harq_pid]->Nl);
//LOG_I(PHY,"start turbo decode for CW 0 --> G %d \n", dlsch0->harq_processes[harq_pid]->G);
//LOG_I(PHY,"start turbo decode for CW 0 --> Kmimo %d \n", dlsch0->Kmimo);
start_meas(&ue->dlsch_decoding_stats); start_meas(&ue->dlsch_decoding_stats);
ret = dlsch_decoding(ue, ret = dlsch_decoding(ue,
pdsch_vars->llr[0], pdsch_vars->llr[0],
@@ -3480,6 +3524,60 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
pdsch==PDSCH?1:0, pdsch==PDSCH?1:0,
dlsch0->harq_processes[harq_pid]->TBS>256?1:0); dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
stop_meas(&ue->dlsch_decoding_stats); stop_meas(&ue->dlsch_decoding_stats);
//printf(" --> Unscrambling for CW0 %5.3f\n",
// (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
//printf(" --> Turbo Decoding for CW0 %5.3f\n",
// (ue->dlsch_decoding_stats.p_time)/(cpuf*1000.0));
if(is_cw1_active)
{
// start turbo decode for CW 1
dlsch1->harq_processes[harq_pid]->G = get_G(&ue->frame_parms,
dlsch1->harq_processes[harq_pid]->nb_rb,
dlsch1->harq_processes[harq_pid]->rb_alloc_even,
dlsch1->harq_processes[harq_pid]->Qm,
dlsch1->harq_processes[harq_pid]->Nl,
ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
frame_rx,
subframe_rx,
ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]);
start_meas(&ue->dlsch_unscrambling_stats);
dlsch_unscrambling(&ue->frame_parms,
0,
dlsch1,
dlsch1->harq_processes[harq_pid]->G,
pdsch_vars->llr[1],
1,
subframe_rx<<1);
stop_meas(&ue->dlsch_unscrambling_stats);
//LOG_I(PHY,"start turbo decode for CW 1 --> nb_rb %d \n", dlsch1->harq_processes[harq_pid]->nb_rb);
//LOG_I(PHY,"start turbo decode for CW 1 --> rb_alloc_even %x \n", dlsch1->harq_processes[harq_pid]->rb_alloc_even);
//LOG_I(PHY,"start turbo decode for CW 1 --> Qm %d \n", dlsch1->harq_processes[harq_pid]->Qm);
//LOG_I(PHY,"start turbo decode for CW 1 --> Nl %d \n", dlsch1->harq_processes[harq_pid]->Nl);
//LOG_I(PHY,"start turbo decode for CW 1 --> G %d \n", dlsch1->harq_processes[harq_pid]->G);
//LOG_I(PHY,"start turbo decode for CW 1 --> Kmimo %d \n", dlsch1->Kmimo);
start_meas(&ue->dlsch_decoding_stats);
ret1 = dlsch_decoding(ue,
pdsch_vars->llr[1],
&ue->frame_parms,
dlsch1,
dlsch1->harq_processes[harq_pid],
frame_rx,
subframe_rx,
harq_pid,
pdsch==PDSCH?1:0,
dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
stop_meas(&ue->dlsch_decoding_stats);
//printf(" --> Unscrambling for CW1 %5.3f\n",
// (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
//printf(" --> Turbo Decoding for CW1 %5.3f\n",
// (ue->dlsch_decoding_stats.p_time)/(cpuf*1000.0));
}
} }
else { else {
@@ -3492,12 +3590,13 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
#endif #endif
} }
// Check CRC for CW 0
if (ret == (1+dlsch0->max_turbo_iterations)) { if (ret == (1+dlsch0->max_turbo_iterations)) {
*dlsch_errors=*dlsch_errors+1; *dlsch_errors=*dlsch_errors+1;
if(dlsch0->rnti != 0xffff) if(dlsch0->rnti != 0xffff)
{ {
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n", LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : DLSCH CW0 in error (rv %d,mcs %d,TBS %d)\n",
ue->Mod_id,dlsch0->rnti, ue->Mod_id,dlsch0->rnti,
harq_pid,frame_rx,subframe_rx, harq_pid,frame_rx,subframe_rx,
dlsch0->harq_processes[harq_pid]->rvidx, dlsch0->harq_processes[harq_pid]->rvidx,
@@ -3509,7 +3608,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
} else { } else {
if(dlsch0->rnti != 0xffff) if(dlsch0->rnti != 0xffff)
{ {
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH (rv %d,mcs %d,TBS %d)\n", LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : Received DLSCH CW0 (rv %d,mcs %d,TBS %d)\n",
ue->Mod_id,dlsch0->rnti, ue->Mod_id,dlsch0->rnti,
harq_pid,frame_rx,subframe_rx, harq_pid,frame_rx,subframe_rx,
dlsch0->harq_processes[harq_pid]->rvidx, dlsch0->harq_processes[harq_pid]->rvidx,
@@ -3574,6 +3673,49 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS; dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS;
} }
// Check CRC for CW 1
if(is_cw1_active)
{
if (ret1 == (1+dlsch0->max_turbo_iterations)) {
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH CW1 in error (rv %d,mcs %d,TBS %d)\n",
ue->Mod_id,dlsch0->rnti,
harq_pid,frame_rx,subframe_rx,
dlsch0->harq_processes[harq_pid]->rvidx,
dlsch0->harq_processes[harq_pid]->mcs,
dlsch0->harq_processes[harq_pid]->TBS);
} else {
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH CW1 (rv %d,mcs %d,TBS %d)\n",
ue->Mod_id,dlsch0->rnti,
harq_pid,frame_rx,subframe_rx,
dlsch0->harq_processes[harq_pid]->rvidx,
dlsch0->harq_processes[harq_pid]->mcs,
dlsch0->harq_processes[harq_pid]->TBS);
if (ue->mac_enabled == 1) {
switch (pdsch) {
case PDSCH:
if(is_cw1_active)
mac_xface->ue_send_sdu(ue->Mod_id,
CC_id,
frame_rx,
subframe_rx,
dlsch1->harq_processes[dlsch1->current_harq_pid]->b,
dlsch1->harq_processes[dlsch1->current_harq_pid]->TBS>>3,
eNB_id);
break;
case SI_PDSCH:
case P_PDSCH:
case RA_PDSCH:
case PDSCH1:
case PMCH:
AssertFatal(0,"exiting");
break;
}
}
}
}
#ifdef DEBUG_PHY_PROC #ifdef DEBUG_PHY_PROC
@@ -3622,16 +3764,18 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
T_BUFFER(&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.samples_per_tti], T_BUFFER(&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.samples_per_tti],
ue->frame_parms.samples_per_tti * 4)); ue->frame_parms.samples_per_tti * 4));
start_meas(&ue->phy_proc_rx); // start timers
start_meas(&ue->phy_proc_rx[subframe_rx&0x1]);
start_meas(&ue->generic_stat);
pmch_flag = is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms) ? 1 : 0; pmch_flag = is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms) ? 1 : 0;
// deactivate reception until we scan pdcch // deactivate reception until we scan pdcch
if (ue->dlsch[eNB_id][0]) if (ue->dlsch[subframe_rx&0x1][eNB_id][0])
ue->dlsch[eNB_id][0]->active = 0; ue->dlsch[subframe_rx&0x1][eNB_id][0]->active = 0;
if (ue->dlsch[eNB_id][1]) if (ue->dlsch[subframe_rx&0x1][eNB_id][1])
ue->dlsch[eNB_id][1]->active = 0; ue->dlsch[subframe_rx&0x1][eNB_id][1]->active = 0;
if (ue->dlsch_SI[eNB_id]) if (ue->dlsch_SI[eNB_id])
ue->dlsch_SI[eNB_id]->active = 0; ue->dlsch_SI[eNB_id]->active = 0;
@@ -3717,15 +3861,18 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
0); 0);
// first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH) // first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH)
stop_meas(&ue->generic_stat);
//printf("[SFN %d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0));
start_meas(&ue->generic_stat);
// do procedures for C-RNTI // do procedures for C-RNTI
if (ue->dlsch[eNB_id][0]->active == 1) { if (ue->dlsch[subframe_rx&0x1][eNB_id][0]->active == 1) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
ue_pdsch_procedures(ue, ue_pdsch_procedures(ue,
proc, proc,
eNB_id, eNB_id,
PDSCH, PDSCH,
ue->dlsch[eNB_id][0], ue->dlsch[subframe_rx&0x1][eNB_id][0],
NULL, NULL,
ue->pdcch_vars[eNB_id]->num_pdcch_symbols, ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
ue->frame_parms.symbols_per_tti>>1, ue->frame_parms.symbols_per_tti>>1,
@@ -3809,35 +3956,50 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
} }
} // not an S-subframe } // not an S-subframe
stop_meas(&ue->generic_stat);
//printf("[SFN %d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0));
// run pbch procedures if subframe is 0 // run pbch procedures if subframe is 0
if (subframe_rx == 0) if ( (subframe_rx == 0) && (ue->decode_MIB == 1))
{
ue_pbch_procedures(eNB_id,ue,proc,abstraction_flag); ue_pbch_procedures(eNB_id,ue,proc,abstraction_flag);
}
// do procedures for C-RNTI // do procedures for C-RNTI
if (ue->dlsch[eNB_id][0]->active == 1) { if (ue->dlsch[subframe_rx&0x1][eNB_id][0]->active == 1) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
start_meas(&ue->pdsch_procedures_stat);
ue_pdsch_procedures(ue, ue_pdsch_procedures(ue,
proc, proc,
eNB_id, eNB_id,
PDSCH, PDSCH,
ue->dlsch[eNB_id][0], ue->dlsch[subframe_rx&0x1][eNB_id][0],
NULL, NULL,
1+(ue->frame_parms.symbols_per_tti>>1), 1+(ue->frame_parms.symbols_per_tti>>1),
ue->frame_parms.symbols_per_tti-1, ue->frame_parms.symbols_per_tti-1,
abstraction_flag); abstraction_flag);
stop_meas(&ue->pdsch_procedures_stat);
start_meas(&ue->dlsch_procedures_stat);
ue_dlsch_procedures(ue, ue_dlsch_procedures(ue,
proc, proc,
eNB_id, eNB_id,
PDSCH, PDSCH,
ue->dlsch[eNB_id][0], ue->dlsch[subframe_rx&0x1][eNB_id][0],
NULL, ue->dlsch[subframe_rx&0x1][eNB_id][1],
&ue->dlsch_errors[eNB_id], &ue->dlsch_errors[eNB_id],
mode, mode,
abstraction_flag); abstraction_flag);
stop_meas(&ue->dlsch_procedures_stat);
//printf("[SFN %d] Slot1: Pdsch Proc %5.2f\n",subframe_rx,ue->pdsch_procedures_stat.p_time/(cpuf*1000.0));
//printf("[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",subframe_rx,ue->dlsch_procedures_stat.p_time/(cpuf*1000.0));
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT);
} }
start_meas(&ue->generic_stat);
// do procedures for SI-RNTI // do procedures for SI-RNTI
if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) { if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) {
ue_pdsch_procedures(ue, ue_pdsch_procedures(ue,
@@ -3932,7 +4094,8 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
} }
stop_meas(&ue->generic_stat);
//printf("after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0));
#ifdef EMOS #ifdef EMOS
phy_procedures_emos_UE_RX(ue,slot,eNB_id); phy_procedures_emos_UE_RX(ue,slot,eNB_id);
@@ -3940,7 +4103,10 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
stop_meas(&ue->phy_proc_rx); stop_meas(&ue->phy_proc_rx[subframe_rx&0x1]);
//printf("------FULL RX PROC [SFN %d]: %5.2f ------\n",subframe_rx,ue->phy_proc_rx[subframe_rx&0x1].p_time/(cpuf*1000.0));
return (0); return (0);
} }
+5 -5
View File
@@ -51,7 +51,7 @@ int16_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,u
Po_PUCCH = get_PL(ue->Mod_id,ue->CC_id,eNB_id)+ Po_PUCCH = get_PL(ue->Mod_id,ue->CC_id,eNB_id)+
ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+
ue->dlsch[eNB_id][0]->g_pucch; ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->g_pucch;
switch (pucch_fmt) { switch (pucch_fmt) {
case pucch_format1: case pucch_format1:
@@ -90,19 +90,19 @@ int16_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,u
if (pucch_fmt!=pucch_format1) { if (pucch_fmt!=pucch_format1) {
LOG_D(PHY,"[UE %d][PDSCH %x] AbsSubframe %d.%d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB, g_pucch %d dB\n", LOG_D(PHY,"[UE %d][PDSCH %x] AbsSubframe %d.%d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB, g_pucch %d dB\n",
ue->Mod_id, ue->Mod_id,
ue->dlsch[eNB_id][0]->rnti,proc->frame_tx%1024,subframe, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti,proc->frame_tx%1024,subframe,
Po_PUCCH, Po_PUCCH,
ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
get_PL(ue->Mod_id,ue->CC_id,eNB_id), get_PL(ue->Mod_id,ue->CC_id,eNB_id),
ue->dlsch[eNB_id][0]->g_pucch); ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->g_pucch);
} else { } else {
LOG_D(PHY,"[UE %d][SR %x] AbsSubframe %d.%d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB g_pucch %d dB\n", LOG_D(PHY,"[UE %d][SR %x] AbsSubframe %d.%d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB g_pucch %d dB\n",
ue->Mod_id, ue->Mod_id,
ue->dlsch[eNB_id][0]->rnti,proc->frame_tx%1024,subframe, ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->rnti,proc->frame_tx%1024,subframe,
Po_PUCCH, Po_PUCCH,
ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
get_PL(ue->Mod_id,ue->CC_id,eNB_id), get_PL(ue->Mod_id,ue->CC_id,eNB_id),
ue->dlsch[eNB_id][0]->g_pucch); ue->dlsch[proc->subframe_rx&0x1][eNB_id][0]->g_pucch);
} }
return(Po_PUCCH); return(Po_PUCCH);
+28 -28
View File
@@ -2098,14 +2098,14 @@ int main(int argc, char **argv)
} }
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
UE->dlsch[0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); UE->dlsch[subframe&0x1][0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
if (!UE->dlsch[0][i]) { if (!UE->dlsch[subframe&0x1][0][i]) {
printf("Can't get ue dlsch structures\n"); printf("Can't get ue dlsch structures\n");
exit(-1); exit(-1);
} }
UE->dlsch[0][i]->rnti = n_rnti; UE->dlsch[subframe&0x1][0][i]->rnti = n_rnti;
} }
UE->dlsch_SI[0] = new_ue_dlsch(1,1,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); UE->dlsch_SI[0] = new_ue_dlsch(1,1,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
@@ -2254,7 +2254,7 @@ int main(int argc, char **argv)
reset_meas(&eNB->dlsch_rate_matching_stats); reset_meas(&eNB->dlsch_rate_matching_stats);
reset_meas(&eNB->dlsch_turbo_encoding_stats); reset_meas(&eNB->dlsch_turbo_encoding_stats);
reset_meas(&UE->phy_proc_rx); // total UE rx reset_meas(&UE->phy_proc_rx[subframe&0x1]); // total UE rx
reset_meas(&UE->ofdm_demod_stats); reset_meas(&UE->ofdm_demod_stats);
reset_meas(&UE->dlsch_channel_estimation_stats); reset_meas(&UE->dlsch_channel_estimation_stats);
reset_meas(&UE->dlsch_freq_offset_estimation_stats); reset_meas(&UE->dlsch_freq_offset_estimation_stats);
@@ -2488,7 +2488,7 @@ int main(int argc, char **argv)
if (n_frames==1) printf("Running phy_procedures_UE_RX\n"); if (n_frames==1) printf("Running phy_procedures_UE_RX\n");
phy_procedures_UE_RX(UE,proc,0,0,normal_txrx,no_relay,NULL); phy_procedures_UE_RX(UE,proc,0,0,normal_txrx,no_relay,NULL);
if (UE->dlsch[0][0]->active == 0) { if (UE->dlsch[subframe&0x1][0][0]->active == 0) {
//printf("DCI not received\n"); //printf("DCI not received\n");
/* /*
write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1); write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1);
@@ -2543,7 +2543,7 @@ int main(int argc, char **argv)
//pdsch_vars //pdsch_vars
dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round, UE->dlsch[0][0]->current_harq_pid); dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round, UE->dlsch[subframe&0x1][0][0]->current_harq_pid);
write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
@@ -2561,13 +2561,13 @@ int main(int argc, char **argv)
if (UE->dlsch_errors[0] == 0) { if (UE->dlsch_errors[0] == 0) {
avg_iter += UE->dlsch[eNB_id][0]->last_iteration_cnt; avg_iter += UE->dlsch[subframe&0x1][eNB_id][0]->last_iteration_cnt;
iter_trials++; iter_trials++;
if (n_frames==1) if (n_frames==1)
printf("No DLSCH errors found (round %d),uncoded ber %f\n",round,uncoded_ber); printf("No DLSCH errors found (round %d),uncoded ber %f\n",round,uncoded_ber);
UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->TBS; UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->TBS;
TB0_active = 0; TB0_active = 0;
@@ -2575,25 +2575,25 @@ int main(int argc, char **argv)
else { else {
errs[round]++; errs[round]++;
avg_iter += UE->dlsch[eNB_id][0]->last_iteration_cnt-1; avg_iter += UE->dlsch[subframe&0x1][eNB_id][0]->last_iteration_cnt-1;
iter_trials++; iter_trials++;
if (n_frames==1) { if (n_frames==1) {
//if ((n_frames==1) || (SNR>=30)) { //if ((n_frames==1) || (SNR>=30)) {
printf("DLSCH errors found (round %d), uncoded ber %f\n",round,uncoded_ber); printf("DLSCH errors found (round %d), uncoded ber %f\n",round,uncoded_ber);
for (s=0; s<UE->dlsch[0][0]->harq_processes[0]->C; s++) { for (s=0; s<UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->C; s++) {
if (s<UE->dlsch[0][0]->harq_processes[0]->Cminus) if (s<UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Cminus)
Kr = UE->dlsch[0][0]->harq_processes[0]->Kminus; Kr = UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kminus;
else else
Kr = UE->dlsch[0][0]->harq_processes[0]->Kplus; Kr = UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0; i<Kr_bytes; i++) for (i=0; i<Kr_bytes; i++)
printf("%d : %x (%x)\n",i,UE->dlsch[0][0]->harq_processes[0]->c[s][i],UE->dlsch[0][0]->harq_processes[0]->c[s][i]^eNB->dlsch[0][0]->harq_processes[0]->c[s][i]); printf("%d : %x (%x)\n",i,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->c[s][i],UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->c[s][i]^eNB->dlsch[0][0]->harq_processes[0]->c[s][i]);
} }
sprintf(fname,"rxsig0_r%d.m",round); sprintf(fname,"rxsig0_r%d.m",round);
@@ -2644,13 +2644,13 @@ int main(int argc, char **argv)
} }
//pdsch_vars //pdsch_vars
dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round, UE->dlsch[0][0]->current_harq_pid); dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round, UE->dlsch[subframe&0x1][0][0]->current_harq_pid);
//write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); //write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
//write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); //write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
//write_output("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); //write_output("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
//write_output("dlsch_w.m","w",UE->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); //write_output("dlsch_w.m","w",UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0);
//pdcch_vars //pdcch_vars
write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1); write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1);
write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1); write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
@@ -2664,7 +2664,7 @@ int main(int argc, char **argv)
// printf("round %d errors %d/%d\n",round,errs[round],trials); // printf("round %d errors %d/%d\n",round,errs[round],trials);
round++; round++;
// UE->dlsch[0][0]->harq_processes[0]->round++; // UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->round++;
} }
if (xforms==1) { if (xforms==1) {
@@ -2705,7 +2705,7 @@ int main(int argc, char **argv)
double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0;
double t_rx = (double)UE->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; double t_rx = (double)UE->phy_proc_rx[subframe&0x1].p_time/cpu_freq_GHz/1000.0;
double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0;
double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0; double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0;
double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0;
@@ -2854,7 +2854,7 @@ int main(int argc, char **argv)
rate*effective_rate, rate*effective_rate,
100*effective_rate, 100*effective_rate,
rate, rate,
rate*get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs), rate*get_Qm(UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs),
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/
(double)eNB->dlsch[0][0]->harq_processes[0]->TBS, (double)eNB->dlsch[0][0]->harq_processes[0]->TBS,
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
@@ -2894,10 +2894,10 @@ int main(int argc, char **argv)
eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials); eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials);
printf("\n\nUE RX function statistics (per 1ms subframe)\n\n"); printf("\n\nUE RX function statistics (per 1ms subframe)\n\n");
std_phy_proc_rx = sqrt((double)UE->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, std_phy_proc_rx = sqrt((double)UE->phy_proc_rx[subframe&0x1].diff_square/pow(cpu_freq_GHz,2)/pow(1000,
2)/UE->phy_proc_rx.trials - pow((double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); 2)/UE->phy_proc_rx[subframe&0x1].trials - pow((double)UE->phy_proc_rx[subframe&0x1].diff/UE->phy_proc_rx[subframe&0x1].trials/cpu_freq_GHz/1000,2));
printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000.0, printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx[subframe&0x1].diff/UE->phy_proc_rx[subframe&0x1].trials/cpu_freq_GHz/1000.0,
UE->phy_proc_rx.trials*2/3); UE->phy_proc_rx[subframe&0x1].trials*2/3);
printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median,
rx_q1, rx_q3, n_rx_dropped); rx_q1, rx_q3, n_rx_dropped);
std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
@@ -2931,7 +2931,7 @@ int main(int argc, char **argv)
printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n", printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n",
(double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials); (double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials);
printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n", printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n",
UE->dlsch[0][0]->harq_processes[0]->Cminus ? UE->dlsch[0][0]->harq_processes[0]->Kminus : UE->dlsch[0][0]->harq_processes[0]->Kplus, UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Cminus ? UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kminus : UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kplus,
(double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials); (double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials);
printf(" |__ init %f us (cycles/iter %f, %d trials)\n", printf(" |__ init %f us (cycles/iter %f, %d trials)\n",
(double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0,
@@ -3109,7 +3109,7 @@ int main(int argc, char **argv)
eNB->dlsch_modulation_stats.trials, eNB->dlsch_modulation_stats.trials,
eNB->dlsch_scrambling_stats.trials, eNB->dlsch_scrambling_stats.trials,
eNB->dlsch_encoding_stats.trials, eNB->dlsch_encoding_stats.trials,
UE->phy_proc_rx.trials, UE->phy_proc_rx[subframe&0x1].trials,
UE->ofdm_demod_stats.trials, UE->ofdm_demod_stats.trials,
UE->dlsch_rx_pdcch_stats.trials, UE->dlsch_rx_pdcch_stats.trials,
UE->dlsch_llr_stats.trials, UE->dlsch_llr_stats.trials,
@@ -3122,7 +3122,7 @@ int main(int argc, char **argv)
get_time_meas_us(&eNB->dlsch_modulation_stats), get_time_meas_us(&eNB->dlsch_modulation_stats),
get_time_meas_us(&eNB->dlsch_scrambling_stats), get_time_meas_us(&eNB->dlsch_scrambling_stats),
get_time_meas_us(&eNB->dlsch_encoding_stats), get_time_meas_us(&eNB->dlsch_encoding_stats),
get_time_meas_us(&UE->phy_proc_rx), get_time_meas_us(&UE->phy_proc_rx[subframe&0x1]),
nsymb*get_time_meas_us(&UE->ofdm_demod_stats), nsymb*get_time_meas_us(&UE->ofdm_demod_stats),
get_time_meas_us(&UE->dlsch_rx_pdcch_stats), get_time_meas_us(&UE->dlsch_rx_pdcch_stats),
3*get_time_meas_us(&UE->dlsch_llr_stats), 3*get_time_meas_us(&UE->dlsch_llr_stats),
@@ -3162,7 +3162,7 @@ int main(int argc, char **argv)
eNB->dlsch_modulation_stats.trials, eNB->dlsch_modulation_stats.trials,
eNB->dlsch_scrambling_stats.trials, eNB->dlsch_scrambling_stats.trials,
eNB->dlsch_encoding_stats.trials, eNB->dlsch_encoding_stats.trials,
UE->phy_proc_rx.trials, UE->phy_proc_rx[subframe&0x1].trials,
UE->ofdm_demod_stats.trials, UE->ofdm_demod_stats.trials,
UE->dlsch_rx_pdcch_stats.trials, UE->dlsch_rx_pdcch_stats.trials,
UE->dlsch_llr_stats.trials, UE->dlsch_llr_stats.trials,
@@ -3220,7 +3220,7 @@ int main(int argc, char **argv)
printf("eNB %d\n",i); printf("eNB %d\n",i);
free_eNB_dlsch(eNB->dlsch[0][i]); free_eNB_dlsch(eNB->dlsch[0][i]);
printf("UE %d\n",i); printf("UE %d\n",i);
free_ue_dlsch(UE->dlsch[0][i]); free_ue_dlsch(UE->dlsch[subframe&0x1][0][i]);
} }
+173 -173
View File
@@ -980,15 +980,15 @@ int main(int argc, char **argv)
} }
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
UE->dlsch[0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); UE->dlsch[subframe&0x1][0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
if (!UE->dlsch[0][i]) { if (!UE->dlsch[subframe&0x1][0][i]) {
printf("Can't get ue dlsch structures\n"); printf("Can't get ue dlsch structures\n");
exit(-1); exit(-1);
} }
UE->dlsch[0][i]->rnti = n_rnti; UE->dlsch[subframe&0x1][0][i]->rnti = n_rnti;
} }
// structure for SIC at UE // structure for SIC at UE
@@ -2081,7 +2081,7 @@ int main(int argc, char **argv)
reset_meas(&eNB->dlsch_rate_matching_stats); reset_meas(&eNB->dlsch_rate_matching_stats);
reset_meas(&eNB->dlsch_turbo_encoding_stats); reset_meas(&eNB->dlsch_turbo_encoding_stats);
reset_meas(&UE->phy_proc_rx); // total UE rx reset_meas(&UE->phy_proc_rx[subframe&0x1]); // total UE rx
reset_meas(&UE->ofdm_demod_stats); reset_meas(&UE->ofdm_demod_stats);
reset_meas(&UE->dlsch_channel_estimation_stats); reset_meas(&UE->dlsch_channel_estimation_stats);
reset_meas(&UE->dlsch_freq_offset_estimation_stats); reset_meas(&UE->dlsch_freq_offset_estimation_stats);
@@ -2135,8 +2135,8 @@ int main(int argc, char **argv)
eNB2UE[0]->first_run = 1; eNB2UE[0]->first_run = 1;
ret[0] = UE->dlsch[0][0]->max_turbo_iterations+1; ret[0] = UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations+1;
ret[1] = UE->dlsch[0][0]->max_turbo_iterations+1; ret[1] = UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations+1;
resend_cw0_cw1=1; resend_cw0_cw1=1;
resend_cw1=0; resend_cw1=0;
@@ -2144,10 +2144,10 @@ int main(int argc, char **argv)
TB1_active=1; TB1_active=1;
while (((transmission_mode == 3 || transmission_mode == 4) && while (((transmission_mode == 3 || transmission_mode == 4) &&
((round < num_rounds) && ((ret[0] > UE->dlsch[0][0]->max_turbo_iterations) || ((round < num_rounds) && ((ret[0] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations) ||
(ret[1] > UE->dlsch[0][0]->max_turbo_iterations)))) || (ret[1] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations)))) ||
((transmission_mode!=4 && transmission_mode != 3) && ((round< num_rounds) && ((transmission_mode!=4 && transmission_mode != 3) && ((round< num_rounds) &&
(ret[0] > UE->dlsch[0][0]->max_turbo_iterations)))) { (ret[0] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations)))) {
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf("\n [DLSIM] On top round is %d\n", round); printf("\n [DLSIM] On top round is %d\n", round);
#endif #endif
@@ -2158,10 +2158,10 @@ int main(int argc, char **argv)
//printf("Trial %d, round %d , ret[0] %d, ret[1] %d, round_trials %d\n",trials,round, ret[0], ret[1], round_trials[round]); //printf("Trial %d, round %d , ret[0] %d, ret[1] %d, round_trials %d\n",trials,round, ret[0], ret[1], round_trials[round]);
/*if (ret[0] > UE->dlsch[0][0]->max_turbo_iterations) { /*if (ret[0] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations) {
round_trials[0][round]++; round_trials[0][round]++;
round_trials[1][round]++; round_trials[1][round]++;
} else if ((ret[1] > UE->dlsch[0][0]->max_turbo_iterations) && (ret[0] <= UE->dlsch[0][0]->max_turbo_iterations)) } else if ((ret[1] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations) && (ret[0] <= UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations))
round_trials[1][round]++;*/ round_trials[1][round]++;*/
@@ -2624,7 +2624,7 @@ int main(int argc, char **argv)
SI_RNTI, SI_RNTI,
0, 0,
P_RNTI, P_RNTI,
UE->dlsch[0][1]->pmi_alloc, UE->dlsch[subframe&0x1][0][1]->pmi_alloc,
transmission_mode>=7?transmission_mode:0 transmission_mode>=7?transmission_mode:0
); );
break; break;
@@ -2852,7 +2852,7 @@ int main(int argc, char **argv)
SI_RNTI, SI_RNTI,
0, 0,
P_RNTI, P_RNTI,
UE->dlsch[0][1]->pmi_alloc, UE->dlsch[subframe&0x1][0][1]->pmi_alloc,
transmission_mode>=7?transmission_mode:0 transmission_mode>=7?transmission_mode:0
); );
break; break;
@@ -2983,7 +2983,7 @@ int main(int argc, char **argv)
// use the PMI from previous trial // use the PMI from previous trial
if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL); eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL);
UE->dlsch[0][0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); UE->dlsch[subframe&0x1][0][0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
if (n_users>1) if (n_users>1)
eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555);
/* /*
@@ -3007,7 +3007,7 @@ int main(int argc, char **argv)
printf ("[DLSIM] I am calling from the eNode B 2\n"); printf ("[DLSIM] I am calling from the eNode B 2\n");
#endif #endif
UE->dlsch[0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); UE->dlsch[subframe&0x1][0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
} }
else if (updated_csi == 0){ else if (updated_csi == 0){
@@ -3020,7 +3020,7 @@ int main(int argc, char **argv)
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf ("[DLSIM] I am calling from the eNode B 2\n"); printf ("[DLSIM] I am calling from the eNode B 2\n");
#endif #endif
UE->dlsch[0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[0][TB]->pmi_alloc,5,UE->frame_parms.N_RB_DL); UE->dlsch[subframe&0x1][0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[subframe&0x1][0][TB]->pmi_alloc,5,UE->frame_parms.N_RB_DL);
} }
else if (hold_rank1_precoder == 0 && ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6))){ else if (hold_rank1_precoder == 0 && ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6))){
@@ -3031,7 +3031,7 @@ int main(int argc, char **argv)
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf ("[DLSIM] I am calling from the eNode B 2\n"); printf ("[DLSIM] I am calling from the eNode B 2\n");
#endif #endif
UE->dlsch[0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[0][TB]->pmi_alloc,6,UE->frame_parms.N_RB_DL); UE->dlsch[subframe&0x1][0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[subframe&0x1][0][TB]->pmi_alloc,6,UE->frame_parms.N_RB_DL);
} }
} else if (updated_csi == 1){ } else if (updated_csi == 1){
@@ -3050,11 +3050,11 @@ int main(int argc, char **argv)
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf ("[DLSIM] I quantize from ENodeB 2\n"); printf ("[DLSIM] I quantize from ENodeB 2\n");
#endif #endif
UE->dlsch[0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); UE->dlsch[subframe&0x1][0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf ("[DLSIM] I convert pmi to rank1 eNode B 2\n"); printf ("[DLSIM] I convert pmi to rank1 eNode B 2\n");
#endif #endif
UE->dlsch[0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[0][TB]->pmi_alloc,5,UE->frame_parms.N_RB_DL); UE->dlsch[subframe&0x1][0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[subframe&0x1][0][TB]->pmi_alloc,5,UE->frame_parms.N_RB_DL);
} }
else if (((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6))){ else if (((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6))){
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
@@ -3070,11 +3070,11 @@ int main(int argc, char **argv)
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf ("[DLSIM] I quantize from ENodeB 2\n"); printf ("[DLSIM] I quantize from ENodeB 2\n");
#endif #endif
UE->dlsch[0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); UE->dlsch[subframe&0x1][0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf ("[DLSIM] I convert pmi to rank1 eNode B 2\n"); printf ("[DLSIM] I convert pmi to rank1 eNode B 2\n");
#endif #endif
UE->dlsch[0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[0][TB]->pmi_alloc,6,UE->frame_parms.N_RB_DL); UE->dlsch[subframe&0x1][0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[subframe&0x1][0][TB]->pmi_alloc,6,UE->frame_parms.N_RB_DL);
} }
} }
@@ -3363,7 +3363,7 @@ int main(int argc, char **argv)
pilot3 = 9; pilot3 = 9;
} }
start_meas(&UE->phy_proc_rx); start_meas(&UE->phy_proc_rx[subframe&0x1]);
// Inner receiver scheduling for 3 slots // Inner receiver scheduling for 3 slots
for (Ns=(2*subframe);Ns<((2*subframe)+3);Ns++) { for (Ns=(2*subframe);Ns<((2*subframe)+3);Ns++) {
for (l=0;l<pilot2;l++) { for (l=0;l<pilot2;l++) {
@@ -3525,10 +3525,10 @@ int main(int argc, char **argv)
//printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti); //printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti);
if (round == 0) { if (round == 0) {
UE->dlsch[0][0]->harq_processes[0]->first_tx=1; UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->first_tx=1;
} }
if ((transmission_mode == 3 || transmission_mode ==4) && (round == 0)) { if ((transmission_mode == 3 || transmission_mode ==4) && (round == 0)) {
UE->dlsch[0][1]->harq_processes[0]->first_tx=1; UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->first_tx=1;
} }
if ((dci_alloc_rx[i].rnti == n_rnti) && if ((dci_alloc_rx[i].rnti == n_rnti) &&
@@ -3537,7 +3537,7 @@ int main(int argc, char **argv)
dci_alloc_rx[i].dci_pdu, dci_alloc_rx[i].dci_pdu,
dci_alloc_rx[i].rnti, dci_alloc_rx[i].rnti,
dci_alloc_rx[i].format, dci_alloc_rx[i].format,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -3547,30 +3547,30 @@ int main(int argc, char **argv)
UE->pdcch_vars[0]->crnti_is_temporary? UE->pdcch_vars[0]->crnti: 0)==0)) { UE->pdcch_vars[0]->crnti_is_temporary? UE->pdcch_vars[0]->crnti: 0)==0)) {
dump_dci(&UE->frame_parms,&dci_alloc_rx[i]); dump_dci(&UE->frame_parms,&dci_alloc_rx[i]);
coded_bits_per_codeword[0]= get_G(&eNB->frame_parms, coded_bits_per_codeword[0]= get_G(&eNB->frame_parms,
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->nb_rb, UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->nb_rb,
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->rb_alloc_even, UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->rb_alloc_even,
get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs), get_Qm(UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs),
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->Nl, UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->Nl,
UE->pdcch_vars[0]->num_pdcch_symbols, UE->pdcch_vars[0]->num_pdcch_symbols,
0, 0,
subframe, subframe,
transmission_mode>=7?transmission_mode:0); transmission_mode>=7?transmission_mode:0);
if (transmission_mode == 3 || transmission_mode == 4) { if (transmission_mode == 3 || transmission_mode == 4) {
coded_bits_per_codeword[1]= get_G(&eNB->frame_parms, coded_bits_per_codeword[1]= get_G(&eNB->frame_parms,
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->nb_rb, UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->nb_rb,
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->rb_alloc_even, UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->rb_alloc_even,
get_Qm(UE->dlsch[0][1]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs), get_Qm(UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs),
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->Nl, UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->Nl,
UE->pdcch_vars[1]->num_pdcch_symbols, UE->pdcch_vars[1]->num_pdcch_symbols,
0, 0,
subframe, subframe,
transmission_mode>=7?transmission_mode:0); transmission_mode>=7?transmission_mode:0);
} }
/* /*
rate = (double)dlsch_tbs25[get_I_TBS(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs)][UE->dlsch[0][0]->nb_rb-1]/(coded_bits_per_codeword); rate = (double)dlsch_tbs25[get_I_TBS(UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs)][UE->dlsch[subframe&0x1][0][0]->nb_rb-1]/(coded_bits_per_codeword);
rate*=get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs); rate*=get_Qm(UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs);
*/ */
printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword [0],UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->TBS); printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword [0],UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->TBS);
dlsch_active = 1; // what does it indicates??? dlsch_active = 1; // what does it indicates???
} else { } else {
@@ -3594,8 +3594,8 @@ int main(int argc, char **argv)
UE->pdcch_vars[0]->crnti = n_rnti; UE->pdcch_vars[0]->crnti = n_rnti;
UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
if (round == 0) { if (round == 0) {
UE->dlsch[0][0]->harq_processes[0]->first_tx=1; UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->first_tx=1;
UE->dlsch[0][1]->harq_processes[0]->first_tx=1; UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->first_tx=1;
} }
switch (transmission_mode) { switch (transmission_mode) {
@@ -3606,7 +3606,7 @@ int main(int argc, char **argv)
&DLSCH_alloc_pdu_1[0], &DLSCH_alloc_pdu_1[0],
(common_flag==0)? C_RNTI : SI_RNTI, (common_flag==0)? C_RNTI : SI_RNTI,
(common_flag==0)? format1 : format1A, (common_flag==0)? format1 : format1A,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -3617,14 +3617,14 @@ int main(int argc, char **argv)
break; break;
case 3: case 3:
//printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx); //printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->round,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->first_tx);
generate_ue_dlsch_params_from_dci(0, generate_ue_dlsch_params_from_dci(0,
subframe, subframe,
&DLSCH_alloc_pdu_1[0], &DLSCH_alloc_pdu_1[0],
(common_flag==0)? C_RNTI : SI_RNTI, (common_flag==0)? C_RNTI : SI_RNTI,
(common_flag==0)? format2A : format1A, (common_flag==0)? format2A : format1A,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -3632,7 +3632,7 @@ int main(int argc, char **argv)
P_RNTI, P_RNTI,
transmission_mode<7?0:transmission_mode, transmission_mode<7?0:transmission_mode,
UE->pdcch_vars[0]->crnti_is_temporary? UE->pdcch_vars[0]->crnti: 0); UE->pdcch_vars[0]->crnti_is_temporary? UE->pdcch_vars[0]->crnti: 0);
//printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx); //printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->round,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->first_tx);
break; break;
case 4: case 4:
generate_ue_dlsch_params_from_dci(0, generate_ue_dlsch_params_from_dci(0,
@@ -3640,7 +3640,7 @@ int main(int argc, char **argv)
&DLSCH_alloc_pdu_1[0], &DLSCH_alloc_pdu_1[0],
(common_flag==0)? C_RNTI : SI_RNTI, (common_flag==0)? C_RNTI : SI_RNTI,
(common_flag==0)? format2 : format1A,//format1A only for a codeblock (common_flag==0)? format2 : format1A,//format1A only for a codeblock
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -3657,7 +3657,7 @@ int main(int argc, char **argv)
&DLSCH_alloc_pdu2_1E[0], &DLSCH_alloc_pdu2_1E[0],
C_RNTI, C_RNTI,
format1E_2A_M10PRB, format1E_2A_M10PRB,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -3673,13 +3673,13 @@ int main(int argc, char **argv)
if (dlsch_active == 1) { if (dlsch_active == 1) {
if (TB0_active==1) if (TB0_active==1)
cur_harq_pid =UE->dlsch[0][0]->current_harq_pid; cur_harq_pid =UE->dlsch[subframe&0x1][0][0]->current_harq_pid;
else else
cur_harq_pid =UE->dlsch[0][1]->current_harq_pid; cur_harq_pid =UE->dlsch[subframe&0x1][0][1]->current_harq_pid;
if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix
/* if (transmission_mode == 5) { /* if (transmission_mode == 5) {
if ((UE->dlsch[eNB_id][0]->harq_processes[cur_harq_pid]->dl_power_off==0) && if ((UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[cur_harq_pid]->dl_power_off==0) &&
(openair_daq_vars.use_ia_receiver ==1)) { (openair_daq_vars.use_ia_receiver ==1)) {
rx_type = rx_IC_single_stream; rx_type = rx_IC_single_stream;
} else { } else {
@@ -3701,7 +3701,7 @@ int main(int argc, char **argv)
(m==UE->pdcch_vars[0]->num_pdcch_symbols)?1:0, (m==UE->pdcch_vars[0]->num_pdcch_symbols)?1:0,
rx_type, rx_type,
i_mod, i_mod,
UE->dlsch[0][0]->current_harq_pid)==-1){ UE->dlsch[subframe&0x1][0][0]->current_harq_pid)==-1){
dlsch_active = 0; dlsch_active = 0;
break; break;
} }
@@ -3788,7 +3788,7 @@ int main(int argc, char **argv)
break; break;
} }
UE->dlsch[0][TB]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; UE->dlsch[subframe&0x1][0][TB]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
coded_bits_per_codeword[TB] = get_G(&eNB->frame_parms, coded_bits_per_codeword[TB] = get_G(&eNB->frame_parms,
eNB->dlsch[0][TB]->harq_processes[0]->nb_rb, eNB->dlsch[0][TB]->harq_processes[0]->nb_rb,
eNB->dlsch[0][TB]->harq_processes[0]->rb_alloc, eNB->dlsch[0][TB]->harq_processes[0]->rb_alloc,
@@ -3798,12 +3798,12 @@ int main(int argc, char **argv)
0,subframe, 0,subframe,
transmission_mode>=7?transmission_mode:0); transmission_mode>=7?transmission_mode:0);
UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->G = coded_bits_per_codeword[TB]; UE->dlsch[subframe&0x1][0][TB]->harq_processes[UE->dlsch[subframe&0x1][0][TB]->current_harq_pid]->G = coded_bits_per_codeword[TB];
UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->Qm = get_Qm(eNB->dlsch[0][TB]->harq_processes[0]->mcs); UE->dlsch[subframe&0x1][0][TB]->harq_processes[UE->dlsch[subframe&0x1][0][TB]->current_harq_pid]->Qm = get_Qm(eNB->dlsch[0][TB]->harq_processes[0]->mcs);
if (n_frames==2) { if (n_frames==2) {
printf("Kmimo=%d, TB=%d, G=%d, TBS=%d\n",Kmimo,TB,coded_bits_per_codeword[TB], printf("Kmimo=%d, TB=%d, G=%d, TBS=%d\n",Kmimo,TB,coded_bits_per_codeword[TB],
UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->TBS); UE->dlsch[subframe&0x1][0][TB]->harq_processes[UE->dlsch[subframe&0x1][0][TB]->current_harq_pid]->TBS);
// calculate uncoded BER // calculate uncoded BER
uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[TB]); uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[TB]);
@@ -3812,7 +3812,7 @@ int main(int argc, char **argv)
sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, TB); sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, TB);
sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, TB); sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, TB);
write_output(fname,vname, UE->pdsch_vars[subframe&0x1][0]->llr[UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->codeword],coded_bits_per_codeword[TB],1,0); write_output(fname,vname, UE->pdsch_vars[subframe&0x1][0]->llr[UE->dlsch[subframe&0x1][0][TB]->harq_processes[UE->dlsch[subframe&0x1][0][TB]->current_harq_pid]->codeword],coded_bits_per_codeword[TB],1,0);
sprintf(fname,"dlsch_cw%d_e.m", TB); sprintf(fname,"dlsch_cw%d_e.m", TB);
sprintf(vname,"dlschcw%d_e", TB); sprintf(vname,"dlschcw%d_e", TB);
write_output(fname, vname,eNB->dlsch[0][TB]->harq_processes[0]->e,coded_bits_per_codeword[TB],1,4); write_output(fname, vname,eNB->dlsch[0][TB]->harq_processes[0]->e,coded_bits_per_codeword[TB],1,4);
@@ -3820,7 +3820,7 @@ int main(int argc, char **argv)
printf("trials=%d\n", trials); printf("trials=%d\n", trials);
for (i=0;i<coded_bits_per_codeword[TB];i++) for (i=0;i<coded_bits_per_codeword[TB];i++)
if (eNB->dlsch[0][TB]->harq_processes[0]->e[i] != (UE->pdsch_vars[subframe&0x1][0]->llr[UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->codeword][i]<0)) { if (eNB->dlsch[0][TB]->harq_processes[0]->e[i] != (UE->pdsch_vars[subframe&0x1][0]->llr[UE->dlsch[subframe&0x1][0][TB]->harq_processes[UE->dlsch[subframe&0x1][0][TB]->current_harq_pid]->codeword][i]<0)) {
uncoded_ber_bit[i] = 1; uncoded_ber_bit[i] = 1;
uncoded_ber++; uncoded_ber++;
} }
@@ -3842,22 +3842,22 @@ int main(int argc, char **argv)
start_meas(&UE->dlsch_unscrambling_stats); start_meas(&UE->dlsch_unscrambling_stats);
dlsch_unscrambling(&UE->frame_parms, dlsch_unscrambling(&UE->frame_parms,
0, 0,
UE->dlsch[0][TB], UE->dlsch[subframe&0x1][0][TB],
coded_bits_per_codeword[TB], coded_bits_per_codeword[TB],
UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->codeword], UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[subframe&0x1][0][TB]->harq_processes[UE->dlsch[subframe&0x1][0][TB]->current_harq_pid]->codeword],
TB, TB,
subframe<<1); subframe<<1);
stop_meas(&UE->dlsch_unscrambling_stats); stop_meas(&UE->dlsch_unscrambling_stats);
start_meas(&UE->dlsch_decoding_stats); start_meas(&UE->dlsch_decoding_stats);
ret[TB] = dlsch_decoding(UE, ret[TB] = dlsch_decoding(UE,
UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid]->codeword], UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[subframe&0x1][0][TB]->harq_processes[UE->dlsch[subframe&0x1][0][TB]->current_harq_pid]->codeword],
&UE->frame_parms, &UE->frame_parms,
UE->dlsch[0][TB], UE->dlsch[subframe&0x1][0][TB],
UE->dlsch[0][TB]->harq_processes[UE->dlsch[0][TB]->current_harq_pid], UE->dlsch[subframe&0x1][0][TB]->harq_processes[UE->dlsch[subframe&0x1][0][TB]->current_harq_pid],
0, 0,
subframe, subframe,
UE->dlsch[0][TB]->current_harq_pid, UE->dlsch[subframe&0x1][0][TB]->current_harq_pid,
1,llr8_flag); 1,llr8_flag);
stop_meas(&UE->dlsch_decoding_stats); stop_meas(&UE->dlsch_decoding_stats);
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
@@ -3865,11 +3865,11 @@ int main(int argc, char **argv)
#endif #endif
//printf("retr cw 0 = %d\n", ret[0]); //printf("retr cw 0 = %d\n", ret[0]);
//printf("current round = %d\n", UE->dlsch[0][cw_non_sic]->harq_processes[UE->dlsch[0][cw_non_sic]->current_harq_pid]->round); //printf("current round = %d\n", UE->dlsch[subframe&0x1][0][cw_non_sic]->harq_processes[UE->dlsch[subframe&0x1][0][cw_non_sic]->current_harq_pid]->round);
if (ret[TB] <= UE->dlsch[0][0]->max_turbo_iterations ) { //if CW0 is decoded, approach CW1 if (ret[TB] <= UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations ) { //if CW0 is decoded, approach CW1
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf("[DLSIM] TB%d is decoded\n", TB); printf("[DLSIM] TB%d is decoded\n", TB);
#endif #endif
@@ -3880,33 +3880,33 @@ int main(int argc, char **argv)
if (n_frames==2) { if (n_frames==2) {
printf("cw non sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber); printf("cw non sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber);
#ifdef PRINT_BYTES #ifdef PRINT_BYTES
for (s=0;s<UE->dlsch[0][TB]->harq_processes[0]->C;s++) { for (s=0;s<UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->C;s++) {
if (s<UE->dlsch[0][TB]->harq_processes[0]->Cminus) if (s<UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->Cminus)
Kr = UE->dlsch[0][TB]->harq_processes[0]->Kminus; Kr = UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->Kminus;
else else
Kr = UE->dlsch[0][TB]->harq_processes[0]->Kplus; Kr = UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0;i<Kr_bytes;i++) for (i=0;i<Kr_bytes;i++)
printf("%d : %x (%x)\n",i,UE->dlsch[0][TB]->harq_processes[0]->c[s][i], printf("%d : %x (%x)\n",i,UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->c[s][i],
UE->dlsch[0][TB]->harq_processes[0]->c[s][i]^eNB->dlsch[0][TB]->harq_processes[0]->c[s][i]); UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->c[s][i]^eNB->dlsch[0][TB]->harq_processes[0]->c[s][i]);
} }
#endif #endif
} }
UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[eNB_id][TB]->harq_processes[UE->dlsch[eNB_id][TB]->current_harq_pid]->TBS; UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[subframe&0x1][eNB_id][TB]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][TB]->current_harq_pid]->TBS;
// If the receiver is NOT SIC, Here we are done with both CW, now only to calculate BLER // If the receiver is NOT SIC, Here we are done with both CW, now only to calculate BLER
//If the receiver IS SIC, we are done only with CW0, CW1 was only compensated by this moment (y1' obtained) //If the receiver IS SIC, we are done only with CW0, CW1 was only compensated by this moment (y1' obtained)
if (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC if (UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC
/* /*
//for (round = 0 ; round < UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->round ; round++) { //for (round = 0 ; round < UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->round ; round++) {
// we assume here that the second stream has a lower MCS and is thus more likely to be decoded // we assume here that the second stream has a lower MCS and is thus more likely to be decoded
// re-encoding of second stream // re-encoding of second stream
dlsch0_ue_harq = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; dlsch0_ue_harq = UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid];
dlsch0_eNB_harq = UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; dlsch0_eNB_harq = UE->dlsch[subframe&0x1][eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid];
dlsch0_eNB_harq->mimo_mode = LARGE_CDD; dlsch0_eNB_harq->mimo_mode = LARGE_CDD;
dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc[0]; dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc[0];
@@ -3920,14 +3920,14 @@ int main(int argc, char **argv)
dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off; dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off;
dlsch0_eNB_harq->status = dlsch0_ue_harq->status; dlsch0_eNB_harq->status = dlsch0_ue_harq->status;
UE->dlsch[eNB_id]->active = UE->dlsch[eNB_id][0]->active; UE->dlsch[subframe&0x1][eNB_id]->active = UE->dlsch[subframe&0x1][eNB_id][0]->active;
UE->dlsch[eNB_id]->rnti = UE->dlsch[eNB_id][0]->rnti; UE->dlsch[subframe&0x1][eNB_id]->rnti = UE->dlsch[subframe&0x1][eNB_id][0]->rnti;
UE->dlsch[eNB_id]->current_harq_pid = UE->dlsch[eNB_id][0]->current_harq_pid; UE->dlsch[subframe&0x1][eNB_id]->current_harq_pid = UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid;
dlsch_encoding(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->b, dlsch_encoding(UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->b,
&UE->frame_parms, &UE->frame_parms,
num_pdcch_symbols, num_pdcch_symbols,
UE->dlsch[eNB_id], UE->dlsch[subframe&0x1][eNB_id],
0,subframe, 0,subframe,
&UE->dlsch_rate_matching_stats, &UE->dlsch_rate_matching_stats,
&UE->dlsch_turbo_encoding_stats, &UE->dlsch_turbo_encoding_stats,
@@ -3935,10 +3935,10 @@ int main(int argc, char **argv)
); );
coded_bits_per_codeword = get_G(&UE->frame_parms, coded_bits_per_codeword = get_G(&UE->frame_parms,
UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id]->current_harq_pid]->nb_rb, UE->dlsch[subframe&0x1][eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id]->current_harq_pid]->nb_rb,
UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id]->current_harq_pid]->rb_alloc, UE->dlsch[subframe&0x1][eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id]->current_harq_pid]->rb_alloc,
get_Qm(UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id]->current_harq_pid]->mcs), get_Qm(UE->dlsch[subframe&0x1][eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id]->current_harq_pid]->mcs),
UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id]->current_harq_pid]->Nl, UE->dlsch[subframe&0x1][eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id]->current_harq_pid]->Nl,
num_pdcch_symbols, num_pdcch_symbols,
0,subframe); 0,subframe);
@@ -3946,7 +3946,7 @@ int main(int argc, char **argv)
//scrambling //scrambling
dlsch_scrambling(&UE->frame_parms, dlsch_scrambling(&UE->frame_parms,
0, 0,
UE->dlsch[eNB_id], UE->dlsch[subframe&0x1][eNB_id],
coded_bits_per_codeword, coded_bits_per_codeword,
0, 0,
subframe<<1); subframe<<1);
@@ -3958,7 +3958,7 @@ int main(int argc, char **argv)
subframe, subframe,
&UE->frame_parms, &UE->frame_parms,
num_pdcch_symbols, num_pdcch_symbols,
&UE->dlsch[0][0], &UE->dlsch[subframe&0x1][0][0],
NULL); NULL);
// sic_buffer is a vector of size nb_antennas_tx, but both contain the same signal, since we do modulation without precoding // sic_buffer is a vector of size nb_antennas_tx, but both contain the same signal, since we do modulation without precoding
// precoding is contained in effective channel estimate // precoding is contained in effective channel estimate
@@ -3998,8 +3998,8 @@ int main(int argc, char **argv)
} }
if ((UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && if ((UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) && (TB0_active == 1) && (UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) && (TB0_active == 1) &&
(rx_type==rx_SIC_dual_stream)) { (rx_type==rx_SIC_dual_stream)) {
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf("[DLSIM] Starting SIC procedure\n"); printf("[DLSIM] Starting SIC procedure\n");
@@ -4018,10 +4018,10 @@ int main(int argc, char **argv)
#endif #endif
//printf("I enter round_sic loop \n"); //printf("I enter round_sic loop \n");
//printf("round_sic= %d\n", round_sic); //printf("round_sic= %d\n", round_sic);
dlsch0_ue_harq = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; dlsch0_ue_harq = UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid];
dlsch0_eNB_harq = UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; dlsch0_eNB_harq = UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid];
dlsch0_eNB_harq->mimo_mode = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode; dlsch0_eNB_harq->mimo_mode = UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->mimo_mode;
dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0]; dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0];
dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb; dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb;
dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs; dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs;
@@ -4033,28 +4033,28 @@ int main(int argc, char **argv)
dlsch0_eNB_harq->status = dlsch0_ue_harq->status; dlsch0_eNB_harq->status = dlsch0_ue_harq->status;
if (round_sic == 0){ if (round_sic == 0){
UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][1]->current_harq_pid]->rvidx = 0; UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][1]->current_harq_pid]->rvidx = 0;
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->rvidx=0; UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->rvidx=0;
} }
else if (round_sic == 1){ else if (round_sic == 1){
UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][1]->current_harq_pid]->rvidx = 1; UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][1]->current_harq_pid]->rvidx = 1;
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->rvidx=1; UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->rvidx=1;
} }
else if (round_sic == 2){ else if (round_sic == 2){
UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][1]->current_harq_pid]->rvidx = 2; UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][1]->current_harq_pid]->rvidx = 2;
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->rvidx=2; UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->rvidx=2;
} }
else{ else{
UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[eNB_id][1]->current_harq_pid]->rvidx = 3; UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][1]->current_harq_pid]->rvidx = 3;
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->rvidx=3; UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->rvidx=3;
} }
UE->dlsch_eNB[eNB_id]->active = UE->dlsch[eNB_id][0]->active; UE->dlsch_eNB[eNB_id]->active = UE->dlsch[subframe&0x1][eNB_id][0]->active;
UE->dlsch_eNB[eNB_id]->rnti = UE->dlsch[eNB_id][0]->rnti; UE->dlsch_eNB[eNB_id]->rnti = UE->dlsch[subframe&0x1][eNB_id][0]->rnti;
UE->dlsch_eNB[eNB_id]->current_harq_pid = UE->dlsch[eNB_id][0]->current_harq_pid; UE->dlsch_eNB[eNB_id]->current_harq_pid = UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid;
dlsch_encoding_SIC(UE, dlsch_encoding_SIC(UE,
input_buffer0[0], //UE->dlsch[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->b,, input_buffer0[0], //UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->b,,
num_pdcch_symbols, num_pdcch_symbols,
UE->dlsch_eNB[eNB_id], UE->dlsch_eNB[eNB_id],
0, 0,
@@ -4089,8 +4089,8 @@ int main(int argc, char **argv)
coded_bits_per_codeword[0]); coded_bits_per_codeword[0]);
// write_output("sic_buffer.m","sic", *sic_buffer,re_allocated,1,1); // write_output("sic_buffer.m","sic", *sic_buffer,re_allocated,1,1);
// write_output("rxdataF_comp1.m","rxF_comp1", *UE->pdsch_vars[eNB_id]->rxdataF_comp1[UE->dlsch[0][0]->current_harq_pid][round],14*12*25,1,1); // write_output("rxdataF_comp1.m","rxF_comp1", *UE->pdsch_vars[eNB_id]->rxdataF_comp1[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round],14*12*25,1,1);
// write_output("rxdataF_rho.m","rho", *UE->pdsch_vars[eNB_id]->dl_ch_rho_ext[UE->dlsch[0][0]->current_harq_pid][round],14*12*25,1,1); // write_output("rxdataF_rho.m","rho", *UE->pdsch_vars[eNB_id]->dl_ch_rho_ext[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round],14*12*25,1,1);
switch (get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)){ switch (get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)){
@@ -4100,58 +4100,58 @@ int main(int argc, char **argv)
case 2: case 2:
dlsch_qpsk_llr_SIC(&UE->frame_parms, dlsch_qpsk_llr_SIC(&UE->frame_parms,
UE->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[UE->dlsch[0][0]->current_harq_pid][round_sic], UE->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round_sic],
sic_buffer, sic_buffer,
UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[UE->dlsch[0][0]->current_harq_pid][round_sic], UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round_sic],
UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword], UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->codeword],
num_pdcch_symbols, num_pdcch_symbols,
dlsch0_eNB_harq->nb_rb, dlsch0_eNB_harq->nb_rb,
subframe, subframe,
dlsch0_eNB_harq->rb_alloc[0], dlsch0_eNB_harq->rb_alloc[0],
get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs), get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs),
UE->dlsch[eNB_id][0]); UE->dlsch[subframe&0x1][eNB_id][0]);
break; break;
case 4: case 4:
dlsch_16qam_llr_SIC(&UE->frame_parms, dlsch_16qam_llr_SIC(&UE->frame_parms,
UE->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[UE->dlsch[0][0]->current_harq_pid][round_sic], UE->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round_sic],
sic_buffer, sic_buffer,
UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[UE->dlsch[0][0]->current_harq_pid][round_sic], UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round_sic],
UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword], UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->codeword],
num_pdcch_symbols, num_pdcch_symbols,
UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag1[UE->dlsch[0][0]->current_harq_pid][round_sic], UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag1[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round_sic],
dlsch0_eNB_harq->nb_rb, dlsch0_eNB_harq->nb_rb,
subframe, subframe,
dlsch0_eNB_harq->rb_alloc[0], dlsch0_eNB_harq->rb_alloc[0],
get_Qm(eNB->dlsch[0][TB]->harq_processes[0]->mcs), get_Qm(eNB->dlsch[0][TB]->harq_processes[0]->mcs),
UE->dlsch[eNB_id][0]); UE->dlsch[subframe&0x1][eNB_id][0]);
break; break;
case 6: case 6:
dlsch_64qam_llr_SIC(&UE->frame_parms, dlsch_64qam_llr_SIC(&UE->frame_parms,
UE->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[UE->dlsch[0][0]->current_harq_pid][round_sic], UE->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round_sic],
sic_buffer, sic_buffer,
UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[UE->dlsch[0][0]->current_harq_pid][round_sic], UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_rho_ext[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round_sic],
UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword], UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->codeword],
num_pdcch_symbols, num_pdcch_symbols,
UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag1[UE->dlsch[0][0]->current_harq_pid][round_sic], UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_mag1[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round_sic],
UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_magb1[UE->dlsch[0][0]->current_harq_pid][round_sic], UE->pdsch_vars[subframe&0x1][eNB_id]->dl_ch_magb1[UE->dlsch[subframe&0x1][0][0]->current_harq_pid][round_sic],
dlsch0_eNB_harq->nb_rb, dlsch0_eNB_harq->nb_rb,
subframe, subframe,
dlsch0_eNB_harq->rb_alloc[0], dlsch0_eNB_harq->rb_alloc[0],
get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs), get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs),
UE->dlsch[eNB_id][TB]); UE->dlsch[subframe&0x1][eNB_id][TB]);
break; break;
} }
//}// rouns sic //}// rouns sic
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf("[DLSIM] TB1 is mapped into CW%d\n", UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword); printf("[DLSIM] TB1 is mapped into CW%d\n", UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->codeword);
#endif #endif
// write_output("rxdata_llr1.m","llr1", UE->pdsch_vars[eNB_id]->llr[1],re_allocated*2,1,0); // write_output("rxdata_llr1.m","llr1", UE->pdsch_vars[eNB_id]->llr[1],re_allocated*2,1,0);
// replace cw_sic with TB+1 // replace cw_sic with TB+1
UE->dlsch[0][1]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; UE->dlsch[subframe&0x1][0][1]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
coded_bits_per_codeword[1]= get_G(&eNB->frame_parms, coded_bits_per_codeword[1]= get_G(&eNB->frame_parms,
eNB->dlsch[0][1]->harq_processes[0]->nb_rb, eNB->dlsch[0][1]->harq_processes[0]->nb_rb,
eNB->dlsch[0][1]->harq_processes[0]->rb_alloc, eNB->dlsch[0][1]->harq_processes[0]->rb_alloc,
@@ -4162,12 +4162,12 @@ int main(int argc, char **argv)
subframe, subframe,
transmission_mode>=7?transmission_mode:0); transmission_mode>=7?transmission_mode:0);
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->G = coded_bits_per_codeword[1]; UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->G = coded_bits_per_codeword[1];
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->Qm = get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs); UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->Qm = get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs);
if (n_frames==2) { if (n_frames==2) {
printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,1,coded_bits_per_codeword[1], printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,1,coded_bits_per_codeword[1],
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->TBS); UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->TBS);
// calculate uncoded BER // calculate uncoded BER
uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[1]); uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[1]);
@@ -4181,7 +4181,7 @@ int main(int argc, char **argv)
uncoded_ber=0; uncoded_ber=0;
printf("trials=%d\n", trials); printf("trials=%d\n", trials);
for (i=0;i<coded_bits_per_codeword[1];i++) for (i=0;i<coded_bits_per_codeword[1];i++)
if (eNB->dlsch[0][1]->harq_processes[0]->e[i] != (UE->pdsch_vars[subframe&0x1][0]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword][i]<0)) { if (eNB->dlsch[0][1]->harq_processes[0]->e[i] != (UE->pdsch_vars[subframe&0x1][0]->llr[UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->codeword][i]<0)) {
uncoded_ber_bit[i] = 1; uncoded_ber_bit[i] = 1;
uncoded_ber++; uncoded_ber++;
} }
@@ -4201,9 +4201,9 @@ int main(int argc, char **argv)
start_meas(&UE->dlsch_unscrambling_stats); start_meas(&UE->dlsch_unscrambling_stats);
dlsch_unscrambling(&UE->frame_parms, dlsch_unscrambling(&UE->frame_parms,
0, 0,
UE->dlsch[0][1], UE->dlsch[subframe&0x1][0][1],
coded_bits_per_codeword[1], coded_bits_per_codeword[1],
UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword], UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->codeword],
1, 1,
subframe<<1); subframe<<1);
stop_meas(&UE->dlsch_unscrambling_stats); stop_meas(&UE->dlsch_unscrambling_stats);
@@ -4211,13 +4211,13 @@ int main(int argc, char **argv)
start_meas(&UE->dlsch_decoding_stats); start_meas(&UE->dlsch_decoding_stats);
ret[1] = dlsch_decoding(UE, ret[1] = dlsch_decoding(UE,
UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid]->codeword], UE->pdsch_vars[subframe&0x1][eNB_id]->llr[UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid]->codeword],
&UE->frame_parms, &UE->frame_parms,
UE->dlsch[0][1], UE->dlsch[subframe&0x1][0][1],
UE->dlsch[0][1]->harq_processes[UE->dlsch[0][1]->current_harq_pid], UE->dlsch[subframe&0x1][0][1]->harq_processes[UE->dlsch[subframe&0x1][0][1]->current_harq_pid],
0, 0,
subframe, subframe,
UE->dlsch[0][1]->current_harq_pid, UE->dlsch[subframe&0x1][0][1]->current_harq_pid,
1,llr8_flag); 1,llr8_flag);
stop_meas(&UE->dlsch_decoding_stats); stop_meas(&UE->dlsch_decoding_stats);
@@ -4227,7 +4227,7 @@ int main(int argc, char **argv)
//printf("ret TB 1 = %d round %d \n", ret[1], round); //printf("ret TB 1 = %d round %d \n", ret[1], round);
if (ret[1] <=UE->dlsch[0][0]->max_turbo_iterations ) { if (ret[1] <=UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations ) {
decoded_in_sic[round]++; decoded_in_sic[round]++;
round_sic = round+1; // to exit round_sic round_sic = round+1; // to exit round_sic
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
@@ -4241,19 +4241,19 @@ int main(int argc, char **argv)
printf("cw sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",1,round,uncoded_ber); printf("cw sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",1,round,uncoded_ber);
#ifdef PRINT_BYTES #ifdef PRINT_BYTES
for (s=0;s<UE->dlsch[0][1]->harq_processes[0]->C;s++) { for (s=0;s<UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->C;s++) {
if (s<UE->dlsch[0][1]->harq_processes[0]->Cminus) if (s<UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->Cminus)
Kr = UE->dlsch[0][1]->harq_processes[0]->Kminus; Kr = UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->Kminus;
else else
Kr = UE->dlsch[0][1]->harq_processes[0]->Kplus; Kr = UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0;i<Kr_bytes;i++) for (i=0;i<Kr_bytes;i++)
printf("%d : %x (%x)\n",i,UE->dlsch[0][1]->harq_processes[0]->c[s][i], printf("%d : %x (%x)\n",i,UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->c[s][i],
UE->dlsch[0][1]->harq_processes[0]->c[s][i]^eNB->dlsch[0][1]->harq_processes[0]->c[s][i]); UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->c[s][i]^eNB->dlsch[0][1]->harq_processes[0]->c[s][i]);
} }
#endif #endif
} }
@@ -4261,7 +4261,7 @@ int main(int argc, char **argv)
} //round_sic } //round_sic
if (ret[1] > UE->dlsch[0][0]->max_turbo_iterations ){ if (ret[1] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations ){
errs[1][round]++; errs[1][round]++;
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
printf("[DLSIM] TB1 is not decoded in SIC loop, errs[TB1][round %d] = %d\n",round, errs[1][round]); printf("[DLSIM] TB1 is not decoded in SIC loop, errs[TB1][round %d] = %d\n",round, errs[1][round]);
@@ -4276,23 +4276,23 @@ int main(int argc, char **argv)
//if ((n_frames==1) || (SNR>=30)) { //if ((n_frames==1) || (SNR>=30)) {
printf("cw sic %d, round %d: DLSCH errors found, uncoded ber %f\n",1,round,uncoded_ber); printf("cw sic %d, round %d: DLSCH errors found, uncoded ber %f\n",1,round,uncoded_ber);
#ifdef PRINT_BYTES #ifdef PRINT_BYTES
for (s=0;s<UE->dlsch[0][1]->harq_processes[0]->C;s++) { for (s=0;s<UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->C;s++) {
if (s<UE->dlsch[0][1]->harq_processes[0]->Cminus) if (s<UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->Cminus)
Kr = UE->dlsch[0][1]->harq_processes[0]->Kminus; Kr = UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->Kminus;
else else
Kr = UE->dlsch[0][1]->harq_processes[0]->Kplus; Kr = UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0;i<Kr_bytes;i++) for (i=0;i<Kr_bytes;i++)
printf("%d : %x (%x)\n",i,UE->dlsch[0][1]->harq_processes[0]->c[s][i], printf("%d : %x (%x)\n",i,UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->c[s][i],
UE->dlsch[0][1]->harq_processes[0]->c[s][i]^eNB->dlsch[0][1]->harq_processes[0]->c[s][i]); UE->dlsch[subframe&0x1][0][1]->harq_processes[0]->c[s][i]^eNB->dlsch[0][1]->harq_processes[0]->c[s][i]);
} }
#endif #endif
} //n_frames==1 } //n_frames==1
// exit(0); // exit(0);
} //if (ret > UE->dlsch[0][1]->max_turbo_iterations ) } //if (ret > UE->dlsch[subframe&0x1][0][1]->max_turbo_iterations )
}//if SIC }//if SIC
} else { } else {
@@ -4307,8 +4307,8 @@ int main(int argc, char **argv)
iter_trials[0]++; iter_trials[0]++;
}*/ }*/
if ((UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && if ((UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) && (UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) &&
(rx_type==rx_SIC_dual_stream) && (TB0_active ==1)) { (rx_type==rx_SIC_dual_stream) && (TB0_active ==1)) {
errs[1][round]++; errs[1][round]++;
#ifdef DEBUG_HARQ #ifdef DEBUG_HARQ
@@ -4327,18 +4327,18 @@ int main(int argc, char **argv)
//if ((n_frames==1) || (SNR>=30)) { //if ((n_frames==1) || (SNR>=30)) {
printf("cw %d, round %d: DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber); printf("cw %d, round %d: DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber);
#ifdef PRINT_BYTES #ifdef PRINT_BYTES
for (s=0;s<UE->dlsch[0][TB]->harq_processes[0]->C;s++) { for (s=0;s<UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->C;s++) {
if (s<UE->dlsch[0][TB]->harq_processes[0]->Cminus) if (s<UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->Cminus)
Kr = UE->dlsch[0][TB]->harq_processes[0]->Kminus; Kr = UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->Kminus;
else else
Kr = UE->dlsch[0][TB]->harq_processes[0]->Kplus; Kr = UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0;i<Kr_bytes;i++) for (i=0;i<Kr_bytes;i++)
printf("%d : %x (%x)\n",i,UE->dlsch[0][TB]->harq_processes[0]->c[s][i], printf("%d : %x (%x)\n",i,UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->c[s][i],
UE->dlsch[0][TB]->harq_processes[0]->c[s][i]^eNB->dlsch[0][TB]->harq_processes[0]->c[s][i]); UE->dlsch[subframe&0x1][0][TB]->harq_processes[0]->c[s][i]^eNB->dlsch[0][TB]->harq_processes[0]->c[s][i]);
} }
#endif #endif
} }
@@ -4347,7 +4347,7 @@ int main(int argc, char **argv)
TB++; // to terminate the loop over TB TB++; // to terminate the loop over TB
} }
stop_meas(&UE->phy_proc_rx); stop_meas(&UE->phy_proc_rx[subframe&0x1]);
if (n_frames==1) { if (n_frames==1) {
@@ -4410,12 +4410,12 @@ int main(int argc, char **argv)
UE->frame_parms.ofdm_symbol_size*nsymb,1,1); UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
} }
//pdsch_vars //pdsch_vars
dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round, UE->dlsch[0][0]->current_harq_pid); dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round, UE->dlsch[subframe&0x1][0][0]->current_harq_pid);
/* /*
write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
write_output("dlsch_eNB_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); write_output("dlsch_eNB_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
write_output("dlsch_UE_w.m","w",UE->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); write_output("dlsch_UE_w.m","w",UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0);
*/ */
//pdcch_vars //pdcch_vars
@@ -4439,15 +4439,15 @@ int main(int argc, char **argv)
printf("[DLSIM] Errors errs[TB0][round %d] = %d, errs[TB1][round %d] = %d\n ", round, errs[0][round], round, errs[1][round]); printf("[DLSIM] Errors errs[TB0][round %d] = %d, errs[TB1][round %d] = %d\n ", round, errs[0][round], round, errs[1][round]);
#endif #endif
if ((transmission_mode != 3) && (transmission_mode !=4) && (ret[0] > UE->dlsch[0][0]->max_turbo_iterations)){ if ((transmission_mode != 3) && (transmission_mode !=4) && (ret[0] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations)){
//printf("flag 1 \n"); //printf("flag 1 \n");
round++; round++;
} }
if (transmission_mode == 3 || transmission_mode == 4 ) { if (transmission_mode == 3 || transmission_mode == 4 ) {
if (ret[0] > UE->dlsch[0][0]->max_turbo_iterations && if (ret[0] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations &&
ret[1] > UE->dlsch[0][0]->max_turbo_iterations){ ret[1] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations){
resend_both[round]++; resend_both[round]++;
round++; round++;
resend_cw0_cw1=1; //resend both cws resend_cw0_cw1=1; //resend both cws
@@ -4455,8 +4455,8 @@ int main(int argc, char **argv)
TB0_active=1; TB0_active=1;
TB1_active=1; TB1_active=1;
} }
else if (ret[1] > UE->dlsch[0][0]->max_turbo_iterations && else if (ret[1] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations &&
ret[0] <= UE->dlsch[0][0]->max_turbo_iterations){ ret[0] <= UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations){
resend_one[round]++; resend_one[round]++;
resend_cw0_cw1=0; resend_cw0_cw1=0;
TB0_active=0; TB0_active=0;
@@ -4476,8 +4476,8 @@ int main(int argc, char **argv)
#endif #endif
round++; round++;
} }
else if (ret[0] > UE->dlsch[0][0]->max_turbo_iterations && else if (ret[0] > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations &&
ret[1] <= UE->dlsch[0][0]->max_turbo_iterations){ ret[1] <= UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations){
resend_one[round]++; resend_one[round]++;
resend_cw0_cw1=0; resend_cw0_cw1=0;
TB0_active=1; TB0_active=1;
@@ -4531,7 +4531,7 @@ int main(int argc, char **argv)
double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0;
double t_rx = (double)UE->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; double t_rx = (double)UE->phy_proc_rx[subframe&0x1].p_time/cpu_freq_GHz/1000.0;
double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0;
double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0; double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0;
double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0;
@@ -4796,7 +4796,7 @@ int main(int argc, char **argv)
rate[0]*effective_rate, rate[0]*effective_rate,
100*effective_rate, 100*effective_rate,
rate[0], rate[0],
rate[0]*get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs), rate[0]*get_Qm(UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs),
(1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+ (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+
4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)eNB->dlsch[0][0]->harq_processes[0]->TBS, 4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)eNB->dlsch[0][0]->harq_processes[0]->TBS,
(1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2]) (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])
@@ -4864,10 +4864,10 @@ int main(int argc, char **argv)
eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials); eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials);
printf("\n\nUE RX function statistics (per 1ms subframe)\n\n"); printf("\n\nUE RX function statistics (per 1ms subframe)\n\n");
std_phy_proc_rx = sqrt((double)UE->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, std_phy_proc_rx = sqrt((double)UE->phy_proc_rx[subframe&0x1].diff_square/pow(cpu_freq_GHz,2)/pow(1000,
2)/UE->phy_proc_rx.trials - pow((double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); 2)/UE->phy_proc_rx[subframe&0x1].trials - pow((double)UE->phy_proc_rx[subframe&0x1].diff/UE->phy_proc_rx[subframe&0x1].trials/cpu_freq_GHz/1000,2));
printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000.0, printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx[subframe&0x1].diff/UE->phy_proc_rx[subframe&0x1].trials/cpu_freq_GHz/1000.0,
UE->phy_proc_rx.trials*2/3); UE->phy_proc_rx[subframe&0x1].trials*2/3);
printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median,
rx_q1, rx_q3, n_rx_dropped); rx_q1, rx_q3, n_rx_dropped);
std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
@@ -4901,7 +4901,7 @@ int main(int argc, char **argv)
printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n", printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n",
(double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials); (double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials);
printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n", printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n",
UE->dlsch[0][0]->harq_processes[0]->Cminus ? UE->dlsch[0][0]->harq_processes[0]->Kminus : UE->dlsch[0][0]->harq_processes[0]->Kplus, UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Cminus ? UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kminus : UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kplus,
(double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials); (double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials);
printf(" |__ init %f us (cycles/iter %f, %d trials)\n", printf(" |__ init %f us (cycles/iter %f, %d trials)\n",
(double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0,
@@ -5189,7 +5189,7 @@ int main(int argc, char **argv)
eNB->dlsch_modulation_stats.trials, eNB->dlsch_modulation_stats.trials,
eNB->dlsch_scrambling_stats.trials, eNB->dlsch_scrambling_stats.trials,
eNB->dlsch_encoding_stats.trials, eNB->dlsch_encoding_stats.trials,
UE->phy_proc_rx.trials, UE->phy_proc_rx[subframe&0x1].trials,
UE->ofdm_demod_stats.trials, UE->ofdm_demod_stats.trials,
UE->dlsch_rx_pdcch_stats.trials, UE->dlsch_rx_pdcch_stats.trials,
UE->dlsch_llr_stats.trials, UE->dlsch_llr_stats.trials,
@@ -5202,7 +5202,7 @@ int main(int argc, char **argv)
get_time_meas_us(&eNB->dlsch_modulation_stats), get_time_meas_us(&eNB->dlsch_modulation_stats),
get_time_meas_us(&eNB->dlsch_scrambling_stats), get_time_meas_us(&eNB->dlsch_scrambling_stats),
get_time_meas_us(&eNB->dlsch_encoding_stats), get_time_meas_us(&eNB->dlsch_encoding_stats),
get_time_meas_us(&UE->phy_proc_rx), get_time_meas_us(&UE->phy_proc_rx[subframe&0x1]),
nsymb*get_time_meas_us(&UE->ofdm_demod_stats), nsymb*get_time_meas_us(&UE->ofdm_demod_stats),
get_time_meas_us(&UE->dlsch_rx_pdcch_stats), get_time_meas_us(&UE->dlsch_rx_pdcch_stats),
3*get_time_meas_us(&UE->dlsch_llr_stats), 3*get_time_meas_us(&UE->dlsch_llr_stats),
@@ -5326,7 +5326,7 @@ int main(int argc, char **argv)
free_eNB_dlsch(eNB->dlsch[0][i]); free_eNB_dlsch(eNB->dlsch[0][i]);
printf("UE %d\n",i); printf("UE %d\n",i);
free_ue_dlsch(UE->dlsch[0][i]); free_ue_dlsch(UE->dlsch[subframe&0x1][0][i]);
} }
+66 -66
View File
@@ -953,14 +953,14 @@ int main(int argc, char **argv)
} }
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
UE->dlsch[0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); UE->dlsch[subframe&0x1][0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
if (!UE->dlsch[0][i]) { if (!UE->dlsch[subframe&0x1][0][i]) {
printf("Can't get ue dlsch structures\n"); printf("Can't get ue dlsch structures\n");
exit(-1); exit(-1);
} }
UE->dlsch[0][i]->rnti = n_rnti; UE->dlsch[subframe&0x1][0][i]->rnti = n_rnti;
} }
// structure for SIC at UE // structure for SIC at UE
@@ -2069,7 +2069,7 @@ int main(int argc, char **argv)
reset_meas(&eNB->dlsch_rate_matching_stats); reset_meas(&eNB->dlsch_rate_matching_stats);
reset_meas(&eNB->dlsch_turbo_encoding_stats); reset_meas(&eNB->dlsch_turbo_encoding_stats);
reset_meas(&UE->phy_proc_rx); // total UE rx reset_meas(&UE->phy_proc_rx[subframe&0x1]); // total UE rx
reset_meas(&UE->ofdm_demod_stats); reset_meas(&UE->ofdm_demod_stats);
reset_meas(&UE->dlsch_channel_estimation_stats); reset_meas(&UE->dlsch_channel_estimation_stats);
reset_meas(&UE->dlsch_freq_offset_estimation_stats); reset_meas(&UE->dlsch_freq_offset_estimation_stats);
@@ -2112,9 +2112,9 @@ int main(int argc, char **argv)
//if (trials%100==0) //if (trials%100==0)
eNB2UE[0]->first_run = 1; eNB2UE[0]->first_run = 1;
ret = UE->dlsch[0][0]->max_turbo_iterations+1; ret = UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations+1;
while ((round < num_rounds) && (ret > UE->dlsch[0][0]->max_turbo_iterations)) { while ((round < num_rounds) && (ret > UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations)) {
//printf("Trial %d, round %d\n",trials,round); //printf("Trial %d, round %d\n",trials,round);
round_trials[round]++; round_trials[round]++;
@@ -2601,7 +2601,7 @@ PMI_FEEDBACK:
// use the PMI from previous trial // use the PMI from previous trial
if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL); eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL);
UE->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
if (n_users>1) if (n_users>1)
eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555);
@@ -3059,7 +3059,7 @@ PMI_FEEDBACK:
} }
start_meas(&UE->phy_proc_rx); start_meas(&UE->phy_proc_rx[subframe&0x1]);
// Inner receiver scheduling for 3 slots // Inner receiver scheduling for 3 slots
@@ -3227,7 +3227,7 @@ PMI_FEEDBACK:
for (i=0; i<dci_cnt; i++) { for (i=0; i<dci_cnt; i++) {
// printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti); // printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti);
if (round == 0) UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->first_tx=1; if (round == 0) UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->first_tx=1;
if ((dci_alloc_rx[i].rnti == n_rnti) && if ((dci_alloc_rx[i].rnti == n_rnti) &&
(generate_ue_dlsch_params_from_dci(0, (generate_ue_dlsch_params_from_dci(0,
@@ -3235,7 +3235,7 @@ PMI_FEEDBACK:
dci_alloc_rx[i].dci_pdu, dci_alloc_rx[i].dci_pdu,
dci_alloc_rx[i].rnti, dci_alloc_rx[i].rnti,
dci_alloc_rx[i].format, dci_alloc_rx[i].format,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -3244,23 +3244,23 @@ PMI_FEEDBACK:
transmission_mode<7?0:transmission_mode))) { transmission_mode<7?0:transmission_mode))) {
//dump_dci(&UE->frame_parms,&dci_alloc_rx[i]); //dump_dci(&UE->frame_parms,&dci_alloc_rx[i]);
coded_bits_per_codeword = get_G(&eNB->frame_parms, coded_bits_per_codeword = get_G(&eNB->frame_parms,
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->nb_rb, UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->nb_rb,
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->rb_alloc_even, UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->rb_alloc_even,
get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs), get_Qm(UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs),
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->Nl, UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->Nl,
UE->pdcch_vars[0]->num_pdcch_symbols, UE->pdcch_vars[0]->num_pdcch_symbols,
0, 0,
subframe, subframe,
(transmission_mode<7?0:transmission_mode)); (transmission_mode<7?0:transmission_mode));
/*if (transmission_mode==7 && common_flag==0) /*if (transmission_mode==7 && common_flag==0)
UE->dlsch[0][0]->harq_processes[0]->mimo_mode = TM7; */ UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->mimo_mode = TM7; */
/* /*
rate = (double)dlsch_tbs25[get_I_TBS(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs)][UE->dlsch[0][0]->nb_rb-1]/(coded_bits_per_codeword); rate = (double)dlsch_tbs25[get_I_TBS(UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs)][UE->dlsch[subframe&0x1][0][0]->nb_rb-1]/(coded_bits_per_codeword);
rate*=get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs); rate*=get_Qm(UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs);
*/ */
printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword, printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword,
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->TBS); UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->TBS);
dlsch_active = 1; dlsch_active = 1;
} else { } else {
@@ -3288,7 +3288,7 @@ PMI_FEEDBACK:
UE->pdcch_vars[0]->crnti = n_rnti; UE->pdcch_vars[0]->crnti = n_rnti;
UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
if (round == 0) UE->dlsch[0][0]->harq_processes[0]->first_tx=1; if (round == 0) UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->first_tx=1;
switch (transmission_mode) { switch (transmission_mode) {
case 1: case 1:
@@ -3299,7 +3299,7 @@ PMI_FEEDBACK:
&DLSCH_alloc_pdu_1[0], &DLSCH_alloc_pdu_1[0],
(common_flag==0)? C_RNTI : SI_RNTI, (common_flag==0)? C_RNTI : SI_RNTI,
(common_flag==0)? format1 : format1A, (common_flag==0)? format1 : format1A,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -3307,24 +3307,24 @@ PMI_FEEDBACK:
P_RNTI, P_RNTI,
transmission_mode<7?0:transmission_mode); transmission_mode<7?0:transmission_mode);
/*if(transmission_mode==7 && common_flag==0) /*if(transmission_mode==7 && common_flag==0)
UE->dlsch[0][0]->harq_processes[0]->mimo_mode = TM7;*/ UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->mimo_mode = TM7;*/
break; break;
case 3: case 3:
// printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx); // printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->round,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->first_tx);
generate_ue_dlsch_params_from_dci(0, generate_ue_dlsch_params_from_dci(0,
subframe, subframe,
&DLSCH_alloc_pdu_1[0], &DLSCH_alloc_pdu_1[0],
(common_flag==0)? C_RNTI : SI_RNTI, (common_flag==0)? C_RNTI : SI_RNTI,
(common_flag==0)? format2A : format1A, (common_flag==0)? format2A : format1A,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
0, 0,
P_RNTI, P_RNTI,
0); 0);
// printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx); // printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->round,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->first_tx);
break; break;
case 4: case 4:
@@ -3333,7 +3333,7 @@ PMI_FEEDBACK:
&DLSCH_alloc_pdu_1[0], &DLSCH_alloc_pdu_1[0],
(common_flag==0)? C_RNTI : SI_RNTI, (common_flag==0)? C_RNTI : SI_RNTI,
(common_flag==0)? format2 : format1A, (common_flag==0)? format2 : format1A,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -3349,7 +3349,7 @@ PMI_FEEDBACK:
&DLSCH_alloc_pdu2_1E[0], &DLSCH_alloc_pdu2_1E[0],
C_RNTI, C_RNTI,
format1E_2A_M10PRB, format1E_2A_M10PRB,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
&UE->frame_parms, &UE->frame_parms,
UE->pdsch_config_dedicated, UE->pdsch_config_dedicated,
SI_RNTI, SI_RNTI,
@@ -3381,7 +3381,7 @@ PMI_FEEDBACK:
if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix) if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix)
if ((transmission_mode == 5) && if ((transmission_mode == 5) &&
(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->dl_power_off==0) && (UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->dl_power_off==0) &&
(UE->use_ia_receiver ==1)) { (UE->use_ia_receiver ==1)) {
dual_stream_UE = 1; dual_stream_UE = 1;
} else { } else {
@@ -3404,7 +3404,7 @@ PMI_FEEDBACK:
(m==UE->pdcch_vars[0]->num_pdcch_symbols)?1:0, (m==UE->pdcch_vars[0]->num_pdcch_symbols)?1:0,
dual_stream_UE, dual_stream_UE,
i_mod, i_mod,
UE->dlsch[0][0]->current_harq_pid)==-1) { UE->dlsch[subframe&0x1][0][0]->current_harq_pid)==-1) {
dlsch_active = 0; dlsch_active = 0;
break; break;
} }
@@ -3430,7 +3430,7 @@ PMI_FEEDBACK:
0, 0,
dual_stream_UE, dual_stream_UE,
i_mod, i_mod,
UE->dlsch[0][0]->current_harq_pid)==-1) { UE->dlsch[subframe&0x1][0][0]->current_harq_pid)==-1) {
dlsch_active=0; dlsch_active=0;
break; break;
} }
@@ -3456,7 +3456,7 @@ PMI_FEEDBACK:
0, 0,
dual_stream_UE, dual_stream_UE,
i_mod, i_mod,
UE->dlsch[0][0]->current_harq_pid)==-1) { UE->dlsch[subframe&0x1][0][0]->current_harq_pid)==-1) {
dlsch_active=0; dlsch_active=0;
break; break;
} }
@@ -3534,7 +3534,7 @@ PMI_FEEDBACK:
} }
for (int cw=Kmimo-1; cw>=0; cw--) { for (int cw=Kmimo-1; cw>=0; cw--) {
UE->dlsch[0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; UE->dlsch[subframe&0x1][0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
coded_bits_per_codeword = get_G(&eNB->frame_parms, coded_bits_per_codeword = get_G(&eNB->frame_parms,
eNB->dlsch[0][cw]->harq_processes[0]->nb_rb, eNB->dlsch[0][cw]->harq_processes[0]->nb_rb,
eNB->dlsch[0][cw]->harq_processes[0]->rb_alloc, eNB->dlsch[0][cw]->harq_processes[0]->rb_alloc,
@@ -3545,7 +3545,7 @@ PMI_FEEDBACK:
subframe, subframe,
(transmission_mode<7?0:transmission_mode)); (transmission_mode<7?0:transmission_mode));
UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid]->G = coded_bits_per_codeword; UE->dlsch[subframe&0x1][0][cw]->harq_processes[UE->dlsch[subframe&0x1][0][cw]->current_harq_pid]->G = coded_bits_per_codeword;
@@ -3569,7 +3569,7 @@ PMI_FEEDBACK:
start_meas(&UE->dlsch_unscrambling_stats); start_meas(&UE->dlsch_unscrambling_stats);
dlsch_unscrambling(&UE->frame_parms, dlsch_unscrambling(&UE->frame_parms,
0, 0,
UE->dlsch[0][cw], UE->dlsch[subframe&0x1][0][cw],
coded_bits_per_codeword, coded_bits_per_codeword,
UE->pdsch_vars[subframe&0x1][eNB_id]->llr[cw], UE->pdsch_vars[subframe&0x1][eNB_id]->llr[cw],
0, 0,
@@ -3580,15 +3580,15 @@ PMI_FEEDBACK:
ret = dlsch_decoding(UE, ret = dlsch_decoding(UE,
UE->pdsch_vars[subframe&0x1][eNB_id]->llr[cw], UE->pdsch_vars[subframe&0x1][eNB_id]->llr[cw],
&UE->frame_parms, &UE->frame_parms,
UE->dlsch[0][cw], UE->dlsch[subframe&0x1][0][cw],
UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid], UE->dlsch[subframe&0x1][0][cw]->harq_processes[UE->dlsch[subframe&0x1][0][cw]->current_harq_pid],
subframe, subframe,
UE->dlsch[0][cw]->current_harq_pid, UE->dlsch[subframe&0x1][0][cw]->current_harq_pid,
1,llr8_flag); 1,llr8_flag);
stop_meas(&UE->dlsch_decoding_stats); stop_meas(&UE->dlsch_decoding_stats);
if (cw==1) { if (cw==1) {
if (ret <= UE->dlsch[0][cw]->max_turbo_iterations) { if (ret <= UE->dlsch[subframe&0x1][0][cw]->max_turbo_iterations) {
} else { } else {
errs2[round]++; errs2[round]++;
} }
@@ -3596,10 +3596,10 @@ PMI_FEEDBACK:
} }
stop_meas(&UE->phy_proc_rx); stop_meas(&UE->phy_proc_rx[subframe&0x1]);
if (ret <= UE->dlsch[0][0]->max_turbo_iterations) { if (ret <= UE->dlsch[subframe&0x1][0][0]->max_turbo_iterations) {
avg_iter += ret; avg_iter += ret;
iter_trials++; iter_trials++;
@@ -3607,15 +3607,15 @@ PMI_FEEDBACK:
if (n_frames==1) if (n_frames==1)
printf("No DLSCH errors found (round %d),uncoded ber %f\n",round,uncoded_ber); printf("No DLSCH errors found (round %d),uncoded ber %f\n",round,uncoded_ber);
UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->TBS; UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->TBS;
TB0_active = 0; TB0_active = 0;
if (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC if (UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC
/* /*
for (round = 0 ; round < UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->round ; round++) { for (round = 0 ; round < UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->round ; round++) {
// re-encoding of first stream // re-encoding of first stream
dlsch0_ue_harq = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; dlsch0_ue_harq = UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid];
dlsch0_eNB_harq = UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; dlsch0_eNB_harq = UE->dlsch[subframe&0x1][eNB_id]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid];
dlsch0_eNB_harq->mimo_mode = LARGE_CDD; dlsch0_eNB_harq->mimo_mode = LARGE_CDD;
dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0]; dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0];
dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb; dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb;
@@ -3627,13 +3627,13 @@ PMI_FEEDBACK:
dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off; dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off;
dlsch0_eNB_harq->status = dlsch0_ue_harq->status; dlsch0_eNB_harq->status = dlsch0_ue_harq->status;
UE->dlsch[eNB_id]->active = UE->dlsch[eNB_id][0]->active; UE->dlsch[subframe&0x1][eNB_id]->active = UE->dlsch[subframe&0x1][eNB_id][0]->active;
UE->dlsch[eNB_id]->rnti = UE->dlsch[eNB_id][0]->rnti; UE->dlsch[subframe&0x1][eNB_id]->rnti = UE->dlsch[subframe&0x1][eNB_id][0]->rnti;
dlsch_encoding(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->b, dlsch_encoding(UE->dlsch[subframe&0x1][eNB_id][0]->harq_processes[UE->dlsch[subframe&0x1][eNB_id][0]->current_harq_pid]->b,
&UE->frame_parms, &UE->frame_parms,
num_pdcch_symbols, num_pdcch_symbols,
UE->dlsch[0], UE->dlsch[subframe&0x1][0],
0,subframe, 0,subframe,
&UE->dlsch_rate_matching_stats, &UE->dlsch_rate_matching_stats,
&UE->dlsch_turbo_encoding_stats, &UE->dlsch_turbo_encoding_stats,
@@ -3660,18 +3660,18 @@ PMI_FEEDBACK:
//if ((n_frames==1) || (SNR>=30)) //if ((n_frames==1) || (SNR>=30))
printf("DLSCH errors found (round %d), uncoded ber %f\n",round,uncoded_ber); printf("DLSCH errors found (round %d), uncoded ber %f\n",round,uncoded_ber);
for (s=0; s<UE->dlsch[0][0]->harq_processes[0]->C; s++) { for (s=0; s<UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->C; s++) {
if (s<UE->dlsch[0][0]->harq_processes[0]->Cminus) if (s<UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Cminus)
Kr = UE->dlsch[0][0]->harq_processes[0]->Kminus; Kr = UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kminus;
else else
Kr = UE->dlsch[0][0]->harq_processes[0]->Kplus; Kr = UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0; i<Kr_bytes; i++) for (i=0; i<Kr_bytes; i++)
printf("%d : %x (%x)\n",i,UE->dlsch[0][0]->harq_processes[0]->c[s][i],UE->dlsch[0][0]->harq_processes[0]->c[s][i]^eNB->dlsch[0][0]->harq_processes[0]->c[s][i]); printf("%d : %x (%x)\n",i,UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->c[s][i],UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->c[s][i]^eNB->dlsch[0][0]->harq_processes[0]->c[s][i]);
} }
sprintf(fname,"rxsig0_r%d.m",round); sprintf(fname,"rxsig0_r%d.m",round);
@@ -3726,7 +3726,7 @@ PMI_FEEDBACK:
write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
write_output("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); write_output("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
write_output("dlsch_w.m","w",UE->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); write_output("dlsch_w.m","w",UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0);
*/ */
if (round == 3) exit(-1); if (round == 3) exit(-1);
@@ -3735,7 +3735,7 @@ PMI_FEEDBACK:
// printf("round %d errors %d/%d\n",round,errs[round],trials); // printf("round %d errors %d/%d\n",round,errs[round],trials);
round++; round++;
// UE->dlsch[0][0]->harq_processes[0]->round++; // UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->round++;
} }
if (xforms==1) { if (xforms==1) {
@@ -3775,7 +3775,7 @@ PMI_FEEDBACK:
double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0;
double t_rx = (double)UE->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; double t_rx = (double)UE->phy_proc_rx[subframe&0x1].p_time/cpu_freq_GHz/1000.0;
double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0;
double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0; double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0;
double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0;
@@ -3925,7 +3925,7 @@ PMI_FEEDBACK:
rate*effective_rate, rate*effective_rate,
100*effective_rate, 100*effective_rate,
rate, rate,
rate*get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs), rate*get_Qm(UE->dlsch[subframe&0x1][0][0]->harq_processes[UE->dlsch[subframe&0x1][0][0]->current_harq_pid]->mcs),
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/
(double)eNB->dlsch[0][0]->harq_processes[0]->TBS, (double)eNB->dlsch[0][0]->harq_processes[0]->TBS,
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
@@ -3964,10 +3964,10 @@ PMI_FEEDBACK:
eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials); eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials);
printf("\n\nUE RX function statistics (per 1ms subframe)\n\n"); printf("\n\nUE RX function statistics (per 1ms subframe)\n\n");
std_phy_proc_rx = sqrt((double)UE->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, std_phy_proc_rx = sqrt((double)UE->phy_proc_rx[subframe&0x1].diff_square/pow(cpu_freq_GHz,2)/pow(1000,
2)/UE->phy_proc_rx.trials - pow((double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); 2)/UE->phy_proc_rx[subframe&0x1].trials - pow((double)UE->phy_proc_rx[subframe&0x1].diff/UE->phy_proc_rx[subframe&0x1].trials/cpu_freq_GHz/1000,2));
printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000.0, printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx[subframe&0x1].diff/UE->phy_proc_rx[subframe&0x1].trials/cpu_freq_GHz/1000.0,
UE->phy_proc_rx.trials*2/3); UE->phy_proc_rx[subframe&0x1].trials*2/3);
printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median,
rx_q1, rx_q3, n_rx_dropped); rx_q1, rx_q3, n_rx_dropped);
std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
@@ -4001,7 +4001,7 @@ PMI_FEEDBACK:
printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n", printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n",
(double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials); (double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials);
printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n", printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n",
UE->dlsch[0][0]->harq_processes[0]->Cminus ? UE->dlsch[0][0]->harq_processes[0]->Kminus : UE->dlsch[0][0]->harq_processes[0]->Kplus, UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Cminus ? UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kminus : UE->dlsch[subframe&0x1][0][0]->harq_processes[0]->Kplus,
(double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials); (double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials);
printf(" |__ init %f us (cycles/iter %f, %d trials)\n", printf(" |__ init %f us (cycles/iter %f, %d trials)\n",
(double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0,
@@ -4179,7 +4179,7 @@ PMI_FEEDBACK:
eNB->dlsch_modulation_stats.trials, eNB->dlsch_modulation_stats.trials,
eNB->dlsch_scrambling_stats.trials, eNB->dlsch_scrambling_stats.trials,
eNB->dlsch_encoding_stats.trials, eNB->dlsch_encoding_stats.trials,
UE->phy_proc_rx.trials, UE->phy_proc_rx[subframe&0x1].trials,
UE->ofdm_demod_stats.trials, UE->ofdm_demod_stats.trials,
UE->dlsch_rx_pdcch_stats.trials, UE->dlsch_rx_pdcch_stats.trials,
UE->dlsch_llr_stats.trials, UE->dlsch_llr_stats.trials,
@@ -4192,7 +4192,7 @@ PMI_FEEDBACK:
get_time_meas_us(&eNB->dlsch_modulation_stats), get_time_meas_us(&eNB->dlsch_modulation_stats),
get_time_meas_us(&eNB->dlsch_scrambling_stats), get_time_meas_us(&eNB->dlsch_scrambling_stats),
get_time_meas_us(&eNB->dlsch_encoding_stats), get_time_meas_us(&eNB->dlsch_encoding_stats),
get_time_meas_us(&UE->phy_proc_rx), get_time_meas_us(&UE->phy_proc_rx[subframe&0x1]),
nsymb*get_time_meas_us(&UE->ofdm_demod_stats), nsymb*get_time_meas_us(&UE->ofdm_demod_stats),
get_time_meas_us(&UE->dlsch_rx_pdcch_stats), get_time_meas_us(&UE->dlsch_rx_pdcch_stats),
3*get_time_meas_us(&UE->dlsch_llr_stats), 3*get_time_meas_us(&UE->dlsch_llr_stats),
@@ -4232,7 +4232,7 @@ PMI_FEEDBACK:
eNB->dlsch_modulation_stats.trials, eNB->dlsch_modulation_stats.trials,
eNB->dlsch_scrambling_stats.trials, eNB->dlsch_scrambling_stats.trials,
eNB->dlsch_encoding_stats.trials, eNB->dlsch_encoding_stats.trials,
UE->phy_proc_rx.trials, UE->phy_proc_rx[subframe&0x1].trials,
UE->ofdm_demod_stats.trials, UE->ofdm_demod_stats.trials,
UE->dlsch_rx_pdcch_stats.trials, UE->dlsch_rx_pdcch_stats.trials,
UE->dlsch_llr_stats.trials, UE->dlsch_llr_stats.trials,
@@ -4290,7 +4290,7 @@ PMI_FEEDBACK:
printf("eNB %d\n",i); printf("eNB %d\n",i);
free_eNB_dlsch(eNB->dlsch[0][i]); free_eNB_dlsch(eNB->dlsch[0][i]);
printf("UE %d\n",i); printf("UE %d\n",i);
free_ue_dlsch(UE->dlsch[0][i]); free_ue_dlsch(UE->dlsch[subframe&0x1][0][i]);
} }
+4 -4
View File
@@ -681,20 +681,20 @@ int main(int argc, char **argv)
// Create transport channel structures for 2 transport blocks (MIMO) // Create transport channel structures for 2 transport blocks (MIMO)
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
eNB->dlsch[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0,&eNB->frame_parms); eNB->dlsch[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0,&eNB->frame_parms);
UE->dlsch[0][i] = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0); UE->dlsch[subframe&1][0][i] = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
if (!eNB->dlsch[0][i]) { if (!eNB->dlsch[0][i]) {
printf("Can't get eNB dlsch structures\n"); printf("Can't get eNB dlsch structures\n");
exit(-1); exit(-1);
} }
if (!UE->dlsch[0][i]) { if (!UE->dlsch[subframe&1][0][i]) {
printf("Can't get ue dlsch structures\n"); printf("Can't get ue dlsch structures\n");
exit(-1); exit(-1);
} }
eNB->dlsch[0][i]->rnti = 14; eNB->dlsch[0][i]->rnti = 14;
UE->dlsch[0][i]->rnti = 14; UE->dlsch[subframe&1][0][i]->rnti = 14;
} }
@@ -735,7 +735,7 @@ int main(int argc, char **argv)
init_ul_hopping(&eNB->frame_parms); init_ul_hopping(&eNB->frame_parms);
UE->dlsch[0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&eNB->frame_parms,subframe)].send_harq_status = 1; UE->dlsch[subframe&1][0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&eNB->frame_parms,subframe)].send_harq_status = 1;
UE->ulsch_Msg3_active[eNB_id] = 0; UE->ulsch_Msg3_active[eNB_id] = 0;
UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1; UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1;
+114
View File
@@ -0,0 +1,114 @@
# List of known PLMNS
PLMN: {
PLMN0: {
FULLNAME="Test network";
SHORTNAME="OAI4G";
MNC="01";
MCC="001";
};
PLMN1: {
FULLNAME="SFR France";
SHORTNAME="SFR";
MNC="10";
MCC="208";
};
PLMN2: {
FULLNAME="SFR France";
SHORTNAME="SFR";
MNC="11";
MCC="208";
};
PLMN3: {
FULLNAME="SFR France";
SHORTNAME="SFR";
MNC="13";
MCC="208";
};
PLMN4: {
FULLNAME="OAI LTEBOX";
SHORTNAME="OAIALU";
MNC="93";
MCC="208";
};
PLMN5: {
FULLNAME="T-Mobile USA";
SHORTNAME="T-Mobile";
MNC="280";
MCC="310";
};
PLMN6: {
FULLNAME="FICTITIOUS USA";
SHORTNAME="FICTITIO";
MNC="028";
MCC="310";
};
PLMN7: {
FULLNAME="Vodafone Italia";
SHORTNAME="VODAFONE";
MNC="10";
MCC="222";
};
PLMN8: {
FULLNAME="Vodafone Spain";
SHORTNAME="VODAFONE";
MNC="01";
MCC="214";
};
PLMN9: {
FULLNAME="Vodafone Spain";
SHORTNAME="VODAFONE";
MNC="06";
MCC="214";
};
PLMN10: {
FULLNAME="Vodafone Germ";
SHORTNAME="VODAFONE";
MNC="02";
MCC="262";
};
PLMN11: {
FULLNAME="Vodafone Germ";
SHORTNAME="VODAFONE";
MNC="04";
MCC="262";
};
};
UE0:
{
USER: {
IMEI="356113022094149";
MANUFACTURER="EURECOM";
MODEL="LTE Android PC";
PIN="0000";
};
SIM: {
MSIN="000001234";
USIM_API_K="000102030405060708090A0B0C0D0E0F";
OPC="C42449363BBAD02B66D16BC975D77CC1";
MSISDN="000000000000";//"33611123456";
};
# Home PLMN Selector with Access Technology
HPLMN= "00101";
# User controlled PLMN Selector with Access Technology
UCPLMN_LIST = ();
# Operator PLMN List
OPLMN_LIST = ("00101", "20810", "20811", "20813", "20893", "310280", "310028");
# Operator controlled PLMN Selector with Access Technology
OCPLMN_LIST = ("22210", "21401", "21406", "26202", "26204");
# Forbidden plmns
FPLMN_LIST = ();
# List of Equivalent HPLMNs
#TODO: UE does not connect if set, to be fixed in the UE
# EHPLMN_LIST= ("20811", "20813");
EHPLMN_LIST= ();
};
@@ -0,0 +1,175 @@
Active_eNBs = ( "eNB_Eurecom_LTEBox");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
eNBs =
(
{
////////// Identification parameters:
eNB_ID = 0xe00;
cell_type = "CELL_MACRO_ENB";
eNB_name = "eNB_Eurecom_LTEBox";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = "1";
mobile_country_code = "208";
mobile_network_code = "92";
////////// Physical parameters:
component_carriers = (
{
node_function = "eNodeB_3GPP";
node_timing = "synch_to_ext_device";
node_synch_ref = 0;
frame_type = "TDD";
tdd_config = 3;
tdd_config_s = 0;
prefix_type = "NORMAL";
eutra_band = 38;
downlink_frequency = 2580000000L;
uplink_frequency_offset = 0;
Nid_cell = 0;
N_RB_DL = 25;
Nid_cell_mbsfn = 0;
nb_antenna_ports = 1;
nb_antennas_tx = 1;
nb_antennas_rx = 1;
tx_gain = 90;
rx_gain = 125;
prach_root = 0;
prach_config_index = 0;
prach_high_speed = "DISABLE";
prach_zero_correlation = 1;
prach_freq_offset = 2;
pucch_delta_shift = 1;
pucch_nRB_CQI = 1;
pucch_nCS_AN = 0;
pucch_n1_AN = 32;
pdsch_referenceSignalPower = -24;
pdsch_p_b = 0;
pusch_n_SB = 1;
pusch_enable64QAM = "DISABLE";
pusch_hoppingMode = "interSubFrame";
pusch_hoppingOffset = 0;
pusch_groupHoppingEnabled = "ENABLE";
pusch_groupAssignment = 0;
pusch_sequenceHoppingEnabled = "DISABLE";
pusch_nDMRS1 = 1;
phich_duration = "NORMAL";
phich_resource = "ONESIXTH";
srs_enable = "DISABLE";
/* srs_BandwidthConfig =;
srs_SubframeConfig =;
srs_ackNackST =;
srs_MaxUpPts =;*/
pusch_p0_Nominal = -90;
pusch_alpha = "AL1";
pucch_p0_Nominal = -96;
msg3_delta_Preamble = 6;
pucch_deltaF_Format1 = "deltaF2";
pucch_deltaF_Format1b = "deltaF3";
pucch_deltaF_Format2 = "deltaF0";
pucch_deltaF_Format2a = "deltaF0";
pucch_deltaF_Format2b = "deltaF0";
rach_numberOfRA_Preambles = 64;
rach_preamblesGroupAConfig = "DISABLE";
/*
rach_sizeOfRA_PreamblesGroupA = ;
rach_messageSizeGroupA = ;
rach_messagePowerOffsetGroupB = ;
*/
rach_powerRampingStep = 4;
rach_preambleInitialReceivedTargetPower = -104;
rach_preambleTransMax = 10;
rach_raResponseWindowSize = 10;
rach_macContentionResolutionTimer = 48;
rach_maxHARQ_Msg3Tx = 4;
pcch_default_PagingCycle = 128;
pcch_nB = "oneT";
bcch_modificationPeriodCoeff = 2;
ue_TimersAndConstants_t300 = 1000;
ue_TimersAndConstants_t301 = 1000;
ue_TimersAndConstants_t310 = 1000;
ue_TimersAndConstants_t311 = 10000;
ue_TimersAndConstants_n310 = 20;
ue_TimersAndConstants_n311 = 1;
ue_TransmissionMode = 1;
}
);
srb1_parameters :
{
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
timer_poll_retransmit = 80;
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
timer_reordering = 35;
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
timer_status_prohibit = 0;
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
poll_pdu = 4;
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
poll_byte = 99999;
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
max_retx_threshold = 4;
}
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
////////// MME parameters:
mme_ip_address = ( { ipv4 = "192.168.12.26";
ipv6 = "192:168:30::17";
active = "yes";
preference = "ipv4";
}
);
NETWORK_INTERFACES :
{
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
};
log_config :
{
global_log_level ="info";
global_log_verbosity ="medium";
hw_log_level ="info";
hw_log_verbosity ="medium";
phy_log_level ="info";
phy_log_verbosity ="medium";
mac_log_level ="info";
mac_log_verbosity ="high";
rlc_log_level ="info";
rlc_log_verbosity ="medium";
pdcp_log_level ="info";
pdcp_log_verbosity ="medium";
rrc_log_level ="info";
rrc_log_verbosity ="medium";
};
}
);
+8 -1
View File
@@ -321,6 +321,7 @@ void help (void) {
printf(" --ue-txgain set UE TX gain\n"); printf(" --ue-txgain set UE TX gain\n");
printf(" --ue-nb-ant-rx set UE number of rx antennas "); printf(" --ue-nb-ant-rx set UE number of rx antennas ");
printf(" --ue-scan_carrier set UE to scan around carrier\n"); printf(" --ue-scan_carrier set UE to scan around carrier\n");
printf(" --dlsch-demod-shift dynamic shift for LLR compuation for TM3/4 (default 0)\n");
printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n");
printf(" --mmapped-dma sets flag for improved EXMIMO UE performance\n"); printf(" --mmapped-dma sets flag for improved EXMIMO UE performance\n");
printf(" --external-clock tells hardware to use an external clock reference\n"); printf(" --external-clock tells hardware to use an external clock reference\n");
@@ -635,6 +636,7 @@ static void get_options (int argc, char **argv) {
LONG_OPTION_THREADIQ, LONG_OPTION_THREADIQ,
LONG_OPTION_THREADODDSUBFRAME, LONG_OPTION_THREADODDSUBFRAME,
LONG_OPTION_THREADEVENSUBFRAME, LONG_OPTION_THREADEVENSUBFRAME,
LONG_OPTION_DEMOD_SHIFT,
#if T_TRACER #if T_TRACER
LONG_OPTION_T_PORT, LONG_OPTION_T_PORT,
LONG_OPTION_T_NOWAIT, LONG_OPTION_T_NOWAIT,
@@ -670,6 +672,7 @@ static void get_options (int argc, char **argv) {
{"threadIQ", required_argument, NULL, LONG_OPTION_THREADIQ}, {"threadIQ", required_argument, NULL, LONG_OPTION_THREADIQ},
{"threadOddSubframe", required_argument, NULL, LONG_OPTION_THREADODDSUBFRAME}, {"threadOddSubframe", required_argument, NULL, LONG_OPTION_THREADODDSUBFRAME},
{"threadEvenSubframe", required_argument, NULL, LONG_OPTION_THREADEVENSUBFRAME}, {"threadEvenSubframe", required_argument, NULL, LONG_OPTION_THREADEVENSUBFRAME},
{"dlsch-demod-shift", required_argument, NULL, LONG_OPTION_DEMOD_SHIFT},
#if T_TRACER #if T_TRACER
{"T_port", required_argument, 0, LONG_OPTION_T_PORT}, {"T_port", required_argument, 0, LONG_OPTION_T_PORT},
{"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT},
@@ -800,7 +803,11 @@ static void get_options (int argc, char **argv) {
case LONG_OPTION_THREADEVENSUBFRAME: case LONG_OPTION_THREADEVENSUBFRAME:
threads.even=atoi(optarg); threads.even=atoi(optarg);
break; break;
case LONG_OPTION_DEMOD_SHIFT: {
extern int16_t dlsch_demod_shift;
dlsch_demod_shift = atof(optarg);
break;
}
#if T_TRACER #if T_TRACER
case LONG_OPTION_T_PORT: { case LONG_OPTION_T_PORT: {
extern int T_port; extern int T_port;
+8
View File
@@ -56,6 +56,8 @@
#include "T.h" #include "T.h"
extern double cpuf;
#define FRAME_PERIOD 100000000ULL #define FRAME_PERIOD 100000000ULL
#define DAQ_PERIOD 66667ULL #define DAQ_PERIOD 66667ULL
#define FIFO_PRIORITY 40 #define FIFO_PRIORITY 40
@@ -538,6 +540,9 @@ static void *UE_thread_rxn_txnp4(void *arg) {
} }
phy_procedures_UE_RX( UE, proc, 0, 0, UE->mode, no_relay, NULL ); phy_procedures_UE_RX( UE, proc, 0, 0, UE->mode, no_relay, NULL );
} }
start_meas(&UE->generic_stat);
if (UE->mac_enabled==1) { if (UE->mac_enabled==1) {
ret = mac_xface->ue_scheduler(UE->Mod_id, ret = mac_xface->ue_scheduler(UE->Mod_id,
@@ -567,6 +572,9 @@ static void *UE_thread_rxn_txnp4(void *arg) {
UE->Mod_id, proc->frame_rx, proc->subframe_tx,txt ); UE->Mod_id, proc->frame_rx, proc->subframe_tx,txt );
} }
} }
stop_meas(&UE->generic_stat);
// Prepare the future Tx data // Prepare the future Tx data
if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_UL) || if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_UL) ||
+19 -17
View File
@@ -161,30 +161,32 @@ PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms,
memcpy(&(PHY_vars_UE->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); memcpy(&(PHY_vars_UE->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS));
phy_init_lte_ue(PHY_vars_UE,1,abstraction_flag); phy_init_lte_ue(PHY_vars_UE,1,abstraction_flag);
for (i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) { for (int l=0; l<2; l++) {
for (j=0; j<2; j++) { for (i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) {
PHY_vars_UE->dlsch[i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); for (j=0; j<2; j++) {
PHY_vars_UE->dlsch[l][i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag);
if (!PHY_vars_UE->dlsch[i][j]) { if (!PHY_vars_UE->dlsch[l][i][j]) {
LOG_E(PHY,"Can't get ue dlsch structures\n"); LOG_E(PHY,"Can't get ue dlsch structures\n");
exit(-1); exit(-1);
} else } else
LOG_D(PHY,"dlsch[%d][%d] => %p\n",UE_id,i,PHY_vars_UE->dlsch[i][j]); LOG_D(PHY,"dlsch[%d][%d] => %p\n",UE_id,i,PHY_vars_UE->dlsch[l][i][j]);
} }
PHY_vars_UE->ulsch[i] = new_ue_ulsch(frame_parms->N_RB_UL, abstraction_flag); PHY_vars_UE->ulsch[i] = new_ue_ulsch(frame_parms->N_RB_UL, abstraction_flag);
if (!PHY_vars_UE->ulsch[i]) { if (!PHY_vars_UE->ulsch[i]) {
LOG_E(PHY,"Can't get ue ulsch structures\n"); LOG_E(PHY,"Can't get ue ulsch structures\n");
exit(-1); exit(-1);
} }
PHY_vars_UE->dlsch_SI[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); PHY_vars_UE->dlsch_SI[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag);
PHY_vars_UE->dlsch_ra[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); PHY_vars_UE->dlsch_ra[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag);
PHY_vars_UE->transmission_mode[i] = frame_parms->nb_antenna_ports_eNB==1 ? 1 : 2; PHY_vars_UE->transmission_mode[i] = frame_parms->nb_antenna_ports_eNB==1 ? 1 : 2;
}
} }
PHY_vars_UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; PHY_vars_UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;