from litescope.common import *
from litescope.frontend.la import LiteScopeLA
from litescope.core.port import LiteScopeTerm

from liteeth.common import *
from liteeth.generic import *

from targets.base import BaseSoC

class UDPSoC(BaseSoC):
	default_platform = "kc705"
	def __init__(self, platform):
		BaseSoC.__init__(self, platform,
			mac_address=0x10e2d5000000,
			ip_address="192.168.1.40")

		# add udp loopback on port 6000 with dw=8
		self.add_udp_loopback(6000, 8,  8192, "loopback_8")
		# add udp loopback on port 8000 with dw=32
		self.add_udp_loopback(8000, 32, 8192, "loopback_32")

	def add_udp_loopback(self, port, dw, depth, name=None):
		port = self.core.udp.crossbar.get_port(port, dw)
		buf = PacketBuffer(eth_udp_user_description(dw), depth//(dw//8), 8)
		if name is None:
			self.submodules += buf
		else:
			setattr(self.submodules, name, buf)
		self.comb += Port.connect(port, buf)

class UDPSoCDevel(UDPSoC):
	csr_map = {
		"la":			20
	}
	csr_map.update(UDPSoC.csr_map)
	def __init__(self, platform):
		UDPSoC.__init__(self, platform)
		debug = (
			self.loopback_8.sink.stb,
			self.loopback_8.sink.sop,
			self.loopback_8.sink.eop,
			self.loopback_8.sink.ack,
			self.loopback_8.sink.data,

			self.loopback_8.source.stb,
			self.loopback_8.source.sop,
			self.loopback_8.source.eop,
			self.loopback_8.source.ack,
			self.loopback_8.source.data,

			self.loopback_32.sink.stb,
			self.loopback_32.sink.sop,
			self.loopback_32.sink.eop,
			self.loopback_32.sink.ack,
			self.loopback_32.sink.data,

			self.loopback_32.source.stb,
			self.loopback_32.source.sop,
			self.loopback_32.source.eop,
			self.loopback_32.source.ack,
			self.loopback_32.source.data
		)
		self.submodules.la = LiteScopeLA(debug, 4096)
		self.la.trigger.add_port(LiteScopeTerm(self.la.dw))

	def do_exit(self, vns):
		self.la.export(vns, "test/la.csv")

default_subtarget = UDPSoC