xref: /llvm-project/mlir/include/mlir-c/Dialect/SparseTensor.h (revision cd481fa827b76953cd12dae9319face96670c0b3)
1 //===-- mlir-c/Dialect/SparseTensor.h - C API for SparseTensor ----*- C -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM
4 // Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef MLIR_C_DIALECT_SPARSETENSOR_H
11 #define MLIR_C_DIALECT_SPARSETENSOR_H
12 
13 #include "mlir-c/AffineMap.h"
14 #include "mlir-c/IR.h"
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(SparseTensor, sparse_tensor);
21 
22 /// Dimension level types (and properties) that define sparse tensors.
23 /// See the documentation in SparseTensorAttrDefs.td for their meaning.
24 ///
25 /// These correspond to SparseTensorEncodingAttr::LevelType in the C++ API.
26 /// If updating, keep them in sync and update the static_assert in the impl
27 /// file.
28 typedef uint64_t MlirSparseTensorLevelType;
29 
30 enum MlirBaseSparseTensorLevelType {
31   MLIR_SPARSE_TENSOR_LEVEL_DENSE = 4,                   // 0b00001_00
32   MLIR_SPARSE_TENSOR_LEVEL_COMPRESSED = 8,              // 0b00010_00
33   MLIR_SPARSE_TENSOR_LEVEL_COMPRESSED_NU = 9,           // 0b00010_01
34   MLIR_SPARSE_TENSOR_LEVEL_COMPRESSED_NO = 10,          // 0b00010_10
35   MLIR_SPARSE_TENSOR_LEVEL_COMPRESSED_NU_NO = 11,       // 0b00010_11
36   MLIR_SPARSE_TENSOR_LEVEL_SINGLETON = 16,              // 0b00100_00
37   MLIR_SPARSE_TENSOR_LEVEL_SINGLETON_NU = 17,           // 0b00100_01
38   MLIR_SPARSE_TENSOR_LEVEL_SINGLETON_NO = 18,           // 0b00100_10
39   MLIR_SPARSE_TENSOR_LEVEL_SINGLETON_NU_NO = 19,        // 0b00100_11
40   MLIR_SPARSE_TENSOR_LEVEL_LOOSE_COMPRESSED = 32,       // 0b01000_00
41   MLIR_SPARSE_TENSOR_LEVEL_LOOSE_COMPRESSED_NU = 33,    // 0b01000_01
42   MLIR_SPARSE_TENSOR_LEVEL_LOOSE_COMPRESSED_NO = 34,    // 0b01000_10
43   MLIR_SPARSE_TENSOR_LEVEL_LOOSE_COMPRESSED_NU_NO = 35, // 0b01000_11
44   MLIR_SPARSE_TENSOR_LEVEL_TWO_OUT_OF_FOUR = 64,        // 0b10000_00
45 };
46 
47 //===----------------------------------------------------------------------===//
48 // SparseTensorEncodingAttr
49 //===----------------------------------------------------------------------===//
50 
51 /// Checks whether the given attribute is a `sparse_tensor.encoding` attribute.
52 MLIR_CAPI_EXPORTED bool
53 mlirAttributeIsASparseTensorEncodingAttr(MlirAttribute attr);
54 
55 /// Creates a `sparse_tensor.encoding` attribute with the given parameters.
56 MLIR_CAPI_EXPORTED MlirAttribute mlirSparseTensorEncodingAttrGet(
57     MlirContext ctx, intptr_t lvlRank,
58     MlirSparseTensorLevelType const *lvlTypes, MlirAffineMap dimToLvl,
59     MlirAffineMap lvlTodim, int posWidth, int crdWidth);
60 
61 /// Returns the level-rank of the `sparse_tensor.encoding` attribute.
62 MLIR_CAPI_EXPORTED intptr_t
63 mlirSparseTensorEncodingGetLvlRank(MlirAttribute attr);
64 
65 /// Returns a specified level-type of the `sparse_tensor.encoding` attribute.
66 MLIR_CAPI_EXPORTED MlirSparseTensorLevelType
67 mlirSparseTensorEncodingAttrGetLvlType(MlirAttribute attr, intptr_t lvl);
68 
69 /// Returns the dimension-to-level mapping of the `sparse_tensor.encoding`
70 /// attribute.
71 MLIR_CAPI_EXPORTED MlirAffineMap
72 mlirSparseTensorEncodingAttrGetDimToLvl(MlirAttribute attr);
73 
74 /// Returns the level-to-dimension mapping of the `sparse_tensor.encoding`
75 /// attribute.
76 MLIR_CAPI_EXPORTED MlirAffineMap
77 mlirSparseTensorEncodingAttrGetLvlToDim(MlirAttribute attr);
78 
79 /// Returns the position bitwidth of the `sparse_tensor.encoding` attribute.
80 MLIR_CAPI_EXPORTED int
81 mlirSparseTensorEncodingAttrGetPosWidth(MlirAttribute attr);
82 
83 /// Returns the coordinate bitwidth of the `sparse_tensor.encoding` attribute.
84 MLIR_CAPI_EXPORTED int
85 mlirSparseTensorEncodingAttrGetCrdWidth(MlirAttribute attr);
86 
87 #ifdef __cplusplus
88 }
89 #endif
90 
91 #include "mlir/Dialect/SparseTensor/Transforms/Passes.capi.h.inc"
92 
93 #endif // MLIR_C_DIALECT_SPARSETENSOR_H
94