build.run: implement SSH remote builds using Paramiko.
[nmigen.git] / nmigen / test / test_lib_coding.py
1 from .utils import *
2 from ..hdl import *
3 from ..asserts import *
4 from ..back.pysim import *
5 from ..lib.coding import *
6
7
8 class EncoderTestCase(FHDLTestCase):
9 def test_basic(self):
10 enc = Encoder(4)
11 def process():
12 self.assertEqual((yield enc.n), 1)
13 self.assertEqual((yield enc.o), 0)
14
15 yield enc.i.eq(0b0001)
16 yield Settle()
17 self.assertEqual((yield enc.n), 0)
18 self.assertEqual((yield enc.o), 0)
19
20 yield enc.i.eq(0b0100)
21 yield Settle()
22 self.assertEqual((yield enc.n), 0)
23 self.assertEqual((yield enc.o), 2)
24
25 yield enc.i.eq(0b0110)
26 yield Settle()
27 self.assertEqual((yield enc.n), 1)
28 self.assertEqual((yield enc.o), 0)
29
30 sim = Simulator(enc)
31 sim.add_process(process)
32 sim.run()
33
34
35 class PriorityEncoderTestCase(FHDLTestCase):
36 def test_basic(self):
37 enc = PriorityEncoder(4)
38 def process():
39 self.assertEqual((yield enc.n), 1)
40 self.assertEqual((yield enc.o), 0)
41
42 yield enc.i.eq(0b0001)
43 yield Settle()
44 self.assertEqual((yield enc.n), 0)
45 self.assertEqual((yield enc.o), 0)
46
47 yield enc.i.eq(0b0100)
48 yield Settle()
49 self.assertEqual((yield enc.n), 0)
50 self.assertEqual((yield enc.o), 2)
51
52 yield enc.i.eq(0b0110)
53 yield Settle()
54 self.assertEqual((yield enc.n), 0)
55 self.assertEqual((yield enc.o), 1)
56
57 sim = Simulator(enc)
58 sim.add_process(process)
59 sim.run()
60
61
62 class DecoderTestCase(FHDLTestCase):
63 def test_basic(self):
64 dec = Decoder(4)
65 def process():
66 self.assertEqual((yield dec.o), 0b0001)
67
68 yield dec.i.eq(1)
69 yield Settle()
70 self.assertEqual((yield dec.o), 0b0010)
71
72 yield dec.i.eq(3)
73 yield Settle()
74 self.assertEqual((yield dec.o), 0b1000)
75
76 yield dec.n.eq(1)
77 yield Settle()
78 self.assertEqual((yield dec.o), 0b0000)
79
80 sim = Simulator(dec)
81 sim.add_process(process)
82 sim.run()
83
84
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
90
91 def elaborate(self, platform):
92 m = Module()
93 enc, dec = self.encoder_cls(*self.coder_args), self.decoder_cls(*self.coder_args)
94 m.submodules += enc, dec
95 m.d.comb += [
96 dec.i.eq(enc.o),
97 Assert(enc.i == dec.o)
98 ]
99 return m
100
101
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
107
108 def elaborate(self, platform):
109 m = Module()
110 enc1, enc2 = self.encoder_cls(*self.coder_args), self.encoder_cls(*self.coder_args)
111 m.submodules += enc1, enc2
112 m.d.comb += [
113 Assume(enc1.i + 1 == enc2.i),
114 Assert(sum(enc1.o ^ enc2.o) == self.distance)
115 ]
116 return m
117
118
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")
123
124 def test_distance(self):
125 spec = HammingDistanceSpec(distance=1, encoder_cls=GrayEncoder, args=(16,))
126 self.assertFormal(spec, mode="prove")