magic/npm
Intubun 8560027569 Add npm package and CI workflows
The user-facing layer of the WASM port: a publishable npm package
plus the GitHub Actions that build and ship it.

* npm/package.json — publishes as `magic-vlsi-wasm`, ESM-only, HPND
  licensed, version tracks Magic's own VERSION file (8.3.637).
  Whitelists the published files and exposes index.js + index.d.ts.

* npm/index.js, npm/index.d.ts — thin JS/TS wrapper around the four
  WASM exports. createMagic(opts) returns { init, runCommand,
  sourceFile, update, FS } so consumers can write into the
  Emscripten virtual filesystem and dispatch Magic commands from
  Node.js, browsers or Web Workers.

* npm/build.sh — end-to-end build: locates emsdk (via PATH or
  EMSDK_DIR), runs distclean+configure+make in the right order
  (techs before mains so embed-files are present), copies
  magic.js / magic.wasm into npm/. Optional --release, --test,
  --pack flags. Preserves configure's exec bits across invocations.

* npm/pack.sh — produces a reproducible npm tarball by touching
  every file to the build time and exporting SOURCE_DATE_EPOCH so
  pacote does not rewrite mtimes to its 1985 fallback.

* npm/examples/ — runnable smoke tests for the four common
  workflows (extract, gds, drc, cif), driven by examples/all.js.
  Each example is self-contained and uses the bundled siliwiz
  technology. helpers.js encapsulates the boilerplate.

* npm/LICENSE, npm/README.md — license text and consumer-facing
  docs (install, quick-start, API, examples, build-from-source,
  license, third-party content notice).

* .github/workflows/main.yml — adds a `simple_build_wasm` job that
  installs a pinned emsdk (3.1.56), builds the WASM module, runs
  the example test suite and uploads the npm tarball as an
  artifact. Pinned for reproducibility against the post-build.sh
  patches; switchable to "latest" by commenting two lines.

* .github/workflows/main-aarch64.yml — drops the now-redundant
  WASM ARM job. WASM is architecture-independent.

* .github/workflows/npm-publish.yml — new workflow. Publishes to
  npm on `v*` tag pushes (manual `workflow_dispatch` supported as
  a dry-run). Uses the same pinned emsdk and pack.sh.

Also sets FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 in both workflows to
silence the Node.js 20 deprecation warnings until
actions/upload-artifact@v6 ships a Node-24 release.
2026-05-11 14:20:47 -04:00
..
examples Add npm package and CI workflows 2026-05-11 14:20:47 -04:00
.gitignore Add npm package and CI workflows 2026-05-11 14:20:47 -04:00
LICENSE Add npm package and CI workflows 2026-05-11 14:20:47 -04:00
README.md Add npm package and CI workflows 2026-05-11 14:20:47 -04:00
build.sh Add npm package and CI workflows 2026-05-11 14:20:47 -04:00
index.d.ts Add npm package and CI workflows 2026-05-11 14:20:47 -04:00
index.js Add npm package and CI workflows 2026-05-11 14:20:47 -04:00
pack.sh Add npm package and CI workflows 2026-05-11 14:20:47 -04:00
package.json Add npm package and CI workflows 2026-05-11 14:20:47 -04:00

README.md

magic-vlsi-wasm

Magic VLSI layout tool, compiled to WebAssembly as a headless library. Runs in Node.js, browsers, and Web Workers — no X11, no Tk, no native dependencies.

Use it to programmatically read and write .mag, .gds, .cif, .ext, and SPICE netlists; run DRC; extract parasitics — anywhere JavaScript runs.

Install

npm install magic-vlsi-wasm

Requires Node.js 18 or newer.

Quick start

import createMagic from 'magic-vlsi-wasm';

const { runCommand, FS } = await createMagic();

// Write a layout into Magic's virtual filesystem
FS.writeFile('/work/inv.mag', layoutBytes);

// Run Magic commands
runCommand('tech load minimum');
runCommand('load /work/inv');
runCommand('gds write /work/inv');

// Read the result back out
const gdsBytes = FS.readFile('/work/inv.gds');

The scmos technology family (scmos, minimum, nmos, ...) is embedded in the WASM binary and available out of the box. Custom tech files can be written into the VFS at /magic/sys/current/<name>.tech.

API

createMagic(options?): Promise<MagicInstance>

options is forwarded to the underlying Emscripten module. Useful keys:

Key Default Purpose
wasmBinary fetched lazily Pre-fetched ArrayBuffer of magic.wasm (skips a network round-trip in browsers)
print console.log Callback for each stdout line
printErr console.error Callback for each stderr line

The returned MagicInstance exposes:

Method Description
runCommand(cmd: string) Dispatch a single Magic command. Returns 0 on success.
sourceFile(path: string) Execute a script from the virtual filesystem.
init() Force initialization. Idempotent — runCommand and sourceFile call it for you.
update() Drive a display-update cycle. No-op in this headless build.
FS Emscripten virtual filesystem. See the Emscripten docs.

Full TypeScript types ship in index.d.ts.

Examples

The package ships runnable examples for the most common workflows. After installing, run one directly:

node node_modules/magic-vlsi-wasm/examples/extract.js
node node_modules/magic-vlsi-wasm/examples/gds.js
node node_modules/magic-vlsi-wasm/examples/drc.js
node node_modules/magic-vlsi-wasm/examples/cif.js

Or, when developing inside this repo:

npm test           # full suite (extract, gds, drc, cif)
npm run test:gds   # GDS write only
npm run test:drc   # DRC check only
npm run test:cif   # CIF write only

Each example is self-contained and reads examples/siliwiz.{mag,tech} by default. See examples/ for the source.

Build from source

If you want to rebuild the WASM module yourself, see toolchains/emscripten/README.md. The short version:

bash npm/build.sh           # debug build, copies magic.js + magic.wasm into npm/
bash npm/build.sh --release # optimized
bash npm/build.sh --test    # build + run tests
bash npm/build.sh --pack    # build + produce magic-vlsi-wasm-<version>.tgz

You will need an activated emsdk checkout (Magic pins emsdk 3.1.56 — see the comment in npm/build.sh).

Limitations

  • Headless only. There is no display driver, so commands that draw to a window (view, findbox, interactive macros) are no-ops.
  • WASM memory starts at 32 MB and grows as needed. Very large GDS imports may need INITIAL_MEMORY bumped (rebuild required).
  • Single-threaded. WASM modules are not thread-safe — create one instance per worker.

License

HPND — Copyright (C) 1985, 1990 Regents of the University of California.

Bundled test technology

The example layout (examples/siliwiz.mag) and technology file (examples/siliwiz.tech) are derived from the SiliWiz educational silicon design tool. They are bundled here only as a runnable smoke test for the WASM build. The technology file is © R. Timothy Edwards, Open Circuit Design, 2023, marked by the author as containing no proprietary information.