From d072c24a9ef929e57c19cd0e09bdea5a51d64a8d Mon Sep 17 00:00:00 2001 From: ankan roy Date: Wed, 5 Aug 2026 16:18:34 +0530 Subject: [PATCH 1/2] Clarify differential pair ambiguity warning --- ...ialPair_doInitialSourceDesignRuleChecks.ts | 46 ++++--------------- ...-selector-multiple-traces-warning.test.tsx | 2 +- ...int-to-point-warning-circuit-json.test.tsx | 2 +- ...o-terminal-point-to-point-warning.test.tsx | 2 +- 4 files changed, 12 insertions(+), 40 deletions(-) diff --git a/lib/components/primitive-components/DifferentialPair_doInitialSourceDesignRuleChecks.ts b/lib/components/primitive-components/DifferentialPair_doInitialSourceDesignRuleChecks.ts index fbb896234..ac63c01dd 100644 --- a/lib/components/primitive-components/DifferentialPair_doInitialSourceDesignRuleChecks.ts +++ b/lib/components/primitive-components/DifferentialPair_doInitialSourceDesignRuleChecks.ts @@ -7,7 +7,7 @@ type SourceComponentId = NonNullable type ResolvedPointToPointConnection = { sourcePorts: SourcePort[] - sourceNetName?: string + referenceKind: "trace" | "selector" } const resolvePointToPointConnection = ( @@ -54,16 +54,10 @@ const resolvePointToPointConnection = ( (sourcePort) => sourcePort.subcircuit_connectivity_map_key === connectivityMapKey, ) - const sourceNet = db.source_net - .list() - .find( - (sourceNet) => - sourceNet.subcircuit_connectivity_map_key === connectivityMapKey, - ) return { sourcePorts, - sourceNetName: sourceNet?.name, + referenceKind: matchingSourceTraces.length > 0 ? "trace" : "selector", } } @@ -94,44 +88,22 @@ const getPointToPointWarningMessage = ({ differentialPairName, connectionPolarity, connectionSelector, - sourceNetName, + referenceKind, terminalPinSelectors, }: { differentialPairName: string connectionPolarity: ConnectionPolarity connectionSelector: string - sourceNetName?: string + referenceKind: ResolvedPointToPointConnection["referenceKind"] terminalPinSelectors: string[] }): string => { - let resolvedConnectionName = `"${connectionSelector}"` - if (sourceNetName) { - resolvedConnectionName = `net.${sourceNetName}` - } const terminalCount = terminalPinSelectors.length - let pinOrPins = "pins" - if (terminalCount === 1) { - pinOrPins = "pin" - } + const pinOrPins = terminalCount === 1 ? "terminal pin" : "terminal pins" const terminalList = formatTerminalPinList(terminalPinSelectors) - const suggestedSelector = terminalPinSelectors[0] - let correction = "Connect exactly two terminal pins" - if (terminalCount > 2) { - correction = "Remove the extra connection" - } - let selectorRecommendation = "" - if (suggestedSelector) { - selectorRecommendation = ` and prefer a pin selector such as ${connectionPolarity}Connection="${suggestedSelector}"` - } - let terminalListDescription = "" - if (terminalList) { - terminalListDescription = `: ${terminalList}` - } + const terminalListDescription = terminalList ? `: ${terminalList}` : "" + const problem = terminalCount > 2 ? "ambiguous" : "not point-to-point" - return ( - `Differential pair "${differentialPairName}" ${connectionPolarity}Connection resolves to ${resolvedConnectionName}, which is not point-to-point. ` + - `It connects to ${terminalCount} ${pinOrPins}${terminalListDescription}. ` + - `${correction}${selectorRecommendation}.` - ) + return `Differential pair "${differentialPairName}" ${connectionPolarity}Connection references ${referenceKind} "${connectionSelector}", which is ${problem} because it connects to ${terminalCount} ${pinOrPins}${terminalListDescription}.` } export const DifferentialPair_doInitialSourceDesignRuleChecks = ( @@ -184,7 +156,7 @@ export const DifferentialPair_doInitialSourceDesignRuleChecks = ( differentialPairName: differentialPair.name, connectionPolarity, connectionSelector, - sourceNetName: resolvedConnection.sourceNetName, + referenceKind: resolvedConnection.referenceKind, terminalPinSelectors, }), subcircuit_id: diff --git a/tests/components/primitive-components/differential-pair/failure-tests/port-selector-multiple-traces-warning.test.tsx b/tests/components/primitive-components/differential-pair/failure-tests/port-selector-multiple-traces-warning.test.tsx index 6bdc92b3b..fcd89ad83 100644 --- a/tests/components/primitive-components/differential-pair/failure-tests/port-selector-multiple-traces-warning.test.tsx +++ b/tests/components/primitive-components/differential-pair/failure-tests/port-selector-multiple-traces-warning.test.tsx @@ -40,6 +40,6 @@ test("stores a warning when a differential pair port selector matches multiple t property_name: "positiveConnection", }) expect(pointToPointWarning?.message).toContain( - 'positiveConnection resolves to ".R1 > .pin1", which is not point-to-point', + 'positiveConnection references selector ".R1 > .pin1", which is ambiguous because it connects to 3 terminal pins', ) }) diff --git a/tests/components/primitive-components/differential-pair/point-to-point-warning-circuit-json.test.tsx b/tests/components/primitive-components/differential-pair/point-to-point-warning-circuit-json.test.tsx index e556a8113..3e86d250a 100644 --- a/tests/components/primitive-components/differential-pair/point-to-point-warning-circuit-json.test.tsx +++ b/tests/components/primitive-components/differential-pair/point-to-point-warning-circuit-json.test.tsx @@ -32,6 +32,6 @@ test("stores a property warning for a branched differential pair", (): void => { }) expect(pointToPointWarnings[0]?.source_component_id).toBeDefined() expect(pointToPointWarnings[0]?.message).toBe( - 'Differential pair "USB_DATA" positiveConnection resolves to net.DP, which is not point-to-point. It connects to 3 pins: .J1 > .pin1, .TP1 > .pin1, and .U1 > .pin1. Remove the extra connection and prefer a pin selector such as positiveConnection=".J1 > .pin1".', + 'Differential pair "USB_DATA" positiveConnection references trace "DP_FROM_J1", which is ambiguous because it connects to 3 terminal pins: .J1 > .pin1, .TP1 > .pin1, and .U1 > .pin1.', ) }) diff --git a/tests/components/primitive-components/differential-pair/zero-terminal-point-to-point-warning.test.tsx b/tests/components/primitive-components/differential-pair/zero-terminal-point-to-point-warning.test.tsx index b2e260018..6002fa601 100644 --- a/tests/components/primitive-components/differential-pair/zero-terminal-point-to-point-warning.test.tsx +++ b/tests/components/primitive-components/differential-pair/zero-terminal-point-to-point-warning.test.tsx @@ -30,6 +30,6 @@ test("stores a warning for a differential-pair connection with no terminal pins" property_name: "positiveConnection", }) expect(warning?.message).toBe( - 'Differential pair "USB_DATA" positiveConnection resolves to net.DP, which is not point-to-point. It connects to 0 pins. Connect exactly two terminal pins.', + 'Differential pair "USB_DATA" positiveConnection references trace "DP_EMPTY", which is not point-to-point because it connects to 0 terminal pins.', ) }) From f78b9527366df46f53ceb55648345d0ba19cad44 Mon Sep 17 00:00:00 2001 From: ankan roy Date: Wed, 5 Aug 2026 16:32:37 +0530 Subject: [PATCH 2/2] Simplify differential pair diagnostics --- ...ialPair_doInitialSourceDesignRuleChecks.ts | 21 ++++++++++--------- ...-selector-multiple-traces-warning.test.tsx | 6 +++++- ...int-to-point-warning-circuit-json.test.tsx | 2 +- ...o-terminal-point-to-point-warning.test.tsx | 2 +- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/components/primitive-components/DifferentialPair_doInitialSourceDesignRuleChecks.ts b/lib/components/primitive-components/DifferentialPair_doInitialSourceDesignRuleChecks.ts index ac63c01dd..060576740 100644 --- a/lib/components/primitive-components/DifferentialPair_doInitialSourceDesignRuleChecks.ts +++ b/lib/components/primitive-components/DifferentialPair_doInitialSourceDesignRuleChecks.ts @@ -7,7 +7,7 @@ type SourceComponentId = NonNullable type ResolvedPointToPointConnection = { sourcePorts: SourcePort[] - referenceKind: "trace" | "selector" + sourceTraceName?: string } const resolvePointToPointConnection = ( @@ -54,10 +54,10 @@ const resolvePointToPointConnection = ( (sourcePort) => sourcePort.subcircuit_connectivity_map_key === connectivityMapKey, ) - return { sourcePorts, - referenceKind: matchingSourceTraces.length > 0 ? "trace" : "selector", + sourceTraceName: + matchingSourceTraces.length > 0 ? connectionSelector : undefined, } } @@ -88,22 +88,23 @@ const getPointToPointWarningMessage = ({ differentialPairName, connectionPolarity, connectionSelector, - referenceKind, + sourceTraceName, terminalPinSelectors, }: { differentialPairName: string connectionPolarity: ConnectionPolarity connectionSelector: string - referenceKind: ResolvedPointToPointConnection["referenceKind"] + sourceTraceName?: string terminalPinSelectors: string[] }): string => { - const terminalCount = terminalPinSelectors.length - const pinOrPins = terminalCount === 1 ? "terminal pin" : "terminal pins" const terminalList = formatTerminalPinList(terminalPinSelectors) const terminalListDescription = terminalList ? `: ${terminalList}` : "" - const problem = terminalCount > 2 ? "ambiguous" : "not point-to-point" - return `Differential pair "${differentialPairName}" ${connectionPolarity}Connection references ${referenceKind} "${connectionSelector}", which is ${problem} because it connects to ${terminalCount} ${pinOrPins}${terminalListDescription}.` + if (sourceTraceName && terminalPinSelectors.length > 2) { + return `Differential pair "${differentialPairName}" ${connectionPolarity}Connection uses the ambiguous trace name "${sourceTraceName}": its connection has more than 2 terminal pins${terminalListDescription}.` + } + + return `Differential pair "${differentialPairName}" ${connectionPolarity}Connection="${connectionSelector}" is not point-to-point: expected exactly 2 terminal pins, found ${terminalPinSelectors.length}${terminalListDescription}.` } export const DifferentialPair_doInitialSourceDesignRuleChecks = ( @@ -156,7 +157,7 @@ export const DifferentialPair_doInitialSourceDesignRuleChecks = ( differentialPairName: differentialPair.name, connectionPolarity, connectionSelector, - referenceKind: resolvedConnection.referenceKind, + sourceTraceName: resolvedConnection.sourceTraceName, terminalPinSelectors, }), subcircuit_id: diff --git a/tests/components/primitive-components/differential-pair/failure-tests/port-selector-multiple-traces-warning.test.tsx b/tests/components/primitive-components/differential-pair/failure-tests/port-selector-multiple-traces-warning.test.tsx index fcd89ad83..bea6de7f8 100644 --- a/tests/components/primitive-components/differential-pair/failure-tests/port-selector-multiple-traces-warning.test.tsx +++ b/tests/components/primitive-components/differential-pair/failure-tests/port-selector-multiple-traces-warning.test.tsx @@ -40,6 +40,10 @@ test("stores a warning when a differential pair port selector matches multiple t property_name: "positiveConnection", }) expect(pointToPointWarning?.message).toContain( - 'positiveConnection references selector ".R1 > .pin1", which is ambiguous because it connects to 3 terminal pins', + 'positiveConnection=".R1 > .pin1" is not point-to-point: expected exactly 2 terminal pins, found 3', ) + expect(pointToPointWarning?.message).not.toContain( + "Remove the extra connection", + ) + expect(pointToPointWarning?.message).not.toContain("prefer a pin selector") }) diff --git a/tests/components/primitive-components/differential-pair/point-to-point-warning-circuit-json.test.tsx b/tests/components/primitive-components/differential-pair/point-to-point-warning-circuit-json.test.tsx index 3e86d250a..ead649515 100644 --- a/tests/components/primitive-components/differential-pair/point-to-point-warning-circuit-json.test.tsx +++ b/tests/components/primitive-components/differential-pair/point-to-point-warning-circuit-json.test.tsx @@ -32,6 +32,6 @@ test("stores a property warning for a branched differential pair", (): void => { }) expect(pointToPointWarnings[0]?.source_component_id).toBeDefined() expect(pointToPointWarnings[0]?.message).toBe( - 'Differential pair "USB_DATA" positiveConnection references trace "DP_FROM_J1", which is ambiguous because it connects to 3 terminal pins: .J1 > .pin1, .TP1 > .pin1, and .U1 > .pin1.', + 'Differential pair "USB_DATA" positiveConnection uses the ambiguous trace name "DP_FROM_J1": its connection has more than 2 terminal pins: .J1 > .pin1, .TP1 > .pin1, and .U1 > .pin1.', ) }) diff --git a/tests/components/primitive-components/differential-pair/zero-terminal-point-to-point-warning.test.tsx b/tests/components/primitive-components/differential-pair/zero-terminal-point-to-point-warning.test.tsx index 6002fa601..9ff717230 100644 --- a/tests/components/primitive-components/differential-pair/zero-terminal-point-to-point-warning.test.tsx +++ b/tests/components/primitive-components/differential-pair/zero-terminal-point-to-point-warning.test.tsx @@ -30,6 +30,6 @@ test("stores a warning for a differential-pair connection with no terminal pins" property_name: "positiveConnection", }) expect(warning?.message).toBe( - 'Differential pair "USB_DATA" positiveConnection references trace "DP_EMPTY", which is not point-to-point because it connects to 0 terminal pins.', + 'Differential pair "USB_DATA" positiveConnection="DP_EMPTY" is not point-to-point: expected exactly 2 terminal pins, found 0.', ) })