@@ -32,11 +32,16 @@ class Register:
3232 """
3333
3434 name : str
35- bitsize : int
35+ bitsize : int = attr . field ()
3636 shape : Tuple [int , ...] = attr .field (
3737 converter = lambda v : (v ,) if isinstance (v , int ) else tuple (v ), default = ()
3838 )
3939
40+ @bitsize .validator
41+ def bitsize_validator (self , attribute , value ):
42+ if value <= 0 :
43+ raise ValueError (f"Bitsize for { self = } must be a positive integer. Found { value } ." )
44+
4045 def all_idxs (self ) -> Iterable [Tuple [int , ...]]:
4146 """Iterate over all possible indices of a multidimensional register."""
4247 yield from itertools .product (* [range (sh ) for sh in self .shape ])
@@ -46,7 +51,7 @@ def total_bits(self) -> int:
4651
4752 This is the product of each of the dimensions in `shape`.
4853 """
49- return self .bitsize * int (np .product (self .shape ))
54+ return self .bitsize * int (np .prod (self .shape ))
5055
5156 def __repr__ (self ):
5257 return f'cirq_ft.Register(name="{ self .name } ", bitsize={ self .bitsize } , shape={ self .shape } )'
@@ -137,7 +142,7 @@ def __repr__(self):
137142
138143 @classmethod
139144 def build (cls , ** registers : int ) -> 'Registers' :
140- return cls (Register (name = k , bitsize = v ) for k , v in registers .items ())
145+ return cls (Register (name = k , bitsize = v ) for k , v in registers .items () if v > 0 )
141146
142147 @overload
143148 def __getitem__ (self , key : int ) -> Register :
0 commit comments