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 product(self): if self.is_scalar: if get_expr_mode(): return expr(ExprArrayProductModel(self.get_model())) else: ret = 0 if self.size == 0 else 1 for f in self.get_model().field_l: ret *= int(f.get_val()) return ret else: raise Exception("Composite arrays do not have a product")
def sum(self): if self.is_scalar: if get_expr_mode(): return expr(ExprArraySumModel(self.get_model())) else: ret = 0 for f in self.get_model().field_l: ret += int(f.get_val()) return ret else: raise Exception("Composite arrays do not have a sum")
def sum(self): if self.is_scalar: if get_expr_mode(): raise Exception("Constraints on sum not supported") return expr(ExprArraySumModel(self.get_model())) else: ret = 0 for f in self.get_model().field_l: v = int(f.get_val()) print("v: " + str(v)) ret += int(f.get_val()) return ret else: raise Exception("Composite arrays do not have a sum")
def __contains__(self, lhs): if get_expr_mode(): to_expr(lhs) return expr( ExprInModel( pop_expr(), ExprRangelistModel([ExprFieldRefModel(self.get_model())]))) else: model = self.get_model() if self.is_enum: ei: EnumInfo = self.t.enum_i val = ei.e2v(lhs) for f in model.field_l: if int(f.get_val()) == val: return True elif self.is_scalar: for f in model.field_l: if int(f.get_val()) == int(lhs): return True else: return lhs in self.backing_arr return False
def __len__(self): if get_expr_mode(): raise Exception("len cannot be used in constraints") else: return self.size
def size(self): model = self.get_model() if get_expr_mode(): return expr(ExprFieldRefModel(model.size)) else: return int(model.size.get_val())