/******************************************************************************* * Copyright 2012 Analog Devices, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ package com.analog.lyric.dimple.schedulers.dependencyGraph.helpers; import java.util.ArrayList; import java.util.HashMap; import org.eclipse.jdt.annotation.Nullable; import com.analog.lyric.dimple.exceptions.DimpleException; import com.analog.lyric.dimple.model.core.INode; import com.analog.lyric.dimple.schedulers.dependencyGraph.StaticDependencyGraphNode; import com.analog.lyric.dimple.schedulers.scheduleEntry.EdgeScheduleEntry; import com.analog.lyric.dimple.schedulers.scheduleEntry.IScheduleEntry; import com.analog.lyric.dimple.schedulers.scheduleEntry.NodeScheduleEntry; /* * The LastUpdateGraph data structure provides the ability to retrieve edges associated * with IScheduleEntry entries. It also provides a mechanism to see the last StaticDependencyGraphNode * that touched an edge. This is used by the StaticDependencyGraph when building the dependency graph. */ public class LastUpdateGraph { private HashMap<Edge,StaticDependencyGraphNode> _edge2lastNode = new HashMap<Edge, StaticDependencyGraphNode>(); public LastUpdateGraph() { } /* * Retrieve the edges used by a schedule update. */ public ArrayList<Edge> getEdges(IScheduleEntry entry) { switch (entry.type()) { case NODE: return getEdges((NodeScheduleEntry)entry); case EDGE: return getEdges((EdgeScheduleEntry)entry); default: throw new DimpleException("Not supported"); } } /* * Get the last node to either read from or write on this edge. */ public @Nullable StaticDependencyGraphNode getLastNode(Edge e) { return _edge2lastNode.get(e); } /* * Set the last node to either read or write from this edge. */ public void setLastNode(Edge e, StaticDependencyGraphNode node) { _edge2lastNode.put(e, node); } /* * Private method to get edges associated with a node schedule entry. * (All input and output edges) */ private ArrayList<Edge> getEdges(NodeScheduleEntry nse) { ArrayList<Edge> retval = new ArrayList<Edge>(); INode n = nse.getNode(); for (INode other : n.getSiblings()) { retval.add(new Edge(n,other)); retval.add(new Edge(other,n)); } return retval; } /* * Private method to get edges associated with a node schedule entry. * (All input except one and one output edge) */ private ArrayList<Edge> getEdges(EdgeScheduleEntry ese) { INode n = ese.getNode(); int size = n.getSiblingCount(); int portNum = ese.getPortNum(); ArrayList<Edge> retval = new ArrayList<Edge>(size); for (int i = 0; i < size; i++) { INode n2 = n.getSibling(i); if (i == portNum) retval.add(new Edge(n,n2)); else retval.add(new Edge(n2,n)); } return retval; } }