0hmX/am3352-ddr-track-c-stackup-wip-20261007
Saved native stackup-first preview: 11 DDR endpoint routes and 179 selected pad-to-plane joins. Matching and full-board connectivity incomplete. Not fabrication-ready.
- Version
- 0.0.2
- License
- unset
- Stars
- 0
routing.tsx
import { Fragment } from "react"
import { ddrSignals } from "./connections"
import { byte0EscapePaths } from "./escapes"
import { autoroutingPhaseProps } from "@tscircuit/props"
import savedPaths from "./data/byte0-saved-paths.json"
const savedNets = new Set(savedPaths.map(p => p.net))
const savedPhase = autoroutingPhaseProps.parse({ name: "C_SAVED_BYTE", phaseIndex: 1,
autorouter: "single_layer_routing", pcbTracePaths: savedPaths.map(p => ({connection:p.connection,route:p.route})) })
export const byteSignals = (byte: number) => [
...Array.from({ length: 8 }, (_, bit) => `DDR_D${byte * 8 + bit}`),
`DDR_DQM${byte}`, `DDR_DQS${byte}`, `DDR_DQSn${byte}`,
]
const dataSignals = [...byteSignals(0), ...byteSignals(1)]
const addressSignals = ddrSignals.map(signal => signal.net)
.filter(net => !dataSignals.includes(net) && net !== "DDR_RESETn")
function traceWidth(net: string) {
const internal = byteSignals(0).includes(net)
const pair = /DDR_DQSn?\d|DDR_CKn?$/.test(net)
if (internal) return pair ? 0.101092 : 0.117094
return pair ? 0.119126 : 0.150876
}
// Published alias normalizes to bus_lanes; no lane-to-lane via fallback.
// Width/gap values come from the live JLC calculator, not an SI measurement.
export function DdrRouting({ route, byte0Only, escapePreview, savedByte = false }: { route: boolean, byte0Only: boolean, escapePreview: boolean, savedByte?: boolean }) {
const signals = ddrSignals.filter(signal => !byte0Only || byteSignals(0).includes(signal.net))
return <>
{savedByte && <autoroutingphase {...savedPhase} />}
{route && <autoroutingphase name="DDR_SINGLE_LAYER_LANES" phaseIndex={1}
autorouter="single_layer_routing" />}
{signals.map(signal => <Fragment key={signal.net}>
<net name={signal.net} routingPhaseIndex={savedByte && !savedNets.has(signal.net) ? undefined : 1} />
<trace name={`T_${signal.net}`} width={escapePreview && byteSignals(0).includes(signal.net) ? 0.1016 : traceWidth(signal.net)}
pcbPathRelativeTo={escapePreview ? `.U1 > .${signal.cpuPin}` : undefined}
pcbPaths={escapePreview ? byte0EscapePaths(signal.net, signal.cpuPin, signal.ramPin) : undefined}
routingPhaseIndex={savedByte && !savedNets.has(signal.net) ? undefined : 1} path={[`.U1 > .${signal.cpuPin}`, `.U3 > .${signal.ramPin}`, `net.${signal.net}`]} />
</Fragment>)}
{(savedByte || byte0Only ? [0] : [0, 1]).map(byte => <Fragment key={byte}>
<bus name={`DDR_BYTE${byte}`} routingPhaseIndex={1} connections={byteSignals(byte).map(net => `T_${net}`)}
maxLengthSkew={0.635} pcbTraceSpacing="3w" pcbSpacingToOtherSignals="4w"
pcbAllowedLayers={savedByte ? ["inner2", "inner5", "bottom"] : [byte === 0 ? "inner2" : "top"]} />
<differentialpair name={`DQS${byte}`} positiveConnection={`T_DDR_DQS${byte}`}
negativeConnection={`T_DDR_DQSn${byte}`} maxLengthSkew={0.127}
targetDifferentialImpedance={100} pcbTraceGap={0.2032} pcbSpacingToOtherSignals="4w" />
</Fragment>)}
{!savedByte && !byte0Only && <>
<bus name="DDR_ADDRESS_CONTROL" routingPhaseIndex={1} connections={addressSignals.map(net => `T_${net}`)}
maxLengthSkew={0.635} pcbTraceSpacing="3w" pcbSpacingToOtherSignals="4w"
pcbAllowedLayers={["bottom"]} />
<differentialpair name="CK" positiveConnection="T_DDR_CK" negativeConnection="T_DDR_CKn"
maxLengthSkew={0.127} targetDifferentialImpedance={100}
pcbTraceGap={0.2032} pcbSpacingToOtherSignals="4w" />
</>}
</>
}