move add to ieee754 directory
[ieee754fpu.git] / src / ieee754 / 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 self.int_stb = Signal()
40
41 self.add1 = FPADD(width)
42 self.add2 = FPADD(width)
43
44 def elaborate(self, platform):
45 m = Module()
46 m.submodules.add1 = self.add1
47 m.submodules.add2 = self.add2
48 # join add1 a to a: add1.in_a = a
49 m.d.comb += self.add1.in_a.chain_from(self.a)
50 # join add1 b to b: add1.in_b = b
51 m.d.comb += self.add1.in_b.chain_from(self.b)
52 # join add2 a to c: add2.in_a = c
53 m.d.comb += self.add2.in_a.chain_from(self.c)
54 # join add2 b to add1 z: add2.in_b = add1.out_z
55 m.d.comb += self.add2.in_b.chain_inv(self.add1.out_z)
56 # join output from add2 to z: z = add2.out_z
57 m.d.comb += self.z.chain_from(self.add2.out_z)
58 # get at add1's stb signal
59 m.d.comb += self.int_stb.eq(self.add1.out_z.stb)
60 #with m.If(self.op):
61 # m.d.comb += self.o.eq(self.sub.o)
62 #with m.Else():
63 # m.d.comb += self.o.eq(self.add.o)
64 return m
65
66
67 if __name__ == "__main__":
68 alu = ALU(width=16)
69 main(alu, ports=alu.a.ports() + \
70 alu.b.ports() + \
71 alu.c.ports() + \
72 alu.z.ports())