Skip to content

Commit 3b39c2a

Browse files
committed
availableZ candidate rejection for 3 and 4 layer
1 parent 8dc19cf commit 3b39c2a

3 files changed

Lines changed: 55 additions & 4 deletions

File tree

lib/computeRegionCost.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ const viaSizeSq = viaSize ** 2
33
const traceWidth = 0.1
44
const IMPOSSIBLE_SINGLE_LAYER_INTERSECTION_COST = 10
55

6-
const isKnownSingleLayerMask = (regionAvailableZMask: number) =>
7-
regionAvailableZMask === 1 || regionAvailableZMask === 2
6+
export const isKnownSingleLayerMask = (regionAvailableZMask: number) =>
7+
regionAvailableZMask > 0 &&
8+
(regionAvailableZMask & (regionAvailableZMask - 1)) === 0
89

910
export const computeRegionCost = (
1011
regionWidth: number,

lib/core.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { BaseSolver } from "@tscircuit/solver-utils"
22
import type { GraphicsObject } from "graphics-debug"
33
import { convertToSerializedHyperGraph } from "./compat/convertToSerializedHyperGraph"
4-
import { computeRegionCost } from "./computeRegionCost"
4+
import { computeRegionCost, isKnownSingleLayerMask } from "./computeRegionCost"
55
import { countNewIntersectionsWithValues } from "./countNewIntersections"
66
import { MinHeap } from "./MinHeap"
77
import { shuffle } from "./shuffle"
@@ -513,7 +513,7 @@ export class TinyHyperGraphSolver extends BaseSolver {
513513

514514
isKnownSingleLayerRegion(regionId: RegionId): boolean {
515515
const regionAvailableZMask = this.topology.regionAvailableZMask?.[regionId] ?? 0
516-
return regionAvailableZMask === 1 || regionAvailableZMask === 2
516+
return isKnownSingleLayerMask(regionAvailableZMask)
517517
}
518518

519519
populateSegmentGeometryScratch(

tests/solver/single-layer-region-cost.test.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import {
44
TinyHyperGraphSolver,
55
type TinyHyperGraphTopology,
66
} from "lib/index"
7+
import {
8+
computeRegionCost,
9+
isKnownSingleLayerMask,
10+
} from "lib/computeRegionCost"
711

812
const createTopology = (
913
regionAvailableZMask: number,
@@ -64,9 +68,55 @@ const getCrossingCost = (regionAvailableZMask: number, portZ: number) => {
6468
test("same-layer crossings in known single-layer regions are rejected as candidates", () => {
6569
const topLayerCrossingCost = getCrossingCost(1 << 0, 0)
6670
const bottomLayerCrossingCost = getCrossingCost(1 << 1, 1)
71+
const innerLayer2CrossingCost = getCrossingCost(1 << 2, 2)
72+
const innerLayer3CrossingCost = getCrossingCost(1 << 3, 3)
6773
const multiLayerCrossingCost = getCrossingCost((1 << 0) | (1 << 1), 0)
6874

6975
expect(topLayerCrossingCost).toBe(Number.POSITIVE_INFINITY)
7076
expect(bottomLayerCrossingCost).toBe(Number.POSITIVE_INFINITY)
77+
expect(innerLayer2CrossingCost).toBe(Number.POSITIVE_INFINITY)
78+
expect(innerLayer3CrossingCost).toBe(Number.POSITIVE_INFINITY)
7179
expect(multiLayerCrossingCost).toBeLessThan(0.1)
7280
})
81+
82+
test("single-bit availableZ masks are all treated as known single-layer regions", () => {
83+
expect(isKnownSingleLayerMask(1 << 0)).toBe(true)
84+
expect(isKnownSingleLayerMask(1 << 1)).toBe(true)
85+
expect(isKnownSingleLayerMask(1 << 2)).toBe(true)
86+
expect(isKnownSingleLayerMask(1 << 3)).toBe(true)
87+
expect(isKnownSingleLayerMask((1 << 0) | (1 << 1))).toBe(false)
88+
expect(isKnownSingleLayerMask(0)).toBe(false)
89+
})
90+
91+
test("same-layer crossings incur the impossible single-layer penalty for higher routed layers too", () => {
92+
const width = 3
93+
const height = 3
94+
const sameLayerIntersections = 1
95+
const crossLayerIntersections = 0
96+
const entryExitChanges = 0
97+
const traceCount = 2
98+
99+
expect(
100+
computeRegionCost(
101+
width,
102+
height,
103+
sameLayerIntersections,
104+
crossLayerIntersections,
105+
entryExitChanges,
106+
traceCount,
107+
1 << 2,
108+
),
109+
).toBeGreaterThan(10)
110+
111+
expect(
112+
computeRegionCost(
113+
width,
114+
height,
115+
sameLayerIntersections,
116+
crossLayerIntersections,
117+
entryExitChanges,
118+
traceCount,
119+
1 << 3,
120+
),
121+
).toBeGreaterThan(10)
122+
})

0 commit comments

Comments
 (0)