CIRCT 23.0.0git
Loading...
Searching...
No Matches
RTGModule.cpp
Go to the documentation of this file.
1//===- RTGModule.cpp - RTG API nanobind module ----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "CIRCTModules.h"
10
11#include "circt-c/Dialect/RTG.h"
12
13#include "mlir/Bindings/Python/NanobindAdaptors.h"
14
15#include <nanobind/nanobind.h>
16
17namespace nb = nanobind;
18
19using namespace circt;
20using namespace mlir::python::nanobind_adaptors;
21
22/// Populate the rtg python module.
24 m.doc() = "RTG dialect Python native extension";
25
26 //===--------------------------------------------------------------------===//
27 // Types
28 //===--------------------------------------------------------------------===//
29
30 // Sequence Types
31 //===--------------------------------------------------------------------===//
32
33 mlir_type_subclass(m, "SequenceType", rtgTypeIsASequence)
34 .def_classmethod(
35 "get",
36 [](nb::object cls, std::vector<MlirType> &elementTypes,
37 MlirContext ctxt) {
38 return cls(rtgSequenceTypeGet(ctxt, elementTypes.size(),
39 elementTypes.data()));
40 },
41 nb::arg("self"), nb::arg("elementTypes") = std::vector<MlirType>(),
42 nb::arg("ctxt") = nullptr)
43 .def_property_readonly(
44 "num_elements",
45 [](MlirType self) { return rtgSequenceTypeGetNumElements(self); })
46 .def("get_element", [](MlirType self, unsigned i) {
47 return rtgSequenceTypeGetElement(self, i);
48 });
49
50 mlir_type_subclass(m, "RandomizedSequenceType", rtgTypeIsARandomizedSequence)
51 .def_classmethod(
52 "get",
53 [](nb::object cls, MlirContext ctxt) {
54 return cls(rtgRandomizedSequenceTypeGet(ctxt));
55 },
56 nb::arg("self"), nb::arg("ctxt") = nullptr);
57
58 // Common Datastructure Types
59 //===--------------------------------------------------------------------===//
60
61 mlir_type_subclass(m, "SetType", rtgTypeIsASet)
62 .def_classmethod(
63 "get",
64 [](nb::object cls, MlirType elementType) {
65 return cls(rtgSetTypeGet(elementType));
66 },
67 nb::arg("self"), nb::arg("element_type"))
68 .def_property_readonly("element_type", [](MlirType self) {
69 return rtgSetTypeGetElementType(self);
70 });
71
72 mlir_type_subclass(m, "BagType", rtgTypeIsABag)
73 .def_classmethod(
74 "get",
75 [](nb::object cls, MlirType elementType) {
76 return cls(rtgBagTypeGet(elementType));
77 },
78 nb::arg("self"), nb::arg("element_type"))
79 .def_property_readonly("element_type", [](MlirType self) {
80 return rtgBagTypeGetElementType(self);
81 });
82
83 mlir_type_subclass(m, "DictType", rtgTypeIsADict)
84 .def_classmethod(
85 "get",
86 [](nb::object cls,
87 const std::vector<std::pair<MlirAttribute, MlirType>> &entries,
88 MlirContext ctxt) {
89 std::vector<MlirAttribute> names;
90 std::vector<MlirType> types;
91 for (auto entry : entries) {
92 names.push_back(entry.first);
93 types.push_back(entry.second);
94 }
95 return cls(
96 rtgDictTypeGet(ctxt, types.size(), names.data(), types.data()));
97 },
98 nb::arg("self"),
99 nb::arg("entries") =
100 std::vector<std::pair<MlirAttribute, MlirType>>(),
101 nb::arg("ctxt") = nullptr);
102
103 mlir_type_subclass(m, "ArrayType", rtgTypeIsAArray)
104 .def_classmethod(
105 "get",
106 [](nb::object cls, MlirType elementType, MlirContext ctxt) {
107 return cls(rtgArrayTypeGet(elementType));
108 },
109 nb::arg("self"), nb::arg("element_type"), nb::arg("ctxt") = nullptr)
110 .def_property_readonly("element_type", [](MlirType self) {
111 return rtgArrayTypeGetElementType(self);
112 });
113
114 mlir_type_subclass(m, "MapType", rtgTypeIsAMap)
115 .def_classmethod(
116 "get",
117 [](nb::object cls, MlirType keyType, MlirType valueType) {
118 return cls(rtgMapTypeGet(keyType, valueType));
119 },
120 nb::arg("self"), nb::arg("key_type"), nb::arg("value_type"))
121 .def_property_readonly(
122 "key_type", [](MlirType self) { return rtgMapTypeGetKeyType(self); })
123 .def_property_readonly("value_type", [](MlirType self) {
124 return rtgMapTypeGetValueType(self);
125 });
126
127 mlir_type_subclass(m, "TupleType", rtgTypeIsATuple)
128 .def_classmethod(
129 "get",
130 [](nb::object cls, const std::vector<MlirType> &fieldTypes,
131 MlirContext ctxt) {
132 return cls(
133 rtgTupleTypeGet(ctxt, fieldTypes.size(), fieldTypes.data()));
134 },
135 nb::arg("self"), nb::arg("field_types") = std::vector<MlirType>(),
136 nb::arg("ctxt") = nullptr)
137 .def_property_readonly("fields", [](MlirType self) {
138 std::vector<MlirType> fields;
139 for (intptr_t i = 0; i < rtgTypeGetNumFields(self); ++i)
140 fields.push_back(rtgTupleTypeGetFieldType(self, i));
141 return fields;
142 });
143
144 mlir_type_subclass(m, "StringType", rtgTypeIsAString)
145 .def_classmethod(
146 "get",
147 [](nb::object cls, MlirContext ctxt) {
148 return cls(rtgStringTypeGet(ctxt));
149 },
150 nb::arg("self"), nb::arg("ctxt") = nullptr);
151
152 // Types for ISA targets
153 //===--------------------------------------------------------------------===//
154
155 mlir_type_subclass(m, "LabelType", rtgTypeIsALabel)
156 .def_classmethod(
157 "get",
158 [](nb::object cls, MlirContext ctxt) {
159 return cls(rtgLabelTypeGet(ctxt));
160 },
161 nb::arg("self"), nb::arg("ctxt") = nullptr);
162
163 mlir_type_subclass(m, "MemoryBlockType", rtgTypeIsAMemoryBlock)
164 .def_classmethod(
165 "get",
166 [](nb::object cls, uint32_t addressWidth, MlirContext ctxt) {
167 return cls(rtgMemoryBlockTypeGet(ctxt, addressWidth));
168 },
169 nb::arg("self"), nb::arg("address_width"), nb::arg("ctxt") = nullptr)
170 .def_property_readonly("address_width", [](MlirType self) {
172 });
173
174 mlir_type_subclass(m, "MemoryType", rtgTypeIsAMemory)
175 .def_classmethod(
176 "get",
177 [](nb::object cls, uint32_t addressWidth, MlirContext ctxt) {
178 return cls(rtgMemoryTypeGet(ctxt, addressWidth));
179 },
180 nb::arg("self"), nb::arg("address_width"), nb::arg("ctxt") = nullptr)
181 .def_property_readonly("address_width", [](MlirType self) {
182 return rtgMemoryTypeGetAddressWidth(self);
183 });
184
185 //===--------------------------------------------------------------------===//
186 // Attributes
187 //===--------------------------------------------------------------------===//
188
189 mlir_attribute_subclass(m, "DefaultContextAttr", rtgAttrIsADefaultContextAttr)
190 .def_classmethod(
191 "get",
192 [](nb::object cls, MlirType type, MlirContext ctxt) {
193 return cls(rtgDefaultContextAttrGet(ctxt, type));
194 },
195 nb::arg("self"), nb::arg("type"), nb::arg("ctxt") = nullptr);
196
197 mlir_attribute_subclass(m, "AnyContextAttr", rtgAttrIsAAnyContextAttr)
198 .def_classmethod(
199 "get",
200 [](nb::object cls, MlirType type, MlirContext ctxt) {
201 return cls(rtgAnyContextAttrGet(ctxt, type));
202 },
203 nb::arg("self"), nb::arg("type"), nb::arg("ctxt") = nullptr);
204
205 mlir_attribute_subclass(m, "MapAttr", rtgAttrIsAMap)
206 .def_classmethod(
207 "get",
208 [](nb::object cls, MlirType mapType,
209 const std::vector<std::pair<MlirAttribute, MlirAttribute>>
210 &entries,
211 MlirContext ctxt) {
212 std::vector<MlirAttribute> keys;
213 std::vector<MlirAttribute> values;
214 for (auto entry : entries) {
215 keys.push_back(entry.first);
216 values.push_back(entry.second);
217 }
218 return cls(rtgMapAttrGet(ctxt, mapType, keys.size(), keys.data(),
219 values.data()));
220 },
221 nb::arg("self"), nb::arg("map_type"),
222 nb::arg("entries") =
223 std::vector<std::pair<MlirAttribute, MlirAttribute>>(),
224 nb::arg("ctxt") = nullptr)
225 .def(
226 "lookup",
227 [](MlirAttribute self, MlirAttribute key) {
228 auto val = rtgMapAttrLookup(self, key);
229 if (mlirAttributeIsNull(val))
230 return nb::none();
231 return nb::cast(val);
232 },
233 nb::arg("key"),
234 "Look up the value associated with the given key. Returns None if "
235 "the key is not found.");
236
237 // Attributes for ISA targets
238 //===--------------------------------------------------------------------===//
239
240 nb::enum_<RTGLabelVisibility>(m, "LabelVisibility")
241 .value("LOCAL", RTG_LABEL_VISIBILITY_LOCAL)
242 .value("GLOBAL", RTG_LABEL_VISIBILITY_GLOBAL)
243 .value("EXTERNAL", RTG_LABEL_VISIBILITY_EXTERNAL)
244 .export_values();
245
246 mlir_attribute_subclass(m, "LabelVisibilityAttr",
248 .def_classmethod(
249 "get",
250 [](nb::object cls, RTGLabelVisibility visibility, MlirContext ctxt) {
251 return cls(rtgLabelVisibilityAttrGet(ctxt, visibility));
252 },
253 nb::arg("self"), nb::arg("visibility"), nb::arg("ctxt") = nullptr)
254 .def_property_readonly("value", [](MlirAttribute self) {
256 });
257
258 mlir_attribute_subclass(m, "VirtualRegisterConfigAttr",
260 .def_classmethod(
261 "get",
262 [](nb::object cls, const std::vector<MlirAttribute> &allowedRegs,
263 MlirContext ctxt) {
264 return cls(rtgVirtualRegisterConfigAttrGet(ctxt, allowedRegs.size(),
265 allowedRegs.data()));
266 },
267 nb::arg("self"), nb::arg("allowed_regs"), nb::arg("ctxt") = nullptr)
268 .def_property_readonly("regs", [](MlirAttribute self) {
269 std::vector<MlirAttribute> regs;
270 for (unsigned
271 i = 0,
273 i < numRegs; ++i)
274 regs.push_back(rtgVirtualRegisterConfigAttrGetRegister(self, i));
275 return regs;
276 });
277
278 mlir_attribute_subclass(m, "LabelAttr", rtgAttrIsALabel)
279 .def_classmethod(
280 "get",
281 [](nb::object cls, const std::string &name, MlirContext ctxt) {
282 MlirStringRef nameRef =
283 mlirStringRefCreate(name.data(), name.size());
284 return cls(rtgLabelAttrGet(ctxt, nameRef));
285 },
286 nb::arg("self"), nb::arg("name"), nb::arg("ctxt") = nullptr)
287 .def_property_readonly("name", [](MlirAttribute self) {
288 MlirStringRef name = rtgLabelAttrGetName(self);
289 return nb::str(name.data, name.length);
290 });
291}
MlirType elementType
Definition CHIRRTL.cpp:29
MLIR_CAPI_EXPORTED MlirAttribute rtgAnyContextAttrGet(MlirContext ctxt, MlirType type)
Creates an RTG any context attribute in the context.
Definition RTG.cpp:272
MLIR_CAPI_EXPORTED bool rtgTypeIsAMemory(MlirType type)
If the type is an RTG memory.
Definition RTG.cpp:180
MLIR_CAPI_EXPORTED bool rtgAttrIsAAnyContextAttr(MlirAttribute attr)
If the attribute is an RTG any context attribute.
Definition RTG.cpp:268
MLIR_CAPI_EXPORTED MlirType rtgLabelTypeGet(MlirContext ctxt)
Creates an RTG mode type in the context.
Definition RTG.cpp:73
MLIR_CAPI_EXPORTED RTGLabelVisibility rtgLabelVisibilityAttrGetValue(MlirAttribute attr)
Get the RTG label visibility from the attribute.
Definition RTG.cpp:236
MLIR_CAPI_EXPORTED MlirAttribute rtgVirtualRegisterConfigAttrGet(MlirContext ctxt, intptr_t numRegs, MlirAttribute const *allowedRegs)
Creates an RTG virtual register config attribute in the context.
Definition RTG.cpp:284
RTGLabelVisibility
Definition RTG.h:149
@ RTG_LABEL_VISIBILITY_EXTERNAL
Definition RTG.h:152
@ RTG_LABEL_VISIBILITY_GLOBAL
Definition RTG.h:151
@ RTG_LABEL_VISIBILITY_LOCAL
Definition RTG.h:150
MLIR_CAPI_EXPORTED MlirAttribute rtgVirtualRegisterConfigAttrGetRegister(MlirAttribute attr, intptr_t index)
Returns the allowed register at the given index in the RTG virtual register config attribute.
Definition RTG.cpp:296
MLIR_CAPI_EXPORTED MlirType rtgSequenceTypeGetElement(MlirType type, unsigned i)
The type of of the substitution element at the given index.
Definition RTG.cpp:53
MLIR_CAPI_EXPORTED MlirAttribute rtgDefaultContextAttrGet(MlirContext ctxt, MlirType type)
Creates an RTG default context attribute in the context.
Definition RTG.cpp:225
MLIR_CAPI_EXPORTED MlirAttribute rtgMapAttrGet(MlirContext ctx, MlirType mapType, intptr_t numEntries, MlirAttribute const *keys, MlirAttribute const *values)
Creates an RTG map attribute in the context with the given entries.
Definition RTG.cpp:325
MLIR_CAPI_EXPORTED uint32_t rtgMemoryTypeGetAddressWidth(MlirType type)
Returns the address with of an RTG memory type.
Definition RTG.cpp:186
MLIR_CAPI_EXPORTED bool rtgTypeIsAArray(MlirType type)
If the type is an RTG array.
Definition RTG.cpp:131
MLIR_CAPI_EXPORTED bool rtgAttrIsALabelVisibilityAttr(MlirAttribute attr)
If the attribute is an RTG label visibility.
Definition RTG.cpp:232
MLIR_CAPI_EXPORTED bool rtgAttrIsALabel(MlirAttribute attr)
Checks if the attribute is an RTG label attribute.
Definition RTG.cpp:306
MLIR_CAPI_EXPORTED intptr_t rtgTypeGetNumFields(MlirType type)
Returns the number of fields in the RTG tuple.
Definition RTG.cpp:169
MLIR_CAPI_EXPORTED MlirAttribute rtgLabelVisibilityAttrGet(MlirContext ctxt, RTGLabelVisibility visibility)
Creates an RTG label visibility attribute in the context.
Definition RTG.cpp:250
MLIR_CAPI_EXPORTED MlirAttribute rtgMapAttrLookup(MlirAttribute attr, MlirAttribute key)
Looks up the value associated with the given key in the RTG map attribute.
Definition RTG.cpp:336
MLIR_CAPI_EXPORTED MlirType rtgMapTypeGet(MlirType keyType, MlirType valueType)
Creates an RTG map type in the context.
Definition RTG.cpp:142
MLIR_CAPI_EXPORTED MlirType rtgArrayTypeGetElementType(MlirType type)
Returns the element type of the RTG array.
Definition RTG.cpp:133
MLIR_CAPI_EXPORTED bool rtgTypeIsATuple(MlirType type)
If the type is an RTG tuple.
Definition RTG.cpp:165
MLIR_CAPI_EXPORTED bool rtgTypeIsABag(MlirType type)
If the type is an RTG bag.
Definition RTG.cpp:94
MLIR_CAPI_EXPORTED MlirType rtgSequenceTypeGet(MlirContext ctxt, intptr_t numElements, MlirType const *elementTypes)
Creates an RTG sequence type in the context.
Definition RTG.cpp:41
MLIR_CAPI_EXPORTED MlirType rtgStringTypeGet(MlirContext ctxt)
Creates an RTG string type in the context.
Definition RTG.cpp:210
MLIR_CAPI_EXPORTED unsigned rtgSequenceTypeGetNumElements(MlirType type)
The number of substitution elements of the RTG sequence.
Definition RTG.cpp:49
MLIR_CAPI_EXPORTED MlirType rtgSetTypeGet(MlirType elementType)
Creates an RTG set type in the context.
Definition RTG.cpp:82
MLIR_CAPI_EXPORTED bool rtgTypeIsASet(MlirType type)
If the type is an RTG set.
Definition RTG.cpp:80
MLIR_CAPI_EXPORTED MlirType rtgTupleTypeGet(MlirContext ctxt, intptr_t numFields, MlirType const *fieldTypes)
Creates an RTG tuple type in the context.
Definition RTG.cpp:157
MLIR_CAPI_EXPORTED MlirType rtgMemoryTypeGet(MlirContext ctx, uint32_t addressWidth)
Creates an RTG memory type in the context.
Definition RTG.cpp:182
MLIR_CAPI_EXPORTED MlirType rtgRandomizedSequenceTypeGet(MlirContext ctxt)
Creates an RTG randomized sequence type in the context.
Definition RTG.cpp:64
MLIR_CAPI_EXPORTED bool rtgTypeIsAMemoryBlock(MlirType type)
If the type is an RTG memory block.
Definition RTG.cpp:193
MLIR_CAPI_EXPORTED bool rtgTypeIsARandomizedSequence(MlirType type)
If the type is an RTG randomized sequence.
Definition RTG.cpp:60
MLIR_CAPI_EXPORTED bool rtgTypeIsAMap(MlirType type)
If the type is an RTG map.
Definition RTG.cpp:140
MLIR_CAPI_EXPORTED bool rtgTypeIsADict(MlirType type)
If the type is an RTG dict.
Definition RTG.cpp:108
MLIR_CAPI_EXPORTED MlirType rtgTupleTypeGetFieldType(MlirType type, intptr_t idx)
Returns a field type of the RTG tuple.
Definition RTG.cpp:173
MLIR_CAPI_EXPORTED MlirStringRef rtgLabelAttrGetName(MlirAttribute attr)
Returns the name of the RTG label attribute.
Definition RTG.cpp:314
MLIR_CAPI_EXPORTED bool rtgAttrIsAVirtualRegisterConfig(MlirAttribute attr)
Checks if the attribute is an RTG virtual register config attribute.
Definition RTG.cpp:279
MLIR_CAPI_EXPORTED MlirType rtgDictTypeGet(MlirContext ctxt, intptr_t numEntries, MlirAttribute const *entryNames, MlirType const *entryTypes)
Creates an RTG dict type in the context.
Definition RTG.cpp:110
MLIR_CAPI_EXPORTED bool rtgAttrIsAMap(MlirAttribute attr)
Checks if the attribute is an RTG map attribute.
Definition RTG.cpp:321
MLIR_CAPI_EXPORTED intptr_t rtgVirtualRegisterConfigAttrGetNumRegisters(MlirAttribute attr)
Returns the number of allowed registers in the RTG virtual register config attribute.
Definition RTG.cpp:292
MLIR_CAPI_EXPORTED MlirType rtgBagTypeGet(MlirType elementType)
Creates an RTG bag type in the context.
Definition RTG.cpp:96
MLIR_CAPI_EXPORTED uint32_t rtgMemoryBlockTypeGetAddressWidth(MlirType type)
Returns the address with of an RTG memory block type.
Definition RTG.cpp:201
MLIR_CAPI_EXPORTED MlirType rtgArrayTypeGet(MlirType elementType)
Creates an RTG array type in the context.
Definition RTG.cpp:126
MLIR_CAPI_EXPORTED MlirType rtgBagTypeGetElementType(MlirType type)
Return the element type of the RTG bag.
Definition RTG.cpp:101
MLIR_CAPI_EXPORTED bool rtgTypeIsAString(MlirType type)
If the type is an RTG string.
Definition RTG.cpp:208
MLIR_CAPI_EXPORTED bool rtgTypeIsASequence(MlirType type)
If the type is an RTG sequence.
Definition RTG.cpp:37
MLIR_CAPI_EXPORTED MlirAttribute rtgLabelAttrGet(MlirContext ctx, MlirStringRef name)
Creates an RTG label attribute in the context with the given name.
Definition RTG.cpp:310
MLIR_CAPI_EXPORTED bool rtgTypeIsALabel(MlirType type)
If the type is an RTG label.
Definition RTG.cpp:71
MLIR_CAPI_EXPORTED MlirType rtgMemoryBlockTypeGet(MlirContext ctx, uint32_t addressWidth)
Creates an RTG memory block type in the context.
Definition RTG.cpp:197
MLIR_CAPI_EXPORTED MlirType rtgMapTypeGetKeyType(MlirType type)
Return the key type of the RTG map.
Definition RTG.cpp:146
MLIR_CAPI_EXPORTED MlirType rtgSetTypeGetElementType(MlirType type)
Return the element type of the RTG set.
Definition RTG.cpp:87
MLIR_CAPI_EXPORTED bool rtgAttrIsADefaultContextAttr(MlirAttribute attr)
If the attribute is an RTG default context.
Definition RTG.cpp:221
MLIR_CAPI_EXPORTED MlirType rtgMapTypeGetValueType(MlirType type)
Return the value type of the RTG map.
Definition RTG.cpp:150
void populateDialectRTGSubmodule(nanobind::module_ &m)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.