@@ -2626,6 +2626,84 @@ class PyOpSuccessors : public Sliceable<PyOpSuccessors, PyBlock> {
2626
2626
PyOperationRef operation;
2627
2627
};
2628
2628
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
+
2629
2707
// / A list of operation attributes. Can be indexed by name, producing
2630
2708
// / attributes, or by index, producing named attributes.
2631
2709
class PyOpAttributeMap {
@@ -3655,7 +3733,19 @@ void mlir::python::populateIRCore(nb::module_ &m) {
3655
3733
},
3656
3734
nb::arg (" operation" ),
3657
3735
" 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." );
3659
3749
3660
3750
// ----------------------------------------------------------------------------
3661
3751
// Mapping of PyInsertionPoint.
@@ -4099,6 +4189,8 @@ void mlir::python::populateIRCore(nb::module_ &m) {
4099
4189
PyBlockArgumentList::bind (m);
4100
4190
PyBlockIterator::bind (m);
4101
4191
PyBlockList::bind (m);
4192
+ PyBlockSuccessors::bind (m);
4193
+ PyBlockPredecessors::bind (m);
4102
4194
PyOperationIterator::bind (m);
4103
4195
PyOperationList::bind (m);
4104
4196
PyOpAttributeMap::bind (m);
0 commit comments