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