from migen.fhdl.structure import *
from migen.bus import dfi

class S6DDRPHY:
	def __init__(self, a, ba, d):
		ins = []
		outs = []
		inouts = []
		
		for name, width, l in [
			("clk2x_270", 1, ins),
			("clk4x_wr", 1, ins),
			("clk4x_wr_strb", 1, ins),
			("clk4x_rd", 1, ins),
			("clk4x_rd_strb", 1, ins),
			
			("sd_clk_out_p", 1, outs),
			("sd_clk_out_n", 1, outs),
			("sd_a", a, outs),
			("sd_ba", ba, outs),
			("sd_cs_n", 1, outs),
			("sd_cke", 1, outs),
			("sd_ras_n", 1, outs),
			("sd_cas_n", 1, outs),
			("sd_we_n", 1, outs),
			("sd_dq", d//2, inouts),
			("sd_dm", d//16, outs),
			("sd_dqs", d//16, inouts)
			
		]:
			s = Signal(BV(width), name=name)
			setattr(self, name, s)
			l.append((name, s))
		
		self.dfi = dfi.Interface(a, ba, d, 2)
		ins += self.dfi.get_standard_names(True, False)
		outs += self.dfi.get_standard_names(False, True)
		
		self._inst = Instance("s6ddrphy",
			outs,
			ins,
			inouts,
			[
				("NUM_AD", a),
				("NUM_BA", ba),
				("NUM_D", d)
			],
			clkport="sys_clk")

	def get_fragment(self):
		return Fragment(instances=[self._inst])