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 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 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 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 other
== self
.value
133 return "SelectableInt(value={:x}, bits={})".format(self
.value
,
136 def selectltu(lhs
, rhs
):
137 """ less-than (unsigned)
139 if isinstance(rhs
, SelectableInt
):
141 return lhs
.value
< rhs
143 def selectgtu(lhs
, rhs
):
144 """ greater-than (unsigned)
146 if isinstance(rhs
, SelectableInt
):
148 return lhs
.value
> rhs
151 # XXX this probably isn't needed...
152 def selectassign(lhs
, idx
, rhs
):
153 if isinstance(idx
, tuple):
158 lower
, upper
, step
= idx
159 toidx
= range(lower
, upper
, step
)
160 fromidx
= range(0, upper
-lower
, step
) # XXX eurgh...
164 for t
, f
in zip(toidx
, fromidx
):
168 def selectconcat(*args
):
171 assert isinstance(i
, SelectableInt
), "can only concat SIs, sorry"
173 res
.value
= (res
.value
<< i
.bits
) | i
.value
177 class SelectableIntTestCase(unittest
.TestCase
):
178 def test_arith(self
):
179 a
= SelectableInt(5, 8)
180 b
= SelectableInt(9, 8)
185 self
.assertEqual(c
.value
, a
.value
+ b
.value
)
186 self
.assertEqual(d
.value
, (a
.value
- b
.value
) & 0xFF)
187 self
.assertEqual(e
.value
, (a
.value
* b
.value
) & 0xFF)
188 self
.assertEqual(f
.value
, (-a
.value
) & 0xFF)
189 self
.assertEqual(c
.bits
, a
.bits
)
190 self
.assertEqual(d
.bits
, a
.bits
)
191 self
.assertEqual(e
.bits
, a
.bits
)
193 def test_logic(self
):
194 a
= SelectableInt(0x0F, 8)
195 b
= SelectableInt(0xA5, 8)
200 self
.assertEqual(c
.value
, a
.value
& b
.value
)
201 self
.assertEqual(d
.value
, a
.value | b
.value
)
202 self
.assertEqual(e
.value
, a
.value ^ b
.value
)
203 self
.assertEqual(f
.value
, 0xF0)
206 a
= SelectableInt(0xa2, 8)
207 # These should be big endian
208 self
.assertEqual(a
[7], 0)
209 self
.assertEqual(a
[0:4], 10)
210 self
.assertEqual(a
[4:8], 2)
213 a
= SelectableInt(0x5, 8)
214 a
[7] = SelectableInt(0, 1)
215 self
.assertEqual(a
, 4)
217 self
.assertEqual(a
, 9)
219 self
.assertEqual(a
, 0x39)
221 self
.assertEqual(a
, 0x199)
223 if __name__
== "__main__":