This repository has been archived by the owner on Jul 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathmodelsim.ts
125 lines (111 loc) · 4.54 KB
/
modelsim.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Copyright 2022
// Carlos Alberto Ruiz Naranjo [[email protected]]
// Ismael Perez Rojo [[email protected] ]
//
// This file is part of colibri2
//
// Colibri is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Colibri is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with colibri2. If not, see <https://www.gnu.org/licenses/>.
import { get_language } from "../common/utils";
import { HDL_LANG } from "../common/general";
import { Base_linter } from "./base_linter";
import * as common from "./common";
import { get_random_folder_in_home_directory, rm_directory } from "../process/utils";
export class Modelsim extends Base_linter {
binary_linux = "";
binary_mac = "";
binary_windows = "";
constructor() {
super();
}
async delete_previus_lint() {
return true;
}
set_binary(file: string): string {
const work_directory = get_random_folder_in_home_directory();
const file_lang = get_language(file);
let cmd = "";
if (file_lang === HDL_LANG.VHDL) {
cmd = `vcom -quiet -nologo -2008 -work ${work_directory}`;
}
else if (file_lang === HDL_LANG.SYSTEMVERILOG) {
cmd = `vlog -quiet -nologo -sv -work ${work_directory}`;
}
else {
cmd = `vlog -quiet -nologo -work ${work_directory}`;
}
this.binary_linux = cmd;
this.binary_mac = cmd;
this.binary_windows = cmd;
return work_directory;
}
parse_output(output: string, file: string) {
const errors_str_lines = output.split(/\r?\n/g);
const errors: common.l_error[] = [];
// Parse output lines
errors_str_lines.forEach((line) => {
if (line.startsWith('**')) {
// eslint-disable-next-line max-len
const regex_exp = /(Error|Warning).+?(?: *?(?:.+?(?:\\|\/))+.+?\((\d+?)\):|)(?: *?near "(.+?)":|)(?: *?\((.+?)\)|) +?(.+)/gm;
// From https://github.com/dave2pi/SublimeLinter-contrib-vlog/blob/master/linter.py
const m = regex_exp.exec(line);
try {
//Severity
let sev = common.LINTER_ERROR_SEVERITY.WARNING;
if (m !== null && m[1].toLocaleLowerCase() === "error") {
sev = common.LINTER_ERROR_SEVERITY.ERROR;
}
else if (m !== null && m[1].toLocaleLowerCase() === "warning") {
sev = common.LINTER_ERROR_SEVERITY.WARNING;
}
else {
sev = common.LINTER_ERROR_SEVERITY.INFO;
}
if (sev !== common.LINTER_ERROR_SEVERITY.INFO) {
if (m !== null) {
const message = m[5];
let code = m[4];
const line = parseInt(m[2]) - 1;
if (code === undefined) {
code = '';
}
const error: common.l_error = {
severity: sev,
description: message,
code: code,
location: {
file: file,
position: [line, 0]
}
};
errors.push(error);
}
}
}
// eslint-disable-next-line no-empty
catch (e) { }
}
});
return errors;
}
async lint(file: string, options: common.l_options): Promise<common.l_error[]> {
const work_directory = this.set_binary(file);
const result = await this.exec_linter(file, options);
file = file.replace(/\\ /g, ' ');
const errors_str = result.stdout;
const errors = this.parse_output(errors_str, file);
// Remove work directory
rm_directory(work_directory);
return errors;
}
}