diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/register.cc | 42 | ||||
| -rw-r--r-- | kernel/rtlil.h | 22 | ||||
| -rw-r--r-- | kernel/yosys.cc | 21 | ||||
| -rw-r--r-- | kernel/yosys.h | 1 | 
4 files changed, 74 insertions, 12 deletions
| diff --git a/kernel/register.cc b/kernel/register.cc index 26da96b95..4c6e3591f 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -25,6 +25,26 @@  #include <stdio.h>  #include <errno.h> +#ifdef YOSYS_ENABLE_ZLIB +#include <zlib.h> + +PRIVATE_NAMESPACE_BEGIN +#define GZ_BUFFER_SIZE 8192 +void decompress_gzip(const std::string &filename, std::stringstream &out) +{ +	char buffer[GZ_BUFFER_SIZE]; +	int bytes_read; +	gzFile gzf = gzopen(filename.c_str(), "rb"); +	while(!gzeof(gzf)) { +		bytes_read = gzread(gzf, reinterpret_cast<void *>(buffer), GZ_BUFFER_SIZE); +		out.write(buffer, bytes_read); +	} +	gzclose(gzf); +} +PRIVATE_NAMESPACE_END + +#endif +  YOSYS_NAMESPACE_BEGIN  #define MAX_REG_COUNT 1000 @@ -436,6 +456,28 @@ void Frontend::extra_args(std::istream *&f, std::string &filename, std::vector<s  				delete ff;  			else  				f = ff; +			if (f != NULL) { +				// Check for gzip magic +				unsigned char magic[3]; +				int n = readsome(*ff, reinterpret_cast<char*>(magic), 3); +				if (n == 3 && magic[0] == 0x1f && magic[1] == 0x8b) { +	#ifdef YOSYS_ENABLE_ZLIB +					log("Found gzip magic in file `%s', decompressing using zlib.\n", filename.c_str()); +					if (magic[2] != 8) +						log_cmd_error("gzip file `%s' uses unsupported compression type %02x\n", +							filename.c_str(), unsigned(magic[2])); +					delete ff; +					std::stringstream *df = new std::stringstream(); +					decompress_gzip(filename, *df); +					f = df; +	#else +					log_cmd_error("File `%s' is a gzip file, but Yosys is compiled without zlib.\n", filename.c_str()); +	#endif +				} else { +					ff->clear(); +					ff->seekg(0, std::ios::beg); +				} +			}  		}  		if (f == NULL)  			log_cmd_error("Can't open input file `%s' for reading: %s\n", filename.c_str(), strerror(errno)); diff --git a/kernel/rtlil.h b/kernel/rtlil.h index 1ed055715..02bf274fb 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -420,8 +420,12 @@ namespace RTLIL  	// It maintains a reference counter that is used to make sure that the container is not modified while being iterated over.  	template<typename T> -	struct ObjIterator -	{ +	struct ObjIterator { +		using iterator_category = std::forward_iterator_tag; +		using value_type = T; +		using difference_type = ptrdiff_t; +		using pointer = T*; +		using reference = T&;  		typename dict<RTLIL::IdString, T>::iterator it;  		dict<RTLIL::IdString, T> *list_p;  		int *refcount_p; @@ -474,13 +478,25 @@ namespace RTLIL  			return it != other.it;  		} -		inline void operator++() { + +		inline bool operator==(const RTLIL::ObjIterator<T> &other) const { +			return !(*this != other); +		} + +		inline ObjIterator<T>& operator++() {  			log_assert(list_p != nullptr);  			if (++it == list_p->end()) {  				(*refcount_p)--;  				list_p = nullptr;  				refcount_p = nullptr;  			} +			return *this; +		} + +		inline const ObjIterator<T> operator++(int) { +			ObjIterator<T> result(*this); +			++(*this); +			return result;  		}  	}; diff --git a/kernel/yosys.cc b/kernel/yosys.cc index a42a7c0b8..191b6d5c7 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -894,23 +894,26 @@ void run_frontend(std::string filename, std::string command, std::string *backen  		design = yosys_design;  	if (command == "auto") { -		if (filename.size() > 2 && filename.substr(filename.size()-2) == ".v") +		std::string filename_trim = filename; +		if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-3) == ".gz") +			filename_trim.erase(filename_trim.size()-3); +		if (filename_trim.size() > 2 && filename_trim.substr(filename_trim.size()-2) == ".v")  			command = "verilog"; -		else if (filename.size() > 2 && filename.substr(filename.size()-3) == ".sv") +		else if (filename_trim.size() > 2 && filename_trim.substr(filename_trim.size()-3) == ".sv")  			command = "verilog -sv"; -		else if (filename.size() > 3 && filename.substr(filename.size()-4) == ".vhd") +		else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-4) == ".vhd")  			command = "vhdl"; -		else if (filename.size() > 4 && filename.substr(filename.size()-5) == ".blif") +		else if (filename_trim.size() > 4 && filename_trim.substr(filename_trim.size()-5) == ".blif")  			command = "blif"; -		else if (filename.size() > 5 && filename.substr(filename.size()-6) == ".eblif") +		else if (filename_trim.size() > 5 && filename_trim.substr(filename_trim.size()-6) == ".eblif")  			command = "blif"; -		else if (filename.size() > 4 && filename.substr(filename.size()-5) == ".json") +		else if (filename_trim.size() > 4 && filename_trim.substr(filename_trim.size()-5) == ".json")  			command = "json"; -		else if (filename.size() > 3 && filename.substr(filename.size()-3) == ".il") +		else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-3) == ".il")  			command = "ilang"; -		else if (filename.size() > 3 && filename.substr(filename.size()-3) == ".ys") +		else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-3) == ".ys")  			command = "script"; -		else if (filename.size() > 3 && filename.substr(filename.size()-4) == ".tcl") +		else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-4) == ".tcl")  			command = "tcl";  		else if (filename == "-")  			command = "script"; diff --git a/kernel/yosys.h b/kernel/yosys.h index c7b671724..84c797b2d 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -52,6 +52,7 @@  #include <stdexcept>  #include <memory>  #include <cmath> +#include <cstddef>  #include <sstream>  #include <fstream> | 
