@tscircuit/rectdiff 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +9 -0
- package/.github/workflows/bun-formatcheck.yml +26 -0
- package/.github/workflows/bun-pver-release.yml +71 -0
- package/.github/workflows/bun-test.yml +31 -0
- package/.github/workflows/bun-typecheck.yml +26 -0
- package/CLAUDE.md +23 -0
- package/README.md +5 -0
- package/biome.json +93 -0
- package/bun.lock +29 -0
- package/bunfig.toml +5 -0
- package/components/SolverDebugger3d.tsx +833 -0
- package/cosmos.config.json +6 -0
- package/cosmos.decorator.tsx +21 -0
- package/dist/index.d.ts +111 -0
- package/dist/index.js +921 -0
- package/experiments/rect-fill-2d.tsx +983 -0
- package/experiments/rect3d_visualizer.html +640 -0
- package/global.d.ts +4 -0
- package/index.html +12 -0
- package/lib/index.ts +1 -0
- package/lib/solvers/RectDiffSolver.ts +158 -0
- package/lib/solvers/rectdiff/candidates.ts +397 -0
- package/lib/solvers/rectdiff/engine.ts +355 -0
- package/lib/solvers/rectdiff/geometry.ts +284 -0
- package/lib/solvers/rectdiff/layers.ts +48 -0
- package/lib/solvers/rectdiff/rectsToMeshNodes.ts +22 -0
- package/lib/solvers/rectdiff/types.ts +63 -0
- package/lib/types/capacity-mesh-types.ts +33 -0
- package/lib/types/srj-types.ts +37 -0
- package/package.json +33 -0
- package/pages/example01.page.tsx +11 -0
- package/test-assets/example01.json +933 -0
- package/tests/__snapshots__/svg.snap.svg +3 -0
- package/tests/examples/__snapshots__/example01.snap.svg +121 -0
- package/tests/examples/example01.test.tsx +65 -0
- package/tests/fixtures/preload.ts +1 -0
- package/tests/incremental-solver.test.ts +100 -0
- package/tests/rect-diff-solver.test.ts +154 -0
- package/tests/svg.test.ts +12 -0
- package/tsconfig.json +30 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// lib/solvers/rectdiff/types.ts
|
|
2
|
+
import type { SimpleRouteJson } from "../../types/srj-types"
|
|
3
|
+
|
|
4
|
+
export type XYRect = { x: number; y: number; width: number; height: number }
|
|
5
|
+
|
|
6
|
+
export type Rect3d = {
|
|
7
|
+
minX: number
|
|
8
|
+
minY: number
|
|
9
|
+
maxX: number
|
|
10
|
+
maxY: number
|
|
11
|
+
zLayers: number[] // sorted contiguous integers
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type GridFill3DOptions = {
|
|
15
|
+
gridSizes?: number[]
|
|
16
|
+
initialCellRatio?: number
|
|
17
|
+
maxAspectRatio?: number | null
|
|
18
|
+
minSingle: { width: number; height: number }
|
|
19
|
+
minMulti: { width: number; height: number; minLayers: number }
|
|
20
|
+
preferMultiLayer?: boolean
|
|
21
|
+
maxMultiLayerSpan?: number
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type Candidate3D = {
|
|
25
|
+
x: number
|
|
26
|
+
y: number
|
|
27
|
+
z: number
|
|
28
|
+
distance: number
|
|
29
|
+
/** Larger values mean more multi-layer potential at this seed. */
|
|
30
|
+
zSpanLen?: number
|
|
31
|
+
/** Marked when the seed came from the edge analysis pass. */
|
|
32
|
+
isEdgeSeed?: boolean
|
|
33
|
+
}
|
|
34
|
+
export type Placed3D = { rect: XYRect; zLayers: number[] }
|
|
35
|
+
|
|
36
|
+
export type Phase = "GRID" | "EXPANSION" | "DONE"
|
|
37
|
+
|
|
38
|
+
export type RectDiffState = {
|
|
39
|
+
// static
|
|
40
|
+
srj: SimpleRouteJson
|
|
41
|
+
layerNames: string[]
|
|
42
|
+
layerCount: number
|
|
43
|
+
bounds: XYRect
|
|
44
|
+
options: Required<Omit<GridFill3DOptions, "gridSizes" | "maxMultiLayerSpan">> & {
|
|
45
|
+
gridSizes: number[]
|
|
46
|
+
maxMultiLayerSpan: number | undefined
|
|
47
|
+
}
|
|
48
|
+
obstaclesByLayer: XYRect[][]
|
|
49
|
+
|
|
50
|
+
// evolving
|
|
51
|
+
phase: Phase
|
|
52
|
+
gridIndex: number // index in gridSizes
|
|
53
|
+
candidates: Candidate3D[]
|
|
54
|
+
placed: Placed3D[]
|
|
55
|
+
placedByLayer: XYRect[][]
|
|
56
|
+
expansionIndex: number
|
|
57
|
+
/** Whether we've already run the edge-analysis seeding pass. */
|
|
58
|
+
edgeAnalysisDone: boolean
|
|
59
|
+
|
|
60
|
+
// progress bookkeeping
|
|
61
|
+
totalSeedsThisGrid: number
|
|
62
|
+
consumedSeedsThisGrid: number
|
|
63
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type CapacityMeshNodeId = string
|
|
2
|
+
|
|
3
|
+
export interface CapacityMesh {
|
|
4
|
+
nodes: CapacityMeshNode[]
|
|
5
|
+
edges: CapacityMeshEdge[]
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface CapacityMeshNode {
|
|
9
|
+
capacityMeshNodeId: string
|
|
10
|
+
center: { x: number; y: number }
|
|
11
|
+
width: number
|
|
12
|
+
height: number
|
|
13
|
+
layer: string
|
|
14
|
+
availableZ: number[]
|
|
15
|
+
|
|
16
|
+
_depth?: number
|
|
17
|
+
|
|
18
|
+
_completelyInsideObstacle?: boolean
|
|
19
|
+
_containsObstacle?: boolean
|
|
20
|
+
_containsTarget?: boolean
|
|
21
|
+
_targetConnectionName?: string
|
|
22
|
+
_strawNode?: boolean
|
|
23
|
+
_strawParentCapacityMeshNodeId?: CapacityMeshNodeId
|
|
24
|
+
|
|
25
|
+
_adjacentNodeIds?: CapacityMeshNodeId[]
|
|
26
|
+
|
|
27
|
+
_parent?: CapacityMeshNode
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface CapacityMeshEdge {
|
|
31
|
+
capacityMeshEdgeId: string
|
|
32
|
+
nodeIds: [CapacityMeshNodeId, CapacityMeshNodeId]
|
|
33
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type TraceId = string
|
|
2
|
+
|
|
3
|
+
export interface SimpleRouteJson {
|
|
4
|
+
layerCount: number
|
|
5
|
+
minTraceWidth: number
|
|
6
|
+
minViaDiameter?: number
|
|
7
|
+
obstacles: Obstacle[]
|
|
8
|
+
connections: Array<SimpleRouteConnection>
|
|
9
|
+
bounds: { minX: number; maxX: number; minY: number; maxY: number }
|
|
10
|
+
outline?: Array<{ x: number; y: number }>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface Obstacle {
|
|
14
|
+
type: "rect"
|
|
15
|
+
layers: string[]
|
|
16
|
+
zLayers?: number[]
|
|
17
|
+
center: { x: number; y: number }
|
|
18
|
+
width: number
|
|
19
|
+
height: number
|
|
20
|
+
connectedTo: TraceId[]
|
|
21
|
+
netIsAssignable?: boolean
|
|
22
|
+
offBoardConnectsTo?: TraceId[]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface SimpleRouteConnection {
|
|
26
|
+
name: string
|
|
27
|
+
netConnectionName?: string
|
|
28
|
+
nominalTraceWidth?: number
|
|
29
|
+
pointsToConnect: Array<{
|
|
30
|
+
x: number
|
|
31
|
+
y: number
|
|
32
|
+
layer: string
|
|
33
|
+
pointId?: string
|
|
34
|
+
pcb_port_id?: string
|
|
35
|
+
}>
|
|
36
|
+
externallyConnectedPointIds?: string[][]
|
|
37
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tscircuit/rectdiff",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start": "cosmos",
|
|
8
|
+
"build": "tsup-node ./lib/index.ts --format esm --dts"
|
|
9
|
+
},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"@biomejs/biome": "^2.3.5",
|
|
12
|
+
"@react-hook/resize-observer": "^2.0.2",
|
|
13
|
+
"@tscircuit/solver-utils": "^0.0.3",
|
|
14
|
+
"@types/bun": "latest",
|
|
15
|
+
"@types/three": "^0.181.0",
|
|
16
|
+
"bun-match-svg": "^0.0.14",
|
|
17
|
+
"graphics-debug": "^0.0.70",
|
|
18
|
+
"rbush": "^4.0.1",
|
|
19
|
+
"react": "^19.2.0",
|
|
20
|
+
"react-cosmos": "^7.0.0",
|
|
21
|
+
"react-cosmos-plugin-vite": "^7.0.0",
|
|
22
|
+
"react-dom": "^19.2.0",
|
|
23
|
+
"three": "^0.181.1",
|
|
24
|
+
"tsup": "^8.5.1"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"typescript": "^5"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"D": "^1.0.0",
|
|
31
|
+
"vite": "^7.2.2"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { GenericSolverDebugger } from "@tscircuit/solver-utils/react"
|
|
2
|
+
import simpleRouteJson from "../test-assets/example-simple-route.json"
|
|
3
|
+
import { RectDiffSolver } from "../lib/solvers/RectDiffSolver"
|
|
4
|
+
import { useMemo } from "react"
|
|
5
|
+
import { SolverDebugger3d } from "../components/SolverDebugger3d"
|
|
6
|
+
|
|
7
|
+
export default () => {
|
|
8
|
+
const solver = useMemo(() => new RectDiffSolver({ simpleRouteJson }), [])
|
|
9
|
+
|
|
10
|
+
return <SolverDebugger3d solver={solver} />
|
|
11
|
+
}
|