Changed inheritance to separate task/method descriptors again
[IRC.git] / Robust / src / IR / Flat / FlatMethod.java
1 package IR.Flat;
2 import IR.MethodDescriptor;
3 import IR.TaskDescriptor;
4 import java.util.*;
5
6 public class FlatMethod extends FlatNode {
7     FlatNode method_entry;
8     MethodDescriptor method;
9     TaskDescriptor task;
10     Vector parameterTemps;
11
12     FlatMethod(MethodDescriptor md, FlatNode entry) {
13         method=md;
14         task=null;
15         method_entry=entry;
16         parameterTemps=new Vector();
17     }
18
19     FlatMethod(TaskDescriptor td, FlatNode entry) {
20         task=td;
21         method=null;
22         method_entry=entry;
23         parameterTemps=new Vector();
24     }
25
26     public String toString() {
27         return method.toString();
28     }
29
30     public MethodDescriptor getMethod() {
31         return method;
32     }
33     
34     public void addParameterTemp(TempDescriptor t) {
35         parameterTemps.add(t);
36     }
37
38     public int numParameters() {
39         return parameterTemps.size();
40     }
41
42     public TempDescriptor getParameter(int i) {
43         return (TempDescriptor) parameterTemps.get(i);
44     }
45
46     public FlatNode methodEntryNode() {
47         return method_entry;
48     }
49
50
51     public Set getNodeSet() {
52         HashSet tovisit=new HashSet();
53         HashSet visited=new HashSet();
54         tovisit.add(method_entry);
55         while(!tovisit.isEmpty()) {
56             FlatNode fn=(FlatNode)tovisit.iterator().next();
57             tovisit.remove(fn);
58             visited.add(fn);
59             for(int i=0;i<fn.numNext();i++) {
60                 FlatNode nn=fn.getNext(i);
61                 if (!visited.contains(nn))
62                     tovisit.add(nn);
63             }
64         }
65         return visited;
66     }
67     
68     public String printMethod() {
69         String st=method+" {\n";
70         HashSet tovisit=new HashSet();
71         HashSet visited=new HashSet();
72         int labelindex=0;
73         Hashtable nodetolabel=new Hashtable();
74         tovisit.add(method_entry);
75         FlatNode current_node=null;
76         //Assign labels 1st
77         //Node needs a label if it is
78         while(!tovisit.isEmpty()) {
79             FlatNode fn=(FlatNode)tovisit.iterator().next();
80             tovisit.remove(fn);
81             visited.add(fn);
82             for(int i=0;i<fn.numNext();i++) {
83                 FlatNode nn=fn.getNext(i);
84                 if(i>0) {
85                     //1) Edge >1 of node
86                     nodetolabel.put(nn,new Integer(labelindex++));
87                 }
88                 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
89                     tovisit.add(nn);
90                 } else {
91                     //2) Join point
92                     nodetolabel.put(nn,new Integer(labelindex++));
93                 }
94             }
95         }
96
97         //Do the actual printing
98         tovisit=new HashSet();
99         visited=new HashSet();
100         tovisit.add(method_entry);
101         while(current_node!=null||!tovisit.isEmpty()) {
102             if (current_node==null) {
103                 current_node=(FlatNode)tovisit.iterator().next();
104                 tovisit.remove(current_node);
105             }
106             visited.add(current_node);
107             if (nodetolabel.containsKey(current_node))
108                 st+="L"+nodetolabel.get(current_node)+":\n";
109             if (current_node.numNext()==0) {
110                 st+="   "+current_node.toString()+"\n";
111                 current_node=null;
112             } else if(current_node.numNext()==1) {
113                 st+="   "+current_node.toString()+"\n";
114                 FlatNode nextnode=current_node.getNext(0);
115                 if (visited.contains(nextnode)) {
116                     st+="goto L"+nodetolabel.get(nextnode)+"\n";
117                     current_node=null;
118                 } else
119                     current_node=nextnode;
120             } else if (current_node.numNext()==2) {
121                 /* Branch */
122                 st+="   "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
123                 if (!visited.contains(current_node.getNext(1)))
124                     tovisit.add(current_node.getNext(1));
125                 if (visited.contains(current_node.getNext(0))) {
126                     st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
127                     current_node=null;
128                 } else
129                     current_node=current_node.getNext(0);
130             } else throw new Error();
131         }
132         return st+"}\n";
133     }
134     
135     public TempDescriptor [] writesTemps() {
136         return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);
137     }
138 }