UNPKG

edacation

Version:

Library and CLI for interacting with Yosys and nextpnr.

120 lines 5.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getNextpnrWorkerOptions = exports.parseNextpnrArguments = exports.generateNextpnrWorkerOptions = exports.getNextpnrOptions = exports.getNextpnrDefaultOptions = void 0; const string_args_parser_1 = require("string-args-parser"); const devices_js_1 = require("./devices.js"); const target_js_1 = require("./target.js"); const DEFAULT_OPTIONS = { placedSvg: false, routedSvg: false, routedJson: true }; const getNextpnrDefaultOptions = (configuration) => (0, target_js_1.getDefaultOptions)(configuration, 'nextpnr', DEFAULT_OPTIONS); exports.getNextpnrDefaultOptions = getNextpnrDefaultOptions; const getNextpnrOptions = (configuration, targetId) => (0, target_js_1.getOptions)(configuration, targetId, 'nextpnr', DEFAULT_OPTIONS); exports.getNextpnrOptions = getNextpnrOptions; const generateNextpnrWorkerOptions = (configuration, targetId) => { const target = (0, target_js_1.getTarget)(configuration, targetId); const options = (0, exports.getNextpnrOptions)(configuration, targetId); const vendor = devices_js_1.VENDORS[target.vendor]; const family = vendor.families[target.family]; const device = family.devices[target.device]; const inputFiles = [(0, target_js_1.getTargetFile)(target, `${family.architecture}.json`)]; const outputFiles = []; const tool = `nextpnr-${family.architecture}`; const args = []; switch (family.architecture) { case 'ecp5': { args.push(`--${device.device}`); args.push('--package', target.package.toUpperCase()); break; } case 'generic': { break; } case 'gowin': { args.push('--device', `${device.device.replace('-', '-UV')}${target.package}C5/I4`); break; } case 'ice40': { args.push(`--${device.device}`); args.push('--package', target.package); // Write ASC file by default const file = (0, target_js_1.getTargetFile)(target, `${family.architecture}.asc`); outputFiles.push(file); args.push('--asc', `${family.architecture}.asc`); break; } case 'nexus': { const packageLookup = { WLCSP72: 'UWG72', QFN72: 'SG72', csfBGA121: 'MG121', caBGA256: 'BG256', csfBGA289: 'MG289', caBGA400: 'BG400' }; const devPackage = packageLookup[target.package]; if (!devPackage) { throw new Error(`Package "${target.package}" is currenty not supported.`); } args.push('--device', `${device.device}-7${devPackage}C`); break; } default: { throw new Error(`Architecture "${family.architecture}" is currently not supported.`); } } args.push('--json', inputFiles[0]); if (options.placedSvg) { const file = (0, target_js_1.getTargetFile)(target, 'placed.svg'); outputFiles.push(file); args.push('--placed-svg', file); } if (options.routedSvg) { const file = (0, target_js_1.getTargetFile)(target, 'routed.svg'); outputFiles.push(file); args.push('--routed-svg', file); } if (options.routedJson) { const file = (0, target_js_1.getTargetFile)(target, 'routed.nextpnr.json'); outputFiles.push(file); args.push('--write', file); } return { inputFiles, outputFiles, target, options, steps: [ { tool, arguments: args } ] }; }; exports.generateNextpnrWorkerOptions = generateNextpnrWorkerOptions; const parseNextpnrArguments = (args) => args.flatMap((arg) => (0, string_args_parser_1.parseArgs)(arg)); exports.parseNextpnrArguments = parseNextpnrArguments; const getNextpnrWorkerOptions = (project, targetId) => { const generated = (0, exports.generateNextpnrWorkerOptions)(project.getConfiguration(), targetId); const inputFiles = (0, target_js_1.getCombined)(project.getConfiguration(), targetId, 'nextpnr', 'inputFiles', generated.inputFiles).filter((f) => !!f); const outputFiles = (0, target_js_1.getCombined)(project.getConfiguration(), targetId, 'nextpnr', 'outputFiles', generated.outputFiles).filter((f) => !!f); const target = generated.target; const options = generated.options; const steps = generated.steps.map((step) => { const tool = step.tool; const args = (0, target_js_1.getCombined)(project.getConfiguration(), targetId, 'nextpnr', 'arguments', step.arguments, exports.parseNextpnrArguments); return { tool, arguments: args }; }); return { inputFiles, outputFiles, target, options, steps }; }; exports.getNextpnrWorkerOptions = getNextpnrWorkerOptions; //# sourceMappingURL=nextpnr.js.map