diff --git a/AlgebraicDataflowArchitectureModel/models/Game.model b/AlgebraicDataflowArchitectureModel/models/Game.model index bc90ba4..5943156 100644 --- a/AlgebraicDataflowArchitectureModel/models/Game.model +++ b/AlgebraicDataflowArchitectureModel/models/Game.model @@ -1,8 +1,6 @@ channel CIO { out force(f:Double, action(x:Double)) == x - out time(t:Double, action(x)) == t + 0.01 out force(f, e) == x - out time(t, e) == t + 0.01 } channel CIO2 { diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java index 01fd6c4..c2c7d88 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java @@ -1,5 +1,6 @@ package algorithms; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -125,13 +126,28 @@ getter.addStatement("return " + resource.getIdentifierTemplate().getResourceName() + ";"); } // methods for input events - MethodDeclaration input = getInputMethod(type, resource, model); - if (input != null) { - input.addFirstStatement("this." + resourceName + " = " + resourceName + ";"); - if (mainType != null) { - MethodDeclaration mainInput = getMethod(mainType, input.getName()); - if (mainInput != null) { - mainInput.addStatement("this." + resourceName + "." + input.getName() + "(" + resourceName + ");"); + Map.Entry ioChannelAndMember = getIOChannelAndMember(resource, model); + if (ioChannelAndMember != null) { + ChannelMember out = ioChannelAndMember.getValue(); + Term message = (Term) out.getStateTransition().getMessageExpression(); + MethodDeclaration input = getMethod(type, message.getSymbol().getName()); + if (input != null) { + Expression updateExp = ioChannelAndMember.getKey().deriveUpdateExpressionOf(out, CodeGenerator.pushAccessor); + String newState = updateExp.toImplementation(); + String updateStatement; + if (updateExp instanceof Term && ((Term) updateExp).getSymbol().getImplOperatorType() == Symbol.Type.METHOD_WITH_SIDE_EFFECT) { + updateStatement = newState + ";"; + } else { + updateStatement = "this." + resourceName + " = " + newState + ";"; + } + if (input.getBody() == null || !input.getBody().getStatements().contains(updateStatement)) { + input.addFirstStatement(updateStatement); + } + if (mainType != null) { + MethodDeclaration mainInput = getMethod(mainType, input.getName()); + if (mainInput != null) { + mainInput.addStatement("this." + resourceName + "." + input.getName() + "(" + resourceName + ");"); + } } } } @@ -170,6 +186,22 @@ } return null; } + + private static Map.Entry getIOChannelAndMember(ResourceNode resource, DataFlowModel model) { + for (ChannelGenerator c: model.getIOChannelGenerators()) { + DataflowChannelGenerator channel = (DataflowChannelGenerator) c; + // I/O channel + for (ChannelMember out: channel.getOutputChannelMembers()) { + if (out.getIdentifierTemplate().equals(resource.getIdentifierTemplate())) { + if (out.getStateTransition().getMessageExpression() instanceof Term) { + // not an identity element + return new AbstractMap.SimpleEntry<>(channel, out); + } + } + } + } + return null; + } private static MethodDeclaration getInputMethod(TypeDeclaration type, ResourceNode resource, DataFlowModel model) { for (ChannelGenerator c: model.getIOChannelGenerators()) { @@ -178,6 +210,7 @@ for (ChannelMember out: channel.getOutputChannelMembers()) { if (out.getIdentifierTemplate().equals(resource.getIdentifierTemplate())) { if (out.getStateTransition().getMessageExpression() instanceof Term) { + // not an identity element Term message = (Term) out.getStateTransition().getMessageExpression(); MethodDeclaration input = getMethod(type, message.getSymbol().getName()); return input; @@ -188,7 +221,6 @@ return null; } - private static MethodDeclaration getMethod(TypeDeclaration type, String methodName) { for (MethodDeclaration m: type.getMethods()) { if (m.getName().equals(methodName)) return m; diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/UpdateConflictCheck.java b/AlgebraicDataflowArchitectureModel/src/algorithms/UpdateConflictCheck.java index f1689ff..ad76543 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/UpdateConflictCheck.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/UpdateConflictCheck.java @@ -61,7 +61,7 @@ strongconnect(node); } } - System.out.println(strong.size() + " " + model.getResourceDependencyGraph().getNodes().size()); +// System.out.println(strong.size() + " " + model.getResourceDependencyGraph().getNodes().size()); /* * for(ChannelGenerator cg:model.getChannelGenerators()) { * DataflowChannelGenerator data = (DataflowChannelGenerator)cg; diff --git a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/PrototypeGenerateAction.java b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/PrototypeGenerateAction.java index 177b16f..747fdb5 100644 --- a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/PrototypeGenerateAction.java +++ b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/PrototypeGenerateAction.java @@ -32,35 +32,37 @@ @Override public void actionPerformed(ActionEvent e) { ResourceDependencyGraph graph = editor.getResourceDependencyGraph(); - DataFlowModel model = editor.getModel(); - FinalDecisionOfStoringResourceStates.doDecide(graph); - String fileName = editor.getCurFileName(); - String mainTypeName = fileName.split("\\.")[0]; - boolean exist = false; - for (IdentifierTemplate id: model.getIdentifierTemplates()) { - String resourceName = id.getResourceName().substring(0, 1).toUpperCase() + id.getResourceName().substring(1); - if (mainTypeName.equals(resourceName)) { - exist = true; + if (graph != null) { + DataFlowModel model = editor.getModel(); + FinalDecisionOfStoringResourceStates.doDecide(graph); + String fileName = editor.getCurFileName(); + String mainTypeName = fileName.split("\\.")[0]; + boolean exist = false; + for (IdentifierTemplate id: model.getIdentifierTemplates()) { + String resourceName = id.getResourceName().substring(0, 1).toUpperCase() + id.getResourceName().substring(1); + if (mainTypeName.equals(resourceName)) { + exist = true; + } } - } - if (!exist) { - CodeGenerator.setMainTypeName(mainTypeName); // use model's file name as the main type's name. - } else { - CodeGenerator.resetMainTypeName(); // use the default main type's name. - } - editor.setCodes(MethodBodyGenerator.doGenerate(graph, model, CodeGenerator.doGenerate(graph, model))); - for (CompilationUnit file : editor.getCodes()) { - System.out.println(file); - } - - String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); - JFileChooser fc = new JFileChooser(wd); - fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); - int rc = fc.showSaveDialog(null); - if (rc == JFileChooser.APPROVE_OPTION) { - lastDir = fc.getSelectedFile().getPath(); - for (CompilationUnit cu : editor.getCodes()) { - save(fc.getSelectedFile(), cu); + if (!exist) { + CodeGenerator.setMainTypeName(mainTypeName); // use model's file name as the main type's name. + } else { + CodeGenerator.resetMainTypeName(); // use the default main type's name. + } + editor.setCodes(MethodBodyGenerator.doGenerate(graph, model, CodeGenerator.doGenerate(graph, model))); + for (CompilationUnit file : editor.getCodes()) { + System.out.println(file); + } + + String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); + JFileChooser fc = new JFileChooser(wd); + fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + int rc = fc.showSaveDialog(null); + if (rc == JFileChooser.APPROVE_OPTION) { + lastDir = fc.getSelectedFile().getPath(); + for (CompilationUnit cu : editor.getCodes()) { + save(fc.getSelectedFile(), cu); + } } } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java index a95a1c4..c1af7f8 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java @@ -38,4 +38,8 @@ public Object clone() { return new Field(symbol); } + + public String toImplementation() { + return "this." + super.toImplementation(); + } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowModel.java index 75f00d8..ae21ae2 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowModel.java @@ -16,9 +16,16 @@ for (IdentifierTemplate in: inputResources) { for (IdentifierTemplate out: outputResources) { resourceDependencyGraph.addEdge(in ,out, dfChannelGen); - } + } } } + for (ChannelGenerator channelGen: getIOChannelGenerators()) { + DataflowChannelGenerator dfChannelGen = (DataflowChannelGenerator)channelGen; + Set outputResources = dfChannelGen.getOutputIdentifierTemplates(); + for (IdentifierTemplate out: outputResources) { + resourceDependencyGraph.addNode(out); + } + } return resourceDependencyGraph; } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataflowChannelGenerator.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataflowChannelGenerator.java index 42fc9ac..35c63ff 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataflowChannelGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataflowChannelGenerator.java @@ -8,9 +8,11 @@ import models.algebra.InvalidMessage; import models.algebra.Parameter; import models.algebra.ParameterizedIdentifierIsFutureWork; +import models.algebra.Position; import models.algebra.Term; import models.algebra.UnificationFailed; import models.algebra.ValueUndefined; +import models.algebra.Variable; import models.dataConstraintModel.*; public class DataflowChannelGenerator extends ChannelGenerator { @@ -139,6 +141,15 @@ throw new ParameterizedIdentifierIsFutureWork(); } Expression curOutputStateAccessor = stateAccessor.getCurrentStateAccessorFor(targetIdentifier, targetIdentifier); + if (unifiedMessage == null) { + // for IOChannel + Expression nextOutputStateAccessor = stateAccessor.getNextStateAccessorFor(targetIdentifier, targetIdentifier); + unifiedMessage = (Term) targetMember.getStateTransition().getMessageExpression(); + HashMap messageVars = unifiedMessage.getVariables(); + for (Variable var: messageVars.values()) { + unifiedMessage = ((Term) unifiedMessage).substitute(var, nextOutputStateAccessor); + } + } return targetMember.getStateTransition().deriveNextStateExpressionFor(curOutputStateAccessor, unifiedMessage); } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ResourceDependencyGraph.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ResourceDependencyGraph.java index 0d00839..f196835 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ResourceDependencyGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ResourceDependencyGraph.java @@ -13,6 +13,14 @@ super(); nodeMap = new HashMap<>(); } + + public void addNode(IdentifierTemplate id) { + if (nodeMap.get(id) == null) { + ResourceNode node = new ResourceNode(id); + addNode(node); + nodeMap.put(id, node); + } + } public void addEdge(IdentifierTemplate in, IdentifierTemplate out, DataflowChannelGenerator dfChannelGen) { ResourceNode srcNode = nodeMap.get(in);