Skip to content

Commit 7363f75

Browse files
authored
Add biscuit board laser ablation essentials guide (#306)
* Document biscuit board laser ablation workflow * Streamline laser prefab via documentation * Clarify laser prefab terminology * Trim laser prefab guidance
1 parent 6c6edd5 commit 7363f75

File tree

3 files changed

+126
-1
lines changed

3 files changed

+126
-1
lines changed

docs/elements/board.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ Usually you'll want to use an autorouter preset:
8686
- `autorouter="auto"` - Uses the [platform configuration](../guides/running-tscircuit/platform-configuration.md). For tscircuit.com this defaults to `sequential-trace`.
8787
- `autorouter="sequential-trace"` - Iterate over each trace and use tscircuit's fast built-in autorouter. This method is fast and deterministic but often fails with over 50 traces.
8888
- `autorouter="auto-local"` - Use the platform configuration, but only route locally (do not make API calls)
89-
- `autorouter="auto-cloud"` - Use the platform configuration for
89+
- `autorouter="auto-cloud"` - Use the platform configuration for
90+
- `autorouter="laser_prefab"` - Reserve prefabricated vias that can be reassigned during routing. Ideal for rapid-turn PCBs produced with laser ablation and mechanical drilling templates. See the [Biscuit Board Laser Ablation guide](../guides/tscircuit-essentials/biscuit-board-laser-ablation.mdx) for a complete walkthrough.
9091

9192
For complex boards with over 50 traces, you should use `autorouter="auto-cloud"`
9293
to take advantage of tscircuit's cloud autorouters, which internally use the popular

docs/elements/via.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,4 @@ import CircuitPreview from "@site/src/components/CircuitPreview"
4242
| outerDiameter | number \| string | "0.8mm" | Outer diameter of the copper annular ring |
4343
| pcbX | number | 0 | PCB X position of the via |
4444
| pcbY | number | 0 | PCB Y position of the via |
45+
| netIsAssignable | boolean | `false` | Marks the via as prefabricated so autorouters like `laser_prefab` can claim it for any compatible net. For a full workflow, see the [Biscuit Board Laser Ablation guide](../guides/tscircuit-essentials/biscuit-board-laser-ablation.mdx). |
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
---
2+
title: Biscuit Board Laser Ablation
3+
description: Learn how to route PCBs against a prefabricated via template using the laser_prefab autorouter and the netIsAssignable via property.
4+
---
5+
6+
import CircuitPreview from "@site/src/components/CircuitPreview"
7+
8+
# Biscuit Board Laser Ablation
9+
10+
The **laser_prefab** autorouter pairs tscircuit with a fabrication process that
11+
combines laser ablation and a "biscuit" carrier board. Fabricators pre-drill a
12+
matrix of vias into an inexpensive substrate—the biscuit—then laminate thin
13+
copper to the top and bottom. A UV or IR laser ablates the copper, defining the
14+
traces while leaving the via barrels intact. Because the vias are prefabricated,
15+
you route against a known template instead of drilling new holes for every
16+
board.
17+
18+
This guide walks through designing for that workflow. You'll learn how to:
19+
20+
1. Build a reusable via template (the biscuit board).
21+
2. Place that template, route with `autorouter="laser_prefab"`, and confirm the results match the prefabricated geometry.
22+
23+
## 1. Build a reusable via template (a biscuit board)
24+
25+
Create a component for your biscuit template that contains every via location
26+
available on the board. Mark each via with `netIsAssignable` so it is treated as
27+
an assignable via when the router runs. The vias can optionally include default
28+
net names to serve as documentation for repeated layouts.
29+
30+
```tsx title="src/biscuit-template.tsx"
31+
import { Fragment } from "react"
32+
33+
export const BiscuitTemplate = () => (
34+
<Fragment>
35+
<via name="B1" pcbX={-4} pcbY={6} fromLayer="top" toLayer="bottom" netIsAssignable />
36+
<via name="B2" pcbX={0} pcbY={6} fromLayer="top" toLayer="bottom" netIsAssignable />
37+
<via name="B3" pcbX={4} pcbY={6} fromLayer="top" toLayer="bottom" netIsAssignable />
38+
<via name="B4" pcbX={-4} pcbY={0} fromLayer="top" toLayer="bottom" netIsAssignable />
39+
<via name="B5" pcbX={0} pcbY={0} fromLayer="top" toLayer="bottom" netIsAssignable />
40+
<via name="B6" pcbX={4} pcbY={0} fromLayer="top" toLayer="bottom" netIsAssignable />
41+
</Fragment>
42+
)
43+
```
44+
45+
Keep the template focused on the vias themselves. Copper features such as
46+
fiducials or alignment marks should live in their own components so you can swap
47+
templates without affecting the mechanical stackup.
48+
49+
## 2. Place the biscuit template, route, and validate
50+
51+
Include the template inside your `<board />` before adding components. Because
52+
the vias are already drilled in the physical biscuit, avoid translating or
53+
rotating the template in a way that misaligns the coordinates.
54+
55+
<CircuitPreview
56+
defaultView="pcb"
57+
code={`export default () => (
58+
<board width="20mm" height="20mm" autorouter="laser_prefab">
59+
<group name="biscuit" pcbX={0} pcbY={0}>
60+
<via name="B1" pcbX={-4} pcbY={6} fromLayer="top" toLayer="bottom" netIsAssignable />
61+
<via name="B2" pcbX={0} pcbY={6} fromLayer="top" toLayer="bottom" netIsAssignable />
62+
<via name="B3" pcbX={4} pcbY={6} fromLayer="top" toLayer="bottom" netIsAssignable />
63+
<via name="B4" pcbX={-4} pcbY={0} fromLayer="top" toLayer="bottom" netIsAssignable />
64+
<via name="B5" pcbX={0} pcbY={0} fromLayer="top" toLayer="bottom" netIsAssignable />
65+
<via name="B6" pcbX={4} pcbY={0} fromLayer="top" toLayer="bottom" netIsAssignable />
66+
</group>
67+
68+
<testpoint name="TP_TOP" footprintVariant="pad" pcbX={0} pcbY={9} layer="top" />
69+
<testpoint name="TP_BOTTOM" footprintVariant="pad" pcbX={0} pcbY={-9} layer="bottom" />
70+
</board>
71+
)`}
72+
/>
73+
74+
Keep the board outline slightly inside the biscuit's usable area so the laser
75+
can clear debris without hitting the rails.
76+
77+
Once the template is in place, add traces exactly as you would for a conventional
78+
board. The router treats assignable vias as neutral territory: any net can claim
79+
them provided both layers are available and no design rules are violated.
80+
81+
```tsx title="src/laser-prefab-example.tsx"
82+
<board width="20mm" height="20mm" autorouter="laser_prefab">
83+
<BiscuitTemplate />
84+
85+
<chip
86+
name="U1"
87+
footprint="soic8"
88+
pcbX={-6}
89+
pcbY={0}
90+
connections={{ pin1: "R1.pin1", pin8: "B6.top" }}
91+
/>
92+
<resistor name="R1" resistance="1k" footprint="0402" pcbX={6} pcbY={0} />
93+
94+
<trace from="TP_TOP.pin1" to="B2.top" />
95+
<trace from="B2.bottom" to="TP_BOTTOM.pin1" />
96+
</board>
97+
```
98+
99+
After generating manufacturing data (Gerber or ODB++ exports) or reviewing the
100+
PCB preview, confirm that:
101+
102+
- Every claimed via matches a real location on the biscuit template.
103+
- Unused vias remain isolated and keep their original net names.
104+
- Trace clearances respect your fabrication limits.
105+
106+
<CircuitPreview
107+
defaultView="pcb"
108+
code={`export default () => (
109+
<board width="20mm" height="20mm" autorouter="laser_prefab">
110+
<group name="biscuit">
111+
<via name="B2" pcbX={0} pcbY={6} fromLayer="top" toLayer="bottom" netIsAssignable />
112+
<via name="B5" pcbX={0} pcbY={0} fromLayer="top" toLayer="bottom" netIsAssignable />
113+
</group>
114+
115+
<testpoint name="TP_TOP" footprintVariant="pad" pcbX={0} pcbY={9} layer="top" />
116+
<testpoint name="TP_BOTTOM" footprintVariant="pad" pcbX={0} pcbY={-9} layer="bottom" />
117+
118+
<trace from="TP_TOP.pin1" to="B2.top" />
119+
<trace from="B2.bottom" to="B5.top" />
120+
<trace from="B5.bottom" to="TP_BOTTOM.pin1" />
121+
</board>
122+
)`}
123+
/>

0 commit comments

Comments
 (0)