本文整理汇总了C#中Graph.AddSource方法的典型用法代码示例。如果您正苦于以下问题:C# Graph.AddSource方法的具体用法?C# Graph.AddSource怎么用?C# Graph.AddSource使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Graph
的用法示例。
在下文中一共展示了Graph.AddSource方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: BuildCallGraph
private Graph<Implementation> BuildCallGraph()
{
Graph<Implementation> callGraph = new Graph<Implementation>();
Dictionary<Procedure, HashSet<Implementation>> procToImpls = new Dictionary<Procedure, HashSet<Implementation>>();
foreach (Declaration decl in program.TopLevelDeclarations)
{
Procedure proc = decl as Procedure;
if (proc == null) continue;
procToImpls[proc] = new HashSet<Implementation>();
}
foreach (Declaration decl in program.TopLevelDeclarations)
{
Implementation impl = decl as Implementation;
if (impl == null || impl.SkipVerification) continue;
callGraph.AddSource(impl);
procToImpls[impl.Proc].Add(impl);
}
foreach (Declaration decl in program.TopLevelDeclarations)
{
Implementation impl = decl as Implementation;
if (impl == null || impl.SkipVerification) continue;
foreach (Block b in impl.Blocks)
{
foreach (Cmd c in b.Cmds)
{
CallCmd cc = c as CallCmd;
if (cc == null) continue;
foreach (Implementation callee in procToImpls[cc.Proc])
{
callGraph.AddEdge(impl, callee);
}
}
}
}
return callGraph;
}
示例2: Inline
private void Inline()
{
if (CommandLineOptions.Clo.InlineDepth < 0)
return;
var callGraph = BuildCallGraph();
foreach (Implementation impl in callGraph.Nodes)
{
InlineRequiresVisitor inlineRequiresVisitor = new InlineRequiresVisitor();
inlineRequiresVisitor.Visit(impl);
}
foreach (Implementation impl in callGraph.Nodes)
{
FreeRequiresVisitor freeRequiresVisitor = new FreeRequiresVisitor();
freeRequiresVisitor.Visit(impl);
}
foreach (Implementation impl in callGraph.Nodes)
{
InlineEnsuresVisitor inlineEnsuresVisitor = new InlineEnsuresVisitor();
inlineEnsuresVisitor.Visit(impl);
}
foreach (Implementation impl in callGraph.Nodes)
{
impl.OriginalBlocks = impl.Blocks;
impl.OriginalLocVars = impl.LocVars;
}
foreach (Implementation impl in callGraph.Nodes)
{
CommandLineOptions.Inlining savedOption = CommandLineOptions.Clo.ProcedureInlining;
CommandLineOptions.Clo.ProcedureInlining = CommandLineOptions.Inlining.Spec;
Inliner.ProcessImplementationForHoudini(program, impl);
CommandLineOptions.Clo.ProcedureInlining = savedOption;
}
foreach (Implementation impl in callGraph.Nodes)
{
impl.OriginalBlocks = null;
impl.OriginalLocVars = null;
}
Graph<Implementation> oldCallGraph = callGraph;
callGraph = new Graph<Implementation>();
foreach (Implementation impl in oldCallGraph.Nodes)
{
callGraph.AddSource(impl);
}
foreach (Tuple<Implementation, Implementation> edge in oldCallGraph.Edges)
{
callGraph.AddEdge(edge.Item1, edge.Item2);
}
int count = CommandLineOptions.Clo.InlineDepth;
while (count > 0)
{
foreach (Implementation impl in oldCallGraph.Nodes)
{
List<Implementation> newNodes = new List<Implementation>();
foreach (Implementation succ in callGraph.Successors(impl))
{
newNodes.AddRange(oldCallGraph.Successors(succ));
}
foreach (Implementation newNode in newNodes)
{
callGraph.AddEdge(impl, newNode);
}
}
count--;
}
}
示例3: InterProcGenKill
public InterProcGenKill(Implementation impl, Program program) {
Contract.Requires(program != null);
Contract.Requires(impl != null);
this.program = program;
procICFG = new Dictionary<string/*!*/, ICFG/*!*/>();
name2Proc = new Dictionary<string/*!*/, Procedure/*!*/>();
workList = new WorkList();
this.callers = new Dictionary<string/*!*/, List<WorkItem/*!*/>/*!*/>();
this.callGraph = new Graph<string/*!*/>();
this.procPriority = new Dictionary<string/*!*/, int>();
this.maxBlocksInProc = 0;
this.mainImpl = impl;
Dictionary<string/*!*/, Implementation/*!*/>/*!*/ name2Impl = new Dictionary<string/*!*/, Implementation/*!*/>();
varsLiveAtExit.Clear();
varsLiveAtEntry.Clear();
varsLiveSummary.Clear();
foreach (var decl in program.TopLevelDeclarations) {
Contract.Assert(decl != null);
if (decl is Implementation) {
Implementation/*!*/ imp = (Implementation/*!*/)cce.NonNull(decl);
name2Impl[imp.Name] = imp;
} else if (decl is Procedure) {
Procedure/*!*/ proc = cce.NonNull(decl as Procedure);
name2Proc[proc.Name] = proc;
}
}
ICFG/*!*/ mainICFG = new ICFG(mainImpl);
Contract.Assert(mainICFG != null);
procICFG.Add(mainICFG.impl.Name, mainICFG);
callGraph.AddSource(mainICFG.impl.Name);
List<ICFG/*!*/>/*!*/ procsToConsider = new List<ICFG/*!*/>();
procsToConsider.Add(mainICFG);
while (procsToConsider.Count != 0) {
ICFG/*!*/ p = procsToConsider[0];
Contract.Assert(p != null);
procsToConsider.RemoveAt(0);
foreach (string/*!*/ callee in p.procsCalled.Keys) {
Contract.Assert(callee != null);
if (!name2Impl.ContainsKey(callee))
continue;
callGraph.AddEdge(p.impl.Name, callee);
if (maxBlocksInProc < p.nodes.Count) {
maxBlocksInProc = p.nodes.Count;
}
if (!callers.ContainsKey(callee)) {
callers.Add(callee, new List<WorkItem/*!*/>());
}
foreach (Block/*!*/ b in p.procsCalled[callee]) {
Contract.Assert(b != null);
callers[callee].Add(new WorkItem(p, b));
}
if (procICFG.ContainsKey(callee))
continue;
ICFG/*!*/ ncfg = new ICFG(name2Impl[callee]);
Contract.Assert(ncfg != null);
procICFG.Add(callee, ncfg);
procsToConsider.Add(ncfg);
}
}
bool acyclic;
List<string>/*!*/ sortedNodes;
callGraph.TarjanTopSort(out acyclic, out sortedNodes);
Contract.Assert(acyclic);
int cnt = 0;
for (int i = sortedNodes.Count - 1; i >= 0; i--) {
string s = sortedNodes[i];
if (s == null)
continue;
procPriority.Add(s, cnt);
cnt++;
}
}
示例4: ComputeLiveVariables
public static void ComputeLiveVariables(Implementation impl) {
Contract.Requires(impl != null);
Microsoft.Boogie.Helpers.ExtraTraceInformation("Starting live variable analysis");
Graph<Block> dag = new Graph<Block>();
dag.AddSource(cce.NonNull(impl.Blocks[0])); // there is always at least one node in the graph
foreach (Block b in impl.Blocks) {
GotoCmd gtc = b.TransferCmd as GotoCmd;
if (gtc != null) {
Contract.Assume(gtc.labelTargets != null);
foreach (Block/*!*/ dest in gtc.labelTargets) {
Contract.Assert(dest != null);
dag.AddEdge(dest, b);
}
}
}
IEnumerable<Block> sortedNodes;
if (CommandLineOptions.Clo.ModifyTopologicalSorting) {
sortedNodes = dag.TopologicalSort(true);
} else {
sortedNodes = dag.TopologicalSort();
}
foreach (Block/*!*/ block in sortedNodes) {
Contract.Assert(block != null);
HashSet<Variable/*!*/>/*!*/ liveVarsAfter = new HashSet<Variable/*!*/>();
// The injected assumption variables should always be considered to be live.
foreach (var v in impl.InjectedAssumptionVariables.Concat(impl.DoomedInjectedAssumptionVariables))
{
liveVarsAfter.Add(v);
}
if (block.TransferCmd is GotoCmd) {
GotoCmd gotoCmd = (GotoCmd)block.TransferCmd;
if (gotoCmd.labelTargets != null) {
foreach (Block/*!*/ succ in gotoCmd.labelTargets) {
Contract.Assert(succ != null);
Contract.Assert(succ.liveVarsBefore != null);
liveVarsAfter.UnionWith(succ.liveVarsBefore);
}
}
}
List<Cmd> cmds = block.Cmds;
int len = cmds.Count;
for (int i = len - 1; i >= 0; i--) {
if (cmds[i] is CallCmd) {
Procedure/*!*/ proc = cce.NonNull(cce.NonNull((CallCmd/*!*/)cmds[i]).Proc);
if (InterProcGenKill.HasSummary(proc.Name)) {
liveVarsAfter =
InterProcGenKill.PropagateLiveVarsAcrossCall(cce.NonNull((CallCmd/*!*/)cmds[i]), liveVarsAfter);
continue;
}
}
Propagate(cmds[i], liveVarsAfter);
}
block.liveVarsBefore = liveVarsAfter;
}
}
示例5: ApplyStages
public StagedHoudiniPlan ApplyStages() {
if (NoStages())
{
Debug.Assert(false);
var TrivialGraph = new Graph<ScheduledStage>();
TrivialGraph.AddSource(new ScheduledStage(0, new HashSet<string>()));
return new StagedHoudiniPlan(TrivialGraph);
}
#region Assign annotations to stages at a given level of granularity
switch(CommandLineOptions.Clo.StagedHoudini) {
case COARSE_STAGES:
Plan = ComputeCoarseStages();
break;
case FINE_STAGES:
Plan = ComputeFineStages();
break;
case BALANCED_STAGES:
Plan = ComputeBalancedStages();
break;
default:
Debug.Assert(false);
Plan = null;
break;
}
foreach(var c in AllAnnotationIdentifiers()) {
Debug.Assert(Plan.StageForAnnotation(c) != null);
}
#endregion
#region Generate boolean variables to control stages
var stageToActiveBoolean = new Dictionary<int, Constant>();
var stageToCompleteBoolean = new Dictionary<int, Constant>();
foreach (var stage in Plan)
{
var stageActive = new Constant(Token.NoToken,
new TypedIdent(Token.NoToken, "_stage_" + stage.GetId() + "_active", Type.Bool),
false);
stageActive.AddAttribute("stage_active", new object[] { new LiteralExpr(Token.NoToken, BigNum.FromInt(stage.GetId())) });
prog.AddTopLevelDeclaration(stageActive);
stageToActiveBoolean[stage.GetId()] = stageActive;
var stageComplete = new Constant(Token.NoToken,
new TypedIdent(Token.NoToken, "_stage_" + stage.GetId() + "_complete", Type.Bool),
false);
stageComplete.AddAttribute("stage_complete", new object[] { new LiteralExpr(Token.NoToken, BigNum.FromInt(stage.GetId())) });
prog.AddTopLevelDeclaration(stageComplete);
stageToCompleteBoolean[stage.GetId()] = stageComplete;
}
#endregion
#region Adapt annotation assertions to take account of stages
foreach (var b in prog.Implementations.Select(Item => Item.Blocks).SelectMany(Item => Item))
{
List<Cmd> newCmds = new List<Cmd>();
foreach (var cmd in b.Cmds)
{
var a = cmd as AssertCmd;
string c;
if (a != null) {
if (Houdini.MatchCandidate(a.Expr, CandidateIdentifiers, out c))
{
newCmds.Add(new AssertCmd(a.tok, Houdini.AddConditionToCandidate(a.Expr,
Expr.Ident(stageToActiveBoolean[Plan.StageForAnnotation(c).GetId()]), c), a.Attributes));
newCmds.Add(new AssumeCmd(a.tok, Houdini.AddConditionToCandidate(a.Expr,
Expr.Ident(stageToCompleteBoolean[Plan.StageForAnnotation(c).GetId()]), c), a.Attributes));
} else if (QKeyValue.FindBoolAttribute(a.Attributes, "originated_from_invariant")) {
string tag = GetTagFromNonCandidateAttributes(a.Attributes);
if (tag == null) {
newCmds.Add(a);
} else {
newCmds.Add(new AssertCmd(a.tok, Expr.Imp(
Expr.Ident(stageToActiveBoolean[Plan.StageForAnnotation(tag).GetId()]), a.Expr),
a.Attributes));
newCmds.Add(new AssumeCmd(a.tok, Expr.Imp(
Expr.Ident(stageToCompleteBoolean[Plan.StageForAnnotation(tag).GetId()]), a.Expr),
a.Attributes));
}
}
}
else
{
newCmds.Add(cmd);
}
}
b.Cmds = newCmds;
}
#endregion
#region Adapt pre/postconditions to take account of stages
foreach (var p in prog.NonInlinedProcedures())
{
#region Handle the preconditions
{
List<Requires> newRequires = new List<Requires>();
//.........这里部分代码省略.........
示例6: GraphFromImpl
public static Graph<Block/*!*/>/*!*/ GraphFromImpl(Implementation impl) {
Contract.Requires(impl != null);
Contract.Ensures(cce.NonNullElements(Contract.Result<Graph<Block>>().TopologicalSort()));
Contract.Ensures(Contract.Result<Graph<Block>>() != null);
Graph<Block/*!*/> g = new Graph<Block/*!*/>();
g.AddSource(impl.Blocks[0]); // there is always at least one node in the graph
foreach (Block b in impl.Blocks) {
Contract.Assert(b != null);
GotoCmd gtc = b.TransferCmd as GotoCmd;
if (gtc != null) {
foreach (Block/*!*/ dest in cce.NonNull(gtc.labelTargets)) {
Contract.Assert(dest != null);
g.AddEdge(b, dest);
}
}
}
return g;
}