コード例 #1
0
    def __enter__(self):
        push_constraint_stmt(self.stmt)
        push_constraint_scope(self.stmt)
        model = self.arr_model
        #        return expr(ExprArraySubscriptModel())

        push_foreach_arr(self.arr)

        idx_term = foreach.idx_term_c(self.stmt.index)
        if self.arr_model.is_scalar:
            it_term = foreach.it_term_c(
                ExprArraySubscriptModel(ExprFieldRefModel(model),
                                        ExprFieldRefModel(self.stmt.index)))
        else:
            self.arr.t._int_field_info.root_e = ExprArraySubscriptModel(
                ExprFieldRefModel(model), ExprFieldRefModel(self.stmt.index))
            it_term = self.arr.t

        if self.idx and self.it:
            return (idx_term, it_term)
        else:
            if self.it:
                return it_term
            else:
                return idx_term
コード例 #2
0
 def __getitem__(self, k):
     model = self._int_field_info.model
     if get_expr_mode():
         # TODO: must determine whether we're within a foreach or just on our own
         if is_foreach_arr(self):
             to_expr(k)
             idx_e = pop_expr()
             
             return expr(ExprArraySubscriptModel(
                 ExprFieldRefModel(self.get_model()),
                 idx_e))
         else:
             to_expr(k)
             idx_e = pop_expr()
             return expr(ExprArraySubscriptModel(
                 ExprFieldRefModel(self.get_model()),
                 idx_e))
     else:
         if self.is_enum:
             ei : EnumInfo = self.t.enum_i
             return ei.v2e(model.field_l[k].get_val())
         elif self.is_scalar:
             return int(model.field_l[k].get_val())
         else:
             return self.backing_arr[k]
コード例 #3
0
ファイル: types.py プロジェクト: edcote/pyvsc
    def __getitem__(self, k):
        model = self._int_field_info.model
        if get_expr_mode():
            # TODO: must determine whether we're within a foreach or just on our own
            if is_foreach_arr(self):
                to_expr(k)
                idx_e = pop_expr()

                return expr_subscript(
                    ExprArraySubscriptModel(
                        ExprFieldRefModel(self.get_model()), idx_e))
            else:
                to_expr(k)
                idx_e = pop_expr()
                return expr_subscript(
                    ExprArraySubscriptModel(
                        ExprFieldRefModel(self.get_model()), idx_e))
        else:
            if self.is_enum:
                ei: EnumInfo = self.t.enum_i
                return ei.v2e(model.field_l[k].get_val())
            elif self.is_scalar:
                # The model's view is always masked 2's complement
                v = int(model.field_l[k].get_val())

                if self.t.is_signed:
                    if (v & (1 << (self.t.width - 1))) != 0:
                        v = -((~v & self.mask) + 1)

                return v
            else:
                return self.backing_arr[k]
コード例 #4
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())))
コード例 #5
0
 def visit_expr_array_subscript(self, s):
     if self.do_copy_level > 0:
         self._expr = ExprArraySubscriptModel(
             self.expr(s.lhs),
             self.expr(s.rhs))
     else:
         super().visit_expr_array_subscript(s)
コード例 #6
0
ファイル: constraints.py プロジェクト: fvutils/pyvsc
    def __enter__(self):
        push_constraint_stmt(self.stmt)
        push_constraint_scope(self.stmt)

        idx_term = foreach.idx_term_c(self.stmt.index)
        it_term = foreach.it_term_c(
            ExprArraySubscriptModel(self.arr_ref_e,
                                    ExprFieldRefModel(self.stmt.index)))

        if self.idx and self.it:
            return (idx_term, it_term)
        else:
            if self.it:
                return it_term
            else:
                return idx_term
コード例 #7
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())))
コード例 #8
0
    def visit_expr_array_subscript(self, s: ExprArraySubscriptModel):
        fm = s.getFieldModel()
        if self._pass == 1:
            # During pass 1, build out randsets based on constraint
            # relationships

            # If the field is already referenced by an existing randset
            # that is not this one, we need to merge the sets
            if fm in self._randset_field_m.keys():
                # There's an existing randset that holds this field
                # as a solve target
                ex_randset = self._randset_field_m[fm]
                if self._active_randset is None:
                    self._active_randset = ex_randset
                elif ex_randset is not self._active_randset:
                    for f in self._active_randset.fields():
                        # Relink to the new consolidated randset
                        self._randset_field_m[f] = ex_randset
                        ex_randset.add_field(f)
                    # TODO: this might be later
                    for c in self._active_randset.constraints():
                        ex_randset.add_constraint(c)

                    # Remove the previous randset
                    idx = self._randset_m[self._active_randset]
                    self._randset_m.pop(idx)
                    self._randset_l[idx] = None
                    self._active_randset = ex_randset
            else:
                # No existing randset holds this field as a
                # solve target
                if self._active_randset is None:
                    self._active_randset = RandSet()
                    idx = len(self._randset_l)
                    self._randset_m[self._active_randset] = idx
                    self._randset_l.append(self._active_randset)

                # Need to register this field/randset mapping
                self._active_randset.add_field(fm)
                self._randset_field_m[fm] = self._active_randset

            if fm in self._field_m.keys():
                self._field_m.pop(fm)
コード例 #9
0
ファイル: types.py プロジェクト: fvutils/pyvsc
    def __getitem__(self, k):
        if is_expr_mode():
            if isinstance(k, slice):
                # Part-select on a field expression
                print("k=" + str(k) + " start=" + str(k.start) + " stop=" +
                      str(k.stop))

                to_expr(k.start)
                upper = pop_expr()
                to_expr(k.stop)
                lower = pop_expr()

                base_e = pop_expr()
                return expr(ExprPartselectModel(base_e, upper, lower))
            else:
                # single value
                to_expr(k)
                idx_e = pop_expr()
                base_e = pop_expr()

                return expr_subscript(ExprArraySubscriptModel(base_e, idx_e))
        else:
            raise Exception(
                "Calling __getitem__ on an expr on non-expression context")
コード例 #10
0
ファイル: expr2field_visitor.py プロジェクト: fvutils/pyvsc
 def visit_expr_array_subscript(self, s: ExprArraySubscriptModel):
     self.fm = s.subscript()