/* * Copyright (c) 2011, Abo Akademi University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Abo Akademi University nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ package net.sf.orcc.backends.promela.transform; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import net.sf.orcc.backends.promela.transform.ControlTokenLinkModel; import net.sf.orcc.df.Action; import net.sf.orcc.df.Actor; import net.sf.orcc.df.Port; import net.sf.orcc.ir.Var; public class ControlTokenActorModel extends VariableGraph{ private Map<Port, ControlTokenLinkModel> inLinks = new HashMap<Port, ControlTokenLinkModel>(); private Map<ControlTokenLinkModel, Port> outLinks = new HashMap<ControlTokenLinkModel, Port>(); private Map<Port, Set<Var>> outputPortToVarsMap = new HashMap<Port, Set<Var>>(); private Map<Var, Port> varToInputPortMap = new HashMap<Var, Port>(); private Set<Var> extSchedulingVars = new HashSet<Var>(); private Set<Var> schedOutPortVars = new HashSet<Var>(); private Set<Port> schedOutPort = new HashSet<Port>(); public ControlTokenActorModel(Actor actor) { super(actor); this.actor = actor; // make some helper maps for (Action action : actor.getActions()) { for (Port port : action.getOutputPattern().getPorts()) { if (!outputPortToVarsMap.containsKey(port)) { outputPortToVarsMap.put(port, new HashSet<Var>()); } outputPortToVarsMap.get(port).add( action.getOutputPattern().getVariable(port)); } for (Port port : action.getInputPattern().getPorts()) { varToInputPortMap.put(action.getInputPattern() .getVariable(port), port); } for (Port port : action.getPeekPattern().getPorts()) { varToInputPortMap.put( action.getPeekPattern().getVariable(port), port); } } } public void addExtSchedulingDepVars(Port outputPort) { for (Var v : outputPortToVarsMap.get(outputPort)) { this.schedOutPort.add(outputPort); this.schedOutPortVars.add(v); this.extSchedulingVars.add(v); this.extSchedulingVars.addAll(getReachableVars(v)); } buildInterActorDependencies(); } public void addInLink(ControlTokenLinkModel link, Port port) { inLinks.put(port, link); } public void addOutLink(ControlTokenLinkModel link, Port port) { outLinks.put(link, port); } public void buildInterActorDependencies() { Set<Var> depsSet = new HashSet<Var>(); for (Var var : localSchedulingVars) { depsSet.addAll(getReachableVars(var)); } localSchedulingVars.addAll(depsSet); for (Port ip : getSchedulingInputPorts()) { inLinks.get(ip).setControlLink(true); ControlTokenActorModel remoteActor = inLinks.get(ip).getSource(); Port remotePort = inLinks.get(ip).getConnection().getSourcePort(); if (remoteActor != null) { remoteActor.addExtSchedulingDepVars(remotePort); } } } public Set<Var> getExtSchedulingVars() { return extSchedulingVars; } public Set<Var> getLocalSchedulingVars() { return localSchedulingVars; } public Set<Var> getSchedOutPortVars() { return schedOutPortVars; } private Set<Port> getSchedulingInputPorts() { Set<Port> ports = new HashSet<Port>(); for (Var v : localSchedulingVars) { if (varToInputPortMap.containsKey(v)) { ports.add(varToInputPortMap.get(v)); } } for (Var v : extSchedulingVars) { if (varToInputPortMap.containsKey(v)) { ports.add(varToInputPortMap.get(v)); } } return ports; } public boolean isPort(Var var) { if (varToInputPortMap.containsKey(var)) { return true; } for (Set<Var> vars : outputPortToVarsMap.values()) { if (vars.contains(var)) { return true; } } return false; } public Set<Port> getPortsUsedInScheduling() { Set<Port> ports = getSchedulingInputPorts(); ports.addAll(schedOutPort); return ports; } }