package net.sf.orcc.backends.util; import net.sf.orcc.df.Actor; import net.sf.orcc.df.Network; import net.sf.orcc.graph.Vertex; import net.sf.orcc.util.OrccLogger; /** * @author Jani Boutellier * */ public class BroadcastMapper { public void prepareBroadcastMapping(Network network) { for (Actor actor : network.getAllActors()) { if (isBroadcast(actor)) { Vertex pred = findPredecessor(actor.getPredecessors().get(0)); if (pred != null) { actor.setAttribute("broadcastOrigin", (pred.getAdapter(Actor.class)).getName()); } } } } private Vertex findPredecessor(Vertex origin) { Vertex current = origin; while (isBroadcast(current.getAdapter(Actor.class))) { if (current.getPredecessors().size() > 0) { current = current.getPredecessors().get(0); } else { OrccLogger.warnln("No real source actor found for " + origin.getLabel()); return null; } } return current; } private boolean isBroadcast(Actor actor) { if (actor.getActions().size() == 1 && actor.getActions().get(0).getName().equals("copy")) { return true; } return false; } }