seveibar/adm6-breakout
This code defines PCB designs featuring a 60-pin fanout or direct routing layout with multiple signal and power layers, test pads, and component footprints for a high-density electronic breakout board.
- Version
- 1.0.2
- License
- unset
- Stars
- 0
adm6-fanout.circuit.tsx
import { Fragment } from "react"
import { ADM6_60_03_5_L_4_0_A_TR } from "./imports/ADM6_60_03_5_L_4_0_A_TR"
const CONTACTS_PER_ROW = 60
const BREAKOUT_PITCH_MM = 0.635
const SIGNAL_FANOUT_LAYERS = [
"top",
"bottom",
"inner1",
"inner2",
"inner3",
"inner4",
] as const
const padName = (row: string, position: number) =>
`${row}${String(position).padStart(2, "0")}`
const pinLabelsForRow = (row: string) =>
Object.fromEntries(
Array.from({ length: CONTACTS_PER_ROW }, (_, index) => [
`pin${index + 1}`,
[padName(row, index + 1)],
]),
)
const TestPadRow = ({
name,
row,
pcbY,
}: {
name: string
row: "A" | "B" | "C" | "D"
pcbY: number
}) => (
<chip
name={name}
displayName={`ADM6 row ${row} breakout pads`}
noSchematicRepresentation
pcbX={0}
pcbY={pcbY}
pinLabels={pinLabelsForRow(row)}
footprint={
<footprint name={`ADM6_ROW_${row}_TEST_PADS`}>
{Array.from({ length: CONTACTS_PER_ROW }, (_, index) => (
<Fragment key={`${row}-test-pad-${index + 1}`}>
<smtpad
pcbX={((CONTACTS_PER_ROW - 1) / 2 - index) * BREAKOUT_PITCH_MM}
pcbY={0}
width="0.3mm"
height="0.3mm"
shape="rect"
layer="top"
portHints={[`pin${index + 1}`]}
/>
</Fragment>
))}
</footprint>
}
/>
)
const rows = [
{ row: "A", pads: "EA", y: 9.25, direction: "top_center" },
{ row: "B", pads: "EB", y: 7, direction: "top_center" },
{ row: "C", pads: "EC", y: -7, direction: "bottom_center" },
{ row: "D", pads: "ED", y: -9.25, direction: "bottom_center" },
] as const
export default () => (
<board
title="ADM6-60 exact-footprint fanout baseline"
width="84mm"
height="28mm"
borderRadius="2mm"
layers={8}
allowBlindAndBuriedVias
schematicDisabled
autorouter="auto-local"
autorouterEffortLevel="1x"
minTraceWidth="0.1mm"
defaultTraceWidth="0.1mm"
minTraceToPadEdgeClearance="0.08mm"
minPadEdgeToPadEdgeClearance="0.08mm"
minViaEdgeToPadEdgeClearance="0.08mm"
minViaHoleEdgeToViaHoleEdgeClearance="0.1mm"
minViaHoleDiameter="0.2mm"
minViaPadDiameter="0.45mm"
>
<fanout
name="ADM6_FANOUT"
pcbX={0}
pcbY={0}
width="80mm"
height="20mm"
autorouter="fanout"
fanoutRoutingLayers={[...SIGNAL_FANOUT_LAYERS]}
busFanoutDirections={Object.fromEntries(
rows.map(({ row, direction }) => [`ADM6_${row}`, direction]),
)}
>
<ADM6_60_03_5_L_4_0_A_TR name="J1" pcbX={0} pcbY={0} />
{rows.map(({ row, pads, y }) => (
<TestPadRow key={row} name={pads} row={row} pcbY={y} />
))}
{rows.map(({ row }) => (
<Fragment key={`bus-${row}`}>
<bus
name={`ADM6_${row}`}
connections={Array.from(
{ length: CONTACTS_PER_ROW },
(_, index) =>
`ADM6_${row}_${String(index + 1).padStart(2, "0")}`,
)}
/>
</Fragment>
))}
{rows.flatMap(({ row, pads }) =>
Array.from({ length: CONTACTS_PER_ROW }, (_, index) => {
const contact = padName(row, index + 1)
return (
<Fragment key={`${row}-${contact}`}>
<trace
name={`ADM6_${row}_${String(index + 1).padStart(2, "0")}`}
from={`.J1 > .${contact}`}
to={`.${pads} > .${contact}`}
/>
</Fragment>
)
}),
)}
</fanout>
<silkscreentext
text="ADM6-60 240-CONTACT FANOUT BASELINE"
fontSize="1mm"
pcbX={0}
pcbY={12.25}
/>
<silkscreentext text="A60" fontSize="0.7mm" pcbX={-20} pcbY={9.25} />
<silkscreentext text="A01" fontSize="0.7mm" pcbX={20} pcbY={9.25} />
<silkscreentext text="D60" fontSize="0.7mm" pcbX={-20} pcbY={-9.25} />
<silkscreentext text="D01" fontSize="0.7mm" pcbX={20} pcbY={-9.25} />
</board>
)