19f44a47fSAlexander V. Chernikov#!/usr/bin/env python3
29f44a47fSAlexander V. Chernikov
39f44a47fSAlexander V. Chernikovimport os
49f44a47fSAlexander V. Chernikovimport socket
59f44a47fSAlexander V. Chernikovimport struct
69f44a47fSAlexander V. Chernikovimport subprocess
79f44a47fSAlexander V. Chernikovimport sys
89f44a47fSAlexander V. Chernikovfrom enum import Enum
99f44a47fSAlexander V. Chernikovfrom typing import Dict
109f44a47fSAlexander V. Chernikovfrom typing import List
119f44a47fSAlexander V. Chernikovfrom typing import Optional
129f44a47fSAlexander V. Chernikovfrom typing import Union
139f44a47fSAlexander V. Chernikovfrom typing import Any
149f44a47fSAlexander V. Chernikovfrom typing import NamedTuple
159f44a47fSAlexander V. Chernikovimport pytest
169f44a47fSAlexander V. Chernikov
179f44a47fSAlexander V. Chernikov
189f44a47fSAlexander V. Chernikovdef roundup2(val: int, num: int) -> int:
199f44a47fSAlexander V. Chernikov    if val % num:
209f44a47fSAlexander V. Chernikov        return (val | (num - 1)) + 1
219f44a47fSAlexander V. Chernikov    else:
229f44a47fSAlexander V. Chernikov        return val
239f44a47fSAlexander V. Chernikov
249f44a47fSAlexander V. Chernikov
259f44a47fSAlexander V. Chernikovdef align8(val: int) -> int:
269f44a47fSAlexander V. Chernikov    return roundup2(val, 8)
279f44a47fSAlexander V. Chernikov
289f44a47fSAlexander V. Chernikov
299f44a47fSAlexander V. Chernikovdef enum_or_int(val) -> int:
309f44a47fSAlexander V. Chernikov    if isinstance(val, Enum):
319f44a47fSAlexander V. Chernikov        return val.value
329f44a47fSAlexander V. Chernikov    return val
339f44a47fSAlexander V. Chernikov
349f44a47fSAlexander V. Chernikov
359f44a47fSAlexander V. Chernikovdef enum_from_int(enum_class: Enum, val) -> Enum:
369f44a47fSAlexander V. Chernikov    if isinstance(val, Enum):
379f44a47fSAlexander V. Chernikov        return val
389f44a47fSAlexander V. Chernikov    for item in enum_class:
399f44a47fSAlexander V. Chernikov        if val == item.value:
409f44a47fSAlexander V. Chernikov            return item
419f44a47fSAlexander V. Chernikov    return None
429f44a47fSAlexander V. Chernikov
439f44a47fSAlexander V. Chernikov
449f44a47fSAlexander V. Chernikovclass AttrDescr(NamedTuple):
459f44a47fSAlexander V. Chernikov    val: Enum
469f44a47fSAlexander V. Chernikov    cls: Any
479f44a47fSAlexander V. Chernikov    child_map: Any = None
489f44a47fSAlexander V. Chernikov    is_array: bool = False
499f44a47fSAlexander V. Chernikov
509f44a47fSAlexander V. Chernikov
519f44a47fSAlexander V. Chernikovdef prepare_attrs_map(attrs: List[AttrDescr]) -> Dict[str, Dict]:
529f44a47fSAlexander V. Chernikov    ret = {}
539f44a47fSAlexander V. Chernikov    for ad in attrs:
549f44a47fSAlexander V. Chernikov        ret[ad.val.value] = {"ad": ad}
559f44a47fSAlexander V. Chernikov        if ad.child_map:
569f44a47fSAlexander V. Chernikov            ret[ad.val.value]["child"] = prepare_attrs_map(ad.child_map)
579f44a47fSAlexander V. Chernikov            ret[ad.val.value]["is_array"] = ad.is_array
589f44a47fSAlexander V. Chernikov    return ret
599f44a47fSAlexander V. Chernikov
609f44a47fSAlexander V. Chernikov
619f44a47fSAlexander V. Chernikov
62