hrithik18k/open-ring-flex

A flexible wearable PCB integrating inductive battery charging, BLE control with SPI flash and 32 MHz crystal, SAM L10 capacitive touch/wear sensing, haptic MOSFET drive with a large capacitor bank, RF antenna matching, and SWD programming/test connectors.

Version
1.0.4
License
CC-BY-NC-SA-4.0
Stars
0

index.circuit.tsx

PCBPCB preview for index.circuit.tsx
SchematicSchematic preview for index.circuit.tsx
import { Fragment } from "react"
// Open Ring adaptation. CC BY-NC-SA-4.0. See README.md and source-data/.
import { ABM11W_32_0000MHZ_6_B1U_T3 } from "./imports/ABM11W_32_0000MHZ_6_B1U_T3"
import { ATSAML10E16A_MUT } from "./imports/ATSAML10E16A_MUT"
import { BQ25125YFPR } from "./imports/BQ25125YFPR"
import { BZX884B5V1L_HG3_08 } from "./imports/BZX884B5V1L_HG3_08"
import { CR0201FH1002G } from "./imports/CR0201FH1002G"
import { CR0201FH1003G } from "./imports/CR0201FH1003G"
import { CR0201FH1004G } from "./imports/CR0201FH1004G"
import { DA14531_00000FX2 } from "./imports/DA14531_00000FX2"
import { FTSH_105_01_L_DV_K_P_TR } from "./imports/FTSH_105_01_L_DV_K_P_TR"
import { GRM0335C1E101JA01D } from "./imports/GRM0335C1E101JA01D"
import { GRM0335C1H100JA01D } from "./imports/GRM0335C1H100JA01D"
import { GRM0335C1H1R8CA01D } from "./imports/GRM0335C1H1R8CA01D"
import { GRM033R60J104KE19D } from "./imports/GRM033R60J104KE19D"
import { GRM155R60J225ME15D } from "./imports/GRM155R60J225ME15D"
import { GRM155R61A106ME44D } from "./imports/GRM155R61A106ME44D"
import { GRM188R60J476ME15D } from "./imports/GRM188R60J476ME15D"
import { LQP03TN3N3B02D } from "./imports/LQP03TN3N3B02D"
import { MLZ1608N2R2LT000 } from "./imports/MLZ1608N2R2LT000"
import { MX25R4035FZUIL0 } from "./imports/MX25R4035FZUIL0"
import { NTCG104ED104DT1X } from "./imports/NTCG104ED104DT1X"
import { PMH600UNEH } from "./imports/PMH600UNEH"
import { RC0201FR_07100RL } from "./imports/RC0201FR_07100RL"
import { RC0201FR_072M2L } from "./imports/RC0201FR_072M2L"
import { RC0201FR_07316RL } from "./imports/RC0201FR_07316RL"
import { RTT012493FTH } from "./imports/RTT012493FTH"
import { RTT012803FTH } from "./imports/RTT012803FTH"
import { VSKY02300603_G4_08 } from "./imports/VSKY02300603_G4_08"
import { W3008 } from "./imports/W3008"
import schematicLabels from "./source-data/schematic-net-labels.json"
import nativeRoutes from "./source-data/native-routed-paths.json"
import crystalPaths from "./source-data/crystal-paths.json"
import type { FanoutTracePath } from "@tscircuit/props"
import nets from "./source-data/adapted-netlist.json"
export default () => (
<board title="Open Ring — JLCPCB flex adaptation" material="flex" layers={4} thickness={0.22}
  outline={[{x:-55,y:9},{x:51,y:9},{x:51,y:-9},{x:30,y:-9},{x:30,y:-19},{x:18,y:-19},{x:18,y:-9},{x:1,y:-9},{x:1,y:-19},{x:-11,y:-19},{x:-11,y:-9},{x:-55,y:-9}]}
  minTraceWidth={0.075} minTraceToPadEdgeClearance={0.075} minPadEdgeToPadEdgeClearance={0.075}
  minViaHoleDiameter={0.1} minViaPadDiameter={0.2} minBoardEdgeClearance={0.25}
  allowBlindAndBuriedVias isViaInPadAllowed routeRemaining={false} autorouter={{local:true}} >
  <autoroutingphase name="remaining-nets" phaseIndex={0} pcbTracePaths={nativeRoutes as FanoutTracePath[]} />
  {nets.map(n => <Fragment key={n.name}><net name={n.name} routingPhaseIndex={["XTAL32N","XTAL32P"].includes(n.name) ? 1 : 0} /></Fragment>)}
  <autoroutingphase name="crystal-paths" phaseIndex={1} pcbTracePaths={crystalPaths as FanoutTracePath[]} />
  <schematicsheet name="Power" displayName="01 Power and charging" sheetIndex={0}>
    <schematicsection name="InductiveInput" />
    <schematictext text="Inductive input and rectifier" schX={-2} schY={5} anchor="top_left" fontSize={0.3} />
    <schematicsection name="PowerManagement" />
    <schematictext text="Battery charger and system supply" schX={-2} schY={-6.2} anchor="top_left" fontSize={0.3} />
    <schematicsection name="VoltageMonitoring" />
    <schematictext text="Input and haptic voltage monitors" schX={16} schY={-6.2} anchor="top_left" fontSize={0.3} />
    {schematicLabels.filter(label => label.sheet === "Power").map(label => <Fragment key={label.pin}><netlabel net={label.net} connection={label.pin} /></Fragment>)}
  </schematicsheet>
  <schematicsheet name="Radio" displayName="02 Bluetooth and RF" sheetIndex={1}>
    <schematicsection name="BleProcessor" />
    <schematictext text="BLE processor and clock" schX={-1} schY={6} anchor="top_left" fontSize={0.3} />
    <schematicsection name="SpiFlash" />
    <schematictext text="SPI flash" schX={6.5} schY={6} anchor="top_left" fontSize={0.3} />
    <schematicsection name="RfMatching" />
    <schematictext text="2.4 GHz matching network and antenna" schX={-1} schY={-6} anchor="top_left" fontSize={0.3} />
    {schematicLabels.filter(label => label.sheet === "Radio").map(label => <Fragment key={label.pin}><netlabel net={label.net} connection={label.pin} /></Fragment>)}
  </schematicsheet>
  <schematicsheet name="Touch" displayName="03 Touch and wear sensing" sheetIndex={2}>
    <schematicsection name="TouchController" />
    <schematictext text="SAM L10 touch controller and supplies" schX={-3} schY={7} anchor="top_left" fontSize={0.3} />
    <schematicsection name="TouchSlider" />
    <schematictext text="Mutual-capacitance slider electrodes" schX={-2} schY={-5.5} anchor="top_left" fontSize={0.3} />
    <schematicsection name="WearDetection" />
    <schematictext text="Finger-presence electrodes" schX={15} schY={-5.5} anchor="top_left" fontSize={0.3} />
    {schematicLabels.filter(label => label.sheet === "Touch").map(label => <Fragment key={label.pin}><netlabel net={label.net} connection={label.pin} /></Fragment>)}
  </schematicsheet>
  <schematicsheet name="Haptics" displayName="04 Haptic feedback" sheetIndex={3}>
    <schematicsection name="MotorDriver" />
    <schematictext text="Haptic motor driver" schX={-2} schY={5} anchor="top_left" fontSize={0.3} />
    <schematicsection name="EnergyReservoir" />
    <schematictext text="21 x 47 uF haptic energy reservoir" schX={-2} schY={-4} anchor="top_left" fontSize={0.3} />
    {schematicLabels.filter(label => label.sheet === "Haptics").map(label => <Fragment key={label.pin}><netlabel net={label.net} connection={label.pin} /></Fragment>)}
  </schematicsheet>
  <schematicsheet name="Programming" displayName="05 Programming and test" sheetIndex={4}>
    <schematicsection name="BleProgramming" />
    <schematictext text="DA14531 SWD programmer" schX={-2} schY={4} anchor="top_left" fontSize={0.3} />
    <schematicsection name="TouchProgramming" />
    <schematictext text="SAM L10 SWD programmer" schX={5} schY={4} anchor="top_left" fontSize={0.3} />
    <schematicsection name="SupplyTestPads" />
    <schematictext text="1.8 V and 1.1 V test pads" schX={-2} schY={-3} anchor="top_left" fontSize={0.3} />
    {schematicLabels.filter(label => label.sheet === "Programming").map(label => <Fragment key={label.pin}><netlabel net={label.net} connection={label.pin} /></Fragment>)}
  </schematicsheet>
  <MX25R4035FZUIL0 name="U3" pcbX={29} pcbY={0} schX={9} schY={0} schSectionName="SpiFlash" schSheetName="Radio" schRotation={0} schPinArrangement={{topSide:[8],bottomSide:[4,9],leftSide:[1,3,7],rightSide:[2,5,6]}} schWidth={1.6} schHeight={1.2} />
  <DA14531_00000FX2 name="U2" pcbX={24} pcbY={0} schX={2.5} schY={0} schSectionName="BleProcessor" schSheetName="Radio" schRotation={0} schWidth={2.34} schHeight={3.2} schPinStyle={{pin5:{marginRight:0.7}}} pcbRotation={180} schPinArrangement={{topSide:[5,7],bottomSide:[2,18,19,20,21,23],leftSide:[1,3,4,6,8,9,10,11],rightSide:[12,13,14,15,16,17,22,24]}} />
  <W3008 name="Y1" pcbX={40} pcbY={5} schX={11} schY={-8} schSectionName="RfMatching" schSheetName="Radio" schRotation={-90.0} schWidth={2.2} pinLabels={{pin1:["RF"],pin2:["GND_NEAR"],pin3:["GND_FAR"]}} footprint={<footprint><smtpad portHints={["pin1"]} shape="rect" pcbX={-1.6} pcbY={-0.475} width={0.8} height={0.65}/><smtpad portHints={["pin2"]} shape="rect" pcbX={-1.6} pcbY={0.475} width={0.8} height={0.65}/><smtpad portHints={["pin3"]} shape="rect" pcbX={1.6} pcbY={0} width={0.8} height={1.6}/></footprint>} />
  <BQ25125YFPR name="U1" pcbX={-27} pcbY={0} schX={5} schY={-11} schSectionName="PowerManagement" schSheetName="Power" schRotation={0} />
  <GRM155R61A106ME44D name="C4" pcbX={-27} pcbY={3} schX={1} schY={-8.5} schSectionName="PowerManagement" schSheetName="Power" schRotation={-90.0} />
  <GRM155R60J225ME15D name="C5" pcbX={21} pcbY={2} schX={5.4} schY={2.8} schSectionName="BleProcessor" schSheetName="Radio" schRotation={-90.0} />
  <GRM155R61A106ME44D name="C6" pcbX={20} pcbY={-5} schX={0.3} schY={3.8} schSectionName="BleProcessor" schSheetName="Radio" schRotation={-90.0} pcbRotation={180} />
  <GRM0335C1H1R8CA01D name="C11" pcbX={27} pcbY={7} schX={0} schY={-10} schSectionName="RfMatching" schSheetName="Radio" schRotation={90.0} />
  <GRM0335C1H1R8CA01D name="C12" pcbX={30} pcbY={7} schX={3.5} schY={-10} schSectionName="RfMatching" schSheetName="Radio" schRotation={90.0} pcbRotation={180} />
  <GRM0335C1H1R8CA01D name="C13" pcbX={33} pcbY={7} schX={6.5} schY={-10} schSectionName="RfMatching" schSheetName="Radio" schRotation={90.0} />
  <GRM0335C1H1R8CA01D name="C14" pcbX={36} pcbY={7} schX={9.5} schY={-10} schSectionName="RfMatching" schSheetName="Radio" schRotation={90.0} />
  <GRM0335C1H100JA01D name="C9" pcbX={31} pcbY={5} schX={5} schY={-8} schSectionName="RfMatching" schSheetName="Radio" schRotation={0} schOrientation="vertical" />
  <GRM155R60J225ME15D name="C16" pcbX={29} pcbY={3} schX={8.4} schY={2.8} schSectionName="SpiFlash" schSheetName="Radio" schRotation={-90.0} />
  <GRM033R60J104KE19D name="C15" pcbX={27} pcbY={-3} schX={6.9} schY={2.8} schSectionName="SpiFlash" schSheetName="Radio" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C25" pcbX={-52.0} pcbY={-6} schX={0.0} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C26" pcbX={-49.2} pcbY={-6} schX={1.35} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C27" pcbX={-46.4} pcbY={-6} schX={2.7} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C28" pcbX={-52.0} pcbY={-4} schX={4.050000000000001} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C30" pcbX={-46.4} pcbY={-4} schX={6.75} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C31" pcbX={-52.0} pcbY={-2} schX={8.100000000000001} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C32" pcbX={-49.2} pcbY={-2} schX={9.450000000000001} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C33" pcbX={-46.4} pcbY={-2} schX={10.8} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C34" pcbX={-52.0} pcbY={0} schX={12.15} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C35" pcbX={-49.2} pcbY={0} schX={13.5} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C36" pcbX={-46.4} pcbY={0} schX={14.850000000000001} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C37" pcbX={-52.0} pcbY={2} schX={16.200000000000003} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C41" pcbX={-49.2} pcbY={4} schX={21.6} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C38" pcbX={-49.2} pcbY={2} schX={17.55} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C42" pcbX={-46.4} pcbY={4} schX={22.950000000000003} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C39" pcbX={-46.4} pcbY={2} schX={18.900000000000002} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C43" pcbX={-52.0} pcbY={6} schX={24.3} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C40" pcbX={-52.0} pcbY={4} schX={20.25} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C44" pcbX={-49.2} pcbY={6} schX={25.650000000000002} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM188R60J476ME15D name="C29" pcbX={-49.2} pcbY={-4} schX={5.4} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <LQP03TN3N3B02D name="L2" pcbX={28} pcbY={5} schX={2} schY={-8} schSectionName="RfMatching" schSheetName="Radio" schRotation={0} />
  <LQP03TN3N3B02D name="L3" pcbX={34} pcbY={5} schX={8} schY={-8} schSectionName="RfMatching" schSheetName="Radio" schRotation={0} />
  <MLZ1608N2R2LT000 name="L1" pcbX={20} pcbY={0} schX={0.3} schY={2} schSectionName="BleProcessor" schSheetName="Radio" schRotation={90.0} />
  <RC0201FR_07316RL name="R17" pcbX={-36} pcbY={-4} schX={2} schY={1} schSectionName="MotorDriver" schSheetName="Haptics" schRotation={-90.0} />
  <RC0201FR_07316RL name="R16" pcbX={-38} pcbY={-4} schX={0} schY={1} schSectionName="MotorDriver" schSheetName="Haptics" schRotation={-90.0} />
  <PMH600UNEH name="Q1" pcbX={-40} pcbY={-4} schX={5} schY={-0.5} schSectionName="MotorDriver" schSheetName="Haptics" schRotation={0} />
  <ABM11W_32_0000MHZ_6_B1U_T3 name="X1" pcbX={24} pcbY={4} schX={1.0} schY={-3} schSectionName="BleProcessor" schSheetName="Radio" schRotation={0} loadCapacitance="6pF" />
  <MLZ1608N2R2LT000 name="L4" pcbX={-23} pcbY={0} schX={9} schY={-11} schSectionName="PowerManagement" schSheetName="Power" schRotation={90.0} />
  <GRM155R61A106ME44D name="C10" pcbX={-34} pcbY={4} schX={11} schY={-11} schSectionName="PowerManagement" schSheetName="Power" schRotation={-90.0} />
  <GRM155R60J225ME15D name="C17" pcbX={-30} pcbY={-3} schX={9} schY={-8.5} schSectionName="PowerManagement" schSheetName="Power" schRotation={90.0} pcbRotation={180} />
  <GRM155R60J225ME15D name="C3" pcbX={-30} pcbY={0} schX={11.5} schY={-1} schSectionName="InductiveInput" schSheetName="Power" schRotation={-90.0} />
  <RTT012803FTH name="R1" pcbX={-32} pcbY={-3} schX={0.3} schY={-11.5} schSectionName="PowerManagement" schSheetName="Power" schRotation={-90.0} pcbRotation={180} />
  <RC0201FR_072M2L name="R2" pcbX={-34} pcbY={-3} schX={0.3} schY={-14} schSectionName="PowerManagement" schSheetName="Power" schRotation={-90.0} pcbRotation={180} />
  <NTCG104ED104DT1X name="NTC1" pcbX={-32} pcbY={0} schX={2.5} schY={-14} schSectionName="PowerManagement" schSheetName="Power" schRotation={90.0} />
  <VSKY02300603_G4_08 name="D4" pcbX={-36} pcbY={1} schX={6.5} schY={2} schSectionName="InductiveInput" schSheetName="Power" schRotation={-90.0} pcbRotation={180} />
  <VSKY02300603_G4_08 name="D1" pcbX={-38} pcbY={1} schX={4} schY={2} schSectionName="InductiveInput" schSheetName="Power" schRotation={-90.0} />
  <GRM0335C1E101JA01D name="C7" pcbX={-38} pcbY={3} schX={1.5} schY={0} schSectionName="InductiveInput" schSheetName="Power" schRotation={0} schOrientation="vertical" />
  <GRM0335C1E101JA01D name="C8" pcbX={-40} pcbY={3} schX={3.5} schY={0} schSectionName="InductiveInput" schSheetName="Power" schRotation={0} schOrientation="vertical" />
  <BZX884B5V1L_HG3_08 name="D2" pcbX={-34} pcbY={1} schX={6.5} schY={-1} schSectionName="InductiveInput" schSheetName="Power" schRotation={-90.0} />
  <testpoint doNotPlace name="TP3" pcbX={6} pcbY={0} schX={0} schY={-5} schSectionName="SupplyTestPads" schSheetName="Programming" schRotation={0} padDiameter={0.8} />
  <testpoint doNotPlace name="TP4" pcbX={6} pcbY={-3} schX={7} schY={-5} schSectionName="SupplyTestPads" schSheetName="Programming" schRotation={0} padDiameter={0.8} />
  <GRM155R61A106ME44D name="C2" pcbX={-25} pcbY={-3} schX={10} schY={-1} schSectionName="InductiveInput" schSheetName="Power" schRotation={-90.0} />
  <GRM155R61A106ME44D name="C1" pcbX={-28} pcbY={-3} schX={8.5} schY={-1} schSectionName="InductiveInput" schSheetName="Power" schRotation={-90.0} />
  <GRM188R60J476ME15D name="C45" pcbX={-46.4} pcbY={6} schX={27.0} schY={-6} schSectionName="EnergyReservoir" schSheetName="Haptics" schRotation={90.0} />
  <GRM155R61A106ME44D name="C18" pcbX={-9} pcbY={4} schX={0} schY={3.5} schSectionName="TouchController" schSheetName="Touch" schRotation={-90.0} />
  <GRM033R60J104KE19D name="C19" pcbX={-9} pcbY={2} schX={1.5} schY={3.5} schSectionName="TouchController" schSheetName="Touch" schRotation={-90.0} />
  <GRM0335C1E101JA01D name="C20" pcbX={-9} pcbY={0} schX={3} schY={3.5} schSectionName="TouchController" schSheetName="Touch" schRotation={-90.0} />
  <RC0201FR_07100RL name="R3" pcbX={-11} pcbY={4} schX={1.5} schY={5.3} schSectionName="TouchController" schSheetName="Touch" schRotation={90} />
  <ATSAML10E16A_MUT name="U4" pcbX={-5} pcbY={0} schX={6} schY={0} schSectionName="TouchController" schSheetName="Touch" schRotation={0} />
  <CR0201FH1002G name="R12" pcbX={0} pcbY={3} schX={10} schY={-1} schSectionName="TouchController" schSheetName="Touch" schRotation={90.0} />
  <CR0201FH1002G name="R13" pcbX={0} pcbY={5} schX={12} schY={-1} schSectionName="TouchController" schSheetName="Touch" schRotation={90.0} />
  <GRM155R61A106ME44D name="C24" pcbX={-7} pcbY={-4} schX={12} schY={3.5} schSectionName="TouchController" schSheetName="Touch" schRotation={-90.0} />
  <GRM033R60J104KE19D name="C21" pcbX={-1} pcbY={-4} schX={7} schY={3.5} schSectionName="TouchController" schSheetName="Touch" schRotation={-90.0} />
  <GRM033R60J104KE19D name="C23" pcbX={-9} pcbY={-4} schX={10.5} schY={3.5} schSectionName="TouchController" schSheetName="Touch" schRotation={-90.0} />
  <GRM155R60J225ME15D name="C22" pcbX={-3} pcbY={-4} schX={8.5} schY={3.5} schSectionName="TouchController" schSheetName="Touch" schRotation={-90.0} />
  <RTT012493FTH name="R11" pcbX={-32} pcbY={-5} schX={24} schY={-12.2} schSectionName="VoltageMonitoring" schSheetName="Power" schRotation={90.0} />
  <CR0201FH1004G name="R9" pcbX={-32} pcbY={6} schX={24} schY={-10} schSectionName="VoltageMonitoring" schSheetName="Power" schRotation={90} pcbRotation={180} />
  <FTSH_105_01_L_DV_K_P_TR name="J1" pcbX={24} pcbY={-14} schX={0} schY={0} schSectionName="BleProgramming" schSheetName="Programming" schRotation={0} schPinArrangement={{topSide:[1],bottomSide:[3,5,9],leftSide:[2,4,6],rightSide:[7,8,10]}} schWidth={0.8} />
  <FTSH_105_01_L_DV_K_P_TR name="J2" pcbX={-5} pcbY={-14} schX={7} schY={0} schSectionName="TouchProgramming" schSheetName="Programming" schRotation={0} schPinArrangement={{topSide:[1],bottomSide:[3,5,9],leftSide:[2,4,6],rightSide:[7,8,10]}} schWidth={0.8} />
  <testpoint doNotPlace name="PAD5" pcbX={-43} pcbY={-7} schX={9} schY={2} schSectionName="MotorDriver" schSheetName="Haptics" schRotation={0} padDiameter={1.2} />
  <testpoint doNotPlace name="PAD6" pcbX={-40} pcbY={-7} schX={5} schY={2} schSectionName="MotorDriver" schSheetName="Haptics" schRotation={0} padDiameter={1.2} />
  <testpoint doNotPlace name="PAD3" pcbX={-41} pcbY={6} schX={-1} schY={0} schSectionName="InductiveInput" schSheetName="Power" schRotation={0} padDiameter={1.2} />
  <testpoint doNotPlace name="PAD4" pcbX={-38} pcbY={6} schX={-1} schY={-2.5} schSectionName="InductiveInput" schSheetName="Power" schRotation={0} padDiameter={1.2} />
  <testpoint doNotPlace name="PAD1" pcbX={-30} pcbY={-7} schX={11} schY={-8.5} schSectionName="PowerManagement" schSheetName="Power" schRotation={0} padDiameter={1.2} />
  <testpoint doNotPlace name="PAD2" pcbX={-27} pcbY={-7} schX={11} schY={-13.5} schSectionName="PowerManagement" schSheetName="Power" schRotation={0} padDiameter={1.2} />
  <CR0201FH1004G name="R8" pcbX={-35} pcbY={6} schX={19} schY={-10} schSectionName="VoltageMonitoring" schSheetName="Power" schRotation={90} />
  <CR0201FH1003G name="R10" pcbX={-35} pcbY={-5} schX={19} schY={-12.2} schSectionName="VoltageMonitoring" schSheetName="Power" schRotation={90.0} pcbRotation={180} />
  <chip doNotPlace name="E1" pcbX={6} pcbY={5} schX={1} schY={-8} schSectionName="TouchSlider" schSheetName="Touch" pinLabels={{pin1:["TOUCH_SLIDER_RX2"]}} footprint={<footprint><smtpad portHints={["pin1"]} shape="rect" width={2.8} height={2} coveredWithSolderMask noSolderPaste /></footprint>} />
  <chip doNotPlace name="E2" pcbX={10} pcbY={5} schX={5.5} schY={-8} schSectionName="TouchSlider" schSheetName="Touch" pinLabels={{pin1:["TOUCH_SLIDER_RX1"]}} footprint={<footprint><smtpad portHints={["pin1"]} shape="rect" width={2.8} height={2} coveredWithSolderMask noSolderPaste /></footprint>} />
  <chip doNotPlace name="E3" pcbX={14} pcbY={5} schX={10} schY={-8} schSectionName="TouchSlider" schSheetName="Touch" pinLabels={{pin1:["TOUCH_SLIDER_RX0"]}} footprint={<footprint><smtpad portHints={["pin1"]} shape="rect" width={2.8} height={2} coveredWithSolderMask noSolderPaste /></footprint>} />
  <chip doNotPlace name="E4" pcbX={6} pcbY={-5} schX={5.5} schY={-11} schSectionName="TouchSlider" schSheetName="Touch" pinLabels={{pin1:["TOUCH_SLIDER_TX0"]}} footprint={<footprint><smtpad portHints={["pin1"]} shape="rect" width={2.8} height={2} coveredWithSolderMask noSolderPaste /></footprint>} />
  <chip doNotPlace name="E5" pcbX={10} pcbY={-5} schX={17} schY={-8} schSectionName="WearDetection" schSheetName="Touch" pinLabels={{pin1:["TOUCH_FINGER_RX"]}} footprint={<footprint><smtpad portHints={["pin1"]} shape="rect" width={2.8} height={2} coveredWithSolderMask noSolderPaste /></footprint>} />
  <chip doNotPlace name="E6" pcbX={14} pcbY={-5} schX={22} schY={-8} schSectionName="WearDetection" schSheetName="Touch" pinLabels={{pin1:["TOUCH_FINGER_TX"]}} footprint={<footprint><smtpad portHints={["pin1"]} shape="rect" width={2.8} height={2} coveredWithSolderMask noSolderPaste /></footprint>} />
  <keepout shape="rect" pcbX={40} pcbY={5} width={6.25} height={4} layers={["inner1","inner2","bottom"]} />
  <keepout shape="rect" pcbX={40} pcbY={5} width={2.35} height={4.25} layers={["top"]} />
  {nets.filter(net => net.pins.length > 1).flatMap(net => net.pins.map((pin, i) => <trace key={`${net.name}_${i}`} name={`${net.name}_${i}`} from={pin} to={"net." + net.name} schDisplayLabel={net.name} />))}
</board>
)