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