add test_partsig.py directly to experiment2
[soclayout.git] / experiments2 / test_partsig.py
1 #!/usr/bin/env python3
2 # SPDX-License-Identifier: LGPL-2.1-or-later
3 # See Notices.txt for copyright information
4
5 from nmigen import Signal, Module, Elaboratable
6 from nmigen.back.pysim import Simulator, Delay
7 from nmigen.cli import rtlil
8
9 from ieee754.part.partsig import PartitionedSignal
10 from ieee754.part_mux.part_mux import PMux
11
12
13 # XXX this is for coriolis2 experimentation
14 class TestAddMod2(Elaboratable):
15 def __init__(self, width, partpoints):
16 self.partpoints = partpoints
17 self.a = PartitionedSignal(partpoints, width)
18 self.b = PartitionedSignal(partpoints, width)
19 self.bsig = Signal(width)
20 self.add_output = Signal(width)
21 self.ls_output = Signal(width) # left shift
22 self.ls_scal_output = Signal(width) # left shift
23 self.sub_output = Signal(width)
24 self.eq_output = Signal(len(partpoints)+1)
25 self.gt_output = Signal(len(partpoints)+1)
26 self.ge_output = Signal(len(partpoints)+1)
27 self.ne_output = Signal(len(partpoints)+1)
28 self.lt_output = Signal(len(partpoints)+1)
29 self.le_output = Signal(len(partpoints)+1)
30 self.mux_sel = Signal(len(partpoints)+1)
31 self.mux_out = Signal(width)
32 self.carry_in = Signal(len(partpoints)+1)
33 self.add_carry_out = Signal(len(partpoints)+1)
34 self.sub_carry_out = Signal(len(partpoints)+1)
35 self.neg_output = Signal(width)
36
37 def elaborate(self, platform):
38 m = Module()
39 comb = m.d.comb
40 sync = m.d.sync
41 self.a.set_module(m)
42 self.b.set_module(m)
43 # compares
44 sync += self.lt_output.eq(self.a < self.b)
45 sync += self.ne_output.eq(self.a != self.b)
46 sync += self.le_output.eq(self.a <= self.b)
47 sync += self.gt_output.eq(self.a > self.b)
48 sync += self.eq_output.eq(self.a == self.b)
49 sync += self.ge_output.eq(self.a >= self.b)
50 # add
51 add_out, add_carry = self.a.add_op(self.a, self.b,
52 self.carry_in)
53 sync += self.add_output.eq(add_out)
54 sync += self.add_carry_out.eq(add_carry)
55 # sub
56 sub_out, sub_carry = self.a.sub_op(self.a, self.b,
57 self.carry_in)
58 sync += self.sub_output.eq(sub_out)
59 sync += self.sub_carry_out.eq(sub_carry)
60 # neg
61 sync += self.neg_output.eq(-self.a)
62 # left shift
63 sync += self.ls_output.eq(self.a << self.b)
64 ppts = self.partpoints
65 sync += self.mux_out.eq(PMux(m, ppts, self.mux_sel, self.a, self.b))
66 # scalar left shift
67 comb += self.bsig.eq(self.b.sig)
68 sync += self.ls_scal_output.eq(self.a << self.bsig)
69
70 return m
71
72