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-no-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 CONTACT_PITCH_MM = 0.635

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} direct-route pads`}
    noSchematicRepresentation
    pcbX={0}
    pcbY={pcbY}
    pinLabels={pinLabelsForRow(row)}
    footprint={
      <footprint name={`ADM6_ROW_${row}_DIRECT_ROUTE_PADS`}>
        {Array.from({ length: CONTACTS_PER_ROW }, (_, index) => (
          <Fragment key={`${row}-pad-${index + 1}`}>
            <smtpad
              pcbX={((CONTACTS_PER_ROW - 1) / 2 - index) * CONTACT_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 },
  { row: "B", pads: "EB", y: 7 },
  { row: "C", pads: "EC", y: -7 },
  { row: "D", pads: "ED", y: -9.25 },
] as const

export default () => (
  <board
    title="ADM6-60 direct autoroute without fanout"
    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"
  >
    <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.flatMap(({ row, pads }) =>
      Array.from({ length: CONTACTS_PER_ROW }, (_, index) => {
        const contact = padName(row, index + 1)
        return (
          <Fragment key={`${row}-${contact}`}>
            <trace
              name={`DIRECT_${row}_${String(index + 1).padStart(2, "0")}`}
              from={`.J1 > .${contact}`}
              to={`.${pads} > .${contact}`}
            />
          </Fragment>
        )
      }),
    )}

    <silkscreentext
      text="ADM6-60 240-CONTACT DIRECT AUTOROUTE"
      fontSize="1mm"
      pcbX={0}
      pcbY={12.25}
    />
  </board>
)