Exemple #1
0
        private void InitializeFullTargetNaming(GMacTargetVariablesNaming targetNaming)
        {
            var valueAccessList =
                targetNaming
                .CodeBlock
                .BaseMacro
                .Parameters
                .SelectMany(paramInfo => paramInfo.DatastoreValueAccess.ExpandStructures());

            foreach (var valueAccess in valueAccessList)
            {
                if (valueAccess.IsPrimitive)
                {
                    var varName = valueAccess.ValueAccessName;

                    targetNaming.SetScalarParameter(valueAccess, varName);

                    continue;
                }

                var parentName = valueAccess.ValueAccessName;

                targetNaming.SetMultivectorParameters(
                    valueAccess,
                    id => BasisBladeIdToCode(parentName, id)
                    );
            }

            targetNaming.SetTempVariables(v => "tmp" + v.NameIndex);
        }
 internal void SetBasisBladeToArrayNaming(GMacTargetVariablesNaming targetNaming, string macroParamName, int macroParamGrade, string arrayVarName)
 {
     targetNaming.SetMultivectorParameters(
         macroParamName + ".@G" + macroParamGrade + "@",
         id => BasisBladeIdToTargetArrayItem(arrayVarName, id)
         );
 }
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            targetNaming.SetScalarParameter(targetNaming.BaseMacro.OutputParameterValueAccess, "result");

            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", _inGrade, "coefs");

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
        //internal void SetBladeParameterBinding(GMacMacroBinding macroBinding, string macroParamName, int macroParamGrade)
        //{
        //    macroBinding.BindMultivectorToVariables(macroParamName, macroParamGrade);
        //}

        internal void SetBasisBladeToArrayNaming(GMacTargetVariablesNaming targetNaming, AstDatastoreValueAccess macroParam, int macroParamGrade, string arrayVarName)
        {
            targetNaming.SetMultivectorParameters(
                macroParam,
                macroParamGrade,
                id => BasisBladeIdToTargetArrayItem(arrayVarName, id)
                );
        }
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "result", OutputGrade, "c");

            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "v", InputGrade1, "coefs1");
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", InputGrade2, "coefs2");

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
Exemple #6
0
        public static void DefaultActionSetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            targetNaming.SetInputVariables(v => v.ValueAccessName);

            targetNaming.SetOutputVariables(v => v.ValueAccessName);

            //targetNaming.SetTempVariables(v => v.LowLevelName);
            targetNaming.SetTempVariables(v => "tmp" + v.NameIndex);
        }
 internal void SetTargetTempVariablesNames(GMacTargetVariablesNaming targetNaming)
 {
     //Temp variables target naming
     if (targetNaming.CodeBlock.TargetTempVarsCount > MaxTargetLocalVars)
     {
         //Name as array items
         targetNaming.SetTempVariables((int index) => "tempArray[" + index + "]");
     }
     else
     {
         //Name as set of local variables
         targetNaming.SetTempVariables(index => "tempVar" + index.ToString("X4") + "");
     }
 }
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "result", _outGrade, "coefs");

            for (var gradeIdx = 0; gradeIdx < _outGrade; gradeIdx++)
            {
                var vectorName = "vectors[" + gradeIdx + "].C";

                targetNaming.SetMultivectorParameters(
                    "v" + gradeIdx + ".@G1@",
                    id => vectorName + (CurrentFrame.BasisBladeIndex(id) + 1)
                    );
            }

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
Exemple #9
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            var outputParam = targetNaming.BaseMacro.OutputParameterValueAccess;

            if (outputParam.GMacType.IsValidMultivectorType)
            {
                BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, outputParam, _outGrade, "c");
            }
            else
            {
                targetNaming.SetScalarParameter(outputParam, "c[0]");
            }

            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", _inGrade, "coefs");

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
Exemple #10
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "B", InputGrade, "coefs");

            for (var idx = 1; idx <= InputGrade; idx++)
            {
                var valueAccessName = "result.f" + idx + ".@G1@";

                var outputName = "vectors[" + (idx - 1) + "].C";

                targetNaming.SetMultivectorParameters(
                    valueAccessName,
                    vectorId => outputName + (CurrentFrame.BasisBladeIndex(vectorId) + 1)
                    );
            }

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
Exemple #11
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "result", InputGrade, "coefs");
            BladesLibraryGenerator.SetBasisBladeToArrayNaming(targetNaming, "mv", InputGrade, "bladeCoefs");

            for (var i = 0; i < CurrentFrame.VSpaceDimension; i++)
            {
                var id = CurrentFrame.BasisVectorId(i);

                for (var j = 0; j < CurrentFrame.VSpaceDimension; j++)
                {
                    var varName = "omCoefs".CoefPart(i, j);

                    var valueAccessName = "om.ImageV" + (j + 1) + ".#E" + id + "#";

                    targetNaming.SetScalarParameter(valueAccessName, varName);
                }
            }

            BladesLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
