0hmX/am3352-ddr-track-b-byte0-wip-20261007

Partial full-board preview: 11 of 47 DDR signal nets routed; power and interfaces incomplete. Fabrication and electrical release blocked.

Version
0.0.1
License
unset
Stars
0

support.tsx

import contracts from "./contracts/support-parts.json"
import placement from "./contracts/placement.json"
import candidateContracts from "./contracts/assembly-candidates.json"
import byte0Placement from "./contracts/byte0-support-overrides.json"
import { ImportedFootprint, padPin } from "./imported-footprint"
import type { SupportPart } from "./part-contract"
import { isStringEntry } from "./part-contract"

export const supportParts: SupportPart[] = contracts.map(part => ({
  ...part,
  pinLabels: Object.fromEntries(Object.entries(part.pinLabels).filter(isStringEntry)),
  connections: Object.fromEntries(Object.entries(part.connections).filter(isStringEntry)),
}))
const placements = placement as Record<string, { pcbX: number; pcbY: number; pcbRotation?: number; layer: "top" | "bottom"; isAllowedToBeOffBoard?: boolean }>
// Positive, dated JLC SMT stock candidates. Manufacturer ratings/footprints are
// tracked separately; this source is not an assembly release.
const assemblyCandidates: Record<string, { mpn: string; jlcpcbId: string }> = candidateContracts

export function Support({ byte0 = false }: { byte0?: boolean } = {}) {
  return <>{supportParts.map(part => {
    const candidate = assemblyCandidates[part.name]
    const props = {
      name: part.name, manufacturerPartNumber: candidate?.mpn ?? part.mpn ?? undefined,
      supplierPartNumbers: candidate ? { jlcpcb: [candidate.jlcpcbId] } : undefined,
      ...placements[part.name],
      ...(byte0 ? (byte0Placement as Record<string, { pcbX: number; pcbY: number }>)[part.name] : undefined),
      connections: Object.fromEntries(Object.entries(part.connections).map(([pin, net]) => [part.kind === "chip" ? padPin(part, pin) : `pin${pin}`, `net.${net}`])),
    }
    const footprint = part.footprintKey ? <ImportedFootprint part={part} /> : part.footprint ?? "0402"
    if (part.kind === "resistor") return <resistor key={part.name} {...props} resistance={part.value!} footprint={footprint} />
    if (part.kind === "capacitor") return <capacitor key={part.name} {...props} capacitance={part.value!} footprint={footprint} />
    if (part.kind === "inductor") return <inductor key={part.name} {...props} inductance={part.value!} footprint={footprint} />
    return <chip key={part.name} {...props} noSchematicRepresentation footprint={footprint}
      pinLabels={Object.fromEntries(Object.entries(part.pinLabels).map(([pin, signal]) => [padPin(part, pin), [pin, `signal_${signal}_${pin}`]]))}
      noConnect={part.noConnect.map(pin => padPin(part, pin))} />
  })}</>
}