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
58 bits
= stop
- start
+ 1
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
84 bits
= stop
- start
+ 1
85 if isinstance(value
, SelectableInt
):
86 assert value
.bits
== bits
, "%d into %d" % (value
.bits
, bits
)
88 mask
= ((1 << bits
) - 1) << start
89 value
= value
<< start
90 self
.value
= (self
.value
& ~mask
) |
(value
& mask
)
92 def __ge__(self
, other
):
93 if isinstance(other
, SelectableInt
):
94 assert other
.bits
== self
.bits
96 if isinstance(other
, int):
97 return other
>= self
.value
100 def __le__(self
, other
):
101 if isinstance(other
, SelectableInt
):
102 assert other
.bits
== self
.bits
104 if isinstance(other
, int):
105 return onebit(other
<= self
.value
)
108 def __gt__(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 __lt__(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 __eq__(self
, other
):
125 if isinstance(other
, SelectableInt
):
126 assert other
.bits
== self
.bits
128 if isinstance(other
, int):
129 return onebit(other
== self
.value
)
133 return "SelectableInt(value={:x}, bits={})".format(self
.value
,
137 return SelectableInt(1 if bit
else 0, 1)
139 def selectltu(lhs
, rhs
):
140 """ less-than (unsigned)
142 if isinstance(rhs
, SelectableInt
):
144 return onebit(lhs
.value
< rhs
)
146 def selectgtu(lhs
, rhs
):
147 """ greater-than (unsigned)
149 if isinstance(rhs
, SelectableInt
):
151 return onebit(lhs
.value
> rhs
)
154 # XXX this probably isn't needed...
155 def selectassign(lhs
, idx
, rhs
):
156 if isinstance(idx
, tuple):
161 lower
, upper
, step
= idx
162 toidx
= range(lower
, upper
, step
)
163 fromidx
= range(0, upper
-lower
, step
) # XXX eurgh...
167 for t
, f
in zip(toidx
, fromidx
):
171 def selectconcat(*args
):
174 assert isinstance(i
, SelectableInt
), "can only concat SIs, sorry"
176 res
.value
= (res
.value
<< i
.bits
) | i
.value
180 class SelectableIntTestCase(unittest
.TestCase
):
181 def test_arith(self
):
182 a
= SelectableInt(5, 8)
183 b
= SelectableInt(9, 8)
188 self
.assertEqual(c
.value
, a
.value
+ b
.value
)
189 self
.assertEqual(d
.value
, (a
.value
- b
.value
) & 0xFF)
190 self
.assertEqual(e
.value
, (a
.value
* b
.value
) & 0xFF)
191 self
.assertEqual(f
.value
, (-a
.value
) & 0xFF)
192 self
.assertEqual(c
.bits
, a
.bits
)
193 self
.assertEqual(d
.bits
, a
.bits
)
194 self
.assertEqual(e
.bits
, a
.bits
)
196 def test_logic(self
):
197 a
= SelectableInt(0x0F, 8)
198 b
= SelectableInt(0xA5, 8)
203 self
.assertEqual(c
.value
, a
.value
& b
.value
)
204 self
.assertEqual(d
.value
, a
.value | b
.value
)
205 self
.assertEqual(e
.value
, a
.value ^ b
.value
)
206 self
.assertEqual(f
.value
, 0xF0)
209 a
= SelectableInt(0xa2, 8)
210 # These should be big endian
211 self
.assertEqual(a
[7], 0)
212 self
.assertEqual(a
[0:4], 10)
213 self
.assertEqual(a
[4:8], 2)
216 a
= SelectableInt(0x5, 8)
217 a
[7] = SelectableInt(0, 1)
218 self
.assertEqual(a
, 4)
220 self
.assertEqual(a
, 9)
222 self
.assertEqual(a
, 0x39)
224 self
.assertEqual(a
, 0x199)
226 if __name__
== "__main__":