Beispiel #1
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]
Beispiel #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_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]
Beispiel #3
0
 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")
Beispiel #4
0
 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")
Beispiel #5
0
 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")
Beispiel #6
0
 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
Beispiel #7
0
 def __len__(self):
     if get_expr_mode():
         raise Exception("len cannot be used in constraints")
     else:
         return self.size
Beispiel #8
0
 def size(self):
     model = self.get_model()
     if get_expr_mode():
         return expr(ExprFieldRefModel(model.size))
     else:
         return int(model.size.get_val())