0hmX/am3352-ddr-track-a-local-dfm-wip-20261007

Experimental RJ45-corrected board with isolated PG indication. 1005/1005 source joins pass; 15 expanded-guard physical errors, sourcing and qualification gates remain. Not fabrication-ready.

Version
0.0.14
License
unset
Stars
0

simulation/shared.ts

import { createHash } from "node:crypto"
import { readFile, writeFile, rename, mkdir } from "node:fs/promises"
import { dirname } from "node:path"

export const sha256 = (contents: string | Uint8Array) => createHash("sha256").update(contents).digest("hex")

export async function writeJson(filename: string, receipt: unknown) {
  await mkdir(dirname(filename), { recursive: true })
  const temporary = `${filename}.${process.pid}.tmp`
  await writeFile(temporary, JSON.stringify(receipt, null, 2) + "\n")
  await rename(temporary, filename)
}

export async function readJson<T>(filename: string): Promise<T> {
  return JSON.parse(await readFile(filename, "utf8")) as T
}

export function matrixResidual(first: number[][], second: number[][]) {
  if (first.length !== second.length || first.some((row, index) => row.length !== second[index]?.length)) throw Error("Matrix dimensions differ")
  const denominator = Math.max(...second.flat().map(Math.abs))
  const residual = Math.max(...second.flatMap((row, i) => row.map((entry, j) => Math.abs(entry - first[i][j])))) / denominator
  if (!Number.isFinite(residual)) throw Error("Nonfinite matrix comparison")
  return residual
}