m.d.comb += self.o.n_valid.eq(self._data_valid)
m.d.comb += self.o.p_ready.eq(~self._data_valid | self.i.n_ready)
m.d.sync += self._data_valid.eq(self.i.p_valid | \
(~self.i.n_ready & self._data_valid))
with m.If(self.i.p_valid & self.o.p_ready):
m.d.sync += eq(self.r_data, self.i.data)
m.d.comb += self.o.n_valid.eq(self._data_valid)
m.d.comb += self.o.p_ready.eq(~self._data_valid | self.i.n_ready)
m.d.sync += self._data_valid.eq(self.i.p_valid | \
(~self.i.n_ready & self._data_valid))
with m.If(self.i.p_valid & self.o.p_ready):
m.d.sync += eq(self.r_data, self.i.data)