use function to get chain of v/ack/stb
[ieee754fpu.git] / src / add / dual_add_experiment.py
1 from nmigen import *
2 from nmigen.cli import main
3
4 from nmigen_add_experiment import FPADD
5 from fpbase import FPOp
6
7
8 class Adder:
9 def __init__(self, width):
10 self.a = Signal(width)
11 self.b = Signal(width)
12 self.o = Signal(width)
13
14 def elaborate(self, platform):
15 m = Module()
16 m.d.comb += self.o.eq(self.a + self.b)
17 return m
18
19
20 class Subtractor:
21 def __init__(self, width):
22 self.a = Signal(width)
23 self.b = Signal(width)
24 self.o = Signal(width)
25
26 def elaborate(self, platform):
27 m = Module()
28 m.d.comb += self.o.eq(self.a - self.b)
29 return m
30
31
32 class ALU:
33 def __init__(self, width):
34 #self.op = Signal()
35 self.a = FPOp(width)
36 self.b = FPOp(width)
37 self.c = FPOp(width)
38 self.z = FPOp(width)
39
40 self.add1 = FPADD(width)
41 self.add2 = FPADD(width)
42
43 def elaborate(self, platform):
44 m = Module()
45 m.submodules.add1 = self.add1
46 m.submodules.add2 = self.add2
47 # join add1 a to a: add1.in_a = a
48 m.d.comb += self.add1.in_a.chain_from(self.a)
49 # join add1 b to b: add1.in_b = b
50 m.d.comb += self.add1.in_b.chain_from(self.b)
51 # join add2 a to c: add2.in_a = c
52 m.d.comb += self.add2.in_a.chain_from(self.c)
53 # join add2 b to add1 z: add2.in_b = add1.out_z
54 m.d.comb += self.add2.in_b.chain_from(self.add1.out_z)
55 # join output from add2 to z: z = add2.out_z
56 m.d.comb += self.z.chain_from(self.add2.out_z)
57 #with m.If(self.op):
58 # m.d.comb += self.o.eq(self.sub.o)
59 #with m.Else():
60 # m.d.comb += self.o.eq(self.add.o)
61 return m
62
63
64 if __name__ == "__main__":
65 alu = ALU(width=16)
66 main(alu, ports=alu.a.ports() + \
67 alu.b.ports() + \
68 alu.c.ports() + \
69 alu.z.ports())