0hmX/am62l-lpddr4-ti-pth-router
This code defines a hardware-oriented React/TypeScript setup for a PCB breakout circuit featuring an AM62L LPDDR4 interface, including detailed PCB component placement, routing algorithms, and validation scripts for DDR connections, via placement, and manufacturing constraints.
- Version
- 1.0.1
- License
- unset
- Stars
- 0
am62l-lpddr4-breakout-circuit.tsx
import { ballMap } from "@tsci/0hmX.mt53e1g16d1zw-footprint"
import { Fragment } from "react"
import type { Am62lFanoutAlgorithmFn } from "./autorouting/am62l-free-space-fanout"
import type { Am62lMiddleChannelAlgorithmFn } from "./autorouting/am62l-middle-channel"
import { AM62L32_TI_LAND } from "./components/am62l32-ti-land"
import { MT53E1G16D1ZW_NSMD } from "./components/mt53e1g16d1zw-nsmd"
import {
DDR_ADDR_CTRL_TRACE_NAMES,
DDR_BYTE0_TRACE_NAMES,
DDR_BYTE1_TRACE_NAMES,
DDR_CONNECTIONS,
DDR_SOC_PHYSICAL_PINS,
} from "./ddr-connections"
const usedSocPins = new Set<number>(DDR_SOC_PHYSICAL_PINS)
const socNoConnect = Array.from({ length: 373 }, (_, index) => index + 1)
.filter((pin) => !usedSocPins.has(pin))
.map((pin) => `pin${pin}`)
const usedMemorySignals = new Set(
DDR_CONNECTIONS.map(({ memorySignal }) => memorySignal),
)
const memoryNoConnect = ballMap
.map(({ signal }, index) => ({ signal, selector: `pin${index + 1}` }))
.filter(({ signal }) => !usedMemorySignals.has(signal))
.map(({ selector }) => selector)
const SIGNAL_LAYERS = [
"top",
"inner1",
"inner2",
"inner3",
"inner4",
"inner5",
"inner6",
"bottom",
] as const
export type Am62lLpddr4BreakoutCircuitProps = {
socFanoutAlgorithm?: Am62lFanoutAlgorithmFn
ramFanoutAlgorithm?: Am62lFanoutAlgorithmFn
middleChannelAlgorithm?: Am62lMiddleChannelAlgorithmFn
}
export const Am62lLpddr4BreakoutCircuit = ({
socFanoutAlgorithm,
ramFanoutAlgorithm,
middleChannelAlgorithm,
}: Am62lLpddr4BreakoutCircuitProps = {}) => {
const socFanoutAutorouter = socFanoutAlgorithm
? {
local: true,
groupMode: "subcircuit" as const,
preset: "fanout" as const,
algorithmFn: socFanoutAlgorithm,
}
: ("fanout" as const)
const ramFanoutAutorouter = ramFanoutAlgorithm
? {
local: true,
groupMode: "subcircuit" as const,
preset: "fanout" as const,
algorithmFn: ramFanoutAlgorithm,
}
: ("fanout" as const)
return (
<board
name="AM62L_LPDDR4_BREAKOUT_REPRO"
width="90mm"
height="25mm"
layers={8}
defaultTraceWidth="0.08128mm"
minTraceWidth="0.08128mm"
minTraceToPadEdgeClearance="0.08128mm"
minViaEdgeToPadEdgeClearance="0.08128mm"
minViaHoleEdgeToViaHoleEdgeClearance="0.1016mm"
minViaHoleDiameter="0.2032mm"
minViaPadDiameter="0.4572mm"
pcbStyle={{ viaHoleDiameter: "0.2032mm", viaPadDiameter: "0.4572mm" }}
autorouterEffortLevel="10x"
autorouter={
middleChannelAlgorithm
? {
local: true,
groupMode: "subcircuit",
algorithmFn: middleChannelAlgorithm,
}
: undefined
}
>
<breakout
name="SOC_BREAKOUT"
pcbX={-20}
pcbY={0}
fanoutBoundaryPadding={{
top: "5mm",
right: "22.5mm",
bottom: "5mm",
left: "1mm",
}}
paddingTop="5mm"
paddingRight="22.5mm"
paddingBottom="5mm"
paddingLeft="1mm"
fanoutRoutingLayers={[...SIGNAL_LAYERS]}
busFanoutDirections={{
DDR_BYTE1: "top_right",
DDR_ADDR_CTRL: "center_right",
DDR_BYTE0: "bottom_right",
}}
autorouter={socFanoutAutorouter}
>
<AM62L32_TI_LAND
name="U1"
pcbX={0}
pcbY={0}
pcbRotation={180}
noSchematicRepresentation
noConnect={socNoConnect as any}
/>
</breakout>
<breakout
name="RAM_BREAKOUT"
pcbX={20.116917}
pcbY={-0.050917}
fanoutBoundaryPadding={{
top: "5mm",
right: "1mm",
bottom: "5mm",
left: "22.5mm",
}}
paddingTop="5mm"
paddingRight="1mm"
paddingBottom="5mm"
paddingLeft="22.5mm"
fanoutRoutingLayers={[...SIGNAL_LAYERS]}
busFanoutDirections={{
DDR_BYTE1: "top_left",
DDR_ADDR_CTRL: "center_left",
DDR_BYTE0: "bottom_left",
}}
autorouter={ramFanoutAutorouter}
>
<MT53E1G16D1ZW_NSMD
name="U2"
pcbX={0}
pcbY={0}
pcbRotation={90}
noSchematicRepresentation
noConnect={memoryNoConnect as any}
/>
</breakout>
<bus
name="DDR_BYTE0"
connections={DDR_BYTE0_TRACE_NAMES}
preferredLayers={[
"inner2",
"inner3",
"inner4",
"inner5",
"inner6",
"bottom",
"inner1",
]}
/>
<bus
name="DDR_BYTE1"
connections={DDR_BYTE1_TRACE_NAMES}
preferredLayers={[
"inner4",
"inner5",
"inner6",
"bottom",
"inner1",
"inner2",
"inner3",
]}
/>
<bus
name="DDR_ADDR_CTRL"
connections={DDR_ADDR_CTRL_TRACE_NAMES}
preferredLayers={[
"bottom",
"inner1",
"inner2",
"inner3",
"inner4",
"inner5",
"inner6",
]}
/>
{/* Differential-pair declarations are temporarily disabled because Core
PR #3304 expands their connectivity keys into multiple breakout-local
SRJ connections. All 33 signals route independently. Bus declaration
order is preserved so former pair members retain adjacent coordinated
breakout targets where the upstream winding solver permits. */}
{DDR_CONNECTIONS.map(({ socSignal, memorySignal, traceName }) => (
<Fragment key={traceName}>
<trace
name={traceName}
from={`U1.${socSignal}`}
to={`U2.${memorySignal}`}
/>
</Fragment>
))}
</board>
)
}