1fc7ea0b94facaa18eb74d588de59d301cae7c94
[soc.git] / src / experiment / alu_hier.py
1 from nmigen import Elaboratable, Signal, Module
2 from nmigen.cli import main
3
4
5 class Adder(Elaboratable):
6 def __init__(self, width):
7 self.a = Signal(width)
8 self.b = Signal(width)
9 self.o = Signal(width)
10
11 def elaborate(self, platform):
12 m = Module()
13 m.d.comb += self.o.eq(self.a + self.b)
14 return m
15
16
17 class Subtractor(Elaboratable):
18 def __init__(self, width):
19 self.a = Signal(width)
20 self.b = Signal(width)
21 self.o = Signal(width)
22
23 def elaborate(self, platform):
24 m = Module()
25 m.d.comb += self.o.eq(self.a - self.b)
26 return m
27
28
29 class ALU(Elaboratable):
30 def __init__(self, width):
31 self.op = Signal()
32 self.a = Signal(width)
33 self.b = Signal(width)
34 self.o = Signal(width)
35
36 self.add = Adder(width)
37 self.sub = Subtractor(width)
38
39 def elaborate(self, platform):
40 m = Module()
41 m.submodules.add = self.add
42 m.submodules.sub = self.sub
43 m.d.comb += [
44 self.add.a.eq(self.a),
45 self.sub.a.eq(self.a),
46 self.add.b.eq(self.b),
47 self.sub.b.eq(self.b),
48 ]
49 with m.If(self.op):
50 m.d.comb += self.o.eq(self.sub.o)
51 with m.Else():
52 m.d.comb += self.o.eq(self.add.o)
53 return m
54
55
56 if __name__ == "__main__":
57 alu = ALU(width=16)
58 main(alu, ports=[alu.op, alu.a, alu.b, alu.o])