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
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]
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]
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())))
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)
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
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())))
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)
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")
def visit_expr_array_subscript(self, s: ExprArraySubscriptModel): self.fm = s.subscript()