NG Toolset開發筆記--5GNR Resource Grid(39)

Procedures for SLIV(Start and Length Indication Value):

def makeSliv(self, S, L):
        if L <= 0 or L > 14 - S:
            return None
        
        if (L - 1) <= 7:
            sliv = 14 * (L - 1) + S
        else:
            sliv = 14 * (14 - L + 1) + (14 - 1 - S)
        
        return sliv

Valid SLIVs for PDSCH and PUSCH are generated as below:

def initPdschSliv(self):
        #prefix
        #'00': mapping type A + normal cp
        #'01': mapping type A + extended cp
        #'10': mapping type B + normal cp
        #'11': mapping type B + extended cp
        
        self.nrPdschToSliv = dict()
        self.nrPdschFromSliv = dict()
        
        #case1: prefix='00'
        prefix = '00'
        for S in range(4):
            for L in range(3, 15):
                if S+L in range(3, 15):
                    sliv = self.makeSliv(S, L)
                    if sliv is not None:
                        keyToSliv = '%s_%s_%s' % (prefix, S, L)
                        self.nrPdschToSliv[keyToSliv] = sliv
                        keyFromSliv = '%s_%s' % (prefix, sliv)
                        self.nrPdschFromSliv[keyFromSliv] = (S, L)
        
        #case2: prefix='01'
        prefix = '01'
        for S in range(4):
            for L in range(3, 13):
                if S+L in range(3, 13):
                    sliv = self.makeSliv(S, L)
                    if sliv is not None:
                        keyToSliv = '%s_%s_%s' % (prefix, S, L)
                        self.nrPdschToSliv[keyToSliv] = sliv
                        keyFromSliv = '%s_%s' % (prefix, sliv)
                        self.nrPdschFromSliv[keyFromSliv] = (S, L)
        
        #case2: prefix='10'
        prefix = '10'
        for S in range(13):
            for L in (2,4,7):
                if S+L in range(2, 15):
                    sliv = self.makeSliv(S, L)
                    if sliv is not None:
                        keyToSliv = '%s_%s_%s' % (prefix, S, L)
                        self.nrPdschToSliv[keyToSliv] = sliv
                        keyFromSliv = '%s_%s' % (prefix, sliv)
                        self.nrPdschFromSliv[keyFromSliv] = (S, L)
        
        #case2: prefix='11'
        prefix = '11'
        for S in range(11):
            for L in (2,4,6):
                if S+L in range(2, 13):
                    sliv = self.makeSliv(S, L)
                    if sliv is not None:
                        keyToSliv = '%s_%s_%s' % (prefix, S, L)
                        self.nrPdschToSliv[keyToSliv] = sliv
                        keyFromSliv = '%s_%s' % (prefix, sliv)
                        self.nrPdschFromSliv[keyFromSliv] = (S, L)
def initPuschSliv(self):
        #prefix
        #'00': mapping type A + normal cp
        #'01': mapping type A + extended cp
        #'10': mapping type B + normal cp
        #'11': mapping type B + extended cp
        
        self.nrPuschToSliv = dict()
        self.nrPuschFromSliv = dict()
        
        #case1: prefix='00'
        prefix = '00'
        for S in (0,):
            for L in range(4, 15):
                if S+L in range(4, 15):
                    sliv = self.makeSliv(S, L)
                    if sliv is not None:
                        keyToSliv = '%s_%s_%s' % (prefix, S, L)
                        self.nrPuschToSliv[keyToSliv] = sliv
                        keyFromSliv = '%s_%s' % (prefix, sliv)
                        self.nrPuschFromSliv[keyFromSliv] = (S, L)
        
        #case2: prefix='01'
        prefix = '01'
        for S in (0,):
            for L in range(4, 13):
                if S+L in range(4, 13):
                    sliv = self.makeSliv(S, L)
                    if sliv is not None:
                        keyToSliv = '%s_%s_%s' % (prefix, S, L)
                        self.nrPuschToSliv[keyToSliv] = sliv
                        keyFromSliv = '%s_%s' % (prefix, sliv)
                        self.nrPuschFromSliv[keyFromSliv] = (S, L)
        
        #case2: prefix='10'
        prefix = '10'
        for S in range(14):
            for L in range(1, 15):
                if S+L in range(1, 15):
                    sliv = self.makeSliv(S, L)
                    if sliv is not None:
                        keyToSliv = '%s_%s_%s' % (prefix, S, L)
                        self.nrPuschToSliv[keyToSliv] = sliv
                        keyFromSliv = '%s_%s' % (prefix, sliv)
                        self.nrPuschFromSliv[keyFromSliv] = (S, L)
        
        #case2: prefix='11'
        prefix = '11'
        for S in range(13):
            for L in range(1, 13):
                if S+L in range(1, 13):
                    sliv = self.makeSliv(S, L)
                    if sliv is not None:
                        keyToSliv = '%s_%s_%s' % (prefix, S, L)
                        self.nrPuschToSliv[keyToSliv] = sliv
                        keyFromSliv = '%s_%s' % (prefix, sliv)
                        self.nrPuschFromSliv[keyFromSliv] = (S, L)

Helper functions for 'convert into' and 'convert from' SLIV:

def toSliv(self, S, L, sch='pdsch', type='Type A', cp='normal'):
        if type == 'Type A':
            if cp == 'normal':
                prefix = '00'
            elif cp == 'extended':
                prefix = '01'
            else:
                return None
        elif type == 'Type B':
            if cp == 'normal':
                prefix = '10'
            elif cp == 'extended':
                prefix = '11'
            else:
                return None
        else:
            return None
                
        key = '%s_%s_%s' % (prefix, S, L)
        if sch == 'pdsch':
            if not key in self.nrPdschToSliv.keys():
                return None
            else:
                sliv = self.nrPdschToSliv[key]
        elif sch == 'pusch':
            if not key in self.nrPuschToSliv.keys():
                return None
            else:
                sliv = self.nrPuschToSliv[key]
        else:
            return None
        
        return sliv
def fromSliv(self, sliv, sch='pdsch', type='Type A', cp='normal'):
        if type == 'Type A':
            if cp == 'normal':
                prefix = '00'
            elif cp == 'extended':
                prefix = '01'
            else:
                return (None, None)
        elif type == 'Type B':
            if cp == 'normal':
                prefix = '10'
            elif cp == 'extended':
                prefix = '11'
            else:
                return (None, None)
        else:
            return (None, None)
                
        key = '%s_%s' % (prefix, sliv)
        if sch == 'pdsch':
            if not key in self.nrPdschFromSliv.keys():
                return (None, None)
            else:
                S, L = self.nrPdschFromSliv[key]
        elif sch == 'pusch':
            if not key in self.nrPuschFromSliv.keys():
                return (None, None)
            else:
                S, L = self.nrPuschFromSliv[key]
        else:
            return (None, None)
        
        return (S, L) 

All valid (Prefix,S,L,SLIV) combinations can be found:

鏈接: https://pan.baidu.com/s/1hMJeD8jGF0Ldd_BoVqPY5A

提取碼: 712u

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章