Procedures to parse/make RIV(resource indication value):
def parseRiv(self, riv, N_BWP_Size):
div = riv // N_BWP_Size
rem = riv % N_BWP_Size
L_RBs = [div + 1, N_BWP_Size + 1 - div]
RB_start = [rem, N_BWP_Size - 1 - rem]
#self.ngwin.logEdit.append('Info: RIV = %d, L_RBs = [%d,%d], RB_start = [%d,%d], N_BWP_Size = %d.' % (riv, L_RBs[0], L_RBs[1], RB_start[0], RB_start[1], N_BWP_Size))
if L_RBs[0] >= 1 and L_RBs[0] <= (N_BWP_Size - RB_start[0]) and L_RBs[0] <= math.floor(N_BWP_Size / 2):
return (L_RBs[0], RB_start[0])
elif L_RBs[1] >= 1 and L_RBs[1] <= (N_BWP_Size - RB_start[1]) and L_RBs[1] > math.floor(N_BWP_Size / 2):
return (L_RBs[1], RB_start[1])
else:
#invalid RIV
return (None, None)
def makeRiv(self, L_RBs, RB_start, N_BWP_Size):
if L_RBs < 1 or L_RBs > (N_BWP_Size - RB_start):
#self.ngwin.logEdit.append('ERROR: L_RBs = %d, RB_start = %d, N_BWP_Size = %d.' % (L_RBs, RB_start, N_BWP_Size))
return None
if (L_RBs - 1) <= math.floor(N_BWP_Size / 2):
riv = N_BWP_Size * (L_RBs - 1) + RB_start
else:
riv = N_BWP_Size * (N_BWP_Size - L_RBs + 1) + (N_BWP_Size - 1 - RB_start)
return riv
Interpretation of locationAndBandwidth field in BWP:
L_RBs, RB_start= self.parseRiv(riv, 275)
Note 1: According to 38.213 12:
and the value range of locationAndBandwidth is 0~37949.
Note 2: locationAndBandwidth range [37675, 37812] is invalid, aka, L_RBs = 139, RB_start=[137, 274]. For example, let locationAndBandwidth=37675:
parseRiv: riv=37675, L_RBs=139, RB_start=274
ERROR: L_RBs = 139, RB_start = 274, N_BWP_Size = 275.