Python bindings: provide context managers for the Blocks
Expose EDSC block builders as Python context managers, similarly to loop builders. Note that blocks, unlike loops, are addressable and may need to be "declared" without necessarily filling their bodies with instructions. This is the case, for example, when branching to a new block from the existing block. Therefore, creating the block context manager immediately creates the block (unless the manager captures an existing block) by creating and destroying the block builder. With this approach, one can either fill in the block and refer to it later leveraging Python's dynamic variable lookup with BlockContext([indexType]) as b: op(...) # operation inside the block ret() op(...) # operation outside the block (in the function entry block) br(b, [...]) # branching to the block created above or declare the block contexts upfront and enter them on demand bb1 = BlockContext() # empty block created in the surrounding function bb2 = BlockContext() # context cond_br(bb1.handle, [], bb2.handle, []) # branch to blocks from here with bb1: op(...) # operation inside the first block with bb2: op(...) # operation inside the second block with bb1: op(...) # append operation to the first block Additionally, one can create multiple throw-away contexts that append to the same block with BlockContext() as b: op(...) # operation inside the block with BlockContext(appendTo(b)): op(...) # new context appends to the block which has a potential of being extended to control the insertion point of the block at a finer level of granularity. PiperOrigin-RevId: 238005298
Loading
Please sign in to comment