use shifter opcode
[soc.git] / src / experiment / alu_hier.py
index 847bc32406060a4ce1feb5db9792c0b0dbbfb7d2..506f6e70baeb24f57a6124f4b93a8b80bc9651f0 100644 (file)
@@ -1,4 +1,4 @@
-from nmigen import Elaboratable, Signal, Module
+from nmigen import Elaboratable, Signal, Module, Const
 from nmigen.cli import main
 
 
@@ -40,13 +40,16 @@ class Multiplier(Elaboratable):
 
 class Shifter(Elaboratable):
     def __init__(self, width):
+        self.width = width
         self.a   = Signal(width)
-        self.b   = Signal(max=width)
+        self.b   = Signal(width)
         self.o   = Signal(width)
 
     def elaborate(self, platform):
         m = Module()
-        m.d.comb += self.o.eq(self.a << self.b)
+        btrunc = Signal(self.width)
+        m.d.comb += btrunc.eq(self.b & Const((1<<self.width)-1))
+        m.d.comb += self.o.eq(self.a >> btrunc)
         return m