Beispiel #1
0
        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));
 }