2 from ..hdl
.ast
import *
4 from ..back
.pysim
import *
7 class SimulatorUnitTestCase(FHDLTestCase
):
8 def assertOperator(self
, stmt
, inputs
, output
):
9 inputs
= [Value
.wrap(i
) for i
in inputs
]
10 output
= Value
.wrap(output
)
12 isigs
= [Signal(i
.shape(), name
=n
) for i
, n
in zip(inputs
, "abcd")]
13 osig
= Signal(output
.shape(), name
="y")
16 frag
.add_statements(osig
.eq(stmt(*isigs
)))
20 vcd_file
=open("test.vcd", "w"),
21 gtkw_file
=open("test.gtkw", "w"),
22 traces
=[*isigs
, osig
]) as sim
:
24 for isig
, input in zip(isigs
, inputs
):
27 self
.assertEqual((yield osig
), output
.value
)
28 sim
.add_process(process
)
31 def test_invert(self
):
33 self
.assertOperator(stmt
, [C(0b0000, 4)], C(0b1111, 4))
34 self
.assertOperator(stmt
, [C(0b1010, 4)], C(0b0101, 4))
35 self
.assertOperator(stmt
, [C(0, 4)], C(-1, 4))
39 self
.assertOperator(stmt
, [C(0b0000, 4)], C(0b0000, 4))
40 self
.assertOperator(stmt
, [C(0b0001, 4)], C(0b1111, 4))
41 self
.assertOperator(stmt
, [C(0b1010, 4)], C(0b0110, 4))
42 self
.assertOperator(stmt
, [C(1, 4)], C(-1, 4))
43 self
.assertOperator(stmt
, [C(5, 4)], C(-5, 4))
46 stmt
= lambda a
: a
.bool()
47 self
.assertOperator(stmt
, [C(0, 4)], C(0))
48 self
.assertOperator(stmt
, [C(1, 4)], C(1))
49 self
.assertOperator(stmt
, [C(2, 4)], C(1))
52 stmt
= lambda a
, b
: a
+ b
53 self
.assertOperator(stmt
, [C(0, 4), C(1, 4)], C(1, 4))
54 self
.assertOperator(stmt
, [C(-5, 4), C(-5, 4)], C(-10, 5))
57 stmt
= lambda a
, b
: a
- b
58 self
.assertOperator(stmt
, [C(2, 4), C(1, 4)], C(1, 4))
59 self
.assertOperator(stmt
, [C(0, 4), C(1, 4)], C(-1, 4))
60 self
.assertOperator(stmt
, [C(0, 4), C(10, 4)], C(-10, 5))
63 stmt
= lambda a
, b
: a
& b
64 self
.assertOperator(stmt
, [C(0b1100, 4), C(0b1010, 4)], C(0b1000, 4))
67 stmt
= lambda a
, b
: a | b
68 self
.assertOperator(stmt
, [C(0b1100, 4), C(0b1010, 4)], C(0b1110, 4))
71 stmt
= lambda a
, b
: a ^ b
72 self
.assertOperator(stmt
, [C(0b1100, 4), C(0b1010, 4)], C(0b0110, 4))
75 stmt
= lambda a
, b
: a
<< b
76 self
.assertOperator(stmt
, [C(0b1001, 4), C(0)], C(0b1001, 5))
77 self
.assertOperator(stmt
, [C(0b1001, 4), C(3)], C(0b1001000, 7))
78 self
.assertOperator(stmt
, [C(0b1001, 4), C(-2)], C(0b10, 7))
81 stmt
= lambda a
, b
: a
>> b
82 self
.assertOperator(stmt
, [C(0b1001, 4), C(0)], C(0b1001, 4))
83 self
.assertOperator(stmt
, [C(0b1001, 4), C(2)], C(0b10, 4))
84 self
.assertOperator(stmt
, [C(0b1001, 4), C(-2)], C(0b100100, 5))
87 stmt
= lambda a
, b
: a
== b
88 self
.assertOperator(stmt
, [C(0, 4), C(0, 4)], C(1))
89 self
.assertOperator(stmt
, [C(0, 4), C(1, 4)], C(0))
90 self
.assertOperator(stmt
, [C(1, 4), C(0, 4)], C(0))
93 stmt
= lambda a
, b
: a
!= b
94 self
.assertOperator(stmt
, [C(0, 4), C(0, 4)], C(0))
95 self
.assertOperator(stmt
, [C(0, 4), C(1, 4)], C(1))
96 self
.assertOperator(stmt
, [C(1, 4), C(0, 4)], C(1))
99 stmt
= lambda a
, b
: a
< b
100 self
.assertOperator(stmt
, [C(0, 4), C(0, 4)], C(0))
101 self
.assertOperator(stmt
, [C(0, 4), C(1, 4)], C(1))
102 self
.assertOperator(stmt
, [C(1, 4), C(0, 4)], C(0))
105 stmt
= lambda a
, b
: a
>= b
106 self
.assertOperator(stmt
, [C(0, 4), C(0, 4)], C(1))
107 self
.assertOperator(stmt
, [C(0, 4), C(1, 4)], C(0))
108 self
.assertOperator(stmt
, [C(1, 4), C(0, 4)], C(1))
111 stmt
= lambda a
, b
: a
> b
112 self
.assertOperator(stmt
, [C(0, 4), C(0, 4)], C(0))
113 self
.assertOperator(stmt
, [C(0, 4), C(1, 4)], C(0))
114 self
.assertOperator(stmt
, [C(1, 4), C(0, 4)], C(1))
117 stmt
= lambda a
, b
: a
<= b
118 self
.assertOperator(stmt
, [C(0, 4), C(0, 4)], C(1))
119 self
.assertOperator(stmt
, [C(0, 4), C(1, 4)], C(1))
120 self
.assertOperator(stmt
, [C(1, 4), C(0, 4)], C(0))
123 stmt
= lambda a
, b
, c
: Mux(c
, a
, b
)
124 self
.assertOperator(stmt
, [C(2, 4), C(3, 4), C(0)], C(3, 4))
125 self
.assertOperator(stmt
, [C(2, 4), C(3, 4), C(1)], C(2, 4))
127 def test_slice(self
):
128 stmt1
= lambda a
: a
[2]
129 self
.assertOperator(stmt1
, [C(0b10110100, 8)], C(0b1, 1))
130 stmt2
= lambda a
: a
[2:4]
131 self
.assertOperator(stmt2
, [C(0b10110100, 8)], C(0b01, 2))
134 self
.assertOperator(Cat
, [C(0b10, 2), C(0b01, 2)], C(0b0110, 4))
137 stmt
= lambda a
: Repl(a
, 3)
138 self
.assertOperator(stmt
, [C(0b10, 2)], C(0b101010, 6))