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