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 assert b
.bits
== self
.bits
37 return SelectableInt(self
.value
& b
.value
, self
.bits
)
40 assert b
.bits
== self
.bits
41 return SelectableInt(self
.value ^ b
.value
, self
.bits
)
44 return SelectableInt(~self
.value
, self
.bits
)
47 return SelectableInt(~self
.value
+ 1, self
.bits
)
49 def __getitem__(self
, key
):
50 if isinstance(key
, int):
51 assert key
< self
.bits
, "key %d accessing %d" % (key
, self
.bits
)
53 key
= self
.bits
- (key
+ 1)
55 value
= (self
.value
>> key
) & 1
56 return SelectableInt(value
, 1)
57 elif isinstance(key
, slice):
58 assert key
.step
is None or key
.step
== 1
59 assert key
.start
< key
.stop
61 assert key
.stop
<= self
.bits
63 stop
= self
.bits
- key
.start
64 start
= self
.bits
- key
.stop
66 bits
= stop
- start
+ 1
67 mask
= (1 << bits
) - 1
68 value
= (self
.value
>> start
) & mask
69 return SelectableInt(value
, bits
)
71 def __setitem__(self
, key
, value
):
72 if isinstance(key
, int):
73 assert key
< self
.bits
75 key
= self
.bits
- (key
+ 1)
76 if isinstance(value
, SelectableInt
):
77 assert value
.bits
== 1
82 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
83 elif isinstance(key
, slice):
84 assert key
.step
is None or key
.step
== 1
85 assert key
.start
< key
.stop
87 assert key
.stop
<= self
.bits
89 stop
= self
.bits
- key
.start
90 start
= self
.bits
- key
.stop
92 bits
= stop
- start
+ 1
93 if isinstance(value
, SelectableInt
):
94 assert value
.bits
== bits
, "%d into %d" % (value
.bits
, bits
)
96 mask
= ((1 << bits
) - 1) << start
97 value
= value
<< start
98 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
100 def __ge__(self
, other
):
101 if isinstance(other
, SelectableInt
):
102 assert other
.bits
== self
.bits
104 if isinstance(other
, int):
105 return other
>= self
.value
108 def __le__(self
, other
):
109 if isinstance(other
, SelectableInt
):
110 assert other
.bits
== self
.bits
112 if isinstance(other
, int):
113 return onebit(other
<= self
.value
)
116 def __gt__(self
, other
):
117 if isinstance(other
, SelectableInt
):
118 assert other
.bits
== self
.bits
120 if isinstance(other
, int):
121 return onebit(other
> self
.value
)
124 def __lt__(self
, other
):
125 if isinstance(other
, SelectableInt
):
126 assert other
.bits
== self
.bits
128 if isinstance(other
, int):
129 return onebit(other
< self
.value
)
132 def __eq__(self
, other
):
133 if isinstance(other
, SelectableInt
):
134 assert other
.bits
== self
.bits
136 if isinstance(other
, int):
137 return onebit(other
== self
.value
)
141 return self
.value
!= 0
144 return "SelectableInt(value={:x}, bits={})".format(self
.value
,
148 return SelectableInt(1 if bit
else 0, 1)
150 def selectltu(lhs
, rhs
):
151 """ less-than (unsigned)
153 if isinstance(rhs
, SelectableInt
):
155 return onebit(lhs
.value
< rhs
)
157 def selectgtu(lhs
, rhs
):
158 """ greater-than (unsigned)
160 if isinstance(rhs
, SelectableInt
):
162 return onebit(lhs
.value
> rhs
)
165 # XXX this probably isn't needed...
166 def selectassign(lhs
, idx
, rhs
):
167 if isinstance(idx
, tuple):
172 lower
, upper
, step
= idx
173 toidx
= range(lower
, upper
, step
)
174 fromidx
= range(0, upper
-lower
, step
) # XXX eurgh...
178 for t
, f
in zip(toidx
, fromidx
):
182 def selectconcat(*args
):
185 assert isinstance(i
, SelectableInt
), "can only concat SIs, sorry"
187 res
.value
= (res
.value
<< i
.bits
) | i
.value
191 class SelectableIntTestCase(unittest
.TestCase
):
192 def test_arith(self
):
193 a
= SelectableInt(5, 8)
194 b
= SelectableInt(9, 8)
199 self
.assertEqual(c
.value
, a
.value
+ b
.value
)
200 self
.assertEqual(d
.value
, (a
.value
- b
.value
) & 0xFF)
201 self
.assertEqual(e
.value
, (a
.value
* b
.value
) & 0xFF)
202 self
.assertEqual(f
.value
, (-a
.value
) & 0xFF)
203 self
.assertEqual(c
.bits
, a
.bits
)
204 self
.assertEqual(d
.bits
, a
.bits
)
205 self
.assertEqual(e
.bits
, a
.bits
)
207 def test_logic(self
):
208 a
= SelectableInt(0x0F, 8)
209 b
= SelectableInt(0xA5, 8)
214 self
.assertEqual(c
.value
, a
.value
& b
.value
)
215 self
.assertEqual(d
.value
, a
.value | b
.value
)
216 self
.assertEqual(e
.value
, a
.value ^ b
.value
)
217 self
.assertEqual(f
.value
, 0xF0)
220 a
= SelectableInt(0xa2, 8)
221 # These should be big endian
222 self
.assertEqual(a
[7], 0)
223 self
.assertEqual(a
[0:4], 10)
224 self
.assertEqual(a
[4:8], 2)
227 a
= SelectableInt(0x5, 8)
228 a
[7] = SelectableInt(0, 1)
229 self
.assertEqual(a
, 4)
231 self
.assertEqual(a
, 9)
233 self
.assertEqual(a
, 0x39)
235 self
.assertEqual(a
, 0x199)
237 if __name__
== "__main__":