added error checking at execution of ABC
authorJohann Glaser <Johann.Glaser@gmx.at>
Sat, 16 Mar 2013 21:04:55 +0000 (22:04 +0100)
committerClifford Wolf <clifford@clifford.at>
Sun, 17 Mar 2013 08:06:03 +0000 (09:06 +0100)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
passes/abc/abc.cc

index c2c03e4a5ab76286437d9059af0d95e38df0c5d4..04d7ac67dc1b911b83f3dc2601da88a84a76ebfd 100644 (file)
@@ -441,10 +441,28 @@ static void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std
                else
                        snprintf(buffer, 1024, "%s -c 'read_verilog %s/input.v; read_library %s/stdcells.genlib; "
                                        "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);
+               }
                while (fgets(buffer, 1024, f) != NULL)
                        log("ABC: %s", buffer);
-               fclose(f);
+               errno = 0;
+               int ret = pclose(f);
+               if (ret < 0) {
+                       log("ABC: pclose failed: %d, %s\n",errno,sys_errlist[errno]);
+                       assert(0);
+               }
+               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;
+                       }
+                       assert(0);
+               }
 
                if (asprintf(&p, "%s/output.v", tempdir_name) < 0) abort();
                f = fopen(p, "rt");