Exemplo n.º 1
0
        /// <summary>
        /// Configures the latency computation heuristic for a given synthesis plan.
        /// </summary>
        /// <param name="plan">synthesis plan</param>
        /// <param name="ratio">scaling factor for operator latencies</param>
        public static void SetLatencyProfile(HLSPlan plan, float ratio)
        {
            var axms = plan.XILMappers
                       .Where(m => m is ALUXILMapper)
                       .Cast <ALUXILMapper>();

            foreach (var axm in axms)
            {
                var calc = new PipelineDepthCalculator(ratio);
                axm.CalcPipelineDepth = calc.CalcALUPipelineDepth;
            }

            var xaxms = plan.XILMappers
                        .Where(m => m is XilinxAdderSubtracterXILMapper)
                        .Cast <XilinxAdderSubtracterXILMapper>();

            foreach (var xaxm in xaxms)
            {
                xaxm.Config.PipeStageScaling = ratio;
            }

            var mxms = plan.XILMappers
                       .Where(m => m is XilinxMultiplierXILMapper)
                       .Cast <XilinxMultiplierXILMapper>();

            foreach (var mxm in mxms)
            {
                mxm.Config.PipeStageScaling = ratio;
            }

            var dxms = plan.XILMappers
                       .Where(m => m is XilinxDividerXILMapper)
                       .Cast <XilinxDividerXILMapper>();

            foreach (var dxm in dxms)
            {
                dxm.Config.PipeStageScaling = ratio;
            }

            var fpxms = plan.XILMappers
                        .Where(m => m is FloatingPointXILMapper)
                        .Cast <FloatingPointXILMapper>();

            foreach (var fpxm in fpxms)
            {
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.AddSubtract].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.AddSubtract].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.AddSubtract].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Compare].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Compare].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Compare].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Divide].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Divide].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Divide].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FixedToFloat].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FixedToFloat].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FixedToFloat].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFixed].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFixed].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFixed].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFloat].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFloat].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFloat].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Multiply].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Multiply].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Multiply].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.SquareRoot].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.SquareRoot].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.SquareRoot].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.AddSubtract].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.AddSubtract].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.AddSubtract].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Compare].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Compare].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Compare].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Divide].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Divide].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Divide].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FixedToFloat].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FixedToFloat].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FixedToFloat].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFixed].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFixed].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFixed].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFloat].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFloat].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFloat].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Multiply].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Multiply].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Multiply].LatencyRatio        = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.SquareRoot].UseMaximumLatency   = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.SquareRoot].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.SquareRoot].LatencyRatio        = ratio;
            }

            var cordics = plan.XILMappers
                          .Where(m => m is CordicXILMapper)
                          .Cast <CordicXILMapper>();

            foreach (var cordic in cordics)
            {
                if (ratio < 0.1f)
                {
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].PipeliningMode      = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].PipeliningMode     = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].PipeliningMode      = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].PipeliningMode   = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].PipeliningMode = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].PipeliningMode        = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].PipeliningMode   = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].RegisterInputs      = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].RegisterInputs     = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].RegisterInputs      = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].RegisterInputs   = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].RegisterInputs        = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].RegisterInputs   = false;
                }
                else if (ratio < 0.5f)
                {
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].PipeliningMode      = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].PipeliningMode     = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].PipeliningMode      = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].PipeliningMode   = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].PipeliningMode        = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].PipeliningMode   = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].RegisterInputs      = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].RegisterInputs     = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].RegisterInputs      = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].RegisterInputs   = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].RegisterInputs        = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].RegisterInputs   = false;
                }
                else if (ratio < 1.0f)
                {
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].PipeliningMode      = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].PipeliningMode     = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].PipeliningMode      = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].PipeliningMode   = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].PipeliningMode        = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].PipeliningMode   = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].RegisterInputs      = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].RegisterInputs     = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].RegisterInputs      = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].RegisterInputs   = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].RegisterInputs        = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].RegisterInputs   = true;
                }
                else
                {
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].PipeliningMode      = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].PipeliningMode     = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].PipeliningMode      = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].PipeliningMode   = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].PipeliningMode = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].PipeliningMode        = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].PipeliningMode   = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].RegisterInputs      = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].RegisterInputs     = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].RegisterInputs      = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].RegisterInputs   = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].RegisterInputs        = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].RegisterInputs   = true;
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Configures the latency computation heuristic for a given synthesis plan.
        /// </summary>
        /// <param name="plan">synthesis plan</param>
        /// <param name="ratio">scaling factor for operator latencies</param>
        public static void SetLatencyProfile(HLSPlan plan, float ratio)
        {
            var axms = plan.XILMappers
                .Where(m => m is ALUXILMapper)
                .Cast<ALUXILMapper>();
            foreach (var axm in axms)
            {
                var calc = new PipelineDepthCalculator(ratio);
                axm.CalcPipelineDepth = calc.CalcALUPipelineDepth;
            }

            var xaxms = plan.XILMappers
                .Where(m => m is XilinxAdderSubtracterXILMapper)
                .Cast<XilinxAdderSubtracterXILMapper>();
            foreach (var xaxm in xaxms)
            {
                xaxm.Config.PipeStageScaling = ratio;
            }

            var mxms = plan.XILMappers
                .Where(m => m is XilinxMultiplierXILMapper)
                .Cast <XilinxMultiplierXILMapper>();
            foreach (var mxm in mxms)
            {
                mxm.Config.PipeStageScaling = ratio; 
            }

            var dxms = plan.XILMappers
                .Where(m => m is XilinxDividerXILMapper)
                .Cast<XilinxDividerXILMapper>();
            foreach (var dxm in dxms)
            {
                dxm.Config.PipeStageScaling = ratio;
            }

            var fpxms = plan.XILMappers
                .Where(m => m is FloatingPointXILMapper)
                .Cast<FloatingPointXILMapper>();
            foreach (var fpxm in fpxms)
            {
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.AddSubtract].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.AddSubtract].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.AddSubtract].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Compare].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Compare].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Compare].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Divide].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Divide].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Divide].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FixedToFloat].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FixedToFloat].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FixedToFloat].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFixed].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFixed].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFixed].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFloat].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFloat].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.FloatToFloat].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Multiply].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Multiply].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.Multiply].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.SquareRoot].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.SquareRoot].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Single, FloatingPointCore.EFunction.SquareRoot].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.AddSubtract].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.AddSubtract].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.AddSubtract].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Compare].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Compare].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Compare].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Divide].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Divide].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Divide].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FixedToFloat].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FixedToFloat].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FixedToFloat].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFixed].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFixed].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFixed].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFloat].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFloat].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.FloatToFloat].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Multiply].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Multiply].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.Multiply].LatencyRatio = ratio;

                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.SquareRoot].UseMaximumLatency = false;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.SquareRoot].SpecifyLatencyRatio = true;
                fpxm.Config[FloatingPointCore.EPrecision.Double, FloatingPointCore.EFunction.SquareRoot].LatencyRatio = ratio;
            }

            var cordics = plan.XILMappers
                .Where(m => m is CordicXILMapper)
                .Cast<CordicXILMapper>();
            foreach (var cordic in cordics)
            {
                if (ratio < 0.1f)
                {
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].PipeliningMode = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].PipeliningMode = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].PipeliningMode = XilinxCordic.EPipeliningMode.No_Pipelining;                    
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].PipeliningMode = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].PipeliningMode = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].PipeliningMode = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].PipeliningMode = XilinxCordic.EPipeliningMode.No_Pipelining;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].RegisterInputs = false;
                }
                else if (ratio < 0.5f)
                {
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].RegisterInputs = false;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].RegisterInputs = false;
                }
                else if (ratio < 1.0f)
                {
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].PipeliningMode = XilinxCordic.EPipeliningMode.Optimal;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].RegisterInputs = true;
                }
                else
                {
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].PipeliningMode = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].PipeliningMode = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].PipeliningMode = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].PipeliningMode = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].PipeliningMode = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].PipeliningMode = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].PipeliningMode = XilinxCordic.EPipeliningMode.Maximum;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctan].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Arctanh].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Rotate].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinAndCos].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.SinhAndCosh].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Sqrt].RegisterInputs = true;
                    cordic.Config[XilinxCordic.EFunctionalSelection.Translate].RegisterInputs = true;
                }
            }
        }