/* * PerformYieldTypeChecking : * 3.1 Input parameters : * 3.1.1 MoverTypeChecker moverTypeChecker : * 3.2 Action : This function is called in TypeCheck.cs. This is the only function that is externalized. This function traverses the program declarations and performs */ public static void PerformYieldTypeChecking(MoverTypeChecker moverTypeChecker) { Program yieldTypeCheckedProgram = moverTypeChecker.program; YieldTypeChecker regExprToAuto = new YieldTypeChecker(); foreach (var decl in yieldTypeCheckedProgram.TopLevelDeclarations) { Implementation impl = decl as Implementation; if (impl == null) { continue; } int phaseNumSpecImpl = moverTypeChecker.FindPhaseNumber(impl.Proc); YieldTypeCheckerCore yieldTypeCheckerPerImpl = new YieldTypeCheckerCore(moverTypeChecker); List <Tuple <int, int> > phaseIntervals = ComputePhaseIntervals(impl, phaseNumSpecImpl, moverTypeChecker); // Compute intervals for (int i = 0; i < phaseIntervals.Count; i++) // take current phase check num from each interval { int yTypeCheckCurrentPhaseNum = phaseIntervals[i].Item1; Automaton <BvSet> yieldTypeCheckAutoPerPhase = yieldTypeCheckerPerImpl.YieldTypeCheckAutomaton(impl, phaseNumSpecImpl, yTypeCheckCurrentPhaseNum); if (!IsYieldTypeSafe(yieldTypeCheckAutoPerPhase, impl, moverTypeChecker, i)) { moverTypeChecker.Error(impl, "\n Body of " + impl.Proc.Name + " is not yield type safe " + "\n"); } } } }
/* * ComputePhaseIntervals : * 1.1 Input parameters : * 1.1.1 Implementation impl : Implementation whose body is being YTS checked. * 1.1.2 int specPhaseNumImpl : Phase number in which procedure of implementation, impl, reaches its specification,{A,R,L,B} * 1.1.3 MoverTypeChecker moverTypeChecker : moverTypeChecker is the integration point of YieldTypeChecker to OG class. moverTypeChecker has functions enables YieldTypeChecker to find phaseNum and spec of procedures. * * 1.2 Return value : is a list of tuples(phase interval start,phase interval end). Every tuple in this list is representing an interval formed by callCmds' phase numbers inside impl. * 1.3 Action : This function first traverses the blocks inside impl, collects all CallCmds inside it into a HashSet ,callCmdsInImpl. * Then it puts all these callCmds' phase numbers into a HashSet,callCmdPhaseNumSet. * After adding all callCmds' phase numbers' it adds phase number of procedure of impl into the set. * It sorts all numbers in this set and creates [-inf...n-1] [n...k-1] [k PhaseNumProcOfImpl] disjoint intervals. */ private static List <Tuple <int, int> > ComputePhaseIntervals(Implementation impl, int specPhaseNumImpl, MoverTypeChecker moverTypeChecker) { HashSet <CallCmd> callCmdsInImpl = new HashSet <CallCmd>(); // callCmdsInImpl[Implementation] ==> Set = { call1, call2, call3 ... } List <Tuple <int, int> > phaseIntervals = new List <Tuple <int, int> >(); // [MinValue ph0 ] [ph0 ph1] [ph1 ph2] ..... [phk phk+1] intervals // Compute CallCmds inside impl foreach (Block b in impl.Blocks) { for (int i = 0; i < b.Cmds.Count; i++) { CallCmd callCmd = b.Cmds[i] as CallCmd; if (callCmd == null) { continue; } callCmdsInImpl.Add(callCmd); } } //Collect phase numbers of CallCmds inside impl HashSet <int> callCmdPhaseNumSet = new HashSet <int>(); foreach (CallCmd callCmd in callCmdsInImpl) { int tmpPhaseNum = moverTypeChecker.FindPhaseNumber(callCmd.Proc); callCmdPhaseNumSet.Add(tmpPhaseNum); } callCmdPhaseNumSet.Add(specPhaseNumImpl); List <int> callCmdPhaseNumList = callCmdPhaseNumSet.ToList(); callCmdPhaseNumList.Sort(); //Create Phase Intervals for (int i = 0; i < callCmdPhaseNumList.Count; i++) { //create the initial phase (-inf leastPhaseNum] if (i == 0) { Tuple <int, int> initTuple = new Tuple <int, int>(int.MinValue, callCmdPhaseNumList[i]); phaseIntervals.Add(initTuple); } else // create other phase intervals { Tuple <int, int> intervalToInsert = new Tuple <int, int>(callCmdPhaseNumList[i - 1] + 1, callCmdPhaseNumList[i]); phaseIntervals.Add(intervalToInsert); } } #if (DEBUG && !DEBUG_DETAIL) Console.Write("\n Number of phases is " + phaseIntervals.Count.ToString()); for (int i = 0; i < phaseIntervals.Count; i++) { Console.Write("\n Phase " + i.ToString() + "[" + phaseIntervals[i].Item1.ToString() + "," + phaseIntervals[i].Item2.ToString() + "]" + "\n"); } #endif return(phaseIntervals); }
/* ComputePhaseIntervals : 1.1 Input parameters : 1.1.1 Implementation impl : Implementation whose body is being YTS checked. 1.1.2 int specPhaseNumImpl : Phase number in which procedure of implementation, impl, reaches its specification,{A,R,L,B} 1.1.3 MoverTypeChecker moverTypeChecker : moverTypeChecker is the integration point of YieldTypeChecker to OG class. moverTypeChecker has functions enables YieldTypeChecker to find phaseNum and spec of procedures. 1.2 Return value : is a list of tuples(phase interval start,phase interval end). Every tuple in this list is representing an interval formed by callCmds' phase numbers inside impl. 1.3 Action : This function first traverses the blocks inside impl, collects all CallCmds inside it into a HashSet ,callCmdsInImpl. * Then it puts all these callCmds' phase numbers into a HashSet,callCmdPhaseNumSet. * After adding all callCmds' phase numbers' it adds phase number of procedure of impl into the set. * It sorts all numbers in this set and creates [-inf...n-1] [n...k-1] [k PhaseNumProcOfImpl] disjoint intervals. */ private static List<Tuple<int, int>> ComputePhaseIntervals(Implementation impl, int specPhaseNumImpl, MoverTypeChecker moverTypeChecker) { HashSet<CallCmd> callCmdsInImpl = new HashSet<CallCmd>(); // callCmdsInImpl[Implementation] ==> Set = { call1, call2, call3 ... } List<Tuple<int, int>> phaseIntervals = new List<Tuple<int, int>>(); // [MinValue ph0 ] [ph0 ph1] [ph1 ph2] ..... [phk phk+1] intervals // Compute CallCmds inside impl foreach (Block b in impl.Blocks) { for (int i = 0; i < b.Cmds.Count; i++) { CallCmd callCmd = b.Cmds[i] as CallCmd; if (callCmd == null) continue; callCmdsInImpl.Add(callCmd); } } //Collect phase numbers of CallCmds inside impl HashSet<int> callCmdPhaseNumSet = new HashSet<int>(); foreach (CallCmd callCmd in callCmdsInImpl) { int tmpPhaseNum = moverTypeChecker.FindPhaseNumber(callCmd.Proc); callCmdPhaseNumSet.Add(tmpPhaseNum); } callCmdPhaseNumSet.Add(specPhaseNumImpl); List<int> callCmdPhaseNumList = callCmdPhaseNumSet.ToList(); callCmdPhaseNumList.Sort(); //Create Phase Intervals for (int i = 0; i < callCmdPhaseNumList.Count; i++) { //create the initial phase (-inf leastPhaseNum] if (i == 0) { Tuple<int, int> initTuple = new Tuple<int, int>(int.MinValue, callCmdPhaseNumList[i]); phaseIntervals.Add(initTuple); } else // create other phase intervals { Tuple<int, int> intervalToInsert = new Tuple<int, int>(callCmdPhaseNumList[i - 1] + 1, callCmdPhaseNumList[i]); phaseIntervals.Add(intervalToInsert); } } #if (DEBUG && !DEBUG_DETAIL) Console.Write("\n Number of phases is " + phaseIntervals.Count.ToString()); for (int i = 0;i<phaseIntervals.Count ; i++) { Console.Write("\n Phase " + i.ToString() + "[" + phaseIntervals[i].Item1.ToString() + "," + phaseIntervals[i].Item2.ToString() + "]" + "\n"); } #endif return phaseIntervals; }
private bool IsCallCmdExitPoint(Cmd cmd, int yTypeCheckCurrentPhaseNum) { if (cmd is CallCmd) { CallCmd callee = cmd as CallCmd; int phaseSpecCallee = moverTypeChecker.FindPhaseNumber(callee.Proc); if (phaseSpecCallee >= yTypeCheckCurrentPhaseNum) { #if DEBUG && !DEBUG_DETAIL Console.Write("\nCall Cmd Check is " + callCmd.Proc.Name + "\n"); #endif return(true); } } return(false); }
/* PerformYieldTypeChecking : 3.1 Input parameters : 3.1.1 MoverTypeChecker moverTypeChecker : 3.2 Action : This function is called in TypeCheck.cs. This is the only function that is externalized. This function traverses the program declarations and performs */ public static void PerformYieldTypeChecking(MoverTypeChecker moverTypeChecker) { Program yieldTypeCheckedProgram = moverTypeChecker.program; YieldTypeChecker regExprToAuto = new YieldTypeChecker(); foreach (var decl in yieldTypeCheckedProgram.TopLevelDeclarations) { Implementation impl = decl as Implementation; if (impl == null) continue; int phaseNumSpecImpl = moverTypeChecker.FindPhaseNumber(impl.Proc); YieldTypeCheckerCore yieldTypeCheckerPerImpl = new YieldTypeCheckerCore(moverTypeChecker); List<Tuple<int, int>> phaseIntervals = ComputePhaseIntervals(impl, phaseNumSpecImpl, moverTypeChecker); // Compute intervals for (int i = 0; i < phaseIntervals.Count; i++) // take current phase check num from each interval { int yTypeCheckCurrentPhaseNum = phaseIntervals[i].Item1; Automaton<BvSet> yieldTypeCheckAutoPerPhase = yieldTypeCheckerPerImpl.YieldTypeCheckAutomaton(impl, phaseNumSpecImpl, yTypeCheckCurrentPhaseNum); if (!IsYieldTypeSafe(yieldTypeCheckAutoPerPhase, impl, moverTypeChecker, i)) { moverTypeChecker.Error(impl, "\n Body of " + impl.Proc.Name + " is not yield type safe " + "\n"); } } } }