public Model.Element GetModelValue(Variable v) { Model.Element elt; // first, get the unique name string uniqueName; VCExprVar vvar = Context.BoogieExprTranslator.TryLookupVariable(v); if (vvar == null) { uniqueName = v.Name; } else { uniqueName = Context.Lookup(vvar); } var f = Model.TryGetFunc(uniqueName); if (f == null) { f = Model.MkFunc(uniqueName, 0); } elt = f.GetConstant(); return(elt); }
private void GetModelWithStates(Model m, RPFP.Node cex, StratifiedInliningInfo mainInfo, List<StateId> orderedStateIds, Dictionary<int,Dictionary<string,string>> varSubst) { if (m == null) return; var mvInfo = mainInfo.mvInfo; foreach (Variable v in mvInfo.AllVariables) { m.InitialState.AddBinding(v.Name, GetModelValue(m, v, varSubst[cex.Outgoing.number])); } Dictionary<int, RPFP.Edge> edgeNumbering = new Dictionary<int,RPFP.Edge>(); NumberCexEdges(cex, edgeNumbering); int lastCandidate = 0; int lastCapturePoint = CALL; for (int i = 0; i < orderedStateIds.Count; ++i) { var s = orderedStateIds[i]; RPFP.Edge edge = s.edge; int candidate = edge.number; int capturePoint = s.capturePoint; Dictionary<string, string> subst = varSubst[candidate]; string implName = edge.Parent.Name.GetDeclName(); var info = s.info.mvInfo; if (capturePoint == CALL || capturePoint == RETURN) { lastCandidate = candidate; lastCapturePoint = capturePoint; continue; } Contract.Assume(0 <= capturePoint && capturePoint < info.CapturePoints.Count); VC.ModelViewInfo.Mapping map = info.CapturePoints[capturePoint]; var prevInc = (lastCapturePoint != CALL && lastCapturePoint != RETURN && candidate == lastCandidate) ? info.CapturePoints[lastCapturePoint].IncarnationMap : new Dictionary<Variable, Expr>(); var cs = m.MkState(map.Description); foreach (Variable v in info.AllVariables) { var e = (Expr)map.IncarnationMap[v]; if (e == null) { if (lastCapturePoint == CALL || lastCapturePoint == RETURN) { cs.AddBinding(v.Name, GetModelValue(m, v, subst)); } continue; } if (lastCapturePoint != CALL && lastCapturePoint != RETURN && prevInc[v] == e) continue; // skip unchanged variables Model.Element elt; if (e is IdentifierExpr) { IdentifierExpr ide = (IdentifierExpr)e; elt = GetModelValue(m, ide.Decl, subst); } else if (e is LiteralExpr) { LiteralExpr lit = (LiteralExpr)e; elt = m.MkElement(lit.Val.ToString()); } else { Contract.Assume(false); elt = m.MkFunc(e.ToString(), 0).GetConstant(); } cs.AddBinding(v.Name, elt); } lastCandidate = candidate; lastCapturePoint = capturePoint; } return; }
public void PopulateModelWithStates() { Contract.Requires(Model != null); Model m = Model; ApplyRedirections(); var mvstates = m.TryGetFunc("$mv_state"); if (MvInfo == null || mvstates == null || (mvstates.Arity == 1 && mvstates.Apps.Count() == 0)) { return; } Contract.Assert(mvstates.Arity == 2); foreach (Variable v in MvInfo.AllVariables) { m.InitialState.AddBinding(v.Name, GetModelValue(v)); } var states = new List <int>(); foreach (var t in mvstates.Apps) { states.Add(t.Args[1].AsInt()); } states.Sort(); for (int i = 0; i < states.Count; ++i) { var s = states[i]; if (0 <= s && s < MvInfo.CapturePoints.Count) { VC.ModelViewInfo.Mapping map = MvInfo.CapturePoints[s]; var prevInc = i > 0 ? MvInfo.CapturePoints[states[i - 1]].IncarnationMap : new Dictionary <Variable, Expr>(); var cs = m.MkState(map.Description); foreach (Variable v in MvInfo.AllVariables) { Expr e = map.IncarnationMap.ContainsKey(v) ? map.IncarnationMap[v] : null; if (e == null) { continue; } Expr prevIncV = prevInc.ContainsKey(v) ? prevInc[v] : null; if (prevIncV == e) { continue; // skip unchanged variables } Model.Element elt; if (e is IdentifierExpr) { IdentifierExpr ide = (IdentifierExpr)e; elt = GetModelValue(ide.Decl); } else if (e is LiteralExpr) { LiteralExpr lit = (LiteralExpr)e; elt = m.MkElement(lit.Val.ToString()); } else { elt = m.MkFunc(e.ToString(), 0).GetConstant(); } cs.AddBinding(v.Name, elt); } } else { Contract.Assume(false); } } }
private Model.Element GetModelValue(Model m, Variable v, Dictionary<string,string> subst) { // first, get the unique name string uniqueName; VCExprVar vvar = boogieContext.BoogieExprTranslator.TryLookupVariable(v); uniqueName = v.Name; if(subst.ContainsKey(uniqueName)) return m.MkElement(subst[uniqueName]); return m.MkFunc("@undefined", 0).GetConstant(); }