class Leds(Component): @property def signature(self): return self._signature def __init__(self): self.mux = csr.bus.Multiplexer(addr_width=21, data_width=8, alignment=2, name="gpio") self._signature = self.mux.signature self._signature.members += { "leds": Out(8), "gpio": In(Signature({ "i": In(1), "o": Out(1), "oe": Out(1) })).array(8) } self.leds_reg = csr.Element(8, "w", path=("leds",)) self.inout_reg = csr.Element(8, "rw", path=("inout",)) self.oe_reg = csr.Element(8, "rw", path=("oe",)) self.mux.add(self.leds_reg, name="leds") self.mux.add(self.inout_reg, name="inout") self.mux.add(self.oe_reg, name="oe") super().__init__() def elaborate(self, plat): m = Module() m.submodules.mux = self.mux connect(m, flipped(self.bus), self.mux.bus) with m.If(self.leds_reg.w_stb): m.d.sync += self.leds.eq(self.leds_reg.w_data) with m.If(self.inout_reg.w_stb): for i in range(8): m.d.sync += self.gpio[i].o.eq(self.leds_reg.w_data[i]) for i in range(8): m.d.comb += self.inout_reg.r_data[i].eq(self.gpio[i].i) with m.If(self.oe_reg.w_stb): for i in range(8): m.d.sync += self.gpio[i].oe.eq(self.oe_reg.w_data[i]) return m