blob: eec4448b3de5385b4a7f03280560bb8696b9a246 [file] [log] [blame]
# 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)]