X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FTaskStateAnalysis%2FTaskAnalysis.java;h=c5b626a943b54fb6fba5f91b1167de91791cc920;hb=e657f2b3171b3fa1c6af965d71b9cf32066e407a;hp=83c2f3a07729a654de677c1fdedd53830e53c3dc;hpb=4d93ee5308fbb56b1f2704ba4844f6b19bcba27b;p=IRC.git diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java index 83c2f3a0..c5b626a9 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java @@ -1,1200 +1,428 @@ 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 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 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 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(); + + 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()); + cdtorootnodes.put(cd,new Vector()); + } + + + ClassDescriptor startupobject=typeutil.getClass(TypeUtil.StartupClass); + + sourcenodes=(Hashtable)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(); - - // 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 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 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 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 analyseTasks(TriggerState ts) throws java.io.IOException - { - Queue q; - Queue qft; - - Hashtable Adj_List_temp; - Queue 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(); - q_retval=new LinkedList(); - 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 sourcenodes=(Hashtable)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)flagstates.get(fsnew.getClassDescriptor())).containsKey(fsnew)) { + ((Hashtable)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 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;itrue if fs satisfies the boolean expression + denoted by fen else false. + */ + + +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 evalTaskExitNode(FlatFlagActionNode ffan,ClassDescriptor cd,FlagState fs, TempDescriptor temp){ + FlagState fstemp=fs; + Vector processed=new Vector(); - 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 oldprocess=processed; + processed=new Vector(); + + 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 oldprocess=processed; + processed=new Vector(); + + 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 sourcenodes=(Hashtable)flagstates.get(cd); + FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd); + int externs=((Integer)extern_flags.get(cd)).intValue(); + + if(externs==0) + return; + + int noOfIterations=(1<