def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'Memory': """Extracts the Memory related info from the given configuration.""" keyName = "Memory" prevKeySeq.append(keyName) config: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], ) physicalAddrWidth = util.getConfigurationParameter( data=config, keySeq=["MaxPhysicalAddrBitWidth"], prevKeySeq=prevKeySeq, default=36, ) flash = Memory.generateFlashRegion(config, prevKeySeq) ram = Memory.generateRamRegion(config, prevKeySeq) ncram = Memory.generateNcRamRegion(config, prevKeySeq) mmio = Memory.generateMmioRegion(config, prevKeySeq) prevKeySeq.pop() memory = Memory(flash, ram, ncram, mmio, physicalAddrWidth) return memory
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'Traps': keyName = "Interrupts" prevKeySeq.append(keyName) config: Opt[List] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=[], prevKeySeq=prevKeySeq, ) hw = Traps.generateHandlerList(config, prevKeySeq) prevKeySeq.pop() keyName = "Traps" prevKeySeq.append(keyName) config: Opt[List] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=[], prevKeySeq=prevKeySeq, ) sw = Traps.generateHandlerList(config, prevKeySeq) prevKeySeq.pop() traps = Traps(hw=hw, sw=sw) return traps
def generateObject( userProvidedConfig: Opt[Dict], prevKeySeq: Opt[List] = None, ) -> 'Queue': name: str = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["Name"], default=None, prevKeySeq=prevKeySeq, ) msgSizeInBytes: int = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["MsgSizeInBytes"], default=None, prevKeySeq=prevKeySeq, fail=True, ) length: int = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["Length"], default=None, prevKeySeq=prevKeySeq, fail=True, ) queue = Queue( qid=0, # is set separately msgSizeInBytes=msgSizeInBytes, length=length, name=name, ) return queue
def generateNcRamRegion( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> MemoryRegion: keyName = "NCRAM" prevKeySeq.append(keyName) ncramConfig: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], prevKeySeq=prevKeySeq[:-1], fail=False, ) if ncramConfig: ncram = MemoryRegion.generateObject(ncramConfig, prevKeySeq) else: ncram = MemoryRegion( virtualStartAddr=0x0, physicalStartAddr=0x0, sizeInBytes=0, cacheable=False, ) ncram.name = "NCRAM" ncram.oneLineDescription = "Non-Cacheable Random Access Memory" prevKeySeq.pop() return ncram
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'Bget': keyName = "DynamicMemory" prevKeySeq.append(keyName) config: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=None, prevKeySeq=prevKeySeq[:-1], ) if config: sizeInBytes = util.getSizeInBytes( config, default=consts.DEFAULT_BGET_MEM_SIZE_IN_KB * 1024, prevKeySeq=prevKeySeq, ) else: sizeInBytes = 0 bget = Bget( sizeInBytes=sizeInBytes, ) prevKeySeq.pop() return bget
def generateMmioRegion( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> MemoryRegion: keyName = "MMIO" prevKeySeq.append(keyName) mmioConfig: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], ) if mmioConfig: io = MemoryRegion.generateObject(mmioConfig, prevKeySeq) else: io = MemoryRegion( name="MMIO", oneLineDescription="Memory Mapped IO.", virtualStartAddr=0xFFFF0000, physicalStartAddr=0xFFFF0000, sizeInBytes=2**16, ) prevKeySeq.pop() return io
def generateRamRegion( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> MemoryRegion: keyName = "RAM" prevKeySeq.append(keyName) ramConfig: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], prevKeySeq=prevKeySeq[:-1], fail=True, ) if ramConfig: ram = MemoryRegion.generateObject(ramConfig, prevKeySeq) else: ram = MemoryRegion( name="RAM", oneLineDescription="Random Access Memory", virtualStartAddr=0x0, physicalStartAddr=0x0, sizeInBytes=0, ) prevKeySeq.pop() return ram
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'Build': keyName = "BuildAndExecute" prevKeySeq.append(keyName) config: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=None, prevKeySeq=prevKeySeq[:-1], ) debug = Build.generateDebugParam(config, prevKeySeq) debugPort = Build.generateFirstDebugPortParam(config, prevKeySeq) optLevel = Build.generateOptLevelParam(config, prevKeySeq) logLevel = Build.generateLogLevelParam(config, prevKeySeq) enableSerial = Build.generateEnableSerialParam(config, prevKeySeq) enableSerialInt = Build.generateEnableSerialIntParam( config, prevKeySeq) buildArgs = Build.generateBuildArgsParam(config, prevKeySeq) prevKeySeq.pop() build = Build( debug=debug, firstDebugPort=debugPort, optLevel=optLevel, logLevel=logLevel, enableSerial=enableSerial, enableSerialInt=enableSerialInt, buildArgs=buildArgs, ) return build
def generateDevices( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> Dict[str, Device]: data = dict() keyName = "Devices" prevKeySeq.append(keyName) config: Opt[List] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=None, prevKeySeq=prevKeySeq[:-1], fail=True, ) if config: # must be a list for index, deviceConfig in enumerate(config): prevKeySeq.append(index) device = Device.generateObject( userProvidedConfig=deviceConfig, prevKeySeq=prevKeySeq, ) data[device.name] = device prevKeySeq.pop() prevKeySeq.pop() return data
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'QueueSeq': """Takes a user given configuration and extracts the Queue related configuration.""" keyName = "Queues" prevKeySeq.append(keyName) queueConfigList: Opt[List] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=None, prevKeySeq=prevKeySeq[:-1], ) if queueConfigList is None: prevKeySeq.pop() return QueueSeq([]) queueList = [] for i, queueConfig in enumerate(queueConfigList): prevKeySeq.append(i) queue = Queue.generateObject(queueConfig, prevKeySeq) queue.qid = i queueList.append(queue) prevKeySeq.pop() prevKeySeq.pop() return QueueSeq(queueList)
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'Processor': """Takes a user given configuration and extracts the Processor related configuration.""" keyName = "Processor" config: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=None, prevKeySeq=prevKeySeq, ) coreCount: int = util.getConfigurationParameter( data=config, keySeq=["Cores"], default=1, prevKeySeq=prevKeySeq, fail=True, ) threadsPerCoreCount: int = util.getConfigurationParameter( data=config, keySeq=["ThreadsPerCore"], default=1, prevKeySeq=prevKeySeq, fail=True, ) isa: int = util.getConfigurationParameter( data=config, keySeq=["ISA"], default=32, prevKeySeq=prevKeySeq, fail=True, ) cpu = Processor(coreCount, threadsPerCoreCount, isa) return cpu
def generateObject( userProvidedConfig: Opt[Dict], coreThread: CoreThread, prevKeySeq: Opt[List] = None, ) -> 'ProgramThread': stackSizeConf = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["StackSize"], default=None, prevKeySeq=prevKeySeq, ) stackSizeInBytes = util.getSizeInBytes( stackSizeConf, default=consts.DEFAULT_STACK_SIZE, prevKeySeq=prevKeySeq, ) initCallSeq = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["CortosInitCalls"], default=["main"], prevKeySeq=prevKeySeq, ) loopCallSeq = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["CortosLoopCalls"], default=[], prevKeySeq=prevKeySeq, ) progThread = ProgramThread( coreThread=coreThread, stackSizeInBytes=stackSizeInBytes, initCallSeq=initCallSeq, loopCallSeq=loopCallSeq, ) return progThread
def generateLogLevelParam( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> consts.LogLevel: keyName = "LogLevel" logLevelStr: str = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=consts.DEFAULT_LOG_LEVEL.name, prevKeySeq=prevKeySeq, ) return Build.getLogLevel(logLevelStr)
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'Handler': trapCode = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["Index"], default=None, prevKeySeq=prevKeySeq, ) funcName = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["Function"], default=None, prevKeySeq=prevKeySeq, ) handler = Handler( index=trapCode, function=funcName, ) return handler
def generateBuildArgsParam( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> str: keyName = "BuildArgs" buildArgs: str = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default="", prevKeySeq=prevKeySeq, ) return buildArgs
def generateFirstDebugPortParam( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> int: keyName = "FirstDebugPort" firstDebugPort: int = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=consts.DEFAULT_FIRST_DEBUG_PORT, prevKeySeq=prevKeySeq, ) return int(firstDebugPort)
def generateEnableSerialIntParam( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> bool: keyName = "EnableSerialInterrupt" enableSerialInt: bool = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=consts.DEFAULT_ENABLE_SERIAL_DEVICE, prevKeySeq=prevKeySeq, ) return enableSerialInt
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, initPageTableLevels: bool = True, ) -> 'MemoryRegion': """Takes a user given configuration and extracts the data into an object.""" startAddr: int = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["StartAddr"], prevKeySeq=prevKeySeq, fail=True, ) sizeInBytes = util.getSizeInBytes( data=userProvidedConfig, startAddr=startAddr, prevKeySeq=prevKeySeq, fail=True, ) permissions: str = util.getConfigurationParameter( data=userProvidedConfig, keySeq=["Permissions"], default="RWXC", prevKeySeq=prevKeySeq, ) memoryRegion = MemoryRegion( virtualStartAddr=startAddr, physicalStartAddr=startAddr, sizeInBytes=sizeInBytes, cacheable="C" in permissions.upper(), permissions=consts.getPagePermission(permissions), initPageTableLevels=initPageTableLevels, ) return memoryRegion
def generateDebugParam( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> bool: keyName = "Debug" debugFlag: bool = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=consts.DEFAULT_DEBUG_BUILD, prevKeySeq=prevKeySeq, ) debug = debugFlag return debug
def generateOptLevelParam( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> int: keyName = "OptimizationLevel" optLevel: int = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=consts.DEFAULT_OPT_LEVEL, prevKeySeq=prevKeySeq, ) if not 0 <= optLevel <= 2: optLevel = consts.DEFAULT_OPT_LEVEL return optLevel
def generateNamedRegisters( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> Dict[str, int]: keyName = "NamedRegisters" prevKeySeq.append(keyName) namedRegisters: Dict = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=dict(), prevKeySeq=prevKeySeq[:-1], ).copy() # shallow copy the content of the dictionary prevKeySeq.pop() return namedRegisters
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'Startup': keyName = "StartupFuncName" prevKeySeq.append(keyName) funcName: Opt[str] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default="", prevKeySeq=prevKeySeq[:-1], ) prevKeySeq.pop() startup = Startup(startupFuncName=funcName, ) return startup
def generateMemoryRegionObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> MemoryRegion: keyName = "MemoryRegion" prevKeySeq.append(keyName) config: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], prevKeySeq=prevKeySeq[:-1], fail=True, ) memoryRegion = MemoryRegion.generateObject( userProvidedConfig=config, prevKeySeq=prevKeySeq[:-1], initPageTableLevels=False, ) prevKeySeq.pop() return memoryRegion
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'Hardware': """Takes a user given configuration and extracts the CPU related configuration.""" keyName = "Hardware" config: Opt[Dict] = util.getConfigurationParameter( userProvidedConfig, [keyName], ) cpu = Processor.generateObject(config, prevKeySeq=[keyName]) memory = Memory.generateObject(config, prevKeySeq=[keyName]) devices = Hardware.generateDevices(config, prevKeySeq=[keyName]) hardware = Hardware( cpu=cpu, memory=memory, devices=devices, ) return hardware
def generateObject( userProvidedConfig: Dict, ajitCpu: Processor, prevKeySeq: Opt[List] = None, ) -> 'Program': keyName = "ProgramThreads" prevKeySeq.append(keyName) config: Opt[List] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=None, prevKeySeq=prevKeySeq[:-1], fail=True, ) progThreads = [] coreThread = ajitCpu.getThreadZero() for i, programThread in enumerate(config): prevKeySeq.append(i) if coreThread is None: util.printKeySeqMessage(prevKeySeq, message="No H/W thread to schedule program.") util.exitProgram("User programs exceed available h/w threads.") programThread = ProgramThread.generateObject( userProvidedConfig=programThread, coreThread=coreThread, prevKeySeq=prevKeySeq, ) progThreads.append(programThread) coreThread = ajitCpu.getNextThread(coreThread) prevKeySeq.pop() program = Program(progThreads) prevKeySeq.pop() return program
def generateObject( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> 'Device': keyName = "Name" name: str = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default="Unknown", prevKeySeq=prevKeySeq, ) memoryRegion = Device.generateMemoryRegionObject( userProvidedConfig=userProvidedConfig, prevKeySeq=prevKeySeq, ) namedRegisters = Device.generateNamedRegisters( userProvidedConfig=userProvidedConfig, prevKeySeq=prevKeySeq, ) device = Device(name, memoryRegion, namedRegisters) return device
def generateFlashRegion( userProvidedConfig: Dict, prevKeySeq: Opt[List] = None, ) -> MemoryRegion: keyName = "Flash" prevKeySeq.append(keyName) flashConfig: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], prevKeySeq=prevKeySeq[:-1], ) if flashConfig: flash = MemoryRegion.generateObject(flashConfig, prevKeySeq) else: flash = MemoryRegion( name="Flash", oneLineDescription="Flash Memory", sizeInBytes=0, ) prevKeySeq.pop() return flash
def generateObject( userProvidedConfig: Dict, hardware: Hardware, prevKeySeq: Opt[List] = None, ) -> 'Software': """Takes a user given configuration and extracts the CPU related configuration.""" keyName = "Software" prevKeySeq.append(keyName) config: Opt[Dict] = util.getConfigurationParameter( data=userProvidedConfig, keySeq=[keyName], default=None, prevKeySeq=prevKeySeq[:-1], fail=True, ) build = Build.generateObject( userProvidedConfig=config, prevKeySeq=prevKeySeq, ) projectFiles = ProjectFiles() projectFiles.readProjectFiles() program = Program.generateObject( userProvidedConfig=config, ajitCpu=hardware.cpu, prevKeySeq=prevKeySeq, ) bget = Bget.generateObject( userProvidedConfig=config, prevKeySeq=prevKeySeq, ) # queueSeq = QueueSeq.generateObject( # userProvidedConfig=config, # prevKeySeq=prevKeySeq, # ) locks = Locks.generateObject( userProvidedConfig=config, prevKeySeq=prevKeySeq, ) traps = Traps.generateObject( userProvidedConfig=config, prevKeySeq=prevKeySeq, ) startup = Startup.generateObject( userProvidedConfig=config, prevKeySeq=prevKeySeq, ) prevKeySeq.pop() software = Software( projectFiles=projectFiles, program=program, build=build, bget=bget, locks=locks, # queueSeq=queueSeq, traps=traps, startup=startup, ) return software