Skip to content
PDGGraph.java 2.94 KiB
Newer Older
Javier Costa's avatar
Javier Costa committed
package tfm.graphs;
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
import edg.graphlib.Vertex;
import edg.graphlib.Visitor;
Javier Costa's avatar
Javier Costa committed
import tfm.arcs.Arc;
Javier Costa's avatar
Javier Costa committed
import tfm.arcs.data.ArcData;
Javier Costa's avatar
Javier Costa committed
import tfm.arcs.pdg.ControlDependencyArc;
import tfm.arcs.pdg.DataDependencyArc;
Javier Costa's avatar
Javier Costa committed
import tfm.nodes.PDGNode;
import tfm.nodes.Node;
Javier Costa's avatar
Javier Costa committed
import tfm.variables.*;
import tfm.variables.actions.VariableDeclaration;
import tfm.variables.actions.VariableUse;
import tfm.variables.actions.VariableDefinition;
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
import java.util.*;
import java.util.stream.Collectors;

Javier Costa's avatar
Javier Costa committed
public abstract class PDGGraph extends Graph<PDGNode> {
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
    private VariableSet variableSet;
Javier Costa's avatar
Javier Costa committed

    public PDGGraph() {
Javier Costa's avatar
Javier Costa committed
        setRootVertex(new PDGNode(NodeId.getVertexId(), getRootNodeData(), 0));
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
        variableSet = new VariableSet();
Javier Costa's avatar
Javier Costa committed
    }

    protected abstract String getRootNodeData();

    @Override
Javier Costa's avatar
Javier Costa committed
    public PDGNode addNode(String instruction, int fileNumber) {
        PDGNode vertex = new PDGNode(NodeId.getVertexId(), instruction, fileNumber);
Javier Costa's avatar
Javier Costa committed
        super.addVertex(vertex);

        return vertex;
    }

    @SuppressWarnings("unchecked")
    private void addArc(Arc arc) {
        super.addEdge(arc);
    }

Javier Costa's avatar
Javier Costa committed
    public void addControlDependencyArc(PDGNode from, PDGNode to) {
Javier Costa's avatar
Javier Costa committed
        ControlDependencyArc controlDependencyArc = new ControlDependencyArc(from, to);

        this.addArc(controlDependencyArc);
    }

Javier Costa's avatar
Javier Costa committed
    public void addDataDependencyArc(PDGNode from, PDGNode to, String variable) {
Javier Costa's avatar
Javier Costa committed
        DataDependencyArc dataDataDependencyArc = new DataDependencyArc(from, to, variable);

        this.addArc(dataDataDependencyArc);
    }

Javier Costa's avatar
Javier Costa committed
    public boolean containsVariable(String name) {
        return variableSet.containsVariable(name);
    }
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
    public Variable addNewVariable(String name, Node declarationNode) {
Javier Costa's avatar
Javier Costa committed
        return variableSet.addVariable(name, new VariableDeclaration(declarationNode));
Javier Costa's avatar
Javier Costa committed
    }

Javier Costa's avatar
Javier Costa committed
    public void addVariableDefinition(String variable, Node currentNode) {
        variableSet.addDefinition(variable, new VariableDefinition(currentNode));
Javier Costa's avatar
Javier Costa committed
    }

Javier Costa's avatar
Javier Costa committed
    public void addVariableUse(String variable, Node currentNode) {
        variableSet.addUse(variable, new VariableUse(currentNode));
Javier Costa's avatar
Javier Costa committed
    }

Javier Costa's avatar
Javier Costa committed
    public VariableSet getVariableSet() {
        return variableSet;
Javier Costa's avatar
Javier Costa committed
    }
Javier Costa's avatar
Javier Costa committed

    @Override
    public String toGraphvizRepresentation() {
        String lineSep = System.lineSeparator();

        String nodesDeclaration = getVerticies().stream()
                .map(vertex -> ((Node) vertex).toGraphvizRepresentation())
                .collect(Collectors.joining(lineSep));

        String arrows =
                getArrows().stream()
                        .sorted(Comparator.comparingInt(arrow -> ((Node) arrow.getFrom()).getId()))
                        .map(arrow -> ((Arc) arrow).toGraphvizRepresentation())
                        .collect(Collectors.joining(lineSep));


        return "digraph g{" + lineSep +
                "splines=true;" + lineSep +
                nodesDeclaration + lineSep +
                arrows + lineSep +
                "}";
    }
Javier Costa's avatar
Javier Costa committed
}