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