ShiboSoftwareDev/am625sip-linux-board
This code defines the physical footprint and pin layout for an AM625 System-in-Package (SIP) component, detailing pad positions, pin labels, and package outline for hardware integration.
- Version
- 1.0.24
- License
- unset
- Stars
- 0
scripts/build-usb0-data-esd-cache.tsx
import { mkdirSync, writeFileSync } from "node:fs"
import { Circuit } from "@tscircuit/core"
import type { AnyCircuitElement } from "circuit-json"
import { Usb0DataEsdSubcircuit } from "../subcircuits/usb0-data-esd"
import { namespaceCachePcbTraceIds } from "./namespace-cache-pcb-trace-ids"
const CACHE_PATH = "subcircuits/cache/usb0-data-esd.circuit.json"
const LinkPad = ({
name,
pcbX,
pcbY,
}: {
name: string
pcbX: number
pcbY: number
}) => (
<chip
name={name}
pcbX={pcbX}
pcbY={pcbY}
noSchematicRepresentation
footprint={
<footprint>
<smtpad
portHints={["pin1"]}
shape="rect"
width="0.8mm"
height="0.8mm"
/>
</footprint>
}
/>
)
const getErrors = (circuitJson: AnyCircuitElement[]) =>
circuitJson.filter(
(element) =>
element.type.endsWith("_error") || element.type === "pcb_placement_error",
)
const main = async () => {
const circuit = new Circuit()
let sourceAutoroutingConnectionCount = 0
circuit.on("autorouting:start", (event: any) => {
sourceAutoroutingConnectionCount += event.simpleRouteJson.connections.length
console.log(
`USB0 ESD autorouting start: ${event.phaseName ?? "unphased"} (${event.simpleRouteJson.connections.length} connections)`,
)
})
circuit.on("autorouting:end", (event: any) => {
console.log(`USB0 ESD autorouting end: ${event.phaseName ?? "unphased"}`)
})
circuit.add(
<board
width="6mm"
height="5mm"
layers={4}
defaultTraceWidth="0.08128mm"
minTraceWidth="0.08128mm"
minTraceToPadEdgeClearance="0.05mm"
minPadEdgeToPadEdgeClearance="0.08128mm"
minViaEdgeToPadEdgeClearance="0.08128mm"
minViaHoleEdgeToViaHoleEdgeClearance="0.1016mm"
minViaHoleDiameter="0.1mm"
minViaPadDiameter="0.24mm"
pcbStyle={{ viaHoleDiameter: "0.1mm", viaPadDiameter: "0.24mm" }}
autorouter="default"
>
<Usb0DataEsdSubcircuit />
</board>,
)
await circuit.renderUntilSettled()
const sourceJson = circuit.getCircuitJson()
const errors = getErrors(sourceJson)
const sourceTraceCount = sourceJson.filter(
(element) => element.type === "source_trace",
).length
const pcbTraceCount = sourceJson.filter(
(element) => element.type === "pcb_trace",
).length
const requiredComponents = [
"U5",
"X_SOC_DP",
"X_SOC_DM",
"X_CONNECTOR_DP",
"X_CONNECTOR_DM",
"X_GND",
]
const foundComponents = new Set(
sourceJson.flatMap((element) =>
element.type === "source_component" ? [element.name] : [],
),
)
const missingComponents = requiredComponents.filter(
(name) => !foundComponents.has(name),
)
if (
errors.length > 0 ||
missingComponents.length > 0 ||
sourceTraceCount !== 3 ||
sourceAutoroutingConnectionCount !== 3 ||
pcbTraceCount === 0
) {
writeFileSync(
"/private/tmp/usb0-data-esd-cache-failure.circuit.json",
JSON.stringify(sourceJson),
)
console.error(
JSON.stringify(
{
error: "USB0 ESD source-cache validation failed",
sourceTraceCount,
sourceAutoroutingConnectionCount,
pcbTraceCount,
missingComponents,
errors,
},
null,
2,
),
)
process.exitCode = 1
return
}
const cacheJson = namespaceCachePcbTraceIds(
sourceJson.filter((element) => {
const type = element.type
return (
(!type.startsWith("schematic_") || type === "schematic_component") &&
!type.startsWith("cad_") &&
!type.endsWith("_warning") &&
type !== "pcb_debug_object" &&
type !== "source_project_metadata"
)
}),
"usb0_data_esd",
)
const parentCircuit = new Circuit()
let parentAutoroutingConnectionCount = 0
parentCircuit.on("autorouting:start", (event: any) => {
parentAutoroutingConnectionCount += event.simpleRouteJson.connections.length
})
parentCircuit.add(
<board
width="14mm"
height="12mm"
layers={4}
schematicDisabled
autorouter="default"
defaultTraceWidth="0.08128mm"
minTraceWidth="0.08128mm"
minTraceToPadEdgeClearance="0.05mm"
minPadEdgeToPadEdgeClearance="0.08128mm"
minViaEdgeToPadEdgeClearance="0.08128mm"
minViaHoleEdgeToViaHoleEdgeClearance="0.1016mm"
minViaHoleDiameter="0.1mm"
minViaPadDiameter="0.24mm"
>
<subcircuit name="USB0_ESD_CACHE" circuitJson={cacheJson} />
<LinkPad name="L_SOC_DP" pcbX={-5} pcbY={3} />
<LinkPad name="L_SOC_DM" pcbX={-5} pcbY={1} />
<LinkPad name="L_CONNECTOR_DP" pcbX={5} pcbY={3} />
<LinkPad name="L_CONNECTOR_DM" pcbX={5} pcbY={1} />
<LinkPad name="L_GND" pcbX={5} pcbY={-3} />
<trace from=".L_SOC_DP > .pin1" to=".USB0_ESD_CACHE .USB0_DATA_ESD .X_SOC_DP > .pin1" />
<trace from=".L_SOC_DM > .pin1" to=".USB0_ESD_CACHE .USB0_DATA_ESD .X_SOC_DM > .pin1" />
<trace from=".L_CONNECTOR_DP > .pin1" to=".USB0_ESD_CACHE .USB0_DATA_ESD .X_CONNECTOR_DP > .pin1" />
<trace from=".L_CONNECTOR_DM > .pin1" to=".USB0_ESD_CACHE .USB0_DATA_ESD .X_CONNECTOR_DM > .pin1" />
<trace from=".L_GND > .pin1" to=".USB0_ESD_CACHE .USB0_DATA_ESD .X_GND > .pin1" />
</board>,
)
await parentCircuit.renderUntilSettled()
const parentJson = parentCircuit.getCircuitJson()
const parentErrors = getErrors(parentJson)
const parentPcbTraceCount = parentJson.filter(
(element) => element.type === "pcb_trace",
).length
if (
parentErrors.length > 0 ||
parentPcbTraceCount !== pcbTraceCount + 5 ||
parentAutoroutingConnectionCount !== 5
) {
console.error(
JSON.stringify(
{
error: "USB0 ESD imported-cache validation failed",
parentPcbTraceCount,
parentAutoroutingConnectionCount,
parentErrors,
},
null,
2,
),
)
process.exitCode = 1
return
}
mkdirSync("subcircuits/cache", { recursive: true })
writeFileSync(CACHE_PATH, `${JSON.stringify(cacheJson, null, 2)}\n`)
console.log(
JSON.stringify(
{
cachePath: CACHE_PATH,
sourceTraceCount,
sourceAutoroutingConnectionCount,
pcbTraceCount,
cacheElementCount: cacheJson.length,
parentPcbTraceCount,
parentAutoroutingConnectionCount,
},
null,
2,
),
)
}
main().catch((error) => {
console.error(error)
process.exitCode = 1
})