1 from nmigen
import Elaboratable
, Signal
, Module
, Const
2 from nmigen
.cli
import main
5 class Adder(Elaboratable
):
6 def __init__(self
, width
):
11 def elaborate(self
, platform
):
13 m
.d
.comb
+= self
.o
.eq(self
.a
+ self
.b
)
17 class Subtractor(Elaboratable
):
18 def __init__(self
, width
):
19 self
.a
= Signal(width
)
20 self
.b
= Signal(width
)
21 self
.o
= Signal(width
)
23 def elaborate(self
, platform
):
25 m
.d
.comb
+= self
.o
.eq(self
.a
- self
.b
)
29 class Multiplier(Elaboratable
):
30 def __init__(self
, width
):
31 self
.a
= Signal(width
)
32 self
.b
= Signal(width
)
33 self
.o
= Signal(width
)
35 def elaborate(self
, platform
):
37 m
.d
.comb
+= self
.o
.eq(self
.a
* self
.b
)
41 class Shifter(Elaboratable
):
42 def __init__(self
, width
):
44 self
.a
= Signal(width
)
45 self
.b
= Signal(width
)
46 self
.o
= Signal(width
)
48 def elaborate(self
, platform
):
50 btrunc
= Signal(self
.width
)
51 m
.d
.comb
+= btrunc
.eq(self
.b
& Const((1<<self
.width
)-1))
52 m
.d
.comb
+= self
.o
.eq(self
.a
>> btrunc
)
56 class ALU(Elaboratable
):
57 def __init__(self
, width
):
59 self
.a
= Signal(width
)
60 self
.b
= Signal(width
)
61 self
.o
= Signal(width
)
64 def elaborate(self
, platform
):
66 add
= Adder(self
.width
)
67 sub
= Subtractor(self
.width
)
68 mul
= Multiplier(self
.width
)
69 shf
= Shifter(self
.width
)
71 m
.submodules
.add
= add
72 m
.submodules
.sub
= sub
73 m
.submodules
.mul
= mul
74 m
.submodules
.shf
= shf
75 for mod
in [add
, sub
, mul
, shf
]:
80 with m
.Switch(self
.op
):
82 m
.d
.comb
+= self
.o
.eq(add
.o
)
84 m
.d
.comb
+= self
.o
.eq(sub
.o
)
86 m
.d
.comb
+= self
.o
.eq(mul
.o
)
88 m
.d
.comb
+= self
.o
.eq(shf
.o
)
92 if __name__
== "__main__":
94 main(alu
, ports
=[alu
.op
, alu
.a
, alu
.b
, alu
.o
])