1
0
mirror of https://github.com/cclassic/model-ghdl synced 2024-11-14 07:29:52 +01:00

Very basic and crude error forwarding works

This commit is contained in:
Makise Kurisu 2015-01-19 16:17:36 +01:00
parent 9b5ae4e730
commit b10f3cdf94
2 changed files with 58 additions and 7 deletions

View File

@ -1,6 +1,11 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <unistd.h> #include <unistd.h>
#include <stdio.h>
#include <vector>
//#include <regex>
//#define DEBUG_EN DEBUG_EN
/* /*
* *
@ -49,8 +54,12 @@ int main(int argc, char **argv)
string work = ""; // Current library string work = ""; // Current library
string vhdl = ""; // Input VHDL files string vhdl = ""; // Input VHDL files
char tempdir[256] = ""; // Compile dir char tempdir[256] = ""; // Compile dir
string args;
getcwd(tempdir, sizeof(tempdir)); if (!getcwd(tempdir, sizeof(tempdir))) {
cerr << "Error getting current working dir!" << endl;
return 1;
}
for (i=1; i < argc; ++i) { for (i=1; i < argc; ++i) {
if (ISOPT("-work")) { if (ISOPT("-work")) {
@ -79,18 +88,59 @@ int main(int argc, char **argv)
vhdl.append(" "); vhdl.append(" ");
} }
#ifdef DEBUG_EN
cout << "\n\nVHDL SOURCE DETECTED:" << endl; cout << "\n\nVCOM CALL PARSED:" << endl;
cout << "\twork=" << work << endl; cout << "\twork=" << work << endl;
cout << "\tvhdl=" << vhdl << endl; cout << "\tvhdl=" << vhdl << endl;
cout << "\ttempdir=" << tempdir << endl; cout << "\ttempdir=" << tempdir << endl;
#endif
cout << "\n\nCALLING GHDL for syntax checking:" << endl; if (work == "" || vhdl == "" || string(tempdir) == "") {
cerr << "Error: Incomplete/Unsupported vcom call." << endl;
return 2;
}
args = "ghdl -s --ieee=synopsys --warn-no-vital-generic --workdir=" + string(tempdir) + " --work=" + work + " " + vhdl + " 2>&1";
string args;
args = "ghdl -s --ieee=synopsys --warn-no-vital-generic --workdir=" + string(tempdir) + " --work=" + work + " " + vhdl;
cout << "\t" << args << endl; // Launch GHDL
FILE *proc;
char buf[512];
vector < string > result;
proc = popen(args.c_str(), "r");
if (proc == NULL) {
cerr << "Error: Could not invoke GHDL." << endl;
return 1;
}
while(fgets(buf, sizeof(buf), proc)!=NULL){
//cout << buf;
string temp = "";
char *ptr = buf;
result.clear();
while (*ptr != '\0') {
if (*ptr == ':' || *ptr == '\0') {
result.push_back(temp);
temp = "";
}
else {
temp.append(" ");
temp[temp.length()-1] = *ptr;
}
ptr++;
}
result.push_back(temp);
// Regex extract! (Edit: Leave regex for later :D)
// target=** Error: /home/markus/workspaceSigasi/blink/src/top.vhd(32): (vcom-1136) Unknown identifier "counter_i2".
// source=/home/markus/workspaceSigasi/blink/src/top.vhd:32:19: no declaration for "counter_i2"
cout << "** Error: " << result[0] << "(" << result[1] << "):" << result[3];
}
pclose(proc);
return 0; return 0;
} }

View File

@ -5,3 +5,4 @@ CONFIG -= qt
SOURCES += main.cpp SOURCES += main.cpp
#QMAKE_CXXFLAGS += -std=c++11