yippee got dual add chained together
[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 m.d.comb += [
48 # join add1 a to a: add1.in_a = a
49 self.add1.in_a.v.eq(self.a.v),
50 self.add1.in_a.stb.eq(self.a.stb),
51 self.a.ack.eq(self.add1.in_a.ack),
52 # join add1 b to b: add1.in_b = b
53 self.add1.in_b.v.eq(self.b.v),
54 self.add1.in_b.stb.eq(self.b.stb),
55 self.b.ack.eq(self.add1.in_b.ack),
56 # join add2 a to c: add2.in_a = c
57 self.add2.in_a.v.eq(self.c.v),
58 self.add2.in_a.stb.eq(self.c.stb),
59 self.c.ack.eq(self.add2.in_a.ack),
60 # join add2 b to add1 z: add2.in_b = add1.out_z
61 self.add2.in_b.v.eq(self.add1.out_z.v),
62 self.add2.in_b.stb.eq(self.add1.out_z.stb),
63 self.add1.out_z.ack.eq(self.add2.in_b.ack),
64 # join output from add2 to z: z = add2.out_z
65 self.z.v.eq(self.add2.out_z.v),
66 self.z.stb.eq(self.add2.out_z.stb),
67 self.add2.out_z.ack.eq(self.z.ack),
68 ]
69 #with m.If(self.op):
70 # m.d.comb += self.o.eq(self.sub.o)
71 #with m.Else():
72 # m.d.comb += self.o.eq(self.add.o)
73 return m
74
75
76 if __name__ == "__main__":
77 alu = ALU(width=16)
78 main(alu, ports=alu.a.ports() + \
79 alu.b.ports() + \
80 alu.c.ports() + \
81 alu.z.ports())