diff --git a/kibot/kicad/v6_sch.py b/kibot/kicad/v6_sch.py index b27a2f67..b271532f 100644 --- a/kibot/kicad/v6_sch.py +++ b/kibot/kicad/v6_sch.py @@ -611,6 +611,28 @@ def _get_effects(items, pos, name): return FontEffects.parse(values) +class PinAlternate(object): + def __init__(self): + super().__init__() + + @staticmethod + def parse(items): + alt = PinAlternate() + name = 'alternate' + alt.name = _check_str(items, 1, name+' name') + alt.type = _check_symbol(items, 2, name+' type') + alt.gtype = _check_symbol(items, 3, name+' style') + return alt + + def write(self): + return _symbol('alternate', [self.name, Symbol(self.type), Symbol(self.gtype)]) + + +def _get_alternate(items, pos, name): + values = _check_symbol_value(items, pos, name, 'alternate') + return PinAlternate.parse(values) + + class PinV6(object): def __init__(self): super().__init__() @@ -619,6 +641,7 @@ class PinV6(object): self.name_effects = self.number_effects = None self.hide = False self.box = Box() + self.alternate = None @staticmethod def parse(items): @@ -641,6 +664,9 @@ class PinV6(object): elif i_type == 'number': pin.number = _check_str(i, 1, name+' number') pin.number_effects = _get_effects(i, 2, name+' number') + elif i_type == 'alternate': + # Not documented yet + pin.alternate = _get_alternate(items, c+3, name) else: raise SchError('Unknown pin attribute `{}`'.format(i)) @@ -672,6 +698,8 @@ class PinV6(object): data.append(Symbol('hide')) data.extend([Sep(), _symbol('name', [self.name, self.name_effects.write()]), Sep(), _symbol('number', [self.number, self.number_effects.write()]), Sep()]) + if self.alternate: + data.extend([self.alternate.write(), Sep()]) return _symbol('pin', data) @@ -946,6 +974,7 @@ class SchematicComponentV6(SchematicComponent): self.fields_autoplaced = False self.mirror = None self.convert = None + self.pin_alternates = {} def set_ref(self, ref): self.ref = ref @@ -981,6 +1010,14 @@ class SchematicComponentV6(SchematicComponent): else: logger.warning(W_NOLIB + "Component `{}` with more than one `:`".format(comp.name)) + def load_pin(self, i, name): + pin_name = _check_str(i, 1, name + 'pin name') + pin_uuid = _get_uuid(i, 2, name) + self.pins[pin_name] = pin_uuid + if len(i) > 3: + # Not documented + self.pin_alternates[pin_name] = _check_symbol_str(i, 3, name, 'alternate') + @staticmethod def load(c, project, parent): if not isinstance(c, list): @@ -1051,9 +1088,7 @@ class SchematicComponentV6(SchematicComponent): comp.datasheet = field.value # PINS... elif i_type == 'pin': - pin_name = _check_str(i, 1, name + 'pin name') - pin_uuid = _get_uuid(i, 2, name) - comp.pins[pin_name] = pin_uuid + comp.load_pin(i, name) else: raise SchError('Unknown component attribute `{}`'.format(i)) if not lib_id_found or not at_found: @@ -1096,7 +1131,11 @@ class SchematicComponentV6(SchematicComponent): if d: data.extend([d, Sep()]) for k, v in self.pins.items(): - data.extend([_symbol('pin', [k, _symbol('uuid', [Symbol(v)])]), Sep()]) + pin_data = [k, _symbol('uuid', [Symbol(v)])] + alternate = self.pin_alternates.get(k, None) + if alternate: + pin_data.append(_symbol('alternate', [alternate])) + data.extend([_symbol('pin', pin_data), Sep()]) return _symbol('symbol', data) diff --git a/tests/board_samples/kicad_6/alternate.kicad_sch b/tests/board_samples/kicad_6/alternate.kicad_sch new file mode 100644 index 00000000..743dbf31 --- /dev/null +++ b/tests/board_samples/kicad_6/alternate.kicad_sch @@ -0,0 +1,230 @@ +(kicad_sch (version 20211123) (generator eeschema) + + (uuid 10109f84-4940-47f8-8640-91f185ac9bc1) + + (paper "A4") + + (lib_symbols + (symbol "MCU_SiliconLabs:EFM8LB12F32E-C-QFP32" (in_bom yes) (on_board yes) + (property "Reference" "U" (id 0) (at -5.08 31.115 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "EFM8LB12F32E-C-QFP32" (id 1) (at -5.08 29.21 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "Package_QFP:LQFP-32_7x7mm_P0.8mm" (id 2) (at 1.27 -29.21 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "https://www.silabs.com/documents/public/data-sheets/efm8lb1-datasheet.pdf" (id 3) (at 0 50.8 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "8051 microcontroller" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "8051-compatible microcontroller, 72 MHz, 2.2 to 3.6V, 32K flash, 2304B RAM, -40 to +105 C, QFP-32" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "LQFP*7x7mm*P0.8mm*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "EFM8LB12F32E-C-QFP32_0_0" + (pin bidirectional line (at -15.24 22.86 0) (length 2.54) + (name "P0.0" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 2.54 180) (length 2.54) + (name "P3.0" (effects (font (size 1.27 1.27)))) + (number "10" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 7.62 180) (length 2.54) + (name "P2.6" (effects (font (size 1.27 1.27)))) + (number "11" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 10.16 180) (length 2.54) + (name "P2.5" (effects (font (size 1.27 1.27)))) + (number "12" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 12.7 180) (length 2.54) + (name "P2.4" (effects (font (size 1.27 1.27)))) + (number "13" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 15.24 180) (length 2.54) + (name "P2.3" (effects (font (size 1.27 1.27)))) + (number "14" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 17.78 180) (length 2.54) + (name "P2.2" (effects (font (size 1.27 1.27)))) + (number "15" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 20.32 180) (length 2.54) + (name "P2.1" (effects (font (size 1.27 1.27)))) + (number "16" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 22.86 180) (length 2.54) + (name "P2.0" (effects (font (size 1.27 1.27)))) + (number "17" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 -17.78 0) (length 2.54) + (name "P1.7" (effects (font (size 1.27 1.27)))) + (number "18" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 -15.24 0) (length 2.54) + (name "P1.6" (effects (font (size 1.27 1.27)))) + (number "19" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 0 -30.48 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 -12.7 0) (length 2.54) + (name "P1.5" (effects (font (size 1.27 1.27)))) + (number "20" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 -10.16 0) (length 2.54) + (name "P1.4" (effects (font (size 1.27 1.27)))) + (number "21" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 -7.62 0) (length 2.54) + (name "P1.3" (effects (font (size 1.27 1.27)))) + (number "22" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 -5.08 0) (length 2.54) + (name "P1.2" (effects (font (size 1.27 1.27)))) + (number "23" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 -2.54 0) (length 2.54) + (name "P1.1" (effects (font (size 1.27 1.27)))) + (number "24" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 0 0) (length 2.54) + (name "P1.0" (effects (font (size 1.27 1.27)))) + (number "25" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 5.08 0) (length 2.54) + (name "P0.7" (effects (font (size 1.27 1.27)))) + (number "26" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 7.62 0) (length 2.54) + (name "P0.6" (effects (font (size 1.27 1.27)))) + (number "27" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 10.16 0) (length 2.54) + (name "P0.5" (effects (font (size 1.27 1.27)))) + (number "28" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 12.7 0) (length 2.54) + (name "P0.4" (effects (font (size 1.27 1.27)))) + (number "29" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 2.54 30.48 270) (length 2.54) + (name "VIO" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 15.24 0) (length 2.54) + (name "P0.3" (effects (font (size 1.27 1.27)))) + (number "30" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 17.78 0) (length 2.54) + (name "P0.2" (effects (font (size 1.27 1.27)))) + (number "31" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -15.24 20.32 0) (length 2.54) + (name "P0.1" (effects (font (size 1.27 1.27)))) + (number "32" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at -2.54 30.48 270) (length 2.54) + (name "VDD" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at -15.24 -22.86 0) (length 2.54) + (name "~{RST}" (effects (font (size 1.27 1.27)))) + (number "5" (effects (font (size 1.27 1.27)))) + (alternate "C2CK" input line) + ) + (pin bidirectional line (at 15.24 -7.62 180) (length 2.54) + (name "P3.7" (effects (font (size 1.27 1.27)))) + (number "6" (effects (font (size 1.27 1.27)))) + (alternate "C2D" bidirectional line) + ) + (pin bidirectional line (at 15.24 -5.08 180) (length 2.54) + (name "P3.3" (effects (font (size 1.27 1.27)))) + (number "7" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 -2.54 180) (length 2.54) + (name "P3.2" (effects (font (size 1.27 1.27)))) + (number "8" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 15.24 0 180) (length 2.54) + (name "P3.1" (effects (font (size 1.27 1.27)))) + (number "9" (effects (font (size 1.27 1.27)))) + ) + ) + (symbol "EFM8LB12F32E-C-QFP32_0_1" + (rectangle (start -12.7 27.94) (end 12.7 -27.94) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + ) + ) + ) + + + (symbol (lib_id "MCU_SiliconLabs:EFM8LB12F32E-C-QFP32") (at 129.54 86.36 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid f202141e-c20d-4cac-b016-06a44f2ecce8) + (property "Reference" "U?" (id 0) (at 131.5594 116.2796 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "" (id 1) (at 131.5594 118.8165 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 130.81 115.57 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "https://www.silabs.com/documents/public/data-sheets/efm8lb1-datasheet.pdf" (id 3) (at 129.54 35.56 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e43dbe34-ed17-4e35-a5c7-2f1679b3c415)) + (pin "10" (uuid 14769dc5-8525-4984-8b15-a734ee247efa)) + (pin "11" (uuid 19c56563-5fe3-442a-885b-418dbc2421eb)) + (pin "12" (uuid 21ae9c3a-7138-444e-be38-56a4842ab594)) + (pin "13" (uuid c7e7067c-5f5e-48d8-ab59-df26f9b35863)) + (pin "14" (uuid 9cb12cc8-7f1a-4a01-9256-c119f11a8a02)) + (pin "15" (uuid 7cee474b-af8f-4832-b07a-c43c1ab0b464)) + (pin "16" (uuid 853ee787-6e2c-4f32-bc75-6c17337dd3d5)) + (pin "17" (uuid 57c0c267-8bf9-4cc7-b734-d71a239ac313)) + (pin "18" (uuid 5ca4be1c-537e-4a4a-b344-d0c8ffde8546)) + (pin "19" (uuid 275aa44a-b61f-489f-9e2a-819a0fe0d1eb)) + (pin "2" (uuid 6c67e4f6-9d04-4539-b356-b76e915ce848)) + (pin "20" (uuid b447dbb1-d38e-4a15-93cb-12c25382ea53)) + (pin "21" (uuid cfa5c16e-7859-460d-a0b8-cea7d7ea629c)) + (pin "22" (uuid 37e8181c-a81e-498b-b2e2-0aef0c391059)) + (pin "23" (uuid 676efd2f-1c48-4786-9e4b-2444f1e8f6ff)) + (pin "24" (uuid 8d9a3ecc-539f-41da-8099-d37cea9c28e7)) + (pin "25" (uuid e472dac4-5b65-4920-b8b2-6065d140a69d)) + (pin "26" (uuid 0351df45-d042-41d4-ba35-88092c7be2fc)) + (pin "27" (uuid 240e5dac-6242-47a5-bbef-f76d11c715c0)) + (pin "28" (uuid aa2ea573-3f20-43c1-aa99-1f9c6031a9aa)) + (pin "29" (uuid f40d350f-0d3e-4f8a-b004-d950f2f8f1ba)) + (pin "3" (uuid 0e1ed1c5-7428-4dc7-b76e-49b2d5f8177d)) + (pin "30" (uuid 14c51520-6d91-4098-a59a-5121f2a898f7)) + (pin "31" (uuid 2d67a417-188f-4014-9282-000265d80009)) + (pin "32" (uuid 84e5506c-143e-495f-9aa4-d3a71622f213)) + (pin "4" (uuid 477311b9-8f81-40c8-9c55-fd87e287247a)) + (pin "5" (uuid 097edb1b-8998-4e70-b670-bba125982348) (alternate "C2CK")) + (pin "6" (uuid 994b6220-4755-4d84-91b3-6122ac1c2c5e) (alternate "C2D")) + (pin "7" (uuid 67763d19-f622-4e1e-81e5-5b24da7c3f99)) + (pin "8" (uuid 6284122b-79c3-4e04-925e-3d32cc3ec077)) + (pin "9" (uuid ca5a4651-0d1d-441b-b17d-01518ef3b656)) + ) + + (sheet_instances + (path "/" (page "1")) + ) + + (symbol_instances + (path "/f202141e-c20d-4cac-b016-06a44f2ecce8" + (reference "U?") (unit 1) (value "EFM8LB12F32E-C-QFP32") (footprint "Package_QFP:LQFP-32_7x7mm_P0.8mm") + ) + ) +)