예제 #1
0
        public string generateSource(Program program, int inputMapSize, Dictionary<string, int> widthOfArrays)
        {
            int entryIndex;
            ProgramGenerationContext programGenerationContext;

            programGenerationContext = new ProgramGenerationContext();
            programGenerationContext.inputMapWidth = inputMapSize;
            programGenerationContext.widthOfArrays = widthOfArrays;

            entryIndex = 0;

            return recursivlyGenerateStringFor(program.dag, entryIndex, programGenerationContext);
        }
예제 #2
0
        // throws TranslationException
        private string recursivlyGenerateStringFor(Datastructures.Dag<DagElementData> dag, int elementIndex, ProgramGenerationContext programGenerationContext)
        {
            string resultString;

            resultString = "";

            if (dag.elements[elementIndex].content.type == DagElementData.EnumType.CONSTLOOP)
            {
                string counterName;
                string constantBeginString;
                string constantEndString;

                counterName = getIdentifierOfElement(dag, dag.elements[elementIndex].childIndices[2]);
                constantBeginString = getStringOfConstInt(dag, dag.elements[elementIndex].childIndices[0]);
                constantEndString = getStringOfConstInt(dag, dag.elements[elementIndex].childIndices[1]);

                resultString = string.Format("for({0} {1} = {2}; {1} < {3}; {1}++)\n{{\n", "int", counterName, constantBeginString, constantEndString);
                resultString += recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[3], programGenerationContext);

                resultString += "}\n";

                return resultString;
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.SEQUENCE)
            {
                resultString = "{\n";

                foreach (int childDagElementIndex in dag.elements[elementIndex].childIndices)
                {
                    resultString += recursivlyGenerateStringFor(dag, childDagElementIndex, programGenerationContext) + ";\n";
                }

                resultString += "}\n";

                return resultString;
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.ALLOCATESET)
            {
                string typeOfVariable;
                string nameOfVariableToSet;
                string valueOfVariable;

                typeOfVariable = getStringOfTypeOf(dag, dag.elements[elementIndex].childIndices[1]);
                nameOfVariableToSet = getIdentifierOfElement(dag, dag.elements[elementIndex].childIndices[0]);

                if (dag.elements[dag.elements[elementIndex].childIndices[1]].content.type == DagElementData.EnumType.CONSTINT)
                {
                    valueOfVariable = getStringOfConstInt(dag, dag.elements[elementIndex].childIndices[1]);
                }
                else if (dag.elements[dag.elements[elementIndex].childIndices[1]].content.type == DagElementData.EnumType.CONSTFLOAT)
                {
                    valueOfVariable = getStringOfConstFloat(dag, dag.elements[elementIndex].childIndices[1]);
                }
                else
                {
                    throw new TranslationException();
                }

                return string.Format("{0} {1} = {2};\n", typeOfVariable, nameOfVariableToSet, valueOfVariable);
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.ADDASSIGN)
            {
                string nameOfVariableToSet;
                string stringOfRightSide;

                nameOfVariableToSet = getIdentifierOfElement(dag, dag.elements[elementIndex].childIndices[0]);
                stringOfRightSide = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[1], programGenerationContext);

                return nameOfVariableToSet + " += (" + stringOfRightSide + ");\n";
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.READINPUTAT2D)
            {
                string xParameterString;
                string yParameterString;

                xParameterString = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[0], programGenerationContext);
                yParameterString = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[1], programGenerationContext);

                //return "readInputAt(" + xParameterString + "," + yParameterString + ")";
                return string.Format("inputMap[{0} + {1}*{2}]", xParameterString, programGenerationContext.inputMapWidth, yParameterString);
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.WRITERESULT)
            {
                string resultName;

                resultName = getIdentifierOfElement(dag, dag.elements[elementIndex].childIndices[0]);

                return string.Format("resultMap[indexX] = {0};\n", resultName);
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.IDENTIFIERNAME)
            {
                return dag.elements[elementIndex].content.identifier;
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.ARRAYREAD2D)
            {
                string xParameterString;
                string yParameterString;
                string arrayName;

                arrayName = dag.elements[elementIndex].content.identifier;

                xParameterString = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[0], programGenerationContext);
                yParameterString = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[1], programGenerationContext);

                return string.Format("{3}[{0} + {1} * {2}]", xParameterString, yParameterString, programGenerationContext.widthOfArrays[arrayName], arrayName);
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.ARRAYREAD1D)
            {
                string xParameterString;
                string arrayName;

                arrayName = dag.elements[elementIndex].content.identifier;

                xParameterString = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[0], programGenerationContext);

                return string.Format("{0}[{1}]", arrayName, xParameterString);
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.ASSIGNMENTINT)
            {
                string identifier;
                string valueString;

                identifier = getIdentifierOfElement(dag, dag.elements[elementIndex].childIndices[0]);
                valueString = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[1], programGenerationContext);

                return string.Format("int {0} = {1};\n", identifier, valueString);
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.CONSTINT)
            {
                return getStringOfConstInt(dag, elementIndex);
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.CONSTFLOAT)
            {
                return getStringOfConstFloat(dag, elementIndex);
            }
            else if( dag.elements[elementIndex].content.type == DagElementData.EnumType.NULL )
            {
                return recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[0], programGenerationContext);
            }
            else if(
                dag.elements[elementIndex].content.type == DagElementData.EnumType.SUB ||
                dag.elements[elementIndex].content.type == DagElementData.EnumType.DIV ||
                dag.elements[elementIndex].content.type == DagElementData.EnumType.ADD ||
                dag.elements[elementIndex].content.type == DagElementData.EnumType.MUL
            )
            {
                string leftSideString;
                string rightSideString;
                string operationAsString;

                switch( dag.elements[elementIndex].content.type )
                {
                    case DagElementData.EnumType.ADD:
                    operationAsString = "+";
                    break;

                    case DagElementData.EnumType.SUB:
                    operationAsString = "-";
                    break;

                    case DagElementData.EnumType.MUL:
                    operationAsString = "*";
                    break;

                    case DagElementData.EnumType.DIV:
                    operationAsString = "/";
                    break;

                    default:
                    operationAsString = "";
                    throw new Exception("Internal Error!");
                }

                leftSideString = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[0], programGenerationContext);
                rightSideString = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[1], programGenerationContext);

                return "(" + leftSideString + operationAsString + rightSideString + ")";
            }
            else if( dag.elements[elementIndex].content.type == DagElementData.EnumType.CONSTPI )
            {
                return callbacks.generateStringForConstantPi();
            }
            else if( dag.elements[elementIndex].content.type == DagElementData.EnumType.PARAM )
            {
                return "(" + dag.elements[elementIndex].content.identifier + ")";
            }
            else if (dag.elements[elementIndex].content.type == DagElementData.EnumType.RETURN )
            {
                string childString;

                childString = recursivlyGenerateStringFor(dag, dag.elements[elementIndex].childIndices[0], programGenerationContext);

                return string.Format("return ({0});\n", childString);
            }
            else
            {
                throw new TranslationException();
            }
        }