private void writeDataPathMultiplexer(StreamWriter stream, Multiplexer.Multiplexer multiplexer) { stream.WriteLine(); stream.WriteLine($"\t-- {multiplexer.Name}: {string.Join(", ", multiplexer.ItemNames)}"); stream.WriteLine($"\t{multiplexer.Name} : c_multiplexer"); stream.WriteLine($"\t\tgeneric map({multiplexer.OutputBitSize}, {multiplexer.ItemCount}, {multiplexer.SelectionBitSize})"); stream.WriteLine("\t\tport map"); stream.WriteLine("\t\t("); //wire up inputs var inputBitIndex = 0; foreach (var item in multiplexer.Items) { var register = item as RegisterBase; if (register != null) { if (register is InputRegister) { stream.WriteLine($"\t\t\tinput({inputBitIndex + register.Bits - 1} downto {inputBitIndex}) => {register.Name}({register.Bits - 1} downto 0), -- {register.Name}"); inputBitIndex += register.Bits; } else { var operation = AifFile.Operations.Values.First(op => op.Output == register); var operationUnit = Functional.Units.First(unit => unit.Operations.Contains(operation)); stream.WriteLine($"\t\t\tinput({inputBitIndex + register.Bits - 1} downto {inputBitIndex}) => {operationUnit.Name}_out({register.Bits - 1} downto 0), -- {register.Name}"); inputBitIndex += register.Bits; } } else { var op = (Operation)item; stream.WriteLine($"\t\t\t-- Operation {op.Name}: {op.Op}({op.Left.Name}, {op.Right.Name})"); inputBitIndex += writeDataPathMultiplexerRegister(stream, inputBitIndex, op.Left); inputBitIndex += writeDataPathMultiplexerRegister(stream, inputBitIndex, op.Right); } } //wire up selector var controlIndex = GetControlIndex(multiplexer); stream.Write("\t\t\tmux_select"); stream.WriteLine(multiplexer.SelectionBitSize == 1 ? $"(0) => ctrl({controlIndex})," : $"({multiplexer.SelectionBitSize - 1} downto 0) => ctrl({controlIndex} to {controlIndex + multiplexer.SelectionBitSize - 1}),"); //wire up the output stream.WriteLine($"\t\t\toutput => {multiplexer.Name}_out"); stream.WriteLine("\t\t);"); }
private string writeControllerValueFor(StreamWriter stream, Multiplexer.Multiplexer multiplexer, int cycle, int index) { stream.Write("\t\t\t\tcontrol_bus("); var value = multiplexer.GetSelectValueAndNameFrom(cycle); stream.Write(value.Item1.Length == 1 ? $"{index}) <= '{value.Item1}'" : $"{index} to {index + value.Item1.Length - 1}) <= \"{value.Item1}\""); stream.Write($"; -- {value.Item1} {multiplexer.Name}"); if (string.IsNullOrEmpty(value.Item2)) { stream.WriteLine(); } else { stream.WriteLine($": select {value.Item2}"); } return(value.Item1); }
protected int GetControlIndex(Multiplexer.Multiplexer multiplexer) { return(RegisterAllocator.Units.Length + Multiplexers.Multiplexers .TakeWhile(item => item != multiplexer) .Sum(item => item.SelectionBitSize)); }