Skip to content
Snippets Groups Projects
DirectedGraphTranslator.java 221 KiB
Newer Older
/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
 * ludovic.apvrille AT enst.fr
 * This software is a computer program whose purpose is to allow the
 * edition of TURTLE analysis, design and deployment diagrams, to
 * allow the generation of RT-LOTOS or Java code from this diagram,
 * and at last to allow the analysis of formal validation traces
 * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
 * from INRIA Rhone-Alpes.
 * This software is governed by the CeCILL  license under French law and
 * abiding by the rules of distribution of free software.  You can  use,
 * modify and/ or redistribute the software under the terms of the CeCILL
 * license as circulated by CEA, CNRS and INRIA at the following URL
 * "http://www.cecill.info".
 * As a counterpart to the access to the source code and  rights to copy,
 * modify and redistribute granted by the license, users are provided only
 * with a limited warranty  and the software's author,  the holder of the
 * economic rights,  and the successive licensors  have only  limited
 * liability.
 * In this respect, the user's attention is drawn to the risks associated
 * with loading,  using,  modifying and/or developing or reproducing the
 * software by the user in light of its specific status of free software,
 * that may mean  that it is complicated to manipulate,  and  that  also
 * therefore means  that it is reserved for developers  and  experienced
 * professionals having in-depth computer knowledge. Users are therefore
 * encouraged to load and test the software's suitability as regards their
 * requirements in conditions enabling the security of their systems and/or
 * data to be ensured and,  more generally, to use and operate it in the
 * same conditions as regards security.
 * The fact that you are presently reading this means that you have had
 * knowledge of the CeCILL license and that you accept its terms.
 */

maysam zoor's avatar
maysam zoor committed
package ui.simulationtraceanalysis;
import com.mxgraph.layout.hierarchical.mxHierarchicalLayout;
import com.mxgraph.swing.mxGraphComponent;
import org.jgrapht.Graph;
import org.jgrapht.GraphPath;
import org.jgrapht.Graphs;
import org.jgrapht.alg.shortestpath.AllDirectedPaths;
import org.jgrapht.alg.shortestpath.DijkstraShortestPath;
import org.jgrapht.ext.JGraphXAdapter;
import org.jgrapht.graph.DefaultDirectedGraph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.io.*;
import tmltranslator.*;
import tmltranslator.tomappingsystemc2.DiploSimulatorCodeGenerator;
import ui.TGComponent;
import ui.TGConnectingPoint;
import ui.TGConnector;
import ui.TMLComponentDesignPanel;
import ui.interactivesimulation.SimulationTransaction;
import ui.tmlad.*;
import ui.tmlcompd.TMLCPrimitivePort;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;
import java.util.*;
import java.util.List;
import java.util.Map.Entry;

/**
 * Class DirectedGraphTranslator: this class generate the directed graph
 * equivalent for the sysml model
 * 23/09/2019
 *
 * @author Maysam Zoor
 */
public class DirectedGraphTranslator extends JApplet {

    // private TMLArchiPanel tmlap; // USed to retrieve the currently opened
    // architecture panel
    // private TMLMapping<TGComponent> tmap;
maysam zoor's avatar
maysam zoor committed
    // private TMLComponentDesignPanel tmlcdp;
    private TMLTask taskAc, task1, task2;
    private TMLActivity activity;
    private int nodeNbProgressBar = 0;
    private int nodeNb = 0;
    private TMLActivityElement currentElement;
    private TMLActivityElement backwardElement;
    private ArrayList<String> SummaryCommMapping;
    private Graph<vertex, DefaultEdge> g;
    private static final Dimension DEFAULT_SIZE = new Dimension(530, 320);
maysam zoor's avatar
maysam zoor committed
    private List<TMLComponentDesignPanel> cpanels;

    private final List<HwLink> links;
    private final TMLMapping<TGComponent> tmap;
    private final HashMap<String, String> addedEdges = new HashMap<String, String>();
    private final HashMap<String, HashSet<String>> sendEventWaitEventEdges = new HashMap<String, HashSet<String>>();
    private final HashMap<String, HashSet<String>> readWriteChannelEdges = new HashMap<String, HashSet<String>>();
    private final HashMap<String, HashSet<String>> writeReadChannelEdges = new HashMap<String, HashSet<String>>();

    private final HashMap<String, HashSet<String>> forkreadEdges = new HashMap<String, HashSet<String>>();
    private final HashMap<String, HashSet<String>> forkwriteEdges = new HashMap<String, HashSet<String>>();

    private final HashMap<String, HashSet<String>> joinreadEdges = new HashMap<String, HashSet<String>>();
    private final HashMap<String, HashSet<String>> joinwriteEdges = new HashMap<String, HashSet<String>>();

    private final HashMap<String, HashSet<String>> sequenceEdges = new HashMap<String, HashSet<String>>();
    private final HashMap<String, ArrayList<String>> orderedSequenceList = new HashMap<String, ArrayList<String>>();
    private final HashMap<String, HashSet<String>> unOrderedSequenceEdges = new HashMap<String, HashSet<String>>();
    private final HashMap<String, ArrayList<String>> unOrderedSequenceList = new HashMap<String, ArrayList<String>>();
    private final List<String> forEverLoopList = new ArrayList<String>();
    private final HashMap<String, List<TMLTask>> requests = new HashMap<String, List<TMLTask>>();
    private final HashMap<String, HashSet<String>> requestEdges = new HashMap<String, HashSet<String>>();
    private final HashMap<String, List<String>> requestsOriginDestination = new HashMap<String, List<String>>();
    private final HashMap<String, List<String>> requestsPorts = new HashMap<String, List<String>>();
    private final HashMap<String, List<String>> requestsDestination = new HashMap<String, List<String>>();
    private final Vector<String> allLatencyTasks = new Vector<String>();
    private static JScrollPane scrollPane = new JScrollPane();

    // List<String,String> = new ArrayList<String,String>();

    private final HashMap<String, String> nameIDTaskList = new HashMap<String, String>();

    private final HashMap<String, ArrayList<String>> channelPaths = new HashMap<String, ArrayList<String>>();

    private Object[][] dataByTask = null;
    private Object[][] dataByTaskMinMax = null;
    private Object[][] dataByTaskBYRow;
    private Object[][] dataByTaskHWBYRow;

    private HashMap<Integer, Vector<SimulationTransaction>> dataByTaskR = new HashMap<Integer, Vector<SimulationTransaction>>();
    private HashMap<Integer, List<SimulationTransaction>> dataBydelayedTasks = new HashMap<Integer, List<SimulationTransaction>>();
    private HashMap<Integer, HashMap<String, ArrayList<ArrayList<Integer>>>> timeDelayedPerRow = new HashMap<Integer, HashMap<String, ArrayList<ArrayList<Integer>>>>();
    private HashMap<Integer, List<String>> detailsOfMinMaxRow = new HashMap<Integer, List<String>>();
    private HashMap<Integer, List<SimulationTransaction>> dataBydelayedTasksOfMinMAx = new HashMap<Integer, List<SimulationTransaction>>();
    private final JFrame frame = new JFrame("The Sys-ML Model As Directed Graph");
    private List<Integer> times1 = new ArrayList<Integer>();
    private List<Integer> times2 = new ArrayList<Integer>();
    private Vector<SimulationTransaction> transFile;
    private String idTask1;
    private String idTask2;
    private String task2DeviceName = "";
    private String task1DeviceName = "";
    private ArrayList<String> devicesToBeConsidered = new ArrayList<String>();
    private Vector<SimulationTransaction> relatedsimTraces = new Vector<SimulationTransaction>();
    private Vector<SimulationTransaction> delayDueTosimTraces = new Vector<SimulationTransaction>();
    private HashMap<String, ArrayList<SimulationTransaction>> relatedsimTraceswithTaint = new HashMap<String, ArrayList<SimulationTransaction>>();
    private JFrameLatencyDetailedAnalysis frameLatencyDetailedAnalysis;
    private JFrameCompareLatencyDetail frameCompareLatencyDetail;
    private int callingFrame;
    private int nbOfNodes = 0;

    private List<String> usedLabels = new ArrayList<String>();
    private List<String> warnings = new ArrayList<String>();
maysam zoor's avatar
maysam zoor committed

    private static Random random = new Random();

    private static final String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz";
    private static final String CHAR_UPPER = CHAR_LOWER.toUpperCase();
    private static final String data = CHAR_LOWER + CHAR_UPPER;
    // List<vertex> gVertecies = new ArrayList<vertex>();

    private HashMap<String, ArrayList<ArrayList<Integer>>> runnableTimePerDevice = new HashMap<String, ArrayList<ArrayList<Integer>>>();
    private HashMap<String, List<String>> allForLoopNextValues = new HashMap<String, List<String>>();
    private HashMap<vertex, List<vertex>> allChoiceValues = new HashMap<vertex, List<vertex>>();

    private HashMap<vertex, List<vertex>> allSeqValues = new HashMap<vertex, List<vertex>>();
    private HashMap<vertex, List<vertex>> allRandomSeqValues = new HashMap<vertex, List<vertex>>();

    private String taintLabel = "";

    private Vector<String> readChannelTransactions = new Vector<String>();
    private Vector<String> writeChannelTransactions = new Vector<String>();
    private HashMap<vertex, List<vertex>> ruleAddedEdges = new HashMap<vertex, List<vertex>>();

    private HashMap<vertex, List<vertex>> ruleAddedEdgesChannels = new HashMap<vertex, List<vertex>>();
    private HashMap<String, Integer> cpuIDs = new HashMap<String, Integer>();
    private HashMap<String, List<String>> forLoopNextValues = new HashMap<String, List<String>>();

maysam zoor's avatar
maysam zoor committed
    private int opCount;

    private HashMap<String, List<String>> sendEvt = new HashMap<String, List<String>>();
    private HashMap<String, List<String>> waitEvt = new HashMap<String, List<String>>();

    private HashMap<String, String> sendData = new HashMap<String, String>();
    private HashMap<String, String> receiveData = new HashMap<String, String>();
    private String taskStartName = "";
    @SuppressWarnings("deprecation")
maysam zoor's avatar
maysam zoor committed
    public DirectedGraphTranslator(JFrameLatencyDetailedAnalysis jFrameLatencyDetailedAnalysis, JFrameCompareLatencyDetail jframeCompareLatencyDetail,
            TMLMapping<TGComponent> tmap1, List<TMLComponentDesignPanel> cpanels1, int i) {
maysam zoor's avatar
maysam zoor committed
        setCpanels(cpanels1);

        links = tmap.getTMLArchitecture().getHwLinks();

maysam zoor's avatar
maysam zoor committed
        // tmlcdp = getCpanels().get(0);

        callingFrame = i;

        if (callingFrame == 0)

        {
            frameLatencyDetailedAnalysis = jFrameLatencyDetailedAnalysis;
        } else if (callingFrame == 1) {
            frameCompareLatencyDetail = jframeCompareLatencyDetail;
maysam zoor's avatar
maysam zoor committed
        }
        DrawDirectedGraph();

    }

