/// <summary> /// Provide source CFG for passification phase /// </summary> public static void BeforePassification(Implementation impl) { if (CommandLineOptions.Clo.GenerateIsaProgNoProofs) { return; } var config = new CFGReprConfigBuilder().SetIsAcyclic(true).SetBlockCopy(true).SetDesugarCalls(true) .Build(); beforePassificationCfg = CFGReprTransformer.GetCfgRepresentation( impl, config, out beforePassiveOrigBlock, out var newVarsFromDesugaring ); cfgToDagHintManager.AfterDagToOrig = beforePassiveOrigBlock; beforePassiveData = MethodDataFromImpl(impl, boogieGlobalData, newVarsFromDesugaring); passificationHintManager = new PassificationHintManager(beforePassiveOrigBlock); initialVarMapping = new Dictionary <Block, IDictionary <Variable, Expr> >(); // compute mapping between copied blocks (before dag -> after dag) var origToAfterDag = beforePassiveOrigBlock.InverseDict(); beforeDagAfterDagBlock = DictionaryComposition(beforeDagOrigBlock, origToAfterDag); }
/// <summary> /// Provide source CFG for CFG-to-DAG phase /// </summary> public static void BeforeCFGToDAG(Implementation impl) { var config = new CFGReprConfigBuilder().SetIsAcyclic(false).SetBlockCopy(true).SetDesugarCalls(true) .Build(); beforeDagCfg = CFGReprTransformer.GetCfgRepresentation(impl, config, out beforeDagOrigBlock, out var newVarsFromDesugaring); beforeDagData = MethodDataFromImpl(impl, boogieGlobalData, newVarsFromDesugaring); uniqueExitBlockOrig = null; }
/// <summary> /// Provide target CFG for passification phase, construct global version map. /// </summary> /// <param name="impl">source CFG after passification phase</param> /// <exception cref="ProofGenUnexpectedStateException">thrown if global version map is incorrect /// (should never happen). </exception> public static void AfterPassificationCheckGlobalMap(Implementation impl) { afterPassificationImpl = impl; if (CommandLineOptions.Clo.GenerateIsaProgNoProofs) { return; } finalProgData = MethodDataFromImpl(impl, boogieGlobalData); var config = new CFGReprConfigBuilder().SetIsAcyclic(true).SetBlockCopy(true).SetDesugarCalls(false) .SetDeepCopyPredCmd(TypeCheckBeforeVcMaybeRewritesCmd).Build(); afterPassificationCfg = CFGReprTransformer.GetCfgRepresentation(impl, config, out afterPassificationToOrigBlock, out _); var passiveBlocks = new List <Block>(afterPassificationCfg.GetBlocksBackwards()); var origToAfterPassificationBlock = afterPassificationToOrigBlock.InverseDict(); beforePassiveToAfterPassiveBlock = DictionaryComposition(beforePassiveOrigBlock, origToAfterPassificationBlock); var globalVersion = new GlobalVersion(); passiveRelationGen = new PassiveRelationGen( beforePassificationCfg, passificationHintManager, initialVarMapping, beforePassiveOrigBlock, beforePassiveToAfterPassiveBlock, ProofGenLiveVarAnalysis.ComputeLiveVariables(beforePassificationCfg, beforePassiveData) ); //all variables before passification are the initial versions and already constrained globalVersionMap = globalVersion.GlobalVersionMap( passiveRelationGen, beforePassiveData.AllVariables(), afterPassificationCfg.entry, passiveBlocks); //Console.WriteLine("Version map: " + string.Join(Environment.NewLine, globalVersionMap)); var versionMapCorrect = GlobalVersionChecker.CheckVersionMap(globalVersionMap, passiveRelationGen, beforePassificationCfg, beforePassiveToAfterPassiveBlock); if (!versionMapCorrect) { throw new ProofGenUnexpectedStateException(typeof(ProofGenerationLayer), "Incorrect version map"); } }
/// <summary> /// Provide target CFG after unreachable blocks are pruned (after passification). /// </summary> public static void AfterUnreachablePruning(Implementation impl) { if (CommandLineOptions.Clo.GenerateIsaProgNoProofs) { return; } var config = new CFGReprConfigBuilder().SetIsAcyclic(true).SetBlockCopy(true).SetDesugarCalls(false) .SetDeepCopyPredCmd(TypeCheckBeforeVcMaybeRewritesCmd).Build(); afterUnreachablePruningCfg = CFGReprTransformer.GetCfgRepresentation(impl, config, out var afterUnreachableToOrigBlock, out _); var origToAfterUnreachableBlock = afterUnreachableToOrigBlock.InverseDict(); afterPassificationToAfterUnreachableBlock = DictionaryComposition(afterPassificationToOrigBlock, origToAfterUnreachableBlock); }