from dataclasses import dataclass, field
|
|
|
|
from typing import List, Optional
|
|
|
|
from gbso.cpu.cpu import CPU
|
|
from gbso.cpu.state import CPUState
|
|
from gbso.cpu.insn import Insn, UNUSED
|
|
|
|
|
|
@dataclass
|
|
class Program:
|
|
insns: List[Insn] = field(default_factory=list)
|
|
|
|
def execute(self, init_state: Optional[CPUState] = None) -> CPU:
|
|
cpu = CPU(state=init_state)
|
|
for insn in self.insns:
|
|
insn.exec(cpu)
|
|
return cpu
|
|
|
|
def perf(self) -> int:
|
|
return sum([insn.cycles() for insn in self.insns])
|
|
|
|
def display(self) -> None:
|
|
print("=" * 10)
|
|
for insn in self.insns:
|
|
print(insn.pretty())
|
|
print("=" * 10)
|
|
|
|
def pad(self, max_bytes: int) -> "Program":
|
|
if len(self.insns) > max_bytes:
|
|
raise ValueError("larger than amount to pad to")
|
|
|
|
insns = self.insns.copy() + [UNUSED()] * (max_bytes - len(self.insns))
|
|
return Program(insns=insns)
|