6 def __init__(self
, value
, bits
):
8 self
.value
= value
& mask
12 if isinstance(b
, int):
13 b
= SelectableInt(b
, self
.bits
)
14 assert b
.bits
== self
.bits
15 return SelectableInt(self
.value
+ b
.value
, self
.bits
)
18 if isinstance(b
, int):
19 b
= SelectableInt(b
, 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 assert b
.bits
== self
.bits
45 return SelectableInt(self
.value ^ b
.value
, self
.bits
)
48 return SelectableInt(~self
.value
, self
.bits
)
51 return SelectableInt(~self
.value
+ 1, self
.bits
)
53 def __getitem__(self
, key
):
54 if isinstance(key
, int):
55 assert key
< self
.bits
, "key %d accessing %d" % (key
, self
.bits
)
57 key
= self
.bits
- (key
+ 1)
59 value
= (self
.value
>> key
) & 1
60 return SelectableInt(value
, 1)
61 elif isinstance(key
, slice):
62 assert key
.step
is None or key
.step
== 1
63 assert key
.start
< key
.stop
65 assert key
.stop
<= self
.bits
67 stop
= self
.bits
- key
.start
68 start
= self
.bits
- key
.stop
70 bits
= stop
- start
+ 1
71 mask
= (1 << bits
) - 1
72 value
= (self
.value
>> start
) & mask
73 return SelectableInt(value
, bits
)
75 def __setitem__(self
, key
, value
):
76 if isinstance(key
, int):
77 assert key
< self
.bits
79 key
= self
.bits
- (key
+ 1)
80 if isinstance(value
, SelectableInt
):
81 assert value
.bits
== 1
86 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
87 elif isinstance(key
, slice):
88 assert key
.step
is None or key
.step
== 1
89 assert key
.start
< key
.stop
91 assert key
.stop
<= self
.bits
93 stop
= self
.bits
- key
.start
94 start
= self
.bits
- key
.stop
96 bits
= stop
- start
+ 1
97 if isinstance(value
, SelectableInt
):
98 assert value
.bits
== bits
, "%d into %d" % (value
.bits
, bits
)
100 mask
= ((1 << bits
) - 1) << start
101 value
= value
<< start
102 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
104 def __ge__(self
, other
):
105 if isinstance(other
, SelectableInt
):
106 assert other
.bits
== self
.bits
108 if isinstance(other
, int):
109 return other
>= self
.value
112 def __le__(self
, other
):
113 if isinstance(other
, SelectableInt
):
114 assert other
.bits
== self
.bits
116 if isinstance(other
, int):
117 return onebit(other
<= self
.value
)
120 def __gt__(self
, other
):
121 if isinstance(other
, SelectableInt
):
122 assert other
.bits
== self
.bits
124 if isinstance(other
, int):
125 return onebit(other
> self
.value
)
128 def __lt__(self
, other
):
129 if isinstance(other
, SelectableInt
):
130 assert other
.bits
== self
.bits
132 if isinstance(other
, int):
133 return onebit(other
< self
.value
)
136 def __eq__(self
, other
):
137 if isinstance(other
, SelectableInt
):
138 assert other
.bits
== self
.bits
140 if isinstance(other
, int):
141 return onebit(other
== self
.value
)
145 return self
.value
!= 0
148 return "SelectableInt(value={:x}, bits={})".format(self
.value
,
152 return SelectableInt(1 if bit
else 0, 1)
154 def selectltu(lhs
, rhs
):
155 """ less-than (unsigned)
157 if isinstance(rhs
, SelectableInt
):
159 return onebit(lhs
.value
< rhs
)
161 def selectgtu(lhs
, rhs
):
162 """ greater-than (unsigned)
164 if isinstance(rhs
, SelectableInt
):
166 return onebit(lhs
.value
> rhs
)
169 # XXX this probably isn't needed...
170 def selectassign(lhs
, idx
, rhs
):
171 if isinstance(idx
, tuple):
176 lower
, upper
, step
= idx
177 toidx
= range(lower
, upper
, step
)
178 fromidx
= range(0, upper
-lower
, step
) # XXX eurgh...
182 for t
, f
in zip(toidx
, fromidx
):
186 def selectconcat(*args
, repeat
=1):
187 if repeat
!= 1 and len(args
) == 1 and isinstance(args
[0], int):
188 args
= [SelectableInt(args
[0], 1)]
189 if repeat
!= 1: # multiplies the incoming arguments
191 for i
in range(repeat
):
196 assert isinstance(i
, SelectableInt
), "can only concat SIs, sorry"
198 res
.value
= (res
.value
<< i
.bits
) | i
.value
199 print ("concat", repeat
, res
)
203 class SelectableIntTestCase(unittest
.TestCase
):
204 def test_arith(self
):
205 a
= SelectableInt(5, 8)
206 b
= SelectableInt(9, 8)
211 self
.assertEqual(c
.value
, a
.value
+ b
.value
)
212 self
.assertEqual(d
.value
, (a
.value
- b
.value
) & 0xFF)
213 self
.assertEqual(e
.value
, (a
.value
* b
.value
) & 0xFF)
214 self
.assertEqual(f
.value
, (-a
.value
) & 0xFF)
215 self
.assertEqual(c
.bits
, a
.bits
)
216 self
.assertEqual(d
.bits
, a
.bits
)
217 self
.assertEqual(e
.bits
, a
.bits
)
219 def test_logic(self
):
220 a
= SelectableInt(0x0F, 8)
221 b
= SelectableInt(0xA5, 8)
226 self
.assertEqual(c
.value
, a
.value
& b
.value
)
227 self
.assertEqual(d
.value
, a
.value | b
.value
)
228 self
.assertEqual(e
.value
, a
.value ^ b
.value
)
229 self
.assertEqual(f
.value
, 0xF0)
232 a
= SelectableInt(0xa2, 8)
233 # These should be big endian
234 self
.assertEqual(a
[7], 0)
235 self
.assertEqual(a
[0:4], 10)
236 self
.assertEqual(a
[4:8], 2)
239 a
= SelectableInt(0x5, 8)
240 a
[7] = SelectableInt(0, 1)
241 self
.assertEqual(a
, 4)
243 self
.assertEqual(a
, 9)
245 self
.assertEqual(a
, 0x39)
247 self
.assertEqual(a
, 0x199)
249 if __name__
== "__main__":