diff --git a/examples/bug-reports/bugreport5-70a81d/bugreport5-70a81d.fixture.tsx b/examples/bug-reports/bugreport5-70a81d/bugreport5-70a81d.fixture.tsx new file mode 100644 index 00000000..b11bde76 --- /dev/null +++ b/examples/bug-reports/bugreport5-70a81d/bugreport5-70a81d.fixture.tsx @@ -0,0 +1,7 @@ +// @ts-nocheck +import { AutoroutingPipelineDebugger } from "lib/testing/AutoroutingPipelineDebugger" +import bugReportJson from "./bugreport5-70a81d.json" + +export default () => { + return +} diff --git a/examples/bug-reports/bugreport5-70a81d/bugreport5-70a81d.json b/examples/bug-reports/bugreport5-70a81d/bugreport5-70a81d.json new file mode 100644 index 00000000..0b10adee --- /dev/null +++ b/examples/bug-reports/bugreport5-70a81d/bugreport5-70a81d.json @@ -0,0 +1,679 @@ +{ + "autorouting_bug_report_id": "70a81dc2-2c28-4380-8d57-849a3c32198c", + "reporter_account_id": "b9c6f4dd-b57f-4325-b85e-0876e18f9b8e", + "package_id": null, + "title": "", + "simple_route_json": { + "bounds": { + "maxX": 6.5, + "maxY": 6, + "minX": -5, + "minY": -4 + }, + "obstacles": [ + { + "type": "rect", + "width": 0.532003, + "center": { + "x": -0.9499600000000328, + "y": 1.1490959999998722 + }, + "height": 1.0720070000000002, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_0", + "connectivity_net18", + "source_trace_6", + "source_port_6", + "source_trace_4", + "source_port_5", + "source_net_4", + "pcb_smtpad_0", + "pcb_port_5", + "pcb_smtpad_6", + "pcb_port_6" + ] + }, + { + "type": "rect", + "width": 0.532003, + "center": { + "x": -1.1368683772161603e-13, + "y": 1.1490959999998722 + }, + "height": 1.0720070000000002, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_1", + "connectivity_net39", + "source_trace_16", + "source_port_16", + "source_trace_10", + "source_port_10", + "source_trace_9", + "source_port_9", + "source_trace_7", + "source_port_7", + "source_trace_0", + "source_port_4", + "source_net_0", + "pcb_smtpad_1", + "pcb_port_4", + "pcb_smtpad_7", + "pcb_port_7", + "pcb_smtpad_9", + "pcb_port_9", + "pcb_smtpad_10", + "pcb_port_10", + "pcb_plated_hole_2", + "pcb_port_16" + ] + }, + { + "type": "rect", + "width": 0.532003, + "center": { + "x": 0.9499600000000328, + "y": 1.1490959999998722 + }, + "height": 1.0720070000000002, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_2", + "connectivity_net22", + "source_trace_8", + "source_port_8", + "source_trace_5", + "source_port_3", + "source_net_5", + "pcb_smtpad_2", + "pcb_port_3", + "pcb_smtpad_8", + "pcb_port_8" + ] + }, + { + "type": "rect", + "width": 0.532003, + "center": { + "x": 0.9499600000000328, + "y": -1.149095999999986 + }, + "height": 1.0720070000000002, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_3", + "connectivity_net9", + "source_trace_3", + "source_port_2", + "source_net_3", + "pcb_smtpad_3", + "pcb_port_2" + ] + }, + { + "type": "rect", + "width": 0.532003, + "center": { + "x": -1.1368683772161603e-13, + "y": -1.149095999999986 + }, + "height": 1.0720070000000002, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_4", + "connectivity_net35", + "source_trace_14", + "source_port_14", + "source_trace_13", + "source_port_13", + "source_trace_1", + "source_port_1", + "source_net_1", + "pcb_smtpad_4", + "pcb_port_1", + "pcb_smtpad_13", + "pcb_port_13", + "pcb_plated_hole_0", + "pcb_port_14" + ] + }, + { + "type": "rect", + "width": 0.532003, + "center": { + "x": -0.9499600000000328, + "y": -1.149095999999986 + }, + "height": 1.0720070000000002, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_5", + "connectivity_net37", + "source_trace_15", + "source_port_15", + "source_trace_2", + "source_port_0", + "source_net_2", + "pcb_smtpad_5", + "pcb_port_0", + "pcb_plated_hole_1", + "pcb_port_15" + ] + }, + { + "type": "rect", + "width": 0.5, + "center": { + "x": -2, + "y": 3 + }, + "height": 0.5, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_6", + "connectivity_net18", + "source_trace_6", + "source_port_6", + "source_trace_4", + "source_port_5", + "source_net_4", + "pcb_smtpad_0", + "pcb_port_5", + "pcb_smtpad_6", + "pcb_port_6" + ] + }, + { + "type": "rect", + "width": 0.5, + "center": { + "x": -2, + "y": 4 + }, + "height": 0.5, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_7", + "connectivity_net39", + "source_trace_16", + "source_port_16", + "source_trace_10", + "source_port_10", + "source_trace_9", + "source_port_9", + "source_trace_7", + "source_port_7", + "source_trace_0", + "source_port_4", + "source_net_0", + "pcb_smtpad_1", + "pcb_port_4", + "pcb_smtpad_7", + "pcb_port_7", + "pcb_smtpad_9", + "pcb_port_9", + "pcb_smtpad_10", + "pcb_port_10", + "pcb_plated_hole_2", + "pcb_port_16" + ] + }, + { + "type": "rect", + "width": 0.5, + "center": { + "x": 1, + "y": 3 + }, + "height": 0.5, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_8", + "connectivity_net22", + "source_trace_8", + "source_port_8", + "source_trace_5", + "source_port_3", + "source_net_5", + "pcb_smtpad_2", + "pcb_port_3", + "pcb_smtpad_8", + "pcb_port_8" + ] + }, + { + "type": "rect", + "width": 0.5, + "center": { + "x": 1, + "y": 4 + }, + "height": 0.5, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_9", + "connectivity_net39", + "source_trace_16", + "source_port_16", + "source_trace_10", + "source_port_10", + "source_trace_9", + "source_port_9", + "source_trace_7", + "source_port_7", + "source_trace_0", + "source_port_4", + "source_net_0", + "pcb_smtpad_1", + "pcb_port_4", + "pcb_smtpad_7", + "pcb_port_7", + "pcb_smtpad_9", + "pcb_port_9", + "pcb_smtpad_10", + "pcb_port_10", + "pcb_plated_hole_2", + "pcb_port_16" + ] + }, + { + "type": "rect", + "width": 0.95, + "center": { + "x": -3, + "y": -0.4750000000000001 + }, + "height": 0.8, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_10", + "connectivity_net39", + "source_trace_16", + "source_port_16", + "source_trace_10", + "source_port_10", + "source_trace_9", + "source_port_9", + "source_trace_7", + "source_port_7", + "source_trace_0", + "source_port_4", + "source_net_0", + "pcb_smtpad_1", + "pcb_port_4", + "pcb_smtpad_7", + "pcb_port_7", + "pcb_smtpad_9", + "pcb_port_9", + "pcb_smtpad_10", + "pcb_port_10", + "pcb_plated_hole_2", + "pcb_port_16" + ] + }, + { + "type": "rect", + "width": 0.95, + "center": { + "x": -3, + "y": -2.125 + }, + "height": 0.8, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_11", + "connectivity_net31", + "source_trace_12", + "source_port_12", + "source_trace_11", + "source_port_11", + "source_net_6", + "pcb_smtpad_11", + "pcb_port_11", + "pcb_smtpad_12", + "pcb_port_12" + ] + }, + { + "type": "rect", + "width": 0.95, + "center": { + "x": 3, + "y": -2.125 + }, + "height": 0.8, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_12", + "connectivity_net31", + "source_trace_12", + "source_port_12", + "source_trace_11", + "source_port_11", + "source_net_6", + "pcb_smtpad_11", + "pcb_port_11", + "pcb_smtpad_12", + "pcb_port_12" + ] + }, + { + "type": "rect", + "width": 0.95, + "center": { + "x": 3, + "y": -0.4750000000000001 + }, + "height": 0.8, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_13", + "connectivity_net35", + "source_trace_14", + "source_port_14", + "source_trace_13", + "source_port_13", + "source_trace_1", + "source_port_1", + "source_net_1", + "pcb_smtpad_4", + "pcb_port_1", + "pcb_smtpad_13", + "pcb_port_13", + "pcb_plated_hole_0", + "pcb_port_14" + ] + }, + { + "type": "rect", + "width": 9, + "center": { + "x": 0, + "y": 1 + }, + "height": 9, + "layers": ["bottom"], + "connectedTo": [ + "pcb_smtpad_14", + "connectivity_net77", + "source_port_17", + "pcb_smtpad_14", + "pcb_port_17" + ] + }, + { + "type": "rect", + "width": 1.5, + "center": { + "x": 5.5, + "y": -1.54 + }, + "height": 1.5, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_0", + "connectivity_net35", + "source_trace_14", + "source_port_14", + "source_trace_13", + "source_port_13", + "source_trace_1", + "source_port_1", + "source_net_1", + "pcb_smtpad_4", + "pcb_port_1", + "pcb_smtpad_13", + "pcb_port_13", + "pcb_plated_hole_0", + "pcb_port_14" + ] + }, + { + "type": "oval", + "width": 1.5, + "center": { + "x": 5.5, + "y": 1 + }, + "height": 1.5, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_1", + "connectivity_net37", + "source_trace_15", + "source_port_15", + "source_trace_2", + "source_port_0", + "source_net_2", + "pcb_smtpad_5", + "pcb_port_0", + "pcb_plated_hole_1", + "pcb_port_15" + ] + }, + { + "type": "oval", + "width": 1.5, + "center": { + "x": 5.5, + "y": 3.54 + }, + "height": 1.5, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_2", + "connectivity_net39", + "source_trace_16", + "source_port_16", + "source_trace_10", + "source_port_10", + "source_trace_9", + "source_port_9", + "source_trace_7", + "source_port_7", + "source_trace_0", + "source_port_4", + "source_net_0", + "pcb_smtpad_1", + "pcb_port_4", + "pcb_smtpad_7", + "pcb_port_7", + "pcb_smtpad_9", + "pcb_port_9", + "pcb_smtpad_10", + "pcb_port_10", + "pcb_plated_hole_2", + "pcb_port_16" + ] + } + ], + "layerCount": 2, + "connections": [ + { + "name": "source_trace_6", + "pointsToConnect": [ + { + "x": -2, + "y": 3, + "layer": "top", + "pointId": "pcb_port_6", + "pcb_port_id": "pcb_port_6" + }, + { + "x": -0.9499600000000328, + "y": 1.1490959999998722, + "layer": "top", + "pointId": "pcb_port_5", + "pcb_port_id": "pcb_port_5" + } + ], + "source_trace_id": "source_trace_6" + }, + { + "name": "source_trace_8", + "pointsToConnect": [ + { + "x": 1, + "y": 3, + "layer": "top", + "pointId": "pcb_port_8", + "pcb_port_id": "pcb_port_8" + }, + { + "x": 0.9499600000000328, + "y": 1.1490959999998722, + "layer": "top", + "pointId": "pcb_port_3", + "pcb_port_id": "pcb_port_3" + } + ], + "source_trace_id": "source_trace_8" + }, + { + "name": "source_net_0", + "pointsToConnect": [ + { + "x": -1.1368683772161603e-13, + "y": 1.1490959999998722, + "layer": "top", + "pointId": "pcb_port_4", + "pcb_port_id": "pcb_port_4" + }, + { + "x": -2, + "y": 4, + "layer": "top", + "pointId": "pcb_port_7", + "pcb_port_id": "pcb_port_7" + }, + { + "x": 1, + "y": 4, + "layer": "top", + "pointId": "pcb_port_9", + "pcb_port_id": "pcb_port_9" + }, + { + "x": -3, + "y": -0.4750000000000001, + "layer": "top", + "pointId": "pcb_port_10", + "pcb_port_id": "pcb_port_10" + }, + { + "x": 5.5, + "y": 3.54, + "layer": "top", + "pointId": "pcb_port_16", + "pcb_port_id": "pcb_port_16" + } + ] + }, + { + "name": "source_net_1", + "pointsToConnect": [ + { + "x": -1.1368683772161603e-13, + "y": -1.149095999999986, + "layer": "top", + "pointId": "pcb_port_1", + "pcb_port_id": "pcb_port_1" + }, + { + "x": 3, + "y": -0.4750000000000001, + "layer": "top", + "pointId": "pcb_port_13", + "pcb_port_id": "pcb_port_13" + }, + { + "x": 5.5, + "y": -1.54, + "layer": "top", + "pointId": "pcb_port_14", + "pcb_port_id": "pcb_port_14" + } + ] + }, + { + "name": "source_net_2", + "pointsToConnect": [ + { + "x": -0.9499600000000328, + "y": -1.149095999999986, + "layer": "top", + "pointId": "pcb_port_0", + "pcb_port_id": "pcb_port_0" + }, + { + "x": 5.5, + "y": 1, + "layer": "top", + "pointId": "pcb_port_15", + "pcb_port_id": "pcb_port_15" + } + ] + }, + { + "name": "source_net_3", + "pointsToConnect": [ + { + "x": 0.9499600000000328, + "y": -1.149095999999986, + "layer": "top", + "pointId": "pcb_port_2", + "pcb_port_id": "pcb_port_2" + } + ] + }, + { + "name": "source_net_4", + "pointsToConnect": [ + { + "x": -0.9499600000000328, + "y": 1.1490959999998722, + "layer": "top", + "pointId": "pcb_port_5", + "pcb_port_id": "pcb_port_5" + } + ] + }, + { + "name": "source_net_5", + "pointsToConnect": [ + { + "x": 0.9499600000000328, + "y": 1.1490959999998722, + "layer": "top", + "pointId": "pcb_port_3", + "pcb_port_id": "pcb_port_3" + } + ] + }, + { + "name": "source_net_6", + "pointsToConnect": [ + { + "x": -3, + "y": -2.125, + "layer": "top", + "pointId": "pcb_port_11", + "pcb_port_id": "pcb_port_11" + }, + { + "x": 3, + "y": -2.125, + "layer": "top", + "pointId": "pcb_port_12", + "pcb_port_id": "pcb_port_12" + } + ] + } + ], + "minTraceWidth": 0.15 + }, + "circuit_json": null, + "subcircuit_id": null, + "created_at": "2025-09-20T11:39:14.074Z" +} diff --git a/lib/solvers/CapacityMeshSolver/CapacityMeshEdgeSolver2_NodeTreeOptimization.ts b/lib/solvers/CapacityMeshSolver/CapacityMeshEdgeSolver2_NodeTreeOptimization.ts index a705d797..58e4265e 100644 --- a/lib/solvers/CapacityMeshSolver/CapacityMeshEdgeSolver2_NodeTreeOptimization.ts +++ b/lib/solvers/CapacityMeshSolver/CapacityMeshEdgeSolver2_NodeTreeOptimization.ts @@ -40,13 +40,8 @@ export class CapacityMeshEdgeSolver2_NodeTreeOptimization extends CapacityMeshEd for (const B of maybeAdjNodes) { const areBordering = areNodesBordering(A, B) if (!areBordering) continue - const strawNodesWithSameParent = - A._strawNode && - B._strawNode && - A._strawParentCapacityMeshNodeId === B._strawParentCapacityMeshNodeId if ( A.capacityMeshNodeId !== B.capacityMeshNodeId && // Don't connect a node to itself - !strawNodesWithSameParent && this.doNodesHaveSharedLayer(A, B) && !this.edgeSet.has(`${A.capacityMeshNodeId}-${B.capacityMeshNodeId}`) ) { diff --git a/lib/solvers/DeadEndSolver/DeadEndSolver.ts b/lib/solvers/DeadEndSolver/DeadEndSolver.ts index ca7c5314..74b96f2c 100644 --- a/lib/solvers/DeadEndSolver/DeadEndSolver.ts +++ b/lib/solvers/DeadEndSolver/DeadEndSolver.ts @@ -71,6 +71,16 @@ export class DeadEndSolver extends BaseSolver { const leaf = this.leaves[this.leavesIndex] + if ( + this.nodes.find((node) => node.capacityMeshNodeId == leaf)?._strawNode + ) { + this.leavesIndex += 1 + if (this.leavesIndex === this.leaves.length) { + this.solved = true + } + return + } + // Get the single neighbor of the leaf node const [neighbor] = this.adjacencyList.get(leaf)! diff --git a/tests/__snapshots__/keyboard4.snap.svg b/tests/__snapshots__/keyboard4.snap.svg index bf7dd39d..5689a8ef 100644 --- a/tests/__snapshots__/keyboard4.snap.svg +++ b/tests/__snapshots__/keyboard4.snap.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file