Newer
Older
AlgebraicDataflowArchitectureModel / AlgebraicDataflowArchitectureModel / src / models / controlFlowModel / ControlFlowGraph.java
k-fujii on 7 Jun 2023 2 KB ControlFlowを可視化
package models.controlFlowModel;

import models.Edge;
import models.dataFlowModel.DataFlowEdge;
import models.dataFlowModel.DataFlowGraph;
import models.dataFlowModel.PushPullAttribute;
import models.dataFlowModel.PushPullValue;
import models.dataFlowModel.ResourceNode;

public class ControlFlowGraph {
	private DataFlowGraph dataFlowGraph;
	private CallGraph pushCallGraph;
	private CallGraph pullCallGraph;
	
	public ControlFlowGraph(DataFlowGraph dataFlowGraph) {
		this.dataFlowGraph = dataFlowGraph;
		this.pushCallGraph = new CallGraph();
		this.pullCallGraph = new CallGraph();
		for (Edge e: dataFlowGraph.getEdges()) {
			PushPullAttribute pushPull = ((PushPullAttribute) ((DataFlowEdge) e).getAttribute());
			ResourceNode srcNode = (ResourceNode) e.getSource();
			ResourceNode dstNode = (ResourceNode) e.getDestination();			
			if (pushPull.getOptions().get(0) == PushPullValue.PUSH) {
				// same direction as the data flow
				pushCallGraph.addEdge(srcNode, dstNode);
			} else {
				// reverse direction to the data flow
				pullCallGraph.addEdge(dstNode, srcNode);
			}
		}
	}
	
	public ControlFlowGraph(DataFlowGraph dataFlowGraph, PushPullValue priority) {
		this.dataFlowGraph = dataFlowGraph;
		this.pushCallGraph = new CallGraph();
		this.pullCallGraph = new CallGraph();
		if (priority == PushPullValue.PUSH) {
			// push-first
			for (Edge e: dataFlowGraph.getEdges()) {
				ResourceNode srcNode = (ResourceNode) e.getSource();
				ResourceNode dstNode = (ResourceNode) e.getDestination();			
				// same direction as the data flow
				pushCallGraph.addEdge(srcNode, dstNode);
			}			
		} else {
			// pull-first
			for (Edge e: dataFlowGraph.getEdges()) {
				ResourceNode srcNode = (ResourceNode) e.getSource();
				ResourceNode dstNode = (ResourceNode) e.getDestination();
				PushPullAttribute pushPull = ((PushPullAttribute) ((DataFlowEdge) e).getAttribute());
				if (pushPull.getOptions().contains(PushPullValue.PULL)) {
					// Pull style is selectable
					// reverse direction to the data flow
					pullCallGraph.addEdge(dstNode, srcNode);
				} else {
					// Pull style is not selectable
					// same direction as the data flow
					pushCallGraph.addEdge(srcNode, dstNode);
				}
			}
		}
	}

	public DataFlowGraph getDataFlowGraph() {
		return dataFlowGraph;
	}

	public CallGraph getPushCallGraph() {
		return pushCallGraph;
	}

	public CallGraph getPullCallGraph() {
		return pullCallGraph;
	}
}