예제 #1
0
        /// <summary>
        /// Clones a given synthesis plan.
        /// </summary>
        /// <param name="other">a synthesis plan</param>
        /// <returns>a clone of that plan</returns>
        public static HLSPlan CopyPlan(HLSPlan other)
        {
            var plan = new HLSPlan();

            other.CopyTo(plan);
            return(plan);
        }
예제 #2
0
            public void Refine(DesignContext context, IProject targetProject)
            {
                ComponentDescriptor cd  = (ComponentDescriptor)_pd.Owner;
                Component           rtl = cd.Instance;

                // Remove synthesizing process
                cd.RemoveChild(_pd);
                if (_planProp != null)
                {
                    var owner = (ComponentDescriptor)_pd.Owner;
                    _plan = _planProp.GetValue(owner.Instance, new object[0]) as HLSPlan;
                    if (_plan == null)
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.AppendFormat("HLS error: declaring type {0} with property {1} does not return an appropriate HLS plan",
                                        _pd.Method.DeclaringType.Name, _planProp);
                        throw new InvalidOperationException(sb.ToString());
                    }
                }
                else
                {
                    _plan = HLSPlan.CopyPlan(_pd.GetDesign().GetHLSPlan());
                }
                _plan.Execute(context, rtl, _pd, targetProject);
            }
예제 #3
0
 public HLSState(HLSPlan plan, DesignContext design, Component host, ProcessDescriptor proc, IProject proj)
 {
     _plan   = plan;
     _design = design;
     _host   = host;
     _proc   = proc;
     _proj   = proj;
 }
예제 #4
0
        /// <summary>
        /// Creates a default synthesis plan.
        /// </summary>
        /// <returns>A default synthesis plan</returns>
        public static HLSPlan CreateDefaultPlan()
        {
            HLSPlan plan = new HLSPlan();

            plan.XILSTransformations.Add(new FixPointImplementor());
            XILMemoryMapper xmm = new XILMemoryMapper()
            {
                MapConstantsToNemory = false,
                MapVariablesToMemory = false
            };

            //plan.XILSTransformations.Add(xmm);
            plan.MemMapper = xmm.Mapper;
            plan.XILSTransformations.Add(new ReduceTypes());
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Abs_int));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Neg_int));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Abs_double));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Neg_double));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Neg_float));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Cos_ScSinCos_double));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Sin_ScSinCos_double));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Cos_ScSinCos_single));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Sin_ScSinCos_single));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Cos_ScSinCos_fixpt));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Sin_ScSinCos_fixpt));
            plan.XILSTransformations.Add(new TransitiveGotoEliminator());
            plan.XILSTransformations.Add(new UnreachableInstructionEliminator());
            plan.XILSTransformations.Add(new ConditionalBranchOptimizer());
            plan.XILSTransformations.Add(new UnreachableInstructionEliminator());
            plan.XILSTransformations.Add(new ImplTypeRewriter());
            plan.XILSTransformations.Add(new ReadWriteDependencyInjector());

            plan.XIL3Transformations.Add(new EliminateCommonSubexpressions());

            plan.AddXILMapper(typeof(ALU));
            plan.AddXILMapper(typeof(PortReaderXILMapper));
            plan.AddXILMapper(typeof(PortWriterXILMapper));
            plan.AddXILMapper(typeof(LocalStorageUnit));
            plan.AddXILMapper(typeof(ConstLoadingXILMapper));
            plan.AddXILMapper(typeof(NopMapper));
            plan.AddXILMapper(typeof(MUX2));
            plan.AddXILMapper(typeof(Slicer));
            plan.AddXILMapper(typeof(FixFPMod1));
            plan.AddXILMapper(typeof(Shifter));
            //plan.AddXILMapper(typeof(ConcatenizerXILMapper));
            plan.AddXILMapper(typeof(InlineConcatMapper));
            plan.AddXILMapper(typeof(FixedAbs));
            plan.AddXILMapper(typeof(FloatNegAbs));
            plan.AddXILMapper(typeof(FloatSignAsSigned));
            plan.AddXILMapper(typeof(InlineFieldMapper));
            plan.AddXILMapper(typeof(InlineMemoryMapper));
            //plan.AddXILMapper(typeof(SinCosLUTCore));

            plan.Scheduler           = ForceDirectedScheduler.Instance.ToFunctionScheduler();
            plan.InterconnectBuilder = MinRegInterconnectBuilder.Factory;
            plan.ControlPathBuilder  = FSMControlpathBuilder.Factory;
            return(plan);
        }
예제 #5
0
 /// <summary>
 /// Copies the current plan to another instance.
 /// </summary>
 /// <param name="other">The instance to receive the plan.</param>
 public void CopyTo(HLSPlan other)
 {
     other.Scheduler           = Scheduler;
     other.InterconnectBuilder = InterconnectBuilder;
     other.ControlPathBuilder  = ControlPathBuilder;
     other.MemMapper           = MemMapper;
     other.ProgramROMFactory   = ProgramROMFactory;
     other.XILSTransformations.AddRange(XILSTransformations);
     other.XIL3Transformations.AddRange(XIL3Transformations);
     other.XILMappers.AddRange(XILMappers);
 }
예제 #6
0
        /// <summary>
        /// Returns synthesis plan of a given design descriptor. If none exists, a new one gets created.
        /// </summary>
        /// <param name="dd">a design descriptor</param>
        /// <returns>the synthesis plan</returns>
        /// <remarks>The synthesis plan is attached as an attribute to the descriptor.</remarks>
        public static HLSPlan GetHLSPlan(this DesignDescriptor dd)
        {
            Contract.Requires <ArgumentNullException>(dd != null);

            var plan = dd.QueryAttribute <HLSPlan>();

            if (plan == null)
            {
                plan = HLSPlan.CreateDefaultPlan();
                dd.AddAttribute(plan);
            }
            return(plan);
        }
