def parseRegister(register, baseAddress, prefix, ext): reservedBits = 0xFFFFFFFF fieldOut = "" for field in register.fields: msb = field.bit_offset+field.bit_width-1 lsb = field.bit_offset fieldType = "unsigned" fieldName = Ft.formatVariable(field.name) fieldOut += " ///%s\n" % field.description if Ft.useEnumeratedValues(field.enumerated_values,field.bit_width): fieldType = "%sVal" % (fieldName) fieldOut += " enum class %s {\n" % fieldType cValuesOut = "" for v in field.enumerated_values: if v.value is not None and v.is_default is None: #some value are defaults, we ignore them valName = Ft.getKey(ext,['field',field.name,'enum',v.name,'.rename']) or Ft.formatEnumValue(v.name) if valName != 'reserved': fieldOut+=" %s=0x%08x, ///<%s\n" % (valName,v.value,v.description) cValuesOut+=" constexpr MPL::Value<%sVal,%sVal::%s> %s{};\n" % (fieldName,fieldName,valName,valName) fieldOut += " };\n namespace %sValC{\n%s }\n" % (fieldName,cValuesOut) fieldOut += " constexpr Register::BitLocation<Addr,Register::maskFromRange(%d,%d),Register::%s,%s> %s{}; \n" % (msb,lsb,Ft.getAccess(register,field),fieldType,fieldName) reservedBits = Ft.clearBitsFromRange(msb,lsb,reservedBits) regType = "unsigned" if register.size is not None and register.size is 8: regType = "unsigned char" out = " namespace %s{ ///<%s\n" % (Ft.formatNamespace("%s%s" % (prefix, register.name)),register.description) out += " using Addr = Register::Address<0x%08x,0x%08x,0,%s>;\n" % (baseAddress + register.address_offset,reservedBits,regType) out += fieldOut out += " }\n" return out
def parseIo(extention,device,path): outFile = open(os.path.join(path,"Io.hpp"),'w',encoding='utf-8') outFile.write('#pragma once\n#include "Io/Io.hpp"\n#include "Register/Register.hpp"\n') outFile.write("namespace Kvasir{\n namespace Io{\n") io = Ft.getKey(extention,['kvasir','io']) for key in sorted(io): if key!="default": type = Ft.getKey(io,[key,'type']) if type == 'group': for port in formatIoPorts(Ft.getKey(io,[key,'ports'])): peripheral = Ft.getKey(io,[key,'peripheral']).replace('%s',port) register = Ft.getKey(io,[key,'register']).replace('%s',port) address = Ft.getKey(device,[peripheral]).base_address + Ft.getKey(device,[peripheral,register]).address_offset reserved = 0xFFFFFFFF for field in Ft.getKey(device,[peripheral,register]).fields: reserved = Ft.clearBitsFromRange(field.bit_offset + field.bit_width -1,field.bit_offset,reserved) portNumber = port if not portNumber.isdigit(): portNumber = ord(portNumber)-ord('A') if key == "read": action = "ReadAction" else: action = "WriteLiteralAction<(%s<<Pin)>" % Ft.getKey(io,[key,'value']) outFile.write(" template<int Pin>\n") outFile.write(" struct MakeAction<Action::%s,PinLocation<%d,Pin>> :\n" % (key.capitalize(),portNumber)) outFile.write(" Register::Action<Register::BitLocation<Register::Address<0x%08x,0x%08x>,(1<<Pin)>,Register::%s>{};\n\n"\ % (address,reserved,action)) outFile.write(" }\n}\n")
def parseIo(extention,device,path): outFile = open(posixpath.join(path,"Io.hpp"),'w',encoding='utf-8') outFile.write('#pragma once\n#include <Io/Io.hpp>\n#include <Register/Register.hpp>\n') outFile.write("namespace Kvasir{\n namespace Io{\n") io = Ft.getKey(extention,['kvasir','io']) for key in sorted(io): if key!="default": type = Ft.getKey(io,[key,'type']) if type == 'group': for port in formatIoPorts(Ft.getKey(io,[key,'ports'])): peripheral = Ft.getKey(io,[key,'peripheral']).replace('%s',port) register = Ft.getKey(io,[key,'register']).replace('%s',port) address = Ft.getKey(device,[peripheral]).base_address + Ft.getKey(device,[peripheral,register]).address_offset reserved = 0xFFFFFFFF for field in Ft.getKey(device,[peripheral,register]).fields: reserved = Ft.clearBitsFromRange(field.bit_offset + field.bit_width -1,field.bit_offset,reserved) portNumber = port if not portNumber.isdigit(): portNumber = ord(portNumber)-ord('A') if key == "read": action = "ReadAction" else: action = "WriteLiteralAction<(%s<<Pin)>" % Ft.getKey(io,[key,'value']) outFile.write(" template<int Pin>\n") outFile.write(" struct MakeAction<Action::%s,Register::PinLocation<%d,Pin>> :\n" % (key.capitalize(),portNumber)) outFile.write(" Register::Action<Register::FieldLocation<Register::Address<0x%08x,0x%08x>,(1<<Pin)>,Register::%s>{};\n\n"\ % (address,reserved,action)) outFile.write(" }\n}\n")
def parseRegister(register, baseAddress, prefix, ext): noActionIfZeroBits = 0xFFFFFFFF noActionIfOneBits = 0x00000000 fieldOut = "" for field in register.fields: msb = field.bit_offset + field.bit_width - 1 lsb = field.bit_offset fieldType = "unsigned" fieldName = Ft.formatVariable(field.name) fieldOut += " ///%s\n" % Ft.formatComment(field.description) cValuesOut = "" if Ft.useEnumeratedValues(field.enumerated_values, field.bit_width): fieldType = "%sVal" % (fieldName.capitalize()) fieldOut += " enum class %s {\n" % fieldType cValuesOut = " namespace %sC{\n" % fieldType for v in field.enumerated_values: if v.value is not None and v.is_default is None: #some value are defaults, we ignore them valName = Ft.getKey( ext, ['field', field.name, 'enum', v.name, '.rename' ]) or Ft.formatEnumValue(v.name) if valName != 'reserved': fieldOut += " %s=0x%08x, ///<%s\n" % ( valName, v.value, Ft.formatComment(v.description)) cValuesOut += " constexpr Register::FieldValue<decltype(%s)::Type,%sVal::%s> %s{};\n" % ( fieldName, fieldName.capitalize(), valName, valName) fieldOut += " };\n" cValuesOut += " }\n" access = Ft.getAccess(field, Ft.getKey(ext, ['field', field.name])) fieldOut += " constexpr Register::FieldLocation<Addr,Register::maskFromRange(%d,%d),Register::%s,%s> %s{}; \n%s" % ( msb, lsb, access, fieldType, fieldName, cValuesOut) if "oneTo" not in access: #only remove bits from reserved field if a write of zero actually changes something noActionIfZeroBits = Ft.clearBitsFromRange(msb, lsb, noActionIfZeroBits) if "zeroTo" in access: #if zeroToSet or zeroToClear then writing a 1 is a no action noActionIfOneBits = Ft.setBitsFromRange(msb, lsb, noActionIfOneBits) regType = "std::uint32_t" if register.size is not None: if register.size is 8: regType = "std::uint8_t" elif register.size is 16: regType = "std::uint16_t" out = " namespace %s{ ///<%s\n" % (Ft.formatNamespace( "%s_%s" % (prefix, register.name)), Ft.formatComment(register.description)) out += " using Addr = Register::Address<0x%08x,0x%08x,0x%08x,%s>;\n" % ( baseAddress + register.address_offset, noActionIfZeroBits, noActionIfOneBits, regType) out += fieldOut out += " }\n" return out
def parseIo(extention, device, path): outFile = open(posixpath.join(path, "Io.hpp"), "w", encoding="utf-8") outFile.write("#pragma once\n#include <Io/Io.hpp>\n#include <Register/Register.hpp>\n") outFile.write("namespace Kvasir{\n namespace Io{\n") io = Ft.getKey(extention, ["kvasir", "io"]) for key in sorted(io): if key != "default": type = Ft.getKey(io, [key, "type"]) if type == "group": for port in formatIoPorts(Ft.getKey(io, [key, "ports"])): peripheral = Ft.getKey(io, [key, "peripheral"]).replace("%s", port) register = Ft.getKey(io, [key, "register"]).replace("%s", port) address = ( Ft.getKey(device, [peripheral]).base_address + Ft.getKey(device, [peripheral, register]).address_offset ) reserved = 0xFFFFFFFF for field in Ft.getKey(device, [peripheral, register]).fields: reserved = Ft.clearBitsFromRange( field.bit_offset + field.bit_width - 1, field.bit_offset, reserved ) portNumber = port if not portNumber.isdigit(): portNumber = ord(portNumber) - ord("A") if key == "read": action = "ReadAction" else: action = "WriteLiteralAction<(%s<<Pin)>" % Ft.getKey(io, [key, "value"]) outFile.write(" template<int Pin>\n") outFile.write( " struct MakeAction<Action::%s,Register::PinLocation<%d,Pin>> :\n" % (key.capitalize(), portNumber) ) outFile.write( " Register::Action<Register::FieldLocation<Register::Address<0x%08x,0x%08x>,(1<<Pin)>,Register::%s>{};\n\n" % (address, reserved, action) ) outFile.write(" }\n}\n")
def parseRegister(register, baseAddress, prefix, ext): noActionIfZeroBits = 0xFFFFFFFF noActionIfOneBits = 0x00000000 fieldOut = "" for field in register.fields: msb = field.bit_offset + field.bit_width - 1 lsb = field.bit_offset fieldType = "unsigned" fieldName = Ft.formatVariable(field.name) fieldOut += " ///%s\n" % Ft.formatComment( Ft.getKey(ext, ["field", field.name, "description"]) or field.description ) cValuesOut = "" if Ft.useEnumeratedValues(field.enumerated_values, field.bit_width): fieldType = "%sVal" % (fieldName.capitalize()) fieldOut += " enum class %s {\n" % fieldType cValuesOut = " namespace %sC{\n" % fieldType for v in field.enumerated_values: if v.value is not None and v.is_default is None: # some value are defaults, we ignore them valName = Ft.getKey(ext, ["field", field.name, "enum", v.name, ".rename"]) or Ft.formatEnumValue( v.name ) if valName != "reserved": fieldOut += " %s=0x%08x, ///<%s\n" % ( valName, v.value, Ft.formatComment(v.description), ) cValuesOut += ( " constexpr Register::FieldValue<decltype(%s)::Type,%sVal::%s> %s{};\n" % (fieldName, fieldName.capitalize(), valName, valName) ) fieldOut += " };\n" cValuesOut += " }\n" access = Ft.getAccess(field, Ft.getKey(ext, ["field", field.name])) fieldOut += ( " constexpr Register::FieldLocation<Addr,Register::maskFromRange(%d,%d),Register::%s,%s> %s{}; \n%s" % (msb, lsb, access, fieldType, fieldName, cValuesOut) ) if "oneTo" not in access: # only remove bits from reserved field if a write of zero actually changes something noActionIfZeroBits = Ft.clearBitsFromRange(msb, lsb, noActionIfZeroBits) if "zeroTo" in access: # if zeroToSet or zeroToClear then writing a 1 is a no action noActionIfOneBits = Ft.setBitsFromRange(msb, lsb, noActionIfOneBits) size = Ft.getKey(ext, ["size"]) if size is not None: register.size = size elif register.size is None: register.size = 32 if register.size is 8: regType = "unsigned char" if register.size is 16: regType = "unsigned short" if register.size is 32: regType = "unsigned" out = " namespace %s{ ///<%s\n" % ( Ft.formatNamespace("%s_%s" % (prefix, register.name)), Ft.formatComment(register.description), ) out += " using Addr = Register::Address<0x%08x,0x%08x,0x%08x,%s>;\n" % ( baseAddress + register.address_offset, noActionIfZeroBits, noActionIfOneBits, regType, ) out += fieldOut out += " }\n" return out