3 from ..asserts
import *
4 from ..back
.pysim
import *
5 from ..lib
.coding
import *
8 class EncoderTestCase(FHDLTestCase
):
12 self
.assertEqual((yield enc
.n
), 1)
13 self
.assertEqual((yield enc
.o
), 0)
15 yield enc
.i
.eq(0b0001)
17 self
.assertEqual((yield enc
.n
), 0)
18 self
.assertEqual((yield enc
.o
), 0)
20 yield enc
.i
.eq(0b0100)
22 self
.assertEqual((yield enc
.n
), 0)
23 self
.assertEqual((yield enc
.o
), 2)
25 yield enc
.i
.eq(0b0110)
27 self
.assertEqual((yield enc
.n
), 1)
28 self
.assertEqual((yield enc
.o
), 0)
31 sim
.add_process(process
)
35 class PriorityEncoderTestCase(FHDLTestCase
):
37 enc
= PriorityEncoder(4)
39 self
.assertEqual((yield enc
.n
), 1)
40 self
.assertEqual((yield enc
.o
), 0)
42 yield enc
.i
.eq(0b0001)
44 self
.assertEqual((yield enc
.n
), 0)
45 self
.assertEqual((yield enc
.o
), 0)
47 yield enc
.i
.eq(0b0100)
49 self
.assertEqual((yield enc
.n
), 0)
50 self
.assertEqual((yield enc
.o
), 2)
52 yield enc
.i
.eq(0b0110)
54 self
.assertEqual((yield enc
.n
), 0)
55 self
.assertEqual((yield enc
.o
), 1)
58 sim
.add_process(process
)
62 class DecoderTestCase(FHDLTestCase
):
66 self
.assertEqual((yield dec
.o
), 0b0001)
70 self
.assertEqual((yield dec
.o
), 0b0010)
74 self
.assertEqual((yield dec
.o
), 0b1000)
78 self
.assertEqual((yield dec
.o
), 0b0000)
81 sim
.add_process(process
)
85 class ReversibleSpec(Elaboratable
):
86 def __init__(self
, encoder_cls
, decoder_cls
, args
):
87 self
.encoder_cls
= encoder_cls
88 self
.decoder_cls
= decoder_cls
89 self
.coder_args
= args
91 def elaborate(self
, platform
):
93 enc
, dec
= self
.encoder_cls(*self
.coder_args
), self
.decoder_cls(*self
.coder_args
)
94 m
.submodules
+= enc
, dec
97 Assert(enc
.i
== dec
.o
)
102 class HammingDistanceSpec(Elaboratable
):
103 def __init__(self
, distance
, encoder_cls
, args
):
104 self
.distance
= distance
105 self
.encoder_cls
= encoder_cls
106 self
.coder_args
= args
108 def elaborate(self
, platform
):
110 enc1
, enc2
= self
.encoder_cls(*self
.coder_args
), self
.encoder_cls(*self
.coder_args
)
111 m
.submodules
+= enc1
, enc2
113 Assume(enc1
.i
+ 1 == enc2
.i
),
114 Assert(sum(enc1
.o ^ enc2
.o
) == self
.distance
)
119 class GrayCoderTestCase(FHDLTestCase
):
120 def test_reversible(self
):
121 spec
= ReversibleSpec(encoder_cls
=GrayEncoder
, decoder_cls
=GrayDecoder
, args
=(16,))
122 self
.assertFormal(spec
, mode
="prove")
124 def test_distance(self
):
125 spec
= HammingDistanceSpec(distance
=1, encoder_cls
=GrayEncoder
, args
=(16,))
126 self
.assertFormal(spec
, mode
="prove")