from dataclasses import dataclass
|
|
from gbso.cpu.regs import R8
|
|
from gbso.program.program import Program
|
|
|
|
from gbso.cpu.state import CPUState
|
|
|
|
|
|
@dataclass
|
|
class TestCase:
|
|
__test__ = False
|
|
state: CPUState
|
|
|
|
|
|
def eq_on_testcase(p: Program, q: Program, case: TestCase) -> int:
|
|
p_cpu = p.execute(case.state)
|
|
q_cpu = q.execute(case.state)
|
|
delta = 0
|
|
for o in p.outputs:
|
|
if type(o) == R8:
|
|
delta += eq_8bit(p_cpu.state.reg8[o], q_cpu.state.reg8[o])
|
|
elif type(o) == int:
|
|
delta += eq_8bit(p_cpu.state.memory[o], q_cpu.state.memory[o])
|
|
else:
|
|
raise TypeError(f"unknown output type {type(o)}")
|
|
# TODO: Add penalty for undefined behavior (uninitialized register/memory reads)
|
|
return delta
|
|
|
|
|
|
# Counts differing bits between two 8-bit values
|
|
def eq_8bit(x: int, y: int) -> int:
|
|
delta = 0
|
|
for i in range(8):
|
|
mask = 1 << i
|
|
if x & mask != y & mask:
|
|
delta += 1
|
|
return 0
|