generator: handle fields that use bitRange element and ensure all caps for attributes that are not already capitalized or start with number.
Also handle subclusters. Signed-off-by: Ron Evans <ron@hybridgroup.com>
Этот коммит содержится в:
		
							родитель
							
								
									4397152108
								
							
						
					
					
						коммит
						fb1a476033
					
				
					 1 изменённых файлов: 59 добавлений и 16 удалений
				
			
		| 
						 | 
					@ -128,6 +128,8 @@ def readSVD(path, sourceURL):
 | 
				
			||||||
                peripheral['registers'].extend(parseRegister(groupName or name, register, baseAddress))
 | 
					                peripheral['registers'].extend(parseRegister(groupName or name, register, baseAddress))
 | 
				
			||||||
            for cluster in regsEls[0].findall('cluster'):
 | 
					            for cluster in regsEls[0].findall('cluster'):
 | 
				
			||||||
                clusterName = getText(cluster.find('name')).replace('[%s]', '')
 | 
					                clusterName = getText(cluster.find('name')).replace('[%s]', '')
 | 
				
			||||||
 | 
					                if cluster.find('dimIndex') is not None:
 | 
				
			||||||
 | 
					                    clusterName = clusterName.replace('%s', '')
 | 
				
			||||||
                clusterDescription = getText(cluster.find('description'))
 | 
					                clusterDescription = getText(cluster.find('description'))
 | 
				
			||||||
                clusterPrefix = clusterName + '_'
 | 
					                clusterPrefix = clusterName + '_'
 | 
				
			||||||
                clusterOffset = int(getText(cluster.find('addressOffset')), 0)
 | 
					                clusterOffset = int(getText(cluster.find('addressOffset')), 0)
 | 
				
			||||||
