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>
)