UNPKG

edacation

Version:

Library and CLI for interacting with Yosys and nextpnr.

126 lines 5.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getNextpnrWorkerOptions = exports.getNextpnrOptions = exports.parseNextpnrArguments = 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, reportJson: true, pinConfigFile: undefined }; const parseNextpnrArguments = (args) => args.flatMap((arg) => (0, string_args_parser_1.parseArgs)(arg)); exports.parseNextpnrArguments = parseNextpnrArguments; const getNextpnrOptions = (configuration, targetId) => (0, target_js_1.getOptions)(configuration, targetId, 'nextpnr', DEFAULT_OPTIONS); exports.getNextpnrOptions = getNextpnrOptions; const getNextpnrWorkerOptions = (project, targetId) => { const configuration = project.getConfiguration(); 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]; // Input files const generatedInputFiles = [ (0, target_js_1.getTargetFile)(target, `${family.architecture}.json`), ...(options.pinConfigFile ? [options.pinConfigFile] : []) ]; const inputFiles = (0, target_js_1.getCombined)(configuration, targetId, 'nextpnr', 'inputFiles', generatedInputFiles).filter((f) => !!f); // Tool const tool = `nextpnr-${family.architecture}`; // Output files / args const generatedOutputFiles = []; const generatedArgs = []; switch (family.architecture) { case 'ecp5': { generatedArgs.push(`--${device.device}`); generatedArgs.push('--package', target.package.toUpperCase()); if (options.pinConfigFile) { generatedArgs.push('--lpf', options.pinConfigFile); } // Write bitstream file const file = (0, target_js_1.getTargetFile)(target, `${family.architecture}.config`); generatedOutputFiles.push(file); generatedArgs.push('--textcfg', file); break; } case 'generic': { break; } case 'gowin': { generatedArgs.push('--device', `${device.device.replace('-', '-UV')}${target.package}C5/I4`); break; } case 'ice40': { generatedArgs.push(`--${device.device}`); generatedArgs.push('--package', target.package); if (options.pinConfigFile) { generatedArgs.push('--pcf', options.pinConfigFile); } // Write ASC file const file = (0, target_js_1.getTargetFile)(target, `${family.architecture}.asc`); generatedOutputFiles.push(file); generatedArgs.push('--asc', file); 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.`); } generatedArgs.push('--device', `${device.device}-7${devPackage}C`); break; } default: { throw new Error(`Architecture "${family.architecture}" is currently not supported.`); } } generatedArgs.push('--json', inputFiles[0]); if (options.placedSvg) { const file = (0, target_js_1.getTargetFile)(target, 'placed.svg'); generatedOutputFiles.push(file); generatedArgs.push('--placed-svg', file); } if (options.routedSvg) { const file = (0, target_js_1.getTargetFile)(target, 'routed.svg'); generatedOutputFiles.push(file); generatedArgs.push('--routed-svg', file); } if (options.routedJson) { const file = (0, target_js_1.getTargetFile)(target, 'routed.nextpnr.json'); generatedOutputFiles.push(file); generatedArgs.push('--write', file); } if (options.reportJson) { const file = (0, target_js_1.getTargetFile)(target, 'report.json'); generatedOutputFiles.push(file); generatedArgs.push('--detailed-timing-report', '--report', file); } const outputFiles = (0, target_js_1.getCombined)(configuration, targetId, 'nextpnr', 'outputFiles', generatedOutputFiles).filter((f) => !!f); const args = (0, target_js_1.getCombined)(configuration, targetId, 'nextpnr', 'arguments', generatedArgs, exports.parseNextpnrArguments); return { inputFiles, outputFiles, target, options, steps: [ { id: 'pnr', tool, arguments: args } ] }; }; exports.getNextpnrWorkerOptions = getNextpnrWorkerOptions; //# sourceMappingURL=nextpnr.js.map