@@ -142,6 +142,14 @@ class BitAdded(SNodeAttributeChanged):
142142 pass
143143
144144
145+ class BitStatusRemoved (SNodeAttributeChanged ):
146+ pass
147+
148+
149+ class BitStatusAdded (SNodeAttributeChanged ):
150+ pass
151+
152+
145153class ConfigFalseRemoved (SNodeAttributeChanged ):
146154 pass
147155
@@ -174,6 +182,14 @@ class EnumAdded(SNodeAttributeChanged):
174182 pass
175183
176184
185+ class EnumStatusRemoved (SNodeAttributeChanged ):
186+ pass
187+
188+
189+ class EnumStatusAdded (SNodeAttributeChanged ):
190+ pass
191+
192+
177193class ExtensionRemoved (SNodeAttributeChanged ):
178194 pass
179195
@@ -365,19 +381,31 @@ def snode_changes(old: SNode, new: SNode) -> Iterator[SNodeDiff]:
365381 for r in new_ranges - old_ranges :
366382 yield RangeAdded (old , new , r )
367383
368- old_enums = set (e for e , _ in old .type ().all_enums ())
369- new_enums = set (e for e , _ in new .type ().all_enums ())
370- for e in old_enums - new_enums :
371- yield EnumRemoved (old , new , e )
372- for e in new_enums - old_enums :
373- yield EnumAdded (old , new , e )
374-
375- old_bits = set (b for b , _ in old .type ().all_bits ())
376- new_bits = set (b for b , _ in new .type ().all_bits ())
377- for b in old_bits - new_bits :
378- yield BitRemoved (old , new , b )
379- for b in new_bits - old_bits :
380- yield BitAdded (old , new , b )
384+ old_enums = {e .name (): e for e in old .type ().all_enums ()}
385+ new_enums = {e .name (): e for e in new .type ().all_enums ()}
386+ for e in old_enums .keys () - new_enums .keys ():
387+ yield EnumRemoved (old , new , old_enums [e ])
388+ for e in new_enums .keys () - old_enums .keys ():
389+ yield EnumAdded (old , new , new_enums [e ])
390+ for e in new_enums .keys () & old_enums .keys ():
391+ o = old_enums [e ]
392+ n = new_enums [e ]
393+ if o .status () != n .status ():
394+ yield EnumStatusRemoved (old , new , (o .name (), o .status ()))
395+ yield EnumStatusAdded (old , new , (n .name (), n .status ()))
396+
397+ old_bits = {b .name (): b for b in old .type ().all_bits ()}
398+ new_bits = {b .name (): b for b in new .type ().all_bits ()}
399+ for b in old_bits .keys () - new_bits .keys ():
400+ yield BitRemoved (old , new , old_bits [b ])
401+ for b in new_bits .keys () - old_bits .keys ():
402+ yield BitAdded (old , new , new_bits [b ])
403+ for b in new_bits .keys () & old_bits .keys ():
404+ o = old_bits [b ]
405+ n = new_bits [b ]
406+ if o .status () != n .status ():
407+ yield BitStatusRemoved (old , new , (o .name (), o .status ()))
408+ yield BitStatusAdded (old , new , (n .name (), n .status ()))
381409
382410 if isinstance (old , SLeaf ) and isinstance (new , SLeaf ):
383411 if old .default () != new .default ():
0 commit comments