@@ -2626,6 +2626,84 @@ class PyOpSuccessors : public Sliceable<PyOpSuccessors, PyBlock> {
26262626 PyOperationRef operation;
26272627};
26282628
2629+ // / A list of block successors. Internally, these are stored as consecutive
2630+ // / elements, random access is cheap. The (returned) successor list is
2631+ // / associated with the operation and block whose successors these are, and thus
2632+ // / extends the lifetime of this operation and block.
2633+ class PyBlockSuccessors : public Sliceable <PyBlockSuccessors, PyBlock> {
2634+ public:
2635+ static constexpr const char *pyClassName = " BlockSuccessors" ;
2636+
2637+ PyBlockSuccessors (PyBlock block, PyOperationRef operation,
2638+ intptr_t startIndex = 0 , intptr_t length = -1 ,
2639+ intptr_t step = 1 )
2640+ : Sliceable(startIndex,
2641+ length == -1 ? mlirBlockGetNumSuccessors(block.get())
2642+ : length,
2643+ step),
2644+ operation (operation), block(block) {}
2645+
2646+ private:
2647+ // / Give the parent CRTP class access to hook implementations below.
2648+ friend class Sliceable <PyBlockSuccessors, PyBlock>;
2649+
2650+ intptr_t getRawNumElements () {
2651+ block.checkValid ();
2652+ return mlirBlockGetNumSuccessors (block.get ());
2653+ }
2654+
2655+ PyBlock getRawElement (intptr_t pos) {
2656+ MlirBlock block = mlirBlockGetSuccessor (this ->block .get (), pos);
2657+ return PyBlock (operation, block);
2658+ }
2659+
2660+ PyBlockSuccessors slice (intptr_t startIndex, intptr_t length, intptr_t step) {
2661+ return PyBlockSuccessors (block, operation, startIndex, length, step);
2662+ }
2663+
2664+ PyOperationRef operation;
2665+ PyBlock block;
2666+ };
2667+
2668+ // / A list of block predecessors. The (returned) predecessor list is
2669+ // / associated with the operation and block whose predecessors these are, and
2670+ // / thus extends the lifetime of this operation and block.
2671+ class PyBlockPredecessors : public Sliceable <PyBlockPredecessors, PyBlock> {
2672+ public:
2673+ static constexpr const char *pyClassName = " BlockPredecessors" ;
2674+
2675+ PyBlockPredecessors (PyBlock block, PyOperationRef operation,
2676+ intptr_t startIndex = 0 , intptr_t length = -1 ,
2677+ intptr_t step = 1 )
2678+ : Sliceable(startIndex,
2679+ length == -1 ? mlirBlockGetNumPredecessors(block.get())
2680+ : length,
2681+ step),
2682+ operation (operation), block(block) {}
2683+
2684+ private:
2685+ // / Give the parent CRTP class access to hook implementations below.
2686+ friend class Sliceable <PyBlockPredecessors, PyBlock>;
2687+
2688+ intptr_t getRawNumElements () {
2689+ block.checkValid ();
2690+ return mlirBlockGetNumPredecessors (block.get ());
2691+ }
2692+
2693+ PyBlock getRawElement (intptr_t pos) {
2694+ MlirBlock block = mlirBlockGetPredecessor (this ->block .get (), pos);
2695+ return PyBlock (operation, block);
2696+ }
2697+
2698+ PyBlockPredecessors slice (intptr_t startIndex, intptr_t length,
2699+ intptr_t step) {
2700+ return PyBlockPredecessors (block, operation, startIndex, length, step);
2701+ }
2702+
2703+ PyOperationRef operation;
2704+ PyBlock block;
2705+ };
2706+
26292707// / A list of operation attributes. Can be indexed by name, producing
26302708// / attributes, or by index, producing named attributes.
26312709class PyOpAttributeMap {
@@ -3655,7 +3733,19 @@ void mlir::python::populateIRCore(nb::module_ &m) {
36553733 },
36563734 nb::arg (" operation" ),
36573735 " Appends an operation to this block. If the operation is currently "
3658- " in another block, it will be moved." );
3736+ " in another block, it will be moved." )
3737+ .def_prop_ro (
3738+ " successors" ,
3739+ [](PyBlock &self) {
3740+ return PyBlockSuccessors (self, self.getParentOperation ());
3741+ },
3742+ " Returns the list of Block successors." )
3743+ .def_prop_ro (
3744+ " predecessors" ,
3745+ [](PyBlock &self) {
3746+ return PyBlockPredecessors (self, self.getParentOperation ());
3747+ },
3748+ " Returns the list of Block predecessors." );
36593749
36603750 // ----------------------------------------------------------------------------
36613751 // Mapping of PyInsertionPoint.
@@ -4099,6 +4189,8 @@ void mlir::python::populateIRCore(nb::module_ &m) {
40994189 PyBlockArgumentList::bind (m);
41004190 PyBlockIterator::bind (m);
41014191 PyBlockList::bind (m);
4192+ PyBlockSuccessors::bind (m);
4193+ PyBlockPredecessors::bind (m);
41024194 PyOperationIterator::bind (m);
41034195 PyOperationList::bind (m);
41044196 PyOpAttributeMap::bind (m);
0 commit comments