def elaborate(self, platform): m = Module() matches = Signal(len(self.ports)) m.d.comb += self.no_match.eq(~matches.any()) for i, (addr_scheme, slv_bus) in enumerate(self.ports.items()): num_words = addr_scheme.num_words start_addr = addr_scheme.first_valid_addr_incl max_legal_addr = start_addr + self.word_size * (num_words - 1) req_addr = self.bus.adr with m.If((req_addr >= start_addr) & (req_addr <= max_legal_addr)): m.d.comb += [ slv_bus.connect(self.bus, exclude=["adr"]), slv_bus.adr.eq(req_addr - start_addr), matches[i].eq(1), ] return m