Exemple #12
0
        protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming)
        {
            //Set names of output parameter components
            var outputParam = targetNaming.BaseMacro.OutputParameterValueAccess;

            if (outputParam.GMacType.IsValidMultivectorType)
            {
                targetNaming.SetMultivectorParameters(outputParam, b => "result." + b.GradeIndexName);
            }
            else
            {
                targetNaming.SetScalarParameter(outputParam, "result");
            }

            //Set names for input parameters components
            targetNaming.SetMultivectorParameters("mv1", b => b.GradeIndexName);

            targetNaming.SetMultivectorParameters("mv2", b => "mv." + b.GradeIndexName);

            //Set names for temp variables
            MvLibraryGenerator.SetTargetTempVariablesNames(targetNaming);
        }
Exemple #13
0
        private void SetTargetNaming(GMacTargetVariablesNaming targetNaming)
        {
            //Set default target variables names for macro parameters
            var valueAccessList =
                targetNaming
                .CodeBlock
                .BaseMacro
                .Parameters
                .SelectMany(paramInfo => paramInfo.DatastoreValueAccess.ExpandStructures());

            foreach (var valueAccess in valueAccessList)
            {
                if (valueAccess.IsPrimitive)
                {
                    var varName = valueAccess.ValueAccessName;

                    targetNaming.SetScalarParameter(valueAccess, varName);

                    continue;
                }

                var parentName = valueAccess.ValueAccessName;

                targetNaming.SetMultivectorParameters(
                    valueAccess,
                    id => BasisBladeIdToCode(parentName, id)
                    );
            }

            //Override default target variables names for macro parameters using the
            //items in the TargetVariablesNamesDictionary
            foreach (var pair in TargetVariablesNamesDictionary)
            {
                targetNaming.SetScalarParameter(pair.Key, pair.Value);
            }

            //Set temporary target variables names
            targetNaming.SetTempVariables(v => "tmp" + v.NameIndex);
        }
Exemple #14
0
 protected abstract void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming);
Exemple #15
0
        /// <summary>
        /// Generate optimized macro code in the target language given a list of macro parameters bindings
        /// </summary>
        /// <returns></returns>
        public override string Generate()
        {
            //Initialize components of macro code generator
            SyntaxList.Clear();

            MacroBinding.Clear();

            CodeBlock = null;

            TargetVariablesNaming = null;

            if (AllowGenerateMacroCode == false)
            {
                return(string.Empty);
            }

            LibraryComposer.CheckProgressRequestStop();

            var progressId = this.ReportStart(
                "Generating Macro Code For: " + BaseMacro.AccessName
                );

            try
            {
                //Bind macro parameters to variables and constants as needed
                if (ActionSetMacroParametersBindings == null)
                {
                    DefaultActionSetMacroParametersBindings(MacroBinding);
                }
                else
                {
                    ActionSetMacroParametersBindings(MacroBinding);
                }

                if (IsMacroBindingReady == false)
                {
                    this.ReportWarning("Macro Binding Not Ready", MacroBinding.ToString());
                    this.ReportFinish(progressId);

                    return(string.Empty);
                }

                this.ReportNormal("Macro Binding Ready", MacroBinding.ToString());

                //Create the optimizd code block holding abstract computations based on the macro parameters
                //bindings. This step is typically the most time consuming because of many symbolic computations
                CodeBlock = MacroBinding.CreateOptimizedCodeBlock();


                //Assign target variable names to low-level code block variables. The code block is generated
                //automatically in the call to the OptimizedCodeBlock member
                TargetVariablesNaming = new GMacTargetVariablesNaming(GMacLanguage, CodeBlock);

                if (ActionSetTargetVariablesNames == null)
                {
                    DefaultActionSetTargetVariablesNames(TargetVariablesNaming);
                }
                else
                {
                    ActionSetTargetVariablesNames(TargetVariablesNaming);
                }


                //Generate code before computations for comments, temp declarations, and the like
                var result =
                    ActionBeforeGenerateComputations == null
                        ? DefaultActionBeforeGenerateComputations(this)
                        : ActionBeforeGenerateComputations(this);


                //Generate computations code if allowed by last action result
                if (result)
                {
                    GenerateProcessingCode();
                }


                //Generate code after computations for comments, temp destruction, and the like
                if (ActionAfterGenerateComputations == null)
                {
                    DefaultActionAfterGenerateComputations(this);
                }
                else
                {
                    ActionAfterGenerateComputations(this);
                }
            }
            catch (Exception e)
            {
                this.ReportError(e);
            }

            //Clean everything up and return final generated code
            ExpressionConverter.ActiveCodeBlock = null;

            //Un-parse the SyntaxList into the final code
            var codeText = CodeGenerator.GenerateCode(SyntaxList);

            this.ReportFinish(progressId, codeText);

            return(codeText);
        }