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