package de.gaalop.visualCodeInserter;
import de.gaalop.OptimizationException;
import de.gaalop.VisualCodeInserterStrategy;
import de.gaalop.cfg.AssignmentNode;
import de.gaalop.cfg.ControlFlowGraph;
import de.gaalop.cfg.ExpressionStatement;
import de.gaalop.cfg.StoreResultNode;
import de.gaalop.dfg.Expression;
import de.gaalop.dfg.InnerProduct;
import de.gaalop.dfg.MacroCall;
import de.gaalop.dfg.Variable;
import java.util.HashMap;
import java.util.LinkedList;
/**
* Implements a strategy that inserts draw code in the cluscript
*
* @author Christian Steinmetz
*/
public class VisualizerCodeInserter implements VisualCodeInserterStrategy {
private Plugin plugin;
public VisualizerCodeInserter(Plugin plugin) {
this.plugin = plugin;
}
@Override
public void transform(ControlFlowGraph graph) throws OptimizationException {
//insert visualizing commands, if needed
LinkedList<ExpressionStatement> statements = ExpressionStatementCollector.collectAllStatements(graph);
String prefix = "_V_";
if (statements.size() > 0) {
LinkedList<Expression> args = new LinkedList<Expression>();
args.add(new Variable(prefix + "X"));
args.add(new Variable(prefix + "Y"));
args.add(new Variable(prefix + "Z"));
graph.addInputVariable(new Variable(prefix + "X"));
graph.addInputVariable(new Variable(prefix + "Y"));
graph.addInputVariable(new Variable(prefix + "Z"));
Variable visualizationPoint = new Variable(prefix + "POINT");
graph.addLocalVariable(new Variable(prefix + "POINT"));
AssignmentNode pointNode = new AssignmentNode(graph, visualizationPoint, new MacroCall("createPoint", args));
graph.getStartNode().insertAfter(pointNode);
HashMap<String, Expression> renderingExpressions = graph.getRenderingExpressions();
int i = 0;
for (ExpressionStatement s : statements) {
String productName = prefix + "PRODUCT" + i;
AssignmentNode renderNode = new AssignmentNode(graph, new Variable(productName), new InnerProduct(s.getExpression(), visualizationPoint));
graph.addLocalVariable(new Variable(productName));
s.insertAfter(renderNode);
StoreResultNode outputRenderNode = new StoreResultNode(graph, new Variable(productName));
graph.addLocalVariable(new Variable(productName));
renderNode.insertAfter(outputRenderNode);
renderingExpressions.put(productName, s.getExpression());
i++;
}
}
}
}