From 2aefadbd0712c097130a698326d08cba34b7df7f Mon Sep 17 00:00:00 2001 From: Rishabh Gupta Date: Wed, 29 Jan 2025 03:29:30 +0530 Subject: [PATCH] fix: update the source_trace name to save more info for later stage --- .../process-pcb-traces/index.ts | 4 +- .../convert-nets-to-source-nets-and-traces.ts | 2 +- .../convert-wiring-path-to-pcb-traces.ts | 14 ++++-- lib/utils/get-combined-source-port-name.ts | 46 +++++++++++++++++++ .../repro8-multiple-traces-in-one-net.test.ts | 19 ++++++++ 5 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 lib/utils/get-combined-source-port-name.ts create mode 100644 tests/repros/repro8-multiple-traces-in-one-net.test.ts diff --git a/lib/dsn-pcb/circuit-json-to-dsn-json/process-pcb-traces/index.ts b/lib/dsn-pcb/circuit-json-to-dsn-json/process-pcb-traces/index.ts index afad955..f523031 100644 --- a/lib/dsn-pcb/circuit-json-to-dsn-json/process-pcb-traces/index.ts +++ b/lib/dsn-pcb/circuit-json-to-dsn-json/process-pcb-traces/index.ts @@ -9,6 +9,7 @@ import Debug from "debug" import { findOrCreateViaPadstack } from "./findOrCreateViaPadstack" import { getDsnTraceOperationsWrapper } from "./DsnTraceOperationsWrapper" import { su } from "@tscircuit/soup-util" +import { getCombinedSourcePortName } from "lib/utils/get-combined-source-port-name" const debug = Debug("dsn-converter:processPcbTraces") @@ -62,9 +63,10 @@ export function processPcbTraces( source_trace.connected_source_net_ids.includes(n.source_net_id), ) debug("PCB TRACE\n----------\n", pcbTrace) + const sourceTraceConnectedPortIds = getCombinedSourcePortName(circuitElements, source_trace?.connected_source_port_ids || []) const netName = source_net?.name || - pcbTrace.source_trace_id || + `${pcbTrace.source_trace_id}--${sourceTraceConnectedPortIds}` || dsnWrapper.getNextNetId() let currentLayer = "" diff --git a/lib/dsn-pcb/dsn-json-to-circuit-json/dsn-component-converters/convert-nets-to-source-nets-and-traces.ts b/lib/dsn-pcb/dsn-json-to-circuit-json/dsn-component-converters/convert-nets-to-source-nets-and-traces.ts index e392d7f..0b8ba8b 100644 --- a/lib/dsn-pcb/dsn-json-to-circuit-json/dsn-component-converters/convert-nets-to-source-nets-and-traces.ts +++ b/lib/dsn-pcb/dsn-json-to-circuit-json/dsn-component-converters/convert-nets-to-source-nets-and-traces.ts @@ -8,7 +8,7 @@ export const convertNetsToSourceNetsAndTraces = ({ const result: Array = [] const { nets } = dsnPcb.network - let source_trace_id = 0 + let source_trace_id = dsnPcb.wiring.wires.length for (const { name, pins } of nets) { if (name.startsWith("unconnected-")) continue const source_net: SourceNet = { diff --git a/lib/dsn-pcb/dsn-json-to-circuit-json/dsn-component-converters/convert-wiring-path-to-pcb-traces.ts b/lib/dsn-pcb/dsn-json-to-circuit-json/dsn-component-converters/convert-wiring-path-to-pcb-traces.ts index 9817e11..b5aaffa 100644 --- a/lib/dsn-pcb/dsn-json-to-circuit-json/dsn-component-converters/convert-wiring-path-to-pcb-traces.ts +++ b/lib/dsn-pcb/dsn-json-to-circuit-json/dsn-component-converters/convert-wiring-path-to-pcb-traces.ts @@ -2,6 +2,7 @@ import type { AnyCircuitElement, PcbTrace, PcbTraceRoutePointWire, + SourceTrace, } from "circuit-json" import { type Matrix, applyToPoint } from "transformation-matrix" import type { Wiring } from "../../types" @@ -17,7 +18,7 @@ export const convertWiringPathToPcbTraces = ({ wire: Wiring["wires"][number] transformUmToMm: Matrix netName: string -}): PcbTrace[] => { +}): Array => { const coordinates = wire.path!.coordinates // Convert coordinates to circuit space using the transformation matrix const points: Array<{ x: number; y: number }> = [] @@ -45,10 +46,17 @@ export const convertWiringPathToPcbTraces = ({ const pcbTrace: PcbTrace = { type: "pcb_trace", pcb_trace_id: `pcb_trace_${netName}`, - source_trace_id: netName, + source_trace_id: netName.split("-")[0], route: routePoints as PcbTraceRoutePointWire[], } - return [pcbTrace] + + const sourceTrace: SourceTrace = { + type: "source_trace", + source_trace_id: netName.split("--")[0], + connected_source_net_ids: [], + connected_source_port_ids: netName.split("--").slice(1), + } + return [pcbTrace, sourceTrace] } return [] diff --git a/lib/utils/get-combined-source-port-name.ts b/lib/utils/get-combined-source-port-name.ts new file mode 100644 index 0000000..64b5e5e --- /dev/null +++ b/lib/utils/get-combined-source-port-name.ts @@ -0,0 +1,46 @@ +import type { + AnyCircuitElement, + SourceComponentBase, + SourcePort, +} from "circuit-json" + +interface SourcePortInfo { + displayName: string +} + +export function getCombinedSourcePortName( + circuitElements: AnyCircuitElement[], + connectedSourcePortIds: string[], +): string { + const portInfos: SourcePortInfo[] = [] + + for (const portId of connectedSourcePortIds) { + // Find the source port + const sourcePort = circuitElements.find( + (el) => el.type === "source_port" && el.source_port_id === portId, + ) as SourcePort | undefined + + if (!sourcePort) continue + + // Find the associated component + const sourceComponent = circuitElements.find( + (el) => + el.type === "source_component" && + el.source_component_id === sourcePort.source_component_id, + ) as SourceComponentBase + + if (!sourceComponent) continue + + // Construct display name combining component name and port name + const componentName = + sourceComponent.name || sourceComponent.source_component_id + const portName = + sourcePort.name || sourcePort.pin_number?.toString() || portId + + portInfos.push({ + displayName: `Pad${portName.replace("pin", "")}_${componentName}_${sourcePort.source_component_id}`, + }) + } + + return portInfos.map((p) => p.displayName).join("--") +} diff --git a/tests/repros/repro8-multiple-traces-in-one-net.test.ts b/tests/repros/repro8-multiple-traces-in-one-net.test.ts new file mode 100644 index 0000000..f35473c --- /dev/null +++ b/tests/repros/repro8-multiple-traces-in-one-net.test.ts @@ -0,0 +1,19 @@ +import { expect, test } from "bun:test" +import { convertCircuitJsonToDsnString, parseDsnToCircuitJson } from "lib" +import threeSubcircuitCircuitConnectedToSamePorts from "../assets/repro/three-subcircuit-connected-to-same-ports.json" +import { su } from "@tscircuit/soup-util" + +test("circuit json -> dsn -> circuit json", async () => { + const dsnFile = convertCircuitJsonToDsnString(threeSubcircuitCircuitConnectedToSamePorts as any) + const circuitJson = parseDsnToCircuitJson(dsnFile) + + const source_trace = su(circuitJson).source_trace.list() + expect(source_trace.length).toBe(2) + + const pcb_trace = su(circuitJson).pcb_trace.list() + expect(pcb_trace.length).toBe(1) + expect(pcb_trace[0].source_trace_id).toBe(source_trace[0].source_trace_id) + + // The other source_trace is having multiple connected_source_port_ids + expect(source_trace[1].connected_source_port_ids.length).toBe(3) +})