mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 13:29:12 +00:00 
			
		
		
		
	Cleaned up ABC file/io error handling
This commit is contained in:
		
							parent
							
								
									e6cbeb5b16
								
							
						
					
					
						commit
						1390de4b74
					
				
					 1 changed files with 13 additions and 15 deletions
				
			
		| 
						 | 
				
			
			@ -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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue