/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package datapath.graph;
import datapath.graph.operations.Operation;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
/**
*
* @author jh
*/
public class EqualizeBackedges extends Optimization {
public EqualizeBackedges(Graph graph) {
super(graph);
}
@Override
public void perform() {
SortedSet<UseEdge> backedges = new TreeSet<UseEdge>(collectBackedges());
if(backedges.size() < 2)
return;
assert backedges.first().isBackedge();
assert backedges.last().isBackedge();
if(backedges.first().distance() == backedges.last().distance())
return;
int longestDistance = backedges.last().distance();
System.out.println("must equalize backedges");
System.out.println("longest distance: "+longestDistance);
System.out.println("shortest distance: "+backedges.first().distance());
for(UseEdge backedge : backedges){
if(backedge.distance() < longestDistance) {
int diff = longestDistance - backedge.distance();
int newSchedule = backedge.getSource().getSchedule() + diff;
backedge.getSource().setSchedule(newSchedule);
}
}
}
private Set<UseEdge> collectBackedges() {
HashSet<UseEdge> backedges = new HashSet();
for(Operation source : graph.getOperations()){
for(Operation target : source.getUse()) {
if(Graph.isBackEdge(source, target)){
UseEdge backedge = new UseEdge(source, target);
backedges.add(backedge);
}
}
}
return backedges;
}
}