def __a_init__(self, op, args, variables=None, symbolic=None, length=None, simplified=<NUM_LIT:0>, errored=None, eager_backends=None, uninitialized=None, uc_alloc_depth=None, annotations=None, encoded_name=None, depth=None, args_have_annotations=None):  
<EOL>self.op = op<EOL>self.args = args if type(args) is tuple else tuple(args)<EOL>self.length = length<EOL>self.variables = frozenset(variables) if type(variables) is not frozenset else variables<EOL>self.symbolic = symbolic<EOL>self.annotations = annotations<EOL>self.depth = depth if depth is not None else <NUM_LIT:1><EOL>self._eager_backends = eager_backends<EOL>self._cached_encoded_name = encoded_name<EOL>self._errored = errored if errored is not None else set()<EOL>self._simplified = simplified<EOL>self._cache_key = ASTCacheKey(self)<EOL>self._excavated = None<EOL>self._burrowed = None<EOL>self._uninitialized = uninitialized<EOL>self._uc_alloc_depth = uc_alloc_depth<EOL>if not annotations and args_have_annotations is False:<EOL><INDENT>self._uneliminatable_annotations = frozenset()<EOL>self._relocatable_annotations = frozenset()<EOL><DEDENT>else:<EOL><INDENT>ast_args = tuple(a for a in self.args if isinstance(a, Base))<EOL>self._uneliminatable_annotations = frozenset(itertools.chain(<EOL>itertools.chain.from_iterable(a._uneliminatable_annotations for a in ast_args),<EOL>tuple(a for a in self.annotations if not a.eliminatable and not a.relocatable)<EOL>))<EOL>self._relocatable_annotations = OrderedDict((e, True) for e in tuple(itertools.chain(<EOL>itertools.chain.from_iterable(a._relocatable_annotations for a in ast_args),<EOL>tuple(a for a in self.annotations if not a.eliminatable and a.relocatable)<EOL>))).keys()<EOL><DEDENT>if len(self.args) == <NUM_LIT:0>:<EOL><INDENT>raise ClaripyOperationError("<STR_LIT>")<EOL><DEDENT>
Initializes an AST. Takes the same arguments as ``Base.__new__()``

We use this instead of ``__init__`` due to python's undesirable behavior w.r.t. automatically calling it on
return from ``__new__``.