Cleaned up ABC file/io error handling

This commit is contained in:
Clifford Wolf 2013-03-17 09:17:18 +01:00
parent e6cbeb5b16
commit 1390de4b74
1 changed files with 13 additions and 15 deletions

View File

@ -332,7 +332,8 @@ static void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std
tempdir_name[0] = tempdir_name[4] = '_';
char *p = mkdtemp(tempdir_name);
log_header("Extracting gate logic of module `%s' to `%s/input.v'..\n", module->name.c_str(), tempdir_name);
assert(p != NULL);
if (p == NULL)
log_error("For some reason mkdtemp() failed!\n");
std::vector<RTLIL::Cell*> cells;
cells.reserve(module->cells.size());
@ -355,7 +356,8 @@ static void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std
if (asprintf(&p, "%s/input.v", tempdir_name) < 0) abort();
FILE *f = fopen(p, "wt");
assert(f != NULL);
if (f == NULL);
log_error("Opening %s for writing failed: %s\n", p, strerrno(errno));
free(p);
fprintf(f, "module logic (");
@ -418,7 +420,8 @@ static void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std
if (asprintf(&p, "%s/stdcells.genlib", tempdir_name) < 0) abort();
f = fopen(p, "wt");
assert(f != NULL);
if (f == NULL);
log_error("Opening %s for writing failed: %s\n", p, strerrno(errno));
fprintf(f, "GATE ZERO 1 Y=CONST0;\n");
fprintf(f, "GATE ONE 1 Y=CONST1;\n");
fprintf(f, "GATE BUF 1 Y=A; PIN * NONINV 1 999 1 0 1 0\n");
@ -443,25 +446,20 @@ static void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std
"map; write_verilog %s/output.v' 2>&1", exe_file.c_str(), tempdir_name, tempdir_name, tempdir_name);
errno = ENOMEM; // popen does not set errno if memory allocation fails, therefore set it by hand
f = popen(buffer, "r");
if (!f) {
log("ABC: popen failed: %d, %s\n",errno,sys_errlist[errno]);
assert(0);
}
if (f == NULL)
log_error("Opening pipe to `%s' for reading failed: %s\n", buffer, strerrno(errno));
while (fgets(buffer, 1024, f) != NULL)
log("ABC: %s", buffer);
errno = 0;
int ret = pclose(f);
if (ret < 0) {
log("ABC: pclose failed: %d, %s\n",errno,sys_errlist[errno]);
assert(0);
}
if (ret < 0)
log_error("Closing pipe to `%s' failed: %s\n", buffer, strerrno(errno));
if (WEXITSTATUS(ret) != 0) {
switch (WEXITSTATUS(ret)) {
case 127: log("ABC: execution of command \"%s\" failed: Command not found\n",exe_file.c_str()); break;
case 126: log("ABC: execution of command \"%s\" failed: Command not executable\n",exe_file.c_str()); break;
default: log("ABC: execution of command \"%s\" failed: the shell returned %d\n",exe_file.c_str(),WEXITSTATUS(ret)); break;
case 127: log_error("ABC: execution of command \"%s\" failed: Command not found\n", exe_file.c_str()); break;
case 126: log_error("ABC: execution of command \"%s\" failed: Command not executable\n", exe_file.c_str()); break;
default: log_error("ABC: execution of command \"%s\" failed: the shell returned %d\n", exe_file.c_str(), WEXITSTATUS(ret)); break;
}
assert(0);
}
if (asprintf(&p, "%s/output.v", tempdir_name) < 0) abort();