5 def __init__(self
, value
, bits
):
10 assert b
.bits
== self
.bits
11 return SelectableInt(self
.value
+ b
.value
, self
.bits
)
13 def __getitem__(self
, key
):
14 if isinstance(key
, int):
15 assert key
< self
.bits
17 key
= self
.bits
- (key
+ 1)
19 value
= (self
.value
>> key
) & 1
20 return SelectableInt(value
, 1)
21 elif isinstance(key
, slice):
22 assert key
.step
is None or key
.step
== 1
23 assert key
.start
< key
.stop
25 assert key
.stop
<= self
.bits
27 stop
= self
.bits
- key
.start
28 start
= self
.bits
- key
.stop
31 mask
= (1 << bits
) - 1
32 value
= (self
.value
>> start
) & mask
33 return SelectableInt(value
, bits
)
35 def __setitem__(self
, key
, value
):
36 if isinstance(key
, int):
37 assert key
< self
.bits
39 key
= self
.bits
- (key
+ 1)
40 if isinstance(value
, SelectableInt
):
41 assert value
.bits
== 1
46 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
47 elif isinstance(key
, slice):
48 assert key
.step
is None or key
.step
== 1
49 assert key
.start
< key
.stop
51 assert key
.stop
<= self
.bits
53 stop
= self
.bits
- key
.start
54 start
= self
.bits
- key
.stop
57 if isinstance(value
, SelectableInt
):
58 assert value
.bits
== bits
60 mask
= ((1 << bits
) - 1) << start
61 value
= value
<< start
62 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
64 def __eq__(self
, other
):
65 if isinstance(other
, SelectableInt
):
66 return other
.value
== self
.value
and other
.bits
== self
.bits
67 if isinstance(other
, int):
68 return other
== self
.value
72 return "SelectableInt(value={:x}, bits={})".format(self
.value
,
76 class SelectableIntTestCase(unittest
.TestCase
):
78 a
= SelectableInt(5, 8)
79 b
= SelectableInt(9, 8)
81 assert c
.value
== a
.value
+ b
.value
82 assert c
.bits
== a
.bits
85 a
= SelectableInt(0xa2, 8)
86 # These should be big endian
92 a
= SelectableInt(0x5, 8)
93 a
[7] = SelectableInt(0, 1)
94 self
.assertEqual(a
, 4)
96 self
.assertEqual(a
, 9)
98 self
.assertEqual(a
, 0x39)
100 self
.assertEqual(a
, 0x99)
103 if __name__
== "__main__":