6565IFF1 = 'n181'
6666IFF2 = '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
6978def _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
27722784def 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
32993308def build_symbolic_states ():
0 commit comments