Use unique index for connector pin ports (#229)

Closes #160.

Co-authored-by: kvid <kvid@users.noreply.github.com>
This commit is contained in:
Daniel Rojas 2021-08-23 19:26:23 +02:00 committed by GitHub
parent a36807293a
commit e212fc9058
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 17 deletions

View File

@ -25,8 +25,9 @@ ColorScheme = PlainText # Color scheme name = Literal[wv_colors.COLOR_CODES.keys
# Type combinations # Type combinations
Colors = PlainText # One or more two-letter color names (Color) concatenated into one string Colors = PlainText # One or more two-letter color names (Color) concatenated into one string
Pin = Union[int, PlainText] # Pin identifier Pin = Union[int, PlainText] # Pin identifier
PinIndex = int # Zero-based pin index
Wire = Union[int, PlainText] # Wire number or Literal['s'] for shield Wire = Union[int, PlainText] # Wire number or Literal['s'] for shield
NoneOrMorePins = Union[Pin, Tuple[Pin, ...], None] # None, one, or a tuple of pins NoneOrMorePinIndices = Union[PinIndex, Tuple[PinIndex, ...], None] # None, one, or a tuple of zero-based pin indices
OneOrMoreWires = Union[Wire, Tuple[Wire, ...]] # One or a tuple of wires OneOrMoreWires = Union[Wire, Tuple[Wire, ...]] # One or a tuple of wires
@ -95,8 +96,8 @@ class Connector:
pincount: Optional[int] = None pincount: Optional[int] = None
image: Optional[Image] = None image: Optional[Image] = None
notes: Optional[MultilineHypertext] = None notes: Optional[MultilineHypertext] = None
pinlabels: List[Pin] = field(default_factory=list)
pins: List[Pin] = field(default_factory=list) pins: List[Pin] = field(default_factory=list)
pinlabels: List[Pin] = field(default_factory=list)
pincolors: List[Color] = field(default_factory=list) pincolors: List[Color] = field(default_factory=list)
color: Optional[Color] = None color: Optional[Color] = None
show_name: Optional[bool] = None show_name: Optional[bool] = None
@ -277,8 +278,8 @@ class Cable:
self.additional_components[i] = AdditionalComponent(**item) self.additional_components[i] = AdditionalComponent(**item)
# The *_pin arguments accept a tuple, but it seems not in use with the current code. # The *_pin arguments accept a tuple, but it seems not in use with the current code.
def connect(self, from_name: Optional[Designator], from_pin: NoneOrMorePins, via_wire: OneOrMoreWires, def connect(self, from_name: Optional[Designator], from_pin: NoneOrMorePinIndices, via_wire: OneOrMoreWires,
to_name: Optional[Designator], to_pin: NoneOrMorePins) -> None: to_name: Optional[Designator], to_pin: NoneOrMorePinIndices) -> None:
from_pin = int2tuple(from_pin) from_pin = int2tuple(from_pin)
via_wire = int2tuple(via_wire) via_wire = int2tuple(via_wire)
to_pin = int2tuple(to_pin) to_pin = int2tuple(to_pin)
@ -305,7 +306,7 @@ class Cable:
@dataclass @dataclass
class Connection: class Connection:
from_name: Optional[Designator] from_name: Optional[Designator]
from_port: Optional[Pin] from_port: Optional[PinIndex]
via_port: Wire via_port: Wire
to_name: Optional[Designator] to_name: Optional[Designator]
to_port: Optional[Pin] to_port: Optional[PinIndex]

View File

@ -78,7 +78,10 @@ class Harness:
raise Exception(f'{via_name}:{via_wire} is used for more than one wire.') raise Exception(f'{via_name}:{via_wire} is used for more than one wire.')
via_wire = cable.wirelabels.index(via_wire) + 1 # list index starts at 0, wire IDs start at 1 via_wire = cable.wirelabels.index(via_wire) + 1 # list index starts at 0, wire IDs start at 1
self.cables[via_name].connect(from_name, from_pin, via_wire, to_name, to_pin) from_pin_id = self.connectors[from_name].pins.index(from_pin) if from_pin is not None else None
to_pin_id = self.connectors[to_name].pins.index(to_pin) if to_pin is not None else None
self.cables[via_name].connect(from_name, from_pin_id, via_wire, to_name, to_pin_id)
if from_name in self.connectors: if from_name in self.connectors:
self.connectors[from_name].activate_pin(from_pin) self.connectors[from_name].activate_pin(from_pin)
if to_name in self.connectors: if to_name in self.connectors:
@ -135,12 +138,12 @@ class Harness:
pinhtml = [] pinhtml = []
pinhtml.append('<table border="0" cellspacing="0" cellpadding="3" cellborder="1">') pinhtml.append('<table border="0" cellspacing="0" cellpadding="3" cellborder="1">')
for pin, pinlabel, pincolor in zip_longest(connector.pins, connector.pinlabels, connector.pincolors): for pinindex, (pinname, pinlabel, pincolor) in enumerate(zip_longest(connector.pins, connector.pinlabels, connector.pincolors)):
if connector.hide_disconnected_pins and not connector.visible_pins.get(pin, False): if connector.hide_disconnected_pins and not connector.visible_pins.get(pinname, False):
continue continue
pinhtml.append(' <tr>') pinhtml.append(' <tr>')
if connector.ports_left: if connector.ports_left:
pinhtml.append(f' <td port="p{pin}l">{pin}</td>') pinhtml.append(f' <td port="p{pinindex+1}l">{pinname}</td>')
if pinlabel: if pinlabel:
pinhtml.append(f' <td>{pinlabel}</td>') pinhtml.append(f' <td>{pinlabel}</td>')
if connector.pincolors: if connector.pincolors:
@ -155,7 +158,7 @@ class Harness:
pinhtml.append( ' <td colspan="2"></td>') pinhtml.append( ' <td colspan="2"></td>')
if connector.ports_right: if connector.ports_right:
pinhtml.append(f' <td port="p{pin}r">{pin}</td>') pinhtml.append(f' <td port="p{pinindex+1}r">{pinname}</td>')
pinhtml.append(' </tr>') pinhtml.append(' </tr>')
pinhtml.append(' </table>') pinhtml.append(' </table>')
@ -298,14 +301,14 @@ class Harness:
dot.attr('edge', color=':'.join(['#000000', shield_color_hex, '#000000']) if isinstance(cable.shield, str) else '#000000') dot.attr('edge', color=':'.join(['#000000', shield_color_hex, '#000000']) if isinstance(cable.shield, str) else '#000000')
if connection.from_port is not None: # connect to left if connection.from_port is not None: # connect to left
from_connector = self.connectors[connection.from_name] from_connector = self.connectors[connection.from_name]
from_port = f':p{connection.from_port}r' if from_connector.style != 'simple' else '' from_port = f':p{connection.from_port+1}r' if from_connector.style != 'simple' else ''
code_left_1 = f'{connection.from_name}{from_port}:e' code_left_1 = f'{connection.from_name}{from_port}:e'
code_left_2 = f'{cable.name}:w{connection.via_port}:w' code_left_2 = f'{cable.name}:w{connection.via_port}:w'
dot.edge(code_left_1, code_left_2) dot.edge(code_left_1, code_left_2)
if from_connector.show_name: if from_connector.show_name:
from_info = [str(connection.from_name), str(connection.from_port)] from_info = [str(connection.from_name), str(self.connectors[connection.from_name].pins[connection.from_port])]
if from_connector.pinlabels: if from_connector.pinlabels:
pinlabel = from_connector.pinlabels[from_connector.pins.index(connection.from_port)] pinlabel = from_connector.pinlabels[connection.from_port]
if pinlabel != '': if pinlabel != '':
from_info.append(pinlabel) from_info.append(pinlabel)
from_string = ':'.join(from_info) from_string = ':'.join(from_info)
@ -315,13 +318,13 @@ class Harness:
if connection.to_port is not None: # connect to right if connection.to_port is not None: # connect to right
to_connector = self.connectors[connection.to_name] to_connector = self.connectors[connection.to_name]
code_right_1 = f'{cable.name}:w{connection.via_port}:e' code_right_1 = f'{cable.name}:w{connection.via_port}:e'
to_port = f':p{connection.to_port}l' if self.connectors[connection.to_name].style != 'simple' else '' to_port = f':p{connection.to_port+1}l' if self.connectors[connection.to_name].style != 'simple' else ''
code_right_2 = f'{connection.to_name}{to_port}:w' code_right_2 = f'{connection.to_name}{to_port}:w'
dot.edge(code_right_1, code_right_2) dot.edge(code_right_1, code_right_2)
if to_connector.show_name: if to_connector.show_name:
to_info = [str(connection.to_name), str(connection.to_port)] to_info = [str(connection.to_name), str(self.connectors[connection.to_name].pins[connection.to_port])]
if to_connector.pinlabels: if to_connector.pinlabels:
pinlabel = to_connector.pinlabels[to_connector.pins.index(connection.to_port)] pinlabel = to_connector.pinlabels[connection.to_port]
if pinlabel != '': if pinlabel != '':
to_info.append(pinlabel) to_info.append(pinlabel)
to_string = ':'.join(to_info) to_string = ':'.join(to_info)