From 5c6bf6f54c58e7f3ae6585df9d1480009c482ddb Mon Sep 17 00:00:00 2001 From: Severin Ibarluzea Date: Fri, 20 Feb 2026 20:59:17 -0800 Subject: [PATCH] Add pin capabilities fields to pin attribute map --- generated/COMPONENT_TYPES.md | 93 ++++++++++++++++++++++++++------- generated/PROPS_OVERVIEW.md | 41 +++++++++++---- lib/common/layout.ts | 85 ++++++++++++++++++++++++------ tests/chip3-type-tests.test.tsx | 4 +- tests/pinAttributes2.test.ts | 22 ++++++-- 5 files changed, 194 insertions(+), 51 deletions(-) diff --git a/generated/COMPONENT_TYPES.md b/generated/COMPONENT_TYPES.md index 1cfbf3a..6343b26 100644 --- a/generated/COMPONENT_TYPES.md +++ b/generated/COMPONENT_TYPES.md @@ -507,6 +507,35 @@ export const supplierProps = z.object({ supplierPartNumbers: z.record(supplier_name, z.array(z.string())).optional(), }) export interface PinAttributeMap { + capabilities?: Array< + | "i2c_sda" + | "i2c_scl" + | "spi_cs" + | "spi_sck" + | "spi_mosi" + | "spi_miso" + | "uart_tx" + | "uart_rx" + > + activeCapabilities?: Array< + | "i2c_sda" + | "i2c_scl" + | "spi_cs" + | "spi_sck" + | "spi_mosi" + | "spi_miso" + | "uart_tx" + | "uart_rx" + > + activeCapability?: + | "i2c_sda" + | "i2c_scl" + | "spi_cs" + | "spi_sck" + | "spi_mosi" + | "spi_miso" + | "uart_tx" + | "uart_rx" providesPower?: boolean requiresPower?: boolean providesGround?: boolean @@ -517,14 +546,6 @@ export interface PinAttributeMap { includeInBoardPinout?: boolean highlightColor?: string mustBeConnected?: boolean - isI2cSda?: boolean - isI2cScl?: boolean - isSpiMosi?: boolean - isSpiMiso?: boolean - isSpiSck?: boolean - isSpiCs?: boolean - isUartTx?: boolean - isUartRx?: boolean canUseInternalPullup?: boolean isUsingInternalPullup?: boolean needsExternalPullup?: boolean @@ -537,6 +558,46 @@ export interface PinAttributeMap { isUsingPushPull?: boolean } export const pinAttributeMap = z.object({ + capabilities: z + .array( + z.enum([ + "i2c_sda", + "i2c_scl", + "spi_cs", + "spi_sck", + "spi_mosi", + "spi_miso", + "uart_tx", + "uart_rx", + ]), + ) + .optional(), + activeCapabilities: z + .array( + z.enum([ + "i2c_sda", + "i2c_scl", + "spi_cs", + "spi_sck", + "spi_mosi", + "spi_miso", + "uart_tx", + "uart_rx", + ]), + ) + .optional(), + activeCapability: z + .enum([ + "i2c_sda", + "i2c_scl", + "spi_cs", + "spi_sck", + "spi_mosi", + "spi_miso", + "uart_tx", + "uart_rx", + ]) + .optional(), providesPower: z.boolean().optional(), requiresPower: z.boolean().optional(), providesGround: z.boolean().optional(), @@ -547,14 +608,6 @@ export const pinAttributeMap = z.object({ includeInBoardPinout: z.boolean().optional(), highlightColor: z.string().optional(), mustBeConnected: z.boolean().optional(), - isI2cSda: z.boolean().optional(), - isI2cScl: z.boolean().optional(), - isSpiMosi: z.boolean().optional(), - isSpiMiso: z.boolean().optional(), - isSpiSck: z.boolean().optional(), - isSpiCs: z.boolean().optional(), - isUartTx: z.boolean().optional(), - isUartRx: z.boolean().optional(), canUseInternalPullup: z.boolean().optional(), isUsingInternalPullup: z.boolean().optional(), needsExternalPullup: z.boolean().optional(), @@ -2866,7 +2919,7 @@ export interface PillPlatedHoleProps extends Omit { } /** @deprecated use holeHeight */ export interface CircularHoleWithRectPlatedProps - extends Omit { + extends Omit { name?: string connectsTo?: string | string[] shape: "circular_hole_with_rect_pad" @@ -2883,7 +2936,7 @@ export interface CircularHoleWithRectPlatedProps coveredWithSolderMask?: boolean } export interface PillWithRectPadPlatedHoleProps - extends Omit { + extends Omit { name?: string connectsTo?: string | string[] shape: "pill_hole_with_rect_pad" @@ -2971,7 +3024,7 @@ pcbLayoutProps.omit({ layer: true }).extend({ solderMaskMargin: distance.optional(), coveredWithSolderMask: z.boolean().optional(), }), -pcbLayoutProps.omit({ pcbRotation: true, layer: true }).extend({ +pcbLayoutProps.omit({ layer: true }).extend({ name: z.string().optional(), connectsTo: z.string().or(z.array(z.string())).optional(), shape: z.literal("circular_hole_with_rect_pad"), @@ -2987,7 +3040,7 @@ pcbLayoutProps.omit({ pcbRotation: true, layer: true }).extend({ solderMaskMargin: distance.optional(), coveredWithSolderMask: z.boolean().optional(), }), -pcbLayoutProps.omit({ pcbRotation: true, layer: true }).extend({ +pcbLayoutProps.omit({ layer: true }).extend({ name: z.string().optional(), connectsTo: z.string().or(z.array(z.string())).optional(), shape: z.literal("pill_hole_with_rect_pad"), diff --git a/generated/PROPS_OVERVIEW.md b/generated/PROPS_OVERVIEW.md index 68b160b..82d3c22 100644 --- a/generated/PROPS_OVERVIEW.md +++ b/generated/PROPS_OVERVIEW.md @@ -446,7 +446,7 @@ export interface CircleSolderPasteProps export interface CircularHoleWithRectPlatedProps - extends Omit { + extends Omit { name?: string connectsTo?: string | string[] shape: "circular_hole_with_rect_pad" @@ -1406,7 +1406,7 @@ export interface PillSmtPadProps extends Omit { export interface PillWithRectPadPlatedHoleProps - extends Omit { + extends Omit { name?: string connectsTo?: string | string[] shape: "pill_hole_with_rect_pad" @@ -1425,6 +1425,35 @@ export interface PillWithRectPadPlatedHoleProps export interface PinAttributeMap { + capabilities?: Array< + | "i2c_sda" + | "i2c_scl" + | "spi_cs" + | "spi_sck" + | "spi_mosi" + | "spi_miso" + | "uart_tx" + | "uart_rx" + > + activeCapabilities?: Array< + | "i2c_sda" + | "i2c_scl" + | "spi_cs" + | "spi_sck" + | "spi_mosi" + | "spi_miso" + | "uart_tx" + | "uart_rx" + > + activeCapability?: + | "i2c_sda" + | "i2c_scl" + | "spi_cs" + | "spi_sck" + | "spi_mosi" + | "spi_miso" + | "uart_tx" + | "uart_rx" providesPower?: boolean requiresPower?: boolean providesGround?: boolean @@ -1435,14 +1464,6 @@ export interface PinAttributeMap { includeInBoardPinout?: boolean highlightColor?: string mustBeConnected?: boolean - isI2cSda?: boolean - isI2cScl?: boolean - isSpiMosi?: boolean - isSpiMiso?: boolean - isSpiSck?: boolean - isSpiCs?: boolean - isUartTx?: boolean - isUartRx?: boolean canUseInternalPullup?: boolean isUsingInternalPullup?: boolean needsExternalPullup?: boolean diff --git a/lib/common/layout.ts b/lib/common/layout.ts index 1e99be9..de21451 100644 --- a/lib/common/layout.ts +++ b/lib/common/layout.ts @@ -226,6 +226,35 @@ export const supplierProps = z.object({ expectTypesMatch>(true) export interface PinAttributeMap { + capabilities?: Array< + | "i2c_sda" + | "i2c_scl" + | "spi_cs" + | "spi_sck" + | "spi_mosi" + | "spi_miso" + | "uart_tx" + | "uart_rx" + > + activeCapabilities?: Array< + | "i2c_sda" + | "i2c_scl" + | "spi_cs" + | "spi_sck" + | "spi_mosi" + | "spi_miso" + | "uart_tx" + | "uart_rx" + > + activeCapability?: + | "i2c_sda" + | "i2c_scl" + | "spi_cs" + | "spi_sck" + | "spi_mosi" + | "spi_miso" + | "uart_tx" + | "uart_rx" providesPower?: boolean requiresPower?: boolean providesGround?: boolean @@ -236,14 +265,6 @@ export interface PinAttributeMap { includeInBoardPinout?: boolean highlightColor?: string mustBeConnected?: boolean - isI2cSda?: boolean - isI2cScl?: boolean - isSpiMosi?: boolean - isSpiMiso?: boolean - isSpiSck?: boolean - isSpiCs?: boolean - isUartTx?: boolean - isUartRx?: boolean canUseInternalPullup?: boolean isUsingInternalPullup?: boolean needsExternalPullup?: boolean @@ -257,6 +278,46 @@ export interface PinAttributeMap { } export const pinAttributeMap = z.object({ + capabilities: z + .array( + z.enum([ + "i2c_sda", + "i2c_scl", + "spi_cs", + "spi_sck", + "spi_mosi", + "spi_miso", + "uart_tx", + "uart_rx", + ]), + ) + .optional(), + activeCapabilities: z + .array( + z.enum([ + "i2c_sda", + "i2c_scl", + "spi_cs", + "spi_sck", + "spi_mosi", + "spi_miso", + "uart_tx", + "uart_rx", + ]), + ) + .optional(), + activeCapability: z + .enum([ + "i2c_sda", + "i2c_scl", + "spi_cs", + "spi_sck", + "spi_mosi", + "spi_miso", + "uart_tx", + "uart_rx", + ]) + .optional(), providesPower: z.boolean().optional(), requiresPower: z.boolean().optional(), providesGround: z.boolean().optional(), @@ -267,14 +328,6 @@ export const pinAttributeMap = z.object({ includeInBoardPinout: z.boolean().optional(), highlightColor: z.string().optional(), mustBeConnected: z.boolean().optional(), - isI2cSda: z.boolean().optional(), - isI2cScl: z.boolean().optional(), - isSpiMosi: z.boolean().optional(), - isSpiMiso: z.boolean().optional(), - isSpiSck: z.boolean().optional(), - isSpiCs: z.boolean().optional(), - isUartTx: z.boolean().optional(), - isUartRx: z.boolean().optional(), canUseInternalPullup: z.boolean().optional(), isUsingInternalPullup: z.boolean().optional(), needsExternalPullup: z.boolean().optional(), diff --git a/tests/chip3-type-tests.test.tsx b/tests/chip3-type-tests.test.tsx index 3ae89fb..d1a632e 100644 --- a/tests/chip3-type-tests.test.tsx +++ b/tests/chip3-type-tests.test.tsx @@ -152,7 +152,9 @@ test("[typetest] pinAttributes type matches pin labels", () => { doNotConnect: true, includeInBoardPinout: true, highlightColor: "#00ff00", - isI2cScl: true, + capabilities: ["i2c_scl", "i2c_sda"], + activeCapabilities: ["i2c_scl"], + activeCapability: "i2c_scl", canUseInternalPullup: true, isUsingInternalPullup: true, canUseOpenDrain: true, diff --git a/tests/pinAttributes2.test.ts b/tests/pinAttributes2.test.ts index ff0151a..9740f69 100644 --- a/tests/pinAttributes2.test.ts +++ b/tests/pinAttributes2.test.ts @@ -7,7 +7,9 @@ test("pinAttributes allows mustBeConnected", () => { pinAttributes: { pin1: { mustBeConnected: true, - isI2cSda: true, + capabilities: ["i2c_sda", "i2c_scl"], + activeCapabilities: ["i2c_sda"], + activeCapability: "i2c_sda", canUseInternalPullup: true, isUsingInternalPullup: true, canUseOpenDrain: true, @@ -15,7 +17,8 @@ test("pinAttributes allows mustBeConnected", () => { }, pin2: { mustBeConnected: false, - isSpiMiso: true, + capabilities: ["spi_miso", "spi_mosi", "spi_sck", "spi_cs"], + activeCapability: "spi_miso", canUseInternalPulldown: true, needsExternalPulldown: true, canUsePushPull: true, @@ -27,12 +30,23 @@ test("pinAttributes allows mustBeConnected", () => { const parsed = chipProps.parse(rawProps) expect(parsed.pinAttributes?.pin1?.mustBeConnected).toBe(true) expect(parsed.pinAttributes?.pin2?.mustBeConnected).toBe(false) - expect(parsed.pinAttributes?.pin1?.isI2cSda).toBe(true) + expect(parsed.pinAttributes?.pin1?.capabilities).toEqual([ + "i2c_sda", + "i2c_scl", + ]) + expect(parsed.pinAttributes?.pin1?.activeCapabilities).toEqual(["i2c_sda"]) + expect(parsed.pinAttributes?.pin1?.activeCapability).toBe("i2c_sda") expect(parsed.pinAttributes?.pin1?.canUseInternalPullup).toBe(true) expect(parsed.pinAttributes?.pin1?.isUsingInternalPullup).toBe(true) expect(parsed.pinAttributes?.pin1?.canUseOpenDrain).toBe(true) expect(parsed.pinAttributes?.pin1?.isUsingOpenDrain).toBe(true) - expect(parsed.pinAttributes?.pin2?.isSpiMiso).toBe(true) + expect(parsed.pinAttributes?.pin2?.capabilities).toEqual([ + "spi_miso", + "spi_mosi", + "spi_sck", + "spi_cs", + ]) + expect(parsed.pinAttributes?.pin2?.activeCapability).toBe("spi_miso") expect(parsed.pinAttributes?.pin2?.canUseInternalPulldown).toBe(true) expect(parsed.pinAttributes?.pin2?.needsExternalPulldown).toBe(true) expect(parsed.pinAttributes?.pin2?.canUsePushPull).toBe(true)