def METHOD_NAME(self, expr):
    type_name = self.layer.types['result_t'].name
    type_precision = self.layer.types['result_t'].precision
    if isinstance(expr.exp, Integer):
        l_brac, r_brac = ('(', ')') if len(expr.base.args) > 1 else ('', '')
        if expr.exp > 1:
            return (
                '('
                + '*'.join([l_brac + self._symbol_to_array(self._print(expr.base)) + r_brac for _ in range(expr.exp)])
                + ')'
            )
        elif expr.exp == -1:  # 1/x
            base = l_brac + self._symbol_to_array(self._print(expr.base)) + r_brac
            return f'hls::recip<{type_precision.width}, {type_precision.integer}>(({type_name}){base})'
        else:
            return super().METHOD_NAME(expr)
    else:
        base = self._print(expr.base)
        if expr.exp == 0.5:
            return f'{self._ns}sqrt<{type_precision.width}, {type_precision.integer}>(({type_name})({base}))'
        elif expr.exp == S.One / 3:
            return f'{self._ns}cbrt<{type_precision.width}, {type_precision.integer}>(({type_name})({base}))'
        else:
            exp = self._print(expr.exp)
            return f'{self._ns}pow<{type_precision.width}, {type_precision.integer}>(({type_name})({base}), {exp})'