Exemple #1
0
    def build_IfExp(ctx, node):
        build_stmt(ctx, node.test)
        build_stmt(ctx, node.body)
        build_stmt(ctx, node.orelse)

        if is_taichi_class(node.test.ptr) or is_taichi_class(
                node.body.ptr) or is_taichi_class(node.orelse.ptr):
            node.ptr = ti_ops.select(node.test.ptr, node.body.ptr,
                                     node.orelse.ptr)
            return node.ptr

        is_static_if = (ASTTransformer.get_decorator(ctx,
                                                     node.test) == "static")

        if is_static_if:
            if node.test.ptr:
                node.ptr = build_stmt(ctx, node.body)
            else:
                node.ptr = build_stmt(ctx, node.orelse)
            return node.ptr

        val = impl.expr_init(None)

        impl.begin_frontend_if(node.test.ptr)
        _ti_core.begin_frontend_if_true()
        val.assign(node.body.ptr)
        _ti_core.pop_scope()
        _ti_core.begin_frontend_if_false()
        val.assign(node.orelse.ptr)
        _ti_core.pop_scope()

        node.ptr = val
        return node.ptr
Exemple #2
0
    def build_While(ctx, node):
        if node.orelse:
            raise TaichiSyntaxError(
                "'else' clause for 'while' not supported in Taichi kernels")

        with ctx.loop_scope_guard():
            _ti_core.begin_frontend_while(expr.Expr(1).ptr)
            while_cond = build_stmt(ctx, node.test)
            impl.begin_frontend_if(while_cond)
            _ti_core.begin_frontend_if_true()
            _ti_core.pop_scope()
            _ti_core.begin_frontend_if_false()
            _ti_core.insert_break_stmt()
            _ti_core.pop_scope()
            build_stmts(ctx, node.body)
            _ti_core.pop_scope()
        return None
Exemple #3
0
    def build_short_circuit_or(operands):
        if len(operands) == 1:
            return operands[0].ptr

        val = impl.expr_init(None)
        lhs = operands[0].ptr
        impl.begin_frontend_if(lhs)

        _ti_core.begin_frontend_if_true()
        val.assign(1)
        _ti_core.pop_scope()

        _ti_core.begin_frontend_if_false()
        rhs = ASTTransformer.build_short_circuit_or(operands[1:])
        val.assign(rhs)
        _ti_core.pop_scope()

        return val
Exemple #4
0
    def build_short_circuit_and(ast_builder, operands):
        if len(operands) == 1:
            return operands[0].ptr

        val = impl.expr_init(None)
        lhs = operands[0].ptr
        impl.begin_frontend_if(ast_builder, lhs)

        ast_builder.begin_frontend_if_true()
        rhs = ASTTransformer.build_short_circuit_and(ast_builder, operands[1:])
        val.assign(rhs)
        ast_builder.pop_scope()

        ast_builder.begin_frontend_if_false()
        val.assign(0)
        ast_builder.pop_scope()

        return val
Exemple #5
0
    def build_If(ctx, node):
        build_stmt(ctx, node.test)
        is_static_if = (ASTTransformer.get_decorator(ctx,
                                                     node.test) == "static")

        if is_static_if:
            if node.test.ptr:
                build_stmts(ctx, node.body)
            else:
                build_stmts(ctx, node.orelse)
            return node

        with ctx.non_static_scope_guard():
            impl.begin_frontend_if(node.test.ptr)
            _ti_core.begin_frontend_if_true()
            build_stmts(ctx, node.body)
            _ti_core.pop_scope()
            _ti_core.begin_frontend_if_false()
            build_stmts(ctx, node.orelse)
            _ti_core.pop_scope()
        return None
Exemple #6
0
    def build_IfExp(ctx, node):
        build_stmt(ctx, node.test)
        build_stmt(ctx, node.body)
        build_stmt(ctx, node.orelse)

        if is_taichi_class(node.test.ptr) or is_taichi_class(
                node.body.ptr) or is_taichi_class(node.orelse.ptr):
            node.ptr = ti_ops.select(node.test.ptr, node.body.ptr,
                                     node.orelse.ptr)
            warnings.warn_explicit(
                'Using conditional expression for element-wise select operation on '
                'Taichi vectors/matrices is deprecated. '
                'Please use "ti.select" instead.', DeprecationWarning,
                ctx.file, node.lineno + ctx.lineno_offset)
            return node.ptr

        is_static_if = (ASTTransformer.get_decorator(ctx,
                                                     node.test) == "static")

        if is_static_if:
            if node.test.ptr:
                node.ptr = build_stmt(ctx, node.body)
            else:
                node.ptr = build_stmt(ctx, node.orelse)
            return node.ptr

        val = impl.expr_init(None)

        impl.begin_frontend_if(ctx.ast_builder, node.test.ptr)
        ctx.ast_builder.begin_frontend_if_true()
        val.assign(node.body.ptr)
        ctx.ast_builder.pop_scope()
        ctx.ast_builder.begin_frontend_if_false()
        val.assign(node.orelse.ptr)
        ctx.ast_builder.pop_scope()

        node.ptr = val
        return node.ptr