new class names. build output code for optional tasks.
[IRC.git] / Robust / src / Analysis / TaskStateAnalysis / TaskAnalysis.java
index 83c2f3a07729a654de677c1fdedd53830e53c3dc..c5b626a943b54fb6fba5f91b1167de91791cc920 100644 (file)
 package Analysis.TaskStateAnalysis;
-import Analysis.TaskStateAnalysis.*;
 import IR.*;
 import IR.Tree.*;
 import IR.Flat.*;
 import java.util.*;
 import java.io.File;
 import java.io.FileWriter;
+import java.io.FileOutputStream;
+
+public class TaskAnalysis {
+    State state;
+    Hashtable flagstates;
+    Hashtable flags;
+    Hashtable extern_flags;
+    Queue<FlagState> toprocess;
+    TagAnalysis taganalysis;
+    Hashtable cdtorootnodes;
+
+    TypeUtil typeutil;
+
+    /** 
+     * Class Constructor
+     *
+     * @param state a flattened State object
+     * @see State
+     */
+    public TaskAnalysis(State state, TagAnalysis taganalysis)
+    {
+       this.state=state;
+       this.typeutil=new TypeUtil(state);
+       this.taganalysis=taganalysis;
+               
+    }
+    
+    /** Builds a table of flags for each class in the Bristlecone program.  
+     * It creates two hashtables: one which holds the ClassDescriptors and arrays of
+     *  FlagDescriptors as key-value pairs; the other holds the ClassDescriptor and the 
+     *  number of external flags for that specific class.
+     */
+
+    private void getFlagsfromClasses() {
+       flags=new Hashtable();
+       extern_flags = new Hashtable();
+       
+       /** Iterate through the classes used in the program to build the table of flags
+        */
+       for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) {
+               
+           ClassDescriptor cd = (ClassDescriptor)it_classes.next();
+           Vector vFlags=new Vector();
+           FlagDescriptor flag[];
+           int ctr=0;
+           
+           
+           /* Adding the flags of the super class */
+           if (cd.getSuper()!=null) {
+               ClassDescriptor superdesc=cd.getSuperDesc();
+               
+               for(Iterator it_cflags=superdesc.getFlags();it_cflags.hasNext();) {     
+                   FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
+                   vFlags.add(fd);
+               }
+           }
 
-public class TaskAnalysis
-{
-       State state;
-//     Vector vFlags;   //Vector holding the FlagDescriptors from all the classes used
-//     FlagDescriptor flags[];
-       Hashtable Adj_List;
-       Hashtable flags;
-       Hashtable extern_flags;
-       Queue<TriggerState> q_main;
+           for(Iterator it_cflags=cd.getFlags();it_cflags.hasNext();) {
+               FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
+               vFlags.add(fd);
+           }
 
-       /** 
-        * Class Constructor
-        *
-        * @param state a flattened State object
-        * @see State
-        */
-       public TaskAnalysis(State state)
-       {
-               this.state=state;
+           if (vFlags.size()!=0) {
+               flag=new FlagDescriptor[vFlags.size()];
+               
+               for(int i=0;i < vFlags.size() ; i++) {
+                   if (((FlagDescriptor)vFlags.get(i)).getExternal()) {
+                       flag[ctr]=(FlagDescriptor)vFlags.get(i);
+                       vFlags.remove(flag[ctr]);
+                       ctr++;
+                   }
+               }
+               for(int i=0;i < vFlags.size() ; i++) {
+                   flag[i+ctr]=(FlagDescriptor)vFlags.get(i);
+               }
+               extern_flags.put(cd,new Integer(ctr));
+               flags.put(cd,flag);
+               
+           }
        }
-       private void getFlagsfromClasses()  //This function returns the number of external flags amongst the other things it does.
-       {
+    }
+    /** Method which starts up the analysis  
+     *  
+    */
+    
+    public void taskAnalysis() throws java.io.IOException {
+       flagstates=new Hashtable();
+       Hashtable<FlagState,FlagState> sourcenodes;
+       cdtorootnodes=new Hashtable();
        
-               flags=new Hashtable();
-               extern_flags = new Hashtable();
-
-               for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();)
-               {
-
-                       ClassDescriptor cd = (ClassDescriptor)it_classes.next();
-                       System.out.println(cd.getSymbol());
-                       Vector vFlags=new Vector();
-                       FlagDescriptor flag[];
-                       int ctr=0;
-
-
-                       /* Adding the flags of the super class */
-                       if (cd.getSuper()!=null)
-                       {
-                               ClassDescriptor superdesc=cd.getSuperDesc();
-                                       
-                               for(Iterator it_cflags=superdesc.getFlags();it_cflags.hasNext();)
-                               {       
-                                       FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
-                                       System.out.println(fd.toString());
-                                       vFlags.add(fd);
-                               }
-                       }
-                       /*************************************/
-
-                       for(Iterator it_cflags=cd.getFlags();it_cflags.hasNext();)
-                       {
-                               FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
-                               System.out.println(fd.toString());
-                               vFlags.add(fd);
-                       }
-                       if (vFlags.size()!=0)
-                       {
-                               flag=new FlagDescriptor[vFlags.size()];
-
-                               for(int i=0;i < vFlags.size() ; i++)
-                               {
-                                       if (((FlagDescriptor)vFlags.get(i)).getExternal())
-                                       {
-                                               flag[ctr]=(FlagDescriptor)vFlags.get(i);
-                                               vFlags.remove(flag[ctr]);
-                                               ctr++;
-                                       }
-                               }
-                               for(int i=0;i < vFlags.size() ; i++)
-                               {
-                                       flag[i+ctr]=(FlagDescriptor)vFlags.get(i);
-                               }
-                               extern_flags.put(cd,new Integer(ctr));
-                               flags.put(cd,flag);
+       getFlagsfromClasses();
+       
+       int externs;
+       toprocess=new LinkedList<FlagState>();
+       
+       for(Iterator it_classes=(Iterator)flags.keys();it_classes.hasNext();) {
+           ClassDescriptor cd=(ClassDescriptor)it_classes.next();
+           externs=((Integer)extern_flags.get(cd)).intValue();
+           FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
+           flagstates.put(cd,new Hashtable<FlagState,FlagState>());
+           cdtorootnodes.put(cd,new Vector());
+       }       
+       
+       
+       ClassDescriptor startupobject=typeutil.getClass(TypeUtil.StartupClass);
+       
+       sourcenodes=(Hashtable<FlagState,FlagState>)flagstates.get(startupobject);
+       FlagState fsstartup=new FlagState(startupobject);
+       
+       
+       FlagDescriptor[] fd=(FlagDescriptor[])flags.get(startupobject);
+       
+       fsstartup=fsstartup.setFlag(fd[0],true);
+       fsstartup.setAsSourceNode();
+       ((Vector)cdtorootnodes.get(startupobject)).add(fsstartup);
 
-                       }
-               }
+       sourcenodes.put(fsstartup,fsstartup);
+       toprocess.add(fsstartup);
        
+       /** Looping through the flagstates in the toprocess queue to perform the state analysis */
+       while (!toprocess.isEmpty()) {
+           FlagState trigger=toprocess.poll();
+           createPossibleRuntimeStates(trigger);
+           
+           analyseTasks(trigger);
        }
-
-       public void taskAnalysis() throws java.io.IOException
-       {
-               Adj_List=new Hashtable();
-
-               getFlagsfromClasses();
-               
-               int externs;
-               q_main=new LinkedList<TriggerState>();
-
-       //      for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();)
-               for(Iterator it_classes=(Iterator)flags.keys();it_classes.hasNext();)
-               {
-                       ClassDescriptor cd=(ClassDescriptor)it_classes.next();
-
-                       externs=((Integer)extern_flags.get(cd)).intValue();
-
-                       FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
-                       //Debug block
-                               System.out.println("Inside taskAnalysis;\n Class:"+ cd.getSymbol());
-                               System.out.println("No of externs " + externs);
-                               System.out.println("No of flags: "+fd.length);
-                       //Debug block
-                       if (fd.length == externs)
-                       {
-                               System.out.println("extern called");
-                               boolean onlyExterns=true;
-//                             processExterns(true,cd);
-                               /*Queue<TriggerState> q_temp=createPossibleRuntimeStates(cd);
-                                       if ( q_temp != null)
-                                       {
-                                               q_main.addAll(q_temp);
-                                       }
-                               */
-
-                       }
-                       else
-                       {
-                               if ((fd.length == 1) && (fd[0].getSymbol().compareTo("initialstate")==0))
-                               {
-                                       FlagState fstemp=new FlagState(fd);
-                                       Hashtable Adj_List_temp=new Hashtable();
-
-                                       fstemp.put(fd[0],new Boolean(true));
-                                       Vector vtemp=new Vector();
-                                       vtemp.add(new Edge(fstemp,"Runtime"));
-                                       Adj_List_temp.put(new FlagState(fd),vtemp);
-                                       Adj_List.put(cd,Adj_List_temp);
-
-                                       Queue<TriggerState> q_temp=analyseTasks(new TriggerState(cd,fstemp));
-
-
-                                       if ( q_temp != null)
-                                       {
-                                               q_main.addAll(q_temp);
-                                       }
-
-                               }
-                       }
-               }
-               while (q_main.size() > 0)
-               {
-                       // ****debug block********
-                       for (Iterator it_qm=q_main.iterator();it_qm.hasNext();)
-                                       {
-                                               TriggerState ts_qm=(TriggerState)it_qm.next();
-                                               FlagState fs_qm=ts_qm.getState();
-                                               System.out.println("/***********contents of main q**********/");
-                                               System.out.println("FS : "+fs_qm.toString((FlagDescriptor [])flags.get(ts_qm.getClassDescriptor())));
-                                               
-                                               
-                                       }
-                               System.out.println("/*********************************/");
-                               // ****debug block********
-                        Queue<TriggerState> q_temp=analyseTasks(q_main.poll());
-                        if ( q_temp != null)
-                       {
-                               q_main.addAll(q_temp);
-                               }
-               }
-
-               //Creating DOT files
-               Enumeration e=Adj_List.keys();
-
-               while (e.hasMoreElements())
-               {
-                       System.out.println("creating dot file");
-                       ClassDescriptor cdtemp=(ClassDescriptor)e.nextElement();
-                       System.out.println((cdtemp.getSymbol()));
-               //      createDOTfile((ClassDescriptor)e.nextElement());
-                       createDOTfile(cdtemp);
-               }
-
+       
+       /** Creating DOT files */
+       Enumeration e=flagstates.keys();
+       
+       while (e.hasMoreElements()) {
+           ClassDescriptor cdtemp=(ClassDescriptor)e.nextElement();
+           createDOTfile(cdtemp);
        }
-
-
-       public Queue<TriggerState> analyseTasks(TriggerState ts) throws java.io.IOException
-       {
-               Queue<FlagState> q;
-               Queue<FlagState> qft;
-               
-               Hashtable Adj_List_temp;
-               Queue<TriggerState> q_retval;
-
-               ClassDescriptor cd=ts.getClassDescriptor();
-
-               if (Adj_List.containsKey(cd))
-               {
-                       //Debug block
-                               System.out.println("Inside analyseTasks;\n Checking if adj_list contains the class desc:"+ cd.getSymbol());
-                       //Debug block
-                       
-                       Adj_List_temp=(Hashtable)Adj_List.get(cd);
-               }
-               else
-               {
-                       Adj_List_temp=new Hashtable();
-                       Adj_List.put(cd,Adj_List_temp);
-               }
-
-
-               int externs=((Integer)extern_flags.get(cd)).intValue();
-               FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
-
-               q = new LinkedList<FlagState>();
-               q_retval=new LinkedList<TriggerState>();
-               q.offer(ts.getState());
-
-               //***Debug Block***
-               //
-               /*Enumeration eFlags=fsinitial.getStateTable().keys();
-
-               while(eFlags.hasMoreElements())
-               {
-                       System.out.println(((FlagDescriptor)eFlags.nextElement()).toString());
-               } */
-               //***Debug Block***
-
-               while (q.size() != 0 /* && debug_ctr<10*/ )
-               {
-                       System.out.println("inside while loop in analysetasks \n");
-
-                       FlagState fsworking=q.poll();
-
-                       //***Debug Block***
-                               FlagDescriptor[] ftemp=(FlagDescriptor[])flags.get(cd);
-                       System.out.println("Processing state: "+cd.getSymbol()+" " + fsworking.toString(ftemp));
-
-                       //***Debug Block***
-
-
-                       for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();)
-                       {
-                               TaskDescriptor td = (TaskDescriptor)it_tasks.next();
-                               boolean taskistriggered=false;
-                               int ctr=0;
-                               String taskname=getTaskName(td);
-
-                               
-
-                               //***Debug Block***
-
-                               System.out.println();
-                               System.out.println("Method: AnalyseTasks");
-                               System.out.println(taskname);
-                               System.out.println();
-
-                               //***Debug Block***
-
-
-                               for(int i=0; i < td.numParameters(); i++)
-                               {
-                                       //System.out.println("\n Num of parameters: "+td.numParameters());
-
-                                       FlagExpressionNode fen=td.getFlag(td.getParameter(i));
-                                       if (isTaskTrigger(fen,fsworking))
-                                               taskistriggered = true;
-                                       //      ctr++;
-
-                               }
-
-                               //***Debug Block***
-
-                               //System.out.println("xxx "+ctr);
-
-                               //***Debug Block***
-
-                       /*      if (ctr == td.numParameters())
-                               {
-                                       taskistriggered = true;
-                               }*/
-                               if (taskistriggered)
-                               {
-                                       //***Debug Block***
-                                       //
-                                       System.out.println("inside taskistriggered");
-
-                                       //***Debug Block***
-
-                       //              Adj_List.put(fsworking,new Integer(2));
-                       //              System.out.println(td.toString());
-                       //              printAdjList(cd);
-
-                                       if (wasFlagStateProcessed(Adj_List_temp,fsworking))
-                                       {
-                                               if (! (fd.length == externs))   
-                                                   continue;
-                                       }
-                                       else 
-                                               Adj_List_temp.put(fsworking,new Vector());
-                                       
-/*                                     qft=createPossibleRuntimeStates(new TriggerState(cd,new FlagState(fsworking.getStateTable())));
-                                       for (Iterator it_qft=qft.iterator();it_qft.hasNext();)
-                                       {
-                                               FlagState fs_qft=(FlagState)it_qft.next();
-                                               if (!existsInFSQueue(q,fs_qft))
-                                                       q.add(fs_qft);
-                                               
-                                       }
-*/                                     
-                                       FlatMethod fm = state.getMethodFlat(td);
-                                       FlatNode fn=fm.methodEntryNode();
-
-                                       HashSet tovisit= new HashSet();
-                                       HashSet visited= new HashSet();
-
-                       tovisit.add(fn);
-                       while(!tovisit.isEmpty())
-                       {
-                                           FlatNode fn1 = (FlatNode)tovisit.iterator().next();
-                               tovisit.remove(fn1);
-                               visited.add(fn1);
-                                               for(int i = 0; i < fn1.numNext(); i++)
-                                               {
-                                                       FlatNode nn=fn1.getNext(i);
-                                       /*              if (nn.kind()==4)
-                                                       {
-                                                               ClassDescriptor cd_flatnew=processFlatNew(nn);
-                                                               if (cd_flatnew != null)
-                                                               {
-                                                               //Create possible runtime states for this object
-                                                               q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_flatnew,new FlagState((FlagDescriptor[])flags.get(cd_flatnew)))));
-                                                               }
-                                                       }
-                                                       else
-                                       */
-                                                       
-                                                       if (nn.kind()==13)
-                                                       {
-                                                               //***Debug Block***
-                                                               // System.out.println();
-
-
-
-                                                               //***Debug Block***
-                                                               if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.PRE)
-                                                               {
-                                                                       //***Debug Block***
-                                                                       System.out.println("PRE");
-                                                                       //***Debug Block***
-
-                                                                       FlagState fstemp=new FlagState(fsworking.getStateTable());
-                                                                       for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();)
-                                                                   {
-                                                                               TempFlagPair tfp=(TempFlagPair)it_tfp.next();
-                                                                               //      System.out.println(tfp.getTemp()+"  " +tfp.getFlag()+"   "+((FlatFlagActionNode)nn).getFlagChange(tfp));
-                                                                               fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
-                                                                       }
-                                                                       if (! edgeexists(Adj_List_temp,fsworking,fstemp,taskname+"_PRE"))
-                                                                       {
-                                                                               ((Vector)Adj_List_temp.get(fsworking)).add(new Edge(fstemp,taskname+"_PRE"));
-                                                                       }
-                                                                       if (!wasFlagStateProcessed(Adj_List_temp,fstemp))
-                                                                       {
-                                                                               q.offer(fstemp);
-                                                                               //pretasks.put(td,fstemp);
-                                                                               
-                                                                       }
-                                                                       fstemp=null;
-
-                                                               }
-                                                               if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.NEWOBJECT)
-                                                               {
-                                                                       //***Debug Block***
-                                                                       System.out.println("NEWObject");
-                                                                       //***Debug Block***
-                                                                        
-                                                                       
-                                                                       TempDescriptor[] tdArray = ((FlatFlagActionNode)nn).readsTemps();
-                                                                       
-                                                                       //Under the safe assumption that all the temps in FFAN.NewObject node are of the same type(class)
-                                                                       ClassDescriptor cd_new=tdArray[0].getType().getClassDesc();
-                                                                       
-                                                                       System.out.println("Class: "+cd_new.getSymbol());       
-
-                                                                       FlagState fstemp=new FlagState((FlagDescriptor[])flags.get(cd_new));
-
-                                                                       for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();)
-                                                                       {
-                                                                               TempFlagPair tfp=(TempFlagPair)it_tfp.next();
-                                                                               if (tfp.getFlag()==null)
-                                                                               {
-                                                                                                       System.out.println("test1");
-                                                                                    q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_new,new FlagState((FlagDescriptor[])flags.get(cd_new)))));
-                                                                                    // ****debug block********
-                                                                                    System.out.println("/***********contents of q ret**********/");
-                                                                                                       for (Iterator it_qret=q_retval.iterator();it_qret.hasNext();)
-                                                                                                       {
-                                                                                                               TriggerState ts_qret=(TriggerState)it_qret.next();
-                                                                                                               FlagState fs_qret=ts_qret.getState();
-                                                                                                               
-                                                                                                               System.out.println("FS : "+fs_qret.toString((FlagDescriptor [])flags.get(ts_qret.getClassDescriptor())));
-                                                                                                       }
-                                                                                                       System.out.println("/*********************************/");
-                                                                                                       // ****debug block********
-                                                                               }
-                                                                               else
-                                                                                   fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
-                                                                                   
-                                                                       
-                                                                       }
-                                                                       
-                                                                               //***Debug Block***
-                                                                               System.out.println("test2");
-                                                                               System.out.println("Newobj fsworking "+fsworking.toString((FlagDescriptor [])flags.get(cd_new)));
-                                                                               System.out.println("Newobj fstemp "+fstemp.toString((FlagDescriptor [])flags.get(cd_new))); 
-
-                                                                               //***Debug Block***
-                                                                       
-                                                                       q_retval.offer(new TriggerState(cd_new,fstemp));
-                                                                       
-                                                                       //make this a function containsExterns()
-                                                                       int extrns=((Integer)extern_flags.get(cd_new)).intValue();
-                                                                       
-                                                                       if ((extrns >0) && (extrns!=((FlagDescriptor[])flags.get(cd_new)).length))
-                                                                               q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_new,fstemp)));
-                                                                               
-                                                                       fstemp=null;
-                                                                       // ****debug block********
-                                                                                    System.out.println("/***********contents of q ret 1**********/");
-                                                                                                       for (Iterator it_qret=q_retval.iterator();it_qret.hasNext();)
-                                                                                                       {
-                                                                                                               TriggerState ts_qret=(TriggerState)it_qret.next();
-                                                                                                               FlagState fs_qret=ts_qret.getState();
-                                                                                                               
-                                                                                                               System.out.println("FS : "+fs_qret.toString((FlagDescriptor [])flags.get(ts_qret.getClassDescriptor())));
-                                                                                                       }
-                                                                                                       System.out.println("/*********************************/");
-                                                                       // ****debug block********
-                                                                       
-                                                               }
-                                                               if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.TASKEXIT)
-                                                               {
-                                                                       //***Debug Block***
-                                                                       //
-                                                                       System.out.println("TaskExit");
-                                                                       //***Debug Block***
-
-                                                                       FlagState fstemp=new FlagState(fsworking.getStateTable());
-
-                                                                       for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();)
-                                                                       {
-                                                                               TempFlagPair tfp=(TempFlagPair)it_tfp.next();
-                                                                               fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
-                                                                       }
-                                                                               //***Debug Block***
-                                                                               System.out.println();
-                                                                               System.out.println(fstemp.toString((FlagDescriptor [])flags.get(cd)));
-                                                                               System.out.println();
-                                                                               System.out.println("taskexit fsworking "+fsworking.toString((FlagDescriptor [])flags.get(cd)));
-                                                                               System.out.println("taskexit fstemp "+fstemp.toString((FlagDescriptor [])flags.get(cd))); 
-
-                                                                               //***Debug Block***
-                                                                       if (!edgeexists(Adj_List_temp,fsworking,fstemp,taskname))
-                                                                       {
-                                                                               
-                                                                               
-                                                                               ((Vector)Adj_List_temp.get(fsworking)).add(new Edge(fstemp,taskname));
-                                                                               
-                                                                       }
-                                                                       if (!wasFlagStateProcessed(Adj_List_temp,fstemp))
-                                                                       {
-                                                                               q.offer(fstemp);
-                                                                       }
-                                                                        fstemp=null;
-
-                                                               }
-                                                       }
-                                                       
-                                                       if (!visited.contains(nn) && !tovisit.contains(nn))
-                                                       {
-                                                               tovisit.add(nn);
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-
-               }
-
-
-               if (q_retval.size()==0)
-               {
-                       return null;
-               }
-               else
-               {
-                       return q_retval;
-               }
+    }
+    
+    
+    /** Analyses the set of tasks based on the given flagstate, checking
+     *  to see which tasks are triggered and what new flagstates are created
+     *  from the base flagstate.
+     *  @param fs A FlagState object which is used to analyse the task
+     *  @see FlagState
+     */
+
+private void analyseTasks(FlagState fs) {
+    ClassDescriptor cd=fs.getClassDescriptor();
+    Hashtable<FlagState,FlagState> sourcenodes=(Hashtable<FlagState,FlagState>)flagstates.get(cd);
+    
+    for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();) {
+       TaskDescriptor td = (TaskDescriptor)it_tasks.next();
+       String taskname=td.getSymbol();
+       
+       /** counter to keep track of the number of parameters (of the task being analyzed) that 
+        *  are satisfied by the flagstate.
+        */
+       int trigger_ctr=0;
+       TempDescriptor temp=null;
+       FlatMethod fm = state.getMethodFlat(td);        
+       
+       for(int i=0; i < td.numParameters(); i++) {
+           FlagExpressionNode fen=td.getFlag(td.getParameter(i));
+           TagExpressionList tel=td.getTag(td.getParameter(i));
+           
+           /** Checking to see if the parameter is of the same type/class as the 
+            *  flagstate's and also if the flagstate fs triggers the given task*/
+           if (typeutil.isSuperorType(td.getParamType(i).getClassDesc(),cd)
+               && isTaskTrigger_flag(fen,fs)
+               && isTaskTrigger_tag(tel,fs)) {
+               temp=fm.getParameter(i);
+               trigger_ctr++;
+           }
        }
-
-       private boolean isTaskTrigger(FlagExpressionNode fen,FlagState fs)
-       {
-               if (fen instanceof FlagNode)
-               {
-                       return fs.get(((FlagNode)fen).getFlag());
-               }
-               else
-               {
-                       switch (((FlagOpNode)fen).getOp().getOp())
-                       {
-                       case Operation.LOGIC_AND:
-                               return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
-                       case Operation.LOGIC_OR:
-                               return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
-                       case Operation.LOGIC_NOT:
-                               return !(isTaskTrigger(((FlagOpNode)fen).getLeft(),fs));
-                       default:
-                               return false;
-                       }
-               }
-
+       
+       if (trigger_ctr==0) //Look at next task
+           continue;
+       
+       if (trigger_ctr>1)
+           throw new Error("Illegal Operation: A single flagstate cannot satisfy more than one parameter of a task.");
+       
+       
+       Set newstates=taganalysis.getFlagStates(td);
+       for(Iterator fsit=newstates.iterator();fsit.hasNext();) {
+           FlagState fsnew=(FlagState) fsit.next();
+           fsnew.setAsSourceNode();
+           fsnew.addAllocatingTask(td);
+           ((Vector)cdtorootnodes.get(fsnew.getClassDescriptor())).add(fsnew);
+           
+           if (! ((Hashtable<FlagState,FlagState>)flagstates.get(fsnew.getClassDescriptor())).containsKey(fsnew)) {
+               ((Hashtable<FlagState,FlagState>)flagstates.get(fsnew.getClassDescriptor())).put(fsnew, fsnew);
+               toprocess.add(fsnew);
+           }
        }
-
-       private boolean wasFlagStateProcessed(Hashtable Adj_List,FlagState fs)
-       {
-               Enumeration e=Adj_List.keys();
-
-               while(e.hasMoreElements())
-               {
-                       FlagState fsv = (FlagState)(e.nextElement());
-
-                       if (fsv.isEqual(fs))
-                       {
-                               return true;
+       
+       Stack nodestack=new Stack();
+       HashSet discovered=new HashSet();
+       nodestack.push(fm);
+       discovered.add(fm);
+       //Iterating through the nodes
+       
+       while(!nodestack.isEmpty()) {
+           FlatNode fn1 = (FlatNode) nodestack.pop();
+           
+           if (fn1.kind()==FKind.FlatReturnNode) {
+               /* Self edge */
+               FEdge newedge=new FEdge(fs, taskname);
+               fs.addEdge(newedge);
+               continue;
+           } else if (fn1.kind()==FKind.FlatFlagActionNode) {
+               FlatFlagActionNode ffan=(FlatFlagActionNode)fn1;
+               if (ffan.getTaskType() == FlatFlagActionNode.PRE) {
+                   if (ffan.getTempFlagPairs().hasNext()||ffan.getTempTagPairs().hasNext())
+                       throw new Error("PRE FlagActions not supported");
+                   
+               } else if (ffan.getTaskType() == FlatFlagActionNode.TASKEXIT) {
+                   Vector<FlagState> fsv_taskexit=evalTaskExitNode(ffan,cd,fs,temp);
+                   for(Enumeration en=fsv_taskexit.elements();en.hasMoreElements();){
+                       FlagState fs_taskexit=(FlagState)en.nextElement();
+                       if (!sourcenodes.containsKey(fs_taskexit)) {
+                           toprocess.add(fs_taskexit);
                        }
-               }
-               return false;
+                       //seen this node already
+                       fs_taskexit=canonicalizeFlagState(sourcenodes,fs_taskexit);
+                       FEdge newedge=new FEdge(fs_taskexit,taskname);
+                       fs.addEdge(newedge);
+                   }
+                   continue;
+               }
+           }
+           /* Queue other nodes past this one */
+           for(int i=0;i<fn1.numNext();i++) {
+               FlatNode fnext=fn1.getNext(i);
+               if (!discovered.contains(fnext)) {
+                   discovered.add(fnext);
+                   nodestack.push(fnext);
+               }
+           }
        }
+    }
+}
 
-       private boolean existsInQueue(TriggerState ts)
-       {
-               for(Iterator it_queue=q_main.iterator();it_queue.hasNext();)
-               {
-                       TriggerState ts_local=(TriggerState)it_queue.next();
 
-                       if (ts_local.equals(ts))
-                       {       
-                               return true;
-                       }
+/** Determines whether the given flagstate satisfies a 
+ *  single parameter in the given task.
+ *  @param fen FlagExpressionNode
+ *  @see FlagExpressionNode
+ *  @param fs  FlagState
+ *  @see FlagState
+ *  @return <CODE>true</CODE> if fs satisfies the boolean expression
+    denoted by fen else <CODE>false</CODE>.
+ */
+
+
+private boolean isTaskTrigger_flag(FlagExpressionNode fen,FlagState fs) {
+    if (fen==null)
+       return true;
+    else if (fen instanceof FlagNode)
+       return fs.get(((FlagNode)fen).getFlag());
+    else
+       switch (((FlagOpNode)fen).getOp().getOp()) {
+       case Operation.LOGIC_AND:
+           return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs)));
+       case Operation.LOGIC_OR:
+           return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs)));
+       case Operation.LOGIC_NOT:
+           return !(isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs));
+       default:
+           return false;
+       }
+}
 
