Example #1
0
    def test_incr(self):
        obj = FieldCompositeModel("obj")
        arr = obj.add_field(
            FieldArrayModel(
                "arr",
                None,  # type_t
                True,  # is_scalar
                None,  # not an enum-type list
                32,
                False,
                True,
                False))
        for i in range(10):
            arr.add_field()
        obj.add_constraint(
            ConstraintBlockModel("XX", [
                ConstraintExprModel(
                    ExprBinModel(ExprFieldRefModel(arr.size), BinExprType.Eq,
                                 ExprLiteralModel(10, False, 32)))
            ]))
        foreach = ConstraintForeachModel(ExprFieldRefModel(arr))
        foreach.addConstraint(
            ConstraintImpliesModel(
                ExprBinModel(ExprFieldRefModel(foreach.index), BinExprType.Gt,
                             ExprLiteralModel(0, False, 32)),
                [
                    ConstraintExprModel(
                        ExprBinModel(
                            ExprArraySubscriptModel(
                                ExprFieldRefModel(arr),
                                ExprFieldRefModel(foreach.index)),
                            BinExprType.Eq,
                            ExprBinModel(
                                ExprArraySubscriptModel(
                                    ExprFieldRefModel(arr),
                                    ExprBinModel(
                                        ExprFieldRefModel(foreach.index),
                                        BinExprType.Sub,
                                        ExprLiteralModel(1, False, 32))),
                                BinExprType.Add, ExprLiteralModel(
                                    1, False, 32))))
                ]))

        obj.add_constraint(ConstraintBlockModel("c", [foreach]))

        #         print("Object: " + ModelPrettyPrinter.print(obj))
        #
        #         constraints = ArrayConstraintBuilder.build(obj)
        #         for c in constraints:
        #             print("Constraint: " + ModelPrettyPrinter.print(c))
        #         print("Object(1): " + ModelPrettyPrinter.print(obj))
        #
        #         ConstraintOverrideRollbackVisitor.rollback(obj)
        #         print("Object(2): " + ModelPrettyPrinter.print(obj))

        Randomizer.do_randomize([obj])

        for f in arr.field_l:
            print("" + f.name + ": " + str(int(f.get_val())))
Example #2
0
    def __init__(self, l, it=None, idx=None):
        self.stmt = None

        if it is None and idx is None:
            # Default: use it
            it = True
            idx = False
        else:
            # One or more are specified
            if idx is None:
                idx = False
            if it is None:
                it = False

        if not idx and not it:
            raise Exception("Neither it nor idx specified")

        # Form an expression to the array
        to_expr(l)
        e = pop_expr()

        self.arr_ref_e = e
        self.elem_t = Expr2FieldTypeVisitor().fieldtype(e)

        self.it = it
        self.idx = idx

        if not in_constraint_scope():
            raise Exception(
                "Attempting to use foreach constraint outside constraint scope"
            )

        self.stmt = ConstraintForeachModel(e)
        if in_srcinfo_mode():
            self.stmt.srcinfo = SourceInfo.mk()
Example #3
0
    def __init__(self, l, it=None, idx=None):
        self.stmt = None

        if it is None and idx is None:
            # Default: use it
            it = True
            idx = False
        else:
            # One or more are specified
            if idx is None:
                idx = False
            if it is None:
                it = False

        if not idx and not it:
            raise Exception("Neither it nor idx specified")

        self.it = it
        self.idx = idx
        self.arr = l
        self.arr_model = l._int_field_info.model
        if not in_constraint_scope():
            raise Exception(
                "Attempting to use foreach constraint outside constraint scope"
            )

        to_expr(l)
        e = pop_expr()
        self.stmt = ConstraintForeachModel(e)
Example #4
0
    def test_smoke(self):
        obj = FieldCompositeModel("obj")
        arr = obj.add_field(
            FieldArrayModel(
                "arr",
                None,  # type_t
                True,
                None,  # not an enum-type 
                32,
                False,
                True,
                True))
        #         for i in range(10):
        #             arr.add_field()
        obj.add_constraint(
            ConstraintBlockModel("XX", [
                ConstraintExprModel(
                    ExprBinModel(ExprFieldRefModel(arr.size), BinExprType.Eq,
                                 ExprLiteralModel(10, False, 32)))
            ]))

        foreach = ConstraintForeachModel(ExprFieldRefModel(arr))
        foreach.addConstraint(
            ConstraintExprModel(
                ExprBinModel(
                    ExprArraySubscriptModel(ExprFieldRefModel(arr),
                                            ExprFieldRefModel(foreach.index)),
                    BinExprType.Lt, ExprLiteralModel(10, False, 32))))

        obj.add_constraint(ConstraintBlockModel("c", [foreach]))

        #         print("Object: " + ModelPrettyPrinter.print(obj))
        #
        #         constraints = ArrayConstraintBuilder.build(obj)
        #         for c in constraints:
        #             print("Constraint: " + ModelPrettyPrinter.print(c))
        #         print("Object(1): " + ModelPrettyPrinter.print(obj))
        #
        #         ConstraintOverrideRollbackVisitor.rollback(obj)
        #         print("Object(2): " + ModelPrettyPrinter.print(obj))
        randstate = RandState(0)
        Randomizer.do_randomize(randstate, SourceInfo("", -1), [obj])

        for f in arr.field_l:
            print("" + f.name + ": " + str(int(f.get_val())))
Example #5
0
    def visit_constraint_foreach(self, f: ConstraintForeachModel):
        if self.do_copy_level > 0:
            ret = f.clone()

            with ConstraintCollector(self, ret):
                for cs in f.constraint_l:
                    cs.accept(self)

            self.constraints.append(ret)
        else:
            super().visit_constraint_foreach(f)