|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
3 | | -from typing import Generic, Any, Optional, List, Mapping, Dict, Union, TYPE_CHECKING |
| 3 | +from typing import Generic, Any, Optional, Mapping, Dict, Union, TYPE_CHECKING, Tuple, Iterable, overload, Set |
4 | 4 |
|
5 | 5 | from deprecated import deprecated |
6 | 6 | from typing_extensions import TypeVar, override |
@@ -36,12 +36,42 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: |
36 | 36 | self.fp_pnp_offset_x = self.Parameter(FloatExpr()) |
37 | 37 | self.fp_pnp_offset_y = self.Parameter(FloatExpr()) |
38 | 38 |
|
39 | | - # TODO: allow value to be taken from parameters, ideally w/ string concat from params |
| 39 | + @overload |
40 | 40 | def footprint( |
41 | 41 | self, |
42 | 42 | refdes: StringLike, |
43 | 43 | footprint: StringLike, |
44 | | - pinning: Mapping[str, Union["Passive", "HasPassivePort"]], |
| 44 | + pinning: Mapping[str, Union[Passive, HasPassivePort]], |
| 45 | + mfr: Optional[StringLike] = None, |
| 46 | + part: Optional[StringLike] = None, |
| 47 | + value: Optional[StringLike] = None, |
| 48 | + datasheet: Optional[StringLike] = None, |
| 49 | + pnp_rot: Optional[float] = None, |
| 50 | + pnp_offset: Optional[tuple[float, float]] = None, |
| 51 | + ) -> None: ... |
| 52 | + |
| 53 | + @overload |
| 54 | + def footprint( |
| 55 | + self, |
| 56 | + refdes: StringLike, |
| 57 | + footprint: StringLike, |
| 58 | + pinning: Mapping[Union[Iterable[str], str], Union[Passive, HasPassivePort]], |
| 59 | + mfr: Optional[StringLike] = None, |
| 60 | + part: Optional[StringLike] = None, |
| 61 | + value: Optional[StringLike] = None, |
| 62 | + datasheet: Optional[StringLike] = None, |
| 63 | + pnp_rot: Optional[float] = None, |
| 64 | + pnp_offset: Optional[tuple[float, float]] = None, |
| 65 | + ) -> None: ... |
| 66 | + |
| 67 | + def footprint( |
| 68 | + self, |
| 69 | + refdes: StringLike, |
| 70 | + footprint: StringLike, |
| 71 | + pinning: Union[ |
| 72 | + Mapping[str, Union[Passive, HasPassivePort]], |
| 73 | + Mapping[Union[Iterable[str], str], Union[Passive, HasPassivePort]], |
| 74 | + ], |
45 | 75 | mfr: Optional[StringLike] = None, |
46 | 76 | part: Optional[StringLike] = None, |
47 | 77 | value: Optional[StringLike] = None, |
@@ -75,12 +105,21 @@ def footprint( |
75 | 105 | self.fp_is_footprint = self.Metadata("") |
76 | 106 |
|
77 | 107 | pinning_array = [] |
| 108 | + assigned_pins: Set[str] = set() |
78 | 109 | for pin_name, pin_port in pinning.items(): |
79 | 110 | if isinstance(pin_port, HasPassivePort): |
80 | 111 | pin_port = pin_port.net |
81 | 112 | if not isinstance(pin_port, (CircuitPort, Passive)): |
82 | 113 | raise EdgTypeError(f"Footprint(...) pin", pin_port, Passive) |
83 | | - pinning_array.append(f"{pin_name}={pin_port._name_from(self)}") |
| 114 | + |
| 115 | + if isinstance(pin_name, str): |
| 116 | + pin_tuples: Tuple[str, ...] = (pin_name,) |
| 117 | + else: |
| 118 | + pin_tuples = tuple(iter(pin_name)) |
| 119 | + for pin in pin_tuples: |
| 120 | + pinning_array.append(f"{pin}={pin_port._name_from(self)}") |
| 121 | + assert pin not in assigned_pins, f"duplicate pin name {pin} in footprint pinning" |
| 122 | + assigned_pins.add(pin) |
84 | 123 | self.assign(self.fp_pinning, pinning_array) |
85 | 124 |
|
86 | 125 | self.assign(self.fp_footprint, footprint) |
|
0 commit comments