From 225679c7edd35f31c8d0bf3c39f06922bd4fa432 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 01:30:46 -0700 Subject: [PATCH 01/22] wip --- edg/parts/microcontroller/Ch32v203.py | 270 ++++++++++++++++++++++++++ examples/test_ble_joystick.py | 1 + 2 files changed, 271 insertions(+) create mode 100644 edg/parts/microcontroller/Ch32v203.py diff --git a/edg/parts/microcontroller/Ch32v203.py b/edg/parts/microcontroller/Ch32v203.py new file mode 100644 index 000000000..b16a620ae --- /dev/null +++ b/edg/parts/microcontroller/Ch32v203.py @@ -0,0 +1,270 @@ +from typing import * + +from typing_extensions import override + +from ...circuits import * +from ...vendor_parts.jlc.JlcPart import JlcPart +from ..connector.Headers import PinHeader254 +from ..connector.TagConnect import TagConnect + + +@abstract_block_default(lambda: Ch32vSdi2Header254) +class Ch32vSdi2Header(ProgrammingConnector): + """Abstract programming header for the CH32V using the two-pin SDI interface.""" + + def __init__(self) -> None: + super().__init__() + + self.pwr = self.Port(VoltageSink.empty(), [Power]) + self.gnd = self.Port(Ground.empty(), [Common]) + self.swclk = self.Port(DigitalBidir.empty()) # despite similar naming, this is not ARM SWD + self.swdio = self.Port(DigitalBidir.empty()) + self.reset = self.Port(DigitalBidir.empty(), optional=True) # may not be connected internally + + +class Ch32vSdi2Header254(Ch32vSdi2Header): + """4-pin minimal programming header for CH32V.""" + + @override + def contents(self) -> None: + super().contents() + + self.gnd.init_from(Ground()) + self.pwr.init_from(VoltageSink()) + self.swclk.init_from(DigitalBidir()) + self.swdio.init_from(DigitalBidir()) + self.reset.init_from(DigitalBidir()) # not connected + + self.conn = self.Block(PinHeader254(4)).connected( + {"1": self.pwr, "2": self.gnd, "3": self.swdio, "4": self.swclk} + ) + + +class Ch32vSdi2Tc2030(Ch32vSdi2Header): + """UNOFFICIAL tag connect header, based on the SWD pinout and mapping SWDIO to SWIO.""" + + @override + def contents(self) -> None: + super().contents() + + self.gnd.init_from(Ground()) + self.pwr.init_from(VoltageSink()) + self.swclk.init_from(DigitalBidir()) + self.swdio.init_from(DigitalBidir()) + self.reset.init_from(DigitalBidir()) + + self.conn = self.Block(TagConnect(6)).connected( + {"1": self.pwr, "5": self.gnd, "2": self.swdio, "4": self.swclk, "3": self.reset} + ) + # unused: 6 = swo + + +class Ch32v203_Device( + IoControllerI2cTarget, + IoControllerUsb, + InternalSubcircuit, + BaseIoControllerPinmapGenerator, + GeneratorBlock, + JlcPart, + FootprintBlock, +): + _PIN_MAPPING = { # -K6/K8 version, LQFP-32 package + # "PD0": "2", # OSCI + # "PD1": "3", # OSCO + "PA0-WKUP": "6", + "PA1": "7", + "PA2": "8", + "PA3": "9", + "PA4": "10", + "PA5": "11", + "PA6": "12", + "PA7": "13", + "PB0": "14", + "PB1": "15", + "PA8": "18", + "PA9": "19", + "PA10": "20", + "PA11": "21", + "PA12": "22", + # "PA13": "23", # SWDIO + # "PA14": "24", # SWCLK + "PA15": "25", + "PB3": "26", + "PB4": "27", + "PB5": "28", + "PB6": "29", + "PB7": "30", + # "PB8": "31", # BOOT0 + } + + def __init__(self, **kwargs: Any) -> None: + super().__init__(**kwargs) + + # Additional ports (on top of BaseIoController) + self.vdd = self.Port( + VoltageSink( + voltage_limits=(3.0, 3.6) * Volt, # stricter range when USB used, otherwise down to 2.7 + current_draw=(0.0005, 23.37) * mAmp + self.io_current_draw.upper(), # standby min to 144MHz run max + ), + [Power], + ) + self.vss = self.Port(Ground(), [Common]) + + # TODO CLEAN STARTING HERE + self.nrst = self.Port( # Table 3-19 + DigitalSink.from_supply( + self.vss, + self.vdd, + voltage_limit_tolerance=(-0.3, 0.3) * Volt, + input_threshold_abs=( + 0.28 * (self.vdd.link().voltage.lower() - 1.8) + 0.6 + self.vss.link().voltage.lower(), + 0.41 * (self.vdd.link().voltage.upper() - 1.8) + 1.3 + self.vss.link().voltage.upper(), + ), + pullup_capable=True, + ), + optional=True, + ) # note, switched internal pull-up resistor, 35-55 kOhm + + self.osc = self.Port( + CrystalDriver(frequency_limits=(4, 25) * MHertz, voltage_out=self.vdd.link().voltage), optional=True + ) # Table 3-10 crystal / resonator specs, typ 24 MHz + + self._dio_ft_model = DigitalBidir.from_supply( + self.vss, + self.vdd, + voltage_limit_abs=(-0.3, 5.5) * Volt, # table 3.1 + current_limits=(-20, 20) * mAmp, # table 3.1 + input_threshold_abs=( # table 3-16 + 0.19 * (self.vdd.link().voltage.lower() - 2.7) + 0.65 + self.vss.link().voltage.lower(), + 0.22 * (self.vdd.link().voltage.upper() - 2.7) + 1.55 + self.vss.link().voltage.upper(), + ), + pullup_capable=True, # 35-55 kOhm + pulldown_capable=True, # 35-55 kOhm + ) + self._dio_std_model = DigitalBidir.from_supply( + self.vss, + self.vdd, + voltage_limit_tolerance=(-0.3, 0.3) * Volt, # table 3.1 + current_limits=(-20, 20) * mAmp, # table 3.1 + input_threshold_abs=( # table 3-16 + 0.19 * (self.vdd.link().voltage.lower() - 2.7) + 0.65 + self.vss.link().voltage.lower(), + 0.22 * (self.vdd.link().voltage.upper() - 2.7) + 1.55 + self.vss.link().voltage.upper(), + ), + pullup_capable=True, # 35-55 kOhm + pulldown_capable=True, # 35-55 kOhm + ) + + self.swio = self.Port(self._dio_std_model) + + @override + def _system_pinmap(self) -> Mapping[Union[Iterable[str], str], Union[Passive, HasPassivePort]]: + return { + ("16", "32"): self.vss, + "5": self.vdd, # VddA + ("17", "1"): self.vdd, + "2": self.osc.xtal_in, # TODO remappable to PD0 + "3": self.osc.xtal_out, # TODO remappable to PD1 + "4": self.nrst, + "23": self.swdio, # TODO remappable to PA13 + "24": self.swclk, # TODO remappable to PA14 + "18": self.vss, # BOOT0, TODO theoretically usable as output-only PB8 + } + + @override + def _io_pinmap(self) -> PinMapUtil: + # Port models + adc_model = AnalogSink.from_supply( + self.vss, + self.vdd, + voltage_limit_tolerance=(-0.3, 0.3) * Volt, # table 3.1 + impedance=(100, float("inf")) * kOhm, + ) + + uart_model = UartPort(DigitalBidir.empty()) + spi_model = SpiController(DigitalBidir.empty()) + # TODO SPI peripherals, which have fixed-pin CS lines + i2c_model = I2cController(DigitalBidir.empty()) + i2c_target_model = I2cTarget(DigitalBidir.empty()) + + return PinMapUtil( + [ # table 2-1 + PinResource("PD4", {"PD4": self._dio_std_model, "A7": adc_model}), + PinResource("PD5", {"PD5": self._dio_std_model, "A5": adc_model}), + PinResource("PD6", {"PD6": self._dio_std_model, "A6": adc_model}), + PinResource("PD7", {"PD7": self._dio_std_model}), # NRST + PinResource("PA1", {"PA1": self._dio_std_model, "A1": adc_model}), + PinResource("PA2", {"PA2": self._dio_std_model, "A0": adc_model}), + PinResource("PD0", {"PD0": self._dio_std_model}), + PinResource("PC0", {"PC0": self._dio_std_model}), + PinResource("PC1", {"PC1": self._dio_ft_model}), + PinResource("PC2", {"PC2": self._dio_ft_model}), + PinResource("PC3", {"PC3": self._dio_std_model}), + PinResource("PC4", {"PC4": self._dio_ft_model, "A2": adc_model}), + PinResource("PC5", {"PC5": self._dio_ft_model}), + PinResource("PC6", {"PC6": self._dio_ft_model}), + PinResource("PC7", {"PC7": self._dio_std_model}), + PinResource("PD1", {"PD1": self._dio_std_model}), # SWIO + PinResource("PD2", {"PD2": self._dio_std_model, "A3": adc_model}), + PinResource("PD3", {"PD3": self._dio_std_model, "A4": adc_model}), + PeripheralFixedResource( + "U", uart_model, {"tx": ["PD5", "PD0", "PD6", "PC0"], "rx": ["PD6", "PD1", "PD5", "PC1"]} + ), + PeripheralFixedResource("SPI", spi_model, {"sck": ["PC5"], "miso": ["PC7"], "mosi": ["PC6"]}), + PeripheralFixedResource("I2C", i2c_model, {"scl": ["PC2", "PD1", "PC5"], "sda": ["PC1", "PD0", "PC6"]}), + PeripheralFixedResource( + "I2C_T", i2c_target_model, {"scl": ["PC2", "PD1", "PC5"], "sda": ["PC1", "PD0", "PC6"]} + ), + ] + ).remap_pins(self._PIN_MAPPING) + + @override + def generate(self) -> None: + super().generate() + + self.footprint( + "U", + "Package_SO:TSSOP-20_4.4x6.5mm_P0.65mm", + self._make_pinning(), + mfr="WCH", + part="CH32V003F4P6", + datasheet="https://www.wch-ic.com/downloads/CH32V003DS0_PDF.html", + ) + self.assign(self.lcsc_part, "C5187096") + self.assign(self.actual_basic_part, False) + + +class Ch32v203( + Resettable, + IoControllerI2cTarget, + IoControllerUsb, + Microcontroller, + WithCrystalGenerator, + IoControllerPowerRequired, + GeneratorBlock, +): + """General-purpose RISC-V (RV32IMAC) microcontroller with USB""" + + DEFAULT_CRYSTAL_FREQUENCY = 8 * MHertz(tol=0.005) # 24 MHz as typical in datasheet + + def __init__(self, **kwargs: Any) -> None: + super().__init__(**kwargs) + self.generator_param(self.reset.is_connected()) + + @override + def generate(self) -> None: + super().generate() + + with self.implicit_connect(ImplicitConnect(self.pwr, [Power]), ImplicitConnect(self.gnd, [Common])) as imp: + self.ic = imp.Block(Ch32v203_Device(pin_assigns=ArrayStringExpr())) + self._wrap_inner(self.ic) + + self.sdi = imp.Block(Ch32vSdi2Header()) + self.connect(self.ic.swio, self.sdi.swio) + self.connect(self.ic.nrst, self.sdi.reset) + + self.connect(self.xtal_node, self.ic.osc) + + self.vdd_cap = imp.Block(DecouplingCapacitor(0.1 * uFarad(tol=0.2))) + + if self.get(self.reset.is_connected()): + self.connect(self.reset, self.ic.nrst) diff --git a/examples/test_ble_joystick.py b/examples/test_ble_joystick.py index 6e37af169..dcf4d988d 100644 --- a/examples/test_ble_joystick.py +++ b/examples/test_ble_joystick.py @@ -208,6 +208,7 @@ def refinements(self) -> Refinements: "i2c.scl=12", "i2c.sda=11", # TODO pin the rest + # TODO: NPX pin must be routed to MOSI ], ), ], From c3c0a559c14542ddf543073ced5bca7cc1252d7a Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 01:39:56 -0700 Subject: [PATCH 02/22] wip --- edg/parts/microcontroller/Ch32v003.py | 2 ++ edg/parts/microcontroller/Ch32v203.py | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/edg/parts/microcontroller/Ch32v003.py b/edg/parts/microcontroller/Ch32v003.py index 660615126..77eef17b6 100644 --- a/edg/parts/microcontroller/Ch32v003.py +++ b/edg/parts/microcontroller/Ch32v003.py @@ -245,5 +245,7 @@ def generate(self) -> None: self.vdd_cap = imp.Block(DecouplingCapacitor(0.1 * uFarad(tol=0.2))) + self.reset_cap = self.Block(DigitalCapacitor(0.1 * uFarad(tol=0.2))).connected(self.gnd, self.ic.nrst) + if self.get(self.reset.is_connected()): self.connect(self.reset, self.ic.nrst) diff --git a/edg/parts/microcontroller/Ch32v203.py b/edg/parts/microcontroller/Ch32v203.py index b16a620ae..453b65aaf 100644 --- a/edg/parts/microcontroller/Ch32v203.py +++ b/edg/parts/microcontroller/Ch32v203.py @@ -110,7 +110,6 @@ def __init__(self, **kwargs: Any) -> None: ) self.vss = self.Port(Ground(), [Common]) - # TODO CLEAN STARTING HERE self.nrst = self.Port( # Table 3-19 DigitalSink.from_supply( self.vss, @@ -123,11 +122,11 @@ def __init__(self, **kwargs: Any) -> None: pullup_capable=True, ), optional=True, - ) # note, switched internal pull-up resistor, 35-55 kOhm + ) # note, switched internal pull-up resistor, 30-50 kOhm self.osc = self.Port( - CrystalDriver(frequency_limits=(4, 25) * MHertz, voltage_out=self.vdd.link().voltage), optional=True - ) # Table 3-10 crystal / resonator specs, typ 24 MHz + CrystalDriver(frequency_limits=(3, 25) * MHertz, voltage_out=self.vdd.link().voltage), optional=True + ) # Table 4-11 crystal / resonator specs, typ 8 MHz self._dio_ft_model = DigitalBidir.from_supply( self.vss, @@ -244,7 +243,7 @@ class Ch32v203( ): """General-purpose RISC-V (RV32IMAC) microcontroller with USB""" - DEFAULT_CRYSTAL_FREQUENCY = 8 * MHertz(tol=0.005) # 24 MHz as typical in datasheet + DEFAULT_CRYSTAL_FREQUENCY = 8 * MHertz(tol=0.005) # 8 MHz as typical in datasheet def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) @@ -259,12 +258,18 @@ def generate(self) -> None: self._wrap_inner(self.ic) self.sdi = imp.Block(Ch32vSdi2Header()) - self.connect(self.ic.swio, self.sdi.swio) + self.connect(self.ic.swclk, self.sdi.swclk) + self.connect(self.ic.swdio, self.sdi.swdio) self.connect(self.ic.nrst, self.sdi.reset) self.connect(self.xtal_node, self.ic.osc) - self.vdd_cap = imp.Block(DecouplingCapacitor(0.1 * uFarad(tol=0.2))) + self.vdd_cap = ElementDict[DecouplingCapacitor]() # assume one 0.1uF cap per power pair + for i in range(2): + self.vdd_cap[i] = imp.Block(DecouplingCapacitor(0.1 * uFarad(tol=0.2))) + self.vdda_cap = imp.Block(DecouplingCapacitor(0.1 * uFarad(tol=0.2))) + + self.reset_cap = self.Block(DigitalCapacitor(0.1 * uFarad(tol=0.2))).connected(self.gnd, self.ic.nrst) if self.get(self.reset.is_connected()): self.connect(self.reset, self.ic.nrst) From 884f545c025ecc51e3e5029c8c656c95a584f1f9 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 12:55:04 -0700 Subject: [PATCH 03/22] CH32V203 --- edg/parts/microcontroller/Ch32v003.py | 7 +- edg/parts/microcontroller/Ch32v203.py | 126 +++++++++++++++++--------- edg/parts/microcontroller/__init__.py | 1 + examples/test_keyboard.py | 8 +- 4 files changed, 95 insertions(+), 47 deletions(-) diff --git a/edg/parts/microcontroller/Ch32v003.py b/edg/parts/microcontroller/Ch32v003.py index 77eef17b6..d10de395b 100644 --- a/edg/parts/microcontroller/Ch32v003.py +++ b/edg/parts/microcontroller/Ch32v003.py @@ -116,7 +116,7 @@ def __init__(self, **kwargs: Any) -> None: self.vss, self.vdd, voltage_limit_abs=(-0.3, 5.5) * Volt, # table 3.1 - current_limits=(-20, 20) * mAmp, # table 3.1 + current_limits=(-20, 20) * mAmp, # 3.3.9 output drive current characteristics input_threshold_abs=( # table 3-16 0.19 * (self.vdd.link().voltage.lower() - 2.7) + 0.65 + self.vss.link().voltage.lower(), 0.22 * (self.vdd.link().voltage.upper() - 2.7) + 1.55 + self.vss.link().voltage.upper(), @@ -128,7 +128,7 @@ def __init__(self, **kwargs: Any) -> None: self.vss, self.vdd, voltage_limit_tolerance=(-0.3, 0.3) * Volt, # table 3.1 - current_limits=(-20, 20) * mAmp, # table 3.1 + current_limits=(-20, 20) * mAmp, # 3.3.9 output drive current characteristics input_threshold_abs=( # table 3-16 0.19 * (self.vdd.link().voltage.lower() - 2.7) + 0.65 + self.vss.link().voltage.lower(), 0.22 * (self.vdd.link().voltage.upper() - 2.7) + 1.55 + self.vss.link().voltage.upper(), @@ -157,7 +157,8 @@ def _io_pinmap(self) -> PinMapUtil: self.vss, self.vdd, voltage_limit_tolerance=(-0.3, 0.3) * Volt, # table 3.1 - impedance=(100, float("inf")) * kOhm, + signal_limit_tolerance=(0, 0) * Volt, # table 3-23, conversion voltage range + # impedance depends on sampling rate ) uart_model = UartPort(DigitalBidir.empty()) diff --git a/edg/parts/microcontroller/Ch32v203.py b/edg/parts/microcontroller/Ch32v203.py index 453b65aaf..83ac3fb48 100644 --- a/edg/parts/microcontroller/Ch32v203.py +++ b/edg/parts/microcontroller/Ch32v203.py @@ -62,6 +62,7 @@ def contents(self) -> None: class Ch32v203_Device( IoControllerI2cTarget, IoControllerUsb, + IoControllerCan, InternalSubcircuit, BaseIoControllerPinmapGenerator, GeneratorBlock, @@ -131,29 +132,30 @@ def __init__(self, **kwargs: Any) -> None: self._dio_ft_model = DigitalBidir.from_supply( self.vss, self.vdd, - voltage_limit_abs=(-0.3, 5.5) * Volt, # table 3.1 - current_limits=(-20, 20) * mAmp, # table 3.1 + voltage_limit_abs=(-0.3, 5.5) * Volt, # table 4-1 + current_limits=(-20, 20) * mAmp, # 4.3.10 output drive current characteristics input_threshold_abs=( # table 3-16 - 0.19 * (self.vdd.link().voltage.lower() - 2.7) + 0.65 + self.vss.link().voltage.lower(), - 0.22 * (self.vdd.link().voltage.upper() - 2.7) + 1.55 + self.vss.link().voltage.upper(), + 0.32 * (self.vdd.link().voltage.lower() - 1.8) + 0.55 + self.vss.link().voltage.lower(), + 0.42 * (self.vdd.link().voltage.upper() - 1.8) + 1.3 + self.vss.link().voltage.upper(), ), - pullup_capable=True, # 35-55 kOhm - pulldown_capable=True, # 35-55 kOhm + pullup_capable=True, # 30-50 kOhm + pulldown_capable=True, # 30-50 kOhm ) self._dio_std_model = DigitalBidir.from_supply( self.vss, self.vdd, - voltage_limit_tolerance=(-0.3, 0.3) * Volt, # table 3.1 - current_limits=(-20, 20) * mAmp, # table 3.1 + voltage_limit_tolerance=(-0.3, 0.3) * Volt, # table 4-1 + current_limits=(-20, 20) * mAmp, # 4.3.10 output drive current characteristics input_threshold_abs=( # table 3-16 - 0.19 * (self.vdd.link().voltage.lower() - 2.7) + 0.65 + self.vss.link().voltage.lower(), - 0.22 * (self.vdd.link().voltage.upper() - 2.7) + 1.55 + self.vss.link().voltage.upper(), + 0.28 * (self.vdd.link().voltage.lower() - 1.8) + 0.6 + self.vss.link().voltage.lower(), + 0.42 * (self.vdd.link().voltage.upper() - 1.8) + 1 + self.vss.link().voltage.upper(), ), - pullup_capable=True, # 35-55 kOhm - pulldown_capable=True, # 35-55 kOhm + pullup_capable=True, # 30-50 kOhm + pulldown_capable=True, # 30-50 kOhm ) - self.swio = self.Port(self._dio_std_model) + self.swdio = self.Port(self._dio_ft_model) + self.swclk = self.Port(self._dio_ft_model) @override def _system_pinmap(self) -> Mapping[Union[Iterable[str], str], Union[Passive, HasPassivePort]]: @@ -175,8 +177,9 @@ def _io_pinmap(self) -> PinMapUtil: adc_model = AnalogSink.from_supply( self.vss, self.vdd, - voltage_limit_tolerance=(-0.3, 0.3) * Volt, # table 3.1 - impedance=(100, float("inf")) * kOhm, + voltage_limit_tolerance=(-0.3, 0.3) * Volt, # table 4-1 + signal_limit_tolerance=(0, 0) * Volt, # table 4-27 conversion range, up to Vref+ up to VddA + # impedance depends on sampling rate ) uart_model = UartPort(DigitalBidir.empty()) @@ -187,31 +190,63 @@ def _io_pinmap(self) -> PinMapUtil: return PinMapUtil( [ # table 2-1 - PinResource("PD4", {"PD4": self._dio_std_model, "A7": adc_model}), - PinResource("PD5", {"PD5": self._dio_std_model, "A5": adc_model}), - PinResource("PD6", {"PD6": self._dio_std_model, "A6": adc_model}), - PinResource("PD7", {"PD7": self._dio_std_model}), # NRST - PinResource("PA1", {"PA1": self._dio_std_model, "A1": adc_model}), - PinResource("PA2", {"PA2": self._dio_std_model, "A0": adc_model}), - PinResource("PD0", {"PD0": self._dio_std_model}), - PinResource("PC0", {"PC0": self._dio_std_model}), - PinResource("PC1", {"PC1": self._dio_ft_model}), - PinResource("PC2", {"PC2": self._dio_ft_model}), - PinResource("PC3", {"PC3": self._dio_std_model}), - PinResource("PC4", {"PC4": self._dio_ft_model, "A2": adc_model}), - PinResource("PC5", {"PC5": self._dio_ft_model}), - PinResource("PC6", {"PC6": self._dio_ft_model}), - PinResource("PC7", {"PC7": self._dio_std_model}), - PinResource("PD1", {"PD1": self._dio_std_model}), # SWIO - PinResource("PD2", {"PD2": self._dio_std_model, "A3": adc_model}), - PinResource("PD3", {"PD3": self._dio_std_model, "A4": adc_model}), + PinResource("PC13-TAMPER-RTC", {"PC13": self._dio_std_model}), + PinResource("PC14-OSC32_IN", {"PC14": self._dio_std_model}), + PinResource("PC15-OSC32_OUT", {"PC15": self._dio_std_model}), + PinResource("OSC_IN", {"PD0": self._dio_std_model}), + PinResource("OSC_OUT", {"PD1": self._dio_std_model}), + PinResource("PA0-WKUP", {"PA0": self._dio_std_model, "ADC_IN0": adc_model}), + PinResource("PA1", {"PA1": self._dio_std_model, "ADC_IN1": adc_model}), + PinResource("PA2", {"PA2": self._dio_std_model, "ADC_IN2": adc_model}), + PinResource("PA3", {"PA3": self._dio_std_model, "ADC_IN3": adc_model}), + PinResource("PA4", {"PA4": self._dio_std_model, "ADC_IN4": adc_model}), + PinResource("PA5", {"PA5": self._dio_std_model, "ADC_IN5": adc_model}), + PinResource("PA6", {"PA6": self._dio_std_model, "ADC_IN6": adc_model}), + PinResource("PA7", {"PA7": self._dio_std_model, "ADC_IN7": adc_model}), + PinResource("PB0", {"PB0": self._dio_std_model, "ADC_IN8": adc_model}), + PinResource("PB1", {"PB1": self._dio_std_model, "ADC_IN9": adc_model}), + PinResource("PB2", {"PB2": self._dio_ft_model}), # BOOT1 + PinResource("PB10", {"PB10": self._dio_ft_model}), + PinResource("PB11", {"PB11": self._dio_ft_model}), + PinResource("PB12", {"PB12": self._dio_ft_model}), + PinResource("PB13", {"PB13": self._dio_ft_model}), + PinResource("PB14", {"PB14": self._dio_ft_model}), + PinResource("PB15", {"PB15": self._dio_ft_model}), + PinResource("PA8", {"PA8": self._dio_ft_model}), + PinResource("PA9", {"PA9": self._dio_ft_model}), + PinResource("PA10", {"PA10": self._dio_ft_model}), + PinResource("PA11", {"PA11": self._dio_ft_model}), + PinResource("PA12", {"PA12": self._dio_ft_model}), # merged w/ SWDIO on some devices + PinResource("PA13", {"PA13": self._dio_ft_model}), # SWDIO + PinResource("PA14", {"PA14": self._dio_ft_model}), # SWCLK + PinResource("PA15", {"PA15": self._dio_ft_model}), + PinResource("PB3", {"PB3": self._dio_ft_model}), + PinResource("PB4", {"PB4": self._dio_ft_model}), + PinResource("PB5", {"PB5": self._dio_ft_model}), + PinResource("PB6", {"PB6": self._dio_ft_model}), + PinResource("PB7", {"PB7": self._dio_ft_model}), + PinResource("PB8", {"PB8": self._dio_ft_model}), # merged w/ BOOT0 on some devices + PinResource("PB9", {"PB9": self._dio_ft_model}), PeripheralFixedResource( - "U", uart_model, {"tx": ["PD5", "PD0", "PD6", "PC0"], "rx": ["PD6", "PD1", "PD5", "PC1"]} + "USART1", uart_model, {"tx": ["PA9", "PB6", "PB15", "PA6"], "rx": ["PA10", "PB7", "PA8", "PA7"]} ), - PeripheralFixedResource("SPI", spi_model, {"sck": ["PC5"], "miso": ["PC7"], "mosi": ["PC6"]}), - PeripheralFixedResource("I2C", i2c_model, {"scl": ["PC2", "PD1", "PC5"], "sda": ["PC1", "PD0", "PC6"]}), + PeripheralFixedResource("USART2", uart_model, {"tx": ["PA2"], "rx": ["PA3"]}), + PeripheralFixedResource("USART3", uart_model, {"tx": ["PB10"], "rx": ["PB11"]}), + PeripheralFixedResource("USART4", uart_model, {"tx": ["PB0", "PA5"], "rx": ["PB1", "PB5"]}), + PeripheralFixedResource("USB", UsbDevicePort(DigitalBidir.empty()), {"dm": ["PA11"], "dp": ["PA12"]}), + PeripheralFixedResource("USBFS", UsbDevicePort(DigitalBidir.empty()), {"dm": ["PB6"], "dp": ["PB7"]}), + PeripheralFixedResource("I2C1", i2c_model, {"scl": ["PB6", "PB8"], "sda": ["PB7", "PB9"]}), + PeripheralFixedResource("I2C1_T", i2c_target_model, {"scl": ["PB6", "PB8"], "sda": ["PB7", "PB9"]}), + PeripheralFixedResource("I2C2", i2c_model, {"scl": ["PB10"], "sda": ["PB11"]}), + PeripheralFixedResource("I2C2_T", i2c_target_model, {"scl": ["PB10"], "sda": ["PB11"]}), PeripheralFixedResource( - "I2C_T", i2c_target_model, {"scl": ["PC2", "PD1", "PC5"], "sda": ["PC1", "PD0", "PC6"]} + "SPI1", spi_model, {"sck": ["PA5", "PB3"], "miso": ["PA6", "PB4"], "mosi": ["PA7", "PB5"]} + ), + PeripheralFixedResource("SPI2", spi_model, {"sck": ["PB13"], "miso": ["PB14"], "mosi": ["PB15"]}), + PeripheralFixedResource( + "CAN", + CanControllerPort(DigitalBidir.empty()), + {"rxd": ["PA11", "PB8"], "txd": ["PA12", "PB9"]}, ), ] ).remap_pins(self._PIN_MAPPING) @@ -222,13 +257,13 @@ def generate(self) -> None: self.footprint( "U", - "Package_SO:TSSOP-20_4.4x6.5mm_P0.65mm", + "Package_QFP:LQFP-32_7x7mm_P0.8mm", self._make_pinning(), mfr="WCH", - part="CH32V003F4P6", + part="CH32V203K8T6", datasheet="https://www.wch-ic.com/downloads/CH32V003DS0_PDF.html", ) - self.assign(self.lcsc_part, "C5187096") + self.assign(self.lcsc_part, "C5372188") self.assign(self.actual_basic_part, False) @@ -236,6 +271,7 @@ class Ch32v203( Resettable, IoControllerI2cTarget, IoControllerUsb, + IoControllerCan, Microcontroller, WithCrystalGenerator, IoControllerPowerRequired, @@ -247,7 +283,7 @@ class Ch32v203( def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) - self.generator_param(self.reset.is_connected()) + self.generator_param(self.reset.is_connected(), self.usb.requested(), self.can.requested()) @override def generate(self) -> None: @@ -273,3 +309,11 @@ def generate(self) -> None: if self.get(self.reset.is_connected()): self.connect(self.reset, self.ic.nrst) + + @override + def _crystal_required(self) -> bool: # crystal needed for CAN or USB b/c tighter freq tolerance + return ( + len(self.get(self.can.requested())) > 0 + or len(self.get(self.usb.requested())) > 0 + or super()._crystal_required() + ) diff --git a/edg/parts/microcontroller/__init__.py b/edg/parts/microcontroller/__init__.py index 53760c553..a167dbf27 100644 --- a/edg/parts/microcontroller/__init__.py +++ b/edg/parts/microcontroller/__init__.py @@ -1,4 +1,5 @@ from .Ch32v003 import Ch32v003, Ch32vSdiHeader, Ch32vSdiHeader254, Ch32vSdiTc2030 +from .Ch32v203 import Ch32v203, Ch32vSdi2Header, Ch32vSdi2Header254, Ch32vSdi2Tc2030 from .Lpc1549 import Lpc1549_48, Lpc1549_64 from .Stm32f103 import Stm32f103_48 from .Stm32f303 import Nucleo_F303k8 diff --git a/examples/test_keyboard.py b/examples/test_keyboard.py index 8808e7a2b..6c914e687 100644 --- a/examples/test_keyboard.py +++ b/examples/test_keyboard.py @@ -22,7 +22,7 @@ def contents(self) -> None: super().contents() self.usb = self.Block(UsbCReceptacle()) - self.reg = self.Block(Ldl1117(3.3 * Volt(tol=0.05))) + self.reg = self.Block(LinearRegulator(3.3 * Volt(tol=0.05))) self.connect(self.usb.gnd, self.reg.gnd) self.connect(self.usb.pwr, self.reg.pwr_in) @@ -30,10 +30,10 @@ def contents(self) -> None: ImplicitConnect(self.reg.pwr_out, [Power]), ImplicitConnect(self.reg.gnd, [Common]), ) as imp: - self.mcu = imp.Block(Stm32f103_48()) + self.mcu = imp.Block(IoController()) self.connect(self.usb.usb, self.mcu.usb.request()) - self.sw = self.Block(SwitchMatrix(nrows=3, ncols=2)) + self.sw = self.Block(SwitchMatrix(nrows=3, ncols=4)) self.connect(self.sw.cols, self.mcu.gpio.request_vector()) self.connect(self.sw.rows, self.mcu.gpio.request_vector()) @@ -41,6 +41,8 @@ def contents(self) -> None: def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ + (IoController, Ch32v203), + (LinearRegulator, Ldl1117), (Switch, KailhSocket), ], ) From e82a25dfb1e8d2f423b93d62f9c26805231520bf Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 13:18:00 -0700 Subject: [PATCH 04/22] Update Ch32v203.py --- edg/parts/microcontroller/Ch32v203.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/edg/parts/microcontroller/Ch32v203.py b/edg/parts/microcontroller/Ch32v203.py index 83ac3fb48..b9cbb623f 100644 --- a/edg/parts/microcontroller/Ch32v203.py +++ b/edg/parts/microcontroller/Ch32v203.py @@ -168,7 +168,7 @@ def _system_pinmap(self) -> Mapping[Union[Iterable[str], str], Union[Passive, Ha "4": self.nrst, "23": self.swdio, # TODO remappable to PA13 "24": self.swclk, # TODO remappable to PA14 - "18": self.vss, # BOOT0, TODO theoretically usable as output-only PB8 + "31": self.vss, # BOOT0, TODO theoretically usable as output-only PB8 } @override @@ -231,18 +231,19 @@ def _io_pinmap(self) -> PinMapUtil: "USART1", uart_model, {"tx": ["PA9", "PB6", "PB15", "PA6"], "rx": ["PA10", "PB7", "PA8", "PA7"]} ), PeripheralFixedResource("USART2", uart_model, {"tx": ["PA2"], "rx": ["PA3"]}), - PeripheralFixedResource("USART3", uart_model, {"tx": ["PB10"], "rx": ["PB11"]}), - PeripheralFixedResource("USART4", uart_model, {"tx": ["PB0", "PA5"], "rx": ["PB1", "PB5"]}), + # unavailable on K8 + # PeripheralFixedResource("USART3", uart_model, {"tx": ["PB10"], "rx": ["PB11"]}), + # PeripheralFixedResource("USART4", uart_model, {"tx": ["PB0", "PA5"], "rx": ["PB1", "PB5"]}), PeripheralFixedResource("USB", UsbDevicePort(DigitalBidir.empty()), {"dm": ["PA11"], "dp": ["PA12"]}), - PeripheralFixedResource("USBFS", UsbDevicePort(DigitalBidir.empty()), {"dm": ["PB6"], "dp": ["PB7"]}), + # PeripheralFixedResource("USBFS", UsbDevicePort(DigitalBidir.empty()), {"dm": ["PB6"], "dp": ["PB7"]}), PeripheralFixedResource("I2C1", i2c_model, {"scl": ["PB6", "PB8"], "sda": ["PB7", "PB9"]}), PeripheralFixedResource("I2C1_T", i2c_target_model, {"scl": ["PB6", "PB8"], "sda": ["PB7", "PB9"]}), - PeripheralFixedResource("I2C2", i2c_model, {"scl": ["PB10"], "sda": ["PB11"]}), - PeripheralFixedResource("I2C2_T", i2c_target_model, {"scl": ["PB10"], "sda": ["PB11"]}), + # PeripheralFixedResource("I2C2", i2c_model, {"scl": ["PB10"], "sda": ["PB11"]}), + # PeripheralFixedResource("I2C2_T", i2c_target_model, {"scl": ["PB10"], "sda": ["PB11"]}), PeripheralFixedResource( "SPI1", spi_model, {"sck": ["PA5", "PB3"], "miso": ["PA6", "PB4"], "mosi": ["PA7", "PB5"]} ), - PeripheralFixedResource("SPI2", spi_model, {"sck": ["PB13"], "miso": ["PB14"], "mosi": ["PB15"]}), + # PeripheralFixedResource("SPI2", spi_model, {"sck": ["PB13"], "miso": ["PB14"], "mosi": ["PB15"]}), PeripheralFixedResource( "CAN", CanControllerPort(DigitalBidir.empty()), @@ -261,7 +262,7 @@ def generate(self) -> None: self._make_pinning(), mfr="WCH", part="CH32V203K8T6", - datasheet="https://www.wch-ic.com/downloads/CH32V003DS0_PDF.html", + datasheet="https://www.wch-ic.com/downloads/CH32V203DS0_PDF.html", ) self.assign(self.lcsc_part, "C5372188") self.assign(self.actual_basic_part, False) From 4d8796ee69604e320dd0625a3bb992005e7a0083 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 13:20:37 -0700 Subject: [PATCH 05/22] Update test_keyboard.py --- examples/test_keyboard.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/examples/test_keyboard.py b/examples/test_keyboard.py index 6c914e687..d7a429587 100644 --- a/examples/test_keyboard.py +++ b/examples/test_keyboard.py @@ -33,10 +33,24 @@ def contents(self) -> None: self.mcu = imp.Block(IoController()) self.connect(self.usb.usb, self.mcu.usb.request()) + # debugging LEDs + (self.ledr,), _ = self.chain(imp.Block(IndicatorSinkLed(Led.Red)), self.mcu.gpio.request("led")) + self.sw = self.Block(SwitchMatrix(nrows=3, ncols=4)) self.connect(self.sw.cols, self.mcu.gpio.request_vector()) self.connect(self.sw.rows, self.mcu.gpio.request_vector()) + self.enc = imp.Block(DigitalRotaryEncoder()) + self.connect(self.enc.a, self.mcu.gpio.request("enc_a")) + self.connect(self.enc.b, self.mcu.gpio.request("enc_b")) + self.connect(self.enc.with_mixin(DigitalRotaryEncoderSwitch()).sw, self.mcu.gpio.request("enc_sw")) + + self.oled = imp.Block(Er_Oled_096_1_1()) + self.connect(self.mcu.spi.request("spi"), self.oled.spi) + self.connect(self.mcu.gpio.request("oled_cs"), self.oled.cs) + self.connect(self.mcu.gpio.request("oled_dc"), self.oled.dc) + self.connect(self.mcu.gpio.request("oled_reset"), self.oled.reset) + @override def refinements(self) -> Refinements: return super().refinements() + Refinements( @@ -44,6 +58,7 @@ def refinements(self) -> Refinements: (IoController, Ch32v203), (LinearRegulator, Ldl1117), (Switch, KailhSocket), + (RotaryEncoder, Pec11s), ], ) From 15a1e798cc5921f755939d7aa92ab51175e4fe0c Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 13:32:19 -0700 Subject: [PATCH 06/22] wip switch cell construct --- edg/circuits/SwitchMatrix.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index b6be74673..fb4d9d4c7 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -5,6 +5,32 @@ from ..abstract_parts import * +class SwitchCell(InternalBlock): + """A single cell in the switch matrix, consisting of a switch and diode, passive-typed. + Provides a layer of hierarchy for layout replication.""" + + def __init__(self, sw_voltage: RangeLike, d_voltage: RangeLike, current_drawn: RangeLike, voltage_drop: RangeLike): + super().__init__() + self.sw_voltage = self.ArgParameter(sw_voltage) + self.d_voltage = self.ArgParameter(d_voltage) + self.current_drawn = self.ArgParameter(current_drawn) + self.voltage_drop = self.ArgParameter(voltage_drop) + + self.row = self.Port(Passive()) # diode anode, externally pulled, driven to col by switch closure + self.col = self.Port(Passive()) # switch common, externally driven for column scan + + @override + def contents(self) -> None: + super().contents() + self.sw = self.Block(Switch(voltage=self.sw_voltage, current=self.current_drawn)) + self.d = self.Block( + Diode(current=self.current_drawn, reverse_voltage=self.d_voltage, voltage_drop=self.voltage_drop) + ) + self.connect(self.d.anode, self.row) + self.connect(self.d.cathode, self.sw.sw) + self.connect(self.sw.com, self.col) + + class SwitchMatrix(HumanInterface, GeneratorBlock, SvgPcbTemplateBlock): """A switch matrix, such as for a keyboard, that generates (nrows * ncols) switches while only using max(nrows, ncols) IOs. From 4dac54fa08cd02088a013e73b96f3db77d592eec Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 14:53:46 -0700 Subject: [PATCH 07/22] Update SwitchMatrix.py --- edg/circuits/SwitchMatrix.py | 78 +++++++++++++----------------------- 1 file changed, 27 insertions(+), 51 deletions(-) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index fb4d9d4c7..33f34755d 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -6,29 +6,39 @@ class SwitchCell(InternalBlock): - """A single cell in the switch matrix, consisting of a switch and diode, passive-typed. + """A single cell in the switch matrix, consisting of a switch and diode. Provides a layer of hierarchy for layout replication.""" - def __init__(self, sw_voltage: RangeLike, d_voltage: RangeLike, current_drawn: RangeLike, voltage_drop: RangeLike): + def __init__(self, voltage_drop: RangeLike): super().__init__() - self.sw_voltage = self.ArgParameter(sw_voltage) - self.d_voltage = self.ArgParameter(d_voltage) - self.current_drawn = self.ArgParameter(current_drawn) self.voltage_drop = self.ArgParameter(voltage_drop) - self.row = self.Port(Passive()) # diode anode, externally pulled, driven to col by switch closure - self.col = self.Port(Passive()) # switch common, externally driven for column scan + self.col = self.Port(DigitalSink()) # switch common, externally driven for column scan, assumed ideal + self.row = self.Port( + DigitalSource( # diode anode, externally pulled, driven to col by switch closure + voltage_out=self.col.link().voltage.lower() + voltage_drop, # use spec to avoid circular dependency + output_thresholds=(self.col.link().voltage + voltage_drop).hull(float("inf")), + low_driver=True, + high_driver=False, + ) + ) @override def contents(self) -> None: super().contents() - self.sw = self.Block(Switch(voltage=self.sw_voltage, current=self.current_drawn)) + self.sw = self.Block( + Switch(voltage=self.row.link().voltage - self.col.link().voltage, current=self.row.link().current_drawn) + ) self.d = self.Block( - Diode(current=self.current_drawn, reverse_voltage=self.d_voltage, voltage_drop=self.voltage_drop) + Diode( + current=self.row.link().current_drawn, + reverse_voltage=(self.row.link().voltage - self.col.link().voltage).abs(), + voltage_drop=self.voltage_drop, + ) ) - self.connect(self.d.anode, self.row) + self.connect(self.d.anode, self.row.net) self.connect(self.d.cathode, self.sw.sw) - self.connect(self.sw.com, self.col) + self.connect(self.sw.com, self.col.net) class SwitchMatrix(HumanInterface, GeneratorBlock, SvgPcbTemplateBlock): @@ -158,50 +168,16 @@ def __init__(self, nrows: IntLike, ncols: IntLike, voltage_drop: RangeLike = (0, def generate(self) -> None: super().generate() - # generate row (output) ports with forward declaration for row in range(self.get(self.nrows)): - self.rows.append_elt( - DigitalSource( # modeled as low-side driver - voltage_out=RangeExpr(), - output_thresholds=RangeExpr(), - low_driver=True, - high_driver=False, - ), - str(row), - ) + self.rows.append_elt(DigitalSource.empty(), str(row)) - # generate parts and column (input) ports and aggregate parameters for row ports - self.sw = ElementDict[Switch]() - self.d = ElementDict[Diode]() - row_voltages = [RangeExpr._to_expr_type(RangeExpr.EMPTY)] * self.get(self.nrows) - row_thresholds = [FloatExpr._to_expr_type(float("-inf"))] * self.get(self.nrows) + self.sw = ElementDict[SwitchCell]() for col in range(self.get(self.ncols)): - # ideal, negligible current draw (assumed) and thresholds checked at other side - col_port = self.cols.append_elt(DigitalSink(), str(col)) + col_port = self.cols.append_elt(DigitalSink.empty(), str(col)) for row in range(self.get(self.nrows)): - row_port = self.rows[str(row)] - sw = self.sw[f"{col},{row}"] = self.Block( - Switch(voltage=row_port.link().voltage, current=row_port.link().current_drawn) - ) - d = self.d[f"{col},{row}"] = self.Block( - Diode( - current=row_port.link().current_drawn, - # col voltage is used as a proxy, since (properly) using the row voltage causes a circular dependency - reverse_voltage=col_port.link().voltage, - voltage_drop=self.voltage_drop, - ) - ) - lowest_output = col_port.link().voltage.lower() + d.actual_voltage_drop.lower() - highest_output = col_port.link().output_thresholds.lower() + d.actual_voltage_drop.upper() - row_voltages[row] = row_voltages[row].hull((lowest_output, highest_output)) - row_thresholds[row] = row_thresholds[row].max(highest_output) - self.connect(d.anode, row_port.net) - self.connect(d.cathode, sw.sw) - self.connect(sw.com, col_port.net) - - for row in range(self.get(self.nrows)): - self.assign(self.rows[str(row)].voltage_out, row_voltages[row]) - self.assign(self.rows[str(row)].output_thresholds, (row_thresholds[row], float("inf"))) + cell = self.sw[f"{col},{row}"] = self.Block(SwitchCell(voltage_drop=self.voltage_drop)) + self.connect(cell.col, col_port) + self.connect(cell.row, self.rows[str(row)]) self.rows.defined() self.cols.defined() From 621241a0904a38da056741f1717d389df29509fb Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 15:08:23 -0700 Subject: [PATCH 08/22] wip neopixels mixin --- edg/circuits/SwitchMatrix.py | 82 ++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index 33f34755d..9583c159a 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -1,8 +1,9 @@ -from typing import cast, Optional, Tuple +from typing import cast, Optional, Tuple, Any from typing_extensions import override from ..abstract_parts import * +from ..parts.human_interface.Neopixel import Neopixel class SwitchCell(InternalBlock): @@ -41,6 +42,32 @@ def contents(self) -> None: self.connect(self.sw.com, self.col.net) +@abstract_block_default(lambda: SwitchCellNeopixelImp) +class SwitchCellNeopixel(BlockInterfaceMixin[SwitchCell], InternalBlock): + """SwitchCell mixin that adds a neopixel to the switch cell, with power and data ports.""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + self.npx_din = self.Port(DigitalSink.empty()) + self.npx_dout = self.Port(DigitalSource.empty(), optional=True) + self.npx_pwr = self.Port(VoltageSink.empty()) + self.npx_gnd = self.Port(Ground.empty()) + + +class SwitchCellNeopixelImp(SwitchCellNeopixel, SwitchCell, InternalBlock): + """SwitchCell implementation with neopixel.""" + + @override + def contents(self) -> None: + super().contents() + self.npx = self.Block(Neopixel()) + self.connect(self.npx.pwr, self.npx_pwr) + self.connect(self.npx.gnd, self.npx_gnd) + self.connect(self.npx.din, self.npx_din) + self.connect(self.npx.dout, self.npx_dout) + + class SwitchMatrix(HumanInterface, GeneratorBlock, SvgPcbTemplateBlock): """A switch matrix, such as for a keyboard, that generates (nrows * ncols) switches while only using max(nrows, ncols) IOs. @@ -59,17 +86,17 @@ def _svgpcb_fn_name_adds(self) -> Optional[str]: @override def _svgpcb_template(self) -> str: - switch_block = self._svgpcb_footprint_block_path_of(["sw[0,0]"]) - diode_block = self._svgpcb_footprint_block_path_of(["d[0,0]"]) - switch_reftype, switch_refnum = self._svgpcb_refdes_of(["sw[0,0]"]) - diode_reftype, diode_refnum = self._svgpcb_refdes_of(["d[0,0]"]) + switch_block = self._svgpcb_footprint_block_path_of(["sw[0,0]", "sw"]) + diode_block = self._svgpcb_footprint_block_path_of(["sw[0,0]", "d"]) + switch_reftype, switch_refnum = self._svgpcb_refdes_of(["sw[0,0]", "sw"]) + diode_reftype, diode_refnum = self._svgpcb_refdes_of(["sw[0,0]", "d"]) assert switch_block is not None and diode_block is not None switch_footprint = self._svgpcb_footprint_of(switch_block) - switch_sw_pin = self._svgpcb_pin_of(["sw[0,0]"], ["sw"]) - switch_com_pin = self._svgpcb_pin_of(["sw[0,0]"], ["com"]) + switch_sw_pin = self._svgpcb_pin_of(["sw[0,0]", "sw"], ["sw"]) + switch_com_pin = self._svgpcb_pin_of(["sw[0,0]", "sw"], ["com"]) diode_footprint = self._svgpcb_footprint_of(diode_block) - diode_a_pin = self._svgpcb_pin_of(["d[0,0]"], ["anode"]) - diode_k_pin = self._svgpcb_pin_of(["d[0,0]"], ["cathode"]) + diode_a_pin = self._svgpcb_pin_of(["sw[0,0]", "d"], ["anode"]) + diode_k_pin = self._svgpcb_pin_of(["sw[0,0]", "d"], ["cathode"]) assert all([pin is not None for pin in [switch_sw_pin, switch_com_pin, diode_a_pin, diode_k_pin]]) return f"""\ @@ -181,3 +208,40 @@ def generate(self) -> None: self.rows.defined() self.cols.defined() + + +@abstract_block_default(lambda: SwitchMatrixNeopixelsImp) +class SwitchMatrixNeopixels(BlockInterfaceMixin[SwitchMatrix]): + """SwitchMatrix mixin that adds a neopixel on every switch element, in the SwitchCell hierarchy block. + Adds power and data ports for the chain. + + npx_order can be: + - "row": chains neopixels in row order + - "row_snake": chains neopixels in row order, reversing direction every other row + - "col": chains neopixels in column order + - "col_snake": chains neopixels in col order, reversing direction every other col + """ + + def __init__(self, *args: Any, npx_order: StringLike, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.npx_order = self.ArgParameter(npx_order) + + self.npx_din = self.Port(DigitalSink.empty()) + self.npx_dout = self.Port(DigitalSource.empty(), optional=True) + self.npx_pwr = self.Port(VoltageSink.empty()) + self.npx_gnd = self.Port(Ground.empty()) + + +class SwitchMatrixNeopixelsImp(SwitchMatrixNeopixels, SwitchMatrix, HumanInterface, GeneratorBlock): + """SwitchMatrix implementation with neopixel chain.""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.generator_param(self.npx_order) + + @override + def generate(self) -> None: + super().generate() + + npx_order = self.get(self.npx_order) + # TODO IMPLEMENT ME From 4e72b9e3ea41efa5313e8f46a0cd2e29c0e48d95 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 15:15:16 -0700 Subject: [PATCH 09/22] neopixel into abstract parts, clean up swm --- edg/BoardTop.py | 1 + edg/abstract_parts/Neopixel.py | 14 +++++++++ edg/abstract_parts/__init__.py | 1 + edg/circuits/SwitchMatrix.py | 41 +++++++++++++++++---------- edg/parts/human_interface/Neopixel.py | 14 --------- 5 files changed, 42 insertions(+), 29 deletions(-) create mode 100644 edg/abstract_parts/Neopixel.py diff --git a/edg/BoardTop.py b/edg/BoardTop.py index e291b30b1..5b29db04d 100644 --- a/edg/BoardTop.py +++ b/edg/BoardTop.py @@ -44,6 +44,7 @@ def refinements(self) -> Refinements: (SwdCortexTargetConnector, SwdCortexTargetHeader), (SpiMemory, W25q), (Speaker, ConnectorSpeaker), + (Neopixel, Ws2812b), ], class_values=[ (SelectorArea, ["footprint_area"], Range.from_lower(4.0)), # at least 0603 diff --git a/edg/abstract_parts/Neopixel.py b/edg/abstract_parts/Neopixel.py new file mode 100644 index 000000000..93377b6e4 --- /dev/null +++ b/edg/abstract_parts/Neopixel.py @@ -0,0 +1,14 @@ +from ..electronics_interfaces import * + + +class Neopixel(Light, Block): + """Abstract base class for individually-addressable, serially-connected Neopixel-type + (typically RGB) LEDs and defines the pwr/gnd/din/dout interface.""" + + def __init__(self) -> None: + super().__init__() + self.pwr = self.Port(VoltageSink.empty(), [Power]) + self.vdd = self.pwr # deprecated alias + self.gnd = self.Port(Ground.empty(), [Common]) + self.din = self.Port(DigitalSink.empty(), [Input]) + self.dout = self.Port(DigitalSource.empty(), optional=True) diff --git a/edg/abstract_parts/__init__.py b/edg/abstract_parts/__init__.py index 9448e81f1..200fcc9e4 100644 --- a/edg/abstract_parts/__init__.py +++ b/edg/abstract_parts/__init__.py @@ -81,6 +81,7 @@ from .Antenna import Antenna, TableAntenna from .SolidStateRelay import SolidStateRelay, VoltageIsolatedSwitch, AnalogIsolatedSwitch from .AnalogSwitch import AnalogSwitch, AnalogSwitchTree, AnalogDemuxer, AnalogMuxer +from .Neopixel import Neopixel from .Switch import Switch, TactileSwitch, MechanicalKeyswitch, DigitalSwitch from .Switch import RotaryEncoder, RotaryEncoderSwitch, DigitalRotaryEncoder, DigitalRotaryEncoderSwitch from .Switch import DirectionSwitch, DirectionSwitchCenter, DigitalDirectionSwitch, DigitalDirectionSwitchCenter diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index 9583c159a..1e99c948c 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -1,12 +1,12 @@ -from typing import cast, Optional, Tuple, Any +from typing import Optional, Tuple, Any from typing_extensions import override from ..abstract_parts import * -from ..parts.human_interface.Neopixel import Neopixel -class SwitchCell(InternalBlock): +@abstract_block_default(lambda: SwitchCell) +class BaseSwitchCell(InternalBlock, Block): """A single cell in the switch matrix, consisting of a switch and diode. Provides a layer of hierarchy for layout replication.""" @@ -24,6 +24,10 @@ def __init__(self, voltage_drop: RangeLike): ) ) + +class SwitchCell(BaseSwitchCell, InternalBlock): + """Implementation of the switch cell""" + @override def contents(self) -> None: super().contents() @@ -43,7 +47,7 @@ def contents(self) -> None: @abstract_block_default(lambda: SwitchCellNeopixelImp) -class SwitchCellNeopixel(BlockInterfaceMixin[SwitchCell], InternalBlock): +class SwitchCellNeopixel(BlockInterfaceMixin[BaseSwitchCell], InternalBlock): """SwitchCell mixin that adds a neopixel to the switch cell, with power and data ports.""" def __init__(self, *args: Any, **kwargs: Any) -> None: @@ -68,7 +72,21 @@ def contents(self) -> None: self.connect(self.npx.dout, self.npx_dout) -class SwitchMatrix(HumanInterface, GeneratorBlock, SvgPcbTemplateBlock): +@abstract_block_default(lambda: SwitchMatrix) +class BaseSwitchMatrix(InternalBlock, Block): + + def __init__(self, nrows: IntLike, ncols: IntLike, voltage_drop: RangeLike = (0, 0.7) * Volt): + super().__init__() + + self.rows = self.Port(Vector(DigitalSource.empty())) + self.cols = self.Port(Vector(DigitalSink.empty())) + self.voltage_drop = self.ArgParameter(voltage_drop) + + self.nrows = self.ArgParameter(nrows) + self.ncols = self.ArgParameter(ncols) + + +class SwitchMatrix(BaseSwitchMatrix, HumanInterface, GeneratorBlock, SvgPcbTemplateBlock): """A switch matrix, such as for a keyboard, that generates (nrows * ncols) switches while only using max(nrows, ncols) IOs. @@ -180,15 +198,8 @@ def _svgpcb_bbox(self) -> Tuple[float, float, float, float]: (self._svgpcb_get(self.nrows) + 1) * 0.5 * 25.4 + 1.0, ) - def __init__(self, nrows: IntLike, ncols: IntLike, voltage_drop: RangeLike = (0, 0.7) * Volt): - super().__init__() - - self.rows = self.Port(Vector(DigitalSource.empty())) - self.cols = self.Port(Vector(DigitalSink.empty())) - self.voltage_drop = self.ArgParameter(voltage_drop) - - self.nrows = self.ArgParameter(nrows) - self.ncols = self.ArgParameter(ncols) + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) self.generator_param(self.nrows, self.ncols) @override @@ -211,7 +222,7 @@ def generate(self) -> None: @abstract_block_default(lambda: SwitchMatrixNeopixelsImp) -class SwitchMatrixNeopixels(BlockInterfaceMixin[SwitchMatrix]): +class SwitchMatrixNeopixels(BlockInterfaceMixin[BaseSwitchMatrix]): """SwitchMatrix mixin that adds a neopixel on every switch element, in the SwitchCell hierarchy block. Adds power and data ports for the chain. diff --git a/edg/parts/human_interface/Neopixel.py b/edg/parts/human_interface/Neopixel.py index 27147c68c..440ab6e97 100644 --- a/edg/parts/human_interface/Neopixel.py +++ b/edg/parts/human_interface/Neopixel.py @@ -6,20 +6,6 @@ from ...vendor_parts.jlc.JlcPart import JlcPart -@abstract_block_default(lambda: Ws2812b) -class Neopixel(Light, Block): - """Abstract base class for individually-addressable, serially-connected Neopixel-type - (typically RGB) LEDs and defines the pwr/gnd/din/dout interface.""" - - def __init__(self) -> None: - super().__init__() - self.pwr = self.Port(VoltageSink.empty(), [Power]) - self.vdd = self.pwr # deprecated alias - self.gnd = self.Port(Ground.empty(), [Common]) - self.din = self.Port(DigitalSink.empty(), [Input]) - self.dout = self.Port(DigitalSource.empty(), optional=True) - - class Ws2812b(Neopixel, FootprintBlock, JlcPart): """5050-size Neopixel RGB. Specifically does NOT need extra filtering capacitors.""" From 4cf956d29a2d731ab329a8728a4fac53475194a5 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 15:18:56 -0700 Subject: [PATCH 10/22] Update SwitchMatrix.py --- edg/circuits/SwitchMatrix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index 1e99c948c..9588d9e0c 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -233,7 +233,7 @@ class SwitchMatrixNeopixels(BlockInterfaceMixin[BaseSwitchMatrix]): - "col_snake": chains neopixels in col order, reversing direction every other col """ - def __init__(self, *args: Any, npx_order: StringLike, **kwargs: Any) -> None: + def __init__(self, *args: Any, npx_order: StringLike = "row_snake", **kwargs: Any) -> None: super().__init__(*args, **kwargs) self.npx_order = self.ArgParameter(npx_order) From 71b5ef56c2ccd433acae62af183e2fe0f251ed4e Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 15:20:23 -0700 Subject: [PATCH 11/22] Update SwitchMatrix.py --- edg/circuits/SwitchMatrix.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index 9588d9e0c..b23375f23 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -223,14 +223,14 @@ def generate(self) -> None: @abstract_block_default(lambda: SwitchMatrixNeopixelsImp) class SwitchMatrixNeopixels(BlockInterfaceMixin[BaseSwitchMatrix]): - """SwitchMatrix mixin that adds a neopixel on every switch element, in the SwitchCell hierarchy block. + """SwitchMatrix mixin that adds a neopixel with every switch, in the SwitchCell hierarchy block. Adds power and data ports for the chain. npx_order can be: - - "row": chains neopixels in row order - - "row_snake": chains neopixels in row order, reversing direction every other row - - "col": chains neopixels in column order - - "col_snake": chains neopixels in col order, reversing direction every other col + - "row": chains neopixels across a row before moving to the next row + - "row_snake": above, but reversing direction every other row + - "col": chains neopixels across a column before moving to the next column + - "col_snake": above, but reversing direction every other col """ def __init__(self, *args: Any, npx_order: StringLike = "row_snake", **kwargs: Any) -> None: From d4bda5f3380cdc81a94fd315b6262f1c1e5ae6eb Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 15:31:16 -0700 Subject: [PATCH 12/22] wip --- edg/circuits/SwitchMatrix.py | 17 ++++++++--------- edg/circuits/__init__.py | 2 +- examples/test_keyboard.py | 4 ++++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index b23375f23..8401ba752 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -72,8 +72,8 @@ def contents(self) -> None: self.connect(self.npx.dout, self.npx_dout) -@abstract_block_default(lambda: SwitchMatrix) -class BaseSwitchMatrix(InternalBlock, Block): +@abstract_block_default(lambda: SwitchDiodeMatrix) +class SwitchMatrix(InternalBlock, Block): def __init__(self, nrows: IntLike, ncols: IntLike, voltage_drop: RangeLike = (0, 0.7) * Volt): super().__init__() @@ -86,16 +86,15 @@ def __init__(self, nrows: IntLike, ncols: IntLike, voltage_drop: RangeLike = (0, self.ncols = self.ArgParameter(ncols) -class SwitchMatrix(BaseSwitchMatrix, HumanInterface, GeneratorBlock, SvgPcbTemplateBlock): +class SwitchDiodeMatrix(SwitchMatrix, HumanInterface, GeneratorBlock, SvgPcbTemplateBlock): """A switch matrix, such as for a keyboard, that generates (nrows * ncols) switches while only using max(nrows, ncols) IOs. Internally, the switches are in a matrix, with the driver driving one col low at a time while - reading which rows are low (with the other cols weakly pulled high). - This uses the Switch abstract class, which can be refined into e.g. a tactile switch or mechanical keyswitch. + reading which rows are low (with the other cols floating or weakly pulled high). + Internally, this uses the Switch abstract block, which can be refined into e.g. a tactile switch or mechanical keyswitch. This generates per-switch diodes which allows multiple keys to be pressed simultaneously. - Diode anodes are attached to the rows, while cathodes go through each switch to the cols. """ @override @@ -221,8 +220,8 @@ def generate(self) -> None: self.cols.defined() -@abstract_block_default(lambda: SwitchMatrixNeopixelsImp) -class SwitchMatrixNeopixels(BlockInterfaceMixin[BaseSwitchMatrix]): +@abstract_block_default(lambda: SwitchDiodeMatrixNeopixelsImp) +class SwitchMatrixNeopixels(BlockInterfaceMixin[SwitchMatrix]): """SwitchMatrix mixin that adds a neopixel with every switch, in the SwitchCell hierarchy block. Adds power and data ports for the chain. @@ -243,7 +242,7 @@ def __init__(self, *args: Any, npx_order: StringLike = "row_snake", **kwargs: An self.npx_gnd = self.Port(Ground.empty()) -class SwitchMatrixNeopixelsImp(SwitchMatrixNeopixels, SwitchMatrix, HumanInterface, GeneratorBlock): +class SwitchDiodeMatrixNeopixelsImp(SwitchMatrixNeopixels, SwitchDiodeMatrix, HumanInterface, GeneratorBlock): """SwitchMatrix implementation with neopixel chain.""" def __init__(self, *args: Any, **kwargs: Any) -> None: diff --git a/edg/circuits/__init__.py b/edg/circuits/__init__.py index 7d3246713..59511aa82 100644 --- a/edg/circuits/__init__.py +++ b/edg/circuits/__init__.py @@ -19,7 +19,7 @@ from .BootstrapVoltageAdder import BootstrapVoltageAdder from .LedMatrix import CharlieplexedLedMatrix -from .SwitchMatrix import SwitchMatrix +from .SwitchMatrix import SwitchMatrix, SwitchMatrixNeopixels from .ResistiveSensor import ConnectorResistiveSensor from .ControlCircuits import CompensatorType2 diff --git a/examples/test_keyboard.py b/examples/test_keyboard.py index d7a429587..9682f65e1 100644 --- a/examples/test_keyboard.py +++ b/examples/test_keyboard.py @@ -39,6 +39,10 @@ def contents(self) -> None: self.sw = self.Block(SwitchMatrix(nrows=3, ncols=4)) self.connect(self.sw.cols, self.mcu.gpio.request_vector()) self.connect(self.sw.rows, self.mcu.gpio.request_vector()) + sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels()) + self.connect(self.mcu.gpio.request("npx"), sw_npx.npx_din) + self.connect(self.usb.pwr, sw_npx.npx_pwr) + self.connect(self.usb.gnd, sw_npx.npx_gnd) self.enc = imp.Block(DigitalRotaryEncoder()) self.connect(self.enc.a, self.mcu.gpio.request("enc_a")) From 20d10637a93152606df0d2126d53afd7c8a0f3ff Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 15:41:55 -0700 Subject: [PATCH 13/22] Update SwitchMatrix.py --- edg/circuits/SwitchMatrix.py | 49 ++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index 8401ba752..fa4d74336 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -1,12 +1,12 @@ -from typing import Optional, Tuple, Any +from typing import Optional, Tuple, Any, List from typing_extensions import override from ..abstract_parts import * -@abstract_block_default(lambda: SwitchCell) -class BaseSwitchCell(InternalBlock, Block): +@abstract_block_default(lambda: DiodeSwitchCell) +class SwitchCell(InternalBlock, Block): """A single cell in the switch matrix, consisting of a switch and diode. Provides a layer of hierarchy for layout replication.""" @@ -25,7 +25,7 @@ def __init__(self, voltage_drop: RangeLike): ) -class SwitchCell(BaseSwitchCell, InternalBlock): +class DiodeSwitchCell(SwitchCell, InternalBlock): """Implementation of the switch cell""" @override @@ -46,8 +46,8 @@ def contents(self) -> None: self.connect(self.sw.com, self.col.net) -@abstract_block_default(lambda: SwitchCellNeopixelImp) -class SwitchCellNeopixel(BlockInterfaceMixin[BaseSwitchCell], InternalBlock): +@abstract_block_default(lambda: DiodeSwitchCellNeopixelImp) +class SwitchCellNeopixel(BlockInterfaceMixin[SwitchCell], InternalBlock): """SwitchCell mixin that adds a neopixel to the switch cell, with power and data ports.""" def __init__(self, *args: Any, **kwargs: Any) -> None: @@ -59,7 +59,7 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.npx_gnd = self.Port(Ground.empty()) -class SwitchCellNeopixelImp(SwitchCellNeopixel, SwitchCell, InternalBlock): +class DiodeSwitchCellNeopixelImp(SwitchCellNeopixel, DiodeSwitchCell, InternalBlock): """SwitchCell implementation with neopixel.""" @override @@ -208,7 +208,7 @@ def generate(self) -> None: for row in range(self.get(self.nrows)): self.rows.append_elt(DigitalSource.empty(), str(row)) - self.sw = ElementDict[SwitchCell]() + self.sw = ElementDict[DiodeSwitchCell]() for col in range(self.get(self.ncols)): col_port = self.cols.append_elt(DigitalSink.empty(), str(col)) for row in range(self.get(self.nrows)): @@ -220,7 +220,7 @@ def generate(self) -> None: self.cols.defined() -@abstract_block_default(lambda: SwitchDiodeMatrixNeopixelsImp) +@abstract_block_default(lambda: SwitchDiodeMatrixNeopixels) class SwitchMatrixNeopixels(BlockInterfaceMixin[SwitchMatrix]): """SwitchMatrix mixin that adds a neopixel with every switch, in the SwitchCell hierarchy block. Adds power and data ports for the chain. @@ -242,7 +242,7 @@ def __init__(self, *args: Any, npx_order: StringLike = "row_snake", **kwargs: An self.npx_gnd = self.Port(Ground.empty()) -class SwitchDiodeMatrixNeopixelsImp(SwitchMatrixNeopixels, SwitchDiodeMatrix, HumanInterface, GeneratorBlock): +class SwitchDiodeMatrixNeopixels(SwitchMatrixNeopixels, SwitchDiodeMatrix, HumanInterface, GeneratorBlock): """SwitchMatrix implementation with neopixel chain.""" def __init__(self, *args: Any, **kwargs: Any) -> None: @@ -254,4 +254,31 @@ def generate(self) -> None: super().generate() npx_order = self.get(self.npx_order) - # TODO IMPLEMENT ME + switch_cells: List[DiodeSwitchCell] = [] + + if npx_order in ("row", "row_snake"): + for row in range(self.get(self.nrows)): + cols = range(self.get(self.ncols)) + if npx_order == "row_snake" and row % 2 == 1: + cols = reversed(cols) + for col in cols: + switch_cells.append(self.sw[f"{col},{row}"]) + elif npx_order in ("col", "col_snake"): + for col in range(self.get(self.ncols)): + rows = range(self.get(self.nrows)) + if npx_order == "col_snake" and col % 2 == 1: + rows = reversed(rows) + for row in rows: + switch_cells.append(self.sw[f"{col},{row}"]) + else: + raise ValueError(f"Invalid npx_order {npx_order}") + + last_npx_dout = self.npx_din + for switch_cell in switch_cells: + cell_npx = switch_cell.with_mixin(SwitchCellNeopixel()) + self.connect(self.npx_pwr, cell_npx.npx_pwr) + self.connect(self.npx_gnd, cell_npx.npx_gnd) + self.connect(cell_npx.npx_din, last_npx_dout) + last_npx_dout = cell_npx.npx_dout + + self.connect(last_npx_dout, self.npx_dout) From 2e9352c4fe7d82b51d70ba9bd92b6ac8c128811e Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 15:50:26 -0700 Subject: [PATCH 14/22] Update test_keyboard.py --- examples/test_keyboard.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/examples/test_keyboard.py b/examples/test_keyboard.py index 9682f65e1..e751181a0 100644 --- a/examples/test_keyboard.py +++ b/examples/test_keyboard.py @@ -39,10 +39,6 @@ def contents(self) -> None: self.sw = self.Block(SwitchMatrix(nrows=3, ncols=4)) self.connect(self.sw.cols, self.mcu.gpio.request_vector()) self.connect(self.sw.rows, self.mcu.gpio.request_vector()) - sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels()) - self.connect(self.mcu.gpio.request("npx"), sw_npx.npx_din) - self.connect(self.usb.pwr, sw_npx.npx_pwr) - self.connect(self.usb.gnd, sw_npx.npx_gnd) self.enc = imp.Block(DigitalRotaryEncoder()) self.connect(self.enc.a, self.mcu.gpio.request("enc_a")) @@ -55,6 +51,19 @@ def contents(self) -> None: self.connect(self.mcu.gpio.request("oled_dc"), self.oled.dc) self.connect(self.mcu.gpio.request("oled_reset"), self.oled.reset) + # Vbus DOMAIN + + with self.implicit_connect( + ImplicitConnect(self.usb.pwr, [Power]), + ImplicitConnect(self.usb.gnd, [Common]), + ) as imp: + sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels()) + self.connect(self.usb.gnd, sw_npx.npx_gnd) + self.connect(self.usb.pwr, sw_npx.npx_pwr) + (self.npx_shift, self.npx_tp), _ = self.chain( + self.mcu.gpio.request("npx"), imp.Block(L74Ahct1g125()), imp.Block(DigitalTestPoint()), sw_npx.npx_din + ) + @override def refinements(self) -> Refinements: return super().refinements() + Refinements( @@ -62,8 +71,13 @@ def refinements(self) -> Refinements: (IoController, Ch32v203), (LinearRegulator, Ldl1117), (Switch, KailhSocket), + (Neopixel, Sk6812Mini_E), (RotaryEncoder, Pec11s), ], + instance_values=[(["mcu", "pin_assigns"], [])], # TODO pining: NPX must be SPI MOSI + class_values=[ + (Sk6812Mini_E, ["pwr", "current_draw"], Range(0.001, 0.030)), # don't run at full power + ], ) From 544549f1ca7098ab152198a80df7e71106e469be Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 15:59:02 -0700 Subject: [PATCH 15/22] wip --- examples/BasicKeyboard/BasicKeyboard.net.ref | 180 +-- .../BasicKeyboard/BasicKeyboard.svgpcb.js | 16 +- examples/BleJoystick/BleJoystick_btns.net.ref | 152 +- .../DeskController/DeskController.net.ref | 180 +-- .../DeskController/DeskController.svgpcb.js | 16 +- examples/Keyboard/Keyboard.net.ref | 1303 +++++++++++++---- examples/Keyboard/Keyboard.svgpcb.js | 243 ++- examples/test_keyboard.py | 5 +- 8 files changed, 1488 insertions(+), 607 deletions(-) diff --git a/examples/BasicKeyboard/BasicKeyboard.net.ref b/examples/BasicKeyboard/BasicKeyboard.net.ref index eaf128f3f..7df6f83e8 100644 --- a/examples/BasicKeyboard/BasicKeyboard.net.ref +++ b/examples/BasicKeyboard/BasicKeyboard.net.ref @@ -13,149 +13,149 @@ (sheetpath (names "/") (tstamps "/")) (tstamps "02850146")) (comp (ref "SW1") - (value "sw.sw[0,0]") + (value "sw.sw[0,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[0,0]")) - (property (name "edg_short_path") (value "sw.sw[0,0]")) + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,0].sw")) + (property (name "edg_short_path") (value "sw.sw[0,0].sw")) (property (name "edg_refdes") (value "SW1")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09be022f")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "015f00eb")) (comp (ref "D1") - (value "sw.d[0,0]") + (value "sw.sw[0,0].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[0,0]")) - (property (name "edg_short_path") (value "sw.d[0,0]")) + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,0].d")) + (property (name "edg_short_path") (value "sw.sw[0,0].d")) (property (name "edg_refdes") (value "D1")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062601a9")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "00650065")) (comp (ref "SW2") - (value "sw.sw[0,1]") + (value "sw.sw[0,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[0,1]")) - (property (name "edg_short_path") (value "sw.sw[0,1]")) + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,1].sw")) + (property (name "edg_short_path") (value "sw.sw[0,1].sw")) (property (name "edg_refdes") (value "SW2")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c00230")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "015f00eb")) (comp (ref "D2") - (value "sw.d[0,1]") + (value "sw.sw[0,1].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[0,1]")) - (property (name "edg_short_path") (value "sw.d[0,1]")) + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,1].d")) + (property (name "edg_short_path") (value "sw.sw[0,1].d")) (property (name "edg_refdes") (value "D2")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062801aa")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "00650065")) (comp (ref "SW3") - (value "sw.sw[0,2]") + (value "sw.sw[0,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[0,2]")) - (property (name "edg_short_path") (value "sw.sw[0,2]")) + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,2].sw")) + (property (name "edg_short_path") (value "sw.sw[0,2].sw")) (property (name "edg_refdes") (value "SW3")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c20231")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "015f00eb")) (comp (ref "D3") - (value "sw.d[0,2]") + (value "sw.sw[0,2].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[0,2]")) - (property (name "edg_short_path") (value "sw.d[0,2]")) + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,2].d")) + (property (name "edg_short_path") (value "sw.sw[0,2].d")) (property (name "edg_refdes") (value "D3")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062a01ab")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "00650065")) (comp (ref "SW4") - (value "sw.sw[1,0]") + (value "sw.sw[1,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[1,0]")) - (property (name "edg_short_path") (value "sw.sw[1,0]")) + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,0].sw")) + (property (name "edg_short_path") (value "sw.sw[1,0].sw")) (property (name "edg_refdes") (value "SW4")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c20230")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "015f00eb")) (comp (ref "D4") - (value "sw.d[1,0]") + (value "sw.sw[1,0].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[1,0]")) - (property (name "edg_short_path") (value "sw.d[1,0]")) + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,0].d")) + (property (name "edg_short_path") (value "sw.sw[1,0].d")) (property (name "edg_refdes") (value "D4")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062a01aa")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "00650065")) (comp (ref "SW5") - (value "sw.sw[1,1]") + (value "sw.sw[1,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[1,1]")) - (property (name "edg_short_path") (value "sw.sw[1,1]")) + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,1].sw")) + (property (name "edg_short_path") (value "sw.sw[1,1].sw")) (property (name "edg_refdes") (value "SW5")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c40231")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "015f00eb")) (comp (ref "D5") - (value "sw.d[1,1]") + (value "sw.sw[1,1].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[1,1]")) - (property (name "edg_short_path") (value "sw.d[1,1]")) + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,1].d")) + (property (name "edg_short_path") (value "sw.sw[1,1].d")) (property (name "edg_refdes") (value "D5")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062c01ab")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "00650065")) (comp (ref "SW6") - (value "sw.sw[1,2]") + (value "sw.sw[1,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[1,2]")) - (property (name "edg_short_path") (value "sw.sw[1,2]")) + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,2].sw")) + (property (name "edg_short_path") (value "sw.sw[1,2].sw")) (property (name "edg_refdes") (value "SW6")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c60232")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "015f00eb")) (comp (ref "D6") - (value "sw.d[1,2]") + (value "sw.sw[1,2].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[1,2]")) - (property (name "edg_short_path") (value "sw.d[1,2]")) + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,2].d")) + (property (name "edg_short_path") (value "sw.sw[1,2].d")) (property (name "edg_refdes") (value "D6")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062e01ac"))) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "00650065"))) (nets (net (code 1) (name "mcu.gpio.0_0") (node (ref U1) (pin 7)) @@ -185,22 +185,22 @@ (node (ref U1) (pin 12))) (net (code 8) (name "mcu.vusb_out") (node (ref U1) (pin 14))) -(net (code 9) (name "sw.sw[0,0].sw") +(net (code 9) (name "sw.sw[0,0].sw.sw") (node (ref SW1) (pin 1)) (node (ref D1) (pin 1))) -(net (code 10) (name "sw.sw[0,1].sw") +(net (code 10) (name "sw.sw[0,1].sw.sw") (node (ref SW2) (pin 1)) (node (ref D2) (pin 1))) -(net (code 11) (name "sw.sw[0,2].sw") +(net (code 11) (name "sw.sw[0,2].sw.sw") (node (ref SW3) (pin 1)) (node (ref D3) (pin 1))) -(net (code 12) (name "sw.sw[1,0].sw") +(net (code 12) (name "sw.sw[1,0].sw.sw") (node (ref SW4) (pin 1)) (node (ref D4) (pin 1))) -(net (code 13) (name "sw.sw[1,1].sw") +(net (code 13) (name "sw.sw[1,1].sw.sw") (node (ref SW5) (pin 1)) (node (ref D5) (pin 1))) -(net (code 14) (name "sw.sw[1,2].sw") +(net (code 14) (name "sw.sw[1,2].sw.sw") (node (ref SW6) (pin 1)) (node (ref D6) (pin 1)))) ) \ No newline at end of file diff --git a/examples/BasicKeyboard/BasicKeyboard.svgpcb.js b/examples/BasicKeyboard/BasicKeyboard.svgpcb.js index 4505f0510..424b2aba6 100644 --- a/examples/BasicKeyboard/BasicKeyboard.svgpcb.js +++ b/examples/BasicKeyboard/BasicKeyboard.svgpcb.js @@ -1,6 +1,6 @@ const board = new PCB(); -const sw = SwitchMatrix_2_3_sw(pt(0.039, 0.039)) +const sw = SwitchDiodeMatrix_2_3_sw(pt(0.039, 0.039)) // mcu.device const U1 = board.add(XIAO_RP2040_SMD, { translate: pt(1.466, 0.410), rotate: 0, @@ -16,12 +16,12 @@ board.setNetlist([ {name: "mcu.gnd", pads: [["U1", "13"]]}, {name: "mcu.pwr_out", pads: [["U1", "12"]]}, {name: "mcu.vusb_out", pads: [["U1", "14"]]}, - {name: "sw.sw[0,0].sw", pads: [["SW1", "1"], ["D1", "1"]]}, - {name: "sw.sw[0,1].sw", pads: [["SW2", "1"], ["D2", "1"]]}, - {name: "sw.sw[0,2].sw", pads: [["SW3", "1"], ["D3", "1"]]}, - {name: "sw.sw[1,0].sw", pads: [["SW4", "1"], ["D4", "1"]]}, - {name: "sw.sw[1,1].sw", pads: [["SW5", "1"], ["D5", "1"]]}, - {name: "sw.sw[1,2].sw", pads: [["SW6", "1"], ["D6", "1"]]} + {name: "sw.sw[0,0].sw.sw", pads: [["SW1", "1"], ["D1", "1"]]}, + {name: "sw.sw[0,1].sw.sw", pads: [["SW2", "1"], ["D2", "1"]]}, + {name: "sw.sw[0,2].sw.sw", pads: [["SW3", "1"], ["D3", "1"]]}, + {name: "sw.sw[1,0].sw.sw", pads: [["SW4", "1"], ["D4", "1"]]}, + {name: "sw.sw[1,1].sw.sw", pads: [["SW5", "1"], ["D5", "1"]]}, + {name: "sw.sw[1,2].sw.sw", pads: [["SW6", "1"], ["D6", "1"]]} ]) const limit0 = pt(-0.07874015748031496, -0.07874015748031496); @@ -62,7 +62,7 @@ renderPCB({ mmPerUnit: 25.4 }) -function SwitchMatrix_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { +function SwitchDiodeMatrix_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { // Circuit generator params const ncols = 2 const nrows = 3 diff --git a/examples/BleJoystick/BleJoystick_btns.net.ref b/examples/BleJoystick/BleJoystick_btns.net.ref index c46066f20..dff4e7830 100644 --- a/examples/BleJoystick/BleJoystick_btns.net.ref +++ b/examples/BleJoystick/BleJoystick_btns.net.ref @@ -108,6 +108,18 @@ (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/ioe/") (tstamps "/043701b8/0281013e/")) (tstamps "0b6402d2")) +(comp (ref "JC14") + (value "btns.ioe.reset_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "ioe")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Ch32v003.Ch32v003")) + (property (name "edg_path") (value "btns.ioe.reset_cap.cap")) + (property (name "edg_short_path") (value "btns.ioe.reset_cap")) + (property (name "edg_refdes") (value "JC14")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/btns/ioe/") (tstamps "/043701b8/0281013e/")) + (tstamps "12d103b7")) (comp (ref "JSW1") (value "btns.sw[0]") (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") @@ -228,14 +240,14 @@ (property (name "edg_value") (value "A1304ELHLX-T")) (sheetpath (names "/btns/trig/") (tstamps "/043701b8/046301b7/")) (tstamps "013700cd")) -(comp (ref "JC14") +(comp (ref "JC15") (value "btns.trig.cbyp") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "trig")) (property (name "Sheetfile") (value "edg.parts.sensor.Mag_A1304.A1304")) (property (name "edg_path") (value "btns.trig.cbyp.cap")) (property (name "edg_short_path") (value "btns.trig.cbyp")) - (property (name "edg_refdes") (value "JC14")) + (property (name "edg_refdes") (value "JC15")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/trig/") (tstamps "/043701b8/046301b7/")) @@ -264,14 +276,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_js/led[0]/") (tstamps "/043701b8/090e0293/07e5021e/")) (tstamps "08950271")) -(comp (ref "JC15") +(comp (ref "JC16") (value "btns.npx_js.led[0].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[0]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_js.led[0].cap.cap")) (property (name "edg_short_path") (value "btns.npx_js.led[0].cap")) - (property (name "edg_refdes") (value "JC15")) + (property (name "edg_refdes") (value "JC16")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_js/led[0]/") (tstamps "/043701b8/090e0293/07e5021e/")) @@ -288,14 +300,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_js/led[1]/") (tstamps "/043701b8/090e0293/07e7021f/")) (tstamps "08950271")) -(comp (ref "JC16") +(comp (ref "JC17") (value "btns.npx_js.led[1].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[1]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_js.led[1].cap.cap")) (property (name "edg_short_path") (value "btns.npx_js.led[1].cap")) - (property (name "edg_refdes") (value "JC16")) + (property (name "edg_refdes") (value "JC17")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_js/led[1]/") (tstamps "/043701b8/090e0293/07e7021f/")) @@ -312,14 +324,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_js/led[2]/") (tstamps "/043701b8/090e0293/07e90220/")) (tstamps "08950271")) -(comp (ref "JC17") +(comp (ref "JC18") (value "btns.npx_js.led[2].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[2]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_js.led[2].cap.cap")) (property (name "edg_short_path") (value "btns.npx_js.led[2].cap")) - (property (name "edg_refdes") (value "JC17")) + (property (name "edg_refdes") (value "JC18")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_js/led[2]/") (tstamps "/043701b8/090e0293/07e90220/")) @@ -336,14 +348,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_js/led[3]/") (tstamps "/043701b8/090e0293/07eb0221/")) (tstamps "08950271")) -(comp (ref "JC18") +(comp (ref "JC19") (value "btns.npx_js.led[3].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[3]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_js.led[3].cap.cap")) (property (name "edg_short_path") (value "btns.npx_js.led[3].cap")) - (property (name "edg_refdes") (value "JC18")) + (property (name "edg_refdes") (value "JC19")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_js/led[3]/") (tstamps "/043701b8/090e0293/07eb0221/")) @@ -360,14 +372,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_js/led[4]/") (tstamps "/043701b8/090e0293/07ed0222/")) (tstamps "08950271")) -(comp (ref "JC19") +(comp (ref "JC20") (value "btns.npx_js.led[4].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[4]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_js.led[4].cap.cap")) (property (name "edg_short_path") (value "btns.npx_js.led[4].cap")) - (property (name "edg_refdes") (value "JC19")) + (property (name "edg_refdes") (value "JC20")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_js/led[4]/") (tstamps "/043701b8/090e0293/07ed0222/")) @@ -384,14 +396,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_js/led[5]/") (tstamps "/043701b8/090e0293/07ef0223/")) (tstamps "08950271")) -(comp (ref "JC20") +(comp (ref "JC21") (value "btns.npx_js.led[5].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[5]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_js.led[5].cap.cap")) (property (name "edg_short_path") (value "btns.npx_js.led[5].cap")) - (property (name "edg_refdes") (value "JC20")) + (property (name "edg_refdes") (value "JC21")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_js/led[5]/") (tstamps "/043701b8/090e0293/07ef0223/")) @@ -408,14 +420,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_js/led[6]/") (tstamps "/043701b8/090e0293/07f10224/")) (tstamps "08950271")) -(comp (ref "JC21") +(comp (ref "JC22") (value "btns.npx_js.led[6].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[6]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_js.led[6].cap.cap")) (property (name "edg_short_path") (value "btns.npx_js.led[6].cap")) - (property (name "edg_refdes") (value "JC21")) + (property (name "edg_refdes") (value "JC22")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_js/led[6]/") (tstamps "/043701b8/090e0293/07f10224/")) @@ -432,14 +444,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_js/led[7]/") (tstamps "/043701b8/090e0293/07f30225/")) (tstamps "08950271")) -(comp (ref "JC22") +(comp (ref "JC23") (value "btns.npx_js.led[7].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[7]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_js.led[7].cap.cap")) (property (name "edg_short_path") (value "btns.npx_js.led[7].cap")) - (property (name "edg_refdes") (value "JC22")) + (property (name "edg_refdes") (value "JC23")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_js/led[7]/") (tstamps "/043701b8/090e0293/07f30225/")) @@ -456,14 +468,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_dpad/led[0]/") (tstamps "/043701b8/0f39034f/07e5021e/")) (tstamps "08950271")) -(comp (ref "JC23") +(comp (ref "JC24") (value "btns.npx_dpad.led[0].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[0]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_dpad.led[0].cap.cap")) (property (name "edg_short_path") (value "btns.npx_dpad.led[0].cap")) - (property (name "edg_refdes") (value "JC23")) + (property (name "edg_refdes") (value "JC24")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_dpad/led[0]/") (tstamps "/043701b8/0f39034f/07e5021e/")) @@ -480,14 +492,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_dpad/led[1]/") (tstamps "/043701b8/0f39034f/07e7021f/")) (tstamps "08950271")) -(comp (ref "JC24") +(comp (ref "JC25") (value "btns.npx_dpad.led[1].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[1]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_dpad.led[1].cap.cap")) (property (name "edg_short_path") (value "btns.npx_dpad.led[1].cap")) - (property (name "edg_refdes") (value "JC24")) + (property (name "edg_refdes") (value "JC25")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_dpad/led[1]/") (tstamps "/043701b8/0f39034f/07e7021f/")) @@ -504,14 +516,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_dpad/led[2]/") (tstamps "/043701b8/0f39034f/07e90220/")) (tstamps "08950271")) -(comp (ref "JC25") +(comp (ref "JC26") (value "btns.npx_dpad.led[2].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[2]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_dpad.led[2].cap.cap")) (property (name "edg_short_path") (value "btns.npx_dpad.led[2].cap")) - (property (name "edg_refdes") (value "JC25")) + (property (name "edg_refdes") (value "JC26")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_dpad/led[2]/") (tstamps "/043701b8/0f39034f/07e90220/")) @@ -528,14 +540,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_dpad/led[3]/") (tstamps "/043701b8/0f39034f/07eb0221/")) (tstamps "08950271")) -(comp (ref "JC26") +(comp (ref "JC27") (value "btns.npx_dpad.led[3].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[3]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_dpad.led[3].cap.cap")) (property (name "edg_short_path") (value "btns.npx_dpad.led[3].cap")) - (property (name "edg_refdes") (value "JC26")) + (property (name "edg_refdes") (value "JC27")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_dpad/led[3]/") (tstamps "/043701b8/0f39034f/07eb0221/")) @@ -552,14 +564,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_dpad/led[4]/") (tstamps "/043701b8/0f39034f/07ed0222/")) (tstamps "08950271")) -(comp (ref "JC27") +(comp (ref "JC28") (value "btns.npx_dpad.led[4].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[4]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_dpad.led[4].cap.cap")) (property (name "edg_short_path") (value "btns.npx_dpad.led[4].cap")) - (property (name "edg_refdes") (value "JC27")) + (property (name "edg_refdes") (value "JC28")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_dpad/led[4]/") (tstamps "/043701b8/0f39034f/07ed0222/")) @@ -576,14 +588,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_dpad/led[5]/") (tstamps "/043701b8/0f39034f/07ef0223/")) (tstamps "08950271")) -(comp (ref "JC28") +(comp (ref "JC29") (value "btns.npx_dpad.led[5].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[5]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_dpad.led[5].cap.cap")) (property (name "edg_short_path") (value "btns.npx_dpad.led[5].cap")) - (property (name "edg_refdes") (value "JC28")) + (property (name "edg_refdes") (value "JC29")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_dpad/led[5]/") (tstamps "/043701b8/0f39034f/07ef0223/")) @@ -600,14 +612,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_dpad/led[6]/") (tstamps "/043701b8/0f39034f/07f10224/")) (tstamps "08950271")) -(comp (ref "JC29") +(comp (ref "JC30") (value "btns.npx_dpad.led[6].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[6]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_dpad.led[6].cap.cap")) (property (name "edg_short_path") (value "btns.npx_dpad.led[6].cap")) - (property (name "edg_refdes") (value "JC29")) + (property (name "edg_refdes") (value "JC30")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_dpad/led[6]/") (tstamps "/043701b8/0f39034f/07f10224/")) @@ -624,14 +636,14 @@ (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/btns/npx_dpad/led[7]/") (tstamps "/043701b8/0f39034f/07f30225/")) (tstamps "08950271")) -(comp (ref "JC30") +(comp (ref "JC31") (value "btns.npx_dpad.led[7].cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "led[7]")) (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "btns.npx_dpad.led[7].cap.cap")) (property (name "edg_short_path") (value "btns.npx_dpad.led[7].cap")) - (property (name "edg_refdes") (value "JC30")) + (property (name "edg_refdes") (value "JC31")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/btns/npx_dpad/led[7]/") (tstamps "/043701b8/0f39034f/07f30225/")) @@ -654,6 +666,7 @@ (node (ref JU9) (pin 7)) (node (ref JJ6) (pin 5)) (node (ref JC13) (pin 2)) + (node (ref JC14) (pin 2)) (node (ref JSW1) (pin 2)) (node (ref JSW2) (pin 2)) (node (ref JSW3) (pin 2)) @@ -664,39 +677,39 @@ (node (ref JSW8) (pin 2)) (node (ref JSW9) (pin 2)) (node (ref JU10) (pin 3)) - (node (ref JC14) (pin 2)) - (node (ref JD5) (pin 2)) (node (ref JC15) (pin 2)) - (node (ref JD6) (pin 2)) + (node (ref JD5) (pin 2)) (node (ref JC16) (pin 2)) - (node (ref JD7) (pin 2)) + (node (ref JD6) (pin 2)) (node (ref JC17) (pin 2)) - (node (ref JD8) (pin 2)) + (node (ref JD7) (pin 2)) (node (ref JC18) (pin 2)) - (node (ref JD9) (pin 2)) + (node (ref JD8) (pin 2)) (node (ref JC19) (pin 2)) - (node (ref JD10) (pin 2)) + (node (ref JD9) (pin 2)) (node (ref JC20) (pin 2)) - (node (ref JD11) (pin 2)) + (node (ref JD10) (pin 2)) (node (ref JC21) (pin 2)) - (node (ref JD12) (pin 2)) + (node (ref JD11) (pin 2)) (node (ref JC22) (pin 2)) - (node (ref JD13) (pin 2)) + (node (ref JD12) (pin 2)) (node (ref JC23) (pin 2)) - (node (ref JD14) (pin 2)) + (node (ref JD13) (pin 2)) (node (ref JC24) (pin 2)) - (node (ref JD15) (pin 2)) + (node (ref JD14) (pin 2)) (node (ref JC25) (pin 2)) - (node (ref JD16) (pin 2)) + (node (ref JD15) (pin 2)) (node (ref JC26) (pin 2)) - (node (ref JD17) (pin 2)) + (node (ref JD16) (pin 2)) (node (ref JC27) (pin 2)) - (node (ref JD18) (pin 2)) + (node (ref JD17) (pin 2)) (node (ref JC28) (pin 2)) - (node (ref JD19) (pin 2)) + (node (ref JD18) (pin 2)) (node (ref JC29) (pin 2)) - (node (ref JD20) (pin 2)) + (node (ref JD19) (pin 2)) (node (ref JC30) (pin 2)) + (node (ref JD20) (pin 2)) + (node (ref JC31) (pin 2)) (node (ref JJ8) (pin 1)) (node (ref JJ8) (pin 6))) (net (code 2) (name "Jbtns.pwr") @@ -705,42 +718,42 @@ (node (ref JJ6) (pin 1)) (node (ref JC13) (pin 1)) (node (ref JU10) (pin 1)) - (node (ref JC14) (pin 1)) + (node (ref JC15) (pin 1)) (node (ref JJ8) (pin 2))) (net (code 3) (name "Jbtns.vbat") (node (ref JTP10) (pin 1)) (node (ref JD5) (pin 4)) - (node (ref JC15) (pin 1)) - (node (ref JD6) (pin 4)) (node (ref JC16) (pin 1)) - (node (ref JD7) (pin 4)) + (node (ref JD6) (pin 4)) (node (ref JC17) (pin 1)) - (node (ref JD8) (pin 4)) + (node (ref JD7) (pin 4)) (node (ref JC18) (pin 1)) - (node (ref JD9) (pin 4)) + (node (ref JD8) (pin 4)) (node (ref JC19) (pin 1)) - (node (ref JD10) (pin 4)) + (node (ref JD9) (pin 4)) (node (ref JC20) (pin 1)) - (node (ref JD11) (pin 4)) + (node (ref JD10) (pin 4)) (node (ref JC21) (pin 1)) - (node (ref JD12) (pin 4)) + (node (ref JD11) (pin 4)) (node (ref JC22) (pin 1)) - (node (ref JD13) (pin 4)) + (node (ref JD12) (pin 4)) (node (ref JC23) (pin 1)) - (node (ref JD14) (pin 4)) + (node (ref JD13) (pin 4)) (node (ref JC24) (pin 1)) - (node (ref JD15) (pin 4)) + (node (ref JD14) (pin 4)) (node (ref JC25) (pin 1)) - (node (ref JD16) (pin 4)) + (node (ref JD15) (pin 4)) (node (ref JC26) (pin 1)) - (node (ref JD17) (pin 4)) + (node (ref JD16) (pin 4)) (node (ref JC27) (pin 1)) - (node (ref JD18) (pin 4)) + (node (ref JD17) (pin 4)) (node (ref JC28) (pin 1)) - (node (ref JD19) (pin 4)) + (node (ref JD18) (pin 4)) (node (ref JC29) (pin 1)) - (node (ref JD20) (pin 4)) + (node (ref JD19) (pin 4)) (node (ref JC30) (pin 1)) + (node (ref JD20) (pin 4)) + (node (ref JC31) (pin 1)) (node (ref JJ8) (pin 7)) (node (ref JJ8) (pin 8))) (net (code 4) (name "Jbtns.i2c.scl") @@ -757,7 +770,8 @@ (node (ref JJ8) (pin 5))) (net (code 7) (name "Jbtns.ioe.ic.nrst") (node (ref JU9) (pin 4)) - (node (ref JJ6) (pin 3))) + (node (ref JJ6) (pin 3)) + (node (ref JC14) (pin 1))) (net (code 8) (name "Jbtns.ioe.ic.osc.xtal_in") (node (ref JU9) (pin 5))) (net (code 9) (name "Jbtns.ioe.ic.osc.xtal_out") diff --git a/examples/DeskController/DeskController.net.ref b/examples/DeskController/DeskController.net.ref index 503f76654..0b25b8608 100644 --- a/examples/DeskController/DeskController.net.ref +++ b/examples/DeskController/DeskController.net.ref @@ -265,149 +265,149 @@ (sheetpath (names "/mcu/en_pull/") (tstamps "/02850146/0b9c02f0/")) (tstamps "00640064")) (comp (ref "DSW1") - (value "sw.sw[0,0]") + (value "sw.sw[0,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[0,0]")) - (property (name "edg_short_path") (value "sw.sw[0,0]")) + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,0].sw")) + (property (name "edg_short_path") (value "sw.sw[0,0].sw")) (property (name "edg_refdes") (value "DSW1")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09be022f")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "015f00eb")) (comp (ref "DD2") - (value "sw.d[0,0]") + (value "sw.sw[0,0].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[0,0]")) - (property (name "edg_short_path") (value "sw.d[0,0]")) + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,0].d")) + (property (name "edg_short_path") (value "sw.sw[0,0].d")) (property (name "edg_refdes") (value "DD2")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062601a9")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "00650065")) (comp (ref "DSW2") - (value "sw.sw[0,1]") + (value "sw.sw[0,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[0,1]")) - (property (name "edg_short_path") (value "sw.sw[0,1]")) + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,1].sw")) + (property (name "edg_short_path") (value "sw.sw[0,1].sw")) (property (name "edg_refdes") (value "DSW2")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c00230")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "015f00eb")) (comp (ref "DD3") - (value "sw.d[0,1]") + (value "sw.sw[0,1].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[0,1]")) - (property (name "edg_short_path") (value "sw.d[0,1]")) + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,1].d")) + (property (name "edg_short_path") (value "sw.sw[0,1].d")) (property (name "edg_refdes") (value "DD3")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062801aa")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "00650065")) (comp (ref "DSW3") - (value "sw.sw[0,2]") + (value "sw.sw[0,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[0,2]")) - (property (name "edg_short_path") (value "sw.sw[0,2]")) + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,2].sw")) + (property (name "edg_short_path") (value "sw.sw[0,2].sw")) (property (name "edg_refdes") (value "DSW3")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c20231")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "015f00eb")) (comp (ref "DD4") - (value "sw.d[0,2]") + (value "sw.sw[0,2].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[0,2]")) - (property (name "edg_short_path") (value "sw.d[0,2]")) + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,2].d")) + (property (name "edg_short_path") (value "sw.sw[0,2].d")) (property (name "edg_refdes") (value "DD4")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062a01ab")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "00650065")) (comp (ref "DSW4") - (value "sw.sw[1,0]") + (value "sw.sw[1,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[1,0]")) - (property (name "edg_short_path") (value "sw.sw[1,0]")) + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,0].sw")) + (property (name "edg_short_path") (value "sw.sw[1,0].sw")) (property (name "edg_refdes") (value "DSW4")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c20230")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "015f00eb")) (comp (ref "DD5") - (value "sw.d[1,0]") + (value "sw.sw[1,0].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[1,0]")) - (property (name "edg_short_path") (value "sw.d[1,0]")) + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,0].d")) + (property (name "edg_short_path") (value "sw.sw[1,0].d")) (property (name "edg_refdes") (value "DD5")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062a01aa")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "00650065")) (comp (ref "DSW5") - (value "sw.sw[1,1]") + (value "sw.sw[1,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[1,1]")) - (property (name "edg_short_path") (value "sw.sw[1,1]")) + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,1].sw")) + (property (name "edg_short_path") (value "sw.sw[1,1].sw")) (property (name "edg_refdes") (value "DSW5")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c40231")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "015f00eb")) (comp (ref "DD6") - (value "sw.d[1,1]") + (value "sw.sw[1,1].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[1,1]")) - (property (name "edg_short_path") (value "sw.d[1,1]")) + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,1].d")) + (property (name "edg_short_path") (value "sw.sw[1,1].d")) (property (name "edg_refdes") (value "DD6")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062c01ab")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "00650065")) (comp (ref "DSW6") - (value "sw.sw[1,2]") + (value "sw.sw[1,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[1,2]")) - (property (name "edg_short_path") (value "sw.sw[1,2]")) + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,2].sw")) + (property (name "edg_short_path") (value "sw.sw[1,2].sw")) (property (name "edg_refdes") (value "DSW6")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c60232")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "015f00eb")) (comp (ref "DD7") - (value "sw.d[1,2]") + (value "sw.sw[1,2].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[1,2]")) - (property (name "edg_short_path") (value "sw.d[1,2]")) + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,2].d")) + (property (name "edg_short_path") (value "sw.sw[1,2].d")) (property (name "edg_refdes") (value "DD7")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062e01ac")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "00650065")) (comp (ref "DD8") (value "ledr.package") (footprint "LED_SMD:LED_0603_1608Metric") @@ -1055,22 +1055,22 @@ (node (ref DJ2) (pin 2)) (node (ref DU2) (pin 8)) (node (ref DD8) (pin 2))) -(net (code 22) (name "Dsw.sw[0,0].sw") +(net (code 22) (name "Dsw.sw[0,0].sw.sw") (node (ref DSW1) (pin 1)) (node (ref DD2) (pin 1))) -(net (code 23) (name "Dsw.sw[0,1].sw") +(net (code 23) (name "Dsw.sw[0,1].sw.sw") (node (ref DSW2) (pin 1)) (node (ref DD3) (pin 1))) -(net (code 24) (name "Dsw.sw[0,2].sw") +(net (code 24) (name "Dsw.sw[0,2].sw.sw") (node (ref DSW3) (pin 1)) (node (ref DD4) (pin 1))) -(net (code 25) (name "Dsw.sw[1,0].sw") +(net (code 25) (name "Dsw.sw[1,0].sw.sw") (node (ref DSW4) (pin 1)) (node (ref DD5) (pin 1))) -(net (code 26) (name "Dsw.sw[1,1].sw") +(net (code 26) (name "Dsw.sw[1,1].sw.sw") (node (ref DSW5) (pin 1)) (node (ref DD6) (pin 1))) -(net (code 27) (name "Dsw.sw[1,2].sw") +(net (code 27) (name "Dsw.sw[1,2].sw.sw") (node (ref DSW6) (pin 1)) (node (ref DD7) (pin 1))) (net (code 28) (name "Dledr.package.k") diff --git a/examples/DeskController/DeskController.svgpcb.js b/examples/DeskController/DeskController.svgpcb.js index fdc0320ea..30c1e3519 100644 --- a/examples/DeskController/DeskController.svgpcb.js +++ b/examples/DeskController/DeskController.svgpcb.js @@ -1,6 +1,6 @@ const board = new PCB(); -const sw = SwitchMatrix_2_3_sw(pt(0.039, 0.039)) +const sw = SwitchDiodeMatrix_2_3_sw(pt(0.039, 0.039)) // jlc_th.th1 const DH1 = board.add(JlcToolingHole_1_152mm, { translate: pt(2.222, 3.240), rotate: 0, @@ -334,12 +334,12 @@ board.setNetlist([ {name: "Dmcu.program_uart_node.b_tx", pads: [["DJ2", "3"], ["DU2", "12"]]}, {name: "Dmcu.program_en_node", pads: [["DJ2", "6"], ["DU2", "2"], ["DR3", "2"], ["DC5", "1"]]}, {name: "Dmcu.program_boot_node", pads: [["DJ2", "2"], ["DU2", "8"], ["DD8", "2"]]}, - {name: "Dsw.sw[0,0].sw", pads: [["DSW1", "1"], ["DD2", "1"]]}, - {name: "Dsw.sw[0,1].sw", pads: [["DSW2", "1"], ["DD3", "1"]]}, - {name: "Dsw.sw[0,2].sw", pads: [["DSW3", "1"], ["DD4", "1"]]}, - {name: "Dsw.sw[1,0].sw", pads: [["DSW4", "1"], ["DD5", "1"]]}, - {name: "Dsw.sw[1,1].sw", pads: [["DSW5", "1"], ["DD6", "1"]]}, - {name: "Dsw.sw[1,2].sw", pads: [["DSW6", "1"], ["DD7", "1"]]}, + {name: "Dsw.sw[0,0].sw.sw", pads: [["DSW1", "1"], ["DD2", "1"]]}, + {name: "Dsw.sw[0,1].sw.sw", pads: [["DSW2", "1"], ["DD3", "1"]]}, + {name: "Dsw.sw[0,2].sw.sw", pads: [["DSW3", "1"], ["DD4", "1"]]}, + {name: "Dsw.sw[1,0].sw.sw", pads: [["DSW4", "1"], ["DD5", "1"]]}, + {name: "Dsw.sw[1,1].sw.sw", pads: [["DSW5", "1"], ["DD6", "1"]]}, + {name: "Dsw.sw[1,2].sw.sw", pads: [["DSW6", "1"], ["DD7", "1"]]}, {name: "Dledr.package.k", pads: [["DD8", "1"], ["DR4", "1"]]}, {name: "Doled.reset", pads: [["DU2", "16"], ["DJ3", "17"]]}, {name: "Doled.i2c.scl", pads: [["DU2", "17"], ["DJ3", "13"], ["DR6", "2"]]}, @@ -403,7 +403,7 @@ renderPCB({ mmPerUnit: 25.4 }) -function SwitchMatrix_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { +function SwitchDiodeMatrix_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { // Circuit generator params const ncols = 2 const nrows = 3 diff --git a/examples/Keyboard/Keyboard.net.ref b/examples/Keyboard/Keyboard.net.ref index e3f510ffb..c930f58cb 100644 --- a/examples/Keyboard/Keyboard.net.ref +++ b/examples/Keyboard/Keyboard.net.ref @@ -72,90 +72,6 @@ (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/reg/") (tstamps "/028a013f/")) (tstamps "0be902ec")) -(comp (ref "U2") - (value "mcu.ic") - (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.ic")) - (property (name "edg_short_path") (value "mcu.ic")) - (property (name "edg_refdes") (value "U2")) - (property (name "edg_part") (value "STM32F103xxT6 (STMicroelectronics)")) - (property (name "edg_value") (value "STM32F103xxT6")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "013700cd")) -(comp (ref "C3") - (value "mcu.pwr_cap[0]") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) - (property (name "edg_refdes") (value "C3")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168703d5")) -(comp (ref "C4") - (value "mcu.pwr_cap[1]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) - (property (name "edg_refdes") (value "C4")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168903d6")) -(comp (ref "C5") - (value "mcu.pwr_cap[2]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) - (property (name "edg_refdes") (value "C5")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168b03d7")) -(comp (ref "C6") - (value "mcu.pwr_cap[3]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) - (property (name "edg_refdes") (value "C6")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168d03d8")) -(comp (ref "C7") - (value "mcu.vdda_cap_0") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) - (property (name "edg_short_path") (value "mcu.vdda_cap_0")) - (property (name "edg_refdes") (value "C7")) - (property (name "edg_part") (value "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))")) - (property (name "edg_value") (value "50V 10nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "15dc03c2")) -(comp (ref "C8") - (value "mcu.vdda_cap_1") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) - (property (name "edg_short_path") (value "mcu.vdda_cap_1")) - (property (name "edg_refdes") (value "C8")) - (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "15dd03c3")) (comp (ref "X1") (value "mcu.crystal.package") (footprint "Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm") @@ -168,198 +84,858 @@ (property (name "edg_value") (value "8MHz SMD Crystal Resonator 12pF ±10ppm ±30ppm -40℃~+85℃ SMD3225-4P Crystals ROHS")) (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) (tstamps "0b4e02cd")) -(comp (ref "C9") +(comp (ref "C3") (value "mcu.crystal.cap_a") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "crystal")) (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) (property (name "edg_path") (value "mcu.crystal.cap_a")) (property (name "edg_short_path") (value "mcu.crystal.cap_a")) - (property (name "edg_refdes") (value "C9")) + (property (name "edg_refdes") (value "C3")) (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) (tstamps "05e701f5")) -(comp (ref "C10") +(comp (ref "C4") (value "mcu.crystal.cap_b") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "crystal")) (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) (property (name "edg_path") (value "mcu.crystal.cap_b")) (property (name "edg_short_path") (value "mcu.crystal.cap_b")) - (property (name "edg_refdes") (value "C10")) + (property (name "edg_refdes") (value "C4")) (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) (tstamps "05e801f6")) +(comp (ref "U2") + (value "mcu.ic") + (footprint "Package_QFP:LQFP-32_7x7mm_P0.8mm") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Ch32v203.Ch32v203")) + (property (name "edg_path") (value "mcu.ic")) + (property (name "edg_short_path") (value "mcu.ic")) + (property (name "edg_refdes") (value "U2")) + (property (name "edg_part") (value "CH32V203K8T6 (WCH)")) + (property (name "edg_value") (value "CH32V203K8T6")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "013700cd")) (comp (ref "J2") - (value "mcu.swd") - (footprint "Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD") + (value "mcu.sdi") + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.swd.conn")) - (property (name "edg_short_path") (value "mcu.swd")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Ch32v203.Ch32v203")) + (property (name "edg_path") (value "mcu.sdi.conn")) + (property (name "edg_short_path") (value "mcu.sdi")) (property (name "edg_refdes") (value "J2")) - (property (name "edg_part") (value "PinHeader1.27 Shrouded 2x5 (Generic)")) - (property (name "edg_value") (value "PinHeader1.27 Shrouded 2x5")) + (property (name "edg_part") (value "PinHeader2.54 1x4 (Generic)")) + (property (name "edg_value") (value "PinHeader2.54 1x4")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "02ae014f")) + (tstamps "028d0141")) +(comp (ref "C5") + (value "mcu.vdd_cap[0]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Ch32v203.Ch32v203")) + (property (name "edg_path") (value "mcu.vdd_cap[0].cap")) + (property (name "edg_short_path") (value "mcu.vdd_cap[0]")) + (property (name "edg_refdes") (value "C5")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "15a803ba")) +(comp (ref "C6") + (value "mcu.vdd_cap[1]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Ch32v203.Ch32v203")) + (property (name "edg_path") (value "mcu.vdd_cap[1].cap")) + (property (name "edg_short_path") (value "mcu.vdd_cap[1]")) + (property (name "edg_refdes") (value "C6")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "15aa03bb")) +(comp (ref "C7") + (value "mcu.vdda_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Ch32v203.Ch32v203")) + (property (name "edg_path") (value "mcu.vdda_cap.cap")) + (property (name "edg_short_path") (value "mcu.vdda_cap")) + (property (name "edg_refdes") (value "C7")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "0e880333")) +(comp (ref "C8") + (value "mcu.reset_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Ch32v203.Ch32v203")) + (property (name "edg_path") (value "mcu.reset_cap.cap")) + (property (name "edg_short_path") (value "mcu.reset_cap")) + (property (name "edg_refdes") (value "C8")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "12d103b7")) +(comp (ref "D1") + (value "ledr.package") + (footprint "LED_SMD:LED_0603_1608Metric") + (property (name "Sheetname") (value "ledr")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorSinkLedResistor")) + (property (name "edg_path") (value "ledr.package")) + (property (name "edg_short_path") (value "ledr.package")) + (property (name "edg_refdes") (value "D1")) + (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) + (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) + (sheetpath (names "/ledr/") (tstamps "/041d01a8/")) + (tstamps "0b4e02cd")) (comp (ref "R3") - (value "mcu.usb_pull") + (value "ledr.res") (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.usb_pull.dp")) - (property (name "edg_short_path") (value "mcu.usb_pull")) + (property (name "Sheetname") (value "ledr")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorSinkLedResistor")) + (property (name "edg_path") (value "ledr.res")) + (property (name "edg_short_path") (value "ledr.res")) (property (name "edg_refdes") (value "R3")) - (property (name "edg_part") (value "0603WAF1501T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1.5kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "0f5f0367")) + (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/ledr/") (tstamps "/041d01a8/")) + (tstamps "0296014b")) (comp (ref "SW1") - (value "sw.sw[0,0]") + (value "sw.sw[0,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[0,0]")) - (property (name "edg_short_path") (value "sw.sw[0,0]")) + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[0,0].sw")) + (property (name "edg_short_path") (value "sw.sw[0,0].sw")) (property (name "edg_refdes") (value "SW1")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09be022f")) -(comp (ref "D1") - (value "sw.d[0,0]") + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "015f00eb")) +(comp (ref "D2") + (value "sw.sw[0,0].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[0,0]")) - (property (name "edg_short_path") (value "sw.d[0,0]")) - (property (name "edg_refdes") (value "D1")) + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[0,0].d")) + (property (name "edg_short_path") (value "sw.sw[0,0].d")) + (property (name "edg_refdes") (value "D2")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062601a9")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "00650065")) +(comp (ref "D3") + (value "sw.sw[0,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,0].npx.device")) + (property (name "edg_refdes") (value "D3")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) + (tstamps "08950271")) +(comp (ref "C9") + (value "sw.sw[0,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,0].npx.cap")) + (property (name "edg_refdes") (value "C9")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) + (tstamps "025e0135")) (comp (ref "SW2") - (value "sw.sw[0,1]") + (value "sw.sw[0,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[0,1]")) - (property (name "edg_short_path") (value "sw.sw[0,1]")) + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[0,1].sw")) + (property (name "edg_short_path") (value "sw.sw[0,1].sw")) (property (name "edg_refdes") (value "SW2")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c00230")) -(comp (ref "D2") - (value "sw.d[0,1]") + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "015f00eb")) +(comp (ref "D4") + (value "sw.sw[0,1].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[0,1]")) - (property (name "edg_short_path") (value "sw.d[0,1]")) - (property (name "edg_refdes") (value "D2")) + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[0,1].d")) + (property (name "edg_short_path") (value "sw.sw[0,1].d")) + (property (name "edg_refdes") (value "D4")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062801aa")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "00650065")) +(comp (ref "D5") + (value "sw.sw[0,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,1].npx.device")) + (property (name "edg_refdes") (value "D5")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) + (tstamps "08950271")) +(comp (ref "C10") + (value "sw.sw[0,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,1].npx.cap")) + (property (name "edg_refdes") (value "C10")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) + (tstamps "025e0135")) (comp (ref "SW3") - (value "sw.sw[0,2]") + (value "sw.sw[0,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[0,2]")) - (property (name "edg_short_path") (value "sw.sw[0,2]")) + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[0,2].sw")) + (property (name "edg_short_path") (value "sw.sw[0,2].sw")) (property (name "edg_refdes") (value "SW3")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c20231")) -(comp (ref "D3") - (value "sw.d[0,2]") + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "015f00eb")) +(comp (ref "D6") + (value "sw.sw[0,2].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[0,2]")) - (property (name "edg_short_path") (value "sw.d[0,2]")) - (property (name "edg_refdes") (value "D3")) + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[0,2].d")) + (property (name "edg_short_path") (value "sw.sw[0,2].d")) + (property (name "edg_refdes") (value "D6")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062a01ab")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "00650065")) +(comp (ref "D7") + (value "sw.sw[0,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,2].npx.device")) + (property (name "edg_refdes") (value "D7")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) + (tstamps "08950271")) +(comp (ref "C11") + (value "sw.sw[0,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,2].npx.cap")) + (property (name "edg_refdes") (value "C11")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) + (tstamps "025e0135")) (comp (ref "SW4") - (value "sw.sw[1,0]") + (value "sw.sw[1,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[1,0]")) - (property (name "edg_short_path") (value "sw.sw[1,0]")) + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[1,0].sw")) + (property (name "edg_short_path") (value "sw.sw[1,0].sw")) (property (name "edg_refdes") (value "SW4")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c20230")) -(comp (ref "D4") - (value "sw.d[1,0]") + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "015f00eb")) +(comp (ref "D8") + (value "sw.sw[1,0].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[1,0]")) - (property (name "edg_short_path") (value "sw.d[1,0]")) - (property (name "edg_refdes") (value "D4")) + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[1,0].d")) + (property (name "edg_short_path") (value "sw.sw[1,0].d")) + (property (name "edg_refdes") (value "D8")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062a01aa")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "00650065")) +(comp (ref "D9") + (value "sw.sw[1,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,0].npx.device")) + (property (name "edg_refdes") (value "D9")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) + (tstamps "08950271")) +(comp (ref "C12") + (value "sw.sw[1,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,0].npx.cap")) + (property (name "edg_refdes") (value "C12")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) + (tstamps "025e0135")) (comp (ref "SW5") - (value "sw.sw[1,1]") + (value "sw.sw[1,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[1,1]")) - (property (name "edg_short_path") (value "sw.sw[1,1]")) + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[1,1].sw")) + (property (name "edg_short_path") (value "sw.sw[1,1].sw")) (property (name "edg_refdes") (value "SW5")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c40231")) -(comp (ref "D5") - (value "sw.d[1,1]") + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "015f00eb")) +(comp (ref "D10") + (value "sw.sw[1,1].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[1,1]")) - (property (name "edg_short_path") (value "sw.d[1,1]")) - (property (name "edg_refdes") (value "D5")) + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[1,1].d")) + (property (name "edg_short_path") (value "sw.sw[1,1].d")) + (property (name "edg_refdes") (value "D10")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062c01ab")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "00650065")) +(comp (ref "D11") + (value "sw.sw[1,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,1].npx.device")) + (property (name "edg_refdes") (value "D11")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) + (tstamps "08950271")) +(comp (ref "C13") + (value "sw.sw[1,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,1].npx.cap")) + (property (name "edg_refdes") (value "C13")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) + (tstamps "025e0135")) (comp (ref "SW6") - (value "sw.sw[1,2]") + (value "sw.sw[1,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.sw[1,2]")) - (property (name "edg_short_path") (value "sw.sw[1,2]")) + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[1,2].sw")) + (property (name "edg_short_path") (value "sw.sw[1,2].sw")) (property (name "edg_refdes") (value "SW6")) (property (name "edg_part") (value "PG151101S11 (Kailh)")) (property (name "edg_value") (value "PG151101S11")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "09c60232")) -(comp (ref "D6") - (value "sw.d[1,2]") + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "015f00eb")) +(comp (ref "D12") + (value "sw.sw[1,2].d") (footprint "Diode_SMD:D_SOD-323") - (property (name "Sheetname") (value "sw")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.SwitchMatrix")) - (property (name "edg_path") (value "sw.d[1,2]")) - (property (name "edg_short_path") (value "sw.d[1,2]")) - (property (name "edg_refdes") (value "D6")) + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[1,2].d")) + (property (name "edg_short_path") (value "sw.sw[1,2].d")) + (property (name "edg_refdes") (value "D12")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "00650065")) +(comp (ref "D13") + (value "sw.sw[1,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,2].npx.device")) + (property (name "edg_refdes") (value "D13")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) + (tstamps "08950271")) +(comp (ref "C14") + (value "sw.sw[1,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,2].npx.cap")) + (property (name "edg_refdes") (value "C14")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW7") + (value "sw.sw[2,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[2,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[2,0].sw")) + (property (name "edg_short_path") (value "sw.sw[2,0].sw")) + (property (name "edg_refdes") (value "SW7")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[2,0]/") (tstamps "/015f00eb/09c60231/")) + (tstamps "015f00eb")) +(comp (ref "D14") + (value "sw.sw[2,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[2,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[2,0].d")) + (property (name "edg_short_path") (value "sw.sw[2,0].d")) + (property (name "edg_refdes") (value "D14")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[2,0]/") (tstamps "/015f00eb/09c60231/")) + (tstamps "00650065")) +(comp (ref "D15") + (value "sw.sw[2,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[2,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[2,0].npx.device")) + (property (name "edg_refdes") (value "D15")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[2,0]/npx/") (tstamps "/015f00eb/09c60231/02a50157/")) + (tstamps "08950271")) +(comp (ref "C15") + (value "sw.sw[2,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[2,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[2,0].npx.cap")) + (property (name "edg_refdes") (value "C15")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[2,0]/npx/") (tstamps "/015f00eb/09c60231/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW8") + (value "sw.sw[2,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[2,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[2,1].sw")) + (property (name "edg_short_path") (value "sw.sw[2,1].sw")) + (property (name "edg_refdes") (value "SW8")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[2,1]/") (tstamps "/015f00eb/09c80232/")) + (tstamps "015f00eb")) +(comp (ref "D16") + (value "sw.sw[2,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[2,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[2,1].d")) + (property (name "edg_short_path") (value "sw.sw[2,1].d")) + (property (name "edg_refdes") (value "D16")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[2,1]/") (tstamps "/015f00eb/09c80232/")) + (tstamps "00650065")) +(comp (ref "D17") + (value "sw.sw[2,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[2,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[2,1].npx.device")) + (property (name "edg_refdes") (value "D17")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[2,1]/npx/") (tstamps "/015f00eb/09c80232/02a50157/")) + (tstamps "08950271")) +(comp (ref "C16") + (value "sw.sw[2,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[2,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[2,1].npx.cap")) + (property (name "edg_refdes") (value "C16")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[2,1]/npx/") (tstamps "/015f00eb/09c80232/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW9") + (value "sw.sw[2,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[2,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[2,2].sw")) + (property (name "edg_short_path") (value "sw.sw[2,2].sw")) + (property (name "edg_refdes") (value "SW9")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[2,2]/") (tstamps "/015f00eb/09ca0233/")) + (tstamps "015f00eb")) +(comp (ref "D18") + (value "sw.sw[2,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[2,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[2,2].d")) + (property (name "edg_short_path") (value "sw.sw[2,2].d")) + (property (name "edg_refdes") (value "D18")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) - (sheetpath (names "/sw/") (tstamps "/015f00eb/")) - (tstamps "062e01ac"))) + (sheetpath (names "/sw/sw[2,2]/") (tstamps "/015f00eb/09ca0233/")) + (tstamps "00650065")) +(comp (ref "D19") + (value "sw.sw[2,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[2,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[2,2].npx.device")) + (property (name "edg_refdes") (value "D19")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[2,2]/npx/") (tstamps "/015f00eb/09ca0233/02a50157/")) + (tstamps "08950271")) +(comp (ref "C17") + (value "sw.sw[2,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[2,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[2,2].npx.cap")) + (property (name "edg_refdes") (value "C17")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[2,2]/npx/") (tstamps "/015f00eb/09ca0233/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW10") + (value "sw.sw[3,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[3,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[3,0].sw")) + (property (name "edg_short_path") (value "sw.sw[3,0].sw")) + (property (name "edg_refdes") (value "SW10")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[3,0]/") (tstamps "/015f00eb/09ca0232/")) + (tstamps "015f00eb")) +(comp (ref "D20") + (value "sw.sw[3,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[3,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[3,0].d")) + (property (name "edg_short_path") (value "sw.sw[3,0].d")) + (property (name "edg_refdes") (value "D20")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[3,0]/") (tstamps "/015f00eb/09ca0232/")) + (tstamps "00650065")) +(comp (ref "D21") + (value "sw.sw[3,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[3,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[3,0].npx.device")) + (property (name "edg_refdes") (value "D21")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[3,0]/npx/") (tstamps "/015f00eb/09ca0232/02a50157/")) + (tstamps "08950271")) +(comp (ref "C18") + (value "sw.sw[3,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[3,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[3,0].npx.cap")) + (property (name "edg_refdes") (value "C18")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[3,0]/npx/") (tstamps "/015f00eb/09ca0232/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW11") + (value "sw.sw[3,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[3,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[3,1].sw")) + (property (name "edg_short_path") (value "sw.sw[3,1].sw")) + (property (name "edg_refdes") (value "SW11")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[3,1]/") (tstamps "/015f00eb/09cc0233/")) + (tstamps "015f00eb")) +(comp (ref "D22") + (value "sw.sw[3,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[3,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[3,1].d")) + (property (name "edg_short_path") (value "sw.sw[3,1].d")) + (property (name "edg_refdes") (value "D22")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[3,1]/") (tstamps "/015f00eb/09cc0233/")) + (tstamps "00650065")) +(comp (ref "D23") + (value "sw.sw[3,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[3,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[3,1].npx.device")) + (property (name "edg_refdes") (value "D23")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[3,1]/npx/") (tstamps "/015f00eb/09cc0233/02a50157/")) + (tstamps "08950271")) +(comp (ref "C19") + (value "sw.sw[3,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[3,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[3,1].npx.cap")) + (property (name "edg_refdes") (value "C19")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[3,1]/npx/") (tstamps "/015f00eb/09cc0233/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW12") + (value "sw.sw[3,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[3,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[3,2].sw")) + (property (name "edg_short_path") (value "sw.sw[3,2].sw")) + (property (name "edg_refdes") (value "SW12")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[3,2]/") (tstamps "/015f00eb/09ce0234/")) + (tstamps "015f00eb")) +(comp (ref "D24") + (value "sw.sw[3,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[3,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "edg_path") (value "sw.sw[3,2].d")) + (property (name "edg_short_path") (value "sw.sw[3,2].d")) + (property (name "edg_refdes") (value "D24")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[3,2]/") (tstamps "/015f00eb/09ce0234/")) + (tstamps "00650065")) +(comp (ref "D25") + (value "sw.sw[3,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[3,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[3,2].npx.device")) + (property (name "edg_refdes") (value "D25")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[3,2]/npx/") (tstamps "/015f00eb/09ce0234/02a50157/")) + (tstamps "08950271")) +(comp (ref "C20") + (value "sw.sw[3,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[3,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[3,2].npx.cap")) + (property (name "edg_refdes") (value "C20")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[3,2]/npx/") (tstamps "/015f00eb/09ce0234/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW13") + (value "enc") + (footprint "edg:RotaryEncoder_Bourns_PEC11S") + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "")) + (property (name "edg_path") (value "enc.package")) + (property (name "edg_short_path") (value "enc")) + (property (name "edg_refdes") (value "SW13")) + (property (name "edg_part") (value "PEC11S-929K-S0015 (Bourns)")) + (property (name "edg_value") (value "PEC11S-929K-S0015")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "02710137")) +(comp (ref "J3") + (value "oled.device") + (footprint "Connector_FFC-FPC:Hirose_FH12-30S-0.5SH_1x30-1MP_P0.50mm_Horizontal") + (property (name "Sheetname") (value "oled")) + (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) + (property (name "edg_path") (value "oled.device.conn")) + (property (name "edg_short_path") (value "oled.device")) + (property (name "edg_refdes") (value "J3")) + (property (name "edg_part") (value "AFC01-S30FC*-00 (Jushuo)")) + (property (name "edg_value") (value "AFC01-S30FC*-00")) + (sheetpath (names "/oled/") (tstamps "/043201a5/")) + (tstamps "08950271")) +(comp (ref "U3") + (value "oled.lcd") + (footprint "edg:Lcd_Er_Oled0.96_1.1_Outline") + (property (name "Sheetname") (value "oled")) + (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) + (property (name "edg_path") (value "oled.lcd")) + (property (name "edg_short_path") (value "oled.lcd")) + (property (name "edg_refdes") (value "U3")) + (property (name "edg_part") (value "ER-OLED-0.96-1.1 (EastRising)")) + (property (name "edg_value") (value "ER-OLED-0.96-1.1")) + (sheetpath (names "/oled/") (tstamps "/043201a5/")) + (tstamps "02710134")) +(comp (ref "C21") + (value "oled.c1_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "oled")) + (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) + (property (name "edg_path") (value "oled.c1_cap")) + (property (name "edg_short_path") (value "oled.c1_cap")) + (property (name "edg_refdes") (value "C21")) + (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/oled/") (tstamps "/043201a5/")) + (tstamps "07240228")) +(comp (ref "C22") + (value "oled.c2_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "oled")) + (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) + (property (name "edg_path") (value "oled.c2_cap")) + (property (name "edg_short_path") (value "oled.c2_cap")) + (property (name "edg_refdes") (value "C22")) + (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/oled/") (tstamps "/043201a5/")) + (tstamps "07290229")) +(comp (ref "R4") + (value "oled.iref_res") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "oled")) + (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) + (property (name "edg_path") (value "oled.iref_res.res")) + (property (name "edg_short_path") (value "oled.iref_res")) + (property (name "edg_refdes") (value "R4")) + (property (name "edg_part") (value "0603WAF3903T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 390kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/oled/") (tstamps "/043201a5/")) + (tstamps "0ed90350")) +(comp (ref "C23") + (value "oled.vcomh_cap") + (footprint "Capacitor_SMD:C_0805_2012Metric") + (property (name "Sheetname") (value "oled")) + (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) + (property (name "edg_path") (value "oled.vcomh_cap.cap")) + (property (name "edg_short_path") (value "oled.vcomh_cap")) + (property (name "edg_refdes") (value "C23")) + (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/oled/") (tstamps "/043201a5/")) + (tstamps "12bd03b1")) +(comp (ref "C24") + (value "oled.vdd_cap1") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "oled")) + (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) + (property (name "edg_path") (value "oled.vdd_cap1.cap")) + (property (name "edg_short_path") (value "oled.vdd_cap1")) + (property (name "edg_refdes") (value "C24")) + (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/oled/") (tstamps "/043201a5/")) + (tstamps "0e670303")) +(comp (ref "C25") + (value "oled.vbat_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "oled")) + (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) + (property (name "edg_path") (value "oled.vbat_cap.cap")) + (property (name "edg_short_path") (value "oled.vbat_cap")) + (property (name "edg_refdes") (value "C25")) + (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/oled/") (tstamps "/043201a5/")) + (tstamps "0ec70341")) +(comp (ref "C26") + (value "oled.vcc_cap") + (footprint "Capacitor_SMD:C_0805_2012Metric") + (property (name "Sheetname") (value "oled")) + (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) + (property (name "edg_path") (value "oled.vcc_cap.cap")) + (property (name "edg_short_path") (value "oled.vcc_cap")) + (property (name "edg_refdes") (value "C26")) + (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/oled/") (tstamps "/043201a5/")) + (tstamps "0b5902d0")) +(comp (ref "U4") + (value "npx_shift.ic") + (footprint "Package_TO_SOT_SMD:SOT-23-5") + (property (name "Sheetname") (value "npx_shift")) + (property (name "Sheetfile") (value "edg.parts.logic.Logic_74Ahct.L74Ahct1g125")) + (property (name "edg_path") (value "npx_shift.ic")) + (property (name "edg_short_path") (value "npx_shift.ic")) + (property (name "edg_refdes") (value "U4")) + (property (name "edg_part") (value "74AHCT1G125W5-7 (Diodes Incorporated)")) + (property (name "edg_value") (value "74AHCT1G125W5-7")) + (sheetpath (names "/npx_shift/") (tstamps "/134303d4/")) + (tstamps "013700cd")) +(comp (ref "C27") + (value "npx_shift.vdd_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx_shift")) + (property (name "Sheetfile") (value "edg.parts.logic.Logic_74Ahct.L74Ahct1g125")) + (property (name "edg_path") (value "npx_shift.vdd_cap.cap")) + (property (name "edg_short_path") (value "npx_shift.vdd_cap")) + (property (name "edg_refdes") (value "C27")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/npx_shift/") (tstamps "/134303d4/")) + (tstamps "0b6402d2")) +(comp (ref "TP1") + (value "_npx_shift_output_link") + (footprint "TestPoint:TestPoint_Keystone_5015_Micro-Minature") + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "")) + (property (name "edg_path") (value "npx_tp.tp")) + (property (name "edg_short_path") (value "npx_tp")) + (property (name "edg_refdes") (value "TP1")) + (property (name "edg_part") (value "5015 (Keystone)")) + (property (name "edg_value") (value "_npx_shift_output_link")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "091f029a"))) (nets (net (code 1) (name "usb.pwr") (node (ref J1) (pin A4)) @@ -367,7 +943,33 @@ (node (ref J1) (pin B4)) (node (ref J1) (pin B9)) (node (ref U1) (pin 3)) - (node (ref C1) (pin 1))) + (node (ref C1) (pin 1)) + (node (ref D3) (pin 1)) + (node (ref C9) (pin 1)) + (node (ref D5) (pin 1)) + (node (ref C10) (pin 1)) + (node (ref D7) (pin 1)) + (node (ref C11) (pin 1)) + (node (ref D9) (pin 1)) + (node (ref C12) (pin 1)) + (node (ref D11) (pin 1)) + (node (ref C13) (pin 1)) + (node (ref D13) (pin 1)) + (node (ref C14) (pin 1)) + (node (ref D15) (pin 1)) + (node (ref C15) (pin 1)) + (node (ref D17) (pin 1)) + (node (ref C16) (pin 1)) + (node (ref D19) (pin 1)) + (node (ref C17) (pin 1)) + (node (ref D21) (pin 1)) + (node (ref C18) (pin 1)) + (node (ref D23) (pin 1)) + (node (ref C19) (pin 1)) + (node (ref D25) (pin 1)) + (node (ref C20) (pin 1)) + (node (ref U4) (pin 5)) + (node (ref C27) (pin 1))) (net (code 2) (name "usb.gnd") (node (ref J1) (pin A1)) (node (ref J1) (pin A12)) @@ -379,33 +981,74 @@ (node (ref U1) (pin 1)) (node (ref C1) (pin 2)) (node (ref C2) (pin 2)) - (node (ref U2) (pin 23)) - (node (ref U2) (pin 35)) - (node (ref U2) (pin 44)) - (node (ref U2) (pin 47)) - (node (ref U2) (pin 8)) + (node (ref X1) (pin 2)) + (node (ref X1) (pin 4)) (node (ref C3) (pin 2)) (node (ref C4) (pin 2)) + (node (ref U2) (pin 16)) + (node (ref U2) (pin 31)) + (node (ref U2) (pin 32)) + (node (ref J2) (pin 2)) (node (ref C5) (pin 2)) (node (ref C6) (pin 2)) (node (ref C7) (pin 2)) (node (ref C8) (pin 2)) - (node (ref X1) (pin 2)) - (node (ref X1) (pin 4)) + (node (ref D3) (pin 3)) (node (ref C9) (pin 2)) + (node (ref D5) (pin 3)) (node (ref C10) (pin 2)) - (node (ref J2) (pin 3)) - (node (ref J2) (pin 5)) - (node (ref J2) (pin 9))) + (node (ref D7) (pin 3)) + (node (ref C11) (pin 2)) + (node (ref D9) (pin 3)) + (node (ref C12) (pin 2)) + (node (ref D11) (pin 3)) + (node (ref C13) (pin 2)) + (node (ref D13) (pin 3)) + (node (ref C14) (pin 2)) + (node (ref D15) (pin 3)) + (node (ref C15) (pin 2)) + (node (ref D17) (pin 3)) + (node (ref C16) (pin 2)) + (node (ref D19) (pin 3)) + (node (ref C17) (pin 2)) + (node (ref D21) (pin 3)) + (node (ref C18) (pin 2)) + (node (ref D23) (pin 3)) + (node (ref C19) (pin 2)) + (node (ref D25) (pin 3)) + (node (ref C20) (pin 2)) + (node (ref SW13) (pin C)) + (node (ref SW13) (pin S2)) + (node (ref J3) (pin 1)) + (node (ref J3) (pin 10)) + (node (ref J3) (pin 11)) + (node (ref J3) (pin 12)) + (node (ref J3) (pin 16)) + (node (ref J3) (pin 17)) + (node (ref J3) (pin 21)) + (node (ref J3) (pin 22)) + (node (ref J3) (pin 23)) + (node (ref J3) (pin 24)) + (node (ref J3) (pin 25)) + (node (ref J3) (pin 29)) + (node (ref J3) (pin 30)) + (node (ref J3) (pin 8)) + (node (ref R4) (pin 1)) + (node (ref C23) (pin 2)) + (node (ref C24) (pin 2)) + (node (ref C25) (pin 2)) + (node (ref C26) (pin 2)) + (node (ref U4) (pin 1)) + (node (ref U4) (pin 3)) + (node (ref C27) (pin 2))) (net (code 3) (name "usb.usb.dp") (node (ref J1) (pin A6)) (node (ref J1) (pin B6)) - (node (ref U2) (pin 33)) - (node (ref R3) (pin 2))) + (node (ref U2) (pin 22))) (net (code 4) (name "usb.usb.dm") (node (ref J1) (pin A7)) (node (ref J1) (pin B7)) - (node (ref U2) (pin 32))) + (node (ref U2) (pin 21))) (net (code 5) (name "usb.conn.cc.cc1") (node (ref J1) (pin A5)) (node (ref R1) (pin 2))) @@ -416,77 +1059,203 @@ (node (ref U1) (pin 2)) (node (ref C2) (pin 1)) (node (ref U2) (pin 1)) - (node (ref U2) (pin 24)) - (node (ref U2) (pin 36)) - (node (ref U2) (pin 48)) - (node (ref U2) (pin 9)) - (node (ref C3) (pin 1)) - (node (ref C4) (pin 1)) + (node (ref U2) (pin 17)) + (node (ref U2) (pin 5)) + (node (ref J2) (pin 1)) (node (ref C5) (pin 1)) (node (ref C6) (pin 1)) (node (ref C7) (pin 1)) - (node (ref C8) (pin 1)) - (node (ref J2) (pin 1)) - (node (ref R3) (pin 1))) + (node (ref D1) (pin 2)) + (node (ref J3) (pin 6)) + (node (ref J3) (pin 9)) + (node (ref C24) (pin 1)) + (node (ref C25) (pin 1))) (net (code 8) (name "mcu.gpio.0_0") - (node (ref U2) (pin 10)) + (node (ref U2) (pin 19)) (node (ref SW1) (pin 2)) (node (ref SW2) (pin 2)) (node (ref SW3) (pin 2))) (net (code 9) (name "mcu.gpio.0_1") - (node (ref U2) (pin 11)) + (node (ref U2) (pin 20)) (node (ref SW4) (pin 2)) (node (ref SW5) (pin 2)) (node (ref SW6) (pin 2))) -(net (code 10) (name "mcu.gpio.1_0") - (node (ref U2) (pin 12)) - (node (ref D1) (pin 2)) - (node (ref D4) (pin 2))) -(net (code 11) (name "mcu.gpio.1_1") - (node (ref U2) (pin 13)) +(net (code 10) (name "mcu.gpio.0_2") + (node (ref U2) (pin 25)) + (node (ref SW7) (pin 2)) + (node (ref SW8) (pin 2)) + (node (ref SW9) (pin 2))) +(net (code 11) (name "mcu.gpio.0_3") + (node (ref U2) (pin 26)) + (node (ref SW10) (pin 2)) + (node (ref SW11) (pin 2)) + (node (ref SW12) (pin 2))) +(net (code 12) (name "mcu.gpio.1_0") + (node (ref U2) (pin 27)) (node (ref D2) (pin 2)) - (node (ref D5) (pin 2))) -(net (code 12) (name "mcu.gpio.1_2") - (node (ref U2) (pin 14)) - (node (ref D3) (pin 2)) - (node (ref D6) (pin 2))) -(net (code 13) (name "mcu.xtal_node.xi") - (node (ref U2) (pin 5)) + (node (ref D8) (pin 2)) + (node (ref D14) (pin 2)) + (node (ref D20) (pin 2))) +(net (code 13) (name "mcu.gpio.1_1") + (node (ref U2) (pin 28)) + (node (ref D4) (pin 2)) + (node (ref D10) (pin 2)) + (node (ref D16) (pin 2)) + (node (ref D22) (pin 2))) +(net (code 14) (name "mcu.gpio.1_2") + (node (ref U2) (pin 29)) + (node (ref D6) (pin 2)) + (node (ref D12) (pin 2)) + (node (ref D18) (pin 2)) + (node (ref D24) (pin 2))) +(net (code 15) (name "mcu.xtal_node.xi") (node (ref X1) (pin 1)) - (node (ref C9) (pin 1))) -(net (code 14) (name "mcu.xtal_node.xo") - (node (ref U2) (pin 6)) + (node (ref C3) (pin 1)) + (node (ref U2) (pin 2))) +(net (code 16) (name "mcu.xtal_node.xo") (node (ref X1) (pin 3)) - (node (ref C10) (pin 1))) -(net (code 15) (name "mcu.swd_node.swdio") - (node (ref U2) (pin 34)) - (node (ref J2) (pin 2))) -(net (code 16) (name "mcu.swd_node.swclk") - (node (ref U2) (pin 37)) + (node (ref C4) (pin 1)) + (node (ref U2) (pin 3))) +(net (code 17) (name "mcu.ic.nrst") + (node (ref U2) (pin 4)) + (node (ref C8) (pin 1))) +(net (code 18) (name "mcu.ic.swdio") + (node (ref U2) (pin 23)) + (node (ref J2) (pin 3))) +(net (code 19) (name "mcu.ic.swclk") + (node (ref U2) (pin 24)) (node (ref J2) (pin 4))) -(net (code 17) (name "mcu.reset_node") - (node (ref U2) (pin 7)) - (node (ref J2) (pin 10))) -(net (code 18) (name "mcu.swd.tdi") - (node (ref J2) (pin 8))) -(net (code 19) (name "mcu.swd.swo") - (node (ref J2) (pin 6))) -(net (code 20) (name "sw.sw[0,0].sw") +(net (code 20) (name "ledr.signal") + (node (ref U2) (pin 6)) + (node (ref R3) (pin 2))) +(net (code 21) (name "ledr.package.k") + (node (ref D1) (pin 1)) + (node (ref R3) (pin 1))) +(net (code 22) (name "sw.npx_din") + (node (ref D3) (pin 4)) + (node (ref U4) (pin 4)) + (node (ref TP1) (pin 1))) +(net (code 23) (name "sw.npx_dout") + (node (ref D25) (pin 2))) +(net (code 24) (name "sw.sw[0,0].npx_dout") + (node (ref D3) (pin 2)) + (node (ref D9) (pin 4))) +(net (code 25) (name "sw.sw[0,0].sw.sw") (node (ref SW1) (pin 1)) - (node (ref D1) (pin 1))) -(net (code 21) (name "sw.sw[0,1].sw") - (node (ref SW2) (pin 1)) (node (ref D2) (pin 1))) -(net (code 22) (name "sw.sw[0,2].sw") +(net (code 26) (name "sw.sw[0,1].npx_din") + (node (ref D5) (pin 4)) + (node (ref D11) (pin 2))) +(net (code 27) (name "sw.sw[0,1].npx_dout") + (node (ref D5) (pin 2)) + (node (ref D7) (pin 4))) +(net (code 28) (name "sw.sw[0,1].sw.sw") + (node (ref SW2) (pin 1)) + (node (ref D4) (pin 1))) +(net (code 29) (name "sw.sw[0,2].npx_dout") + (node (ref D7) (pin 2)) + (node (ref D13) (pin 4))) +(net (code 30) (name "sw.sw[0,2].sw.sw") (node (ref SW3) (pin 1)) - (node (ref D3) (pin 1))) -(net (code 23) (name "sw.sw[1,0].sw") + (node (ref D6) (pin 1))) +(net (code 31) (name "sw.sw[1,0].npx_dout") + (node (ref D9) (pin 2)) + (node (ref D15) (pin 4))) +(net (code 32) (name "sw.sw[1,0].sw.sw") (node (ref SW4) (pin 1)) - (node (ref D4) (pin 1))) -(net (code 24) (name "sw.sw[1,1].sw") + (node (ref D8) (pin 1))) +(net (code 33) (name "sw.sw[1,1].npx_din") + (node (ref D11) (pin 4)) + (node (ref D17) (pin 2))) +(net (code 34) (name "sw.sw[1,1].sw.sw") (node (ref SW5) (pin 1)) - (node (ref D5) (pin 1))) -(net (code 25) (name "sw.sw[1,2].sw") + (node (ref D10) (pin 1))) +(net (code 35) (name "sw.sw[1,2].npx_dout") + (node (ref D13) (pin 2)) + (node (ref D19) (pin 4))) +(net (code 36) (name "sw.sw[1,2].sw.sw") (node (ref SW6) (pin 1)) - (node (ref D6) (pin 1)))) + (node (ref D12) (pin 1))) +(net (code 37) (name "sw.sw[2,0].npx_dout") + (node (ref D15) (pin 2)) + (node (ref D21) (pin 4))) +(net (code 38) (name "sw.sw[2,0].sw.sw") + (node (ref SW7) (pin 1)) + (node (ref D14) (pin 1))) +(net (code 39) (name "sw.sw[2,1].npx_din") + (node (ref D17) (pin 4)) + (node (ref D23) (pin 2))) +(net (code 40) (name "sw.sw[2,1].sw.sw") + (node (ref SW8) (pin 1)) + (node (ref D16) (pin 1))) +(net (code 41) (name "sw.sw[2,2].npx_dout") + (node (ref D19) (pin 2)) + (node (ref D25) (pin 4))) +(net (code 42) (name "sw.sw[2,2].sw.sw") + (node (ref SW9) (pin 1)) + (node (ref D18) (pin 1))) +(net (code 43) (name "sw.sw[3,0].npx_dout") + (node (ref D21) (pin 2)) + (node (ref D23) (pin 4))) +(net (code 44) (name "sw.sw[3,0].sw.sw") + (node (ref SW10) (pin 1)) + (node (ref D20) (pin 1))) +(net (code 45) (name "sw.sw[3,1].sw.sw") + (node (ref SW11) (pin 1)) + (node (ref D22) (pin 1))) +(net (code 46) (name "sw.sw[3,2].sw.sw") + (node (ref SW12) (pin 1)) + (node (ref D24) (pin 1))) +(net (code 47) (name "enc.a") + (node (ref U2) (pin 7)) + (node (ref SW13) (pin A))) +(net (code 48) (name "enc.b") + (node (ref U2) (pin 8)) + (node (ref SW13) (pin B))) +(net (code 49) (name "enc.sw") + (node (ref U2) (pin 9)) + (node (ref SW13) (pin S1))) +(net (code 50) (name "oled.reset") + (node (ref U2) (pin 15)) + (node (ref J3) (pin 14))) +(net (code 51) (name "oled.spi.sck") + (node (ref U2) (pin 11)) + (node (ref J3) (pin 18))) +(net (code 52) (name "oled.spi.mosi") + (node (ref U2) (pin 13)) + (node (ref J3) (pin 19))) +(net (code 53) (name "oled.spi.miso") + (node (ref U2) (pin 12))) +(net (code 54) (name "oled.cs") + (node (ref U2) (pin 10)) + (node (ref J3) (pin 13))) +(net (code 55) (name "oled.dc") + (node (ref U2) (pin 14)) + (node (ref J3) (pin 15))) +(net (code 56) (name "oled.device.vcc") + (node (ref J3) (pin 28)) + (node (ref C26) (pin 1))) +(net (code 57) (name "oled.device.iref") + (node (ref J3) (pin 26)) + (node (ref R4) (pin 2))) +(net (code 58) (name "oled.device.vcomh") + (node (ref J3) (pin 27)) + (node (ref C23) (pin 1))) +(net (code 59) (name "oled.device.c1p") + (node (ref J3) (pin 4)) + (node (ref C21) (pin 1))) +(net (code 60) (name "oled.device.c1n") + (node (ref J3) (pin 5)) + (node (ref C21) (pin 2))) +(net (code 61) (name "oled.device.c2p") + (node (ref J3) (pin 2)) + (node (ref C22) (pin 1))) +(net (code 62) (name "oled.device.c2n") + (node (ref J3) (pin 3)) + (node (ref C22) (pin 2))) +(net (code 63) (name "oled.device.d2") + (node (ref J3) (pin 20))) +(net (code 64) (name "npx_shift.input") + (node (ref U2) (pin 18)) + (node (ref U4) (pin 2)))) ) \ No newline at end of file diff --git a/examples/Keyboard/Keyboard.svgpcb.js b/examples/Keyboard/Keyboard.svgpcb.js index cb3b12aca..dcc088edc 100644 --- a/examples/Keyboard/Keyboard.svgpcb.js +++ b/examples/Keyboard/Keyboard.svgpcb.js @@ -1,127 +1,226 @@ const board = new PCB(); -const sw = SwitchMatrix_2_3_sw(pt(0.039, 0.039)) +const sw = SwitchDiodeMatrixNeopixels_4_3_sw(pt(0.039, 0.039)) // usb.conn const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { - translate: pt(1.328, 0.958), rotate: 0, + translate: pt(1.121, 2.283), rotate: 0, id: 'J1' }) // usb.cc_pull.cc1.res const R1 = board.add(R_0603_1608Metric, { - translate: pt(1.176, 1.213), rotate: 0, + translate: pt(0.970, 2.538), rotate: 0, id: 'R1' }) // usb.cc_pull.cc2.res const R2 = board.add(R_0603_1608Metric, { - translate: pt(1.332, 1.213), rotate: 0, + translate: pt(1.126, 2.538), rotate: 0, id: 'R2' }) // reg.ic const U1 = board.add(SOT_223_3_TabPin2, { - translate: pt(1.828, 0.935), rotate: 0, + translate: pt(1.622, 2.260), rotate: 0, id: 'U1' }) // reg.in_cap.cap const C1 = board.add(C_0603_1608Metric, { - translate: pt(1.887, 1.145), rotate: 0, + translate: pt(1.680, 2.470), rotate: 0, id: 'C1' }) // reg.out_cap.cap const C2 = board.add(C_0805_2012Metric, { - translate: pt(1.722, 1.155), rotate: 0, + translate: pt(1.516, 2.480), rotate: 0, id: 'C2' }) -// mcu.ic -const U2 = board.add(LQFP_48_7x7mm_P0_5mm, { - translate: pt(1.321, 0.203), rotate: 0, - id: 'U2' +// mcu.crystal.package +const X1 = board.add(Crystal_SMD_3225_4Pin_3_2x2_5mm, { + translate: pt(0.711, 2.185), rotate: 0, + id: 'X1' }) -// mcu.pwr_cap[0].cap -const C3 = board.add(C_0805_2012Metric, { - translate: pt(1.390, 0.483), rotate: 0, +// mcu.crystal.cap_a +const C3 = board.add(C_0603_1608Metric, { + translate: pt(0.687, 2.320), rotate: 0, id: 'C3' }) -// mcu.pwr_cap[1].cap +// mcu.crystal.cap_b const C4 = board.add(C_0603_1608Metric, { - translate: pt(1.554, 0.474), rotate: 0, + translate: pt(0.687, 2.417), rotate: 0, id: 'C4' }) -// mcu.pwr_cap[2].cap +// mcu.ic +const U2 = board.add(LQFP_32_7x7mm_P0_8mm, { + translate: pt(0.385, 2.322), rotate: 0, + id: 'U2' +}) +// mcu.sdi.conn +const J2 = board.add(PinHeader_1x04_P2_54mm_Vertical, { + translate: pt(0.071, 2.488), rotate: 0, + id: 'J2' +}) +// mcu.vdd_cap[0].cap const C5 = board.add(C_0603_1608Metric, { - translate: pt(1.710, 0.474), rotate: 0, + translate: pt(0.058, 2.627), rotate: 0, id: 'C5' }) -// mcu.pwr_cap[3].cap +// mcu.vdd_cap[1].cap const C6 = board.add(C_0603_1608Metric, { - translate: pt(1.866, 0.474), rotate: 0, + translate: pt(0.214, 2.627), rotate: 0, id: 'C6' }) -// mcu.vdda_cap_0.cap +// mcu.vdda_cap.cap const C7 = board.add(C_0603_1608Metric, { - translate: pt(1.176, 0.647), rotate: 0, + translate: pt(0.370, 2.627), rotate: 0, id: 'C7' }) -// mcu.vdda_cap_1.cap +// mcu.reset_cap.cap const C8 = board.add(C_0603_1608Metric, { - translate: pt(1.332, 0.647), rotate: 0, + translate: pt(0.526, 2.627), rotate: 0, id: 'C8' }) -// mcu.crystal.package -const X1 = board.add(Crystal_SMD_3225_4Pin_3_2x2_5mm, { - translate: pt(1.201, 0.512), rotate: 0, - id: 'X1' +// ledr.package +const D1 = board.add(LED_0603_1608Metric, { + translate: pt(2.251, 2.147), rotate: 0, + id: 'D1' }) -// mcu.crystal.cap_a -const C9 = board.add(C_0603_1608Metric, { - translate: pt(1.488, 0.647), rotate: 0, - id: 'C9' +// ledr.res +const R3 = board.add(R_0603_1608Metric, { + translate: pt(2.251, 2.244), rotate: 0, + id: 'R3' }) -// mcu.crystal.cap_b -const C10 = board.add(C_0603_1608Metric, { - translate: pt(1.644, 0.647), rotate: 0, - id: 'C10' +// enc.package +const SW13 = board.add(RotaryEncoder_Bourns_PEC11S, { + translate: pt(2.512, 1.634), rotate: 0, + id: 'SW13' }) -// mcu.swd.conn -const J2 = board.add(PinHeader_2x05_P1_27mm_Vertical_SMD, { - translate: pt(1.732, 0.146), rotate: 0, - id: 'J2' +// oled.device.conn +const J3 = board.add(Hirose_FH12_30S_0_5SH_1x30_1MP_P0_50mm_Horizontal, { + translate: pt(2.533, 1.054), rotate: 0, + id: 'J3' }) -// mcu.usb_pull.dp -const R3 = board.add(R_0603_1608Metric, { - translate: pt(1.800, 0.647), rotate: 0, - id: 'R3' +// oled.lcd +const U3 = board.add(Lcd_Er_Oled0_96_1_1_Outline, { + translate: pt(2.644, 0.516), rotate: 0, + id: 'U3' +}) +// oled.c1_cap +const C21 = board.add(C_0603_1608Metric, { + translate: pt(3.393, 0.889), rotate: 0, + id: 'C21' +}) +// oled.c2_cap +const C22 = board.add(C_0603_1608Metric, { + translate: pt(3.549, 0.889), rotate: 0, + id: 'C22' +}) +// oled.iref_res.res +const R4 = board.add(R_0603_1608Metric, { + translate: pt(3.046, 1.006), rotate: 0, + id: 'R4' +}) +// oled.vcomh_cap.cap +const C23 = board.add(C_0805_2012Metric, { + translate: pt(3.055, 0.899), rotate: 0, + id: 'C23' +}) +// oled.vdd_cap1.cap +const C24 = board.add(C_0603_1608Metric, { + translate: pt(3.202, 1.006), rotate: 0, + id: 'C24' +}) +// oled.vbat_cap.cap +const C25 = board.add(C_0603_1608Metric, { + translate: pt(3.358, 1.006), rotate: 0, + id: 'C25' +}) +// oled.vcc_cap.cap +const C26 = board.add(C_0805_2012Metric, { + translate: pt(3.228, 0.899), rotate: 0, + id: 'C26' +}) +// npx_shift.ic +const U4 = board.add(SOT_23_5, { + translate: pt(1.994, 2.185), rotate: 0, + id: 'U4' +}) +// npx_shift.vdd_cap.cap +const C27 = board.add(C_0603_1608Metric, { + translate: pt(1.972, 2.320), rotate: 0, + id: 'C27' +}) +// npx_tp.tp +const TP1 = board.add(TestPoint_Keystone_5015_Micro_Minature, { + translate: pt(2.512, 2.171), rotate: 0, + id: 'TP1' }) board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"]]}, - {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "33"], ["R3", "2"]]}, - {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "32"]]}, + {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "1"], ["C9", "1"], ["D5", "1"], ["C10", "1"], ["D7", "1"], ["C11", "1"], ["D9", "1"], ["C12", "1"], ["D11", "1"], ["C13", "1"], ["D13", "1"], ["C14", "1"], ["D15", "1"], ["C15", "1"], ["D17", "1"], ["C16", "1"], ["D19", "1"], ["C17", "1"], ["D21", "1"], ["C18", "1"], ["D23", "1"], ["C19", "1"], ["D25", "1"], ["C20", "1"], ["U4", "5"], ["C27", "1"]]}, + {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["X1", "2"], ["X1", "4"], ["C3", "2"], ["C4", "2"], ["U2", "16"], ["U2", "31"], ["U2", "32"], ["J2", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["D3", "3"], ["C9", "2"], ["D5", "3"], ["C10", "2"], ["D7", "3"], ["C11", "2"], ["D9", "3"], ["C12", "2"], ["D11", "3"], ["C13", "2"], ["D13", "3"], ["C14", "2"], ["D15", "3"], ["C15", "2"], ["D17", "3"], ["C16", "2"], ["D19", "3"], ["C17", "2"], ["D21", "3"], ["C18", "2"], ["D23", "3"], ["C19", "2"], ["D25", "3"], ["C20", "2"], ["SW13", "C"], ["SW13", "S2"], ["J3", "1"], ["J3", "10"], ["J3", "11"], ["J3", "12"], ["J3", "16"], ["J3", "17"], ["J3", "21"], ["J3", "22"], ["J3", "23"], ["J3", "24"], ["J3", "25"], ["J3", "29"], ["J3", "30"], ["J3", "8"], ["R4", "1"], ["C23", "2"], ["C24", "2"], ["C25", "2"], ["C26", "2"], ["U4", "1"], ["U4", "3"], ["C27", "2"]]}, + {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "22"]]}, + {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "21"]]}, {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, - {name: "reg.pwr_out", pads: [["U1", "2"], ["C2", "1"], ["U2", "1"], ["U2", "24"], ["U2", "36"], ["U2", "48"], ["U2", "9"], ["C3", "1"], ["C4", "1"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["C8", "1"], ["J2", "1"], ["R3", "1"]]}, - {name: "mcu.gpio.0_0", pads: [["U2", "10"], ["SW1", "2"], ["SW2", "2"], ["SW3", "2"]]}, - {name: "mcu.gpio.0_1", pads: [["U2", "11"], ["SW4", "2"], ["SW5", "2"], ["SW6", "2"]]}, - {name: "mcu.gpio.1_0", pads: [["U2", "12"], ["D1", "2"], ["D4", "2"]]}, - {name: "mcu.gpio.1_1", pads: [["U2", "13"], ["D2", "2"], ["D5", "2"]]}, - {name: "mcu.gpio.1_2", pads: [["U2", "14"], ["D3", "2"], ["D6", "2"]]}, - {name: "mcu.xtal_node.xi", pads: [["U2", "5"], ["X1", "1"], ["C9", "1"]]}, - {name: "mcu.xtal_node.xo", pads: [["U2", "6"], ["X1", "3"], ["C10", "1"]]}, - {name: "mcu.swd_node.swdio", pads: [["U2", "34"], ["J2", "2"]]}, - {name: "mcu.swd_node.swclk", pads: [["U2", "37"], ["J2", "4"]]}, - {name: "mcu.reset_node", pads: [["U2", "7"], ["J2", "10"]]}, - {name: "mcu.swd.tdi", pads: [["J2", "8"]]}, - {name: "mcu.swd.swo", pads: [["J2", "6"]]}, - {name: "sw.sw[0,0].sw", pads: [["SW1", "1"], ["D1", "1"]]}, - {name: "sw.sw[0,1].sw", pads: [["SW2", "1"], ["D2", "1"]]}, - {name: "sw.sw[0,2].sw", pads: [["SW3", "1"], ["D3", "1"]]}, - {name: "sw.sw[1,0].sw", pads: [["SW4", "1"], ["D4", "1"]]}, - {name: "sw.sw[1,1].sw", pads: [["SW5", "1"], ["D5", "1"]]}, - {name: "sw.sw[1,2].sw", pads: [["SW6", "1"], ["D6", "1"]]} + {name: "reg.pwr_out", pads: [["U1", "2"], ["C2", "1"], ["U2", "1"], ["U2", "17"], ["U2", "5"], ["J2", "1"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["D1", "2"], ["J3", "6"], ["J3", "9"], ["C24", "1"], ["C25", "1"]]}, + {name: "mcu.gpio.0_0", pads: [["U2", "19"], ["SW1", "2"], ["SW2", "2"], ["SW3", "2"]]}, + {name: "mcu.gpio.0_1", pads: [["U2", "20"], ["SW4", "2"], ["SW5", "2"], ["SW6", "2"]]}, + {name: "mcu.gpio.0_2", pads: [["U2", "25"], ["SW7", "2"], ["SW8", "2"], ["SW9", "2"]]}, + {name: "mcu.gpio.0_3", pads: [["U2", "26"], ["SW10", "2"], ["SW11", "2"], ["SW12", "2"]]}, + {name: "mcu.gpio.1_0", pads: [["U2", "27"], ["D2", "2"], ["D8", "2"], ["D14", "2"], ["D20", "2"]]}, + {name: "mcu.gpio.1_1", pads: [["U2", "28"], ["D4", "2"], ["D10", "2"], ["D16", "2"], ["D22", "2"]]}, + {name: "mcu.gpio.1_2", pads: [["U2", "29"], ["D6", "2"], ["D12", "2"], ["D18", "2"], ["D24", "2"]]}, + {name: "mcu.xtal_node.xi", pads: [["X1", "1"], ["C3", "1"], ["U2", "2"]]}, + {name: "mcu.xtal_node.xo", pads: [["X1", "3"], ["C4", "1"], ["U2", "3"]]}, + {name: "mcu.ic.nrst", pads: [["U2", "4"], ["C8", "1"]]}, + {name: "mcu.ic.swdio", pads: [["U2", "23"], ["J2", "3"]]}, + {name: "mcu.ic.swclk", pads: [["U2", "24"], ["J2", "4"]]}, + {name: "ledr.signal", pads: [["U2", "6"], ["R3", "2"]]}, + {name: "ledr.package.k", pads: [["D1", "1"], ["R3", "1"]]}, + {name: "sw.npx_din", pads: [["D3", "4"], ["U4", "4"], ["TP1", "1"]]}, + {name: "sw.npx_dout", pads: [["D25", "2"]]}, + {name: "sw.sw[0,0].npx_dout", pads: [["D3", "2"], ["D9", "4"]]}, + {name: "sw.sw[0,0].sw.sw", pads: [["SW1", "1"], ["D2", "1"]]}, + {name: "sw.sw[0,1].npx_din", pads: [["D5", "4"], ["D11", "2"]]}, + {name: "sw.sw[0,1].npx_dout", pads: [["D5", "2"], ["D7", "4"]]}, + {name: "sw.sw[0,1].sw.sw", pads: [["SW2", "1"], ["D4", "1"]]}, + {name: "sw.sw[0,2].npx_dout", pads: [["D7", "2"], ["D13", "4"]]}, + {name: "sw.sw[0,2].sw.sw", pads: [["SW3", "1"], ["D6", "1"]]}, + {name: "sw.sw[1,0].npx_dout", pads: [["D9", "2"], ["D15", "4"]]}, + {name: "sw.sw[1,0].sw.sw", pads: [["SW4", "1"], ["D8", "1"]]}, + {name: "sw.sw[1,1].npx_din", pads: [["D11", "4"], ["D17", "2"]]}, + {name: "sw.sw[1,1].sw.sw", pads: [["SW5", "1"], ["D10", "1"]]}, + {name: "sw.sw[1,2].npx_dout", pads: [["D13", "2"], ["D19", "4"]]}, + {name: "sw.sw[1,2].sw.sw", pads: [["SW6", "1"], ["D12", "1"]]}, + {name: "sw.sw[2,0].npx_dout", pads: [["D15", "2"], ["D21", "4"]]}, + {name: "sw.sw[2,0].sw.sw", pads: [["SW7", "1"], ["D14", "1"]]}, + {name: "sw.sw[2,1].npx_din", pads: [["D17", "4"], ["D23", "2"]]}, + {name: "sw.sw[2,1].sw.sw", pads: [["SW8", "1"], ["D16", "1"]]}, + {name: "sw.sw[2,2].npx_dout", pads: [["D19", "2"], ["D25", "4"]]}, + {name: "sw.sw[2,2].sw.sw", pads: [["SW9", "1"], ["D18", "1"]]}, + {name: "sw.sw[3,0].npx_dout", pads: [["D21", "2"], ["D23", "4"]]}, + {name: "sw.sw[3,0].sw.sw", pads: [["SW10", "1"], ["D20", "1"]]}, + {name: "sw.sw[3,1].sw.sw", pads: [["SW11", "1"], ["D22", "1"]]}, + {name: "sw.sw[3,2].sw.sw", pads: [["SW12", "1"], ["D24", "1"]]}, + {name: "enc.a", pads: [["U2", "7"], ["SW13", "A"]]}, + {name: "enc.b", pads: [["U2", "8"], ["SW13", "B"]]}, + {name: "enc.sw", pads: [["U2", "9"], ["SW13", "S1"]]}, + {name: "oled.reset", pads: [["U2", "15"], ["J3", "14"]]}, + {name: "oled.spi.sck", pads: [["U2", "11"], ["J3", "18"]]}, + {name: "oled.spi.mosi", pads: [["U2", "13"], ["J3", "19"]]}, + {name: "oled.spi.miso", pads: [["U2", "12"]]}, + {name: "oled.cs", pads: [["U2", "10"], ["J3", "13"]]}, + {name: "oled.dc", pads: [["U2", "14"], ["J3", "15"]]}, + {name: "oled.device.vcc", pads: [["J3", "28"], ["C26", "1"]]}, + {name: "oled.device.iref", pads: [["J3", "26"], ["R4", "2"]]}, + {name: "oled.device.vcomh", pads: [["J3", "27"], ["C23", "1"]]}, + {name: "oled.device.c1p", pads: [["J3", "4"], ["C21", "1"]]}, + {name: "oled.device.c1n", pads: [["J3", "5"], ["C21", "2"]]}, + {name: "oled.device.c2p", pads: [["J3", "2"], ["C22", "1"]]}, + {name: "oled.device.c2n", pads: [["J3", "3"], ["C22", "2"]]}, + {name: "oled.device.d2", pads: [["J3", "20"]]}, + {name: "npx_shift.input", pads: [["U2", "18"], ["U4", "2"]]} ]) const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(2.119685039370079, 2.1181102362204722); +const limit1 = pt(3.725196850393701, 2.7740157480314958); const xMin = Math.min(limit0[0], limit1[0]); const xMax = Math.max(limit0[0], limit1[0]); const yMin = Math.min(limit0[1], limit1[1]); @@ -158,9 +257,9 @@ renderPCB({ mmPerUnit: 25.4 }) -function SwitchMatrix_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { +function SwitchDiodeMatrixNeopixels_4_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { // Circuit generator params - const ncols = 2 + const ncols = 4 const nrows = 3 // Global params @@ -191,11 +290,11 @@ function SwitchMatrix_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0. }) diodePos = [buttonPos[0] + diodeOffset[0], buttonPos[1] + diodeOffset[1]] - obj[`D${1 + xIndex * nrows + yIndex}`] = diode = board.add( + obj[`D${2 + xIndex * nrows + yIndex}`] = diode = board.add( D_SOD_323, { translate: diodePos, rotate: 90, - id: `D${1 + xIndex * nrows + yIndex}` + id: `D${2 + xIndex * nrows + yIndex}` }) // create stub wire for button -> column common line diff --git a/examples/test_keyboard.py b/examples/test_keyboard.py index e751181a0..0868072e7 100644 --- a/examples/test_keyboard.py +++ b/examples/test_keyboard.py @@ -31,7 +31,7 @@ def contents(self) -> None: ImplicitConnect(self.reg.gnd, [Common]), ) as imp: self.mcu = imp.Block(IoController()) - self.connect(self.usb.usb, self.mcu.usb.request()) + (self.usb_esd,), self.usb_chain = self.chain(self.usb.usb, imp.Block(UsbEsdDiode()), self.mcu.usb.request()) # debugging LEDs (self.ledr,), _ = self.chain(imp.Block(IndicatorSinkLed(Led.Red)), self.mcu.gpio.request("led")) @@ -51,8 +51,7 @@ def contents(self) -> None: self.connect(self.mcu.gpio.request("oled_dc"), self.oled.dc) self.connect(self.mcu.gpio.request("oled_reset"), self.oled.reset) - # Vbus DOMAIN - + # Vbus 5v DOMAIN with self.implicit_connect( ImplicitConnect(self.usb.pwr, [Power]), ImplicitConnect(self.usb.gnd, [Common]), From 1043de8f90f38f28d82621a9b80fe37904503b49 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 16:28:59 -0700 Subject: [PATCH 16/22] change to col2row --- edg/circuits/SwitchMatrix.py | 57 ++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index fa4d74336..73a5a49b2 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -7,43 +7,48 @@ @abstract_block_default(lambda: DiodeSwitchCell) class SwitchCell(InternalBlock, Block): - """A single cell in the switch matrix, consisting of a switch and diode. - Provides a layer of hierarchy for layout replication.""" + """A single cell in the switch matrix.""" def __init__(self, voltage_drop: RangeLike): super().__init__() self.voltage_drop = self.ArgParameter(voltage_drop) - self.col = self.Port(DigitalSink()) # switch common, externally driven for column scan, assumed ideal - self.row = self.Port( - DigitalSource( # diode anode, externally pulled, driven to col by switch closure - voltage_out=self.col.link().voltage.lower() + voltage_drop, # use spec to avoid circular dependency - output_thresholds=(self.col.link().voltage + voltage_drop).hull(float("inf")), - low_driver=True, - high_driver=False, - ) - ) + self.row = self.Port(DigitalSink.empty()) + self.col = self.Port(DigitalSource.empty()) class DiodeSwitchCell(SwitchCell, InternalBlock): - """Implementation of the switch cell""" + """A single cell in the switch matrix, consisting of a switch and diode to support multiple key presses. + Provides a layer of hierarchy for layout replication.""" @override def contents(self) -> None: super().contents() + + self.col.init_from( + DigitalSource( # diode anode, externally pulled, driven to col by switch closure + voltage_out=self.row.link().voltage.lower() + + self.voltage_drop, # use spec to avoid circular dependency + output_thresholds=(self.row.link().voltage + self.voltage_drop).hull(float("inf")), + low_driver=True, + high_driver=False, + ) + ) + self.row.init_from(DigitalSink()) # switch common, externally driven for column scan, assumed ideal + self.sw = self.Block( - Switch(voltage=self.row.link().voltage - self.col.link().voltage, current=self.row.link().current_drawn) + Switch(voltage=self.col.link().voltage - self.row.link().voltage, current=self.col.link().current_drawn) ) self.d = self.Block( Diode( - current=self.row.link().current_drawn, - reverse_voltage=(self.row.link().voltage - self.col.link().voltage).abs(), + current=self.col.link().current_drawn, + reverse_voltage=(self.col.link().voltage - self.row.link().voltage).abs(), voltage_drop=self.voltage_drop, ) ) - self.connect(self.d.anode, self.row.net) - self.connect(self.d.cathode, self.sw.sw) - self.connect(self.sw.com, self.col.net) + self.connect(self.col.net, self.sw.sw) + self.connect(self.sw.com, self.d.anode) + self.connect(self.d.cathode, self.row.net) @abstract_block_default(lambda: DiodeSwitchCellNeopixelImp) @@ -78,20 +83,22 @@ class SwitchMatrix(InternalBlock, Block): def __init__(self, nrows: IntLike, ncols: IntLike, voltage_drop: RangeLike = (0, 0.7) * Volt): super().__init__() - self.rows = self.Port(Vector(DigitalSource.empty())) - self.cols = self.Port(Vector(DigitalSink.empty())) self.voltage_drop = self.ArgParameter(voltage_drop) - self.nrows = self.ArgParameter(nrows) self.ncols = self.ArgParameter(ncols) + self.rows = self.Port(Vector(DigitalSink.empty())) + self.cols = self.Port(Vector(DigitalSource.empty())) + class SwitchDiodeMatrix(SwitchMatrix, HumanInterface, GeneratorBlock, SvgPcbTemplateBlock): """A switch matrix, such as for a keyboard, that generates (nrows * ncols) switches while only using max(nrows, ncols) IOs. - Internally, the switches are in a matrix, with the driver driving one col low at a time while - reading which rows are low (with the other cols floating or weakly pulled high). + Internally, the switches are in a matrix and follows COL2ROW conventions: + - the driver drives one row low at a time, other rows are floating or weakly pulled high + - the columns are weakly pulled high, and read low when the switch is pressed + Internally, this uses the Switch abstract block, which can be refined into e.g. a tactile switch or mechanical keyswitch. This generates per-switch diodes which allows multiple keys to be pressed simultaneously. @@ -206,11 +213,11 @@ def generate(self) -> None: super().generate() for row in range(self.get(self.nrows)): - self.rows.append_elt(DigitalSource.empty(), str(row)) + self.rows.append_elt(DigitalSink.empty(), str(row)) self.sw = ElementDict[DiodeSwitchCell]() for col in range(self.get(self.ncols)): - col_port = self.cols.append_elt(DigitalSink.empty(), str(col)) + col_port = self.cols.append_elt(DigitalSource.empty(), str(col)) for row in range(self.get(self.nrows)): cell = self.sw[f"{col},{row}"] = self.Block(SwitchCell(voltage_drop=self.voltage_drop)) self.connect(cell.col, col_port) From bfec972180c4ee413e0c691106be82177f7d2733 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 16:33:06 -0700 Subject: [PATCH 17/22] Update SwitchMatrix.py --- edg/circuits/SwitchMatrix.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index 73a5a49b2..ab089bc13 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -51,7 +51,7 @@ def contents(self) -> None: self.connect(self.d.cathode, self.row.net) -@abstract_block_default(lambda: DiodeSwitchCellNeopixelImp) +@abstract_block_default(lambda: DiodeSwitchCellNeopixel) class SwitchCellNeopixel(BlockInterfaceMixin[SwitchCell], InternalBlock): """SwitchCell mixin that adds a neopixel to the switch cell, with power and data ports.""" @@ -64,7 +64,7 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.npx_gnd = self.Port(Ground.empty()) -class DiodeSwitchCellNeopixelImp(SwitchCellNeopixel, DiodeSwitchCell, InternalBlock): +class DiodeSwitchCellNeopixel(SwitchCellNeopixel, DiodeSwitchCell, InternalBlock): """SwitchCell implementation with neopixel.""" @override From 1d51d02c1f20f02c8c85c4423947134c87dbd91c Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 16:41:05 -0700 Subject: [PATCH 18/22] col2row netlist update --- examples/BasicKeyboard/BasicKeyboard.net.ref | 60 ++--- .../BasicKeyboard/BasicKeyboard.svgpcb.js | 22 +- .../DeskController/DeskController.net.ref | 60 ++--- .../DeskController/DeskController.svgpcb.js | 22 +- examples/Keyboard/Keyboard.net.ref | 221 ++++++++++-------- examples/Keyboard/Keyboard.svgpcb.js | 63 ++--- examples/test_keyboard.py | 3 +- 7 files changed, 236 insertions(+), 215 deletions(-) diff --git a/examples/BasicKeyboard/BasicKeyboard.net.ref b/examples/BasicKeyboard/BasicKeyboard.net.ref index 7df6f83e8..93eedd57d 100644 --- a/examples/BasicKeyboard/BasicKeyboard.net.ref +++ b/examples/BasicKeyboard/BasicKeyboard.net.ref @@ -159,48 +159,48 @@ (nets (net (code 1) (name "mcu.gpio.0_0") (node (ref U1) (pin 7)) - (node (ref SW1) (pin 2)) - (node (ref SW2) (pin 2)) - (node (ref SW3) (pin 2))) + (node (ref SW1) (pin 1)) + (node (ref SW2) (pin 1)) + (node (ref SW3) (pin 1))) (net (code 2) (name "mcu.gpio.0_1") (node (ref U1) (pin 8)) - (node (ref SW4) (pin 2)) - (node (ref SW5) (pin 2)) - (node (ref SW6) (pin 2))) + (node (ref SW4) (pin 1)) + (node (ref SW5) (pin 1)) + (node (ref SW6) (pin 1))) (net (code 3) (name "mcu.gpio.1_0") (node (ref U1) (pin 9)) - (node (ref D1) (pin 2)) - (node (ref D4) (pin 2))) + (node (ref D1) (pin 1)) + (node (ref D4) (pin 1))) (net (code 4) (name "mcu.gpio.1_1") (node (ref U1) (pin 11)) - (node (ref D2) (pin 2)) - (node (ref D5) (pin 2))) + (node (ref D2) (pin 1)) + (node (ref D5) (pin 1))) (net (code 5) (name "mcu.gpio.1_2") (node (ref U1) (pin 10)) - (node (ref D3) (pin 2)) - (node (ref D6) (pin 2))) + (node (ref D3) (pin 1)) + (node (ref D6) (pin 1))) (net (code 6) (name "mcu.gnd") (node (ref U1) (pin 13))) (net (code 7) (name "mcu.pwr_out") (node (ref U1) (pin 12))) (net (code 8) (name "mcu.vusb_out") (node (ref U1) (pin 14))) -(net (code 9) (name "sw.sw[0,0].sw.sw") - (node (ref SW1) (pin 1)) - (node (ref D1) (pin 1))) -(net (code 10) (name "sw.sw[0,1].sw.sw") - (node (ref SW2) (pin 1)) - (node (ref D2) (pin 1))) -(net (code 11) (name "sw.sw[0,2].sw.sw") - (node (ref SW3) (pin 1)) - (node (ref D3) (pin 1))) -(net (code 12) (name "sw.sw[1,0].sw.sw") - (node (ref SW4) (pin 1)) - (node (ref D4) (pin 1))) -(net (code 13) (name "sw.sw[1,1].sw.sw") - (node (ref SW5) (pin 1)) - (node (ref D5) (pin 1))) -(net (code 14) (name "sw.sw[1,2].sw.sw") - (node (ref SW6) (pin 1)) - (node (ref D6) (pin 1)))) +(net (code 9) (name "sw.sw[0,0].sw.com") + (node (ref SW1) (pin 2)) + (node (ref D1) (pin 2))) +(net (code 10) (name "sw.sw[0,1].sw.com") + (node (ref SW2) (pin 2)) + (node (ref D2) (pin 2))) +(net (code 11) (name "sw.sw[0,2].sw.com") + (node (ref SW3) (pin 2)) + (node (ref D3) (pin 2))) +(net (code 12) (name "sw.sw[1,0].sw.com") + (node (ref SW4) (pin 2)) + (node (ref D4) (pin 2))) +(net (code 13) (name "sw.sw[1,1].sw.com") + (node (ref SW5) (pin 2)) + (node (ref D5) (pin 2))) +(net (code 14) (name "sw.sw[1,2].sw.com") + (node (ref SW6) (pin 2)) + (node (ref D6) (pin 2)))) ) \ No newline at end of file diff --git a/examples/BasicKeyboard/BasicKeyboard.svgpcb.js b/examples/BasicKeyboard/BasicKeyboard.svgpcb.js index 424b2aba6..b59f03134 100644 --- a/examples/BasicKeyboard/BasicKeyboard.svgpcb.js +++ b/examples/BasicKeyboard/BasicKeyboard.svgpcb.js @@ -8,20 +8,20 @@ const U1 = board.add(XIAO_RP2040_SMD, { }) board.setNetlist([ - {name: "mcu.gpio.0_0", pads: [["U1", "7"], ["SW1", "2"], ["SW2", "2"], ["SW3", "2"]]}, - {name: "mcu.gpio.0_1", pads: [["U1", "8"], ["SW4", "2"], ["SW5", "2"], ["SW6", "2"]]}, - {name: "mcu.gpio.1_0", pads: [["U1", "9"], ["D1", "2"], ["D4", "2"]]}, - {name: "mcu.gpio.1_1", pads: [["U1", "11"], ["D2", "2"], ["D5", "2"]]}, - {name: "mcu.gpio.1_2", pads: [["U1", "10"], ["D3", "2"], ["D6", "2"]]}, + {name: "mcu.gpio.0_0", pads: [["U1", "7"], ["SW1", "1"], ["SW2", "1"], ["SW3", "1"]]}, + {name: "mcu.gpio.0_1", pads: [["U1", "8"], ["SW4", "1"], ["SW5", "1"], ["SW6", "1"]]}, + {name: "mcu.gpio.1_0", pads: [["U1", "9"], ["D1", "1"], ["D4", "1"]]}, + {name: "mcu.gpio.1_1", pads: [["U1", "11"], ["D2", "1"], ["D5", "1"]]}, + {name: "mcu.gpio.1_2", pads: [["U1", "10"], ["D3", "1"], ["D6", "1"]]}, {name: "mcu.gnd", pads: [["U1", "13"]]}, {name: "mcu.pwr_out", pads: [["U1", "12"]]}, {name: "mcu.vusb_out", pads: [["U1", "14"]]}, - {name: "sw.sw[0,0].sw.sw", pads: [["SW1", "1"], ["D1", "1"]]}, - {name: "sw.sw[0,1].sw.sw", pads: [["SW2", "1"], ["D2", "1"]]}, - {name: "sw.sw[0,2].sw.sw", pads: [["SW3", "1"], ["D3", "1"]]}, - {name: "sw.sw[1,0].sw.sw", pads: [["SW4", "1"], ["D4", "1"]]}, - {name: "sw.sw[1,1].sw.sw", pads: [["SW5", "1"], ["D5", "1"]]}, - {name: "sw.sw[1,2].sw.sw", pads: [["SW6", "1"], ["D6", "1"]]} + {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D1", "2"]]}, + {name: "sw.sw[0,1].sw.com", pads: [["SW2", "2"], ["D2", "2"]]}, + {name: "sw.sw[0,2].sw.com", pads: [["SW3", "2"], ["D3", "2"]]}, + {name: "sw.sw[1,0].sw.com", pads: [["SW4", "2"], ["D4", "2"]]}, + {name: "sw.sw[1,1].sw.com", pads: [["SW5", "2"], ["D5", "2"]]}, + {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D6", "2"]]} ]) const limit0 = pt(-0.07874015748031496, -0.07874015748031496); diff --git a/examples/DeskController/DeskController.net.ref b/examples/DeskController/DeskController.net.ref index 0b25b8608..ce51ddc8c 100644 --- a/examples/DeskController/DeskController.net.ref +++ b/examples/DeskController/DeskController.net.ref @@ -1020,26 +1020,26 @@ (node (ref DU2) (pin 4))) (net (code 13) (name "Dmcu.gpio.swc_0") (node (ref DU2) (pin 5)) - (node (ref DSW1) (pin 2)) - (node (ref DSW2) (pin 2)) - (node (ref DSW3) (pin 2))) + (node (ref DSW1) (pin 1)) + (node (ref DSW2) (pin 1)) + (node (ref DSW3) (pin 1))) (net (code 14) (name "Dmcu.gpio.swc_1") (node (ref DU2) (pin 15)) - (node (ref DSW4) (pin 2)) - (node (ref DSW5) (pin 2)) - (node (ref DSW6) (pin 2))) + (node (ref DSW4) (pin 1)) + (node (ref DSW5) (pin 1)) + (node (ref DSW6) (pin 1))) (net (code 15) (name "Dmcu.gpio.swr_0") (node (ref DU2) (pin 14)) - (node (ref DD2) (pin 2)) - (node (ref DD5) (pin 2))) + (node (ref DD2) (pin 1)) + (node (ref DD5) (pin 1))) (net (code 16) (name "Dmcu.gpio.swr_1") (node (ref DU2) (pin 13)) - (node (ref DD3) (pin 2)) - (node (ref DD6) (pin 2))) + (node (ref DD3) (pin 1)) + (node (ref DD6) (pin 1))) (net (code 17) (name "Dmcu.gpio.swr_2") (node (ref DU2) (pin 10)) - (node (ref DD4) (pin 2)) - (node (ref DD7) (pin 2))) + (node (ref DD4) (pin 1)) + (node (ref DD7) (pin 1))) (net (code 18) (name "Dmcu.program_uart_node.a_tx") (node (ref DJ2) (pin 4)) (node (ref DU2) (pin 11))) @@ -1055,24 +1055,24 @@ (node (ref DJ2) (pin 2)) (node (ref DU2) (pin 8)) (node (ref DD8) (pin 2))) -(net (code 22) (name "Dsw.sw[0,0].sw.sw") - (node (ref DSW1) (pin 1)) - (node (ref DD2) (pin 1))) -(net (code 23) (name "Dsw.sw[0,1].sw.sw") - (node (ref DSW2) (pin 1)) - (node (ref DD3) (pin 1))) -(net (code 24) (name "Dsw.sw[0,2].sw.sw") - (node (ref DSW3) (pin 1)) - (node (ref DD4) (pin 1))) -(net (code 25) (name "Dsw.sw[1,0].sw.sw") - (node (ref DSW4) (pin 1)) - (node (ref DD5) (pin 1))) -(net (code 26) (name "Dsw.sw[1,1].sw.sw") - (node (ref DSW5) (pin 1)) - (node (ref DD6) (pin 1))) -(net (code 27) (name "Dsw.sw[1,2].sw.sw") - (node (ref DSW6) (pin 1)) - (node (ref DD7) (pin 1))) +(net (code 22) (name "Dsw.sw[0,0].sw.com") + (node (ref DSW1) (pin 2)) + (node (ref DD2) (pin 2))) +(net (code 23) (name "Dsw.sw[0,1].sw.com") + (node (ref DSW2) (pin 2)) + (node (ref DD3) (pin 2))) +(net (code 24) (name "Dsw.sw[0,2].sw.com") + (node (ref DSW3) (pin 2)) + (node (ref DD4) (pin 2))) +(net (code 25) (name "Dsw.sw[1,0].sw.com") + (node (ref DSW4) (pin 2)) + (node (ref DD5) (pin 2))) +(net (code 26) (name "Dsw.sw[1,1].sw.com") + (node (ref DSW5) (pin 2)) + (node (ref DD6) (pin 2))) +(net (code 27) (name "Dsw.sw[1,2].sw.com") + (node (ref DSW6) (pin 2)) + (node (ref DD7) (pin 2))) (net (code 28) (name "Dledr.package.k") (node (ref DD8) (pin 1)) (node (ref DR4) (pin 1))) diff --git a/examples/DeskController/DeskController.svgpcb.js b/examples/DeskController/DeskController.svgpcb.js index 30c1e3519..de6881907 100644 --- a/examples/DeskController/DeskController.svgpcb.js +++ b/examples/DeskController/DeskController.svgpcb.js @@ -325,21 +325,21 @@ board.setNetlist([ {name: "Dconn.uart.rx", pads: [["DJ1", "5"], ["DQ1", "3"]]}, {name: "Dconn_shift.lv_uart.tx", pads: [["DQ1", "2"], ["DR1", "2"], ["DU2", "3"]]}, {name: "Dconn_shift.lv_uart.rx", pads: [["DQ2", "2"], ["DR2", "2"], ["DU2", "4"]]}, - {name: "Dmcu.gpio.swc_0", pads: [["DU2", "5"], ["DSW1", "2"], ["DSW2", "2"], ["DSW3", "2"]]}, - {name: "Dmcu.gpio.swc_1", pads: [["DU2", "15"], ["DSW4", "2"], ["DSW5", "2"], ["DSW6", "2"]]}, - {name: "Dmcu.gpio.swr_0", pads: [["DU2", "14"], ["DD2", "2"], ["DD5", "2"]]}, - {name: "Dmcu.gpio.swr_1", pads: [["DU2", "13"], ["DD3", "2"], ["DD6", "2"]]}, - {name: "Dmcu.gpio.swr_2", pads: [["DU2", "10"], ["DD4", "2"], ["DD7", "2"]]}, + {name: "Dmcu.gpio.swc_0", pads: [["DU2", "5"], ["DSW1", "1"], ["DSW2", "1"], ["DSW3", "1"]]}, + {name: "Dmcu.gpio.swc_1", pads: [["DU2", "15"], ["DSW4", "1"], ["DSW5", "1"], ["DSW6", "1"]]}, + {name: "Dmcu.gpio.swr_0", pads: [["DU2", "14"], ["DD2", "1"], ["DD5", "1"]]}, + {name: "Dmcu.gpio.swr_1", pads: [["DU2", "13"], ["DD3", "1"], ["DD6", "1"]]}, + {name: "Dmcu.gpio.swr_2", pads: [["DU2", "10"], ["DD4", "1"], ["DD7", "1"]]}, {name: "Dmcu.program_uart_node.a_tx", pads: [["DJ2", "4"], ["DU2", "11"]]}, {name: "Dmcu.program_uart_node.b_tx", pads: [["DJ2", "3"], ["DU2", "12"]]}, {name: "Dmcu.program_en_node", pads: [["DJ2", "6"], ["DU2", "2"], ["DR3", "2"], ["DC5", "1"]]}, {name: "Dmcu.program_boot_node", pads: [["DJ2", "2"], ["DU2", "8"], ["DD8", "2"]]}, - {name: "Dsw.sw[0,0].sw.sw", pads: [["DSW1", "1"], ["DD2", "1"]]}, - {name: "Dsw.sw[0,1].sw.sw", pads: [["DSW2", "1"], ["DD3", "1"]]}, - {name: "Dsw.sw[0,2].sw.sw", pads: [["DSW3", "1"], ["DD4", "1"]]}, - {name: "Dsw.sw[1,0].sw.sw", pads: [["DSW4", "1"], ["DD5", "1"]]}, - {name: "Dsw.sw[1,1].sw.sw", pads: [["DSW5", "1"], ["DD6", "1"]]}, - {name: "Dsw.sw[1,2].sw.sw", pads: [["DSW6", "1"], ["DD7", "1"]]}, + {name: "Dsw.sw[0,0].sw.com", pads: [["DSW1", "2"], ["DD2", "2"]]}, + {name: "Dsw.sw[0,1].sw.com", pads: [["DSW2", "2"], ["DD3", "2"]]}, + {name: "Dsw.sw[0,2].sw.com", pads: [["DSW3", "2"], ["DD4", "2"]]}, + {name: "Dsw.sw[1,0].sw.com", pads: [["DSW4", "2"], ["DD5", "2"]]}, + {name: "Dsw.sw[1,1].sw.com", pads: [["DSW5", "2"], ["DD6", "2"]]}, + {name: "Dsw.sw[1,2].sw.com", pads: [["DSW6", "2"], ["DD7", "2"]]}, {name: "Dledr.package.k", pads: [["DD8", "1"], ["DR4", "1"]]}, {name: "Doled.reset", pads: [["DU2", "16"], ["DJ3", "17"]]}, {name: "Doled.i2c.scl", pads: [["DU2", "17"], ["DJ3", "13"], ["DR6", "2"]]}, diff --git a/examples/Keyboard/Keyboard.net.ref b/examples/Keyboard/Keyboard.net.ref index c930f58cb..10076a334 100644 --- a/examples/Keyboard/Keyboard.net.ref +++ b/examples/Keyboard/Keyboard.net.ref @@ -180,6 +180,18 @@ (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) (tstamps "12d103b7")) +(comp (ref "U3") + (value "usb_esd") + (footprint "Package_TO_SOT_SMD:SOT-23") + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "")) + (property (name "edg_path") (value "usb_esd")) + (property (name "edg_short_path") (value "usb_esd")) + (property (name "edg_refdes") (value "U3")) + (property (name "edg_part") (value "PESD5V0X1BT (Nexperia)")) + (property (name "edg_value") (value "PESD5V0X1BT")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "0bcb02e6")) (comp (ref "D1") (value "ledr.package") (footprint "LED_SMD:LED_0603_1608Metric") @@ -208,7 +220,7 @@ (value "sw.sw[0,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,0]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,0].sw")) (property (name "edg_short_path") (value "sw.sw[0,0].sw")) (property (name "edg_refdes") (value "SW1")) @@ -220,7 +232,7 @@ (value "sw.sw[0,0].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[0,0]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,0].d")) (property (name "edg_short_path") (value "sw.sw[0,0].d")) (property (name "edg_refdes") (value "D2")) @@ -256,7 +268,7 @@ (value "sw.sw[0,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,1]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,1].sw")) (property (name "edg_short_path") (value "sw.sw[0,1].sw")) (property (name "edg_refdes") (value "SW2")) @@ -268,7 +280,7 @@ (value "sw.sw[0,1].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[0,1]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,1].d")) (property (name "edg_short_path") (value "sw.sw[0,1].d")) (property (name "edg_refdes") (value "D4")) @@ -304,7 +316,7 @@ (value "sw.sw[0,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,2]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,2].sw")) (property (name "edg_short_path") (value "sw.sw[0,2].sw")) (property (name "edg_refdes") (value "SW3")) @@ -316,7 +328,7 @@ (value "sw.sw[0,2].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[0,2]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,2].d")) (property (name "edg_short_path") (value "sw.sw[0,2].d")) (property (name "edg_refdes") (value "D6")) @@ -352,7 +364,7 @@ (value "sw.sw[1,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,0]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,0].sw")) (property (name "edg_short_path") (value "sw.sw[1,0].sw")) (property (name "edg_refdes") (value "SW4")) @@ -364,7 +376,7 @@ (value "sw.sw[1,0].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[1,0]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,0].d")) (property (name "edg_short_path") (value "sw.sw[1,0].d")) (property (name "edg_refdes") (value "D8")) @@ -400,7 +412,7 @@ (value "sw.sw[1,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,1]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,1].sw")) (property (name "edg_short_path") (value "sw.sw[1,1].sw")) (property (name "edg_refdes") (value "SW5")) @@ -412,7 +424,7 @@ (value "sw.sw[1,1].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[1,1]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,1].d")) (property (name "edg_short_path") (value "sw.sw[1,1].d")) (property (name "edg_refdes") (value "D10")) @@ -448,7 +460,7 @@ (value "sw.sw[1,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,2]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,2].sw")) (property (name "edg_short_path") (value "sw.sw[1,2].sw")) (property (name "edg_refdes") (value "SW6")) @@ -460,7 +472,7 @@ (value "sw.sw[1,2].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[1,2]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,2].d")) (property (name "edg_short_path") (value "sw.sw[1,2].d")) (property (name "edg_refdes") (value "D12")) @@ -496,7 +508,7 @@ (value "sw.sw[2,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[2,0]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,0].sw")) (property (name "edg_short_path") (value "sw.sw[2,0].sw")) (property (name "edg_refdes") (value "SW7")) @@ -508,7 +520,7 @@ (value "sw.sw[2,0].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[2,0]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,0].d")) (property (name "edg_short_path") (value "sw.sw[2,0].d")) (property (name "edg_refdes") (value "D14")) @@ -544,7 +556,7 @@ (value "sw.sw[2,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[2,1]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,1].sw")) (property (name "edg_short_path") (value "sw.sw[2,1].sw")) (property (name "edg_refdes") (value "SW8")) @@ -556,7 +568,7 @@ (value "sw.sw[2,1].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[2,1]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,1].d")) (property (name "edg_short_path") (value "sw.sw[2,1].d")) (property (name "edg_refdes") (value "D16")) @@ -592,7 +604,7 @@ (value "sw.sw[2,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[2,2]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,2].sw")) (property (name "edg_short_path") (value "sw.sw[2,2].sw")) (property (name "edg_refdes") (value "SW9")) @@ -604,7 +616,7 @@ (value "sw.sw[2,2].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[2,2]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,2].d")) (property (name "edg_short_path") (value "sw.sw[2,2].d")) (property (name "edg_refdes") (value "D18")) @@ -640,7 +652,7 @@ (value "sw.sw[3,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[3,0]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[3,0].sw")) (property (name "edg_short_path") (value "sw.sw[3,0].sw")) (property (name "edg_refdes") (value "SW10")) @@ -652,7 +664,7 @@ (value "sw.sw[3,0].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[3,0]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[3,0].d")) (property (name "edg_short_path") (value "sw.sw[3,0].d")) (property (name "edg_refdes") (value "D20")) @@ -688,7 +700,7 @@ (value "sw.sw[3,1].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[3,1]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[3,1].sw")) (property (name "edg_short_path") (value "sw.sw[3,1].sw")) (property (name "edg_refdes") (value "SW11")) @@ -700,7 +712,7 @@ (value "sw.sw[3,1].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[3,1]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[3,1].d")) (property (name "edg_short_path") (value "sw.sw[3,1].d")) (property (name "edg_refdes") (value "D22")) @@ -736,7 +748,7 @@ (value "sw.sw[3,2].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[3,2]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[3,2].sw")) (property (name "edg_short_path") (value "sw.sw[3,2].sw")) (property (name "edg_refdes") (value "SW12")) @@ -748,7 +760,7 @@ (value "sw.sw[3,2].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[3,2]")) - (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixelImp")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[3,2].d")) (property (name "edg_short_path") (value "sw.sw[3,2].d")) (property (name "edg_refdes") (value "D24")) @@ -804,14 +816,14 @@ (property (name "edg_value") (value "AFC01-S30FC*-00")) (sheetpath (names "/oled/") (tstamps "/043201a5/")) (tstamps "08950271")) -(comp (ref "U3") +(comp (ref "U4") (value "oled.lcd") (footprint "edg:Lcd_Er_Oled0.96_1.1_Outline") (property (name "Sheetname") (value "oled")) (property (name "Sheetfile") (value "edg.parts.display.oled.Er_Oled_096_1_1.Er_Oled_096_1_1")) (property (name "edg_path") (value "oled.lcd")) (property (name "edg_short_path") (value "oled.lcd")) - (property (name "edg_refdes") (value "U3")) + (property (name "edg_refdes") (value "U4")) (property (name "edg_part") (value "ER-OLED-0.96-1.1 (EastRising)")) (property (name "edg_value") (value "ER-OLED-0.96-1.1")) (sheetpath (names "/oled/") (tstamps "/043201a5/")) @@ -900,14 +912,14 @@ (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/oled/") (tstamps "/043201a5/")) (tstamps "0b5902d0")) -(comp (ref "U4") +(comp (ref "U5") (value "npx_shift.ic") (footprint "Package_TO_SOT_SMD:SOT-23-5") (property (name "Sheetname") (value "npx_shift")) (property (name "Sheetfile") (value "edg.parts.logic.Logic_74Ahct.L74Ahct1g125")) (property (name "edg_path") (value "npx_shift.ic")) (property (name "edg_short_path") (value "npx_shift.ic")) - (property (name "edg_refdes") (value "U4")) + (property (name "edg_refdes") (value "U5")) (property (name "edg_part") (value "74AHCT1G125W5-7 (Diodes Incorporated)")) (property (name "edg_value") (value "74AHCT1G125W5-7")) (sheetpath (names "/npx_shift/") (tstamps "/134303d4/")) @@ -937,7 +949,17 @@ (sheetpath (names "/") (tstamps "/")) (tstamps "091f029a"))) (nets -(net (code 1) (name "usb.pwr") +(net (code 1) (name "usb_chain_0.d_P") + (node (ref J1) (pin A6)) + (node (ref J1) (pin B6)) + (node (ref U2) (pin 22)) + (node (ref U3) (pin 2))) +(net (code 2) (name "usb_chain_0.d_N") + (node (ref J1) (pin A7)) + (node (ref J1) (pin B7)) + (node (ref U2) (pin 21)) + (node (ref U3) (pin 1))) +(net (code 3) (name "usb.pwr") (node (ref J1) (pin A4)) (node (ref J1) (pin A9)) (node (ref J1) (pin B4)) @@ -968,9 +990,9 @@ (node (ref C19) (pin 1)) (node (ref D25) (pin 1)) (node (ref C20) (pin 1)) - (node (ref U4) (pin 5)) + (node (ref U5) (pin 5)) (node (ref C27) (pin 1))) -(net (code 2) (name "usb.gnd") +(net (code 4) (name "usb.gnd") (node (ref J1) (pin A1)) (node (ref J1) (pin A12)) (node (ref J1) (pin B1)) @@ -993,6 +1015,7 @@ (node (ref C6) (pin 2)) (node (ref C7) (pin 2)) (node (ref C8) (pin 2)) + (node (ref U3) (pin 3)) (node (ref D3) (pin 3)) (node (ref C9) (pin 2)) (node (ref D5) (pin 3)) @@ -1038,17 +1061,9 @@ (node (ref C24) (pin 2)) (node (ref C25) (pin 2)) (node (ref C26) (pin 2)) - (node (ref U4) (pin 1)) - (node (ref U4) (pin 3)) + (node (ref U5) (pin 1)) + (node (ref U5) (pin 3)) (node (ref C27) (pin 2))) -(net (code 3) (name "usb.usb.dp") - (node (ref J1) (pin A6)) - (node (ref J1) (pin B6)) - (node (ref U2) (pin 22))) -(net (code 4) (name "usb.usb.dm") - (node (ref J1) (pin A7)) - (node (ref J1) (pin B7)) - (node (ref U2) (pin 21))) (net (code 5) (name "usb.conn.cc.cc1") (node (ref J1) (pin A5)) (node (ref R1) (pin 2))) @@ -1072,42 +1087,42 @@ (node (ref C25) (pin 1))) (net (code 8) (name "mcu.gpio.0_0") (node (ref U2) (pin 19)) - (node (ref SW1) (pin 2)) - (node (ref SW2) (pin 2)) - (node (ref SW3) (pin 2))) + (node (ref SW1) (pin 1)) + (node (ref SW2) (pin 1)) + (node (ref SW3) (pin 1))) (net (code 9) (name "mcu.gpio.0_1") (node (ref U2) (pin 20)) - (node (ref SW4) (pin 2)) - (node (ref SW5) (pin 2)) - (node (ref SW6) (pin 2))) + (node (ref SW4) (pin 1)) + (node (ref SW5) (pin 1)) + (node (ref SW6) (pin 1))) (net (code 10) (name "mcu.gpio.0_2") (node (ref U2) (pin 25)) - (node (ref SW7) (pin 2)) - (node (ref SW8) (pin 2)) - (node (ref SW9) (pin 2))) + (node (ref SW7) (pin 1)) + (node (ref SW8) (pin 1)) + (node (ref SW9) (pin 1))) (net (code 11) (name "mcu.gpio.0_3") (node (ref U2) (pin 26)) - (node (ref SW10) (pin 2)) - (node (ref SW11) (pin 2)) - (node (ref SW12) (pin 2))) + (node (ref SW10) (pin 1)) + (node (ref SW11) (pin 1)) + (node (ref SW12) (pin 1))) (net (code 12) (name "mcu.gpio.1_0") (node (ref U2) (pin 27)) - (node (ref D2) (pin 2)) - (node (ref D8) (pin 2)) - (node (ref D14) (pin 2)) - (node (ref D20) (pin 2))) + (node (ref D2) (pin 1)) + (node (ref D8) (pin 1)) + (node (ref D14) (pin 1)) + (node (ref D20) (pin 1))) (net (code 13) (name "mcu.gpio.1_1") (node (ref U2) (pin 28)) - (node (ref D4) (pin 2)) - (node (ref D10) (pin 2)) - (node (ref D16) (pin 2)) - (node (ref D22) (pin 2))) + (node (ref D4) (pin 1)) + (node (ref D10) (pin 1)) + (node (ref D16) (pin 1)) + (node (ref D22) (pin 1))) (net (code 14) (name "mcu.gpio.1_2") (node (ref U2) (pin 29)) - (node (ref D6) (pin 2)) - (node (ref D12) (pin 2)) - (node (ref D18) (pin 2)) - (node (ref D24) (pin 2))) + (node (ref D6) (pin 1)) + (node (ref D12) (pin 1)) + (node (ref D18) (pin 1)) + (node (ref D24) (pin 1))) (net (code 15) (name "mcu.xtal_node.xi") (node (ref X1) (pin 1)) (node (ref C3) (pin 1)) @@ -1133,79 +1148,79 @@ (node (ref R3) (pin 1))) (net (code 22) (name "sw.npx_din") (node (ref D3) (pin 4)) - (node (ref U4) (pin 4)) + (node (ref U5) (pin 4)) (node (ref TP1) (pin 1))) (net (code 23) (name "sw.npx_dout") (node (ref D25) (pin 2))) (net (code 24) (name "sw.sw[0,0].npx_dout") (node (ref D3) (pin 2)) (node (ref D9) (pin 4))) -(net (code 25) (name "sw.sw[0,0].sw.sw") - (node (ref SW1) (pin 1)) - (node (ref D2) (pin 1))) +(net (code 25) (name "sw.sw[0,0].sw.com") + (node (ref SW1) (pin 2)) + (node (ref D2) (pin 2))) (net (code 26) (name "sw.sw[0,1].npx_din") (node (ref D5) (pin 4)) (node (ref D11) (pin 2))) (net (code 27) (name "sw.sw[0,1].npx_dout") (node (ref D5) (pin 2)) (node (ref D7) (pin 4))) -(net (code 28) (name "sw.sw[0,1].sw.sw") - (node (ref SW2) (pin 1)) - (node (ref D4) (pin 1))) +(net (code 28) (name "sw.sw[0,1].sw.com") + (node (ref SW2) (pin 2)) + (node (ref D4) (pin 2))) (net (code 29) (name "sw.sw[0,2].npx_dout") (node (ref D7) (pin 2)) (node (ref D13) (pin 4))) -(net (code 30) (name "sw.sw[0,2].sw.sw") - (node (ref SW3) (pin 1)) - (node (ref D6) (pin 1))) +(net (code 30) (name "sw.sw[0,2].sw.com") + (node (ref SW3) (pin 2)) + (node (ref D6) (pin 2))) (net (code 31) (name "sw.sw[1,0].npx_dout") (node (ref D9) (pin 2)) (node (ref D15) (pin 4))) -(net (code 32) (name "sw.sw[1,0].sw.sw") - (node (ref SW4) (pin 1)) - (node (ref D8) (pin 1))) +(net (code 32) (name "sw.sw[1,0].sw.com") + (node (ref SW4) (pin 2)) + (node (ref D8) (pin 2))) (net (code 33) (name "sw.sw[1,1].npx_din") (node (ref D11) (pin 4)) (node (ref D17) (pin 2))) -(net (code 34) (name "sw.sw[1,1].sw.sw") - (node (ref SW5) (pin 1)) - (node (ref D10) (pin 1))) +(net (code 34) (name "sw.sw[1,1].sw.com") + (node (ref SW5) (pin 2)) + (node (ref D10) (pin 2))) (net (code 35) (name "sw.sw[1,2].npx_dout") (node (ref D13) (pin 2)) (node (ref D19) (pin 4))) -(net (code 36) (name "sw.sw[1,2].sw.sw") - (node (ref SW6) (pin 1)) - (node (ref D12) (pin 1))) +(net (code 36) (name "sw.sw[1,2].sw.com") + (node (ref SW6) (pin 2)) + (node (ref D12) (pin 2))) (net (code 37) (name "sw.sw[2,0].npx_dout") (node (ref D15) (pin 2)) (node (ref D21) (pin 4))) -(net (code 38) (name "sw.sw[2,0].sw.sw") - (node (ref SW7) (pin 1)) - (node (ref D14) (pin 1))) +(net (code 38) (name "sw.sw[2,0].sw.com") + (node (ref SW7) (pin 2)) + (node (ref D14) (pin 2))) (net (code 39) (name "sw.sw[2,1].npx_din") (node (ref D17) (pin 4)) (node (ref D23) (pin 2))) -(net (code 40) (name "sw.sw[2,1].sw.sw") - (node (ref SW8) (pin 1)) - (node (ref D16) (pin 1))) +(net (code 40) (name "sw.sw[2,1].sw.com") + (node (ref SW8) (pin 2)) + (node (ref D16) (pin 2))) (net (code 41) (name "sw.sw[2,2].npx_dout") (node (ref D19) (pin 2)) (node (ref D25) (pin 4))) -(net (code 42) (name "sw.sw[2,2].sw.sw") - (node (ref SW9) (pin 1)) - (node (ref D18) (pin 1))) +(net (code 42) (name "sw.sw[2,2].sw.com") + (node (ref SW9) (pin 2)) + (node (ref D18) (pin 2))) (net (code 43) (name "sw.sw[3,0].npx_dout") (node (ref D21) (pin 2)) (node (ref D23) (pin 4))) -(net (code 44) (name "sw.sw[3,0].sw.sw") - (node (ref SW10) (pin 1)) - (node (ref D20) (pin 1))) -(net (code 45) (name "sw.sw[3,1].sw.sw") - (node (ref SW11) (pin 1)) - (node (ref D22) (pin 1))) -(net (code 46) (name "sw.sw[3,2].sw.sw") - (node (ref SW12) (pin 1)) - (node (ref D24) (pin 1))) +(net (code 44) (name "sw.sw[3,0].sw.com") + (node (ref SW10) (pin 2)) + (node (ref D20) (pin 2))) +(net (code 45) (name "sw.sw[3,1].sw.com") + (node (ref SW11) (pin 2)) + (node (ref D22) (pin 2))) +(net (code 46) (name "sw.sw[3,2].sw.com") + (node (ref SW12) (pin 2)) + (node (ref D24) (pin 2))) (net (code 47) (name "enc.a") (node (ref U2) (pin 7)) (node (ref SW13) (pin A))) @@ -1257,5 +1272,5 @@ (node (ref J3) (pin 20))) (net (code 64) (name "npx_shift.input") (node (ref U2) (pin 18)) - (node (ref U4) (pin 2)))) + (node (ref U5) (pin 2)))) ) \ No newline at end of file diff --git a/examples/Keyboard/Keyboard.svgpcb.js b/examples/Keyboard/Keyboard.svgpcb.js index dcc088edc..fc8489d91 100644 --- a/examples/Keyboard/Keyboard.svgpcb.js +++ b/examples/Keyboard/Keyboard.svgpcb.js @@ -76,6 +76,11 @@ const C8 = board.add(C_0603_1608Metric, { translate: pt(0.526, 2.627), rotate: 0, id: 'C8' }) +// usb_esd +const U3 = board.add(SOT_23, { + translate: pt(2.791, 2.185), rotate: 0, + id: 'U3' +}) // ledr.package const D1 = board.add(LED_0603_1608Metric, { translate: pt(2.251, 2.147), rotate: 0, @@ -97,9 +102,9 @@ const J3 = board.add(Hirose_FH12_30S_0_5SH_1x30_1MP_P0_50mm_Horizontal, { id: 'J3' }) // oled.lcd -const U3 = board.add(Lcd_Er_Oled0_96_1_1_Outline, { +const U4 = board.add(Lcd_Er_Oled0_96_1_1_Outline, { translate: pt(2.644, 0.516), rotate: 0, - id: 'U3' + id: 'U4' }) // oled.c1_cap const C21 = board.add(C_0603_1608Metric, { @@ -137,9 +142,9 @@ const C26 = board.add(C_0805_2012Metric, { id: 'C26' }) // npx_shift.ic -const U4 = board.add(SOT_23_5, { +const U5 = board.add(SOT_23_5, { translate: pt(1.994, 2.185), rotate: 0, - id: 'U4' + id: 'U5' }) // npx_shift.vdd_cap.cap const C27 = board.add(C_0603_1608Metric, { @@ -153,20 +158,20 @@ const TP1 = board.add(TestPoint_Keystone_5015_Micro_Minature, { }) board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "1"], ["C9", "1"], ["D5", "1"], ["C10", "1"], ["D7", "1"], ["C11", "1"], ["D9", "1"], ["C12", "1"], ["D11", "1"], ["C13", "1"], ["D13", "1"], ["C14", "1"], ["D15", "1"], ["C15", "1"], ["D17", "1"], ["C16", "1"], ["D19", "1"], ["C17", "1"], ["D21", "1"], ["C18", "1"], ["D23", "1"], ["C19", "1"], ["D25", "1"], ["C20", "1"], ["U4", "5"], ["C27", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["X1", "2"], ["X1", "4"], ["C3", "2"], ["C4", "2"], ["U2", "16"], ["U2", "31"], ["U2", "32"], ["J2", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["D3", "3"], ["C9", "2"], ["D5", "3"], ["C10", "2"], ["D7", "3"], ["C11", "2"], ["D9", "3"], ["C12", "2"], ["D11", "3"], ["C13", "2"], ["D13", "3"], ["C14", "2"], ["D15", "3"], ["C15", "2"], ["D17", "3"], ["C16", "2"], ["D19", "3"], ["C17", "2"], ["D21", "3"], ["C18", "2"], ["D23", "3"], ["C19", "2"], ["D25", "3"], ["C20", "2"], ["SW13", "C"], ["SW13", "S2"], ["J3", "1"], ["J3", "10"], ["J3", "11"], ["J3", "12"], ["J3", "16"], ["J3", "17"], ["J3", "21"], ["J3", "22"], ["J3", "23"], ["J3", "24"], ["J3", "25"], ["J3", "29"], ["J3", "30"], ["J3", "8"], ["R4", "1"], ["C23", "2"], ["C24", "2"], ["C25", "2"], ["C26", "2"], ["U4", "1"], ["U4", "3"], ["C27", "2"]]}, - {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "22"]]}, - {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "21"]]}, + {name: "usb_chain_0.d_P", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "22"], ["U3", "2"]]}, + {name: "usb_chain_0.d_N", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "21"], ["U3", "1"]]}, + {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "1"], ["C9", "1"], ["D5", "1"], ["C10", "1"], ["D7", "1"], ["C11", "1"], ["D9", "1"], ["C12", "1"], ["D11", "1"], ["C13", "1"], ["D13", "1"], ["C14", "1"], ["D15", "1"], ["C15", "1"], ["D17", "1"], ["C16", "1"], ["D19", "1"], ["C17", "1"], ["D21", "1"], ["C18", "1"], ["D23", "1"], ["C19", "1"], ["D25", "1"], ["C20", "1"], ["U5", "5"], ["C27", "1"]]}, + {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["X1", "2"], ["X1", "4"], ["C3", "2"], ["C4", "2"], ["U2", "16"], ["U2", "31"], ["U2", "32"], ["J2", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["U3", "3"], ["D3", "3"], ["C9", "2"], ["D5", "3"], ["C10", "2"], ["D7", "3"], ["C11", "2"], ["D9", "3"], ["C12", "2"], ["D11", "3"], ["C13", "2"], ["D13", "3"], ["C14", "2"], ["D15", "3"], ["C15", "2"], ["D17", "3"], ["C16", "2"], ["D19", "3"], ["C17", "2"], ["D21", "3"], ["C18", "2"], ["D23", "3"], ["C19", "2"], ["D25", "3"], ["C20", "2"], ["SW13", "C"], ["SW13", "S2"], ["J3", "1"], ["J3", "10"], ["J3", "11"], ["J3", "12"], ["J3", "16"], ["J3", "17"], ["J3", "21"], ["J3", "22"], ["J3", "23"], ["J3", "24"], ["J3", "25"], ["J3", "29"], ["J3", "30"], ["J3", "8"], ["R4", "1"], ["C23", "2"], ["C24", "2"], ["C25", "2"], ["C26", "2"], ["U5", "1"], ["U5", "3"], ["C27", "2"]]}, {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, {name: "reg.pwr_out", pads: [["U1", "2"], ["C2", "1"], ["U2", "1"], ["U2", "17"], ["U2", "5"], ["J2", "1"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["D1", "2"], ["J3", "6"], ["J3", "9"], ["C24", "1"], ["C25", "1"]]}, - {name: "mcu.gpio.0_0", pads: [["U2", "19"], ["SW1", "2"], ["SW2", "2"], ["SW3", "2"]]}, - {name: "mcu.gpio.0_1", pads: [["U2", "20"], ["SW4", "2"], ["SW5", "2"], ["SW6", "2"]]}, - {name: "mcu.gpio.0_2", pads: [["U2", "25"], ["SW7", "2"], ["SW8", "2"], ["SW9", "2"]]}, - {name: "mcu.gpio.0_3", pads: [["U2", "26"], ["SW10", "2"], ["SW11", "2"], ["SW12", "2"]]}, - {name: "mcu.gpio.1_0", pads: [["U2", "27"], ["D2", "2"], ["D8", "2"], ["D14", "2"], ["D20", "2"]]}, - {name: "mcu.gpio.1_1", pads: [["U2", "28"], ["D4", "2"], ["D10", "2"], ["D16", "2"], ["D22", "2"]]}, - {name: "mcu.gpio.1_2", pads: [["U2", "29"], ["D6", "2"], ["D12", "2"], ["D18", "2"], ["D24", "2"]]}, + {name: "mcu.gpio.0_0", pads: [["U2", "19"], ["SW1", "1"], ["SW2", "1"], ["SW3", "1"]]}, + {name: "mcu.gpio.0_1", pads: [["U2", "20"], ["SW4", "1"], ["SW5", "1"], ["SW6", "1"]]}, + {name: "mcu.gpio.0_2", pads: [["U2", "25"], ["SW7", "1"], ["SW8", "1"], ["SW9", "1"]]}, + {name: "mcu.gpio.0_3", pads: [["U2", "26"], ["SW10", "1"], ["SW11", "1"], ["SW12", "1"]]}, + {name: "mcu.gpio.1_0", pads: [["U2", "27"], ["D2", "1"], ["D8", "1"], ["D14", "1"], ["D20", "1"]]}, + {name: "mcu.gpio.1_1", pads: [["U2", "28"], ["D4", "1"], ["D10", "1"], ["D16", "1"], ["D22", "1"]]}, + {name: "mcu.gpio.1_2", pads: [["U2", "29"], ["D6", "1"], ["D12", "1"], ["D18", "1"], ["D24", "1"]]}, {name: "mcu.xtal_node.xi", pads: [["X1", "1"], ["C3", "1"], ["U2", "2"]]}, {name: "mcu.xtal_node.xo", pads: [["X1", "3"], ["C4", "1"], ["U2", "3"]]}, {name: "mcu.ic.nrst", pads: [["U2", "4"], ["C8", "1"]]}, @@ -174,31 +179,31 @@ board.setNetlist([ {name: "mcu.ic.swclk", pads: [["U2", "24"], ["J2", "4"]]}, {name: "ledr.signal", pads: [["U2", "6"], ["R3", "2"]]}, {name: "ledr.package.k", pads: [["D1", "1"], ["R3", "1"]]}, - {name: "sw.npx_din", pads: [["D3", "4"], ["U4", "4"], ["TP1", "1"]]}, + {name: "sw.npx_din", pads: [["D3", "4"], ["U5", "4"], ["TP1", "1"]]}, {name: "sw.npx_dout", pads: [["D25", "2"]]}, {name: "sw.sw[0,0].npx_dout", pads: [["D3", "2"], ["D9", "4"]]}, - {name: "sw.sw[0,0].sw.sw", pads: [["SW1", "1"], ["D2", "1"]]}, + {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, {name: "sw.sw[0,1].npx_din", pads: [["D5", "4"], ["D11", "2"]]}, {name: "sw.sw[0,1].npx_dout", pads: [["D5", "2"], ["D7", "4"]]}, - {name: "sw.sw[0,1].sw.sw", pads: [["SW2", "1"], ["D4", "1"]]}, + {name: "sw.sw[0,1].sw.com", pads: [["SW2", "2"], ["D4", "2"]]}, {name: "sw.sw[0,2].npx_dout", pads: [["D7", "2"], ["D13", "4"]]}, - {name: "sw.sw[0,2].sw.sw", pads: [["SW3", "1"], ["D6", "1"]]}, + {name: "sw.sw[0,2].sw.com", pads: [["SW3", "2"], ["D6", "2"]]}, {name: "sw.sw[1,0].npx_dout", pads: [["D9", "2"], ["D15", "4"]]}, - {name: "sw.sw[1,0].sw.sw", pads: [["SW4", "1"], ["D8", "1"]]}, + {name: "sw.sw[1,0].sw.com", pads: [["SW4", "2"], ["D8", "2"]]}, {name: "sw.sw[1,1].npx_din", pads: [["D11", "4"], ["D17", "2"]]}, - {name: "sw.sw[1,1].sw.sw", pads: [["SW5", "1"], ["D10", "1"]]}, + {name: "sw.sw[1,1].sw.com", pads: [["SW5", "2"], ["D10", "2"]]}, {name: "sw.sw[1,2].npx_dout", pads: [["D13", "2"], ["D19", "4"]]}, - {name: "sw.sw[1,2].sw.sw", pads: [["SW6", "1"], ["D12", "1"]]}, + {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D12", "2"]]}, {name: "sw.sw[2,0].npx_dout", pads: [["D15", "2"], ["D21", "4"]]}, - {name: "sw.sw[2,0].sw.sw", pads: [["SW7", "1"], ["D14", "1"]]}, + {name: "sw.sw[2,0].sw.com", pads: [["SW7", "2"], ["D14", "2"]]}, {name: "sw.sw[2,1].npx_din", pads: [["D17", "4"], ["D23", "2"]]}, - {name: "sw.sw[2,1].sw.sw", pads: [["SW8", "1"], ["D16", "1"]]}, + {name: "sw.sw[2,1].sw.com", pads: [["SW8", "2"], ["D16", "2"]]}, {name: "sw.sw[2,2].npx_dout", pads: [["D19", "2"], ["D25", "4"]]}, - {name: "sw.sw[2,2].sw.sw", pads: [["SW9", "1"], ["D18", "1"]]}, + {name: "sw.sw[2,2].sw.com", pads: [["SW9", "2"], ["D18", "2"]]}, {name: "sw.sw[3,0].npx_dout", pads: [["D21", "2"], ["D23", "4"]]}, - {name: "sw.sw[3,0].sw.sw", pads: [["SW10", "1"], ["D20", "1"]]}, - {name: "sw.sw[3,1].sw.sw", pads: [["SW11", "1"], ["D22", "1"]]}, - {name: "sw.sw[3,2].sw.sw", pads: [["SW12", "1"], ["D24", "1"]]}, + {name: "sw.sw[3,0].sw.com", pads: [["SW10", "2"], ["D20", "2"]]}, + {name: "sw.sw[3,1].sw.com", pads: [["SW11", "2"], ["D22", "2"]]}, + {name: "sw.sw[3,2].sw.com", pads: [["SW12", "2"], ["D24", "2"]]}, {name: "enc.a", pads: [["U2", "7"], ["SW13", "A"]]}, {name: "enc.b", pads: [["U2", "8"], ["SW13", "B"]]}, {name: "enc.sw", pads: [["U2", "9"], ["SW13", "S1"]]}, @@ -216,7 +221,7 @@ board.setNetlist([ {name: "oled.device.c2p", pads: [["J3", "2"], ["C22", "1"]]}, {name: "oled.device.c2n", pads: [["J3", "3"], ["C22", "2"]]}, {name: "oled.device.d2", pads: [["J3", "20"]]}, - {name: "npx_shift.input", pads: [["U2", "18"], ["U4", "2"]]} + {name: "npx_shift.input", pads: [["U2", "18"], ["U5", "2"]]} ]) const limit0 = pt(-0.07874015748031496, -0.07874015748031496); diff --git a/examples/test_keyboard.py b/examples/test_keyboard.py index 0868072e7..11b3aef52 100644 --- a/examples/test_keyboard.py +++ b/examples/test_keyboard.py @@ -75,7 +75,8 @@ def refinements(self) -> Refinements: ], instance_values=[(["mcu", "pin_assigns"], [])], # TODO pining: NPX must be SPI MOSI class_values=[ - (Sk6812Mini_E, ["pwr", "current_draw"], Range(0.001, 0.030)), # don't run at full power + # assume LEDs not run at full power to satisfy current limit checks + (Sk6812Mini_E, ["pwr", "current_draw"], Range(0.001, 0.030)), ], ) From a7c0944a0191987009cb59c6695279e4f5655e84 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 16:42:28 -0700 Subject: [PATCH 19/22] Create fp-lib-table --- examples/Keyboard/fp-lib-table | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 examples/Keyboard/fp-lib-table diff --git a/examples/Keyboard/fp-lib-table b/examples/Keyboard/fp-lib-table new file mode 100644 index 000000000..6f02418d3 --- /dev/null +++ b/examples/Keyboard/fp-lib-table @@ -0,0 +1,3 @@ +(fp_lib_table + (lib (name edg)(type KiCad)(uri ${KIPRJMOD}/../edg.pretty)(options "")(descr "")) +) From 64e9cee8bd31f64ccb37194793691be491bba0f0 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 16:53:54 -0700 Subject: [PATCH 20/22] fix mypy --- edg/circuits/SwitchMatrix.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index ab089bc13..75ce8b250 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -215,7 +215,7 @@ def generate(self) -> None: for row in range(self.get(self.nrows)): self.rows.append_elt(DigitalSink.empty(), str(row)) - self.sw = ElementDict[DiodeSwitchCell]() + self.sw = ElementDict[SwitchCell]() for col in range(self.get(self.ncols)): col_port = self.cols.append_elt(DigitalSource.empty(), str(col)) for row in range(self.get(self.nrows)): @@ -261,26 +261,26 @@ def generate(self) -> None: super().generate() npx_order = self.get(self.npx_order) - switch_cells: List[DiodeSwitchCell] = [] + switch_cells: List[SwitchCell] = [] if npx_order in ("row", "row_snake"): for row in range(self.get(self.nrows)): - cols = range(self.get(self.ncols)) + cols = list(range(self.get(self.ncols))) if npx_order == "row_snake" and row % 2 == 1: - cols = reversed(cols) + cols = list(reversed(cols)) for col in cols: switch_cells.append(self.sw[f"{col},{row}"]) elif npx_order in ("col", "col_snake"): for col in range(self.get(self.ncols)): - rows = range(self.get(self.nrows)) + rows = list(range(self.get(self.nrows))) if npx_order == "col_snake" and col % 2 == 1: - rows = reversed(rows) + rows = list(reversed(rows)) for row in rows: switch_cells.append(self.sw[f"{col},{row}"]) else: raise ValueError(f"Invalid npx_order {npx_order}") - last_npx_dout = self.npx_din + last_npx_dout: Port[DigitalLink] = self.npx_din for switch_cell in switch_cells: cell_npx = switch_cell.with_mixin(SwitchCellNeopixel()) self.connect(self.npx_pwr, cell_npx.npx_pwr) From 86c7a5b550257ed16b5882f0fb0199f3c340a65b Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 16:58:19 -0700 Subject: [PATCH 21/22] Update test_keyboard.py --- examples/test_keyboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/test_keyboard.py b/examples/test_keyboard.py index 11b3aef52..b7350227b 100644 --- a/examples/test_keyboard.py +++ b/examples/test_keyboard.py @@ -73,7 +73,7 @@ def refinements(self) -> Refinements: (Neopixel, Sk6812Mini_E), (RotaryEncoder, Pec11s), ], - instance_values=[(["mcu", "pin_assigns"], [])], # TODO pining: NPX must be SPI MOSI + instance_values=[(["mcu", "pin_assigns"], [])], # TODO pinning: NPX must be SPI MOSI class_values=[ # assume LEDs not run at full power to satisfy current limit checks (Sk6812Mini_E, ["pwr", "current_draw"], Range(0.001, 0.030)), From fe8c6b48b70979a4e98ccf9321e2dba8b0f709a2 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 6 Jun 2026 16:59:01 -0700 Subject: [PATCH 22/22] Update SwitchMatrix.py --- edg/circuits/SwitchMatrix.py | 1 + 1 file changed, 1 insertion(+) diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index 75ce8b250..c70d3219a 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -110,6 +110,7 @@ def _svgpcb_fn_name_adds(self) -> Optional[str]: @override def _svgpcb_template(self) -> str: + # TODO: layout generator broken from the COL2ROW change switch_block = self._svgpcb_footprint_block_path_of(["sw[0,0]", "sw"]) diode_block = self._svgpcb_footprint_block_path_of(["sw[0,0]", "d"]) switch_reftype, switch_refnum = self._svgpcb_refdes_of(["sw[0,0]", "sw"])