edacation
Version:
Library and CLI for interacting with Yosys and nextpnr.
126 lines • 5.25 kB
JavaScript
;
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