0hmX/am62l-lpddr4-clean

This code defines the hardware connections and routing logic for a DDR memory interface, specifying physical signal mappings between the system-on-chip (SoC) and DDR memory components, including connections for data, address, clock, reset, and power/ground balls.

Version
1.0.0
License
unset
Stars
0

direct-global-autorouter.ts

import type {
  AutorouterCompleteEvent,
  AutorouterErrorEvent,
  AutorouterProgressEvent,
  GenericLocalAutorouter,
  SimpleRouteJson,
  SimplifiedPcbTrace,
} from "@tscircuit/core"

const routeDirectly = (input: SimpleRouteJson): SimplifiedPcbTrace[] =>
  input.connections.map((connection, index) => ({
    type: "pcb_trace",
    pcb_trace_id: `direct_global_trace_${index}`,
    connection_name: connection.source_trace_id ?? connection.name,
    route: connection.pointsToConnect.map((point) => ({
      route_type: "wire",
      x: point.x,
      y: point.y,
      width: connection.nominalTraceWidth ?? input.minTraceWidth,
      layer: point.layer,
    })),
  }))

export const directGlobalAutorouter = {
  algorithmFn: async (
    input: SimpleRouteJson,
  ): Promise<GenericLocalAutorouter> => {
    const completeHandlers: Array<(event: AutorouterCompleteEvent) => void> = []
    const errorHandlers: Array<(event: AutorouterErrorEvent) => void> = []
    const progressHandlers: Array<(event: AutorouterProgressEvent) => void> = []

    const autorouter: GenericLocalAutorouter = {
      input,
      isRouting: false,
      async start() {
        if (this.isRouting) return
        this.isRouting = true

        try {
          const traces = routeDirectly(this.input)
          progressHandlers.forEach((handler) =>
            handler({
              type: "progress",
              steps: 1,
              progress: 1,
              phase: "complete",
            }),
          )
          this.isRouting = false
          completeHandlers.forEach((handler) =>
            handler({ type: "complete", traces }),
          )
        } catch (error) {
          this.isRouting = false
          errorHandlers.forEach((handler) =>
            handler({
              type: "error",
              error: error instanceof Error ? error : new Error(String(error)),
            }),
          )
        }
      },
      stop() {
        this.isRouting = false
      },
      on(event, callback) {
        if (event === "complete") {
          completeHandlers.push(callback as (event: AutorouterCompleteEvent) => void)
        } else if (event === "error") {
          errorHandlers.push(callback as (event: AutorouterErrorEvent) => void)
        } else {
          progressHandlers.push(callback as (event: AutorouterProgressEvent) => void)
        }
      },
      solveSync() {
        return routeDirectly(this.input)
      },
    }

    return autorouter
  },
}