Skip to content

Commit 9cac4a2

Browse files
authored
clean the codebase (#5)
1 parent 6cab8fe commit 9cac4a2

9 files changed

Lines changed: 2014 additions & 1942 deletions

File tree

lib/solvers/GlobalDrcForceImproveSolver/GlobalDrcForceImproveSolver.ts

Lines changed: 30 additions & 1935 deletions
Large diffs are not rendered by default.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export { getDrcSnapshot } from "./GlobalDrcForceImproveSolver"
1+
export { getDrcSnapshot } from "./solverHelpers"

lib/solvers/GlobalDrcForceImproveSolver/index.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
export { GlobalDrcForceImproveSolver } from "./GlobalDrcForceImproveSolver"
22

3-
import type { GlobalDrcForceImproveSolver as GlobalDrcForceImproveSolverClass } from "./GlobalDrcForceImproveSolver"
4-
5-
export type GlobalDrcForceImproveSolverParams = ConstructorParameters<
6-
typeof GlobalDrcForceImproveSolverClass
7-
>[0]
8-
93
export type {
104
DrcError,
115
DrcEvaluator,
126
DrcSnapshot,
7+
GlobalDrcForceImproveSolverParams,
138
SolverDeps,
149
SolverOutput,
1510
} from "./types"
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import type { HighDensityRoute } from "../../types/high-density-types"
2+
3+
export type Point = { x: number; y: number }
4+
5+
export type Bounds2D = {
6+
minX: number
7+
minY: number
8+
maxX: number
9+
maxY: number
10+
}
11+
12+
export type MutableRoute = HighDensityRoute & {
13+
route: Array<HighDensityRoute["route"][number]>
14+
vias: Array<HighDensityRoute["vias"][number]>
15+
}
16+
17+
export type ViaNode = {
18+
routeIndex: number
19+
rootConnectionName: string
20+
pointIndexes: number[]
21+
x: number
22+
y: number
23+
radius: number
24+
movable: boolean
25+
}
26+
27+
export type Segment = {
28+
routeIndex: number
29+
rootConnectionName: string
30+
startIndex: number
31+
endIndex: number
32+
start: Point
33+
end: Point
34+
z: number
35+
radius: number
36+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import type { SimpleRouteJson } from "../../types"
2+
import type { HighDensityRoute } from "../../types/high-density-types"
3+
4+
const netAliasCache = new Map<string, readonly string[]>()
5+
const netAliasSetCache = new Map<string, ReadonlySet<string>>()
6+
const obstacleConnectedAliasCache = new WeakMap<
7+
SimpleRouteJson["obstacles"][number],
8+
ReadonlySet<string>
9+
>()
10+
11+
export const getRootConnectionName = (route: HighDensityRoute) =>
12+
route.rootConnectionName ?? route.connectionName
13+
14+
const getNetAliases = (name: string | undefined) => {
15+
if (!name) return []
16+
17+
const cachedAliases = netAliasCache.get(name)
18+
if (cachedAliases) return cachedAliases
19+
20+
const aliases = name.includes("__")
21+
? [...new Set([name, ...name.split("__").filter(Boolean)])]
22+
: [name]
23+
netAliasCache.set(name, aliases)
24+
return aliases
25+
}
26+
27+
const getNetAliasSet = (name: string) => {
28+
const cachedAliasSet = netAliasSetCache.get(name)
29+
if (cachedAliasSet) return cachedAliasSet
30+
31+
const aliasSet = new Set(getNetAliases(name))
32+
netAliasSetCache.set(name, aliasSet)
33+
return aliasSet
34+
}
35+
36+
export const sharesNet = (left: string, right: string | undefined) => {
37+
if (!right) return false
38+
if (left === right) return true
39+
40+
const leftAliases = getNetAliases(left)
41+
if (leftAliases.length === 1 && !right.includes("__")) return false
42+
43+
const rightAliasSet = getNetAliasSet(right)
44+
return leftAliases.some((alias) => rightAliasSet.has(alias))
45+
}
46+
47+
const getObstacleConnectedAliasSet = (
48+
obstacle: SimpleRouteJson["obstacles"][number],
49+
) => {
50+
const cachedAliasSet = obstacleConnectedAliasCache.get(obstacle)
51+
if (cachedAliasSet) return cachedAliasSet
52+
53+
const aliasSet = new Set<string>()
54+
for (const connectedTo of obstacle.connectedTo ?? []) {
55+
for (const alias of getNetAliases(connectedTo)) {
56+
aliasSet.add(alias)
57+
}
58+
}
59+
60+
obstacleConnectedAliasCache.set(obstacle, aliasSet)
61+
return aliasSet
62+
}
63+
64+
export const obstacleSharesNet = (
65+
rootConnectionName: string,
66+
obstacle: SimpleRouteJson["obstacles"][number],
67+
) =>
68+
getNetAliases(rootConnectionName).some((alias) =>
69+
getObstacleConnectedAliasSet(obstacle).has(alias),
70+
)
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
const BASE_MAX_TARGETED_CANDIDATE_ATTEMPTS = 2
2+
const BASE_MAX_ITERATIONS_PER_EFFORT = 48
3+
const DEEP_ERROR_FORCE_SCALES = [1, 1.75, -1] as const
4+
const FAST_ERROR_FORCE_SCALES = [1, 1.75] as const
5+
const LARGE_DRC_COUNT_IMPROVEMENT_CHECK_INTERVAL = 8
6+
const LOW_DRC_COUNT_IMPROVEMENT_CHECK_INTERVAL = 1
7+
const MAX_ITERATIONS_PER_DRC_ERROR = 8 / 3
8+
const MIN_MAX_ITERATIONS = 48
9+
const SMALL_DRC_COUNT_IMPROVEMENT_CHECK_INTERVAL = 2
10+
11+
export const POSITION_EPSILON = 1e-6
12+
export const COORDINATE_EPSILON = 1e-3
13+
export const MAX_ERROR_MOVE = 0.14
14+
export const BROAD_FORCE_PASSES = 12
15+
export const BROAD_MAX_MOVE = 0.035
16+
export const BROAD_FALLBACK_SMALL_ROUTE_LIMIT = 120
17+
export const MIN_ITERATIONS_FOR_LARGE_BOARD_BROAD_FALLBACK = 192
18+
export const CLEARANCE_SLACK = 0.015
19+
export const VIA_PAIR_REPAIR_MAX_MOVE = 0.16
20+
export const TRACE_PAD_REPAIR_MAX_MOVE = 0.3
21+
export const PREFERRED_TRACE_TO_PAD_CLEARANCE = 0.16
22+
export const LARGE_DRC_COUNT_THRESHOLD = 20
23+
export const MAX_DRC_COUNT_PLATEAU_CHECKS = 2
24+
export const MAX_LARGE_BOARD_BROAD_FALLBACK_MISSES = 2
25+
export const BROAD_SPATIAL_CELL_SIZE_MIN = 1
26+
27+
export const getBaseMaxIterations = (effort: number) =>
28+
Math.max(
29+
MIN_MAX_ITERATIONS,
30+
Math.round(BASE_MAX_ITERATIONS_PER_EFFORT * Math.max(1, effort)),
31+
)
32+
33+
export const getDrcScaledMaxIterations = (
34+
drcIssueCount: number,
35+
effort: number,
36+
) =>
37+
Math.max(
38+
getBaseMaxIterations(effort),
39+
Math.ceil(
40+
drcIssueCount * MAX_ITERATIONS_PER_DRC_ERROR * Math.max(1, effort),
41+
),
42+
)
43+
44+
export const getRouteComplexityMinIterations = (
45+
routeCount: number,
46+
drcIssueCount: number,
47+
) =>
48+
routeCount > BROAD_FALLBACK_SMALL_ROUTE_LIMIT && drcIssueCount > 0
49+
? MIN_ITERATIONS_FOR_LARGE_BOARD_BROAD_FALLBACK
50+
: MIN_MAX_ITERATIONS
51+
52+
export const getLargeBoardBroadFallbackCadence = (
53+
centeredDrcIssueCount: number,
54+
) => Math.max(16, Math.min(64, centeredDrcIssueCount * 2))
55+
56+
export const getDrcCountImprovementCheckInterval = (
57+
initialDrcIssueCount: number,
58+
) =>
59+
initialDrcIssueCount >= LARGE_DRC_COUNT_THRESHOLD
60+
? LARGE_DRC_COUNT_IMPROVEMENT_CHECK_INTERVAL
61+
: initialDrcIssueCount <= 2
62+
? LOW_DRC_COUNT_IMPROVEMENT_CHECK_INTERVAL
63+
: SMALL_DRC_COUNT_IMPROVEMENT_CHECK_INTERVAL
64+
65+
export const getForceScalesForEffort = (effort: number) =>
66+
effort >= 2 ? DEEP_ERROR_FORCE_SCALES : FAST_ERROR_FORCE_SCALES
67+
68+
export const getMaxTargetedCandidateAttemptsForEffort = (effort: number) =>
69+
Math.max(
70+
1,
71+
Math.round(BASE_MAX_TARGETED_CANDIDATE_ATTEMPTS * Math.max(1, effort)),
72+
)

0 commit comments

Comments
 (0)