Exemplo n.º 1
0
        public void MulAssociativityPropagateConstantUp()
        {
            var builderPair = GetSimpleAndConstantFoldingBuilder();
            var sb          = builderPair.Item1;
            var cfb         = builderPair.Item2;

            Expr foldedResult   = sb.ConstantBV(1, 8);
            Expr unfoldedResult = foldedResult;

            for (int index = 0; index < 3; ++index)
            {
                var x = GetVarAndIdExpr("x" + index.ToString(), BasicType.GetBvType(8)).Item2;
                foldedResult   = cfb.BVMUL(x, foldedResult);
                unfoldedResult = sb.BVMUL(x, unfoldedResult);
                CheckIsBvType(foldedResult, 8);
                CheckIsBvType(unfoldedResult, 8);
            }
            Assert.AreEqual("BVMUL8(1bv8, BVMUL8(x2, BVMUL8(x1, x0)))", foldedResult.ToString());
            Assert.AreEqual("BVMUL8(x2, BVMUL8(x1, BVMUL8(x0, 1bv8)))", unfoldedResult.ToString());
            Assert.IsFalse(foldedResult.Equals(unfoldedResult));

            var foldedTopAsNAry = ExprUtil.AsBVMUL(foldedResult);
            // Check the constant is the top left argument
            var topLeftConstant = ExprUtil.AsLiteral(foldedTopAsNAry.Args[0]);

            Assert.IsNotNull(topLeftConstant);
            CheckIsBvType(topLeftConstant, 8);
            Assert.AreEqual(1, topLeftConstant.asBvConst.Value.ToInt);
        }
Exemplo n.º 2
0
        public void MULAssociativityAddNearbyConstants()
        {
            var builderPair = GetSimpleAndConstantFoldingBuilder();
            var sb          = builderPair.Item1;
            var cfb         = builderPair.Item2;

            var x = GetVarAndIdExpr("x", BasicType.GetBvType(8)).Item2;

            Expr foldedResult   = x;
            Expr unfoldedResult = foldedResult;

            for (int index = 2; index <= 4; ++index)
            {
                foldedResult   = cfb.BVMUL(cfb.ConstantBV(index, 8), foldedResult);
                unfoldedResult = sb.BVMUL(sb.ConstantBV(index, 8), unfoldedResult);
                CheckIsBvType(foldedResult, 8);
                CheckIsBvType(unfoldedResult, 8);
            }
            Assert.AreEqual("BVMUL8(24bv8, x)", foldedResult.ToString());
            Assert.AreEqual("BVMUL8(4bv8, BVMUL8(3bv8, BVMUL8(2bv8, x)))", unfoldedResult.ToString());
            Assert.IsFalse(foldedResult.Equals(unfoldedResult));

            var foldedTopAsNAry = ExprUtil.AsBVMUL(foldedResult);
            // Check the constant is the top left argument
            var topLeftConstant = ExprUtil.AsLiteral(foldedTopAsNAry.Args[0]);

            Assert.IsNotNull(topLeftConstant);
            CheckIsBvType(topLeftConstant, 8);
            Assert.AreEqual(24, topLeftConstant.asBvConst.Value.ToInt);
        }
Exemplo n.º 3
0
        public void NoFold()
        {
            var builders = GetSimpleAndConstantFoldingBuilder();
            SimpleExprBuilder          sfb = builders.Item1;
            ConstantFoldingExprBuilder cfb = builders.Item2;
            var arg0         = GetVarAndIdExpr("x", BasicType.GetBvType(8)).Item2;
            var arg1         = GetVarAndIdExpr("y", BasicType.GetBvType(8)).Item2;
            var simpleResult = sfb.BVMUL(arg0, arg1);
            var result       = cfb.BVMUL(arg0, arg1);

            CheckIsBvType(simpleResult, 8);
            CheckIsBvType(result, 8);
            Assert.IsNull(ExprUtil.AsLiteral(result));
            Assert.IsNotNull(ExprUtil.AsBVMUL(result));
            Assert.IsTrue(ExprUtil.StructurallyEqual(result, simpleResult));
        }
Exemplo n.º 4
0
        public void SameExprAdded()
        {
            var cfb  = GetConstantFoldingBuilder();
            var x    = GetVarAndIdExpr("x", BasicType.GetBvType(8)).Item2;
            var y    = GetVarAndIdExpr("x", BasicType.GetBvType(8)).Item2;
            var side = cfb.BVADD(x, y);

            CheckIsBvType(side, 8);
            Assert.IsNull(ExprUtil.AsLiteral(side));
            var result = cfb.BVADD(side, side);

            CheckIsBvType(result, 8);
            var mul = ExprUtil.AsBVMUL(result);

            Assert.IsNotNull(mul);
            var lhs = ExprUtil.AsLiteral(mul.Args[0]);

            Assert.IsNotNull(lhs);
            Assert.AreEqual(2, lhs.asBvConst.Value.ToInt);
            Assert.AreSame(side, mul.Args[1]);
        }