+private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){
+       
+       if (tel!=null){
+       for (int i=0;i<tel.numTags() ; i++){
+               switch (fs.getTagCount(tel.getType(i))){
+                       case FlagState.ONETAG:
+                       case FlagState.MULTITAGS:
+                               break;
+                       case FlagState.NOTAGS:
+                               return false;
                }
-               return false;
-
        }
-               
-       private boolean existsInFSQueue(Queue q,FlagState fs)
-       {
-               for (Iterator it_q=q.iterator();it_q.hasNext();)
-               {
-                       if(((FlagState)it_q.next()).isEqual(fs))
-                               return true;
-                       
-               }
-               return false;
        }
+       return true;
+}
 
-       public void printAdjList(ClassDescriptor cd)
-       {
-               Enumeration e=((Hashtable)Adj_List.get(cd)).keys();
-               //System.out.println(Adj_List.size());
-
-                while(e.hasMoreElements())
-                {
-                       FlagState fsv = (FlagState)(e.nextElement());
-               //      System.out.println("fsv val: "+Adj_List.get(fsv));
-                       System.out.println(fsv.toString((FlagDescriptor [])flags.get(cd)));
-               }
+/*private int tagTypeCount(TagExpressionList tel, String tagtype){
+       int ctr=0;
+       for(int i=0;i<tel.numTags() ; i++){
+               if (tel.getType(i).equals(tagtype))
+                       ctr++;
        }
-       public void createDOTfile(ClassDescriptor cd) throws java.io.IOException
-       {
-
-               File dotfile= new File("graph"+cd.getSymbol()+".dot");
-
-               FileWriter dotwriter=new FileWriter(dotfile,true);
+       return ctr;
+} */
 
-               dotwriter.write("digraph G{ \n");
+    private Vector<FlagState> evalTaskExitNode(FlatFlagActionNode ffan,ClassDescriptor cd,FlagState fs, TempDescriptor temp){
+       FlagState fstemp=fs;
+       Vector<FlagState> processed=new Vector<FlagState>();
 
-               dotwriter.write("center=true;\norientation=landscape;\n");
-
-
-               Enumeration e=((Hashtable)Adj_List.get(cd)).keys();
-               while(e.hasMoreElements())
-               {
-                       FlagState fsv = (FlagState)(e.nextElement());
-                       System.out.println(fsv.toString());
-                       Hashtable test=(Hashtable)Adj_List.get(cd);
-                       Vector edges=(Vector)test.get(fsv);
-                       for(int i=0;i < edges.size();i++)
-                       {
-                               dotwriter.write(fsv.toString((FlagDescriptor [])flags.get(cd))+" -> "+((Edge)edges.get(i)).getState().toString((FlagDescriptor [])flags.get(cd))+"[label=\""+((Edge)edges.get(i)).getName()+"\"];\n");
-                       }
-
-               }
-               dotwriter.write("}\n");
-               dotwriter.flush();
-               dotwriter.close();
+       //Process the flag changes
+       
+       for(Iterator it_tfp=ffan.getTempFlagPairs();it_tfp.hasNext();) {
+           TempFlagPair tfp=(TempFlagPair)it_tfp.next();
+           if (temp==tfp.getTemp())
+               fstemp=fstemp.setFlag(tfp.getFlag(),ffan.getFlagChange(tfp));
        }
+       
+       //Process the tag changes
 
-       private String getTaskName(TaskDescriptor td)
-       {
-               StringTokenizer st = new StringTokenizer(td.toString(),"(");
-               return st.nextToken();
+       processed.add(fstemp);
+       
+       //Process clears first
+       for(Iterator it_ttp=ffan.getTempTagPairs();it_ttp.hasNext();) {
+           TempTagPair ttp=(TempTagPair)it_ttp.next();
+           
+           if (temp==ttp.getTemp()) {
+               Vector<FlagState> oldprocess=processed;
+               processed=new Vector<FlagState>();
+
+               for (Enumeration en=oldprocess.elements();en.hasMoreElements();){
+                   FlagState fsworking=(FlagState)en.nextElement();
+                   if (!ffan.getTagChange(ttp)){
+                       processed.addAll(Arrays.asList(fsworking.clearTag(ttp.getTag())));
+                   } else processed.add(fsworking);
+               }
+           }
        }
-       private boolean edgeexists(Hashtable Adj_List_local,FlagState v1, FlagState v2,String name)
-       {
-               Vector edges=(Vector)Adj_List_local.get(v1);
-
-               if (edges == null)
-               {
-                       System.out.println("no edges");
-               }
-               else
-               {for(int i=0;i < edges.size();i++)
-                       {
-                       FlagState fs=((Edge)edges.get(i)).getState();
-                       if (fs.isEqual(v2) && (name.compareTo(((Edge)edges.get(i)).getName())==0))
-                               return true;
-                       }
-               }
-               return false;
+       //Process sets next
+       for(Iterator it_ttp=ffan.getTempTagPairs();it_ttp.hasNext();) {
+           TempTagPair ttp=(TempTagPair)it_ttp.next();
+           
+           if (temp==ttp.getTemp()) {
+               Vector<FlagState> oldprocess=processed;
+               processed=new Vector<FlagState>();
+
+               for (Enumeration en=oldprocess.elements();en.hasMoreElements();){
+                   FlagState fsworking=(FlagState)en.nextElement();
+                   if (ffan.getTagChange(ttp)){
+                       processed.addAll(Arrays.asList(fsworking.setTag(ttp.getTag())));
+                   } else processed.add(fsworking);
+               }
+           }
        }
-       private void processExterns(boolean onlyExterns,ClassDescriptor cd) throws java.io.IOException
-       {
-               int noOfIterations;
-               Hashtable Adj_List_temp;
-               if (Adj_List.containsKey(cd))
-               {
-                       Adj_List_temp=(Hashtable)Adj_List.get(cd);
-               }
-               else
-               {
-                       Adj_List_temp=new Hashtable();
-                       Adj_List.put(cd,Adj_List_temp);
-               }
-
-
-               if (onlyExterns)
-               {
-                       FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
-                       System.out.println("onlyExterns"+fd.length);
-                       noOfIterations=(int)Math.pow(2.0,fd.length);
-                       boolean BoolValTable[]=new boolean[fd.length];
-
-                       for(int i=0; i < fd.length ; i++)
-                       {
-                               System.out.println(fd[i].getSymbol());
-                               BoolValTable[i]=false;
-                       }
-                       Adj_List_temp.put(new FlagState(fd),new Vector());
-
-                       for(int k=1; k<noOfIterations; k++)
-                       {
-                               for(int j=0; j< fd.length ;j++)
-                               {
-                                       if (k% (int)Math.pow(2.0,(double)j) == 0)
-                                               BoolValTable[j]=(!BoolValTable[j]);
-                               }
-
-                               FlagState fstemp=new FlagState(fd);
-                               int i=0;
-                               for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++)
-                               {
-                                       fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
-                               }
-                               Adj_List_temp.put(fstemp,new Vector());
-                       }
-
-                       Enumeration e=Adj_List_temp.keys();
-                       while(e.hasMoreElements())
-                       {
-                               FlagState fstemp=(FlagState)e.nextElement();
-                               Enumeration en=Adj_List_temp.keys();
-                               while (en.hasMoreElements())
-                               {
-                                       FlagState fs=(FlagState)en.nextElement();
-                                       if(fstemp == fs)
-                                       {
-                                               continue;
-                                       }
-                                       else
-                                       {
-                                               ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs,"Runtime"));
-                                       }
-                               }
-                       }
-               }
-       //      createDOTfile(cd);
-
-
-       } 
-
-       private Queue createPossibleRuntimeStates(TriggerState ts) throws java.io.IOException
-       {
-               int noOfIterations, externs;
-               Hashtable Adj_List_temp;
-               boolean onlyExterns;
-               
-               System.out.println("Inside CreatePossible runtime states");
-
-               ClassDescriptor cd = ts.getClassDescriptor();
-               FlagState fs= ts.getState();
-               if (Adj_List.containsKey(cd))
-               {
-                       Adj_List_temp=(Hashtable)Adj_List.get(cd);
-               }
-               else
-               {
-                       Adj_List_temp=new Hashtable();
-                       Adj_List.put(cd,Adj_List_temp);
-               }
-
-               externs=((Integer)extern_flags.get(cd)).intValue();
-
-               FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
-
-               if (fd.length == externs)
-                       onlyExterns=true;
-               else
-                       onlyExterns=false;
-
-               Queue  q_ret;
-
-               q_ret=new LinkedList();
-
-               if (onlyExterns)
-               {
-               //      FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
-               //      System.out.println("onlyExterns"+fd.length);
-                       noOfIterations=(int)Math.pow(2.0,fd.length);
-                       boolean BoolValTable[]=new boolean[fd.length];
-
-
-
-
-                       for(int i=0; i < fd.length ; i++)
-                       {
-                               System.out.println(fd[i].getSymbol());
-                               BoolValTable[i]=false;
-                       }
-
-                       if (! wasFlagStateProcessed(Adj_List_temp,fs))
-                       {
-                               TriggerState ts_local=new TriggerState(cd,fs);
-                               if (!existsInQueue(ts_local))
-                               {       
-                                       q_ret.offer(ts_local);
-                               }
-                               //q_ret.offer(new TriggerState(cd,fs));
-                               Adj_List_temp.put(fs,new Vector());
-                       }
-
-                       for(int k=1; k<noOfIterations; k++)
-                       {
-                               for(int j=0; j< fd.length ;j++)
-                               {
-                                       if (k% (int)Math.pow(2.0,(double)j) == 0)
-                                               BoolValTable[j]=(!BoolValTable[j]);
-                               }
-
-                               FlagState fstemp=new FlagState(fs.getStateTable());
-                               int i=0;
-                               for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++)
-                               {
-                                       fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
-                               }
-
-                               if (wasFlagStateProcessed(Adj_List_temp,fstemp))
-                               {
-                                       continue;
-                               }
-                               else
-                               {       
-                                       TriggerState ts_local=new TriggerState(cd,fstemp);
-                                       if (!existsInQueue(ts_local))
-                                       {       
-                                               q_ret.offer(ts_local);
-                                       }
-
-                                       
-                                       Adj_List_temp.put(fstemp,new Vector());
-                               }
-
-                       }
-
-                       Enumeration e=Adj_List_temp.keys();
-                       while(e.hasMoreElements())
-                       {
-                               FlagState fstemp=(FlagState)e.nextElement();
-                               Enumeration en=Adj_List_temp.keys();
-                               while (en.hasMoreElements())
-                               {
-                                       FlagState fs_local=(FlagState)en.nextElement();
-                                       if(fstemp == fs_local)
-                                       {
-                                               continue;
-                                       }
-                                       else
-                                       {
-                                               ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs_local,"Runtime"));
-                                       }
-                               }
-                       }
-
-                       return q_ret;
-               }
-               else
-               {
-                       System.out.println("inside else part");
-                       noOfIterations=(int)Math.pow(2.0,externs);
-                       boolean BoolValTable[]=new boolean[externs];
-                       Hashtable Adj_List_local;
-
-
-                       Adj_List_local=new Hashtable();
-
-                       for(int i=0; i < externs ; i++)
-                       {
-                               System.out.println(fd[i].getSymbol());
-                               BoolValTable[i]=fs.get(fd[i]);
-                       }
-
-                       if (! wasFlagStateProcessed(Adj_List_temp,fs))
-                       {
-                               //q_ret.offer(new TriggerState(cd,fs));
-                       //      Adj_List_local.put(fs, new Vector());
-                               //Adj_List_temp.put(fs,new Vector());
-                       }
-                       for(int k=1; k<noOfIterations; k++)
-                       {
-                               for(int j=0; j< fd.length ;j++)
-                               {
-                                       if (k% (int)Math.pow(2.0,(double)j) == 0)
-                                               BoolValTable[j]=(!BoolValTable[j]);
-                               }
-
-                               FlagState fstemp=new FlagState(fs.getStateTable());
-                               FlagDescriptor fdtemp[]=(FlagDescriptor [])flags.get(cd);
-
-                               for(int i=0; i < externs;i++)
-                               {
-                                       fstemp.put(fdtemp[i],new Boolean(BoolValTable[i]));
-                               }
-
-                                       q_ret.offer(new TriggerState(cd,fstemp));
-//                                     ((Vector)(Adj_List_temp.get(fs))).add(new Edge(fstemp,"Runtime"));
-                               //      Adj_List_local.put(fstemp, new Vector());
-                                       //Adj_List_temp.put(fstemp,new Vector());
-
-                       }
-                       /*      Enumeration e=Adj_List_local.keys();
-                               while(e.hasMoreElements())
-                               {
-                                       FlagState fstemp=(FlagState)e.nextElement();
-                                       Enumeration en=Adj_List_local.keys();
-                                       while (en.hasMoreElements())
-                                       {
-                                               FlagState fs_local=(FlagState)en.nextElement();
-                                               if(fstemp == fs_local)
-                                               {
-                                                       continue;
-                                               }
-                                               else
-                                               {
-                                                       ((Vector)Adj_List_local.get(fstemp)).add(new Edge(fs_local,"Runtime"));
-                                               }
-                                       }
-
-                               }
-                               Adj_List_temp.putAll(Adj_List_local);
-                       */
-                       return q_ret;
-
-               }
-}
-
-
-
-
-private Queue createPossibleRuntimeStates(ClassDescriptor cd,FlagState fs) throws java.io.IOException
-       {
-               int noOfIterations, externs;
-               Hashtable Adj_List_temp;
-               boolean onlyExterns;
-               
-               System.out.println("Inside CreatePossible runtime states(flagstates)");
-
-               //ClassDescriptor cd = ts.getClassDescriptor();
-               //FlagState fs= ts.getState();
-               if (Adj_List.containsKey(cd))
-               {
-                       Adj_List_temp=(Hashtable)Adj_List.get(cd);
-               }
-               else
-               {
-                       Adj_List_temp=new Hashtable();
-                       Adj_List.put(cd,Adj_List_temp);
-               }
-
-               externs=((Integer)extern_flags.get(cd)).intValue();
-
-               FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
-
-               if (fd.length == externs)
-                       onlyExterns=true;
-               else
-                       onlyExterns=false;
-
-               Queue  q_ret;
-
-               q_ret=new LinkedList();
-
-               if (onlyExterns)
-               {
-               //      FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
-               //      System.out.println("onlyExterns"+fd.length);
-                       noOfIterations=(int)Math.pow(2.0,fd.length);
-                       boolean BoolValTable[]=new boolean[fd.length];
-
-
-
-
-                       for(int i=0; i < fd.length ; i++)
-                       {
-                               System.out.println(fd[i].getSymbol());
-                               BoolValTable[i]=false;
-                       }
-
-                       /*if (! wasFlagStateProcessed(Adj_List_temp,fs))
-                       {
-                               FlagState fs_local=new FlagState(fs.getStateTable());
-                               if (!existsInQueue(ts_local))
-                               {       
-                                       q_ret.offer(ts_local);
-                               }
-                               //q_ret.offer(new TriggerState(cd,fs));
-                               Adj_List_temp.put(fs,new Vector());
-                       }
-
-                       for(int k=1; k<noOfIterations; k++)
-                       {
-                               for(int j=0; j< fd.length ;j++)
-                               {
-                                       if (k% (int)Math.pow(2.0,(double)j) == 0)
-                                               BoolValTable[j]=(!BoolValTable[j]);
-                               }
-
-                               FlagState fstemp=new FlagState(fs.getStateTable());
-                               int i=0;
-                               for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++)
-                               {
-                                       fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
-                               }
-
-                               if (wasFlagStateProcessed(Adj_List_temp,fstemp))
-                               {
-                                       continue;
-                               }
-                               else
-                               {       
-                                       TriggerState ts_local=new TriggerState(cd,fstemp);
-                                       if (!existsInQueue(ts_local))
-                                       {       
-                                               q_ret.offer(ts_local);
-                                       }
-
-                                       
-                                       Adj_List_temp.put(fstemp,new Vector());
-                               }
-
-                       }
-
-                       Enumeration e=Adj_List_temp.keys();
-                       while(e.hasMoreElements())
-                       {
-                               FlagState fstemp=(FlagState)e.nextElement();
-                               Enumeration en=Adj_List_temp.keys();
-                               while (en.hasMoreElements())
-                               {
-                                       FlagState fs_local=(FlagState)en.nextElement();
-                                       if(fstemp == fs_local)
-                                       {
-                                               continue;
-                                       }
-                                       else
-                                       {
-                                               ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs_local,"Runtime"));
-                                       }
-                               }
-                       }*/
-
-                       return q_ret;
-               }
-               else
-               {
-                       System.out.println("inside else part(fs)");
-                       noOfIterations=(int)Math.pow(2.0,externs);
-                       boolean BoolValTable[]=new boolean[externs];
-                       Hashtable Adj_List_local;
-
-
-                       Adj_List_local=new Hashtable();
-
-                       for(int i=0; i < externs ; i++)
-                       {
-                               System.out.println(fd[i].getSymbol());
-                               BoolValTable[i]=fs.get(fd[i]);
-                       }
-
-                       if (! wasFlagStateProcessed(Adj_List_temp,fs))
-                       {
-                               //q_ret.offer(fs));
-                       //      Adj_List_local.put(fs, new Vector());
-                               Adj_List_temp.put(fs,new Vector());
-                       }
-                       for(int k=1; k<noOfIterations; k++)
-                       {
-                               for(int j=0; j< fd.length ;j++)
-                               {
-                                       if (k% (int)Math.pow(2.0,(double)j) == 0)
-                                               BoolValTable[j]=(!BoolValTable[j]);
-                               }
-
-                               FlagState fstemp=new FlagState(fs.getStateTable());
-                               FlagDescriptor fdtemp[]=(FlagDescriptor [])flags.get(cd);
-
-                               for(int i=0; i < externs;i++)
-                               {
-                                       fstemp.put(fdtemp[i],new Boolean(BoolValTable[i]));
-                               }
-
-                                       q_ret.offer(fstemp);
-                                       ((Vector)(Adj_List_temp.get(fs))).add(new Edge(fstemp,"Runtime"));
-                                       //Adj_List_local.put(fstemp, new Vector());
-                                       //Adj_List_temp.put(fstemp,new Vector());
-
-                       }
-                       /*      Enumeration e=Adj_List_local.keys();
-                               while(e.hasMoreElements())
-                               {
-                                       FlagState fstemp=(FlagState)e.nextElement();
-                                       Enumeration en=Adj_List_local.keys();
-                                       while (en.hasMoreElements())
-                                       {
-                                               FlagState fs_local=(FlagState)en.nextElement();
-                                               if(fstemp == fs_local)
-                                               {
-                                                       continue;
-                                               }
-                                               else
-                                               {
-                                                       ((Vector)Adj_List_local.get(fstemp)).add(new Edge(fs_local,"Runtime"));
-                                               }
-                                       }
-
-                               }
-                               Adj_List_temp.putAll(Adj_List_local);
-                       */
-                       return q_ret;
-
-               }
-}
-
-
-/*private Queue createPossibleRuntimeStates(ClassDescriptor cd) throws java.io.IOException
-       {
-               int noOfIterations, externs;
-               Hashtable Adj_List_temp;
-                               
-               externs=((Integer)extern_flags.get(cd)).intValue();
-
-               FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
-               if (Adj_List.containsKey(cd))
-               {
-                       Adj_List_temp=(Hashtable)Adj_List.get(cd);
-               }
-               else
-               {
-                       Adj_List_temp=new Hashtable();
-                       Adj_List.put(cd,Adj_List_temp);
-               }
-
-               
-               Queue  q_ret;
-
-               q_ret=new LinkedList();
-
-               
-               //      FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
-               //      System.out.println("onlyExterns"+fd.length);
-                       noOfIterations=(int)Math.pow(2.0,fd.length);
-                       boolean BoolValTable[]=new boolean[fd.length];
-
-                       for(int i=0; i < fd.length ; i++)
-                       {
-                               System.out.println(fd[i].getSymbol());
-                               BoolValTable[i]=false;
-                       }
-
-                       if (! wasFlagStateProcessed(Adj_List_temp,fs))
-                       {       
-                               TriggerState ts_local=new TriggerState(cd,fs);
-                               if (!existsInQueue(ts_local))
-                               {       
-                                       q_ret.offer(ts_local);
-                               }
-                               Adj_List_temp.put(fs,new Vector());
-                       }
-
-                       for(int k=1; k<noOfIterations; k++)
-                       {
-                               for(int j=0; j< fd.length ;j++)
-                               {
-                                       if (k% (int)Math.pow(2.0,(double)j) == 0)
-                                               BoolValTable[j]=(!BoolValTable[j]);
-                               }
-
-                               FlagState fstemp=new FlagState(fs.getStateTable());
-                               int i=0;
-                               for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++)
-                               {
-                                       fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
-                               }
-
-                               if (wasFlagStateProcessed(Adj_List_temp,fstemp))
-                               {
-                                       continue;
-                               }
-                               else
-                               {
-                                       TriggerState ts_local=new TriggerState(cd,fstemp);
-                                       if (!existsInQueue(ts_local))
-                                       {       
-                                               q_ret.offer(ts_local);
-                                       }
-
-                                       Adj_List_temp.put(fstemp,new Vector());
-                               }
-
-                       }
-
-                       Enumeration e=Adj_List_temp.keys();
-                       while(e.hasMoreElements())
-                       {
-                               FlagState fstemp=(FlagState)e.nextElement();
-                               Enumeration en=Adj_List_temp.keys();
-                               while (en.hasMoreElements())
-                               {
-                                       FlagState fs_local=(FlagState)en.nextElement();
-                                       if(fstemp == fs_local)
-                                       {
-                                               continue;
-                                       }
-                                       else
-                                       {
-                                               ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs_local,"Runtime"));
-                                       }
-                               }
-                       }
-
-                       return q_ret;
-               
-               //createDOTfile(cd);
-
-
+       return processed;
+    }          
+    
+
+    private FlagState canonicalizeFlagState(Hashtable sourcenodes, FlagState fs){
+       if (sourcenodes.containsKey(fs))
+           return (FlagState)sourcenodes.get(fs);
+       else{
+           sourcenodes.put(fs,fs);
+           return fs;
        }
-*/
-
-
-
-       private void processTasksWithPost(ClassDescriptor cd, Hashtable pre)
-       {
-               //
+    }
+
+   /** Creates a DOT file using the flagstates for a given class
+    *  @param cd ClassDescriptor of the class
+    *  @throws java.io.IOException
+    *  @see ClassDescriptor
+    */
+    
+    public void createDOTfile(ClassDescriptor cd) throws java.io.IOException {
+       File dotfile_flagstates= new File("graph"+cd.getSymbol()+".dot");
+       FileOutputStream dotstream=new FileOutputStream(dotfile_flagstates,true);
+       FlagState.DOTVisitor.visit(dotstream,((Hashtable)flagstates.get(cd)).values());
+    }
+
+    /** Returns the flag states for the class descriptor. */
+    public Set getFlagStates(ClassDescriptor cd) {
+       if (flagstates.containsKey(cd))
+           return ((Hashtable)flagstates.get(cd)).keySet();
+       else
+           return null;
+    }
+
+
+    private void createPossibleRuntimeStates(FlagState fs) {
+    ClassDescriptor cd = fs.getClassDescriptor();
+    Hashtable<FlagState,FlagState> sourcenodes=(Hashtable<FlagState,FlagState>)flagstates.get(cd);
+    FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);       
+    int externs=((Integer)extern_flags.get(cd)).intValue();
+    
+    if(externs==0)
+       return;
+
+    int noOfIterations=(1<<externs) - 1;
+    boolean BoolValTable[]=new boolean[externs];
+
+
+    for(int i=0; i < externs ; i++) {
+       BoolValTable[i]=fs.get(fd[i]);
+    }
+
+       for(int k=0; k<noOfIterations; k++) {
+       for(int j=0; j < externs ;j++) {
+           if ((k% (1<<j)) == 0)
+               BoolValTable[j]=(!BoolValTable[j]);
        }
-
-/*     public Vector getInitialStates(ClassDescriptor cd)
-       {
-
+       
+       FlagState fstemp=fs;
+       
+       for(int i=0; i < externs;i++) {
+           fstemp=fstemp.setFlag(fd[i],BoolValTable[i]);
        }
-*/
-       private ClassDescriptor processFlatNew(FlatNode fn)
-       {
-               if (! (fn.getNext(0).kind() == 13))
-               {
-                       return (((FlatNew)fn).getType().getClassDesc());
-               }
-               return null;
+       if (!sourcenodes.containsKey(fstemp))
+           toprocess.add(fstemp);
 
+       fstemp=canonicalizeFlagState(sourcenodes,fstemp);
+       fs.addEdge(new FEdge(fstemp,"Runtime"));
+    }
+       }
+       
+       public Vector getRootNodes(ClassDescriptor cd){
+               return (Vector)cdtorootnodes.get(cd);
        }
 
-}
+
+   
+} 
+