Exemplo n.º 1
0
        public StagedHoudini(Program program, HoudiniSession.HoudiniStatistics houdiniStats,
                             Func <string, Program> ProgramFromFile)
        {
            this.program          = program;
            this.houdiniStats     = houdiniStats;
            this.ProgramFromFile  = ProgramFromFile;
            this.houdiniInstances = new List <Houdini> [CommandLineOptions.Clo.StagedHoudiniThreads];
            for (int i = 0; i < CommandLineOptions.Clo.StagedHoudiniThreads; i++)
            {
                houdiniInstances[i] = new List <Houdini>();
            }

            BreakApartConjunctionsInAnnotations();

            var annotationDependenceAnalyser = new AnnotationDependenceAnalyser(program);

            annotationDependenceAnalyser.Analyse();
            this.plan = annotationDependenceAnalyser.ApplyStages();
            if (CommandLineOptions.Clo.Trace)
            {
                annotationDependenceAnalyser.dump();

                if (CommandLineOptions.Clo.DebugStagedHoudini)
                {
                    Console.WriteLine("Plan\n====\n");
                    if (plan == null)
                    {
                        Console.WriteLine("No plan, as there were no stages");
                    }
                    else
                    {
                        Console.WriteLine(this.plan);
                    }
                }

                EmitProgram("staged.bpl");
            }
        }
        internal AnnotationReachabilityChecker(Program prog, IEnumerable <string> AnnotationIdentifiers)
        {
            this.prog = prog;
            this.AnnotationIdentifiers  = AnnotationIdentifiers;
            this.reachabilityGraph      = new InterproceduralReachabilityGraph(prog);
            this.annotationToOccurences = new Dictionary <string, HashSet <object> >();

            // Add all annotation occurrences in blocks
            foreach (Block b in prog.Blocks())
            {
                foreach (var assertCmd in b.Cmds.OfType <AssertCmd>())
                {
                    string c;
                    if (Houdini.MatchCandidate(assertCmd.Expr, AnnotationIdentifiers, out c))
                    {
                        AddAnnotationOccurrence(c, b);
                    }
                    else
                    {
                        var tag = AnnotationDependenceAnalyser.GetTagFromNonCandidateAttributes(assertCmd.Attributes);
                        if (tag != null)
                        {
                            AddAnnotationOccurrence(tag, b);
                        }
                    }
                }
            }

            // Add all annotation occurrences in pre and post conditions
            foreach (var proc in prog.NonInlinedProcedures())
            {
                foreach (Requires r in proc.Requires)
                {
                    string c;
                    if (Houdini.MatchCandidate(r.Condition, AnnotationIdentifiers, out c))
                    {
                        AddAnnotationOccurrence(c, new Tuple <string, PrePost>(proc.Name, PrePost.PRE));
                    }
                    else
                    {
                        string tag = AnnotationDependenceAnalyser.GetTagFromNonCandidateAttributes(r.Attributes);
                        if (tag != null)
                        {
                            AddAnnotationOccurrence(tag, new Tuple <string, PrePost>(proc.Name, PrePost.PRE));
                        }
                    }
                }

                foreach (Ensures e in proc.Ensures)
                {
                    string c;
                    if (Houdini.MatchCandidate(e.Condition, AnnotationIdentifiers, out c))
                    {
                        AddAnnotationOccurrence(c, new Tuple <string, PrePost>(proc.Name, PrePost.POST));
                    }
                    else
                    {
                        string tag = AnnotationDependenceAnalyser.GetTagFromNonCandidateAttributes(e.Attributes);
                        if (tag != null)
                        {
                            AddAnnotationOccurrence(tag, new Tuple <string, PrePost>(proc.Name, PrePost.PRE));
                        }
                    }
                }
            }
        }