Skip to content

Commit 50d2f4f

Browse files
committed
[Sim][#50] Test nodes as we identify state nodes.
1 parent c6d273e commit 50d2f4f

1 file changed

Lines changed: 33 additions & 24 deletions

File tree

tests/z80sim/z80sim.py

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@
6565
IFF1 = 'n181'
6666
IFF2 = 'n206'
6767

68+
TESTED_NODES = {IFF1, IFF2, EX_AF_FF, EXX_FF,
69+
EX_DE_FF0, EX_DE_FF1, EX_DE_FF}
70+
for i in range(8):
71+
for r in 'af':
72+
TESTED_NODES.update((f'reg_{r}{i}', f'reg_{r}{r}{i}'))
73+
for r in 'wz':
74+
TESTED_NODES.add(f'reg_{r}{i}')
75+
TESTED_NODES.add(f'instr{i}')
76+
6877

6978
def _ceil_div(a, b):
7079
return -(a // -b)
@@ -975,10 +984,7 @@ def id(self):
975984
if self.custom_id is None:
976985
return f'{pull}{self.index}'
977986

978-
if self.pull is None or self.is_pin:
979-
return f'{self.custom_id}'
980-
981-
return f'{pull}.{self.custom_id}'
987+
return f'{self.custom_id}'
982988

983989
@property
984990
def used_in(self):
@@ -1117,8 +1123,13 @@ def load_node_names():
11171123
assert n.custom_id is None or n.custom_id == id, id
11181124
n.custom_id = id
11191125

1120-
assert (id not in __nodes_by_name or
1121-
__nodes_by_name[id] is n)
1126+
if id is not None:
1127+
assert (id not in __nodes_by_name or
1128+
__nodes_by_name[id] is n)
1129+
__nodes_by_name[id] = n
1130+
1131+
assert (n.id not in __nodes_by_name or
1132+
__nodes_by_name[n.id] is n)
11221133
__nodes_by_name[n.id] = n
11231134

11241135
def load_nodes():
@@ -1249,12 +1260,13 @@ def __restore_nodes_from_image(self, names, image, node_storage):
12491260
# if n.state.is_equiv(Bool.get('ei')):
12501261
# Status.print(n, n.state)
12511262

1263+
self.__nodes_by_name = {}
12521264
for index, name in names:
12531265
assert name is not None
12541266
n = self.__nodes[index]
12551267
n.custom_id = name
1268+
self.__nodes_by_name[name] = n
12561269

1257-
self.__nodes_by_name = {}
12581270
for n in self.__nodes.values():
12591271
self.__nodes_by_name[n.id] = n
12601272

@@ -2770,15 +2782,6 @@ def execute_instr(s, id, phase, before):
27702782

27712783

27722784
def process_instr(instrs, base_state, *, test=False):
2773-
TESTED_NODES = {IFF1, IFF2, EX_AF_FF, EXX_FF,
2774-
EX_DE_FF0, EX_DE_FF1, EX_DE_FF}
2775-
for i in range(8):
2776-
for r in 'af':
2777-
TESTED_NODES.update((f'reg_{r}{i}', f'reg_{r}{r}{i}'))
2778-
for r in 'wz':
2779-
TESTED_NODES.add(f'reg_{r}{i}')
2780-
TESTED_NODES.add(f'instr{i}')
2781-
27822785
SAMPLED_NODES = set(TESTED_NODES)
27832786
for i in range(8):
27842787
for r in 'bcdehl':
@@ -3248,12 +3251,7 @@ def add(ss):
32483251
print('OK' if ok else 'FAILED')
32493252

32503253

3251-
def identify_instr_state_nodes(base_state, instr):
3252-
persistent_nodes = base_state.get_node_states()
3253-
3254-
# Make sure there are initially no nodes with symbolic states.
3255-
assert all(s.value is not None for s in persistent_nodes.values())
3256-
3254+
def identify_instr_state_nodes(base_state, instr, persistent_nodes):
32573255
repeat = True
32583256
while repeat:
32593257
repeat = False
@@ -3265,18 +3263,24 @@ def identify_instr_state_nodes(base_state, instr):
32653263
s.set_node_state(id, Bool.get(id))
32663264

32673265
phase = 1
3266+
at_start = s.get_node_states()
32683267
before = get_effective_states(s)
32693268
execute_instr(s, instr, phase, before)
32703269
s.cache()
32713270

3271+
at_end = s.get_node_states()
3272+
after = get_effective_states(s)
3273+
for n in TESTED_NODES:
3274+
token = test_node((instr,), n, at_start, at_end, before, after)
3275+
32723276
# Exclude nodes that may end up changing their state from
32733277
# persistent nodes.
32743278
for id, state in s.get_node_states().items():
32753279
if id in _PINS or id not in persistent_nodes:
32763280
continue
32773281
if state.is_equiv(persistent_nodes[id]):
32783282
continue
3279-
# Status.print(id)
3283+
# Status.print(f'Found state node: {id}')
32803284
del persistent_nodes[id]
32813285
repeat = True
32823286

@@ -3290,10 +3294,15 @@ def identify_state_nodes():
32903294
base_state.set_db_and_wait(0x00, 4) # nop
32913295
base_state.cache()
32923296

3297+
persistent_nodes = base_state.get_node_states()
3298+
3299+
# Make sure there are initially no nodes with symbolic states.
3300+
assert all(s.value is not None for s in persistent_nodes.values())
3301+
32933302
instr = 'nop'
32943303
s = State(base_state)
32953304
with s.status(instr):
3296-
identify_instr_state_nodes(s, instr)
3305+
identify_instr_state_nodes(s, instr, persistent_nodes)
32973306

32983307

32993308
def build_symbolic_states():

0 commit comments

Comments
 (0)