from liteeth.common import *

class LiteEthMACTXLastBE(Module):
	def __init__(self, dw):
		self.sink = sink = Sink(eth_phy_description(dw))
		self.source = source = Source(eth_phy_description(dw))
		###
		ongoing = Signal()
		self.sync += \
			If(sink.stb & sink.ack,
				If(sink.sop,
					ongoing.eq(1)
				).Elif(sink.last_be,
					ongoing.eq(0)
				)
			)
		self.comb += [
			source.stb.eq(sink.stb & (sink.sop | ongoing)),
			source.sop.eq(sink.sop),
			source.eop.eq(sink.last_be),
			source.data.eq(sink.data),
			sink.ack.eq(source.ack)
		]

class LiteEthMACRXLastBE(Module):
	def __init__(self, dw):
		self.sink = sink = Sink(eth_phy_description(dw))
		self.source = source = Source(eth_phy_description(dw))
		###
		self.comb += [
			source.stb.eq(sink.stb),
			source.sop.eq(sink.sop),
			source.eop.eq(sink.eop),
			source.data.eq(sink.data),
			source.last_be.eq(sink.eop),
			sink.ack.eq(source.ack)
		]