Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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
Example #5
0
  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
Example #6
0
    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
Example #7
0
    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
Example #8
0
    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
Example #9
0
    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
Example #10
0
    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)
Example #11
0
    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
Example #12
0
  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
Example #13
0
    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)
Example #14
0
    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
Example #15
0
    def generateBuildArgsParam(
        userProvidedConfig: Dict,
        prevKeySeq: Opt[List] = None,
    ) -> str:
        keyName = "BuildArgs"

        buildArgs: str = util.getConfigurationParameter(
            data=userProvidedConfig,
            keySeq=[keyName],
            default="",
            prevKeySeq=prevKeySeq,
        )

        return buildArgs
Example #16
0
    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)
Example #17
0
    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
Example #18
0
    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
Example #19
0
    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
Example #20
0
    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
Example #21
0
    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
Example #22
0
    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
Example #23
0
    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
Example #24
0
    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
Example #25
0
  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
Example #26
0
    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
Example #27
0
    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
Example #28
0
    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