2024-09-11 13:32:02 +08:00

151 lines
4.1 KiB
JavaScript

/* eslint-disable @typescript-eslint/naming-convention */
const os = require('os');
const kernel = require('./utils/kernel');
const Vrfs = require('./utils/vrfs');
class NetlistKernel {
constructor() {
this.kernel = null;
this.vrfs = null;
}
async launch() {
this.kernel = await kernel();
this.vrfs = new Vrfs(this.kernel);
this.vrfs.diskMount();
}
/**
* @state finish-test
* @descriptionCn 直接执行指令
* @param {String} command
*/
exec(command) {
this.kernel.ccall('run', '', ['string'], [command]);
}
/**
* @state finish-test
* @descriptionCn 输出帮助界面
*/
printHelp() {
this.kernel.TTY.message = '';
this.exec("help");
return this.kernel.TTY.message;
}
/**
* @state finish-test
* @descriptionCn 设置内置log输出的使能
* @param {Boolean} params (true : 打开内置log输出 | false : 关闭内置log输出)
*/
setInnerOutput(params) {
this.kernel.TTY.innerOutput = params;
}
/**
* @state finish-test
* @descriptionCn 设置message的回调函数
* @param {*} callback 对message操作的回调函数
*/
setMessageCallback(callback) {
this.kernel.TTY.innerOutput = false;
this.kernel.TTY.callbackOutput = true;
this.kernel.TTY.callback = callback;
}
/**
* @state finish-test
* @descriptionCn 导入文件到工程之中(仅适用于nodefs) 默认支持sv且覆盖
* @param {Array} files 数组形式输入 输入所需导入工程的文件数组
* @returns {String} 导入过程中所输出的日志(仅适用与message回调关闭的时候)
*/
load(files) {
this.kernel.TTY.message = "";
const command = 'read_verilog -sv -formal -overwrite';
for (let i = 0; i < files.length; i++) {
const file = files[i];
if (os.platform().toLowerCase() === 'win32') {
// console.log(this.kernel.FS.readdir('/'));
this.exec(`${command} /${file}`);
} else {
this.exec(`${command} /host/${file}`);
}
}
return this.kernel.TTY.message;
}
synth(options) {
options.argu = options.argu ? options.argu : '';
let command = '';
switch (options.type) {
case 'json':
command = 'write_json';
break;
case 'verilog':
command = 'write_verilog';
break;
case 'aiger':
command = 'write_aiger';
break;
case 'blif':
command = 'write_blif';
break;
case 'edif':
command = 'write_edif';
break;
default: break;
}
this.exec(`${command} ${options.argu} /${options.path}`);
}
/**
* @descriptionCn 以指定的模式导出设计
* @param {{
* path : '' // 在虚拟文件系统中存放的路径
* type : '' // 指定的模式
* argu : '' // 指定导出的参数
* }} options
* @returns {String} 设计的内容
*/
export(options) {
options.path = options.path ? options.path : 'output';
options.argu = options.argu ? options.argu : '';
let command = '';
switch (options.type) {
case 'json':
command = 'write_json';
break;
case 'verilog':
command = 'write_verilog';
break;
case 'aiger':
command = 'write_aiger';
break;
case 'blif':
command = 'write_blif';
break;
case 'edif':
command = 'write_edif';
break;
default: break;
}
this.exec(`${command} ${options.argu} /${options.path}`);
return this.vrfs.readFileToText(options.path);
}
reset() {
this.exec('design -reset');
}
exit() {
this.kernel = null;
this.vrfs = null;
}
}
module.exports = {
NetlistKernel
};