Skip to content
PDGGraph.java 2.31 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 tfm.arcs.Arc;
import tfm.arcs.pdg.ControlDependencyArc;
import tfm.arcs.pdg.DataDependencyArc;
import tfm.nodes.PDGVertex;
Javier Costa's avatar
Javier Costa committed
import tfm.nodes.Vertex;
import tfm.variables.*;
import tfm.variables.actions.VariableAction;
import tfm.variables.actions.VariableDeclaration;
import tfm.variables.actions.VariableRead;
import tfm.variables.actions.VariableWrite;
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<PDGVertex> {

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

    public PDGGraph() {
        setRootVertex(new PDGVertex(VertexId.getVertexId(), getRootNodeData()));

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

    protected abstract String getRootNodeData();

    @Override
    public PDGVertex addVertex(String instruction) {
        PDGVertex vertex = new PDGVertex(VertexId.getVertexId(), instruction);
        super.addVertex(vertex);

        return vertex;
    }

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

    public void addControlDependencyArc(PDGVertex from, PDGVertex to) {
        ControlDependencyArc controlDependencyArc = new ControlDependencyArc(from, to);

        this.addArc(controlDependencyArc);
    }

    public void addDataDependencyArc(PDGVertex from, PDGVertex to, String variable) {
        DataDependencyArc dataDataDependencyArc = new DataDependencyArc(from, to, variable);

        this.addArc(dataDataDependencyArc);
    }

Javier Costa's avatar
Javier Costa committed
    public <T> Variable<T> addNewVariable(String name, T value, Vertex declarationNode) {
        Variable<T> variable = new Variable<>(new VariableDeclaration<>(declarationNode, value), name);
        variableSet.addVariable(variable);
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
        return variable;
Javier Costa's avatar
Javier Costa committed
    }

Javier Costa's avatar
Javier Costa committed
    public <T> void addVariableWrite(Vertex currentNode, T newValue, String variable) {
        variableSet.findVariableByName(variable)
                .ifPresent(objectVariable -> objectVariable.addWrite(new VariableWrite<>(currentNode, newValue)));
Javier Costa's avatar
Javier Costa committed
    }

Javier Costa's avatar
Javier Costa committed
    public <T> void addVariableRead(Vertex currentNode, T currentValue, String variable) {
        variableSet.findVariableByName(variable)
                .ifPresent(objectVariable -> objectVariable.addRead(new VariableRead<>(currentNode, currentValue)));
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
    }
}