/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.gaalop.optimizations.CSE;
import de.gaalop.cfg.AssignmentNode;
import de.gaalop.cfg.BlockEndNode;
import de.gaalop.cfg.BreakNode;
import de.gaalop.cfg.ColorNode;
import de.gaalop.cfg.ControlFlowGraph;
import de.gaalop.cfg.ControlFlowVisitor;
import de.gaalop.cfg.EndNode;
import de.gaalop.cfg.ExpressionStatement;
import de.gaalop.cfg.IfThenElseNode;
import de.gaalop.cfg.LoopNode;
import de.gaalop.cfg.Macro;
import de.gaalop.cfg.StartNode;
import de.gaalop.cfg.StoreResultNode;
import de.gaalop.dfg.Addition;
import de.gaalop.dfg.BaseVector;
import de.gaalop.dfg.Division;
import de.gaalop.dfg.Equality;
import de.gaalop.dfg.Exponentiation;
import de.gaalop.dfg.Expression;
import de.gaalop.dfg.ExpressionVisitor;
import de.gaalop.dfg.FloatConstant;
import de.gaalop.dfg.FunctionArgument;
import de.gaalop.dfg.Inequality;
import de.gaalop.dfg.InnerProduct;
import de.gaalop.dfg.LogicalAnd;
import de.gaalop.dfg.LogicalNegation;
import de.gaalop.dfg.LogicalOr;
import de.gaalop.dfg.MacroCall;
import de.gaalop.dfg.MathFunction;
import de.gaalop.dfg.MathFunctionCall;
import de.gaalop.dfg.Multiplication;
import de.gaalop.dfg.MultivectorComponent;
import de.gaalop.dfg.Negation;
import de.gaalop.dfg.OuterProduct;
import de.gaalop.dfg.Relation;
import de.gaalop.dfg.Reverse;
import de.gaalop.dfg.Subtraction;
import de.gaalop.dfg.Variable;
import java.util.Iterator;
/**
*
* @author pj
*/
public class CSE_Replacer implements ExpressionVisitor,ControlFlowVisitor {
Expression nx;
ControlFlowGraph cfg;
//AssignmentNode currentAssignment;
OperationStore opstor;
public CSE_Replacer(OperationStore opstor) {
this.opstor = opstor;
}
@Override
public void visit(Subtraction node) {
if (opstor.OperationShouldBeReplaced(node)) {
nx = new Variable(opstor.getReplacementID(node));
System.out.println("Replacer: Node in Set: ( " + node.toString() + " ) ---> Replacing with " + opstor.getReplacementID(node));
} else {
node.getLeft().accept(this);
Expression lhs = nx;
node.getRight().accept(this);
Expression rhs = nx;
nx = new Subtraction(lhs, rhs);
}
}
@Override
public void visit(Addition node) {
if (opstor.OperationShouldBeReplaced(node)) {
nx = new Variable(opstor.getReplacementID(node));
System.out.println("Replacer: Node in Set: ( " + node.toString() + " ) ---> Replacing with " + opstor.getReplacementID(node));
} else {
node.getLeft().accept(this);
Expression lhs = nx;
node.getRight().accept(this);
Expression rhs = nx;
nx = new Addition(lhs, rhs);
}
}
@Override
public void visit(Division node) {
if (opstor.OperationShouldBeReplaced(node)) {
nx = new Variable(opstor.getReplacementID(node));
System.out.println("Replacer: Node in Set: ( " + node.toString() + " ) ---> Replacing with " + opstor.getReplacementID(node));
} else {
node.getLeft().accept(this);
Expression lhs = nx;
node.getRight().accept(this);
Expression rhs = nx;
nx = new Division(lhs, rhs);
}
}
@Override
public void visit(InnerProduct node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Multiplication node) {
if (opstor.OperationShouldBeReplaced(node)) {
nx = new Variable(opstor.getReplacementID(node));
System.out.println("Replacer: Node in Set: ( " + node.toString() + " ) ---> Replacing with " + opstor.getReplacementID(node));
} else {
node.getLeft().accept(this);
Expression lhs = nx;
node.getRight().accept(this);
Expression rhs = nx;
nx = new Multiplication(lhs, rhs);
}
}
@Override
public void visit(MathFunctionCall node) {
//TODO Schluckt nachkommende werte
if (opstor.OperationShouldBeReplaced(node)) {
nx = new Variable(opstor.getReplacementID(node));
System.out.println("Replacer: Node in Set: ( " + node.toString() + " ) ---> Replacing with " + opstor.getReplacementID(node));
} else {
node.getOperand().accept(this);
nx = new MathFunctionCall(nx, node.getFunction());
}
//nx = node;
}
@Override
public void visit(Variable node) {
nx = node;
}
@Override
public void visit(MultivectorComponent node) {
nx = node;
}
@Override
public void visit(Exponentiation node) {
Multiplication nodeMul;
if (isSquare(node)) {
nodeMul = new Multiplication(node.getLeft(), node.getLeft());
nx = nodeMul;
if (opstor.OperationShouldBeReplaced(nodeMul)) {
nx = new Variable(opstor.getReplacementID(nodeMul));
}
} else {
if (opstor.OperationShouldBeReplaced(node)) {
nx = new Variable(opstor.getReplacementID(node));
System.out.println("Replacer: Node in Set: ( " + node.toString() + " ) ---> Replacing with " + opstor.getReplacementID(node));
} else {
node.getLeft().accept(this);
Expression lhs = nx;
node.getRight().accept(this);
Expression rhs = nx;
nx = new Exponentiation(lhs, rhs);
}
}
}
@Override
public void visit(FloatConstant node) {
nx = node;
}
@Override
public void visit(OuterProduct node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(BaseVector node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Negation node) {
node.getOperand().accept(this);
nx= new Negation(nx);
}
@Override
public void visit(Reverse node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(LogicalOr node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(LogicalAnd node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Equality node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Inequality node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Relation relation) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(StartNode node) {
System.out.println("Replacer: Starting CSE Replacement");
this.cfg = node.getGraph();
for (OperationToken iterable_element : opstor.ReplaceAbleOpsSet.values()) {
cfg.addLocalVariable(new Variable(iterable_element.getIdentifier()));
}
node.getSuccessor().accept(this);
}
@Override
public void visit(AssignmentNode node) {
System.out.println("Replacer : Assginment Node " + node.getVariable().toString()+" visited------------------------------------");
node.getValue().accept(this);
node.setValue(nx);
node.getSuccessor().accept(this);
}
@Override
public void visit(StoreResultNode node) {
node.getSuccessor().accept(this);
}
@Override
public void visit(IfThenElseNode node) {
node.getSuccessor().accept(this);
}
@Override
public void visit(BlockEndNode node) {
node.getSuccessor().accept(this);
}
@Override
public void visit(EndNode node) {
System.out.println("Replacer: CSE Replacement beendet");
}
private boolean isSquare(Exponentiation exponentiation) {
final FloatConstant two = new FloatConstant(2.0f);
return two.equals(exponentiation.getRight());
}
@Override
public void visit(LogicalNegation node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(FunctionArgument node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(MacroCall node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(LoopNode node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(BreakNode node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Macro node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(ExpressionStatement node) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(ColorNode colorNode) {
throw new UnsupportedOperationException("Not supported yet.");
}
}