Loading

Paste #pz8b3uiof

  1. from nmigen.fhdl import *
  2. from nmigen.back import rtlil, verilog
  3.  
  4.  
  5. class Adder:
  6.     def __init__(self, width):
  7.         self.a   = Signal(width)
  8.         self.b   = Signal(width)
  9.         self.o   = Signal(width)
  10.  
  11.     def get_fragment(self, platform):
  12.         m = Module()
  13.         m.d.comb += self.o.eq(self.a + self.b)
  14.         return m.lower(platform)
  15.  
  16.  
  17. class Subtractor:
  18.     def __init__(self, width):
  19.         self.a   = Signal(width)
  20.         self.b   = Signal(width)
  21.         self.o   = Signal(width)
  22.  
  23.     def get_fragment(self, platform):
  24.         m = Module()
  25.         m.d.comb += self.o.eq(self.a - self.b)
  26.         return m.lower(platform)
  27.  
  28.  
  29. class ALU:
  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 get_fragment(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.lower(platform)
  54.  
  55.  
  56. alu  = ALU(width=16)
  57. frag = alu.get_fragment(platform=None)
  58. # print(rtlil.convert(frag, ports=[alu.op, alu.a, alu.b, alu.o]))
  59. print(verilog.convert(frag, ports=[alu.op, alu.a, alu.b, alu.o]))