    // The main function to add the vertices and edges according to the model

maysam zoor's avatar
maysam zoor committed
    public vertex vertex(String name, int id) {
        // TODO Auto-generated method stub

maysam zoor's avatar
maysam zoor committed
        vertex v = new vertex(name, id);
    private void DrawDirectedGraph() {
maysam zoor's avatar
maysam zoor committed
        nodeNbProgressBar = 0;

        nodeNbProgressBar = tmap.getArch().getBUSs().size() + tmap.getArch().getHwBridge().size() + tmap.getArch().getHwA().size()
                + tmap.getArch().getMemories().size() + tmap.getArch().getCPUs().size();

maysam zoor's avatar
maysam zoor committed
        expectedNumberofVertex();
maysam zoor's avatar
maysam zoor committed

        if (callingFrame == 0)

        {
maysam zoor's avatar
maysam zoor committed
            frameLatencyDetailedAnalysis.getPbar().setMaximum(nodeNbProgressBar);
            frameLatencyDetailedAnalysis.getPbar().setMinimum(0);
maysam zoor's avatar
maysam zoor committed

        }
        if (callingFrame == 1)

        {
maysam zoor's avatar
maysam zoor committed
            frameCompareLatencyDetail.getPbar().setMaximum(nodeNbProgressBar);
            frameCompareLatencyDetail.getPbar().setMinimum(0);
maysam zoor's avatar
maysam zoor committed
        }

        nbOfNodes = 0;
maysam zoor's avatar
maysam zoor committed
        // HashMap<String, HashSet<String>> cpuTasks;
        HashMap<String, HashSet<TMLElement>> buschannel = new HashMap<String, HashSet<TMLElement>>();
        HashMap<String, HashSet<TMLElement>> memorychannel = new HashMap<String, HashSet<TMLElement>>();

        HashMap<String, HashSet<TMLElement>> bridgechannel = new HashMap<String, HashSet<TMLElement>>();

maysam zoor's avatar
maysam zoor committed
        // HashMap<String, HashSet<TMLTask>> cpuTask = new HashMap<String,
        // HashSet<TMLTask>>();
        g = new DefaultDirectedGraph<>(DefaultEdge.class);

maysam zoor's avatar
maysam zoor committed
        buschannel = addBUSs();
        bridgechannel = addBridge();
        addHwAs();
        memorychannel = addMemories();
        addBuschannel(buschannel);
        addBridgechannel(bridgechannel);
        addMemorychannel(memorychannel);
        addUnmappedchannel();
        addCPUs();
        addLinkEdges();
        addFlowEdges();
        addSendEventWaitEventEdges();
        addReadWriteChannelEdges();
        addForkreadEdges();
        addJoinreadEdges();
        addWriteReadChannelEdges();
        addSeqEdges();
        addunOrderedSeqEdges();
        addRequestEdges();
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
    private void addUnmappedchannel() {
        // TODO Auto-generated method stub
        DiploSimulatorCodeGenerator gen = new DiploSimulatorCodeGenerator(tmap);
        for (TMLChannel ch : tmap.getTMLModeling().getChannels()) {
            List<HwCommunicationNode> pathNodes = gen.determineRoutingPath(tmap.getHwNodeOf(ch.getOriginTask()),
                    tmap.getHwNodeOf(ch.getDestinationTask()), ch);
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
            if (!g.vertexSet().contains(getvertex(ch.getName()))) {
                vertex v2 = vertex(ch.getName(), ch.getID());
                g.addVertex(v2);
maysam zoor's avatar
maysam zoor committed
                // gVertecies.add(vertex(ch.getName()));
                getvertex(ch.getName()).setType(vertex.TYPE_CHANNEL);
                getvertex(ch.getName()).setTaintFixedNumber(0);
                updatemainBar(ch.getName());
maysam zoor's avatar
maysam zoor committed
            if (!pathNodes.isEmpty()) {
                for (HwCommunicationNode node : pathNodes) {
maysam zoor's avatar
maysam zoor committed
                    if (channelPaths.containsKey(ch.getName())) {
                        if (!channelPaths.get(ch.getName()).contains(node.getName())) {
                            channelPaths.get(ch.getName()).add(node.getName());
                        }
                    } else {
                        ArrayList<String> pathNodeNames = new ArrayList<String>();
                        pathNodeNames.add(node.getName());
                        channelPaths.put(ch.getName(), pathNodeNames);
                    }
                    vertex v1 = vertex(node.getName(), node.getID());
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
                    vertex v2 = vertex(ch.getName(), ch.getID());
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
                    if (!g.containsEdge(v1, v2)) {
                        g.addEdge(v1, v2);
                    }
maysam zoor's avatar
maysam zoor committed
        SummaryCommMapping = tmap.getSummaryCommMapping();
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
    private void addCPUs() {
        // TODO Auto-generated method stub
        HashMap<String, HashSet<TMLTask>> cpuTask = new HashMap<String, HashSet<TMLTask>>();
        HashMap<String, HashSet<String>> cpuTasks;
        for (HwNode node : tmap.getArch().getCPUs()) {
            cpuTask = new HashMap<String, HashSet<TMLTask>>();
            cpuIDs.put(node.getName(), node.getID());
            if (tmap.getLisMappedTasks(node).size() > 0) {
maysam zoor's avatar
maysam zoor committed

                cpuTask.put(node.getName(), tmap.getLisMappedTasks(node));

            }

            cpuTasks = getCPUTaskMap(cpuTask);

        }

maysam zoor's avatar
maysam zoor committed
    private void addMemorychannel(HashMap<String, HashSet<TMLElement>> memorychannel) {
        // TODO Auto-generated method stub
        for (Entry<String, HashSet<TMLElement>> entry : memorychannel.entrySet()) {
            String busName = entry.getKey();
            HashSet<TMLElement> busChList = entry.getValue();

            for (TMLElement busCh : busChList) {

                String ChannelName = busCh.getName();
maysam zoor's avatar
maysam zoor committed
                vertex v = vertex(ChannelName, busCh.getID());
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
                if (!g.containsVertex(getvertex(ChannelName))) {
                    g.addVertex(v);
                    getvertex(ChannelName).setType(vertex.TYPE_CHANNEL);
                    // gVertecies.add(vertex(ChannelName));
                    getvertex(ChannelName).setTaintFixedNumber(0);
maysam zoor's avatar
maysam zoor committed
                    updatemainBar("ChannelName");

                }

                g.addEdge(getvertex(busName), getvertex(ChannelName));
maysam zoor's avatar
maysam zoor committed
    }

    private void addBridgechannel(HashMap<String, HashSet<TMLElement>> bridgechannel) {
        // TODO Auto-generated method stub

        for (Entry<String, HashSet<TMLElement>> entry : bridgechannel.entrySet()) {
            String busName = entry.getKey();
            HashSet<TMLElement> busChList = entry.getValue();

            for (TMLElement busCh : busChList) {

                String ChannelName = busCh.getName();
maysam zoor's avatar
maysam zoor committed
                vertex v = vertex(ChannelName, busCh.getID());

                if (!g.containsVertex(getvertex(ChannelName))) {
                    g.addVertex(v);
                    getvertex(ChannelName).setType(vertex.TYPE_CHANNEL);
                    // gVertecies.add(vertex(ChannelName));

                    getvertex(ChannelName).setTaintFixedNumber(0);
maysam zoor's avatar
maysam zoor committed

                    updatemainBar("ChannelName");

                }

                g.addEdge(getvertex(busName), getvertex(ChannelName));
maysam zoor's avatar
maysam zoor committed
    }

    private void addBuschannel(HashMap<String, HashSet<TMLElement>> buschannel) {
        // TODO Auto-generated method stub
        for (Entry<String, HashSet<TMLElement>> entry : buschannel.entrySet()) {
            String busName = entry.getKey();
            HashSet<TMLElement> busChList = entry.getValue();

            for (TMLElement busCh : busChList) {

                String ChannelName = busCh.getName();
maysam zoor's avatar
maysam zoor committed

                vertex v = vertex(ChannelName, busCh.getID());

                if (!g.containsVertex(v)) {
                    g.addVertex(v);

                    getvertex(ChannelName).setType(vertex.TYPE_CHANNEL);
                    // gVertecies.add(vertex(ChannelName));
                    getvertex(ChannelName).setTaintFixedNumber(0);
maysam zoor's avatar
maysam zoor committed
                    updatemainBar("ChannelName");

                }

                g.addEdge(getvertex(busName), getvertex(ChannelName));
maysam zoor's avatar
maysam zoor committed
                // TMLChannel tmlch = (TMLChannel) busCh;
maysam zoor's avatar
maysam zoor committed
                // String writeChannel = tmlch.getDestinationTask().getName() + "__" +
                // "writechannel:" + tmlch.getDestinationPort();
                // String readChannel;
maysam zoor's avatar
maysam zoor committed
    private HashMap<String, HashSet<TMLElement>> addMemories() {
maysam zoor's avatar
maysam zoor committed
        HashMap<String, HashSet<TMLElement>> memorychannel = new HashMap<String, HashSet<TMLElement>>();
        for (HwNode node : tmap.getArch().getMemories()) {
maysam zoor's avatar
maysam zoor committed
            vertex v = vertex(node.getName(), node.getID());
maysam zoor's avatar
maysam zoor committed
            if (!g.containsVertex(v)) {
                g.addVertex(v);
                updatemainBar("getMemories");
maysam zoor's avatar
maysam zoor committed
            }

            if (tmap.getLisMappedChannels(node).size() > 0) {
                memorychannel.put(node.getName(), tmap.getLisMappedChannels(node));
maysam zoor's avatar
maysam zoor committed
        return memorychannel;
    }

    private void addHwAs() {
        // TODO Auto-generated method stub
        HashMap<String, HashSet<TMLTask>> cpuTask = new HashMap<String, HashSet<TMLTask>>();
        HashMap<String, HashSet<String>> cpuTasks;
        for (HwA node : tmap.getArch().getHwA()) {
maysam zoor's avatar
maysam zoor committed
            cpuTask = new HashMap<String, HashSet<TMLTask>>();
maysam zoor's avatar
maysam zoor committed
            cpuIDs.put(node.getName(), node.getID());

            if (tmap.getLisMappedTasks(node).size() > 0) {
maysam zoor's avatar
maysam zoor committed

                cpuTask.put(node.getName(), tmap.getLisMappedTasks(node));

            }

            cpuTasks = getCPUTaskMap(cpuTask);

        }
maysam zoor's avatar
maysam zoor committed
    }

    private HashMap<String, HashSet<TMLElement>> addBridge() {
        // TODO Auto-generated method stub

        HashMap<String, HashSet<TMLElement>> bridgechannel = new HashMap<String, HashSet<TMLElement>>();

        for (HwNode node : tmap.getArch().getHwBridge()) {

            vertex v = vertex(node.getName(), node.getID());

            if (!g.containsVertex(v)) {
                g.addVertex(v);

                updatemainBar("getHwBridge");

            }

            if (tmap.getLisMappedChannels(node).size() > 0) {
                bridgechannel.put(node.getName(), tmap.getLisMappedChannels(node));

            }

        }
        return bridgechannel;

    }

    private HashMap<String, HashSet<TMLElement>> addBUSs() {
        // TODO Auto-generated method stub
        HashMap<String, HashSet<TMLElement>> buschannel = new HashMap<String, HashSet<TMLElement>>();
        for (HwNode node : tmap.getArch().getBUSs()) {

            vertex v = vertex(node.getName(), node.getID());

            if (!g.containsVertex(v)) {
                g.addVertex(v);

                updatemainBar("getBUSs");

            }

            if (tmap.getLisMappedChannels(node).size() > 0) {
                buschannel.put(node.getName(), tmap.getLisMappedChannels(node));

            }

        }

        return buschannel;

    }

    private void addLinkEdges() {
        // TODO Auto-generated method stub
        for (HwLink link : links) {

maysam zoor's avatar
maysam zoor committed
            vertex vlink1 = vertex(link.hwnode.getName(), link.hwnode.getID());
            vertex vlink2 = vertex(link.bus.getName(), link.bus.getID());
maysam zoor's avatar
maysam zoor committed
            if (g.containsVertex(getvertex(link.hwnode.getName())) && g.containsVertex(getvertex(link.bus.getName()))) {

                g.addEdge(vlink1, vlink2);
                g.addEdge(vlink2, vlink1);
maysam zoor's avatar
maysam zoor committed
    }

    private void addFlowEdges() {
        // TODO Auto-generated method stub
        if (addedEdges.size() > 0) {
            for (Entry<String, String> edge : addedEdges.entrySet()) {
                g.addEdge(getvertex(edge.getKey()), getvertex(edge.getValue()));
maysam zoor's avatar
maysam zoor committed
    }

    private void addSendEventWaitEventEdges() {
        // TODO Auto-generated method stub
        if (sendEventWaitEventEdges.size() > 0) {
            for (Entry<String, HashSet<String>> edge : sendEventWaitEventEdges.entrySet()) {

                for (String waitEventEdge : edge.getValue())

                    g.addEdge(getvertex(edge.getKey()), getvertex(waitEventEdge));
maysam zoor's avatar
maysam zoor committed

    }

    private void addReadWriteChannelEdges() {
        // TODO Auto-generated method stub
        if (readWriteChannelEdges.size() > 0) {
            for (Entry<String, HashSet<String>> edge : readWriteChannelEdges.entrySet()) {

                for (String readChannelEdge : edge.getValue()) {

                    g.addEdge(getvertex(edge.getKey()), getvertex(readChannelEdge));

                    getvertex(edge.getKey()).setTaintFixedNumber(getvertex(edge.getKey()).getTaintFixedNumber() + 1);

                }
            }
        }

maysam zoor's avatar
maysam zoor committed
    }

    private void addForkreadEdges() {
        // TODO Auto-generated method stub
        if (forkreadEdges.size() > 0) {
            for (Entry<String, HashSet<String>> edge : forkreadEdges.entrySet()) {

                HashSet<String> writech = forkwriteEdges.get(edge.getKey());

                for (String readChannelEdge : edge.getValue()) {

                    for (String wch : writech) {

                        g.addEdge(getvertex(readChannelEdge), getvertex(wch));

                    }
                }
            }
        }
maysam zoor's avatar
maysam zoor committed
    }

    // draw the vertices and edges for the tasks mapped to the CPUs

    private void addJoinreadEdges() {
        // TODO Auto-generated method stub
        if (joinreadEdges.size() > 0) {
            for (Entry<String, HashSet<String>> edge : joinreadEdges.entrySet()) {

                HashSet<String> writech = joinwriteEdges.get(edge.getKey());

                for (String readChannelEdge : edge.getValue()) {
                    for (String wch : writech) {
                        g.addEdge(getvertex(readChannelEdge), getvertex(wch));

                    }
                }
            }
        }
maysam zoor's avatar
maysam zoor committed

    }

    private void addWriteReadChannelEdges() {
        // TODO Auto-generated method stub
        if (writeReadChannelEdges.size() > 0) {
            for (Entry<String, HashSet<String>> edge : writeReadChannelEdges.entrySet()) {

                for (String readChannelEdge : edge.getValue()) {

                    g.addEdge(getvertex(edge.getKey()), getvertex(readChannelEdge));
                    getvertex(readChannelEdge).setTaintFixedNumber(getvertex(readChannelEdge).getTaintFixedNumber() + 1);

                }
maysam zoor's avatar
maysam zoor committed
    private void addRequestEdges() {
        // TODO Auto-generated method stub
        if (requestEdges.size() > 0) {

            for (Entry<String, HashSet<String>> edge : requestEdges.entrySet()) {

                for (String requestsingleEdges : edge.getValue()) {

                    g.addEdge(getvertex(edge.getKey()), getvertex(requestsingleEdges));
maysam zoor's avatar
maysam zoor committed
    private void addunOrderedSeqEdges() {
        // TODO Auto-generated method stub
        if (unOrderedSequenceEdges.size() > 0) {
            for (Entry<String, HashSet<String>> edge : unOrderedSequenceEdges.entrySet()) {
maysam zoor's avatar
maysam zoor committed
                for (String sequenceEdge : edge.getValue())
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
                    g.addEdge(getvertex(edge.getKey()), getvertex(sequenceEdge));
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
    private void addSeqEdges() {
        if (sequenceEdges.size() > 0) {
            for (Entry<String, HashSet<String>> edge : sequenceEdges.entrySet()) {

                for (String sequenceEdge : edge.getValue())
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
                    g.addEdge(getvertex(edge.getKey()), getvertex(sequenceEdge));

            }
maysam zoor's avatar
maysam zoor committed
    private void expectedNumberofVertex() {
        for (HwA node : tmap.getArch().getHwA()) {
maysam zoor's avatar
maysam zoor committed
            if (tmap.getLisMappedTasks(node).size() > 0) {
maysam zoor's avatar
maysam zoor committed
                nodeNbProgressBar = tmap.getLisMappedTasks(node).size() + nodeNbProgressBar;
maysam zoor's avatar
maysam zoor committed
                for (TMLTask task : tmap.getLisMappedTasks(node)) {
maysam zoor's avatar
maysam zoor committed
                    for (TMLActivityElement ae : task.getActivityDiagram().getElements()) {
maysam zoor's avatar
maysam zoor committed
                        if (ae.getName().equals("Stop after infinite loop")) {
maysam zoor's avatar
maysam zoor committed
                        } else {
                            nodeNbProgressBar++;
maysam zoor's avatar
maysam zoor committed
        for (HwNode node : tmap.getArch().getCPUs()) {
maysam zoor's avatar
maysam zoor committed
            if (tmap.getLisMappedTasks(node).size() > 0) {
maysam zoor's avatar
maysam zoor committed
                nodeNbProgressBar = tmap.getLisMappedTasks(node).size() + nodeNbProgressBar;
maysam zoor's avatar
maysam zoor committed
                for (TMLTask task : tmap.getLisMappedTasks(node)) {
maysam zoor's avatar
maysam zoor committed
                    for (TMLActivityElement ae : task.getActivityDiagram().getElements()) {
maysam zoor's avatar
maysam zoor committed
                        if (ae.getName().equals("Stop after infinite loop")) {
maysam zoor's avatar
maysam zoor committed
                            nodeNbProgressBar++;

maysam zoor's avatar
maysam zoor committed
            }
        }
        HashSet<String> mappedcomm = new HashSet<String>();
maysam zoor's avatar
maysam zoor committed
        for (HwNode node : tmap.getArch().getBUSs()) {
maysam zoor's avatar
maysam zoor committed
            if (tmap.getLisMappedChannels(node).size() > 0) {
                for (TMLElement entry : tmap.getLisMappedChannels(node)) {

                    if (!mappedcomm.contains(entry.getName())) {
                        mappedcomm.add(entry.getName());
                        nodeNbProgressBar++;
maysam zoor's avatar
maysam zoor committed
        for (HwNode node : tmap.getArch().getHwBridge()) {
maysam zoor's avatar
maysam zoor committed
            if (tmap.getLisMappedChannels(node).size() > 0) {
maysam zoor's avatar
maysam zoor committed
                for (TMLElement entry : tmap.getLisMappedChannels(node)) {
                    if (!mappedcomm.contains(entry.getName())) {
                        mappedcomm.add(entry.getName());
                        nodeNbProgressBar++;
maysam zoor's avatar
maysam zoor committed
        for (HwNode node : tmap.getArch().getMemories()) {
maysam zoor's avatar
maysam zoor committed
            if (tmap.getLisMappedChannels(node).size() > 0) {
                for (TMLElement entry : tmap.getLisMappedChannels(node)) {
                    if (!mappedcomm.contains(entry.getName())) {
                        mappedcomm.add(entry.getName());
                        nodeNbProgressBar++;
maysam zoor's avatar
maysam zoor committed
        for (TMLChannel ch : tmap.getTMLModeling().getChannels()) {
maysam zoor's avatar
maysam zoor committed
            if (!mappedcomm.contains(ch.getName())) {
                mappedcomm.add(ch.getName());
maysam zoor's avatar
maysam zoor committed
                nodeNbProgressBar++;
maysam zoor's avatar
maysam zoor committed
    private void updatemainBar(String string) {
maysam zoor's avatar
maysam zoor committed
        nbOfNodes++;
maysam zoor's avatar
maysam zoor committed
        if (callingFrame == 0)
maysam zoor's avatar
maysam zoor committed
        {
            frameLatencyDetailedAnalysis.updateBar(nbOfNodes);
        } else if (callingFrame == 1) {
maysam zoor's avatar
maysam zoor committed
            frameCompareLatencyDetail.updateBar(nbOfNodes);
maysam zoor's avatar
maysam zoor committed
    public HashMap<String, HashSet<String>> getCPUTaskMap(HashMap<String, HashSet<TMLTask>> cpuTask) {
maysam zoor's avatar
maysam zoor committed
        HashMap<String, HashSet<String>> cpuTaskMap = new HashMap<String, HashSet<String>>();
        if (tmap == null) {
            return cpuTaskMap;
        }
maysam zoor's avatar
maysam zoor committed
        for (Entry<String, HashSet<TMLTask>> entry : cpuTask.entrySet()) {
maysam zoor's avatar
maysam zoor committed
            String key = entry.getKey();
            int keyID = cpuIDs.get(key);
maysam zoor's avatar
maysam zoor committed
            HashSet<TMLTask> value = entry.getValue();
            Vector<TMLActivityElement> multiNexts = new Vector<TMLActivityElement>();
maysam zoor's avatar
maysam zoor committed
            // Map <String, String> sendEvt;
            sendEvt = new HashMap<String, List<String>>();
            waitEvt = new HashMap<String, List<String>>();
maysam zoor's avatar
maysam zoor committed
            sendData = new HashMap<String, String>();
            receiveData = new HashMap<String, String>();
maysam zoor's avatar
maysam zoor committed
            // HashMap<String, List<String>> sendEvt = new HashMap<String, List<String>>();
maysam zoor's avatar
maysam zoor committed
            // GEt List of all requests
maysam zoor's avatar
maysam zoor committed
            requestedTask(value);
maysam zoor's avatar
maysam zoor committed
            for (TMLTask task : value) {
                int taskID = task.getID();
                String taskName = task.getName();
                // get the names and params of send events per task and their corresponding wait
                // events
maysam zoor's avatar
maysam zoor committed
                taskAc = task;
maysam zoor's avatar
maysam zoor committed
                sendEventsNames();
maysam zoor's avatar
maysam zoor committed
                // get the names of read channels per task and their corresponding write
                // channels
maysam zoor's avatar
maysam zoor committed
                readChannelNames();

                // get the names of write channels per task and their corresponding read
                // channels

maysam zoor's avatar
maysam zoor committed
                writeChannelNames();
maysam zoor's avatar
maysam zoor committed
                // get the names and params of wait events per task and their corresponding send
                // events
                waitEventNames();
maysam zoor's avatar
maysam zoor committed
                // add the name of the task as a vertex
maysam zoor's avatar
maysam zoor committed
                if (!g.vertexSet().contains(getvertex(key))) {
                    g.addVertex(vertex(key, keyID));
                    updatemainBar(key);
                }
                if (!g.vertexSet().contains(getvertex(taskName))) {
                    g.addVertex(vertex(taskName, taskID));
                    updatemainBar(taskName);
                }
maysam zoor's avatar
maysam zoor committed
                g.addEdge(getvertex(key), getvertex(taskName));
maysam zoor's avatar
maysam zoor committed
                activity = task.getActivityDiagram();
                opCount = 1;
                currentElement = activity.getFirst();
                taskStartName = "";
                // int taskStartid;
maysam zoor's avatar
maysam zoor committed
                forLoopNextValues = new HashMap<String, List<String>>();
maysam zoor's avatar
maysam zoor committed
                // loop over all the activites corresponding to a task
                while (opCount <= activity.nElements()) {
maysam zoor's avatar
maysam zoor committed
                    String eventName = null;
maysam zoor's avatar
maysam zoor committed
                    // int eventid = currentElement.getID();
maysam zoor's avatar
maysam zoor committed
                    if (currentElement.getName().equals("Stop after infinite loop")) {
                        opCount++;
maysam zoor's avatar
maysam zoor committed
                        if (opCount <= activity.nElements()) {
                            if (currentElement.getNexts().size() == 1) {

                                currentElement = currentElement.getNexts().firstElement();

                            } else if (!multiNexts.isEmpty()) {
                                currentElement = multiNexts.get(0);
maysam zoor's avatar
maysam zoor committed
                                multiNexts.remove(0);
maysam zoor's avatar
maysam zoor committed
                            continue;
                        } else {
                            break;
                        }
                    } else if (currentElement.getName().equals("startOfFork") || currentElement.getName().equals("junctionOfFork")
                            || currentElement.getName().equals("startOfJoin") || currentElement.getName().equals("junctionOfJoin")) {
                        opCount++;
maysam zoor's avatar
maysam zoor committed
                        currentElement = currentElement.getNexts().firstElement();
maysam zoor's avatar
maysam zoor committed
                        continue;
                    } else if (taskName.startsWith("FORKTASK_S_") && currentElement.getName().equals("ReadOfFork")) {
maysam zoor's avatar
maysam zoor committed
                        String name = ((TMLReadChannel) (currentElement)).getChannel(0).getName();
                        int id = ((TMLReadChannel) (currentElement)).getChannel(0).getID();
                        if (!g.containsVertex(getvertex(name))) {
                            g.addVertex(vertex(name, id));
maysam zoor's avatar
maysam zoor committed
                        g.addEdge(getvertex(taskName), getvertex(((TMLReadChannel) (currentElement)).getChannel(0).getName()));
maysam zoor's avatar
maysam zoor committed
                        HashSet<String> readForkVertex = new HashSet<String>();
                        readForkVertex.add(((TMLReadChannel) (currentElement)).getChannel(0).getName());
maysam zoor's avatar
maysam zoor committed
                        if (forkreadEdges.containsKey(taskName)) {
maysam zoor's avatar
maysam zoor committed
                            if (!forkreadEdges.get(taskName).contains(((TMLReadChannel) (currentElement)).getChannel(0).getName())) {
                                forkreadEdges.get(taskName).add(((TMLReadChannel) (currentElement)).getChannel(0).getName());
                            }
maysam zoor's avatar
maysam zoor committed
                        } else {
maysam zoor's avatar
maysam zoor committed
                            forkreadEdges.put(taskName, readForkVertex);
maysam zoor's avatar
maysam zoor committed
                        opCount++;
maysam zoor's avatar
maysam zoor committed
                        currentElement = currentElement.getNexts().firstElement();
maysam zoor's avatar
maysam zoor committed
                        continue;
maysam zoor's avatar
maysam zoor committed
                    } else if (taskName.startsWith("FORKTASK_S_") && currentElement.getName().startsWith("WriteOfFork_S")) {
maysam zoor's avatar
maysam zoor committed
                        String vName = ((TMLWriteChannel) (currentElement)).getChannel(0).getName();
                        int vid = ((TMLWriteChannel) (currentElement)).getChannel(0).getID();
maysam zoor's avatar
maysam zoor committed
                        vertex v = getvertex(vName);
                        if (!g.containsVertex(v)) {
                            g.addVertex(vertex(vName, vid));
maysam zoor's avatar
maysam zoor committed
                        }

                        HashSet<String> writeForkVertex = new HashSet<String>();
                        writeForkVertex.add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());

                        if (forkwriteEdges.containsKey(taskName)) {

                            if (!forkwriteEdges.get(taskName).contains(((TMLWriteChannel) (currentElement)).getChannel(0).getName())) {
                                forkwriteEdges.get(taskName).add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());
maysam zoor's avatar
maysam zoor committed
                            forkwriteEdges.put(taskName, writeForkVertex);

maysam zoor's avatar
maysam zoor committed
                        // g.addEdge(getvertex(taskName),getvertex(((TMLWriteChannel)(currentElement)).getChannel(0).getName()));
maysam zoor's avatar
maysam zoor committed
                        opCount++;
maysam zoor's avatar
maysam zoor committed
                        currentElement = currentElement.getNexts().firstElement();
maysam zoor's avatar
maysam zoor committed
                        continue;
maysam zoor's avatar
maysam zoor committed
                    } else if (currentElement.getName().equals("stopOfFork") || currentElement.getName().equals("stop2OfFork")
                            || currentElement.getName().equals("stopOfJoin")) {
                        opCount++;
maysam zoor's avatar
maysam zoor committed
                        continue;
                    } else if (taskName.startsWith("JOINTASK_S_") && currentElement.getName().startsWith("ReadOfJoin")) {
maysam zoor's avatar
maysam zoor committed
                        String vName = ((TMLReadChannel) (currentElement)).getChannel(0).getName();
                        int vid = ((TMLReadChannel) (currentElement)).getChannel(0).getID();
maysam zoor's avatar
maysam zoor committed
                        if (!g.containsVertex(getvertex(vName))) {
                            g.addVertex(vertex(vName, vid));
maysam zoor's avatar
maysam zoor committed
                        HashSet<String> writeForkVertex = new HashSet<String>();
                        writeForkVertex.add(((TMLReadChannel) (currentElement)).getChannel(0).getName());
maysam zoor's avatar
maysam zoor committed
                        if (joinreadEdges.containsKey(taskName)) {
maysam zoor's avatar
maysam zoor committed
                            if (!joinreadEdges.get(taskName).contains(((TMLReadChannel) (currentElement)).getChannel(0).getName())) {
                                joinreadEdges.get(task.getName()).add(((TMLReadChannel) (currentElement)).getChannel(0).getName());
                            }
maysam zoor's avatar
maysam zoor committed
                        } else {
maysam zoor's avatar
maysam zoor committed
                            joinreadEdges.put(taskName, writeForkVertex);
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
                        // g.addEdge(getvertex(task.getName()),getvertex(((TMLWriteChannel)(currentElement)).getChannel(0).getName()));
maysam zoor's avatar
maysam zoor committed
                        opCount++;
maysam zoor's avatar
maysam zoor committed
                        currentElement = currentElement.getNexts().firstElement();
maysam zoor's avatar
maysam zoor committed
                        continue;
                    } else if (taskName.startsWith("JOINTASK_S_") && currentElement.getName().equals("WriteOfJoin")) {
maysam zoor's avatar
maysam zoor committed
                        String vName = ((TMLWriteChannel) (currentElement)).getChannel(0).getName();
                        int vid = ((TMLWriteChannel) (currentElement)).getChannel(0).getID();
maysam zoor's avatar
maysam zoor committed
                        if (!g.containsVertex(getvertex(vName))) {
                            g.addVertex(vertex(vName, vid));
maysam zoor's avatar
maysam zoor committed
                        g.addEdge(getvertex(taskName), getvertex(((TMLWriteChannel) (currentElement)).getChannel(0).getName()));
maysam zoor's avatar
maysam zoor committed
                        HashSet<String> readForkVertex = new HashSet<String>();
                        readForkVertex.add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());
maysam zoor's avatar
maysam zoor committed
                        if (joinwriteEdges.containsKey(taskName)) {
maysam zoor's avatar
maysam zoor committed
                            if (!joinwriteEdges.get(taskName).contains(((TMLWriteChannel) (currentElement)).getChannel(0).getName())) {
                                joinwriteEdges.get(taskName).add(((TMLWriteChannel) (currentElement)).getChannel(0).getName());
maysam zoor's avatar
maysam zoor committed

                            joinwriteEdges.put(taskName, readForkVertex);

maysam zoor's avatar
maysam zoor committed

                        opCount++;

                        currentElement = currentElement.getNexts().firstElement();

                        continue;

maysam zoor's avatar
maysam zoor committed
                    }

                    updatemainBar(eventName);

                    if (currentElement.getNexts().size() > 1) {
                        for (TMLActivityElement ae : currentElement.getNexts()) {
                            multiNexts.add(ae);
maysam zoor's avatar
maysam zoor committed
                    eventName = getEventName(taskName, currentElement);
maysam zoor's avatar
maysam zoor committed
                    // in case an end was encountered , the previous activities should be checked:
                    // in
                    // case it is an end for a loop or sequence speavial edges should be added
maysam zoor's avatar
maysam zoor committed
                    if (currentElement.getReferenceObject() instanceof TMLADStopState) {
maysam zoor's avatar
maysam zoor committed
                        addStopVertex(taskName);
maysam zoor's avatar
maysam zoor committed
                    // start activity is added as a vertex
                    if (currentElement.getReferenceObject() instanceof TMLADStartState) {

                        addStartVertex(taskName);
maysam zoor's avatar
maysam zoor committed
                    }

                    // the below activities are added as vertex with the required edges
                    // these activities can be used to check later for latency

                    else if (currentElement.getReferenceObject() instanceof TMLADSendEvent
                            || currentElement.getReferenceObject() instanceof TMLADWaitEvent
                            || currentElement.getReferenceObject() instanceof TMLADForLoop
                            || currentElement.getReferenceObject() instanceof TMLADForStaticLoop
                            || currentElement.getReferenceObject() instanceof TMLADChoice
                            || currentElement.getReferenceObject() instanceof TMLADForEverLoop
                            || (currentElement.getReferenceObject() instanceof TMLADExecI && !currentElement.getValue().equals("0"))
                            || (currentElement.getReferenceObject() instanceof TMLADExecC && !currentElement.getValue().equals("0"))
                            || (currentElement.getReferenceObject() instanceof TMLADDelay
                                    && !((TMLADDelay) currentElement.getReferenceObject()).getDelayValue().equals("0"))
                            || currentElement.getReferenceObject() instanceof TMLADSendRequest
                            || currentElement.getReferenceObject() instanceof TMLADReadRequestArg
                            || currentElement.getReferenceObject() instanceof TMLADActionState
                            || (currentElement.getReferenceObject() instanceof TMLADDelayInterval
                                    && !((TMLADDelayInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                                    && !((TMLADDelayInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                            || (currentElement.getReferenceObject() instanceof TMLADExecCInterval
                                    && !((TMLADExecCInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                                    && !((TMLADExecCInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                            || (currentElement.getReferenceObject() instanceof TMLADExecIInterval
                                    && !((TMLADExecIInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                                    && !((TMLADExecIInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                            || currentElement.getReferenceObject() instanceof TMLADNotifiedEvent
                            || currentElement.getReferenceObject() instanceof TMLADRandom
                            || currentElement.getReferenceObject() instanceof TMLADReadChannel
                            || currentElement.getReferenceObject() instanceof TMLADWriteChannel
                            || currentElement.getReferenceObject() instanceof TMLADSequence
                            || currentElement.getReferenceObject() instanceof TMLADUnorderedSequence
                            || currentElement.getReferenceObject() instanceof TMLADSelectEvt
                            || currentElement.getReferenceObject() instanceof TMLADDecrypt
                            || currentElement.getReferenceObject() instanceof TMLADEncrypt) {

                        addcurrentElementVertex(taskName, taskStartName);

                    }

                    // check if the next activity :add to an array:
                    // in case of for loop : the first element of inside/outside branches of loop
                    // in case of sequence: add first element of all branches

                    if (currentElement.getNexts().size() == 1) {

                        currentElement = currentElement.getNexts().firstElement();

maysam zoor's avatar
maysam zoor committed
                    } else if (!multiNexts.isEmpty()) {
maysam zoor's avatar
maysam zoor committed

                        trackMultiNexts(taskName, eventName);
maysam zoor's avatar
maysam zoor committed
                        currentElement = multiNexts.get(0);
maysam zoor's avatar
maysam zoor committed
                        multiNexts.remove(0);
maysam zoor's avatar
maysam zoor committed
                    allForLoopNextValues.putAll(forLoopNextValues);
maysam zoor's avatar
maysam zoor committed
            }

        }

        return cpuTaskMap;
    }

    private void trackMultiNexts(String taskName, String eventName) {
        // TODO Auto-generated method stub
maysam zoor's avatar
maysam zoor committed
        if (currentElement.getReferenceObject() instanceof TMLADForStaticLoop || currentElement.getReferenceObject() instanceof TMLADForLoop) {
maysam zoor's avatar
maysam zoor committed

            if (currentElement.getNexts().size() > 1) {

                List<TGConnectingPoint> points = new ArrayList<TGConnectingPoint>();
                List<TGConnector> getOutputConnectors = new ArrayList<TGConnector>();
                if (currentElement.getReferenceObject() instanceof TMLADForStaticLoop) {
                    points = Arrays.asList(((TMLADForStaticLoop) (currentElement.getReferenceObject())).getConnectingPoints());

                    getOutputConnectors = ((TMLADForStaticLoop) (currentElement.getReferenceObject())).getOutputConnectors();

                    String loopValue = ((TMLADForStaticLoop) (currentElement.getReferenceObject())).getValue();

                    getvertex(eventName).setType(vertex.TYPE_STATIC_FOR_LOOP);

                    if ((loopValue != null) && (loopValue.length() > 0)) {

                        if ((loopValue.matches("\\d*"))) {
                            getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
maysam zoor's avatar
maysam zoor committed
                            for (TMLAttribute att : taskAc.getAttributes()) {
maysam zoor's avatar
maysam zoor committed
                                if (loopValue.contains(att.getName())) {
                                    loopValue = loopValue.replace(att.getName(), (att.getInitialValue()));
                                }

                            }
                            getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
maysam zoor's avatar
maysam zoor committed
                } else if (currentElement.getReferenceObject() instanceof TMLADForLoop) {
                    points = Arrays.asList(((TMLADForLoop) (currentElement.getReferenceObject())).getConnectingPoints());
maysam zoor's avatar
maysam zoor committed
                    getOutputConnectors = ((TMLADForLoop) (currentElement.getReferenceObject())).getOutputConnectors();
                    // String loopValue = ((TMLADForLoop)
                    // (currentElement.getReferenceObject())).getValue();
maysam zoor's avatar
maysam zoor committed
                    getvertex(eventName).setType(vertex.TYPE_FOR_LOOP);
                    String cond = ((TMLADForLoop) (currentElement.getReferenceObject())).getCondition();
maysam zoor's avatar
maysam zoor committed
                    if (cond.contains("<=")) {
maysam zoor's avatar
maysam zoor committed
                        String[] val = cond.split("<=");
maysam zoor's avatar
maysam zoor committed
                        String loopValue = val[2].toString();
                        if ((loopValue != null) && (loopValue.length() > 0)) {
maysam zoor's avatar
maysam zoor committed
                            if ((loopValue.matches("\\d*"))) {
                                getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
                            } else {
                                for (TMLAttribute att : taskAc.getAttributes()) {
maysam zoor's avatar
maysam zoor committed
                                    if (loopValue.contains(att.getName())) {
                                        loopValue = loopValue.replace(att.getName(), (att.getInitialValue()));
                                    }
maysam zoor's avatar
maysam zoor committed
                                }

                                getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
maysam zoor's avatar
maysam zoor committed
                    } else if (cond.contains("<")) {

                        String[] val = cond.split("<");

                        String loopValue = val[1].toString();
                        if ((loopValue != null) && (loopValue.length() > 0)) {

                            if ((loopValue.matches("\\d*"))) {
                                getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
                            } else {
                                for (TMLAttribute att : taskAc.getAttributes()) {

                                    if (loopValue.contains(att.getName())) {
                                        loopValue = loopValue.replace(att.getName(), (att.getInitialValue()));
                                    }

                                }
                                if ((loopValue.matches("\\d*"))) {
                                    getvertex(eventName).setTaintFixedNumber(Integer.valueOf(loopValue));
                                }
                                {
maysam zoor's avatar
maysam zoor committed
                                    frameLatencyDetailedAnalysis.error(loopValue + " Expression in For Loop is not supported by Tainting");
maysam zoor's avatar
maysam zoor committed
                TGConnector inputConnector = null, outputConnector = null;
maysam zoor's avatar
maysam zoor committed
                for (TGConnector connector : getOutputConnectors) {
maysam zoor's avatar
maysam zoor committed
                    if (connector.getTGConnectingPointP1() == points.get(1)) {
                        inputConnector = connector;
maysam zoor's avatar
maysam zoor committed
                    } else if (connector.getTGConnectingPointP1() == points.get(2)) {
                        outputConnector = connector;
                    }
maysam zoor's avatar
maysam zoor committed
                List<String> afterloopActivity = new ArrayList<String>(2);

                String insideLoop = "", outsideLoop = "";

                for (TMLActivityElement ae : currentElement.getNexts()) {
maysam zoor's avatar
maysam zoor committed
                    List<TGConnector> cg = (((TGComponent) ae.getReferenceObject()).getInputConnectors());

                    for (TGConnector afterloopcg : cg) {

                        if (afterloopcg == inputConnector) {

                            if (ae.getReferenceObject() instanceof TMLADRandom) {

                                insideLoop = taskName + "__" + ae.getName() + "__" + ae.getID();

                            } else if (ae.getReferenceObject() instanceof TMLADUnorderedSequence) {

                                insideLoop = taskName + "__" + "unOrderedSequence" + "__" + ae.getID();

                            } else {

                                insideLoop = taskName + "__" + ae.getReferenceObject().toString() + "__" + ae.getID();
maysam zoor's avatar
maysam zoor committed
                        } else if (afterloopcg == outputConnector) {
maysam zoor's avatar
maysam zoor committed
                            if (ae.getReferenceObject() instanceof TMLADRandom) {

                                outsideLoop = taskName + "__" + ae.getName() + "__" + ae.getID();

                            } else if (ae.getReferenceObject() instanceof TMLADUnorderedSequence) {

                                outsideLoop = taskName + "__" + "unOrderedSequence" + "__" + ae.getID();

                            } else {

                                outsideLoop = taskName + "__" + ae.getReferenceObject().toString() + "__" + ae.getID();

                            }
maysam zoor's avatar
maysam zoor committed
                afterloopActivity.add(0, insideLoop);
                afterloopActivity.add(1, outsideLoop);
                forLoopNextValues.put(eventName, afterloopActivity);
maysam zoor's avatar
maysam zoor committed
        } else if (currentElement.getReferenceObject() instanceof TMLADSequence) {
maysam zoor's avatar
maysam zoor committed
            getvertex(eventName).setType(vertex.TYPE_SEQ);
            getvertex(eventName).setTaintFixedNumber(1);
            String nextEventName = "";
maysam zoor's avatar
maysam zoor committed
            for (TMLActivityElement seqListnextElement : currentElement.getNexts()) {
                if (seqListnextElement.getReferenceObject() instanceof TMLADRandom) {
                    nextEventName = taskName + "__" + seqListnextElement.getName() + "__" + seqListnextElement.getID();

                } else if (seqListnextElement.getReferenceObject() instanceof TMLADUnorderedSequence) {

                    nextEventName = taskName + "__" + "unOrderedSequence" + "__" + seqListnextElement.getID();

                } else {
maysam zoor's avatar
maysam zoor committed
                    nextEventName = taskName + "__" + seqListnextElement.getReferenceObject().toString() + "__" + seqListnextElement.getID();
maysam zoor's avatar
maysam zoor committed

                }

                if (orderedSequenceList.containsKey(eventName)) {
                    if (!orderedSequenceList.get(eventName).contains(nextEventName)) {
                        orderedSequenceList.get(eventName).add(nextEventName);
                    }
                } else {
                    ArrayList<String> seqListNextValues = new ArrayList<String>();
                    seqListNextValues.add(nextEventName);
                    orderedSequenceList.put(eventName, seqListNextValues);
                }

            }

        } else if (currentElement.getReferenceObject() instanceof TMLADUnorderedSequence) {

            getvertex(eventName).setType(vertex.TYPE_UNORDER_SEQ);
            getvertex(eventName).setTaintFixedNumber(1);

            String nextEventName = "";

            for (TMLActivityElement seqListnextElement : currentElement.getNexts()) {
                if (seqListnextElement.getReferenceObject() instanceof TMLADRandom) {
                    nextEventName = taskName + "__" + seqListnextElement.getName() + "__" + seqListnextElement.getID();

                } else if (seqListnextElement.getReferenceObject() instanceof TMLADUnorderedSequence) {

                    nextEventName = taskName + "__" + "unOrderedSequence" + "__" + seqListnextElement.getID();

                } else {
maysam zoor's avatar
maysam zoor committed
                    nextEventName = taskName + "__" + seqListnextElement.getReferenceObject().toString() + "__" + seqListnextElement.getID();
maysam zoor's avatar
maysam zoor committed

                }

                if (unOrderedSequenceList.containsKey(eventName)) {
                    if (!unOrderedSequenceList.get(eventName).contains(nextEventName)) {
                        unOrderedSequenceList.get(eventName).add(nextEventName);
                    }
                } else {
                    ArrayList<String> seqListNextValues = new ArrayList<String>();
                    seqListNextValues.add(nextEventName);
                    unOrderedSequenceList.put(eventName, seqListNextValues);
                }

            }

        }

        List<TGConnector> cg = (((TGComponent) currentElement.getReferenceObject()).getInputConnectors());

    }

    private void addStartVertex(String taskName) {
        // TODO Auto-generated method stub
        taskStartName = taskName + "__" + currentElement.getName() + "__" + currentElement.getID();
        vertex startv = vertex(taskStartName, currentElement.getID());

        g.addVertex(startv);
        // gVertecies.add(vertex(taskStartName));
        getvertex(taskStartName).setType(vertex.TYPE_START);
        getvertex(taskStartName).setTaintFixedNumber(1);
        g.addEdge(getvertex(taskName), getvertex(taskStartName));

        opCount++;

        if (!nameIDTaskList.containsKey(currentElement.getID())) {
            nameIDTaskList.put(String.valueOf(currentElement.getID()), taskStartName);

        }
    }

    private void waitEventNames() {
        // TODO Auto-generated method stub
        for (TMLWaitEvent waitEvent : taskAc.getWaitEvents()) {
            // TMLCPrimitivePort portdetails = waitEvent.getEvent().port;
            TMLCPrimitivePort sendingPortdetails = waitEvent.getEvent().port;
            TMLCPrimitivePort receivePortdetails = waitEvent.getEvent().port2;

            if (!sendingPortdetails.isBlocking()) {
                warnings.add(
                        "send event port:" + sendingPortdetails.getPortName() + " is non-blocking. Use tainting for an accurate latency analysis");
            }
            if (sendingPortdetails.isFinite()) {
                warnings.add("send event port:" + sendingPortdetails.getPortName() + " is Finite. Event lost is not supported in latency analysis ");
            }
            String receivePortparams = waitEvent.getAllParams();

            // tmlcdp.tmlctdp.getAllPortsConnectedTo(portdetails);

            waitEvt.put("waitevent:" + receivePortdetails.getPortName() + "(" + receivePortparams + ")", new ArrayList<String>());

            TMLTask originTasks = waitEvent.getEvent().getOriginTask();

            for (TMLSendEvent wait_sendEvent : originTasks.getSendEvents()) {

                String sendingPortparams = wait_sendEvent.getAllParams();

                waitEvt.get("waitevent:" + receivePortdetails.getPortName() + "(" + receivePortparams + ")")
                        .add("sendevent:" + sendingPortdetails.getPortName() + "(" + sendingPortparams + ")");

            }

        }

    }

    private void writeChannelNames() {
        // TODO Auto-generated method stub

        for (TMLWriteChannel writeChannel : taskAc.getWriteChannels()) {

            int i = writeChannel.getNbOfChannels();

            for (int j = 0; j < i; j++) {

                String sendingDataPortdetails = "";
                String receiveDataPortdetails = "";

                if ((writeChannel.getChannel(j)).originalDestinationTasks.size() > 0) {
                    String[] checkchannel;

                    if (writeChannel.getChannel(j).getOriginPort().getName().contains("FORKPORTORIGIN")) {

                        checkchannel = writeChannel.getChannel(j).getOriginPort().getName().split("_S_");

                        if (checkchannel.length > 2) {
                            sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName().replace("FORKPORTORIGIN", "FORKCHANNEL");
                            ;

                        } else if (checkchannel.length < 2) {

                            sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName().replace("FORKPORTORIGIN", "");
                            ;

                            sendingDataPortdetails = sendingDataPortdetails.replace("_S_", "");
                            ;

                        }

                    } else if (writeChannel.getChannel(j).getOriginPort().getName().contains("JOINPORTORIGIN")) {

                        checkchannel = writeChannel.getChannel(j).getOriginPort().getName().split("_S_");

                        if (checkchannel.length > 2) {
maysam zoor's avatar
maysam zoor committed
                            sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName().replace("JOINPORTORIGIN", "JOINCHANNEL");
maysam zoor's avatar
maysam zoor committed
                        } else if (checkchannel.length <= 2) {
                            sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName().replace("JOINPORTORIGIN", "");
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
                            sendingDataPortdetails = sendingDataPortdetails.replace("_S_", "");
                            ;
maysam zoor's avatar
maysam zoor committed
                    } else {
                        sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName();
maysam zoor's avatar
maysam zoor committed
                    if (writeChannel.getChannel(j).getDestinationPort().getName().contains("FORKPORTDESTINATION")) {
maysam zoor's avatar
maysam zoor committed
                        checkchannel = writeChannel.getChannel(j).getDestinationPort().getName().split("_S_");
maysam zoor's avatar
maysam zoor committed
                        if (checkchannel.length > 2) {
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName().replace("FORKPORTDESTINATION",
                                    "FORKCHANNEL");
                        } else if (checkchannel.length <= 2) {
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName().replace("FORKPORTDESTINATION", "");
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = receiveDataPortdetails.replace("_S_", "");
maysam zoor's avatar
maysam zoor committed

maysam zoor's avatar
maysam zoor committed
                    } else if (writeChannel.getChannel(j).getDestinationPort().getName().contains("JOINPORTDESTINATION")) {
maysam zoor's avatar
maysam zoor committed
                        checkchannel = writeChannel.getChannel(j).getDestinationPort().getName().split("_S_");
maysam zoor's avatar
maysam zoor committed
                        if (checkchannel.length > 2) {
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = "JOINCHANNEL_S_" + checkchannel[1] + "__" + checkchannel[2];
maysam zoor's avatar
maysam zoor committed
                        } else if (checkchannel.length <= 2) {
                            receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName().replace("JOINPORTDESTINATION", "");
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = receiveDataPortdetails.replace("_S_", "");
                        }
maysam zoor's avatar
maysam zoor committed
                    } else {
                        receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName();
maysam zoor's avatar
maysam zoor committed
                } else {
maysam zoor's avatar
maysam zoor committed
                    // writeChannel.getChannel(j);
                    sendingDataPortdetails = writeChannel.getChannel(j).getOriginPort().getName();
                    receiveDataPortdetails = writeChannel.getChannel(j).getDestinationPort().getName();
                }
maysam zoor's avatar
maysam zoor committed
                if (!sendingDataPortdetails.equals(receiveDataPortdetails)) {
maysam zoor's avatar
maysam zoor committed
                    sendData.put(sendingDataPortdetails, receiveDataPortdetails);
                }
maysam zoor's avatar
maysam zoor committed
    private void readChannelNames() {
        // TODO Auto-generated method stub
maysam zoor's avatar
maysam zoor committed
        for (TMLReadChannel readChannel : taskAc.getReadChannels()) {
maysam zoor's avatar
maysam zoor committed
            int i = readChannel.getNbOfChannels();
maysam zoor's avatar
maysam zoor committed
            // name = _ch.getOriginPorts().get(0).getName(); //return the name of the source
            // port of the channel
maysam zoor's avatar
maysam zoor committed
            for (int j = 0; j < i; j++) {
maysam zoor's avatar
maysam zoor committed
                String sendingDataPortdetails = "";
                String receiveDataPortdetails = "";
maysam zoor's avatar
maysam zoor committed
                if ((readChannel.getChannel(j)).originalDestinationTasks.size() > 0) {
maysam zoor's avatar
maysam zoor committed
                    String[] checkchannel;
                    if (readChannel.getChannel(j).getOriginPort().getName().contains("FORKPORTORIGIN")) {
maysam zoor's avatar
maysam zoor committed
                        checkchannel = readChannel.getChannel(j).getOriginPort().getName().split("_S_");
maysam zoor's avatar
maysam zoor committed
                        if (checkchannel.length > 2) {
                            sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName().replace("FORKPORTORIGIN", "FORKCHANNEL");
maysam zoor's avatar
maysam zoor committed
                        } else if (checkchannel.length <= 2) {
maysam zoor's avatar
maysam zoor committed
                            sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName().replace("FORKPORTORIGIN", "");
maysam zoor's avatar
maysam zoor committed
                            sendingDataPortdetails = sendingDataPortdetails.replace("_S_", "");
                            ;
maysam zoor's avatar
maysam zoor committed
                    } else if (readChannel.getChannel(j).getOriginPort().getName().contains("JOINPORTORIGIN")) {
maysam zoor's avatar
maysam zoor committed
                        checkchannel = readChannel.getChannel(j).getOriginPort().getName().split("_S_");
maysam zoor's avatar
maysam zoor committed
                        if (checkchannel.length > 2) {
                            sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName().replace("JOINPORTORIGIN", "JOINCHANNEL");
maysam zoor's avatar
maysam zoor committed
                        } else if ((checkchannel.length) <= 2) {
                            sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName().replace("JOINPORTORIGIN", "");
maysam zoor's avatar
maysam zoor committed
                            sendingDataPortdetails = sendingDataPortdetails.replace("_S_", "");
maysam zoor's avatar
maysam zoor committed
                        }
                    } else {
                        sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName();
                    }
                    if (readChannel.getChannel(j).getDestinationPort().getName().contains("FORKPORTDESTINATION")) {
maysam zoor's avatar
maysam zoor committed
                        checkchannel = readChannel.getChannel(j).getDestinationPort().getName().split("_S_");
maysam zoor's avatar
maysam zoor committed
                        if (checkchannel.length > 2) {
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName().replace("FORKPORTDESTINATION",
                                    "FORKCHANNEL");
                        } else if (checkchannel.length <= 2) {
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName().replace("FORKPORTDESTINATION", "");
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = receiveDataPortdetails.replace("_S_", "");
                        }
maysam zoor's avatar
maysam zoor committed
                    } else if (readChannel.getChannel(j).getDestinationPort().getName().contains("JOINPORTDESTINATION")) {
maysam zoor's avatar
maysam zoor committed
                        checkchannel = readChannel.getChannel(j).getDestinationPort().getName().split("_S_");
maysam zoor's avatar
maysam zoor committed
                        if (checkchannel.length > 2) {
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName().replace("JOINPORTDESTINATION",
                                    "JOINCHANNEL");
                        } else if (checkchannel.length <= 2) {
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName().replace("JOINPORTDESTINATION", "");
maysam zoor's avatar
maysam zoor committed
                            receiveDataPortdetails = receiveDataPortdetails.replace("_S_", "");
                        }
                    } else {
                        receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName();
                    }
                } else {
maysam zoor's avatar
maysam zoor committed
                    sendingDataPortdetails = readChannel.getChannel(j).getOriginPort().getName();
                    receiveDataPortdetails = readChannel.getChannel(j).getDestinationPort().getName();
                }
maysam zoor's avatar
maysam zoor committed
                if (!sendingDataPortdetails.equals(receiveDataPortdetails)) {
                    receiveData.put(receiveDataPortdetails, sendingDataPortdetails);
maysam zoor's avatar
maysam zoor committed
                TMLCPrimitivePort sp = null, rp = null;
maysam zoor's avatar
maysam zoor committed
                if (readChannel.getChannel(j).getOriginPort().getReferenceObject() instanceof TMLCPrimitivePort) {
maysam zoor's avatar
maysam zoor committed
                    rp = (TMLCPrimitivePort) readChannel.getChannel(j).getOriginPort().getReferenceObject();
maysam zoor's avatar
maysam zoor committed
                if (readChannel.getChannel(j).getOriginPort().getReferenceObject() instanceof TMLCPrimitivePort) {
maysam zoor's avatar
maysam zoor committed
                    sp = (TMLCPrimitivePort) readChannel.getChannel(j).getDestinationPort().getReferenceObject();
maysam zoor's avatar
maysam zoor committed
                if (sp != null && rp != null) {
maysam zoor's avatar
maysam zoor committed
                    if (!sp.isBlocking() && !rp.isBlocking()) {
                        warnings.add("send data port:" + sp.getPortName() + " and read data port:" + rp.getPortName()
                                + " are non-blocking. Use tainting for an accurate latency analysis.");
maysam zoor's avatar
maysam zoor committed
    private void sendEventsNames() {
        // TODO Auto-generated method stub
        for (TMLSendEvent sendEvent : taskAc.getSendEvents()) {
            TMLCPrimitivePort sendingPortdetails = sendEvent.getEvent().port;
            TMLCPrimitivePort receivePortdetails = sendEvent.getEvent().port2;
maysam zoor's avatar
maysam zoor committed
            String sendingPortparams = sendEvent.getAllParams();
maysam zoor's avatar
maysam zoor committed
            TMLTask destinationTasks = sendEvent.getEvent().getDestinationTask();
maysam zoor's avatar
maysam zoor committed
            sendEvt.put("sendevent:" + sendingPortdetails.getPortName() + "(" + sendingPortparams + ")", new ArrayList<String>());
maysam zoor's avatar
maysam zoor committed
            for (TMLWaitEvent wait_sendEvent : destinationTasks.getWaitEvents()) {
                String receivePortparams = wait_sendEvent.getAllParams();
maysam zoor's avatar
maysam zoor committed
                sendEvt.get("sendevent:" + sendingPortdetails.getPortName() + "(" + sendingPortparams + ")")
                        .add("waitevent:" + receivePortdetails.getPortName() + "(" + receivePortparams + ")");
maysam zoor's avatar
maysam zoor committed
    private void requestedTask(HashSet<TMLTask> value) {
        // TODO Auto-generated method stub
        for (TMLTask task : value) {
maysam zoor's avatar
maysam zoor committed
            if (task.isRequested()) {
                TMLRequest requestToTask = task.getRequest();
maysam zoor's avatar
maysam zoor committed
                requestToTask.getReferenceObject();
maysam zoor's avatar
maysam zoor committed
                requestToTask.getDestinationTask();
maysam zoor's avatar
maysam zoor committed
                requestToTask.getOriginTasks().get(0);
maysam zoor's avatar
maysam zoor committed
                requestToTask.ports.get(0).getName();
                requestToTask.getExtendedName();
maysam zoor's avatar
maysam zoor committed
                String destinationRequest = requestToTask.getDestinationTask().getName() + "__"
                        + requestToTask.getDestinationTask().getActivityDiagram().get(0).getName() + "__"
                        + requestToTask.getDestinationTask().getActivityDiagram().get(0).getID();
maysam zoor's avatar
maysam zoor committed
                String destinationRequestName = requestToTask.getDestinationTask().getName();
maysam zoor's avatar
maysam zoor committed
                for (TMLTask originTask : requestToTask.getOriginTasks()) {
maysam zoor's avatar
maysam zoor committed
                    String requestOriginTaskName = originTask.getName();
maysam zoor's avatar
maysam zoor committed
                    if (requestsOriginDestination.containsKey(requestOriginTaskName)) {
                        if (!requestsOriginDestination.get(requestOriginTaskName).contains(destinationRequestName)) {
                            requestsOriginDestination.get(requestOriginTaskName).add(destinationRequestName);
                        }
                    } else {
                        ArrayList<String> destinationRequestNames = new ArrayList<String>();
                        destinationRequestNames.add(destinationRequestName);
                        requestsOriginDestination.put(requestOriginTaskName, destinationRequestNames);
                    }
maysam zoor's avatar
maysam zoor committed
                for (TMLCPrimitivePort requestsPort : requestToTask.ports) {
maysam zoor's avatar
maysam zoor committed
                    String requestsPortName = requestsPort.getPortName();
maysam zoor's avatar
maysam zoor committed
                    if (requestsPorts.containsKey(task.getName())) {
                        if (!requestsPorts.get(task.getName()).contains(requestsPortName)) {
                            requestsPorts.get(task.getName()).add(requestsPortName);
                        }
                    } else {
                        ArrayList<String> requestsPortNames = new ArrayList<String>();
                        requestsPortNames.add(requestsPortName);
                        requestsPorts.put(task.getName(), requestsPortNames);
                    }
maysam zoor's avatar
maysam zoor committed
                if (requestsDestination.containsKey(destinationRequestName)) {
                    if (!requestsDestination.get(destinationRequestName).contains(destinationRequest)) {
                        requestsDestination.get(destinationRequestName).add(destinationRequest);
                    }
                } else {
                    ArrayList<String> destinationRequestNames = new ArrayList<String>();
                    destinationRequestNames.add(destinationRequest);
                    requestsDestination.put(destinationRequestName, destinationRequestNames);
                }
maysam zoor's avatar
maysam zoor committed
    private void addcurrentElementVertex(String taskName, String taskStartName) {
        // TODO Auto-generated method stub
maysam zoor's avatar
maysam zoor committed
        String preEventName;
maysam zoor's avatar
maysam zoor committed
        int preEventid;
        String eventName = getEventName(taskName, currentElement);
maysam zoor's avatar
maysam zoor committed
        int eventid = currentElement.getID();
maysam zoor's avatar
maysam zoor committed
        if (activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADRandom) {
            preEventName = taskName + "__" + activity.getPrevious(currentElement).getName() + "__" + activity.getPrevious(currentElement).getID();
            preEventid = activity.getPrevious(currentElement).getID();
maysam zoor's avatar
maysam zoor committed
        } else if (activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADUnorderedSequence) {
maysam zoor's avatar
maysam zoor committed
            preEventName = taskName + "__" + "unOrderedSequence" + "__" + activity.getPrevious(currentElement).getID();
            preEventid = activity.getPrevious(currentElement).getID();
maysam zoor's avatar
maysam zoor committed
        } else {
            preEventName = taskName + "__" + activity.getPrevious(currentElement).getReferenceObject().toString() + "__"
                    + activity.getPrevious(currentElement).getID();
            preEventid = activity.getPrevious(currentElement).getID();
maysam zoor's avatar
maysam zoor committed
        if (((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADExecI
                || activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADExecC)
                && activity.getPrevious(currentElement).getValue().equals("0"))
                || ((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADDelay)
                        && ((TMLADDelay) activity.getPrevious(currentElement).getReferenceObject()).getDelayValue().equals("0"))
maysam zoor's avatar
maysam zoor committed
                || ((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADDelayInterval)
                        && (((TMLADDelayInterval) activity.getPrevious(currentElement).getReferenceObject()).getMinDelayValue().equals("0")
                                && ((TMLADDelayInterval) activity.getPrevious(currentElement).getReferenceObject()).getMaxDelayValue().equals("0")))
maysam zoor's avatar
maysam zoor committed
                || ((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADExecCInterval)
                        && (((TMLADExecCInterval) activity.getPrevious(currentElement).getReferenceObject()).getMinDelayValue().equals("0")
                                && ((TMLADExecCInterval) activity.getPrevious(currentElement).getReferenceObject()).getMaxDelayValue().equals("0"))
maysam zoor's avatar
maysam zoor committed
                        || ((activity.getPrevious(currentElement).getReferenceObject() instanceof TMLADExecIInterval)
                                && (((TMLADExecIInterval) activity.getPrevious(currentElement).getReferenceObject()).getMinDelayValue().equals("0")
                                        && ((TMLADExecIInterval) activity.getPrevious(currentElement).getReferenceObject()).getMaxDelayValue()
                                                .equals("0")))))
maysam zoor's avatar
maysam zoor committed
            if (activity.getPrevious(activity.getPrevious(currentElement)).getReferenceObject() instanceof TMLADRandom) {
                preEventName = taskName + "__" + activity.getPrevious(activity.getPrevious(currentElement)).getName() + "__"
                        + activity.getPrevious(activity.getPrevious(currentElement)).getID();
                preEventid = activity.getPrevious(activity.getPrevious(currentElement)).getID();
maysam zoor's avatar
maysam zoor committed
            } else if (activity.getPrevious(activity.getPrevious(currentElement)).getReferenceObject() instanceof TMLADUnorderedSequence) {
                preEventName = taskName + "__" + "unOrderedSequence" + "__" + activity.getPrevious(activity.getPrevious(currentElement)).getID();
                preEventid = activity.getPrevious(activity.getPrevious(currentElement)).getID();
maysam zoor's avatar
maysam zoor committed
            } else {
                preEventName = taskName + "__" + activity.getPrevious(activity.getPrevious(currentElement)).getReferenceObject().toString() + "__"
                        + activity.getPrevious(activity.getPrevious(currentElement)).getID();
                preEventid = activity.getPrevious(activity.getPrevious(currentElement)).getID();
maysam zoor's avatar
maysam zoor committed
        if (!nameIDTaskList.containsKey(currentElement.getID())) {
            nameIDTaskList.put(String.valueOf(currentElement.getID()), eventName);
        }
maysam zoor's avatar
maysam zoor committed
        if (g.containsVertex(getvertex(preEventName))) {
maysam zoor's avatar
maysam zoor committed
            vertex v = vertex(eventName, eventid);
maysam zoor's avatar
maysam zoor committed
            vertex preV = vertex(preEventName, preEventid);
maysam zoor's avatar
maysam zoor committed
            g.addVertex(v);
            // gVertecies.add(vertex(eventName));
maysam zoor's avatar
maysam zoor committed
            g.addEdge(preV, v);
            opCount++;
maysam zoor's avatar
maysam zoor committed
        } else if ((activity.getPrevious(currentElement).getName().equals("start")) && g.containsVertex(getvertex(taskStartName))) {
            vertex v = vertex(eventName, eventid);
maysam zoor's avatar
maysam zoor committed
            g.addVertex(v);
            // gVertecies.add(vertex(eventName));
            g.addEdge(getvertex(taskStartName), getvertex(eventName));
            opCount++;
maysam zoor's avatar
maysam zoor committed
        if (currentElement.getReferenceObject() instanceof TMLADSendEvent || currentElement.getReferenceObject() instanceof TMLADWaitEvent
                || currentElement.getReferenceObject() instanceof TMLADSendRequest
                || currentElement.getReferenceObject() instanceof TMLADNotifiedEvent
                || currentElement.getReferenceObject() instanceof TMLADReadChannel || currentElement.getReferenceObject() instanceof TMLADWriteChannel
                || (currentElement.getReferenceObject() instanceof TMLADExecI && !currentElement.getValue().equals("0"))
                || (currentElement.getReferenceObject() instanceof TMLADExecC && !currentElement.getValue().equals("0"))
                || (currentElement.getReferenceObject() instanceof TMLADDelay
                        && !((TMLADDelay) currentElement.getReferenceObject()).getDelayValue().equals("0"))
                || (currentElement.getReferenceObject() instanceof TMLADDelayInterval
                        && !((TMLADDelayInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                        && !((TMLADDelayInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))

                || (currentElement.getReferenceObject() instanceof TMLADExecCInterval
                        && !((TMLADExecCInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                        && ((TMLADExecCInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                || (currentElement.getReferenceObject() instanceof TMLADExecIInterval
                        && !((TMLADExecIInterval) currentElement.getReferenceObject()).getMinDelayValue().equals("0")
                        && !((TMLADExecIInterval) currentElement.getReferenceObject()).getMaxDelayValue().equals("0"))
                || currentElement.getReferenceObject() instanceof TMLADEncrypt || currentElement.getReferenceObject() instanceof TMLADDecrypt
                || currentElement.getReferenceObject() instanceof TMLADReadRequestArg) {

            allLatencyTasks.add(eventName);
            getvertex(eventName).setType(vertex.TYPE_TRANSACTION);
            getvertex(eventName).setTaintFixedNumber(1);

        } else if (currentElement.getReferenceObject() instanceof TMLADRandom) {
            getvertex(eventName).setType(vertex.TYPE_CTRL);
            getvertex(eventName).setTaintFixedNumber(1);
        } else if (currentElement.getReferenceObject() instanceof TMLADSelectEvt) {
            getvertex(eventName).setType(vertex.TYPE_CTRL);
            getvertex(eventName).setTaintFixedNumber(1);

        } else if (currentElement.getReferenceObject() instanceof TMLADActionState) {
            getvertex(eventName).setType(vertex.TYPE_CTRL);
            getvertex(eventName).setTaintFixedNumber(1);
maysam zoor's avatar
maysam zoor committed
        if (currentElement.getReferenceObject() instanceof TMLADForEverLoop) {
            forEverLoopList.add(eventName);
maysam zoor's avatar
maysam zoor committed
            getvertex(eventName).setType(vertex.TYPE_FOR_EVER_LOOP);
maysam zoor's avatar
maysam zoor committed
            getvertex(eventName).setTaintFixedNumber(Integer.MAX_VALUE);
maysam zoor's avatar
maysam zoor committed
        if (currentElement.getReferenceObject() instanceof TMLADChoice) {
maysam zoor's avatar
maysam zoor committed
            getvertex(eventName).setType(vertex.TYPE_CHOICE);
            getvertex(eventName).setTaintFixedNumber(1);
maysam zoor's avatar
maysam zoor committed
        if (currentElement.getReferenceObject() instanceof TMLADSendRequest) {
maysam zoor's avatar
maysam zoor committed
            if (requestsOriginDestination.containsKey(taskName)) {
maysam zoor's avatar
maysam zoor committed
                for (String destinationTask : requestsOriginDestination.get(taskName)) {
maysam zoor's avatar
maysam zoor committed
                    if (requestsPorts.containsKey(destinationTask)) {
maysam zoor's avatar
maysam zoor committed
                        for (String portNames : requestsPorts.get(destinationTask)) {
maysam zoor's avatar
maysam zoor committed
                            String[] requestName = currentElement.getReferenceObject().toString().split(":");
maysam zoor's avatar
maysam zoor committed
                            String[] portname = requestName[1].split("[(]");
maysam zoor's avatar
maysam zoor committed
                            if (portname[0].replaceAll(" ", "").equals(portNames.replaceAll(" ", ""))) {
maysam zoor's avatar
maysam zoor committed
                                for (String destinationTaskstartname : requestsDestination.get(destinationTask)) {

                                    if (requestEdges.containsKey(eventName)) {
maysam zoor's avatar
maysam zoor committed
                                        if (!requestEdges.get(eventName).contains(destinationTaskstartname)) {
                                            requestEdges.get(eventName).add(destinationTaskstartname);
maysam zoor's avatar
maysam zoor committed
                                    } else {

                                        HashSet<String> destinationTaskoriginstart = new HashSet<String>();
                                        destinationTaskoriginstart.add(destinationTaskstartname);

                                        requestEdges.put(eventName, destinationTaskoriginstart);
maysam zoor's avatar
maysam zoor committed
        if (currentElement.getReferenceObject() instanceof TMLADSendEvent) {
maysam zoor's avatar
maysam zoor committed
            if (sendEvt.containsKey(currentElement.getReferenceObject().toString().replaceAll(" ", ""))) {
maysam zoor's avatar
maysam zoor committed
                List<String> recieveEvt = sendEvt.get(currentElement.getReferenceObject().toString().replaceAll(" ", ""));
maysam zoor's avatar
maysam zoor committed
                for (vertex vertex : g.vertexSet()) {
maysam zoor's avatar
maysam zoor committed
                    String[] vertexName = vertex.toString().split("__");
maysam zoor's avatar
maysam zoor committed
                    for (String n : recieveEvt) {
maysam zoor's avatar
maysam zoor committed
                        if (vertexName.length >= 3) {
maysam zoor's avatar
maysam zoor committed
                            if ((n.replaceAll(" ", "").equals((vertexName[2].toString().replaceAll(" ", ""))))) {
maysam zoor's avatar
maysam zoor committed
                                HashSet<String> waitEventVertex = new HashSet<String>();
                                waitEventVertex.add(vertex.toString());
maysam zoor's avatar
maysam zoor committed
                                if (sendEventWaitEventEdges.containsKey(eventName)) {

                                    if (!sendEventWaitEventEdges.get(eventName).contains(vertex.toString())) {
                                        sendEventWaitEventEdges.get(eventName).add(vertex.toString());
maysam zoor's avatar
maysam zoor committed
                                } else {
maysam zoor's avatar
maysam zoor committed
                                    sendEventWaitEventEdges.put(eventName, waitEventVertex);
maysam zoor's avatar
maysam zoor committed
        if (currentElement.getReferenceObject() instanceof TMLADWaitEvent) {
maysam zoor's avatar
maysam zoor committed
            if (waitEvt.containsKey(currentElement.getReferenceObject().toString().replaceAll(" ", ""))) {
maysam zoor's avatar
maysam zoor committed
                List<String> sendevent = waitEvt.get(currentElement.getReferenceObject().toString().replaceAll(" ", ""));
maysam zoor's avatar
maysam zoor committed
                for (vertex vertex : g.vertexSet()) {
maysam zoor's avatar
maysam zoor committed
                    String[] vertexName = vertex.toString().split("__");
maysam zoor's avatar
maysam zoor committed
                    for (String n : sendevent) {
                        if (vertexName.length >= 3) {
maysam zoor's avatar
maysam zoor committed
                            if ((n.replaceAll(" ", "").equals((vertexName[2].toString().replaceAll(" ", ""))))) {
maysam zoor's avatar
maysam zoor committed
                                HashSet<String> waitEventVertex = new HashSet<String>();
                                waitEventVertex.add(eventName);
maysam zoor's avatar
maysam zoor committed
                                if (sendEventWaitEventEdges.containsKey(vertex.toString())) {
                                    if (!sendEventWaitEventEdges.get(vertex.toString()).contains(eventName)) {
maysam zoor's avatar
maysam zoor committed
                                        sendEventWaitEventEdges.get(vertex.toString()).add(eventName);
                                    }
maysam zoor's avatar
maysam zoor committed
                                } else {
maysam zoor's avatar
maysam zoor committed
                                    sendEventWaitEventEdges.put(vertex.toString(), waitEventVertex);
maysam zoor's avatar
maysam zoor committed
        if (currentElement.getReferenceObject() instanceof TMLADWriteChannel) {
maysam zoor's avatar
maysam zoor committed
            writeChannelTransactions.add(eventName);
maysam zoor's avatar
maysam zoor committed
            String[] name = eventName.split("__");
maysam zoor's avatar
maysam zoor committed
            String[] removewrite = name[2].split(":");
maysam zoor's avatar
maysam zoor committed
            String[] portname = removewrite[1].split("[(]");
maysam zoor's avatar
maysam zoor committed
            String chwriteName = (name[0] + "__" + portname[0]).replaceAll(" ", "");
maysam zoor's avatar
maysam zoor committed
            String portNameNoSpaces = portname[0].replaceAll(" ", "");
maysam zoor's avatar
maysam zoor committed
            if (sendData.containsKey(portNameNoSpaces)) {
                String sendDatachannels;
maysam zoor's avatar
maysam zoor committed
                if (((TMLWriteChannel) currentElement).getChannel(0).getName().contains("FORKCHANNEL")
                        || ((TMLWriteChannel) currentElement).getChannel(0).getDestinationTask().getName().startsWith("FORKTASK")
                        || ((TMLWriteChannel) currentElement).getChannel(0).getOriginTask().getName().startsWith("FORKTASK")
                        || ((TMLWriteChannel) currentElement).getChannel(0).getName().contains("JOINCHANNEL")
                        || ((TMLWriteChannel) currentElement).getChannel(0).getDestinationTask().getName().startsWith("JOINTASK")
                        || ((TMLWriteChannel) currentElement).getChannel(0).getOriginTask().getName().startsWith("JOINTASK")
maysam zoor's avatar
maysam zoor committed
                ) {
                    sendDatachannels = sendData.get(portNameNoSpaces);
                } else {
                    // sendDatachannels = name[0] + "__" + sendData.get(portNameNoSpaces) + "__" +
                    // name[0] + "__" + portNameNoSpaces;
                    sendDatachannels = name[0] + "__" + portNameNoSpaces + "__" + name[0] + "__" + sendData.get(portNameNoSpaces);
                }
maysam zoor's avatar
maysam zoor committed
                // String sendDatachannels = name[0] + "__" + portNameNoSpaces + "__" + name[0]
                // + "__" + sendData.get(portNameNoSpaces);

                // if (sendDatachannels.contains("FORKPORTORIGIN")) {
                // sendDatachannels= sendDatachannels.replace("FORKPORTORIGIN", "FORKCHANNEL");
//
                // }
maysam zoor's avatar
maysam zoor committed
                HashSet<String> writeChVertex = new HashSet<String>();
                writeChVertex.add(sendDatachannels);
maysam zoor's avatar
maysam zoor committed
                if (writeReadChannelEdges.containsKey(eventName)) {

                    if (!writeReadChannelEdges.get(eventName).contains(sendDatachannels)) {
                        writeReadChannelEdges.get(eventName).add(sendDatachannels);
maysam zoor's avatar
maysam zoor committed
                } else {
maysam zoor's avatar
maysam zoor committed
                    writeReadChannelEdges.put(eventName, writeChVertex);
maysam zoor's avatar
maysam zoor committed
                }
                // getvertex(sendDatachannels).setTaintFixedNumber(getvertex(sendDatachannels).getTaintFixedNumber()
                // + 1);

            }
maysam zoor's avatar
maysam zoor committed
            else {
                HashSet<String> writeChVertex = new HashSet<String>();
                writeChVertex.add(chwriteName);
maysam zoor's avatar
maysam zoor committed
                if (writeReadChannelEdges.containsKey(eventName)) {
maysam zoor's avatar
maysam zoor committed
                    if (!writeReadChannelEdges.get(eventName).contains(chwriteName)) {
                        writeReadChannelEdges.get(eventName).add(chwriteName);
maysam zoor's avatar
maysam zoor committed
                } else {
maysam zoor's avatar
maysam zoor committed
                    writeReadChannelEdges.put(eventName, writeChVertex);
maysam zoor's avatar
maysam zoor committed
                // getvertex(chwriteName).setTaintFixedNumber(getvertex(chwriteName).getTaintFixedNumber()
                // + 1);
            }
maysam zoor's avatar
maysam zoor committed
        if (currentElement.getReferenceObject() instanceof TMLADReadChannel) {
maysam zoor's avatar
maysam zoor committed
            readChannelTransactions.add(eventName);
maysam zoor's avatar
maysam zoor committed
            String[] name = eventName.split("__");
maysam zoor's avatar
maysam zoor committed
            String[] removewrite = name[2].split(":");
maysam zoor's avatar
maysam zoor committed
            String[] portname = removewrite[1].split("[(]");
maysam zoor's avatar
maysam zoor committed
            String chwriteName = (name[0] + "__" + portname[0]).replaceAll(" ", "");
maysam zoor's avatar
maysam zoor committed
            String portNameNoSpaces = portname[0].replaceAll(" ", "");
maysam zoor's avatar
maysam zoor committed
            if (receiveData.containsKey(portNameNoSpaces)) {
                String sendDatachannels;
maysam zoor's avatar
maysam zoor committed
                if (((TMLReadChannel) currentElement).getChannel(0).getName().contains("FORKCHANNEL")
                        || ((TMLReadChannel) currentElement).getChannel(0).getDestinationTask().getName().startsWith("FORKTASK")
                        || ((TMLReadChannel) currentElement).getChannel(0).getOriginTask().getName().startsWith("FORKTASK")
                        || ((TMLReadChannel) currentElement).getChannel(0).getName().contains("JOINCHANNEL")
                        || ((TMLReadChannel) currentElement).getChannel(0).getDestinationTask().getName().startsWith("JOINTASK")
                        || ((TMLReadChannel) currentElement).getChannel(0).getOriginTask().getName().startsWith("JOINTASK")) {
                    sendDatachannels = receiveData.get(portNameNoSpaces);
                } else {
                    sendDatachannels = name[0] + "__" + receiveData.get(portNameNoSpaces) + "__" + name[0] + "__" + portNameNoSpaces;
maysam zoor's avatar
maysam zoor committed
                HashSet<String> readChVertex = new HashSet<String>();
                readChVertex.add(eventName);
maysam zoor's avatar
maysam zoor committed
                if (readWriteChannelEdges.containsKey(sendDatachannels)) {
maysam zoor's avatar
maysam zoor committed
                    if (!readWriteChannelEdges.get(sendDatachannels).contains(eventName)) {
                        readWriteChannelEdges.get(sendDatachannels).add(eventName);
                    }
maysam zoor's avatar
maysam zoor committed
                } else {
maysam zoor's avatar
maysam zoor committed
                    readWriteChannelEdges.put(sendDatachannels, readChVertex);
maysam zoor's avatar
maysam zoor committed
                }

                // getvertex(sendDatachannels).setTaintFixedNumber(getvertex(sendDatachannels).getTaintFixedNumber()
                // + 1);

                /*
                 * if (g.containsVertex(chwriteName))
                 * 
                 * { g.addEdge(chwriteName, eventName); }
                 */

            } else {
                HashSet<String> readChVertex = new HashSet<String>();
                readChVertex.add(eventName);

Loading
Loading full blame...