def get_fragment(self): n = len(self.endpoints) acked = Signal(BV(n), name="acked") sink = self.endpoints["sink"] sources = [self.endpoints["source{0}".format(n)] for n in range(len(self.endpoints)-1)] comb = [sink.ack.eq(optree('&', [source.ack | acked[n] for n, source in enumerate(sources)]))] comb += [source.stb.eq(sink.stb) for source in sources] sync = [If(sink.stb & sink.ack, acked.eq(0)).Else( *[If(source.ack, acked[n].eq(1)) for n, source in enumerate(sources)])] return Fragment(comb, sync)