add codes for generating multi-core version binary. Also add options -multicore ...
[IRC.git] / Robust / src / Analysis / Scheduling / ScheduleAnalysis.java
index 73243fc368e26ff92480a83dc34c12ece122e4e1..a44cbab6c2229e017c1cddc9b06626cd9bc10ffe 100644 (file)
@@ -565,8 +565,7 @@ public class ScheduleAnalysis {
        toiterate = null;
        
        // create a 'trans' ScheudleEdge between this new ScheduleNode and se's source ScheduleNode
-       ScheduleEdge sEdge = new ScheduleEdge(sNode, "transmit", (FlagState)fe.getTarget(), false, 0);//new ScheduleEdge(sNode, "transmit", cNode.getClassDescriptor(), false, 0);
-       sEdge.setTargetFState(fs);
+       ScheduleEdge sEdge = new ScheduleEdge(sNode, "transmit", fs, false, 0);//new ScheduleEdge(sNode, "transmit", cNode.getClassDescriptor(), false, 0);
        sEdge.setFEdge(fe);
        sEdge.setSourceCNode(sCNode);
        sEdge.setTargetCNode(cNode);
@@ -576,9 +575,37 @@ public class ScheduleAnalysis {
        sEdge.setTransTime(cNode.getTransTime());
        se.getSource().addEdge(sEdge);
        scheduleEdges.add(sEdge);
+       // remove the ClassNodes and internal ScheduleEdges out of this subtree to the new ScheduleNode
+       ScheduleNode oldSNode = (ScheduleNode)se.getSource();
+       Iterator it_isEdges = oldSNode.getScheduleEdgesIterator();
+       Vector<ScheduleEdge> toremove = new Vector<ScheduleEdge>();
+       Vector<ClassNode> rCNodes = new Vector<ClassNode>();
+       rCNodes.addElement(sCNode);
+       if(it_isEdges != null){
+           while(it_isEdges.hasNext()) {
+               ScheduleEdge tse = (ScheduleEdge)it_isEdges.next();
+               if(rCNodes.contains(tse.getSourceCNode())) {
+                   if(sCNode == tse.getSourceCNode()) {
+                       if ((tse.getSourceFState() != fs) && (sFStates.contains(tse.getSourceFState()))) {
+                           tse.setSource(cNode);
+                           tse.setSourceCNode(cNode);
+                       } else {
+                           continue;
+                       }
+                   }
+                   sNode.getScheduleEdges().addElement(tse);
+                   sNode.getClassNodes().addElement(tse.getTargetCNode());
+                   rCNodes.addElement(tse.getTargetCNode());
+                   oldSNode.getClassNodes().removeElement(tse.getTargetCNode());
+                   toremove.addElement(tse);
+               }
+           }
+       }
+       oldSNode.getScheduleEdges().removeAll(toremove);
+       toremove.clear();
        // redirect ScheudleEdges out of this subtree to the new ScheduleNode
        Iterator it_sEdges = se.getSource().edges();
-       Vector<ScheduleEdge> toremove = new Vector<ScheduleEdge>();
+       //Vector<ScheduleEdge> toremove = new Vector<ScheduleEdge>();
        while(it_sEdges.hasNext()) {
            ScheduleEdge tse = (ScheduleEdge)it_sEdges.next();
            if((tse != se) && (tse != sEdge) && (tse.getSourceCNode() == sCNode)) {
@@ -802,12 +829,23 @@ public class ScheduleAnalysis {
        for(int i = 0; i < toMerge.size(); i++) {
            ScheduleEdge sEdge = toMerge.elementAt(i);
            // merge this edge
-           ((ScheduleNode)sEdge.getSource()).mergeSEdge(sEdge);
+           if(sEdge.getIsNew()) {
+               ((ScheduleNode)sEdge.getSource()).mergeSEdge(sEdge);
+           } else {
+               try {
+                   ((ScheduleNode)sEdge.getSource()).mergeTransEdge(sEdge);
+               } catch(Exception e) {
+                   e.printStackTrace();
+                   System.exit(-1);
+               }
+           }
            result.removeElement(sEdge.getTarget());
-           // As se has been changed into an internal edge inside a ScheduleNode, 
-           // change the source and target of se from original ScheduleNodes into ClassNodes.
-           sEdge.setTarget(sEdge.getTargetCNode());
-           sEdge.setSource(sEdge.getSourceCNode());
+           if(sEdge.getIsNew()) {
+               // As se has been changed into an internal edge inside a ScheduleNode, 
+               // change the source and target of se from original ScheduleNodes into ClassNodes.
+               sEdge.setTarget(sEdge.getTargetCNode());
+               sEdge.setSource(sEdge.getSourceCNode());
+           } 
        }
        toMerge = null;