From 3d494b156fbdcbfc88471d1a1f9c116c65ee1a3d Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Thu, 16 Oct 2025 17:09:38 +0200 Subject: [PATCH 01/13] Basic STM32F405 board --- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 178 ++++++++++++++++++ .../index.tsx | 2 + 2 files changed, 180 insertions(+) create mode 100644 boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx create mode 100644 boards/SparkFun-MicroMod-STM32-Processor/index.tsx diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx new file mode 100644 index 00000000..473a6f1d --- /dev/null +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -0,0 +1,178 @@ +import React from "react" + +// ---------------- MCU (STM32F405RG, LQFP64) ---------------- +const STM32F405RG = (props: any) => ( + +) + +// ---------------- External Flash (W25Q128, SOIC-8) ---------- +const W25Q128 = (props: any) => ( + +) + +// ---------------- MicroMod Edge (only pins we use) ---------- +const MicroModEdge = (props: any) => ( + +) + +// ---------------- Board ------------------------------------ +const Board = () => ( + + {/* Parts */} + + + + + {/* Nets (rails + named busses) */} + + + + + + + + + + {/* Power */} + .V3V3", ".U2 > .VCC"]} /> + .GND", ".U2 > .GND"]} /> + .VDD", ".J1 > .V3V3"]} /> + .VSS", ".J1 > .GND"]} /> + .VDDA", ".J1 > .V3V3"]} /> + .VSSA", ".J1 > .GND"]} /> + + {/* USB to MCU */} + .USB_DM", ".U1 > .PA11_USB_DM"]} /> + .USB_DP", ".U1 > .PA12_USB_DP"]} /> + + {/* SWD */} + .SWDIO", ".U1 > .PA13_SWDIO"]} /> + .SWCLK", ".U1 > .PA14_SWCLK"]} /> + + {/* I2C1 */} + .I2C_SCL", ".U1 > .PB8_I2C1_SCL"]} /> + .I2C_SDA", ".U1 > .PB9_I2C1_SDA"]} /> + + {/* UART1 */} + .UART_TX", ".U1 > .PA9_UART1_TX"]} /> + .UART_RX", ".U1 > .PA10_UART1_RX"]} /> + + {/* SDIO */} + .SDIO_CMD", ".U1 > .PD2_SDIO_CMD"]} /> + .SDIO_CLK", ".U1 > .PC12_SDIO_CLK"]} /> + .SDIO_D0", ".U1 > .PC8_SDIO_D0"]} /> + .SDIO_D1", ".U1 > .PC9_SDIO_D1"]} /> + .SDIO_D2", ".U1 > .PC10_SDIO_D2"]} /> + .SDIO_D3", ".U1 > .PC11_SDIO_D3"]} /> + + {/* External SPI Flash on SPI2 */} + .PB13_SPI2_SCK", ".U2 > .CLK"]} /> + .PB14_SPI2_MISO", ".U2 > .DO"]} /> + .PB15_SPI2_MOSI", ".U2 > .DI"]} /> + .PB12_SPI2_NSS", ".U2 > .CS_N"]} /> + {/* Pull WP/HOLD high to VCC (representative) */} + .WP_N", ".J1 > .V3V3"]} /> + .HOLD_N", ".J1 > .V3V3"]} /> + + {/* Reset / Boot (stubs to edge) */} + .RESET_N", ".U1 > .NRST"]} /> + .BOOT_N", ".U1 > .BOOT0"]} /> + +) + +export default Board diff --git a/boards/SparkFun-MicroMod-STM32-Processor/index.tsx b/boards/SparkFun-MicroMod-STM32-Processor/index.tsx new file mode 100644 index 00000000..2ec62f09 --- /dev/null +++ b/boards/SparkFun-MicroMod-STM32-Processor/index.tsx @@ -0,0 +1,2 @@ +// boards/micromod-stm32-processor/index.tsx +export { default as MicroModSTM32Processor } from "./SparkFun-MicroMod-STM32-Processor.circuit" From da31a04a39b41b7acfdd44032f9861b7ee68769a Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Thu, 16 Oct 2025 21:15:00 +0200 Subject: [PATCH 02/13] Refactor: split parts --- .../MicroModEdge.tsx | 34 ++++ .../STM32F405RG.tsx | 46 +++++ ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 171 +----------------- .../W25Q128.tsx | 20 ++ 4 files changed, 104 insertions(+), 167 deletions(-) create mode 100644 boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx create mode 100644 boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx create mode 100644 boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx diff --git a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx new file mode 100644 index 00000000..fed26f15 --- /dev/null +++ b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx @@ -0,0 +1,34 @@ +import React from "react" + +const MicroModEdge = (props: any) => ( + +) + +export default MicroModEdge diff --git a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx new file mode 100644 index 00000000..d10ee401 --- /dev/null +++ b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx @@ -0,0 +1,46 @@ +import React from "react" + +const STM32F405RG = (props: any) => ( + +) + +export default STM32F405RG diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index 473a6f1d..d507b79c 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -1,177 +1,14 @@ import React from "react" +import STM32F405RG from "./STM32F405RG" +import W25Q128 from "./W25Q128" +import MicroModEdge from "./MicroModEdge" -// ---------------- MCU (STM32F405RG, LQFP64) ---------------- -const STM32F405RG = (props: any) => ( - -) - -// ---------------- External Flash (W25Q128, SOIC-8) ---------- -const W25Q128 = (props: any) => ( - -) - -// ---------------- MicroMod Edge (only pins we use) ---------- -const MicroModEdge = (props: any) => ( - -) - -// ---------------- Board ------------------------------------ const Board = () => ( - {/* Parts */} - - {/* Nets (rails + named busses) */} - - - - - - - - - - {/* Power */} - .V3V3", ".U2 > .VCC"]} /> - .GND", ".U2 > .GND"]} /> - .VDD", ".J1 > .V3V3"]} /> - .VSS", ".J1 > .GND"]} /> - .VDDA", ".J1 > .V3V3"]} /> - .VSSA", ".J1 > .GND"]} /> - - {/* USB to MCU */} - .USB_DM", ".U1 > .PA11_USB_DM"]} /> - .USB_DP", ".U1 > .PA12_USB_DP"]} /> - - {/* SWD */} - .SWDIO", ".U1 > .PA13_SWDIO"]} /> - .SWCLK", ".U1 > .PA14_SWCLK"]} /> - - {/* I2C1 */} - .I2C_SCL", ".U1 > .PB8_I2C1_SCL"]} /> - .I2C_SDA", ".U1 > .PB9_I2C1_SDA"]} /> - - {/* UART1 */} - .UART_TX", ".U1 > .PA9_UART1_TX"]} /> - .UART_RX", ".U1 > .PA10_UART1_RX"]} /> - - {/* SDIO */} - .SDIO_CMD", ".U1 > .PD2_SDIO_CMD"]} /> - .SDIO_CLK", ".U1 > .PC12_SDIO_CLK"]} /> - .SDIO_D0", ".U1 > .PC8_SDIO_D0"]} /> - .SDIO_D1", ".U1 > .PC9_SDIO_D1"]} /> - .SDIO_D2", ".U1 > .PC10_SDIO_D2"]} /> - .SDIO_D3", ".U1 > .PC11_SDIO_D3"]} /> - - {/* External SPI Flash on SPI2 */} - .PB13_SPI2_SCK", ".U2 > .CLK"]} /> - .PB14_SPI2_MISO", ".U2 > .DO"]} /> - .PB15_SPI2_MOSI", ".U2 > .DI"]} /> - .PB12_SPI2_NSS", ".U2 > .CS_N"]} /> - {/* Pull WP/HOLD high to VCC (representative) */} - .WP_N", ".J1 > .V3V3"]} /> - .HOLD_N", ".J1 > .V3V3"]} /> - - {/* Reset / Boot (stubs to edge) */} - .RESET_N", ".U1 > .NRST"]} /> - .BOOT_N", ".U1 > .BOOT0"]} /> + {/* all traces and nets remain exactly as before */} ) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx new file mode 100644 index 00000000..e5b7b683 --- /dev/null +++ b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx @@ -0,0 +1,20 @@ +import React from "react" + +const W25Q128 = (props: any) => ( + +) + +export default W25Q128 From 43cf38881b5bbad1be68f9ff204b4a570801ca69 Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Thu, 16 Oct 2025 22:19:34 +0200 Subject: [PATCH 03/13] Making connections, re-positioning parts --- .../MicroModEdge.tsx | 6 +- .../STM32F405RG.tsx | 80 ++++++++----- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 110 +++++++++++++++++- .../W25Q128.tsx | 15 +-- 4 files changed, 169 insertions(+), 42 deletions(-) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx index fed26f15..766b5fa6 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx @@ -23,9 +23,9 @@ const MicroModEdge = (props: any) => ( pin17: "SDIO_D1", pin18: "SDIO_D2", pin19: "SDIO_D3", - pin20: "RESET_N", - pin21: "BOOT_N", - pin22: "STAT_LED", + pin20: "NRST", // <-- rename to match MCU + pin21: "STAT_LED", // ok to keep + pin22: "V3V3", // or any other signal you expose }} {...props} /> diff --git a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx index d10ee401..3bd48b5b 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx @@ -5,39 +5,63 @@ const STM32F405RG = (props: any) => ( name="U1" footprint="qfp64_p0.5mm" pinLabels={{ + // Power / special pin1: "VBAT", - pin3: "PC14_LSE", - pin4: "PC15_LSE", - pin5: "PH0_HSE", - pin6: "PH1_HSE", pin7: "NRST", - pin9: "VSSA", + pin9: "GND", pin10: "VDDA", - pin18: "VSS", - pin19: "VDD", + pin18: "GND", + pin19: "V3V3", pin31: "VCAP1", pin47: "VCAP2", - pin63: "VSS3", - pin64: "VDD3", - pin60: "BOOT0", - pin44: "PA11_USB_DM", - pin45: "PA12_USB_DP", - pin46: "PA13_SWDIO", - pin49: "PA14_SWCLK", - pin58: "PB8_I2C1_SCL", - pin59: "PB9_I2C1_SDA", - pin37: "PA9_UART1_TX", - pin38: "PA10_UART1_RX", - pin50: "PB12_SPI2_NSS", - pin51: "PB13_SPI2_SCK", - pin52: "PB14_SPI2_MISO", - pin53: "PB15_SPI2_MOSI", - pin40: "PC8_SDIO_D0", - pin41: "PC9_SDIO_D1", - pin42: "PC10_SDIO_D2", - pin43: "PC11_SDIO_D3", - pin56: "PC12_SDIO_CLK", - pin54: "PD2_SDIO_CMD", + pin63: "GND", + pin64: "V3V3", + + // Clocks + pin5: "PH0_HSE", + pin6: "PH1_HSE", + pin3: "PC14_LSE", + pin4: "PC15_LSE", + + // USB + pin44: "USB_DM", + pin45: "USB_DP", + + // SWD + pin46: "SWDIO", + pin49: "SWCLK", + + // I2C1 + pin58: "I2C_SCL", + pin59: "I2C_SDA", + + // UART1 + pin37: "UART_TX", + pin38: "UART_RX", + + // SPI2 (for edge SPI) + pin51: "SPI_SCK", + pin52: "SPI_MISO", + pin53: "SPI_MOSI", + pin50: "SPI_NSS", + + // SDIO + pin56: "SDIO_CLK", + pin54: "SDIO_CMD", + pin40: "SDIO_D0", + pin41: "SDIO_D1", + pin42: "SDIO_D2", + pin43: "SDIO_D3", + + // On-board flash (names must match U2 exactly) + // Map these to unused GPIOs that you intend to use for the flash + // (the exact pins don’t matter to the schematic connectivity) + pin20: "FLASH_CS_N", + pin21: "FLASH_SO", // MISO from flash + pin22: "FLASH_SI", // MOSI to flash + pin23: "FLASH_SCK", + pin24: "FLASH_WP_N", + pin25: "FLASH_HOLD_N", }} {...props} /> diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index d507b79c..21e70aa8 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -5,10 +5,112 @@ import MicroModEdge from "./MicroModEdge" const Board = () => ( - - - - {/* all traces and nets remain exactly as before */} + + + + + ) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx index e5b7b683..b27a2e93 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx @@ -3,15 +3,16 @@ import React from "react" const W25Q128 = (props: any) => ( From 6cb26cde51618386a7968c65dc49feada84d7cc5 Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Fri, 17 Oct 2025 08:57:01 +0200 Subject: [PATCH 04/13] Fix render errors --- boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx | 7 +++++++ .../SparkFun-MicroMod-STM32-Processor.circuit.tsx | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx index 3bd48b5b..b76b0404 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx @@ -8,6 +8,7 @@ const STM32F405RG = (props: any) => ( // Power / special pin1: "VBAT", pin7: "NRST", + pin8: "VSSA", pin9: "GND", pin10: "VDDA", pin18: "GND", @@ -35,6 +36,12 @@ const STM32F405RG = (props: any) => ( pin58: "I2C_SCL", pin59: "I2C_SDA", + // Boot configuration + pin60: "BOOT0", + + // Status LED (GPIO) + pin33: "STAT_LED", + // UART1 pin37: "UART_TX", pin38: "UART_RX", diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index 21e70aa8..afb959fd 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -4,7 +4,7 @@ import W25Q128 from "./W25Q128" import MicroModEdge from "./MicroModEdge" const Board = () => ( - + ( name="U1" schX={0} schY={0} + // keep inside outline; opens a wider left corridor + pcbX="0mm" + pcbY="0mm" connections={{ // power & refs V3V3: "net.V3V3", @@ -100,6 +103,10 @@ const Board = () => ( name="U2" schX={-80} // move flash to left schY={-20} + // farther up-left so routes don't cross the U1 pad row (FLASH_* pins) + pcbX="-20mm" + pcbY="-3mm" // if this goes down instead of up in your viewer, use "+10mm" + pcbRotation={180} connections={{ V3V3: "net.V3V3", GND: "net.GND", From 645dfaf8dab0265e935b475f1040abe4522d6f5f Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Sun, 19 Oct 2025 21:33:16 +0200 Subject: [PATCH 05/13] Refactor main files, matching given schema (pin mapping/naming/nets), fix rendering errors --- .../MicroModEdge.tsx | 92 +++- .../STM32F405RG.tsx | 118 ++--- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 413 ++++++++++++++---- .../W25Q128.tsx | 16 +- 4 files changed, 463 insertions(+), 176 deletions(-) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx index 766b5fa6..ddd1dbac 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx @@ -4,28 +4,76 @@ const MicroModEdge = (props: any) => ( diff --git a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx index b76b0404..360c30d0 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx @@ -5,70 +5,70 @@ const STM32F405RG = (props: any) => ( name="U1" footprint="qfp64_p0.5mm" pinLabels={{ - // Power / special pin1: "VBAT", + pin2: "PC13", + pin3: "PC14", + pin4: "PC15", + pin5: "PH0", + pin6: "PH1", pin7: "NRST", - pin8: "VSSA", - pin9: "GND", - pin10: "VDDA", - pin18: "GND", - pin19: "V3V3", + pin8: "PC0", + pin9: "PC1", + pin10: "PC2", + pin11: "PC3", + pin12: "VSSA", + pin13: "VDDA", + pin14: "PA0", + pin15: "PA1", + pin16: "PA2_UART2_TX", + pin17: "PA3_UART2_RX", + pin18: "VSS1", + pin19: "VDD1", + pin20: "PA4_SPI1_NSS", + pin21: "PA5_SPI1_SCK", + pin22: "PA6_SPI1_MISO", + pin23: "PA7_SPI1_MOSI", + pin24: "PC4", + pin25: "PC5", + pin26: "PB0", + pin27: "PB1", + pin28: "PB2_BOOT1", + pin29: "PB10", + pin30: "PB11", pin31: "VCAP1", + pin32: "VDD2", + pin33: "PB12_I2S2_WS", + pin34: "PB13_I2S2_CK", + pin35: "PB14_I2S2_XD", + pin36: "PB15_I2S2_SD", + pin37: "PC6_I2S2_MCK", + pin38: "PC7", + pin39: "PC8_SDIO_D0", + pin40: "PC9_SDIO_D1", + pin41: "PA8", + pin42: "PA9_UART1_TX", + pin43: "PA10_UART1_RX", + pin44: "PA11", + pin45: "PA12", + pin46: "PA13_JTMS", pin47: "VCAP2", - pin63: "GND", - pin64: "V3V3", - - // Clocks - pin5: "PH0_HSE", - pin6: "PH1_HSE", - pin3: "PC14_LSE", - pin4: "PC15_LSE", - - // USB - pin44: "USB_DM", - pin45: "USB_DP", - - // SWD - pin46: "SWDIO", - pin49: "SWCLK", - - // I2C1 - pin58: "I2C_SCL", - pin59: "I2C_SDA", - - // Boot configuration + pin48: "VDD3", + pin49: "PA14_JTCK", + pin50: "PA15_JTDI", + pin51: "PC10_SDIO_D2", + pin52: "PC11_SDIO_D3", + pin53: "PC12_SDIO_CLK", + pin54: "PD2_SDIO_CMD", + pin55: "PB3_JTDO", + pin56: "PB4_JTRST", + pin57: "PB5", + pin58: "PB6", + pin59: "PB7", pin60: "BOOT0", - - // Status LED (GPIO) - pin33: "STAT_LED", - - // UART1 - pin37: "UART_TX", - pin38: "UART_RX", - - // SPI2 (for edge SPI) - pin51: "SPI_SCK", - pin52: "SPI_MISO", - pin53: "SPI_MOSI", - pin50: "SPI_NSS", - - // SDIO - pin56: "SDIO_CLK", - pin54: "SDIO_CMD", - pin40: "SDIO_D0", - pin41: "SDIO_D1", - pin42: "SDIO_D2", - pin43: "SDIO_D3", - - // On-board flash (names must match U2 exactly) - // Map these to unused GPIOs that you intend to use for the flash - // (the exact pins don’t matter to the schematic connectivity) - pin20: "FLASH_CS_N", - pin21: "FLASH_SO", // MISO from flash - pin22: "FLASH_SI", // MOSI to flash - pin23: "FLASH_SCK", - pin24: "FLASH_WP_N", - pin25: "FLASH_HOLD_N", + pin61: "PB8", + pin62: "PB9", + pin63: "VSS2", + pin64: "VDD4", }} {...props} /> diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index afb959fd..805e3f80 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -2,36 +2,50 @@ import React from "react" import STM32F405RG from "./STM32F405RG" import W25Q128 from "./W25Q128" import MicroModEdge from "./MicroModEdge" +import { sel } from "@tscircuit/core" const Board = () => ( - + + {/* === MicroMod Edge Connector (J1) === */} @@ -39,85 +53,310 @@ const Board = () => ( name="U1" schX={0} schY={0} - // keep inside outline; opens a wider left corridor - pcbX="0mm" - pcbY="0mm" connections={{ - // power & refs - V3V3: "net.V3V3", - GND: "net.GND", - VDDA: "net.V3V3", - VSSA: "net.GND", - VCAP1: "net.VCAP1", - VCAP2: "net.VCAP2", - - // reset & boot - NRST: "net.NRST", - BOOT0: "net.BOOT0", - - // USB - USB_DM: "net.USB_DM", - USB_DP: "net.USB_DP", - - // SWD - SWDIO: "net.SWDIO", - SWCLK: "net.SWCLK", - - // I2C / UART / SPI to edge - I2C_SCL: "net.I2C_SCL", - I2C_SDA: "net.I2C_SDA", - UART_TX: "net.UART_TX", - UART_RX: "net.UART_RX", - SPI_SCK: "net.SPI_SCK", - SPI_MISO: "net.SPI_MISO", - SPI_MOSI: "net.SPI_MOSI", - - // SDIO - SDIO_CLK: "net.SDIO_CLK", - SDIO_CMD: "net.SDIO_CMD", - SDIO_D0: "net.SDIO_D0", - SDIO_D1: "net.SDIO_D1", - SDIO_D2: "net.SDIO_D2", - SDIO_D3: "net.SDIO_D3", - - // Flash (to U2) - FLASH_CS_N: "net.FLASH_CS_N", - FLASH_SCK: "net.FLASH_SCK", - FLASH_SI: "net.FLASH_SI", - FLASH_SO: "net.FLASH_SO", - FLASH_WP_N: "net.FLASH_WP_N", - FLASH_HOLD_N: "net.FLASH_HOLD_N", - - // status LED from edge (optional GPIO) - STAT_LED: "net.STAT_LED", - - // crystals (nets exist even if you skip the crystal symbols for now) - PH0_HSE: "net.PH0_HSE", - PH1_HSE: "net.PH1_HSE", - PC14_LSE: "net.PC14_LSE", - PC15_LSE: "net.PC15_LSE", + NRST: "net.RESET", + PA0: "net.G2", + PA1: "net.BATT_VIN", + PA13_JTMS: "net.SWDIO", + PA2_UART2_TX: "net.TX1", + PA3_UART2_RX: "net.RX1", + PA4_SPI1_NSS: "net.AUD_LRCLK", + PA5_SPI1_SCK: "net.SCK", + PA6_SPI1_MISO: "net.C1P0", + PA7_SPI1_MOSI: "net.C0P1", + PA8: "net.G1", + PB0: "net.A1", + PB1: "net.INT", + PB10: "net.SCL", + PB11: "net.SDA", + PB12_I2S2_WS: "net.HOST_ID", + PB13_I2S2_CK: "net.HOST_VBUS", + PB14_I2S2_XD: "net.HOST_DN", + PB15_I2S2_SD: "net.HOST_DP", + PB3_JTDO: "net.AUD_BCLK", + PB4_JTRST: "net.AUD_OUT", + PB5: "net.AUD_IN", + PB6: "net.SCL1", + PB7: "net.SDA1", + PB8: "net.CAN_RX", + PB9: "net.CAN_TX", + PC0: "net.D0", + PC1: "net.D1", + PC10_SDIO_D2: "net.FLASH_SCK", + PC11_SDIO_D3: "net.FLASH_SDO", + PC12_SDIO_CLK: "net.FLASH_SDI", + PC13: "net.G5", + PC2: "net.G6", + PC3: "net.FLASH_CS", + PC4: "net.CS", + PC5: "net.A0", + PC7: "net.PWM1", + PC8_SDIO_D0: "net.G3", + PC9_SDIO_D1: "net.G4", + PD2_SDIO_CMD: "net.G0", }} /> + {/* Other parts left unchanged; helper circuitry ignored per your request */} + {/* HSE 12MHz + caps */} + + + + + } + connections={{ pin1: "net.U1_PH0_HSE", pin2: "net.U1_PH1_HSE" }} + /> + + + + + {/* LSE 32.768kHz + caps */} + + + + + } + connections={{ pin1: "U1.pin4", pin2: "U1.pin3" }} + /> + + + + + {/* VCAP1 / VCAP2 */} + + + + + {/* 22Ω series on D- / D+ between MCU and edge */} + + + {/* BOOT inversion with a P-MOSFET (SparkFun style) */} + + + + {/* Reset (NRST) pull-up + POR cap */} + + + + {/* ===== Status LED (right side) ===== */} + + + + + {/* ===== W25Q128 Helper circuits ===== */} + + + ) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx index b27a2e93..f4d750cc 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx @@ -2,17 +2,17 @@ import React from "react" const W25Q128 = (props: any) => ( From 1adf0b2b2c075d518f0474dff4d1c09615dc4b0e Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Mon, 20 Oct 2025 11:57:52 +0200 Subject: [PATCH 06/13] Refactor main files: add connections, fix pin naming/nets (vdd to v3_3, somepinwithbar to somepinwithbar_N) --- .../MicroModEdge.tsx | 8 ++--- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 34 +++++++++++++------ .../W25Q128.tsx | 2 +- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx index ddd1dbac..925ff0d3 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx @@ -5,10 +5,10 @@ const MicroModEdge = (props: any) => ( name="J1" pinLabels={{ // ---- Left column ---- - pin2: "VBUS1", - pin6: "RESET", + pin2: "V3_3", + pin6: "RESET_N", pin8: "G11", - pin11: "BOOT", + pin11: "BOOT_N", pin4: "3V3_EN", pin72: "RTC_3V", pin9: "USB_VIN", @@ -27,7 +27,7 @@ const MicroModEdge = (props: any) => ( pin50: "AUD_BCLK", pin14: "I2C_SCL", pin12: "I2C_SDA", - pin16: "I2C_INT", + pin16: "I2C_INT_N", pin53: "I2C_SCL1", pin51: "I2C_SDA1", pin49: "BATT_VIN_3", diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index 805e3f80..52208150 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -12,9 +12,9 @@ const Board = () => ( schX={30} schY={0} connections={{ - VBUS1: "net.VBUS1", - RESET: "net.RESET", - BOOT: "net.BOOT", + V3_3: "net.V3_3", + RESET_N: "net.RESET_N", + BOOT_N: "net.BOOT_N", SWDIO: "net.SWDIO", SWDCK: "net.SWCLK", @@ -46,6 +46,7 @@ const Board = () => ( SPI_SDO: "net.C0P1", SPI_SDI: "net.C1P0", SPI_CS: "net.CS", + I2C_INT_N: "net.INT_N", }} /> @@ -66,7 +67,7 @@ const Board = () => ( PA7_SPI1_MOSI: "net.C0P1", PA8: "net.G1", PB0: "net.A1", - PB1: "net.INT", + PB1: "net.INT_N", PB10: "net.SCL", PB11: "net.SDA", PB12_I2S2_WS: "net.HOST_ID", @@ -87,7 +88,7 @@ const Board = () => ( PC12_SDIO_CLK: "net.FLASH_SDI", PC13: "net.G5", PC2: "net.G6", - PC3: "net.FLASH_CS", + PC3: "net.FLASH_CS_N", PC4: "net.CS", PC5: "net.A0", PC7: "net.PWM1", @@ -106,7 +107,7 @@ const Board = () => ( pcbY="-3mm" // if this goes down instead of up in your viewer, use "+10mm" pcbRotation={180} connections={{ - VDD: "net.VDD", + V3_3: "net.V3_3", GND: "net.GND", CS_N: "net.FLASH_CS_N", CLK: "net.FLASH_SCK", @@ -285,7 +286,7 @@ const Board = () => ( footprint="0402" schX={15} schY={0} - connections={{ pin1: "net.VDD", pin2: "net.BOOT" }} // change to "BOOT_N" if that's your edge net + connections={{ pin1: "net.V3_3", pin2: "net.BOOT" }} // change to "BOOT_N" if that's your edge net /> ( pinLabels={{ pin1: "G", pin2: "S", pin3: "D" }} // label pins as generic transistor pins connections={{ pin1: "net.BOOT", // Gate connected to BOOT signal - pin2: "net.VDD", // Source to 3.3V + pin2: "net.V3_3", // Source to 3.3V pin3: "net.BOOT0", // Drain to BOOT0 node }} /> @@ -314,7 +315,7 @@ const Board = () => ( resistance="5.1k" schX={15} schY={-3} - connections={{ pin1: "U1.pin7", pin2: "net.VDD" }} + connections={{ pin1: "U1.pin7", pin2: "net.V3_3" }} /> ( schX={3} schY={-13} schRotation={90} - connections={{ pin1: "U2.pin1", pin2: "net.VDD" }} + connections={{ pin1: "U2.pin1", pin2: "net.V3_3" }} /> + + {/* connections*/} + + + + + + + + + + + ) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx index f4d750cc..161e59bb 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx @@ -12,7 +12,7 @@ const W25Q128 = (props: any) => ( pin3: "D2_WP", pin6: "CLK", pin7: "D3_HOLD", - pin8: "VDD", + pin8: "V3_3", }} {...props} /> From c26043d9e95d338c7b6b67db32d058e10dba2af8 Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Mon, 20 Oct 2025 14:58:02 +0200 Subject: [PATCH 07/13] Cleanup, enhance connectivity --- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 399 +++--------------- 1 file changed, 52 insertions(+), 347 deletions(-) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index 52208150..94769737 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -5,361 +5,47 @@ import MicroModEdge from "./MicroModEdge" import { sel } from "@tscircuit/core" const Board = () => ( - - {/* === MicroMod Edge Connector (J1) === */} - + - SWDIO: "net.SWDIO", - SWDCK: "net.SWCLK", - AUD_MCLK: "net.AUD_MCLK", - AUD_LRCLK: "net.AUD_LRCLK", - AUD_BCLK: "net.AUD_BCLK", - I2C_SCL: "net.I2C_SCL", - I2C_SDA: "net.I2C_SDA", - GND: "net.GND", - A0: "net.A0", - A1: "net.A1", - PWM0: "net.PWM0", - PWM1: "net.PWM1", - D0: "net.D0", - D1_CAM_TRIG: "net.D1", - TX1: "net.TX1", - RX1: "net.RX1", - G0_BUS0: "net.G0", - G1_BUS1: "net.G1", - G2_BUS2: "net.G2", - G3_BUS3: "net.G3", - G4_BUS4: "net.G4", - G5_BUS5: "net.G5", - G6_BUS6: "net.G6", - G8: "net.G8", - G10_ADC_DP_CAM_VSYNC: "net.HOST_VBUS", - G11: "net.G11", - SPI_SCK: "net.SCK", - SPI_SDO: "net.C0P1", - SPI_SDI: "net.C1P0", - SPI_CS: "net.CS", - I2C_INT_N: "net.INT_N", - }} - /> + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - {/* Other parts left unchanged; helper circuitry ignored per your request */} - {/* HSE 12MHz + caps */} - - - - - } - connections={{ pin1: "net.U1_PH0_HSE", pin2: "net.U1_PH1_HSE" }} - /> - - - {/* LSE 32.768kHz + caps */} - - - - - } - connections={{ pin1: "U1.pin4", pin2: "U1.pin3" }} - /> - - - {/* VCAP1 / VCAP2 */} - - - {/* 22Ω series on D- / D+ between MCU and edge */} - - - {/* BOOT inversion with a P-MOSFET (SparkFun style) */} - - - - {/* Reset (NRST) pull-up + POR cap */} - - - - {/* ===== Status LED (right side) ===== */} - - - - - {/* ===== W25Q128 Helper circuits ===== */} - - - - - {/* connections*/} @@ -371,7 +57,26 @@ const Board = () => ( + + + + + + + + + + + + + + + + + + + ) -export default Board +export default Board \ No newline at end of file From d08f2ea599fb6a2273a8fe53f3b82e1b4a7aaab8 Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Mon, 20 Oct 2025 14:58:44 +0200 Subject: [PATCH 08/13] Cleanup, enhance connectivity --- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 341 ++++++++++++++++-- 1 file changed, 318 insertions(+), 23 deletions(-) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index 94769737..4fb28b3d 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -6,39 +6,334 @@ import { sel } from "@tscircuit/core" const Board = () => ( - + - + - + - - - + + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - + + @@ -79,4 +374,4 @@ const Board = () => ( ) -export default Board \ No newline at end of file +export default Board From 81928823173848746490c3beba6e2a61508140a8 Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Mon, 20 Oct 2025 17:58:32 +0200 Subject: [PATCH 09/13] Fix rendering errors (3), add edge connector (formerly pinheader) --- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 187 +++++++++++++++++- 1 file changed, 186 insertions(+), 1 deletion(-) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index 4fb28b3d..d0e41e34 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -5,7 +5,7 @@ import MicroModEdge from "./MicroModEdge" import { sel } from "@tscircuit/core" const Board = () => ( - + ( pcbX={-5} pcbY={15} pcbRotation={0} + footprint={ + + + + + } connections={{ pin1: "net.U1_PH0_HSE", pin2: "net.U1_PH1_HSE" }} /> ( pcbX={5} pcbY={20} pcbRotation={0} + footprint={ + + + + + } connections={{ pin1: "U1.pin4", pin2: "U1.pin3" }} /> ( + + ) From fba08d49a5868fc8574f91325885a6c877fae288 Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Mon, 20 Oct 2025 22:03:19 +0200 Subject: [PATCH 10/13] Add snapshots --- ...croMod-STM32-Processor.circuit-3d.snap.png | Bin 0 -> 32528 bytes ...roMod-STM32-Processor.circuit-pcb.snap.svg | 1 + ...STM32-Processor.circuit-schematic.snap.svg | 1004 +++++++++++++++++ 3 files changed, 1005 insertions(+) create mode 100644 boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-3d.snap.png create mode 100644 boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg create mode 100644 boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-3d.snap.png b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-3d.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..130f6245ef4d603ac7acf423710a5a2f605f2348 GIT binary patch literal 32528 zcmb4sc|6tI`hT6~5#@xEGDe9=LWVLAsq8w1NSTL}Aw`8|LS%>#QicX9q(V`NO+;lV z6v`ATA!OXY=UJbIK?Ic3UUhO=kFe~CJJ#%anFi%uQ&ExX*Oet)su*3!njYxHpYKZUs#Yg^squbb>J zv;Qt`-L%bFdft6&es#6WOA4cX5004RJ9h8#S95vs#>W}l8ek!(5N?RfU5j!KVr>Ptu4y=hg0dy>84wx2cq zxl#cCqMe$dPX3yke##gB(%!O!odf?8EBcE(Auz*eGkGFmr9XUcqRNQ&3Yur=eZX@X z2S>2$((f*_;OXlO{XDHguWo-cr&>0~Z=YqpzD1vm;l0-IhJh2;(n}8o;StuYaPj4|wZ@L<& z0rp8)hmRILbutOCQV1-`u*{cILOW|qpk;&oolaRjk{7Xv3~cHVuW{a5PUOm*ne%Cj z<)VcTIO)zWLzdGm#VedmVud#awi}_VBobdp9Ahs&Gflk0b!%bB0`fh4SWf>fj_+@; z+8?pW*YeHO@Pl$97R47Vq{G``4-oS>5wpSWLCJFUq%Tjn^<;TN(?BHok|X$`gp#c^ z9`|py;~m8Bc<`Z&t>y6H5pP8X%KirRl=kMWvWSeea0&k|Ct?#BNIs+=KszkO4H9B` zGu}um(VJ1PGUf-%d=zl~9Z=wMP198s6wC(gM@bkixCte^{R9QL)3V|;x5pB)y(L|0 zdC6~(!?GlJIofZRHe$TMMY~$O#%U`ZjPM(+Q5LdR>nIw57J^HpH(g%+0CZTcca*mx z4RlxzI@F}04pY(oS#mz50r{p2;Sv_b;TFe1*Cd-_=3^db z;Ia6Zr3{&Uf84nFX-kNx=n6`%^5C_gZ_y_QFzM@N_Qb1M_1!S3t>}XAiNJ%1Ec!T-@MR8-ce|cRLI{1AY>!hF|9eD zY*ggB!98?SkwxjT0J{8vH364LUTKGm*SNr5YqcJs_$481l+-pd@MI}}@A4*R9emRK z6+#rBRHB}whpZq^O4Ctz``0Jw?v|nl&vVe8au=Va1Z)EVH-Sq)z#tH?RUOQkA0XWz z#W!Q#-UH{tR%!O^2ghzgEJE}M?hQXF*8`voUTO~}yCn*n8%W{i_P)VS4b$6-0>Q)I zfs=}2g;xZQ7=q4)s8CoDY+ic#!QYzN8w#}dp_nDa`b41>T3+A=X*Cqn#WL4I(Ov|_ zbd(BNg+|H%Cn({E^k#bS3h>6RT_|Q4+K6`!h*=uQT^x-H8G!^o2sWdhCZf>l>o1}| zeUXPJeMa_uoGWN4TcBN!t}CZ@cYzPo?z9KsJ~~KQlz1+6ovQWT0L~ZiOg}u_jG*cl zA9QIh0YA&zaa+)u-@n|=&ELl%sDTJk((6YCD}fJQyn{eo+B26HUggYsi25oOXa`d} zqTgy;(Z4AQxffg{nb5pq(HBiGx4_$pzX*;)rZ`&!H$Z|CRgWV&RTPzx|0K$GLiU6rbKx)wo8tRrJMCvObwXezU zfUsh+6KsjDL6JBis%Y{=Bw-Y(!Z$db099B8RcnLQ%mU2;V!Bl*QYDHMa-RG4Uno)< z+K;%Ux!hnrq~ZhUkw{~}fO`58!G8`E`v{sLn31>4!bjx&AfFU#ppAAC8^xL@=%N8I z+@#O|B_S&CK|o-q1L!8S7gj1rL5jf#MRmQ6S5iWTD%*Q0Wcs+X}D| z2tqgDCD7;0M~QZspdBOUBG#6_(yoGNgpJI|LZTO_g%VVWiA>N$9YUJcr(q+|yhSt+ zJ`jmwHPm$xY}&2pS=t^c={4em&YbxGL}&7WHeah-912gOJ{PL*!7iBb626y0_>@4L zNr@LYaRRh?h|{>xj*+XRr1c2Az@cOzI<=7Wd0fba_`~CG!Hhy`Ay?Ky&bSa)B}ycL z5(&U&MU*hqX3pXT&S3!BHUxG^G@7W$NJ`otH^cDhMycsEUM+cX0oPQt^(Ukn^;ii_ z>tJDTG*6poII)volc|-wX z`ap36evp4{!BM;wk#>GIY9F>nv!f7v+D&{8K1~xZa0x3BkPb%0=AvIYZU=JT7DNkW z08$rHA4&`){2}dv&uCZCXWD(Qw3lN@!~#-#i1Z+|i;;R6DweR0DAwU0tdI_CD5CLD z=!GbBdJ!*Ln)yu4B0)DRVw|sXuPuo5U*%uh1k1lg<>QI+8Dg3pr68+32pvWT>EVNG zSh>K4ib>B%YIc;doNKC(^o)Ob*J)I~AjzDLE za`2(;)=d9hJBSgH_IxYN0!rr*od7u!dQzYqXSub-M{=PfEW`qDnou8N zZ!Q(5T}MOf5<^FtNl9-fI?=?nvZxP=S{n?7Rw1E>2_T^h_?TP9QnH|Z!Qw%Qyn*%) zsO%}Gfhbci^AGmGeH78*HegM~a2L5dF9ae;AleZlLL!n5Ld8qK0)vzV7Q$xDJP21Y zeX@{*fM)9z)ZWOiMHJc0#pv}H(4H6bd4ddjl_M*KJJKc`yoFE(&E(-j>`eu6*V|}m z8nL3~QYquk%hqhFT?x%T(>%N_0O_($UFP+uqSiM|i_HLtaa##z~q9v)J1NgwMTnyHb- zNwBX=$U*zct0LZ74-0xzQGGq%c2{_JTaMSL!giP8en(lent&(7QEj4CWy?14C4&gv zihJ(wYkAoD;l6AAkGjV-C#}|hwFARvT^`#w$|r2daQ8fW!%+G$G%7_E59K)oT?%dD zJPXsRs$gZ$VcDG-*IGnt;Tcr?p@x!Mn+#gwyufhsBj6pgNO)V$|`XXyU7xJR{>3Xdst0(Lc$=| zW^?#2C9uBmo^ZPS+;`r|4Hg%EH?$AP*^D;zE$C@*B?wXm|O+Z=ZXipD*l73$XA0xP1pK@K5Q&{ zj*Dp6f*DqKeD*%M5n*AWx@OIqt*@NJg}uWwcw3yWS;2BrUD?M3PoY?Tt?t)^&ET87 z3Rp*t5C2K6_JoA%>Q#i$dRJ<${#kqYzK3EyNJrnjd$-)--q1I`c1A$73-#oA^IU&C z{-7wa-_7kx1%CSwv{hdsp4B_-#kSwkaY1A$>PZ#-SFobv2=-Vk`1dhdBPgX85}47GH@4s3$nf z!NH-(2s$R;(hymj0$)YzwoA){R{i;&Q7-ob$VBl?-bhK_uZ`Zl8?W^boXr~`K|i}> zj#d`0jgg;)e2IZFX#R;z5^HOh_8#Q8E$&+GPPi#J*#XefEOp|<3B@-g%J1&E@A4hE z=h`vg4-sp4TY}z1a4Z@(?cR>7pFf*!+q-wKMJ&!2Xk3olUiq55#y8_x{1A!J7Y87f z0+4dP&igtb`tIjXi8io;!5-A3(ja=Vlt4sJXxzv-H9+UJM}x1e)%h^s+92R~0rpuL zIXNYEpm}A10L`v7wwp3|D3SK|?mc^MPlu;^0>ajIe zt;k!--&Y0ET=^E6gvSsFM2Z=eL_%lSQ>4|b`$Xw2mR?J+VW;Pg_)994d2ICfFzusJ z?ZwN-9WXLWfnl>;u0iS30vVE6*W=p6=Ko~)?uyN_c}i+65o(D+ND}g0pPNmC1UKnz zf_|77EVk)fq8tLx6&4GJ=r*ZkqU<$+Neh8V(xcw5fdkch4?BO$XH&6UgbPTUnOhc` zVld2OQ6`BRsReo-FiaGSn8xsHP&3@S_ogFwqzLxHXU~+jO9Y1EfK>92F(d(L7CM`VhpMgVCMy+Z(LHHm|c zj+aspKqvcaY>Y$o%!EU1cnc1PTVEfe--st6`bT zuCq8r7cOUurFomThwuwah~*t;m;_`r&WOLD)1!pfar z(!>Ed_D78q^X-1VmamBJ%Q~@WTvrQ&uF-K`5?*{vX(waFAXzxe%G*4 zS^K?X8?!q&Y-8@o?^F9XLx(!QgCGvbP z@NF)qNoXA!Sp($g_9184wWfhlK9>VnL6=@5;nRB0^Z1*lB7l$&xWql`jijugy@>5h zKAw*6#{`5{NC^yPgp~yI0NMpDKKK2c+4jdX&qwhef>M&RLZVR-pbGhi>FF=+P>sqR zZ|5tzRMvES+hp^GnC^S6# z`heIKc((KuYh4RXENZ1I2o<}of^}Uf847&E@`(&rr?NburGZ5{>sfwyw&!Y@*DBQ> zEG4lw^@qfRA)L68YYSWCt63tl(!!fhPGy}AuR>us=gI4}E9RxNwLkxi< zPxXY|XRI6f7k2_661b%VS~9}Q0NU1@QMttc2d$|@IS+!#NKlTg*aS^n;LCA)<|H8$ zPlKM#*RjhnCN*{GHNdL&0V2e<0Bte!g&?Z-cO&3*Jqf)zn471e4=Yts7)z1qZ=S2^ zR-yIM%+=?%K~}kjk-cLo+F6hVv7kAmHJC?)(w!G|+Gp1`B9tG8*m>`QF6V6^{+1aa zK0RO@Ebf7*wLM{9nmi!!a^ySaM!HS^Wuw^V7~`b>lO^s-#EnXyq6_@~7No6)uxYx6 zj-C4p&HIjJUea1EBeKy@AN$*gvajIbGRWg{$v`^S|3dF+qW7p`XgAs6{2bij64?Qq zJO_zNjM(f8u^F*0PJ4ZuR|6cR2Z(jG0<_!Fx~^!R)hP99TMrL1_p_(yC<|QStEhn{ zY5~7Z|F`6G4fpL!npoOW0G5Uh8f_zQuD&||Uqav9Us6)Sixb?0qeSM#D6{rVBFXju z?ZiJoX>F+3u2YDJgCL0-@$feEa5D|z77~gozFsUylmEAhJjVO>wHhM-WRm*U;~q-R zNkXLOmG7<)bgnKsR|B2P86FWKPm=vwlDGI413rWOz9E=Rqy(-sqg&r2emDR>&RanA zYm*-L!uS*TyBake1Wij&(?oQS0Jx_~3|A+UIAiR|i>{&nivrql^^>qV);trdPZgJx zbggAO%y7DiwydRIA;!@^(hpTjE_d+jUSPXGVw@tzlU|kMDo;oA7myL9{Ti$aT#=Oo zHhf@8WPJwpO&}6s7~W1rrmNfq;jP}f1KnB0E-1ZzJhX%fTC347w8emM_TUB**h|gT ztuKt5ZVMa>MouMP(*d7N+5{JNP@HL7xiJ!RUWlQwh?TdIU7z8urB~4vMe68i7?cG^ zeg*Y;F$ETp2~j4QvGTBk2RMp%5!oQ2yN=7Ylg!8ZiEIXB^G|MQmbFp>>xc{vyY1wh|sF z+M315%SNz~93k#OY%L=l1J@HeBhe{_2}9k|nuwtfVmLwrJfAFQy$`+$ByL-d#b)U> zXo`|JQMcQvU9N2Cv@tgE90Jn1jO45N1BsCC?T!T~)Nj6h2BQItH*sNeP zo7sRU-=g*7UZ{GHl}$T1$m0x}+t-9PF34IGB#cZgvdB2!6+=lNJwtoS6c_Zno2a&#|16P95ss*Oc}Wb-NJGEI$2Os)6yPJMpB7A z626WvXpa*DO9A-m2a=n*r6xQZrSv8g(QmK1 zy7b>GDtL;L9X6wpGo$7( z2-l*;#Bb`&VdPsluY{(~BZ({pnP6Oy6DY{FwE_Y*)QXmWO$dU>aRK9x)TeSC^3Vx+ z@bKX|DA{F{-3OKY^OP1zqED#)L{8zo#*%R zm0u>yl!qpXmG`_TS>did`tUSaXa?qff$b3dzEQektGlP1S=o3aJUkrk6M2Nl=x5z} z+~5_hrsti*$=|m`a669EeHFI=uIz;d@4jjZTRHpctM~60fs8)yWvmt*&Ks3YUOW1O zcCK=707=H`u{eNUFOE;oIkR&AQawFA(EFrbMVQ^w(f&Hc;`a>_8rshaN;46&&0+v` zDT|OiUBy`b*?*;{6El@Y$mkcpt~;FfCPSQByz~>YGjnkPTwMOl%9Rex#kDKKQl8=B z_|H9z&B6A_T@81o$jD`KxCZpMa4apm)JTv4Xz@xGaD21o>s- zYCI$qXn`{NIu&6?1jWA1@e2UQ=Z!X77JfedC7eE=wd2OGYxyUE&> z()lR6MWL{cD%mj?cC7X!J8FRN*Y#V03v>Y*iHXAMaOP$g1t-wJAJ+Esd`-?|*(k1V zZr!*MfUmO%zTRXPMO(EoH=Bc>mV~z4dT?qm&#~UwvAU1s*#m;H7K zKD9Y|9vE@vAureUH>`;fB_#ECcC=#rtKYeY+LYsI3#2NDvDF=DAbU$YyEzb!xv*9= zSu4^_%0_%8ZT-f)EFJ?voe&b;Jx4&Ijg&;Q(0+q4Gt@=)gZ<{_48D2e8>PeaM#g)Y z#6yQpx(TW#1lB(A)z<$!(rP{333&oVCm~dtgPY|X>*_fs$uK>qeQE7Vnk(6EJ*p;M z&RSzACxRiNn$Wt0J#rfBdm>J+kp52AL#meB#8*o5BdcAGZuk^%D;}dSaux`zMFf`C zTEY=2i0@DR1b)=IB&72)p17ey1kCe|n5XsaUjjP`y0TH9rMkd-!3qEdh3xLCOS6OJ zGfx#=oBS1^j`h_e7>*2e6z<`B?k|~JG~AW9{qy)1*7{LNl~vW%OBjwL4T`4@kLES_ zu}7-GX@C5S{m<9jfBMo^#{9&IXtl09hO%2IEBYd5p!hI&=Uuwc$G7zE4D}=g zEKko}6~>iW>$vC3$t=Aj_wd;>eN$lwbnPpNcDk_HJJ`&puu012LO#Dw|E6I+0asg~ zYFX-e?n{~n4j~=;q zJsaQ#b(SskQ7rbdX;8B)gPWXr>!}z1CD{c)$lcV`wICL23;DED+L|!-GB}Vo)NAIU zNZ-G%@!>n$SN;96Zda(Fpq(S}n+-E7b45PaS|_dc^O^&(yI{R z16>U^w6iZx!F%zn_axBfBEd;wlive4%=b|f>1%v3O}({1K*06u*y!-n-|zLd+OOmO z^?J?ybxSX~1HFRZTHhiZ0Us|(9_6}{BlgMR3yWv=zgk5(P*=f1x%f9 z-5MU~T7QWtfUV5ew`g2Q32o`2eNSO*8J}LdUSXo zvT*;p{p+}$Y-N@@+k%M|^eA4ybdSMQS6ln_E%SA-@}*g9d``7_V;{WxzyR|gC{TdZ zNfuCMjJTrp)YZ2E;VI;t7?5C@56rN&^TpX&5E>flt(CC5M|)z#Rgj?Z%AS1(K!R^K zgOtBg78o7+kk|Uqn=#WyxAYb)a(RZyT&HayZ>K8Qbq<=%n5rH?2Gvkdi-Y3D{%bhh})ki~@P zSbib^3sN5PMUXXa%o|)#F+{DCgqi`zrh~W9XMj=4+rHOeNbA-0ACMs)`vy7O61+Ch z;2mew7u_&&K`nK+zyF^WN$=u{k?%GtO|w+~Ocjt`2FZ;NhT6`yRFqLjP%ksyoKX1n z(#NKdpAC8CFJ4Ry188yI5)^8IX#Uu?eGZi#lU6+bdTNNgL#r}VY4 zaSDe=`V4g!u_J{wh!A17bmCZ69!udycD&~1S$=6YJr_HPidDSV_yGawh)eY zeq?^QTAA;|=JDqj|EyWFwgMp%w;u$T8v%t@7#ka_s=tmvwxOIL3r>*XT^L!2AtNW( z*w}bVXDtj*>Tl+GHS^QdpxP|@CF#Sry&Dw4pK)bmW}cnuqj{5q4*3Jo9jQSoiO``8 zmEra32`0D$Gl$Tbxu?SY_csod%N_<%V652IcV;R*?6)Jam@8yteOW6m{!8)xv;L)_ z$0-enStqfT)(THd2N|n@FDxHHl^K;(dKRL){zR7&MmTe$(BrTX<#(b^uOjUF>5s}r zMRofG?B>KaLw)4p#K>!aQ*%YWUd3Zw^;Wcoq3XwSzh`;>nzgkF21E=MUQj!d45BOuE0l6I{5Q>HF9=uwL(21!EviK;7CT|0*L+N$!GkvjXRl(LI;4 zC8aETj?B5clKbV-2GtUwm!|!&oA zgu5+J9XJkx<)cRn<2#Nh z9JEl5+X??R40lrskmB`!XREH`pbzQqXmFdnuGrBp9(-zbECm4sj%Dskz@}Buv8J#!~@Wt?z^H%ohVGparfO7VD#NG`1>fsTqwLFnC znp5M20{?V4@C)S$ciVjJi<9kx6o;Oga^>i5-ultroPmTe#Y;_c2XAC1ZR4dY-mj?G zsk>^`s_!@Ie$ebQjdzKJ&hbg9X#XYDJ9uqXJE~YEZZV&3F0<6&o$*fS-AtQ3w&{o! z^!6wQDd>vHius*M=1~1ryj?l+fYGeyKuj}BvPI%Xzi065Jw8z0RX^=AEqwvq`4%V| zDi>H&(B3Y_+RrZ2IE=NQ1?-nh_RHJ^`&q(%?~Qjta)kW?X?~{ev2+n#u?|pA_8fbd z@?i0*_2QiuvU`U*?=x^m#xUbggLgt914sF2aiu35sA745121qHs zDUr-8{b1((CIdr-F;dRhYQQNMm>;w0nESqllf4V@2T(0s?z-=IyKudG(*m!7oQ7^F z9-Mr4-~Ib;l^@y*MAe7?mAB1X=|u0(==P{Gj zX9i2b@5C&Wtn<)Oz0(+33@>V)%g8;fW`avBM-zoi%}^m#Ka)Pu1pHCgEY<=AL4tR zZ7x_nn{sTQ_h?@OY;yhcq26x#iryD_Cx5N}P~^-TTj|XSKgl)+nYT2qD2$mg7XYGO(NLFTF&lK`4hpmZ?rRy z(N`r|Yc|3G(4`!~ms#hS5cX6%uxW>u!y6H2-VFc$7MqQudCydaf2~k{sx?g^W?{J7 zcb3apA^`AoDGq|YZ|&rqAsNDc22Qn$=a}eMf))W^J_cwCdJUGC(IA#7?g*sKP2G_5OEE}4 zj8+NcVZ(o}5rR~v9sY6hm*k44Lm#{uop;S1=KT>2&s;@pvs(>VVp!hY^_s*R1!C-pAIkI@<*#;-3*{ns%(=r6hR z(|9gv?xKj33yJfFP@?+m7rhe#wF%=s%5H?XXHu};1knE;%Kn#_u)fpy{-!apu`Vty zFD0@+OC&<|mR)T5G7TB5+R+*`Cloz-C-XfMfiazbI!(9#HUaL2#xfWhjV%-Jlm`eX zkNvUe=l2uXcjCteU0|?eoxr9C7n|g`E!?9b%)BDu$tY7!jnhqXpR!zi+WOvXY;YR* zY1*T>isCHY!%w?snw{*PLAT5_?(Y2kA!B1#?%?Whw-Rm(IoX@d}Awf15yqQ&vJ|^|w+wdo<^brSukEor-hp-=o>jxD|5CI-7ER zaPx@TcVBDq68{-F(52GCtt^c++rNH2bNB9=z&9tA+hX#buFp?jcvWg9A+i!NVAzA3$bvv4FD?>JK;AdO|q*o0354OMy%iiJB|p%&T~b{Y*$$h$n~Y z%0$aJg%!uF4ROyrklmcwy znfYI8{e~vGtgK9qsFr;jDCXuwjRT6=otaRK4Y9n?sI94Ne#sCAQEA>)NELTP{k{zh z%e)|lySix@j}K%%@?`$IOT<7iHb169w^?;zPo`ccjSJ&d4tK-hn$r2m*8I=6rA ze6^DeZEp$91P1!M$p8o-odZ4|Y&YOEXdf8HFQ-AH#me^Ot9w zF82jsv@@QOkc;a_8d?V)1p2M#UAUn79r#X0fA(p>>P4a{34t+Ra!9{qlpPe0pM7j3K9ic1qBML4{*Qd zHB?$nW&ba zOVK%YZ7~l%@aIyKh1P~z1sHyvx30y-?dLCFz(-UDM%eujROtjVrHl~LU9RTJ}R83uB)Rn`$g{g14aHzG&riAUDE=~jwmE9 zg3VPqHNu8Qm4}J833i0ZBOHGpS2~($C~m78A{3S`ep4D+YU|!X-jdpI!riL_EzYdG z4q8IS&^P**mbOvj&ZKc)csd)b%Y)XP)wG6j_k`J?+2@;6DK=;y8M)@yHEiNTnCO#8 zVAC%dV+Zu9K9oQI^65SF>2|1Cu8v2~`*STWI*S#{EtctuVS#ukblrRaP$#2k zl%cn<@1UxsB=HEnqb(kMbvty^pnx1P*Ac{^gLa;qQ82)|nA!d8%LhdClnH z+xsW^SDf|1cB+<0x!LEVGIBa@?053W*g#$z6w?p}uN>|_D`frf1CM>!cj6NMBs=r^ ztb)>y?!2yWM_WsTSu0c|)?B(`&;r=K+}Ln3AI8ANz1Lu(bJ1+HW6#s>!ew|;#e28P zzTkd^S$X}_;nur`TIE3A{!H?QjzD+kzi|@V403?auEoSS-@^0)B?jjOeyG)C#QX$w z&z8KH-+6tcvnDV1^^&o^?`CF>qh_glZdQB?s&vBENa1)}TiY(6&7{ScCL0LRXRL+x zPTk>+>{mJKJwJ{{CmqQ#T@CZO_mUjQuFIY1g zi@S|bSnVP<-7-jQI`q3@`(Rp-!iqQUe{q%kl~f_-vw8Lw9o^zwbp!RphOS=m0I7pt zvnA@j^&S6ipJw;~01XFSy8zHQs5=Uc;<2%wviY62xGmNdI+gyLFS1P1*Od2uyg+!l z(dbX^cH#MI{Td{a__+yTv^^UTwKMPfrI(<+l+fQ9bs5{@s75k* z!nXKvFh!FP=ESer8*mQH`ic5VpycQTUM(K*jDkWKvYsK#La3r<>tbpk6)(mtbY&v9 zKENhw`9iR?1cfG?ctt@s_^*BGs^~TyNJlqhp754FSXix<8uT;mJfp{KY#xHDyo3Pi zjx)9OQDL&RtS>1x9`VxS1FNGHp#8lI?eDg2+iZ0o*CoEU&lJ@cSuE~8F$r_C;IVkH ze|$`oM8-rS6Jw%Bq<%XzjW{;PkA-gA6`9J}^l&~EuTrQ+U1NQax5G2f_x8H3&h6?= zf#Fg@*r%BWobS2@Jorcg|uCMjz}m-6`ree2WprH(?VJVXCoh zVPQ08xrZ%yxgaU`WZAJS=t%+FNE6%C65AxwgI4rfs4xc0Yr>)V@mV*&CY+hAeI$Sw zp)qK)3WyKv%&u%lqRBK)Gfv&1`wlKt7)Ds}aB*=#-WG=`kl{ujl0BLJVaXzz2pI&Z z<`%TOFa%PRY#0!OOdTIe6F`*i-)q2mz^F5Kq(_hS(*ei~2f8a)(=B#{ga^57`{Dqp zN@r72i<&CJ4Gi#!s+a~D^!xopxG_Pp9(oLIVx|YlKH2j#5FZsRO12!^xuGz zau}Jv(neo2mUr5FMJ?CHtk@e%hdE=?qSZ~};=d=_XnV4<2&mAaogE;bpA5lNi zzG2V)Vyrp!O+HvHgVNkIb@!SunrPxA?$653etCwfptAW2xuJo|kqd;;19aX@$_OQ6 zEJ*KUDnPN+7MRe5b`6KUTqgu}xhd**Yd+AGxPzXV*Pt-|2vZ%SJXVlc%z{8rWhev7 z+=grfjw9Wyns|%GRb)NizI6vBHL&*;h%ba$g8L z*WGShraRcJwEbBN+0af#BH>~Hzqt9#(R}Z*s2icV1~d3Nx!I<7oLV30b^yH^ZLVBAh&Dh-2BU=ZUFT!RT`$))?||J8%_W@aPen&19^<%;Qzz9kyoa;Zj*hwWNG1KI%{9fE z+u}j)1~R#XCKC=sC^J+B(`fW@OKd#fHH=*>aYD-8FE^{T20p%Tq6gW9_*?z3RfwSh zfEKX6!_?gX1*mJW3^?NK{K8$aaHyKqt{j&@G@u8lf*SXRaWf1J z)n>mCiET5`B4d#UN4c0~rqzb$1?fxI5fu8)P@R4Bz&I1g9LO||52J!GKE#UW3S_9h zR5r$!{1cd`YEVh2+^K>RM(H9jy2pXAEp+dYstl5$bmu?!{LHwDO%p0cfr?wWFYvCR z_*1%Y2i?uI1FH7p&-ikTQ+KBzf4O!PZourIe%x zF#X!O7YZ%dyU+69wsnI-;GAMPXc|IGpI44UJ_=h~LKDKm&av}`iuxIDL?S*EGmt)D z-DTDF28D5cL!Fz!uh`Akj4@mL6C=z(9xO2gsor0jHStH|P%E+m~UNK5~+ zI+dABwZ%A8Av;4ck9JS_4CQz>X(M(i+j|~iYwT{Ke=muF!->(2hP%&>{qj-yRS`E9 z_PWcPaRO@PClac&@#Mg<1rCjx7;!Ea5!L=%?YfM@;|-V6@$#i2j9C_U!r38ANzU}C z!Es()DfijFXLvw^DkDCzP~AyQXP{VgD#eL`oi4L3hPq^n%oDn+OInH&%u<2zEcXx_ z2gXQUP`KAgOa9RLE)1IZourA!EX)%`H&l^{E6+*=mT6!$V@#5>$})M+IicVtq9E2r z6th11eT!k+4?l&jq~A)v_hN8R{_lo?v?xHF+r#Qg7`v}Rf<>Y$zw!A{MZ%%SWUST> z7cro%J21K4I4qrOg4fc=zg-vWke4blif%K3=XvOBlyL^@`I?wEXQrI zWnb_!?XCN^dy3k~$v~pYAYRZX zjCc4GknEI};vh@$b``J1{5mJ9cp~TwBj~&Zb=$pr_a1oJD#y8sg2Pl`nmZ8=U^k|_ zfa7siu78gGsWxlgQO&2+p%R5Z-Gb1``~{5!%+XvvpJV^D8+mYYGywSuk5je3|2)>F z&^u+pbQco^n37~9IR3_gmTqhtj31)Dl70fKCDQELT^~lJc%V*#VgQ=OjTfb6cKVQVk(yh+Pe9UsHwmfp z$ax8?7AZM?+C;o_MidnhW~5~2U2HMm&E!MkHt?qy97I7-goX%>XT^cmUiporyQ^lK zyl9okKb#${b!wV@W0T!t~kQ}%2yjF7~$&b`5OP?C+r4Zx7X+%u|KqsNV{4~uk zNk~UkxI~)j{0YUylk%@kLkfc78C0QI=)e&=I^)@1ZZ~1MC{7k)KTnYe zcbi6eG@VMpOJE#&0p@n^JNs;@(t9H4v!6U^g!-nl3u>Et(Udi*(+}K^@+M@>5Hhr< zu=D^1urRT^$0~kPmQiN|*;63^joOBlcW3a@4=kgO+C-?MF4fS9lZgFFM#&Wi;sCSW z|4JpVNfifUbU5ETcoPzxH7n7#XVji)if{tn?XRIGJ4LErP_^11rV$24P`djNt}X zxWS<>K#m;o=u@o~c#WJ4i%8~;NJH}7pf8G8hhx4?$9}#&$2{_+O&WfU{5+P2H(g!~ z#l!T=J`)e+MIeG=56Ud}081N7`S4s8(=(ph9ElUUc&qD4;U$Q0KpxDxP2fj^2^B~4vX2bm3)Wl>RUr<`? zLFKrNHBfFL&675VG<*=bqKTq9Vt7V_1BpuzxeH)Tp>aqrXeQ17=grhOjb2Ng0^wPS zOgnWHA5}?RF<2d1JiW6Wg0%c4WG+kM0_J?5MoLM*6tk2}8TB34M-=plr}Rnd&*xTK z{=w~b#W--8fk`z5CZ?tblxj{Y+w6s$yow~Ox5jX2hjqy~n5eStbmoc)9Uv?>GQ+ak zi=uO4E>a*ua~wuB$B9g~Lu2ivgAM~QCu9za;M7NVCpkFlZ`>VZRx@Se<=$gOP zXD65u!Ewo_nX0o7K{jBqj1I8O|8fiP>Yx-!9C`mrQDj*1ugx~XxnSK&W|LK-fN?*C zGMxM_s+ts+6lwQK&$cqeY|O5k zl>Tt=#!P`|HN-#Fn^-M}KvviR_;)+N-6H`1*$rBP&sZ@0t9(kki+}XVYcdd`vQo7b zbubTYp%tsn###`XZHPGNaWx?KD3<59#=D??$5rBzeR|DwTha!<-(wbB9_OefLQ*bh~@jvyoR>y+5Ar~!f8T2)n!LLG8Css z48|ug?A|3IA@Kwnr|eM{eNik-RTET<#KgqO&F#F~lmFu=k+o1z zPlR$5oH+yf(sE(a(@7z49(CR5@mm&YsKD6{MH(4wc(&t4o$WwYK34~~8eEsLYFQ*f zT)&?hQB9z&)Cjd@>z`Ge|-} z58)tv);P`W|6w-HaBCq0KZXo!WeTUTq6VDK(1B0nVHk@ht%Wum8XY*kxak6Ou&S!R ztKTe{+_Aypc7Q4OSgpn6qFJB@wN%<6l6@az_H}_EiN4;@;^!5ShIBEF<01kqhc?2I|Ku>elBjzQ8{W)jl4Uz`zVj3NlFcG!$QgVTkMr2VBgUKc2=Mr86lT zZ<3rH?{jYno@+FO0W}VRDQ?k%#2Q#s=Y9M{;jx$N66}~%2Dd6C&ye))NVy45En%RC zRAWmcclVjaCBg4F(U99QIGus0OlPCc4c*`($uiQj?1QUpAK+XN&amD;94CV!su$F1 z#Ot0-o8oeN+LdyfhLv&F0E{XH{0{$OUgmoQGs@w&haTI}9@mk4h?k$$0q$y$k;(9K zG7>+Ale?wAo|5@=Aj~M?P<*0|5u|F{#mbSuagJ<1a=J@exQ?!NaPG&E$4HR z4jgQ)z#BX8yFSlrYIuASAfB|DmL4&jr0?29PSE#xw(@xK84Lp%!M^^u`q=Im7*$S( z!f+aRactO|(Z$5gFrEd2RYwdb99bL0yqc>L4#n++8w8JorU zkvF=LTyLPpT^s*l&7RzvsVS%+b$eWJ+=&}6V%78*?j;{oqt4yU@ZJjZ2GlO5JvSQV zd~OwC4WL+5``w=!Fk%*dgqPjO!86qbiJOR*d}W2A%i`Jm(8OfDp>iVL0>VS~NqjY- zXLT>krB=?ywtOI%BnOoz3@Z2G#Ui+}%rspuxp+T)+;ksw$eFejRGe^& zbsYG{OyD!G-951bdv1ga-{dkOY3gd>GSv#WwXl~u86->^rX1e*kj*L#hp%)H6_%o`=;;HrvZ&Gd&z}{qgp{;WaX4%F;&s zzx}8?dxA^n(W`Cwc?vm;xQxq|aINOnTW~R|Q)Yhq?N6sIF0GPmR9!cp&Z8E1_3~ru z*_VP3E!E$W-(7ocY+llKHSSsJ3&q8S5}xu$9Wb;Fv7B?m;TpY{z$P7dxaSLJ^P*=Pjnm_8}4%ZaIC>Id2ilW-~GP+AA5h)!JnV^aC=4juE%(H zyd7T1?u0*Svo@)~Jl<40M18x#hfKZ-nM)6hV%xI+;XMC{wf#VLQF_YXP8SaCYfx7* zKe>U=9&Wrp+eJM!6yBEQcjIju)G==@ay^HWlHnAr_B{MKo_2M)jIk4`!#{Jn9`I7~EFH70FQ;L2+hcse%`DHW>Jg;nA8!QnpO^z2JCn2#DjQ@JF=$<^=t6esxr>ajb*i z_POuY;5iV3#}?nJ;n(np8S>E#Z19-M$gi_reRs{!62=34oqHVX%+uaV2Elij1)KTKlv*j_A~{l*h@!#Gl9v{DEvWt*?m7hZ%Q2=>bv{MG0o7HD@4d(kDF;H z{<=P@dv5GJ`@^zu*}2cp224>b`bWb4(!f3+iE`JNs7H>O#fQCz_l}n2jrbqpv8b%t zzwWI>X`8EKT^wV?#*wvC7&Hl^Rc51Cy#9Qd^|=i_`-tgT(<-;rz3}UJj62>#$=>fp z^eetqHhbJt<5GRAfcOfc9Grv>c9WTG)Q+z#TyYUxMZdAmE(w>l7aMJ8{{??SYX@4h z(x?5%op&vwy6+L1%i)*z7}p)4LaBWur1P88&GfGSBn3CG(tOTSVqLRidDd%<)b9Fu zqYibuO}Qu3f@z^+$wAo)(?<^t97dL{SQUD4Tfq^9s&6iwna!)Y+~{!F^>D3!fhzo6 z7cO)$_QpL2w|6p^-sZ8NsjhjiIrUrV?9Dd!TnrqZ4%9w|7&%n?=%2br#{;A^P2u;X z;qM%#BX_$UEzO_O|VULEvx62T=6&Vsh>Ao@hFwgBH-Ol_$5pf@Pq3c>-C?l^p^EaVH9dH3hBj`H!P%L zwr$Af)lho=k3>fx+Y04xS^u%Y%dvCp56$(K&1f_N9QofhsSFv|=ULQi^5^y=$3AY0 zfLQZ&+_qe;y;<=0P;4c<0id98aYqo|;esl%_KJ{Bo9TGhhugw3z+lhW7n|Yl9JtL< zRRH*qg?+~Q8Dp}znIE-NpoErzGj#*bmnBTY?_U!z<=}bB@a|EH<(c}FktPK$ApEn9Y_uI01;KtRpzR~_ezoc7 zQDq9*xPCU+2{=MZzrr@UN0BQQE&-Etu-9UGBLhQ75~Rs&e#Vu(#!t1b`cZ23y24v` zU+lkb3P(g8p_Js7(gtSW-$^e10k;4;?odJV2;3N-!*s#HD;%d%ndXmf@wjI?DKgQ$ zO0OXD{Xyta5|u|CDY*gYmElibYbfmpV%tLz8;1Nt2ani!(ZFkn$NimPmKe$`==Tn_ zxCE9JP(>VvX7%_xH$Wg4X81%&z$hkvhH>2pK$+%Rj^RRL2*e1MoU zg(2Ye>Q5{W0gFp|#5%0_Z$bY7Ib{=t`iG8?0#Nio5dAa4WsOeAt-DnAsg$|Y4_8or z=*6}vz}3Q3jM$Gnf>Sm%5rcn-7xh#1Ea^3Q44F?E5K8B^_{|C6Ony1e1Bqa9uil7; zS3ry%(;=x)&_@=iO}-&|WKFqi9~ghRAJh2X!#GaGfbkWkfb?;&ZoF;X?jWhcBFaXO z+DjrNYq`d$pbgHMmYN3M=x>IrAGI)ppA=VMp}9YHg6Pu`=SRzCKlcuPlOF%5^dAXb zpo3u==XuQ93xO5KT>$ZY$7bwOP-wCGc4*0wW%@7;X-)X^$Sp|84Io+WIrbxv1m_)ie_ULQIrL&MF&P?hR-SiDju_KqcnX|MCZo%v!6LcIQtUE zsd{jPPEWl<1YkYeZXzk@ogD1Z@OhQj{f;tj=tQi~`U=_~zes7{al>wDd^Gr9kAM2- z^u$Yly}irmhm1VpJ@>hHcQ2#2H*U0!@#nFM-7GH^#%P?^;Ksa>niY&cTF*R(cjx@_ zHycrPk0Qm?*RQIMb$9+>S=Sy_Q@+P{$#jSwVrb-XoK!|0DNQ$0jz`ixSr((4mQfdT zWOU_mOjEiJii`3pTuHc5NRMk|R*!R?!AR4cRHP%y=`y6I2T4{c_w(KRw`;9V|D3aa z?cewP{d~XQ-`abhgC!+?-FTk9d@F)K^T&(v9^B5Zp2IuyJ68vI73AkvWZvv)y!j|o zkY~gFKB}i4b=5rUK9eHrQ@6eu58uVoeT6~fl}M#Y@TS6!TOshWSp85;CcW9TBl*wv zD^CgD^`C#tZt=1CRKKStrCFKJlg#Dbmq@%@P>4@qa9rzmg4;q|H^8}U$Lr+>=iQW?d&Q)5xU^dr;|^wo7Z$iNYwl20&_fJ ziOE8j<1rBtLOHV^?IH=41)*->#u3i|2CDDxO0?uhfU3$#F7a5`xA|6`Z||n^No}=_ ze-YVc$8mog7dRH_J3CjVXN3i+)(MDznw(Giw63L+KIiXUmlP}{GtebARJc|;i{+`- z#z^M~@!L@zHxx%rv)zk$JTAmz$fv$tF}E${We28&4Oj08Hqnn4#ErdOb|Vv@foB<1 zGe-@N@R?wEQx_hwzN~mE(;KQUA z&HLY|6#wjO93Bpz+WpXyYf)8IRlU!0xA`h0^sm5+IXioe|{tkzyf*sZIDeTwd1Ro_lDnK&fa)PgkH$gNKh_JEM;yiw~)A zJq`>>e3jP;D^8*I(X>ROO}!TA_Hb-p2BUYc-iPL^5&kT?!27e@{;b!|N7Qg`jE7uF zpc&M9@UmlQu#G^8P z*TXWh;+*pv+g{!04W7vx98Go&*=j@5!fADys{agMAce-~9S7H-k9qRB+*18K#6*8i zDEqkzfn>faIyy6YkhC7MPOB87Ad}bqEJ=A$D3<6T{4R!m34*xUq6SDc4q)iUN|9b~ zV^nWP$+KSw<-KnLNwQT|b~ZHvSIpMLk#h=Q`y3Yp^!J5P9sWXxd|eTmga>t- zmSMC*+uA-%jFrJ715e}{mlglkc>0p(7pvpR~DL19jo3Rb(0SL-5L& z+9+BO8stkhM(!Jgt3qzdC4;5)Q%MphXgI5|gF5mN3?)*PCi;4WOh}7dl7EVy}XlO5ma@LXK;8o){FEBMBuMUyj2Y7%Q{qThy2`~>Sw@T7 z#zFk#ArL<*qUCqZ$n8|3wZ*`REw~2N0xCU$1omLz{wF9tI-(`E3Fld?t8{ohq2$^M zF6H-^?TUv+qbbf3(k{2omYRg2fs6fdI?aW1lhSUr!Gip#T0FzJb>m~F(G6-Cr|uWI zq#6z4U?t(=fEG>b7G4)*aKcNzYl1%YQ)A945c}cVA(C5btyxX1B@l0H{^wxqC>oU2*dz1z;UKmXNb?I_Rf01YdHwzQkC!h`qryk0LqXoXll^DE3*f=Z7QcZ!pN@9qfpCH+*M~|^-Li%$7ERUW_grDGkr&EZAn!2 z8kU*d(-4#345~aw3H{&JHtGEAfyClErW>oHgi@~>Lg~KV8Udi!_PVcV zJaeB;E8*M_H$?A9tmQjPy3QMs=?Qbq!+8KN z~SrV|=tE+W@bI;-Ka@3vB(VI8J{G`vF+h zH<*;Ar2S{LQDH%>&1^Lmv|7e%CB{_bWp;h*I7%V6MGuxw6Ck+^DK-fg6I@NYD<2l_-8K>%NV zaxLKnUUrCxBwUM|IZ>IO%X*v_s5%`3WOs$YVVWi2c0YVj>;=>q&T(2BXJf3WQ$`u#!+QxPk+0D{V9njSmkRztR*`pay4m9dccGB)!K*f4Eu2N|$o+V~h~GmNp>)nA)r(Kp)uY#c;w4180}v@tc%=9tK)zc$ID zZ@dlIh}szVrkH7CYM{;Mj7^G-7_W#F3i#56LfGnL{Y?|dWRB{MS8Snxcb|pc4L@@q eY{4Y^WD)XJ$CdETiz9Fa=exjvewI9V_x}NE;X=*; literal 0 HcmV?d00001 diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg new file mode 100644 index 00000000..bb523dc7 --- /dev/null +++ b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg @@ -0,0 +1 @@ +GNDV3_3USB_DNUSB_DPUSB_VINRESET_NBOOT_NSWDIOSWDCKAUD_MCLKAUD_LRCLKAUD_BCLKI2C_SCLI2C_SDAA0A1PWM0PWM1D0D1_CAM_TRIGTX1RX1G0_BUS0G1_BUS1G2_BUS2G3_BUS3G4_BUS4G5_BUS5G6_BUS6G8G10_ADC_DP_CAM_VSYNCG11SPI_SCKSPI_SDOSPI_SDISPI_CSI2C_INT_NCAN_TXCAN_RXRTC_3VU1U2C1C2C3C4C5C6R2R3R5Q1R1R4C15D5R12C20R11GNDV3_3USB_DNUSB_DPUSB_VINRESET_NBOOT_NSWDIOSWDCKAUD_MCLKAUD_LRCLKAUD_BCLKI2C_SCLI2C_SDAA0A1PWM0PWM1D0D1_CAM_TRIGTX1RX1G0_BUS0G1_BUS1G2_BUS2G3_BUS3G4_BUS4G5_BUS5G6_BUS6G8G10_ADC_DP_CAM_VSYNCG11SPI_SCKSPI_SDOSPI_SDISPI_CSI2C_INT_NCAN_TXCAN_RXRTC_3VJ2 \ No newline at end of file diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg new file mode 100644 index 00000000..f12e7050 --- /dev/null +++ b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg @@ -0,0 +1,1004 @@ +J12V3_36RESET_N8G1111BOOT_N43V3_EN72RTC_3V9USB_VIN5USB_DN3USB_DP37USBHOST_DN35USBHOST_DP43CAN_TX41CAN_RX23SWDIO21SWDCK58AUD_MCLK56AUD_OUT_CAM_MCLK52AUD_LRCLK54AUD_IN_CAM_PCLK50AUD_BCLK14I2C_SCL12I2C_SDA16I2C_INT_N53I2C_SCL151I2C_SDA149BATT_VIN_31GND60SPI_SCK1_SDIO_CLK62SPI_SDO1_SDIO_CMD64SPI_SDI1_SDIO_DATA066SDIO_DATA168SDIO_DATA270SPI_CS1_SDIO_DATA357SPI_SCK59SPI_SDO61SPI_SDI55SPI_CS34A038A132PWM047PWM110D018D1_CAM_TRIG17TX119RX113RTS115CTS122TX220RX240G0_BUS042G1_BUS144G2_BUS246G3_BUS348G4_BUS473G5_BUS571G6_BUS669G7_BUS767G865G9_ADC_DN_CAM_HSYNC63G10_ADC_DP_CAM_VSYNC7242526272829303133363945U11VBAT2PC133PC144PC155PH06PH17NRST8PC09PC110PC211PC312VSSA13VDDA14PA015PA116PA2_UART2_TX17PA3_UART2_RX18VSS119VDD120PA4_SPI1_NSS21PA5_SPI1_SCK22PA6_SPI1_MISO23PA7_SPI1_MOSI24PC425PC526PB027PB128PB2_BOOT129PB1030PB1131VCAP132VDD233PB12_I2S2_WS34PB13_I2S2_CK35PB14_I2S2_XD36PB15_I2S2_SD37PC6_I2S2_MCK38PC739PC8_SDIO_D040PC9_SDIO_D141PA842PA9_UART1_TX43PA10_UART1_RX44PA1145PA1246PA13_JTMS47VCAP248VDD349PA14_JTCK50PA15_JTDI51PC10_SDIO_D252PC11_SDIO_D353PC12_SDIO_CLK54PD2_SDIO_CMD55PB3_JTDO56PB4_JTRST57PB558PB659PB760BOOT061PB862PB963VSS264VDD4U21CS_N5DO_DI2D1_DO4GND3D2_WP6CLK7D3_HOLD8V3_312MHz / 18pFY1C122pFC222pF32.8kHz / 12.5pFY2C315pFC415pFC52.2uFC62.2uFR222ΩR322ΩR5100kΩQ11G2S3DR1100kΩR45.1kΩC15100nFblueD5R121kΩC200.1uFR11100kΩJ21GND2V3_33USB_DN4USB_DP5USB_VIN6RESET_N7BOOT_N8SWDIO9SWDCK10AUD_MCLK11AUD_LRCLK12AUD_BCLK13I2C_SCL14I2C_SDA15A016A117PWM018PWM119D020D1_CAM_TRIG21TX122RX123G0_BUS024G1_BUS125G2_BUS226G3_BUS327G4_BUS428G5_BUS529G6_BUS630G831G10_ADC_DP_CAM_VSYNC32G1133SPI_SCK34SPI_SDO35SPI_SDI36SPI_CS37I2C_INT_N38CAN_TX39CAN_RX40RTC_3VGNDV3_3V3_3V3_3V3_3V3_3V3_3V3_3V3_3V3_3RESET_NRESET_NG11G11BOOT_NBOOT_NSWDIOSWDIOSWDIOSWCLKSWCLKSWCLKAUD_MCLKAUD_MCLKCSCSCSAUD_BCLKAUD_BCLKAUD_BCLKSCLSCLSCLSDASDASDAINT_NINT_NINT_NGNDGNDGNDGNDGNDGNDGNDSCKSCKSCKC0P1C0P1C0P1C1P0C1P0C1P0A0A0A0A1A1A1PWM0PWM0PWM1PWM1PWM1D0D0D0D1D1D1TX1TX1TX1RX1RX1RX1G0G0G0G1G1G1G2G2G2G3G3G3G4G4G4G5G5G5G6G6G6G8G8HOST_VBUSHOST_VBUSHOST_VBUSFLASH_CS_NFLASH_CS_NU1_PC15/Y2_pin1/C3_pin1U1_PH0/C2_pin1U1_PH0/C2_pin1U1_PH1/C1_pin1U1_PH1/C1_pin1RESETRESETU1_VCAP1/C5_pin1U1_VCAP1/C5_pin1U1_PA11/R2_pin1U1_PA11/R2_pin1U1_PA12/R3_pin1U1_PA12/R3_pin1FLASH_SDIFLASH_SDIFLASH_SDICAN_RXCAN_RXCAN_TXCAN_TXU2_D2_WP/U2_D3_HOLDU2_D2_WP/U2_D3_HOLDBOOTBOOTBOOT0D5_pin1/R12_pin2BATT_VINHOST_IDHOST_DNHOST_DPAUD_OUTAUD_INSCL1SDA1U1_PH0_HSEU1_PH1_HSEDPDNSTATUSB_DNUSB_DPUSB_VINRTC_3V \ No newline at end of file From f3b7dc7148dc300b652cde6d4febe08f9d0cfb51 Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Thu, 23 Oct 2025 17:06:01 +0200 Subject: [PATCH 11/13] Refactoring: matching component positions, outer shape, bottom layer/components, add & split edge connector instead pinheader,... --- .../MicroModEdge.tsx | 4 +- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 577 +++-- .../W25Q128.tsx | 2 +- ...croMod-STM32-Processor.circuit-3d.snap.png | Bin 32528 -> 30103 bytes ...roMod-STM32-Processor.circuit-pcb.snap.svg | 2 +- ...STM32-Processor.circuit-schematic.snap.svg | 2146 +++++++++-------- 6 files changed, 1534 insertions(+), 1197 deletions(-) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx index 925ff0d3..b491d61e 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx @@ -12,8 +12,8 @@ const MicroModEdge = (props: any) => ( pin4: "3V3_EN", pin72: "RTC_3V", pin9: "USB_VIN", - pin5: "USB_DN", - pin3: "USB_DP", + pin5: "DN", + pin3: "DP", pin37: "USBHOST_DN", pin35: "USBHOST_DP", pin43: "CAN_TX", diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index d0e41e34..9c27e82a 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -4,15 +4,84 @@ import W25Q128 from "./W25Q128" import MicroModEdge from "./MicroModEdge" import { sel } from "@tscircuit/core" +const pitch = 0.45 +const padW = 0.4 +const padH = 1.75 +const startX = 0 +const startY = 0 +// Define pin arrays (inverted sides) +const topPinsRight = Array.from({ length: 12 }, (_, i) => 12 - i) // 12→1 +const topPinsLeft = Array.from({ length: 24 }, (_, i) => 36 - i) // 36→13 +const bottomPinsRight = Array.from({ length: 12 }, (_, i) => 12 - i).reverse() // 12→1 +const bottomPinsLeft = Array.from({ length: 24 }, (_, i) => 36 - i).reverse() // 36→13 + const Board = () => ( - + + ( I2C_INT_N: "net.INT_N", }} /> - ( PD2_SDIO_CMD: "net.G0", }} /> - ( DO_DI: "net.FLASH_SDI", D1_DO: "net.FLASH_SDO", }} + layer="bottom" /> - ( capacitance="22pF" schX={-9} schY={5} - pcbX={-7} - pcbY={18} - pcbRotation={0} + pcbX={-8.75} + pcbY={3.72} + pcbRotation={180.0} connections={{ pin2: "net.GND" }} /> ( capacitance="22pF" schX={-11} schY={5} - pcbX={-3} - pcbY={18} - pcbRotation={0} + pcbX={-9.61} + pcbY={-3.93} + pcbRotation={270.0} connections={{ pin2: "net.GND" }} /> - ( capacitance="15pF" schX={-4} schY={5} - pcbX={3} - pcbY={23} - pcbRotation={0} + pcbX={-8.76} + pcbY={4.73} + pcbRotation={180.0} connections={{ pin2: "net.GND" }} /> ( capacitance="15pF" schX={-2} schY={5} - pcbX={7} - pcbY={23} - pcbRotation={0} + pcbX={-8.76} + pcbY={8.455} + pcbRotation={180.0} connections={{ pin2: "net.GND" }} /> - ( capacitance="2.2uF" schX={-7} schY={0} - pcbX={10} - pcbY={-5} - pcbRotation={0} + pcbX={9.25} + pcbY={3.83} + pcbRotation={0.0} connections={{ pin2: "net.GND" }} /> - ( resistance="22" schX={7} schY={0} - pcbX={15} - pcbY={8} - pcbRotation={0} - connections={{ pin1: "U1.pin45", pin2: "net.DN" }} + pcbX={9.25} + pcbY={2.91} + pcbRotation={180.0} + connections={{ pin1: "U1.pin45" }} /> - ( footprint="0402" schX={15} schY={5} - pcbX={10} - pcbY={-20} - pcbRotation={0} + pcbX={7.65} + pcbY={6.22} + pcbRotation={0.0} connections={{ pin1: "net.BOOT0", pin2: "net.GND" }} + layer="bottom" /> - ( capacitance="100nF" schX={15} schY={-7} - pcbX={-5} - pcbY={-15} - pcbRotation={0} + pcbX={-8.61} + pcbY={-3.94} + pcbRotation={270.0} connections={{ pin1: "U1.pin7", pin2: "net.GND" }} /> - ( footprint="0402" schX={-15} schY={-15} - pcbX={33} - pcbY={-25} - pcbRotation={0} + pcbX={8.93} + pcbY={6.75} + pcbRotation={180.0} connections={{ pin1: "net.STAT", pin2: sel.D5.pin1 }} /> - ( footprint="0402" schX={3} schY={-13} - pcbX={28} - pcbY={25} - pcbRotation={0} + pcbX={-2.93} + pcbY={-3.1} + pcbRotation={180.0} connections={{ pin1: "U2.pin1", pin2: "net.V3_3" }} + layer="bottom" + /> + + `pin${n}`), + }, + }} + footprint={ + + {topPinsRight.map((n, i) => ( + + ))} + + } + connections={{ + pin1: "net.GND", + pin2: "net.V3_3", + pin3: "net.DP", + pin4: "net.NC_T04", + pin5: "net.DN", + pin6: "net.RESET", + pin7: "net.GND", + pin8: "net.HOST_ID", + pin9: "net.NC_T09", + pin10: "net.D0", + pin11: "net.BOOT_N", + pin12: "net.I2C_SDA", + }} + pcbX={3.75} + pcbY={-9.5} + pcbRotation={0} + /> + + `pin${n}`), + }, + }} + footprint={ + + {topPinsLeft.map((n, i) => ( + + ))} + + } + connections={{ + pin13: "net.NC_T13", + pin14: "net.I2C_SCL", + pin15: "net.NC_T15", + pin16: "net.INT_N", + pin17: "net.TX1", + pin18: "net.D1", + pin19: "net.RX1", + pin20: "net.NC_T20", + pin21: "net.SWCLK", + pin22: "net.NC_T22", + pin23: "net.SWDIO", + pin24: "net.NC_T24", + pin25: "net.NC_T25", + pin26: "net.NC_T26", + pin27: "net.NC_T27", + pin28: "net.NC_T28", + pin29: "net.NC_T29", + pin30: "net.NC_T30", + pin31: "net.NC_T31", + pin32: "net.PWM0", + pin33: "net.GND", + pin34: "net.A0", + pin35: "net.HOST_DP", + pin36: "net.GND", + }} + pcbX={-14.5} + pcbY={-9.5} + pcbRotation={0} + /> + `pin${n}`), + }, + }} + footprint={ + + {bottomPinsRight.map((n, i) => ( + + ))} + + } + connections={{ + pin1: "net.HOST_DN", + pin2: "net.A1", + pin3: "net.GND", + pin4: "net.G0", + pin5: "net.CAN_RX", + pin6: "net.G1", + pin7: "net.CAN_TX", + pin8: "net.G2", + pin9: "net.GND", + pin10: "net.G3", + pin11: "net.PWM1", + pin12: "net.G4", + }} + pcbX={8.75} + pcbY={-9.25} + pcbRotation={0} + /> + + `pin${n}`), + }, + }} + footprint={ + + {bottomPinsLeft.map((n, i) => ( + + ))} + + } + connections={{ + pin13: "net.BATT_VIN", + pin14: "net.AUD_BCLK", + pin15: "net.SDA1", + pin16: "net.AUD_LRCLK", + pin17: "net.SCL1", + pin18: "net.AUD_IN", + pin19: "net.CS", + pin20: "net.AUD_OUT", + pin21: "net.SCK", + pin22: "net.NC_B22", + pin23: "net.C1P0", + pin24: "net.NC_B24", + pin25: "net.C0P1", + pin26: "net.NC_B26", + pin27: "net.HOST_VBUS", + pin28: "net.NC_B28", + pin29: "net.NC_B29", + pin30: "net.NC_B30", + pin31: "net.NC_B31", + pin32: "net.NC_B32", + pin33: "net.NC_B33", + pin34: "net.NC_B34", + pin35: "net.G6", + pin36: "net.NC_B36", + }} + pcbX={6.75} + pcbY={-9.25} + pcbRotation={0} /> @@ -411,152 +682,8 @@ const Board = () => ( - - + + ) - export default Board diff --git a/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx index 161e59bb..dfe7ef4f 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/W25Q128.tsx @@ -2,7 +2,7 @@ import React from "react" const W25Q128 = (props: any) => ( ICn} z=X`$Zg}=Dk*|#0CH>DJWr==Tnm;Mo>-(Y&}(Sne>(6n>nKn=C{hw-W{jjy;(f1h-E z>$PoKbZ1$|aX)6Yil3~5ofr03zD!or%n#s*=E^uOaEc~zye5&6IqQRgpeJRiuOvVa-Eo84n|3`xHEVUN7hsh-vPzF*)qbib z*lIH%bgT-;1HCWqPukprPUY!~IS4zxjgaV$GG4SO)hbXnDzNB9Y*C@rMOEv`-gZ>% z3T8F{E|c6QEka5Q^4ZyeNK58|wPdwt27qJk9dMv8oZZuQbr%C!BG)xT_~{a7GQEo` zTDj+scR%Cr+N@8GOc>+@V~(xv`fG#ejvPige*DAIAicHtWK11Y&@L+cyDN zTQLfr-G9fD*~d^+^iw;m=L!ZFyoCQaR)u?FcaDd4ipUmGD}3WY9{70z+W4j|#;K1+ zx(7}%PqPqH8a^67V;0?Ea?qPr{4d^Q9-g7BjEn@&^#xpn3P(rvSL7cDh$&R#f+eKl zQ4!jup^Ln_z9*u*L8HiiY?}d>wutxljb5sIj zTrpLvsAx6^TBJ3jR%)~ev*Kecfe=`QJ;L&m?EIq3=dOdRF_CDn9z$b@tk%FY#DA7K zdo#h_6*p&d3`x+*^%L=QsN+`mCFnX;TBS28UI(LW`*it%wGS<2g>m6vYUq4*t_;7}kqbfMrvkuqS{} zt?ONxQu@Y=&Jqn6mMwGL50){2WkN@C(v$M&eQdEU%?^*}G~kwjn*fb&$ELM9?_jxB zCj>Un$5_(vO@PD6)mTV0dplYiENkTl(2m(4M%Z7^Nl%9L44xGW9U-Qi85looMT}Ky z(x1{fbB6vkt?gPu3CY%Gm|yYXWz3kE`^BR-N!E8TWJsiL&Y>)m+*J4#mq(b_!5nRe z@6FHe%0#Ro=huHU1|~^aO<$ER)o9YsJB=-js9v!}l~=KpwnM%xvPC~Yt`D<;%SaO* z(q4T?93<8RB0ya41nPJc9x5kSNo%F@rsII!h>C_=iI0r+VLfoS6i zfkTg;W(ORy)`2YzV2fi@tRLd}1}ywdAoSEhUkc8`TZN%cI=P)YbnX^Y<$;sdOIbCZ z0)8IzLZNjw8KR%a<4x=0xB93(1FYIi&cEQ;lp+7eqhPQNB$5nSFqqM?X=M89+DnyP zKC?oi;%A!lUDA=YG00l}QZRBi2y`Pl8|6{rt1h2+qN3um@Mz}hqxay^weV<{+zH+- z=LxP%gH`1G;}ArAXU-_D+1d(X=a~%o$tILmt_@-4xxvZR>;_rQm3=6y81p73m*F8KJS{(uSI)0($rU>{xg9Awa{zKa|z!XnYs3aI@Y9{5hN|ED$X*_r%xeNy35~8lyzApT$7GKLQ9Uqk|$+cnQ~Hj zwus9DYsBHyUH?E%io)uJOQ7lP_CP*EAfxB2Pve!D42loA(lQQYaDk=k!AiM4ls9_| zfQhPX6f0j-j|*Nq1yu4FV)GF>J}Q{eLbw=;WIHB!Q=G9q^`69}sznj&lVa z=NC6*Vh}C>6gyB=#T;5=I=ji4N$kYh==WxoX z)4=6$IM28dl7q5`P%?mg267E$9sY4udQAmr(31lcl&Ika9aKLRV8Ba2vYrN+GOm}( zq(P8=;~LMg)S~x^eE_a!hMMh@Ay^wzEWYL$BPO!O;LbvmTyDZMUQ9V-*^}vgbfM(J z+)2iO+J!2qt)i_Z{giVFZ5z)?;SG?(2xSNlf6{?fpB12(ye1FnxAQEqC_651+HT-dY^Fi>YLSuJ`4G31Zqu=zn@QL{y4k2Z#1 zGT_Gx5z`-c#t$9z`~lZaV`Mz+kj8ufmSZ8S#gqf!Hxg0h)uRpNU}QkT>!YB!Ybrz> zUE9-nwsaLBUOa%cc8Q2S+yiw71El(3?0^kTD6bzS1NidtWCAbE)^17jebH%~)BCy)+N&VwHDw8J7%{0#7W>%e#sne07_ z3T_~;!FJoV_Cx68gido}5xJ`!5mA5+Q)Y;6h42 zgbG$~I5bpfT@S_AWH!0j!h**{aW_$QPQ-k>iSp#;X^OC9Xn`*)4mfljC)KC%#gGVu z1}Km8)1PLhjS4lM2Cu7DlD&)R4lQP;5z^hccP7sm=h}-QB6RG zTmTatvZCHLt%JPq6CY@d?jn|{HB9e=s7qOpsk?)XncMH zq#Xb?-vUlV1$CCVW{w@8-KYj{7Y>ZeImM6|&%lvX*&vtE!rS@|rP`!=q^>Zt(sy)y z$P76q3D)0$s)&;i@CG@ye9Q2G;tPuTk%k4q1#R}I5CJk9N826%H<<{D!WfGjQB2in zM$9mTO}6SrS&E5@YXOUFr-o9$3qL0go53%Ms53k3pdO&ZS;W6^ve>KKxGz=Q`t+;swl1L46#Kw^(* zYd$#HU^|FR=~<#p0&*K0#&*yB{g?@t5)h7B5aj!bDO_8Cy8FQ$aEL5gSEkq+@{hyd zEP*hX00;`Bvpsl+uiMa(-w)L|AVv^_k_tM5#$F`OZ5>NKN>e_(ocMIT#x!lo<9%^1aRB=>Bk{ z!q3ZF52E*S;Jw&tmwn*noI0|YDwaRsy_nl^d4juwm0+_>UZZeT$HqIww)a08qaT&V z;pg%fF-70r)%X>PLeF>5P98vJ^IsI$jy7~{>Jq0Srer?D>^~x91(o%k zH|II|?>`-nRdrO!@#$N(Ca7kgYDRE;VD)FP6sHUw?P ztvBbBpzKG+7Q!EM&>0cDm+BF@Q;=fZgn$)?Oe_`*&)&tNDyt|i@6tIjmd$~PP!bLc zN+1ZL=;5{KVW=tod^ltIVH9GS&u;8P^8zH^Yd|Su<+SKytIvzIsFP4M>ZmvAONg@s zd%t>`(qL2`26=&`QzK+|Q3;Lw9!PTd?Ck-NWB;UMVRnM4RGMg_>l zyPy(n-5IPD>x*zcOM=oj8y&6eso>^O_6#LJPQc&Gp0=PDV@JaQU{xVh&mF2Cja?vW zZDd)!z0!7}6_mifC=?%O-}T42?1DOo$OY?|IMUK26lZGucO?$U|H7gq2sk}{sHThz ze?`GQF6!VG*B4zdgMaM|T|giS#aiX(E2?{WM)rGU%P!qpn!49_sW7wX=)ipiNdDuGqCFStFkm|n2m&_$uGd_$VS-Ay8vJdp=62q5^N3dTkG=6fW zP$T+0g_t~p`XRc6QsPgR_NqeP#hmCuQ`}TEpwXcSzrg$)z_2Jh@X0F(t+di{U)ksi!mP}aQ)AVNjh>1S5t&dSLXq1JGXU^e+o-_x2Wh%*!PKavPxfhm(P8OjjHb7M zea?2*G>a#`j#Q3+C@xwWxV~FjrX_3Z(+vyvBJP=&R$e)(liK=5J-EiavEE+tbm0dE z2&IHNsm#vNVf90Y4&^_7{4h9p>%IH;N6;U|U<}rDy={qyhO&a$ARyX+FuUsWqT@li z(-S9tm8wrCyDsUvKz!OyJ<9Erym}+az0dvqbt_$_%RSxgrt{?<58ZZN*!uej_mP^b zJ{qZscSoELv)rzUy#r^!j==}Qqxcv$ze@oQHg~>yH6t3%t`23S6I7+s$V+=+nPm^e z+=8W|OOv*476-Y$h;{KzU;pDM2FcT!tjNC-$B)ygsi{{ZW;|vWzoQlG z>;a*f>Y4nxrktj+veL{s)9%hUQ~MgqsTo zhW!GHwLgbUlnLedu4S|+&`{-`q4zPl{LJlbbP~d>`z+-Lqdq|FyD*r+?J7#IYOE^D z`BdsYVLfxt*!b;rcioxtl3Z|VYypLZS<&D?m&3ce+O8b!D53U~cPTaoA?MG8mGED1 zS}HKr^!oH2Y|qX}Bq}Wth_2G_(qmYdZW7vPWZhBc@w+j$H<=fM3(?x~9XHKyLAU zh(>V!ZInop1;IofE9yrfZ@Usc6niYCtWb~wKzYu{6!HHrQ(ROa@Wnth2d$Sy^X!=m z7cQJPH-zHKt?PB%YZ}KuKe24FGOzJKgf+~ z0EOJdiz^-mRwHbX3KXsYb0!bhpX*3|oe+wDu(%_D2ecD4Y^v{zlH>9i-;^&jFX=2T zwtD0ip%i5ZiOvP9^2jhsQ-_LG&5Ab#QlS@Qoo$t}Z2_n$7{Z4k zBENzN5UBmr3O%+WpWNQFaQsgQ2F)lCsA?l62FijMx8q(#m**`g{m39qU&%vGV*deR z`xlS~d*pV^0P$5RhC~GE$VKww(XXSvI-J&Gr<-AiwmihuPLEyfh#)d|=tx;!t4Vnq1L-AKCQ( zZXDxjaQAZ*(7uH?ekAUF)m7-~veYnl7_#ME7D{pqZ~HfJ&Y;4dWM5Z%Z8bi>$_&LgMN4Y7BFmOel7_v{u(R)y7X#zDQ6T_1v-tZ-n;t0c<GE!|_4=6fhgJ?~JYAHr&gmHm z%|A{It)WL3kuk)QBlIi8|IxQ(dc14s@`*%h+ zX-6iZRqUaX ziMgT+OT%S9?~kS5g2?U?M!lMzGCRi>SpS? zzgj(}Q(I11BUgN1^eEi3l)H41J}}|67@Cr88FtY2$jfb@I7`TMTo7wciO@~(sKDr` zy_bzup%m=4IiaYP_C6;e1?=Nci9foiFmbUgb@@f)Wk$t^qazD-c{^`RpDN}5x0M;t zz!b3IR^CQd!kl1a1I5a8)M#9r{I#RBaQ437=zPy^^-MKO{s6h$mbnNk;rWr&tNK^t z+Iqf@KA`}41}I|l4;tYRgiMi@S!wWwfL8+cJa{Z(18Hjms<+r$r;NWoYS3 zS|pk-Q?y~Q>Ck@WA!~>C;o=vZ@2kde^Sy|_g~;~t04o|qVCl5RTOrO z7iEb0*DP>D?tgI`cKJ6}LTFaU7>f1Tfe5Vic`3{)w9#zXRG(S!<#lfMj$vq zdk!vov=a;jBm_c{XR5hx%e-;FJ2AZM%zsC6OgTDQJvKlnWyQ7BzlC?r>KJwG*mG*LN^R z)vx{pP5zIa%J)fj0u5q}!Nx#&aD$CR+rS=n+KqM^L_1ZC4aBu`UNp1*4dion- z9`gd5Lg^Sc=^sQ8Y_Or?8w0Hnki_tck~h?I`{OY!%45DZRH4qu0+{YW^M9v5uHeG^ zwI-4fAXH7rq(@s|{}T{b;(CS^`&UI0deY zIz()#uK282FQx+bgWnEFS(T!d1^#*J*}1wS8XaWceCjE&`d5##(A|Ja{(7S-k0qIf zhP3rV$XVwT;_`G9Rda56>i+uCbzS=Ex06ga<|E>j#XV6#JlO2mboCzcF^BEioNvR$ zb60=#K8&rW3|8Pvh*Ax-JxP4c!E3+A%l1fLN$Z^bQnmNx-lhH_t*yP|*vROt1Jsq9 z_{LgYXQscrknehV+hcMn%@-RH@yEvHnWTbuqE3Pv;>(J2zwcdCyS?XVoBH)1pSC5i zRALyyRky(zV0vZ!vYmO8eev^0GuW|!afQ2U2~@%E2cA@>PK?{m`^mH>ZrmoWy7&4o zuQXq*^zFTb8e*U1X*kGl)5TXFi4z_}{|s7=n&!?d_4Uf^&0MomB8)?sY^M#JRlT6D zcNp2_gp4Y=_OqP{fzX7og0+Pfe{sv)wjtoz`hkX&m8=bwY9Aa`e6cEi_>GqzdV26v zUT)dz=gQmmj99K3BqZRSY|Ke!SB){Q@f#W#djWgP~ck3-ojnEWtm}w>p4C=NUkP?}30={nFHc%z2Z)=SHaR zxx>MTpAxru(6-Ye{V>@-lr`$;`n=dPE-xn&T&kmBcs_FP;z;V@-}6kd$;iMVL=pWt zpooIFHw26)1ZTaJEz7u|YjiPH#RMvpeUxT14=(8xXUn{v@R*r#-W7j++NW&k-p1dH zu6tl_k44*sM@w@H<%@ScBz69RR%BtzgF6PIn$=NB>(T_)F%2J&$_iS*0(9_XHs|70+ZAG><2n_L;yf^%POzV77`R_@) zf)Bs{T3B@T(6pOG0M7NeJwR+icE(0G$1fT57#nuFc6LlZky%V^Tr^#3lwr+eU*=aP zV1+D=MUw{HQvPU|eyg&k(7`}vHt`Y7gXHgI;uB#a=`Vaht#*ai19Q~hy1qi!&y+!8#aYr2?y z+0f&`((m{M)y9UQW{>QNob1tJ+tFB`{|$-;L>rjtWHc;KMHm=O!6uAy83O#l%T9|e zK(Jz#G``0oLKY&za{xHb;e=>sISCUS`lxEt>$8RLFE0FZW2v}2^~3M^+1%-_0+;Kq z7mcTW)Oh5-TN*8&^)nZLN$H**yu&BjNyTEUH2A2}=T*2EnnnYseFYS+mg-FbAGaJ zNv8_fyHnhUrt6E)qtsH)w{7FrJX`s%F{^I8%Pbn>JA3Qmp}TIiUw4Yg-RMw{t`E`v zYH>+$#Ku*zsPfZE??vg`f9FP9XdfAN++O!UQ{;>2X);qx)YXFi<8-3(3JNWC?zd;| zi;0MmsY%c4t@8% z+i812aIE=@fl#&gBjV?|jk~#+e=r{yq#}E*uKmJYvm=I?=zBc2Ka`9=MiYTA-0w`L zrlTX-b-QcWxVlEWSrO5LYWHXEN2FbBW0j++%g;9Py4*5w$KthBTFgPA+>!S1eU{iu zn%(Yep4)k zhmve|iTllau|5$36kERBUiuZg&j+)*RETWyjF&p(J(=j@D15Lp)|XIm(HEjicDIsS;pnUc2pUjUsX;j*b1vm3JbTeA(@G z__CYrbYv|qF6Kwxq9sM;eSE=AHT0sP=ED8w)$Q$prF>+! zHdl!GO}1kS3WHV2s?pD!hqpK1m+n(HDY^23;}!+6S%zgZPFg+pl4or3ioX5ss8eue zCKD-nWzCSj|G8$(A8WcCG$}bt_sT(ywPu}c1;;WN-8_E$xYsQiaWE>vAB&!w-1v1qRlfeEgBtBRpvwG~o1Sc&{QGv!-jNKU;N{5=fr2?YWWQf+&j&10 zs`ulOqSo@W+iCIJ?Hoyp$xN6Drk3Dt{oYdLls+)Pf4+3%!M%BIgDkqb2OYKR9w2gO zsy3*-hnEF&je5IWb)LC6mCk>Aqv00`+p=v!r)OHXMwXVgMtIWJfprJsf2a~fTH;eJ zr`pE@v~G<$xw1!wMKUO{W&OdunYpOM@gJ`hxK(cR1cdfjfGL4V=&j?9{w46rd?EyTP(^Rpzz?XxCVCZvMjD>brnJ4PLmROs%d zEIpg&_Ve$a)R=>hz_&>kC!~h})+;mj7&KOyyt3^6|FLYxeQEbXK4N^~}C z+dJlb{2?Y!A~V~OI1+f|ZbX1$9)CJO%ltwo_l5O^32Cb@llAMl1aPvmo<>>35;WD~pPBoL zIMvJRKvk>jDACCrh-6CS<{x}F0%E#>8@jJs`KYLFxQ;vN8y5ygIu1veSTRV|Bp>j7 z-5LkheWnaG!W7cmYcG@jErv0j^p)9|M$yh^MOVWT!NO%PBO~9f!1^Me_e}xbKRNYJ6TH^#Ka0pRBOYo^r@RY}**ZF#OkqvOl7m_^AdQO%qby-Ty{F_Fd5~ml zWL#SNjMM9H&@a$Y(XEA-a-#SC{eC#~9Gqp{8i)lytw4D?dFAQ%l|l+B7+=r5$~d>O2C2pu#+q4LLgWiaP(I@2~||2#cOWnAG}cLBrY$jz^F>E$RAr! zAg+;tw6d+AmJ|v}T|#BUb;x6o(?PH9w}SxGBLR4#hk>Lp*obIA3jKoy0O_i{<*(>E zeIO-LUu~!8x;}yjQyfwT7B#X^01>Ci;!W|5pgVfT23*0Hx{MCWT+44|e+BZlX{~~S z#rJix$7t6{V@xTi$5f>?il(U(g59R{PxyF$E51?vA-v|?_z#McQH8@W=UZni- z#0BgL>%yl`eUnsa!gy`Djazb1K5c^hOLr^5pC>?%6G;-0%deLH;xr3&L4=?+q)?=U z7!Vxt_!3XxENMva$){l*NRr1Xg^ds<8deZL{w3S7TT8DP`e&yvJF;BVm!r2V3{ zJP*L#b0$e(NfB`88Kh!W2L4!hBK}Mk@dU&$+1lC$B_J3-*0PJ3<62R2d;{7HWK;{$ zVnYnjf+H7lA5Q?SR4^-tQv$4t>M5vv?OCR6>cZ9#eWAuM!5%Cl` zvj?N)4ho@ia!f43F%~0jjBs2otC^v?fU^3@7gREK^HXvn*Qfc}DOO!1jn5Gy zilEe6DGz}kB9&y?FjKU%J+^6IKDgfjB~Owe=G>;Et19gPKRUDp>KdRi@Bvbg0}2o&j1t^X zmD=TjQ!F6D=-*=H<8lXuOamDLBb88^VMhImf81%zI7~QIf{`+Wul>W3JS%xl4AM9* z!%i$KG7RYxlVJ{S1`3|JS=rg&4Om zu#!2c{a1r0f>K_@Obs(yDb|Ww3Ojv||Lmt# zApuSgFSl5>P+9^`6fwRSJbkpN$e%32){KdAUG$g zq3D=XKbU?T|G4=1^3Y<-f=KuQL}kubt2$MyvZ7O>2UnzdA4QrKs>gmZ6&@)pf7bQ9 z+_^j`NscCr8uzzS*s_^!NDi4%C+@Fy!nS-M^mHwII6IUcA7JSf6q`}_%VXiMVm(%9 zgdTi;c|)J7g2-p9=o_`K3j=#T3t^A5UA*xlA~l5iR>CF_3zbZMT~-lSM}Lc2V6+(y z_c4}LxFb5=+dc2N(ZKG6alxW?waA1_hu3DImsi+ChqGz&a<}{9l*eN8I$2Nupz(hl zll&2(To(f!RGn_g{ee8%t)WQSXi`vJ~lGXp4wqXnQTrlrGicb;j|i zl@3h_@6c-PCcCHV1DOu)TyFpA{<{q1LJ(5UwX{%Pl-0X8^Fbe70y!TC(i%s~J)+<}0SspryMYr1o$raQysM`H@ zoEifWF5@4I)53l5V$qOC>7U`>&v~EABWvyb&rBdC(F`N`I&S7Mg45 zBTzEh06v&{Nf{I>^q=o`@9%f?uhoU@9t7%-r%Ixk`-GHyw65ScEa`=!0U9}W=6=2? z%od@-=yu2U(u2LW;#H6}Fc9}NKWfIHTckOK6b|Bo958dA9|XBS6MN|d4V_dQesGvs zQ0nhWm?8M05eN^;8(Ku)+I+W(Iu11PqWjjpFEv_Tp&KvIq;f1?Lvw!;8uF*m$5J*6 z$wWE59`ImU?iSy!ALbYouV0xNH_v( z!OO~EWD8ykOcwpiO6UxopfOC)mcy?b9DK&kWuYpT>*0SL+)t!Ofg zycOp?vu8rO^-*!LDhmqNQ>bCe0*2J$^_Mk;OUN#XaMJ?o)TWiGaxtQ?N# zfPhJ8bO2OB_V9Vk*K}fAu=>sHVZKLV55J6^K~UM-KW@43y#!N&=Pg=ru%vXhixXS;U}Qb?h9elt%O=g{fzCmZPy(9cAe% zq-hXWY9S>fqz8cBxPFRu#)6_K`dz3 z)t*Bl1qsW-n6(B^dt|B!X{_?8p4hi2OGC$;2}AXZfB2jalOj~M1|TJo6qRSZJ+p@- z2;#+f?4@o$ZP?>?xX#k#teHUMytq6whI z1`J54Y2M?af{1`tz@y(9QKFi}9DWflApQnIgv-*Ev-|l6bwNn*fpg#CZy`_NT2q~l zoYh1Qy)fCmZ|W72vJ@C2okYN=*M2YBM91s}Wh0t}fQSFR8z)jUw3`6zb_3|z3bR%& zp3f(x6fDjy4kf98_^%3jJ_VB}FWj3;-gk8=qEI45p^EcVM4u2OVlG_FP(h6!Cx3Z^ zOWp3A(#XXY+X0w$iX~b!bR;CosFcMNNr(ysoCA!6B4+leaKn?@Nbl6ngh@hta(NM;};EYi3U!ji`LTSjkL@Hj2%8 zj*!Sc9xz@Bj7N1a-W5%yP+*-MELDC|gJ8vH#xMa0OUEy8H1;j4%~aO%(|x6o%IJy`@^cwVo3nv7n61w!^u!CEZJ6K;H(RYzU!D210 z8Cp0!^3$O-4?-z~BrqZUBnDCm>9M~#1eYkta|tE$AJ2rf^$0{?vhU0u{R=2dPad9- z&c%APbk-U=c8(p7p!IEoS5z>4t-VQkLoIq{PZ;WfNl*OELG?uo@aI@px&wY>!uqqs zTIVYhbZ+-hh+mm-OGYg{c|bB}6CF0}@mdaTwm=97^EENdBKqC#3L)o+wV#2cr)Y)4 zSvf?Q;Bbr0-KO}6@CoWF8DUls@u`%X@3O0FSe-DORR03fxIwuPEd~GDbqgkwL(U%G zJNZ#~qB8~|i?vA1Pb7g=*Xr3hoKo*O>(hg?9}~#bQqmLBu&+ivc+cW720)O1*uc&+ z-u`N@af)!f1EcEPCg_-%MCG3}xZft{f@!W4VN^t_PE|<`eS@BmK-X0lV7h#Ar!UA8 zDiuhoK$^gQbhTwJ3pZ2OU^}ilcxp>k=tF1^prWNAQCWE&l-dk5=tVsTv>Y6n01(`7 zRlL4^W3ufr8&tF*gQeV~=+v_?4-Yr#cBg?As!m7o(Ma9%-*JRWQsXlXhsgR>8RWFZ zKt_Xz+-2pfT8p({p;c}Z`s?6c>DZt$x>fQ_f@@8$N}+!BOCAozPIG}D?#-#rG}P8z zdwFX>G98>onP{ovOPV34!D%M%mdrr)0Zu;t6CH%v_+>hfzwJCsw*;4&uZ%GQE+BIO zBGN_(UoU*KXV5x!qC(Q9iD2r;;_I(g*DSaY`p}N4T#*GA2(9@q+?u%d!PS*XB^vG6TRQYWh?+SS z?P$v2U?Zi#>4FEJTlBIdq@vjZ)l0J8I=FOwH?!2ci$-NPqzHM`R+zbZ7-I+Fxl1f=_@0S8w3dv{!uV zX8*HrDTQ_E71M4;1?0P923IEZ>0uyqDE@2Q=(Q(KIZl=f(Uu{fmb*bt7i`>NakONH z74Byv><8-ah*S)AO1zu@%{63lzwgLUnY{aJBK!51Z||*V?fXGzzmbj<_DA2enbMVY z99D_e{CQt%Sp3T5i-^hK+jh=+v{+v`MRsq_vuf4@J46CBFE_d5WGy`*3nRHGqfBi! zs^B-YY@0$`-F|*$#vz!S^g7tpo@+etpfT6($?UXxQ|VD|XNLdf8SIKlY3l1cQ4_FO zwYlw76atu(F^K7>wdlR3qzG z2yb=;;XoJoh0RMe=>8mi0)w~R`lFo2z6VM-)O_#v;vU$wx97_vHXtX0;4ECqVkQ;- zKhftNWhxRXL7Dc*(h6Ogi5`!Zdg&D})BB=%?<2R%5y-C5L*-?4@kWa~7Jrm4@{*?L zc0eerRbruBy*iAkb%5mH9zOxm9JBFWl4^2i?_xtu(C501n)MQYm%TCj2V;ubU5IM< z+$7?EjcV+&GPFt><}6(h9 z?P`PkZ$Sw`D#W@wR^^rE(+lUccH@cG$7jhw)|1_N$3d1`4r}(f24PZJfJ$35A(KTD zvU5<&r9uvSHeTv_+arG7oyKW)-m?E!)7lV~*-g*9{K@~U#_=Q4HYNmg%;ckq^SRe7%Q~Bg9*wysB6bx1u~TghL~f2q460FO!{KVoW_rQT=*vF zH+-$*lWE)>)BFdfrKq;R7`P>TauViooq+qQDG)U$a{q~oBMGa39;@v1CCd#B&xO!I zLGPCo1vNpf?idWP=ta#>ce{s-cDv79x$99dmmAtwCu|MXG&iM$(#2{DG<2cFqJynY zYzTb7u67f5U|yTs?=tgsP_nV76N&r>K!(x6tWdZ*7(wyZw-cfGuy}9xfY80>!?ow3 zmzJY+19-i1^b4mkXyA$57fE7#>NW7?di5(bph5JQdNB3ldd()NXymmUQ5h&ktp0#_ zK!>nUPQPZrzJnu$qecwMOIBF*?b6cXE+`b-UaJ&QpMep2w!ZaY_?+Fr08mf|6e5~h zXLj#{Avvm7IoruWituUD1NbaT15J@=pn%7`p6LAdC|e@b&{V@S;WAK^QiSp3uy{-q zF?m?;7_nLfQnnaK^KHbVd#Mvglu)@DZUZL|v+Q=SM)uPD?&@hiqGUf)Rm_?^Y3-xt z9}~;kx*ZB#B7Wa?2jiv?72>8RIY^7L=EN#Dr@=-vLwgp(EKhNju zWNVvB5w4T^Hn?wCqX9kmbjte8vTvZ=@=J;Zw_DtrxvwHBdShm0YW(W8=)R)4PsSnI zv-xsd3TkI)==9Iyby|ZMtSAp8a(kU6wwtP!d}SBZTU^xgEh)$${+L6W$+ZdSOR!J} zLqo&9Rou8;q290-QLvy{fRAOEf5X=@YA3jdwE;V2nez)3k3AE3J`3RvNiu%^Ln4F@ zt0coWYte`4;I*?CImqExl}yp+oElfD5ci3$zHvWSDK$8^{2fg`3%QqV1GIE&C?s_N z1;iOtLP4OU$-Oz@U02tBs#PF&kb}e~vFg7>Fn~j2blcJw&>6(eLg10ChG0#;qJM21 zn#2}rv{e^S+RS_`e*z-Xoj&$-hczm#=9PX7|DaiOqhz0^I{JX+w+1-u^(#<&xz1l(b#Y9QC%1a2Fz zM7hOHa5tF`;?c*f)&VY|=oMLO-oIz5ahWJ}XHA~c-^hF$Y_o%}?}9QSoQFA$kzpNR z*po-(pe$sQgBnaMtaV~@Ac!~tzN`Rrtt(kSv3R4~`1XXOk*iEegVup~9gtp9oiHEh zMh(R!eIs~M(ntIWcLP~vttQt7py;!E46_$6KvrJl1%$|;58iNyAyU8%GixV6=n&at zwcFyFBixpwZ*bsFc=8aIOdhn@hVG{vSV;5>JK~C#(_+$ZjXzG%nfp?&$I2*Bt6-~+>j(#_$X+>vYCRW2p zh?K+=u=6(}sALLaClAuLD+4jfo9I;jfq6|8C4RC%E@|q}RiW@&(S3YqJpzErT(qZW zfCtVY&Zq8&c?u;&)GTZV*Q2wnMkY~#Y(zsBW{zKunBb0r&{RYu3g3)0b{)lGYmAUr z5IiW39 z61K*}QNMVmTiSR0#+B$QP)4ECAQ)hl55QOh-?Ipv9v0WLK-;FHJK^dIaO;x?`1OYQ zI?SANL^LTz2h^?~crtg;)JT5t1JpIPd)Gi^Lw|m$e2Ho8O5S94T%31%k_ASwenw?q z+)1n`XI#0Itoeazo#g^-W1TmpjM1+H#-sGKJ<4^JN3qv0l zl?$IQP0g_mLblt9gpa0mHmmC7KVTUl@r0Zsjp+#mZGe>lj&|${@1;+;~5HJo@-NL?0;wy4oD{ zz9Lac2d)r9=&+~@ff!+Zg?F~R5Jhvk9#iF$MSGXVZqI)2S&WgHYmn)ChI}wA3Fy?} z=nSu*3Z8A_Z4QiZI9D~|4a5JBY0JsICr3jm`LRODl&}A+%xiTzD$;H%coP=tbTQP=G@F^AtQjqEc z(DkK5$P?goVKbsq)H2YWNK2%M)n-s*n|GAWHBL-&eK`2E?%+V!aGh{22QUtu!-5}) z9}Jx~qKvTv4TQ1C(|CZA`%4oPGUstZ;PO1x11miVQpJVZ?s;31_Ucut{)55a?- z>L1WF$|?6DdDrJbg((YMSx8Rm&f7#6riQ2@6(&SY@&z>4ph}b;OlVmN z{;McAv2QNOYen9IXb4ZQx>bEjtw& z^edsuSEU~mJ7yfo#b5^+vm*-Z@Bur%&%hhzl~5zVjXmqW^9wqG53iPvhqmcM#f8dN zCE#%9($B@cjz%&I)tXZEKLaoN=FE-O{($-@EFB$LN*n54ZHS~_?tl0O-PD&L)uILs zqi!E{f$v1%MxGm80xECLS-SIKUb(!H2l>k}a&+-9X-C)=M$Vkp(Z zCa1vZgqAJipq3v*F;76J-m<*nNt1(9T&7FWrmnRg4JhZXMx_JI@5Pz&iGYa(Dy)i| z9hSIJ|Jt>D);Pqm%aq%RLwlc}zduzTw>b*X4&h4xeWN!JL?RnpU1fDuh z#lIK-jyDLlww%-XYp12yj^4O^niqO(?whMdC6-LRIAReb!Xg|U=VTGi`H3`mE}}y& z5Pr25^%UQhbU(PJM}&`6Zc~_Q=H)X^)z^B4vf6CKiT@Nm5Ua>AZdW_D)3;xPVJj{D zUo=xq8z(~D=JE>Ni0wHxFWbIdj~}{dXD2EsGY9`1fZvrNFV`#Rr`8B6$zbbW~`Rw?d)xP4$ z-jb>h@uiJyl(%1!zF&{GvMFF`K7D|pMa(jCaY!@wi|NAR+L^MFn!C|G{SOBC8u(51 z2V447KhD2U7ipi+W$q8mEkDbv&k@~inL#XFFhdXUwqi@5CVD z+Bm0v71o;AzZQQK$XM=73{p}{#%ckrXKtBUYjW&NhJFvabQE^z_ZSQbHNN7?HNAEZ z{*4Akua6U5+=X&Pjeqoaz`uw3oEZ70-v}M?U0M5A(fadT6;jIgUpi#DX^d?YzfgA$ z{0=-g_Zgf?GRUrGg9>1as&#}F?7*E@R?uWNB9kRryU=}IM73`Fxx<*rE?{z8M!QYF z&mYz*hI6vg)Bh#%)IusiOKBHc6R@fBHaou4H?F$T(6Ti0kkl728dkQtZhLP!+hrZC zNW_*+?A|dal$h0O_LHl=f9O z&0N>mM=h^WIdk3jd70Zi^6!qrRp`ulk^Jl_%Kzxo!>OHK@FdnT53#ygtkB$CXTM6N zs7XzqkgPBp&xW_*IH(HQI(J6&(oq?xT=hLN}3Lq{aRl>KX#C0$S#`c zNh{}{j(`ku3OV}ZdghuSk@q}_%%VfAO;SV^ICsCx(G8me);zU%yuU#U`yt)Fp}D^i zpn;pJLKA4q;qT&`%5*U`ty#}Qp$T){all;8t!eC za5YJ)V)V+D-M6dOz48na(DxOtKmYRhuQJUPh^+(IM|{o2Kq{$+5I3@mW^;Sr{{<`^DL7#&r;6k)(CWUE zcee<4VPU1O#M~GeFcLNx2@Lx~S=0<*q1fex0C(iV&uUUbzrJeP+v3-Ma`*I;y{Di~- ziOoDNoYPDjmSV$bx}r;KduB-9@ag1ZqW9qin#8!IKmNrT$r_g&}fe?S9}F84Mr^0oue>986dv5KDT2re{3;Focpy|4#DN`gVBdCFmlypy-4xpS zT~h5N^(G|UNGpOxVp$=tkq;E4)8?fkay^GsRPq3xH3@~2qJSh*0utO{avE57iXt~y zE(Ko1vO=gkoMMU`TxUQfAOfk`>!qRabEa_H_1?JP4@P3N2QPR-T#|6*2Zupwt}z3i zb^IGLsmGDpP?ig^hPTQ|FM!2&e-oIlq04Db$$nSAhD)| zC0Vj(#;sb)&nZOfPa~ZKIA=`OmhEqb`i`CEv5l_yM#x&S;M$-!P}>DT58O`zyytYr zGKgy-W2$Tq*$1J*+i5s1e7uAqLhEjT8T^b(8JZ{h1FCz6K}S@;*%Z!z=^UMMj=9IW zeSm|K-hie8pl1$gH7EusoVQBnKL3$0;)Z{NAX+_heS<@j@D{@(<$a}}Kd|cBKJ+2T z4a%(v+jivZyHCZJ;os<%2Veh%g$TroKLnmAu2R90!v796B{*<3?`e?{I;hM0})|EG_0jcV%5!fD}lfF02W zmzM-7Vnt;z4iXbcA|joo5L$thB7#HZQb4pc#S{o>OSwj(&Fsc6s%N;DV}E@t*2 zhgSU2wfMvNbN2rByZ8I-FKeB8-6Eb`LkuRQh=`(nnv#KfJbxhrJNv&mLp5k1c%Ctx zg!f_Ls3Jatv<|!`l5qK$e*~oI-}ajWmpZd&=LZl(Cp1k(@^fC&@ujtyZy%5Yq8c;{ z`jVVd7nyK3F#IJ)utd@J!Fnv8XnIeR$aWjB3C5FgHky9LgiwH&FGvxIMNEjRUnm|l zY*zT{;Y059JGChpZQlXUeAaT#)EKinbLBu{1k;$F^| zDSzfLcXQ)2jb-aMKS6CTldn$T@ro{NLCM&Cvm;@$x;U@JJdV``>X!7q)`yjmVOKMi z*&N|Pa+BRX_T(sz3Ykbmf(7aLY1hYi8;zTBe88|yE$zOv&&a>If^krl0O317#@1n0 zVAU8FMnJf@aUrb&{8PXGd9%1F@PAEvBZvz){_Gu@GhfZotrKbAG&FEYJ@lNV1d)~wQvwtKe_0>>_3I9_Wt5q@ zvf~c7l;=*0+%6VpDdIeA$hZ=Gqrx{qN8^!kVo{c&K@qRnqwxXrdVr$F`S-2#av134 zUa;C>px>$otqu5#$JlbUT}PqRHnAosX4vS~K(FM>A^=&cN3Qm!|D^r%@0`PFn?0rH z|LtAt6B)faf3eE$^xrri!%8zfTw&>u{-Zxey?cb)@4L^to*!TM_h)HbqO_```D7tw z1ap%i`|iUu>^SJNPN>F0$bC;~*X)~?jAERiQU9YuMHM<*f{yC^3QF=6KakBr)#{|- zlCyv{R<{4KDmmd+RsM5U-QW9D1(q@mh*Cn`6>!Mh<=4$Dkd2#`LXdH33B_Q85uEFt z9?w6BD4(f}1c?^o4veQjTLR@REx5q^Jr zTyCjzF0ekZNn}sJNXO2C;NC!%dU)vRnZ_}7d@g`=MB?SJayiQaH1q@@`r7j11ubdNc-Yi=(_He&l+MsH{3(@Bla3ZR6Fc@>@DuV0p>9Ca>@L@qSnVYmasf91EiEG5O>> z$WDq_=hrKwozh&{35c}F?R?KNjk}(r!TqZwsPSQcwIWW#gB_#wMDux;Q z)t7%GP5urBeNM-!C+LrxAMmi8gHOM6o$JEYEMKG%|0k=4m$;Op$W4Hc1h+lW)_%1h zW?K=X-WuJ8l9ZVAqlG{0Y+=Qt03@66c`FjXw(;jo;zuPk5f3YDLpxdNGV~sMy~HB6zC#2wP~L*6%rEH`&E)*Wj}F3RYVbmvhe zvQy7iQ|fANp)&)yO$q;^Uq_328N&6!n7UQ3E)BzcNPw<8*L?0TE#D|(t+4%Yf5%?R z8dYeHk&ud;z8DnLYB)7&rt9BIJr5z}q5j!ptku#1`~%j_H*Ny7`|LU)MCfA3Jne8& z-O`Pus%2u6Z?un^eR!vk8->uL?Gtv1%+=HuY*>uzBWP z{)?&YrbfX`V0xd$-ddeHp-D`}i$z2s%PU8RFSTXB3bV2YE&*u3y#=rb0(wlrCidlK z*W@GC0Rh)wM>>zYLm;b=!iBrcWLU0Wak-4>fxYVJ3ooQhfhFo+Z?c-UYU@H~64Sq( ziEibC`4@0U1`MACt?-B%21RTLU6{NQ!LC-ouB1=@UKue!D&2G|Q@AL<#H=IV6 zwlmHmi7<(zZy}YvXjkZ91QhO;R)0={AAOL!85P0}39q^=6u*!r{YFqS?bz>O1?22% z{L)1+8#QicX9q(V`NO+;lV z6v`ATA!OXY=UJbIK?Ic3UUhO=kFe~CJJ#%anFi%uQ&ExX*Oet)su*3!njYxHpYKZUs#Yg^squbb>J zv;Qt`-L%bFdft6&es#6WOA4cX5004RJ9h8#S95vs#>W}l8ek!(5N?RfU5j!KVr>Ptu4y=hg0dy>84wx2cq zxl#cCqMe$dPX3yke##gB(%!O!odf?8EBcE(Auz*eGkGFmr9XUcqRNQ&3Yur=eZX@X z2S>2$((f*_;OXlO{XDHguWo-cr&>0~Z=YqpzD1vm;l0-IhJh2;(n}8o;StuYaPj4|wZ@L<& z0rp8)hmRILbutOCQV1-`u*{cILOW|qpk;&oolaRjk{7Xv3~cHVuW{a5PUOm*ne%Cj z<)VcTIO)zWLzdGm#VedmVud#awi}_VBobdp9Ahs&Gflk0b!%bB0`fh4SWf>fj_+@; z+8?pW*YeHO@Pl$97R47Vq{G``4-oS>5wpSWLCJFUq%Tjn^<;TN(?BHok|X$`gp#c^ z9`|py;~m8Bc<`Z&t>y6H5pP8X%KirRl=kMWvWSeea0&k|Ct?#BNIs+=KszkO4H9B` zGu}um(VJ1PGUf-%d=zl~9Z=wMP198s6wC(gM@bkixCte^{R9QL)3V|;x5pB)y(L|0 zdC6~(!?GlJIofZRHe$TMMY~$O#%U`ZjPM(+Q5LdR>nIw57J^HpH(g%+0CZTcca*mx z4RlxzI@F}04pY(oS#mz50r{p2;Sv_b;TFe1*Cd-_=3^db z;Ia6Zr3{&Uf84nFX-kNx=n6`%^5C_gZ_y_QFzM@N_Qb1M_1!S3t>}XAiNJ%1Ec!T-@MR8-ce|cRLI{1AY>!hF|9eD zY*ggB!98?SkwxjT0J{8vH364LUTKGm*SNr5YqcJs_$481l+-pd@MI}}@A4*R9emRK z6+#rBRHB}whpZq^O4Ctz``0Jw?v|nl&vVe8au=Va1Z)EVH-Sq)z#tH?RUOQkA0XWz z#W!Q#-UH{tR%!O^2ghzgEJE}M?hQXF*8`voUTO~}yCn*n8%W{i_P)VS4b$6-0>Q)I zfs=}2g;xZQ7=q4)s8CoDY+ic#!QYzN8w#}dp_nDa`b41>T3+A=X*Cqn#WL4I(Ov|_ zbd(BNg+|H%Cn({E^k#bS3h>6RT_|Q4+K6`!h*=uQT^x-H8G!^o2sWdhCZf>l>o1}| zeUXPJeMa_uoGWN4TcBN!t}CZ@cYzPo?z9KsJ~~KQlz1+6ovQWT0L~ZiOg}u_jG*cl zA9QIh0YA&zaa+)u-@n|=&ELl%sDTJk((6YCD}fJQyn{eo+B26HUggYsi25oOXa`d} zqTgy;(Z4AQxffg{nb5pq(HBiGx4_$pzX*;)rZ`&!H$Z|CRgWV&RTPzx|0K$GLiU6rbKx)wo8tRrJMCvObwXezU zfUsh+6KsjDL6JBis%Y{=Bw-Y(!Z$db099B8RcnLQ%mU2;V!Bl*QYDHMa-RG4Uno)< z+K;%Ux!hnrq~ZhUkw{~}fO`58!G8`E`v{sLn31>4!bjx&AfFU#ppAAC8^xL@=%N8I z+@#O|B_S&CK|o-q1L!8S7gj1rL5jf#MRmQ6S5iWTD%*Q0Wcs+X}D| z2tqgDCD7;0M~QZspdBOUBG#6_(yoGNgpJI|LZTO_g%VVWiA>N$9YUJcr(q+|yhSt+ zJ`jmwHPm$xY}&2pS=t^c={4em&YbxGL}&7WHeah-912gOJ{PL*!7iBb626y0_>@4L zNr@LYaRRh?h|{>xj*+XRr1c2Az@cOzI<=7Wd0fba_`~CG!Hhy`Ay?Ky&bSa)B}ycL z5(&U&MU*hqX3pXT&S3!BHUxG^G@7W$NJ`otH^cDhMycsEUM+cX0oPQt^(Ukn^;ii_ z>tJDTG*6poII)volc|-wX z`ap36evp4{!BM;wk#>GIY9F>nv!f7v+D&{8K1~xZa0x3BkPb%0=AvIYZU=JT7DNkW z08$rHA4&`){2}dv&uCZCXWD(Qw3lN@!~#-#i1Z+|i;;R6DweR0DAwU0tdI_CD5CLD z=!GbBdJ!*Ln)yu4B0)DRVw|sXuPuo5U*%uh1k1lg<>QI+8Dg3pr68+32pvWT>EVNG zSh>K4ib>B%YIc;doNKC(^o)Ob*J)I~AjzDLE za`2(;)=d9hJBSgH_IxYN0!rr*od7u!dQzYqXSub-M{=PfEW`qDnou8N zZ!Q(5T}MOf5<^FtNl9-fI?=?nvZxP=S{n?7Rw1E>2_T^h_?TP9QnH|Z!Qw%Qyn*%) zsO%}Gfhbci^AGmGeH78*HegM~a2L5dF9ae;AleZlLL!n5Ld8qK0)vzV7Q$xDJP21Y zeX@{*fM)9z)ZWOiMHJc0#pv}H(4H6bd4ddjl_M*KJJKc`yoFE(&E(-j>`eu6*V|}m z8nL3~QYquk%hqhFT?x%T(>%N_0O_($UFP+uqSiM|i_HLtaa##z~q9v)J1NgwMTnyHb- zNwBX=$U*zct0LZ74-0xzQGGq%c2{_JTaMSL!giP8en(lent&(7QEj4CWy?14C4&gv zihJ(wYkAoD;l6AAkGjV-C#}|hwFARvT^`#w$|r2daQ8fW!%+G$G%7_E59K)oT?%dD zJPXsRs$gZ$VcDG-*IGnt;Tcr?p@x!Mn+#gwyufhsBj6pgNO)V$|`XXyU7xJR{>3Xdst0(Lc$=| zW^?#2C9uBmo^ZPS+;`r|4Hg%EH?$AP*^D;zE$C@*B?wXm|O+Z=ZXipD*l73$XA0xP1pK@K5Q&{ zj*Dp6f*DqKeD*%M5n*AWx@OIqt*@NJg}uWwcw3yWS;2BrUD?M3PoY?Tt?t)^&ET87 z3Rp*t5C2K6_JoA%>Q#i$dRJ<${#kqYzK3EyNJrnjd$-)--q1I`c1A$73-#oA^IU&C z{-7wa-_7kx1%CSwv{hdsp4B_-#kSwkaY1A$>PZ#-SFobv2=-Vk`1dhdBPgX85}47GH@4s3$nf z!NH-(2s$R;(hymj0$)YzwoA){R{i;&Q7-ob$VBl?-bhK_uZ`Zl8?W^boXr~`K|i}> zj#d`0jgg;)e2IZFX#R;z5^HOh_8#Q8E$&+GPPi#J*#XefEOp|<3B@-g%J1&E@A4hE z=h`vg4-sp4TY}z1a4Z@(?cR>7pFf*!+q-wKMJ&!2Xk3olUiq55#y8_x{1A!J7Y87f z0+4dP&igtb`tIjXi8io;!5-A3(ja=Vlt4sJXxzv-H9+UJM}x1e)%h^s+92R~0rpuL zIXNYEpm}A10L`v7wwp3|D3SK|?mc^MPlu;^0>ajIe zt;k!--&Y0ET=^E6gvSsFM2Z=eL_%lSQ>4|b`$Xw2mR?J+VW;Pg_)994d2ICfFzusJ z?ZwN-9WXLWfnl>;u0iS30vVE6*W=p6=Ko~)?uyN_c}i+65o(D+ND}g0pPNmC1UKnz zf_|77EVk)fq8tLx6&4GJ=r*ZkqU<$+Neh8V(xcw5fdkch4?BO$XH&6UgbPTUnOhc` zVld2OQ6`BRsReo-FiaGSn8xsHP&3@S_ogFwqzLxHXU~+jO9Y1EfK>92F(d(L7CM`VhpMgVCMy+Z(LHHm|c zj+aspKqvcaY>Y$o%!EU1cnc1PTVEfe--st6`bT zuCq8r7cOUurFomThwuwah~*t;m;_`r&WOLD)1!pfar z(!>Ed_D78q^X-1VmamBJ%Q~@WTvrQ&uF-K`5?*{vX(waFAXzxe%G*4 zS^K?X8?!q&Y-8@o?^F9XLx(!QgCGvbP z@NF)qNoXA!Sp($g_9184wWfhlK9>VnL6=@5;nRB0^Z1*lB7l$&xWql`jijugy@>5h zKAw*6#{`5{NC^yPgp~yI0NMpDKKK2c+4jdX&qwhef>M&RLZVR-pbGhi>FF=+P>sqR zZ|5tzRMvES+hp^GnC^S6# z`heIKc((KuYh4RXENZ1I2o<}of^}Uf847&E@`(&rr?NburGZ5{>sfwyw&!Y@*DBQ> zEG4lw^@qfRA)L68YYSWCt63tl(!!fhPGy}AuR>us=gI4}E9RxNwLkxi< zPxXY|XRI6f7k2_661b%VS~9}Q0NU1@QMttc2d$|@IS+!#NKlTg*aS^n;LCA)<|H8$ zPlKM#*RjhnCN*{GHNdL&0V2e<0Bte!g&?Z-cO&3*Jqf)zn471e4=Yts7)z1qZ=S2^ zR-yIM%+=?%K~}kjk-cLo+F6hVv7kAmHJC?)(w!G|+Gp1`B9tG8*m>`QF6V6^{+1aa zK0RO@Ebf7*wLM{9nmi!!a^ySaM!HS^Wuw^V7~`b>lO^s-#EnXyq6_@~7No6)uxYx6 zj-C4p&HIjJUea1EBeKy@AN$*gvajIbGRWg{$v`^S|3dF+qW7p`XgAs6{2bij64?Qq zJO_zNjM(f8u^F*0PJ4ZuR|6cR2Z(jG0<_!Fx~^!R)hP99TMrL1_p_(yC<|QStEhn{ zY5~7Z|F`6G4fpL!npoOW0G5Uh8f_zQuD&||Uqav9Us6)Sixb?0qeSM#D6{rVBFXju z?ZiJoX>F+3u2YDJgCL0-@$feEa5D|z77~gozFsUylmEAhJjVO>wHhM-WRm*U;~q-R zNkXLOmG7<)bgnKsR|B2P86FWKPm=vwlDGI413rWOz9E=Rqy(-sqg&r2emDR>&RanA zYm*-L!uS*TyBake1Wij&(?oQS0Jx_~3|A+UIAiR|i>{&nivrql^^>qV);trdPZgJx zbggAO%y7DiwydRIA;!@^(hpTjE_d+jUSPXGVw@tzlU|kMDo;oA7myL9{Ti$aT#=Oo zHhf@8WPJwpO&}6s7~W1rrmNfq;jP}f1KnB0E-1ZzJhX%fTC347w8emM_TUB**h|gT ztuKt5ZVMa>MouMP(*d7N+5{JNP@HL7xiJ!RUWlQwh?TdIU7z8urB~4vMe68i7?cG^ zeg*Y;F$ETp2~j4QvGTBk2RMp%5!oQ2yN=7Ylg!8ZiEIXB^G|MQmbFp>>xc{vyY1wh|sF z+M315%SNz~93k#OY%L=l1J@HeBhe{_2}9k|nuwtfVmLwrJfAFQy$`+$ByL-d#b)U> zXo`|JQMcQvU9N2Cv@tgE90Jn1jO45N1BsCC?T!T~)Nj6h2BQItH*sNeP zo7sRU-=g*7UZ{GHl}$T1$m0x}+t-9PF34IGB#cZgvdB2!6+=lNJwtoS6c_Zno2a&#|16P95ss*Oc}Wb-NJGEI$2Os)6yPJMpB7A z626WvXpa*DO9A-m2a=n*r6xQZrSv8g(QmK1 zy7b>GDtL;L9X6wpGo$7( z2-l*;#Bb`&VdPsluY{(~BZ({pnP6Oy6DY{FwE_Y*)QXmWO$dU>aRK9x)TeSC^3Vx+ z@bKX|DA{F{-3OKY^OP1zqED#)L{8zo#*%R zm0u>yl!qpXmG`_TS>did`tUSaXa?qff$b3dzEQektGlP1S=o3aJUkrk6M2Nl=x5z} z+~5_hrsti*$=|m`a669EeHFI=uIz;d@4jjZTRHpctM~60fs8)yWvmt*&Ks3YUOW1O zcCK=707=H`u{eNUFOE;oIkR&AQawFA(EFrbMVQ^w(f&Hc;`a>_8rshaN;46&&0+v` zDT|OiUBy`b*?*;{6El@Y$mkcpt~;FfCPSQByz~>YGjnkPTwMOl%9Rex#kDKKQl8=B z_|H9z&B6A_T@81o$jD`KxCZpMa4apm)JTv4Xz@xGaD21o>s- zYCI$qXn`{NIu&6?1jWA1@e2UQ=Z!X77JfedC7eE=wd2OGYxyUE&> z()lR6MWL{cD%mj?cC7X!J8FRN*Y#V03v>Y*iHXAMaOP$g1t-wJAJ+Esd`-?|*(k1V zZr!*MfUmO%zTRXPMO(EoH=Bc>mV~z4dT?qm&#~UwvAU1s*#m;H7K zKD9Y|9vE@vAureUH>`;fB_#ECcC=#rtKYeY+LYsI3#2NDvDF=DAbU$YyEzb!xv*9= zSu4^_%0_%8ZT-f)EFJ?voe&b;Jx4&Ijg&;Q(0+q4Gt@=)gZ<{_48D2e8>PeaM#g)Y z#6yQpx(TW#1lB(A)z<$!(rP{333&oVCm~dtgPY|X>*_fs$uK>qeQE7Vnk(6EJ*p;M z&RSzACxRiNn$Wt0J#rfBdm>J+kp52AL#meB#8*o5BdcAGZuk^%D;}dSaux`zMFf`C zTEY=2i0@DR1b)=IB&72)p17ey1kCe|n5XsaUjjP`y0TH9rMkd-!3qEdh3xLCOS6OJ zGfx#=oBS1^j`h_e7>*2e6z<`B?k|~JG~AW9{qy)1*7{LNl~vW%OBjwL4T`4@kLES_ zu}7-GX@C5S{m<9jfBMo^#{9&IXtl09hO%2IEBYd5p!hI&=Uuwc$G7zE4D}=g zEKko}6~>iW>$vC3$t=Aj_wd;>eN$lwbnPpNcDk_HJJ`&puu012LO#Dw|E6I+0asg~ zYFX-e?n{~n4j~=;q zJsaQ#b(SskQ7rbdX;8B)gPWXr>!}z1CD{c)$lcV`wICL23;DED+L|!-GB}Vo)NAIU zNZ-G%@!>n$SN;96Zda(Fpq(S}n+-E7b45PaS|_dc^O^&(yI{R z16>U^w6iZx!F%zn_axBfBEd;wlive4%=b|f>1%v3O}({1K*06u*y!-n-|zLd+OOmO z^?J?ybxSX~1HFRZTHhiZ0Us|(9_6}{BlgMR3yWv=zgk5(P*=f1x%f9 z-5MU~T7QWtfUV5ew`g2Q32o`2eNSO*8J}LdUSXo zvT*;p{p+}$Y-N@@+k%M|^eA4ybdSMQS6ln_E%SA-@}*g9d``7_V;{WxzyR|gC{TdZ zNfuCMjJTrp)YZ2E;VI;t7?5C@56rN&^TpX&5E>flt(CC5M|)z#Rgj?Z%AS1(K!R^K zgOtBg78o7+kk|Uqn=#WyxAYb)a(RZyT&HayZ>K8Qbq<=%n5rH?2Gvkdi-Y3D{%bhh})ki~@P zSbib^3sN5PMUXXa%o|)#F+{DCgqi`zrh~W9XMj=4+rHOeNbA-0ACMs)`vy7O61+Ch z;2mew7u_&&K`nK+zyF^WN$=u{k?%GtO|w+~Ocjt`2FZ;NhT6`yRFqLjP%ksyoKX1n z(#NKdpAC8CFJ4Ry188yI5)^8IX#Uu?eGZi#lU6+bdTNNgL#r}VY4 zaSDe=`V4g!u_J{wh!A17bmCZ69!udycD&~1S$=6YJr_HPidDSV_yGawh)eY zeq?^QTAA;|=JDqj|EyWFwgMp%w;u$T8v%t@7#ka_s=tmvwxOIL3r>*XT^L!2AtNW( z*w}bVXDtj*>Tl+GHS^QdpxP|@CF#Sry&Dw4pK)bmW}cnuqj{5q4*3Jo9jQSoiO``8 zmEra32`0D$Gl$Tbxu?SY_csod%N_<%V652IcV;R*?6)Jam@8yteOW6m{!8)xv;L)_ z$0-enStqfT)(THd2N|n@FDxHHl^K;(dKRL){zR7&MmTe$(BrTX<#(b^uOjUF>5s}r zMRofG?B>KaLw)4p#K>!aQ*%YWUd3Zw^;Wcoq3XwSzh`;>nzgkF21E=MUQj!d45BOuE0l6I{5Q>HF9=uwL(21!EviK;7CT|0*L+N$!GkvjXRl(LI;4 zC8aETj?B5clKbV-2GtUwm!|!&oA zgu5+J9XJkx<)cRn<2#Nh z9JEl5+X??R40lrskmB`!XREH`pbzQqXmFdnuGrBp9(-zbECm4sj%Dskz@}Buv8J#!~@Wt?z^H%ohVGparfO7VD#NG`1>fsTqwLFnC znp5M20{?V4@C)S$ciVjJi<9kx6o;Oga^>i5-ultroPmTe#Y;_c2XAC1ZR4dY-mj?G zsk>^`s_!@Ie$ebQjdzKJ&hbg9X#XYDJ9uqXJE~YEZZV&3F0<6&o$*fS-AtQ3w&{o! z^!6wQDd>vHius*M=1~1ryj?l+fYGeyKuj}BvPI%Xzi065Jw8z0RX^=AEqwvq`4%V| zDi>H&(B3Y_+RrZ2IE=NQ1?-nh_RHJ^`&q(%?~Qjta)kW?X?~{ev2+n#u?|pA_8fbd z@?i0*_2QiuvU`U*?=x^m#xUbggLgt914sF2aiu35sA745121qHs zDUr-8{b1((CIdr-F;dRhYQQNMm>;w0nESqllf4V@2T(0s?z-=IyKudG(*m!7oQ7^F z9-Mr4-~Ib;l^@y*MAe7?mAB1X=|u0(==P{Gj zX9i2b@5C&Wtn<)Oz0(+33@>V)%g8;fW`avBM-zoi%}^m#Ka)Pu1pHCgEY<=AL4tR zZ7x_nn{sTQ_h?@OY;yhcq26x#iryD_Cx5N}P~^-TTj|XSKgl)+nYT2qD2$mg7XYGO(NLFTF&lK`4hpmZ?rRy z(N`r|Yc|3G(4`!~ms#hS5cX6%uxW>u!y6H2-VFc$7MqQudCydaf2~k{sx?g^W?{J7 zcb3apA^`AoDGq|YZ|&rqAsNDc22Qn$=a}eMf))W^J_cwCdJUGC(IA#7?g*sKP2G_5OEE}4 zj8+NcVZ(o}5rR~v9sY6hm*k44Lm#{uop;S1=KT>2&s;@pvs(>VVp!hY^_s*R1!C-pAIkI@<*#;-3*{ns%(=r6hR z(|9gv?xKj33yJfFP@?+m7rhe#wF%=s%5H?XXHu};1knE;%Kn#_u)fpy{-!apu`Vty zFD0@+OC&<|mR)T5G7TB5+R+*`Cloz-C-XfMfiazbI!(9#HUaL2#xfWhjV%-Jlm`eX zkNvUe=l2uXcjCteU0|?eoxr9C7n|g`E!?9b%)BDu$tY7!jnhqXpR!zi+WOvXY;YR* zY1*T>isCHY!%w?snw{*PLAT5_?(Y2kA!B1#?%?Whw-Rm(IoX@d}Awf15yqQ&vJ|^|w+wdo<^brSukEor-hp-=o>jxD|5CI-7ER zaPx@TcVBDq68{-F(52GCtt^c++rNH2bNB9=z&9tA+hX#buFp?jcvWg9A+i!NVAzA3$bvv4FD?>JK;AdO|q*o0354OMy%iiJB|p%&T~b{Y*$$h$n~Y z%0$aJg%!uF4ROyrklmcwy znfYI8{e~vGtgK9qsFr;jDCXuwjRT6=otaRK4Y9n?sI94Ne#sCAQEA>)NELTP{k{zh z%e)|lySix@j}K%%@?`$IOT<7iHb169w^?;zPo`ccjSJ&d4tK-hn$r2m*8I=6rA ze6^DeZEp$91P1!M$p8o-odZ4|Y&YOEXdf8HFQ-AH#me^Ot9w zF82jsv@@QOkc;a_8d?V)1p2M#UAUn79r#X0fA(p>>P4a{34t+Ra!9{qlpPe0pM7j3K9ic1qBML4{*Qd zHB?$nW&ba zOVK%YZ7~l%@aIyKh1P~z1sHyvx30y-?dLCFz(-UDM%eujROtjVrHl~LU9RTJ}R83uB)Rn`$g{g14aHzG&riAUDE=~jwmE9 zg3VPqHNu8Qm4}J833i0ZBOHGpS2~($C~m78A{3S`ep4D+YU|!X-jdpI!riL_EzYdG z4q8IS&^P**mbOvj&ZKc)csd)b%Y)XP)wG6j_k`J?+2@;6DK=;y8M)@yHEiNTnCO#8 zVAC%dV+Zu9K9oQI^65SF>2|1Cu8v2~`*STWI*S#{EtctuVS#ukblrRaP$#2k zl%cn<@1UxsB=HEnqb(kMbvty^pnx1P*Ac{^gLa;qQ82)|nA!d8%LhdClnH z+xsW^SDf|1cB+<0x!LEVGIBa@?053W*g#$z6w?p}uN>|_D`frf1CM>!cj6NMBs=r^ ztb)>y?!2yWM_WsTSu0c|)?B(`&;r=K+}Ln3AI8ANz1Lu(bJ1+HW6#s>!ew|;#e28P zzTkd^S$X}_;nur`TIE3A{!H?QjzD+kzi|@V403?auEoSS-@^0)B?jjOeyG)C#QX$w z&z8KH-+6tcvnDV1^^&o^?`CF>qh_glZdQB?s&vBENa1)}TiY(6&7{ScCL0LRXRL+x zPTk>+>{mJKJwJ{{CmqQ#T@CZO_mUjQuFIY1g zi@S|bSnVP<-7-jQI`q3@`(Rp-!iqQUe{q%kl~f_-vw8Lw9o^zwbp!RphOS=m0I7pt zvnA@j^&S6ipJw;~01XFSy8zHQs5=Uc;<2%wviY62xGmNdI+gyLFS1P1*Od2uyg+!l z(dbX^cH#MI{Td{a__+yTv^^UTwKMPfrI(<+l+fQ9bs5{@s75k* z!nXKvFh!FP=ESer8*mQH`ic5VpycQTUM(K*jDkWKvYsK#La3r<>tbpk6)(mtbY&v9 zKENhw`9iR?1cfG?ctt@s_^*BGs^~TyNJlqhp754FSXix<8uT;mJfp{KY#xHDyo3Pi zjx)9OQDL&RtS>1x9`VxS1FNGHp#8lI?eDg2+iZ0o*CoEU&lJ@cSuE~8F$r_C;IVkH ze|$`oM8-rS6Jw%Bq<%XzjW{;PkA-gA6`9J}^l&~EuTrQ+U1NQax5G2f_x8H3&h6?= zf#Fg@*r%BWobS2@Jorcg|uCMjz}m-6`ree2WprH(?VJVXCoh zVPQ08xrZ%yxgaU`WZAJS=t%+FNE6%C65AxwgI4rfs4xc0Yr>)V@mV*&CY+hAeI$Sw zp)qK)3WyKv%&u%lqRBK)Gfv&1`wlKt7)Ds}aB*=#-WG=`kl{ujl0BLJVaXzz2pI&Z z<`%TOFa%PRY#0!OOdTIe6F`*i-)q2mz^F5Kq(_hS(*ei~2f8a)(=B#{ga^57`{Dqp zN@r72i<&CJ4Gi#!s+a~D^!xopxG_Pp9(oLIVx|YlKH2j#5FZsRO12!^xuGz zau}Jv(neo2mUr5FMJ?CHtk@e%hdE=?qSZ~};=d=_XnV4<2&mAaogE;bpA5lNi zzG2V)Vyrp!O+HvHgVNkIb@!SunrPxA?$653etCwfptAW2xuJo|kqd;;19aX@$_OQ6 zEJ*KUDnPN+7MRe5b`6KUTqgu}xhd**Yd+AGxPzXV*Pt-|2vZ%SJXVlc%z{8rWhev7 z+=grfjw9Wyns|%GRb)NizI6vBHL&*;h%ba$g8L z*WGShraRcJwEbBN+0af#BH>~Hzqt9#(R}Z*s2icV1~d3Nx!I<7oLV30b^yH^ZLVBAh&Dh-2BU=ZUFT!RT`$))?||J8%_W@aPen&19^<%;Qzz9kyoa;Zj*hwWNG1KI%{9fE z+u}j)1~R#XCKC=sC^J+B(`fW@OKd#fHH=*>aYD-8FE^{T20p%Tq6gW9_*?z3RfwSh zfEKX6!_?gX1*mJW3^?NK{K8$aaHyKqt{j&@G@u8lf*SXRaWf1J z)n>mCiET5`B4d#UN4c0~rqzb$1?fxI5fu8)P@R4Bz&I1g9LO||52J!GKE#UW3S_9h zR5r$!{1cd`YEVh2+^K>RM(H9jy2pXAEp+dYstl5$bmu?!{LHwDO%p0cfr?wWFYvCR z_*1%Y2i?uI1FH7p&-ikTQ+KBzf4O!PZourIe%x zF#X!O7YZ%dyU+69wsnI-;GAMPXc|IGpI44UJ_=h~LKDKm&av}`iuxIDL?S*EGmt)D z-DTDF28D5cL!Fz!uh`Akj4@mL6C=z(9xO2gsor0jHStH|P%E+m~UNK5~+ zI+dABwZ%A8Av;4ck9JS_4CQz>X(M(i+j|~iYwT{Ke=muF!->(2hP%&>{qj-yRS`E9 z_PWcPaRO@PClac&@#Mg<1rCjx7;!Ea5!L=%?YfM@;|-V6@$#i2j9C_U!r38ANzU}C z!Es()DfijFXLvw^DkDCzP~AyQXP{VgD#eL`oi4L3hPq^n%oDn+OInH&%u<2zEcXx_ z2gXQUP`KAgOa9RLE)1IZourA!EX)%`H&l^{E6+*=mT6!$V@#5>$})M+IicVtq9E2r z6th11eT!k+4?l&jq~A)v_hN8R{_lo?v?xHF+r#Qg7`v}Rf<>Y$zw!A{MZ%%SWUST> z7cro%J21K4I4qrOg4fc=zg-vWke4blif%K3=XvOBlyL^@`I?wEXQrI zWnb_!?XCN^dy3k~$v~pYAYRZX zjCc4GknEI};vh@$b``J1{5mJ9cp~TwBj~&Zb=$pr_a1oJD#y8sg2Pl`nmZ8=U^k|_ zfa7siu78gGsWxlgQO&2+p%R5Z-Gb1``~{5!%+XvvpJV^D8+mYYGywSuk5je3|2)>F z&^u+pbQco^n37~9IR3_gmTqhtj31)Dl70fKCDQELT^~lJc%V*#VgQ=OjTfb6cKVQVk(yh+Pe9UsHwmfp z$ax8?7AZM?+C;o_MidnhW~5~2U2HMm&E!MkHt?qy97I7-goX%>XT^cmUiporyQ^lK zyl9okKb#${b!wV@W0T!t~kQ}%2yjF7~$&b`5OP?C+r4Zx7X+%u|KqsNV{4~uk zNk~UkxI~)j{0YUylk%@kLkfc78C0QI=)e&=I^)@1ZZ~1MC{7k)KTnYe zcbi6eG@VMpOJE#&0p@n^JNs;@(t9H4v!6U^g!-nl3u>Et(Udi*(+}K^@+M@>5Hhr< zu=D^1urRT^$0~kPmQiN|*;63^joOBlcW3a@4=kgO+C-?MF4fS9lZgFFM#&Wi;sCSW z|4JpVNfifUbU5ETcoPzxH7n7#XVji)if{tn?XRIGJ4LErP_^11rV$24P`djNt}X zxWS<>K#m;o=u@o~c#WJ4i%8~;NJH}7pf8G8hhx4?$9}#&$2{_+O&WfU{5+P2H(g!~ z#l!T=J`)e+MIeG=56Ud}081N7`S4s8(=(ph9ElUUc&qD4;U$Q0KpxDxP2fj^2^B~4vX2bm3)Wl>RUr<`? zLFKrNHBfFL&675VG<*=bqKTq9Vt7V_1BpuzxeH)Tp>aqrXeQ17=grhOjb2Ng0^wPS zOgnWHA5}?RF<2d1JiW6Wg0%c4WG+kM0_J?5MoLM*6tk2}8TB34M-=plr}Rnd&*xTK z{=w~b#W--8fk`z5CZ?tblxj{Y+w6s$yow~Ox5jX2hjqy~n5eStbmoc)9Uv?>GQ+ak zi=uO4E>a*ua~wuB$B9g~Lu2ivgAM~QCu9za;M7NVCpkFlZ`>VZRx@Se<=$gOP zXD65u!Ewo_nX0o7K{jBqj1I8O|8fiP>Yx-!9C`mrQDj*1ugx~XxnSK&W|LK-fN?*C zGMxM_s+ts+6lwQK&$cqeY|O5k zl>Tt=#!P`|HN-#Fn^-M}KvviR_;)+N-6H`1*$rBP&sZ@0t9(kki+}XVYcdd`vQo7b zbubTYp%tsn###`XZHPGNaWx?KD3<59#=D??$5rBzeR|DwTha!<-(wbB9_OefLQ*bh~@jvyoR>y+5Ar~!f8T2)n!LLG8Css z48|ug?A|3IA@Kwnr|eM{eNik-RTET<#KgqO&F#F~lmFu=k+o1z zPlR$5oH+yf(sE(a(@7z49(CR5@mm&YsKD6{MH(4wc(&t4o$WwYK34~~8eEsLYFQ*f zT)&?hQB9z&)Cjd@>z`Ge|-} z58)tv);P`W|6w-HaBCq0KZXo!WeTUTq6VDK(1B0nVHk@ht%Wum8XY*kxak6Ou&S!R ztKTe{+_Aypc7Q4OSgpn6qFJB@wN%<6l6@az_H}_EiN4;@;^!5ShIBEF<01kqhc?2I|Ku>elBjzQ8{W)jl4Uz`zVj3NlFcG!$QgVTkMr2VBgUKc2=Mr86lT zZ<3rH?{jYno@+FO0W}VRDQ?k%#2Q#s=Y9M{;jx$N66}~%2Dd6C&ye))NVy45En%RC zRAWmcclVjaCBg4F(U99QIGus0OlPCc4c*`($uiQj?1QUpAK+XN&amD;94CV!su$F1 z#Ot0-o8oeN+LdyfhLv&F0E{XH{0{$OUgmoQGs@w&haTI}9@mk4h?k$$0q$y$k;(9K zG7>+Ale?wAo|5@=Aj~M?P<*0|5u|F{#mbSuagJ<1a=J@exQ?!NaPG&E$4HR z4jgQ)z#BX8yFSlrYIuASAfB|DmL4&jr0?29PSE#xw(@xK84Lp%!M^^u`q=Im7*$S( z!f+aRactO|(Z$5gFrEd2RYwdb99bL0yqc>L4#n++8w8JorU zkvF=LTyLPpT^s*l&7RzvsVS%+b$eWJ+=&}6V%78*?j;{oqt4yU@ZJjZ2GlO5JvSQV zd~OwC4WL+5``w=!Fk%*dgqPjO!86qbiJOR*d}W2A%i`Jm(8OfDp>iVL0>VS~NqjY- zXLT>krB=?ywtOI%BnOoz3@Z2G#Ui+}%rspuxp+T)+;ksw$eFejRGe^& zbsYG{OyD!G-951bdv1ga-{dkOY3gd>GSv#WwXl~u86->^rX1e*kj*L#hp%)H6_%o`=;;HrvZ&Gd&z}{qgp{;WaX4%F;&s zzx}8?dxA^n(W`Cwc?vm;xQxq|aINOnTW~R|Q)Yhq?N6sIF0GPmR9!cp&Z8E1_3~ru z*_VP3E!E$W-(7ocY+llKHSSsJ3&q8S5}xu$9Wb;Fv7B?m;TpY{z$P7dxaSLJ^P*=Pjnm_8}4%ZaIC>Id2ilW-~GP+AA5h)!JnV^aC=4juE%(H zyd7T1?u0*Svo@)~Jl<40M18x#hfKZ-nM)6hV%xI+;XMC{wf#VLQF_YXP8SaCYfx7* zKe>U=9&Wrp+eJM!6yBEQcjIju)G==@ay^HWlHnAr_B{MKo_2M)jIk4`!#{Jn9`I7~EFH70FQ;L2+hcse%`DHW>Jg;nA8!QnpO^z2JCn2#DjQ@JF=$<^=t6esxr>ajb*i z_POuY;5iV3#}?nJ;n(np8S>E#Z19-M$gi_reRs{!62=34oqHVX%+uaV2Elij1)KTKlv*j_A~{l*h@!#Gl9v{DEvWt*?m7hZ%Q2=>bv{MG0o7HD@4d(kDF;H z{<=P@dv5GJ`@^zu*}2cp224>b`bWb4(!f3+iE`JNs7H>O#fQCz_l}n2jrbqpv8b%t zzwWI>X`8EKT^wV?#*wvC7&Hl^Rc51Cy#9Qd^|=i_`-tgT(<-;rz3}UJj62>#$=>fp z^eetqHhbJt<5GRAfcOfc9Grv>c9WTG)Q+z#TyYUxMZdAmE(w>l7aMJ8{{??SYX@4h z(x?5%op&vwy6+L1%i)*z7}p)4LaBWur1P88&GfGSBn3CG(tOTSVqLRidDd%<)b9Fu zqYibuO}Qu3f@z^+$wAo)(?<^t97dL{SQUD4Tfq^9s&6iwna!)Y+~{!F^>D3!fhzo6 z7cO)$_QpL2w|6p^-sZ8NsjhjiIrUrV?9Dd!TnrqZ4%9w|7&%n?=%2br#{;A^P2u;X z;qM%#BX_$UEzO_O|VULEvx62T=6&Vsh>Ao@hFwgBH-Ol_$5pf@Pq3c>-C?l^p^EaVH9dH3hBj`H!P%L zwr$Af)lho=k3>fx+Y04xS^u%Y%dvCp56$(K&1f_N9QofhsSFv|=ULQi^5^y=$3AY0 zfLQZ&+_qe;y;<=0P;4c<0id98aYqo|;esl%_KJ{Bo9TGhhugw3z+lhW7n|Yl9JtL< zRRH*qg?+~Q8Dp}znIE-NpoErzGj#*bmnBTY?_U!z<=}bB@a|EH<(c}FktPK$ApEn9Y_uI01;KtRpzR~_ezoc7 zQDq9*xPCU+2{=MZzrr@UN0BQQE&-Etu-9UGBLhQ75~Rs&e#Vu(#!t1b`cZ23y24v` zU+lkb3P(g8p_Js7(gtSW-$^e10k;4;?odJV2;3N-!*s#HD;%d%ndXmf@wjI?DKgQ$ zO0OXD{Xyta5|u|CDY*gYmElibYbfmpV%tLz8;1Nt2ani!(ZFkn$NimPmKe$`==Tn_ zxCE9JP(>VvX7%_xH$Wg4X81%&z$hkvhH>2pK$+%Rj^RRL2*e1MoU zg(2Ye>Q5{W0gFp|#5%0_Z$bY7Ib{=t`iG8?0#Nio5dAa4WsOeAt-DnAsg$|Y4_8or z=*6}vz}3Q3jM$Gnf>Sm%5rcn-7xh#1Ea^3Q44F?E5K8B^_{|C6Ony1e1Bqa9uil7; zS3ry%(;=x)&_@=iO}-&|WKFqi9~ghRAJh2X!#GaGfbkWkfb?;&ZoF;X?jWhcBFaXO z+DjrNYq`d$pbgHMmYN3M=x>IrAGI)ppA=VMp}9YHg6Pu`=SRzCKlcuPlOF%5^dAXb zpo3u==XuQ93xO5KT>$ZY$7bwOP-wCGc4*0wW%@7;X-)X^$Sp|84Io+WIrbxv1m_)ie_ULQIrL&MF&P?hR-SiDju_KqcnX|MCZo%v!6LcIQtUE zsd{jPPEWl<1YkYeZXzk@ogD1Z@OhQj{f;tj=tQi~`U=_~zes7{al>wDd^Gr9kAM2- z^u$Yly}irmhm1VpJ@>hHcQ2#2H*U0!@#nFM-7GH^#%P?^;Ksa>niY&cTF*R(cjx@_ zHycrPk0Qm?*RQIMb$9+>S=Sy_Q@+P{$#jSwVrb-XoK!|0DNQ$0jz`ixSr((4mQfdT zWOU_mOjEiJii`3pTuHc5NRMk|R*!R?!AR4cRHP%y=`y6I2T4{c_w(KRw`;9V|D3aa z?cewP{d~XQ-`abhgC!+?-FTk9d@F)K^T&(v9^B5Zp2IuyJ68vI73AkvWZvv)y!j|o zkY~gFKB}i4b=5rUK9eHrQ@6eu58uVoeT6~fl}M#Y@TS6!TOshWSp85;CcW9TBl*wv zD^CgD^`C#tZt=1CRKKStrCFKJlg#Dbmq@%@P>4@qa9rzmg4;q|H^8}U$Lr+>=iQW?d&Q)5xU^dr;|^wo7Z$iNYwl20&_fJ ziOE8j<1rBtLOHV^?IH=41)*->#u3i|2CDDxO0?uhfU3$#F7a5`xA|6`Z||n^No}=_ ze-YVc$8mog7dRH_J3CjVXN3i+)(MDznw(Giw63L+KIiXUmlP}{GtebARJc|;i{+`- z#z^M~@!L@zHxx%rv)zk$JTAmz$fv$tF}E${We28&4Oj08Hqnn4#ErdOb|Vv@foB<1 zGe-@N@R?wEQx_hwzN~mE(;KQUA z&HLY|6#wjO93Bpz+WpXyYf)8IRlU!0xA`h0^sm5+IXioe|{tkzyf*sZIDeTwd1Ro_lDnK&fa)PgkH$gNKh_JEM;yiw~)A zJq`>>e3jP;D^8*I(X>ROO}!TA_Hb-p2BUYc-iPL^5&kT?!27e@{;b!|N7Qg`jE7uF zpc&M9@UmlQu#G^8P z*TXWh;+*pv+g{!04W7vx98Go&*=j@5!fADys{agMAce-~9S7H-k9qRB+*18K#6*8i zDEqkzfn>faIyy6YkhC7MPOB87Ad}bqEJ=A$D3<6T{4R!m34*xUq6SDc4q)iUN|9b~ zV^nWP$+KSw<-KnLNwQT|b~ZHvSIpMLk#h=Q`y3Yp^!J5P9sWXxd|eTmga>t- zmSMC*+uA-%jFrJ715e}{mlglkc>0p(7pvpR~DL19jo3Rb(0SL-5L& z+9+BO8stkhM(!Jgt3qzdC4;5)Q%MphXgI5|gF5mN3?)*PCi;4WOh}7dl7EVy}XlO5ma@LXK;8o){FEBMBuMUyj2Y7%Q{qThy2`~>Sw@T7 z#zFk#ArL<*qUCqZ$n8|3wZ*`REw~2N0xCU$1omLz{wF9tI-(`E3Fld?t8{ohq2$^M zF6H-^?TUv+qbbf3(k{2omYRg2fs6fdI?aW1lhSUr!Gip#T0FzJb>m~F(G6-Cr|uWI zq#6z4U?t(=fEG>b7G4)*aKcNzYl1%YQ)A945c}cVA(C5btyxX1B@l0H{^wxqC>oU2*dz1z;UKmXNb?I_Rf01YdHwzQkC!h`qryk0LqXoXll^DE3*f=Z7QcZ!pN@9qfpCH+*M~|^-Li%$7ERUW_grDGkr&EZAn!2 z8kU*d(-4#345~aw3H{&JHtGEAfyClErW>oHgi@~>Lg~KV8Udi!_PVcV zJaeB;E8*M_H$?A9tmQjPy3QMs=?Qbq!+8KN z~SrV|=tE+W@bI;-Ka@3vB(VI8J{G`vF+h zH<*;Ar2S{LQDH%>&1^Lmv|7e%CB{_bWp;h*I7%V6MGuxw6Ck+^DK-fg6I@NYD<2l_-8K>%NV zaxLKnUUrCxBwUM|IZ>IO%X*v_s5%`3WOs$YVVWi2c0YVj>;=>q&T(2BXJf3WQ$`u#!+QxPk+0D{V9njSmkRztR*`pay4m9dccGB)!K*f4Eu2N|$o+V~h~GmNp>)nA)r(Kp)uY#c;w4180}v@tc%=9tK)zc$ID zZ@dlIh}szVrkH7CYM{;Mj7^G-7_W#F3i#56LfGnL{Y?|dWRB{MS8Snxcb|pc4L@@q eY{4Y^WD)XJ$CdETiz9Fa=exjvewI9V_x}NE;X=*; diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg index bb523dc7..fc772257 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg +++ b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg @@ -1 +1 @@ -GNDV3_3USB_DNUSB_DPUSB_VINRESET_NBOOT_NSWDIOSWDCKAUD_MCLKAUD_LRCLKAUD_BCLKI2C_SCLI2C_SDAA0A1PWM0PWM1D0D1_CAM_TRIGTX1RX1G0_BUS0G1_BUS1G2_BUS2G3_BUS3G4_BUS4G5_BUS5G6_BUS6G8G10_ADC_DP_CAM_VSYNCG11SPI_SCKSPI_SDOSPI_SDISPI_CSI2C_INT_NCAN_TXCAN_RXRTC_3VU1U2C1C2C3C4C5C6R2R3R5Q1R1R4C15D5R12C20R11GNDV3_3USB_DNUSB_DPUSB_VINRESET_NBOOT_NSWDIOSWDCKAUD_MCLKAUD_LRCLKAUD_BCLKI2C_SCLI2C_SDAA0A1PWM0PWM1D0D1_CAM_TRIGTX1RX1G0_BUS0G1_BUS1G2_BUS2G3_BUS3G4_BUS4G5_BUS5G6_BUS6G8G10_ADC_DP_CAM_VSYNCG11SPI_SCKSPI_SDOSPI_SDISPI_CSI2C_INT_NCAN_TXCAN_RXRTC_3VJ2 \ No newline at end of file +U2R5Q1R1C20R11U1C1C2C3C4C5C6R2R3R4C15D5R12 \ No newline at end of file diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg index f12e7050..f8f703d4 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg +++ b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg @@ -1,4 +1,4 @@ -J12V3_36RESET_N8G1111BOOT_N43V3_EN72RTC_3V9USB_VIN5DN3DP37USBHOST_DN35USBHOST_DP43CAN_TX41CAN_RX23SWDIO21SWDCK58AUD_MCLK56AUD_OUT_CAM_MCLK52AUD_LRCLK54AUD_IN_CAM_PCLK50AUD_BCLK14I2C_SCL12I2C_SDA16I2C_INT_N53I2C_SCL151I2C_SDA149BATT_VIN_31GND60SPI_SCK1_SDIO_CLK62SPI_SDO1_SDIO_CMD64SPI_SDI1_SDIO_DATA066SDIO_DATA168SDIO_DATA270SPI_CS1_SDIO_DATA357SPI_SCK59SPI_SDO61SPI_SDI55SPI_CS34A038A132PWM047PWM110D018D1_CAM_TRIG17TX119RX113RTS115CTS122TX220RX240G0_BUS042G1_BUS144G2_BUS246G3_BUS348G4_BUS473G5_BUS571G6_BUS669G7_BUS767G865G9_ADC_DN_CAM_HSYNC63G10_ADC_DP_CAM_VSYNC7242526272829303133363945U11VBAT2PC133PC144PC155PH06PH17NRST8PC09PC110PC211PC312VSSA13VDDA14PA015PA116PA2_UART2_TX17PA3_UART2_RX18VSS119VDD120PA4_SPI1_NSS21PA5_SPI1_SCK22PA6_SPI1_MISO23PA7_SPI1_MOSI24PC425PC526PB027PB128PB2_BOOT129PB1030PB1131VCAP132VDD233PB12_I2S2_WS34PB13_I2S2_CK35PB14_I2S2_XD36PB15_I2S2_SD37PC6_I2S2_MCK38PC739PC8_SDIO_D040PC9_SDIO_D141PA842PA9_UART1_TX43PA10_UART1_RX44PA1145PA1246PA13_JTMS47VCAP248VDD349PA14_JTCK50PA15_JTDI51PC10_SDIO_D252PC11_SDIO_D353PC12_SDIO_CLK54PD2_SDIO_CMD55PB3_JTDO56PB4_JTRST57PB558PB659PB760BOOT061PB862PB963VSS264VDD4U21CS_N5DO_DI2D1_DO4GND3D2_WP6CLK7D3_HOLD8V3_312MHz / 18pFY1C122pFC222pF32.8kHz / 12.5pFY2C315pFC415pFC52.2uFC62.2uFR222ΩR322ΩR5100kΩQ11G2S3DR1100kΩR45.1kΩC15100nFblueD5R121kΩC200.1uFR11100kΩJ2_TOP_RIGHT121110987654321J2_TOP_LEFT363534333231302928272625242322212019181716151413J2_BOTTOM_RIGHT123456789101112J2_BOTTOM_LEFT131415161718192021222324252627282930313233343536GNDV3_3V3_3V3_3V3_3V3_3V3_3V3_3V3_3V3_3V3_3BOOT_NBOOT_NBOOT_NBOOT_NSWDIOSWDIOSWDIOSWCLKSWCLKSWCLKCSCSCSAUD_BCLKAUD_BCLKAUD_BCLKSCLSCLSDASDASDAINT_NINT_NINT_NGNDGNDGNDGNDGNDGNDGNDGNDGNDSCKSCKSCKC0P1C0P1C0P1C1P0C1P0C1P0A0A0A0A1A1PWM0PWM0PWM1PWM1PWM1D0D0D0D1D1D1TX1TX1TX1RX1RX1RX1G0G0G0G1G1G1G2G2G2G3G3G3G4G4G4G5G5G6G6G6HOST_VBUSHOST_VBUSHOST_VBUSFLASH_CS_NFLASH_CS_NU1_PC15/Y2_pin1/C3_pin1U1_PH0/C2_pin1U1_PH0/C2_pin1U1_PH1/C1_pin1U1_PH1/C1_pin1RESETRESETRESETBATT_VINBATT_VINU1_VCAP1/C5_pin1U1_VCAP1/C5_pin1HOST_IDHOST_IDHOST_DNHOST_DNHOST_DPHOST_DPU1_PA11/R2_pin1U1_PA11/R2_pin1U1_PA12/R3_pin1U1_PA12/R3_pin1FLASH_SDIFLASH_SDIFLASH_SDIAUD_OUTAUD_OUTAUD_INAUD_INSCL1SCL1SDA1SDA1CAN_RXCAN_RXCAN_TXCAN_TXU2_D2_WP/U2_D3_HOLDU2_D2_WP/U2_D3_HOLDDNDNBOOT0BOOT0D5_pin1/R12_pin2RESET_NG11AUD_MCLKG8U1_PH0_HSEU1_PH1_HSESTATNC_T09NC_T04DPNC_T31NC_T30NC_T29NC_T28NC_T27NC_T26NC_T25NC_T24NC_T22NC_T20NC_T15NC_T13NC_B22NC_B24NC_B26NC_B28NC_B29NC_B30NC_B31NC_B32NC_B33NC_B34NC_B36 \ No newline at end of file From fca33672826a759e0c4736dbf592fd8b1546f7a1 Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Sun, 26 Oct 2025 20:51:08 +0100 Subject: [PATCH 12/13] Refactoring: moving into built-in micromod board, moving into buil-in mosfet transistor, re-positioning components, re-mapping pins, fix Y1 footprint, add missing circuits/components,.... --- .../STM32F405RG.tsx | 272 ++- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 503 ++--- ...croMod-STM32-Processor.circuit-3d.snap.png | Bin 30103 -> 13472 bytes ...roMod-STM32-Processor.circuit-pcb.snap.svg | 2 +- ...STM32-Processor.circuit-schematic.snap.svg | 1676 +++++------------ 5 files changed, 905 insertions(+), 1548 deletions(-) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx index 360c30d0..af1eb007 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx @@ -1,9 +1,277 @@ import React from "react" +const pinsPerSide = 16 +const pitch = 0.5 +const padLength = 0.25 +const padWidth = 1.5 // <-- this is the thing you want to increase +const bodyHalfSize = 5 +const halfSpan = ((pinsPerSide - 1) / 2) * pitch + +const mm = (v: number) => `${v.toFixed(3)}mm` + +const leftPins = Array.from({ length: pinsPerSide }, (_, i) => i + 1) +const bottomPins = Array.from({ length: pinsPerSide }, (_, i) => i + 17) +const rightPins = Array.from({ length: pinsPerSide }, (_, i) => i + 33) +const topPins = Array.from({ length: pinsPerSide }, (_, i) => i + 49) + +const createLeftPads = () => + leftPins.map((pin, idx) => ( + + )) + +const createRightPads = () => + rightPins.map((pin, idx) => ( + + )) + +const createBottomPads = () => + bottomPins.map((pin, idx) => ( + + )) + +const createTopPads = () => + topPins.map((pin, idx) => ( + + )) + +export const LQFP64_WidePads = ( + + {createLeftPads()} + {createBottomPads()} + {createRightPads()} + {createTopPads()} + +) + +export const STM32F405RG = (props: any) => { + // 1. Physical pad -> logical ID(s) + // MAKE SURE these pin# keys match your actual LQFP64_WidePads pin numbering! + // + // Each array below should usually have exactly one string. + // That string is the logical ID for that pad. + // + const pinLabels = { + pin1: "VBAT", + pin2: "PC13", + pin3: "PC14", + pin4: "PC15", + pin5: "PH0", + pin6: "PH1", + pin7: "NRST", + pin8: "PC0", + pin9: "PC1", + pin10: "PC2", + pin11: "PC3", + pin12: "VSSA", + pin13: "VDDA", + pin14: "PA0", + pin15: "PA1", + pin16: "PA2_UART2_TX", + pin17: "PA3_UART2_RX", + pin18: "VSS1", + pin19: "VDD1", + pin20: "PA4_SPI1_NSS", + pin21: "PA5_SPI1_SCK", + pin22: "PA6_SPI1_MISO", + pin23: "PA7_SPI1_MOSI", + pin24: "PC4", + pin25: "PC5", + pin26: "PB0", + pin27: "PB1", + pin28: "PB2_BOOT1", + pin29: "PB10", + pin30: "PB11", + pin31: "VCAP1", + pin32: "VDD2", + pin33: "PB12_I2S2_WS", + pin34: "PB13_I2S2_CK", + pin35: "PB14_I2S2_XD", + pin36: "PB15_I2S2_SD", + pin37: "PC6_I2S2_MCK", + pin38: "PC7", + pin39: "PC8_SDIO_D0", + pin40: "PC9_SDIO_D1", + pin41: "PA8", + pin42: "PA9_UART1_TX", + pin43: "PA10_UART1_RX", + pin44: "PA11", + pin45: "PA12", + pin46: "PA13_JTMS", + pin47: "VCAP2", + pin48: "VDD3", + pin49: "PA14_JTCK", + pin50: "PA15_JTDI", + pin51: "PC10_SDIO_D2", + pin52: "PC11_SDIO_D3", + pin53: "PC12_SDIO_CLK", + pin54: "PD2_SDIO_CMD", + pin55: "PB3_JTDO", + pin56: "PB4_JTRST", + pin57: "PB5", + pin58: "PB6", + pin59: "PB7", + pin60: "BOOT0", + pin61: "PB8", + pin62: "PB9", + pin63: "VSS2", + pin64: "VDD4", + } + + /** + * 2. Schematic pin arrangement + * + * This is the visual vertical order for each side of the symbol. + * These arrays MUST use the same logical IDs you used above in pinLabels values. + * + * Whatever comes first is placed at the TOP. + * + * You can rearrange/group however you want. + */ + const schPinArrangement = { + leftSide: { + direction: "top-to-bottom", + pins: [ + "VBAT", + "VDD1", + "VDD2", + "VDD3", + "VDD4", + "VDDA", + "VCAP1", + "VCAP2", + "NRST", + "BOOT0", + "PA0", + "PA1", + "PA2_UART2_TX", + "PA3_UART2_RX", + "PA4_SPI1_NSS", + "PA5_SPI1_SCK", + "PA6_SPI1_MISO", + "PA7_SPI1_MOSI", + "PA8", + "PA9_UART1_TX", + "PA10_UART1_RX", + "PA11", + "PA12", + "PA13_JTMS", + "PA14_JTCK", + "PA15_JTDI", + "PH0", + "PH1", + "PD2_SDIO_CMD", + "VSS1", + "VSS2", + "VSSA", + ], + }, + + rightSide: { + direction: "top-to-bottom", + pins: [ + "PB0", + "PB1", + "PB2_BOOT1", + "PB3_JTDO", + "PB4_JTRST", + "PB5", + "PB6", + "PB7", + "PB8", + "PB9", + "PB10", + "PB11", + "PB12_I2S2_WS", + "PB13_I2S2_CK", + "PB14_I2S2_XD", + "PB15_I2S2_SD", + "PC0", + "PC1", + "PC2", + "PC3", + "PC4", + "PC5", + "PC6_I2S2_MCK", + "PC7", + "PC8_SDIO_D0", + "PC9_SDIO_D1", + "PC10_SDIO_D2", + "PC11_SDIO_D3", + "PC12_SDIO_CLK", + "PC13", + "PC14", + "PC15", + ], + }, + } + + /** + * 3. Optional: spacing between groups + * + * Just like schPinStyle in MicroModBoard. Keys are *physical pins*, e.g. "pin14". + * You can sprinkle visual gaps after certain important pads. + * + * You can leave this empty if you don't need spacing. + */ + const schPinStyle = { + // example group gaps, tune these later: + pin14: { marginBottom: 0.4 }, // after BOOT0 + pin6: { marginBottom: 0.4 }, // after clock pins + pin18: { marginBottom: 0.6 }, // after USB_DP + pin30: { marginBottom: 0.6 }, // after PB9_CAN_TX + pin28: { marginBottom: 0.6 }, // after SPI1_MOSI + pin52: { marginBottom: 0.6 }, // after SPI2_MOSI + pin34: { marginBottom: 0.6 }, // after PD2_SDIO_CMD_UART5_RX + } + + // 4. Render the chip in schematic+pcb using the same API MicroModBoard uses. :contentReference[oaicite:1]{index=1} + return ( + + ) +} +/* const STM32F405RG = (props: any) => ( ( /> ) +*/ + export default STM32F405RG diff --git a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx index 9c27e82a..195e501e 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/SparkFun-MicroMod-STM32-Processor.circuit.tsx @@ -1,131 +1,33 @@ import React from "react" import STM32F405RG from "./STM32F405RG" import W25Q128 from "./W25Q128" -import MicroModEdge from "./MicroModEdge" +import { MicroModBoard } from "@tscircuit/common" import { sel } from "@tscircuit/core" const pitch = 0.45 -const padW = 0.4 -const padH = 1.75 +const padW = 0.2 +const padH = 1.45 const startX = 0 const startY = 0 // Define pin arrays (inverted sides) const topPinsRight = Array.from({ length: 12 }, (_, i) => 12 - i) // 12→1 const topPinsLeft = Array.from({ length: 24 }, (_, i) => 36 - i) // 36→13 -const bottomPinsRight = Array.from({ length: 12 }, (_, i) => 12 - i).reverse() // 12→1 +const bottomPinsRight = Array.from({ length: 11 }, (_, i) => 11 - i).reverse() // 12→1 const bottomPinsLeft = Array.from({ length: 24 }, (_, i) => 36 - i).reverse() // 36→13 const Board = () => ( - - - ( name="U2" schX={5} schY={-15} - pcbX={6.25} - pcbY={-1.5} + pcbX={1.25} + pcbY={1.5} pcbRotation={0} connections={{ V3_3: "net.V3_3", @@ -186,33 +88,50 @@ const Board = () => ( }} layer="bottom" /> + + + } connections={{ pin1: "net.U1_PH0_HSE", pin2: "net.U1_PH1_HSE" }} @@ -221,30 +140,29 @@ const Board = () => ( name="C1" footprint="0402" capacitance="22pF" - schX={-9} - schY={5} + schX={-3} + schY={-5} pcbX={-8.75} - pcbY={3.72} - pcbRotation={180.0} + pcbY={3.15} connections={{ pin2: "net.GND" }} /> ( name="C3" footprint="0402" capacitance="15pF" - schX={-4} - schY={5} + schX={6} + schY={-5} pcbX={-8.76} pcbY={4.73} - pcbRotation={180.0} connections={{ pin2: "net.GND" }} /> ( footprint="0402" capacitance="2.2uF" schX={-5} - schY={0} + schY={2} pcbX={6.1} pcbY={-6.73} - pcbRotation={0.0} connections={{ pin2: "net.GND" }} /> ( footprint="0402" capacitance="2.2uF" schX={-7} - schY={0} + schY={2} pcbX={9.25} - pcbY={3.83} - pcbRotation={0.0} + pcbY={3.25} connections={{ pin2: "net.GND" }} /> ( schX={15} schY={0} pcbX={7.65} - pcbY={5.23} - pcbRotation={180.0} + pcbY={6.5} connections={{ pin1: "net.V3_3", pin2: "net.BOOT_N" }} layer="bottom" /> - + ( schX={15} schY={5} pcbX={7.65} - pcbY={6.22} + pcbY={8.22} pcbRotation={0.0} connections={{ pin1: "net.BOOT0", pin2: "net.GND" }} layer="bottom" @@ -378,9 +290,9 @@ const Board = () => ( resistance="5.1k" schX={15} schY={-3} - pcbX={-7.62} + pcbX={-6.4} pcbY={-3.95} - pcbRotation={270.0} + pcbRotation={90} connections={{ pin1: "U1.pin7", pin2: "net.V3_3" }} /> ( capacitance="100nF" schX={15} schY={-7} - pcbX={-8.61} + pcbX={-8} pcbY={-3.94} - pcbRotation={270.0} + pcbRotation={90} connections={{ pin1: "U1.pin7", pin2: "net.GND" }} /> ( schY={-15} pcbX={8.93} pcbY={6.75} - pcbRotation={180.0} connections={{ pin1: "net.STAT", pin2: sel.D5.pin1 }} /> @@ -424,7 +335,7 @@ const Board = () => ( schY={-14} pcbX={6.156} pcbY={0.433} - pcbRotation={270.0} + pcbRotation={90} connections={{ pin1: "U2.pin4", pin2: "U2.pin8" }} layer="bottom" /> @@ -434,218 +345,98 @@ const Board = () => ( footprint="0402" schX={3} schY={-13} - pcbX={-2.93} + pcbX={-0.93} pcbY={-3.1} - pcbRotation={180.0} connections={{ pin1: "U2.pin1", pin2: "net.V3_3" }} layer="bottom" /> - - `pin${n}`), - }, - }} - footprint={ - - {topPinsRight.map((n, i) => ( - - ))} - - } - connections={{ - pin1: "net.GND", - pin2: "net.V3_3", - pin3: "net.DP", - pin4: "net.NC_T04", - pin5: "net.DN", - pin6: "net.RESET", - pin7: "net.GND", - pin8: "net.HOST_ID", - pin9: "net.NC_T09", - pin10: "net.D0", - pin11: "net.BOOT_N", - pin12: "net.I2C_SDA", - }} - pcbX={3.75} - pcbY={-9.5} - pcbRotation={0} + {/* --- Decoupling Network 1 (C8–C10) --- */} + - - `pin${n}`), - }, - }} - footprint={ - - {topPinsLeft.map((n, i) => ( - - ))} - - } - connections={{ - pin13: "net.NC_T13", - pin14: "net.I2C_SCL", - pin15: "net.NC_T15", - pin16: "net.INT_N", - pin17: "net.TX1", - pin18: "net.D1", - pin19: "net.RX1", - pin20: "net.NC_T20", - pin21: "net.SWCLK", - pin22: "net.NC_T22", - pin23: "net.SWDIO", - pin24: "net.NC_T24", - pin25: "net.NC_T25", - pin26: "net.NC_T26", - pin27: "net.NC_T27", - pin28: "net.NC_T28", - pin29: "net.NC_T29", - pin30: "net.NC_T30", - pin31: "net.NC_T31", - pin32: "net.PWM0", - pin33: "net.GND", - pin34: "net.A0", - pin35: "net.HOST_DP", - pin36: "net.GND", - }} - pcbX={-14.5} - pcbY={-9.5} - pcbRotation={0} + - `pin${n}`), - }, - }} - footprint={ - - {bottomPinsRight.map((n, i) => ( - - ))} - - } - connections={{ - pin1: "net.HOST_DN", - pin2: "net.A1", - pin3: "net.GND", - pin4: "net.G0", - pin5: "net.CAN_RX", - pin6: "net.G1", - pin7: "net.CAN_TX", - pin8: "net.G2", - pin9: "net.GND", - pin10: "net.G3", - pin11: "net.PWM1", - pin12: "net.G4", - }} - pcbX={8.75} - pcbY={-9.25} - pcbRotation={0} + - `pin${n}`), - }, - }} - footprint={ - - {bottomPinsLeft.map((n, i) => ( - - ))} - - } - connections={{ - pin13: "net.BATT_VIN", - pin14: "net.AUD_BCLK", - pin15: "net.SDA1", - pin16: "net.AUD_LRCLK", - pin17: "net.SCL1", - pin18: "net.AUD_IN", - pin19: "net.CS", - pin20: "net.AUD_OUT", - pin21: "net.SCK", - pin22: "net.NC_B22", - pin23: "net.C1P0", - pin24: "net.NC_B24", - pin25: "net.C0P1", - pin26: "net.NC_B26", - pin27: "net.HOST_VBUS", - pin28: "net.NC_B28", - pin29: "net.NC_B29", - pin30: "net.NC_B30", - pin31: "net.NC_B31", - pin32: "net.NC_B32", - pin33: "net.NC_B33", - pin34: "net.NC_B34", - pin35: "net.G6", - pin36: "net.NC_B36", - }} - pcbX={6.75} - pcbY={-9.25} - pcbRotation={0} + {/* --- Decoupling Network 2 (C11–C14) --- */} + + + + + + + @@ -682,8 +473,8 @@ const Board = () => ( - + - + ) export default Board diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-3d.snap.png b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-3d.snap.png index 13f3a3326f8ca1440146cfdc93860a506174c6be..75139a09b46e441a52135ea81eb2acb5dfd6a593 100644 GIT binary patch literal 13472 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 literal 30103 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 \ No newline at end of file +U2R5Q1R1C20R11C1C2C3C4C5C6R2R3R4C15D5R12C8C9C10C11C12C13C14 \ No newline at end of file diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg index f8f703d4..e7e66f7d 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg +++ b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg @@ -1,4 +1,4 @@ -SparkFun MicroMod STM32 Processor_chip2V3_3_174V3_3_26RESET11BOOT4V3_3_EN72RTC_V39USB_VIN5USB_D_N3USB_D_P37USBHOST_D_N35USBHOST_D_P43CAN_TX41CAN_RX23SWDIO21SWDCK58AUD_MCLK56AUD_OUT54AUD_IN52AUD_LRCLK50AUD_BCLK14I2C_SCL12I2C_SDA16I2C_N_INT53I2C_SCL151I2C_SDA149BATT_VIN_31GND17GND233GND336GND439GND545GND675GND760SPI_SCK162SPI_SDO164SPI_SDI166SDIO_DATA168SDIO_DATA270SPI_N_CS157SPI_SCK59SPI_SDO61SPI_SDI55SPI_N_CS34A038A132PWM047PWM110D018D117TX119RX113RTS115CTS122TX220RX240G042G144G246G348G473G571G669G767G865G963G108G1176HOLE_PAD_1U11VBAT2PC133PC144PC155PH06PH17NRST8PC09PC110PC211PC312VSSA13VDDA14PA015PA116PA2_UART2_TX17PA3_UART2_RX18VSS119VDD120PA4_SPI1_NSS21PA5_SPI1_SCK22PA6_SPI1_MISO23PA7_SPI1_MOSI24PC425PC526PB027PB128PB2_BOOT129PB1030PB1131VCAP132VDD233PB12_I2S2_WS34PB13_I2S2_CK35PB14_I2S2_XD36PB15_I2S2_SD37PC6_I2S2_MCK38PC739PC8_SDIO_D040PC9_SDIO_D141PA842PA9_UART1_TX43PA10_UART1_RX44PA1145PA1246PA13_JTMS47VCAP248VDD349PA14_JTCK50PA15_JTDI51PC10_SDIO_D252PC11_SDIO_D353PC12_SDIO_CLK54PD2_SDIO_CMD55PB3_JTDO56PB4_JTRST57PB558PB659PB760BOOT061PB862PB963VSS264VDD4U21CS_N5DO_DI2D1_DO4GND3D2_WP6CLK7D3_HOLD8V3_312MHz / 18pFY1C122pFC222pF32.8kHz / 12.5pFY2C315pFC415pFC52.2uFC62.2uFR222ΩR322ΩR5100kΩQ1R1100kΩR45.1kΩC15100nFblueD5R121kΩC200.1uFR11100kΩC80.1uFC91.0uFC104.7uFC110.1uFC120.1uFC130.1uFC140.1uFGNDFLASH_CS_NFLASH_CS_NFLASH_CS_NFLASH_CS_NU1_PC15/Y2_pin1/C3_pin1U1_PC15/Y2_pin1/C3_pin1U1_PH0/C2_pin1U1_PH1/C1_pin1U1_PH1/C1_pin1RESETRESETU1_VDDA/U1_VDD1/U1_VDD2/U1_PA9_UART1_TX/U1_PA10_UART1_RX/U1_VDD3/U1_VDD4/C6_pin1U1_VCAP1/C5_pin1U1_PA11/R2_pin1U1_PA11/R2_pin1U1_PA12/R3_pin1U1_PA12/R3_pin1FLASH_SDIFLASH_SDIFLASH_SDIU1_BOOT0/Q1_pin3U1_BOOT0/Q1_pin3GNDGNDGNDGNDGNDGNDGNDU2_D2_WP/U2_D3_HOLDU2_D2_WP/U2_D3_HOLDV3_3V3_3V3_3V3_3V3_3V3_3D5_pin1/R12_pin2G5D0D1G6G2BATT_VINTX1RX1AUD_LRCLKSCKC1P0C0P1CSA0A1INT_NSCLSDAHOST_IDHOST_VBUSHOST_DNHOST_DPPWM1G3G4G1SWDIOG0AUD_BCLKAUD_OUTAUD_INSCL1SDA1CAN_RXCAN_TXU1_PH0_HSEU1_PH1_HSEBOOT_NBOOT0STAT \ No newline at end of file From 2419e30e0edb7b8f691cd1fb169dd1ac1e83bacb Mon Sep 17 00:00:00 2001 From: Benraouane Soufiane Date: Mon, 27 Oct 2025 15:16:47 +0100 Subject: [PATCH 13/13] Chore: add vias, re-positioning, re-connecting, add readme, remove invented/manual micromod, fix build/snapshot error,.... --- .../MicroModEdge.tsx | 82 -- .../README.md | 5 + .../STM32F405RG.tsx | 16 +- ...rkFun-MicroMod-STM32-Processor.circuit.tsx | 860 +++++++++-- ...croMod-STM32-Processor.circuit-3d.snap.png | Bin 13472 -> 17051 bytes ...roMod-STM32-Processor.circuit-pcb.snap.svg | 2 +- ...STM32-Processor.circuit-schematic.snap.svg | 1306 +++++++++++------ package.json | 1 + 8 files changed, 1609 insertions(+), 663 deletions(-) delete mode 100644 boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx create mode 100644 boards/SparkFun-MicroMod-STM32-Processor/README.md diff --git a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx b/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx deleted file mode 100644 index b491d61e..00000000 --- a/boards/SparkFun-MicroMod-STM32-Processor/MicroModEdge.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import React from "react" - -const MicroModEdge = (props: any) => ( - -) - -export default MicroModEdge diff --git a/boards/SparkFun-MicroMod-STM32-Processor/README.md b/boards/SparkFun-MicroMod-STM32-Processor/README.md new file mode 100644 index 00000000..c98edeb1 --- /dev/null +++ b/boards/SparkFun-MicroMod-STM32-Processor/README.md @@ -0,0 +1,5 @@ +# SparkFun MicroMod STM32 Processor + +For more information about this board, visit the official SparkFun product page: + +[https://www.sparkfun.com/sparkfun-micromod-stm32-processor.html](https://www.sparkfun.com/sparkfun-micromod-stm32-processor.html) diff --git a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx index af1eb007..90d5271e 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx +++ b/boards/SparkFun-MicroMod-STM32-Processor/STM32F405RG.tsx @@ -3,7 +3,7 @@ import React from "react" const pinsPerSide = 16 const pitch = 0.5 const padLength = 0.25 -const padWidth = 1.5 // <-- this is the thing you want to increase +const padWidth = 1.3 const bodyHalfSize = 5 const halfSpan = ((pinsPerSide - 1) / 2) * pitch @@ -19,7 +19,7 @@ const createLeftPads = () => rightPins.map((pin, idx) => ( bottomPins.map((pin, idx) => ( topPins.map((pin, idx) => ( ( name="SparkFun MicroMod STM32 Processor" schX={22} > - + ( }} layer="bottom" /> - ( capacitance="22pF" schX={-5} schY={-5} - pcbX={-9.61} - pcbY={-3.93} + pcbX={-9.75} + pcbY={-3.85} pcbRotation={90} connections={{ pin2: "net.GND" }} /> @@ -271,7 +222,6 @@ const Board = () => ( pcbRotation={270} layer="bottom" /> - ( resistance="5.1k" schX={15} schY={-3} - pcbX={-6.4} - pcbY={-3.95} + pcbX={-6.55} + pcbY={-3.85} pcbRotation={90} connections={{ pin1: "U1.pin7", pin2: "net.V3_3" }} /> @@ -301,8 +251,8 @@ const Board = () => ( capacitance="100nF" schX={15} schY={-7} - pcbX={-8} - pcbY={-3.94} + pcbX={-8.15} + pcbY={-3.85} pcbRotation={90} connections={{ pin1: "U1.pin7", pin2: "net.GND" }} /> @@ -346,7 +296,7 @@ const Board = () => ( schX={3} schY={-13} pcbX={-0.93} - pcbY={-3.1} + pcbY={-2.9} connections={{ pin1: "U2.pin1", pin2: "net.V3_3" }} layer="bottom" /> @@ -356,8 +306,8 @@ const Board = () => ( capacitance="0.1uF" footprint="0402" connections={{ pin1: "net.GND", pin2: "net.V3_3" }} - pcbX={-9.61} - pcbY={-5.93} + pcbX={-9.75} + pcbY={-5.5} pcbRotation={90} schX={-15} schY={-10} @@ -368,8 +318,8 @@ const Board = () => ( footprint="0402" capacitance="1.0uF" connections={{ pin1: "net.GND", pin2: "net.V3_3" }} - pcbX={-8} - pcbY={-5.94} + pcbX={-8.15} + pcbY={-5.5} pcbRotation={90} schX={-14} schY={-10} @@ -380,21 +330,20 @@ const Board = () => ( footprint="0402" capacitance="4.7uF" connections={{ pin1: "net.GND", pin2: "net.V3_3" }} - pcbX={-6.4} - pcbY={-5.95} + pcbX={-6.55} + pcbY={-5.5} pcbRotation={90} schX={-13} schY={-10} schRotation={90} /> - {/* --- Decoupling Network 2 (C11–C14) --- */} ( capacitance="0.1uF" footprint="0402" connections={{ pin1: "net.GND", pin2: "net.V3_3" }} - pcbX={-2.5} + pcbX={-2.75} pcbY={9.5} schX={-5} schY={-10} schRotation={90} /> - - + @@ -454,27 +402,767 @@ const Board = () => ( - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) export default Board diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-3d.snap.png b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-3d.snap.png index 75139a09b46e441a52135ea81eb2acb5dfd6a593..327e3b0885356e3241748cdb89adeaf172ed0830 100644 GIT binary patch literal 17051 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 A1poj5 literal 13472 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 diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg index 87e595d4..da1ae706 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg +++ b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-pcb.snap.svg @@ -1 +1 @@ -U2R5Q1R1C20R11C1C2C3C4C5C6R2R3R4C15D5R12C8C9C10C11C12C13C14 \ No newline at end of file +U2R5Q1R1C20R11C1C2C3C4C5C6R2R3R4C15D5R12C8C9C10C11C12C13C14 \ No newline at end of file diff --git a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg index e7e66f7d..38736544 100644 --- a/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg +++ b/boards/SparkFun-MicroMod-STM32-Processor/__snapshots__/SparkFun-MicroMod-STM32-Processor.circuit-schematic.snap.svg @@ -1,4 +1,4 @@ -SparkFun MicroMod STM32 Processor_chip2V3_3_174V3_3_26RESET11BOOT4V3_3_EN72RTC_V39USB_VIN5USB_D_N3USB_D_P37USBHOST_D_N35USBHOST_D_P43CAN_TX41CAN_RX23SWDIO21SWDCK58AUD_MCLK56AUD_OUT54AUD_IN52AUD_LRCLK50AUD_BCLK14I2C_SCL12I2C_SDA16I2C_N_INT53I2C_SCL151I2C_SDA149BATT_VIN_31GND17GND233GND336GND439GND545GND675GND760SPI_SCK162SPI_SDO164SPI_SDI166SDIO_DATA168SDIO_DATA270SPI_N_CS157SPI_SCK59SPI_SDO61SPI_SDI55SPI_N_CS34A038A132PWM047PWM110D018D117TX119RX113RTS115CTS122TX220RX240G042G144G246G348G473G571G669G767G865G963G108G1176HOLE_PAD_1U11VBAT2PC133PC144PC155PH06PH17NRST8PC09PC110PC211PC312VSSA13VDDA14PA015PA116PA2_UART2_TX17PA3_UART2_RX18VSS119VDD120PA4_SPI1_NSS21PA5_SPI1_SCK22PA6_SPI1_MISO23PA7_SPI1_MOSI24PC425PC526PB027PB128PB2_BOOT129PB1030PB1131VCAP132VDD233PB12_I2S2_WS34PB13_I2S2_CK35PB14_I2S2_XD36PB15_I2S2_SD37PC6_I2S2_MCK38PC739PC8_SDIO_D040PC9_SDIO_D141PA842PA9_UART1_TX43PA10_UART1_RX44PA1145PA1246PA13_JTMS47VCAP248VDD349PA14_JTCK50PA15_JTDI51PC10_SDIO_D252PC11_SDIO_D353PC12_SDIO_CLK54PD2_SDIO_CMD55PB3_JTDO56PB4_JTRST57PB558PB659PB760BOOT061PB862PB963VSS264VDD4U21CS_N5DO_DI2D1_DO4GND3D2_WP6CLK7D3_HOLD8V3_312MHz / 18pFY1C122pFC222pF32.8kHz / 12.5pFY2C315pFC415pFC52.2uFC62.2uFR222ΩR322ΩR5100kΩQ1R1100kΩR45.1kΩC15100nFblueD5R121kΩC200.1uFR11100kΩC80.1uFC91.0uFC104.7uFC110.1uFC120.1uFC130.1uFC140.1uFGNDV3_3V3_3V3_3V3_3V3_3V3_3V3_3V3_3V3_3V3_3SparkFun MicroMod STM32 Processor_chip_N_RESET/U1_NRST/R4_pin1/C15_pin1SparkFun MicroMod STM32 Processor_chip_N_RESET/U1_NRST/R4_pin1/C15_pin1SparkFun MicroMod STM32 Processor_chip_N_RESET/U1_NRST/R4_pin1/C15_pin1SparkFun MicroMod STM32 Processor_chip_N_RESET/U1_NRST/R4_pin1/C15_pin1SparkFun MicroMod STM32 Processor_chip_N_BOOT/Q1_pin1SparkFun MicroMod STM32 Processor_chip_N_BOOT/Q1_pin1SparkFun MicroMod STM32 Processor_chip_USB_VIN/U1_PB13_I2S2_CKSparkFun MicroMod STM32 Processor_chip_USB_VIN/U1_PB13_I2S2_CKSparkFun MicroMod STM32 Processor_chip_USB_D_N/R3_pin2SparkFun MicroMod STM32 Processor_chip_USB_D_N/R3_pin2SparkFun MicroMod STM32 Processor_chip_USB_D_P/R2_pin2SparkFun MicroMod STM32 Processor_chip_USB_D_P/R2_pin2SparkFun MicroMod STM32 Processor_chip_USBHOST_D_N/U1_PB14_I2S2_XDSparkFun MicroMod STM32 Processor_chip_USBHOST_D_N/U1_PB14_I2S2_XDSparkFun MicroMod STM32 Processor_chip_USBHOST_D_P/U1_PB15_I2S2_SDSparkFun MicroMod STM32 Processor_chip_USBHOST_D_P/U1_PB15_I2S2_SDSparkFun MicroMod STM32 Processor_chip_CAN_TX/U1_PB9SparkFun MicroMod STM32 Processor_chip_CAN_TX/U1_PB9SparkFun MicroMod STM32 Processor_chip_CAN_RX/U1_PB8SparkFun MicroMod STM32 Processor_chip_CAN_RX/U1_PB8SparkFun MicroMod STM32 Processor_chip_SWDIO/U1_PA13_JTMSSparkFun MicroMod STM32 Processor_chip_SWDIO/U1_PA13_JTMSSparkFun MicroMod STM32 Processor_chip_SWDCK/U1_PA14_JTCKSparkFun MicroMod STM32 Processor_chip_SWDCK/U1_PA14_JTCKSparkFun MicroMod STM32 Processor_chip_AUD_OUT/U1_PB4_JTRSTSparkFun MicroMod STM32 Processor_chip_AUD_OUT/U1_PB4_JTRSTSparkFun MicroMod STM32 Processor_chip_AUD_IN/U1_PB5SparkFun MicroMod STM32 Processor_chip_AUD_IN/U1_PB5SparkFun MicroMod STM32 Processor_chip_AUD_LRCLK/SparkFun MicroMod STM32 Processor_chip_SPI_N_CS/U1_PA4_SPI1_NSS/U1_PC4SparkFun MicroMod STM32 Processor_chip_AUD_LRCLK/SparkFun MicroMod STM32 Processor_chip_SPI_N_CS/U1_PA4_SPI1_NSS/U1_PC4SparkFun MicroMod STM32 Processor_chip_AUD_LRCLK/SparkFun MicroMod STM32 Processor_chip_SPI_N_CS/U1_PA4_SPI1_NSS/U1_PC4SparkFun MicroMod STM32 Processor_chip_AUD_LRCLK/SparkFun MicroMod STM32 Processor_chip_SPI_N_CS/U1_PA4_SPI1_NSS/U1_PC4SparkFun MicroMod STM32 Processor_chip_AUD_BCLK/U1_PB3_JTDOSparkFun MicroMod STM32 Processor_chip_AUD_BCLK/U1_PB3_JTDOSparkFun MicroMod STM32 Processor_chip_I2C_SCL/U1_PB10SparkFun MicroMod STM32 Processor_chip_I2C_SCL/U1_PB10SparkFun MicroMod STM32 Processor_chip_I2C_SDA/U1_PB11SparkFun MicroMod STM32 Processor_chip_I2C_SDA/U1_PB11SparkFun MicroMod STM32 Processor_chip_I2C_N_INT/U1_PB1SparkFun MicroMod STM32 Processor_chip_I2C_N_INT/U1_PB1SparkFun MicroMod STM32 Processor_chip_I2C_SCL1/U1_PB6SparkFun MicroMod STM32 Processor_chip_I2C_SCL1/U1_PB6SparkFun MicroMod STM32 Processor_chip_I2C_SDA1/U1_PB7SparkFun MicroMod STM32 Processor_chip_I2C_SDA1/U1_PB7SparkFun MicroMod STM32 Processor_chip_BATT_VIN_3/U1_PA1SparkFun MicroMod STM32 Processor_chip_BATT_VIN_3/U1_PA1GNDGNDGNDGNDGNDGNDGNDGNDGNDFLASH_SDOFLASH_SDOFLASH_SDOFLASH_SDOFLASH_CS_NFLASH_CS_NFLASH_CS_NFLASH_CS_NFLASH_CS_NSparkFun MicroMod STM32 Processor_chip_SPI_SCK/U1_PA5_SPI1_SCKSparkFun MicroMod STM32 Processor_chip_SPI_SCK/U1_PA5_SPI1_SCKSparkFun MicroMod STM32 Processor_chip_SPI_SDO/U1_PA7_SPI1_MOSISparkFun MicroMod STM32 Processor_chip_SPI_SDO/U1_PA7_SPI1_MOSISparkFun MicroMod STM32 Processor_chip_SPI_SDI/U1_PA6_SPI1_MISOSparkFun MicroMod STM32 Processor_chip_SPI_SDI/U1_PA6_SPI1_MISOSparkFun MicroMod STM32 Processor_chip_A0/U1_PC5SparkFun MicroMod STM32 Processor_chip_A0/U1_PC5SparkFun MicroMod STM32 Processor_chip_A1/U1_PB0SparkFun MicroMod STM32 Processor_chip_A1/U1_PB0SparkFun MicroMod STM32 Processor_chip_PWM1/U1_PC7SparkFun MicroMod STM32 Processor_chip_PWM1/U1_PC7SparkFun MicroMod STM32 Processor_chip_D0/U1_PC0SparkFun MicroMod STM32 Processor_chip_D0/U1_PC0SparkFun MicroMod STM32 Processor_chip_D1/U1_PC1SparkFun MicroMod STM32 Processor_chip_D1/U1_PC1SparkFun MicroMod STM32 Processor_chip_TX1/U1_PA2_UART2_TXSparkFun MicroMod STM32 Processor_chip_TX1/U1_PA2_UART2_TXSparkFun MicroMod STM32 Processor_chip_RX1/U1_PA3_UART2_RXSparkFun MicroMod STM32 Processor_chip_RX1/U1_PA3_UART2_RXSparkFun MicroMod STM32 Processor_chip_G0/U1_PD2_SDIO_CMDSparkFun MicroMod STM32 Processor_chip_G0/U1_PD2_SDIO_CMDSparkFun MicroMod STM32 Processor_chip_G1/U1_PA8SparkFun MicroMod STM32 Processor_chip_G1/U1_PA8SparkFun MicroMod STM32 Processor_chip_G2/U1_PA0SparkFun MicroMod STM32 Processor_chip_G2/U1_PA0SparkFun MicroMod STM32 Processor_chip_G3/U1_PC8_SDIO_D0SparkFun MicroMod STM32 Processor_chip_G3/U1_PC8_SDIO_D0SparkFun MicroMod STM32 Processor_chip_G4/U1_PC9_SDIO_D1SparkFun MicroMod STM32 Processor_chip_G4/U1_PC9_SDIO_D1SparkFun MicroMod STM32 Processor_chip_G5/U1_PC13SparkFun MicroMod STM32 Processor_chip_G5/U1_PC13SparkFun MicroMod STM32 Processor_chip_G6/U1_PC2SparkFun MicroMod STM32 Processor_chip_G6/U1_PC2U1_PC15/Y2_pin1/C3_pin1U1_PC15/Y2_pin1/C3_pin1U1_PH0/C2_pin1U1_PH1/C1_pin1U1_PH1/C1_pin1U1_VCAP1/C5_pin1U1_PA11/R2_pin1U1_PA11/R2_pin1U1_PA12/R3_pin1U1_PA12/R3_pin1U1_BOOT0/Q1_pin3U1_BOOT0/Q1_pin3U2_D2_WP/U2_D3_HOLDU2_D2_WP/U2_D3_HOLDD5_pin1/R12_pin2U1_PH0_HSEU1_PH1_HSEBOOT_NBOOT0STAT \ No newline at end of file diff --git a/package.json b/package.json index bb3d1a29..5adba185 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "typescript": "^5" }, "dependencies": { + "@tscircuit/common": "^0.0.17", "tscircuit": "^0.0.743" } }