Skip to content

feat: merge close same-net trace segments#337

Open
ArtemisMoysen wants to merge 1 commit into
tscircuit:mainfrom
ArtemisMoysen:feature/same-net-trace-merge
Open

feat: merge close same-net trace segments#337
ArtemisMoysen wants to merge 1 commit into
tscircuit:mainfrom
ArtemisMoysen:feature/same-net-trace-merge

Conversation

@ArtemisMoysen
Copy link
Copy Markdown

Issue

Closes #29

/claim #29

Summary

  • Adds SameNetTraceMergeSolver after trace cleanup to merge close overlapping same-net orthogonal trace segments onto a shared axis.
  • Leaves different-net traces and same-net traces outside the merge threshold untouched.
  • Adds a Cosmos debug page for SameNetTraceMergeSolver01.

Verification

  • npx bun test
  • npx biome format .
  • npx -y -p typescript@5 tsc --noEmit
  • git diff --check

Copilot AI review requested due to automatic review settings May 14, 2026 13:25
@vercel
Copy link
Copy Markdown

vercel Bot commented May 14, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
schematic-trace-solver Ready Ready Preview, Comment May 14, 2026 1:25pm

Request Review

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new pipeline phase to merge close, overlapping same-net orthogonal trace segments onto a shared axis (after trace cleanup), with accompanying tests and a Cosmos debug page to visualize behavior.

Changes:

  • Introduces SameNetTraceMergeSolver + mergeSameNetTraceSegments to align nearby same-net parallel segments.
  • Inserts the new solver into SchematicTracePipelineSolver after TraceCleanupSolver and feeds merged traces into downstream phases.
  • Adds Bun tests and a Cosmos debugger page for the new solver.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
lib/solvers/SameNetTraceMergeSolver/SameNetTraceMergeSolver.ts Implements segment detection, component grouping, and coordinate alignment + visualization.
lib/solvers/SchematicTracePipelineSolver/SchematicTracePipelineSolver.ts Wires the new merge solver into the pipeline and uses its traces downstream.
tests/functions/merge-same-net-trace-segments.test.ts Adds unit tests for merge behavior and solver output.
site/SameNetTraceMergeSolver/SameNetTraceMergeSolver01.page.tsx Adds a Cosmos debug page to inspect merging results interactively.
Comments suppressed due to low confidence (1)

tests/functions/merge-same-net-trace-segments.test.ts:72

  • Same as above: toBe(1.3) on a computed float can be flaky. Use toBeCloseTo for coordinate assertions.
  const result = mergeSameNetTraceSegments([traceA, traceB])

  expect(result.mergeCount).toBe(0)
  expect(getMiddleSegmentY(result.traces[0]!)).toBe(1)
  expect(getMiddleSegmentY(result.traces[1]!)).toBe(1.3)
})

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +228 to +240
for (const component of components) {
const targetCoord =
component.reduce((sum, segment) => sum + segment.constantCoord, 0) /
component.length

for (const segment of component) {
moveSegmentToCoord(
outputTraces[segment.traceIndex]!.tracePath,
segment.segmentIndex,
segment.axis,
targetCoord,
)
}
Comment on lines +151 to +186
const getMergeComponents = (
segments: TraceSegment[],
mergeDistance: number,
minOverlap: number,
) => {
const visited = new Set<number>()
const components: TraceSegment[][] = []

for (let i = 0; i < segments.length; i++) {
if (visited.has(i)) continue

const queue = [i]
const component: TraceSegment[] = []
visited.add(i)

while (queue.length > 0) {
const currentIndex = queue.shift()!
const current = segments[currentIndex]!
component.push(current)

for (let j = 0; j < segments.length; j++) {
if (visited.has(j)) continue

if (
shouldMergeSegments(
current,
segments[j]!,
segments,
mergeDistance,
minOverlap,
)
) {
visited.add(j)
queue.push(j)
}
}
Comment on lines +56 to +61
const result = mergeSameNetTraceSegments([traceA, traceB])

expect(result.mergeCount).toBe(0)
expect(getMiddleSegmentY(result.traces[0]!)).toBe(1)
expect(getMiddleSegmentY(result.traces[1]!)).toBe(1.08)
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

New Phase To combine same-net trace segments that are close together

2 participants