This will make it more convenient to use it from multiple different places, which we will have a need for in the future. Signed-off-by: Martí Bolívar <marti.bolivar@nordicsemi.no>
30 lines
1.2 KiB
Python
30 lines
1.2 KiB
Python
# Copyright (c) 2019 Nordic Semiconductor ASA
|
|
# Copyright (c) 2019 Linaro Limited
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
"""
|
|
Shared internal code. Do not use outside of the package.
|
|
"""
|
|
|
|
from typing import Any, Callable
|
|
|
|
def _slice_helper(node: Any, # avoids a circular import with dtlib
|
|
prop_name: str, size: int, size_hint: str,
|
|
err_class: Callable[..., Exception]):
|
|
# Splits node.props[prop_name].value into 'size'-sized chunks,
|
|
# returning a list of chunks. Raises err_class(...) if the length
|
|
# of the property is not evenly divisible by 'size'. The argument
|
|
# to err_class is a string which describes the error.
|
|
#
|
|
# 'size_hint' is a string shown on errors that gives a hint on how
|
|
# 'size' was calculated.
|
|
|
|
raw = node.props[prop_name].value
|
|
if len(raw) % size:
|
|
raise err_class(
|
|
f"'{prop_name}' property in {node!r} has length {len(raw)}, "
|
|
f"which is not evenly divisible by {size} (= {size_hint}). "
|
|
"Note that #*-cells properties come either from the parent node or "
|
|
"from the controller (in the case of 'interrupts').")
|
|
|
|
return [raw[i:i + size] for i in range(0, len(raw), size)]
|