digraph fft {
	s_Idle [label="\N\n\nbusy = 0\ni = 0\nCopyIm = 0"];
	s_CopySel [label="\N\n\nRAMReq = 1\nRAMWe = 0\ncbuf = RAMData\nRAMAddr = inbuf & i & CopyIm"];
	s_CopyWr [label="\N\n\ni = CopyIm ? i + 1 : i\nCopyIm = not CopyIm\nRAMReq = 1\nRAMWe = 0\nRAMData = cbuf\nRAMAddr = outbuf & bit-reverse(i) & CopyIm"];
	s_FFTStart [label="\N\n\nBp = 512\n Np = 2\np = 0"];
	s_PassStart [label="\N\n\nBaseT = 0\nb = 0"];
	s_BlockStart [label="\N\n\ni = 0\nk = 0\nTwiddleSel = 0\nBaseB = BaseT + Np * 2"];
	s_BflyLoad [label="\N\n\ni = i + 1\nRAMReq = 1\nRAMWe = 0\nLoad RAMData\nRAMAddr = outbuf & Base + k & i(0)"];
	s_BflyWrite [label="\N\n\ni = i + 1\nRAMReq = 1\nRAMWe = 1\nSet RAMData\nRAMAddr = outbuf & Base + k & i(0)"];
	s_BflyEnd [label="\N\n\nk = k + 1\nTwiddleSel = TwiddleSel + Np/2"];
	s_BlockEnd [label="\N\n\nb = b + 1\nBaseT = BaseT + Np"];
	s_PassEnd [label="\N\n\np = p + 1\nNp = Np * 2\nBp = Bp / 2"];

	s_Idle -> s_CopySel [label="start = 1"];
	s_CopySel -> s_CopyWr [label="RAMDone = 1"];
	s_CopyWr -> s_CopySel [label="RAMDone = 1 and i != 1024"];
	s_CopyWr -> s_FFTStart [label="RAMDone = 1 and i = 1024"];
	s_FFTStart -> s_PassStart -> s_BlockStart -> s_BflyLoad;
	s_BflyLoad -> s_BflyWrite [label="i = 4"]; 
	s_BflyLoad -> s_BflyLoad [label="i < 4"];
	s_BflyWrite -> s_BflyEnd [label="i = 4"]; 
	s_BflyWrite -> s_BflyWrite [label="i < 4"];
	s_BflyEnd -> s_BlockEnd [label="k = Np/2"];
	s_BflyEnd -> s_BflyLoad [label="k < Np/2"];
	s_BlockEnd -> s_BlockStart [label="b < Bp"];
	s_BlockEnd -> s_PassEnd [label="b = Bp"];
	s_PassEnd -> s_PassStart [label ="p < 10"];
	s_PassEnd -> s_Idle [label="p = 10"];
	
};
