예제 #1
0
        private Expr MakeBinaryIntFunctionCall(string functionName, BinaryOperator.Opcode infixOp, Type resultType, Expr lhs, Expr rhs)
        {
            Function f = verifier.GetOrCreateIntFunction(functionName, infixOp, resultType, lhs.Type, rhs.Type);
            var      e = new NAryExpr(Token.NoToken, new FunctionCall(f), new List <Expr> {
                lhs, rhs
            });

            e.Type = resultType;
            return(e);
        }
예제 #2
0
        private IAppliable GetBinaryFunction(BinaryOperator.Opcode oc)
        {
            BinaryOperator function = null;

            try
            {
                function = BinaryOperatorCache[oc];
            }
            catch (KeyNotFoundException)
            {
                function = new BinaryOperator(Token.NoToken, oc);
                BinaryOperatorCache[oc] = function;
            }
            return(function);
        }
예제 #3
0
        static void NormalizeOperator(BinaryOperator op, Expr arg1, Expr arg2, out NAryExpr expr, out bool applyNeg)
        {
            expr     = null;
            applyNeg = false;

            BinaryOperator.Opcode newop = op.Op;

            if (op.Op == BinaryOperator.Opcode.Lt)
            {
                newop = BinaryOperator.Opcode.Ge;
            }
            else if (op.Op == BinaryOperator.Opcode.Le)
            {
                newop = BinaryOperator.Opcode.Gt;
            }
            else if (op.Op == BinaryOperator.Opcode.Neq)
            {
                newop = BinaryOperator.Opcode.Eq;
            }

            var comp          = new Comparison <Expr>((e1, e2) => (e1.ToString().CompareTo(e2.ToString())));
            var constructExpr = new Func <BinaryOperator, Expr, Expr, NAryExpr>((o, e1, e2) =>
            {
                if (o.Op == BinaryOperator.Opcode.Eq && comp(e1, e2) > 0)
                {
                    return(new NAryExpr(Token.NoToken, o, new List <Expr> {
                        e2, e1
                    }));
                }
                return(new NAryExpr(Token.NoToken, o, new List <Expr> {
                    e1, e2
                }));
            });

            if (newop == op.Op)
            {
                expr     = constructExpr(op, arg1, arg2);
                applyNeg = false;
            }
            else
            {
                expr     = constructExpr(new BinaryOperator(Token.NoToken, newop), arg1, arg2);
                applyNeg = true;
            }
        }
예제 #4
0
        // Return the set of conjuncts of the expr
        public static List <Expr> GetSubExprs(Expr expr, BinaryOperator.Opcode op)
        {
            var conjuncts = new List <Expr>();

            if (expr is NAryExpr && (expr as NAryExpr).Fun is BinaryOperator &&
                ((expr as NAryExpr).Fun as BinaryOperator).Op == op)
            {
                var c0 = GetSubExprs((expr as NAryExpr).Args[0], op);
                var c1 = GetSubExprs((expr as NAryExpr).Args[1], op);
                conjuncts.AddRange(c0);
                conjuncts.AddRange(c1);
            }
            else
            {
                conjuncts.Add(expr);
            }

            return(conjuncts);
        }
예제 #5
0
        private static NAryExpr GetBinaryOperator(Expr e, BinaryOperator.Opcode opcode)
        {
            var nary = e as NAryExpr;

            if (nary == null)
            {
                return(null);
            }

            var fun = nary.Fun;

            if (fun is BinaryOperator)
            {
                var binary = fun as BinaryOperator;
                if (binary.Op == opcode)
                {
                    return(nary);
                }
            }
            return(null);
        }
예제 #6
0
        public static Term Binop(BinaryOperator.Opcode opcode, Term arg1, Term arg2)
        {
            string bopIsa;

            switch (opcode)
            {
            case BinaryOperator.Opcode.Eq:
                bopIsa = "Eq";
                break;

            case BinaryOperator.Opcode.Neq:
                bopIsa = "Neq";
                break;

            case BinaryOperator.Opcode.Add:
                bopIsa = "Add";
                break;

            case BinaryOperator.Opcode.Sub:
                bopIsa = "Sub";
                break;

            case BinaryOperator.Opcode.Mul:
                bopIsa = "Mul";
                break;

            case BinaryOperator.Opcode.Div:
                bopIsa = "Div";
                break;

            case BinaryOperator.Opcode.Mod:
                bopIsa = "Mod";
                break;

            case BinaryOperator.Opcode.Lt:
                bopIsa = "Lt";
                break;

            case BinaryOperator.Opcode.Le:
                bopIsa = "Le";
                break;

            case BinaryOperator.Opcode.Gt:
                bopIsa = "Gt";
                break;

            case BinaryOperator.Opcode.Ge:
                bopIsa = "Ge";
                break;

            case BinaryOperator.Opcode.And:
                bopIsa = "And";
                break;

            case BinaryOperator.Opcode.Or:
                bopIsa = "Or";
                break;

            case BinaryOperator.Opcode.Imp:
                bopIsa = "Imp";
                break;

            case BinaryOperator.Opcode.Iff:
                bopIsa = "Iff";
                break;

            default:
                throw new NotImplementedException();
            }

            var list = new List <Term> {
                arg1, IsaCommonTerms.TermIdentFromName(bopIsa), arg2
            };

            return(new TermApp(IsaCommonTerms.TermIdentFromName("BinOp"), list));
        }
예제 #7
0
 private Expr MakeIntBinaryBool(string suffix, BinaryOperator.Opcode infixOp, Expr lhs, Expr rhs)
 {
     return(MakeBinaryIntFunctionCall("BV32_" + suffix, infixOp, Type.Bool, lhs, rhs));
 }