Add generating scheduling algorithm
[IRC.git] / Robust / src / Analysis / TaskStateAnalysis / TaskQueueIterator.java
1 package Analysis.TaskStateAnalysis;
2 import IR.*;
3 import IR.Tree.*;
4 import IR.Flat.*;
5 import java.util.*;
6
7 public class TaskQueueIterator {
8     TaskQueue tq;
9     int index;
10     FlagTagState fts;
11     FlagTagState ftsarray[];
12     Hashtable<TempDescriptor, TagState> tsarray;
13     Hashtable<TempDescriptor, Integer> tsindexarray;
14     Iterator<FlagTagState> itarray[];
15     boolean needit;
16     boolean needinit;
17
18     public TaskQueueIterator(TaskQueue tq, int index, FlagTagState fts) {
19         this.tq=tq;
20         this.index=index;
21         this.fts=fts;
22         this.ftsarray=new FlagTagState[tq.numParameters()];
23         this.ftsarray[index]=fts;
24         this.tsarray=new Hashtable<TempDescriptor, TagState>();
25         this.tsindexarray=new Hashtable<TempDescriptor, Integer>();
26         this.itarray=(Iterator<FlagTagState>[]) new Iterator[tq.numParameters()];
27         needit=false;
28         needinit=true;
29         init();
30     }
31     
32     private void init() {
33         for(int i=ftsarray.length-1;i>=0;i--) {
34             if (i!=index)
35                 itarray[i]=tq.parameterset[i].iterator();
36             VarDescriptor vd=tq.task.getParameter(i);
37             TagExpressionList tel=tq.task.getTag(vd);
38             if (tel!=null)
39                 for(int j=0;j<tel.numTags();j++) {
40                     TempDescriptor tmp=tel.getTemp(j);
41                     if (!tsindexarray.containsKey(tmp)) {
42                         tsindexarray.put(tmp, new Integer(i));
43                     }
44                 }
45         }
46     }
47
48     public boolean hasNext() {
49         TaskDescriptor td=tq.task;
50         int i;
51         if (needinit) {
52             i=ftsarray.length-1;
53             if (i!=index)
54                 ftsarray[i]=itarray[i].next();
55         } else {
56             i=0;
57         }
58
59         objloop:
60         for(;i<ftsarray.length;i++) {
61             FlagState currfs=ftsarray[i].fs;
62             VarDescriptor vd=td.getParameter(i);
63             TagExpressionList tel=td.getTag(vd);
64             int j;
65             if (needinit) {
66                 j=(tel!=null)&&tel.numTags()>0?tel.numTags()-1:0;
67                 needinit=false;
68             } else
69                 j=0;
70             tagloop:
71             for(;tel!=null&&j<tel.numTags();j++) {
72                 TempDescriptor tmp=tel.getTemp(j);
73                 TagState currtag=tsarray.get(tmp);
74                 String type=tel.getType(j);
75                 
76                 if (tsindexarray.get(tmp).intValue()==i) {
77                     //doing the assignment right here!!!
78                     Vector<FlagTagState> possts=tq.map.get(currfs);
79                     int index=0;
80                     if (currtag!=null)
81                         index=possts.indexOf(new FlagTagState(currtag,currfs));
82                     if (needit) {
83                         index++;
84                         needit=false;
85                     }
86                     for(int k=index;k<possts.size();k++) {
87                         FlagTagState posstag=possts.get(k);
88                         if (posstag.ts.getTag().getSymbol().equals(type)) {
89                             tsarray.put(tmp, posstag.ts);
90                             if (j==0) {
91                                 if (i==0) {
92                                     //We are done!
93                                     return true;
94                                 } else {
95                                     //Backtrack on objects
96                                     i-=2;
97                                     continue objloop;
98                                 }
99                             } else {
100                                 //Backtrack on tags
101                                 j-=2;
102                                 continue tagloop;
103                             }
104                         }
105                     }
106                     //couldn't find a tag
107                     tsarray.put(tmp, null);
108                     needit=true;
109                 } else {
110                     //check tag compatibility
111                     if (!currtag.containsFS(currfs)) {
112                         //incompatible tag set by previous level
113                         //need to increment object state
114                         needit=true;
115                         break;
116                     }
117                 }
118             }
119             if (index==i) {
120                 continue;
121             }
122             if (needit) {
123                 if (itarray[i].hasNext()) {
124                     ftsarray[i]=itarray[i].next();
125                     needit=false;
126                     i-=1;
127                     continue objloop; //backtrack and fix up everything
128                 } else {
129                     itarray[i]=tq.parameterset[i].iterator();//keep going backwards
130                 }
131             } else {
132                 throw new Error();
133             }
134         }
135         return false;
136     }
137
138     public FlagTagState getFTS(int index) {
139         return ftsarray[index];
140     }
141
142     public TagState getTS(TempDescriptor tmp) {
143         return tsarray.get(tmp);
144     }
145     
146     public void next() {
147         needit=true;
148     }
149 }