Prechádzať zdrojové kódy

MscriptGenerator improvements.

au@andreasunger.net 14 rokov pred
rodič
commit
600833c4c9

+ 115 - 62
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.codegen.c/src/org/eclipselabs/mscript/codegen/c/MscriptGenerator.java

@@ -70,17 +70,17 @@ public class MscriptGenerator {
 	
 	public void generateContextStructure() {
 		writer.printf("typedef struct {\n");
-		for (InputVariableDeclaration inputVariableDeclaration: functionDefinition.getInputVariableDeclarations()) {
+		for (InputVariableDeclaration inputVariableDeclaration : functionDefinition.getInputVariableDeclarations()) {
 			if (inputVariableDeclaration.getCircularBufferSize() > 1) {
 				writeContextStructureMember(inputVariableDeclaration);
 			}
 		}
-		for (OutputVariableDeclaration outputVariableDeclaration: functionDefinition.getOutputVariableDeclarations()) {
+		for (OutputVariableDeclaration outputVariableDeclaration : functionDefinition.getOutputVariableDeclarations()) {
 			if (outputVariableDeclaration.getCircularBufferSize() > 1) {
 				writeContextStructureMember(outputVariableDeclaration);
 			}
 		}
-		for (InstanceVariableDeclaration instanceVariableDeclaration: functionDefinition.getInstanceVariableDeclarations()) {
+		for (InstanceVariableDeclaration instanceVariableDeclaration : functionDefinition.getInstanceVariableDeclarations()) {
 			writeContextStructureMember(instanceVariableDeclaration);
 		}
 		writer.printf("} %s_Context;\n", functionDefinition.getName());
@@ -102,7 +102,7 @@ public class MscriptGenerator {
 		if (functionDefinition.isStateful()) {
 			generateInitializeFunctionHeader();
 			writer.println(";");
-			generateComputationFunctionHeader();
+			generateComputeOutputsFunctionHeader();
 			writer.println(";");
 			generateUpdateFunctionHeader();
 			writer.println(";");
@@ -127,50 +127,15 @@ public class MscriptGenerator {
 	public void generateFunctionImplementations() {
 		IVariableAccessStrategy variableAccessStrategy = new VariableAccessStrategy();
 		if (functionDefinition.isStateful()) {
-			generateInitializeFunctionHeader();
-			writer.println(" {");
-			generateInitializeIndexStatements(functionDefinition.getInputVariableDeclarations());
-			generateInitializeIndexStatements(functionDefinition.getOutputVariableDeclarations());
-			generateInitializeIndexStatements(functionDefinition.getInstanceVariableDeclarations());
-			compoundGenerator.generate(context, variableAccessStrategy, functionDefinition.getInitializationCompound());
-			writer.println("}");
+			generateInitializeFunctionImplementation(variableAccessStrategy);
 
 			writer.println();
 
-			generateComputationFunctionHeader();
-			writer.println(" {");
-			for (ComputationCompound compound : functionDefinition.getComputationCompounds()) {
-				if (!compound.getOutputs().isEmpty()) {
-					compoundGenerator.generate(context, variableAccessStrategy, compound);
-				}
-			}
-			for (InputVariableDeclaration inputVariableDeclaration : functionDefinition.getInputVariableDeclarations()) {
-				if (inputVariableDeclaration.getCircularBufferSize() > 1) {
-					String name = inputVariableDeclaration.getName();
-					writer.printf("context->%s[context->%s_index] = %s;\n", name, name, name);
-				}
-			}
-			for (OutputVariableDeclaration outputVariableDeclaration : functionDefinition.getOutputVariableDeclarations()) {
-				if (outputVariableDeclaration.getCircularBufferSize() > 1) {
-					String name = outputVariableDeclaration.getName();
-					writer.printf("context->%s[context->%s_index] = *%s;\n", name, name, name);
-				}
-			}
-			writer.println("}");
+			generateComputeOutputsImplementation(variableAccessStrategy);
 
 			writer.println();
 
-			generateUpdateFunctionHeader();
-			writer.println(" {");
-			for (ComputationCompound compound : functionDefinition.getComputationCompounds()) {
-				if (compound.getOutputs().isEmpty()) {
-					compoundGenerator.generate(context, variableAccessStrategy, compound);
-				}
-			}
-			generateUpdateIndexStatements(functionDefinition.getInputVariableDeclarations());
-			generateUpdateIndexStatements(functionDefinition.getOutputVariableDeclarations());
-			generateUpdateIndexStatements(functionDefinition.getInstanceVariableDeclarations());
-			writer.println("}");
+			generateUpdateFunctionImplementation(variableAccessStrategy);
 		} else {
 			generateStatelessFunctionHeader();
 			writer.println(" {");
@@ -188,6 +153,19 @@ public class MscriptGenerator {
 		writer.printf("void %s_initialize(%s_Context *context)", functionDefinition.getName(), functionDefinition.getName());
 	}
 
+	/**
+	 * @param variableAccessStrategy
+	 */
+	private void generateInitializeFunctionImplementation(IVariableAccessStrategy variableAccessStrategy) {
+		generateInitializeFunctionHeader();
+		writer.println(" {");
+		generateInitializeIndexStatements(functionDefinition.getInputVariableDeclarations());
+		generateInitializeIndexStatements(functionDefinition.getOutputVariableDeclarations());
+		generateInitializeIndexStatements(functionDefinition.getInstanceVariableDeclarations());
+		compoundGenerator.generate(context, variableAccessStrategy, functionDefinition.getInitializationCompound());
+		writer.println("}");
+	}
+
 	private void generateInitializeIndexStatements(List<? extends StatefulVariableDeclaration> statefulVariableDeclarations) {
 		for (StatefulVariableDeclaration statefulVariableDeclaration : statefulVariableDeclarations) {
 			if (statefulVariableDeclaration.getCircularBufferSize() > 1) {
@@ -199,19 +177,42 @@ public class MscriptGenerator {
 	/**
 	 * 
 	 */
-	private void generateComputationFunctionHeader() {
+	private void generateComputeOutputsFunctionHeader() {
 		writer.printf("void %s(%s_Context *context", functionDefinition.getName(), functionDefinition.getName());
+		for (InputVariableDeclaration inputVariableDeclaration : functionDefinition.getInputVariableDeclarations()) {
+			if (consumesInput(inputVariableDeclaration, true)) {
+				writer.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getType(), inputVariableDeclaration.getName(), false));
+			}
+		}
+		for (OutputVariableDeclaration outputVariableDeclaration: functionDefinition.getOutputVariableDeclarations()) {
+			writer.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), outputVariableDeclaration.getType(), outputVariableDeclaration.getName(), true));
+		}
+		writer.print(")");
+	}
+
+	/**
+	 * @param variableAccessStrategy
+	 */
+	private void generateComputeOutputsImplementation(IVariableAccessStrategy variableAccessStrategy) {
+		generateComputeOutputsFunctionHeader();
+		writer.println(" {");
 		for (ComputationCompound compound : functionDefinition.getComputationCompounds()) {
 			if (!compound.getOutputs().isEmpty()) {
+				compoundGenerator.generate(context, variableAccessStrategy, compound);
 				for (InputVariableDeclaration inputVariableDeclaration : compound.getInputs()) {
-					writer.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getType(), inputVariableDeclaration.getName(), false));
+					if (inputVariableDeclaration.getCircularBufferSize() > 1) {
+						generateUpdateInputContextStatement(inputVariableDeclaration);
+					}
 				}
 			}
 		}
-		for (OutputVariableDeclaration outputVariableDeclaration: functionDefinition.getOutputVariableDeclarations()) {
-			writer.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), outputVariableDeclaration.getType(), outputVariableDeclaration.getName(), true));
+		for (OutputVariableDeclaration outputVariableDeclaration : functionDefinition.getOutputVariableDeclarations()) {
+			if (outputVariableDeclaration.getCircularBufferSize() > 1) {
+				String name = outputVariableDeclaration.getName();
+				writer.printf("context->%s[context->%s_index] = *%s;\n", name, name, name);
+			}
 		}
-		writer.print(")");
+		writer.println("}");
 	}
 
 	/**
@@ -219,14 +220,78 @@ public class MscriptGenerator {
 	 */
 	private void generateUpdateFunctionHeader() {
 		writer.printf("void %s_update(%s_Context *context", functionDefinition.getName(), functionDefinition.getName());
+		for (InputVariableDeclaration inputVariableDeclaration : functionDefinition.getInputVariableDeclarations()) {
+			if (consumesInput(inputVariableDeclaration, false) || updatesInputContext(inputVariableDeclaration)) {
+				writer.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getType(), inputVariableDeclaration.getName(), false));
+			}
+		}
+		writer.print(")");
+	}
+
+	/**
+	 * @param variableAccessStrategy
+	 */
+	private void generateUpdateFunctionImplementation(IVariableAccessStrategy variableAccessStrategy) {
+		generateUpdateFunctionHeader();
+		writer.println(" {");
 		for (ComputationCompound compound : functionDefinition.getComputationCompounds()) {
 			if (compound.getOutputs().isEmpty()) {
-				for (InputVariableDeclaration inputVariableDeclaration : compound.getInputs()) {
-					writer.printf(", %s", MscriptGeneratorUtil.getCVariableDeclaration(context.getComputationModel(), inputVariableDeclaration.getType(), inputVariableDeclaration.getName(), false));
+				compoundGenerator.generate(context, variableAccessStrategy, compound);
+			}
+		}
+		for (InputVariableDeclaration inputVariableDeclaration : functionDefinition.getInputVariableDeclarations()) {
+			if (updatesInputContext(inputVariableDeclaration)) {
+				generateUpdateInputContextStatement(inputVariableDeclaration);
+			}
+		}
+		generateUpdateIndexStatements(functionDefinition.getInputVariableDeclarations());
+		generateUpdateIndexStatements(functionDefinition.getOutputVariableDeclarations());
+		generateUpdateIndexStatements(functionDefinition.getInstanceVariableDeclarations());
+		writer.println("}");
+	}
+	
+	private boolean consumesInput(InputVariableDeclaration inputVariableDeclaration, boolean feedsOutputs) {
+		for (ComputationCompound compound : inputVariableDeclaration.getFeedingCompounds()) {
+			if (compound.getOutputs().isEmpty() != feedsOutputs) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @param inputVariableDeclaration
+	 * @return
+	 */
+	private boolean updatesInputContext(InputVariableDeclaration inputVariableDeclaration) {
+		if (inputVariableDeclaration.getCircularBufferSize() > 1) {
+			if (inputVariableDeclaration.getFeedingCompounds().isEmpty()) {
+				return true;
+			}
+			for (ComputationCompound compound : functionDefinition.getComputationCompounds()) {
+				if (compound.getOutputs().isEmpty()) {
+					return true;
 				}
 			}
 		}
-		writer.print(")");
+		return false;
+	}
+	
+	private void generateUpdateInputContextStatement(InputVariableDeclaration variableDeclaration) {
+		String name = variableDeclaration.getName();
+		writer.printf("context->%s[context->%s_index] = %s;\n", name, name, name);
+	}
+
+	/**
+	 * 
+	 */
+	private void generateUpdateIndexStatements(List<? extends StatefulVariableDeclaration> statefulVariableDeclarations) {
+		for (StatefulVariableDeclaration statefulVariableDeclaration : statefulVariableDeclarations) {
+			if (statefulVariableDeclaration.getCircularBufferSize() > 1) {
+				String name = statefulVariableDeclaration.getName();
+				writer.printf("context->%s_index = (context->%s_index + 1) %% %d;\n", name, name, statefulVariableDeclaration.getCircularBufferSize());
+			}
+		}
 	}
 
 	/**
@@ -253,17 +318,5 @@ public class MscriptGenerator {
 		}
 		writer.print(")");
 	}
-
-	/**
-	 * 
-	 */
-	private void generateUpdateIndexStatements(List<? extends StatefulVariableDeclaration> statefulVariableDeclarations) {
-		for (StatefulVariableDeclaration statefulVariableDeclaration : statefulVariableDeclarations) {
-			if (statefulVariableDeclaration.getCircularBufferSize() > 1) {
-				String name = statefulVariableDeclaration.getName();
-				writer.printf("context->%s_index = (context->%s_index + 1) %% %d;\n", name, name, statefulVariableDeclaration.getCircularBufferSize());
-			}
-		}
-	}
 	
 }

+ 3 - 71
org.eclipselabs.mscript/plugins/org.eclipselabs.mscript.language/src/org/eclipselabs/mscript/language/il/transform/FunctionDefinitionTransformer.java

@@ -13,18 +13,16 @@ package org.eclipselabs.mscript.language.il.transform;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeSet;
 
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipselabs.mscript.computation.engine.value.IValue;
 import org.eclipselabs.mscript.language.ast.ParameterDeclaration;
@@ -195,10 +193,7 @@ public class FunctionDefinitionTransformer implements IFunctionDefinitionTransfo
 
 		for (List<EquationDescriptor> equationDescriptors : equationCompounds) {
 			ComputationCompound compound = ILFactory.eINSTANCE.createComputationCompound();
-			
-			Set<InputVariableDeclaration> inputs = new InputVariableDeclarationSet();
-			Set<OutputVariableDeclaration> outputs = new OutputVariableDeclarationSet();
-			
+			Set<InputVariableDeclaration> inputs = new HashSet<InputVariableDeclaration>();
 			for (EquationDescriptor equationDescriptor : equationDescriptors) {
 				VariableStep lhsVariableStep = FunctionModelUtil.getFirstLeftHandSideVariableStep(equationDescriptor);
 				if (lhsVariableStep != null) {
@@ -221,80 +216,17 @@ public class FunctionDefinitionTransformer implements IFunctionDefinitionTransfo
 
 					if (lhsVariableStep.getDescriptor().getKind() == VariableKind.OUTPUT_PARAMETER
 							&& lhsVariableStep.getIndex() == 0) {
-						outputs.add((OutputVariableDeclaration) variableDeclarations.get(lhsVariableStep.getDescriptor()));
+						compound.getOutputs().add((OutputVariableDeclaration) variableDeclarations.get(lhsVariableStep.getDescriptor()));
 					}
 				}
 			}
-			
 			for (InputVariableDeclaration input : inputs) {
 				compound.getInputs().add(input);
 			}
-			for (OutputVariableDeclaration output : outputs) {
-				compound.getOutputs().add(output);
-			}
-			
 			context.getFunctionDefinition().getComputationCompounds().add(compound);
 		}
 
 		return status.isOK() ? Status.OK_STATUS : status;
 	}
 	
-	private static class InputVariableDeclarationSet extends TreeSet<InputVariableDeclaration> {
-		
-		/**
-		 * 
-		 */
-		private static final long serialVersionUID = 1L;
-		
-		private static final Comparator<InputVariableDeclaration> COMPARATOR = new Comparator<InputVariableDeclaration>() {
-
-			public int compare(InputVariableDeclaration d1, InputVariableDeclaration d2) {
-				EObject container = d1.eContainer();
-				if (container instanceof ILFunctionDefinition) {
-					List<InputVariableDeclaration> declarations = ((ILFunctionDefinition) container).getInputVariableDeclarations();
-					return declarations.indexOf(d1) - declarations.indexOf(d2);
-				}
-				return 0;
-			}
-			
-		};
-		
-		/**
-		 * 
-		 */
-		public InputVariableDeclarationSet() {
-			super(COMPARATOR);
-		}
-		
-	}
-	
-	private static class OutputVariableDeclarationSet extends TreeSet<OutputVariableDeclaration> {
-		
-		/**
-		 * 
-		 */
-		private static final long serialVersionUID = 1L;
-		
-		private static final Comparator<OutputVariableDeclaration> COMPARATOR = new Comparator<OutputVariableDeclaration>() {
-
-			public int compare(OutputVariableDeclaration d1, OutputVariableDeclaration d2) {
-				EObject container = d1.eContainer();
-				if (container instanceof ILFunctionDefinition) {
-					List<OutputVariableDeclaration> declarations = ((ILFunctionDefinition) container).getOutputVariableDeclarations();
-					return declarations.indexOf(d1) - declarations.indexOf(d2);
-				}
-				return 0;
-			}
-			
-		};
-		
-		/**
-		 * 
-		 */
-		public OutputVariableDeclarationSet() {
-			super(COMPARATOR);
-		}
-		
-	}
-
 }