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-analog-support-cache.tsx

import { mkdirSync, writeFileSync } from "node:fs"
import { Circuit } from "@tscircuit/core"
import type { AnyCircuitElement } from "circuit-json"
import { Usb0AnalogSupportSubcircuit } from "../subcircuits/usb0-analog-support"
import { namespaceCachePcbTraceIds } from "./namespace-cache-pcb-trace-ids"

const CACHE_PATH = "subcircuits/cache/usb0-analog-support.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 analog autorouting start: ${event.phaseName ?? "unphased"} (${event.simpleRouteJson.connections.length} connections)`,
    )
  })
  circuit.on("autorouting:end", (event: any) => {
    console.log(`USB0 analog autorouting end: ${event.phaseName ?? "unphased"}`)
  })
  circuit.add(
    <board
      width="18mm"
      height="10mm"
      layers={4}
      defaultTraceWidth="0.15mm"
      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"
    >
      <Usb0AnalogSupportSubcircuit />
    </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 = [
    "R26",
    "R27",
    "R28",
    "R29",
    "D4",
    "X_SOC_VBUS",
    "X_RCALIB",
    "X_CONNECTOR_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 ||
    sourceTraceCount !== 9 ||
    sourceAutoroutingConnectionCount !== 8 ||
    pcbTraceCount === 0
  ) {
    writeFileSync(
      "/private/tmp/usb0-analog-support-cache-failure.circuit.json",
      JSON.stringify(sourceJson),
    )
    console.error(
      JSON.stringify(
        {
          error: "USB0 analog 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_analog_support",
  )

  const parentCircuit = new Circuit()
  let parentAutoroutingConnectionCount = 0
  parentCircuit.on("autorouting:start", (event: any) => {
    parentAutoroutingConnectionCount += event.simpleRouteJson.connections.length
  })
  parentCircuit.add(
    <board
      width="30mm"
      height="20mm"
      layers={4}
      schematicDisabled
      autorouter="default"
      defaultTraceWidth="0.15mm"
      minTraceWidth="0.08128mm"
      minTraceToPadEdgeClearance="0.05mm"
      minPadEdgeToPadEdgeClearance="0.08128mm"
      minViaEdgeToPadEdgeClearance="0.08128mm"
      minViaHoleEdgeToViaHoleEdgeClearance="0.1016mm"
      minViaHoleDiameter="0.1mm"
      minViaPadDiameter="0.24mm"
    >
      <subcircuit name="USB0_ANALOG_CACHE" circuitJson={cacheJson} />
      <LinkPad name="L_SOC_VBUS" pcbX={-12} pcbY={4} />
      <LinkPad name="L_RCALIB" pcbX={-12} pcbY={-4} />
      <LinkPad name="L_CONNECTOR_VBUS" pcbX={12} pcbY={4} />
      <LinkPad name="L_GND" pcbX={12} pcbY={-4} />
      <trace
        from=".L_SOC_VBUS > .pin1"
        to=".USB0_ANALOG_CACHE .USB0_ANALOG_SUPPORT .X_SOC_VBUS > .pin1"
      />
      <trace
        from=".L_RCALIB > .pin1"
        to=".USB0_ANALOG_CACHE .USB0_ANALOG_SUPPORT .X_RCALIB > .pin1"
      />
      <trace
        from=".L_CONNECTOR_VBUS > .pin1"
        to=".USB0_ANALOG_CACHE .USB0_ANALOG_SUPPORT .X_CONNECTOR_VBUS > .pin1"
      />
      <trace
        from=".L_GND > .pin1"
        to=".USB0_ANALOG_CACHE .USB0_ANALOG_SUPPORT .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 + 4 ||
    parentAutoroutingConnectionCount !== 4
  ) {
    console.error(
      JSON.stringify(
        {
          error: "USB0 analog 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
})