/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package datapath.graph;
import datapath.graph.operations.LoopEnd;
import datapath.graph.operations.Operation;
import datapath.graph.operations.ParentOutput;
import java.util.HashSet;
import java.util.Set;
/**
*
* @author fs
*/
public class DeadTreeElimination extends Optimization {
private HashSet<String> outputVariables;
public DeadTreeElimination(Graph g, Set<String> outputVariables) {
super(g);
this.outputVariables = new HashSet<String>(outputVariables);
}
@Override
public void perform() {
/* if no output pragma specified, we must assume all HWOutputs as outputs */
if (outputVariables.size() == 0)
return;
DeadTreeEliminationVisitor dte = new DeadTreeEliminationVisitor();
Operation.nextVisit();
HashSet<Operation> realOutputs = new HashSet<Operation>();
for (ParentOutput op: graph.getOutput()) {
if (outputVariables.contains(op.getName()))
realOutputs.add(op);
}
if (realOutputs.size() == 0) {
System.out.println("None of the pragma output variables found");
return;
}
/* find loop end node, as this is always and output */
for (Operation op : graph.getOperations()) {
if (op instanceof LoopEnd) {
realOutputs.add(op);
}
}
for (Operation op : realOutputs) {
op.postOrderUpwardVisit(dte);
}
/* kill all non visited nodes */
for (Operation op : graph.getOperations().toArray(new Operation[0])) {
if (!op.isVisited()) {
graph.remove(op);
for (Operation pred : op.dependsOnOperations(true)) {
pred.removeUse(op);
}
}
}
}
}