blob: e4d5739cb2f072f0ee5ee3c71d1e5ef850cb30fb [file] [log] [blame]
Kumar Gala87915cd2018-11-15 11:51:50 -06001# Copyright (c) 2018-2019 Linaro
Carles Cufifa26ef02019-01-30 17:54:21 +01002# Copyright (c) 2019 Nordic Semiconductor ASA
Kumar Gala87915cd2018-11-15 11:51:50 -06003#
4# SPDX-License-Identifier: Apache-2.0
5
6import os
Martí Bolívar269f3502020-07-01 12:17:02 -07007import pickle
Kumar Gala57353972019-08-28 09:30:23 -05008import sys
9
10ZEPHYR_BASE = os.environ.get("ZEPHYR_BASE")
11sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts/dts"))
12
13import edtlib
Kumar Gala87915cd2018-11-15 11:51:50 -060014
15# Types we support
16# 'string', 'int', 'hex', 'bool'
17
Carles Cufifa26ef02019-01-30 17:54:21 +010018doc_mode = os.environ.get('KCONFIG_DOC_MODE') == "1"
Sebastian Bøecd435432019-02-11 15:57:34 +010019
Ulf Magnussonba312fe2019-03-20 19:30:29 +010020if not doc_mode:
Martí Bolívar269f3502020-07-01 12:17:02 -070021 EDT_PICKLE = os.environ.get("EDT_PICKLE")
Kumar Gala9aefdaf2020-04-15 10:32:41 -050022
Martí Bolívar269f3502020-07-01 12:17:02 -070023 # The "if" handles a missing dts.
24 if EDT_PICKLE is not None and os.path.isfile(EDT_PICKLE):
25 with open(EDT_PICKLE, 'rb') as f:
26 edt = pickle.load(f)
Kumar Gala57353972019-08-28 09:30:23 -050027 else:
28 edt = None
29
Kumar Gala1baf2f32019-09-04 14:14:26 -050030
31def _warn(kconf, msg):
32 print("{}:{}: WARNING: {}".format(kconf.filename, kconf.linenr, msg))
33
34
Kumar Gala87915cd2018-11-15 11:51:50 -060035def _dt_units_to_scale(unit):
36 if not unit:
37 return 0
38 if unit in {'k', 'K'}:
39 return 10
40 if unit in {'m', 'M'}:
41 return 20
42 if unit in {'g', 'G'}:
43 return 30
44
Kumar Gala57353972019-08-28 09:30:23 -050045
46def dt_chosen_label(kconf, _, chosen):
47 """
48 This function takes a 'chosen' property and treats that property as a path
Ulf Magnusson73ac1462019-09-23 05:14:18 +020049 to an EDT node. If it finds an EDT node, it will look to see if that node
50 has a "label" property and return the value of that "label", if not we
51 return an empty string.
Kumar Gala57353972019-08-28 09:30:23 -050052 """
53 if doc_mode or edt is None:
54 return ""
55
Ulf Magnusson73ac1462019-09-23 05:14:18 +020056 node = edt.chosen_node(chosen)
57 if not node:
Kumar Gala57353972019-08-28 09:30:23 -050058 return ""
59
Ulf Magnusson73ac1462019-09-23 05:14:18 +020060 if "label" not in node.props:
Kumar Gala57353972019-08-28 09:30:23 -050061 return ""
62
Ulf Magnusson73ac1462019-09-23 05:14:18 +020063 return node.props["label"].val
Kumar Gala57353972019-08-28 09:30:23 -050064
65
Kumar Gala07e5d892019-11-04 10:20:59 -060066def dt_chosen_enabled(kconf, _, chosen):
67 """
68 This function returns "y" if /chosen contains a property named 'chosen'
69 that points to an enabled node, and "n" otherwise
70 """
71 if doc_mode or edt is None:
72 return "n"
73
74 node = edt.chosen_node(chosen)
Martí Bolívar81650082020-10-05 20:02:13 -070075 return "y" if node and node.status == "okay" else "n"
Kumar Gala07e5d892019-11-04 10:20:59 -060076
Kumar Gala0353d222020-02-13 23:43:42 -060077
Martí Bolívar7ff3ebc2020-04-23 12:28:06 -070078def dt_chosen_path(kconf, _, chosen):
79 """
80 This function takes a /chosen node property and returns the path
81 to the node in the property value, or the empty string.
82 """
83 if doc_mode or edt is None:
84 return "n"
85
86 node = edt.chosen_node(chosen)
87
88 return node.path if node else ""
89
90
Martí Bolívar24677f92020-04-28 16:52:35 -070091def dt_node_enabled(kconf, name, node):
92 """
93 This function is used to test if a node is enabled (has status
94 'okay') or not.
95
96 The 'node' argument is a string which is either a path or an
97 alias, or both, depending on 'name'.
98
99 If 'name' is 'dt_path_enabled', 'node' is an alias or a path. If
100 'name' is 'dt_alias_enabled, 'node' is an alias.
101 """
102
103 if doc_mode or edt is None:
104 return "n"
105
106 if name == "dt_alias_enabled":
107 if node.startswith("/"):
108 # EDT.get_node() works with either aliases or paths. If we
109 # are specifically being asked about an alias, reject paths.
110 return "n"
111 else:
112 # Make sure this is being called appropriately.
113 assert name == "dt_path_enabled"
114
115 try:
116 node = edt.get_node(node)
117 except edtlib.EDTError:
118 return "n"
119
Martí Bolívar81650082020-10-05 20:02:13 -0700120 return "y" if node and node.status == "okay" else "n"
Martí Bolívar24677f92020-04-28 16:52:35 -0700121
122
Kumar Gala0353d222020-02-13 23:43:42 -0600123def dt_nodelabel_enabled(kconf, _, label):
124 """
Martí Bolívar24677f92020-04-28 16:52:35 -0700125 This function is like dt_node_enabled(), but the 'label' argument
126 should be a node label, like "foo" is here:
127
128 foo: some-node { ... };
Kumar Gala0353d222020-02-13 23:43:42 -0600129 """
130 if doc_mode or edt is None:
131 return "n"
132
Martí Bolívar0682c462020-04-22 17:59:23 -0700133 node = edt.label2node.get(label)
Kumar Gala0353d222020-02-13 23:43:42 -0600134
Martí Bolívar81650082020-10-05 20:02:13 -0700135 return "y" if node and node.status == "okay" else "n"
Kumar Gala0353d222020-02-13 23:43:42 -0600136
137
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200138def _node_reg_addr(node, index, unit):
139 if not node:
Kumar Gala22e74492019-10-23 15:15:59 -0500140 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500141
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200142 if not node.regs:
Kumar Gala22e74492019-10-23 15:15:59 -0500143 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500144
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200145 if int(index) >= len(node.regs):
Kumar Gala22e74492019-10-23 15:15:59 -0500146 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500147
Kumar Gala8af311a2020-03-13 12:43:56 -0500148 if node.regs[int(index)].addr is None:
149 return 0
150
Kumar Gala22e74492019-10-23 15:15:59 -0500151 return node.regs[int(index)].addr >> _dt_units_to_scale(unit)
Kumar Gala57353972019-08-28 09:30:23 -0500152
153
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200154def _node_reg_size(node, index, unit):
155 if not node:
Kumar Gala22e74492019-10-23 15:15:59 -0500156 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500157
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200158 if not node.regs:
Kumar Gala22e74492019-10-23 15:15:59 -0500159 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500160
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200161 if int(index) >= len(node.regs):
Kumar Gala22e74492019-10-23 15:15:59 -0500162 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500163
Kumar Gala8af311a2020-03-13 12:43:56 -0500164 if node.regs[int(index)].size is None:
165 return 0
166
Kumar Gala22e74492019-10-23 15:15:59 -0500167 return node.regs[int(index)].size >> _dt_units_to_scale(unit)
Kumar Gala57353972019-08-28 09:30:23 -0500168
169
Kumar Gala338b43192020-04-03 05:02:35 -0500170def _node_int_prop(node, prop):
171 if not node:
172 return 0
173
174 if prop not in node.props:
175 return 0
176
177 if node.props[prop].type != "int":
178 return 0
179
180 return node.props[prop].val
181
182
Kumar Gala22e74492019-10-23 15:15:59 -0500183def _dt_chosen_reg_addr(kconf, chosen, index=0, unit=None):
Kumar Gala57353972019-08-28 09:30:23 -0500184 """
185 This function takes a 'chosen' property and treats that property as a path
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200186 to an EDT node. If it finds an EDT node, it will look to see if that
187 nodnode has a register at the given 'index' and return the address value of
Kumar Gala57353972019-08-28 09:30:23 -0500188 that reg, if not we return 0.
189
190 The function will divide the value based on 'unit':
191 None No division
192 'k' or 'K' divide by 1024 (1 << 10)
193 'm' or 'M' divide by 1,048,576 (1 << 20)
194 'g' or 'G' divide by 1,073,741,824 (1 << 30)
195 """
196 if doc_mode or edt is None:
Kumar Gala22e74492019-10-23 15:15:59 -0500197 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500198
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200199 node = edt.chosen_node(chosen)
Kumar Gala57353972019-08-28 09:30:23 -0500200
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200201 return _node_reg_addr(node, index, unit)
Kumar Gala57353972019-08-28 09:30:23 -0500202
203
Kumar Gala22e74492019-10-23 15:15:59 -0500204def _dt_chosen_reg_size(kconf, chosen, index=0, unit=None):
Kumar Gala57353972019-08-28 09:30:23 -0500205 """
206 This function takes a 'chosen' property and treats that property as a path
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200207 to an EDT node. If it finds an EDT node, it will look to see if that node
208 has a register at the given 'index' and return the size value of that reg,
209 if not we return 0.
Kumar Gala57353972019-08-28 09:30:23 -0500210
211 The function will divide the value based on 'unit':
212 None No division
213 'k' or 'K' divide by 1024 (1 << 10)
214 'm' or 'M' divide by 1,048,576 (1 << 20)
215 'g' or 'G' divide by 1,073,741,824 (1 << 30)
216 """
217 if doc_mode or edt is None:
Kumar Gala22e74492019-10-23 15:15:59 -0500218 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500219
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200220 node = edt.chosen_node(chosen)
Kumar Gala57353972019-08-28 09:30:23 -0500221
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200222 return _node_reg_size(node, index, unit)
Kumar Gala57353972019-08-28 09:30:23 -0500223
224
Kumar Gala22e74492019-10-23 15:15:59 -0500225def dt_chosen_reg(kconf, name, chosen, index=0, unit=None):
226 """
227 This function just routes to the proper function and converts
228 the result to either a string int or string hex value.
229 """
230 if name == "dt_chosen_reg_size_int":
231 return str(_dt_chosen_reg_size(kconf, chosen, index, unit))
232 if name == "dt_chosen_reg_size_hex":
233 return hex(_dt_chosen_reg_size(kconf, chosen, index, unit))
234 if name == "dt_chosen_reg_addr_int":
235 return str(_dt_chosen_reg_addr(kconf, chosen, index, unit))
236 if name == "dt_chosen_reg_addr_hex":
237 return hex(_dt_chosen_reg_addr(kconf, chosen, index, unit))
238
239
240def _dt_node_reg_addr(kconf, path, index=0, unit=None):
Kumar Gala57353972019-08-28 09:30:23 -0500241 """
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200242 This function takes a 'path' and looks for an EDT node at that path. If it
243 finds an EDT node, it will look to see if that node has a register at the
244 given 'index' and return the address value of that reg, if not we return 0.
Kumar Gala57353972019-08-28 09:30:23 -0500245
246 The function will divide the value based on 'unit':
247 None No division
248 'k' or 'K' divide by 1024 (1 << 10)
249 'm' or 'M' divide by 1,048,576 (1 << 20)
250 'g' or 'G' divide by 1,073,741,824 (1 << 30)
251 """
252 if doc_mode or edt is None:
Kumar Gala22e74492019-10-23 15:15:59 -0500253 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500254
255 try:
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200256 node = edt.get_node(path)
Kumar Gala57353972019-08-28 09:30:23 -0500257 except edtlib.EDTError:
Kumar Gala22e74492019-10-23 15:15:59 -0500258 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500259
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200260 return _node_reg_addr(node, index, unit)
Kumar Gala57353972019-08-28 09:30:23 -0500261
262
Kumar Gala22e74492019-10-23 15:15:59 -0500263def _dt_node_reg_size(kconf, path, index=0, unit=None):
Kumar Gala57353972019-08-28 09:30:23 -0500264 """
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200265 This function takes a 'path' and looks for an EDT node at that path. If it
266 finds an EDT node, it will look to see if that node has a register at the
267 given 'index' and return the size value of that reg, if not we return 0.
Kumar Gala57353972019-08-28 09:30:23 -0500268
269 The function will divide the value based on 'unit':
270 None No division
271 'k' or 'K' divide by 1024 (1 << 10)
272 'm' or 'M' divide by 1,048,576 (1 << 20)
273 'g' or 'G' divide by 1,073,741,824 (1 << 30)
274 """
275 if doc_mode or edt is None:
Kumar Gala22e74492019-10-23 15:15:59 -0500276 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500277
278 try:
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200279 node = edt.get_node(path)
Kumar Gala57353972019-08-28 09:30:23 -0500280 except edtlib.EDTError:
Kumar Gala22e74492019-10-23 15:15:59 -0500281 return 0
Kumar Gala57353972019-08-28 09:30:23 -0500282
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200283 return _node_reg_size(node, index, unit)
Kumar Gala57353972019-08-28 09:30:23 -0500284
285
Kumar Gala22e74492019-10-23 15:15:59 -0500286def dt_node_reg(kconf, name, path, index=0, unit=None):
287 """
288 This function just routes to the proper function and converts
289 the result to either a string int or string hex value.
290 """
291 if name == "dt_node_reg_size_int":
292 return str(_dt_node_reg_size(kconf, path, index, unit))
293 if name == "dt_node_reg_size_hex":
294 return hex(_dt_node_reg_size(kconf, path, index, unit))
295 if name == "dt_node_reg_addr_int":
296 return str(_dt_node_reg_addr(kconf, path, index, unit))
297 if name == "dt_node_reg_addr_hex":
298 return hex(_dt_node_reg_addr(kconf, path, index, unit))
299
300
Kumar Gala57353972019-08-28 09:30:23 -0500301def dt_node_has_bool_prop(kconf, _, path, prop):
302 """
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200303 This function takes a 'path' and looks for an EDT node at that path. If it
304 finds an EDT node, it will look to see if that node has a boolean property
305 by the name of 'prop'. If the 'prop' exists it will return "y" otherwise
306 we return "n".
Kumar Gala57353972019-08-28 09:30:23 -0500307 """
308 if doc_mode or edt is None:
309 return "n"
310
311 try:
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200312 node = edt.get_node(path)
Kumar Gala57353972019-08-28 09:30:23 -0500313 except edtlib.EDTError:
314 return "n"
315
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200316 if prop not in node.props:
Kumar Gala57353972019-08-28 09:30:23 -0500317 return "n"
318
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200319 if node.props[prop].type != "boolean":
Kumar Gala57353972019-08-28 09:30:23 -0500320 return "n"
321
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200322 if node.props[prop].val:
Kumar Gala57353972019-08-28 09:30:23 -0500323 return "y"
324
325 return "n"
326
Erwan Gourioub7110282021-01-07 12:06:31 +0100327def dt_node_has_prop(kconf, _, label, prop):
328 """
329 This function takes a 'label' and looks for an EDT node for that label. If
330 it finds an EDT node, it will look to see if that node has a property
331 by the name of 'prop'. If the 'prop' exists it will return "y" otherwise
332 we return "n".
333 """
334
335 if doc_mode or edt is None:
336 return "n"
337
338 try:
339 node = edt.label2node.get(label)
340 except edtlib.EDTError:
341 return "n"
342
343 if node is None:
344 return "n"
345
346 if prop in node.props:
347 return "y"
348
349 return "n"
Kumar Gala57353972019-08-28 09:30:23 -0500350
Kumar Gala338b43192020-04-03 05:02:35 -0500351def dt_node_int_prop(kconf, name, path, prop):
352 """
353 This function takes a 'path' and property name ('prop') looks for an EDT
354 node at that path. If it finds an EDT node, it will look to see if that
355 node has a property called 'prop' and if that 'prop' is an integer type
356 will return the value of the property 'prop' as either a string int or
357 string hex value, if not we return 0.
358 """
359
360 if doc_mode or edt is None:
361 return "0"
362
363 try:
364 node = edt.get_node(path)
365 except edtlib.EDTError:
366 return "0"
367
368 if name == "dt_node_int_prop_int":
369 return str(_node_int_prop(node, prop))
370 if name == "dt_node_int_prop_hex":
371 return hex(_node_int_prop(node, prop))
372
373
Kumar Gala57353972019-08-28 09:30:23 -0500374def dt_compat_enabled(kconf, _, compat):
375 """
Martí Bolívar81650082020-10-05 20:02:13 -0700376 This function takes a 'compat' and returns "y" if we find a status "okay"
Ulf Magnusson73ac1462019-09-23 05:14:18 +0200377 compatible node in the EDT otherwise we return "n"
Kumar Gala57353972019-08-28 09:30:23 -0500378 """
379 if doc_mode or edt is None:
380 return "n"
381
Martí Bolívar81650082020-10-05 20:02:13 -0700382 return "y" if compat in edt.compat2okay else "n"
Kumar Gala57353972019-08-28 09:30:23 -0500383
384
Martí Bolívar3cd4f6c2020-04-10 15:37:58 -0700385def dt_compat_on_bus(kconf, _, compat, bus):
386 """
387 This function takes a 'compat' and returns "y" if we find an "enabled"
388 compatible node in the EDT which is on bus 'bus'. It returns "n" otherwise.
389 """
390 if doc_mode or edt is None:
391 return "n"
392
Martí Bolívar81650082020-10-05 20:02:13 -0700393 for node in edt.compat2okay[compat]:
Martí Bolívar3cd4f6c2020-04-10 15:37:58 -0700394 if node.on_bus is not None and node.on_bus == bus:
395 return "y"
396
397 return "n"
398
399
Andrzej Głąbek3331a202020-02-14 11:53:21 +0100400def dt_nodelabel_has_compat(kconf, _, label, compat):
401 """
402 This function takes a 'label' and returns "y" if an "enabled" node with
403 such label can be found in the EDT and that node is compatible with the
404 provided 'compat', otherwise it returns "n".
405 """
406 if doc_mode or edt is None:
407 return "n"
408
Martí Bolívar81650082020-10-05 20:02:13 -0700409 for node in edt.compat2okay[compat]:
Andrzej Głąbek3331a202020-02-14 11:53:21 +0100410 if label in node.labels:
411 return "y"
412
413 return "n"
414
415
Martí Bolívar1fff2352020-04-22 18:06:18 -0700416def dt_nodelabel_path(kconf, _, label):
417 """
418 This function takes a node label (not a label property) and
419 returns the path to the node which has that label, or an empty
420 string if there is no such node.
421 """
422 if doc_mode or edt is None:
423 return ""
424
425 node = edt.label2node.get(label)
426
427 return node.path if node else ""
428
429
Erwan Gouriou17537c72019-11-22 10:06:57 +0100430def shields_list_contains(kconf, _, shield):
431 """
432 Return "n" if cmake environment variable 'SHIELD_AS_LIST' doesn't exist.
433 Return "y" if 'shield' is present list obtained after 'SHIELD_AS_LIST'
434 has been split using ";" as a separator and "n" otherwise.
435 """
436 try:
437 list = os.environ['SHIELD_AS_LIST']
438 except KeyError:
439 return "n"
440
441 return "y" if shield in list.split(";") else "n"
442
443
Martí Bolívar006319f2020-07-21 15:20:18 -0700444# Keys in this dict are the function names as they appear
445# in Kconfig files. The values are tuples in this form:
446#
447# (python_function, minimum_number_of_args, maximum_number_of_args)
448#
449# Each python function is given a kconf object and its name in the
450# Kconfig file, followed by arguments from the Kconfig file.
451#
452# See the kconfiglib documentation for more details.
Kumar Gala87915cd2018-11-15 11:51:50 -0600453functions = {
Kumar Gala57353972019-08-28 09:30:23 -0500454 "dt_compat_enabled": (dt_compat_enabled, 1, 1),
Martí Bolívar3cd4f6c2020-04-10 15:37:58 -0700455 "dt_compat_on_bus": (dt_compat_on_bus, 2, 2),
Kumar Gala57353972019-08-28 09:30:23 -0500456 "dt_chosen_label": (dt_chosen_label, 1, 1),
Kumar Gala07e5d892019-11-04 10:20:59 -0600457 "dt_chosen_enabled": (dt_chosen_enabled, 1, 1),
Martí Bolívar7ff3ebc2020-04-23 12:28:06 -0700458 "dt_chosen_path": (dt_chosen_path, 1, 1),
Martí Bolívar24677f92020-04-28 16:52:35 -0700459 "dt_path_enabled": (dt_node_enabled, 1, 1),
460 "dt_alias_enabled": (dt_node_enabled, 1, 1),
Kumar Gala0353d222020-02-13 23:43:42 -0600461 "dt_nodelabel_enabled": (dt_nodelabel_enabled, 1, 1),
Ulf Magnussonb4e18072019-12-23 11:07:27 +0100462 "dt_chosen_reg_addr_int": (dt_chosen_reg, 1, 3),
463 "dt_chosen_reg_addr_hex": (dt_chosen_reg, 1, 3),
464 "dt_chosen_reg_size_int": (dt_chosen_reg, 1, 3),
465 "dt_chosen_reg_size_hex": (dt_chosen_reg, 1, 3),
466 "dt_node_reg_addr_int": (dt_node_reg, 1, 3),
467 "dt_node_reg_addr_hex": (dt_node_reg, 1, 3),
468 "dt_node_reg_size_int": (dt_node_reg, 1, 3),
469 "dt_node_reg_size_hex": (dt_node_reg, 1, 3),
Kumar Gala57353972019-08-28 09:30:23 -0500470 "dt_node_has_bool_prop": (dt_node_has_bool_prop, 2, 2),
Erwan Gourioub7110282021-01-07 12:06:31 +0100471 "dt_node_has_prop": (dt_node_has_prop, 2, 2),
Kumar Gala338b43192020-04-03 05:02:35 -0500472 "dt_node_int_prop_int": (dt_node_int_prop, 2, 2),
473 "dt_node_int_prop_hex": (dt_node_int_prop, 2, 2),
Andrzej Głąbek3331a202020-02-14 11:53:21 +0100474 "dt_nodelabel_has_compat": (dt_nodelabel_has_compat, 2, 2),
Martí Bolívar1fff2352020-04-22 18:06:18 -0700475 "dt_nodelabel_path": (dt_nodelabel_path, 1, 1),
Erwan Gouriou17537c72019-11-22 10:06:57 +0100476 "shields_list_contains": (shields_list_contains, 1, 1),
Kumar Gala87915cd2018-11-15 11:51:50 -0600477}