@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.
Files changed (40) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.github/workflows/bun-formatcheck.yml +26 -0
  3. package/.github/workflows/bun-pver-release.yml +71 -0
  4. package/.github/workflows/bun-test.yml +31 -0
  5. package/.github/workflows/bun-typecheck.yml +26 -0
  6. package/CLAUDE.md +23 -0
  7. package/README.md +5 -0
  8. package/biome.json +93 -0
  9. package/bun.lock +29 -0
  10. package/bunfig.toml +5 -0
  11. package/components/SolverDebugger3d.tsx +833 -0
  12. package/cosmos.config.json +6 -0
  13. package/cosmos.decorator.tsx +21 -0
  14. package/dist/index.d.ts +111 -0
  15. package/dist/index.js +921 -0
  16. package/experiments/rect-fill-2d.tsx +983 -0
  17. package/experiments/rect3d_visualizer.html +640 -0
  18. package/global.d.ts +4 -0
  19. package/index.html +12 -0
  20. package/lib/index.ts +1 -0
  21. package/lib/solvers/RectDiffSolver.ts +158 -0
  22. package/lib/solvers/rectdiff/candidates.ts +397 -0
  23. package/lib/solvers/rectdiff/engine.ts +355 -0
  24. package/lib/solvers/rectdiff/geometry.ts +284 -0
  25. package/lib/solvers/rectdiff/layers.ts +48 -0
  26. package/lib/solvers/rectdiff/rectsToMeshNodes.ts +22 -0
  27. package/lib/solvers/rectdiff/types.ts +63 -0
  28. package/lib/types/capacity-mesh-types.ts +33 -0
  29. package/lib/types/srj-types.ts +37 -0
  30. package/package.json +33 -0
  31. package/pages/example01.page.tsx +11 -0
  32. package/test-assets/example01.json +933 -0
  33. package/tests/__snapshots__/svg.snap.svg +3 -0
  34. package/tests/examples/__snapshots__/example01.snap.svg +121 -0
  35. package/tests/examples/example01.test.tsx +65 -0
  36. package/tests/fixtures/preload.ts +1 -0
  37. package/tests/incremental-solver.test.ts +100 -0
  38. package/tests/rect-diff-solver.test.ts +154 -0
  39. package/tests/svg.test.ts +12 -0
  40. 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
+ }