179 lines
5.2 KiB
TypeScript

/**
* PL: program logic
* Hardware Programming
*/
import * as vscode from 'vscode';
import { PLContext, XilinxOperation } from './xilinx';
import { BaseManage } from '../common';
import { opeParam } from '../../global';
import { ToolChainType } from '../../global/enum';
import { hdlFile, hdlPath } from '../../hdlFs';
import { moduleTreeProvider, ModuleDataItem } from '../../function/treeView/tree';
import { HdlFileType } from '../../hdlParser/common';
import { PropertySchema } from '../../global/propertySchema';
import { HardwareOutput, ReportType } from '../../global/outputChannel';
import { t } from '../../i18n';
class PlManage extends BaseManage {
context: PLContext;
constructor() {
super();
this.context = {
tool: opeParam.prjInfo.toolChain || 'xilinx',
path: '',
ope: new XilinxOperation(),
terminal: undefined,
process: undefined
};
const curToolChain = this.context.tool;
if (curToolChain === ToolChainType.Xilinx) {
const vivadoPath = vscode.workspace.getConfiguration('digital-ide.prj.vivado.install').get('path', '');
if (hdlFile.isDir(vivadoPath)) {
this.context.path = hdlPath.join(hdlPath.toSlash(vivadoPath), 'vivado');
if (opeParam.os === 'win32') {
this.context.path += '.bat';
}
} else {
this.context.path = 'vivado';
}
}
}
public launch() {
this.context.ope.launch(this.context);
}
public simulate() {
if (this.context.process === undefined) {
return;
}
this.context.ope.simulate(this.context);
}
public simulateCli() {
this.context.ope.simulateCli(this.context);
}
public simulateGui() {
this.context.ope.simulateGui(this.context);
}
public refresh() {
if (this.context.process === undefined) {
return;
}
this.context.ope.refresh(this.context);
}
public build() {
this.context.ope.build(this.context);
}
public synth() {
this.context.ope.synth(this.context);
}
public impl() {
if (this.context.process === undefined) {
return null;
}
this.context.ope.impl(this.context);
}
public bitstream() {
this.context.ope.generateBit(this.context);
}
public program() {
this.context.ope.program(this.context);
}
public gui() {
this.context.ope.gui(this.context);
}
public exit() {
if (this.context.process === undefined) {
return;
}
HardwareOutput.show();
this.context.process.stdin.write('exit\n');
HardwareOutput.report(t('info.pl.exit.title'), ReportType.Info);
this.context.process = undefined;
}
public setSrcTop(item: ModuleDataItem) {
this.context.ope.setSrcTop(item.name, this.context);
const type = moduleTreeProvider.getItemType(item);
if (type === HdlFileType.Src) {
moduleTreeProvider.setFirstTop(HdlFileType.Src, item.name, item.path);
moduleTreeProvider.refreshSrc();
}
}
public setSimTop(item: ModuleDataItem) {
this.context.ope.setSimTop(item.name, this.context);
const type = moduleTreeProvider.getItemType(item);
if (type === HdlFileType.Sim) {
moduleTreeProvider.setFirstTop(HdlFileType.Sim, item.name, item.path);
moduleTreeProvider.refreshSim();
}
}
async addFiles(files: string[]) {
this.context.ope.addFiles(files, this.context);
}
async delFiles(files: string[]) {
this.context.ope.delFiles(files, this.context);
}
async addDevice() {
const propertySchema = opeParam.propertySchemaPath;
let propertyParam = hdlFile.readJSON(propertySchema) as PropertySchema;
const device = await vscode.window.showInputBox({
password: false,
ignoreFocusOut: true,
placeHolder: 'Please input the name of device'
});
if (!device) {
return;
}
if (!propertyParam.properties.device.enum.includes(device)) {
propertyParam.properties.device.enum.push(device);
hdlFile.writeJSON(propertySchema, propertyParam);
vscode.window.showInformationMessage(`Add the ${device} successfully!!!`);
} else {
vscode.window.showWarningMessage("The device already exists.");
}
}
async delDevice() {
const propertySchema = opeParam.propertySchemaPath;
let propertyParam = hdlFile.readJSON(propertySchema) as PropertySchema;
const device = await vscode.window.showQuickPick(propertyParam.properties.device.enum);
if (!device) {
return;
}
const index = propertyParam.properties.device.enum.indexOf(device);
propertyParam.properties.device.enum.splice(index, 1);
hdlFile.writeJSON(propertySchema, propertyParam);
vscode.window.showInformationMessage(`Delete the ${device} successfully!!!`);
}
}
export {
PlManage,
};