@@ -93,6 +93,10 @@ def DLTI_DataLayoutSpecAttr :
93
93
}];
94
94
}
95
95
96
+ //===----------------------------------------------------------------------===//
97
+ // MapAttr
98
+ //===----------------------------------------------------------------------===//
99
+
96
100
def DLTI_MapAttr : DLTIAttr<"Map", [DLTIQueryInterface]> {
97
101
let summary = "A mapping of DLTI-information by way of key-value pairs";
98
102
let description = [{
@@ -106,18 +110,16 @@ def DLTI_MapAttr : DLTIAttr<"Map", [DLTIQueryInterface]> {
106
110
107
111
Consider the following flat encoding of a single-key dictionary
108
112
```
109
- #dlti.map<#dlti.dl_entry< "CPU::cache::L1::size_in_bytes", 65536 : i32>>
113
+ #dlti.map<"CPU::cache::L1::size_in_bytes" = 65536 : i32>>
110
114
```
111
115
versus nested maps, which make it possible to obtain sub-dictionaries of
112
116
related information (with the following example making use of other
113
117
attributes that also implement the `DLTIQueryInterface`):
114
118
```
115
- #dlti.target_system_spec<"CPU":
116
- #dlti.target_device_spec<#dlti.dl_entry<"cache",
117
- #dlti.map<#dlti.dl_entry<"L1",
118
- #dlti.map<#dlti.dl_entry<"size_in_bytes", 65536 : i32>>>,
119
- #dlti.dl_entry<"L1d",
120
- #dlti.map<#dlti.dl_entry<"size_in_bytes", 32768 : i32>>> >>>>
119
+ #dlti.target_system_spec<"CPU" =
120
+ #dlti.target_device_spec<"cache" =
121
+ #dlti.map<"L1" = #dlti.map<"size_in_bytes" = 65536 : i32>,
122
+ "L1d" = #dlti.map<"size_in_bytes" = 32768 : i32> >>>
121
123
```
122
124
123
125
With the flat encoding, the implied structure of the key is ignored, that is
@@ -139,7 +141,7 @@ def DLTI_MapAttr : DLTIAttr<"Map", [DLTIQueryInterface]> {
139
141
);
140
142
let mnemonic = "map";
141
143
let genVerifyDecl = 1;
142
- let assemblyFormat = "`<` $entries `>`" ;
144
+ let hasCustomAssemblyFormat = 1 ;
143
145
let extraClassDeclaration = [{
144
146
/// Returns the attribute associated with the key.
145
147
FailureOr<Attribute> query(DataLayoutEntryKey key) {
@@ -167,20 +169,23 @@ def DLTI_TargetSystemSpecAttr :
167
169
```
168
170
dlti.target_system_spec =
169
171
#dlti.target_system_spec<
170
- "CPU": #dlti.target_device_spec<
171
- #dlti.dl_entry<"dlti. L1_cache_size_in_bytes", 4096: ui32> >,
172
- "GPU": #dlti.target_device_spec<
173
- #dlti.dl_entry<"dlti. max_vector_op_width", 64 : ui32> >,
174
- "XPU": #dlti.target_device_spec<
175
- #dlti.dl_entry<"dlti. max_vector_op_width", 4096 : ui32> >>
172
+ "CPU" = #dlti.target_device_spec<
173
+ " L1_cache_size_in_bytes" = 4096: ui32>,
174
+ "GPU" = #dlti.target_device_spec<
175
+ " max_vector_op_width" = 64 : ui32>,
176
+ "XPU" = #dlti.target_device_spec<
177
+ " max_vector_op_width" = 4096 : ui32>>
176
178
```
179
+
180
+ The verifier checks that keys are strings and pointed to values implement
181
+ DLTI's TargetDeviceSpecInterface.
177
182
}];
178
183
let parameters = (ins
179
- ArrayRefParameter<"DeviceIDTargetDeviceSpecPair", " ">:$entries
184
+ ArrayRefParameter<"DataLayoutEntryInterface ">:$entries
180
185
);
181
186
let mnemonic = "target_system_spec";
182
187
let genVerifyDecl = 1;
183
- let assemblyFormat = "`<` $entries `>`" ;
188
+ let hasCustomAssemblyFormat = 1 ;
184
189
let extraClassDeclaration = [{
185
190
/// Return the device specification that matches the given device ID
186
191
std::optional<TargetDeviceSpecInterface>
@@ -197,8 +202,10 @@ def DLTI_TargetSystemSpecAttr :
197
202
$cppClass::getDeviceSpecForDeviceID(
198
203
TargetSystemSpecInterface::DeviceID deviceID) {
199
204
for (const auto& entry : getEntries()) {
200
- if (entry.first == deviceID)
201
- return entry.second;
205
+ if (entry.getKey() == DataLayoutEntryKey(deviceID))
206
+ if (auto deviceSpec =
207
+ llvm::dyn_cast<TargetDeviceSpecInterface>(entry.getValue()))
208
+ return deviceSpec;
202
209
}
203
210
return std::nullopt;
204
211
}
@@ -219,16 +226,15 @@ def DLTI_TargetDeviceSpecAttr :
219
226
220
227
Example:
221
228
```
222
- #dlti.target_device_spec<
223
- #dlti.dl_entry<"dlti.max_vector_op_width", 64 : ui32>>
229
+ #dlti.target_device_spec<"max_vector_op_width" = 64 : ui32>
224
230
```
225
231
}];
226
232
let parameters = (ins
227
- ArrayRefParameter<"DataLayoutEntryInterface", "" >:$entries
233
+ ArrayRefParameter<"DataLayoutEntryInterface">:$entries
228
234
);
229
235
let mnemonic = "target_device_spec";
230
236
let genVerifyDecl = 1;
231
- let assemblyFormat = "`<` $entries `>`" ;
237
+ let hasCustomAssemblyFormat = 1 ;
232
238
233
239
let extraClassDeclaration = [{
234
240
/// Returns the attribute associated with the key.
0 commit comments