1 from ..hdl
.ast
import *
5 class ValueTestCase(FHDLTestCase
):
7 self
.assertIsInstance(Value
.wrap(0), Const
)
8 self
.assertIsInstance(Value
.wrap(True), Const
)
10 self
.assertIs(Value
.wrap(c
), c
)
11 with self
.assertRaises(TypeError):
15 with self
.assertRaises(TypeError):
20 self
.assertEqual(len(Const(10)), 4)
22 def test_getitem_int(self
):
24 self
.assertIsInstance(s1
, Slice
)
25 self
.assertEqual(s1
.start
, 0)
26 self
.assertEqual(s1
.end
, 1)
28 self
.assertIsInstance(s2
, Slice
)
29 self
.assertEqual(s2
.start
, 3)
30 self
.assertEqual(s2
.end
, 4)
31 with self
.assertRaises(IndexError):
34 def test_getitem_slice(self
):
36 self
.assertIsInstance(s1
, Slice
)
37 self
.assertEqual(s1
.start
, 1)
38 self
.assertEqual(s1
.end
, 3)
40 self
.assertIsInstance(s2
, Slice
)
41 self
.assertEqual(s2
.start
, 1)
42 self
.assertEqual(s2
.end
, 2)
44 self
.assertIsInstance(s3
, Cat
)
45 self
.assertIsInstance(s3
.parts
[0], Slice
)
46 self
.assertEqual(s3
.parts
[0].start
, 0)
47 self
.assertEqual(s3
.parts
[0].end
, 1)
48 self
.assertIsInstance(s3
.parts
[1], Slice
)
49 self
.assertEqual(s3
.parts
[1].start
, 2)
50 self
.assertEqual(s3
.parts
[1].end
, 3)
51 self
.assertIsInstance(s3
.parts
[2], Slice
)
52 self
.assertEqual(s3
.parts
[2].start
, 4)
53 self
.assertEqual(s3
.parts
[2].end
, 5)
55 def test_getitem_wrong(self
):
56 with self
.assertRaises(TypeError):
60 class ConstTestCase(FHDLTestCase
):
62 self
.assertEqual(Const(0).shape(), (1, False))
63 self
.assertEqual(Const(1).shape(), (1, False))
64 self
.assertEqual(Const(10).shape(), (4, False))
65 self
.assertEqual(Const(-10).shape(), (5, True))
67 self
.assertEqual(Const(1, 4).shape(), (4, False))
68 self
.assertEqual(Const(1, (4, True)).shape(), (4, True))
69 self
.assertEqual(Const(0, (0, False)).shape(), (0, False))
71 def test_shape_bad(self
):
72 with self
.assertRaises(TypeError):
75 def test_normalization(self
):
76 self
.assertEqual(Const(0b10110, (5, True)).value
, -10)
79 self
.assertEqual(Const(10).value
, 10)
82 self
.assertEqual(repr(Const(10)), "(const 4'd10)")
83 self
.assertEqual(repr(Const(-10)), "(const 5'sd-10)")
86 with self
.assertRaises(TypeError):
90 class OperatorTestCase(FHDLTestCase
):
92 v
= Const(0, 4).bool()
93 self
.assertEqual(repr(v
), "(b (const 4'd0))")
94 self
.assertEqual(v
.shape(), (1, False))
96 def test_invert(self
):
98 self
.assertEqual(repr(v
), "(~ (const 4'd0))")
99 self
.assertEqual(v
.shape(), (4, False))
102 v1
= -Const(0, (4, False))
103 self
.assertEqual(repr(v1
), "(- (const 4'd0))")
104 self
.assertEqual(v1
.shape(), (5, True))
105 v2
= -Const(0, (4, True))
106 self
.assertEqual(repr(v2
), "(- (const 4'sd0))")
107 self
.assertEqual(v2
.shape(), (4, True))
110 v1
= Const(0, (4, False)) + Const(0, (6, False))
111 self
.assertEqual(repr(v1
), "(+ (const 4'd0) (const 6'd0))")
112 self
.assertEqual(v1
.shape(), (7, False))
113 v2
= Const(0, (4, True)) + Const(0, (6, True))
114 self
.assertEqual(v2
.shape(), (7, True))
115 v3
= Const(0, (4, True)) + Const(0, (4, False))
116 self
.assertEqual(v3
.shape(), (6, True))
117 v4
= Const(0, (4, False)) + Const(0, (4, True))
118 self
.assertEqual(v4
.shape(), (6, True))
119 v5
= 10 + Const(0, 4)
120 self
.assertEqual(v5
.shape(), (5, False))
123 v1
= Const(0, (4, False)) - Const(0, (6, False))
124 self
.assertEqual(repr(v1
), "(- (const 4'd0) (const 6'd0))")
125 self
.assertEqual(v1
.shape(), (7, False))
126 v2
= Const(0, (4, True)) - Const(0, (6, True))
127 self
.assertEqual(v2
.shape(), (7, True))
128 v3
= Const(0, (4, True)) - Const(0, (4, False))
129 self
.assertEqual(v3
.shape(), (6, True))
130 v4
= Const(0, (4, False)) - Const(0, (4, True))
131 self
.assertEqual(v4
.shape(), (6, True))
132 v5
= 10 - Const(0, 4)
133 self
.assertEqual(v5
.shape(), (5, False))
136 v1
= Const(0, (4, False)) * Const(0, (6, False))
137 self
.assertEqual(repr(v1
), "(* (const 4'd0) (const 6'd0))")
138 self
.assertEqual(v1
.shape(), (10, False))
139 v2
= Const(0, (4, True)) * Const(0, (6, True))
140 self
.assertEqual(v2
.shape(), (9, True))
141 v3
= Const(0, (4, True)) * Const(0, (4, False))
142 self
.assertEqual(v3
.shape(), (8, True))
143 v5
= 10 * Const(0, 4)
144 self
.assertEqual(v5
.shape(), (8, False))
147 v1
= Const(0, (4, False)) & Const(0, (6, False))
148 self
.assertEqual(repr(v1
), "(& (const 4'd0) (const 6'd0))")
149 self
.assertEqual(v1
.shape(), (6, False))
150 v2
= Const(0, (4, True)) & Const(0, (6, True))
151 self
.assertEqual(v2
.shape(), (6, True))
152 v3
= Const(0, (4, True)) & Const(0, (4, False))
153 self
.assertEqual(v3
.shape(), (5, True))
154 v4
= Const(0, (4, False)) & Const(0, (4, True))
155 self
.assertEqual(v4
.shape(), (5, True))
156 v5
= 10 & Const(0, 4)
157 self
.assertEqual(v5
.shape(), (4, False))
160 v1
= Const(0, (4, False)) |
Const(0, (6, False))
161 self
.assertEqual(repr(v1
), "(| (const 4'd0) (const 6'd0))")
162 self
.assertEqual(v1
.shape(), (6, False))
163 v2
= Const(0, (4, True)) |
Const(0, (6, True))
164 self
.assertEqual(v2
.shape(), (6, True))
165 v3
= Const(0, (4, True)) |
Const(0, (4, False))
166 self
.assertEqual(v3
.shape(), (5, True))
167 v4
= Const(0, (4, False)) |
Const(0, (4, True))
168 self
.assertEqual(v4
.shape(), (5, True))
169 v5
= 10 |
Const(0, 4)
170 self
.assertEqual(v5
.shape(), (4, False))
173 v1
= Const(0, (4, False)) ^
Const(0, (6, False))
174 self
.assertEqual(repr(v1
), "(^ (const 4'd0) (const 6'd0))")
175 self
.assertEqual(v1
.shape(), (6, False))
176 v2
= Const(0, (4, True)) ^
Const(0, (6, True))
177 self
.assertEqual(v2
.shape(), (6, True))
178 v3
= Const(0, (4, True)) ^
Const(0, (4, False))
179 self
.assertEqual(v3
.shape(), (5, True))
180 v4
= Const(0, (4, False)) ^
Const(0, (4, True))
181 self
.assertEqual(v4
.shape(), (5, True))
182 v5
= 10 ^
Const(0, 4)
183 self
.assertEqual(v5
.shape(), (4, False))
186 v1
= Const(1, 4) << Const(4)
187 self
.assertEqual(repr(v1
), "(<< (const 4'd1) (const 3'd4))")
188 self
.assertEqual(v1
.shape(), (11, False))
189 v2
= Const(1, 4) << Const(-3)
190 self
.assertEqual(v2
.shape(), (7, False))
193 v1
= Const(1, 4) >> Const(4)
194 self
.assertEqual(repr(v1
), "(>> (const 4'd1) (const 3'd4))")
195 self
.assertEqual(v1
.shape(), (4, False))
196 v2
= Const(1, 4) >> Const(-3)
197 self
.assertEqual(v2
.shape(), (8, False))
200 v
= Const(0, 4) < Const(0, 6)
201 self
.assertEqual(repr(v
), "(< (const 4'd0) (const 6'd0))")
202 self
.assertEqual(v
.shape(), (1, False))
205 v
= Const(0, 4) <= Const(0, 6)
206 self
.assertEqual(repr(v
), "(<= (const 4'd0) (const 6'd0))")
207 self
.assertEqual(v
.shape(), (1, False))
210 v
= Const(0, 4) > Const(0, 6)
211 self
.assertEqual(repr(v
), "(> (const 4'd0) (const 6'd0))")
212 self
.assertEqual(v
.shape(), (1, False))
215 v
= Const(0, 4) >= Const(0, 6)
216 self
.assertEqual(repr(v
), "(>= (const 4'd0) (const 6'd0))")
217 self
.assertEqual(v
.shape(), (1, False))
220 v
= Const(0, 4) == Const(0, 6)
221 self
.assertEqual(repr(v
), "(== (const 4'd0) (const 6'd0))")
222 self
.assertEqual(v
.shape(), (1, False))
225 v
= Const(0, 4) != Const(0, 6)
226 self
.assertEqual(repr(v
), "(!= (const 4'd0) (const 6'd0))")
227 self
.assertEqual(v
.shape(), (1, False))
231 v1
= Mux(s
, Const(0, (4, False)), Const(0, (6, False)))
232 self
.assertEqual(repr(v1
), "(m (const 1'd0) (const 4'd0) (const 6'd0))")
233 self
.assertEqual(v1
.shape(), (6, False))
234 v2
= Mux(s
, Const(0, (4, True)), Const(0, (6, True)))
235 self
.assertEqual(v2
.shape(), (6, True))
236 v3
= Mux(s
, Const(0, (4, True)), Const(0, (4, False)))
237 self
.assertEqual(v3
.shape(), (5, True))
238 v4
= Mux(s
, Const(0, (4, False)), Const(0, (4, True)))
239 self
.assertEqual(v4
.shape(), (5, True))
243 self
.assertEqual(repr(v
), "(b (const 1'd0))")
244 self
.assertEqual(v
.shape(), (1, False))
247 with self
.assertRaises(TypeError):
248 hash(Const(0) + Const(0))
251 class SliceTestCase(FHDLTestCase
):
252 def test_shape(self
):
254 self
.assertEqual(s1
.shape(), (1, False))
256 self
.assertEqual(s2
.shape(), (2, False))
258 def test_start_end_negative(self
):
261 self
.assertEqual((s1
.start
, s1
.end
), (0, 7))
262 s1
= Slice(c
, -4, -1)
263 self
.assertEqual((s1
.start
, s1
.end
), (4, 7))
265 def test_start_end_wrong(self
):
266 with self
.assertRaises(TypeError):
268 with self
.assertRaises(TypeError):
271 def test_start_end_out_of_range(self
):
273 with self
.assertRaises(IndexError):
275 with self
.assertRaises(IndexError):
277 with self
.assertRaises(IndexError):
282 self
.assertEqual(repr(s1
), "(slice (const 4'd10) 2:3)")
285 class PartTestCase(FHDLTestCase
):
288 self
.s
= Signal(max=self
.c
.nbits
)
290 def test_shape(self
):
291 s1
= self
.c
.part(self
.s
, 2)
292 self
.assertEqual(s1
.shape(), (2, False))
293 s2
= self
.c
.part(self
.s
, 0)
294 self
.assertEqual(s2
.shape(), (0, False))
296 def test_width_bad(self
):
297 with self
.assertRaises(TypeError):
298 self
.c
.part(self
.s
, -1)
301 s
= self
.c
.part(self
.s
, 2)
302 self
.assertEqual(repr(s
), "(part (const 8'd0) (sig s) 2)")
305 class CatTestCase(FHDLTestCase
):
306 def test_shape(self
):
308 self
.assertEqual(c1
.shape(), (4, False))
309 c2
= Cat(Const(10), Const(1))
310 self
.assertEqual(c2
.shape(), (5, False))
311 c3
= Cat(Const(10), Const(1), Const(0))
312 self
.assertEqual(c3
.shape(), (6, False))
315 c1
= Cat(Const(10), Const(1))
316 self
.assertEqual(repr(c1
), "(cat (const 4'd10) (const 1'd1))")
319 class ReplTestCase(FHDLTestCase
):
320 def test_shape(self
):
321 s1
= Repl(Const(10), 3)
322 self
.assertEqual(s1
.shape(), (12, False))
323 s2
= Repl(Const(10), 0)
324 self
.assertEqual(s2
.shape(), (0, False))
326 def test_count_wrong(self
):
327 with self
.assertRaises(TypeError):
329 with self
.assertRaises(TypeError):
330 Repl(Const(10), "str")
333 s
= Repl(Const(10), 3)
334 self
.assertEqual(repr(s
), "(repl (const 4'd10) 3)")
337 class ArrayTestCase(FHDLTestCase
):
338 def test_acts_like_array(self
):
340 self
.assertSequenceEqual(a
, [1,2,3])
341 self
.assertEqual(a
[1], 2)
343 self
.assertSequenceEqual(a
, [1,4,3])
345 self
.assertSequenceEqual(a
, [1,3])
347 self
.assertSequenceEqual(a
, [1,2,3])
349 def test_becomes_immutable(self
):
351 s1
= Signal(max=len(a
))
352 s2
= Signal(max=len(a
))
355 with self
.assertRaisesRegex(ValueError,
356 regex
=r
"^Array can no longer be mutated after it was indexed with a value at "):
358 with self
.assertRaisesRegex(ValueError,
359 regex
=r
"^Array can no longer be mutated after it was indexed with a value at "):
361 with self
.assertRaisesRegex(ValueError,
362 regex
=r
"^Array can no longer be mutated after it was indexed with a value at "):
367 self
.assertEqual(repr(a
), "(array mutable [1, 2, 3])")
368 s
= Signal(max=len(a
))
370 self
.assertEqual(repr(a
), "(array [1, 2, 3])")
373 class ArrayProxyTestCase(FHDLTestCase
):
374 def test_index_shape(self
):
375 m
= Array(Array(x
* y
for y
in range(1, 4)) for x
in range(1, 4))
379 self
.assertEqual(v
.shape(), (4, False))
381 def test_attr_shape(self
):
382 from collections
import namedtuple
383 pair
= namedtuple("pair", ("p", "n"))
384 a
= Array(pair(i
, -i
) for i
in range(10))
385 s
= Signal(max=len(a
))
387 self
.assertEqual(v
.p
.shape(), (4, False))
388 self
.assertEqual(v
.n
.shape(), (6, True))
394 self
.assertEqual(repr(v
), "(proxy (array [1, 2, 3]) (sig s))")
397 class SignalTestCase(FHDLTestCase
):
398 def test_shape(self
):
400 self
.assertEqual(s1
.shape(), (1, False))
402 self
.assertEqual(s2
.shape(), (2, False))
403 s3
= Signal((2, False))
404 self
.assertEqual(s3
.shape(), (2, False))
405 s4
= Signal((2, True))
406 self
.assertEqual(s4
.shape(), (2, True))
408 self
.assertEqual(s5
.shape(), (4, False))
409 s6
= Signal(min=4, max=16)
410 self
.assertEqual(s6
.shape(), (4, False))
411 s7
= Signal(min=-4, max=16)
412 self
.assertEqual(s7
.shape(), (5, True))
413 s8
= Signal(min=-20, max=16)
414 self
.assertEqual(s8
.shape(), (6, True))
416 self
.assertEqual(s9
.shape(), (0, False))
418 def test_shape_bad(self
):
419 with self
.assertRaises(ValueError):
420 Signal(min=10, max=4)
421 with self
.assertRaises(ValueError):
423 with self
.assertRaises(TypeError):
428 self
.assertEqual(s1
.name
, "s1")
429 s2
= Signal(name
="sig")
430 self
.assertEqual(s2
.name
, "sig")
432 def test_reset(self
):
433 s1
= Signal(4, reset
=0b111, reset_less
=True)
434 self
.assertEqual(s1
.reset
, 0b111)
435 self
.assertEqual(s1
.reset_less
, True)
437 def test_attrs(self
):
439 self
.assertEqual(s1
.attrs
, {})
440 s2
= Signal(attrs
={"no_retiming": True})
441 self
.assertEqual(s2
.attrs
, {"no_retiming": True})
445 self
.assertEqual(repr(s1
), "(sig s1)")
448 s1
= Signal
.like(Signal(4))
449 self
.assertEqual(s1
.shape(), (4, False))
450 s2
= Signal
.like(Signal(min=-15))
451 self
.assertEqual(s2
.shape(), (5, True))
452 s3
= Signal
.like(Signal(4, reset
=0b111, reset_less
=True))
453 self
.assertEqual(s3
.reset
, 0b111)
454 self
.assertEqual(s3
.reset_less
, True)
455 s4
= Signal
.like(Signal(attrs
={"no_retiming": True}))
456 self
.assertEqual(s4
.attrs
, {"no_retiming": True})
457 s5
= Signal
.like(Signal(decoder
=str))
458 self
.assertEqual(s5
.decoder
, str)
460 self
.assertEqual(s6
.shape(), (4, False))
463 class ClockSignalTestCase(FHDLTestCase
):
464 def test_domain(self
):
466 self
.assertEqual(s1
.domain
, "sync")
467 s2
= ClockSignal("pix")
468 self
.assertEqual(s2
.domain
, "pix")
470 with self
.assertRaises(TypeError):
473 def test_shape(self
):
474 self
.assertEqual(ClockSignal().shape(), (1, False))
478 self
.assertEqual(repr(s1
), "(clk sync)")
481 class ResetSignalTestCase(FHDLTestCase
):
482 def test_domain(self
):
484 self
.assertEqual(s1
.domain
, "sync")
485 s2
= ResetSignal("pix")
486 self
.assertEqual(s2
.domain
, "pix")
488 with self
.assertRaises(TypeError):
491 def test_shape(self
):
492 self
.assertEqual(ResetSignal().shape(), (1, False))
496 self
.assertEqual(repr(s1
), "(rst sync)")