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)