1*9f44a47fSAlexander V. Chernikov#!/usr/bin/env python3 2*9f44a47fSAlexander V. Chernikov 3*9f44a47fSAlexander V. Chernikovimport os 4*9f44a47fSAlexander V. Chernikovimport socket 5*9f44a47fSAlexander V. Chernikovimport struct 6*9f44a47fSAlexander V. Chernikovimport subprocess 7*9f44a47fSAlexander V. Chernikovimport sys 8*9f44a47fSAlexander V. Chernikovfrom enum import Enum 9*9f44a47fSAlexander V. Chernikovfrom typing import Dict 10*9f44a47fSAlexander V. Chernikovfrom typing import List 11*9f44a47fSAlexander V. Chernikovfrom typing import Optional 12*9f44a47fSAlexander V. Chernikovfrom typing import Union 13*9f44a47fSAlexander V. Chernikovfrom typing import Any 14*9f44a47fSAlexander V. Chernikovfrom typing import NamedTuple 15*9f44a47fSAlexander V. Chernikovimport pytest 16*9f44a47fSAlexander V. Chernikov 17*9f44a47fSAlexander V. Chernikov 18*9f44a47fSAlexander V. Chernikovdef roundup2(val: int, num: int) -> int: 19*9f44a47fSAlexander V. Chernikov if val % num: 20*9f44a47fSAlexander V. Chernikov return (val | (num - 1)) + 1 21*9f44a47fSAlexander V. Chernikov else: 22*9f44a47fSAlexander V. Chernikov return val 23*9f44a47fSAlexander V. Chernikov 24*9f44a47fSAlexander V. Chernikov 25*9f44a47fSAlexander V. Chernikovdef align8(val: int) -> int: 26*9f44a47fSAlexander V. Chernikov return roundup2(val, 8) 27*9f44a47fSAlexander V. Chernikov 28*9f44a47fSAlexander V. Chernikov 29*9f44a47fSAlexander V. Chernikovdef enum_or_int(val) -> int: 30*9f44a47fSAlexander V. Chernikov if isinstance(val, Enum): 31*9f44a47fSAlexander V. Chernikov return val.value 32*9f44a47fSAlexander V. Chernikov return val 33*9f44a47fSAlexander V. Chernikov 34*9f44a47fSAlexander V. Chernikov 35*9f44a47fSAlexander V. Chernikovdef enum_from_int(enum_class: Enum, val) -> Enum: 36*9f44a47fSAlexander V. Chernikov if isinstance(val, Enum): 37*9f44a47fSAlexander V. Chernikov return val 38*9f44a47fSAlexander V. Chernikov for item in enum_class: 39*9f44a47fSAlexander V. Chernikov if val == item.value: 40*9f44a47fSAlexander V. Chernikov return item 41*9f44a47fSAlexander V. Chernikov return None 42*9f44a47fSAlexander V. Chernikov 43*9f44a47fSAlexander V. Chernikov 44*9f44a47fSAlexander V. Chernikovclass AttrDescr(NamedTuple): 45*9f44a47fSAlexander V. Chernikov val: Enum 46*9f44a47fSAlexander V. Chernikov cls: Any 47*9f44a47fSAlexander V. Chernikov child_map: Any = None 48*9f44a47fSAlexander V. Chernikov is_array: bool = False 49*9f44a47fSAlexander V. Chernikov 50*9f44a47fSAlexander V. Chernikov 51*9f44a47fSAlexander V. Chernikovdef prepare_attrs_map(attrs: List[AttrDescr]) -> Dict[str, Dict]: 52*9f44a47fSAlexander V. Chernikov ret = {} 53*9f44a47fSAlexander V. Chernikov for ad in attrs: 54*9f44a47fSAlexander V. Chernikov ret[ad.val.value] = {"ad": ad} 55*9f44a47fSAlexander V. Chernikov if ad.child_map: 56*9f44a47fSAlexander V. Chernikov ret[ad.val.value]["child"] = prepare_attrs_map(ad.child_map) 57*9f44a47fSAlexander V. Chernikov ret[ad.val.value]["is_array"] = ad.is_array 58*9f44a47fSAlexander V. Chernikov return ret 59*9f44a47fSAlexander V. Chernikov 60*9f44a47fSAlexander V. Chernikov 61*9f44a47fSAlexander V. Chernikov 62