| #!/usr/bin/env python3 |
| |
| from typing import List, Tuple, Union |
| |
| from .pb_type import Port |
| |
| SinglePinPortPinName = str # "PortName" -- Will not have square brackets |
| MultiPinPortPinName = str # "PortName[PinIndex]" |
| |
| |
| def flatten(ports: List[Port] |
| ) -> Tuple[Union[SinglePinPortPinName, MultiPinPortPinName], |
| SinglePinPortPinName]: |
| """Mapping from pins a list of ports to individual width ports pins. |
| |
| Parameters |
| ---------- |
| ports |
| List of ports to flatten, accepts both single pin ports as strings or |
| multi-pin ports as a tuple of port name and port width. |
| |
| Yields |
| ------- |
| (str, str) |
| Mapping between original port pin names to single pin port names. |
| |
| >>> print(list(flatten(['A', ('B', 1), ('C', 2)]))) |
| [('A', 'A'), ('B', 'B'), ('C[0]', 'C0'), ('C[1]', 'C1')] |
| """ |
| for x in ports: |
| if isinstance(x, tuple): |
| n, bits = x |
| else: |
| n = x |
| bits = 1 |
| |
| if bits == 1: |
| yield (n, n) |
| else: |
| for i in range(0, bits): |
| src = "{}[{}]".format(n, i) |
| dst = "{}{}".format(n, i) |
| yield (src, dst) |