| # 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)] |