| 
						 | 
					@ -137,6 +139,33 @@ def readSVD(path, sourceURL):
 | 
				
			||||||
                        cpRegisters = []
 | 
					                        cpRegisters = []
 | 
				
			||||||
                        for regEl in cluster.findall('register'):
 | 
					                        for regEl in cluster.findall('register'):
 | 
				
			||||||
                            cpRegisters.extend(parseRegister(groupName, regEl, baseAddress, clusterName+"_"))
 | 
					                            cpRegisters.extend(parseRegister(groupName, regEl, baseAddress, clusterName+"_"))
 | 
				
			||||||
 | 
					                        # handle sub-clusters of registers
 | 
				
			||||||
 | 
					                        for subClusterEl in cluster.findall('cluster'):
 | 
				
			||||||
 | 
					                            subclusterName = getText(subClusterEl.find('name')).replace('[%s]', '')
 | 
				
			||||||
 | 
					                            subclusterDescription = getText(subClusterEl.find('description'))
 | 
				
			||||||
 | 
					                            subclusterPrefix = subclusterName + '_'
 | 
				
			||||||
 | 
					                            subclusterOffset = int(getText(subClusterEl.find('addressOffset')), 0)
 | 
				
			||||||
 | 
					                            subdim = int(getText(subClusterEl.find('dim')))
 | 
				
			||||||
 | 
					                            subdimIncrement = int(getText(subClusterEl.find('dimIncrement')), 16)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            if subdim > 1:
 | 
				
			||||||
 | 
					                                subcpRegisters = []
 | 
				
			||||||
 | 
					                                subregSize = 0
 | 
				
			||||||
 | 
					                                for regEl in subClusterEl.findall('register'):
 | 
				
			||||||
 | 
					                                    subregSize += int(getText(regEl.find('size')))
 | 
				
			||||||
 | 
					                                    subcpRegisters.extend(parseRegister(groupName, regEl, baseAddress + subclusterOffset, subclusterPrefix))
 | 
				
			||||||
 | 
					                                cpRegisters.append({
 | 
				
			||||||
 | 
					                                    'name':        subclusterName,
 | 
				
			||||||
 | 
					                                    'address':     baseAddress + subclusterOffset,
 | 
				
			||||||
 | 
					                                    'description': subclusterDescription,
 | 
				
			||||||
 | 
					                                    'registers':   subcpRegisters,
 | 
				
			||||||
 | 
					                                    'array':       subdim,
 | 
				
			||||||
 | 
					                                    'elementsize': subdimIncrement,
 | 
				
			||||||
 | 
					                                })
 | 
				
			||||||
 | 
					                            else:
 | 
				
			||||||
 | 
					                                for regEl in subClusterEl.findall('register'):
 | 
				
			||||||
 | 
					                                    cpRegisters.extend(parseRegister(getText(regEl.find('name')), regEl, baseAddress + subclusterOffset, subclusterPrefix))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        cpRegisters.sort(key=lambda r: r['address'])
 | 
					                        cpRegisters.sort(key=lambda r: r['address'])
 | 
				
			||||||
                        clusterPeripheral = {
 | 
					                        clusterPeripheral = {
 | 
				
			||||||
                            'name':        name+ "_" +clusterName,
 | 
					                            'name':        name+ "_" +clusterName,
 | 
				
			||||||
| 
						 | 
					@ -218,16 +247,25 @@ def parseBitfields(groupName, regName, fieldsEls, bitfieldPrefix=''):
 | 
				
			||||||
            # names like 'CNT[31]'. Replace invalid characters with '_' when
 | 
					            # names like 'CNT[31]'. Replace invalid characters with '_' when
 | 
				
			||||||
            # needed.
 | 
					            # needed.
 | 
				
			||||||
            fieldName = cleanName(getText(fieldEl.find('name')))
 | 
					            fieldName = cleanName(getText(fieldEl.find('name')))
 | 
				
			||||||
            lsbTags = fieldEl.findall('lsb')
 | 
					            if not fieldName[0].isupper() and not fieldName[0].isdigit():
 | 
				
			||||||
            if len(lsbTags) == 1:
 | 
					                fieldName = fieldName.upper()
 | 
				
			||||||
                lsb = int(getText(lsbTags[0]))
 | 
					            if len(fieldEl.findall('lsb')) == 1 and len(fieldEl.findall('msb')) == 1:
 | 
				
			||||||
            else:
 | 
					                # try to use lsb/msb tags
 | 
				
			||||||
 | 
					                lsb = int(getText(fieldEl.findall('lsb')[0]))
 | 
				
			||||||
 | 
					                msb = int(getText(fieldEl.findall('msb')[0]))
 | 
				
			||||||
 | 
					            elif len(fieldEl.findall('bitOffset')) > 0 and len(fieldEl.findall('bitWidth')) > 0:
 | 
				
			||||||
 | 
					                # try to use bitOffset/bitWidth tags
 | 
				
			||||||
                lsb = int(getText(fieldEl.find('bitOffset')))
 | 
					                lsb = int(getText(fieldEl.find('bitOffset')))
 | 
				
			||||||
            msbTags = fieldEl.findall('msb')
 | 
					 | 
				
			||||||
            if len(msbTags) == 1:
 | 
					 | 
				
			||||||
                msb = int(getText(msbTags[0]))
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                msb = int(getText(fieldEl.find('bitWidth'))) + lsb - 1
 | 
					                msb = int(getText(fieldEl.find('bitWidth'))) + lsb - 1
 | 
				
			||||||
 | 
					            elif len(fieldEl.findall('bitRange')) > 0:
 | 
				
			||||||
 | 
					                # try use bitRange
 | 
				
			||||||
 | 
					                bitRangeTags = fieldEl.findall('bitRange')
 | 
				
			||||||
 | 
					                lsb = int(getText(bitRangeTags[0]).split(":")[1][:-1])
 | 
				
			||||||
 | 
					                msb = int(getText(bitRangeTags[0]).split(":")[0][1:])
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                # this is an error. what to do?
 | 
				
			||||||
 | 
					                print("unable to find lsb/msb in field:", fieldName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            fields.append({
 | 
					            fields.append({
 | 
				
			||||||
                'name':        '{}_{}{}_{}_Pos'.format(groupName, bitfieldPrefix, regName, fieldName),
 | 
					                'name':        '{}_{}{}_{}_Pos'.format(groupName, bitfieldPrefix, regName, fieldName),
 | 
				
			||||||
                'description': 'Position of %s field.' % fieldName,
 | 
					                'description': 'Position of %s field.' % fieldName,
 | 
				
			||||||
| 
						 | 
					@ -246,6 +284,8 @@ def parseBitfields(groupName, regName, fieldsEls, bitfieldPrefix=''):
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
            for enumEl in fieldEl.findall('enumeratedValues/enumeratedValue'):
 | 
					            for enumEl in fieldEl.findall('enumeratedValues/enumeratedValue'):
 | 
				
			||||||
                enumName = getText(enumEl.find('name'))
 | 
					                enumName = getText(enumEl.find('name'))
 | 
				
			||||||
 | 
					                if not enumName[0].isupper() and not enumName[0].isdigit():
 | 
				
			||||||
 | 
					                    enumName = enumName.upper()
 | 
				
			||||||
                enumDescription = getText(enumEl.find('description')).replace('\n', ' ')
 | 
					                enumDescription = getText(enumEl.find('description')).replace('\n', ' ')
 | 
				
			||||||
                enumValue = int(getText(enumEl.find('value')), 0)
 | 
					                enumValue = int(getText(enumEl.find('value')), 0)
 | 
				
			||||||
                fields.append({
 | 
					                fields.append({
 | 
				
			||||||
| 
						 | 
					@ -311,15 +351,17 @@ def parseRegister(groupName, regEl, baseAddress, bitfieldPrefix=''):
 | 
				
			||||||
                    'elementsize': reg.size(),
 | 
					                    'elementsize': reg.size(),
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
            # set first result bitfield
 | 
					            # set first result bitfield
 | 
				
			||||||
            shortName = reg.name().replace('_%s', '').replace('%s', '')
 | 
					            shortName = reg.name().replace('_%s', '').replace('%s', '').upper()
 | 
				
			||||||
            results[0]['bitfields'] = parseBitfields(groupName, shortName, fieldsEls, bitfieldPrefix)
 | 
					            results[0]['bitfields'] = parseBitfields(groupName, shortName, fieldsEls, bitfieldPrefix)
 | 
				
			||||||
            return results
 | 
					            return results
 | 
				
			||||||
 | 
					    regName = reg.name()
 | 
				
			||||||
 | 
					    if not regName[0].isupper() and not regName[0].isdigit():
 | 
				
			||||||
 | 
					        regName = regName.upper()
 | 
				
			||||||
    return [{
 | 
					    return [{
 | 
				
			||||||
        'name':        reg.name(),
 | 
					        'name':        regName,
 | 
				
			||||||
        'address':     reg.address(),
 | 
					        'address':     reg.address(),
 | 
				
			||||||
        'description': reg.description(),
 | 
					        'description': reg.description(),
 | 
				
			||||||
        'bitfields':   parseBitfields(groupName, reg.name(), fieldsEls, bitfieldPrefix),
 | 
					        'bitfields':   parseBitfields(groupName, regName, fieldsEls, bitfieldPrefix),
 | 
				
			||||||
        'array':       reg.dim(),
 | 
					        'array':       reg.dim(),
 | 
				
			||||||
        'elementsize': reg.size(),
 | 
					        'elementsize': reg.size(),
 | 
				
			||||||
    }]
 | 
					    }]
 | 
				
			||||||
| 
						 | 
					@ -417,7 +459,7 @@ const (
 | 
				
			||||||
                        subregType = 'volatile.Register32'
 | 
					                        subregType = 'volatile.Register32'
 | 
				
			||||||
                    elif subregister['elementsize'] == 2:
 | 
					                    elif subregister['elementsize'] == 2:
 | 
				
			||||||
                        subregType = 'volatile.Register16'
 | 
					                        subregType = 'volatile.Register16'
 | 
				
			||||||
                    else:
 | 
					                    elif subregister['elementsize'] == 1:
 | 
				
			||||||
                        subregType = 'volatile.Register8'
 | 
					                        subregType = 'volatile.Register8'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if subregister['array']:
 | 
					                    if subregister['array']:
 | 
				
			||||||
| 
						 | 
					@ -439,13 +481,14 @@ const (
 | 
				
			||||||
                        padNumber += 1
 | 
					                        padNumber += 1
 | 
				
			||||||
                        subaddress += bytesNeeded
 | 
					                        subaddress += bytesNeeded
 | 
				
			||||||
                    if subregister['array'] is not None:
 | 
					                    if subregister['array'] is not None:
 | 
				
			||||||
                        subaddress += subregister['elementsize'] * subregister['array']
 | 
					                        subregSize = subregister['array'] * subregister['elementsize']
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        subaddress += subregister['elementsize']
 | 
					                        subregSize = subregister['elementsize']
 | 
				
			||||||
 | 
					                    subaddress += subregSize
 | 
				
			||||||
                    regType += '\t\t{name} {subregType}\n'.format(name=subregister['name'], subregType=subregType)
 | 
					                    regType += '\t\t{name} {subregType}\n'.format(name=subregister['name'], subregType=subregType)
 | 
				
			||||||
                if register['array'] is not None:
 | 
					                if register['array'] is not None:
 | 
				
			||||||
                    if subaddress != register['address'] + register['elementsize']:
 | 
					                    if subaddress != register['address'] + register['elementsize']:
 | 
				
			||||||
                        numSkip = ((register['address'] + register['elementsize']) - subaddress) // 4
 | 
					                        numSkip = ((register['address'] + register['elementsize']) - subaddress) // subregSize
 | 
				
			||||||
                        if numSkip <= 1:
 | 
					                        if numSkip <= 1:
 | 
				
			||||||
                            regType += '\t\t_padding{padNumber} {subregType}\n'.format(padNumber=padNumber, subregType=subregType)
 | 
					                            regType += '\t\t_padding{padNumber} {subregType}\n'.format(padNumber=padNumber, subregType=subregType)
 | 
				
			||||||
                        else:
 | 
					                        else:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче