ShiboSoftwareDev/captivate-fr2676

This circuit implements an MSP430FR2676 microcontroller-based development module with integrated power regulation, user interface components, programming interfaces, and sensor/boosterpack headers for embedded system prototyping.

Version
1.0.0
License
unset
Stars
0

index.circuit.tsx

PCBPCB preview for index.circuit.tsx
SchematicSchematic preview for index.circuit.tsx
import { MSP430FR2676TPT } from "./imports/MSP430FR2676TPT"
import { TS342A2P_WZ } from "./imports/TS342A2P_WZ"

const onSheet = <const T extends Record<string, unknown>>(
  schSheetName: string,
  placement: T,
) => ({ schSheetName, ...placement })

const SCH = {
  U_TARGET: onSheet("MCU", { schX: 0, schY: 2 }),
  C_DVCC: onSheet("MCU", { schX: -8, schY: 7, schOrientation: "vertical" }),
  C_BULK: onSheet("MCU", { schX: -5.5, schY: 7, schOrientation: "vertical" }),
  C_VREG: onSheet("MCU", { schX: 7, schY: 7, schOrientation: "vertical" }),
  R_RST: onSheet("MCU", { schX: -8, schY: -5, schOrientation: "vertical" }),
  C_RST: onSheet("MCU", { schX: -5, schY: -7, schOrientation: "vertical" }),
  SW_RST: onSheet("MCU", { schX: -2, schY: -7, schOrientation: "down" }),
  R_BUTTON: onSheet("MCU", { schX: 2, schY: -6, schOrientation: "vertical" }),
  SW_USER: onSheet("MCU", { schX: 5, schY: -7, schOrientation: "down" }),
  R_LED_PWR: onSheet("MCU", { schX: 8, schY: 1, schOrientation: "horizontal" }),
  LED_PWR: onSheet("MCU", { schX: 11, schY: 1, schOrientation: "horizontal" }),
  R_LED1: onSheet("MCU", { schX: 8, schY: -1.5, schOrientation: "horizontal" }),
  LED1: onSheet("MCU", { schX: 11, schY: -1.5, schOrientation: "horizontal" }),
  R_LED2: onSheet("MCU", { schX: 8, schY: -4, schOrientation: "horizontal" }),
  LED2: onSheet("MCU", { schX: 11, schY: -4, schOrientation: "horizontal" }),
  R_TX: onSheet("MCU", { schX: -10, schY: 3.5, schOrientation: "horizontal" }),
  R_RX: onSheet("MCU", { schX: -10, schY: 2, schOrientation: "horizontal" }),
  R_SDA: onSheet("MCU", { schX: -10, schY: 0.5, schOrientation: "horizontal" }),
  R_SCL: onSheet("MCU", { schX: -10, schY: -1, schOrientation: "horizontal" }),
  R_IRQ: onSheet("MCU", { schX: -10, schY: -2.5, schOrientation: "horizontal" }),
  R_SYNC: onSheet("MCU", { schX: -10, schY: -4, schOrientation: "horizontal" }),
  J_PGMR: onSheet("INTERFACES", { schX: -10, schY: 3 }),
  J_PWRSEL: onSheet("INTERFACES", { schX: -10, schY: -6 }),
  J_EXT_PWR: onSheet("INTERFACES", { schX: -4, schY: -7 }),
  J_SENSOR: onSheet("INTERFACES", { schX: 4, schY: 2 }),
  J1: onSheet("INTERFACES", { schX: 8, schY: 7 }),
  J2: onSheet("INTERFACES", { schX: 8, schY: 2 }),
  J3: onSheet("INTERFACES", { schX: 8, schY: -3 }),
  J4: onSheet("INTERFACES", { schX: 8, schY: -8 }),
  R_PGMR_SDA: onSheet("INTERFACES", { schX: -4, schY: 5, schOrientation: "vertical" }),
  R_PGMR_SCL: onSheet("INTERFACES", { schX: -2, schY: 5, schOrientation: "vertical" }),
  R_PGMR_IRQ: onSheet("INTERFACES", { schX: 0, schY: 5, schOrientation: "vertical" }),
} as const

const targetFanout = (pin: number) => {
  const viaLayer: "inner1" | "inner2" = pin % 2 === 0 ? "inner1" : "inner2"
  if (pin <= 12) {
    return [{ x: -9.9 + (pin - 1) * 1.8, y: -9.5, via: true, to_layer: viaLayer }]
  }
  if (pin <= 24) {
    return [{ x: 9.5, y: -9.9 + (pin - 13) * 1.8, via: true, to_layer: viaLayer }]
  }
  if (pin <= 36) {
    return [{ x: 9.9 - (pin - 25) * 1.8, y: 9.5, via: true, to_layer: viaLayer }]
  }
  if (pin <= 48) {
    return [{ x: -9.5, y: 9.9 - (pin - 37) * 1.8, via: true, to_layer: viaLayer }]
  }
  return undefined
}

type PthPadProps = {
  pin: number
  x: number
  y: number
}

const PthPad = ({ pin, x, y }: PthPadProps) => (
  <platedhole
    portHints={[`pin${pin}`]}
    pcbX={`${x}mm`}
    pcbY={`${y}mm`}
    shape="circle"
    holeDiameter="0.9mm"
    outerDiameter="1.7mm"
  />
)

const ProgrammerConnector = (props: any) => {
  const labels = {
    pin1: "VCC_LDO",
    pin2: "VCC_MEASURED",
    pin3: "GND1",
    pin4: "GND2",
    pin5: "SBWTDIO",
    pin6: "SBWTCK",
    pin7: "UART_TX",
    pin8: "UART_RX",
    pin9: "HID_SDA",
    pin10: "HID_SCL",
    pin11: "IRQ",
    pin12: "SYNC",
    pin13: "VBUS_5V",
    pin14: "GND3",
    pin15: "NC15",
    pin16: "NC16",
    pin17: "NC17",
    pin18: "NC18",
    pin19: "NC19",
    pin20: "NC20",
  } as const

  return (
    <connector
      {...props}
      manufacturerPartNumber="CAPTIVATE-PGMR 2x10 female interface"
      pinLabels={labels}
      schPinArrangement={{
        leftSide: ["VCC_LDO", "VCC_MEASURED", "VBUS_5V", "GND1", "GND2", "GND3"],
        rightSide: ["SBWTDIO", "SBWTCK", "UART_TX", "UART_RX", "HID_SDA", "HID_SCL", "IRQ", "SYNC", "NC15", "NC16", "NC17", "NC18", "NC19", "NC20"],
      }}
      footprint={
        <footprint>
          {Array.from({ length: 10 }, (_, index) => (
            <PthPad key={`pgmr-a-${index}`} pin={index * 2 + 1} x={-11.43 + index * 2.54} y={-1.27} />
          ))}
          {Array.from({ length: 10 }, (_, index) => (
            <PthPad key={`pgmr-b-${index}`} pin={index * 2 + 2} x={-11.43 + index * 2.54} y={1.27} />
          ))}
          <silkscreenrect width="25.8mm" height="4.6mm" />
          <silkscreentext text="CAPTIVATE-PGMR" pcbX="0mm" pcbY="3.4mm" fontSize="0.7mm" />
        </footprint>
      }
    />
  )
}

const capLabels = [
  "CAP0_0", "CAP0_1", "CAP0_2", "CAP0_3",
  "CAP1_0", "CAP1_1", "CAP1_2", "CAP1_3",
  "CAP2_0", "CAP2_1", "CAP2_2", "CAP2_3",
  "CAP3_0", "CAP3_1", "CAP3_2", "CAP3_3",
] as const

const sensorLabels = {
  pin1: "CAP0_0", pin2: "CAP0_1", pin3: "CAP0_2", pin4: "CAP0_3",
  pin5: "CAP1_0", pin6: "CAP1_1", pin7: "CAP1_2", pin8: "CAP1_3",
  pin9: "CAP2_0", pin10: "CAP2_1", pin11: "CAP2_2", pin12: "CAP2_3",
  pin13: "CAP3_0", pin14: "CAP3_1", pin15: "CAP3_2", pin16: "CAP3_3",
  pin17: "GND01", pin18: "GND02", pin19: "GND03", pin20: "GND04",
  pin21: "GND05", pin22: "GND06", pin23: "GND07", pin24: "GND08",
  pin25: "GND09", pin26: "GND10", pin27: "GND11", pin28: "GND12",
  pin29: "GND13", pin30: "GND14", pin31: "GND15", pin32: "GND16",
  pin33: "VCC_3V3", pin34: "VBUS_5V", pin35: "SENSOR_SDA", pin36: "SENSOR_SCL",
  pin37: "GPIO1", pin38: "GPIO2", pin39: "GPIO3", pin40: "GPIO4", pin41: "GPIO5",
  pin42: "NC42", pin43: "NC43", pin44: "NC44", pin45: "NC45",
  pin46: "NC46", pin47: "NC47", pin48: "NC48",
} as const

const SensorConnector = (props: any) => (
  <connector
    {...props}
    manufacturerPartNumber="CapTIvate 3x16 sensor-panel connector"
    pinLabels={sensorLabels}
    schPinArrangement={{
      leftSide: ["VCC_3V3", "VBUS_5V", "SENSOR_SDA", "SENSOR_SCL", "GPIO1", "GPIO2", "GPIO3", "GPIO4", "GPIO5"],
      rightSide: [...capLabels, "GND01", "GND02", "GND03", "GND04", "GND05", "GND06", "GND07", "GND08", "GND09", "GND10", "GND11", "GND12", "GND13", "GND14", "GND15", "GND16", "NC42", "NC43", "NC44", "NC45", "NC46", "NC47", "NC48"],
    }}
    footprint={
      <footprint>
        {Array.from({ length: 16 }, (_, index) => (
          <PthPad key={`sensor-top-${index}`} pin={index + 1} x={-19.05 + index * 2.54} y={2.54} />
        ))}
        {Array.from({ length: 16 }, (_, index) => (
          <PthPad key={`sensor-gnd-${index}`} pin={index + 17} x={-19.05 + index * 2.54} y={0} />
        ))}
        {Array.from({ length: 16 }, (_, index) => (
          <PthPad key={`sensor-bottom-${index}`} pin={index + 33} x={-19.05 + index * 2.54} y={-2.54} />
        ))}
        <silkscreenrect width="41.5mm" height="7.2mm" />
        <silkscreentext text="48-PIN SENSOR PANEL" pcbX="0mm" pcbY="4.8mm" fontSize="0.7mm" />
      </footprint>
    }
  />
)

const CapTrace = ({ index }: { index: number }) => {
  const label = capLabels[index]
  const pin = index < 4 ? 23 + index
    : index < 8 ? 27 + (index - 4)
      : index < 12 ? 32 + (index - 8)
        : 36 + (index - 12)
  return (
    <trace
      from={`U_TARGET.${label}`}
      to={`J_SENSOR.${label}`}
      pcbRouteHints={targetFanout(pin)}
    />
  )
}

const SensorGroundTrace = ({ index }: { index: number }) => (
  <trace from={`J_SENSOR.GND${String(index + 1).padStart(2, "0")}`} to="net.GND" />
)

