6f4b390154609f0e360679929c3f613099fc5546
[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     Vector tagTemps;
12     Hashtable tagtointmap;
13
14     FlatMethod(MethodDescriptor md, FlatNode entry) {
15         method=md;
16         task=null;
17         method_entry=entry;
18         parameterTemps=new Vector();
19         tagTemps=new Vector();
20         tagtointmap=new Hashtable();
21     }
22
23     FlatMethod(TaskDescriptor td, FlatNode entry) {
24         task=td;
25         method=null;
26         method_entry=entry;
27         parameterTemps=new Vector();
28         tagTemps=new Vector();
29         tagtointmap=new Hashtable();
30     }
31
32     public String toString() {
33         return method.toString();
34     }
35
36     public MethodDescriptor getMethod() {
37         return method;
38     }
39
40     public TaskDescriptor getTask() {
41         return task;
42     }
43     
44     public int kind() {
45         return FKind.FlatMethod;
46     }
47
48     public void addParameterTemp(TempDescriptor t) {
49         parameterTemps.add(t);
50     }
51
52     public int numParameters() {
53         return parameterTemps.size();
54     }
55
56     public void addTagTemp(TempDescriptor t) {
57         tagtointmap.put(t, new Integer(tagTemps.size()));
58         tagTemps.add(t);
59     }
60
61     public int getTagInt(TempDescriptor t) {
62         return ((Integer)tagtointmap.get(t)).intValue();
63     }
64
65     public int numTags() {
66         return tagTemps.size();
67     }
68
69     public TempDescriptor getTag(int i) {
70         return (TempDescriptor) tagTemps.get(i);
71     }
72     
73     public TempDescriptor getParameter(int i) {
74         return (TempDescriptor) parameterTemps.get(i);
75     }
76
77     public FlatNode methodEntryNode() {
78         return method_entry;
79     }
80
81     /** This method returns a set of the nodes in this flat representation */
82
83     public Set getNodeSet() {
84         HashSet tovisit=new HashSet();
85         HashSet visited=new HashSet();
86         tovisit.add(method_entry);
87         while(!tovisit.isEmpty()) {
88             FlatNode fn=(FlatNode)tovisit.iterator().next();
89             tovisit.remove(fn);
90             visited.add(fn);
91             for(int i=0;i<fn.numNext();i++) {
92                 FlatNode nn=fn.getNext(i);
93                 if (!visited.contains(nn))
94                     tovisit.add(nn);
95             }
96         }
97         return visited;
98     }
99     
100     /** This method returns a string that is a human readable
101      * representation of this method. */
102
103     public String printMethod() {
104         String st=method+" {\n";
105         HashSet tovisit=new HashSet();
106         HashSet visited=new HashSet();
107         int labelindex=0;
108         Hashtable nodetolabel=new Hashtable();
109         tovisit.add(method_entry);
110         FlatNode current_node=null;
111         //Assign labels 1st
112         //Node needs a label if it is
113         while(!tovisit.isEmpty()) {
114             FlatNode fn=(FlatNode)tovisit.iterator().next();
115             tovisit.remove(fn);
116             visited.add(fn);
117
118 //          System.out.println("Next : "+fn.numNext());
119
120             for(int i=0;i<fn.numNext();i++) {
121                 FlatNode nn=fn.getNext(i);
122                 if(i>0) {
123                     //1) Edge >1 of node
124                     nodetolabel.put(nn,new Integer(labelindex++));
125                 }
126                 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
127                     tovisit.add(nn);
128                 } else {
129                     //2) Join point
130                     nodetolabel.put(nn,new Integer(labelindex++));
131                 }
132             }
133         }
134
135         //Do the actual printing
136         tovisit=new HashSet();
137         visited=new HashSet();
138         tovisit.add(method_entry);
139         while(current_node!=null||!tovisit.isEmpty()) {
140             if (current_node==null) {
141                 current_node=(FlatNode)tovisit.iterator().next();
142                 tovisit.remove(current_node);
143             }
144             visited.add(current_node);
145             if (nodetolabel.containsKey(current_node))
146                 st+="L"+nodetolabel.get(current_node)+":\n";
147             if (current_node.numNext()==0) {
148                 st+="   "+current_node.toString()+"\n";
149                 current_node=null;
150             } else if(current_node.numNext()==1) {
151                 st+="   "+current_node.toString()+"\n";
152                 FlatNode nextnode=current_node.getNext(0);
153                 if (visited.contains(nextnode)) {
154                     st+="goto L"+nodetolabel.get(nextnode)+"\n";
155                     current_node=null;
156                 } else
157                     current_node=nextnode;
158             } else if (current_node.numNext()==2) {
159                 /* Branch */
160                 st+="   "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
161                 if (!visited.contains(current_node.getNext(1)))
162                     tovisit.add(current_node.getNext(1));
163                 if (visited.contains(current_node.getNext(0))) {
164                     st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
165                     current_node=null;
166                 } else
167                     current_node=current_node.getNext(0);
168             } else throw new Error();
169         }
170         return st+"}\n";
171     }
172     
173     public TempDescriptor [] writesTemps() {
174         return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);
175     }
176 }