public static void addPredicatesToBoogieFile(Program inprog, string outfile, string candidateFile) { // delete {:template} and {:trainingPredicates} procedure DeleteNonFreeTemplates(inprog); BoogieUtil.PrintProgram(inprog, outfile); #region ZL: read summaries from dababase. //var database = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), // "candidates.db"); var database = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), candidateFile); if (!System.IO.File.Exists(database)) { throw new Exception("File does not exist: " + database); } StubAnnotatedSummaryDictionary summaries = null; while (true) { try { using (var fs = new System.IO.FileStream(database, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)) { var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); summaries = StubAnnotatedSummaryDictionary.GetDictionary(serializer.Deserialize(fs)); break; } } catch (System.IO.IOException ex) { Thread.Sleep(300); Console.WriteLine("-- {0}: {1}", ex.GetType().Name, ex.ToString()); } } summaries.DeMarshall(z3exe); var numPreds = 0; string s = summaries.DumpPredicates(out numPreds); // TODO: 1. Add "free requires yogi_error == 0; free ensures alloc >= old(alloc);" // 2. Add the two long candidates for irql rules. // 3. Track Mem_T.int4. // 4. Add free ensures and free requires for type state variables. // 5. Add inline depth argument #endregion using (var file = new System.IO.StreamWriter(outfile, true)) { file.WriteLine("procedure {:template} summaryTemplates();"); file.WriteLine(s); if (debugging) { Console.WriteLine("Written summary tempaltes from cubes.db"); } } }
static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Usage: generator file.[c|bpl]"); return; } for (int i = 0; i < args.Count(); i++) { ProcessArg(args[i]); } var files = CommonLib.Util.GetFilesForUnion(args); if (files != null) { if (mode == MODE.GENERATE_ATOMS) { // merge atoms.db var dbs = new List <AtomDictionary>(); files.Iter(f => dbs.Add(TrainerDB.Driver.ReadAtomDB(f))); TrainerDB.Driver.WriteDB( AtomDictionary.Merge(dbs), CommonLib.GlobalConfig.util_result_file); } else if (mode == MODE.GENERATE_CANDIDATES) { // merge candidates db var dbs = new List <StubAnnotatedSummaryDictionary>(); files.Iter(f => dbs.Add(TrainerDB.Driver.ReadCandidateDB(f))); TrainerDB.Driver.WriteDB( StubAnnotatedSummaryDictionary.Merge(dbs), CommonLib.GlobalConfig.util_result_file); } else { // merge corral output var cat = new List <string>(); foreach (var file in files) { cat.AddRange(System.IO.File.ReadAllLines(file)); cat.Add("========="); } System.IO.File.WriteAllLines(CommonLib.GlobalConfig.util_result_file, cat); } return; } try { // Set up Boogie CommandLineOptions.Install(new CommandLineOptions()); CommandLineOptions.Clo.PrintInstrumented = true; // Set up corral, duality var root = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); wlimitexe = Path.Combine(root, "wlimit.exe"); corralexe = Path.Combine(root, "..", "corral", "corral.exe"); z3exe = Path.Combine(root, "..", "corral", "z3.exe"); iz3exe = Path.Combine(root, "..", "iz3", "z3.exe"); runGenerator(); } catch (Exception e) { Console.WriteLine(e.Message); } }
private static void addSummaryPredicate() { if (!System.IO.File.Exists("corralPredicates.txt")) { return; } // stubs is always [] in the current version. var predWithStubs = new HashSet <Tuple <string, string> >(); using (var file = new System.IO.StreamReader("corralPredicates.txt")) { string pred; string stubs = ""; while ((pred = file.ReadLine()) != null) { if (useStubs) { stubs = file.ReadLine(); if (stubs == "[]") { stubs = ""; } else { stubs = string.Format("{{:stubs \"{0}\"}}", stubs); } } predWithStubs.Add(Tuple.Create(stubs, pred)); } } string database = CommonLib.GlobalConfig.util_result_file; Debug.Assert(!System.IO.File.Exists(database)); var summaries = new StubAnnotatedSummaryDictionary(); StubAnnotatedSummaryDictionary.CreateProver(z3exe); if (useStubs) { predWithStubs.Iter(tup => summaries.Add(tup.Item1, tup.Item2)); } else { predWithStubs.Iter(tup => summaries.Add("", tup.Item2)); } //predicates.Iter(pred => summaries.Add(property, pred)); //summaries.Print(databaseTxt); StubAnnotatedSummaryDictionary.CloseProver(); summaries.Marshall(); while (true) { try { using (var fs = new System.IO.FileStream(database, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None)) { var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); serializer.Serialize(fs, summaries); break; } } catch (System.IO.IOException) { Random rnd = new Random(); Thread.Sleep(rnd.Next(300, 501)); } } if (debugging) { Console.WriteLine("Dumped summaries to db."); } }