export default () => (
  <board
    title="CAPTIVATE-FR2676 MSP430 CapTIvate module - tscircuit edition"
    width="72mm"
    height="92mm"
    layers={4}
    borderRadius="2mm"
    minTraceWidth="0.15mm"
    minViaHoleDiameter="0.3mm"
    minViaPadDiameter="0.45mm"
    pcbStyle={{ viaHoleDiameter: "0.3mm", viaPadDiameter: "0.45mm" }}
    autorouter={{ preset: "default", allowViaInPad: false }}
  >
    <schematicsheet name="MCU" displayName="MSP430FR2676 Core, Power, and User Interface" sheetIndex={0}>
      <schematictext text="CAPTIVATE-FR2676 — MSP430FR2676 Core and Onboard User Interface" schX={-12} schY={10} fontSize={0.7} anchor="left" />
      <schematictext text="SBW, UART, HID I2C, IRQ, and SYNC are isolated through removable 0-ohm links." schX={-12} schY={-10} fontSize={0.35} anchor="left" color="#555555" />
    </schematicsheet>
    <schematicsheet name="INTERFACES" displayName="PGMR, Sensor Panel, and BoosterPack Headers" sheetIndex={1}>
      <schematictext text="CAPTIVATE-PGMR, 48-pin Sensor Panel, and Limited BoosterPack Interface" schX={-12} schY={10} fontSize={0.7} anchor="left" />
      <schematictext text="J_PWRSEL pins 1-2: normal VCC_LDO; pins 2-3: EnergyTrace VCC_MEASURED." schX={-12} schY={-10} fontSize={0.35} anchor="left" color="#555555" />
    </schematicsheet>

    <hole name="H1" diameter="3.2mm" pcbX={-30} pcbY={42} />
    <hole name="H2" diameter="3.2mm" pcbX={30} pcbY={42} />
    <hole name="H3" diameter="3.2mm" pcbX={-24} pcbY={-42} />
    <hole name="H4" diameter="3.2mm" pcbX={24} pcbY={-42} />
    <fiducial name="FID1" padDiameter="1mm" soldermaskPullback="1mm" pcbX={-26} pcbY={42} />
    <fiducial name="FID2" padDiameter="1mm" soldermaskPullback="1mm" pcbX={26} pcbY={42} />
    <silkscreentext text="CAPTIVATE-FR2676" fontSize="1.1mm" pcbX={0} pcbY={-43.5} />
    <silkscreentext text="MSP430FR2676 TARGET" fontSize="0.8mm" pcbX={0} pcbY={8.5} />
    <silkscreentext text="J_PWRSEL: LDO-TARGET-MEASURED" fontSize="0.62mm" pcbX={-18} pcbY={17} pcbRotation={90} />

    <ProgrammerConnector
      name="J_PGMR"
      {...SCH.J_PGMR}
      schWidth="7mm"
      schHeight="12mm"
      pcbX={0}
      pcbY={34}
      noConnect={["NC15", "NC16", "NC17", "NC18", "NC19", "NC20"]}
    />
    <SensorConnector
      name="J_SENSOR"
      {...SCH.J_SENSOR}
      schWidth="8mm"
      schHeight="18mm"
      pcbX={0}
      pcbY={-33}
      noConnect={["NC42", "NC43", "NC44", "NC45", "NC46", "NC47", "NC48"]}
    />

    <pinheader
      name="J_PWRSEL"
      {...SCH.J_PWRSEL}
      pinCount={3}
      gender="male"
      pitch="2.54mm"
      footprint="pinrow3_p2.54mm"
      pinLabels={["VCC_LDO", "VCC_TARGET", "VCC_MEASURED"]}
      showSilkscreenPinLabels={true}
      pcbX={-17}
      pcbY={13}
      pcbRotation={90}
    />
    <pinheader
      name="J_EXT_PWR"
      {...SCH.J_EXT_PWR}
      pinCount={2}
      gender="male"
      pitch="2.54mm"
      footprint="pinrow2_p2.54mm"
      pinLabels={["VCC_TARGET", "GND"]}
      showSilkscreenPinLabels={true}
      pcbX={-23}
      pcbY={13}
    />

    <MSP430FR2676TPT
      name="U_TARGET"
      {...SCH.U_TARGET}
      schWidth="7.5mm"
      schHeight="14mm"
      pcbX={0}
      pcbY={0}
      noConnect={["P5_3", "P5_4", "P5_5", "P5_6", "P5_7", "P6_0", "P6_1", "P6_2"]}
      pinAttributes={{
        DVCC: { requiresPower: true },
        DVSS: { requiresGround: true },
        VREG: { mustBeConnected: true },
      }}
    />
    <capacitor name="C_DVCC" {...SCH.C_DVCC} capacitance="100nF" maxDecouplingTraceLength="100mm" footprint="0402" pcbX={-7} pcbY={-7} />
    <capacitor name="C_BULK" {...SCH.C_BULK} capacitance="10uF" maxDecouplingTraceLength="25mm" footprint="0805" pcbX={-12} pcbY={-15} />
    <capacitor name="C_VREG" {...SCH.C_VREG} capacitance="1uF" maxDecouplingTraceLength="100mm" footprint="0603" pcbX={-6.5} pcbY={6.5} />
    <resistor name="R_RST" {...SCH.R_RST} resistance="47kohm" footprint="0603" pcbX={12} pcbY={7} />
    <capacitor name="C_RST" {...SCH.C_RST} capacitance="2.2nF" footprint="0402" pcbX={15} pcbY={7} />
    <TS342A2P_WZ name="SW_RST" {...SCH.SW_RST} pcbX={20} pcbY={7} />
    <resistor name="R_BUTTON" {...SCH.R_BUTTON} resistance="47kohm" footprint="0603" pcbX={14} pcbY={1} />
    <TS342A2P_WZ name="SW_USER" {...SCH.SW_USER} pcbX={20} pcbY={1} />

    <resistor name="R_LED_PWR" {...SCH.R_LED_PWR} resistance="1kohm" footprint="0603" pcbX={16} pcbY={-6} />
    <led name="LED_PWR" {...SCH.LED_PWR} color="green" footprint="0603" pcbX={20} pcbY={-6} />
    <resistor name="R_LED1" {...SCH.R_LED1} resistance="680ohm" footprint="0603" pcbX={16} pcbY={-10} />
    <led name="LED1" {...SCH.LED1} color="red" footprint="0603" pcbX={20} pcbY={-10} />
    <resistor name="R_LED2" {...SCH.R_LED2} resistance="680ohm" footprint="0603" pcbX={16} pcbY={-14} />
    <led name="LED2" {...SCH.LED2} color="green" footprint="0603" pcbX={20} pcbY={-14} />

    <resistor name="R_ISO_TX" {...SCH.R_TX} resistance="0ohm" footprint="0603" pcbX={-15} pcbY={-11} />
    <resistor name="R_ISO_RX" {...SCH.R_RX} resistance="0ohm" footprint="0603" pcbX={-15} pcbY={-8.5} />
    <resistor name="R_ISO_SDA" {...SCH.R_SDA} resistance="0ohm" footprint="0603" pcbX={-15} pcbY={-6} />
    <resistor name="R_ISO_SCL" {...SCH.R_SCL} resistance="0ohm" footprint="0603" pcbX={-15} pcbY={-3.5} />
    <resistor name="R_ISO_IRQ" {...SCH.R_IRQ} resistance="0ohm" footprint="0603" pcbX={-15} pcbY={-1} />
    <resistor name="R_ISO_SYNC" {...SCH.R_SYNC} resistance="0ohm" footprint="0603" pcbX={-15} pcbY={1.5} />
    <resistor name="R_PGMR_SDA" {...SCH.R_PGMR_SDA} resistance="4.7kohm" footprint="0603" pcbX={-18} pcbY={27} />
    <resistor name="R_PGMR_SCL" {...SCH.R_PGMR_SCL} resistance="4.7kohm" footprint="0603" pcbX={-15} pcbY={27} />
    <resistor name="R_PGMR_IRQ" {...SCH.R_PGMR_IRQ} resistance="4.7kohm" footprint="0603" pcbX={-12} pcbY={27} />

    <pinheader name="J1" {...SCH.J1} pinCount={10} gender="female" pitch="2.54mm" footprint="pinrow10_p2.54mm" pinLabels={["V3_3", "P1_0", "UART_RX", "UART_TX", "SYNC", "P1_6", "SENSOR_SCL", "SENSOR_SDA", "HID_SCL", "HID_SDA"]} showSilkscreenPinLabels={true} pcbX={-29} pcbY={-5} pcbRotation={90} />
    <connector name="J2" {...SCH.J2} manufacturerPartNumber="Limited BoosterPack right header" footprint="pinrow10_p2.54mm" pinLabels={{ pin1: "GND", pin2: "P2_0", pin3: "P2_1", pin4: "NC4", pin5: "RST", pin6: "NC6", pin7: "NC7", pin8: "NC8", pin9: "NC9", pin10: "NC10" }} noConnect={["NC4", "NC6", "NC7", "NC8", "NC9", "NC10"]} schPinArrangement={{ rightSide: ["GND", "P2_0", "P2_1", "NC4", "RST", "NC6", "NC7", "NC8", "NC9", "NC10"] }} pcbX={29} pcbY={-5} pcbRotation={270} />
    <pinheader name="J3" {...SCH.J3} pinCount={10} gender="female" pitch="2.54mm" footprint="pinrow10_p2.54mm" pinLabels={["VBUS_5V", "GND", "P1_6", "P1_7", "SENSOR_SCL", "SENSOR_SDA", "P4_5", "P4_6", "P4_7", "P5_0"]} showSilkscreenPinLabels={true} pcbX={-29} pcbY={-31.5} pcbRotation={90} />
    <connector name="J4" {...SCH.J4} manufacturerPartNumber="Limited BoosterPack right header" footprint="pinrow10_p2.54mm" pinLabels={{ pin1: "P5_1", pin2: "P5_2", pin3: "GND", pin4: "NC4", pin5: "NC5", pin6: "NC6", pin7: "NC7", pin8: "NC8", pin9: "NC9", pin10: "NC10" }} noConnect={["NC4", "NC5", "NC6", "NC7", "NC8", "NC9", "NC10"]} schPinArrangement={{ rightSide: ["P5_1", "P5_2", "GND", "NC4", "NC5", "NC6", "NC7", "NC8", "NC9", "NC10"] }} pcbX={29} pcbY={-31.5} pcbRotation={270} />

    <trace from="U_TARGET.DVCC" to="C_DVCC.pin1" pcbRouteHints={targetFanout(1)} thickness="0.3mm" />
    <trace from="U_TARGET.DVSS" to="C_DVCC.pin2" pcbRouteHints={targetFanout(48)} thickness="0.3mm" />
    <trace from="U_TARGET.VREG" to="C_VREG.pin1" pcbRouteHints={targetFanout(31)} />
    <trace from="C_VREG.pin2" to="U_TARGET.DVSS" />
    <trace from="C_DVCC.pin1" to="net.VCC_TARGET" thickness="0.3mm" />
    <trace from="C_DVCC.pin2" to="net.GND" />
    <trace from="C_BULK.pin1" to="net.VCC_TARGET" thickness="0.3mm" />
    <trace from="C_BULK.pin2" to="net.GND" />

    <trace from="U_TARGET.RST" to="net.SBWTDIO" pcbRouteHints={targetFanout(2)} />
    <trace from="U_TARGET.TEST" to="net.SBWTCK" pcbRouteHints={targetFanout(3)} />
    <trace from="R_RST.pin1" to="net.SBWTDIO" />
    <trace from="R_RST.pin2" to="net.VCC_TARGET" />
    <trace from="C_RST.pin1" to="net.SBWTDIO" />
    <trace from="C_RST.pin2" to="net.GND" />
    <trace from="SW_RST.pin1" to="net.SBWTDIO" />
    <trace from="SW_RST.pin2" to="net.GND" />

    <trace from="U_TARGET.USER_BUTTON" to="net.GPIO1" pcbRouteHints={targetFanout(12)} />
    <trace from="R_BUTTON.pin1" to="net.VCC_TARGET" />
    <trace from="R_BUTTON.pin2" to="net.GPIO1" />
    <trace from="SW_USER.pin1" to="net.GPIO1" />
    <trace from="SW_USER.pin2" to="net.GND" />

    <trace from="R_LED_PWR.pin1" to="net.VCC_TARGET" />
    <trace from="R_LED_PWR.pin2" to="LED_PWR.anode" />
    <trace from="LED_PWR.cathode" to="net.GND" />
    <trace from="U_TARGET.P1_6" to="net.GPIO2" pcbRouteHints={targetFanout(6)} />
    <trace from="R_LED1.pin1" to="net.GPIO2" />
    <trace from="R_LED1.pin2" to="LED1.anode" />
    <trace from="LED1.cathode" to="net.GND" />
    <trace from="U_TARGET.P1_7" to="net.GPIO3" pcbRouteHints={targetFanout(7)} />
    <trace from="R_LED2.pin1" to="net.GPIO3" />
    <trace from="R_LED2.pin2" to="LED2.anode" />
    <trace from="LED2.cathode" to="net.GND" />

    <trace from="U_TARGET.UART_TX" to="net.UART_TX_MCU" pcbRouteHints={targetFanout(4)} />
    <trace from="R_ISO_TX.pin1" to="net.UART_TX_MCU" />
    <trace from="R_ISO_TX.pin2" to="net.UART_TX_PGMR" />
    <trace from="U_TARGET.UART_RX" to="net.UART_RX_MCU" pcbRouteHints={targetFanout(5)} />
    <trace from="R_ISO_RX.pin1" to="net.UART_RX_MCU" />
    <trace from="R_ISO_RX.pin2" to="net.UART_RX_PGMR" />
    <trace from="U_TARGET.HID_SDA" to="net.HID_SDA_MCU" pcbRouteHints={targetFanout(14)} />
    <trace from="R_ISO_SDA.pin1" to="net.HID_SDA_MCU" />
    <trace from="R_ISO_SDA.pin2" to="net.HID_SDA_PGMR" />
    <trace from="U_TARGET.HID_SCL" to="net.HID_SCL_MCU" pcbRouteHints={targetFanout(15)} />
    <trace from="R_ISO_SCL.pin1" to="net.HID_SCL_MCU" />
    <trace from="R_ISO_SCL.pin2" to="net.HID_SCL_PGMR" />
    <trace from="U_TARGET.IRQ" to="net.IRQ_MCU" pcbRouteHints={targetFanout(13)} />
    <trace from="R_ISO_IRQ.pin1" to="net.IRQ_MCU" />
    <trace from="R_ISO_IRQ.pin2" to="net.IRQ_PGMR" />
    <trace from="U_TARGET.SYNC" to="net.SYNC_MCU" pcbRouteHints={targetFanout(16)} />
    <trace from="R_ISO_SYNC.pin1" to="net.SYNC_MCU" />
    <trace from="R_ISO_SYNC.pin2" to="net.SYNC_PGMR" />

    <trace from="J_PGMR.VCC_LDO" to="net.VCC_LDO" thickness="0.3mm" />
    <trace from="J_PGMR.VCC_MEASURED" to="net.VCC_MEASURED" thickness="0.3mm" />
    <trace from="J_PGMR.VBUS_5V" to="net.VBUS_5V" thickness="0.3mm" />
    <trace from="J_PGMR.GND1" to="net.GND" /><trace from="J_PGMR.GND2" to="net.GND" /><trace from="J_PGMR.GND3" to="net.GND" />
    <trace from="J_PGMR.SBWTDIO" to="net.SBWTDIO" />
    <trace from="J_PGMR.SBWTCK" to="net.SBWTCK" />
    <trace from="J_PGMR.UART_TX" to="net.UART_TX_PGMR" />
    <trace from="J_PGMR.UART_RX" to="net.UART_RX_PGMR" />
    <trace from="J_PGMR.HID_SDA" to="net.HID_SDA_PGMR" />
    <trace from="J_PGMR.HID_SCL" to="net.HID_SCL_PGMR" />
    <trace from="J_PGMR.IRQ" to="net.IRQ_PGMR" />
    <trace from="J_PGMR.SYNC" to="net.SYNC_PGMR" />
    <trace from="R_PGMR_SDA.pin1" to="net.HID_SDA_PGMR" /><trace from="R_PGMR_SDA.pin2" to="net.VCC_LDO" />
    <trace from="R_PGMR_SCL.pin1" to="net.HID_SCL_PGMR" /><trace from="R_PGMR_SCL.pin2" to="net.VCC_LDO" />
    <trace from="R_PGMR_IRQ.pin1" to="net.IRQ_PGMR" /><trace from="R_PGMR_IRQ.pin2" to="net.VCC_LDO" />

    <trace from="J_PWRSEL.VCC_LDO" to="net.VCC_LDO" thickness="0.3mm" />
    <trace from="J_PWRSEL.VCC_TARGET" to="net.VCC_TARGET" thickness="0.3mm" />
    <trace from="J_PWRSEL.VCC_MEASURED" to="net.VCC_MEASURED" thickness="0.3mm" />
    <trace from="J_EXT_PWR.VCC_TARGET" to="net.VCC_TARGET" thickness="0.3mm" />
    <trace from="J_EXT_PWR.GND" to="net.GND" thickness="0.3mm" />

    {capLabels.map((_, index) => <CapTrace key={`cap-trace-${index}`} index={index} />)}
    {Array.from({ length: 16 }, (_, index) => <SensorGroundTrace key={`sensor-ground-${index}`} index={index} />)}
    <trace from="J_SENSOR.VCC_3V3" to="net.VCC_LDO" thickness="0.3mm" />
    <trace from="J_SENSOR.VBUS_5V" to="net.VBUS_5V" thickness="0.3mm" />
    <trace from="U_TARGET.SENSOR_SCL" to="net.SENSOR_SCL" pcbRouteHints={targetFanout(8)} />
    <trace from="U_TARGET.SENSOR_SDA" to="net.SENSOR_SDA" pcbRouteHints={targetFanout(9)} />
    <trace from="J_SENSOR.SENSOR_SCL" to="net.SENSOR_SCL" />
    <trace from="J_SENSOR.SENSOR_SDA" to="net.SENSOR_SDA" />
    <trace from="J_SENSOR.GPIO1" to="net.GPIO1" />
    <trace from="J_SENSOR.GPIO2" to="net.GPIO2" />
    <trace from="J_SENSOR.GPIO3" to="net.GPIO3" />
    <trace from="U_TARGET.P4_5" to="net.GPIO4" pcbRouteHints={targetFanout(17)} />
    <trace from="J_SENSOR.GPIO4" to="net.GPIO4" />
    <trace from="U_TARGET.P4_6" to="net.GPIO5" pcbRouteHints={targetFanout(18)} />
    <trace from="J_SENSOR.GPIO5" to="net.GPIO5" />

    <trace from="J1.V3_3" to="net.VCC_TARGET" /><trace from="J1.P1_0" to="net.GPIO1" />
    <trace from="J1.UART_RX" to="net.UART_RX_MCU" /><trace from="J1.UART_TX" to="net.UART_TX_MCU" />
    <trace from="J1.SYNC" to="net.SYNC_MCU" /><trace from="J1.P1_6" to="net.GPIO2" />
    <trace from="J1.SENSOR_SCL" to="net.SENSOR_SCL" /><trace from="J1.SENSOR_SDA" to="net.SENSOR_SDA" />
    <trace from="J1.HID_SCL" to="net.HID_SCL_MCU" /><trace from="J1.HID_SDA" to="net.HID_SDA_MCU" />
    <trace from="J2.GND" to="net.GND" />
    <trace from="U_TARGET.P2_0" to="J2.P2_0" pcbRouteHints={targetFanout(46)} />
    <trace from="U_TARGET.P2_1" to="J2.P2_1" pcbRouteHints={targetFanout(47)} />
    <trace from="J2.RST" to="net.SBWTDIO" />
    <trace from="J3.VBUS_5V" to="net.VBUS_5V" /><trace from="J3.GND" to="net.GND" />
    <trace from="J3.P1_6" to="net.GPIO2" /><trace from="J3.P1_7" to="net.GPIO3" />
    <trace from="J3.SENSOR_SCL" to="net.SENSOR_SCL" /><trace from="J3.SENSOR_SDA" to="net.SENSOR_SDA" />
    <trace from="J3.P4_5" to="net.GPIO4" /><trace from="J3.P4_6" to="net.GPIO5" />
    <trace from="U_TARGET.P4_7" to="J3.P4_7" pcbRouteHints={targetFanout(42)} />
    <trace from="U_TARGET.P5_0" to="J3.P5_0" pcbRouteHints={targetFanout(43)} />
    <trace from="U_TARGET.P5_1" to="J4.P5_1" pcbRouteHints={targetFanout(44)} />
    <trace from="U_TARGET.P5_2" to="J4.P5_2" pcbRouteHints={targetFanout(45)} />
    <trace from="J4.GND" to="net.GND" />
  </board>
)