success using SelectableInt in cnttzd test
[soc.git] / src / soc / decoder / selectable_int.py
1 import unittest
2
3
4 class SelectableInt:
5 def __init__(self, value, bits):
6 mask = (1 << bits) - 1
7 self.value = value & mask
8 self.bits = bits
9
10 def __add__(self, b):
11 assert b.bits == self.bits
12 return SelectableInt(self.value + b.value, self.bits)
13
14 def __sub__(self, b):
15 assert b.bits == self.bits
16 return SelectableInt(self.value - b.value, self.bits)
17
18 def __mul__(self, b):
19 assert b.bits == self.bits
20 return SelectableInt(self.value * b.value, self.bits)
21
22 def __or__(self, b):
23 assert b.bits == self.bits
24 return SelectableInt(self.value | b.value, self.bits)
25
26 def __and__(self, b):
27 assert b.bits == self.bits
28 return SelectableInt(self.value & b.value, self.bits)
29
30 def __xor__(self, b):
31 assert b.bits == self.bits
32 return SelectableInt(self.value ^ b.value, self.bits)
33
34 def __invert__(self):
35 return SelectableInt(~self.value, self.bits)
36
37 def __neg__(self):
38 return SelectableInt(~self.value + 1, self.bits)
39
40 def __getitem__(self, key):
41 if isinstance(key, int):
42 assert key < self.bits, "key %d accessing %d" % (key, self.bits)
43 assert key >= 0
44 key = self.bits - (key + 1)
45
46 value = (self.value >> key) & 1
47 return SelectableInt(value, 1)
48 elif isinstance(key, slice):
49 assert key.step is None or key.step == 1
50 assert key.start < key.stop
51 assert key.start >= 0
52 assert key.stop <= self.bits
53
54 stop = self.bits - key.start
55 start = self.bits - key.stop
56
57 bits = stop - start
58 mask = (1 << bits) - 1
59 value = (self.value >> start) & mask
60 return SelectableInt(value, bits)
61
62 def __setitem__(self, key, value):
63 if isinstance(key, int):
64 assert key < self.bits
65 assert key >= 0
66 key = self.bits - (key + 1)
67 if isinstance(value, SelectableInt):
68 assert value.bits == 1
69 value = value.value
70
71 value = value << key
72 mask = 1 << key
73 self.value = (self.value & ~mask) | (value & mask)
74 elif isinstance(key, slice):
75 assert key.step is None or key.step == 1
76 assert key.start < key.stop
77 assert key.start >= 0
78 assert key.stop <= self.bits
79
80 stop = self.bits - key.start
81 start = self.bits - key.stop
82
83 bits = stop - start
84 if isinstance(value, SelectableInt):
85 assert value.bits == bits
86 value = value.value
87 mask = ((1 << bits) - 1) << start
88 value = value << start
89 self.value = (self.value & ~mask) | (value & mask)
90
91 def __eq__(self, other):
92 if isinstance(other, SelectableInt):
93 return other.value == self.value and other.bits == self.bits
94 if isinstance(other, int):
95 return other == self.value
96 assert False
97
98 def __repr__(self):
99 return "SelectableInt(value={:x}, bits={})".format(self.value,
100 self.bits)
101
102
103 class SelectableIntTestCase(unittest.TestCase):
104 def test_arith(self):
105 a = SelectableInt(5, 8)
106 b = SelectableInt(9, 8)
107 c = a + b
108 d = a - b
109 e = a * b
110 f = -a
111 self.assertEqual(c.value, a.value + b.value)
112 self.assertEqual(d.value, (a.value - b.value) & 0xFF)
113 self.assertEqual(e.value, (a.value * b.value) & 0xFF)
114 self.assertEqual(f.value, (-a.value) & 0xFF)
115 self.assertEqual(c.bits, a.bits)
116 self.assertEqual(d.bits, a.bits)
117 self.assertEqual(e.bits, a.bits)
118
119 def test_logic(self):
120 a = SelectableInt(0x0F, 8)
121 b = SelectableInt(0xA5, 8)
122 c = a & b
123 d = a | b
124 e = a ^ b
125 f = ~a
126 self.assertEqual(c.value, a.value & b.value)
127 self.assertEqual(d.value, a.value | b.value)
128 self.assertEqual(e.value, a.value ^ b.value)
129 self.assertEqual(f.value, 0xF0)
130
131
132 def test_get(self):
133 a = SelectableInt(0xa2, 8)
134 # These should be big endian
135 self.assertEqual(a[7], 0)
136 self.assertEqual(a[0:4], 10)
137 self.assertEqual(a[4:8], 2)
138
139 def test_set(self):
140 a = SelectableInt(0x5, 8)
141 a[7] = SelectableInt(0, 1)
142 self.assertEqual(a, 4)
143 a[4:8] = 9
144 self.assertEqual(a, 9)
145 a[0:4] = 3
146 self.assertEqual(a, 0x39)
147 a[0:4] = a[4:8]
148 self.assertEqual(a, 0x99)
149
150
151 if __name__ == "__main__":
152 unittest.main()