예제 #1
0
  void PredicateCmd(Expr p, Expr pDom, List<Cmd> cmdSeq, Cmd cmd) {
    if (cmd is CallCmd) {
      var cCmd = (CallCmd)cmd;
      Debug.Assert(useProcedurePredicates(cCmd.Proc));
      cCmd.Ins.Insert(0, p != null ? p : Expr.True);
      cmdSeq.Add(cCmd);
    } else if (p == null) {
      new EnabledReplacementVisitor(Expr.True, pDom).Visit(cmd);
      cmdSeq.Add(cmd);
    } else if (cmd is AssignCmd) {
      var aCmd = (AssignCmd)cmd;
      cmdSeq.Add(new AssignCmd(Token.NoToken, aCmd.Lhss,
                   new List<Expr>(aCmd.Lhss.Zip(aCmd.Rhss, (lhs, rhs) =>
                     new NAryExpr(Token.NoToken,
                       new IfThenElse(Token.NoToken),
                       new List<Expr> { p, rhs, lhs.AsExpr })))));
    } else if (cmd is AssertCmd) {
      var aCmd = (AssertCmd)cmd;
      Expr newExpr = new EnabledReplacementVisitor(p, pDom).VisitExpr(aCmd.Expr);
      aCmd.Expr = QKeyValue.FindBoolAttribute(aCmd.Attributes, "do_not_predicate") ? newExpr : Expr.Imp(p, newExpr);
      cmdSeq.Add(aCmd);
    } else if (cmd is AssumeCmd) {
      var aCmd = (AssumeCmd)cmd;
      Expr newExpr = new EnabledReplacementVisitor(p, pDom).VisitExpr(aCmd.Expr);
      aCmd.Expr = QKeyValue.FindBoolAttribute(aCmd.Attributes, "do_not_predicate") ? newExpr : Expr.Imp(p, newExpr);
      cmdSeq.Add(aCmd);
    } else if (cmd is HavocCmd) {
      var hCmd = (HavocCmd)cmd;
      foreach (IdentifierExpr v in hCmd.Vars) {
        Microsoft.Boogie.Type type = v.Decl.TypedIdent.Type;
        Contract.Assert(type != null);

        IdentifierExpr havocTempExpr;
        if (havocVars.ContainsKey(type)) {
          havocTempExpr = havocVars[type];
        } else {
          var havocVar = new LocalVariable(Token.NoToken,
                             new TypedIdent(Token.NoToken,
                                            "_HAVOC_" + type.ToString(), type));
          impl.LocVars.Add(havocVar);
          havocVars[type] = havocTempExpr =
            new IdentifierExpr(Token.NoToken, havocVar);
        }
        cmdSeq.Add(new HavocCmd(Token.NoToken,
                                new List<IdentifierExpr> { havocTempExpr }));
        cmdSeq.Add(Cmd.SimpleAssign(Token.NoToken, v,
                                    new NAryExpr(Token.NoToken,
                                      new IfThenElse(Token.NoToken),
                                      new List<Expr> { p, havocTempExpr, v })));
      }
    } else if (cmd is CommentCmd) {
      // skip
    } else if (cmd is StateCmd) {
      var sCmd = (StateCmd)cmd;
      var newCmdSeq = new List<Cmd>();
      foreach (Cmd c in sCmd.Cmds)
        PredicateCmd(p, pDom, newCmdSeq, c);
      sCmd.Cmds = newCmdSeq;
      cmdSeq.Add(sCmd);
    } else {
      Console.WriteLine("Unsupported cmd: " + cmd.GetType().ToString());
    }
  }
예제 #2
0
        void PredicateCmd(List<Cmd> cmdSeq, Cmd cmd)
        {
            if (cmd is AssignCmd) {
              var aCmd = (AssignCmd)cmd;
              cmdSeq.Add(new AssignCmd(Token.NoToken, aCmd.Lhss,
                   new List<Expr>(aCmd.Lhss.Zip(aCmd.Rhss, (lhs, rhs) =>
                     new NAryExpr(Token.NoToken,
                       new IfThenElse(Token.NoToken),
                       new List<Expr> { p, rhs, lhs.AsExpr })))));
            } else if (cmd is AssertCmd) {
              var aCmd = (AssertCmd)cmd;
              if (cmdSeq.Last() is AssignCmd &&
              cmdSeq.Cast<Cmd>().SkipEnd(1).All(c => c is AssertCmd)) {
            // This may be a loop invariant.  Make sure it continues to appear as
            // the first statement in the block.
            var assign = cmdSeq.Last();
            cmdSeq.RemoveAt(cmdSeq.Count-1);
            Expr newExpr = new EnabledReplacementVisitor(pExpr).VisitExpr(aCmd.Expr);
            aCmd.Expr = QKeyValue.FindBoolAttribute(aCmd.Attributes, "do_not_predicate") ? newExpr : Expr.Imp(pExpr, newExpr);
            cmdSeq.Add(aCmd);
            // cmdSeq.Add(new AssertCmd(aCmd.tok, Expr.Imp(pExpr, aCmd.Expr)));
            cmdSeq.Add(assign);
              } else {
            aCmd.Expr = Expr.Imp(p, aCmd.Expr);
            cmdSeq.Add(aCmd);
            // cmdSeq.Add(new AssertCmd(aCmd.tok, Expr.Imp(p, aCmd.Expr)));
              }
            } else if (cmd is AssumeCmd) {
              var aCmd = (AssumeCmd)cmd;
              cmdSeq.Add(new AssumeCmd(Token.NoToken, Expr.Imp(p, aCmd.Expr)));
            } else if (cmd is HavocCmd) {
              var hCmd = (HavocCmd)cmd;
              foreach (IdentifierExpr v in hCmd.Vars) {
            Microsoft.Boogie.Type type = v.Decl.TypedIdent.Type;
            Contract.Assert(type != null);

            IdentifierExpr havocTempExpr;
            if (havocVars.ContainsKey(type)) {
              havocTempExpr = havocVars[type];
            } else {
              var havocVar = new LocalVariable(Token.NoToken,
                             new TypedIdent(Token.NoToken,
                                            "_HAVOC_" + type.ToString(), type));
              impl.LocVars.Add(havocVar);
              havocVars[type] = havocTempExpr =
            new IdentifierExpr(Token.NoToken, havocVar);
            }
            cmdSeq.Add(new HavocCmd(Token.NoToken,
                                new List<IdentifierExpr> { havocTempExpr }));
            cmdSeq.Add(Cmd.SimpleAssign(Token.NoToken, v,
                                    new NAryExpr(Token.NoToken,
                                      new IfThenElse(Token.NoToken),
                                      new List<Expr> { p, havocTempExpr, v })));
              }
            } else if (cmd is CallCmd) {
              Debug.Assert(useProcedurePredicates);
              var cCmd = (CallCmd)cmd;
              cCmd.Ins.Insert(0, p);
              cmdSeq.Add(cCmd);
            }
            else if (cmd is CommentCmd) {
              // skip
            }
            else if (cmd is StateCmd) {
              var sCmd = (StateCmd)cmd;
              var newCmdSeq = new List<Cmd>();
              foreach (Cmd c in sCmd.Cmds)
            PredicateCmd(newCmdSeq, c);
              sCmd.Cmds = newCmdSeq;
              cmdSeq.Add(sCmd);
            }
            else {
              Console.WriteLine("Unsupported cmd: " + cmd.GetType().ToString());
            }
        }