Skip to content

Commit aba7ef3

Browse files
authored
feat: Add support for the number of layers routing (#114)
1 parent e70fd1e commit aba7ef3

6 files changed

Lines changed: 1012 additions & 17 deletions

File tree

bun.lock

Lines changed: 869 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bun.lockb

-136 KB
Binary file not shown.

lib/dsn-pcb/circuit-json-to-dsn-json/convert-circuit-json-to-dsn-json.ts

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { processComponentsAndPads } from "./process-components-and-pads"
44
import { processNets } from "./process-nets"
55
import { processPcbTraces } from "./process-pcb-traces"
66
import { processPlatedHoles } from "./process-plated-holes"
7+
import { generateLayers } from "lib/utils/generate-layers"
78

89
export function convertCircuitJsonToDsnJson(
910
circuitElements: AnyCircuitElement[],
@@ -18,8 +19,12 @@ export function convertCircuitJsonToDsnJson(
1819
width: number
1920
height: number
2021
center: { x: number; y: number }
22+
num_layers?: number
2123
}
2224

25+
const numLayers = pcbBoard?.num_layers ?? 2
26+
const layers = generateLayers(numLayers)
27+
2328
const pcb: DsnPcb = {
2429
is_dsn_pcb: true,
2530
filename: "",
@@ -35,22 +40,7 @@ export function convertCircuitJsonToDsnJson(
3540
},
3641
unit: "um",
3742
structure: {
38-
layers: [
39-
{
40-
name: "F.Cu",
41-
type: "signal",
42-
property: {
43-
index: 0,
44-
},
45-
},
46-
{
47-
name: "B.Cu",
48-
type: "signal",
49-
property: {
50-
index: 1,
51-
},
52-
},
53-
],
43+
layers,
5444
boundary: {
5545
path: {
5646
layer: "pcb",

lib/utils/generate-layers.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
export function generateLayers(numLayers: number) {
2+
const layers = []
3+
4+
// Always add F.Cu as the first layer (index 0)
5+
layers.push({
6+
name: "F.Cu",
7+
type: "signal" as const,
8+
property: {
9+
index: 0,
10+
},
11+
})
12+
13+
// Add inner layers (In1.Cu, In2.Cu, etc.)
14+
for (let i = 1; i < numLayers - 1; i++) {
15+
layers.push({
16+
name: `In${i}.Cu`,
17+
type: "signal" as const,
18+
property: {
19+
index: i,
20+
},
21+
})
22+
}
23+
24+
// Always add B.Cu as the last layer (index numLayers - 1)
25+
layers.push({
26+
name: "B.Cu",
27+
type: "signal" as const,
28+
property: {
29+
index: numLayers - 1,
30+
},
31+
})
32+
33+
return layers
34+
}
Lines changed: 1 addition & 1 deletion
Loading
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import { expect, test } from "bun:test"
2+
import { convertCircuitJsonToDsnJson } from "../../lib/dsn-pcb/circuit-json-to-dsn-json/convert-circuit-json-to-dsn-json"
3+
import type { AnyCircuitElement } from "circuit-json"
4+
5+
test("multi-layer support - 2 layers (default)", () => {
6+
const circuitElements: AnyCircuitElement[] = [
7+
{
8+
type: "pcb_board",
9+
pcb_board_id: "pcb_board_0",
10+
center: { x: 0, y: 0 },
11+
thickness: 1.4,
12+
num_layers: 2,
13+
width: 34.48,
14+
height: 14.16,
15+
} as any,
16+
]
17+
18+
const dsnJson = convertCircuitJsonToDsnJson(circuitElements)
19+
20+
expect(dsnJson.structure.layers).toHaveLength(2)
21+
expect(dsnJson.structure.layers[0].name).toBe("F.Cu")
22+
expect(dsnJson.structure.layers[0].property.index).toBe(0)
23+
expect(dsnJson.structure.layers[1].name).toBe("B.Cu")
24+
expect(dsnJson.structure.layers[1].property.index).toBe(1)
25+
})
26+
27+
test("multi-layer support - 4 layers", () => {
28+
const circuitElements: AnyCircuitElement[] = [
29+
{
30+
type: "pcb_board",
31+
pcb_board_id: "pcb_board_0",
32+
center: { x: 0, y: 0 },
33+
thickness: 1.4,
34+
num_layers: 4,
35+
width: 34.48,
36+
height: 14.16,
37+
} as any,
38+
]
39+
40+
const dsnJson = convertCircuitJsonToDsnJson(circuitElements)
41+
42+
expect(dsnJson.structure.layers).toHaveLength(4)
43+
expect(dsnJson.structure.layers[0].name).toBe("F.Cu")
44+
expect(dsnJson.structure.layers[0].property.index).toBe(0)
45+
expect(dsnJson.structure.layers[1].name).toBe("In1.Cu")
46+
expect(dsnJson.structure.layers[1].property.index).toBe(1)
47+
expect(dsnJson.structure.layers[2].name).toBe("In2.Cu")
48+
expect(dsnJson.structure.layers[2].property.index).toBe(2)
49+
expect(dsnJson.structure.layers[3].name).toBe("B.Cu")
50+
expect(dsnJson.structure.layers[3].property.index).toBe(3)
51+
})
52+
53+
test("multi-layer support - 6 layers", () => {
54+
const circuitElements: AnyCircuitElement[] = [
55+
{
56+
type: "pcb_board",
57+
pcb_board_id: "pcb_board_0",
58+
center: { x: 0, y: 0 },
59+
thickness: 1.4,
60+
num_layers: 6,
61+
width: 34.48,
62+
height: 14.16,
63+
} as any,
64+
]
65+
66+
const dsnJson = convertCircuitJsonToDsnJson(circuitElements)
67+
68+
expect(dsnJson.structure.layers).toHaveLength(6)
69+
expect(dsnJson.structure.layers[0].name).toBe("F.Cu")
70+
expect(dsnJson.structure.layers[0].property.index).toBe(0)
71+
expect(dsnJson.structure.layers[1].name).toBe("In1.Cu")
72+
expect(dsnJson.structure.layers[1].property.index).toBe(1)
73+
expect(dsnJson.structure.layers[2].name).toBe("In2.Cu")
74+
expect(dsnJson.structure.layers[2].property.index).toBe(2)
75+
expect(dsnJson.structure.layers[3].name).toBe("In3.Cu")
76+
expect(dsnJson.structure.layers[3].property.index).toBe(3)
77+
expect(dsnJson.structure.layers[4].name).toBe("In4.Cu")
78+
expect(dsnJson.structure.layers[4].property.index).toBe(4)
79+
expect(dsnJson.structure.layers[5].name).toBe("B.Cu")
80+
expect(dsnJson.structure.layers[5].property.index).toBe(5)
81+
})
82+
83+
test("multi-layer support - no num_layers specified (default to 2)", () => {
84+
const circuitElements: AnyCircuitElement[] = [
85+
{
86+
type: "pcb_board",
87+
pcb_board_id: "pcb_board_0",
88+
center: { x: 0, y: 0 },
89+
thickness: 1.4,
90+
width: 34.48,
91+
height: 14.16,
92+
} as any,
93+
]
94+
95+
const dsnJson = convertCircuitJsonToDsnJson(circuitElements)
96+
97+
expect(dsnJson.structure.layers).toHaveLength(2)
98+
expect(dsnJson.structure.layers[0].name).toBe("F.Cu")
99+
expect(dsnJson.structure.layers[0].property.index).toBe(0)
100+
expect(dsnJson.structure.layers[1].name).toBe("B.Cu")
101+
expect(dsnJson.structure.layers[1].property.index).toBe(1)
102+
})

0 commit comments

Comments
 (0)