Merge branch 'develop' of https://gitlab.eurecom.fr/oai/openairinterface5g into develop-sib1
Conflicts: openair1/PHY/NR_TRANSPORT/nr_dlsch.c openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c openair1/SCHED_NR_UE/phy_procedures_nr_ue.c openair2/RRC/NR/L2_nr_interface.c openair2/RRC/NR_UE/rrc_UE.c openair2/RRC/NR_UE/rrc_defs.h
This commit is contained in:
@@ -181,6 +181,7 @@ eNBs = (
|
|||||||
{
|
{
|
||||||
ipv4 = "CI_MME_IP_ADDR";
|
ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ eNBs = (
|
|||||||
{
|
{
|
||||||
ipv4 = "CI_MME_IP_ADDR";
|
ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ eNBs = (
|
|||||||
{
|
{
|
||||||
ipv4 = "CI_MME_IP_ADDR";
|
ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -356,6 +356,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -177,6 +177,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,6 +173,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ gNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ gNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,6 +173,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "192.168.15.130";
|
mme_ip_address = ( { ipv4 = "192.168.15.130";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "127.0.0.3";
|
mme_ip_address = ( { ipv4 = "127.0.0.3";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,6 +84,12 @@ nullPointer:common/utils/T/tracer/multi.c:265
|
|||||||
arrayIndexOutOfBounds:openair2/LAYER2/rlc_v2/tests/test.c:401
|
arrayIndexOutOfBounds:openair2/LAYER2/rlc_v2/tests/test.c:401
|
||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
// this file is used for testing the NR RLC implementation, this error is
|
||||||
|
// not a problem, the programmer has to know what she does when writing
|
||||||
|
// the tests
|
||||||
|
arrayIndexOutOfBounds:openair2/LAYER2/nr_rlc/tests/test.c:451
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
// cppcheck does not understand the different lengths of arrays
|
// cppcheck does not understand the different lengths of arrays
|
||||||
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:705
|
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:705
|
||||||
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:706
|
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:706
|
||||||
|
|||||||
@@ -463,9 +463,9 @@ include_directories ("${RRC_FULL_DIR}")
|
|||||||
|
|
||||||
#NR RRC
|
#NR RRC
|
||||||
#######
|
#######
|
||||||
set (NR_RRC_ASN1_VERSION "NR_Rel15" )
|
set (NR_RRC_ASN1_VERSION "NR_Rel16" )
|
||||||
make_version(NR_RRC_VERSION 15 6 0)
|
make_version(NR_RRC_VERSION 16 1 0)
|
||||||
set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-15.6.0.asn1)
|
set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.1.0.asn1)
|
||||||
add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION})
|
add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION})
|
||||||
set (NR_RRC_FULL_DIR ${asn1_generated_dir}/RRC_${NR_RRC_ASN1_VERSION})
|
set (NR_RRC_FULL_DIR ${asn1_generated_dir}/RRC_${NR_RRC_ASN1_VERSION})
|
||||||
|
|
||||||
@@ -544,6 +544,59 @@ add_library(S1AP_ENB
|
|||||||
add_dependencies(S1AP_ENB rrc_flag s1ap_flag)
|
add_dependencies(S1AP_ENB rrc_flag s1ap_flag)
|
||||||
|
|
||||||
|
|
||||||
|
# NGAP
|
||||||
|
# Same limitation as described in RRC: unknown generated file list
|
||||||
|
# so we generate it at cmake time
|
||||||
|
##############
|
||||||
|
set (NGAP_RELEASE R15)
|
||||||
|
|
||||||
|
set(NGAP_DIR ${OPENAIR3_DIR}/NGAP)
|
||||||
|
make_version(NGAP_VERSION 15 8 0)
|
||||||
|
set(NGAP_ASN_FILES "ngap-15.8.0.asn1")
|
||||||
|
|
||||||
|
add_definitions(-DNGAP_VERSION=${NGAP_VERSION})
|
||||||
|
set(NGAP_ASN_DIR ${NGAP_DIR}/MESSAGES/ASN1/ASN1_files)
|
||||||
|
set(NGAP_C_DIR ${asn1_generated_dir}/NGAP_${NGAP_RELEASE})
|
||||||
|
|
||||||
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
|
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${NGAP_C_DIR}" "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}" "NGAP_" -fno-include-deps -findirect-choice
|
||||||
|
RESULT_VARIABLE ret)
|
||||||
|
if (NOT ${ret} STREQUAL 0)
|
||||||
|
message(FATAL_ERROR "${ret}: error")
|
||||||
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
file(GLOB NGAP_source ${NGAP_C_DIR}/*.c)
|
||||||
|
|
||||||
|
add_custom_target (
|
||||||
|
ngap_flag ALL
|
||||||
|
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${NGAP_C_DIR}" "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}" "NGAP_" -fno-include-deps
|
||||||
|
DEPENDS "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(NGAP_LIB
|
||||||
|
${NGAP_source}
|
||||||
|
# ${NGAP_DIR}/ngap_common.c
|
||||||
|
)
|
||||||
|
add_dependencies(NGAP_LIB rrc_flag ngap_flag)
|
||||||
|
|
||||||
|
include_directories ("${NGAP_C_DIR}")
|
||||||
|
include_directories ("${NGAP_DIR}")
|
||||||
|
|
||||||
|
add_library(NGAP_GNB
|
||||||
|
${NGAP_DIR}/ngap_gNB.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_context_management_procedures.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_decoder.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_encoder.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_handlers.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_itti_messaging.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_management_procedures.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_nas_procedures.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_nnsf.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_overload.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_trace.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_ue_context.c
|
||||||
|
)
|
||||||
|
add_dependencies(NGAP_GNB rrc_flag ngap_flag)
|
||||||
|
|
||||||
#M2AP
|
#M2AP
|
||||||
# Same limitation as described in RRC/S1AP: unknown generated file list
|
# Same limitation as described in RRC/S1AP: unknown generated file list
|
||||||
# so we generate it at cmake time
|
# so we generate it at cmake time
|
||||||
@@ -933,6 +986,8 @@ add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchang
|
|||||||
add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION with max 256 UE")
|
||||||
add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||||
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||||
|
add_boolean_option(UESIM_EXPANSION False "enable UESIM_EXPANSION with max 256 UE")
|
||||||
|
add_boolean_option(ITTI_SIM False "enable itti simulator")
|
||||||
|
|
||||||
########################
|
########################
|
||||||
# Include order
|
# Include order
|
||||||
@@ -1965,6 +2020,7 @@ set(L2_NR_SRC
|
|||||||
${NR_RRC_DIR}/rrc_gNB_internode.c
|
${NR_RRC_DIR}/rrc_gNB_internode.c
|
||||||
${NR_RRC_DIR}/rrc_gNB_reconfig.c
|
${NR_RRC_DIR}/rrc_gNB_reconfig.c
|
||||||
${NR_RRC_DIR}/rrc_gNB_UE_context.c
|
${NR_RRC_DIR}/rrc_gNB_UE_context.c
|
||||||
|
${NR_RRC_DIR}/rrc_gNB_NGAP.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(L2_SRC_UE
|
set(L2_SRC_UE
|
||||||
@@ -2455,6 +2511,124 @@ if(NAS_UE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if(ITTI_SIM)
|
||||||
|
set(libnas_ue_api_OBJS
|
||||||
|
${NAS_SRC}UE/API/USER/at_command.c
|
||||||
|
${NAS_SRC}UE/API/USER/at_error.c
|
||||||
|
${NAS_SRC}UE/API/USER/at_response.c
|
||||||
|
${NAS_SRC}UE/API/USER/user_api.c
|
||||||
|
${NAS_SRC}UE/API/USER/user_indication.c
|
||||||
|
${NAS_SRC}UE/API/USIM/aka_functions.c
|
||||||
|
${NAS_SRC}UE/API/USIM/usim_api.c
|
||||||
|
)
|
||||||
|
set(libnas_ue_emm_OBJS
|
||||||
|
${NAS_SRC}UE/EMM/Attach.c
|
||||||
|
${NAS_SRC}UE/EMM/Authentication.c
|
||||||
|
${NAS_SRC}UE/EMM/Detach.c
|
||||||
|
${NAS_SRC}UE/EMM/emm_main.c
|
||||||
|
${NAS_SRC}UE/EMM/EmmStatusHdl.c
|
||||||
|
${NAS_SRC}UE/EMM/Identification.c
|
||||||
|
${NAS_SRC}UE/EMM/IdleMode.c
|
||||||
|
${NAS_SRC}UE/EMM/LowerLayer.c
|
||||||
|
${NAS_SRC}UE/EMM/SecurityModeControl.c
|
||||||
|
${NAS_SRC}UE/EMM/ServiceRequestHdl.c
|
||||||
|
${NAS_SRC}UE/EMM/TrackingAreaUpdate.c
|
||||||
|
)
|
||||||
|
set(libnas_ue_emm_sap_OBJS
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_as.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttachNeeded.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregistered.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredInitiated.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredLimitedService.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoImsi.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNormalService.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredPlmnSearch.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_esm.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_fsm.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmNull.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_recv.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_reg.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegistered.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredInitiated.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredLimitedService.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredNoCellAvailable.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredNormalService.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredPlmnSearch.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredUpdateNeeded.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_sap.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_send.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmServiceRequestInitiated.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c
|
||||||
|
)
|
||||||
|
set (libnas_ue_esm_OBJS
|
||||||
|
${NAS_SRC}UE/ESM/DedicatedEpsBearerContextActivation.c
|
||||||
|
${NAS_SRC}UE/ESM/DefaultEpsBearerContextActivation.c
|
||||||
|
${NAS_SRC}UE/ESM/EpsBearerContextDeactivation.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_ebr.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_ebr_context.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_ip.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_main.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_pt.c
|
||||||
|
${NAS_SRC}UE/ESM/EsmStatusHdl.c
|
||||||
|
${NAS_SRC}UE/ESM/PdnConnectivity.c
|
||||||
|
${NAS_SRC}UE/ESM/PdnDisconnect.c
|
||||||
|
)
|
||||||
|
set(libnas_ue_esm_sap_OBJS
|
||||||
|
${NAS_SRC}UE/ESM/SAP/esm_recv.c
|
||||||
|
${NAS_SRC}UE/ESM/SAP/esm_send.c
|
||||||
|
${NAS_SRC}UE/ESM/SAP/esm_sap.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(libnrnas_emm_msg_OBJS
|
||||||
|
${NAS_SRC}COMMON/EMM/MSG/RegistrationRequest.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(libnrnas_ies_OBJS
|
||||||
|
${NAS_SRC}COMMON/IES/ExtendedProtocolDiscriminator.c
|
||||||
|
${NAS_SRC}COMMON/IES/FGSMobileIdentity.c
|
||||||
|
${NAS_SRC}COMMON/IES/FGSRegistrationType.c
|
||||||
|
${NAS_SRC}COMMON/IES/SpareHalfOctet.c
|
||||||
|
${NAS_SRC}COMMON/IES/FGMMCapability.c
|
||||||
|
${NAS_SRC}COMMON/IES/NrUESecurityCapability.c
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(LIB_NAS_SIMUE
|
||||||
|
${NAS_SRC}UE/nas_itti_messaging.c
|
||||||
|
${NAS_SRC}UE/nas_network.c
|
||||||
|
${NAS_SRC}UE/nas_parser.c
|
||||||
|
${NAS_SRC}UE/nas_proc.c
|
||||||
|
${NAS_SRC}UE/nas_user.c
|
||||||
|
${NAS_SRC}NR_UE/nr_nas_msg_sim.c
|
||||||
|
${libnas_api_OBJS}
|
||||||
|
${libnas_ue_api_OBJS}
|
||||||
|
${libnas_emm_msg_OBJS}
|
||||||
|
${libnas_esm_msg_OBJS}
|
||||||
|
${libnas_ies_OBJS}
|
||||||
|
${libnas_utils_OBJS}
|
||||||
|
${libnas_ue_emm_OBJS}
|
||||||
|
${libnas_ue_emm_sap_OBJS}
|
||||||
|
${libnas_ue_esm_OBJS}
|
||||||
|
${libnas_ue_esm_sap_OBJS}
|
||||||
|
${libnrnas_emm_msg_OBJS}
|
||||||
|
${libnrnas_ies_OBJS}
|
||||||
|
)
|
||||||
|
add_dependencies(LIB_NAS_SIMUE rrc_flag)
|
||||||
|
set(NAS_SIM_LIB LIB_NAS_SIMUE)
|
||||||
|
|
||||||
|
include_directories(${NAS_SRC}NR_UE)
|
||||||
|
include_directories(${NAS_SRC}UE)
|
||||||
|
include_directories(${NAS_SRC}UE/API/USER)
|
||||||
|
include_directories(${NAS_SRC}UE/API/USIM)
|
||||||
|
include_directories(${NAS_SRC}UE/EMM)
|
||||||
|
include_directories(${NAS_SRC}UE/EMM/SAP)
|
||||||
|
include_directories(${NAS_SRC}UE/ESM)
|
||||||
|
include_directories(${NAS_SRC}UE/ESM/SAP)
|
||||||
|
endif()
|
||||||
|
|
||||||
# nbiot
|
# nbiot
|
||||||
add_definitions("-DNUMBER_OF_UE_MAX_NB_IoT=16")
|
add_definitions("-DNUMBER_OF_UE_MAX_NB_IoT=16")
|
||||||
set (NBIOT_SOURCES
|
set (NBIOT_SOURCES
|
||||||
@@ -2853,7 +3027,7 @@ target_link_libraries (nr-softmodem
|
|||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
|
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
|
||||||
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
|
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
|
||||||
S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||||
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
|
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
@@ -2935,7 +3109,7 @@ add_executable(nr-uesoftmodem
|
|||||||
|
|
||||||
target_link_libraries (nr-uesoftmodem
|
target_link_libraries (nr-uesoftmodem
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB NR_RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
||||||
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
|
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
|
||||||
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
||||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB
|
||||||
@@ -3247,7 +3421,7 @@ if (${T_TRACER})
|
|||||||
foreach(i
|
foreach(i
|
||||||
#all "add_executable" definitions (except tests, rb_tool, updatefw)
|
#all "add_executable" definitions (except tests, rb_tool, updatefw)
|
||||||
lte-softmodem lte-uesoftmodem nr-softmodem
|
lte-softmodem lte-uesoftmodem nr-softmodem
|
||||||
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7
|
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7 nr-ittisim
|
||||||
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
|
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
|
||||||
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
||||||
nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
|
nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
|
||||||
@@ -3334,6 +3508,53 @@ add_executable(rb_tool
|
|||||||
)
|
)
|
||||||
target_include_directories(rb_tool PRIVATE ${OPENAIR2_DIR}/NETWORK_DRIVER/MESH/)
|
target_include_directories(rb_tool PRIVATE ${OPENAIR2_DIR}/NETWORK_DRIVER/MESH/)
|
||||||
|
|
||||||
|
# nr-ittisim
|
||||||
|
###################################################
|
||||||
|
|
||||||
|
add_executable(nr-ittisim
|
||||||
|
${rrc_h}
|
||||||
|
${nr_rrc_h}
|
||||||
|
${OPENAIR2_DIR}/GNB_APP/gnb_app.c
|
||||||
|
${OPENAIR2_DIR}/GNB_APP/gnb_config.c
|
||||||
|
${OPENAIR_DIR}/executables/nr-gnb.c
|
||||||
|
${OPENAIR_DIR}/executables/nr-ru.c
|
||||||
|
${OPENAIR2_DIR}/SIMULATION/NR_RRC/itti_sim.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
|
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
|
||||||
|
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||||
|
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||||
|
${OPENAIR3_DIR}/GTPV1-U/gtpv1u_gNB.c
|
||||||
|
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||||
|
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
|
${GTPU_need_ITTI}
|
||||||
|
${XFORMSINTERFACE_SOURCE}
|
||||||
|
${T_SOURCE}
|
||||||
|
${CONFIG_SOURCES}
|
||||||
|
${SHLIB_LOADER_SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries (nr-ittisim
|
||||||
|
-Wl,--start-group
|
||||||
|
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
|
||||||
|
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB
|
||||||
|
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||||
|
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
|
||||||
|
PHY_NR_UE SCHED_NR_UE_LIB NR_L2_UE
|
||||||
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
|
target_link_libraries (nr-ittisim ${LIBXML2_LIBRARIES})
|
||||||
|
target_link_libraries (nr-ittisim pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
|
||||||
|
target_link_libraries (nr-ittisim ${LIB_LMS_LIBRARIES})
|
||||||
|
target_link_libraries (nr-ittisim ${T_LIB})
|
||||||
|
|
||||||
|
add_dependencies( nr-ittisim ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
|
||||||
|
|
||||||
# ???
|
# ???
|
||||||
####################
|
####################
|
||||||
list(APPEND oai_nw_drv_src device.c common.c ioctl.c classifier.c tool.c)
|
list(APPEND oai_nw_drv_src device.c common.c ioctl.c classifier.c tool.c)
|
||||||
|
|||||||
+14
-1
@@ -66,6 +66,7 @@ UE_TIMING_TRACE="False"
|
|||||||
USRP_REC_PLAY="False"
|
USRP_REC_PLAY="False"
|
||||||
BUILD_ECLIPSE=0
|
BUILD_ECLIPSE=0
|
||||||
NR="False"
|
NR="False"
|
||||||
|
ITTI_SIM="False"
|
||||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
||||||
trap handle_ctrl_c INT
|
trap handle_ctrl_c INT
|
||||||
|
|
||||||
@@ -159,6 +160,8 @@ Options
|
|||||||
Build for I/Q record-playback modes
|
Build for I/Q record-playback modes
|
||||||
-k | --skip-shared-libraries
|
-k | --skip-shared-libraries
|
||||||
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
||||||
|
--ittiSIM
|
||||||
|
Makes the itti simulator
|
||||||
-h | --help
|
-h | --help
|
||||||
Print this help
|
Print this help
|
||||||
|
|
||||||
@@ -413,6 +416,11 @@ function main() {
|
|||||||
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
||||||
MAKE_CMD=ninja
|
MAKE_CMD=ninja
|
||||||
shift;;
|
shift;;
|
||||||
|
--ittiSIM)
|
||||||
|
ittiSIM=1
|
||||||
|
ITTI_SIM="True"
|
||||||
|
echo_info "Will compile itti simulator"
|
||||||
|
shift;;
|
||||||
-h | --help)
|
-h | --help)
|
||||||
print_help
|
print_help
|
||||||
exit 1;;
|
exit 1;;
|
||||||
@@ -571,7 +579,7 @@ function main() {
|
|||||||
config_libconfig_shlib=params_libconfig
|
config_libconfig_shlib=params_libconfig
|
||||||
|
|
||||||
# first generate the CMakefile in the right directory
|
# first generate the CMakefile in the right directory
|
||||||
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$nrUE" = "1" -o "$HW" = "EXMIMO" ] ; then
|
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$nrUE" = "1" -o "$HW" = "EXMIMO" -o "$ittiSIM" = "1" ] ; then
|
||||||
|
|
||||||
# softmodem compilation
|
# softmodem compilation
|
||||||
|
|
||||||
@@ -595,6 +603,7 @@ function main() {
|
|||||||
echo "set ( UE_TIMING_TRACE $UE_TIMING_TRACE )" >> $cmake_file
|
echo "set ( UE_TIMING_TRACE $UE_TIMING_TRACE )" >> $cmake_file
|
||||||
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
||||||
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
||||||
|
echo "set ( ITTI_SIM $ITTI_SIM )" >> $cmake_file
|
||||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||||
cd $DIR/$build_dir/build
|
cd $DIR/$build_dir/build
|
||||||
eval $CMAKE_CMD
|
eval $CMAKE_CMD
|
||||||
@@ -616,6 +625,10 @@ function main() {
|
|||||||
execlist="$execlist nr-uesoftmodem"
|
execlist="$execlist nr-uesoftmodem"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$ittiSIM" = "1" ] ; then
|
||||||
|
execlist="$execlist nr-ittisim"
|
||||||
|
fi
|
||||||
|
|
||||||
for f in $execlist ; do
|
for f in $execlist ; do
|
||||||
echo_info "Compiling $f..."
|
echo_info "Compiling $f..."
|
||||||
compilations \
|
compilations \
|
||||||
|
|||||||
@@ -16,4 +16,5 @@ set ( UE_DEBUG_TRACE False )
|
|||||||
set ( UE_TIMING_TRACE False )
|
set ( UE_TIMING_TRACE False )
|
||||||
set ( USRP_REC_PLAY False )
|
set ( USRP_REC_PLAY False )
|
||||||
set ( SKIP_SHARED_LIB_FLAG False )
|
set ( SKIP_SHARED_LIB_FLAG False )
|
||||||
|
set ( PHYSIM True)
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)
|
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)
|
||||||
|
|||||||
@@ -42,12 +42,12 @@ KERNEL_MAJOR=$(uname -r | cut -d '.' -f2)
|
|||||||
|
|
||||||
#check if we run inside a container
|
#check if we run inside a container
|
||||||
IS_CONTAINER=`egrep -c "docker|podman|kubepods" /proc/self/cgroup || true`
|
IS_CONTAINER=`egrep -c "docker|podman|kubepods" /proc/self/cgroup || true`
|
||||||
#sudo is not needed inside a container
|
#sudo is not needed when we are root
|
||||||
if [ $IS_CONTAINER -eq 0 ]
|
if [ "$UID" = 0 ]
|
||||||
then
|
then
|
||||||
SUDO='sudo -S -E'
|
|
||||||
else
|
|
||||||
SUDO=''
|
SUDO=''
|
||||||
|
else
|
||||||
|
SUDO='sudo -S -E'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
@@ -251,18 +251,13 @@ install_protobuf_from_source(){
|
|||||||
#wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
|
#wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
|
||||||
#tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner
|
#tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner
|
||||||
#cd protobuf-2.6.1/
|
#cd protobuf-2.6.1/
|
||||||
|
|
||||||
if [ $IS_CONTAINER -eq 0 ]
|
if [ $IS_CONTAINER -eq 0 ]
|
||||||
then
|
then
|
||||||
rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0
|
rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0
|
||||||
wget --tries=3 --retry-connrefused https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
|
wget --tries=3 --retry-connrefused https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
|
||||||
tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $USER --group $(groups | cut -d" " -f1) --no-same-owner
|
tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $(id -u) --group $(id -g) --no-same-owner
|
||||||
cd protobuf-3.3.0/
|
cd protobuf-3.3.0/
|
||||||
./configure
|
|
||||||
echo "Compiling protobuf"
|
|
||||||
make -j`nproc`
|
|
||||||
$SUDO make install
|
|
||||||
$SUDO ldconfig
|
|
||||||
else
|
else
|
||||||
export LD_LIBRARY_PATH=/usr/local/lib #protoc needs to know where toclook for shared libs
|
export LD_LIBRARY_PATH=/usr/local/lib #protoc needs to know where toclook for shared libs
|
||||||
rm -rf /tmp/protobuf
|
rm -rf /tmp/protobuf
|
||||||
@@ -270,11 +265,12 @@ install_protobuf_from_source(){
|
|||||||
cd /tmp/protobuf
|
cd /tmp/protobuf
|
||||||
git submodule update --init --recursive
|
git submodule update --init --recursive
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
./configure
|
|
||||||
make -j`nproc`
|
|
||||||
make install
|
|
||||||
ldconfig
|
|
||||||
fi
|
fi
|
||||||
|
./configure
|
||||||
|
echo "Compiling protobuf"
|
||||||
|
make -j`nproc`
|
||||||
|
$SUDO make install
|
||||||
|
$SUDO ldconfig
|
||||||
) >& $protobuf_install_log
|
) >& $protobuf_install_log
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ if [ "$done_flag" -ot $ASN1_SOURCE_DIR ] ; then
|
|||||||
sed -i 's/18446744073709551615))/18446744073709551615U))/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}E-RABUsageReportItem.c
|
sed -i 's/18446744073709551615))/18446744073709551615U))/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}E-RABUsageReportItem.c
|
||||||
sed -i 's/18446744073709551615 }/18446744073709551615U }/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}E-RABUsageReportItem.c
|
sed -i 's/18446744073709551615 }/18446744073709551615U }/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}E-RABUsageReportItem.c
|
||||||
fi
|
fi
|
||||||
|
if [ "$ASN1C_PREFIX" = "NGAP_" ] ; then
|
||||||
|
sed -i 's/18446744073709551615))/18446744073709551615U))/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}VolumeTimedReport-Item.c
|
||||||
|
sed -i 's/18446744073709551615 }/18446744073709551615U }/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}VolumeTimedReport-Item.c
|
||||||
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
touch $done_flag
|
touch $done_flag
|
||||||
|
|||||||
@@ -445,6 +445,7 @@ int logInit (void)
|
|||||||
register_log_component("NR_RRC","log",NR_RRC);
|
register_log_component("NR_RRC","log",NR_RRC);
|
||||||
register_log_component("NR_MAC","log",NR_MAC);
|
register_log_component("NR_MAC","log",NR_MAC);
|
||||||
register_log_component("NR_PHY","log",NR_PHY);
|
register_log_component("NR_PHY","log",NR_PHY);
|
||||||
|
register_log_component("NGAP","",NGAP);
|
||||||
|
|
||||||
for (int i=0 ; log_level_names[i].name != NULL ; i++)
|
for (int i=0 ; log_level_names[i].name != NULL ; i++)
|
||||||
g_log->level2string[i] = toupper(log_level_names[i].name[0]); // uppercased first letter of level name
|
g_log->level2string[i] = toupper(log_level_names[i].name[0]); // uppercased first letter of level name
|
||||||
|
|||||||
@@ -226,6 +226,7 @@ typedef enum {
|
|||||||
X2AP,
|
X2AP,
|
||||||
M2AP,
|
M2AP,
|
||||||
M3AP,
|
M3AP,
|
||||||
|
NGAP,
|
||||||
GNB_APP,
|
GNB_APP,
|
||||||
NR_RRC,
|
NR_RRC,
|
||||||
NR_MAC,
|
NR_MAC,
|
||||||
|
|||||||
@@ -400,6 +400,27 @@ ID = LEGACY_S1AP_TRACE
|
|||||||
GROUP = ALL:LEGACY_S1AP:LEGACY_GROUP_TRACE:LEGACY
|
GROUP = ALL:LEGACY_S1AP:LEGACY_GROUP_TRACE:LEGACY
|
||||||
FORMAT = string,log
|
FORMAT = string,log
|
||||||
|
|
||||||
|
ID = LEGACY_NGAP_INFO
|
||||||
|
DESC = NGAP legacy logs - info level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_INFO:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_NGAP_ERROR
|
||||||
|
DESC = NGAP legacy logs - error level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_ERROR:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_NGAP_WARNING
|
||||||
|
DESC = NGAP legacy logs - warning level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_WARNING:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_NGAP_DEBUG
|
||||||
|
DESC = NGAP legacy logs - debug level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_DEBUG:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_NGAP_TRACE
|
||||||
|
DESC = NGAP legacy logs - trace level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_TRACE:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
|
||||||
ID = LEGACY_X2AP_INFO
|
ID = LEGACY_X2AP_INFO
|
||||||
DESC = X2AP legacy logs - info level
|
DESC = X2AP legacy logs - info level
|
||||||
GROUP = ALL:LEGACY_X2AP:LEGACY_GROUP_INFO:LEGACY
|
GROUP = ALL:LEGACY_X2AP:LEGACY_GROUP_INFO:LEGACY
|
||||||
|
|||||||
@@ -49,11 +49,14 @@ typedef enum {
|
|||||||
MSC_RLC_ENB,
|
MSC_RLC_ENB,
|
||||||
MSC_PDCP_ENB,
|
MSC_PDCP_ENB,
|
||||||
MSC_RRC_ENB,
|
MSC_RRC_ENB,
|
||||||
|
MSC_RRC_GNB,
|
||||||
MSC_IP_ENB,
|
MSC_IP_ENB,
|
||||||
MSC_S1AP_ENB,
|
MSC_S1AP_ENB,
|
||||||
|
MSC_NGAP_GNB,
|
||||||
MSC_GTPU_ENB,
|
MSC_GTPU_ENB,
|
||||||
MSC_GTPU_SGW,
|
MSC_GTPU_SGW,
|
||||||
MSC_S1AP_MME,
|
MSC_S1AP_MME,
|
||||||
|
MSC_NGAP_AMF,
|
||||||
MSC_MMEAPP_MME,
|
MSC_MMEAPP_MME,
|
||||||
MSC_NAS_MME,
|
MSC_NAS_MME,
|
||||||
MSC_NAS_EMM_MME,
|
MSC_NAS_EMM_MME,
|
||||||
|
|||||||
@@ -16,3 +16,8 @@
|
|||||||
#include "openair2/COMMON/gtpv1_u_messages_def.h"
|
#include "openair2/COMMON/gtpv1_u_messages_def.h"
|
||||||
#include "openair2/COMMON/flexran_messages_def.h"
|
#include "openair2/COMMON/flexran_messages_def.h"
|
||||||
#include "openair2/COMMON/f1ap_messages_def.h"
|
#include "openair2/COMMON/f1ap_messages_def.h"
|
||||||
|
#include "openair2/COMMON/ngap_messages_def.h"
|
||||||
|
#if ITTI_SIM
|
||||||
|
#include "openair2/COMMON/itti_sim_messages_def.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -194,7 +194,8 @@ task_list_t tasks[TASK_MAX];
|
|||||||
t->next_timer=UINT64_MAX;
|
t->next_timer=UINT64_MAX;
|
||||||
|
|
||||||
// Proceed expired timer
|
// Proceed expired timer
|
||||||
for ( auto it=t->timer_map.begin() ; it != t->timer_map.end() ; ++it ) {
|
for ( auto it=t->timer_map.begin() , next_it = it; it != t->timer_map.end() ; it = next_it ) {
|
||||||
|
++next_it;
|
||||||
if ( it->second.timeout < current_time ) {
|
if ( it->second.timeout < current_time ) {
|
||||||
MessageDef *message = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
|
MessageDef *message = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
|
||||||
message->ittiMsg.timer_has_expired.timer_id=it->first;
|
message->ittiMsg.timer_has_expired.timer_id=it->first;
|
||||||
|
|||||||
@@ -230,6 +230,7 @@ typedef struct IttiMsgText_s {
|
|||||||
#include <openair2/COMMON/sctp_messages_types.h>
|
#include <openair2/COMMON/sctp_messages_types.h>
|
||||||
#include <openair2/COMMON/udp_messages_types.h>
|
#include <openair2/COMMON/udp_messages_types.h>
|
||||||
#include <openair2/COMMON/gtpv1_u_messages_types.h>
|
#include <openair2/COMMON/gtpv1_u_messages_types.h>
|
||||||
|
#include <openair2/COMMON/ngap_messages_types.h>
|
||||||
#include <openair3/SCTP/sctp_eNB_task.h>
|
#include <openair3/SCTP/sctp_eNB_task.h>
|
||||||
#include <openair3/NAS/UE/nas_proc_defs.h>
|
#include <openair3/NAS/UE/nas_proc_defs.h>
|
||||||
#include <openair3/NAS/UE/ESM/esmData.h>
|
#include <openair3/NAS/UE/ESM/esmData.h>
|
||||||
@@ -260,6 +261,11 @@ typedef struct IttiMsgText_s {
|
|||||||
void *rrc_enb_process_itti_msg(void *);
|
void *rrc_enb_process_itti_msg(void *);
|
||||||
#include <openair3/SCTP/sctp_eNB_task.h>
|
#include <openair3/SCTP/sctp_eNB_task.h>
|
||||||
#include <openair3/S1AP/s1ap_eNB.h>
|
#include <openair3/S1AP/s1ap_eNB.h>
|
||||||
|
#include <openair3/NGAP/ngap_gNB.h>
|
||||||
|
|
||||||
|
#ifdef ITTI_SIM
|
||||||
|
#include <openair2/COMMON/itti_sim_messages_types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
static const char *const messages_definition_xml = {
|
static const char *const messages_definition_xml = {
|
||||||
@@ -312,6 +318,7 @@ void * rrc_enb_process_msg(void*);
|
|||||||
TASK_DEF(TASK_RRC_GNB, TASK_PRIORITY_MED, 200, NULL,NULL)\
|
TASK_DEF(TASK_RRC_GNB, TASK_PRIORITY_MED, 200, NULL,NULL)\
|
||||||
TASK_DEF(TASK_RAL_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_RAL_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_S1AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_S1AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
|
TASK_DEF(TASK_NGAP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_X2AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_X2AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_M2AP_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_M2AP_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_M2AP_MCE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_M2AP_MCE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
@@ -329,6 +336,7 @@ void * rrc_enb_process_msg(void*);
|
|||||||
TASK_DEF(TASK_RLC_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_RLC_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_PDCP_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_PDCP_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_RRC_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_RRC_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
|
TASK_DEF(TASK_RRC_NRUE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_NAS_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_NAS_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_MSC, TASK_PRIORITY_MED, 200, NULL, NULL)\
|
TASK_DEF(TASK_MSC, TASK_PRIORITY_MED, 200, NULL, NULL)\
|
||||||
@@ -336,6 +344,8 @@ void * rrc_enb_process_msg(void*);
|
|||||||
TASK_DEF(TASK_UDP, TASK_PRIORITY_MED, 1000, NULL, NULL)\
|
TASK_DEF(TASK_UDP, TASK_PRIORITY_MED, 1000, NULL, NULL)\
|
||||||
TASK_DEF(TASK_CU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_CU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_DU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_DU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
|
TASK_DEF(TASK_RRC_UE_SIM, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
|
TASK_DEF(TASK_RRC_GNB_SIM, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_MAX, TASK_PRIORITY_MED, 200, NULL, NULL)
|
TASK_DEF(TASK_MAX, TASK_PRIORITY_MED, 200, NULL, NULL)
|
||||||
|
|
||||||
#define TASK_DEF(TaskID, pRIO, qUEUEsIZE, FuNc, ThreadFunc) { pRIO, qUEUEsIZE, #TaskID, FuNc, ThreadFunc },
|
#define TASK_DEF(TaskID, pRIO, qUEUEsIZE, FuNc, ThreadFunc) { pRIO, qUEUEsIZE, #TaskID, FuNc, ThreadFunc },
|
||||||
|
|||||||
+52
-8
@@ -164,8 +164,6 @@ nr_schedule_ue_spec() is called
|
|||||||
|
|
||||||
Calls nr_fill_nfapi_dl_pdu() to actually populate what should be done by the lower layers to make the Tx subframe
|
Calls nr_fill_nfapi_dl_pdu() to actually populate what should be done by the lower layers to make the Tx subframe
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# RRC
|
# RRC
|
||||||
RRC is a regular thread with itti loop on queue: TASK_RRC_GNB
|
RRC is a regular thread with itti loop on queue: TASK_RRC_GNB
|
||||||
it receives it's configuration in message NRRRC_CONFIGURATION_REQ, then real time mesages for all events: S1/NGAP events, X2AP messages and RRC_SUBFRAME_PROCESS
|
it receives it's configuration in message NRRRC_CONFIGURATION_REQ, then real time mesages for all events: S1/NGAP events, X2AP messages and RRC_SUBFRAME_PROCESS
|
||||||
@@ -176,14 +174,56 @@ how does it communicate to scheduler ?
|
|||||||
|
|
||||||
|
|
||||||
# RLC
|
# RLC
|
||||||
RLC code is new implementation, not using OAI mechanisms: it is implmented directly on pthreads, ignoring OAI common functions.
|
RLC code is new implementation, not using OAI mechanisms: it is implemented directly on pthreads, ignoring OAI common functions.
|
||||||
It runs a thread waiting incoming data, but it is mainly running inside calling thread.
|
It is a library, running in thread RRC but also in PHY layer threads and some bits in pdcp running thread or F1 interface threads.
|
||||||
It is a library, running in thread RRC (except on itti message: F1AP_UL_RRC_MESSAGE for F1).
|
|
||||||
|
|
||||||
# NGAP
|
RLC data is isolated and encapsulated.
|
||||||
NGAP would be a itti thread as is S1AP (+twin thread SCTP that is almost void processing)?
|
It is stored under a global var: nr_rlc_ue_manager
|
||||||
About all messages are exchanged with RRC thread
|
The init function rlc_module_init() populates this global variable.
|
||||||
|
A small effort could lead us to return the pointer to the caller of rlc_module_init() (internal type: nr_rlc_ue_manager_internal_t)
|
||||||
|
but it returns void.
|
||||||
|
It could return the initialized pointer (as FILE* fopen() for example), then the RLC layer could have multiple instances in one process.
|
||||||
|
Even, a future evolution could remove this global rlc layer: rlc can be only a library that we create a instance for each UE because it doesn't shareany data between UEs.
|
||||||
|
|
||||||
|
For DL (respectively from UL in UE), the scheduler need to know the quantity of data waitin to be sent: it calls mac_rlc_status_ind()
|
||||||
|
That "peek" the size of the waiting data for a UE.
|
||||||
|
The scheduler then push orders to lower layers. The transport layer will actually pull data from RLC with: mac_rlc_data_req()
|
||||||
|
the low layer push data into rlc by: mac_rlc_data_ind()
|
||||||
|
Still on DL (gNB side), PDCP push incoming data into RLC by calling: rlc_data_req()
|
||||||
|
|
||||||
|
For UL, the low layer push data into rlc by: mac_rlc_data_ind()
|
||||||
|
Then, rlc push it to pdcp by calling pdcp_data_ind() from a complex rlc internal call back (deliver_sdu())
|
||||||
|
|
||||||
|
When adding a UE, external code have to call nr_rrc_rlc_config_asn1_req(), to remove it: rrc_rlc_remove_ue()
|
||||||
|
Inside UE, channels called drd or srb can be created: ??? and deleted: rrc_rlc_config_req()
|
||||||
|
|
||||||
|
nr_rlc_tick() must be called periodically to manage the internal timers
|
||||||
|
|
||||||
|
successful_delivery() and max_retx_reached(): in ??? trigger, the RLC sends a itti message to RRC: RLC_SDU_INDICATION (neutralized by #if 0 right now)
|
||||||
|
|
||||||
|
#PDCP
|
||||||
|
|
||||||
|
The PDCP implementation is also protected through a general mutex.
|
||||||
|
The design is very similar to rlc layer. The pdcp data is isolated and encapsulated.
|
||||||
|
|
||||||
|
pdcp_layer_init(): same as rlc init
|
||||||
|
we have to call a second init function: pdcp_module_init()
|
||||||
|
|
||||||
|
At Tx side (DL in gNB), pdcp_data_req() is the entry function that the upper layer calls.
|
||||||
|
The upper layer can be GTP or a PDCP internal thread enb_tun_read_thread() that read directly from Linux socket in case we skip 3GPP core implementation.
|
||||||
|
PDCP internals for pdcp_data_req() is thread safe: inside pdcp_data_req_drb(), the pdcp manager protects with the mutex the access to the SDU receiving function of PDCP (recv_sdu() callback, corresponding to nr_pdcp_entity_drb_am_recv_sdu() for DRBs). When it needs, the pdcp layer push this data to rlc by calling : rlc_data_req()
|
||||||
|
|
||||||
|
Also, incoming downlink sdu can comme from internal RRC: in this case, pdcp_run() reads a itti queue, for message RRC_DCCH_DATA_REQ, to0 only call 'pdcp_data_req()'
|
||||||
|
|
||||||
|
At Rx side, pdcp_data_ind() is the entry point that receives the data from RLC.
|
||||||
|
- Inside pdcp_data_ind(), the pdcp manager mutex protects the access to the PDU receiving function of PDCP (recv_pdu() callback corresponding to nr_pdcp_entity_drb_am_recv_pdu() for DRBs)
|
||||||
|
- Then deliver_sdu_drb() function sends the received data to GTP thread through an ITTI message (GTPV1U_ENB_TUNNEL_DATA_REQ).
|
||||||
|
|
||||||
|
pdcp_config_set_security(): not yet developped
|
||||||
|
|
||||||
|
nr_DRB_preconfiguration(): the mac layer calls this for ???
|
||||||
|
|
||||||
|
nr_rrc_pdcp_config_asn1_req() adds a UE in pdcp, pdcp_remove_UE() removes it
|
||||||
|
|
||||||
# GTP
|
# GTP
|
||||||
Gtp + UDP are two twin threads performing the data plane interface to the core network
|
Gtp + UDP are two twin threads performing the data plane interface to the core network
|
||||||
@@ -200,6 +240,10 @@ gtp thread calls directly pdcp_data_req(), so it runs inside it's context intern
|
|||||||
## inside other threads
|
## inside other threads
|
||||||
gtpv1u_create_s1u_tunnel(), delete tunnel, ... functions are called inside the other threads, without mutex.
|
gtpv1u_create_s1u_tunnel(), delete tunnel, ... functions are called inside the other threads, without mutex.
|
||||||
|
|
||||||
|
# NGAP
|
||||||
|
NGAP would be a itti thread as is S1AP (+twin thread SCTP that is almost void processing)?
|
||||||
|
About all messages are exchanged with RRC thread
|
||||||
|
|
||||||
|
|
||||||
<div class="panel panel-info">
|
<div class="panel panel-info">
|
||||||
**Note**
|
**Note**
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
#include "SCHED_NR/sched_nr.h"
|
#include "SCHED_NR/sched_nr.h"
|
||||||
#include "SCHED_NR/fapi_nr_l1.h"
|
#include "SCHED_NR/fapi_nr_l1.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
|
#include "PHY/MODULATION/nr_modulation.h"
|
||||||
|
|
||||||
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
|
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||||
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
|
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||||
|
|||||||
+42
-17
@@ -83,6 +83,8 @@ unsigned short config_frames[4] = {2,9,11,13};
|
|||||||
#include "executables/thread-common.h"
|
#include "executables/thread-common.h"
|
||||||
#include "NB_IoT_interface.h"
|
#include "NB_IoT_interface.h"
|
||||||
#include "x2ap_eNB.h"
|
#include "x2ap_eNB.h"
|
||||||
|
#include "ngap_gNB.h"
|
||||||
|
#include "gnb_paramdef.h"
|
||||||
|
|
||||||
pthread_cond_t nfapi_sync_cond;
|
pthread_cond_t nfapi_sync_cond;
|
||||||
pthread_mutex_t nfapi_sync_mutex;
|
pthread_mutex_t nfapi_sync_mutex;
|
||||||
@@ -387,30 +389,52 @@ int create_gNB_tasks(uint32_t gnb_nb) {
|
|||||||
return -1;
|
return -1;
|
||||||
}*/
|
}*/
|
||||||
if(itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0){
|
if(itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0){
|
||||||
LOG_E(SCTP, "Create task for SCTP failed\n");
|
LOG_E(SCTP, "Create task for SCTP failed\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (is_x2ap_enabled()) {
|
if (is_x2ap_enabled()) {
|
||||||
if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0){
|
if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0){
|
||||||
LOG_E(X2AP, "Create task for X2AP failed\n");
|
LOG_E(X2AP, "Create task for X2AP failed\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_I(X2AP, "X2AP is disabled.\n");
|
LOG_I(X2AP, "X2AP is disabled.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
paramdef_t NETParams[] = GNBNETPARAMS_DESC;
|
||||||
|
char aprefix[MAX_OPTNAME_SIZE*2 + 8];
|
||||||
|
sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
|
||||||
|
config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
|
||||||
|
|
||||||
if (EPC_MODE_ENABLED && (get_softmodem_params()->phy_test==0 && get_softmodem_params()->do_ra==0)) {
|
for(int i = GNB_INTERFACE_NAME_FOR_NG_AMF_IDX; i <= GNB_IPV4_ADDRESS_FOR_NG_AMF_IDX; i++){
|
||||||
|
if( NETParams[i].strptr == NULL){
|
||||||
|
LOG_E(NGAP, "No configuration in the file.\n");
|
||||||
|
NGAP_CONF_MODE = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_D(NGAP, "Configuration in the file: %s.\n",*NETParams[i].strptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (AMF_MODE_ENABLED && (get_softmodem_params()->phy_test==0 && get_softmodem_params()->do_ra==0)) {
|
||||||
if (gnb_nb > 0) {
|
if (gnb_nb > 0) {
|
||||||
/*if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) {
|
/*
|
||||||
|
if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) {
|
||||||
LOG_E(SCTP, "Create task for SCTP failed\n");
|
LOG_E(SCTP, "Create task for SCTP failed\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
if (itti_create_task (TASK_S1AP, s1ap_eNB_task, NULL) < 0) {
|
if(NGAP_CONF_MODE){
|
||||||
LOG_E(S1AP, "Create task for S1AP failed\n");
|
if (itti_create_task (TASK_NGAP, ngap_gNB_task, NULL) < 0) {
|
||||||
return -1;
|
LOG_E(NGAP, "Create task for NGAP failed\n");
|
||||||
}*/
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LOG_E(NGAP, "Ngap task not created\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(!emulate_rf){
|
if(!emulate_rf){
|
||||||
@@ -430,9 +454,9 @@ int create_gNB_tasks(uint32_t gnb_nb) {
|
|||||||
|
|
||||||
if (gnb_nb > 0) {
|
if (gnb_nb > 0) {
|
||||||
if (itti_create_task (TASK_GNB_APP, gNB_app_task, NULL) < 0) {
|
if (itti_create_task (TASK_GNB_APP, gNB_app_task, NULL) < 0) {
|
||||||
LOG_E(GNB_APP, "Create task for gNB APP failed\n");
|
LOG_E(GNB_APP, "Create task for gNB APP failed\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
LOG_I(NR_RRC,"Creating NR RRC gNB Task\n");
|
LOG_I(NR_RRC,"Creating NR RRC gNB Task\n");
|
||||||
|
|
||||||
if (itti_create_task (TASK_RRC_GNB, rrc_gnb_task, NULL) < 0) {
|
if (itti_create_task (TASK_RRC_GNB, rrc_gnb_task, NULL) < 0) {
|
||||||
@@ -821,7 +845,8 @@ int main( int argc, char **argv )
|
|||||||
}
|
}
|
||||||
|
|
||||||
openair0_cfg[0].threequarter_fs = threequarter_fs;
|
openair0_cfg[0].threequarter_fs = threequarter_fs;
|
||||||
EPC_MODE_ENABLED = !IS_SOFTMODEM_NOS1; //!get_softmodem_params()->phy_test;
|
AMF_MODE_ENABLED = !IS_SOFTMODEM_NOS1; //!get_softmodem_params()->phy_test;
|
||||||
|
NGAP_CONF_MODE = !IS_SOFTMODEM_NOS1; //!get_softmodem_params()->phy_test;
|
||||||
|
|
||||||
if (get_softmodem_params()->do_ra)
|
if (get_softmodem_params()->do_ra)
|
||||||
AssertFatal(get_softmodem_params()->phy_test == 0,"RA and phy_test are mutually exclusive\n");
|
AssertFatal(get_softmodem_params()->phy_test == 0,"RA and phy_test are mutually exclusive\n");
|
||||||
|
|||||||
+20
-20
@@ -355,7 +355,7 @@ static void UE_synch(void *arg) {
|
|||||||
|
|
||||||
void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
||||||
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
||||||
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_tti_tx);
|
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
|
||||||
uint8_t gNB_id = 0;
|
uint8_t gNB_id = 0;
|
||||||
|
|
||||||
if (tx_slot_type == NR_UPLINK_SLOT || tx_slot_type == NR_MIXED_SLOT){
|
if (tx_slot_type == NR_UPLINK_SLOT || tx_slot_type == NR_MIXED_SLOT){
|
||||||
@@ -370,16 +370,16 @@ void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
ul_indication.gNB_index = gNB_id;
|
ul_indication.gNB_index = gNB_id;
|
||||||
ul_indication.cc_id = UE->CC_id;
|
ul_indication.cc_id = UE->CC_id;
|
||||||
ul_indication.frame_rx = proc->frame_rx;
|
ul_indication.frame_rx = proc->frame_rx;
|
||||||
ul_indication.slot_rx = proc->nr_tti_rx;
|
ul_indication.slot_rx = proc->nr_slot_rx;
|
||||||
ul_indication.frame_tx = proc->frame_tx;
|
ul_indication.frame_tx = proc->frame_tx;
|
||||||
ul_indication.slot_tx = proc->nr_tti_tx;
|
ul_indication.slot_tx = proc->nr_slot_tx;
|
||||||
|
ul_indication.thread_id = proc->thread_id;
|
||||||
|
|
||||||
UE->if_inst->ul_indication(&ul_indication);
|
UE->if_inst->ul_indication(&ul_indication);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UE->mode != loop_through_memory) {
|
if (UE->mode != loop_through_memory) {
|
||||||
uint8_t thread_id = PHY_vars_UE_g[UE->Mod_id][0]->current_thread_id[proc->nr_tti_rx];
|
phy_procedures_nrUE_TX(UE,proc,0);
|
||||||
phy_procedures_nrUE_TX(UE,proc,0,thread_id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -387,7 +387,7 @@ void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
||||||
|
|
||||||
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
||||||
int rx_slot_type = nr_ue_slot_select(cfg, proc->frame_rx, proc->nr_tti_rx);
|
int rx_slot_type = nr_ue_slot_select(cfg, proc->frame_rx, proc->nr_slot_rx);
|
||||||
uint8_t gNB_id = 0;
|
uint8_t gNB_id = 0;
|
||||||
|
|
||||||
if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){
|
if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){
|
||||||
@@ -400,7 +400,8 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
dl_indication.gNB_index = gNB_id;
|
dl_indication.gNB_index = gNB_id;
|
||||||
dl_indication.cc_id = UE->CC_id;
|
dl_indication.cc_id = UE->CC_id;
|
||||||
dl_indication.frame = proc->frame_rx;
|
dl_indication.frame = proc->frame_rx;
|
||||||
dl_indication.slot = proc->nr_tti_rx;
|
dl_indication.slot = proc->nr_slot_rx;
|
||||||
|
dl_indication.thread_id = proc->thread_id;
|
||||||
|
|
||||||
UE->if_inst->dl_indication(&dl_indication, NULL);
|
UE->if_inst->dl_indication(&dl_indication, NULL);
|
||||||
}
|
}
|
||||||
@@ -411,16 +412,16 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
#else
|
#else
|
||||||
uint64_t a=rdtsc();
|
uint64_t a=rdtsc();
|
||||||
phy_procedures_nrUE_RX( UE, proc, 0, UE->mode);
|
phy_procedures_nrUE_RX( UE, proc, 0, UE->mode);
|
||||||
LOG_D(PHY,"phy_procedures_nrUE_RX: slot:%d, time %lu\n", proc->nr_tti_rx, (rdtsc()-a)/3500);
|
LOG_D(PHY,"phy_procedures_nrUE_RX: slot:%d, time %lu\n", proc->nr_slot_rx, (rdtsc()-a)/3500);
|
||||||
//printf(">>> nr_ue_pdcch_procedures ended\n");
|
//printf(">>> nr_ue_pdcch_procedures ended\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(IS_SOFTMODEM_NOS1){ //&& proc->nr_tti_rx==1
|
if(IS_SOFTMODEM_NOS1){ //&& proc->nr_slot_rx==1
|
||||||
//Hardcoded rnti value
|
//Hardcoded rnti value
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO,
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO,
|
||||||
0x1234, proc->frame_rx,
|
0x1234, proc->frame_rx,
|
||||||
proc->nr_tti_rx, 0);
|
proc->nr_slot_rx, 0);
|
||||||
pdcp_run(&ctxt);
|
pdcp_run(&ctxt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -435,7 +436,8 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
UE->ul_indication.gNB_index = 0;
|
UE->ul_indication.gNB_index = 0;
|
||||||
UE->ul_indication.cc_id = 0;
|
UE->ul_indication.cc_id = 0;
|
||||||
UE->ul_indication.frame = proc->frame_rx;
|
UE->ul_indication.frame = proc->frame_rx;
|
||||||
UE->ul_indication.slot = proc->nr_tti_rx;
|
UE->ul_indication.slot = proc->nr_slot_rx;
|
||||||
|
UE->ul_indication.thread_id = proc->thread_id;
|
||||||
UE->if_inst->ul_indication(&UE->ul_indication);
|
UE->if_inst->ul_indication(&UE->ul_indication);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -470,7 +472,7 @@ void UE_processing(void *arg) {
|
|||||||
if (UE->mac_enabled == 1) {
|
if (UE->mac_enabled == 1) {
|
||||||
uint8_t gNB_id = 0;
|
uint8_t gNB_id = 0;
|
||||||
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &UE->ul_time_alignment[gNB_id];
|
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &UE->ul_time_alignment[gNB_id];
|
||||||
int slot_tx = proc->nr_tti_tx;
|
int slot_tx = proc->nr_slot_tx;
|
||||||
int frame_tx = proc->frame_tx;
|
int frame_tx = proc->frame_tx;
|
||||||
|
|
||||||
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
|
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
|
||||||
@@ -688,14 +690,12 @@ void *UE_thread(void *arg) {
|
|||||||
processingData_t *curMsg=(processingData_t *)NotifiedFifoData(msgToPush);
|
processingData_t *curMsg=(processingData_t *)NotifiedFifoData(msgToPush);
|
||||||
curMsg->UE=UE;
|
curMsg->UE=UE;
|
||||||
// update thread index for received subframe
|
// update thread index for received subframe
|
||||||
curMsg->UE->current_thread_id[slot_nr] = thread_idx;
|
curMsg->proc.thread_id = thread_idx;
|
||||||
curMsg->proc.CC_id = UE->CC_id;
|
curMsg->proc.CC_id = UE->CC_id;
|
||||||
curMsg->proc.nr_tti_rx= slot_nr;
|
curMsg->proc.nr_slot_rx = slot_nr;
|
||||||
curMsg->proc.subframe_rx=slot_nr/(nb_slot_frame/10);
|
curMsg->proc.nr_slot_tx = (absolute_slot + DURATION_RX_TO_TX) % nb_slot_frame;
|
||||||
curMsg->proc.nr_tti_tx = (absolute_slot + DURATION_RX_TO_TX) % nb_slot_frame;
|
curMsg->proc.frame_rx = (absolute_slot/nb_slot_frame) % MAX_FRAME_NUMBER;
|
||||||
curMsg->proc.subframe_tx=curMsg->proc.nr_tti_rx;
|
curMsg->proc.frame_tx = ((absolute_slot+DURATION_RX_TO_TX)/nb_slot_frame) % MAX_FRAME_NUMBER;
|
||||||
curMsg->proc.frame_rx = (absolute_slot/nb_slot_frame) % MAX_FRAME_NUMBER;
|
|
||||||
curMsg->proc.frame_tx = ((absolute_slot+DURATION_RX_TO_TX)/nb_slot_frame) % MAX_FRAME_NUMBER;
|
|
||||||
curMsg->proc.decoded_frame_rx=-1;
|
curMsg->proc.decoded_frame_rx=-1;
|
||||||
//LOG_I(PHY,"Process slot %d thread Idx %d total gain %d\n", slot_nr, thread_idx, UE->rx_total_gain_dB);
|
//LOG_I(PHY,"Process slot %d thread Idx %d total gain %d\n", slot_nr, thread_idx, UE->rx_total_gain_dB);
|
||||||
|
|
||||||
|
|||||||
@@ -290,9 +290,9 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
|
|||||||
|
|
||||||
fp->slots_per_frame = 10* fp->slots_per_subframe;
|
fp->slots_per_frame = 10* fp->slots_per_subframe;
|
||||||
|
|
||||||
fp->nb_antenna_ports_gNB = 1; // default value until overwritten by RRCConnectionReconfiguration
|
fp->nb_antenna_ports_gNB = cfg->carrier_config.num_tx_ant.value;// It corresponds to pdsch_AntennaPorts
|
||||||
fp->nb_antennas_rx = 1; // default value until overwritten by RRCConnectionReconfiguration
|
fp->nb_antennas_rx = cfg->carrier_config.num_rx_ant.value; // It denotes the number of rx antennas at gNB
|
||||||
fp->nb_antennas_tx = 1; // default value until overwritten by RRCConnectionReconfiguration
|
fp->nb_antennas_tx = 1; // It corresponds to the number of UE Tx antennas
|
||||||
|
|
||||||
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
||||||
fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
|
fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
|
||||||
|
|||||||
@@ -49,12 +49,14 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
|
|||||||
int reset_freq_est);
|
int reset_freq_est);
|
||||||
|
|
||||||
int nr_slot_fep(PHY_VARS_NR_UE *phy_vars_ue,
|
int nr_slot_fep(PHY_VARS_NR_UE *phy_vars_ue,
|
||||||
unsigned char l,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
unsigned char Ns,
|
unsigned char l,
|
||||||
int sample_offset,
|
unsigned char Ns,
|
||||||
int no_prefix);
|
int sample_offset,
|
||||||
|
int no_prefix);
|
||||||
|
|
||||||
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
int sample_offset,
|
int sample_offset,
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#endif*/
|
#endif*/
|
||||||
|
|
||||||
int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
int sample_offset,
|
int sample_offset,
|
||||||
@@ -125,7 +126,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||||
memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
|
memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
|
||||||
|
|
||||||
rx_offset = sample_offset + slot_offset - SOFFSET;
|
rx_offset = sample_offset + slot_offset - SOFFSET;
|
||||||
// Align with 256 bit
|
// Align with 256 bit
|
||||||
@@ -157,14 +158,14 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
|||||||
(void *) &common_vars->rxdata[aa][rx_offset % frame_length_samples],
|
(void *) &common_vars->rxdata[aa][rx_offset % frame_length_samples],
|
||||||
frame_parms->ofdm_symbol_size*sizeof(int));
|
frame_parms->ofdm_symbol_size*sizeof(int));
|
||||||
dft(dftsize,(int16_t *)tmp_dft_in,
|
dft(dftsize,(int16_t *)tmp_dft_in,
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||||
} else { // use dft input from RX buffer directly
|
} else { // use dft input from RX buffer directly
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
start_meas(&ue->rx_dft_stats);
|
start_meas(&ue->rx_dft_stats);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->rx_dft_stats);
|
stop_meas(&ue->rx_dft_stats);
|
||||||
#endif
|
#endif
|
||||||
@@ -185,11 +186,11 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
|||||||
(void *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
(void *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
||||||
frame_parms->ofdm_symbol_size*sizeof(int));
|
frame_parms->ofdm_symbol_size*sizeof(int));
|
||||||
dft(dftsize,(int16_t *)tmp_dft_in,
|
dft(dftsize,(int16_t *)tmp_dft_in,
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||||
} else { // use dft input from RX buffer directly
|
} else { // use dft input from RX buffer directly
|
||||||
|
|
||||||
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||||
}
|
}
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->rx_dft_stats);
|
stop_meas(&ue->rx_dft_stats);
|
||||||
@@ -206,9 +207,9 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
|||||||
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
|
||||||
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
|
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
|
||||||
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
|
||||||
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
||||||
(int16_t*)&rot2,
|
(int16_t*)&rot2,
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
||||||
frame_parms->ofdm_symbol_size,
|
frame_parms->ofdm_symbol_size,
|
||||||
15);
|
15);
|
||||||
|
|
||||||
@@ -222,6 +223,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
int sample_offset,
|
int sample_offset,
|
||||||
@@ -310,7 +312,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||||
memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
|
memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
|
||||||
|
|
||||||
rx_offset = sample_offset + slot_offset - SOFFSET;
|
rx_offset = sample_offset + slot_offset - SOFFSET;
|
||||||
// Align with 256 bit
|
// Align with 256 bit
|
||||||
@@ -342,7 +344,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
|||||||
(void *) &common_vars->rxdata[aa][rx_offset],
|
(void *) &common_vars->rxdata[aa][rx_offset],
|
||||||
frame_parms->ofdm_symbol_size*sizeof(int));
|
frame_parms->ofdm_symbol_size*sizeof(int));
|
||||||
dft(dftsize,(int16_t *)tmp_dft_in,
|
dft(dftsize,(int16_t *)tmp_dft_in,
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||||
} else { // use dft input from RX buffer directly
|
} else { // use dft input from RX buffer directly
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
start_meas(&ue->rx_dft_stats);
|
start_meas(&ue->rx_dft_stats);
|
||||||
@@ -350,7 +352,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
|
|
||||||
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
|
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->rx_dft_stats);
|
stop_meas(&ue->rx_dft_stats);
|
||||||
#endif
|
#endif
|
||||||
@@ -371,10 +373,10 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
|||||||
(void *) &common_vars->rxdata[aa][rx_offset],
|
(void *) &common_vars->rxdata[aa][rx_offset],
|
||||||
frame_parms->ofdm_symbol_size*sizeof(int));
|
frame_parms->ofdm_symbol_size*sizeof(int));
|
||||||
dft(dftsize,(int16_t *)tmp_dft_in,
|
dft(dftsize,(int16_t *)tmp_dft_in,
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||||
} else { // use dft input from RX buffer directly
|
} else { // use dft input from RX buffer directly
|
||||||
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
|
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
|
||||||
}
|
}
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->rx_dft_stats);
|
stop_meas(&ue->rx_dft_stats);
|
||||||
@@ -393,9 +395,9 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
|
|||||||
symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
|
symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
||||||
(int16_t*)&rot2,
|
(int16_t*)&rot2,
|
||||||
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
|
||||||
frame_parms->ofdm_symbol_size,
|
frame_parms->ofdm_symbol_size,
|
||||||
15);
|
15);
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
||||||
uint16_t start_sc,
|
uint16_t start_sc,
|
||||||
|
uint16_t ofdm_symbol_size,
|
||||||
uint8_t numDmrsCdmGrpsNoData,
|
uint8_t numDmrsCdmGrpsNoData,
|
||||||
uint8_t dmrs_type) {
|
uint8_t dmrs_type) {
|
||||||
uint8_t delta;
|
uint8_t delta;
|
||||||
@@ -44,7 +45,7 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
|||||||
if (k>start_sc)
|
if (k>start_sc)
|
||||||
diff = k-start_sc;
|
diff = k-start_sc;
|
||||||
else
|
else
|
||||||
diff = start_sc-k;
|
diff = (ofdm_symbol_size-start_sc)+k;
|
||||||
for (int i = 0; i<numDmrsCdmGrpsNoData; i++){
|
for (int i = 0; i<numDmrsCdmGrpsNoData; i++){
|
||||||
if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
|
if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
|
||||||
delta = i;
|
delta = i;
|
||||||
@@ -53,7 +54,7 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
delta = i<<1;
|
delta = i<<1;
|
||||||
if ( (((diff)%6) == delta) || (((k-start_sc)%6) == (delta+1)) )
|
if (((diff%6) == delta) || ((diff%6) == (delta+1)))
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_
|
|||||||
|
|
||||||
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
|
||||||
uint16_t start_sc,
|
uint16_t start_sc,
|
||||||
|
uint16_t ofdm_symbol_size,
|
||||||
uint8_t numDmrsCdmGrpsNoData,
|
uint8_t numDmrsCdmGrpsNoData,
|
||||||
uint8_t dmrs_type);
|
uint8_t dmrs_type);
|
||||||
|
|
||||||
|
|||||||
@@ -121,18 +121,18 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
|
|||||||
array_of_w *wf;
|
array_of_w *wf;
|
||||||
array_of_w *wt;
|
array_of_w *wt;
|
||||||
|
|
||||||
config_type = 0; //to be updated by higher layer
|
config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
|
||||||
|
|
||||||
wf = (config_type==0) ? wf1 : wf2;
|
wf = (config_type==pdsch_dmrs_type1) ? wf1 : wf2;
|
||||||
wt = (config_type==0) ? wt1 : wt2;
|
wt = (config_type==pdsch_dmrs_type1) ? wt1 : wt2;
|
||||||
|
|
||||||
if (config_type > 1)
|
if (config_type > 1)
|
||||||
LOG_E(PHY,"Bad PDSCH DMRS config type %d\n", config_type);
|
LOG_E(PHY,"Bad PDSCH DMRS config type %d\n", config_type);
|
||||||
|
|
||||||
if ((p>=1000) && (p<((config_type==0) ? 1008 : 1012))) {
|
if ((p>=1000) && (p<((config_type==pdsch_dmrs_type1) ? 1008 : 1012))) {
|
||||||
if (ue->frame_parms.Ncp == NORMAL) {
|
if (ue->frame_parms.Ncp == NORMAL) {
|
||||||
|
|
||||||
for (int i=0; i<nb_pdsch_rb*((config_type==0) ? 6:4); i++) {
|
for (int i=0; i<nb_pdsch_rb*((config_type==pdsch_dmrs_type1) ? 6:4); i++) {
|
||||||
|
|
||||||
w = (wf[p-1000][i&1])*(wt[p-1000][lp]);
|
w = (wf[p-1000][i&1])*(wt[p-1000][lp]);
|
||||||
mod_table = (w==1) ? nr_rx_mod_table : nr_rx_nmod_table;
|
mod_table = (w==1) ? nr_rx_mod_table : nr_rx_nmod_table;
|
||||||
|
|||||||
@@ -92,13 +92,7 @@ int pss_ch_est_nr(PHY_VARS_NR_UE *ue,
|
|||||||
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
|
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
|
||||||
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR]);
|
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR]);
|
||||||
|
|
||||||
int _do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
|
int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric, uint8_t *phase_max);
|
||||||
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
|
|
||||||
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
|
|
||||||
uint8_t doPss, uint8_t doSss,
|
|
||||||
uint8_t subframe);
|
|
||||||
|
|
||||||
int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric, uint8_t *phase_max);
|
|
||||||
|
|
||||||
#undef INIT_VARIABLES_SSS_NR_H
|
#undef INIT_VARIABLES_SSS_NR_H
|
||||||
#undef EXTERN
|
#undef EXTERN
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
||||||
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
|
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
|
||||||
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
|
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
|
||||||
int8_t Wf[2], Wt[2], l0, l_prime[2], delta;
|
int8_t Wf[2], Wt[2], l0, l_prime, l_overline, delta;
|
||||||
uint8_t dmrs_Type = rel15->dmrsConfigType;
|
uint8_t dmrs_Type = rel15->dmrsConfigType;
|
||||||
int nb_re_dmrs;
|
int nb_re_dmrs;
|
||||||
uint16_t n_dmrs;
|
uint16_t n_dmrs;
|
||||||
@@ -153,10 +153,10 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
n_dmrs = ((rel15->rbSize+rel15->rbStart)*4)<<1;
|
n_dmrs = ((rel15->rbSize+rel15->rbStart)*4)<<1;
|
||||||
}
|
}
|
||||||
uint16_t nb_re;
|
uint16_t nb_re;
|
||||||
nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs-xOverhead)*rel15->rbSize*rel15->NrOfCodewords;
|
nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs-xOverhead)*rel15->rbSize*rel15->nrOfLayers;
|
||||||
uint8_t Qm = rel15->qamModOrder[0];
|
uint8_t Qm = rel15->qamModOrder[0];
|
||||||
uint32_t encoded_length = nb_re*Qm;
|
uint32_t encoded_length = nb_re*Qm;
|
||||||
int16_t mod_dmrs[n_dmrs<<1] __attribute__ ((aligned(16)));
|
int16_t mod_dmrs[14][n_dmrs] __attribute__ ((aligned(16)));
|
||||||
|
|
||||||
|
|
||||||
/// CRC, coding, interleaving and rate matching
|
/// CRC, coding, interleaving and rate matching
|
||||||
@@ -250,16 +250,17 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
//to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
|
//to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
|
||||||
|
|
||||||
/// DMRS QPSK modulation
|
/// DMRS QPSK modulation
|
||||||
|
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
||||||
|
if (rel15->dlDmrsSymbPos & (1 << l))
|
||||||
l0 = get_l0(rel15->dlDmrsSymbPos);
|
nr_modulation(pdsch_dmrs[l][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs[l]); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
||||||
nr_modulation(pdsch_dmrs[l0][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_DLSCH
|
#ifdef DEBUG_DLSCH
|
||||||
|
l0 = get_l0(rel15->dlDmrsSymbPos);
|
||||||
printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs>>1, dmrs_Type);
|
printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs>>1, dmrs_Type);
|
||||||
for (int i=0; i<n_dmrs>>4; i++) {
|
for (int i=0; i<n_dmrs>>4; i++) {
|
||||||
for (int j=0; j<8; j++) {
|
for (int j=0; j<8; j++) {
|
||||||
printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]);
|
printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
@@ -271,7 +272,6 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
// Non interleaved VRB to PRB mapping
|
// Non interleaved VRB to PRB mapping
|
||||||
uint16_t start_sc = frame_parms->first_carrier_offset + (rel15->rbStart+rel15->BWPStart)*NR_NB_SC_PER_RB;
|
uint16_t start_sc = frame_parms->first_carrier_offset + (rel15->rbStart+rel15->BWPStart)*NR_NB_SC_PER_RB;
|
||||||
|
|
||||||
|
|
||||||
if (start_sc >= frame_parms->ofdm_symbol_size)
|
if (start_sc >= frame_parms->ofdm_symbol_size)
|
||||||
start_sc -= frame_parms->ofdm_symbol_size;
|
start_sc -= frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
@@ -285,55 +285,71 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
get_Wt(Wt, ap, dmrs_Type);
|
get_Wt(Wt, ap, dmrs_Type);
|
||||||
get_Wf(Wf, ap, dmrs_Type);
|
get_Wf(Wf, ap, dmrs_Type);
|
||||||
delta = get_delta(ap, dmrs_Type);
|
delta = get_delta(ap, dmrs_Type);
|
||||||
l_prime[0] = 0; // single symbol ap 0
|
l_prime = 0; // single symbol ap 0
|
||||||
uint8_t dmrs_symbol = l0+l_prime[0];
|
l0 = get_l0(rel15->dlDmrsSymbPos);
|
||||||
|
l_overline = l0;
|
||||||
|
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
|
uint8_t dmrs_symbol = l0+l_prime;
|
||||||
printf("DMRS Type %d params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n",
|
printf("DMRS Type %d params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n",
|
||||||
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol);
|
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime, l0, dmrs_symbol);
|
||||||
#endif
|
#endif
|
||||||
uint8_t k_prime=0;
|
uint8_t k_prime=0;
|
||||||
uint16_t m=0, n=0, dmrs_idx=0, k=0;
|
uint16_t m=0, n=0, dmrs_idx=0, k=0;
|
||||||
|
|
||||||
int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
|
int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
|
||||||
if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) // another if condition to be included to check pdsch config type (reference of k)
|
|
||||||
dmrs_idx = rel15->rbStart*6;
|
|
||||||
else
|
|
||||||
dmrs_idx = rel15->rbStart*4;
|
|
||||||
|
|
||||||
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
||||||
k = start_sc;
|
k = start_sc;
|
||||||
for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) {
|
n = 0;
|
||||||
if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
|
k_prime = 0;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
|
if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) // another if condition to be included to check pdsch config type (reference of k)
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
dmrs_idx = rel15->rbStart*6;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
else
|
||||||
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
dmrs_idx = rel15->rbStart*4;
|
||||||
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) {
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
|
||||||
#endif
|
|
||||||
dmrs_idx++;
|
|
||||||
k_prime++;
|
|
||||||
k_prime&=1;
|
|
||||||
n+=(k_prime)?0:1;
|
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
if ((rel15->dlDmrsSymbPos & (1 << l)) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
|
||||||
if( (l != dmrs_symbol) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
|
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
if (l==(l_overline+1)) //take into account the double DMRS symbols
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
l_prime = 1;
|
||||||
|
else if (l>(l_overline+1)) {//new DMRS pair
|
||||||
|
l_overline = l;
|
||||||
|
l_prime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
||||||
m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
||||||
#endif
|
#endif
|
||||||
m++;
|
dmrs_idx++;
|
||||||
}
|
k_prime++;
|
||||||
}
|
k_prime&=1;
|
||||||
if (++k >= frame_parms->ofdm_symbol_size)
|
n+=(k_prime)?0:1;
|
||||||
k -= frame_parms->ofdm_symbol_size;
|
|
||||||
} //RE loop
|
} else {
|
||||||
|
|
||||||
|
if( (!(rel15->dlDmrsSymbPos & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,frame_parms->ofdm_symbol_size,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
||||||
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
|
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
||||||
|
m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
||||||
|
#endif
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (++k >= frame_parms->ofdm_symbol_size)
|
||||||
|
k -= frame_parms->ofdm_symbol_size;
|
||||||
|
} //RE loop
|
||||||
} // symbol loop
|
} // symbol loop
|
||||||
}// layer loop
|
}// layer loop
|
||||||
|
|
||||||
|
|
||||||
dlsch->slot_tx[slot]=0;
|
dlsch->slot_tx[slot]=0;
|
||||||
}// dlsch loop
|
}// dlsch loop
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -67,12 +67,12 @@ void get_antenna_ports(uint8_t *ap, uint8_t n_symbs, uint8_t config) {
|
|||||||
|
|
||||||
void get_Wt(int8_t *Wt, uint8_t ap, uint8_t config) {
|
void get_Wt(int8_t *Wt, uint8_t ap, uint8_t config) {
|
||||||
for (int i=0; i<2; i++)
|
for (int i=0; i<2; i++)
|
||||||
*(Wt+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][3+i]):(pdsch_dmrs_2[ap][3+i]);
|
*(Wt+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][5+i]):(pdsch_dmrs_2[ap][5+i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_Wf(int8_t *Wf, uint8_t ap, uint8_t config) {
|
void get_Wf(int8_t *Wf, uint8_t ap, uint8_t config) {
|
||||||
for (int i=0; i<2; i++)
|
for (int i=0; i<2; i++)
|
||||||
*(Wf+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][5+i]):(pdsch_dmrs_2[ap][5+i]);
|
*(Wf+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][3+i]):(pdsch_dmrs_2[ap][3+i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t get_delta(uint8_t ap, uint8_t config) {
|
uint8_t get_delta(uint8_t ap, uint8_t config) {
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
void nr_group_sequence_hopping(pucch_GroupHopping_t PUCCH_GroupHopping,
|
void nr_group_sequence_hopping(pucch_GroupHopping_t PUCCH_GroupHopping,
|
||||||
uint32_t n_id,
|
uint32_t n_id,
|
||||||
uint8_t n_hop,
|
uint8_t n_hop,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t *u,
|
uint8_t *u,
|
||||||
uint8_t *v);
|
uint8_t *v);
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
|
|||||||
uint8_t mcs,
|
uint8_t mcs,
|
||||||
uint8_t lnormal,
|
uint8_t lnormal,
|
||||||
uint8_t lprime,
|
uint8_t lprime,
|
||||||
int nr_tti_tx);
|
int nr_slot_tx);
|
||||||
|
|
||||||
/** \brief Computes available bits G. */
|
/** \brief Computes available bits G. */
|
||||||
uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch, uint8_t nb_re_dmrs, uint16_t length_dmrs, uint8_t Qm, uint8_t Nl);
|
uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch, uint8_t nb_re_dmrs, uint16_t length_dmrs, uint8_t Qm, uint8_t Nl);
|
||||||
|
|||||||
@@ -33,11 +33,11 @@
|
|||||||
#include "nr_dci.h"
|
#include "nr_dci.h"
|
||||||
|
|
||||||
void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
|
void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
|
||||||
uint32_t n_id,
|
uint32_t n_id,
|
||||||
uint8_t n_hop,
|
uint8_t n_hop,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t *u,
|
uint8_t *u,
|
||||||
uint8_t *v) {
|
uint8_t *v) {
|
||||||
/*
|
/*
|
||||||
* Implements TS 38.211 subclause 6.3.2.2.1 Group and sequence hopping
|
* Implements TS 38.211 subclause 6.3.2.2.1 Group and sequence hopping
|
||||||
* The following variables are set by higher layers:
|
* The following variables are set by higher layers:
|
||||||
@@ -65,7 +65,7 @@ void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
|
|||||||
*v=0;
|
*v=0;
|
||||||
uint32_t c_init = 0;
|
uint32_t c_init = 0;
|
||||||
uint32_t x1,s; // TS 38.211 Subclause 5.2.1
|
uint32_t x1,s; // TS 38.211 Subclause 5.2.1
|
||||||
int l = 32, minShift = ((2*nr_tti_tx+n_hop)<<3);
|
int l = 32, minShift = ((2*nr_slot_tx+n_hop)<<3);
|
||||||
int tmpShift =0;
|
int tmpShift =0;
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t\t [nr_group_sequence_hopping] calculating u,v -> ");
|
printf("\t\t [nr_group_sequence_hopping] calculating u,v -> ");
|
||||||
@@ -92,7 +92,7 @@ void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
|
|||||||
f_gh = f_gh%30;
|
f_gh = f_gh%30;
|
||||||
f_ss = n_id%30;
|
f_ss = n_id%30;
|
||||||
/* for (int m=0; m<8; m++){
|
/* for (int m=0; m<8; m++){
|
||||||
f_gh = f_gh + ((1<<m)*((uint8_t)((s>>(8*(2*nr_tti_tx+n_hop)+m))&1))); // Not sure we have to use nr_tti_tx FIXME!!!
|
f_gh = f_gh + ((1<<m)*((uint8_t)((s>>(8*(2*nr_slot_tx+n_hop)+m))&1))); // Not sure we have to use nr_slot_tx FIXME!!!
|
||||||
}
|
}
|
||||||
f_gh = f_gh%30;
|
f_gh = f_gh%30;
|
||||||
f_ss = n_id%30;*/
|
f_ss = n_id%30;*/
|
||||||
@@ -102,7 +102,7 @@ void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
|
|||||||
c_init = (1<<5)*floor(n_id/30)+(n_id%30); // we initialize c_init to calculate u,v
|
c_init = (1<<5)*floor(n_id/30)+(n_id%30); // we initialize c_init to calculate u,v
|
||||||
s = lte_gold_generic(&x1, &c_init, 1); // TS 38.211 Subclause 5.2.1
|
s = lte_gold_generic(&x1, &c_init, 1); // TS 38.211 Subclause 5.2.1
|
||||||
f_ss = n_id%30;
|
f_ss = n_id%30;
|
||||||
l = 32, minShift = (2*nr_tti_tx+n_hop);
|
l = 32, minShift = (2*nr_slot_tx+n_hop);
|
||||||
|
|
||||||
while(minShift >= l) {
|
while(minShift >= l) {
|
||||||
s = lte_gold_generic(&x1, &c_init, 0);
|
s = lte_gold_generic(&x1, &c_init, 0);
|
||||||
@@ -111,7 +111,7 @@ void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
|
|||||||
|
|
||||||
tmpShift = (minShift&((1<<5)-1)); //minShift%32;
|
tmpShift = (minShift&((1<<5)-1)); //minShift%32;
|
||||||
*v = (uint8_t)((s>>tmpShift)&1);
|
*v = (uint8_t)((s>>tmpShift)&1);
|
||||||
// *v = (uint8_t)((s>>(2*nr_tti_tx+n_hop))&1); // Not sure we have to use nr_tti_tx FIXME!!!
|
// *v = (uint8_t)((s>>(2*nr_slot_tx+n_hop))&1); // Not sure we have to use nr_slot_tx FIXME!!!
|
||||||
}
|
}
|
||||||
|
|
||||||
*u = (f_gh+f_ss)%30;
|
*u = (f_gh+f_ss)%30;
|
||||||
@@ -125,7 +125,7 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
|
|||||||
uint8_t mcs,
|
uint8_t mcs,
|
||||||
uint8_t lnormal,
|
uint8_t lnormal,
|
||||||
uint8_t lprime,
|
uint8_t lprime,
|
||||||
int nr_tti_tx) {
|
int nr_slot_tx) {
|
||||||
/*
|
/*
|
||||||
* Implements TS 38.211 subclause 6.3.2.2.2 Cyclic shift hopping
|
* Implements TS 38.211 subclause 6.3.2.2.2 Cyclic shift hopping
|
||||||
* - n_id: higher-layer parameter hoppingId
|
* - n_id: higher-layer parameter hoppingId
|
||||||
@@ -140,7 +140,7 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
|
|||||||
|
|
||||||
uint32_t x1,s = lte_gold_generic(&x1, &c_init, 1); // TS 38.211 Subclause 5.2.1
|
uint32_t x1,s = lte_gold_generic(&x1, &c_init, 1); // TS 38.211 Subclause 5.2.1
|
||||||
uint8_t n_cs=0;
|
uint8_t n_cs=0;
|
||||||
int l = 32, minShift = (14*8*nr_tti_tx )+ 8*(lnormal+lprime);
|
int l = 32, minShift = (14*8*nr_slot_tx )+ 8*(lnormal+lprime);
|
||||||
int tmpShift =0;
|
int tmpShift =0;
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t\t [nr_cyclic_shift_hopping] calculating alpha (cyclic shift) using c_init=%u -> \n",c_init);
|
printf("\t\t [nr_cyclic_shift_hopping] calculating alpha (cyclic shift) using c_init=%u -> \n",c_init);
|
||||||
@@ -155,8 +155,8 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
|
|||||||
tmpShift = (minShift&((1<<5)-1)); //minShift%32;
|
tmpShift = (minShift&((1<<5)-1)); //minShift%32;
|
||||||
minShift ++;
|
minShift ++;
|
||||||
n_cs = n_cs+((1<<m)*((uint8_t)((s>>tmpShift)&1)));
|
n_cs = n_cs+((1<<m)*((uint8_t)((s>>tmpShift)&1)));
|
||||||
// calculating n_cs (Not sure we have to use nr_tti_tx FIXME!!!)
|
// calculating n_cs (Not sure we have to use nr_slot_tx FIXME!!!)
|
||||||
// n_cs = n_cs+((1<<m)*((uint8_t)((s>>((14*8*nr_tti_tx) + 8*(lnormal+lprime) + m))&1)));
|
// n_cs = n_cs+((1<<m)*((uint8_t)((s>>((14*8*nr_slot_tx) + 8*(lnormal+lprime) + m))&1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
alpha = (alpha * (double)((m0+mcs+n_cs)%12));
|
alpha = (alpha * (double)((m0+mcs+n_cs)%12));
|
||||||
|
|||||||
@@ -185,3 +185,57 @@ short filt8_rr1[8] = {
|
|||||||
|
|
||||||
short filt8_rr2[8] = {
|
short filt8_rr2[8] = {
|
||||||
-4096,-8192,-12288,-16384,0,0,0,0};
|
-4096,-8192,-12288,-16384,0,0,0,0};
|
||||||
|
|
||||||
|
short filt8_l2[8] = {
|
||||||
|
0,0,13107,9830,6554,3277,0,0};
|
||||||
|
|
||||||
|
short filt8_r2[8] = {
|
||||||
|
0,0,3277,6554,9830,13107,0,0};
|
||||||
|
|
||||||
|
short filt8_m2[8] = {
|
||||||
|
0,0,0,0,13107,9830,6554,3277};
|
||||||
|
|
||||||
|
short filt8_mm2[8]= {
|
||||||
|
0,0,0,0,3277,6554,9830,13107};
|
||||||
|
|
||||||
|
short filt8_rl2[8] = {
|
||||||
|
19661,22938,26214,29491,0,0,0,0};
|
||||||
|
|
||||||
|
short filt8_rm2[8] = {
|
||||||
|
-3277,-6554,-9830,-13107,0,0,0,0};//-3277,-6554,-9830,-13107
|
||||||
|
|
||||||
|
short filt8_l3[8] = {
|
||||||
|
22938,19661,0,0,13107,9830,6554,3277};
|
||||||
|
|
||||||
|
short filt8_r3[8] = {
|
||||||
|
-7537,-4260,0,0,3277,6554,9830,13107};//-6554,-3277
|
||||||
|
|
||||||
|
short filt8_rl3[8] = {
|
||||||
|
0,0,19661,22938,0,0,0,0};
|
||||||
|
|
||||||
|
short filt8_rr3[8] = {
|
||||||
|
0,0,-4260,-7537,0,0,0,0};//-3277,-6554
|
||||||
|
|
||||||
|
short filt8_dcrl1[8] = {
|
||||||
|
14895,13405,11916,10426,8937,7447,5958,4468};
|
||||||
|
|
||||||
|
short filt8_dcrh1[8] = {
|
||||||
|
2979,1489,0,0,0,0,0,0};
|
||||||
|
|
||||||
|
short filt8_dcll1[8] = {
|
||||||
|
13405,14895,0,0,0,0,0,0};
|
||||||
|
|
||||||
|
short filt8_dclh1[8] = {
|
||||||
|
1489,2979,4468,5958,7447,8937,10426,11916};
|
||||||
|
|
||||||
|
short filt8_dcrl2[8] = {
|
||||||
|
0,0,0,0,14895,13405,11916,10426};
|
||||||
|
|
||||||
|
short filt8_dcrh2[8] = {
|
||||||
|
8937,7447,5958,4468,2979,1489,0,0,};
|
||||||
|
|
||||||
|
short filt8_dcll2[8] = {
|
||||||
|
7447,8937,10426,11916,13405,14895,0,0};
|
||||||
|
|
||||||
|
short filt8_dclh2[8] = {
|
||||||
|
0,0,0,0,1489,2979,4468,5958};
|
||||||
|
|||||||
@@ -133,4 +133,40 @@ extern short filt8_rr1[8];
|
|||||||
|
|
||||||
extern short filt8_rr2[8];
|
extern short filt8_rr2[8];
|
||||||
|
|
||||||
|
extern short filt8_rm2[8];
|
||||||
|
|
||||||
|
extern short filt8_rl2[8];
|
||||||
|
|
||||||
|
extern short filt8_l2[8];
|
||||||
|
|
||||||
|
extern short filt8_r2[8];
|
||||||
|
|
||||||
|
extern short filt8_m2[8];
|
||||||
|
|
||||||
|
extern short filt8_mm2[8];
|
||||||
|
|
||||||
|
extern short filt8_l3[8];
|
||||||
|
|
||||||
|
extern short filt8_r3[8];
|
||||||
|
|
||||||
|
extern short filt8_rr3[8];
|
||||||
|
|
||||||
|
extern short filt8_rl3[8];
|
||||||
|
|
||||||
|
extern short filt8_dcrl1[8];
|
||||||
|
|
||||||
|
extern short filt8_dcrh1[8];
|
||||||
|
|
||||||
|
extern short filt8_dcll1[8];
|
||||||
|
|
||||||
|
extern short filt8_dclh1[8];
|
||||||
|
|
||||||
|
extern short filt8_dcrl2[8];
|
||||||
|
|
||||||
|
extern short filt8_dcrh2[8];
|
||||||
|
|
||||||
|
extern short filt8_dcll2[8];
|
||||||
|
|
||||||
|
extern short filt8_dclh2[8];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -103,7 +103,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
if (ue->mac_enabled==1) {
|
if (ue->mac_enabled==1) {
|
||||||
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
|
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
|
||||||
//mac_resynch();
|
//mac_resynch();
|
||||||
//dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id);
|
//dl_phy_sync_success(ue->Mod_id,frame,0,1);//ue->common_vars.eNb_id);
|
||||||
ue->UE_mode[0] = PRACH;
|
ue->UE_mode[0] = PRACH;
|
||||||
ue->prach_resources[gNB_id]->sync_frame = frame;
|
ue->prach_resources[gNB_id]->sync_frame = frame;
|
||||||
ue->prach_resources[gNB_id]->init_msg1 = 0;
|
ue->prach_resources[gNB_id]->init_msg1 = 0;
|
||||||
@@ -122,9 +122,8 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_PHY
|
#ifdef DEBUG_PHY
|
||||||
LOG_D(PHY,"AbsSubframe %d: ThreadId %d diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n",
|
LOG_D(PHY,"AbsSubframe %d: diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n",
|
||||||
subframe,
|
subframe,
|
||||||
ue->current_thread_id[subframe],
|
|
||||||
diff,
|
diff,
|
||||||
ue->rx_offset,
|
ue->rx_offset,
|
||||||
clear,
|
clear,
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "SCHED_NR_UE/defs.h"
|
#include "SCHED_NR_UE/defs.h"
|
||||||
#include "nr_estimation.h"
|
#include "nr_estimation.h"
|
||||||
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||||
|
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
|
||||||
#include "filt16a_32.h"
|
#include "filt16a_32.h"
|
||||||
|
|
||||||
//#define DEBUG_PDSCH
|
//#define DEBUG_PDSCH
|
||||||
@@ -31,6 +32,7 @@
|
|||||||
|
|
||||||
|
|
||||||
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t eNB_offset,
|
uint8_t eNB_offset,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
@@ -48,7 +50,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
|||||||
uint8_t nushift;
|
uint8_t nushift;
|
||||||
uint8_t ssb_index=current_ssb->i_ssb;
|
uint8_t ssb_index=current_ssb->i_ssb;
|
||||||
uint8_t n_hf=current_ssb->n_hf;
|
uint8_t n_hf=current_ssb->n_hf;
|
||||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF;
|
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||||
|
|
||||||
nushift = ue->frame_parms.Nid_cell%4;
|
nushift = ue->frame_parms.Nid_cell%4;
|
||||||
ue->frame_parms.nushift = nushift;
|
ue->frame_parms.nushift = nushift;
|
||||||
@@ -65,7 +67,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
|||||||
k = nushift;
|
k = nushift;
|
||||||
|
|
||||||
#ifdef DEBUG_CH
|
#ifdef DEBUG_CH
|
||||||
printf("PBCH DMRS Correlation : ThreadId %d, eNB_offset %d , OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ue->frame_parms.ofdm_symbol_size,
|
printf("PBCH DMRS Correlation : ThreadId %d, eNB_offset %d , OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ue->frame_parms.ofdm_symbol_size,
|
||||||
ue->frame_parms.Ncp,Ns,k, symbol);
|
ue->frame_parms.Ncp,Ns,k, symbol);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -192,6 +194,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
|
|
||||||
int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t eNB_offset,
|
uint8_t eNB_offset,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
@@ -211,7 +214,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
uint8_t nushift;
|
uint8_t nushift;
|
||||||
int **dl_ch_estimates =ue->pbch_vars[eNB_offset]->dl_ch_estimates;
|
int **dl_ch_estimates =ue->pbch_vars[eNB_offset]->dl_ch_estimates;
|
||||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF;
|
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||||
|
|
||||||
nushift = ue->frame_parms.Nid_cell%4;
|
nushift = ue->frame_parms.Nid_cell%4;
|
||||||
ue->frame_parms.nushift = nushift;
|
ue->frame_parms.nushift = nushift;
|
||||||
@@ -233,7 +236,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
k = nushift;
|
k = nushift;
|
||||||
|
|
||||||
#ifdef DEBUG_CH
|
#ifdef DEBUG_CH
|
||||||
printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
||||||
ue->frame_parms.Ncp,Ns,k, symbol);
|
ue->frame_parms.Ncp,Ns,k, symbol);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -447,17 +450,17 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
if( dmrss == 2) // update time statistics for last PBCH symbol
|
if( dmrss == 2) // update time statistics for last PBCH symbol
|
||||||
{
|
{
|
||||||
// do ifft of channel estimate
|
// do ifft of channel estimate
|
||||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++)
|
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++)
|
||||||
for (p=0; p<ue->frame_parms.nb_antenna_ports_gNB; p++) {
|
for (p=0; p<ue->frame_parms.nb_antenna_ports_gNB; p++) {
|
||||||
if (ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx])
|
if (ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx])
|
||||||
{
|
{
|
||||||
LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d ch_offset %d\n", Ns, ue->current_thread_id[Ns], symbol, ch_offset);
|
LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d ch_offset %d\n", Ns, proc->thread_id, symbol, ch_offset);
|
||||||
idft(idftsizeidx,
|
idft(idftsizeidx,
|
||||||
(int16_t*) &ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx][ch_offset],
|
(int16_t*) &ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx][ch_offset],
|
||||||
(int16_t*) ue->pbch_vars[eNB_offset]->dl_ch_estimates_time[(p<<1)+aarx],1);
|
(int16_t*) ue->pbch_vars[eNB_offset]->dl_ch_estimates_time[(p<<1)+aarx],1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//}
|
//}
|
||||||
@@ -467,6 +470,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t eNB_offset,
|
uint8_t eNB_offset,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
@@ -482,8 +486,8 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
|
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
|
||||||
|
|
||||||
int **dl_ch_estimates =ue->pdcch_vars[ue->current_thread_id[Ns]][eNB_offset]->dl_ch_estimates;
|
int **dl_ch_estimates =ue->pdcch_vars[proc->thread_id][eNB_offset]->dl_ch_estimates;
|
||||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF;
|
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||||
|
|
||||||
|
|
||||||
if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
|
if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
|
||||||
@@ -496,7 +500,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
k = coreset_start_subcarrier;
|
k = coreset_start_subcarrier;
|
||||||
|
|
||||||
#ifdef DEBUG_PDCCH
|
#ifdef DEBUG_PDCCH
|
||||||
printf("PDCCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
printf("PDCCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
||||||
ue->frame_parms.Ncp,Ns,k, symbol);
|
ue->frame_parms.Ncp,Ns,k, symbol);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -641,6 +645,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t eNB_offset,
|
uint8_t eNB_offset,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned short p,
|
unsigned short p,
|
||||||
@@ -653,18 +658,15 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
unsigned char aarx;
|
unsigned char aarx;
|
||||||
unsigned short k;
|
unsigned short k;
|
||||||
unsigned int pilot_cnt;
|
unsigned int pilot_cnt;
|
||||||
int16_t ch[2],*pil,*rxF,*dl_ch;
|
int16_t ch_l[2],ch_r[2],ch[2],*pil,*rxF,*dl_ch;
|
||||||
int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh;
|
int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh, *frl, *frr;
|
||||||
int ch_offset,symbol_offset;
|
int ch_offset,symbol_offset;
|
||||||
|
|
||||||
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
|
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
|
||||||
|
|
||||||
uint8_t nushift;
|
uint8_t nushift;
|
||||||
int **dl_ch_estimates =ue->pdsch_vars[ue->current_thread_id[Ns]][eNB_offset]->dl_ch_estimates;
|
int **dl_ch_estimates =ue->pdsch_vars[proc->thread_id][eNB_offset]->dl_ch_estimates;
|
||||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF;
|
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||||
|
|
||||||
nushift = (p>>1)&1;
|
|
||||||
ue->frame_parms.nushift = nushift;
|
|
||||||
|
|
||||||
if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
|
if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
|
||||||
ch_offset = ue->frame_parms.ofdm_symbol_size ;
|
ch_offset = ue->frame_parms.ofdm_symbol_size ;
|
||||||
@@ -677,55 +679,105 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
int re_offset = k;
|
int re_offset = k;
|
||||||
|
|
||||||
#ifdef DEBUG_CH
|
#ifdef DEBUG_CH
|
||||||
printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size,
|
printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size,
|
||||||
ue->frame_parms.Ncp,Ns,k, symbol);
|
ue->frame_parms.Ncp,Ns,k, symbol);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (nushift) {
|
// generate pilot for gNB port number 1000+p
|
||||||
case 0:
|
|
||||||
fl = filt8_l0;
|
|
||||||
fm = filt8_m0;
|
|
||||||
fr = filt8_r0;
|
|
||||||
fmm = filt8_mm0;
|
|
||||||
fml = filt8_m0;
|
|
||||||
fmr = filt8_mr0;
|
|
||||||
fdcl = filt8_dcl0;
|
|
||||||
fdcr = filt8_dcr0;
|
|
||||||
fdclh = filt8_dcl0_h;
|
|
||||||
fdcrh = filt8_dcr0_h;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
fl = filt8_l1;
|
|
||||||
fm = filt8_m1;
|
|
||||||
fr = filt8_r1;
|
|
||||||
fmm = filt8_mm1;
|
|
||||||
fml = filt8_ml1;
|
|
||||||
fmr = filt8_m1;
|
|
||||||
fdcl = filt8_dcl1;
|
|
||||||
fdcr = filt8_dcr1;
|
|
||||||
fdclh = filt8_dcl1_h;
|
|
||||||
fdcrh = filt8_dcr1_h;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
|
|
||||||
return(-1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// generate pilot
|
|
||||||
uint16_t rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12 - BWPStart;
|
uint16_t rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12 - BWPStart;
|
||||||
int config_type = 0; // needs to be updated from higher layer
|
uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
|
||||||
nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][0], &pilot[0],1000,0,nb_rb_pdsch+rb_offset);
|
int8_t delta = get_delta(p, config_type);
|
||||||
|
nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][0], &pilot[0],1000+p,0,nb_rb_pdsch+rb_offset);
|
||||||
|
|
||||||
|
if (config_type == pdsch_dmrs_type1){
|
||||||
|
nushift = (p>>1)&1;
|
||||||
|
ue->frame_parms.nushift = nushift;
|
||||||
|
switch (delta) {
|
||||||
|
|
||||||
|
case 0://port 0,1
|
||||||
|
fl = filt8_l0;//left interpolation Filter for DMRS config. 1
|
||||||
|
fm = filt8_m0;//left middle interpolation Filter
|
||||||
|
fr = filt8_r0;//right interpolation Filter
|
||||||
|
fmm = filt8_mm0;;//middle middle interpolation Filter
|
||||||
|
fml = filt8_m0;//left middle interpolation Filter
|
||||||
|
fmr = filt8_mr0;//middle right interpolation Filter
|
||||||
|
fdcl = filt8_dcl0;//left DC interpolation Filter (even RB)
|
||||||
|
fdcr = filt8_dcr0;//right DC interpolation Filter (even RB)
|
||||||
|
fdclh = filt8_dcl0_h;//left DC interpolation Filter (odd RB)
|
||||||
|
fdcrh = filt8_dcr0_h;//right DC interpolation Filter (odd RB)
|
||||||
|
frl = NULL;
|
||||||
|
frr = NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1://port2,3
|
||||||
|
fl = filt8_l1;
|
||||||
|
fm = filt8_m1;
|
||||||
|
fr = filt8_r1;
|
||||||
|
fmm = filt8_mm1;
|
||||||
|
fml = filt8_ml1;
|
||||||
|
fmr = filt8_m1;
|
||||||
|
fdcl = filt8_dcl1;
|
||||||
|
fdcr = filt8_dcr1;
|
||||||
|
fdclh = filt8_dcl1_h;
|
||||||
|
fdcrh = filt8_dcr1_h;
|
||||||
|
frl = NULL;
|
||||||
|
frr = NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {//pdsch_dmrs_type2
|
||||||
|
nushift = delta;
|
||||||
|
ue->frame_parms.nushift = nushift;
|
||||||
|
switch (delta) {
|
||||||
|
case 0://port 0,1
|
||||||
|
fl = filt8_l2;//left interpolation Filter should be fml
|
||||||
|
fr = filt8_r2;//right interpolation Filter should be fmr
|
||||||
|
fm = filt8_l2;
|
||||||
|
fmm = filt8_r2;
|
||||||
|
fml = filt8_ml2;
|
||||||
|
fmr = filt8_mr2;
|
||||||
|
frl = filt8_rl2;
|
||||||
|
frr = filt8_rm2;
|
||||||
|
fdcl = filt8_dcl1;
|
||||||
|
fdcr = filt8_dcr1;
|
||||||
|
fdclh = filt8_dcl1_h;
|
||||||
|
fdcrh = filt8_dcr1_h;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2://port2,3
|
||||||
|
fl = filt8_l3;
|
||||||
|
fm = filt8_m2;
|
||||||
|
fr = filt8_r3;
|
||||||
|
fmm = filt8_mm2;
|
||||||
|
fml = filt8_l2;
|
||||||
|
fmr = filt8_r2;
|
||||||
|
frl = filt8_rl3;
|
||||||
|
frr = filt8_rr3;
|
||||||
|
fdcl = NULL;
|
||||||
|
fdcr = NULL;
|
||||||
|
fdclh = NULL;
|
||||||
|
fdcrh = NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||||
|
pil = (int16_t *)&pilot[rb_offset*((config_type==pdsch_dmrs_type1) ? 6:4)];
|
||||||
pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)];
|
|
||||||
k = k % ue->frame_parms.ofdm_symbol_size;
|
k = k % ue->frame_parms.ofdm_symbol_size;
|
||||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];
|
re_offset = k;
|
||||||
dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+re_offset+nushift)];
|
||||||
|
dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
|
||||||
|
|
||||||
memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size));
|
memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size));
|
||||||
if (ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha
|
if (ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha
|
||||||
@@ -738,7 +790,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
printf("rxF addr %p p %d\n", rxF,p);
|
printf("rxF addr %p p %d\n", rxF,p);
|
||||||
printf("dl_ch addr %p nushift %d\n",dl_ch,nushift);
|
printf("dl_ch addr %p nushift %d\n",dl_ch,nushift);
|
||||||
#endif
|
#endif
|
||||||
//if ((ue->frame_parms.N_RB_DL&1)==0) {
|
|
||||||
|
if (config_type == pdsch_dmrs_type1) {
|
||||||
|
|
||||||
// Treat first 2 pilots specially (left edge)
|
// Treat first 2 pilots specially (left edge)
|
||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
@@ -868,7 +921,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
ch,
|
ch,
|
||||||
dl_ch,
|
dl_ch,
|
||||||
8);
|
8);
|
||||||
//}
|
|
||||||
|
|
||||||
// check if PRB crosses DC and improve estimates around DC
|
// check if PRB crosses DC and improve estimates around DC
|
||||||
if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) {
|
if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) {
|
||||||
@@ -876,7 +928,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
|
uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
|
||||||
uint16_t idxPil = idxDC/2;
|
uint16_t idxPil = idxDC/2;
|
||||||
re_offset = k;
|
re_offset = k;
|
||||||
pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)];
|
pil = (int16_t *)&pilot[rb_offset*((config_type==pdsch_dmrs_type1) ? 6:4)];
|
||||||
pil += (idxPil-2);
|
pil += (idxPil-2);
|
||||||
dl_ch += (idxDC-4);
|
dl_ch += (idxDC-4);
|
||||||
dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10);
|
dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10);
|
||||||
@@ -884,7 +936,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
// for proper allignment of SIMD vectors
|
// for proper allignment of SIMD vectors
|
||||||
if((ue->frame_parms.N_RB_DL&1)==0) {
|
if((ue->frame_parms.N_RB_DL&1)==0) {
|
||||||
|
|
||||||
@@ -921,11 +973,222 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
dl_ch,
|
dl_ch,
|
||||||
8);
|
8);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} else { //pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
|
||||||
|
|
||||||
|
// Treat first 4 pilots specially (left edge)
|
||||||
|
ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
#ifdef DEBUG_PDSCH
|
||||||
|
printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
|
||||||
|
printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch_l[0],ch_l[1],pil[0],pil[1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pil+=2;
|
||||||
|
re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
|
||||||
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
|
ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
ch[0] = (ch_l[0]+ch_r[0])>>1;
|
||||||
|
ch[1] = (ch_l[1]+ch_r[1])>>1;
|
||||||
|
|
||||||
|
dl_ch[(0+2*nushift)] = ch[0];
|
||||||
|
dl_ch[(1+2*nushift)] = ch[1];
|
||||||
|
dl_ch[2+2*nushift] = ch[0];
|
||||||
|
dl_ch[3+2*nushift] = ch[1];
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(fl,
|
||||||
|
ch,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
|
||||||
|
pil+=2;
|
||||||
|
re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
|
||||||
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
|
ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
pil+=2;
|
||||||
|
re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
|
||||||
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
|
ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
ch[0] = (ch_l[0]+ch_r[0])>>1;
|
||||||
|
ch[1] = (ch_l[1]+ch_r[1])>>1;
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(fr,
|
||||||
|
ch,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
|
||||||
|
dl_ch+=12;
|
||||||
|
dl_ch[0+2*nushift] = ch[0];
|
||||||
|
dl_ch[1+2*nushift] = ch[1];
|
||||||
|
dl_ch[2+2*nushift] = ch[0];
|
||||||
|
dl_ch[3+2*nushift] = ch[1];
|
||||||
|
dl_ch+=4;
|
||||||
|
|
||||||
|
for (pilot_cnt=4; pilot_cnt<4*nb_rb_pdsch; pilot_cnt+=4) {
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(fml,
|
||||||
|
ch,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
pil+=2;
|
||||||
|
re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
|
||||||
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
|
ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
#ifdef DEBUG_PDSCH
|
||||||
|
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch_l[0],ch_l[1],pil[0],pil[1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pil+=2;
|
||||||
|
re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
|
||||||
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
|
ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
ch[0] = (ch_l[0]+ch_r[0])>>1;
|
||||||
|
ch[1] = (ch_l[1]+ch_r[1])>>1;
|
||||||
|
|
||||||
|
#ifdef DEBUG_PDSCH
|
||||||
|
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch_r[0],ch_r[1],pil[0],pil[1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(fmr,
|
||||||
|
ch,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
|
||||||
|
dl_ch+=8;
|
||||||
|
dl_ch[0+2*nushift] = ch[0];
|
||||||
|
dl_ch[1+2*nushift] = ch[1];
|
||||||
|
dl_ch[2+2*nushift] = ch[0];
|
||||||
|
dl_ch[3+2*nushift] = ch[1];
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(fm,
|
||||||
|
ch,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
|
||||||
|
pil+=2;
|
||||||
|
re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
|
||||||
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
|
ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
pil+=2;
|
||||||
|
re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
|
||||||
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
|
ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
#ifdef DEBUG_PDSCH
|
||||||
|
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch_r[0],ch_r[1],pil[0],pil[1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ch[0] = (ch_l[0]+ch_r[0])>>1;
|
||||||
|
ch[1] = (ch_l[1]+ch_r[1])>>1;
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(fmm,
|
||||||
|
ch,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
|
||||||
|
dl_ch+=12;
|
||||||
|
dl_ch[0+2*nushift] = ch[0];
|
||||||
|
dl_ch[1+2*nushift] = ch[1];
|
||||||
|
dl_ch[2+2*nushift] = ch[0];
|
||||||
|
dl_ch[3+2*nushift] = ch[1];
|
||||||
|
dl_ch+=4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Treat last 2 pilots specially (right edge)
|
||||||
|
// dl_ch-2+nushift<<1
|
||||||
|
multadd_real_vector_complex_scalar(frl,
|
||||||
|
dl_ch-2+2*nushift,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(frr,
|
||||||
|
dl_ch-14+2*nushift,/*14*/
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
|
||||||
|
// check if PRB crosses DC and improve estimates around DC
|
||||||
|
if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size) && (p<2)) {
|
||||||
|
|
||||||
|
dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
|
||||||
|
uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
|
||||||
|
dl_ch += (idxDC-8);
|
||||||
|
dl_ch = memset(dl_ch, 0, sizeof(int16_t)*20);
|
||||||
|
|
||||||
|
dl_ch -= 2;
|
||||||
|
|
||||||
|
ch_r[0] = dl_ch[0];
|
||||||
|
ch_r[1]= dl_ch[1] ;
|
||||||
|
dl_ch += 22;
|
||||||
|
ch_l[0] = dl_ch[0];
|
||||||
|
ch_l[1]= dl_ch[1] ;
|
||||||
|
|
||||||
|
// for proper allignment of SIMD vectors
|
||||||
|
if((ue->frame_parms.N_RB_DL&1)==0) {
|
||||||
|
dl_ch -= 20;
|
||||||
|
//Interpolate fdcrl1 with ch_r
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dcrl1,
|
||||||
|
ch_r,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
//Interpolate fdclh1 with ch_l
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dclh1,
|
||||||
|
ch_l,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
dl_ch += 16;
|
||||||
|
//Interpolate fdcrh1 with ch_r
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dcrh1,
|
||||||
|
ch_r,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
//Interpolate fdcll1 with ch_l
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dcll1,
|
||||||
|
ch_l,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
} else {
|
||||||
|
dl_ch -= 28;
|
||||||
|
//Interpolate fdcrl1 with ch_r
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dcrl2,
|
||||||
|
ch_r,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
//Interpolate fdclh1 with ch_l
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dclh2,
|
||||||
|
ch_l,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
dl_ch += 16;
|
||||||
|
//Interpolate fdcrh1 with ch_r
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dcrh2,
|
||||||
|
ch_r,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
//Interpolate fdcll1 with ch_l
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dcll2,
|
||||||
|
ch_l,
|
||||||
|
dl_ch,
|
||||||
|
8);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_PDSCH
|
#ifdef DEBUG_PDSCH
|
||||||
dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
|
dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
|
||||||
for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pdsch*12/8); idxP++) {
|
for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pdsch*12/8); idxP++) {
|
||||||
for(uint8_t idxI=0; idxI<16; idxI+=2) {
|
for(uint8_t idxI=0; idxI<16; idxI+=2) {
|
||||||
printf("%d\t%d\t",dl_ch[idxP*16+idxI],dl_ch[idxP*16+idxI+1]);
|
printf("%d\t%d\t",dl_ch[idxP*16+idxI],dl_ch[idxP*16+idxI+1]);
|
||||||
@@ -934,7 +1197,5 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
\param symbol symbol within frame
|
\param symbol symbol within frame
|
||||||
*/
|
*/
|
||||||
int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t eNB_offset,
|
uint8_t eNB_offset,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
@@ -50,6 +51,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
unsigned short nb_rb_coreset);
|
unsigned short nb_rb_coreset);
|
||||||
|
|
||||||
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t eNB_offset,
|
uint8_t eNB_offset,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
@@ -57,6 +59,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
|||||||
NR_UE_SSB *current_ssb);
|
NR_UE_SSB *current_ssb);
|
||||||
|
|
||||||
int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t eNB_offset,
|
uint8_t eNB_offset,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
@@ -65,6 +68,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
|||||||
uint8_t n_hf);
|
uint8_t n_hf);
|
||||||
|
|
||||||
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t eNB_offset,
|
uint8_t eNB_offset,
|
||||||
unsigned char Ns,
|
unsigned char Ns,
|
||||||
unsigned short p,
|
unsigned short p,
|
||||||
@@ -82,6 +86,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
short coef);
|
short coef);
|
||||||
|
|
||||||
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
unsigned int subframe_offset,
|
unsigned int subframe_offset,
|
||||||
unsigned char N0_symbol,
|
unsigned char N0_symbol,
|
||||||
unsigned char abstraction_flag,
|
unsigned char abstraction_flag,
|
||||||
@@ -89,8 +94,9 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
uint8_t subframe);
|
uint8_t subframe);
|
||||||
|
|
||||||
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
||||||
uint8_t slot,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t abstraction_flag);
|
uint8_t slot,
|
||||||
|
uint8_t abstraction_flag);
|
||||||
|
|
||||||
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
|
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
|
||||||
uint32_t rx_power_fil_dB,
|
uint32_t rx_power_fil_dB,
|
||||||
|
|||||||
@@ -107,11 +107,12 @@ float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index)
|
|||||||
|
|
||||||
|
|
||||||
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
||||||
unsigned int subframe_offset,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
unsigned char N0_symbol,
|
unsigned int subframe_offset,
|
||||||
unsigned char abstraction_flag,
|
unsigned char N0_symbol,
|
||||||
unsigned char rank_adaptation,
|
unsigned char abstraction_flag,
|
||||||
uint8_t subframe)
|
unsigned char rank_adaptation,
|
||||||
|
uint8_t subframe)
|
||||||
{
|
{
|
||||||
int aarx,aatx,eNB_id=0; //,gain_offset=0;
|
int aarx,aatx,eNB_id=0; //,gain_offset=0;
|
||||||
//int rx_power[NUMBER_OF_CONNECTED_eNB_MAX];
|
//int rx_power[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
@@ -131,7 +132,7 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
|
ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
|
||||||
|
|
||||||
/*int16_t *dl_ch;
|
/*int16_t *dl_ch;
|
||||||
dl_ch = (int16_t *)&ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_estimates[eNB_id][ch_offset];*/
|
dl_ch = (int16_t *)&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[eNB_id][ch_offset];*/
|
||||||
|
|
||||||
ch_offset = ue->frame_parms.ofdm_symbol_size*2;
|
ch_offset = ue->frame_parms.ofdm_symbol_size*2;
|
||||||
|
|
||||||
@@ -142,7 +143,7 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_gNB; aatx++) {
|
for (aatx=0; aatx<frame_parms->nb_antenna_ports_gNB; aatx++) {
|
||||||
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
|
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
|
||||||
(signal_energy_nodc(&ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_estimates[eNB_id][ch_offset],
|
(signal_energy_nodc(&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[eNB_id][ch_offset],
|
||||||
(50*12)));
|
(50*12)));
|
||||||
//- ue->measurements.n0_power[aarx];
|
//- ue->measurements.n0_power[aarx];
|
||||||
|
|
||||||
@@ -224,6 +225,7 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t slot,
|
uint8_t slot,
|
||||||
uint8_t abstraction_flag)
|
uint8_t abstraction_flag)
|
||||||
{
|
{
|
||||||
@@ -234,7 +236,7 @@ void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
uint8_t eNB_offset=0,l,nushift;
|
uint8_t eNB_offset=0,l,nushift;
|
||||||
uint16_t off,nb_rb;
|
uint16_t off,nb_rb;
|
||||||
// NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
// NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[slot]].rxdataF;
|
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||||
|
|
||||||
nushift = ue->frame_parms.Nid_cell%4;
|
nushift = ue->frame_parms.Nid_cell%4;
|
||||||
ue->frame_parms.nushift = nushift;
|
ue->frame_parms.nushift = nushift;
|
||||||
|
|||||||
@@ -667,12 +667,13 @@ void pdcch_siso(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
#ifdef NR_PDCCH_DCI_RUN
|
#ifdef NR_PDCCH_DCI_RUN
|
||||||
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||||
uint32_t frame,
|
UE_nr_rxtx_proc_t *proc) {
|
||||||
uint32_t slot) {
|
|
||||||
|
|
||||||
|
uint32_t frame = proc->frame_rx;
|
||||||
|
uint32_t slot = proc->nr_slot_rx;
|
||||||
NR_UE_COMMON *common_vars = &ue->common_vars;
|
NR_UE_COMMON *common_vars = &ue->common_vars;
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||||
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[ue->current_thread_id[slot]][0];
|
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
|
||||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
|
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
|
||||||
|
|
||||||
uint8_t log2_maxh, aarx;
|
uint8_t log2_maxh, aarx;
|
||||||
@@ -689,7 +690,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
|||||||
for (int s=rel15->coreset.StartSymbolIndex; s<(rel15->coreset.StartSymbolIndex+rel15->coreset.duration); s++) {
|
for (int s=rel15->coreset.StartSymbolIndex; s<(rel15->coreset.StartSymbolIndex+rel15->coreset.duration); s++) {
|
||||||
LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
|
LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
|
||||||
|
|
||||||
nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[slot]].rxdataF,
|
nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
|
||||||
pdcch_vars->dl_ch_estimates,
|
pdcch_vars->dl_ch_estimates,
|
||||||
pdcch_vars->rxdataF_ext,
|
pdcch_vars->rxdataF_ext,
|
||||||
pdcch_vars->dl_ch_estimates_ext,
|
pdcch_vars->dl_ch_estimates_ext,
|
||||||
@@ -781,8 +782,9 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
|
#if 0
|
||||||
uint8_t nr_tti_rx,
|
void nr_pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
uint8_t nr_slot_rx,
|
||||||
uint8_t *e,
|
uint8_t *e,
|
||||||
uint32_t length) {
|
uint32_t length) {
|
||||||
int i;
|
int i;
|
||||||
@@ -790,7 +792,7 @@ void pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
uint32_t x1, x2, s=0;
|
uint32_t x1, x2, s=0;
|
||||||
reset = 1;
|
reset = 1;
|
||||||
// x1 is set in lte_gold_generic
|
// x1 is set in lte_gold_generic
|
||||||
x2 = (nr_tti_rx<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2
|
x2 = (nr_slot_rx<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2
|
||||||
|
|
||||||
for (i=0; i<length; i++) {
|
for (i=0; i<length; i++) {
|
||||||
if ((i&0x1f)==0) {
|
if ((i&0x1f)==0) {
|
||||||
@@ -804,6 +806,7 @@ void pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
e[i] = (e[i]&1) ^ ((s>>(i&0x1f))&1);
|
e[i] = (e[i]&1) ^ ((s>>(i&0x1f))&1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef NR_PDCCH_DCI_RUN
|
#ifdef NR_PDCCH_DCI_RUN
|
||||||
@@ -841,11 +844,10 @@ void nr_pdcch_unscrambling(int16_t *z,
|
|||||||
|
|
||||||
#ifdef NR_PDCCH_DCI_RUN
|
#ifdef NR_PDCCH_DCI_RUN
|
||||||
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
||||||
int frame,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
int slot,
|
fapi_nr_dci_indication_t *dci_ind) {
|
||||||
fapi_nr_dci_indication_t *dci_ind) {
|
|
||||||
|
|
||||||
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[ue->current_thread_id[slot]][0];
|
NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
|
||||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
|
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
|
||||||
for (int i=0;i<pdcch_vars->nb_search_space;i++) {
|
for (int i=0;i<pdcch_vars->nb_search_space;i++) {
|
||||||
|
|
||||||
@@ -886,8 +888,8 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
if (crc == n_rnti) {
|
if (crc == n_rnti) {
|
||||||
LOG_D(PHY,"Decoded crc %x matches rnti %x for DCI format %d\n", crc, n_rnti, rel15->dci_format_options[k]);
|
LOG_D(PHY,"Decoded crc %x matches rnti %x for DCI format %d\n", crc, n_rnti, rel15->dci_format_options[k]);
|
||||||
dci_ind->SFN = frame;
|
dci_ind->SFN = proc->frame_rx;
|
||||||
dci_ind->slot = slot;
|
dci_ind->slot = proc->nr_slot_rx;
|
||||||
dci_ind->dci_list[dci_ind->number_of_dcis].rnti = n_rnti;
|
dci_ind->dci_list[dci_ind->number_of_dcis].rnti = n_rnti;
|
||||||
dci_ind->dci_list[dci_ind->number_of_dcis].n_CCE = CCEind;
|
dci_ind->dci_list[dci_ind->number_of_dcis].n_CCE = CCEind;
|
||||||
dci_ind->dci_list[dci_ind->number_of_dcis].dci_format = rel15->dci_format_options[k];
|
dci_ind->dci_list[dci_ind->number_of_dcis].dci_format = rel15->dci_format_options[k];
|
||||||
@@ -918,7 +920,7 @@ void nr_dci_decoding_procedure0(int s,
|
|||||||
uint16_t coreset_nbr_rb,
|
uint16_t coreset_nbr_rb,
|
||||||
NR_UE_PDCCH **pdcch_vars,
|
NR_UE_PDCCH **pdcch_vars,
|
||||||
int do_common,
|
int do_common,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_slot_rx,
|
||||||
NR_DCI_ALLOC_t *dci_alloc,
|
NR_DCI_ALLOC_t *dci_alloc,
|
||||||
int16_t eNB_id,
|
int16_t eNB_id,
|
||||||
uint8_t current_thread_id,
|
uint8_t current_thread_id,
|
||||||
@@ -953,7 +955,7 @@ void nr_dci_decoding_procedure0(int s,
|
|||||||
LOG_DDD("format_found is %d \n", *format_found);
|
LOG_DDD("format_found is %d \n", *format_found);
|
||||||
//if (mode == NO_DCI) {
|
//if (mode == NO_DCI) {
|
||||||
// #ifdef NR_PDCCH_DCI_DEBUG
|
// #ifdef NR_PDCCH_DCI_DEBUG
|
||||||
// LOG_DDD("skip DCI decoding: expect no DCIs at nr_tti_rx %d in current searchSpace\n", nr_tti_rx);
|
// LOG_DDD("skip DCI decoding: expect no DCIs at nr_slot_rx %d in current searchSpace\n", nr_slot_rx);
|
||||||
// #endif
|
// #endif
|
||||||
// return;
|
// return;
|
||||||
//}
|
//}
|
||||||
@@ -987,8 +989,8 @@ void nr_dci_decoding_procedure0(int s,
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
// if (mode == NO_DCI) {
|
// if (mode == NO_DCI) {
|
||||||
// LOG_D(PHY, "skip DCI decoding: expect no DCIs at nr_tti_rx %d\n",
|
// LOG_D(PHY, "skip DCI decoding: expect no DCIs at nr_slot_rx %d\n",
|
||||||
// nr_tti_rx);
|
// nr_slot_rx);
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@@ -1059,7 +1061,7 @@ void nr_dci_decoding_procedure0(int s,
|
|||||||
// compute Yk
|
// compute Yk
|
||||||
Yk = (unsigned int) pdcch_vars[eNB_id]->crnti;
|
Yk = (unsigned int) pdcch_vars[eNB_id]->crnti;
|
||||||
|
|
||||||
for (i = 0; i <= nr_tti_rx; i++)
|
for (i = 0; i <= nr_slot_rx; i++)
|
||||||
Yk = (Yk * A[p%3]) % 65537;
|
Yk = (Yk * A[p%3]) % 65537;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1328,7 +1330,7 @@ void nr_dci_decoding_procedure0(int s,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// store first nCCE of group for PUCCH transmission of ACK/NAK
|
// store first nCCE of group for PUCCH transmission of ACK/NAK
|
||||||
pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
|
pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
|
||||||
|
|
||||||
// if (crc == si_rnti) {
|
// if (crc == si_rnti) {
|
||||||
// dci_alloc[*dci_cnt].format = format_si;
|
// dci_alloc[*dci_cnt].format = format_si;
|
||||||
@@ -1339,7 +1341,7 @@ void nr_dci_decoding_procedure0(int s,
|
|||||||
// } else if (crc == ra_rnti) {
|
// } else if (crc == ra_rnti) {
|
||||||
// dci_alloc[*dci_cnt].format = format_ra;
|
// dci_alloc[*dci_cnt].format = format_ra;
|
||||||
// // store first nCCE of group for PUCCH transmission of ACK/NAK
|
// // store first nCCE of group for PUCCH transmission of ACK/NAK
|
||||||
// pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
|
// pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
|
||||||
// *dci_cnt = *dci_cnt + 1;
|
// *dci_cnt = *dci_cnt + 1;
|
||||||
// } else if (crc == pdcch_vars[eNB_id]->crnti) {
|
// } else if (crc == pdcch_vars[eNB_id]->crnti) {
|
||||||
|
|
||||||
@@ -1350,23 +1352,23 @@ void nr_dci_decoding_procedure0(int s,
|
|||||||
// dci_alloc[*dci_cnt].format = format0;
|
// dci_alloc[*dci_cnt].format = format0;
|
||||||
// *format0_found = 1;
|
// *format0_found = 1;
|
||||||
// *dci_cnt = *dci_cnt + 1;
|
// *dci_cnt = *dci_cnt + 1;
|
||||||
// pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
|
// pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
|
||||||
// }
|
// }
|
||||||
// } else if (format_c == format0) { // this is a format 1A DCI
|
// } else if (format_c == format0) { // this is a format 1A DCI
|
||||||
// dci_alloc[*dci_cnt].format = format1A;
|
// dci_alloc[*dci_cnt].format = format1A;
|
||||||
// *dci_cnt = *dci_cnt + 1;
|
// *dci_cnt = *dci_cnt + 1;
|
||||||
// pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
|
// pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
|
||||||
// } else {
|
// } else {
|
||||||
// // store first nCCE of group for PUCCH transmission of ACK/NAK
|
// // store first nCCE of group for PUCCH transmission of ACK/NAK
|
||||||
// if (*format_c_found == 0) {
|
// if (*format_c_found == 0) {
|
||||||
// dci_alloc[*dci_cnt].format = format_c;
|
// dci_alloc[*dci_cnt].format = format_c;
|
||||||
// *dci_cnt = *dci_cnt + 1;
|
// *dci_cnt = *dci_cnt + 1;
|
||||||
// *format_c_found = 1;
|
// *format_c_found = 1;
|
||||||
// pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
|
// pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//LOG_I(PHY,"DCI decoding CRNTI [format: %d, nCCE[nr_tti_rx: %d]: %d ], AggregationLevel %d \n",format_c, nr_tti_rx, pdcch_vars[eNB_id]->nCCE[nr_tti_rx],L2);
|
//LOG_I(PHY,"DCI decoding CRNTI [format: %d, nCCE[nr_slot_rx: %d]: %d ], AggregationLevel %d \n",format_c, nr_slot_rx, pdcch_vars[eNB_id]->nCCE[nr_slot_rx],L2);
|
||||||
// memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_decoded_output,sizeof_bytes);
|
// memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_decoded_output,sizeof_bytes);
|
||||||
switch (1 << L) {
|
switch (1 << L) {
|
||||||
case 1:
|
case 1:
|
||||||
@@ -1433,7 +1435,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
NR_DCI_ALLOC_t *dci_alloc,
|
NR_DCI_ALLOC_t *dci_alloc,
|
||||||
NR_SEARCHSPACE_TYPE_t searchSpacetype,
|
NR_SEARCHSPACE_TYPE_t searchSpacetype,
|
||||||
int16_t eNB_id,
|
int16_t eNB_id,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_slot_rx,
|
||||||
uint8_t dci_fields_sizes_cnt[MAX_NR_DCI_DECODED_SLOT][NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
|
uint8_t dci_fields_sizes_cnt[MAX_NR_DCI_DECODED_SLOT][NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
|
||||||
uint16_t n_RB_ULBWP,
|
uint16_t n_RB_ULBWP,
|
||||||
uint16_t n_RB_DLBWP,
|
uint16_t n_RB_DLBWP,
|
||||||
@@ -1441,16 +1443,16 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
format_found_t *format_found,
|
format_found_t *format_found,
|
||||||
uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES]) {
|
uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES]) {
|
||||||
// uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
|
// uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
|
||||||
LOG_DD("(nr_dci_decoding_procedure) nr_tti_rx=%d n_RB_ULBWP=%d n_RB_DLBWP=%d format_found=%d\n",
|
LOG_DD("(nr_dci_decoding_procedure) nr_slot_rx=%d n_RB_ULBWP=%d n_RB_DLBWP=%d format_found=%d\n",
|
||||||
nr_tti_rx,n_RB_ULBWP,n_RB_DLBWP,*format_found);
|
nr_slot_rx,n_RB_ULBWP,n_RB_DLBWP,*format_found);
|
||||||
int do_common = (int)searchSpacetype;
|
int do_common = (int)searchSpacetype;
|
||||||
uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS];
|
uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS];
|
||||||
crc_scrambled_t crc_scrambled_ = *crc_scrambled;
|
crc_scrambled_t crc_scrambled_ = *crc_scrambled;
|
||||||
format_found_t format_found_ = *format_found;
|
format_found_t format_found_ = *format_found;
|
||||||
uint8_t dci_cnt = 0, old_dci_cnt = 0;
|
uint8_t dci_cnt = 0, old_dci_cnt = 0;
|
||||||
uint32_t CCEmap0 = 0, CCEmap1 = 0, CCEmap2 = 0;
|
uint32_t CCEmap0 = 0, CCEmap1 = 0, CCEmap2 = 0;
|
||||||
NR_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]];
|
NR_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_slot_rx]];
|
||||||
NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id];
|
NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_slot_rx]][eNB_id];
|
||||||
uint16_t pdcch_DMRS_scrambling_id = pdcch_vars2->coreset[p].pdcchDMRSScramblingID;
|
uint16_t pdcch_DMRS_scrambling_id = pdcch_vars2->coreset[p].pdcchDMRSScramblingID;
|
||||||
uint64_t coreset_freq_dom = pdcch_vars2->coreset[p].frequencyDomainResources;
|
uint64_t coreset_freq_dom = pdcch_vars2->coreset[p].frequencyDomainResources;
|
||||||
int coreset_time_dur = pdcch_vars2->coreset[p].duration;
|
int coreset_time_dur = pdcch_vars2->coreset[p].duration;
|
||||||
@@ -1464,7 +1466,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
coreset_nbr_rb = 6 * coreset_nbr_rb;
|
coreset_nbr_rb = 6 * coreset_nbr_rb;
|
||||||
// coreset_time_dur,coreset_nbr_rb,
|
// coreset_time_dur,coreset_nbr_rb,
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||||
//uint8_t mi;// = get_mi(&ue->frame_parms, nr_tti_rx);
|
//uint8_t mi;// = get_mi(&ue->frame_parms, nr_slot_rx);
|
||||||
//uint8_t tmode = ue->transmission_mode[eNB_id];
|
//uint8_t tmode = ue->transmission_mode[eNB_id];
|
||||||
//uint8_t frame_type = frame_parms->frame_type;
|
//uint8_t frame_type = frame_parms->frame_type;
|
||||||
uint8_t format_0_0_1_0_size_bits = 0, format_0_0_1_0_size_bytes = 0; //FIXME
|
uint8_t format_0_0_1_0_size_bits = 0, format_0_0_1_0_size_bytes = 0; //FIXME
|
||||||
@@ -1499,7 +1501,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
* Possible overlap between RE for SS/PBCH blocks (described in section 10, 38.213) has not been implemented yet
|
* Possible overlap between RE for SS/PBCH blocks (described in section 10, 38.213) has not been implemented yet
|
||||||
* This can be implemented by setting variable 'mode = NO_DCI' when overlap occurs
|
* This can be implemented by setting variable 'mode = NO_DCI' when overlap occurs
|
||||||
*/
|
*/
|
||||||
//dci_detect_mode_t mode = 3; //dci_detect_mode_select(&ue->frame_parms, nr_tti_rx);
|
//dci_detect_mode_t mode = 3; //dci_detect_mode_select(&ue->frame_parms, nr_slot_rx);
|
||||||
LOG_DD("searSpaceType=%d\n",do_common);
|
LOG_DD("searSpaceType=%d\n",do_common);
|
||||||
LOG_DD("%s_dci_format=%d\n",do_common?"uss":"css",css_dci_format);
|
LOG_DD("%s_dci_format=%d\n",do_common?"uss":"css",css_dci_format);
|
||||||
|
|
||||||
@@ -1529,7 +1531,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
// blind decoding (Type0-PDCCH,Type0A-PDCCH,Type1-PDCCH,Type2-PDCCH)
|
// blind decoding (Type0-PDCCH,Type0A-PDCCH,Type1-PDCCH,Type2-PDCCH)
|
||||||
// for format0_0 => we are NOT implementing format0_0 for common search spaces. FIXME!
|
// for format0_0 => we are NOT implementing format0_0 for common search spaces. FIXME!
|
||||||
// for format0_0 and format1_0, first we calculate dci pdu size
|
// for format0_0 and format1_0, first we calculate dci pdu size
|
||||||
format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
|
format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
|
||||||
format_0_0_1_0_size_bytes = (format_0_0_1_0_size_bits%8 == 0) ? (uint8_t)floor(format_0_0_1_0_size_bits/8) : (uint8_t)(floor(format_0_0_1_0_size_bits/8) + 1);
|
format_0_0_1_0_size_bytes = (format_0_0_1_0_size_bits%8 == 0) ? (uint8_t)floor(format_0_0_1_0_size_bits/8) : (uint8_t)(floor(format_0_0_1_0_size_bits/8) + 1);
|
||||||
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
|
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
|
||||||
css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);
|
css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);
|
||||||
@@ -1540,7 +1542,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
|
LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
|
||||||
css_dci_format,(1<<aggregationLevel));
|
css_dci_format,(1<<aggregationLevel));
|
||||||
old_dci_cnt = dci_cnt;
|
old_dci_cnt = dci_cnt;
|
||||||
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_tti_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_tti_rx], frame_parms,
|
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
|
||||||
crc_scrambled_values, aggregationLevel,
|
crc_scrambled_values, aggregationLevel,
|
||||||
cformat0_0_and_1_0, uformat0_0_and_1_0,
|
cformat0_0_and_1_0, uformat0_0_and_1_0,
|
||||||
format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
|
format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
|
||||||
@@ -1549,7 +1551,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
if (dci_cnt != old_dci_cnt) {
|
if (dci_cnt != old_dci_cnt) {
|
||||||
// we will exit the loop as we have found the DCI
|
// we will exit the loop as we have found the DCI
|
||||||
aggregationLevel = 5;
|
aggregationLevel = 5;
|
||||||
format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,crc_scrambled_,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,
|
format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,crc_scrambled_,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,
|
||||||
0); // after decoding dci successfully we recalculate dci pdu size with correct crc scrambled to get the right field sizes
|
0); // after decoding dci successfully we recalculate dci pdu size with correct crc scrambled to get the right field sizes
|
||||||
old_dci_cnt = dci_cnt;
|
old_dci_cnt = dci_cnt;
|
||||||
|
|
||||||
@@ -1564,7 +1566,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
// or TPC-PUSCH-RNTI, or TPC-PUCCH-RNTI, or TPC-SRS-RNTI, or C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
|
// or TPC-PUSCH-RNTI, or TPC-PUCCH-RNTI, or TPC-SRS-RNTI, or C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
|
||||||
if (css_dci_format == cformat2_0) {
|
if (css_dci_format == cformat2_0) {
|
||||||
// for format2_0, first we calculate dci pdu size
|
// for format2_0, first we calculate dci pdu size
|
||||||
format_2_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_sfi_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,4);
|
format_2_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_sfi_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,4);
|
||||||
format_2_0_size_bytes = (format_2_0_size_bits%8 == 0) ? (uint8_t)floor(format_2_0_size_bits/8) : (uint8_t)(floor(format_2_0_size_bits/8) + 1);
|
format_2_0_size_bytes = (format_2_0_size_bits%8 == 0) ? (uint8_t)floor(format_2_0_size_bits/8) : (uint8_t)(floor(format_2_0_size_bits/8) + 1);
|
||||||
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_0_size_bits=%d, format2_0_size_bytes=%d\n",
|
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_0_size_bits=%d, format2_0_size_bytes=%d\n",
|
||||||
css_dci_format,format_2_0_size_bits,format_2_0_size_bytes);
|
css_dci_format,format_2_0_size_bits,format_2_0_size_bytes);
|
||||||
@@ -1574,7 +1576,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
css_dci_format,(1<<aggregationLevelSFI));
|
css_dci_format,(1<<aggregationLevelSFI));
|
||||||
// for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
|
// for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
|
||||||
old_dci_cnt = dci_cnt;
|
old_dci_cnt = dci_cnt;
|
||||||
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_tti_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_tti_rx], frame_parms,
|
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
|
||||||
crc_scrambled_values, aggregationLevelSFI,
|
crc_scrambled_values, aggregationLevelSFI,
|
||||||
cformat2_0, uformat0_0_and_1_0,
|
cformat2_0, uformat0_0_and_1_0,
|
||||||
format_2_0_size_bits, format_2_0_size_bytes, &dci_cnt,
|
format_2_0_size_bits, format_2_0_size_bytes, &dci_cnt,
|
||||||
@@ -1594,7 +1596,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
|
|
||||||
if (css_dci_format == cformat2_1) {
|
if (css_dci_format == cformat2_1) {
|
||||||
// for format2_1, first we calculate dci pdu size
|
// for format2_1, first we calculate dci pdu size
|
||||||
format_2_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_int_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,5);
|
format_2_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_int_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,5);
|
||||||
format_2_1_size_bytes = (format_2_1_size_bits%8 == 0) ? (uint8_t)floor(format_2_1_size_bits/8) : (uint8_t)(floor(format_2_1_size_bits/8) + 1);
|
format_2_1_size_bytes = (format_2_1_size_bits%8 == 0) ? (uint8_t)floor(format_2_1_size_bits/8) : (uint8_t)(floor(format_2_1_size_bits/8) + 1);
|
||||||
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_1_size_bits=%d, format2_1_size_bytes=%d\n",
|
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_1_size_bits=%d, format2_1_size_bytes=%d\n",
|
||||||
css_dci_format,format_2_1_size_bits,format_2_1_size_bytes);
|
css_dci_format,format_2_1_size_bits,format_2_1_size_bytes);
|
||||||
@@ -1604,7 +1606,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
css_dci_format,(1<<aggregationLevel));
|
css_dci_format,(1<<aggregationLevel));
|
||||||
// for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
|
// for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
|
||||||
old_dci_cnt = dci_cnt;
|
old_dci_cnt = dci_cnt;
|
||||||
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_tti_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_tti_rx], frame_parms,
|
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
|
||||||
crc_scrambled_values, aggregationLevel,
|
crc_scrambled_values, aggregationLevel,
|
||||||
cformat2_1, uformat0_0_and_1_0,
|
cformat2_1, uformat0_0_and_1_0,
|
||||||
format_2_1_size_bits, format_2_1_size_bytes, &dci_cnt,
|
format_2_1_size_bits, format_2_1_size_bytes, &dci_cnt,
|
||||||
@@ -1624,7 +1626,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
|
|
||||||
if (css_dci_format == cformat2_2) {
|
if (css_dci_format == cformat2_2) {
|
||||||
// for format2_2, first we calculate dci pdu size
|
// for format2_2, first we calculate dci pdu size
|
||||||
format_2_2_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_tpc_pucch_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,6);
|
format_2_2_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_tpc_pucch_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,6);
|
||||||
format_2_2_size_bytes = (format_2_2_size_bits%8 == 0) ? (uint8_t)floor(format_2_2_size_bits/8) : (uint8_t)(floor(format_2_2_size_bits/8) + 1);
|
format_2_2_size_bytes = (format_2_2_size_bits%8 == 0) ? (uint8_t)floor(format_2_2_size_bits/8) : (uint8_t)(floor(format_2_2_size_bits/8) + 1);
|
||||||
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_2_size_bits=%d, format2_2_size_bytes=%d\n",
|
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_2_size_bits=%d, format2_2_size_bytes=%d\n",
|
||||||
css_dci_format,format_2_2_size_bits,format_2_2_size_bytes);
|
css_dci_format,format_2_2_size_bits,format_2_2_size_bytes);
|
||||||
@@ -1634,7 +1636,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
css_dci_format,(1<<aggregationLevel));
|
css_dci_format,(1<<aggregationLevel));
|
||||||
// for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
|
// for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
|
||||||
old_dci_cnt = dci_cnt;
|
old_dci_cnt = dci_cnt;
|
||||||
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_tti_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_tti_rx], frame_parms,
|
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
|
||||||
crc_scrambled_values, aggregationLevel,
|
crc_scrambled_values, aggregationLevel,
|
||||||
cformat2_2, uformat0_0_and_1_0,
|
cformat2_2, uformat0_0_and_1_0,
|
||||||
format_2_2_size_bits, format_2_2_size_bytes, &dci_cnt,
|
format_2_2_size_bits, format_2_2_size_bytes, &dci_cnt,
|
||||||
@@ -1654,7 +1656,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
|
|
||||||
if (css_dci_format == cformat2_3) {
|
if (css_dci_format == cformat2_3) {
|
||||||
// for format2_1, first we calculate dci pdu size
|
// for format2_1, first we calculate dci pdu size
|
||||||
format_2_3_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_tpc_srs_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,7);
|
format_2_3_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_tpc_srs_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,7);
|
||||||
format_2_3_size_bytes = (format_2_3_size_bits%8 == 0) ? (uint8_t)floor(format_2_3_size_bits/8) : (uint8_t)(floor(format_2_3_size_bits/8) + 1);
|
format_2_3_size_bytes = (format_2_3_size_bits%8 == 0) ? (uint8_t)floor(format_2_3_size_bits/8) : (uint8_t)(floor(format_2_3_size_bits/8) + 1);
|
||||||
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_3_size_bits=%d, format2_3_size_bytes=%d\n",
|
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_3_size_bits=%d, format2_3_size_bytes=%d\n",
|
||||||
css_dci_format,format_2_3_size_bits,format_2_3_size_bytes);
|
css_dci_format,format_2_3_size_bits,format_2_3_size_bytes);
|
||||||
@@ -1664,7 +1666,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
css_dci_format,(1<<aggregationLevel));
|
css_dci_format,(1<<aggregationLevel));
|
||||||
// for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
|
// for aggregation level 'aggregationLevelSFI'. The number of candidates (nrofCandidates-SFI) will be calculated in function nr_dci_decoding_procedure0
|
||||||
old_dci_cnt = dci_cnt;
|
old_dci_cnt = dci_cnt;
|
||||||
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_tti_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_tti_rx], frame_parms,
|
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
|
||||||
crc_scrambled_values, aggregationLevel,
|
crc_scrambled_values, aggregationLevel,
|
||||||
cformat2_3, uformat0_0_and_1_0,
|
cformat2_3, uformat0_0_and_1_0,
|
||||||
format_2_3_size_bits, format_2_3_size_bytes, &dci_cnt,
|
format_2_3_size_bits, format_2_3_size_bytes, &dci_cnt,
|
||||||
@@ -1685,7 +1687,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
// UE-specific search space for a DCI format with CRC scrambled by C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
|
// UE-specific search space for a DCI format with CRC scrambled by C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
|
||||||
if (uss_dci_format == uformat0_0_and_1_0) {
|
if (uss_dci_format == uformat0_0_and_1_0) {
|
||||||
// for format0_0 and format1_0, first we calculate dci pdu size
|
// for format0_0 and format1_0, first we calculate dci pdu size
|
||||||
format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
|
format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
|
||||||
format_0_0_1_0_size_bytes = (format_0_0_1_0_size_bits%8 == 0) ? (uint8_t)floor(format_0_0_1_0_size_bits/8) : (uint8_t)(floor(format_0_0_1_0_size_bits/8) + 1);
|
format_0_0_1_0_size_bytes = (format_0_0_1_0_size_bits%8 == 0) ? (uint8_t)floor(format_0_0_1_0_size_bits/8) : (uint8_t)(floor(format_0_0_1_0_size_bits/8) + 1);
|
||||||
LOG_DD("calculating dci format size for UE-specific searchSpaces with format uss_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
|
LOG_DD("calculating dci format size for UE-specific searchSpaces with format uss_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
|
||||||
css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);
|
css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);
|
||||||
@@ -1696,7 +1698,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
|
LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
|
||||||
css_dci_format,(1<<aggregationLevel));
|
css_dci_format,(1<<aggregationLevel));
|
||||||
old_dci_cnt = dci_cnt;
|
old_dci_cnt = dci_cnt;
|
||||||
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 0, nr_tti_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_tti_rx], frame_parms,
|
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 0, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
|
||||||
crc_scrambled_values, aggregationLevel,
|
crc_scrambled_values, aggregationLevel,
|
||||||
cformat0_0_and_1_0, uformat0_0_and_1_0,
|
cformat0_0_and_1_0, uformat0_0_and_1_0,
|
||||||
format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
|
format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
|
||||||
@@ -1716,7 +1718,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
|
|
||||||
if (uss_dci_format == uformat0_1_and_1_1) {
|
if (uss_dci_format == uformat0_1_and_1_1) {
|
||||||
// for format0_0 and format1_0, first we calculate dci pdu size
|
// for format0_0 and format1_0, first we calculate dci pdu size
|
||||||
format_0_1_1_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,1);
|
format_0_1_1_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,1);
|
||||||
format_0_1_1_1_size_bytes = (format_0_1_1_1_size_bits%8 == 0) ? (uint8_t)floor(format_0_1_1_1_size_bits/8) : (uint8_t)(floor(format_0_1_1_1_size_bits/8) + 1);
|
format_0_1_1_1_size_bytes = (format_0_1_1_1_size_bits%8 == 0) ? (uint8_t)floor(format_0_1_1_1_size_bits/8) : (uint8_t)(floor(format_0_1_1_1_size_bits/8) + 1);
|
||||||
LOG_DD("calculating dci format size for UE-specific searchSpaces with format uss_dci_format=%d, format_0_1_1_1_size_bits=%d, format_0_1_1_1_size_bytes=%d\n",
|
LOG_DD("calculating dci format size for UE-specific searchSpaces with format uss_dci_format=%d, format_0_1_1_1_size_bits=%d, format_0_1_1_1_size_bytes=%d\n",
|
||||||
css_dci_format,format_0_1_1_1_size_bits,format_0_1_1_1_size_bytes);
|
css_dci_format,format_0_1_1_1_size_bits,format_0_1_1_1_size_bytes);
|
||||||
@@ -1727,7 +1729,7 @@ uint8_t nr_dci_decoding_procedure(int s,
|
|||||||
LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
|
LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
|
||||||
css_dci_format,(1<<aggregationLevel));
|
css_dci_format,(1<<aggregationLevel));
|
||||||
old_dci_cnt = dci_cnt;
|
old_dci_cnt = dci_cnt;
|
||||||
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 0, nr_tti_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_tti_rx], frame_parms,
|
nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 0, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
|
||||||
crc_scrambled_values, aggregationLevel,
|
crc_scrambled_values, aggregationLevel,
|
||||||
cformat0_0_and_1_0, uformat0_1_and_1_1,
|
cformat0_0_and_1_0, uformat0_1_and_1_1,
|
||||||
format_0_1_1_1_size_bits, format_0_1_1_1_size_bytes, &dci_cnt,
|
format_0_1_1_1_size_bits, format_0_1_1_1_size_bytes, &dci_cnt,
|
||||||
|
|||||||
@@ -218,16 +218,18 @@ void nr_dlsch_unscrambling(int16_t* llr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||||
short *dlsch_llr,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
int eNB_id,
|
||||||
NR_UE_DLSCH_t *dlsch,
|
short *dlsch_llr,
|
||||||
NR_DL_UE_HARQ_t *harq_process,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint32_t frame,
|
NR_UE_DLSCH_t *dlsch,
|
||||||
uint16_t nb_symb_sch,
|
NR_DL_UE_HARQ_t *harq_process,
|
||||||
uint8_t nr_tti_rx,
|
uint32_t frame,
|
||||||
uint8_t harq_pid,
|
uint16_t nb_symb_sch,
|
||||||
uint8_t is_crnti,
|
uint8_t nr_slot_rx,
|
||||||
uint8_t llr8_flag)
|
uint8_t harq_pid,
|
||||||
|
uint8_t is_crnti,
|
||||||
|
uint8_t llr8_flag)
|
||||||
{
|
{
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
@@ -298,14 +300,14 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
return(dlsch->max_ldpc_iterations + 1);
|
return(dlsch->max_ldpc_iterations + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if (nr_tti_rx> (frame_parms->slots_per_subframe-1)) {
|
/*if (nr_slot_rx> (frame_parms->slots_per_frame-1)) {
|
||||||
printf("dlsch_decoding.c: Illegal subframe index %d\n",nr_tti_rx);
|
printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
|
||||||
return(dlsch->max_ldpc_iterations + 1);
|
return(dlsch->max_ldpc_iterations + 1);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*if (harq_process->harq_ack.ack != 2) {
|
/*if (harq_process->harq_ack.ack != 2) {
|
||||||
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
|
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
|
||||||
phy_vars_ue->Mod_id, nr_tti_rx, harq_process->harq_ack.ack);
|
phy_vars_ue->Mod_id, nr_slot_rx, harq_process->harq_ack.ack);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
// nb_rb = dlsch->nb_rb;
|
// nb_rb = dlsch->nb_rb;
|
||||||
@@ -316,7 +318,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
return(max_ldpc_iterations + 1);
|
return(max_ldpc_iterations + 1);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
|
/*harq_pid = dlsch->current_harq_pid[proc->thread_id];
|
||||||
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_ldpc_iterations + 1);
|
return(max_ldpc_iterations + 1);
|
||||||
@@ -553,7 +555,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
start_meas(dlsch_turbo_decoding_stats);
|
start_meas(dlsch_turbo_decoding_stats);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_tti_rx,r,harq_process->C-1, A);
|
//LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_slot_rx,r,harq_process->C-1, A);
|
||||||
|
|
||||||
//printf("harq process dr iteration %d\n", p_decParams->numMaxIter);
|
//printf("harq process dr iteration %d\n", p_decParams->numMaxIter);
|
||||||
|
|
||||||
@@ -648,7 +650,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
|
|
||||||
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
|
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
|
||||||
LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1);
|
LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
|
||||||
err_flag = 1;
|
err_flag = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -656,14 +658,14 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
if (err_flag == 1) {
|
if (err_flag == 1) {
|
||||||
//#if UE_DEBUG_TRACE
|
//#if UE_DEBUG_TRACE
|
||||||
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
|
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
|
||||||
phy_vars_ue->Mod_id, frame, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
|
phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
|
||||||
//#endif
|
//#endif
|
||||||
harq_process->harq_ack.ack = 0;
|
harq_process->harq_ack.ack = 0;
|
||||||
harq_process->harq_ack.harq_id = harq_pid;
|
harq_process->harq_ack.harq_id = harq_pid;
|
||||||
harq_process->harq_ack.send_harq_status = 1;
|
harq_process->harq_ack.send_harq_status = 1;
|
||||||
harq_process->errors[harq_process->round]++;
|
harq_process->errors[harq_process->round]++;
|
||||||
|
|
||||||
// printf("Rate: [UE %d] DLSCH: Setting NACK for slot %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->round);
|
// printf("Rate: [UE %d] DLSCH: Setting NACK for slot %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round);
|
||||||
if (harq_process->round >= dlsch->Mlimit) {
|
if (harq_process->round >= dlsch->Mlimit) {
|
||||||
harq_process->status = SCH_IDLE;
|
harq_process->status = SCH_IDLE;
|
||||||
harq_process->round = 0;
|
harq_process->round = 0;
|
||||||
@@ -672,15 +674,15 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
if(is_crnti)
|
if(is_crnti)
|
||||||
{
|
{
|
||||||
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
|
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
|
||||||
phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
|
phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
|
||||||
}
|
}
|
||||||
|
|
||||||
return((1 + dlsch->max_ldpc_iterations));
|
return((1 + dlsch->max_ldpc_iterations));
|
||||||
} else {
|
} else {
|
||||||
//#if UE_DEBUG_TRACE
|
//#if UE_DEBUG_TRACE
|
||||||
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
|
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
|
||||||
phy_vars_ue->Mod_id,nr_tti_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
|
phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
harq_process->status = SCH_IDLE;
|
harq_process->status = SCH_IDLE;
|
||||||
@@ -694,7 +696,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
if(is_crnti)
|
if(is_crnti)
|
||||||
{
|
{
|
||||||
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
|
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
|
||||||
}
|
}
|
||||||
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
||||||
|
|
||||||
@@ -763,7 +765,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
NR_DL_UE_HARQ_t *harq_process,
|
NR_DL_UE_HARQ_t *harq_process,
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
uint16_t nb_symb_sch,
|
uint16_t nb_symb_sch,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_slot_rx,
|
||||||
uint8_t harq_pid,
|
uint8_t harq_pid,
|
||||||
uint8_t is_crnti,
|
uint8_t is_crnti,
|
||||||
uint8_t llr8_flag)
|
uint8_t llr8_flag)
|
||||||
@@ -840,14 +842,14 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
return(dlsch->max_ldpc_iterations);
|
return(dlsch->max_ldpc_iterations);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (nr_tti_rx> (frame_parms->slots_per_subframe-1)) {
|
/* if (nr_slot_rx> (frame_parms->slots_per_frame-1)) {
|
||||||
printf("dlsch_decoding.c: Illegal subframe index %d\n",nr_tti_rx);
|
printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
|
||||||
return(dlsch->max_ldpc_iterations);
|
return(dlsch->max_ldpc_iterations);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dlsch->harq_ack[nr_tti_rx].ack != 2) {
|
if (dlsch->harq_ack[nr_slot_rx].ack != 2) {
|
||||||
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
|
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
|
||||||
phy_vars_ue->Mod_id, nr_tti_rx, dlsch->harq_ack[nr_tti_rx].ack);
|
phy_vars_ue->Mod_id, nr_slot_rx, dlsch->harq_ack[nr_slot_rx].ack);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -856,7 +858,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
return(max_ldpc_iterations);
|
return(max_ldpc_iterations);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
|
/*harq_pid = dlsch->current_harq_pid[proc->thread_id];
|
||||||
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_ldpc_iterations);
|
return(max_ldpc_iterations);
|
||||||
@@ -984,15 +986,16 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
|
|
||||||
memset(&curMsg->proc, 0, sizeof(curMsg->proc));
|
memset(&curMsg->proc, 0, sizeof(curMsg->proc));
|
||||||
curMsg->proc.frame_rx = proc->frame_rx;
|
curMsg->proc.frame_rx = proc->frame_rx;
|
||||||
curMsg->proc.nr_tti_rx = proc->nr_tti_rx;
|
curMsg->proc.nr_slot_rx = proc->nr_slot_rx;
|
||||||
curMsg->proc.num_seg = nb_seg;
|
curMsg->proc.thread_id = proc->thread_id;
|
||||||
|
curMsg->proc.num_seg = nb_seg;
|
||||||
|
|
||||||
curMsg->proc.eNB_id= eNB_id;
|
curMsg->proc.eNB_id= eNB_id;
|
||||||
curMsg->proc.harq_pid=harq_pid;
|
curMsg->proc.harq_pid=harq_pid;
|
||||||
curMsg->proc.llr8_flag = llr8_flag;
|
curMsg->proc.llr8_flag = llr8_flag;
|
||||||
|
|
||||||
msgToPush_dl->key= (nr_tti_rx%2) ? (nb_seg+30): nb_seg;
|
msgToPush_dl->key= (nr_slot_rx%2) ? (nb_seg+30): nb_seg;
|
||||||
pushTpool(Tpool_dl, msgToPush_dl);
|
pushTpool(Tpool_dl, msgToPush_dl);
|
||||||
|
|
||||||
/*Qm= harq_process->Qm;
|
/*Qm= harq_process->Qm;
|
||||||
@@ -1146,7 +1149,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
start_meas(dlsch_turbo_decoding_stats);
|
start_meas(dlsch_turbo_decoding_stats);
|
||||||
#endif
|
#endif
|
||||||
LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1);
|
LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
|
||||||
|
|
||||||
/*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
|
/*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
|
||||||
inv_d[cnt] = (1)*harq_process->d[r][cnt];
|
inv_d[cnt] = (1)*harq_process->d[r][cnt];
|
||||||
@@ -1238,7 +1241,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
|
|
||||||
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
|
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
|
||||||
LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1);
|
LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
|
||||||
err_flag = 1;
|
err_flag = 1;
|
||||||
}
|
}
|
||||||
//} //loop r
|
//} //loop r
|
||||||
@@ -1246,7 +1249,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
if (err_flag == 1) {
|
if (err_flag == 1) {
|
||||||
#if UE_DEBUG_TRACE
|
#if UE_DEBUG_TRACE
|
||||||
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
|
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
|
||||||
phy_vars_ue->Mod_id, frame, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
|
phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
|
||||||
#endif
|
#endif
|
||||||
harq_process->harq_ack.ack = 0;
|
harq_process->harq_ack.ack = 0;
|
||||||
harq_process->harq_ack.harq_id = harq_pid;
|
harq_process->harq_ack.harq_id = harq_pid;
|
||||||
@@ -1262,15 +1265,15 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
}
|
}
|
||||||
if(is_crnti)
|
if(is_crnti)
|
||||||
{
|
{
|
||||||
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
|
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
|
||||||
phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS);
|
phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS);
|
||||||
}
|
}
|
||||||
|
|
||||||
return((1+dlsch->max_ldpc_iterations));
|
return((1+dlsch->max_ldpc_iterations));
|
||||||
} else {
|
} else {
|
||||||
#if UE_DEBUG_TRACE
|
#if UE_DEBUG_TRACE
|
||||||
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d TBS %d mcs %d nb_rb %d\n",
|
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d\n",
|
||||||
phy_vars_ue->Mod_id,nr_tti_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
|
phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
harq_process->status = SCH_IDLE;
|
harq_process->status = SCH_IDLE;
|
||||||
@@ -1283,7 +1286,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
if(is_crnti)
|
if(is_crnti)
|
||||||
{
|
{
|
||||||
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
|
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
|
||||||
}
|
}
|
||||||
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
||||||
|
|
||||||
@@ -1382,7 +1385,7 @@ void nr_dlsch_decoding_process(void *arg)
|
|||||||
__m128i *pl = (__m128i*)&l;
|
__m128i *pl = (__m128i*)&l;
|
||||||
|
|
||||||
proc->instance_cnt_dlsch_td=-1;
|
proc->instance_cnt_dlsch_td=-1;
|
||||||
//proc->nr_tti_rx=proc->sub_frame_start;
|
//proc->nr_slot_rx = proc->sub_frame_start * frame_parms->slots_per_subframe;
|
||||||
|
|
||||||
proc->decoder_thread_available = 1;
|
proc->decoder_thread_available = 1;
|
||||||
|
|
||||||
@@ -1406,16 +1409,16 @@ void nr_dlsch_decoding_process(void *arg)
|
|||||||
int harq_pid = proc->harq_pid;
|
int harq_pid = proc->harq_pid;
|
||||||
llr8_flag1 = proc->llr8_flag;
|
llr8_flag1 = proc->llr8_flag;
|
||||||
int frame = proc->frame_rx;
|
int frame = proc->frame_rx;
|
||||||
int slot = proc->nr_tti_rx;
|
int slot = proc->nr_slot_rx;
|
||||||
r = proc->num_seg;
|
r = proc->num_seg;
|
||||||
|
|
||||||
NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[slot]][eNB_id][0];
|
NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[proc->thread_id][eNB_id][0];
|
||||||
NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid];
|
NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid];
|
||||||
short *dlsch_llr = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[slot]][eNB_id]->llr[0];
|
short *dlsch_llr = phy_vars_ue->pdsch_vars[proc->thread_id][eNB_id]->llr[0];
|
||||||
//printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag);
|
//printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag);
|
||||||
p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[r];
|
p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[r];
|
||||||
nb_symb_sch = harq_process->nb_symbols;
|
nb_symb_sch = harq_process->nb_symbols;
|
||||||
printf("dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_tti_rx, proc->num_seg, r, harq_process->nb_symbols);
|
printf("dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_slot_rx, proc->num_seg, r, harq_process->nb_symbols);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1424,7 +1427,7 @@ void nr_dlsch_decoding_process(void *arg)
|
|||||||
return(max_ldpc_iterations);
|
return(max_ldpc_iterations);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
|
/*harq_pid = dlsch->current_harq_pid[proc->thread_id];
|
||||||
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_ldpc_iterations);
|
return(max_ldpc_iterations);
|
||||||
|
|||||||
@@ -100,16 +100,17 @@ static void nr_dlsch_layer_demapping(int16_t **llr_cw,
|
|||||||
int16_t **llr_layers);
|
int16_t **llr_layers);
|
||||||
|
|
||||||
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||||
PDSCH_t type,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
unsigned char eNB_id,
|
PDSCH_t type,
|
||||||
unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference
|
unsigned char eNB_id,
|
||||||
uint32_t frame,
|
unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference
|
||||||
uint8_t nr_tti_rx,
|
uint32_t frame,
|
||||||
unsigned char symbol,
|
uint8_t nr_slot_rx,
|
||||||
unsigned char first_symbol_flag,
|
unsigned char symbol,
|
||||||
RX_type_t rx_type,
|
unsigned char first_symbol_flag,
|
||||||
unsigned char i_mod,
|
RX_type_t rx_type,
|
||||||
unsigned char harq_pid)
|
unsigned char i_mod,
|
||||||
|
unsigned char harq_pid)
|
||||||
{
|
{
|
||||||
|
|
||||||
NR_UE_COMMON *common_vars = &ue->common_vars;
|
NR_UE_COMMON *common_vars = &ue->common_vars;
|
||||||
@@ -151,42 +152,43 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
uint32_t llr_offset_symbol;
|
uint32_t llr_offset_symbol;
|
||||||
//uint16_t bundle_L = 2;
|
//uint16_t bundle_L = 2;
|
||||||
uint8_t pilots=0;
|
uint8_t pilots=0;
|
||||||
|
uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
|
||||||
uint16_t n_tx=1, n_rx=1;
|
uint16_t n_tx=1, n_rx=1;
|
||||||
int32_t median[16];
|
int32_t median[16];
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SI_PDSCH:
|
case SI_PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]];
|
pdsch_vars = ue->pdsch_vars[proc->thread_id];
|
||||||
dlsch = &ue->dlsch_SI[eNB_id];
|
dlsch = &ue->dlsch_SI[eNB_id];
|
||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RA_PDSCH:
|
case RA_PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]];
|
pdsch_vars = ue->pdsch_vars[proc->thread_id];
|
||||||
dlsch = &ue->dlsch_ra[eNB_id];
|
dlsch = &ue->dlsch_ra[eNB_id];
|
||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PDSCH:
|
case PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]];
|
pdsch_vars = ue->pdsch_vars[proc->thread_id];
|
||||||
dlsch = ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id];
|
dlsch = ue->dlsch[proc->thread_id][eNB_id];
|
||||||
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||||
dlsch1_harq = dlsch[1]->harq_processes[harq_pid];
|
dlsch1_harq = dlsch[1]->harq_processes[harq_pid];
|
||||||
beamforming_mode = ue->transmission_mode[eNB_id] < 7 ? 0 :ue->transmission_mode[eNB_id];
|
beamforming_mode = ue->transmission_mode[eNB_id] < 7 ? 0 :ue->transmission_mode[eNB_id];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOG_E(PHY, "[UE][FATAL] nr_tti_rx %d: Unknown PDSCH format %d\n", nr_tti_rx, type);
|
LOG_E(PHY, "[UE][FATAL] nr_slot_rx %d: Unknown PDSCH format %d\n", nr_slot_rx, type);
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dlsch0_harq && dlsch1_harq){
|
if (dlsch0_harq && dlsch1_harq){
|
||||||
|
|
||||||
LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n", frame, nr_tti_rx, symbol, harq_pid, dlsch0_harq->status, dlsch1_harq->status);
|
LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n", frame, nr_slot_rx, symbol, harq_pid, dlsch0_harq->status, dlsch1_harq->status);
|
||||||
|
|
||||||
if ((dlsch0_harq->status == ACTIVE) && (dlsch1_harq->status == ACTIVE)){
|
if ((dlsch0_harq->status == ACTIVE) && (dlsch1_harq->status == ACTIVE)){
|
||||||
codeword_TB0 = dlsch0_harq->codeword;
|
codeword_TB0 = dlsch0_harq->codeword;
|
||||||
@@ -220,7 +222,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
LOG_E(PHY,"[UE][FATAL] nr_tti_rx %d: no active DLSCH\n", nr_tti_rx);
|
LOG_E(PHY,"[UE][FATAL] nr_slot_rx %d: no active DLSCH\n", nr_slot_rx);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
} else if (dlsch0_harq) {
|
} else if (dlsch0_harq) {
|
||||||
@@ -232,7 +234,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
printf("[DEMOD] I am assuming only TB0 is active\n");
|
printf("[DEMOD] I am assuming only TB0 is active\n");
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
LOG_E(PHY,"[UE][FATAL] nr_tti_rx %d: no active DLSCH\n", nr_tti_rx);
|
LOG_E(PHY,"[UE][FATAL] nr_slot_rx %d: no active DLSCH\n", nr_slot_rx);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -312,9 +314,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#endif
|
#endif
|
||||||
nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
|
nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
|
||||||
pdsch_vars[eNB_id]->dl_ch_estimates,
|
pdsch_vars[eNB_id]->dl_ch_estimates,
|
||||||
pdsch_vars[eNB_id]->rxdataF_ext,
|
pdsch_vars[eNB_id]->rxdataF_ext,
|
||||||
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||||
@@ -324,7 +326,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pilots,
|
pilots,
|
||||||
start_rb,
|
start_rb,
|
||||||
nb_rb_pdsch,
|
nb_rb_pdsch,
|
||||||
nr_tti_rx,
|
nr_slot_rx,
|
||||||
ue->high_speed_flag,
|
ue->high_speed_flag,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
dlsch0_harq->mimo_mode);
|
dlsch0_harq->mimo_mode);
|
||||||
@@ -337,7 +339,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
if (rx_type >= rx_IC_single_stream) {
|
if (rx_type >= rx_IC_single_stream) {
|
||||||
if (eNB_id_i<ue->n_connected_eNB) // we are in TM5
|
if (eNB_id_i<ue->n_connected_eNB) // we are in TM5
|
||||||
nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
|
nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
|
||||||
pdsch_vars[eNB_id]->dl_ch_estimates,
|
pdsch_vars[eNB_id]->dl_ch_estimates,
|
||||||
pdsch_vars[eNB_id_i]->rxdataF_ext,
|
pdsch_vars[eNB_id_i]->rxdataF_ext,
|
||||||
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
|
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
|
||||||
@@ -347,12 +349,12 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pilots,
|
pilots,
|
||||||
start_rb,
|
start_rb,
|
||||||
nb_rb_pdsch,
|
nb_rb_pdsch,
|
||||||
nr_tti_rx,
|
nr_slot_rx,
|
||||||
ue->high_speed_flag,
|
ue->high_speed_flag,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
dlsch0_harq->mimo_mode);
|
dlsch0_harq->mimo_mode);
|
||||||
else
|
else
|
||||||
nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
|
nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
|
||||||
pdsch_vars[eNB_id]->dl_ch_estimates,
|
pdsch_vars[eNB_id]->dl_ch_estimates,
|
||||||
pdsch_vars[eNB_id_i]->rxdataF_ext,
|
pdsch_vars[eNB_id_i]->rxdataF_ext,
|
||||||
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
|
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
|
||||||
@@ -362,14 +364,14 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pilots,
|
pilots,
|
||||||
start_rb,
|
start_rb,
|
||||||
nb_rb_pdsch,
|
nb_rb_pdsch,
|
||||||
nr_tti_rx,
|
nr_slot_rx,
|
||||||
ue->high_speed_flag,
|
ue->high_speed_flag,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
dlsch0_harq->mimo_mode);
|
dlsch0_harq->mimo_mode);
|
||||||
}
|
}
|
||||||
} else if (beamforming_mode==0) { //else if nb_antennas_ports_gNB==1 && beamforming_mode == 0
|
} else if (beamforming_mode==0) { //else if nb_antennas_ports_gNB==1 && beamforming_mode == 0
|
||||||
//printf("start nr dlsch extract nr_tti_rx %d thread id %d \n", nr_tti_rx, ue->current_thread_id[nr_tti_rx]);
|
//printf("start nr dlsch extract nr_slot_rx %d thread id %d \n", nr_slot_rx, proc->thread_id);
|
||||||
nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
|
nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
|
||||||
pdsch_vars[eNB_id]->dl_ch_estimates,
|
pdsch_vars[eNB_id]->dl_ch_estimates,
|
||||||
pdsch_vars[eNB_id]->rxdataF_ext,
|
pdsch_vars[eNB_id]->rxdataF_ext,
|
||||||
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||||
@@ -377,9 +379,10 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->pmi_ext,
|
pdsch_vars[eNB_id]->pmi_ext,
|
||||||
symbol,
|
symbol,
|
||||||
pilots,
|
pilots,
|
||||||
|
config_type,
|
||||||
start_rb + dlsch0_harq->BWPStart,
|
start_rb + dlsch0_harq->BWPStart,
|
||||||
nb_rb_pdsch,
|
nb_rb_pdsch,
|
||||||
nr_tti_rx,
|
nr_slot_rx,
|
||||||
ue->high_speed_flag,
|
ue->high_speed_flag,
|
||||||
frame_parms);
|
frame_parms);
|
||||||
|
|
||||||
@@ -393,21 +396,21 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
len = (pilots==1)? (nb_rb*6):(nb_rb*12);
|
len = (pilots==1)? ((config_type==pdsch_dmrs_type1)?nb_rb*(12-6*dlsch0_harq->n_dmrs_cdm_groups): nb_rb*(12-4*dlsch0_harq->n_dmrs_cdm_groups)):(nb_rb*12);
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
#if DISABLE_LOG_X
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",
|
printf("[AbsSFN %u.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",
|
||||||
frame,nr_tti_rx,slot,symbol,ue->high_speed_flag,type,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
frame,nr_slot_rx,slot,symbol,ue->high_speed_flag,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
#else
|
||||||
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",
|
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",
|
||||||
frame,nr_tti_rx,slot,symbol,ue->high_speed_flag,type,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
frame,nr_slot_rx,slot,symbol,ue->high_speed_flag,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#endif
|
#endif
|
||||||
n_tx = frame_parms->nb_antenna_ports_gNB;
|
n_tx = frame_parms->nb_antenna_ports_gNB;
|
||||||
n_rx = frame_parms->nb_antennas_rx;
|
n_rx = frame_parms->nb_antennas_rx;
|
||||||
@@ -417,19 +420,20 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
dlsch,
|
dlsch,
|
||||||
symbol,
|
symbol,
|
||||||
pilots,
|
pilots,
|
||||||
|
len,
|
||||||
nb_rb);
|
nb_rb);
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
#if DISABLE_LOG_X
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
#else
|
||||||
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#endif
|
#endif
|
||||||
if (first_symbol_flag==1) {
|
if (first_symbol_flag==1) {
|
||||||
if (beamforming_mode==0){
|
if (beamforming_mode==0){
|
||||||
@@ -470,7 +474,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
//#ifdef UE_DEBUG_TRACE
|
//#ifdef UE_DEBUG_TRACE
|
||||||
LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
|
LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
|
||||||
frame%1024,nr_tti_rx, pdsch_vars[eNB_id]->log2_maxh,
|
frame%1024,nr_slot_rx, pdsch_vars[eNB_id]->log2_maxh,
|
||||||
pdsch_vars[eNB_id]->log2_maxh0,
|
pdsch_vars[eNB_id]->log2_maxh0,
|
||||||
pdsch_vars[eNB_id]->log2_maxh1,
|
pdsch_vars[eNB_id]->log2_maxh1,
|
||||||
avg[0],avgs);
|
avg[0],avgs);
|
||||||
@@ -493,23 +497,23 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
#if T_TRACER
|
#if T_TRACER
|
||||||
if (type == PDSCH)
|
if (type == PDSCH)
|
||||||
{
|
{
|
||||||
T(T_UE_PHY_PDSCH_ENERGY, T_INT(eNB_id), T_INT(0), T_INT(frame%1024), T_INT(nr_tti_rx),
|
T(T_UE_PHY_PDSCH_ENERGY, T_INT(eNB_id), T_INT(0), T_INT(frame%1024), T_INT(nr_slot_rx),
|
||||||
T_INT(avg[0]), T_INT(avg[1]), T_INT(avg[2]), T_INT(avg[3]));
|
T_INT(avg[0]), T_INT(avg[1]), T_INT(avg[2]), T_INT(avg[3]));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
#if DISABLE_LOG_X
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_tti_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
printf("[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
#else
|
||||||
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_tti_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#endif
|
#endif
|
||||||
// Now channel compensation
|
// Now channel compensation
|
||||||
if (dlsch0_harq->mimo_mode<NR_DUALSTREAM) {
|
if (dlsch0_harq->mimo_mode<NR_DUALSTREAM) {
|
||||||
@@ -612,16 +616,16 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
#if DISABLE_LOG_X
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
printf("[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_slot_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
#else
|
||||||
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_slot_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
// MRC
|
// MRC
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (frame_parms->nb_antennas_rx > 1) {
|
if (frame_parms->nb_antennas_rx > 1) {
|
||||||
@@ -657,17 +661,17 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
#if DISABLE_LOG_X
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
#else
|
||||||
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
|
|
||||||
start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#endif
|
#endif
|
||||||
//printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol);
|
//printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol);
|
||||||
// compute LLRs
|
// compute LLRs
|
||||||
@@ -735,7 +739,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
||||||
pdsch_vars[eNB_id]->layer_llr[0],
|
pdsch_vars[eNB_id]->layer_llr[0],
|
||||||
symbol,len,first_symbol_flag,nb_rb,
|
symbol,len,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128);
|
pdsch_vars[eNB_id]->llr128);
|
||||||
if (rx_type==rx_IC_dual_stream) {
|
if (rx_type==rx_IC_dual_stream) {
|
||||||
nr_dlsch_qpsk_qpsk_llr(frame_parms,
|
nr_dlsch_qpsk_qpsk_llr(frame_parms,
|
||||||
@@ -744,7 +748,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
pdsch_vars[eNB_id]->layer_llr[1],
|
pdsch_vars[eNB_id]->layer_llr[1],
|
||||||
symbol,len,first_symbol_flag,nb_rb,
|
symbol,len,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128_2ndstream);
|
pdsch_vars[eNB_id]->llr128_2ndstream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -756,7 +760,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
||||||
pdsch_vars[eNB_id]->layer_llr[0],
|
pdsch_vars[eNB_id]->layer_llr[0],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128);
|
pdsch_vars[eNB_id]->llr128);
|
||||||
if (rx_type==rx_IC_dual_stream) {
|
if (rx_type==rx_IC_dual_stream) {
|
||||||
nr_dlsch_16qam_qpsk_llr(frame_parms,
|
nr_dlsch_16qam_qpsk_llr(frame_parms,
|
||||||
@@ -766,7 +770,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
pdsch_vars[eNB_id]->layer_llr[1],
|
pdsch_vars[eNB_id]->layer_llr[1],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128_2ndstream);
|
pdsch_vars[eNB_id]->llr128_2ndstream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -778,7 +782,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
||||||
pdsch_vars[eNB_id]->layer_llr[0],
|
pdsch_vars[eNB_id]->layer_llr[0],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128);
|
pdsch_vars[eNB_id]->llr128);
|
||||||
if (rx_type==rx_IC_dual_stream) {
|
if (rx_type==rx_IC_dual_stream) {
|
||||||
nr_dlsch_64qam_qpsk_llr(frame_parms,
|
nr_dlsch_64qam_qpsk_llr(frame_parms,
|
||||||
@@ -788,7 +792,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
pdsch_vars[eNB_id]->layer_llr[1],
|
pdsch_vars[eNB_id]->layer_llr[1],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128_2ndstream);
|
pdsch_vars[eNB_id]->llr128_2ndstream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -821,7 +825,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
||||||
pdsch_vars[eNB_id]->layer_llr[0],
|
pdsch_vars[eNB_id]->layer_llr[0],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128);
|
pdsch_vars[eNB_id]->llr128);
|
||||||
if (rx_type==rx_IC_dual_stream) {
|
if (rx_type==rx_IC_dual_stream) {
|
||||||
nr_dlsch_qpsk_16qam_llr(frame_parms,
|
nr_dlsch_qpsk_16qam_llr(frame_parms,
|
||||||
@@ -831,7 +835,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
pdsch_vars[eNB_id]->layer_llr[1],
|
pdsch_vars[eNB_id]->layer_llr[1],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128_2ndstream);
|
pdsch_vars[eNB_id]->llr128_2ndstream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -844,7 +848,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
||||||
pdsch_vars[eNB_id]->layer_llr[0],
|
pdsch_vars[eNB_id]->layer_llr[0],
|
||||||
symbol,len,first_symbol_flag,nb_rb,
|
symbol,len,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128);
|
pdsch_vars[eNB_id]->llr128);
|
||||||
if (rx_type==rx_IC_dual_stream) {
|
if (rx_type==rx_IC_dual_stream) {
|
||||||
nr_dlsch_16qam_16qam_llr(frame_parms,
|
nr_dlsch_16qam_16qam_llr(frame_parms,
|
||||||
@@ -855,7 +859,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
pdsch_vars[eNB_id]->layer_llr[1],
|
pdsch_vars[eNB_id]->layer_llr[1],
|
||||||
symbol,len,first_symbol_flag,nb_rb,
|
symbol,len,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128_2ndstream);
|
pdsch_vars[eNB_id]->llr128_2ndstream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -868,7 +872,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
||||||
pdsch_vars[eNB_id]->layer_llr[0],
|
pdsch_vars[eNB_id]->layer_llr[0],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128);
|
pdsch_vars[eNB_id]->llr128);
|
||||||
if (rx_type==rx_IC_dual_stream) {
|
if (rx_type==rx_IC_dual_stream) {
|
||||||
nr_dlsch_64qam_16qam_llr(frame_parms,
|
nr_dlsch_64qam_16qam_llr(frame_parms,
|
||||||
@@ -879,7 +883,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
pdsch_vars[eNB_id]->layer_llr[1],
|
pdsch_vars[eNB_id]->layer_llr[1],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128_2ndstream);
|
pdsch_vars[eNB_id]->llr128_2ndstream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -914,7 +918,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
||||||
pdsch_vars[eNB_id]->layer_llr[0],
|
pdsch_vars[eNB_id]->layer_llr[0],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128);
|
pdsch_vars[eNB_id]->llr128);
|
||||||
if (rx_type==rx_IC_dual_stream) {
|
if (rx_type==rx_IC_dual_stream) {
|
||||||
nr_dlsch_qpsk_64qam_llr(frame_parms,
|
nr_dlsch_qpsk_64qam_llr(frame_parms,
|
||||||
@@ -924,7 +928,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
pdsch_vars[eNB_id]->layer_llr[1],
|
pdsch_vars[eNB_id]->layer_llr[1],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128_2ndstream);
|
pdsch_vars[eNB_id]->llr128_2ndstream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -937,7 +941,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
||||||
pdsch_vars[eNB_id]->layer_llr[0],
|
pdsch_vars[eNB_id]->layer_llr[0],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128);
|
pdsch_vars[eNB_id]->llr128);
|
||||||
if (rx_type==rx_IC_dual_stream) {
|
if (rx_type==rx_IC_dual_stream) {
|
||||||
nr_dlsch_16qam_64qam_llr(frame_parms,
|
nr_dlsch_16qam_64qam_llr(frame_parms,
|
||||||
@@ -948,7 +952,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
pdsch_vars[eNB_id]->layer_llr[1],
|
pdsch_vars[eNB_id]->layer_llr[1],
|
||||||
symbol,first_symbol_flag,nb_rb,
|
symbol,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr128_2ndstream);
|
pdsch_vars[eNB_id]->llr128_2ndstream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -961,7 +965,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
pdsch_vars[eNB_id]->dl_ch_rho2_ext,
|
||||||
(int16_t*)pllr_symbol_layer0,
|
(int16_t*)pllr_symbol_layer0,
|
||||||
symbol,len,first_symbol_flag,nb_rb,
|
symbol,len,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr_offset[symbol]);
|
pdsch_vars[eNB_id]->llr_offset[symbol]);
|
||||||
if (rx_type==rx_IC_dual_stream) {
|
if (rx_type==rx_IC_dual_stream) {
|
||||||
nr_dlsch_64qam_64qam_llr(frame_parms,
|
nr_dlsch_64qam_64qam_llr(frame_parms,
|
||||||
@@ -972,7 +976,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
|
||||||
pllr_symbol_layer1,
|
pllr_symbol_layer1,
|
||||||
symbol,len,first_symbol_flag,nb_rb,
|
symbol,len,first_symbol_flag,nb_rb,
|
||||||
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_tti_rx,symbol),
|
adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_slot_rx,symbol),
|
||||||
pdsch_vars[eNB_id]->llr_offset[symbol]);
|
pdsch_vars[eNB_id]->llr_offset[symbol]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1028,7 +1032,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
return(-1);
|
return(-1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//nr_dlsch_deinterleaving(symbol,bundle_L,(int16_t*)pllr_symbol_cw0,(int16_t*)pllr_symbol_cw0_deint, nb_rb_pdsch);
|
//nr_dlsch_deinterleaving(symbol,bundle_L,(int16_t*)pllr_symbol_cw0,(int16_t*)pllr_symbol_cw0_deint, nb_rb_pdsch);
|
||||||
|
|
||||||
@@ -1041,11 +1045,11 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
#if DISABLE_LOG_X
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
printf("[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
#else
|
||||||
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
|
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1054,30 +1058,30 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
char filename[40];
|
char filename[40];
|
||||||
uint8_t aa = 0;
|
uint8_t aa = 0;
|
||||||
|
|
||||||
snprintf(filename, 40, "rxdataF0_symb_%d_nr_tti_rx_%d.m", symbol, nr_tti_rx);
|
snprintf(filename, 40, "rxdataF0_symb_%d_nr_slot_rx_%d.m", symbol, nr_slot_rx);
|
||||||
write_output(filename, "rxdataF0", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF[0][0], NR_SYMBOLS_PER_SLOT*frame_parms->ofdm_symbol_size, 1, 1);
|
write_output(filename, "rxdataF0", &common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0], NR_SYMBOLS_PER_SLOT*frame_parms->ofdm_symbol_size, 1, 1);
|
||||||
|
|
||||||
snprintf(filename, 40, "dl_ch_estimates0%d_symb_%d_nr_tti_rx_%d.m", aa, symbol, nr_tti_rx);
|
snprintf(filename, 40, "dl_ch_estimates0%d_symb_%d_nr_slot_rx_%d.m", aa, symbol, nr_slot_rx);
|
||||||
write_output(filename, "dl_ch_estimates", &pdsch_vars[eNB_id]->dl_ch_estimates[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->ofdm_symbol_size, 1, 1);
|
write_output(filename, "dl_ch_estimates", &pdsch_vars[eNB_id]->dl_ch_estimates[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->ofdm_symbol_size, 1, 1);
|
||||||
|
|
||||||
snprintf(filename, 40, "rxdataF_ext0%d_symb_%d_nr_tti_rx_%d.m", aa, symbol, nr_tti_rx);
|
snprintf(filename, 40, "rxdataF_ext0%d_symb_%d_nr_slot_rx_%d.m", aa, symbol, nr_slot_rx);
|
||||||
write_output(filename, "rxdataF_ext", &pdsch_vars[eNB_id]->rxdataF_ext[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->N_RB_DL*NR_NB_SC_PER_RB, 1, 1);
|
write_output(filename, "rxdataF_ext", &pdsch_vars[eNB_id]->rxdataF_ext[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->N_RB_DL*NR_NB_SC_PER_RB, 1, 1);
|
||||||
|
|
||||||
snprintf(filename, 40, "dl_ch_estimates_ext0%d_symb_%d_nr_tti_rx_%d.m", aa, symbol, nr_tti_rx);
|
snprintf(filename, 40, "dl_ch_estimates_ext0%d_symb_%d_nr_slot_rx_%d.m", aa, symbol, nr_slot_rx);
|
||||||
write_output(filename, "dl_ch_estimates_ext00", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->N_RB_DL*NR_NB_SC_PER_RB, 1, 1);
|
write_output(filename, "dl_ch_estimates_ext00", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->N_RB_DL*NR_NB_SC_PER_RB, 1, 1);
|
||||||
|
|
||||||
snprintf(filename, 40, "rxdataF_comp0%d_symb_%d_nr_tti_rx_%d.m", aa, symbol, nr_tti_rx);
|
snprintf(filename, 40, "rxdataF_comp0%d_symb_%d_nr_slot_rx_%d.m", aa, symbol, nr_slot_rx);
|
||||||
write_output(filename, "rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->N_RB_DL*NR_NB_SC_PER_RB, 1, 1);
|
write_output(filename, "rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->N_RB_DL*NR_NB_SC_PER_RB, 1, 1);
|
||||||
|
|
||||||
for (int i=0; i < 2; i++){
|
for (int i=0; i < 2; i++){
|
||||||
snprintf(filename, 40, "llr%d_symb_%d_nr_tti_rx_%d.m", i, symbol, nr_tti_rx);
|
snprintf(filename, 40, "llr%d_symb_%d_nr_slot_rx_%d.m", i, symbol, nr_slot_rx);
|
||||||
write_output(filename,"llr", &pdsch_vars[eNB_id]->llr[i][0], (NR_SYMBOLS_PER_SLOT*nb_rb*NR_NB_SC_PER_RB*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm), 1, 0);
|
write_output(filename,"llr", &pdsch_vars[eNB_id]->llr[i][0], (NR_SYMBOLS_PER_SLOT*nb_rb*NR_NB_SC_PER_RB*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm), 1, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#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),
|
||||||
T_INT(nr_tti_rx), T_INT(nb_rb),
|
T_INT(nr_slot_rx), T_INT(nb_rb),
|
||||||
T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_slot),
|
T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_slot),
|
||||||
T_BUFFER(&pdsch_vars[eNB_id]->rxdataF_comp0[eNB_id][0],
|
T_BUFFER(&pdsch_vars[eNB_id]->rxdataF_comp0[eNB_id][0],
|
||||||
2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_slot*2));
|
2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_slot*2));
|
||||||
@@ -1806,6 +1810,7 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
|
|||||||
NR_UE_DLSCH_t **dlsch_ue,
|
NR_UE_DLSCH_t **dlsch_ue,
|
||||||
uint8_t symbol,
|
uint8_t symbol,
|
||||||
uint8_t pilots,
|
uint8_t pilots,
|
||||||
|
uint32_t len,
|
||||||
unsigned short nb_rb)
|
unsigned short nb_rb)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -1815,17 +1820,14 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
|
|||||||
unsigned char aatx,aarx;
|
unsigned char aatx,aarx;
|
||||||
__m128i *dl_ch128, ch_amp128;
|
__m128i *dl_ch128, ch_amp128;
|
||||||
|
|
||||||
|
uint32_t nb_rb_0 = len/12 + ((len%12)?1:0);
|
||||||
if (pilots==1){
|
|
||||||
nb_rb = nb_rb>>1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine scaling amplitude based the symbol
|
// Determine scaling amplitude based the symbol
|
||||||
|
|
||||||
ch_amp = 1024*8; //((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a));
|
ch_amp = 1024*8; //((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a));
|
||||||
|
|
||||||
LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d\n",symbol,ch_amp,pilots,nb_rb,frame_parms->Ncp,symbol);
|
LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d\n",symbol,ch_amp,pilots,nb_rb,frame_parms->Ncp,symbol);
|
||||||
// printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
|
// printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
|
||||||
|
|
||||||
ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13
|
ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13
|
||||||
|
|
||||||
@@ -1834,7 +1836,7 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
|
|||||||
|
|
||||||
dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
|
dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
|
||||||
|
|
||||||
for (rb=0;rb<nb_rb;rb++) {
|
for (rb=0;rb<nb_rb_0;rb++) {
|
||||||
|
|
||||||
dl_ch128[0] = _mm_mulhi_epi16(dl_ch128[0],ch_amp128);
|
dl_ch128[0] = _mm_mulhi_epi16(dl_ch128[0],ch_amp128);
|
||||||
dl_ch128[0] = _mm_slli_epi16(dl_ch128[0],3);
|
dl_ch128[0] = _mm_slli_epi16(dl_ch128[0],3);
|
||||||
@@ -2360,9 +2362,10 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
|||||||
unsigned char *pmi_ext,
|
unsigned char *pmi_ext,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
uint8_t pilots,
|
uint8_t pilots,
|
||||||
|
uint8_t config_type,
|
||||||
unsigned short start_rb,
|
unsigned short start_rb,
|
||||||
unsigned short nb_rb_pdsch,
|
unsigned short nb_rb_pdsch,
|
||||||
unsigned char nr_tti_rx,
|
unsigned char nr_slot_rx,
|
||||||
uint32_t high_speed_flag,
|
uint32_t high_speed_flag,
|
||||||
NR_DL_FRAME_PARMS *frame_parms) {
|
NR_DL_FRAME_PARMS *frame_parms) {
|
||||||
|
|
||||||
@@ -2376,8 +2379,12 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
|||||||
|
|
||||||
unsigned char j=0;
|
unsigned char j=0;
|
||||||
|
|
||||||
AssertFatal(frame_parms->nushift ==0 || frame_parms->nushift == 1,
|
if (config_type==pdsch_dmrs_type1)
|
||||||
"nushift %d is illegal\n",frame_parms->nushift);
|
AssertFatal(frame_parms->nushift ==0 || frame_parms->nushift == 1,
|
||||||
|
"nushift %d is illegal\n",frame_parms->nushift);
|
||||||
|
else
|
||||||
|
AssertFatal(frame_parms->nushift ==0 || frame_parms->nushift == 2 || frame_parms->nushift == 4,
|
||||||
|
"nushift %d is illegal\n",frame_parms->nushift);
|
||||||
|
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
@@ -2397,34 +2404,44 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
|||||||
if (k>frame_parms->ofdm_symbol_size) {
|
if (k>frame_parms->ofdm_symbol_size) {
|
||||||
k = k-frame_parms->ofdm_symbol_size;
|
k = k-frame_parms->ofdm_symbol_size;
|
||||||
rxF = &rxdataF[aarx][(k+(symbol*(frame_parms->ofdm_symbol_size)))];
|
rxF = &rxdataF[aarx][(k+(symbol*(frame_parms->ofdm_symbol_size)))];
|
||||||
}
|
}
|
||||||
if (pilots==0) {
|
if (pilots==0) {
|
||||||
memcpy((void*)rxF_ext,(void*)rxF,12*sizeof(*rxF_ext));
|
memcpy((void*)rxF_ext,(void*)rxF,12*sizeof(*rxF_ext));
|
||||||
memcpy((void*)dl_ch0_ext,(void*)dl_ch0,12*sizeof(*dl_ch0_ext));
|
memcpy((void*)dl_ch0_ext,(void*)dl_ch0,12*sizeof(*dl_ch0_ext));
|
||||||
dl_ch0_ext+=12;
|
dl_ch0_ext+=12;
|
||||||
rxF_ext+=12;
|
rxF_ext+=12;
|
||||||
} else {
|
} else {//the symbol contains DMRS
|
||||||
j=0;
|
j=0;
|
||||||
|
if (config_type==pdsch_dmrs_type1){
|
||||||
for (i = (1-frame_parms->nushift);
|
for (i = (1-frame_parms->nushift); i<12; i+=2) {
|
||||||
i<12;
|
rxF_ext[j]=rxF[i];
|
||||||
i+=2) {
|
dl_ch0_ext[j]=dl_ch0[i];
|
||||||
rxF_ext[j]=rxF[i];
|
j++;
|
||||||
dl_ch0_ext[j]=dl_ch0[i];
|
}
|
||||||
j++;
|
dl_ch0_ext+=6;
|
||||||
}
|
rxF_ext+=6;
|
||||||
|
} else {
|
||||||
|
for (i = (2+frame_parms->nushift); i<6; i++) {
|
||||||
dl_ch0_ext+=6;
|
rxF_ext[j]=rxF[i];
|
||||||
rxF_ext+=6;
|
dl_ch0_ext[j]=dl_ch0[i];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
for (i = (8+frame_parms->nushift); i<12; i++) {
|
||||||
|
rxF_ext[j]=rxF[i];
|
||||||
|
dl_ch0_ext[j]=dl_ch0[i];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
dl_ch0_ext+= 8;
|
||||||
|
rxF_ext+= 8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dl_ch0+=12;
|
dl_ch0+=12;
|
||||||
rxF+=12;
|
rxF+=12;
|
||||||
k+=12;
|
k+=12;
|
||||||
if (k>=frame_parms->ofdm_symbol_size) {
|
if (k>=frame_parms->ofdm_symbol_size) {
|
||||||
k=k-(frame_parms->ofdm_symbol_size);
|
k = k-(frame_parms->ofdm_symbol_size);
|
||||||
rxF = &rxdataF[aarx][k+(symbol*(frame_parms->ofdm_symbol_size))];
|
rxF = &rxdataF[aarx][k+(symbol*(frame_parms->ofdm_symbol_size))];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2443,7 +2460,7 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
|
|||||||
uint8_t pilots,
|
uint8_t pilots,
|
||||||
unsigned short start_rb,
|
unsigned short start_rb,
|
||||||
unsigned short nb_rb_pdsch,
|
unsigned short nb_rb_pdsch,
|
||||||
unsigned char nr_tti_rx,
|
unsigned char nr_slot_rx,
|
||||||
uint32_t high_speed_flag,
|
uint32_t high_speed_flag,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
MIMO_mode_t mimo_mode) {
|
MIMO_mode_t mimo_mode) {
|
||||||
@@ -2560,7 +2577,7 @@ static void nr_dlsch_layer_demapping(int16_t **llr_cw,
|
|||||||
#ifdef USER_MODE
|
#ifdef USER_MODE
|
||||||
|
|
||||||
|
|
||||||
void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t nr_tti_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid)
|
void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t nr_slot_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid)
|
||||||
{
|
{
|
||||||
unsigned int nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12;
|
unsigned int nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12;
|
||||||
char fname[32],vname[32];
|
char fname[32],vname[32];
|
||||||
@@ -2568,50 +2585,50 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t nr_tti_rx,unsigned int *
|
|||||||
|
|
||||||
snprintf(fname, 32, "dlsch%d_rxF_r%d_ext0.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_rxF_r%d_ext0.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_rxF_r%d_ext0",eNB_id,round);
|
snprintf(vname, 32, "dl%d_rxF_r%d_ext0",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1);
|
||||||
|
|
||||||
if (ue->frame_parms.nb_antennas_rx >1) {
|
if (ue->frame_parms.nb_antennas_rx >1) {
|
||||||
snprintf(fname, 32, "dlsch%d_rxF_r%d_ext1.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_rxF_r%d_ext1.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_rxF_r%d_ext1",eNB_id,round);
|
snprintf(vname, 32, "dl%d_rxF_r%d_ext1",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(fname, 32, "dlsch%d_ch_r%d_ext00.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_ch_r%d_ext00.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_ch_r%d_ext00",eNB_id,round);
|
snprintf(vname, 32, "dl%d_ch_r%d_ext00",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
|
||||||
|
|
||||||
if (ue->transmission_mode[eNB_id]==7){
|
if (ue->transmission_mode[eNB_id]==7){
|
||||||
snprintf(fname, 32, "dlsch%d_bf_ch_r%d.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_bf_ch_r%d.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_bf_ch_r%d",eNB_id,round);
|
snprintf(vname, 32, "dl%d_bf_ch_r%d",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1);
|
||||||
//write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0],512,1,1);
|
//write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0],512,1,1);
|
||||||
|
|
||||||
snprintf(fname, 32, "dlsch%d_bf_ch_r%d_ext00.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_bf_ch_r%d_ext00.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_bf_ch_r%d_ext00",eNB_id,round);
|
snprintf(vname, 32, "dl%d_bf_ch_r%d_ext00",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ue->frame_parms.nb_antennas_rx == 2) {
|
if (ue->frame_parms.nb_antennas_rx == 2) {
|
||||||
snprintf(fname, 32, "dlsch%d_ch_r%d_ext01.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_ch_r%d_ext01.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_ch_r%d_ext01",eNB_id,round);
|
snprintf(vname, 32, "dl%d_ch_r%d_ext01",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ue->frame_parms.nb_antenna_ports_gNB == 2) {
|
if (ue->frame_parms.nb_antenna_ports_gNB == 2) {
|
||||||
snprintf(fname, 32, "dlsch%d_ch_r%d_ext10.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_ch_r%d_ext10.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_ch_r%d_ext10",eNB_id,round);
|
snprintf(vname, 32, "dl%d_ch_r%d_ext10",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
|
||||||
|
|
||||||
if (ue->frame_parms.nb_antennas_rx == 2) {
|
if (ue->frame_parms.nb_antennas_rx == 2) {
|
||||||
snprintf(fname, 32, "dlsch%d_ch_r%d_ext11.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_ch_r%d_ext11.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_ch_r%d_ext11",eNB_id,round);
|
snprintf(vname, 32, "dl%d_ch_r%d_ext11",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(fname, 32, "dlsch%d_rxF_r%d_uespec0.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_rxF_r%d_uespec0.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_rxF_r%d_uespec0",eNB_id,round);
|
snprintf(vname, 32, "dl%d_rxF_r%d_uespec0",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
|
write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
|
||||||
@@ -2621,31 +2638,31 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t nr_tti_rx,unsigned int *
|
|||||||
snprintf(fname, 32, "dlsch%d_r%d_rho.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_r%d_rho.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl_rho_r%d_%d",eNB_id,round);
|
snprintf(vname, 32, "dl_rho_r%d_%d",eNB_id,round);
|
||||||
|
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_rho_ext[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_rho_ext[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
|
||||||
|
|
||||||
snprintf(fname, 32, "dlsch%d_r%d_rho2.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_r%d_rho2.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl_rho2_r%d_%d",eNB_id,round);
|
snprintf(vname, 32, "dl_rho2_r%d_%d",eNB_id,round);
|
||||||
|
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_rho2_ext[0],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_rho2_ext[0],12*N_RB_DL*nsymb,1,1);
|
||||||
|
|
||||||
snprintf(fname, 32, "dlsch%d_rxF_r%d_comp0.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_rxF_r%d_comp0.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_rxF_r%d_comp0",eNB_id,round);
|
snprintf(vname, 32, "dl%d_rxF_r%d_comp0",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1);
|
||||||
if (ue->frame_parms.nb_antenna_ports_gNB == 2) {
|
if (ue->frame_parms.nb_antenna_ports_gNB == 2) {
|
||||||
snprintf(fname, 32, "dlsch%d_rxF_r%d_comp1.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_rxF_r%d_comp1.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_rxF_r%d_comp1",eNB_id,round);
|
snprintf(vname, 32, "dl%d_rxF_r%d_comp1",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_comp1[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_comp1[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(fname, 32, "dlsch%d_rxF_r%d_llr.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_rxF_r%d_llr.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_r%d_llr",eNB_id,round);
|
snprintf(vname, 32, "dl%d_r%d_llr",eNB_id,round);
|
||||||
write_output(fname,vname, ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->llr[0],coded_bits_per_codeword[0],1,0);
|
write_output(fname,vname, ue->pdsch_vars[proc->thread_id][eNB_id]->llr[0],coded_bits_per_codeword[0],1,0);
|
||||||
snprintf(fname, 32, "dlsch%d_r%d_mag1.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_r%d_mag1.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_r%d_mag1",eNB_id,round);
|
snprintf(vname, 32, "dl%d_r%d_mag1",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1);
|
||||||
snprintf(fname, 32, "dlsch%d_r%d_mag2.m",eNB_id,round);
|
snprintf(fname, 32, "dlsch%d_r%d_mag2.m",eNB_id,round);
|
||||||
snprintf(vname, 32, "dl%d_r%d_mag2",eNB_id,round);
|
snprintf(vname, 32, "dl%d_r%d_mag2",eNB_id,round);
|
||||||
write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1);
|
write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1);
|
||||||
|
|
||||||
// printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh);
|
// printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
|
|||||||
#endif
|
#endif
|
||||||
// computing correlation between received DMRS symbols and transmitted sequence for current i_ssb and n_hf
|
// computing correlation between received DMRS symbols and transmitted sequence for current i_ssb and n_hf
|
||||||
for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++)
|
for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++)
|
||||||
nr_pbch_dmrs_correlation(ue,0,0,i,i-pbch_initial_symbol,current_ssb);
|
nr_pbch_dmrs_correlation(ue,proc,0,0,i,i-pbch_initial_symbol,current_ssb);
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->dlsch_channel_estimation_stats);
|
stop_meas(&ue->dlsch_channel_estimation_stats);
|
||||||
#endif
|
#endif
|
||||||
@@ -155,7 +155,7 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
|
|||||||
#endif
|
#endif
|
||||||
// computing channel estimation for selected best ssb
|
// computing channel estimation for selected best ssb
|
||||||
for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++)
|
for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++)
|
||||||
nr_pbch_channel_estimation(ue,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf);
|
nr_pbch_channel_estimation(ue,proc,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf);
|
||||||
#if UE_TIMING_TRACE
|
#if UE_TIMING_TRACE
|
||||||
stop_meas(&ue->dlsch_channel_estimation_stats);
|
stop_meas(&ue->dlsch_channel_estimation_stats);
|
||||||
#endif
|
#endif
|
||||||
@@ -286,16 +286,17 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, runmode_t mode,
|
|||||||
|
|
||||||
for(int i=0; i<4;i++)
|
for(int i=0; i<4;i++)
|
||||||
nr_slot_fep_init_sync(ue,
|
nr_slot_fep_init_sync(ue,
|
||||||
i,
|
proc,
|
||||||
0,
|
i,
|
||||||
is*fp->samples_per_frame+ue->ssb_offset,
|
0,
|
||||||
0);
|
is*fp->samples_per_frame+ue->ssb_offset,
|
||||||
|
0);
|
||||||
|
|
||||||
#ifdef DEBUG_INITIAL_SYNCH
|
#ifdef DEBUG_INITIAL_SYNCH
|
||||||
LOG_I(PHY,"Calling sss detection (normal CP)\n");
|
LOG_I(PHY,"Calling sss detection (normal CP)\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rx_sss_nr(ue,&metric_tdd_ncp,&phase_tdd_ncp);
|
rx_sss_nr(ue, proc, &metric_tdd_ncp, &phase_tdd_ncp);
|
||||||
|
|
||||||
nr_gold_pbch(ue);
|
nr_gold_pbch(ue);
|
||||||
ret = nr_pbch_detection(proc, ue,1,mode); // start pbch detection at first symbol after pss
|
ret = nr_pbch_detection(proc, ue,1,mode); // start pbch detection at first symbol after pss
|
||||||
@@ -318,8 +319,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, runmode_t mode,
|
|||||||
int nb_prefix_samples0 = fp->nb_prefix_samples0;
|
int nb_prefix_samples0 = fp->nb_prefix_samples0;
|
||||||
fp->nb_prefix_samples0 = fp->nb_prefix_samples;
|
fp->nb_prefix_samples0 = fp->nb_prefix_samples;
|
||||||
|
|
||||||
nr_slot_fep(ue,0, 0, ue->ssb_offset, 0, NR_PDCCH_EST);
|
nr_slot_fep(ue, proc, 0, 0, ue->ssb_offset, 0, NR_PDCCH_EST);
|
||||||
nr_slot_fep(ue,1, 0, ue->ssb_offset, 0, NR_PDCCH_EST);
|
nr_slot_fep(ue, proc, 1, 0, ue->ssb_offset, 0, NR_PDCCH_EST);
|
||||||
fp->nb_prefix_samples0 = nb_prefix_samples0;
|
fp->nb_prefix_samples0 = nb_prefix_samples0;
|
||||||
|
|
||||||
LOG_I(PHY,"[UE %d] AUTOTEST Cell Sync : frame = %d, rx_offset %d, freq_offset %d \n",
|
LOG_I(PHY,"[UE %d] AUTOTEST Cell Sync : frame = %d, rx_offset %d, freq_offset %d \n",
|
||||||
|
|||||||
@@ -418,12 +418,11 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
|||||||
UE_nr_rxtx_proc_t *proc,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
NR_UE_PBCH *nr_ue_pbch_vars,
|
NR_UE_PBCH *nr_ue_pbch_vars,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint8_t eNB_id,
|
uint8_t gNB_id,
|
||||||
uint8_t i_ssb,
|
uint8_t i_ssb,
|
||||||
MIMO_mode_t mimo_mode,
|
MIMO_mode_t mimo_mode,
|
||||||
uint32_t high_speed_flag) {
|
uint32_t high_speed_flag) {
|
||||||
|
|
||||||
int Ns = proc->nr_tti_rx;
|
|
||||||
NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars;
|
NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars;
|
||||||
int max_h=0;
|
int max_h=0;
|
||||||
int symbol;
|
int symbol;
|
||||||
@@ -457,15 +456,15 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH
|
||||||
//printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF);
|
//printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF);
|
||||||
write_output("rxdataF0_pbch.m","rxF0pbch",
|
write_output("rxdataF0_pbch.m","rxF0pbch",
|
||||||
&nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[0][(symbol_offset+1)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size*3,1,1);
|
&nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][(symbol_offset+1)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size*3,1,1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// symbol refers to symbol within SSB. symbol_offset is the offset of the SSB wrt start of slot
|
// symbol refers to symbol within SSB. symbol_offset is the offset of the SSB wrt start of slot
|
||||||
for (symbol=1; symbol<4; symbol++) {
|
for (symbol=1; symbol<4; symbol++) {
|
||||||
|
|
||||||
nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF,
|
nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
|
||||||
nr_ue_pbch_vars->dl_ch_estimates,
|
nr_ue_pbch_vars->dl_ch_estimates,
|
||||||
nr_ue_pbch_vars->rxdataF_ext,
|
nr_ue_pbch_vars->rxdataF_ext,
|
||||||
nr_ue_pbch_vars->dl_ch_estimates_ext,
|
nr_ue_pbch_vars->dl_ch_estimates_ext,
|
||||||
@@ -609,11 +608,14 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
|||||||
nr_downlink_indication_t dl_indication;
|
nr_downlink_indication_t dl_indication;
|
||||||
fapi_nr_rx_indication_t rx_ind;
|
fapi_nr_rx_indication_t rx_ind;
|
||||||
|
|
||||||
dl_indication.rx_ind = &rx_ind; // hang on rx_ind instance
|
dl_indication.module_id = ue->Mod_id;
|
||||||
dl_indication.dci_ind = NULL;
|
dl_indication.gNB_index = gNB_id;
|
||||||
dl_indication.proc=proc;
|
dl_indication.cc_id = proc->CC_id;
|
||||||
dl_indication.module_id=0;
|
dl_indication.frame = proc->frame_rx;
|
||||||
dl_indication.cc_id=proc->CC_id;
|
dl_indication.slot = proc->nr_slot_rx;
|
||||||
|
dl_indication.thread_id = proc->thread_id;
|
||||||
|
dl_indication.rx_ind = &rx_ind; // hang on rx_ind instance
|
||||||
|
dl_indication.dci_ind = NULL;
|
||||||
|
|
||||||
rx_ind.rx_indication_body[0].pdu_type = FAPI_NR_RX_PDU_TYPE_MIB;
|
rx_ind.rx_indication_body[0].pdu_type = FAPI_NR_RX_PDU_TYPE_MIB;
|
||||||
rx_ind.rx_indication_body[0].mib_pdu.pdu = &decoded_output[0]; //not good as it is pointing to a memory that can change
|
rx_ind.rx_indication_body[0].mib_pdu.pdu = &decoded_output[0]; //not good as it is pointing to a memory that can change
|
||||||
|
|||||||
@@ -678,7 +678,7 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
uint8_t *pmi_ext,
|
uint8_t *pmi_ext,
|
||||||
uint32_t *rb_alloc,
|
uint32_t *rb_alloc,
|
||||||
uint8_t symbol,
|
uint8_t symbol,
|
||||||
uint8_t subframe,
|
uint8_t nr_slot_rx,
|
||||||
NR_DL_FRAME_PARMS *frame_parms)
|
NR_DL_FRAME_PARMS *frame_parms)
|
||||||
\brief This function extracts the received resource blocks, both channel estimates and data symbols,
|
\brief This function extracts the received resource blocks, both channel estimates and data symbols,
|
||||||
for the current allocation and for single antenna eNB transmission.
|
for the current allocation and for single antenna eNB transmission.
|
||||||
@@ -690,23 +690,10 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
@param pmi_ext Extracted PMI for chosen RBs
|
@param pmi_ext Extracted PMI for chosen RBs
|
||||||
@param rb_alloc RB allocation vector
|
@param rb_alloc RB allocation vector
|
||||||
@param symbol Symbol to extract
|
@param symbol Symbol to extract
|
||||||
@param subframe Subframe number
|
@param nr_slot_rx Slot number
|
||||||
@param vrb_type Flag to indicate distributed VRB type
|
|
||||||
@param high_speed_flag
|
@param high_speed_flag
|
||||||
@param frame_parms Pointer to frame descriptor
|
@param frame_parms Pointer to frame descriptor
|
||||||
*/
|
*/
|
||||||
/*uint16_t nr_dlsch_extract_rbs_single(int32_t **rxdataF,
|
|
||||||
int32_t **dl_ch_estimates,
|
|
||||||
int32_t **rxdataF_ext,
|
|
||||||
int32_t **dl_ch_estimates_ext,
|
|
||||||
uint16_t pmi,
|
|
||||||
uint8_t *pmi_ext,
|
|
||||||
uint32_t *rb_alloc,
|
|
||||||
uint8_t symbol,
|
|
||||||
uint8_t subframe,
|
|
||||||
uint32_t high_speed_flag,
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms);*/
|
|
||||||
|
|
||||||
unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
||||||
int **dl_ch_estimates,
|
int **dl_ch_estimates,
|
||||||
int **rxdataF_ext,
|
int **rxdataF_ext,
|
||||||
@@ -714,10 +701,11 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
|||||||
unsigned short pmi,
|
unsigned short pmi,
|
||||||
unsigned char *pmi_ext,
|
unsigned char *pmi_ext,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
uint8_t pilots,
|
uint8_t pilots,
|
||||||
unsigned short start_rb,
|
uint8_t config_type,
|
||||||
unsigned short nb_pdsch_rb,
|
unsigned short start_rb,
|
||||||
unsigned char nr_tti_rx,
|
unsigned short nb_pdsch_rb,
|
||||||
|
unsigned char nr_slot_rx,
|
||||||
uint32_t high_speed_flag,
|
uint32_t high_speed_flag,
|
||||||
NR_DL_FRAME_PARMS *frame_parms);
|
NR_DL_FRAME_PARMS *frame_parms);
|
||||||
|
|
||||||
@@ -740,7 +728,7 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
|
|||||||
@param pmi_ext Extracted PMI for chosen RBs
|
@param pmi_ext Extracted PMI for chosen RBs
|
||||||
@param rb_alloc RB allocation vector
|
@param rb_alloc RB allocation vector
|
||||||
@param symbol Symbol to extract
|
@param symbol Symbol to extract
|
||||||
@param subframe Subframe index
|
@param nr_slot_rx Slot index
|
||||||
@param high_speed_flag
|
@param high_speed_flag
|
||||||
@param frame_parms Pointer to frame descriptor
|
@param frame_parms Pointer to frame descriptor
|
||||||
*/
|
*/
|
||||||
@@ -754,7 +742,7 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
|
|||||||
uint8_t pilots,
|
uint8_t pilots,
|
||||||
unsigned short start_rb,
|
unsigned short start_rb,
|
||||||
unsigned short nb_rb_pdsch,
|
unsigned short nb_rb_pdsch,
|
||||||
unsigned char nr_tti_rx,
|
unsigned char nr_slot_rx,
|
||||||
uint32_t high_speed_flag,
|
uint32_t high_speed_flag,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
MIMO_mode_t mimo_mode);
|
MIMO_mode_t mimo_mode);
|
||||||
@@ -1002,7 +990,8 @@ void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
|
|||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
NR_UE_DLSCH_t **dlsch_ue,
|
NR_UE_DLSCH_t **dlsch_ue,
|
||||||
uint8_t symbol,
|
uint8_t symbol,
|
||||||
uint8_t start_symbol,
|
uint8_t start_symbol,
|
||||||
|
uint32_t len,
|
||||||
uint16_t nb_rb);
|
uint16_t nb_rb);
|
||||||
|
|
||||||
/** \brief This is the top-level entry point for DLSCH decoding in UE. It should be replicated on several
|
/** \brief This is the top-level entry point for DLSCH decoding in UE. It should be replicated on several
|
||||||
@@ -1017,7 +1006,7 @@ void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
|
|||||||
@param lte_frame_parms Pointer to frame descriptor
|
@param lte_frame_parms Pointer to frame descriptor
|
||||||
@param dlsch Pointer to DLSCH descriptor
|
@param dlsch Pointer to DLSCH descriptor
|
||||||
@param frame Frame number
|
@param frame Frame number
|
||||||
@param subframe Subframe number
|
@param nr_slot_rx Slot number
|
||||||
@param num_pdcch_symbols Number of PDCCH symbols
|
@param num_pdcch_symbols Number of PDCCH symbols
|
||||||
@param is_crnti indicates if PDSCH belongs to a CRNTI (necessary for parallelizing decoding threads)
|
@param is_crnti indicates if PDSCH belongs to a CRNTI (necessary for parallelizing decoding threads)
|
||||||
@param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used
|
@param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used
|
||||||
@@ -1025,13 +1014,15 @@ void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
|
int eNB_id,
|
||||||
short *dlsch_llr,
|
short *dlsch_llr,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
NR_UE_DLSCH_t *dlsch,
|
NR_UE_DLSCH_t *dlsch,
|
||||||
NR_DL_UE_HARQ_t *harq_process,
|
NR_DL_UE_HARQ_t *harq_process,
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
uint16_t nb_symb_sch,
|
uint16_t nb_symb_sch,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_slot_rx,
|
||||||
uint8_t harq_pid,
|
uint8_t harq_pid,
|
||||||
uint8_t is_crnti,
|
uint8_t is_crnti,
|
||||||
uint8_t llr8_flag);
|
uint8_t llr8_flag);
|
||||||
@@ -1081,7 +1072,7 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
|
|
||||||
|
|
||||||
uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
||||||
UE_nr_rxtx_proc_t *proc,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
int eNB_id,
|
int eNB_id,
|
||||||
short *dlsch_llr,
|
short *dlsch_llr,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
@@ -1089,7 +1080,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
NR_DL_UE_HARQ_t *harq_process,
|
NR_DL_UE_HARQ_t *harq_process,
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
uint16_t nb_symb_sch,
|
uint16_t nb_symb_sch,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_slot_rx,
|
||||||
uint8_t harq_pid,
|
uint8_t harq_pid,
|
||||||
uint8_t is_crnti,
|
uint8_t is_crnti,
|
||||||
uint8_t llr8_flag);
|
uint8_t llr8_flag);
|
||||||
@@ -1111,8 +1102,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
uint8_t eNB_id);
|
uint8_t eNB_id);
|
||||||
|
|
||||||
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||||
uint32_t frame,
|
UE_nr_rxtx_proc_t *proc);
|
||||||
uint32_t slot);
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Extract PSS and SSS resource elements
|
/*! \brief Extract PSS and SSS resource elements
|
||||||
@@ -1478,25 +1468,6 @@ void nr_rf_card_config(openair0_config_t *openair0_cfg,
|
|||||||
int freq_offset);
|
int freq_offset);
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Encoding of PUSCH/ACK/RI/ACK from 36-212.
|
|
||||||
@param a Pointer to ulsch SDU
|
|
||||||
@param frame_parms Pointer to Frame parameters
|
|
||||||
@param ulsch Pointer to ulsch descriptor
|
|
||||||
@param harq_pid HARQ process ID
|
|
||||||
@param tmode Transmission mode (1-7)
|
|
||||||
@param control_only_flag Generate PUSCH with control information only
|
|
||||||
@param Nbundled Parameter for ACK/NAK bundling (36.213 Section 7.3)
|
|
||||||
*/
|
|
||||||
uint32_t ulsch_encoding(uint8_t *a,
|
|
||||||
PHY_VARS_NR_UE *phy_vars_ue,
|
|
||||||
uint8_t harq_pid,
|
|
||||||
uint8_t eNB_id,
|
|
||||||
uint8_t subframe_rx,
|
|
||||||
uint8_t tmode,
|
|
||||||
uint8_t control_only_flag,
|
|
||||||
uint8_t Nbundled);
|
|
||||||
|
|
||||||
void print_CQI(void *o,UCI_format_t uci_format,uint8_t eNB_id,int N_RB_DL);
|
void print_CQI(void *o,UCI_format_t uci_format,uint8_t eNB_id,int N_RB_DL);
|
||||||
|
|
||||||
void fill_CQI(NR_UE_ULSCH_t *ulsch,PHY_NR_MEASUREMENTS *meas,uint8_t eNB_id, uint8_t harq_pid,int N_RB_DL, rnti_t rnti, uint8_t trans_mode,double sinr_eff);
|
void fill_CQI(NR_UE_ULSCH_t *ulsch,PHY_NR_MEASUREMENTS *meas,uint8_t eNB_id, uint8_t harq_pid,int N_RB_DL, rnti_t rnti, uint8_t trans_mode,double sinr_eff);
|
||||||
@@ -1720,9 +1691,8 @@ uint8_t get_prach_prb_offset(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset);
|
uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset);
|
||||||
|
|
||||||
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
||||||
int frame,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
int slot,
|
fapi_nr_dci_indication_t *dci_ind);
|
||||||
fapi_nr_dci_indication_t *dci_ind);
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief This function is the top-level entry point to PDSCH demodulation, after frequency-domain transformation and channel estimation. It performs
|
/** \brief This function is the top-level entry point to PDSCH demodulation, after frequency-domain transformation and channel estimation. It performs
|
||||||
@@ -1737,36 +1707,25 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
|||||||
@param eNB_id eNb index (Nid1) 0,1,2
|
@param eNB_id eNb index (Nid1) 0,1,2
|
||||||
@param eNB_id_i Interfering eNB index (Nid1) 0,1,2, or 3 in case of MU-MIMO IC receiver
|
@param eNB_id_i Interfering eNB index (Nid1) 0,1,2, or 3 in case of MU-MIMO IC receiver
|
||||||
@param frame Frame number
|
@param frame Frame number
|
||||||
@param nr_tti_rx Subframe number
|
@param nr_slot_rx Slot number
|
||||||
@param symbol Symbol on which to act (within sub-frame)
|
@param symbol Symbol on which to act (within sub-frame)
|
||||||
@param first_symbol_flag set to 1 on first DLSCH symbol
|
@param first_symbol_flag set to 1 on first DLSCH symbol
|
||||||
@param rx_type. rx_type=RX_IC_single_stream will enable interference cancellation of a second stream when decoding the first stream. In case of TM1, 2, 5, and this can cancel interference from a neighbouring cell given by eNB_id_i. In case of TM5, eNB_id_i should be set to n_connected_eNB to perform multi-user interference cancellation. In case of TM3, eNB_id_i should be set to eNB_id to perform co-channel interference cancellation; this option should be used together with an interference cancellation step [...]. In case of TM3, if rx_type=RX_IC_dual_stream, both streams will be decoded by applying the IC single stream receiver twice.
|
@param rx_type. rx_type=RX_IC_single_stream will enable interference cancellation of a second stream when decoding the first stream. In case of TM1, 2, 5, and this can cancel interference from a neighbouring cell given by eNB_id_i. In case of TM5, eNB_id_i should be set to n_connected_eNB to perform multi-user interference cancellation. In case of TM3, eNB_id_i should be set to eNB_id to perform co-channel interference cancellation; this option should be used together with an interference cancellation step [...]. In case of TM3, if rx_type=RX_IC_dual_stream, both streams will be decoded by applying the IC single stream receiver twice.
|
||||||
@param i_mod Modulation order of the interfering stream
|
@param i_mod Modulation order of the interfering stream
|
||||||
*/
|
*/
|
||||||
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
PDSCH_t type,
|
PDSCH_t type,
|
||||||
unsigned char eNB_id,
|
unsigned char eNB_id,
|
||||||
unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference
|
unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_slot_rx,
|
||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
unsigned char first_symbol_flag,
|
unsigned char first_symbol_flag,
|
||||||
RX_type_t rx_type,
|
RX_type_t rx_type,
|
||||||
unsigned char i_mod,
|
unsigned char i_mod,
|
||||||
unsigned char harq_pid);
|
unsigned char harq_pid);
|
||||||
|
|
||||||
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|
||||||
short *dlsch_llr,
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
|
||||||
NR_UE_DLSCH_t *dlsch,
|
|
||||||
NR_DL_UE_HARQ_t *harq_process,
|
|
||||||
uint32_t frame,
|
|
||||||
uint16_t nb_symb_sch,
|
|
||||||
uint8_t nr_tti_rx,
|
|
||||||
uint8_t harq_pid,
|
|
||||||
uint8_t is_crnti,
|
|
||||||
uint8_t llr8_flag);
|
|
||||||
|
|
||||||
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t subframe);
|
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t subframe);
|
||||||
|
|
||||||
void *dlsch_thread(void *arg);
|
void *dlsch_thread(void *arg);
|
||||||
|
|||||||
@@ -360,7 +360,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
|
|
||||||
ptrs_idx++;
|
ptrs_idx++;
|
||||||
|
|
||||||
} else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, cdm_grps_no_data, dmrs_type)) {
|
} else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, frame_parms->ofdm_symbol_size, cdm_grps_no_data, dmrs_type)) {
|
||||||
|
|
||||||
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = ((int16_t *) ulsch_ue->y)[m<<1];
|
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = ((int16_t *) ulsch_ue->y)[m<<1];
|
||||||
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) ulsch_ue->y)[(m<<1) + 1];
|
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) ulsch_ue->y)[(m<<1) + 1];
|
||||||
|
|||||||
@@ -57,14 +57,14 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
|
|||||||
long pucch_GroupHopping,
|
long pucch_GroupHopping,
|
||||||
long hoppingId,
|
long hoppingId,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t m0,
|
uint8_t m0,
|
||||||
uint8_t mcs,
|
uint8_t mcs,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
uint16_t startingPRB) {
|
uint16_t startingPRB) {
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch0] start function at slot(nr_tti_tx)=%d\n",nr_tti_tx);
|
printf("\t [nr_generate_pucch0] start function at slot(nr_slot_tx)=%d\n",nr_slot_tx);
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* Implement TS 38.211 Subclause 6.3.2.3.1 Sequence generation
|
* Implement TS 38.211 Subclause 6.3.2.3.1 Sequence generation
|
||||||
@@ -112,8 +112,8 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
|
|||||||
for (int l=0; l<nrofSymbols; l++) {
|
for (int l=0; l<nrofSymbols; l++) {
|
||||||
// if frequency hopping is enabled n_hop = 1 for second hop. Not sure frequency hopping concerns format 0. FIXME!!!
|
// if frequency hopping is enabled n_hop = 1 for second hop. Not sure frequency hopping concerns format 0. FIXME!!!
|
||||||
// if ((PUCCH_Frequency_Hopping == 1)&&(l == (nrofSymbols-1))) n_hop = 1;
|
// if ((PUCCH_Frequency_Hopping == 1)&&(l == (nrofSymbols-1))) n_hop = 1;
|
||||||
nr_group_sequence_hopping(pucch_GroupHopping,hoppingId,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
|
nr_group_sequence_hopping(pucch_GroupHopping,hoppingId,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
|
||||||
alpha = nr_cyclic_shift_hopping(hoppingId,m0,mcs,l,startingSymbolIndex,nr_tti_tx);
|
alpha = nr_cyclic_shift_hopping(hoppingId,m0,mcs,l,startingSymbolIndex,nr_slot_tx);
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d)\n",u,v,alpha,l);
|
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d)\n",u,v,alpha,l);
|
||||||
#endif
|
#endif
|
||||||
@@ -170,7 +170,7 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t m0,
|
uint8_t m0,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
@@ -179,8 +179,8 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
|
|||||||
uint8_t timeDomainOCC,
|
uint8_t timeDomainOCC,
|
||||||
uint8_t nr_bit) {
|
uint8_t nr_bit) {
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch1] start function at slot(nr_tti_tx)=%d payload=%lu m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d startingPRB_intraSlotHopping=%d timeDomainOCC=%d nr_bit=%d\n",
|
printf("\t [nr_generate_pucch1] start function at slot(nr_slot_tx)=%d payload=%lu m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d startingPRB_intraSlotHopping=%d timeDomainOCC=%d nr_bit=%d\n",
|
||||||
nr_tti_tx,payload,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
nr_slot_tx,payload,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* Implement TS 38.211 Subclause 6.3.2.4.1 Sequence modulation
|
* Implement TS 38.211 Subclause 6.3.2.4.1 Sequence modulation
|
||||||
@@ -283,11 +283,11 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
|
|||||||
if ((intraSlotFrequencyHopping == 1) && (l >= (int)floor(nrofSymbols/2))) n_hop = 1; // n_hop = 1 for second hop
|
if ((intraSlotFrequencyHopping == 1) && (l >= (int)floor(nrofSymbols/2))) n_hop = 1; // n_hop = 1 for second hop
|
||||||
|
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with n_hop=%d, nr_tti_tx=%d\n",
|
printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with n_hop=%d, nr_slot_tx=%d\n",
|
||||||
n_hop,nr_tti_tx);
|
n_hop,nr_slot_tx);
|
||||||
#endif
|
#endif
|
||||||
nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
|
nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
|
||||||
alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,lprime,nr_tti_tx);
|
alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,lprime,nr_slot_tx);
|
||||||
|
|
||||||
for (int n=0; n<12; n++) {
|
for (int n=0; n<12; n++) {
|
||||||
r_u_v_alpha_delta_re[n] = (int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)
|
r_u_v_alpha_delta_re[n] = (int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)
|
||||||
@@ -505,7 +505,7 @@ void nr_generate_pucch1_old(PHY_VARS_NR_UE *ue,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t m0,
|
uint8_t m0,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
@@ -514,8 +514,8 @@ void nr_generate_pucch1_old(PHY_VARS_NR_UE *ue,
|
|||||||
uint8_t timeDomainOCC,
|
uint8_t timeDomainOCC,
|
||||||
uint8_t nr_bit) {
|
uint8_t nr_bit) {
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch1] start function at slot(nr_tti_tx)=%d payload=%d m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d startingPRB_intraSlotHopping=%d timeDomainOCC=%d nr_bit=%d\n",
|
printf("\t [nr_generate_pucch1] start function at slot(nr_slot_tx)=%d payload=%d m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d startingPRB_intraSlotHopping=%d timeDomainOCC=%d nr_bit=%d\n",
|
||||||
nr_tti_tx,payload,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
nr_slot_tx,payload,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* Implement TS 38.211 Subclause 6.3.2.4.1 Sequence modulation
|
* Implement TS 38.211 Subclause 6.3.2.4.1 Sequence modulation
|
||||||
@@ -603,11 +603,11 @@ void nr_generate_pucch1_old(PHY_VARS_NR_UE *ue,
|
|||||||
// y_n contains the complex value d multiplied by the sequence r_u_v
|
// y_n contains the complex value d multiplied by the sequence r_u_v
|
||||||
int16_t y_n_re[12],y_n_im[12];
|
int16_t y_n_re[12],y_n_im[12];
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with n_hop=%d, nr_tti_tx=%d\n",
|
printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with n_hop=%d, nr_slot_tx=%d\n",
|
||||||
n_hop,nr_tti_tx);
|
n_hop,nr_slot_tx);
|
||||||
#endif
|
#endif
|
||||||
nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
|
nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
|
||||||
alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,lnormal,lprime,nr_tti_tx);
|
alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,lnormal,lprime,nr_slot_tx);
|
||||||
|
|
||||||
for (int n=0; n<12; n++) {
|
for (int n=0; n<12; n++) {
|
||||||
r_u_v_alpha_delta_re[n] = (int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)
|
r_u_v_alpha_delta_re[n] = (int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)
|
||||||
@@ -806,7 +806,7 @@ inline void nr_pucch2_3_4_scrambling(uint16_t M_bit,uint16_t rnti,uint16_t n_id,
|
|||||||
int i;
|
int i;
|
||||||
uint8_t c;
|
uint8_t c;
|
||||||
// c_init=nRNTI*2^15+n_id according to TS 38.211 Subclause 6.3.2.6.1
|
// c_init=nRNTI*2^15+n_id according to TS 38.211 Subclause 6.3.2.6.1
|
||||||
//x2 = (rnti) + ((uint32_t)(1+nr_tti_tx)<<16)*(1+(fp->Nid_cell<<1));
|
//x2 = (rnti) + ((uint32_t)(1+nr_slot_tx)<<16)*(1+(fp->Nid_cell<<1));
|
||||||
x2 = ((rnti)<<15)+n_id;
|
x2 = ((rnti)<<15)+n_id;
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t\t [nr_pucch2_3_4_scrambling] gold sequence s=%x, M_bit %d\n",s,M_bit);
|
printf("\t\t [nr_pucch2_3_4_scrambling] gold sequence s=%x, M_bit %d\n",s,M_bit);
|
||||||
@@ -960,14 +960,14 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
uint8_t nrofPRB,
|
uint8_t nrofPRB,
|
||||||
uint16_t startingPRB,
|
uint16_t startingPRB,
|
||||||
uint8_t nr_bit) {
|
uint8_t nr_bit) {
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch2] start function at slot(nr_tti_tx)=%d with payload=%lu and nr_bit=%d\n",nr_tti_tx, payload, nr_bit);
|
printf("\t [nr_generate_pucch2] start function at slot(nr_slot_tx)=%d with payload=%lu and nr_bit=%d\n",nr_slot_tx, payload, nr_bit);
|
||||||
#endif
|
#endif
|
||||||
// b is the block of bits transmitted on the physical channel after payload coding
|
// b is the block of bits transmitted on the physical channel after payload coding
|
||||||
uint64_t b[16]; // limit to 1024-bit encoded length
|
uint64_t b[16]; // limit to 1024-bit encoded length
|
||||||
@@ -1043,7 +1043,7 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
|
|||||||
int m=0;
|
int m=0;
|
||||||
|
|
||||||
for (int l=0; l<nrofSymbols; l++) {
|
for (int l=0; l<nrofSymbols; l++) {
|
||||||
x2 = (((1<<17)*((14*nr_tti_tx) + (l+startingSymbolIndex) + 1)*((2*dmrs_scrambling_id) + 1)) + (2*dmrs_scrambling_id))%(1U<<31); // c_init calculation according to TS38.211 subclause
|
x2 = (((1<<17)*((14*nr_slot_tx) + (l+startingSymbolIndex) + 1)*((2*dmrs_scrambling_id) + 1)) + (2*dmrs_scrambling_id))%(1U<<31); // c_init calculation according to TS38.211 subclause
|
||||||
|
|
||||||
int reset = 1;
|
int reset = 1;
|
||||||
for (int ii=0; ii<=(startingPRB>>2); ii++) {
|
for (int ii=0; ii<=(startingPRB>>2); ii++) {
|
||||||
@@ -1130,7 +1130,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
uint8_t nrofPRB,
|
uint8_t nrofPRB,
|
||||||
@@ -1140,7 +1140,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
|
|||||||
uint8_t occ_length_format4,
|
uint8_t occ_length_format4,
|
||||||
uint8_t occ_index_format4) {
|
uint8_t occ_index_format4) {
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch3_4] start function at slot(nr_tti_tx)=%d with payload=%lu and nr_bit=%d\n", nr_tti_tx, payload, nr_bit);
|
printf("\t [nr_generate_pucch3_4] start function at slot(nr_slot_tx)=%d with payload=%lu and nr_bit=%d\n", nr_slot_tx, payload, nr_bit);
|
||||||
#endif
|
#endif
|
||||||
// b is the block of bits transmitted on the physical channel after payload coding
|
// b is the block of bits transmitted on the physical channel after payload coding
|
||||||
uint64_t b[16];
|
uint64_t b[16];
|
||||||
@@ -1455,7 +1455,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
|
|||||||
for (int l=0; l<nrofSymbols; l++) {
|
for (int l=0; l<nrofSymbols; l++) {
|
||||||
if ((intraSlotFrequencyHopping == 1) && (l >= (int)floor(nrofSymbols/2))) n_hop = 1; // n_hop = 1 for second hop
|
if ((intraSlotFrequencyHopping == 1) && (l >= (int)floor(nrofSymbols/2))) n_hop = 1; // n_hop = 1 for second hop
|
||||||
|
|
||||||
nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
|
nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
|
||||||
|
|
||||||
// Next we proceed to calculate base sequence for DM-RS signal, according to TS 38.211 subclause 6.4.1.33
|
// Next we proceed to calculate base sequence for DM-RS signal, according to TS 38.211 subclause 6.4.1.33
|
||||||
if (nrofPRB >= 3) { // TS 38.211 subclause 5.2.2.1 (Base sequences of length 36 or larger) applies
|
if (nrofPRB >= 3) { // TS 38.211 subclause 5.2.2.1 (Base sequences of length 36 or larger) applies
|
||||||
@@ -1501,7 +1501,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint16_t j=0;
|
uint16_t j=0;
|
||||||
alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,startingSymbolIndex,nr_tti_tx);
|
alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,startingSymbolIndex,nr_slot_tx);
|
||||||
|
|
||||||
for (int rb=0; rb<nrofPRB; rb++) {
|
for (int rb=0; rb<nrofPRB; rb++) {
|
||||||
if ((intraSlotFrequencyHopping == 1) && (l<floor(nrofSymbols/2))) { // intra-slot hopping enabled, we need to calculate new offset PRB
|
if ((intraSlotFrequencyHopping == 1) && (l<floor(nrofSymbols/2))) { // intra-slot hopping enabled, we need to calculate new offset PRB
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
|
|||||||
long pucch_GroupHopping,
|
long pucch_GroupHopping,
|
||||||
long hoppingId,
|
long hoppingId,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t m0,
|
uint8_t m0,
|
||||||
uint8_t mcs,
|
uint8_t mcs,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
@@ -64,7 +64,7 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t m0,
|
uint8_t m0,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
@@ -81,7 +81,7 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
uint8_t nrofPRB,
|
uint8_t nrofPRB,
|
||||||
@@ -95,7 +95,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
uint8_t nrofPRB,
|
uint8_t nrofPRB,
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ int32_t generate_srs_nr(SRS_ResourceSet_t *p_srs_resource_set,
|
|||||||
uint32_t f_gh = 0;
|
uint32_t f_gh = 0;
|
||||||
SRS_Resource_t *p_SRS_Resource;
|
SRS_Resource_t *p_SRS_Resource;
|
||||||
int frame_number = proc->frame_tx;
|
int frame_number = proc->frame_tx;
|
||||||
int slot_number = proc->nr_tti_tx;
|
int slot_number = proc->nr_slot_tx;
|
||||||
uint16_t n_SRS, n_SRS_cs_i;
|
uint16_t n_SRS, n_SRS_cs_i;
|
||||||
double alpha_i;
|
double alpha_i;
|
||||||
uint8_t K_TC_p;
|
uint8_t K_TC_p;
|
||||||
@@ -445,7 +445,7 @@ int ue_srs_procedure_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB
|
|||||||
/* SRS resource configurated ? */
|
/* SRS resource configurated ? */
|
||||||
if (p_srs_resource != NULL) {
|
if (p_srs_resource != NULL) {
|
||||||
if (p_srs_resource_set->resourceType == periodic) {
|
if (p_srs_resource_set->resourceType == periodic) {
|
||||||
if (is_srs_period_nr(p_srs_resource, frame_parms, proc->frame_tx, proc->nr_tti_tx) == 0) {
|
if (is_srs_period_nr(p_srs_resource, frame_parms, proc->frame_tx, proc->nr_slot_tx) == 0) {
|
||||||
generate_srs = 1;
|
generate_srs = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -459,7 +459,7 @@ int ue_srs_procedure_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB
|
|||||||
if (generate_srs == 1) {
|
if (generate_srs == 1) {
|
||||||
int16_t txptr = AMP;
|
int16_t txptr = AMP;
|
||||||
uint16_t nsymb = (ue->frame_parms.Ncp==0) ? 14:12;
|
uint16_t nsymb = (ue->frame_parms.Ncp==0) ? 14:12;
|
||||||
uint16_t symbol_offset = (int)ue->frame_parms.ofdm_symbol_size*((proc->nr_tti_tx*nsymb)+(nsymb-1));
|
uint16_t symbol_offset = (int)ue->frame_parms.ofdm_symbol_size*((proc->nr_slot_tx*nsymb)+(nsymb-1));
|
||||||
if (generate_srs_nr(p_srs_resource_set, frame_parms, &ue->common_vars.txdataF[eNB_id][symbol_offset], txptr, proc) == 0) {
|
if (generate_srs_nr(p_srs_resource_set, frame_parms, &ue->common_vars.txdataF[eNB_id][symbol_offset], txptr, proc) == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -314,6 +314,7 @@ int pss_ch_est_nr(PHY_VARS_NR_UE *ue,
|
|||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
|
int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
|
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
|
||||||
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
|
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
|
||||||
uint8_t doPss, uint8_t doSss,
|
uint8_t doPss, uint8_t doSss,
|
||||||
@@ -331,7 +332,7 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
|
|||||||
pss_symbol = 0;
|
pss_symbol = 0;
|
||||||
sss_symbol = SSS_SYMBOL_NB-PSS_SYMBOL_NB;
|
sss_symbol = SSS_SYMBOL_NB-PSS_SYMBOL_NB;
|
||||||
|
|
||||||
rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF;
|
rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||||
|
|
||||||
unsigned int ofdm_symbol_size = frame_parms->ofdm_symbol_size;
|
unsigned int ofdm_symbol_size = frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
@@ -386,7 +387,7 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
*
|
*
|
||||||
* NAME : rx_sss_nr
|
* NAME : pss_sss_extract_nr
|
||||||
*
|
*
|
||||||
* PARAMETERS : none
|
* PARAMETERS : none
|
||||||
*
|
*
|
||||||
@@ -397,11 +398,12 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
|
|||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue,
|
int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
|
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
|
||||||
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
|
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
|
||||||
uint8_t subframe)
|
uint8_t subframe)
|
||||||
{
|
{
|
||||||
return do_pss_sss_extract_nr(phy_vars_ue, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe);
|
return do_pss_sss_extract_nr(phy_vars_ue, proc, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
@@ -417,7 +419,7 @@ int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
*
|
*
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
|
int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric, uint8_t *phase_max)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR];
|
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR];
|
||||||
@@ -433,6 +435,7 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
|
|||||||
|
|
||||||
// pss sss extraction
|
// pss sss extraction
|
||||||
pss_sss_extract_nr(ue,
|
pss_sss_extract_nr(ue,
|
||||||
|
proc,
|
||||||
pss_ext,
|
pss_ext,
|
||||||
sss_ext,
|
sss_ext,
|
||||||
0); /* subframe */
|
0); /* subframe */
|
||||||
@@ -440,8 +443,8 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
|
|||||||
#ifdef DEBUG_PLOT_SSS
|
#ifdef DEBUG_PLOT_SSS
|
||||||
|
|
||||||
write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][0],ue->frame_parms.samples_per_subframe,1,1);
|
write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][0],ue->frame_parms.samples_per_subframe,1,1);
|
||||||
write_output("rxdataF0_pss.m","rxF0_pss",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[0]].rxdataF[0][0],frame_parms->ofdm_symbol_size,1,1);
|
write_output("rxdataF0_pss.m","rxF0_pss",&ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0],frame_parms->ofdm_symbol_size,1,1);
|
||||||
write_output("rxdataF0_sss.m","rxF0_sss",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[0]].rxdataF[0][(SSS_SYMBOL_NB-PSS_SYMBOL_NB)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
|
write_output("rxdataF0_sss.m","rxF0_sss",&ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][(SSS_SYMBOL_NB-PSS_SYMBOL_NB)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
|
||||||
write_output("pss_ext.m","pss_ext",pss_ext,LENGTH_PSS_NR,1,1);
|
write_output("pss_ext.m","pss_ext",pss_ext,LENGTH_PSS_NR,1,1);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -848,9 +848,6 @@ typedef struct {
|
|||||||
/// UE FAPI indication for DCI reception
|
/// UE FAPI indication for DCI reception
|
||||||
//fapi_nr_dci_indication_t dci_ind;
|
//fapi_nr_dci_indication_t dci_ind;
|
||||||
|
|
||||||
// point to the current rxTx thread index
|
|
||||||
uint8_t current_thread_id[NR_MAX_SLOTS_PER_FRAME];
|
|
||||||
|
|
||||||
t_nrPolar_params *polarList;
|
t_nrPolar_params *polarList;
|
||||||
NR_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
|
NR_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
|
||||||
NR_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
NR_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
|
|||||||
@@ -496,8 +496,8 @@ typedef struct{ // CSI-MeasConfig IE is used to configure CSI-RS (reference sign
|
|||||||
uint8_t reportTriggerSize;
|
uint8_t reportTriggerSize;
|
||||||
} csi_MeasConfig_t;
|
} csi_MeasConfig_t;
|
||||||
typedef enum {
|
typedef enum {
|
||||||
pdsch_dmrs_type1 = 1,
|
pdsch_dmrs_type1 = 0,
|
||||||
pdsch_dmrs_type2 = 2
|
pdsch_dmrs_type2 = 1
|
||||||
} pdsch_dmrs_type_t;
|
} pdsch_dmrs_type_t;
|
||||||
typedef enum {
|
typedef enum {
|
||||||
pusch_dmrs_type1 = 0,
|
pusch_dmrs_type1 = 0,
|
||||||
|
|||||||
@@ -4,26 +4,18 @@
|
|||||||
#include <targets/ARCH/COMMON/common_lib.h>
|
#include <targets/ARCH/COMMON/common_lib.h>
|
||||||
/// Context data structure for RX/TX portion of subframe processing
|
/// Context data structure for RX/TX portion of subframe processing
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// index of the current UE RX/TX proc
|
/// index of the current UE RX/TX thread
|
||||||
int proc_id;
|
int thread_id;
|
||||||
/// Component Carrier index
|
/// Component Carrier index
|
||||||
uint8_t CC_id;
|
uint8_t CC_id;
|
||||||
/// timestamp transmitted to HW
|
/// timestamp transmitted to HW
|
||||||
openair0_timestamp timestamp_tx;
|
openair0_timestamp timestamp_tx;
|
||||||
//#ifdef UE_NR_PHY_DEMO
|
//#ifdef UE_NR_PHY_DEMO
|
||||||
/// NR TTI index within subframe_tx [0 .. slots_per_subframe - 1] to act upon for transmission
|
|
||||||
int nr_tti_tx;
|
|
||||||
/// NR TTI index within subframe_rx [0 .. slots_per_subframe - 1] to act upon for reception
|
|
||||||
int nr_tti_rx;
|
|
||||||
/// NR slot index within frame_tx [0 .. slots_per_frame - 1] to act upon for transmission
|
/// NR slot index within frame_tx [0 .. slots_per_frame - 1] to act upon for transmission
|
||||||
int nr_slot_tx;
|
int nr_slot_tx;
|
||||||
/// NR slot index within frame_rx [0 .. slots_per_frame - 1] to act upon for transmission
|
/// NR slot index within frame_rx [0 .. slots_per_frame - 1] to act upon for transmission
|
||||||
int nr_slot_rx;
|
int nr_slot_rx;
|
||||||
//#endif
|
//#endif
|
||||||
/// subframe to act upon for transmission
|
|
||||||
int subframe_tx;
|
|
||||||
/// subframe to act upon for reception
|
|
||||||
int subframe_rx;
|
|
||||||
/// frame to act upon for transmission
|
/// frame to act upon for transmission
|
||||||
int frame_tx;
|
int frame_tx;
|
||||||
/// frame to act upon for reception
|
/// frame to act upon for reception
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms) {
|
|||||||
*
|
*
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti) {
|
int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_slot) {
|
||||||
/* for FFD all slot can be considered as an uplink */
|
/* for FFD all slot can be considered as an uplink */
|
||||||
int mu = cfg->ssb_config.scs_common.value,check_slot=0;
|
int mu = cfg->ssb_config.scs_common.value,check_slot=0;
|
||||||
|
|
||||||
@@ -318,7 +318,7 @@ int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti)
|
|||||||
|
|
||||||
if (nr_frame%2 == 0) {
|
if (nr_frame%2 == 0) {
|
||||||
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
||||||
if (cfg->tdd_table.max_tdd_periodicity_list[nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) {
|
if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) {
|
||||||
check_slot++;
|
check_slot++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -330,7 +330,7 @@ int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti)
|
|||||||
check_slot = 0;
|
check_slot = 0;
|
||||||
|
|
||||||
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
||||||
if (cfg->tdd_table.max_tdd_periodicity_list[nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) {
|
if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) {
|
||||||
check_slot++;
|
check_slot++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -342,7 +342,7 @@ int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
||||||
if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) {
|
if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) {
|
||||||
check_slot++;
|
check_slot++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -354,7 +354,7 @@ int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti)
|
|||||||
check_slot = 0;
|
check_slot = 0;
|
||||||
|
|
||||||
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
||||||
if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) {
|
if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) {
|
||||||
check_slot++;
|
check_slot++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,10 +75,10 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms);
|
|||||||
/** \brief This function checks nr slot direction : downlink or uplink
|
/** \brief This function checks nr slot direction : downlink or uplink
|
||||||
* @param frame_parms NR DL Frame parameters
|
* @param frame_parms NR DL Frame parameters
|
||||||
* @param nr_frame : frame number
|
* @param nr_frame : frame number
|
||||||
* @param nr_tti : slot number
|
* @param nr_slot : slot number
|
||||||
@returns int : downlink, uplink or mixed slot type*/
|
@returns int : downlink, uplink or mixed slot type*/
|
||||||
|
|
||||||
int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti);
|
int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_slot);
|
||||||
|
|
||||||
/** \brief This function frees tdd configuration for nr
|
/** \brief This function frees tdd configuration for nr
|
||||||
* @param frame_parms NR DL Frame parameters
|
* @param frame_parms NR DL Frame parameters
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
|
|||||||
// if all segments are done
|
// if all segments are done
|
||||||
if (rdata->nbSegments == ulsch_harq->processedSegments) {
|
if (rdata->nbSegments == ulsch_harq->processedSegments) {
|
||||||
if (decodeSuccess) {
|
if (decodeSuccess) {
|
||||||
LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d TBS %d\n",
|
LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n",
|
||||||
gNB->Mod_id,ulsch_harq->slot,ulsch_harq->TBS);
|
gNB->Mod_id,ulsch_harq->slot,ulsch_harq->TBS);
|
||||||
ulsch_harq->status = SCH_IDLE;
|
ulsch_harq->status = SCH_IDLE;
|
||||||
ulsch_harq->round = 0;
|
ulsch_harq->round = 0;
|
||||||
|
|||||||
@@ -103,14 +103,11 @@ void phy_procedures_UE_lte(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
|
|||||||
int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type);
|
int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type);
|
||||||
|
|
||||||
/*! \brief Scheduling for UE TX procedures in normal subframes.
|
/*! \brief Scheduling for UE TX procedures in normal subframes.
|
||||||
@param phy_vars_ue Pointer to UE variables on which to act
|
@param ue Pointer to UE variables on which to act
|
||||||
@param proc Pointer to RXn-TXnp4 proc information
|
@param proc Pointer to RXn-TXnp4 proc information
|
||||||
@param eNB_id Local id of eNB on which to act
|
@param eNB_id Local id of eNB on which to act
|
||||||
@param abstraction_flag Indicator of PHY abstraction
|
|
||||||
@param mode calib/normal mode
|
|
||||||
@param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
|
|
||||||
*/
|
*/
|
||||||
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id, uint8_t thread_id);
|
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB_id);
|
||||||
|
|
||||||
/*! \brief Scheduling for UE RX procedures in normal subframes.
|
/*! \brief Scheduling for UE RX procedures in normal subframes.
|
||||||
@param ue Pointer to UE variables on which to act
|
@param ue Pointer to UE variables on which to act
|
||||||
@@ -306,7 +303,7 @@ int8_t nr_find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
|||||||
@param mu numerology index (0,1,2..)
|
@param mu numerology index (0,1,2..)
|
||||||
*/
|
*/
|
||||||
void nr_process_timing_advance(module_id_t Mod_id,uint8_t CC_id,uint8_t ta_command, uint8_t mu, uint16_t bwp_ul_NB_RB);
|
void nr_process_timing_advance(module_id_t Mod_id,uint8_t CC_id,uint8_t ta_command, uint8_t mu, uint16_t bwp_ul_NB_RB);
|
||||||
void nr_process_timing_advance_rar(PHY_VARS_NR_UE *phy_vars_ue,UE_nr_rxtx_proc_t *proc,uint16_t timing_advance);
|
void nr_process_timing_advance_rar(PHY_VARS_NR_UE *ue, int frame_rx, int nr_slot_rx, uint16_t ta_command);
|
||||||
|
|
||||||
unsigned int nr_get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb);
|
unsigned int nr_get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb);
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
|||||||
int slot = scheduled_response->slot;
|
int slot = scheduled_response->slot;
|
||||||
|
|
||||||
// Note: we have to handle the thread IDs for this. To be revisited completely.
|
// Note: we have to handle the thread IDs for this. To be revisited completely.
|
||||||
thread_id = PHY_vars_UE_g[module_id][cc_id]->current_thread_id[slot];
|
thread_id = scheduled_response->thread_id;
|
||||||
NR_UE_DLSCH_t *dlsch0 = NULL;
|
NR_UE_DLSCH_t *dlsch0 = NULL;
|
||||||
NR_UE_PDCCH *pdcch_vars = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0];
|
NR_UE_PDCCH *pdcch_vars = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0];
|
||||||
NR_UE_ULSCH_t *ulsch0 = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0][0];
|
NR_UE_ULSCH_t *ulsch0 = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0][0];
|
||||||
|
|||||||
@@ -73,12 +73,12 @@
|
|||||||
@param nr_dci_info_extracted extracted information from dci
|
@param nr_dci_info_extracted extracted information from dci
|
||||||
@param dlsch downlink context
|
@param dlsch downlink context
|
||||||
@param ulsch uplink context
|
@param ulsch uplink context
|
||||||
@param nr_tti_rx rx slot
|
@param nr_slot_rx rx slot
|
||||||
@param tx_offset slot offset for tx
|
@param tx_offset slot offset for tx
|
||||||
@returns none */
|
@returns none */
|
||||||
|
|
||||||
void get_dci_info_for_harq(PHY_VARS_NR_UE *ue, NR_DCI_INFO_EXTRACTED_t *nr_dci_info_extracted,
|
void get_dci_info_for_harq(PHY_VARS_NR_UE *ue, NR_DCI_INFO_EXTRACTED_t *nr_dci_info_extracted,
|
||||||
NR_UE_DLSCH_t **dlsch, NR_UE_ULSCH_t *ulsch, uint8_t nr_tti_rx, uint8_t tx_offset);
|
NR_UE_DLSCH_t **dlsch, NR_UE_ULSCH_t *ulsch, uint8_t nr_slot_rx, uint8_t tx_offset);
|
||||||
|
|
||||||
/** \brief This function configures uplink HARQ context
|
/** \brief This function configures uplink HARQ context
|
||||||
@param PHY_VARS_NR_UE ue context
|
@param PHY_VARS_NR_UE ue context
|
||||||
|
|||||||
@@ -61,18 +61,18 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms);
|
|||||||
/** \brief This function checks nr slot direction : downlink or uplink
|
/** \brief This function checks nr slot direction : downlink or uplink
|
||||||
* @param frame_parms NR DL Frame parameters
|
* @param frame_parms NR DL Frame parameters
|
||||||
* @param nr_frame : frame number
|
* @param nr_frame : frame number
|
||||||
* @param nr_tti : slot number
|
* @param nr_slot : slot number
|
||||||
@returns int : downlink or uplink */
|
@returns int : downlink or uplink */
|
||||||
|
|
||||||
int slot_select_nr(NR_DL_FRAME_PARMS *frame_parms, int nr_frame, int nr_tti);
|
int slot_select_nr(NR_DL_FRAME_PARMS *frame_parms, int nr_frame, int nr_slot);
|
||||||
|
|
||||||
/** \brief This function checks nr UE slot direction : downlink or uplink
|
/** \brief This function checks nr UE slot direction : downlink or uplink
|
||||||
* @param cfg : FAPI Config Request
|
* @param cfg : FAPI Config Request
|
||||||
* @param nr_frame : frame number
|
* @param nr_frame : frame number
|
||||||
* @param nr_tti : slot number
|
* @param nr_slot : slot number
|
||||||
@returns int : downlink, uplink or mixed slot type */
|
@returns int : downlink, uplink or mixed slot type */
|
||||||
|
|
||||||
int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti);
|
int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_slot);
|
||||||
|
|
||||||
/** \brief This function frees tdd configuration for nr
|
/** \brief This function frees tdd configuration for nr
|
||||||
* @param frame_parms NR DL Frame parameters
|
* @param frame_parms NR DL Frame parameters
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
*
|
*
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti) {
|
int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_slot) {
|
||||||
/* for FFD all slot can be considered as an uplink */
|
/* for FFD all slot can be considered as an uplink */
|
||||||
int mu = cfg->ssb_config.scs_common, check_slot = 0;
|
int mu = cfg->ssb_config.scs_common, check_slot = 0;
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti) {
|
|||||||
|
|
||||||
if (nr_frame%2 == 0) {
|
if (nr_frame%2 == 0) {
|
||||||
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
||||||
if (cfg->tdd_table.max_tdd_periodicity_list[nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 1) {
|
if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 1) {
|
||||||
check_slot++;
|
check_slot++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,7 @@ int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti) {
|
|||||||
check_slot = 0;
|
check_slot = 0;
|
||||||
|
|
||||||
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
||||||
if (cfg->tdd_table.max_tdd_periodicity_list[nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 0) {
|
if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 0) {
|
||||||
check_slot++;
|
check_slot++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,7 @@ int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
||||||
if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 1) {
|
if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 1) {
|
||||||
check_slot++;
|
check_slot++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -85,7 +85,7 @@ int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti) {
|
|||||||
check_slot = 0;
|
check_slot = 0;
|
||||||
|
|
||||||
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
|
||||||
if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 0) {
|
if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 0) {
|
||||||
check_slot++;
|
check_slot++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -97,7 +97,7 @@ int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue,
|
|||||||
G_b_f_c = 0;
|
G_b_f_c = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
G_b_f_c = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][gNB_id][0]->g_pucch;
|
G_b_f_c = ue->dlsch[proc->thread_id][gNB_id][0]->g_pucch;
|
||||||
LOG_W(PHY,"PUCCH Transmit power control command not yet implemented for NR : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
|
LOG_W(PHY,"PUCCH Transmit power control command not yet implemented for NR : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
|
||||||
return (PUCCH_POWER_DEFAULT);
|
return (PUCCH_POWER_DEFAULT);
|
||||||
}
|
}
|
||||||
@@ -169,7 +169,7 @@ int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue,
|
|||||||
//int K_PUCCH = 0;
|
//int K_PUCCH = 0;
|
||||||
if (O_ACK != 0) {
|
if (O_ACK != 0) {
|
||||||
/* it assumes that PDCCH is in the first symbol of receive slot FFS TDDO NR */
|
/* it assumes that PDCCH is in the first symbol of receive slot FFS TDDO NR */
|
||||||
//int slots_gap = (proc->nr_tti_tx > proc->nr_tti_rx ? (proc->nr_tti_tx - proc->nr_tti_rx - 1) : ((proc->nr_tti_tx + ue->frame_parms.slots_per_subframe) - proc->nr_tti_rx - 1));
|
//int slots_gap = (proc->nr_slot_tx > proc->nr_slot_rx ? (proc->nr_slot_tx - proc->nr_slot_rx - 1) : ((proc->nr_slot_tx + ue->frame_parms.slots_per_subframe) - proc->nr_slot_rx - 1));
|
||||||
//K_PUCCH = (slots_gap * (ue->frame_parms.symbols_per_tti)) - 1;
|
//K_PUCCH = (slots_gap * (ue->frame_parms.symbols_per_tti)) - 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ void nr_generate_pucch0(int32_t **txdataF,
|
|||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t mcs,
|
uint8_t mcs,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
@@ -110,7 +110,7 @@ void nr_generate_pucch1(int32_t **txdataF,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
uint16_t startingPRB,
|
uint16_t startingPRB,
|
||||||
@@ -123,7 +123,7 @@ void nr_generate_pucch2(int32_t **txdataF,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
uint8_t nrofPRB,
|
uint8_t nrofPRB,
|
||||||
@@ -136,7 +136,7 @@ void nr_generate_pucch3_4(int32_t **txdataF,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint64_t payload,
|
uint64_t payload,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
int nr_tti_tx,
|
int nr_slot_tx,
|
||||||
uint8_t nrofSymbols,
|
uint8_t nrofSymbols,
|
||||||
uint8_t startingSymbolIndex,
|
uint8_t startingSymbolIndex,
|
||||||
uint8_t nrofPRB,
|
uint8_t nrofPRB,
|
||||||
@@ -210,7 +210,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
uint64_t pucch_payload = 0;
|
uint64_t pucch_payload = 0;
|
||||||
uint32_t csi_payload = 0;
|
uint32_t csi_payload = 0;
|
||||||
int frame_tx = proc->frame_tx;
|
int frame_tx = proc->frame_tx;
|
||||||
int nr_tti_tx = proc->nr_tti_tx;
|
int nr_slot_tx = proc->nr_slot_tx;
|
||||||
int Mod_id = ue->Mod_id;
|
int Mod_id = ue->Mod_id;
|
||||||
int CC_id = ue->CC_id;
|
int CC_id = ue->CC_id;
|
||||||
|
|
||||||
@@ -241,15 +241,15 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
int subframe_number = proc->nr_slot_rx / ue->frame_parms.slots_per_subframe;
|
int subframe_number = proc->nr_slot_rx / ue->frame_parms.slots_per_subframe;
|
||||||
nb_pucch_format_4_in_subframes[subframe_number] = 0; /* reset pucch format 4 counter at current rx position */
|
nb_pucch_format_4_in_subframes[subframe_number] = 0; /* reset pucch format 4 counter at current rx position */
|
||||||
|
|
||||||
int dl_harq_pid = ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid;
|
int dl_harq_pid = ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid;
|
||||||
|
|
||||||
if (dl_harq_pid < ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->number_harq_processes_for_pdsch) {
|
if (dl_harq_pid < ue->dlsch[proc->thread_id][gNB_id][0]->number_harq_processes_for_pdsch) {
|
||||||
/* pucch indicator can be reseted in function get_downlink_ack so it should be get now */
|
/* pucch indicator can be reseted in function get_downlink_ack so it should be get now */
|
||||||
pucch_resource_indicator = ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack.pucch_resource_indicator;
|
pucch_resource_indicator = ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack.pucch_resource_indicator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Part - I
|
/* Part - I
|
||||||
* Collect feedback that should be transmitted at this nr_tti_tx :
|
* Collect feedback that should be transmitted at this nr_slot_tx :
|
||||||
* - ACK/NACK, SR, CSI (CQI, RI, ...)
|
* - ACK/NACK, SR, CSI (CQI, RI, ...)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -261,11 +261,11 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
|
|
||||||
/* sr_payload = 1 means that this is a positive SR, sr_payload = 0 means that it is a negative SR */
|
/* sr_payload = 1 means that this is a positive SR, sr_payload = 0 means that it is a negative SR */
|
||||||
sr_payload = nr_ue_get_SR(Mod_id,
|
sr_payload = nr_ue_get_SR(Mod_id,
|
||||||
CC_id,
|
CC_id,
|
||||||
frame_tx,
|
frame_tx,
|
||||||
gNB_id,
|
gNB_id,
|
||||||
0,//ue->pdcch_vars[ue->current_thread_id[proc->nr_tti_rx]][gNB_id]->crnti,
|
0,//ue->pdcch_vars[proc->thread_id][gNB_id]->crnti,
|
||||||
nr_tti_tx); // nr_tti_rx used for meas gap
|
nr_slot_tx); // nr_slot_rx used for meas gap
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sr_payload = 1;
|
sr_payload = 1;
|
||||||
@@ -287,7 +287,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
uint16_t report_slot_csi =csi_MeasConfig->csi_ReportConfigToAddModList->list.array[0]->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320;
|
uint16_t report_slot_csi =csi_MeasConfig->csi_ReportConfigToAddModList->list.array[0]->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320;
|
||||||
|
|
||||||
//if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){
|
//if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){
|
||||||
if (report_slot_csi == proc->nr_tti_tx)
|
if (report_slot_csi == proc->nr_slot_tx)
|
||||||
csi_status = get_csi_nr(mac, ue, gNB_id, &csi_payload);
|
csi_status = get_csi_nr(mac, ue, gNB_id, &csi_payload);
|
||||||
else
|
else
|
||||||
csi_status = 0;
|
csi_status = 0;
|
||||||
@@ -301,8 +301,8 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
if(O_ACK == 0) {
|
if(O_ACK == 0) {
|
||||||
N_UCI = O_SR + O_CSI;
|
N_UCI = O_SR + O_CSI;
|
||||||
if ((N_UCI == 0) || ((O_CSI == 0) && (sr_payload == 0))) { /* TS 38.213 9.2.4 UE procedure for reporting SR */
|
if ((N_UCI == 0) || ((O_CSI == 0) && (sr_payload == 0))) { /* TS 38.213 9.2.4 UE procedure for reporting SR */
|
||||||
NR_TST_PHY_PRINTF("PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_tti_tx);
|
NR_TST_PHY_PRINTF("PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
|
||||||
LOG_D(PHY,"PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_tti_tx);
|
LOG_D(PHY,"PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -354,7 +354,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
int occ_length = 0;
|
int occ_length = 0;
|
||||||
int occ_Index = 0;
|
int occ_Index = 0;
|
||||||
|
|
||||||
NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack;
|
NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack;
|
||||||
|
|
||||||
if (select_pucch_resource(ue, mac, gNB_id, N_UCI, pucch_resource_indicator, &initial_pucch_id, &pucch_resource_set,
|
if (select_pucch_resource(ue, mac, gNB_id, N_UCI, pucch_resource_indicator, &initial_pucch_id, &pucch_resource_set,
|
||||||
&pucch_resource_id, harq_status) == TRUE) {
|
&pucch_resource_id, harq_status) == TRUE) {
|
||||||
@@ -389,7 +389,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
if ((ue->UE_mode[gNB_id] != PUSCH) && (O_ACK > 1)) {
|
if ((ue->UE_mode[gNB_id] != PUSCH) && (O_ACK > 1)) {
|
||||||
O_ACK = 1;
|
O_ACK = 1;
|
||||||
pucch_ack_payload &= 0x1; /* take only first ack */
|
pucch_ack_payload &= 0x1; /* take only first ack */
|
||||||
LOG_W(PHY,"PUCCH ue is not expected to generate more than one HARQ-ACK at AbsSubframe %d.%d \n", frame_tx%1024, nr_tti_tx);
|
LOG_W(PHY,"PUCCH ue is not expected to generate more than one HARQ-ACK at AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
|
||||||
}
|
}
|
||||||
NR_TST_PHY_PRINTF("PUCCH common configuration with index %d \n", initial_pucch_id);
|
NR_TST_PHY_PRINTF("PUCCH common configuration with index %d \n", initial_pucch_id);
|
||||||
}
|
}
|
||||||
@@ -442,7 +442,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_W(PHY,"PUCCH No PUCCH resource found at AbsSubframe %d.%d \n", frame_tx%1024, nr_tti_tx);
|
LOG_W(PHY,"PUCCH No PUCCH resource found at AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -490,7 +490,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
//}
|
//}
|
||||||
nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
|
nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
|
||||||
nb_of_prbs = 1;
|
nb_of_prbs = 1;
|
||||||
subframe_number = nr_tti_tx / ue->frame_parms.slots_per_subframe;
|
subframe_number = nr_slot_tx / ue->frame_parms.slots_per_subframe;
|
||||||
nb_pucch_format_4_in_subframes[subframe_number]++; /* increment number of transmit pucch 4 in current subframe */
|
nb_pucch_format_4_in_subframes[subframe_number]++; /* increment number of transmit pucch 4 in current subframe */
|
||||||
NR_TST_PHY_PRINTF("PUCCH Number of pucch format 4 in subframe %d is %d \n", subframe_number, nb_pucch_format_4_in_subframes[subframe_number]);
|
NR_TST_PHY_PRINTF("PUCCH Number of pucch format 4 in subframe %d is %d \n", subframe_number, nb_pucch_format_4_in_subframes[subframe_number]);
|
||||||
N_sc_ctrl_RB = N_SC_RB/(nb_pucch_format_4_in_subframes[subframe_number]);
|
N_sc_ctrl_RB = N_SC_RB/(nb_pucch_format_4_in_subframes[subframe_number]);
|
||||||
@@ -595,7 +595,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
pucch_payload = pucch_payload | (csi_payload << (O_ACK + O_SR)) | (sr_payload << O_ACK) | pucch_ack_payload;
|
pucch_payload = pucch_payload | (csi_payload << (O_ACK + O_SR)) | (sr_payload << O_ACK) | pucch_ack_payload;
|
||||||
|
|
||||||
NR_TST_PHY_PRINTF("PUCCH ( AbsSubframe : %d.%d ) ( total payload size %d data 0x%02x ) ( ack length %d data 0x%02x ) ( sr length %d value %d ) ( csi length %d data : 0x%02x ) \n",
|
NR_TST_PHY_PRINTF("PUCCH ( AbsSubframe : %d.%d ) ( total payload size %d data 0x%02x ) ( ack length %d data 0x%02x ) ( sr length %d value %d ) ( csi length %d data : 0x%02x ) \n",
|
||||||
frame_tx%1024, nr_tti_tx, N_UCI, pucch_payload, O_ACK, pucch_ack_payload, O_SR, sr_payload, csi_status, csi_payload);
|
frame_tx%1024, nr_slot_tx, N_UCI, pucch_payload, O_ACK, pucch_ack_payload, O_SR, sr_payload, csi_status, csi_payload);
|
||||||
|
|
||||||
NR_TST_PHY_PRINTF("PUCCH ( format : %d ) ( modulation : %s ) ( nb prb : %d ) ( nb symbols total: %d ) ( nb symbols : %d ) ( max code rate*100 : %d ) ( starting_symbol_index : %d ) \n",
|
NR_TST_PHY_PRINTF("PUCCH ( format : %d ) ( modulation : %s ) ( nb prb : %d ) ( nb symbols total: %d ) ( nb symbols : %d ) ( max code rate*100 : %d ) ( starting_symbol_index : %d ) \n",
|
||||||
format, (Q_m == BITS_PER_SYMBOL_QPSK ? " QPSK " : " BPSK "), nb_of_prbs, nb_symbols_total, nb_symbols, max_code_rate, starting_symbol_index);
|
format, (Q_m == BITS_PER_SYMBOL_QPSK ? " QPSK " : " BPSK "), nb_of_prbs, nb_symbols_total, nb_symbols, max_code_rate, starting_symbol_index);
|
||||||
@@ -612,8 +612,8 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
O_CRC, n_HARQ_ACK);
|
O_CRC, n_HARQ_ACK);
|
||||||
|
|
||||||
/* set tx power */
|
/* set tx power */
|
||||||
ue->tx_power_dBm[nr_tti_tx] = pucch_tx_power;
|
ue->tx_power_dBm[nr_slot_tx] = pucch_tx_power;
|
||||||
ue->tx_total_RE[nr_tti_tx] = nb_of_prbs*N_SC_RB;
|
ue->tx_total_RE[nr_slot_tx] = nb_of_prbs*N_SC_RB;
|
||||||
|
|
||||||
int tx_amp;
|
int tx_amp;
|
||||||
|
|
||||||
@@ -635,7 +635,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup->pucch_GroupHopping,
|
mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup->pucch_GroupHopping,
|
||||||
mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup->hoppingId[0],
|
mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup->hoppingId[0],
|
||||||
tx_amp,
|
tx_amp,
|
||||||
nr_tti_tx,
|
nr_slot_tx,
|
||||||
(uint8_t)m_0,
|
(uint8_t)m_0,
|
||||||
(uint8_t)m_CS,
|
(uint8_t)m_CS,
|
||||||
nb_symbols_total,
|
nb_symbols_total,
|
||||||
@@ -650,7 +650,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
&ue->pucch_config_dedicated[gNB_id],
|
&ue->pucch_config_dedicated[gNB_id],
|
||||||
pucch_payload,
|
pucch_payload,
|
||||||
tx_amp,
|
tx_amp,
|
||||||
nr_tti_tx,
|
nr_slot_tx,
|
||||||
(uint8_t)m_0,
|
(uint8_t)m_0,
|
||||||
nb_symbols_total,
|
nb_symbols_total,
|
||||||
starting_symbol_index,
|
starting_symbol_index,
|
||||||
@@ -671,7 +671,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
&ue->pucch_config_dedicated[gNB_id],
|
&ue->pucch_config_dedicated[gNB_id],
|
||||||
pucch_payload,
|
pucch_payload,
|
||||||
tx_amp,
|
tx_amp,
|
||||||
nr_tti_tx,
|
nr_slot_tx,
|
||||||
nb_symbols_total,
|
nb_symbols_total,
|
||||||
starting_symbol_index,
|
starting_symbol_index,
|
||||||
nb_of_prbs,
|
nb_of_prbs,
|
||||||
@@ -683,14 +683,14 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
case pucch_format4_nr:
|
case pucch_format4_nr:
|
||||||
{
|
{
|
||||||
nr_generate_pucch3_4(ue,
|
nr_generate_pucch3_4(ue,
|
||||||
0,//ue->pdcch_vars[ue->current_thread_id[proc->nr_tti_rx]][gNB_id]->crnti,
|
0,//ue->pdcch_vars[proc->thread_id][gNB_id]->crnti,
|
||||||
ue->common_vars.txdataF,
|
ue->common_vars.txdataF,
|
||||||
&ue->frame_parms,
|
&ue->frame_parms,
|
||||||
format,
|
format,
|
||||||
&ue->pucch_config_dedicated[gNB_id],
|
&ue->pucch_config_dedicated[gNB_id],
|
||||||
pucch_payload,
|
pucch_payload,
|
||||||
tx_amp,
|
tx_amp,
|
||||||
nr_tti_tx,
|
nr_slot_tx,
|
||||||
nb_symbols_total,
|
nb_symbols_total,
|
||||||
starting_symbol_index,
|
starting_symbol_index,
|
||||||
nb_of_prbs,
|
nb_of_prbs,
|
||||||
@@ -743,7 +743,7 @@ uint8_t get_downlink_ack(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t
|
|||||||
int number_harq_feedback = 0;
|
int number_harq_feedback = 0;
|
||||||
uint32_t dai_current = 0;
|
uint32_t dai_current = 0;
|
||||||
uint32_t dai_max = 0;
|
uint32_t dai_max = 0;
|
||||||
int number_pid_dl = ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->number_harq_processes_for_pdsch;
|
int number_pid_dl = ue->dlsch[proc->thread_id][gNB_id][0]->number_harq_processes_for_pdsch;
|
||||||
bool two_transport_blocks = FALSE;
|
bool two_transport_blocks = FALSE;
|
||||||
int number_of_code_word = 1;
|
int number_of_code_word = 1;
|
||||||
int U_DAI_c = 0;
|
int U_DAI_c = 0;
|
||||||
@@ -776,7 +776,7 @@ uint8_t get_downlink_ack(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t
|
|||||||
harq_status = &ue->dlsch[thread_idx][gNB_id][code_word]->harq_processes[dl_harq_pid]->harq_ack;
|
harq_status = &ue->dlsch[thread_idx][gNB_id][code_word]->harq_processes[dl_harq_pid]->harq_ack;
|
||||||
|
|
||||||
/* check if current tx slot should transmit downlink acknowlegment */
|
/* check if current tx slot should transmit downlink acknowlegment */
|
||||||
if (harq_status->slot_for_feedback_ack == proc->nr_tti_tx) {
|
if (harq_status->slot_for_feedback_ack == proc->nr_slot_tx) {
|
||||||
|
|
||||||
if (harq_status->ack == DL_ACKNACK_NO_SET) {
|
if (harq_status->ack == DL_ACKNACK_NO_SET) {
|
||||||
LOG_E(PHY,"PUCCH Downlink acknowledgment has not been set : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
|
LOG_E(PHY,"PUCCH Downlink acknowledgment has not been set : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
|
||||||
@@ -1124,7 +1124,7 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
pucch_resource_set_id = 1;
|
pucch_resource_set_id = 1;
|
||||||
return (pucch_resource_set_id);
|
return (pucch_resource_set_id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1278,7 +1278,7 @@ int trigger_periodic_scheduling_request(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_n
|
|||||||
}
|
}
|
||||||
|
|
||||||
int16_t N_slot_frame = ue->frame_parms.slots_per_frame;
|
int16_t N_slot_frame = ue->frame_parms.slots_per_frame;
|
||||||
if (((proc->frame_tx * N_slot_frame) + proc->nr_tti_tx - SR_offset)%SR_periodicity == 0) {
|
if (((proc->frame_tx * N_slot_frame) + proc->nr_slot_tx - SR_offset)%SR_periodicity == 0) {
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -52,6 +52,7 @@
|
|||||||
PHY_VARS_gNB *gNB;
|
PHY_VARS_gNB *gNB;
|
||||||
PHY_VARS_NR_UE *UE;
|
PHY_VARS_NR_UE *UE;
|
||||||
RAN_CONTEXT_t RC;
|
RAN_CONTEXT_t RC;
|
||||||
|
UE_nr_rxtx_proc_t proc;
|
||||||
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||||
|
|
||||||
double cpuf;
|
double cpuf;
|
||||||
@@ -559,7 +560,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0, VCD_FUNCTION_IN);
|
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
ret = nr_dlsch_decoding(UE, channel_output_fixed, &UE->frame_parms,
|
ret = nr_dlsch_decoding(UE, &proc, 0, channel_output_fixed, &UE->frame_parms,
|
||||||
dlsch0_ue, dlsch0_ue->harq_processes[0], frame, nb_symb_sch,
|
dlsch0_ue, dlsch0_ue->harq_processes[0], frame, nb_symb_sch,
|
||||||
slot,harq_pid, is_crnti, llr8_flag);
|
slot,harq_pid, is_crnti, llr8_flag);
|
||||||
|
|
||||||
|
|||||||
@@ -686,7 +686,6 @@ int main(int argc, char **argv)
|
|||||||
else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;}
|
else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;}
|
||||||
|
|
||||||
UE->perfect_ce = 0;
|
UE->perfect_ce = 0;
|
||||||
for (i=0;i<10;i++) UE->current_thread_id[i] = 0;
|
|
||||||
|
|
||||||
if (init_nr_ue_signal(UE, 1, 0) != 0)
|
if (init_nr_ue_signal(UE, 1, 0) != 0)
|
||||||
{
|
{
|
||||||
@@ -748,7 +747,7 @@ int main(int argc, char **argv)
|
|||||||
scheduled_response.CC_id = 0;
|
scheduled_response.CC_id = 0;
|
||||||
scheduled_response.frame = frame;
|
scheduled_response.frame = frame;
|
||||||
scheduled_response.slot = slot;
|
scheduled_response.slot = slot;
|
||||||
|
scheduled_response.thread_id = UE_proc.thread_id;
|
||||||
|
|
||||||
nr_ue_phy_config_request(&UE_mac->phy_config);
|
nr_ue_phy_config_request(&UE_mac->phy_config);
|
||||||
NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info;
|
NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info;
|
||||||
@@ -787,14 +786,14 @@ int main(int argc, char **argv)
|
|||||||
//multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0);
|
//multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0);
|
||||||
|
|
||||||
UE->rx_offset=0;
|
UE->rx_offset=0;
|
||||||
UE_proc.frame_rx = frame;
|
UE_proc.thread_id = 0;
|
||||||
UE_proc.nr_tti_rx= slot;
|
UE_proc.frame_rx = frame;
|
||||||
UE_proc.subframe_rx = slot;
|
UE_proc.nr_slot_rx = slot;
|
||||||
|
|
||||||
dcireq.frame = frame;
|
dcireq.frame = frame;
|
||||||
dcireq.slot = slot;
|
dcireq.slot = slot;
|
||||||
|
|
||||||
NR_UE_DLSCH_t *dlsch0 = UE->dlsch[UE->current_thread_id[UE_proc.nr_tti_rx]][0][0];
|
NR_UE_DLSCH_t *dlsch0 = UE->dlsch[UE_proc.thread_id][0][0];
|
||||||
|
|
||||||
int harq_pid = slot;
|
int harq_pid = slot;
|
||||||
NR_DL_UE_HARQ_t *UE_harq_process = dlsch0->harq_processes[harq_pid];
|
NR_DL_UE_HARQ_t *UE_harq_process = dlsch0->harq_processes[harq_pid];
|
||||||
@@ -926,21 +925,21 @@ int main(int argc, char **argv)
|
|||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
//---------------------- count errors ----------------------
|
//---------------------- count errors ----------------------
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
|
|
||||||
if (UE->dlsch[UE->current_thread_id[slot]][0][0]->last_iteration_cnt >=
|
if (UE->dlsch[UE_proc.thread_id][0][0]->last_iteration_cnt >=
|
||||||
UE->dlsch[UE->current_thread_id[slot]][0][0]->max_ldpc_iterations+1)
|
UE->dlsch[UE_proc.thread_id][0][0]->max_ldpc_iterations+1)
|
||||||
n_errors++;
|
n_errors++;
|
||||||
|
|
||||||
NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE->current_thread_id[UE_proc.nr_tti_rx]];
|
NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE_proc.thread_id];
|
||||||
int16_t *UE_llr = pdsch_vars[0]->llr[0];
|
int16_t *UE_llr = pdsch_vars[0]->llr[0];
|
||||||
|
|
||||||
TBS = UE_harq_process->TBS;//rel15->TBSize[0];
|
TBS = UE_harq_process->TBS;//rel15->TBSize[0];
|
||||||
uint16_t length_dmrs = 1;
|
uint16_t length_dmrs = 1;
|
||||||
uint16_t nb_rb = rel15->rbSize;
|
uint16_t nb_rb = rel15->rbSize;
|
||||||
uint8_t nb_re_dmrs = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4;
|
uint8_t nb_re_dmrs = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4;
|
||||||
uint8_t mod_order = rel15->qamModOrder[0];
|
uint8_t mod_order = rel15->qamModOrder[0];
|
||||||
uint8_t nb_symb_sch = rel15->NrOfSymbols;
|
uint8_t nb_symb_sch = rel15->NrOfSymbols;
|
||||||
|
|
||||||
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers);
|
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers);
|
||||||
|
|
||||||
for (i = 0; i < available_bits; i++) {
|
for (i = 0; i < available_bits; i++) {
|
||||||
@@ -1030,9 +1029,9 @@ int main(int argc, char **argv)
|
|||||||
printStatIndent(&UE->dlsch_unscrambling_stats,"DLSCH unscrambling time");
|
printStatIndent(&UE->dlsch_unscrambling_stats,"DLSCH unscrambling time");
|
||||||
printStatIndent(&UE->dlsch_rate_unmatching_stats,"DLSCH Rate Unmatching");
|
printStatIndent(&UE->dlsch_rate_unmatching_stats,"DLSCH Rate Unmatching");
|
||||||
printf("|__ DLSCH Turbo Decoding(%d bits), avg iterations: %.1f %.2f us (%d cycles, %d trials)\n",
|
printf("|__ DLSCH Turbo Decoding(%d bits), avg iterations: %.1f %.2f us (%d cycles, %d trials)\n",
|
||||||
UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Cminus ?
|
UE->dlsch[UE_proc.thread_id][0][0]->harq_processes[0]->Cminus ?
|
||||||
UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kminus :
|
UE->dlsch[UE_proc.thread_id][0][0]->harq_processes[0]->Kminus :
|
||||||
UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kplus,
|
UE->dlsch[UE_proc.thread_id][0][0]->harq_processes[0]->Kplus,
|
||||||
UE->dlsch_tc_intl1_stats.trials/(double)UE->dlsch_tc_init_stats.trials,
|
UE->dlsch_tc_intl1_stats.trials/(double)UE->dlsch_tc_init_stats.trials,
|
||||||
(double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials*timeBase,
|
(double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials*timeBase,
|
||||||
(int)((double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials),
|
(int)((double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials),
|
||||||
@@ -1054,7 +1053,7 @@ int main(int argc, char **argv)
|
|||||||
LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1);
|
LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1);
|
||||||
LOG_M("chestF0.m","chF0",UE->pdsch_vars[0][0]->dl_ch_estimates_ext,N_RB_DL*12*14,1,1);
|
LOG_M("chestF0.m","chF0",UE->pdsch_vars[0][0]->dl_ch_estimates_ext,N_RB_DL*12*14,1,1);
|
||||||
write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1);
|
write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1);
|
||||||
LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE->current_thread_id[UE_proc.nr_tti_rx]][0]->llr[0],available_bits,1,0);
|
LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE_proc.thread_id][0]->llr[0],available_bits,1,0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -235,8 +235,8 @@ void fill_scc(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_RB_DL
|
|||||||
|
|
||||||
void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap);
|
void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap);
|
||||||
void prepare_scc(NR_ServingCellConfigCommon_t *scc);
|
void prepare_scc(NR_ServingCellConfigCommon_t *scc);
|
||||||
s1ap_eNB_config_t s1ap_config;
|
ngap_gNB_config_t ngap_config;
|
||||||
uint32_t s1ap_generate_eNB_id(void) {return 0;}
|
uint32_t ngap_generate_gNB_id(void) {return 0;}
|
||||||
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) { return;}
|
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) { return;}
|
||||||
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) { return;}
|
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) { return;}
|
||||||
|
|
||||||
|
|||||||
@@ -680,6 +680,7 @@ int main(int argc, char **argv)
|
|||||||
if (ret<0) n_errors++;
|
if (ret<0) n_errors++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
UE_nr_rxtx_proc_t proc={0};
|
||||||
UE->rx_offset=0;
|
UE->rx_offset=0;
|
||||||
uint8_t ssb_index = 0;
|
uint8_t ssb_index = 0;
|
||||||
while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb
|
while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb
|
||||||
@@ -688,16 +689,16 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
int ssb_slot = (ssb_index>>1)+(n_hf*frame_parms->slots_per_frame);
|
int ssb_slot = (ssb_index>>1)+(n_hf*frame_parms->slots_per_frame);
|
||||||
for (int i=UE->symbol_offset+1; i<UE->symbol_offset+4; i++) {
|
for (int i=UE->symbol_offset+1; i<UE->symbol_offset+4; i++) {
|
||||||
nr_slot_fep(UE,
|
nr_slot_fep(UE,
|
||||||
i%frame_parms->symbols_per_slot,
|
&proc,
|
||||||
ssb_slot,
|
i%frame_parms->symbols_per_slot,
|
||||||
0,
|
ssb_slot,
|
||||||
0);
|
0,
|
||||||
|
0);
|
||||||
|
|
||||||
nr_pbch_channel_estimation(UE,0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf);
|
nr_pbch_channel_estimation(UE,&proc,0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf);
|
||||||
|
|
||||||
}
|
}
|
||||||
UE_nr_rxtx_proc_t proc={0};
|
|
||||||
|
|
||||||
ret = nr_rx_pbch(UE,
|
ret = nr_rx_pbch(UE,
|
||||||
&proc,
|
&proc,
|
||||||
|
|||||||
@@ -627,8 +627,8 @@ int main(int argc, char **argv){
|
|||||||
subframe); */ //commented for testing purpose
|
subframe); */ //commented for testing purpose
|
||||||
|
|
||||||
UE_nr_rxtx_proc_t proc={0};
|
UE_nr_rxtx_proc_t proc={0};
|
||||||
proc.frame_tx = frame;
|
proc.frame_tx = frame;
|
||||||
proc.nr_tti_tx = slot;
|
proc.nr_slot_tx = slot;
|
||||||
nr_ue_prach_procedures(UE,&proc,0,0);
|
nr_ue_prach_procedures(UE,&proc,0,0);
|
||||||
|
|
||||||
/* tx_lev_dB not used later, no need to set */
|
/* tx_lev_dB not used later, no need to set */
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ int main(int argc, char **argv)
|
|||||||
FILE *input_fd=NULL;
|
FILE *input_fd=NULL;
|
||||||
//uint8_t nacktoack_flag=0;
|
//uint8_t nacktoack_flag=0;
|
||||||
int16_t amp=0x7FFF;
|
int16_t amp=0x7FFF;
|
||||||
int nr_tti_tx=0;
|
int nr_slot_tx=0;
|
||||||
uint64_t actual_payload=0,payload_received;
|
uint64_t actual_payload=0,payload_received;
|
||||||
int nr_bit=1; // maximum value possible is 2
|
int nr_bit=1; // maximum value possible is 2
|
||||||
uint8_t m0=0;// higher layer paramater initial cyclic shift
|
uint8_t m0=0;// higher layer paramater initial cyclic shift
|
||||||
@@ -501,13 +501,13 @@ int main(int argc, char **argv)
|
|||||||
for (trial=0; trial<n_trials; trial++) {
|
for (trial=0; trial<n_trials; trial++) {
|
||||||
bzero(txdataF[aa],frame_parms->ofdm_symbol_size*sizeof(int));
|
bzero(txdataF[aa],frame_parms->ofdm_symbol_size*sizeof(int));
|
||||||
if(format==0){
|
if(format==0){
|
||||||
nr_generate_pucch0(UE,txdataF,frame_parms,PUCCH_GroupHopping,hopping_id,amp,nr_tti_tx,m0,mcs,nrofSymbols,startingSymbolIndex,startingPRB);
|
nr_generate_pucch0(UE,txdataF,frame_parms,PUCCH_GroupHopping,hopping_id,amp,nr_slot_tx,m0,mcs,nrofSymbols,startingSymbolIndex,startingPRB);
|
||||||
}
|
}
|
||||||
else if (format == 1){
|
else if (format == 1){
|
||||||
nr_generate_pucch1(UE,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_tti_tx,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,0,nr_bit);
|
nr_generate_pucch1(UE,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_slot_tx,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,0,nr_bit);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
nr_generate_pucch2(UE,0x1234,dmrs_scrambling_id,data_scrambling_id,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_tti_tx,nrofSymbols,startingSymbolIndex,nrofPRB,startingPRB,nr_bit);
|
nr_generate_pucch2(UE,0x1234,dmrs_scrambling_id,data_scrambling_id,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_slot_tx,nrofSymbols,startingSymbolIndex,nrofPRB,startingPRB,nr_bit);
|
||||||
}
|
}
|
||||||
|
|
||||||
int txlev = signal_energy(&txdataF[aa][startingSymbolIndex*frame_parms->ofdm_symbol_size],
|
int txlev = signal_energy(&txdataF[aa][startingSymbolIndex*frame_parms->ofdm_symbol_size],
|
||||||
@@ -536,21 +536,21 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (n_trials==1) printf("rxlev %d (%d dB), sigma2 %f dB, SNR %f, TX %f\n",rxlev,dB_fixed(rxlev),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12));
|
if (n_trials==1) printf("rxlev %d (%d dB), sigma2 %f dB, SNR %f, TX %f\n",rxlev,dB_fixed(rxlev),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12));
|
||||||
if(format==0){
|
if(format==0){
|
||||||
nfapi_nr_uci_pucch_pdu_format_0_1_t uci_pdu;
|
nfapi_nr_uci_pucch_pdu_format_0_1_t uci_pdu;
|
||||||
nfapi_nr_pucch_pdu_t pucch_pdu;
|
nfapi_nr_pucch_pdu_t pucch_pdu;
|
||||||
pucch_pdu.subcarrier_spacing = 1;
|
pucch_pdu.subcarrier_spacing = 1;
|
||||||
pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
|
pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
|
||||||
pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
|
pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
|
||||||
pucch_pdu.bit_len_harq = nr_bit;
|
pucch_pdu.bit_len_harq = nr_bit;
|
||||||
pucch_pdu.bit_len_csi_part1 = 0;
|
pucch_pdu.bit_len_csi_part1 = 0;
|
||||||
pucch_pdu.bit_len_csi_part2 = 0;
|
pucch_pdu.bit_len_csi_part2 = 0;
|
||||||
pucch_pdu.sr_flag = sr_flag;
|
pucch_pdu.sr_flag = sr_flag;
|
||||||
pucch_pdu.nr_of_symbols = nrofSymbols;
|
pucch_pdu.nr_of_symbols = nrofSymbols;
|
||||||
pucch_pdu.hopping_id = hopping_id;
|
pucch_pdu.hopping_id = hopping_id;
|
||||||
pucch_pdu.initial_cyclic_shift = 0;
|
pucch_pdu.initial_cyclic_shift = 0;
|
||||||
pucch_pdu.start_symbol_index = startingSymbolIndex;
|
pucch_pdu.start_symbol_index = startingSymbolIndex;
|
||||||
pucch_pdu.prb_start = startingPRB;
|
pucch_pdu.prb_start = startingPRB;
|
||||||
nr_decode_pucch0(gNB,nr_tti_tx,&uci_pdu,&pucch_pdu);
|
nr_decode_pucch0(gNB,nr_slot_tx,&uci_pdu,&pucch_pdu);
|
||||||
if(sr_flag==1){
|
if(sr_flag==1){
|
||||||
if (uci_pdu.sr->sr_indication == 0 || uci_pdu.sr->sr_confidence_level == 1)
|
if (uci_pdu.sr->sr_indication == 0 || uci_pdu.sr->sr_confidence_level == 1)
|
||||||
sr_errors+=1;
|
sr_errors+=1;
|
||||||
@@ -565,7 +565,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
else if (format==1) {
|
else if (format==1) {
|
||||||
nr_decode_pucch1(rxdataF,PUCCH_GroupHopping,hopping_id,
|
nr_decode_pucch1(rxdataF,PUCCH_GroupHopping,hopping_id,
|
||||||
&(payload_received),frame_parms,amp,nr_tti_tx,
|
&(payload_received),frame_parms,amp,nr_slot_tx,
|
||||||
m0,nrofSymbols,startingSymbolIndex,startingPRB,
|
m0,nrofSymbols,startingSymbolIndex,startingPRB,
|
||||||
startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
||||||
if(nr_bit==1)
|
if(nr_bit==1)
|
||||||
@@ -574,34 +574,34 @@ int main(int argc, char **argv)
|
|||||||
ack_nack_errors+=((actual_payload^payload_received)&1) + (((actual_payload^payload_received)&2)>>1);
|
ack_nack_errors+=((actual_payload^payload_received)&1) + (((actual_payload^payload_received)&2)>>1);
|
||||||
}
|
}
|
||||||
else if (format==2) {
|
else if (format==2) {
|
||||||
nfapi_nr_uci_pucch_pdu_format_2_3_4_t uci_pdu;
|
nfapi_nr_uci_pucch_pdu_format_2_3_4_t uci_pdu;
|
||||||
nfapi_nr_pucch_pdu_t pucch_pdu;
|
nfapi_nr_pucch_pdu_t pucch_pdu;
|
||||||
pucch_pdu.rnti = 0x1234;
|
pucch_pdu.rnti = 0x1234;
|
||||||
pucch_pdu.subcarrier_spacing = 1;
|
pucch_pdu.subcarrier_spacing = 1;
|
||||||
pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
|
pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
|
||||||
pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
|
pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
|
||||||
pucch_pdu.bit_len_csi_part1 = nr_bit;
|
pucch_pdu.bit_len_csi_part1 = nr_bit;
|
||||||
pucch_pdu.bit_len_harq = 0;
|
pucch_pdu.bit_len_harq = 0;
|
||||||
pucch_pdu.bit_len_csi_part2 = 0;
|
pucch_pdu.bit_len_csi_part2 = 0;
|
||||||
pucch_pdu.sr_flag = 0;
|
pucch_pdu.sr_flag = 0;
|
||||||
pucch_pdu.nr_of_symbols = nrofSymbols;
|
pucch_pdu.nr_of_symbols = nrofSymbols;
|
||||||
pucch_pdu.hopping_id = hopping_id;
|
pucch_pdu.hopping_id = hopping_id;
|
||||||
pucch_pdu.initial_cyclic_shift = 0;
|
pucch_pdu.initial_cyclic_shift = 0;
|
||||||
pucch_pdu.start_symbol_index = startingSymbolIndex;
|
pucch_pdu.start_symbol_index = startingSymbolIndex;
|
||||||
pucch_pdu.prb_size = nrofPRB;
|
pucch_pdu.prb_size = nrofPRB;
|
||||||
pucch_pdu.prb_start = startingPRB;
|
pucch_pdu.prb_start = startingPRB;
|
||||||
pucch_pdu.dmrs_scrambling_id = dmrs_scrambling_id;
|
pucch_pdu.dmrs_scrambling_id = dmrs_scrambling_id;
|
||||||
pucch_pdu.data_scrambling_id = data_scrambling_id;
|
pucch_pdu.data_scrambling_id = data_scrambling_id;
|
||||||
nr_decode_pucch2(gNB,nr_tti_tx,&uci_pdu,&pucch_pdu);
|
nr_decode_pucch2(gNB,nr_slot_tx,&uci_pdu,&pucch_pdu);
|
||||||
int csi_part1_bytes=pucch_pdu.bit_len_csi_part1>>3;
|
int csi_part1_bytes=pucch_pdu.bit_len_csi_part1>>3;
|
||||||
if ((pucch_pdu.bit_len_csi_part1&7) > 0) csi_part1_bytes++;
|
if ((pucch_pdu.bit_len_csi_part1&7) > 0) csi_part1_bytes++;
|
||||||
for (int i=0;i<csi_part1_bytes;i++) {
|
for (int i=0;i<csi_part1_bytes;i++) {
|
||||||
if (uci_pdu.csi_part1.csi_part1_payload[i] != ((uint8_t*)&actual_payload)[i]) {
|
if (uci_pdu.csi_part1.csi_part1_payload[i] != ((uint8_t*)&actual_payload)[i]) {
|
||||||
ack_nack_errors++;
|
ack_nack_errors++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(uci_pdu.csi_part1.csi_part1_payload);
|
free(uci_pdu.csi_part1.csi_part1_payload);
|
||||||
|
|
||||||
}
|
}
|
||||||
n_errors=((actual_payload^payload_received)&1)+(((actual_payload^payload_received)&2)>>1)+(((actual_payload^payload_received)&4)>>2)+n_errors;
|
n_errors=((actual_payload^payload_received)&1)+(((actual_payload^payload_received)&2)>>1)+(((actual_payload^payload_received)&4)>>2)+n_errors;
|
||||||
|
|||||||
@@ -833,7 +833,8 @@ int main(int argc, char **argv)
|
|||||||
gNB->ulsch[0][0]->harq_processes[harq_pid]->round = round;
|
gNB->ulsch[0][0]->harq_processes[harq_pid]->round = round;
|
||||||
rv_index = nr_rv_round_map[round];
|
rv_index = nr_rv_round_map[round];
|
||||||
|
|
||||||
UE_proc.nr_tti_tx = slot;
|
UE_proc.thread_id = 0;
|
||||||
|
UE_proc.nr_slot_tx = slot;
|
||||||
UE_proc.frame_tx = frame;
|
UE_proc.frame_tx = frame;
|
||||||
|
|
||||||
UL_tti_req->SFN = frame;
|
UL_tti_req->SFN = frame;
|
||||||
@@ -904,6 +905,7 @@ int main(int argc, char **argv)
|
|||||||
scheduled_response.CC_id = 0;
|
scheduled_response.CC_id = 0;
|
||||||
scheduled_response.frame = frame;
|
scheduled_response.frame = frame;
|
||||||
scheduled_response.slot = slot;
|
scheduled_response.slot = slot;
|
||||||
|
scheduled_response.thread_id = UE_proc.thread_id;
|
||||||
scheduled_response.dl_config = NULL;
|
scheduled_response.dl_config = NULL;
|
||||||
scheduled_response.ul_config = &ul_config;
|
scheduled_response.ul_config = &ul_config;
|
||||||
scheduled_response.tx_request = &tx_req;
|
scheduled_response.tx_request = &tx_req;
|
||||||
@@ -959,7 +961,7 @@ int main(int argc, char **argv)
|
|||||||
/////////////////////////phy_procedures_nr_ue_TX///////////////////////
|
/////////////////////////phy_procedures_nr_ue_TX///////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id, 0);
|
phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id);
|
||||||
|
|
||||||
|
|
||||||
if (n_trials==1) {
|
if (n_trials==1) {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user