@@ -313,6 +313,45 @@ def __iadd__(self, other):
313313 self .update (self .reg .value + other )
314314 return self .reg
315315
316+ class BitflagRegister ():
317+ def __init__ (self , flags : list , * , prefix = "" ):
318+ assert isinstance (flags , list ) and len (flags ) > 0
319+ super ().__setattr__ ("flags" , flags )
320+ self .prefix = prefix
321+ for flag in flags :
322+ super ().__setattr__ (flag , 0 )
323+ super ().__setattr__ (flag + "_update" , None )
324+ def __setattr__ (self , name , value ):
325+ if name in self .flags :
326+ super ().__setattr__ (name + "_update" , value )
327+ else :
328+ super ().__setattr__ (name , value )
329+
330+ def set (self , value ):
331+ for flag in value :
332+ assert flag in self .flags
333+ setattr (self , flag , value [flag ])
334+
335+ def get (self , flag ):
336+ assert flag in self .flags
337+ return getattr (self , flag )
338+
339+ def changes (self ):
340+ changes = []
341+ for flag in self .flags :
342+ upd = getattr (self , flag + "_update" )
343+ if upd is not None :
344+ changes .append (TraceRegister (self .prefix + flag , upd ))
345+ return changes
346+
347+ def commit (self ):
348+ for flag in self .flags :
349+ upd = getattr (self , flag + "_update" )
350+ if upd is not None :
351+ super ().__setattr__ (flag , upd )
352+ super ().__setattr__ (flag + "_update" , None )
353+
354+
316355class Trace (object ):
317356 pass
318357
0 commit comments