gameboy superoptimizer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

34 lines
943 B

  1. from dataclasses import dataclass, field
  2. from typing import List, Optional
  3. from gbso.cpu.cpu import CPU
  4. from gbso.cpu.state import CPUState
  5. from gbso.cpu.insn import Insn, UNUSED
  6. @dataclass
  7. class Program:
  8. insns: List[Insn] = field(default_factory=list)
  9. def execute(self, init_state: Optional[CPUState] = None) -> CPU:
  10. cpu = CPU(state=init_state)
  11. for insn in self.insns:
  12. insn.exec(cpu)
  13. return cpu
  14. def perf(self) -> int:
  15. return sum([insn.cycles() for insn in self.insns])
  16. def display(self) -> None:
  17. print("=" * 10)
  18. for insn in self.insns:
  19. print(insn.pretty())
  20. print("=" * 10)
  21. def pad(self, max_bytes: int) -> "Program":
  22. if len(self.insns) > max_bytes:
  23. raise ValueError("larger than amount to pad to")
  24. insns = self.insns.copy() + [UNUSED()] * (max_bytes - len(self.insns))
  25. return Program(insns=insns)