|  | #!/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) |