magic/npm/examples/example.js

41 lines
1.4 KiB
JavaScript

// example.js — GDS → CIF format conversion using the Magic WASM module.
//
// Usage:
// node examples/example.js [input.gds] [output.cif]
//
// Defaults:
// input: design.gds (in current working directory)
// output: design.cif (in current working directory)
import { readFileSync, writeFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname, resolve, basename } from 'node:path';
import createMagicModule from '../magic.js';
const __dirname = dirname(fileURLToPath(import.meta.url));
const wasmBinary = readFileSync(resolve(__dirname, '../magic.wasm'));
const inputGds = process.argv[2] ?? 'design.gds';
const outputCif = process.argv[3] ?? inputGds.replace(/\.gds$/i, '.cif');
const cellName = basename(inputGds, '.gds');
const module = await createMagicModule({
wasmBinary,
print: msg => console.log('[magic]', msg),
printErr: msg => console.error('[magic]', msg),
});
module.FS.mkdirTree('/work');
module.FS.writeFile(`/work/${cellName}.gds`, readFileSync(inputGds));
module._magic_wasm_init();
module.cwrap('magic_wasm_run_command', 'number', ['string'])(`gds read /work/${cellName}`);
module.cwrap('magic_wasm_run_command', 'number', ['string'])(`load ${cellName}`);
module.cwrap('magic_wasm_run_command', 'number', ['string'])(`cif write /work/${cellName}`);
const cifBytes = module.FS.readFile(`/work/${cellName}.cif`);
writeFileSync(outputCif, cifBytes);
console.log(`Converted ${inputGds}${outputCif}`);