def ceil(viper_ast: ViperAST, dec, scaling_factor: int, pos=None, info=None): mceil = mangled.MATH_CEIL domain = mangled.MATH_DOMAIN scaling_factor_lit = viper_ast.IntLit(scaling_factor, pos) args = [dec, scaling_factor_lit] return viper_ast.DomainFuncApp(mceil, args, viper_ast.Int, pos, info, domain)
def floor(viper_ast: ViperAST, dec, scaling_factor: int, pos=None, info=None): mfloor = mangled.MATH_FLOOR domain = mangled.MATH_DOMAIN scaling_factor_lit = viper_ast.IntLit(scaling_factor, pos) args = [dec, scaling_factor_lit] return viper_ast.DomainFuncApp(mfloor, args, viper_ast.Int, pos, info, domain)
def method_id(viper_ast: ViperAST, method, len: int, pos=None, info=None): mid = mangled.BLOCKCHAIN_METHOD_ID domain = mangled.BLOCKCHAIN_DOMAIN rl = viper_ast.IntLit(len, pos) return viper_ast.DomainFuncApp(mid, [method, rl], viper_ast.SeqType(viper_ast.Int), pos, info, domain)
def struct_type_tag(viper_ast: ViperAST, ref, pos=None, info=None): """ Returns the type tag of a struct which we store at index -1 of a struct """ domain = mangled.STRUCT_OPS_DOMAIN idx = viper_ast.IntLit(mangled.STRUCT_TYPE_LOC) field = struct_loc(viper_ast, ref, idx, pos) getter = mangled.STRUCT_GET type_type = viper_ast.Int type_map = _struct_type_var_map(viper_ast, type_type) return viper_ast.DomainFuncApp(getter, [field], type_type, pos, info, domain, type_map)
def implements(viper_ast: ViperAST, address, interface: str, ctx: Context, pos=None, info=None): impl = mangled.IMPLEMENTS domain = mangled.CONTRACT_DOMAIN intf = viper_ast.IntLit( first_index(lambda i: i == interface, ctx.program.interfaces), pos) return viper_ast.DomainFuncApp(impl, [address, intf], viper_ast.Bool, pos, info, domain)
def struct_get_idx(viper_ast: ViperAST, ref, idx: Union[int, Expr], viper_type, pos=None, info=None): domain = mangled.STRUCT_OPS_DOMAIN idx_lit = viper_ast.IntLit(idx) if isinstance(idx, int) else idx field = struct_loc(viper_ast, ref, idx_lit, pos, info) getter = mangled.STRUCT_GET type_map = _struct_type_var_map(viper_ast, viper_type) return viper_ast.DomainFuncApp(getter, [field], viper_type, pos, info, domain, type_map)
def array_init(viper_ast: ViperAST, arg, size: int, element_type, pos=None, info=None): arr_type = array_type(viper_ast, element_type) type_vars = {viper_ast.TypeVar(mangled.ARRAY_ELEMENT_VAR): element_type} size = viper_ast.IntLit(size, pos, info) init = mangled.ARRAY_INIT domain = mangled.ARRAY_DOMAIN return viper_ast.DomainFuncApp(init, [arg, size], arr_type, pos, info, domain, type_vars)
def struct_set_idx(viper_ast: ViperAST, ref, val, idx: int, member_type, pos=None, info=None): setter = mangled.STRUCT_SET s_type = struct_type(viper_ast) domain = mangled.STRUCT_OPS_DOMAIN idx = viper_ast.IntLit(idx) type_map = _struct_type_var_map(viper_ast, member_type) return viper_ast.DomainFuncApp(setter, [ref, idx, val], s_type, pos, info, domain, type_map)
def struct_get(viper_ast: ViperAST, ref, member: str, member_type, struct_type: StructType, pos=None, info=None): domain = mangled.STRUCT_OPS_DOMAIN idx = viper_ast.IntLit(struct_type.member_indices[member]) field = struct_loc(viper_ast, ref, idx, pos, info) getter = mangled.STRUCT_GET type_map = _struct_type_var_map(viper_ast, member_type) return viper_ast.DomainFuncApp(getter, [field], member_type, pos, info, domain, type_map)
def struct_set(viper_ast: ViperAST, ref, val, member: str, member_type, type: StructType, pos=None, info=None): setter = mangled.STRUCT_SET s_type = struct_type(viper_ast) domain = mangled.STRUCT_OPS_DOMAIN idx = viper_ast.IntLit(type.member_indices[member]) type_map = _struct_type_var_map(viper_ast, member_type) return viper_ast.DomainFuncApp(setter, [ref, idx, val], s_type, pos, info, domain, type_map)
def w_mod(viper_ast: ViperAST, first, second, pos=None, info=None): if isinstance(viper_ast, WrappedViperAST): viper_ast = viper_ast.viper_ast wi_mod = mangled.WRAPPED_INT_MOD domain = mangled.WRAPPED_INT_DOMAIN args = [first, second] func_app = viper_ast.DomainFuncApp(wi_mod, args, wrapped_int_type(viper_ast), pos, info, domain) is_div_zero = viper_ast.EqCmp(viper_ast.IntLit(0), w_unwrap(viper_ast, second, pos, info), pos, info) artificial_div_zero = w_wrap( viper_ast, viper_ast.Mod(w_unwrap(viper_ast, first, pos, info), w_unwrap(viper_ast, second, pos, info), pos, info), pos, info) return viper_ast.CondExp(is_div_zero, artificial_div_zero, func_app, pos, info)