e1fd8d64699738801e59fd5ba90c2cda26dfe09e
6 def __init__(self
, value
, bits
):
8 self
.value
= value
& mask
12 assert b
.bits
== self
.bits
13 return SelectableInt(self
.value
+ b
.value
, self
.bits
)
16 assert b
.bits
== self
.bits
17 return SelectableInt(self
.value
- b
.value
, self
.bits
)
20 assert b
.bits
== self
.bits
21 return SelectableInt(self
.value
* b
.value
, self
.bits
)
24 assert b
.bits
== self
.bits
25 return SelectableInt(self
.value | b
.value
, self
.bits
)
28 assert b
.bits
== self
.bits
29 return SelectableInt(self
.value
& b
.value
, self
.bits
)
32 assert b
.bits
== self
.bits
33 return SelectableInt(self
.value ^ b
.value
, self
.bits
)
36 return SelectableInt(~self
.value
, self
.bits
)
39 return SelectableInt(~self
.value
+ 1, self
.bits
)
41 def __getitem__(self
, key
):
42 if isinstance(key
, int):
43 assert key
< self
.bits
, "key %d accessing %d" % (key
, self
.bits
)
45 key
= self
.bits
- (key
+ 1)
47 value
= (self
.value
>> key
) & 1
48 return SelectableInt(value
, 1)
49 elif isinstance(key
, slice):
50 assert key
.step
is None or key
.step
== 1
51 assert key
.start
< key
.stop
53 assert key
.stop
<= self
.bits
55 stop
= self
.bits
- key
.start
56 start
= self
.bits
- key
.stop
59 mask
= (1 << bits
) - 1
60 value
= (self
.value
>> start
) & mask
61 return SelectableInt(value
, bits
)
63 def __setitem__(self
, key
, value
):
64 if isinstance(key
, int):
65 assert key
< self
.bits
67 key
= self
.bits
- (key
+ 1)
68 if isinstance(value
, SelectableInt
):
69 assert value
.bits
== 1
74 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
75 elif isinstance(key
, slice):
76 assert key
.step
is None or key
.step
== 1
77 assert key
.start
< key
.stop
79 assert key
.stop
<= self
.bits
81 stop
= self
.bits
- key
.start
82 start
= self
.bits
- key
.stop
85 if isinstance(value
, SelectableInt
):
86 assert value
.bits
== bits
88 mask
= ((1 << bits
) - 1) << start
89 value
= value
<< start
90 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
92 def __eq__(self
, other
):
93 if isinstance(other
, SelectableInt
):
94 return other
.value
== self
.value
and other
.bits
== self
.bits
95 if isinstance(other
, int):
96 return other
== self
.value
100 return "SelectableInt(value={:x}, bits={})".format(self
.value
,
103 def selectconcat(*args
):
106 assert isinstance(i
, SelectableInt
), "can only concat SIs, sorry"
108 res
.value
= (res
.value
<< i
.bits
) | i
.value
112 class SelectableIntTestCase(unittest
.TestCase
):
113 def test_arith(self
):
114 a
= SelectableInt(5, 8)
115 b
= SelectableInt(9, 8)
120 self
.assertEqual(c
.value
, a
.value
+ b
.value
)
121 self
.assertEqual(d
.value
, (a
.value
- b
.value
) & 0xFF)
122 self
.assertEqual(e
.value
, (a
.value
* b
.value
) & 0xFF)
123 self
.assertEqual(f
.value
, (-a
.value
) & 0xFF)
124 self
.assertEqual(c
.bits
, a
.bits
)
125 self
.assertEqual(d
.bits
, a
.bits
)
126 self
.assertEqual(e
.bits
, a
.bits
)
128 def test_logic(self
):
129 a
= SelectableInt(0x0F, 8)
130 b
= SelectableInt(0xA5, 8)
135 self
.assertEqual(c
.value
, a
.value
& b
.value
)
136 self
.assertEqual(d
.value
, a
.value | b
.value
)
137 self
.assertEqual(e
.value
, a
.value ^ b
.value
)
138 self
.assertEqual(f
.value
, 0xF0)
142 a
= SelectableInt(0xa2, 8)
143 # These should be big endian
144 self
.assertEqual(a
[7], 0)
145 self
.assertEqual(a
[0:4], 10)
146 self
.assertEqual(a
[4:8], 2)
149 a
= SelectableInt(0x5, 8)
150 a
[7] = SelectableInt(0, 1)
151 self
.assertEqual(a
, 4)
153 self
.assertEqual(a
, 9)
155 self
.assertEqual(a
, 0x39)
157 self
.assertEqual(a
, 0x99)
160 if __name__
== "__main__":