From 0c3e30f4c9995518431beab66c746415237a78e3 Mon Sep 17 00:00:00 2001 From: Shibo Date: Mon, 23 Sep 2024 18:56:05 +0200 Subject: [PATCH] updated to circuit-json --- README.md | 4 ++-- algos/algorithm-template-ts/AI_GUIDE.md | 2 +- algos/algorithm-template-ts/index.ts | 4 ++-- algos/gridless-poi/index.ts | 8 ++++---- algos/infinite-grid-astar/index.ts | 4 ++-- .../__snapshots__/get-debug-svg.snap.svg | 2 +- .../intersection-with-margin.snap.svg | 2 +- .../tests/__snapshots__/multimargin.snap.svg | 2 +- .../tests/fixtures/get-debug-svg.ts | 8 ++++---- .../tests/get-debug-svg.test.tsx | 2 +- .../tests/intersection-with-margin.test.tsx | 2 +- .../tests/multimargin-bga.test.tsx | 2 +- .../tests/multimargin.test.tsx | 2 +- algos/infinite-grid-ijump-astar/v1/index.ts | 6 +++--- algos/infinite-grid-ijump-astar/v2/index.ts | 6 +++--- .../v2/lib/GeneralizedAstar.ts | 4 ++-- .../v2/lib/IJumpAutorouter.ts | 2 +- .../v2/lib/IJumpMultiMarginAutorouter.ts | 2 +- algos/jump-point-grid/index.ts | 4 ++-- algos/multi-layer-ijump/MultilayerIjump.ts | 2 +- algos/multi-layer-ijump/index.ts | 4 ++-- .../multi-layer-bottom-crossing.snap.svg | 2 +- .../multi-layer-ijump-simple.snap.svg | 2 +- .../multi-layer-ijump-single-layer.snap.svg | 2 +- .../multi-layer-bottom-crossing.test.tsx | 2 +- .../tests/multi-layer-ijump-simple.test.tsx | 2 +- .../multi-layer-ijump-single-layer.test.tsx | 2 +- .../tests/same-net-many-pads.test.tsx | 2 +- algos/multi-layer-ijump/util.ts | 2 +- algos/simple-grid/index.ts | 4 ++-- algos/tscircuit-builtin/index.ts | 6 +++--- bun.lockb | Bin 455902 -> 457610 bytes .../components/ViewProblemAndSolution.tsx | 4 ++-- frontend/window-global.ts | 8 ++++---- module/lib/benchmark/is-valid-solution.ts | 6 +++--- module/lib/benchmark/run-benchmark.ts | 2 +- module/lib/benchmark/run-checks.ts | 8 ++++---- .../generator-utils/renderCircuitToSoup.ts | 4 ++-- .../replaceTracesWithErrors.ts | 8 ++++---- .../generators/distant-single-trace/index.tsx | 4 ++-- module/lib/generators/keyboards/index.tsx | 4 ++-- .../single-trace-multilayer/index.tsx | 4 ++-- module/lib/generators/single-trace/index.tsx | 4 ++-- module/lib/generators/traces/index.tsx | 4 ++-- module/lib/generators/types.ts | 4 ++-- .../generators/utils/with-check-regenerate.ts | 4 ++-- module/lib/server/app-context.ts | 2 +- module/lib/server/get-script-content.ts | 10 +++++----- module/lib/server/server-entrypoint.ts | 10 +++++----- .../add-vias-for-pcb-trace-routes.ts | 4 ++-- module/lib/solver-utils/ProblemSolver.ts | 12 ++++++------ .../lib/solver-utils/createSolverFromUrl.ts | 4 ++-- .../solver-utils/getAlternativeGoalBoxes.ts | 2 +- .../getObstaclesFromCircuitJson.ts | 4 ++-- module/lib/solver-utils/getSimpleRouteJson.ts | 4 ++-- module/lib/solver-utils/normalize-solution.ts | 6 +++--- .../tests/dev-server/solve-endpoint.test.ts | 2 +- .../pcb-trace-becomes-obstacle.ts | 4 ++-- .../vias-should-be-obstacles.test.ts | 4 ++-- package.json | 4 ++-- 60 files changed, 120 insertions(+), 120 deletions(-) diff --git a/README.md b/README.md index 3179404..6422333 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ your Typescript solver, just create a file like this: ```tsx import { startAutoroutingDevServer, getSimpleRouteJson } from "autorouting-dataset" -const mySolver = (soup: AnySoupElement[]) => { +const mySolver = (soup: AnyCircuitElement[]) => { const routeJson = getSimpleRouteJson(soup) // ... @@ -208,7 +208,7 @@ url with the a JSON payload containing the following fields: ```ts interface Payload { - problem_soup: Array + problem_soup: Array simple_route_json: SimpleRouteJson } ``` diff --git a/algos/algorithm-template-ts/AI_GUIDE.md b/algos/algorithm-template-ts/AI_GUIDE.md index 925a48a..eb5a27e 100644 --- a/algos/algorithm-template-ts/AI_GUIDE.md +++ b/algos/algorithm-template-ts/AI_GUIDE.md @@ -38,7 +38,7 @@ import { type Obstacle, type SimpleRouteJson, } from "autorouting-dataset" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" export function autoroute(soup): SimplifiedPcbTrace[] { const input = getSimpleRouteJson(soup) diff --git a/algos/algorithm-template-ts/index.ts b/algos/algorithm-template-ts/index.ts index 7729aff..96bbfb3 100644 --- a/algos/algorithm-template-ts/index.ts +++ b/algos/algorithm-template-ts/index.ts @@ -1,7 +1,7 @@ import { getSimpleRouteJson, type SimplifiedPcbTrace } from "solver-utils" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" -export function autoroute(soup: AnySoupElement[]): SimplifiedPcbTrace[] { +export function autoroute(soup: AnyCircuitElement[]): SimplifiedPcbTrace[] { const input = getSimpleRouteJson(soup) // TODO: implement your algorithm here diff --git a/algos/gridless-poi/index.ts b/algos/gridless-poi/index.ts index cf1e80e..a98edc0 100644 --- a/algos/gridless-poi/index.ts +++ b/algos/gridless-poi/index.ts @@ -4,10 +4,10 @@ import { type SimplifiedPcbTrace, } from "solver-utils" import type { - AnySoupElement, + AnyCircuitElement, PcbFabricationNotePath, PcbFabricationNoteText, -} from "@tscircuit/soup" +} from "circuit-json" import { Graph } from "@dagrejs/graphlib" import { getUnclusteredOptimalPointsFromObstacles } from "./lib/get-unclustered-optimal-points-from-obstacles" @@ -20,7 +20,7 @@ import { constructGraphFromPoisWithDelaunay } from "./lib/construct-graph-from-p const debug = Debug("autorouting-dataset:gridless-poi") -export function autoroute(soup: AnySoupElement[]): SolutionWithDebugInfo { +export function autoroute(soup: AnyCircuitElement[]): SolutionWithDebugInfo { const timer = new Timer({ logOnEnd: debug.enabled }) timer.start("getSimpleRouteJson") @@ -28,7 +28,7 @@ export function autoroute(soup: AnySoupElement[]): SolutionWithDebugInfo { timer.end() const solution: (SimplifiedPcbTrace | PcbFabricationNotePath)[] = [] - const debugSolutions: Record = { + const debugSolutions: Record = { mesh: [], pois: [], } diff --git a/algos/infinite-grid-astar/index.ts b/algos/infinite-grid-astar/index.ts index fed4925..c33b3e1 100644 --- a/algos/infinite-grid-astar/index.ts +++ b/algos/infinite-grid-astar/index.ts @@ -1,8 +1,8 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { InfgridAutorouter } from "./InfgridAutorouter" import { getSimpleRouteJson, type SolutionWithDebugInfo } from "solver-utils" -export function autoroute(soup: AnySoupElement[]): SolutionWithDebugInfo { +export function autoroute(soup: AnyCircuitElement[]): SolutionWithDebugInfo { const input = getSimpleRouteJson(soup) const autorouter = new InfgridAutorouter({ diff --git a/algos/infinite-grid-ijump-astar/tests/__snapshots__/get-debug-svg.snap.svg b/algos/infinite-grid-ijump-astar/tests/__snapshots__/get-debug-svg.snap.svg index 48ebeab..4315239 100644 --- a/algos/infinite-grid-ijump-astar/tests/__snapshots__/get-debug-svg.snap.svg +++ b/algos/infinite-grid-ijump-astar/tests/__snapshots__/get-debug-svg.snap.svg @@ -9,4 +9,4 @@ .pcb-silkscreen-top { stroke: #f2eda1; } .pcb-silkscreen-bottom { stroke: #f2eda1; } .pcb-silkscreen-text { fill: #f2eda1; } - X0t1_iter[0]X01t1_iter[1]X01t1_iter[2]X01t1_iter[3] \ No newline at end of file + X0t1_iter[0]X01t1_iter[1]X01t1_iter[2]X01t1_iter[3] \ No newline at end of file diff --git a/algos/infinite-grid-ijump-astar/tests/__snapshots__/intersection-with-margin.snap.svg b/algos/infinite-grid-ijump-astar/tests/__snapshots__/intersection-with-margin.snap.svg index c96ff17..aa1dbdd 100644 --- a/algos/infinite-grid-ijump-astar/tests/__snapshots__/intersection-with-margin.snap.svg +++ b/algos/infinite-grid-ijump-astar/tests/__snapshots__/intersection-with-margin.snap.svg @@ -9,4 +9,4 @@ .pcb-silkscreen-top { stroke: #f2eda1; } .pcb-silkscreen-bottom { stroke: #f2eda1; } .pcb-silkscreen-text { fill: #f2eda1; } - X0t1_iter[0]X0t1_iter[1]X0t1_iter[2] \ No newline at end of file + X0t1_iter[0]X0t1_iter[1]X0t1_iter[2] \ No newline at end of file diff --git a/algos/infinite-grid-ijump-astar/tests/__snapshots__/multimargin.snap.svg b/algos/infinite-grid-ijump-astar/tests/__snapshots__/multimargin.snap.svg index 184e084..7cc2728 100644 --- a/algos/infinite-grid-ijump-astar/tests/__snapshots__/multimargin.snap.svg +++ b/algos/infinite-grid-ijump-astar/tests/__snapshots__/multimargin.snap.svg @@ -9,4 +9,4 @@ .pcb-silkscreen-top { stroke: #f2eda1; } .pcb-silkscreen-bottom { stroke: #f2eda1; } .pcb-silkscreen-text { fill: #f2eda1; } - X01t1_iter[0]X01234t1_iter[1]X01234t1_iter[2]X01234t1_iter[3] \ No newline at end of file + X01t1_iter[0]X01234t1_iter[1]X01234t1_iter[2]X01234t1_iter[3] \ No newline at end of file diff --git a/algos/infinite-grid-ijump-astar/tests/fixtures/get-debug-svg.ts b/algos/infinite-grid-ijump-astar/tests/fixtures/get-debug-svg.ts index dbe44dd..ddcf8f3 100644 --- a/algos/infinite-grid-ijump-astar/tests/fixtures/get-debug-svg.ts +++ b/algos/infinite-grid-ijump-astar/tests/fixtures/get-debug-svg.ts @@ -4,7 +4,7 @@ import { circuitJsonToPcbSvg } from "circuit-to-svg" import { Circuit } from "@tscircuit/core" import { transformPCBElements } from "@tscircuit/soup-util" import { translate } from "transformation-matrix" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { GeneralizedAstarAutorouter } from "algos/infinite-grid-ijump-astar/v2/lib/GeneralizedAstar" export const getDebugSvg = ({ @@ -15,9 +15,9 @@ export const getDebugSvg = ({ colWidth = 0, colCount = 1, }: { - inputCircuitJson: AnySoupElement[] + inputCircuitJson: AnyCircuitElement[] autorouter: GeneralizedAstarAutorouter - solution?: AnySoupElement[] | SimplifiedPcbTrace[] + solution?: AnyCircuitElement[] | SimplifiedPcbTrace[] rowHeight?: number colWidth?: number colCount?: number @@ -29,7 +29,7 @@ export const getDebugSvg = ({ }), ) - const aggCircuitJson: AnySoupElement[] = [] + const aggCircuitJson: AnyCircuitElement[] = [] const getTranslationForIndex = (i: number) => { if (colCount && colWidth) { diff --git a/algos/infinite-grid-ijump-astar/tests/get-debug-svg.test.tsx b/algos/infinite-grid-ijump-astar/tests/get-debug-svg.test.tsx index 24ed848..baa5c7d 100644 --- a/algos/infinite-grid-ijump-astar/tests/get-debug-svg.test.tsx +++ b/algos/infinite-grid-ijump-astar/tests/get-debug-svg.test.tsx @@ -5,7 +5,7 @@ import { IJumpAutorouter } from "../v2" import { Circuit } from "@tscircuit/core" import { transformPCBElements } from "@tscircuit/soup-util" import { translate } from "transformation-matrix" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getDebugSvg } from "./fixtures/get-debug-svg" test("ijump-astar: intersection with margin", () => { diff --git a/algos/infinite-grid-ijump-astar/tests/intersection-with-margin.test.tsx b/algos/infinite-grid-ijump-astar/tests/intersection-with-margin.test.tsx index 6c52272..f72ef84 100644 --- a/algos/infinite-grid-ijump-astar/tests/intersection-with-margin.test.tsx +++ b/algos/infinite-grid-ijump-astar/tests/intersection-with-margin.test.tsx @@ -5,7 +5,7 @@ import { IJumpAutorouter } from "../v2" import { Circuit } from "@tscircuit/core" import { transformPCBElements } from "@tscircuit/soup-util" import { translate } from "transformation-matrix" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getDebugSvg } from "./fixtures/get-debug-svg" const OneByOnePad = (props: { name: string; pcbX?: number; pcbY?: number }) => ( diff --git a/algos/infinite-grid-ijump-astar/tests/multimargin-bga.test.tsx b/algos/infinite-grid-ijump-astar/tests/multimargin-bga.test.tsx index 28d8b58..45da39c 100644 --- a/algos/infinite-grid-ijump-astar/tests/multimargin-bga.test.tsx +++ b/algos/infinite-grid-ijump-astar/tests/multimargin-bga.test.tsx @@ -5,7 +5,7 @@ import { IJumpAutorouter } from "../v2" import { Circuit } from "@tscircuit/core" import { transformPCBElements } from "@tscircuit/soup-util" import { translate } from "transformation-matrix" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getDebugSvg } from "./fixtures/get-debug-svg" import { IJumpMultiMarginAutorouter } from "../v2/lib/IJumpMultiMarginAutorouter" diff --git a/algos/infinite-grid-ijump-astar/tests/multimargin.test.tsx b/algos/infinite-grid-ijump-astar/tests/multimargin.test.tsx index 6bd62f5..1fb44ef 100644 --- a/algos/infinite-grid-ijump-astar/tests/multimargin.test.tsx +++ b/algos/infinite-grid-ijump-astar/tests/multimargin.test.tsx @@ -5,7 +5,7 @@ import { IJumpAutorouter } from "../v2" import { Circuit } from "@tscircuit/core" import { transformPCBElements } from "@tscircuit/soup-util" import { translate } from "transformation-matrix" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getDebugSvg } from "./fixtures/get-debug-svg" import { IJumpMultiMarginAutorouter } from "../v2/lib/IJumpMultiMarginAutorouter" diff --git a/algos/infinite-grid-ijump-astar/v1/index.ts b/algos/infinite-grid-ijump-astar/v1/index.ts index 52c3e76..891686d 100644 --- a/algos/infinite-grid-ijump-astar/v1/index.ts +++ b/algos/infinite-grid-ijump-astar/v1/index.ts @@ -5,11 +5,11 @@ import { type SimpleRouteJson, } from "solver-utils" import type { - AnySoupElement, + AnyCircuitElement, PcbFabricationNotePath, PcbFabricationNoteText, PCBSMTPad, -} from "@tscircuit/soup" +} from "circuit-json" import type { SolutionWithDebugInfo } from "autorouting-dataset/lib/solver-utils/ProblemSolver" import Debug from "debug" import { getObstaclesFromTrace } from "./lib/getObstaclesFromTrace" @@ -716,7 +716,7 @@ function routeConnection( } } -export function autoroute(soup: AnySoupElement[]): SolutionWithDebugInfo { +export function autoroute(soup: AnyCircuitElement[]): SolutionWithDebugInfo { if (debug.enabled) { debugGroup = null debugTraceCount = 0 diff --git a/algos/infinite-grid-ijump-astar/v2/index.ts b/algos/infinite-grid-ijump-astar/v2/index.ts index d87e1e4..1716513 100644 --- a/algos/infinite-grid-ijump-astar/v2/index.ts +++ b/algos/infinite-grid-ijump-astar/v2/index.ts @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { SolutionWithDebugInfo } from "solver-utils/ProblemSolver" import { IJumpAutorouter } from "./lib/IJumpAutorouter" import { @@ -9,7 +9,7 @@ import { import { getObstaclesFromCircuitJson } from "solver-utils/getObstaclesFromCircuitJson" import { IJumpMultiMarginAutorouter } from "./lib/IJumpMultiMarginAutorouter" -export function autoroute(soup: AnySoupElement[]): SolutionWithDebugInfo { +export function autoroute(soup: AnyCircuitElement[]): SolutionWithDebugInfo { const input = getSimpleRouteJson(soup) const autorouter = new IJumpAutorouter({ @@ -26,7 +26,7 @@ export function autoroute(soup: AnySoupElement[]): SolutionWithDebugInfo { } export function autorouteMultiMargin( - soup: AnySoupElement[], + soup: AnyCircuitElement[], ): SolutionWithDebugInfo { const input = getSimpleRouteJson(soup) diff --git a/algos/infinite-grid-ijump-astar/v2/lib/GeneralizedAstar.ts b/algos/infinite-grid-ijump-astar/v2/lib/GeneralizedAstar.ts index 1fe9164..d2e0f0b 100644 --- a/algos/infinite-grid-ijump-astar/v2/lib/GeneralizedAstar.ts +++ b/algos/infinite-grid-ijump-astar/v2/lib/GeneralizedAstar.ts @@ -1,4 +1,4 @@ -import type { AnySoupElement, LayerRef, PCBSMTPad } from "@tscircuit/soup" +import type { AnyCircuitElement, LayerRef, PCBSMTPad } from "circuit-json" // import { QuadtreeObstacleList } from "./QuadtreeObstacleList" import type { Node, Point, PointWithObstacleHit } from "./types" import { manDist, nodeName } from "./util" @@ -30,7 +30,7 @@ export class GeneralizedAstarAutorouter { closedSet: Set = new Set() debug = false - debugSolutions?: Record + debugSolutions?: Record debugMessage: string | null = null debugTraceCount: number = 0 diff --git a/algos/infinite-grid-ijump-astar/v2/lib/IJumpAutorouter.ts b/algos/infinite-grid-ijump-astar/v2/lib/IJumpAutorouter.ts index 1bfa6e8..c15337a 100644 --- a/algos/infinite-grid-ijump-astar/v2/lib/IJumpAutorouter.ts +++ b/algos/infinite-grid-ijump-astar/v2/lib/IJumpAutorouter.ts @@ -10,7 +10,7 @@ import type { } from "./types" import { clamp, dirFromAToB, dist, distAlongDir } from "./util" import { getDistanceToOvercomeObstacle } from "./getDistanceToOvercomeObstacle" -import { distance } from "@tscircuit/soup" +import { distance } from "circuit-json" export class IJumpAutorouter extends GeneralizedAstarAutorouter { MAX_ITERATIONS: number = 200 diff --git a/algos/infinite-grid-ijump-astar/v2/lib/IJumpMultiMarginAutorouter.ts b/algos/infinite-grid-ijump-astar/v2/lib/IJumpMultiMarginAutorouter.ts index 831a50d..0ae0597 100644 --- a/algos/infinite-grid-ijump-astar/v2/lib/IJumpMultiMarginAutorouter.ts +++ b/algos/infinite-grid-ijump-astar/v2/lib/IJumpMultiMarginAutorouter.ts @@ -10,7 +10,7 @@ import type { } from "./types" import { clamp, dirFromAToB, dist, distAlongDir, manDist } from "./util" import { getDistanceToOvercomeObstacle } from "./getDistanceToOvercomeObstacle" -import { distance } from "@tscircuit/soup" +import { distance } from "circuit-json" export class IJumpMultiMarginAutorouter extends GeneralizedAstarAutorouter { MAX_ITERATIONS: number = 500 diff --git a/algos/jump-point-grid/index.ts b/algos/jump-point-grid/index.ts index 067a8d9..a986064 100644 --- a/algos/jump-point-grid/index.ts +++ b/algos/jump-point-grid/index.ts @@ -1,8 +1,8 @@ import { Grid, JumpPointFinder, DiagonalMovement } from "pathfinding" import { getSimpleRouteJson, type SimplifiedPcbTrace } from "solver-utils" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" -export function autoroute(soup: AnySoupElement[]): SimplifiedPcbTrace[] { +export function autoroute(soup: AnyCircuitElement[]): SimplifiedPcbTrace[] { const input = getSimpleRouteJson(soup) const gridSize = 0.1 // Assume 1 unit grid size const bufferSize = 0 diff --git a/algos/multi-layer-ijump/MultilayerIjump.ts b/algos/multi-layer-ijump/MultilayerIjump.ts index 60a4350..83181c6 100644 --- a/algos/multi-layer-ijump/MultilayerIjump.ts +++ b/algos/multi-layer-ijump/MultilayerIjump.ts @@ -34,7 +34,7 @@ import { } from "circuit-json-to-connectivity-map" import type { ConnectionWithGoalAlternatives } from "autorouting-dataset/lib/solver-utils/ConnectionWithAlternatives" import { nanoid } from "nanoid" -import type { LayerRef, PCBTrace } from "@tscircuit/soup" +import type { LayerRef, PCBTrace } from "circuit-json" import { getAlternativeGoalBoxes, getConnectionWithAlternativeGoalBoxes, diff --git a/algos/multi-layer-ijump/index.ts b/algos/multi-layer-ijump/index.ts index a571907..1a3e9f4 100644 --- a/algos/multi-layer-ijump/index.ts +++ b/algos/multi-layer-ijump/index.ts @@ -1,10 +1,10 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { SolutionWithDebugInfo } from "autorouting-dataset/lib/solver-utils/ProblemSolver" import { getSimpleRouteJson } from "autorouting-dataset/lib/solver-utils/getSimpleRouteJson" import { MultilayerIjump } from "./MultilayerIjump" import { getFullConnectivityMapFromCircuitJson } from "circuit-json-to-connectivity-map" -export function autoroute(soup: AnySoupElement[]): SolutionWithDebugInfo { +export function autoroute(soup: AnyCircuitElement[]): SolutionWithDebugInfo { const connMap = getFullConnectivityMapFromCircuitJson(soup) const input = getSimpleRouteJson(soup, { layerCount: 2, diff --git a/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-bottom-crossing.snap.svg b/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-bottom-crossing.snap.svg index dddadcd..dcdef03 100644 --- a/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-bottom-crossing.snap.svg +++ b/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-bottom-crossing.snap.svg @@ -9,4 +9,4 @@ .pcb-silkscreen-top { stroke: #f2eda1; } .pcb-silkscreen-bottom { stroke: #f2eda1; } .pcb-silkscreen-text { fill: #f2eda1; } - X001t1_iter[0]X0012345t1_iter[1]X1012345t1_iter[2]X001t2_iter[0]X0012345t2_iter[1]X10123456t2_iter[2]X1012345678910t2_iter[3]X001234567891011t2_iter[4]X00123456789101112t2_iter[5]X101234567891011121314t2_iter[6]X001234567891011121314t2_iter[7]X10123456789101112131415t2_iter[8]X1012345678910111213141516t2_iter[9]X00123456789101112131415161718t2_iter[10]X101234567891011121314151617t2_iter[11]X00123456789101112131415161718192021t2_iter[12]X00123456789101112131415161718192021t2_iter[13]X101234567891011121314151617181920t2_iter[14]X1012345678910111213141516171819t2_iter[15] \ No newline at end of file + X001t1_iter[0]X0012345t1_iter[1]X1012345t1_iter[2]X001t2_iter[0]X0012345t2_iter[1]X10123456t2_iter[2]X1012345678910t2_iter[3]X001234567891011t2_iter[4]X00123456789101112t2_iter[5]X101234567891011121314t2_iter[6]X001234567891011121314t2_iter[7]X10123456789101112131415t2_iter[8]X1012345678910111213141516t2_iter[9]X00123456789101112131415161718t2_iter[10]X101234567891011121314151617t2_iter[11]X00123456789101112131415161718192021t2_iter[12]X00123456789101112131415161718192021t2_iter[13]X101234567891011121314151617181920t2_iter[14]X1012345678910111213141516171819t2_iter[15] \ No newline at end of file diff --git a/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-ijump-simple.snap.svg b/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-ijump-simple.snap.svg index def3bb7..1fc8636 100644 --- a/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-ijump-simple.snap.svg +++ b/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-ijump-simple.snap.svg @@ -9,4 +9,4 @@ .pcb-silkscreen-top { stroke: #f2eda1; } .pcb-silkscreen-bottom { stroke: #f2eda1; } .pcb-silkscreen-text { fill: #f2eda1; } - X001t1_iter[0]X0012345t1_iter[1]X1012345t1_iter[2] \ No newline at end of file + X001t1_iter[0]X0012345t1_iter[1]X1012345t1_iter[2] \ No newline at end of file diff --git a/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-ijump-single-layer.snap.svg b/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-ijump-single-layer.snap.svg index e72f2f2..49bfcd6 100644 --- a/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-ijump-single-layer.snap.svg +++ b/algos/multi-layer-ijump/tests/__snapshots__/multi-layer-ijump-single-layer.snap.svg @@ -9,4 +9,4 @@ .pcb-silkscreen-top { stroke: #f2eda1; } .pcb-silkscreen-bottom { stroke: #f2eda1; } .pcb-silkscreen-text { fill: #f2eda1; } - X001t1_iter[0]X0012345t1_iter[1]X00123456t1_iter[2]X001234567t1_iter[3] \ No newline at end of file + X001t1_iter[0]X0012345t1_iter[1]X00123456t1_iter[2]X001234567t1_iter[3] \ No newline at end of file diff --git a/algos/multi-layer-ijump/tests/multi-layer-bottom-crossing.test.tsx b/algos/multi-layer-ijump/tests/multi-layer-bottom-crossing.test.tsx index 6a8109c..c70a4c8 100644 --- a/algos/multi-layer-ijump/tests/multi-layer-bottom-crossing.test.tsx +++ b/algos/multi-layer-ijump/tests/multi-layer-bottom-crossing.test.tsx @@ -4,7 +4,7 @@ import { circuitJsonToPcbSvg } from "circuit-to-svg" import { Circuit } from "@tscircuit/core" import { transformPCBElements } from "@tscircuit/soup-util" import { translate } from "transformation-matrix" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getDebugSvg } from "../../infinite-grid-ijump-astar/tests/fixtures/get-debug-svg" import { MultilayerIjump } from "../MultilayerIjump" diff --git a/algos/multi-layer-ijump/tests/multi-layer-ijump-simple.test.tsx b/algos/multi-layer-ijump/tests/multi-layer-ijump-simple.test.tsx index 299d432..28529cd 100644 --- a/algos/multi-layer-ijump/tests/multi-layer-ijump-simple.test.tsx +++ b/algos/multi-layer-ijump/tests/multi-layer-ijump-simple.test.tsx @@ -4,7 +4,7 @@ import { circuitJsonToPcbSvg } from "circuit-to-svg" import { Circuit } from "@tscircuit/core" import { transformPCBElements } from "@tscircuit/soup-util" import { translate } from "transformation-matrix" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getDebugSvg } from "../../infinite-grid-ijump-astar/tests/fixtures/get-debug-svg" import { MultilayerIjump } from "../MultilayerIjump" diff --git a/algos/multi-layer-ijump/tests/multi-layer-ijump-single-layer.test.tsx b/algos/multi-layer-ijump/tests/multi-layer-ijump-single-layer.test.tsx index 207135a..5da3635 100644 --- a/algos/multi-layer-ijump/tests/multi-layer-ijump-single-layer.test.tsx +++ b/algos/multi-layer-ijump/tests/multi-layer-ijump-single-layer.test.tsx @@ -4,7 +4,7 @@ import { circuitJsonToPcbSvg } from "circuit-to-svg" import { Circuit } from "@tscircuit/core" import { transformPCBElements } from "@tscircuit/soup-util" import { translate } from "transformation-matrix" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getDebugSvg } from "../../infinite-grid-ijump-astar/tests/fixtures/get-debug-svg" import { MultilayerIjump } from "../MultilayerIjump" diff --git a/algos/multi-layer-ijump/tests/same-net-many-pads.test.tsx b/algos/multi-layer-ijump/tests/same-net-many-pads.test.tsx index e713588..7497c31 100644 --- a/algos/multi-layer-ijump/tests/same-net-many-pads.test.tsx +++ b/algos/multi-layer-ijump/tests/same-net-many-pads.test.tsx @@ -4,7 +4,7 @@ import { circuitJsonToPcbSvg } from "circuit-to-svg" import { Circuit } from "@tscircuit/core" import { transformPCBElements } from "@tscircuit/soup-util" import { translate } from "transformation-matrix" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getDebugSvg } from "../../infinite-grid-ijump-astar/tests/fixtures/get-debug-svg" import { MultilayerIjump } from "../MultilayerIjump" import { getFullConnectivityMapFromCircuitJson } from "circuit-json-to-connectivity-map" diff --git a/algos/multi-layer-ijump/util.ts b/algos/multi-layer-ijump/util.ts index a4bd49c..354ad53 100644 --- a/algos/multi-layer-ijump/util.ts +++ b/algos/multi-layer-ijump/util.ts @@ -1,4 +1,4 @@ -import type { LayerRef } from "@tscircuit/soup" +import type { LayerRef } from "circuit-json" import type { Point3d, Direction3d } from "./types" export function dirFromAToB(nodeA: Point3d, nodeB: Point3d): Direction3d { diff --git a/algos/simple-grid/index.ts b/algos/simple-grid/index.ts index f16bf76..55a6405 100644 --- a/algos/simple-grid/index.ts +++ b/algos/simple-grid/index.ts @@ -1,8 +1,8 @@ import { Grid, AStarFinder, DiagonalMovement } from "pathfinding" import { getSimpleRouteJson, type SimplifiedPcbTrace } from "solver-utils" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" -export function autoroute(soup: AnySoupElement[]): SimplifiedPcbTrace[] { +export function autoroute(soup: AnyCircuitElement[]): SimplifiedPcbTrace[] { const input = getSimpleRouteJson(soup) const gridSize = 0.1 // Assume 1 unit grid size const bufferSize = 0 diff --git a/algos/tscircuit-builtin/index.ts b/algos/tscircuit-builtin/index.ts index 1ba21ab..c5e1750 100644 --- a/algos/tscircuit-builtin/index.ts +++ b/algos/tscircuit-builtin/index.ts @@ -1,4 +1,4 @@ -import type { AnySoupElement, PCBTrace } from "@tscircuit/soup" +import type { AnyCircuitElement, PCBTrace } from "circuit-json" import { buildPcbTraceElements } from "@tscircuit/builder" import { su } from "@tscircuit/soup-util" import { mm } from "@tscircuit/mm" @@ -15,8 +15,8 @@ function getBuildContext(): any { } } -export const tscircuitBuiltinSolver = (soup: AnySoupElement[]) => { - const newElements: AnySoupElement[] = [] +export const tscircuitBuiltinSolver = (soup: AnyCircuitElement[]) => { + const newElements: AnyCircuitElement[] = [] const nm = new NetManager() const ctx = getBuildContext() for (const source_trace of su(soup).source_trace.list()) { diff --git a/bun.lockb b/bun.lockb index 5d7eded8e9c887f95ed4cd010a1aba825dba9b02..4b54cad9423869abb9aba0c3f333ce54d63ea205 100755 GIT binary patch delta 48499 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 delta 47664 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 { const [selectedDebugSolution, setSelectedDebugSolution] = useState< null | string >(null) - const [pastedSoup, setPastedSoup] = useState() + const [pastedSoup, setPastedSoup] = useState() // Derive problem from url (if present) const [, , selectedProblemType, seedStr] = window.location.pathname.split("/") const seed = seedStr ? Number.parseInt(seedStr) : 0 diff --git a/frontend/window-global.ts b/frontend/window-global.ts index 707a349..7a7d68b 100644 --- a/frontend/window-global.ts +++ b/frontend/window-global.ts @@ -1,9 +1,9 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" declare global { interface Window { - PROBLEM_SOUP: AnySoupElement[] - SOLUTION_SOUP: AnySoupElement[] + PROBLEM_SOUP: AnyCircuitElement[] + SOLUTION_SOUP: AnyCircuitElement[] HAS_CUSTOM_SOLVER?: string USER_MESSAGE?: string SOLVER_NAME?: string @@ -12,7 +12,7 @@ declare global { AVAILABLE_DATASETS?: string[] SOLUTION_COMPUTE_TIME?: number IS_SOLUTION_CORRECT?: boolean - DEBUG_SOLUTIONS?: Record + DEBUG_SOLUTIONS?: Record DEBUG_MESSAGE?: string } } diff --git a/module/lib/benchmark/is-valid-solution.ts b/module/lib/benchmark/is-valid-solution.ts index 3446dda..4cc8fec 100644 --- a/module/lib/benchmark/is-valid-solution.ts +++ b/module/lib/benchmark/is-valid-solution.ts @@ -1,10 +1,10 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { runChecks } from "./run-checks" import type { SimplifiedPcbTrace } from "../types" export const isValidSolution = ( - problem?: AnySoupElement[], - solution?: AnySoupElement[] | SimplifiedPcbTrace[], + problem?: AnyCircuitElement[], + solution?: AnyCircuitElement[] | SimplifiedPcbTrace[], ): boolean => { if (!problem || !solution) return false return runChecks(problem, solution as any).length === 0 diff --git a/module/lib/benchmark/run-benchmark.ts b/module/lib/benchmark/run-benchmark.ts index 7c88c65..f202d5c 100644 --- a/module/lib/benchmark/run-benchmark.ts +++ b/module/lib/benchmark/run-benchmark.ts @@ -1,6 +1,6 @@ import type { ProblemSolver } from "../solver-utils/ProblemSolver" import { getDatasetGenerator } from "../generators" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { ProblemType } from "../generators/types" import { isValidSolution } from "./is-valid-solution" import kleur from "kleur" diff --git a/module/lib/benchmark/run-checks.ts b/module/lib/benchmark/run-checks.ts index cd4c24e..f57cce9 100644 --- a/module/lib/benchmark/run-checks.ts +++ b/module/lib/benchmark/run-checks.ts @@ -2,12 +2,12 @@ import { checkEachPcbPortConnected, checkEachPcbTraceNonOverlapping, } from "@tscircuit/checks" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" export const runChecks = ( - problemSoup: AnySoupElement[], - solutionSoup: AnySoupElement[], -): AnySoupElement[] => { + problemSoup: AnyCircuitElement[], + solutionSoup: AnyCircuitElement[], +): AnyCircuitElement[] => { const errors = [ ...checkEachPcbTraceNonOverlapping(problemSoup.concat(solutionSoup)), ...checkEachPcbPortConnected(problemSoup.concat(solutionSoup)), diff --git a/module/lib/generator-utils/renderCircuitToSoup.ts b/module/lib/generator-utils/renderCircuitToSoup.ts index 50ac661..3cda28f 100644 --- a/module/lib/generator-utils/renderCircuitToSoup.ts +++ b/module/lib/generator-utils/renderCircuitToSoup.ts @@ -1,10 +1,10 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { createRoot } from "@tscircuit/react-fiber" import { createProjectBuilder } from "@tscircuit/builder" export const renderCircuitToSoup = ( circuitReact: any, -): Promise => { +): Promise => { const project = createProjectBuilder() return createRoot().render(circuitReact, project) as any diff --git a/module/lib/generator-utils/replaceTracesWithErrors.ts b/module/lib/generator-utils/replaceTracesWithErrors.ts index a197945..667adf0 100644 --- a/module/lib/generator-utils/replaceTracesWithErrors.ts +++ b/module/lib/generator-utils/replaceTracesWithErrors.ts @@ -1,10 +1,10 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { su } from "@tscircuit/soup-util" export const replaceTracesWithErrors = ( - soup: AnySoupElement[], -): AnySoupElement[] => { - const newSoup: AnySoupElement[] = [] + soup: AnyCircuitElement[], +): AnyCircuitElement[] => { + const newSoup: AnyCircuitElement[] = [] for (const element of soup) { if (element.type === "pcb_trace") { const { pcb_component_id, source_trace_id, route, pcb_trace_id } = element diff --git a/module/lib/generators/distant-single-trace/index.tsx b/module/lib/generators/distant-single-trace/index.tsx index cfd86ad..3727ff9 100644 --- a/module/lib/generators/distant-single-trace/index.tsx +++ b/module/lib/generators/distant-single-trace/index.tsx @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { renderCircuitToSoup } from "../../generator-utils/renderCircuitToSoup" import type { ProblemGenerator } from "../types" import { SingleTraceCircuit } from "../single-trace/SingleTraceCircuit" @@ -6,7 +6,7 @@ import { replaceTracesWithErrors } from "../../generator-utils/replaceTracesWith export const getDistantSingleTraceProblemGenerator = (): ProblemGenerator => { const generateDistantSingleTraceProblem: ProblemGenerator["getExample"] = - async ({ seed }): Promise => { + async ({ seed }): Promise => { return replaceTracesWithErrors( await renderCircuitToSoup( , diff --git a/module/lib/generators/keyboards/index.tsx b/module/lib/generators/keyboards/index.tsx index 650e0e1..c1ecc7f 100644 --- a/module/lib/generators/keyboards/index.tsx +++ b/module/lib/generators/keyboards/index.tsx @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { renderCircuitToSoup } from "../../generator-utils/renderCircuitToSoup" import type { ProblemGenerator } from "../types" import { replaceTracesWithErrors } from "../../generator-utils/replaceTracesWithErrors" @@ -31,7 +31,7 @@ const progression = [ export const getKeyboardGenerator = (): ProblemGenerator => { const generateKeyboardProblem: ProblemGenerator["getExample"] = async ({ seed, - }): Promise => { + }): Promise => { const circuit = new Circuit() if (seed <= progression.length) { diff --git a/module/lib/generators/single-trace-multilayer/index.tsx b/module/lib/generators/single-trace-multilayer/index.tsx index ad9789a..4c65c8f 100644 --- a/module/lib/generators/single-trace-multilayer/index.tsx +++ b/module/lib/generators/single-trace-multilayer/index.tsx @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { renderCircuitToSoup } from "../../generator-utils/renderCircuitToSoup" import type { ProblemGenerator } from "../types" import { SingleTraceMultilayerCircuit } from "./SingleTraceMultilayerCircuit" @@ -8,7 +8,7 @@ import { withCheckRegenerate } from "../utils/with-check-regenerate" export const getSingleTraceMultilayerProblemGenerator = (): ProblemGenerator => { const generateSingleTraceMultilayerProblem: ProblemGenerator["getExample"] = - async ({ seed }): Promise => { + async ({ seed }): Promise => { return replaceTracesWithErrors( await renderCircuitToSoup( , diff --git a/module/lib/generators/single-trace/index.tsx b/module/lib/generators/single-trace/index.tsx index 378c5ab..28459ec 100644 --- a/module/lib/generators/single-trace/index.tsx +++ b/module/lib/generators/single-trace/index.tsx @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { renderCircuitToSoup } from "../../generator-utils/renderCircuitToSoup" import type { ProblemGenerator } from "../types" import { SingleTraceCircuit } from "./SingleTraceCircuit" @@ -8,7 +8,7 @@ import { withCheckRegenerate } from "../utils/with-check-regenerate" export const getSingleTraceProblemGenerator = (): ProblemGenerator => { const generateSingleTraceProblem: ProblemGenerator["getExample"] = async ({ seed, - }): Promise => { + }): Promise => { return replaceTracesWithErrors( await renderCircuitToSoup(), ) diff --git a/module/lib/generators/traces/index.tsx b/module/lib/generators/traces/index.tsx index b0bf20c..f5891db 100644 --- a/module/lib/generators/traces/index.tsx +++ b/module/lib/generators/traces/index.tsx @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { renderCircuitToSoup } from "../../generator-utils/renderCircuitToSoup" import type { ProblemGenerator } from "../types" import { TracesCircuit } from "./TracesCircuit" @@ -8,7 +8,7 @@ import { withCheckRegenerate } from "../utils/with-check-regenerate" export const getTracesProblemGenerator = (): ProblemGenerator => { const generateTracesProblem: ProblemGenerator["getExample"] = async ({ seed, - }): Promise => { + }): Promise => { return replaceTracesWithErrors( await renderCircuitToSoup(), ) diff --git a/module/lib/generators/types.ts b/module/lib/generators/types.ts index 2f06c29..b15adda 100644 --- a/module/lib/generators/types.ts +++ b/module/lib/generators/types.ts @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" export type ProblemType = | "single-trace" @@ -8,5 +8,5 @@ export type ProblemType = | "keyboards" export type ProblemGenerator = { - getExample: (params: { seed: number }) => Promise + getExample: (params: { seed: number }) => Promise } diff --git a/module/lib/generators/utils/with-check-regenerate.ts b/module/lib/generators/utils/with-check-regenerate.ts index 6a1bd2c..508205a 100644 --- a/module/lib/generators/utils/with-check-regenerate.ts +++ b/module/lib/generators/utils/with-check-regenerate.ts @@ -1,7 +1,7 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { ProblemGenerator } from "../types" -export const hasOverlappingPads = (soup: AnySoupElement[]) => { +export const hasOverlappingPads = (soup: AnyCircuitElement[]) => { const pads = soup.filter((element) => element.type === "pcb_smtpad") for (const pad of pads) { for (const otherPad of pads) { diff --git a/module/lib/server/app-context.ts b/module/lib/server/app-context.ts index 173cbf5..1b5d1ad 100644 --- a/module/lib/server/app-context.ts +++ b/module/lib/server/app-context.ts @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { ProblemSolver } from "../solver-utils/ProblemSolver" export type AppContext = { diff --git a/module/lib/server/get-script-content.ts b/module/lib/server/get-script-content.ts index 9a8e8fb..e2fdf7b 100644 --- a/module/lib/server/get-script-content.ts +++ b/module/lib/server/get-script-content.ts @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { AVAILABLE_DATASETS } from "./available-datasets" import { AVAILABLE_SOLVERS } from "./available-solvers" @@ -17,11 +17,11 @@ export const getScriptContent = ({ solutionComputeTime, isSolutionCorrect, }: { - problemSoup?: AnySoupElement[] - problemSoupWithErrors?: AnySoupElement[] | null - solutionSoup?: AnySoupElement[] + problemSoup?: AnyCircuitElement[] + problemSoupWithErrors?: AnyCircuitElement[] | null + solutionSoup?: AnyCircuitElement[] solutionComputeTime?: number - debugSolutions?: Record | null + debugSolutions?: Record | null debugMessage?: string userMessage?: string solverName?: string diff --git a/module/lib/server/server-entrypoint.ts b/module/lib/server/server-entrypoint.ts index a93945c..6cf56f0 100644 --- a/module/lib/server/server-entrypoint.ts +++ b/module/lib/server/server-entrypoint.ts @@ -6,7 +6,7 @@ import frontendJs from "../../../frontend-dist/assets/index.js" with { } import { getScriptContent } from "./get-script-content" import { getDatasetGenerator } from "../generators" -import type { AnySoupElement, LayerRef } from "@tscircuit/soup" +import type { AnyCircuitElement, LayerRef } from "circuit-json" import type { AppContext } from "./app-context" import type { IncomingMessage, ServerResponse } from "node:http" import { @@ -30,8 +30,8 @@ export const serverEntrypoint = async ( ctx: AppContext, ) => { let { solver = tscircuitBuiltinSolver } = ctx - let problemSoup: AnySoupElement[] | undefined - let solutionSoup: AnySoupElement[] | undefined + let problemSoup: AnyCircuitElement[] | undefined + let solutionSoup: AnyCircuitElement[] | undefined let userMessage: string | undefined // If the url is /problem/single-trace/1/simple-grid, then set the solver @@ -100,14 +100,14 @@ export const serverEntrypoint = async ( } let solutionComputeTime: number | undefined - let debugSolutions: Record | undefined + let debugSolutions: Record | undefined let debugMessage: string | undefined if (problemSoup) { const startTime = performance.now() try { const solverResult = await normalizeSolution( - solver(problemSoup as AnySoupElement[]), + solver(problemSoup as AnyCircuitElement[]), ) debugSolutions = solverResult.debugSolutions debugMessage = solverResult.debugMessage! diff --git a/module/lib/solver-postprocessing/add-vias-for-pcb-trace-routes.ts b/module/lib/solver-postprocessing/add-vias-for-pcb-trace-routes.ts index 4fe6bd4..b35862d 100644 --- a/module/lib/solver-postprocessing/add-vias-for-pcb-trace-routes.ts +++ b/module/lib/solver-postprocessing/add-vias-for-pcb-trace-routes.ts @@ -1,6 +1,6 @@ -import type { AnySoupElement, LayerRef } from "@tscircuit/soup" +import type { AnyCircuitElement, LayerRef } from "circuit-json" -export function addViasForPcbTraceRoutes(solutionSoup: AnySoupElement[]) { +export function addViasForPcbTraceRoutes(solutionSoup: AnyCircuitElement[]) { for (const elm of solutionSoup ?? []) { if (elm.type === "pcb_trace") { for (const point of elm.route) { diff --git a/module/lib/solver-utils/ProblemSolver.ts b/module/lib/solver-utils/ProblemSolver.ts index d227f46..068213d 100644 --- a/module/lib/solver-utils/ProblemSolver.ts +++ b/module/lib/solver-utils/ProblemSolver.ts @@ -1,11 +1,11 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { SimplifiedPcbTrace } from "../types" -export type ValidSolutionElement = AnySoupElement | SimplifiedPcbTrace +export type ValidSolutionElement = AnyCircuitElement | SimplifiedPcbTrace export type SolutionWithDebugInfo< - SolElm extends AnySoupElement | SimplifiedPcbTrace = - | AnySoupElement + SolElm extends AnyCircuitElement | SimplifiedPcbTrace = + | AnyCircuitElement | SimplifiedPcbTrace, > = { solution: SolElm[] @@ -20,7 +20,7 @@ export type SolutionWithDebugInfo< * For a good example of debugSolutions, check out the gridless-poi solver * that outputs a visualization of it's mesh. */ - debugSolutions?: Record + debugSolutions?: Record /** * Solvers can return a debugMessage, usually with the iteration count or odd @@ -30,7 +30,7 @@ export type SolutionWithDebugInfo< } export type ProblemSolver = ( - soup: AnySoupElement[], + soup: AnyCircuitElement[], ) => | ValidSolutionElement[] | Promise diff --git a/module/lib/solver-utils/createSolverFromUrl.ts b/module/lib/solver-utils/createSolverFromUrl.ts index 80f9e27..c88c91a 100644 --- a/module/lib/solver-utils/createSolverFromUrl.ts +++ b/module/lib/solver-utils/createSolverFromUrl.ts @@ -1,9 +1,9 @@ import type { ProblemSolver } from "./ProblemSolver" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getSimpleRouteJson } from "./getSimpleRouteJson" export const createSolverFromUrl = (solverUrl: string): ProblemSolver => { - return async (problemSoup: AnySoupElement[]): Promise => { + return async (problemSoup: AnyCircuitElement[]): Promise => { const simple_route_json = await getSimpleRouteJson(problemSoup) const response = await fetch(solverUrl, { method: "POST", diff --git a/module/lib/solver-utils/getAlternativeGoalBoxes.ts b/module/lib/solver-utils/getAlternativeGoalBoxes.ts index 52d8b6d..78adcc2 100644 --- a/module/lib/solver-utils/getAlternativeGoalBoxes.ts +++ b/module/lib/solver-utils/getAlternativeGoalBoxes.ts @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { getObstaclesFromCircuitJson, type Obstacle, diff --git a/module/lib/solver-utils/getObstaclesFromCircuitJson.ts b/module/lib/solver-utils/getObstaclesFromCircuitJson.ts index 6e6097a..177c7de 100644 --- a/module/lib/solver-utils/getObstaclesFromCircuitJson.ts +++ b/module/lib/solver-utils/getObstaclesFromCircuitJson.ts @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { Obstacle } from "../types" import { getObstaclesFromRoute } from "./getObstaclesFromRoute" import type { ConnectivityMap } from "circuit-json-to-connectivity-map" @@ -6,7 +6,7 @@ import type { ConnectivityMap } from "circuit-json-to-connectivity-map" const EVERY_LAYER = ["top", "inner1", "inner2", "bottom"] export const getObstaclesFromCircuitJson = ( - soup: AnySoupElement[], + soup: AnyCircuitElement[], connMap?: ConnectivityMap, ) => { const withNetId = (idList: string[]) => diff --git a/module/lib/solver-utils/getSimpleRouteJson.ts b/module/lib/solver-utils/getSimpleRouteJson.ts index 51634b0..d6bbca3 100644 --- a/module/lib/solver-utils/getSimpleRouteJson.ts +++ b/module/lib/solver-utils/getSimpleRouteJson.ts @@ -1,4 +1,4 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { SimpleRouteConnection, SimpleRouteJson } from "./SimpleRouteJson" import { su } from "@tscircuit/soup-util" import type { Obstacle } from "../types" @@ -12,7 +12,7 @@ import { } from "circuit-json-to-connectivity-map" export const getSimpleRouteJson = ( - soup: AnySoupElement[], + soup: AnyCircuitElement[], opts: { layerCount?: number optimizeWithGoalBoxes?: boolean diff --git a/module/lib/solver-utils/normalize-solution.ts b/module/lib/solver-utils/normalize-solution.ts index e7932fc..8422ee9 100644 --- a/module/lib/solver-utils/normalize-solution.ts +++ b/module/lib/solver-utils/normalize-solution.ts @@ -1,14 +1,14 @@ -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import type { ProblemSolver, SolutionWithDebugInfo } from "./ProblemSolver" export const normalizeSolution = async ( $solverResult: ReturnType, -): Promise> => { +): Promise> => { const solverResult = await $solverResult if ("solution" in solverResult) { return solverResult as any } return { - solution: solverResult as AnySoupElement[], + solution: solverResult as AnyCircuitElement[], } } diff --git a/module/tests/dev-server/solve-endpoint.test.ts b/module/tests/dev-server/solve-endpoint.test.ts index 8331446..10bca71 100644 --- a/module/tests/dev-server/solve-endpoint.test.ts +++ b/module/tests/dev-server/solve-endpoint.test.ts @@ -1,7 +1,7 @@ import { test, expect } from "bun:test" import { startDevServer } from "../../lib/server/start-dev-server" import { getDatasetGenerator } from "../../lib/generators" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" import { runChecks } from "../../lib/benchmark/run-checks" import { autoroute } from "algos/simple-grid" import { getSimpleRouteJson } from "../../lib/solver-utils/getSimpleRouteJson" diff --git a/module/tests/get-obstacles-from-circuit-json/pcb-trace-becomes-obstacle.ts b/module/tests/get-obstacles-from-circuit-json/pcb-trace-becomes-obstacle.ts index ed7dfc4..d6e8ecb 100644 --- a/module/tests/get-obstacles-from-circuit-json/pcb-trace-becomes-obstacle.ts +++ b/module/tests/get-obstacles-from-circuit-json/pcb-trace-becomes-obstacle.ts @@ -1,9 +1,9 @@ import { test, expect } from "bun:test" import { getObstaclesFromCircuitJson } from "../../lib/solver-utils/getObstaclesFromCircuitJson" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" test("pcb_trace becomes an obstacle correctly", () => { - const soupWithTrace: AnySoupElement[] = [ + const soupWithTrace: AnyCircuitElement[] = [ { type: "pcb_trace", pcb_trace_id: "trace1", diff --git a/module/tests/get-obstacles-from-circuit-json/vias-should-be-obstacles.test.ts b/module/tests/get-obstacles-from-circuit-json/vias-should-be-obstacles.test.ts index 527fcdc..35f0ca1 100644 --- a/module/tests/get-obstacles-from-circuit-json/vias-should-be-obstacles.test.ts +++ b/module/tests/get-obstacles-from-circuit-json/vias-should-be-obstacles.test.ts @@ -1,9 +1,9 @@ import { test, expect } from "bun:test" import { getObstaclesFromCircuitJson } from "../../lib/solver-utils/getObstaclesFromCircuitJson" -import type { AnySoupElement } from "@tscircuit/soup" +import type { AnyCircuitElement } from "circuit-json" test("pcb_via becomes an obstacle correctly", () => { - const soupWithTrace: AnySoupElement[] = [ + const soupWithTrace: AnyCircuitElement[] = [ { type: "pcb_via", hole_diameter: 0.3, diff --git a/package.json b/package.json index e2af030..ea54905 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "@tscircuit/core": "^0.0.60", "@tscircuit/pcb-viewer": "1.4.5", "@tscircuit/props": "^0.0.63", - "@tscircuit/soup": "^0.0.68", - "@tscircuit/soup-util": "^0.0.23", + "circuit-json": "^0.0.81", + "@tscircuit/soup-util": "^0.0.31", "@types/bun": "latest", "@types/d3-delaunay": "^6.0.4", "@types/debug": "^4.1.12",