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-usb-c-device-cache.tsx
import { mkdirSync, writeFileSync } from "node:fs"
import { Circuit } from "@tscircuit/core"
import type { AnyCircuitElement } from "circuit-json"
import { UsbCDeviceSubcircuit } from "../subcircuits/usb-c-device"
import { namespaceCachePcbTraceIds } from "./namespace-cache-pcb-trace-ids"
const CACHE_PATH = "subcircuits/cache/usb-c-device.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()
circuit.on("autorouting:start", (event: any) => {
console.log(
`USB-C autorouting start: ${event.phaseName ?? "unphased"} (${event.simpleRouteJson.connections.length} connections)`,
)
})
circuit.on("autorouting:end", (event: any) => {
console.log(`USB-C autorouting end: ${event.phaseName ?? "unphased"}`)
})
circuit.add(
<board
width="24mm"
height="18mm"
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"
>
<UsbCDeviceSubcircuit />
</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 = [
"J5",
"R24",
"R25",
"X_DP",
"X_DM",
"X_VBUS",
"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 || pcbTraceCount === 0) {
writeFileSync(
"/private/tmp/usb-c-device-cache-failure.circuit.json",
JSON.stringify(sourceJson),
)
console.error(
JSON.stringify(
{
error: "USB-C source-cache validation failed",
sourceTraceCount,
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"
)
}),
"usb_c_device",
)
const parentCircuit = new Circuit()
let parentAutoroutingConnectionCount = 0
parentCircuit.on("autorouting:start", (event: any) => {
parentAutoroutingConnectionCount += event.simpleRouteJson.connections.length
console.log(
`USB-C parent autorouting start: ${event.phaseName ?? "unphased"} (${event.simpleRouteJson.connections.length} connections)`,
)
})
parentCircuit.add(
<board
width="30mm"
height="26mm"
layers={4}
autorouter="default"
schematicDisabled
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="USB_C_CACHE"
circuitJson={cacheJson}
pcbX={0}
pcbY={0}
pcbRotation={-90}
/>
<LinkPad name="L_DP" pcbX={-8} pcbY={10} />
<LinkPad name="L_DM" pcbX={-8} pcbY={6} />
<LinkPad name="L_VBUS" pcbX={8} pcbY={10} />
<LinkPad name="L_GND" pcbX={-8} pcbY={2} />
<trace
from=".L_DP > .pin1"
to=".USB_C_CACHE .USB_C_DEVICE .X_DP > .pin1"
/>
<trace
from=".L_DM > .pin1"
to=".USB_C_CACHE .USB_C_DEVICE .X_DM > .pin1"
/>
<trace
from=".L_VBUS > .pin1"
to=".USB_C_CACHE .USB_C_DEVICE .X_VBUS > .pin1"
/>
<trace
from=".L_GND > .pin1"
to=".USB_C_CACHE .USB_C_DEVICE .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
const importedCenters = ["J5", "X_DP", "X_DM", "X_VBUS", "X_GND"].map(
(name) => {
const sourceComponent = parentJson.find(
(element) => element.type === "source_component" && element.name === name,
)
const pcbComponent = parentJson.find(
(element) =>
element.type === "pcb_component" &&
sourceComponent?.type === "source_component" &&
element.source_component_id === sourceComponent.source_component_id,
)
return {
name,
center:
pcbComponent?.type === "pcb_component" ? pcbComponent.center : null,
}
},
)
if (
parentErrors.length > 0 ||
parentPcbTraceCount !== pcbTraceCount + 4 ||
parentAutoroutingConnectionCount !== 4
) {
console.error(
JSON.stringify(
{
error: "USB-C imported-cache validation failed",
parentPcbTraceCount,
parentAutoroutingConnectionCount,
importedCenters,
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,
pcbTraceCount,
sourceElementCount: sourceJson.length,
cacheElementCount: cacheJson.length,
parentPcbTraceCount,
parentAutoroutingConnectionCount,
importedCenters,
},
null,
2,
),
)
}
main().catch((error) => {
console.error(error)
process.exitCode = 1
})