0e66fe016930577e2f3e19635495b905acacee76
[IRC.git] / Robust / src / IR / State.java
1 package IR;
2 import IR.Tree.*;
3 import IR.Flat.*;
4 import IR.*;
5 import java.util.*;
6 import Analysis.TaskStateAnalysis.*;
7
8 public class State {
9     public State() {
10         this.classes=new SymbolTable();
11         this.tasks=new SymbolTable();
12         this.treemethodmap=new Hashtable();
13         this.flatmethodmap=new Hashtable();
14         this.parsetrees=new HashSet();
15         this.arraytypes=new HashSet();
16         this.arraytonumber=new Hashtable();
17         this.tagmap=new Hashtable();
18         this.selfloops=new HashSet();
19         this.excprefetch=new HashSet();
20     }
21
22     public void addParseNode(ParseNode parsetree) {
23         parsetrees.add(parsetree);
24     }
25
26     public void storeAnalysisResult(Hashtable<ClassDescriptor, Hashtable<FlagState, Set<OptionalTaskDescriptor>>> analysisresults) {
27         this.analysisresults=analysisresults;
28     }
29
30     public Hashtable<ClassDescriptor, Hashtable<FlagState, Set<OptionalTaskDescriptor>>> getAnalysisResult() {
31         return analysisresults;
32     }
33
34
35     public void storeOptionalTaskDescriptors(Hashtable<ClassDescriptor, Hashtable<OptionalTaskDescriptor, OptionalTaskDescriptor>> optionaltaskdescriptors){
36         this.optionaltaskdescriptors=optionaltaskdescriptors;
37     }
38
39     public Hashtable<ClassDescriptor, Hashtable<OptionalTaskDescriptor, OptionalTaskDescriptor>> getOptionalTaskDescriptors(){
40         return optionaltaskdescriptors;
41     }
42
43     /** Boolean flag which indicates whether compiler is compiling a task-based
44      * program. */
45     public boolean WEBINTERFACE=false;
46     public boolean TASK=false;
47     public boolean DSM=false;
48     public boolean PREFETCH=false;
49     public boolean TASKSTATE=false;
50     public boolean TAGSTATE=false;
51     public boolean FLATIRGRAPH=false;
52     public boolean FLATIRGRAPHTASKS=false;
53     public boolean FLATIRGRAPHUSERMETHODS=false;
54     public boolean FLATIRGRAPHLIBMETHODS=false;
55     public boolean OWNERSHIP=false;
56     public boolean OPTIONAL=false;
57     public boolean SCHEDULING=false;  
58     public boolean THREAD=false;
59     public boolean CONSCHECK=false;
60     public boolean INSTRUCTIONFAILURE=false;
61     public static double TRUEPROB=0.8;
62     public static boolean PRINTFLAT=false;
63     public String structfile;
64     public String main;
65
66     public HashSet selfloops;
67     public HashSet excprefetch;
68     public SymbolTable classes;
69     public SymbolTable tasks;
70     public Set parsetrees;
71     public Hashtable treemethodmap;
72     public Hashtable flatmethodmap;
73     private HashSet arraytypes;
74     public Hashtable arraytonumber;
75     private int numclasses=0;
76     private int numtasks=0;
77     private int arraycount=0;
78
79
80     private Hashtable<ClassDescriptor, Hashtable<OptionalTaskDescriptor, OptionalTaskDescriptor>> optionaltaskdescriptors;
81     private Hashtable<ClassDescriptor, Hashtable<FlagState, Set<OptionalTaskDescriptor>>> analysisresults;
82
83     private Hashtable tagmap;
84     private int numtags=0;
85
86     public void addArrayType(TypeDescriptor td) {
87         if (!arraytypes.contains(td)) {
88             arraytypes.add(td);
89             arraytonumber.put(td,new Integer(arraycount++));
90         }
91     }
92
93     public Iterator getArrayIterator() {
94         return arraytypes.iterator();
95     }
96
97     public int getTagId(TagDescriptor tag) {
98         if (tagmap.containsKey(tag)) {
99             return ((Integer) tagmap.get(tag)).intValue();
100         } else {
101             tagmap.put(tag, new Integer(numtags));
102             return numtags++;
103         }
104     }
105
106     public int getArrayNumber(TypeDescriptor td) {
107         return ((Integer)arraytonumber.get(td)).intValue();
108     }
109
110     public int numArrays() {
111         return arraytypes.size();
112     }
113
114     public static TypeDescriptor getTypeDescriptor(int t) {
115         TypeDescriptor td=new TypeDescriptor(t);
116         return td;
117     }
118
119     public static TypeDescriptor getTypeDescriptor(NameDescriptor n) {
120         TypeDescriptor td=new TypeDescriptor(n);
121         return td;
122     }
123
124     public void addClass(ClassDescriptor tdn) {
125         if (classes.contains(tdn.getSymbol()))
126             throw new Error("Class "+tdn.getSymbol()+" defined twice");
127         classes.add(tdn);
128         numclasses++;
129     }
130
131     public int numClasses() {
132         return numclasses;
133     }
134
135     public BlockNode getMethodBody(MethodDescriptor md) {
136         return (BlockNode)treemethodmap.get(md);
137     }
138
139     public BlockNode getMethodBody(TaskDescriptor td) {
140         return (BlockNode)treemethodmap.get(td);
141     }
142
143     public SymbolTable getClassSymbolTable() {
144         return classes;
145     }
146
147     public SymbolTable getTaskSymbolTable() {
148         return tasks;
149     }
150
151     /** Returns Flat IR representation of MethodDescriptor md. */
152
153     public FlatMethod getMethodFlat(MethodDescriptor md) {
154         return (FlatMethod)flatmethodmap.get(md);
155     }
156
157     /** Returns Flat IR representation of TaskDescriptor td. */
158
159     public FlatMethod getMethodFlat(TaskDescriptor td) {
160         return (FlatMethod)flatmethodmap.get(td);
161     }
162
163     public void addTreeCode(MethodDescriptor md, BlockNode bn) {
164         treemethodmap.put(md,bn);
165     }
166
167     public void addTreeCode(TaskDescriptor td, BlockNode bn) {
168         treemethodmap.put(td,bn);
169     }
170
171     public void addFlatCode(MethodDescriptor md, FlatMethod bn) {
172         flatmethodmap.put(md,bn);
173     }
174
175     public void addFlatCode(TaskDescriptor td, FlatMethod bn) {
176         flatmethodmap.put(td,bn);
177     }
178
179     public void addTask(TaskDescriptor td) {
180         if (tasks.contains(td.getSymbol()))
181             throw new Error("Task "+td.getSymbol()+" defined twice");
182         tasks.add(td);
183         numtasks++;
184     }
185 }