/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package wordlengthoptimization;
import datapath.graph.OperationVisitor;
import datapath.graph.operations.*;
import java.math.BigInteger;
import java.util.HashMap;
/**
* Visitor, that computes the complete Dataflowgraph
* Values at the nodes can be retrieved, inital values have to be set
* @author fs
*/
public class ComputeValueVisitor implements OperationVisitor {
HashMap<Operation, Double> values;
public HashMap<Operation, Double> getValues() {
return values;
}
/**
* Constructor
* @param initalValues Mapping which assign the Parentinputs (TopLevelInputs)
* double values.
*/
public ComputeValueVisitor(HashMap<ParentInput, Double> initalValues) {
values = (HashMap<Operation, Double>) initalValues.clone();
}
@Override
public void visit(Operation op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(BinaryOperation op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Mux op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(ConstantOperation op) {
values.put(op, Double.parseDouble(op.getValue().toString()));
}
@Override
public void visit(Add op) {
values.put(op, values.get(op.getLhs()) + values.get(op.getRhs()));
}
@Override
public void visit(MemWrite op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Less op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(FromOuterLoop op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(ToInnerLoop op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(HWInput op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(VariableShift op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Loop op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Nop op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(ToOuterLoop op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Negation op) {
Operation prev = op.getData();
values.put(op, -values.get(prev));
}
@Override
public void visit(LoopEnd op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(LoopInit op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(HWOutput op) {
values.put(op, values.get(op.getData()));
}
@Override
public void visit(TopLevelInput op) {
// should already be in
}
@Override
public void visit(Multiplication op) {
values.put(op, values.get(op.getLhs()) * values.get(op.getRhs()));
}
@Override
public void visit(Subtraction op) {
values.put(op, values.get(op.getLhs()) - values.get(op.getRhs()));
}
@Override
public void visit(Divide op) {
values.put(op, values.get(op.getLhs()) / values.get(op.getRhs()));
}
@Override
public void visit(Absolut op) {
values.put(op, Math.abs(values.get(op.getData())));
}
@Override
public void visit(Sin op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(Cos op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(ArcCos op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(ConstantShift op) {
double oldValue = values.get(op.getData());
double faktor = 1;
switch (op.getMode()) {
case Left:
faktor = 1l << op.getShiftAmount();
break;
case Right:
case SignedRight:
case UnsignedRight:
faktor = 1.0 / (1l << op.getShiftAmount());
break;
default:
throw new UnsupportedOperationException("Not supported yet.");
}
values.put(op, oldValue * faktor);
}
@Override
public void visit(SquareRoot op) {
values.put(op, Math.sqrt(values.get(op.getData())));
}
@Override
public void visit(BitwidthTransmogrify op) {
//throw new UnsupportedOperationException("Not supported yet.");
values.put(op, values.get(op.getData()));
}
@Override
public void visit(Predicate op) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void visit(TypeConversion op) {
//throw new UnsupportedOperationException("Not supported yet.");
values.put(op, values.get(op.getData()));
}
@Override
public void visit(ConstantMultiplication op) {
visit((Multiplication)op);
}
}