예제 #7
0
            public void Refine(DesignContext context, IProject targetProject)
            {
                ComponentDescriptor cd = (ComponentDescriptor)_pd.Owner;
                Component rtl = cd.Instance;

                // Remove synthesizing process
                cd.RemoveChild(_pd);
                if (_planProp != null)
                {
                    var owner = (ComponentDescriptor)_pd.Owner;
                    _plan = _planProp.GetValue(owner.Instance, new object[0]) as HLSPlan;
                    if (_plan == null)
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.AppendFormat("HLS error: declaring type {0} with property {1} does not return an appropriate HLS plan",
                            _pd.Method.DeclaringType.Name, _planProp);
                        throw new InvalidOperationException(sb.ToString());
                    }
                }
                else
                {
                    _plan = HLSPlan.CopyPlan(_pd.GetDesign().GetHLSPlan());
                }
                _plan.Execute(context, rtl, _pd, targetProject);
            }
예제 #8
0
 /// <summary>
 /// Clones a given synthesis plan.
 /// </summary>
 /// <param name="other">a synthesis plan</param>
 /// <returns>a clone of that plan</returns>
 public static HLSPlan CopyPlan(HLSPlan other)
 {
     var plan = new HLSPlan();
     other.CopyTo(plan);
     return plan;
 }
예제 #9
0
        /// <summary>
        /// Creates a default synthesis plan.
        /// </summary>
        /// <returns>A default synthesis plan</returns>
        public static HLSPlan CreateDefaultPlan()
        {
            HLSPlan plan = new HLSPlan();
            plan.XILSTransformations.Add(new FixPointImplementor());
            XILMemoryMapper xmm = new XILMemoryMapper()
            {
                MapConstantsToNemory = false,
                MapVariablesToMemory = false
            };            
            //plan.XILSTransformations.Add(xmm);
            plan.MemMapper = xmm.Mapper;
            plan.XILSTransformations.Add(new ReduceTypes());
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Abs_int));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Neg_int));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Abs_double));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Neg_double));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Neg_float));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Cos_ScSinCos_double));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Sin_ScSinCos_double));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Cos_ScSinCos_single));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Sin_ScSinCos_single));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Cos_ScSinCos_fixpt));
            plan.XILSTransformations.Add(new ExpandXILS(EXILSExpansion.Expand_Sin_ScSinCos_fixpt));
            plan.XILSTransformations.Add(new TransitiveGotoEliminator());
            plan.XILSTransformations.Add(new UnreachableInstructionEliminator());
            plan.XILSTransformations.Add(new ConditionalBranchOptimizer());
            plan.XILSTransformations.Add(new UnreachableInstructionEliminator());
            plan.XILSTransformations.Add(new ImplTypeRewriter());
            plan.XILSTransformations.Add(new ReadWriteDependencyInjector());

            plan.XIL3Transformations.Add(new EliminateCommonSubexpressions());

            plan.AddXILMapper(typeof(ALU));
            plan.AddXILMapper(typeof(PortReaderXILMapper));
            plan.AddXILMapper(typeof(PortWriterXILMapper));
            plan.AddXILMapper(typeof(LocalStorageUnit));
            plan.AddXILMapper(typeof(ConstLoadingXILMapper));
            plan.AddXILMapper(typeof(NopMapper));
            plan.AddXILMapper(typeof(MUX2));
            plan.AddXILMapper(typeof(Slicer));
            plan.AddXILMapper(typeof(FixFPMod1));
            plan.AddXILMapper(typeof(Shifter));
            //plan.AddXILMapper(typeof(ConcatenizerXILMapper));
            plan.AddXILMapper(typeof(InlineConcatMapper));
            plan.AddXILMapper(typeof(FixedAbs));
            plan.AddXILMapper(typeof(FloatNegAbs));
            plan.AddXILMapper(typeof(FloatSignAsSigned));
            plan.AddXILMapper(typeof(InlineFieldMapper));
            plan.AddXILMapper(typeof(InlineMemoryMapper));
            //plan.AddXILMapper(typeof(SinCosLUTCore));

            plan.Scheduler = ForceDirectedScheduler.Instance.ToFunctionScheduler();
            plan.InterconnectBuilder = MinRegInterconnectBuilder.Factory;
            plan.ControlPathBuilder = FSMControlpathBuilder.Factory;
            return plan;
        }
예제 #10
0
 /// <summary>
 /// Copies the current plan to another instance.
 /// </summary>
 /// <param name="other">The instance to receive the plan.</param>
 public void CopyTo(HLSPlan other)
 {
     other.Scheduler = Scheduler;
     other.InterconnectBuilder = InterconnectBuilder;
     other.ControlPathBuilder = ControlPathBuilder;
     other.MemMapper = MemMapper;
     other.ProgramROMFactory = ProgramROMFactory;
     other.XILSTransformations.AddRange(XILSTransformations);
     other.XIL3Transformations.AddRange(XIL3Transformations);
     other.XILMappers.AddRange(XILMappers);
 }
예제 #11
0
 public HLSState(HLSPlan plan, DesignContext design, Component host, ProcessDescriptor proc, IProject proj)
 {
     _plan = plan;
     _design = design;
     _host = host;
     _proc = proc;
     _proj = proj;
 }
 public void PersonalizePlan(HLSPlan plan)
 {
     _bcuMapper = new InlineBCUMapper();
     plan.AddXILMapper(_bcuMapper);
 }
예제 #13
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;
                }
            }
        }