1 from nmigen
.hdl
import *
2 from nmigen
.asserts
import *
3 from nmigen
.sim
import *
4 from nmigen
.lib
.coding
import *
9 class EncoderTestCase(FHDLTestCase
):
13 self
.assertEqual((yield enc
.n
), 1)
14 self
.assertEqual((yield enc
.o
), 0)
16 yield enc
.i
.eq(0b0001)
18 self
.assertEqual((yield enc
.n
), 0)
19 self
.assertEqual((yield enc
.o
), 0)
21 yield enc
.i
.eq(0b0100)
23 self
.assertEqual((yield enc
.n
), 0)
24 self
.assertEqual((yield enc
.o
), 2)
26 yield enc
.i
.eq(0b0110)
28 self
.assertEqual((yield enc
.n
), 1)
29 self
.assertEqual((yield enc
.o
), 0)
32 sim
.add_process(process
)
36 class PriorityEncoderTestCase(FHDLTestCase
):
38 enc
= PriorityEncoder(4)
40 self
.assertEqual((yield enc
.n
), 1)
41 self
.assertEqual((yield enc
.o
), 0)
43 yield enc
.i
.eq(0b0001)
45 self
.assertEqual((yield enc
.n
), 0)
46 self
.assertEqual((yield enc
.o
), 0)
48 yield enc
.i
.eq(0b0100)
50 self
.assertEqual((yield enc
.n
), 0)
51 self
.assertEqual((yield enc
.o
), 2)
53 yield enc
.i
.eq(0b0110)
55 self
.assertEqual((yield enc
.n
), 0)
56 self
.assertEqual((yield enc
.o
), 1)
59 sim
.add_process(process
)
63 class DecoderTestCase(FHDLTestCase
):
67 self
.assertEqual((yield dec
.o
), 0b0001)
71 self
.assertEqual((yield dec
.o
), 0b0010)
75 self
.assertEqual((yield dec
.o
), 0b1000)
79 self
.assertEqual((yield dec
.o
), 0b0000)
82 sim
.add_process(process
)
86 class ReversibleSpec(Elaboratable
):
87 def __init__(self
, encoder_cls
, decoder_cls
, args
):
88 self
.encoder_cls
= encoder_cls
89 self
.decoder_cls
= decoder_cls
90 self
.coder_args
= args
92 def elaborate(self
, platform
):
94 enc
, dec
= self
.encoder_cls(*self
.coder_args
), self
.decoder_cls(*self
.coder_args
)
95 m
.submodules
+= enc
, dec
98 Assert(enc
.i
== dec
.o
)
103 class HammingDistanceSpec(Elaboratable
):
104 def __init__(self
, distance
, encoder_cls
, args
):
105 self
.distance
= distance
106 self
.encoder_cls
= encoder_cls
107 self
.coder_args
= args
109 def elaborate(self
, platform
):
111 enc1
, enc2
= self
.encoder_cls(*self
.coder_args
), self
.encoder_cls(*self
.coder_args
)
112 m
.submodules
+= enc1
, enc2
114 Assume(enc1
.i
+ 1 == enc2
.i
),
115 Assert(sum(enc1
.o ^ enc2
.o
) == self
.distance
)
120 class GrayCoderTestCase(FHDLTestCase
):
121 def test_reversible(self
):
122 spec
= ReversibleSpec(encoder_cls
=GrayEncoder
, decoder_cls
=GrayDecoder
, args
=(16,))
123 self
.assertFormal(spec
, mode
="prove")
125 def test_distance(self
):
126 spec
= HammingDistanceSpec(distance
=1, encoder_cls
=GrayEncoder
, args
=(16,))
127 self
.assertFormal(spec
, mode
="prove")