5 def __init__(self
, value
, bits
):
7 self
.value
= value
& mask
11 assert b
.bits
== self
.bits
12 return SelectableInt(self
.value
+ b
.value
, self
.bits
)
15 assert b
.bits
== self
.bits
16 return SelectableInt(self
.value
- b
.value
, self
.bits
)
19 assert b
.bits
== self
.bits
20 return SelectableInt(self
.value
* b
.value
, self
.bits
)
23 assert b
.bits
== self
.bits
24 return SelectableInt(self
.value | b
.value
, self
.bits
)
27 assert b
.bits
== self
.bits
28 return SelectableInt(self
.value
& b
.value
, self
.bits
)
31 assert b
.bits
== self
.bits
32 return SelectableInt(self
.value ^ b
.value
, self
.bits
)
35 return SelectableInt(~self
.value
, self
.bits
)
38 return SelectableInt(~self
.value
+ 1, self
.bits
)
40 def __getitem__(self
, key
):
41 if isinstance(key
, int):
42 assert key
< self
.bits
, "key %d accessing %d" % (key
, self
.bits
)
44 key
= self
.bits
- (key
+ 1)
46 value
= (self
.value
>> key
) & 1
47 return SelectableInt(value
, 1)
48 elif isinstance(key
, slice):
49 assert key
.step
is None or key
.step
== 1
50 assert key
.start
< key
.stop
52 assert key
.stop
<= self
.bits
54 stop
= self
.bits
- key
.start
55 start
= self
.bits
- key
.stop
58 mask
= (1 << bits
) - 1
59 value
= (self
.value
>> start
) & mask
60 return SelectableInt(value
, bits
)
62 def __setitem__(self
, key
, value
):
63 if isinstance(key
, int):
64 assert key
< self
.bits
66 key
= self
.bits
- (key
+ 1)
67 if isinstance(value
, SelectableInt
):
68 assert value
.bits
== 1
73 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
74 elif isinstance(key
, slice):
75 assert key
.step
is None or key
.step
== 1
76 assert key
.start
< key
.stop
78 assert key
.stop
<= self
.bits
80 stop
= self
.bits
- key
.start
81 start
= self
.bits
- key
.stop
84 if isinstance(value
, SelectableInt
):
85 assert value
.bits
== bits
87 mask
= ((1 << bits
) - 1) << start
88 value
= value
<< start
89 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
91 def __eq__(self
, other
):
92 if isinstance(other
, SelectableInt
):
93 return other
.value
== self
.value
and other
.bits
== self
.bits
94 if isinstance(other
, int):
95 return other
== self
.value
99 return "SelectableInt(value={:x}, bits={})".format(self
.value
,
103 class SelectableIntTestCase(unittest
.TestCase
):
104 def test_arith(self
):
105 a
= SelectableInt(5, 8)
106 b
= SelectableInt(9, 8)
111 self
.assertEqual(c
.value
, a
.value
+ b
.value
)
112 self
.assertEqual(d
.value
, (a
.value
- b
.value
) & 0xFF)
113 self
.assertEqual(e
.value
, (a
.value
* b
.value
) & 0xFF)
114 self
.assertEqual(f
.value
, (-a
.value
) & 0xFF)
115 self
.assertEqual(c
.bits
, a
.bits
)
116 self
.assertEqual(d
.bits
, a
.bits
)
117 self
.assertEqual(e
.bits
, a
.bits
)
119 def test_logic(self
):
120 a
= SelectableInt(0x0F, 8)
121 b
= SelectableInt(0xA5, 8)
126 self
.assertEqual(c
.value
, a
.value
& b
.value
)
127 self
.assertEqual(d
.value
, a
.value | b
.value
)
128 self
.assertEqual(e
.value
, a
.value ^ b
.value
)
129 self
.assertEqual(f
.value
, 0xF0)
133 a
= SelectableInt(0xa2, 8)
134 # These should be big endian
135 self
.assertEqual(a
[7], 0)
136 self
.assertEqual(a
[0:4], 10)
137 self
.assertEqual(a
[4:8], 2)
140 a
= SelectableInt(0x5, 8)
141 a
[7] = SelectableInt(0, 1)
142 self
.assertEqual(a
, 4)
144 self
.assertEqual(a
, 9)
146 self
.assertEqual(a
, 0x39)
148 self
.assertEqual(a
, 0x99)
151 if __name__
== "__main__":