private void AddNoninterferenceCheckers() { if (CommandLineOptions.Clo.TrustNoninterference) { return; } foreach (var proc in civlTypeChecker.procToYieldInvariant.Keys) { var yieldInvariant = civlTypeChecker.procToYieldInvariant[proc]; if (layerNum == yieldInvariant.LayerNum) { noninterferenceCheckerDecls.AddRange( NoninterferenceChecker.CreateNoninterferenceCheckers(civlTypeChecker, linearTypeChecker, layerNum, new Dictionary <Absy, Absy>(), proc, new List <Variable>())); } } foreach (var impl in absyMap.Keys.OfType <Implementation>()) { var yieldingProc = GetYieldingProc(impl); noninterferenceCheckerDecls.AddRange( NoninterferenceChecker.CreateNoninterferenceCheckers(civlTypeChecker, linearTypeChecker, layerNum, absyMap, impl, impl.LocVars)); if (yieldingProc is MoverProc && yieldingProc.upperLayer == layerNum) { continue; } noninterferenceCheckerDecls.AddRange( NoninterferenceChecker.CreateNoninterferenceCheckers(civlTypeChecker, linearTypeChecker, layerNum, new Dictionary <Absy, Absy>(), impl.Proc, new List <Variable>())); } }
private void TransformImpl(Implementation originalImpl, Implementation impl) { // initialize globalSnapshotInstrumentation globalSnapshotInstrumentation = new GlobalSnapshotInstrumentation(civlTypeChecker); // initialize refinementInstrumentation YieldingProc yieldingProc = civlTypeChecker.procToYieldingProc[originalImpl.Proc]; if (yieldingProc.upperLayer == this.layerNum) { if (yieldingProc is ActionProc) { refinementInstrumentation = new ActionRefinementInstrumentation( civlTypeChecker, impl, originalImpl, globalSnapshotInstrumentation.OldGlobalMap); } else { refinementInstrumentation = new SkipRefinementInstrumentation( civlTypeChecker, yieldingProc, globalSnapshotInstrumentation.OldGlobalMap); } } else { refinementInstrumentation = new RefinementInstrumentation(); } var allYieldPredicates = CollectYields(impl); // initialize noninterferenceInstrumentation if (CommandLineOptions.Clo.TrustNonInterference) { noninterferenceInstrumentation = new NoneNoninterferenceInstrumentation(); } else { noninterferenceCheckerDecls.AddRange( NoninterferenceChecker.CreateNoninterferenceCheckers(civlTypeChecker, linearTypeChecker, layerNum, absyMap, impl, allYieldPredicates)); noninterferenceInstrumentation = new SomeNoninterferenceInstrumentation( civlTypeChecker, linearTypeChecker, linearPermissionInstrumentation, globalSnapshotInstrumentation.OldGlobalMap, wrapperNoninterferenceCheckerProc); } DesugarConcurrency(impl, allYieldPredicates); impl.LocVars.AddRange(globalSnapshotInstrumentation.NewLocalVars); impl.LocVars.AddRange(refinementInstrumentation.NewLocalVars); impl.LocVars.AddRange(noninterferenceInstrumentation.NewLocalVars); }