diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/driver.cc | 44 | ||||
| -rw-r--r-- | kernel/register.cc | 15 | ||||
| -rw-r--r-- | kernel/register.h | 3 | ||||
| -rw-r--r-- | kernel/rtlil.cc | 30 | ||||
| -rw-r--r-- | kernel/rtlil.h | 4 | ||||
| -rw-r--r-- | kernel/yosys.cc | 3 | 
6 files changed, 69 insertions, 30 deletions
diff --git a/kernel/driver.cc b/kernel/driver.cc index 70a97c4b9..7fc81f589 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -317,6 +317,12 @@ int main(int argc, char **argv)  		exit(0);  	} +	if (argc == 2 && (!strcmp(argv[1], "-V") || !strcmp(argv[1], "-version") || !strcmp(argv[1], "--version"))) +	{ +		printf("%s\n", yosys_version_str); +		exit(0); +	} +  	int opt;  	while ((opt = getopt(argc, argv, "MXAQTVSgm:f:Hh:b:o:p:l:L:qv:tds:c:W:w:e:D:P:E:")) != -1)  	{ @@ -566,34 +572,22 @@ int main(int argc, char **argv)  #else  		std::string meminfo;  		std::string stats_divider = ", "; -#  if defined(__linux__) -		std::ifstream statm; -		statm.open(stringf("/proc/%lld/statm", (long long)getpid())); -		if (statm.is_open()) { -			int sz_total, sz_resident; -			statm >> sz_total >> sz_resident; -			meminfo = stringf(", MEM: %.2f MB total, %.2f MB resident", -					sz_total * (getpagesize() / 1024.0 / 1024.0), -					sz_resident * (getpagesize() / 1024.0 / 1024.0)); -			stats_divider = "\n"; -		} -#  elif defined(__FreeBSD__) -		pid_t pid = getpid(); -		int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, (int)pid}; -		struct kinfo_proc kip; -		size_t kip_len = sizeof(kip); -		if (sysctl(mib, 4, &kip, &kip_len, NULL, 0) == 0) { -			vm_size_t sz_total = kip.ki_size; -			segsz_t sz_resident = kip.ki_rssize; -			meminfo = stringf(", MEM: %.2f MB total, %.2f MB resident", -				(int)sz_total / 1024.0 / 1024.0, -				(int)sz_resident * (getpagesize() / 1024.0 / 1024.0)); -			stats_divider = "\n"; -		} -#  endif  		struct rusage ru_buffer;  		getrusage(RUSAGE_SELF, &ru_buffer); +		if (yosys_design->scratchpad_get_bool("print_stats.include_children")) { +			struct rusage ru_buffer_children; +			getrusage(RUSAGE_CHILDREN, &ru_buffer_children); +			ru_buffer.ru_utime.tv_sec += ru_buffer_children.ru_utime.tv_sec; +			ru_buffer.ru_utime.tv_usec += ru_buffer_children.ru_utime.tv_usec; +			ru_buffer.ru_stime.tv_sec += ru_buffer_children.ru_stime.tv_sec; +			ru_buffer.ru_stime.tv_usec += ru_buffer_children.ru_stime.tv_usec; +			ru_buffer.ru_maxrss = std::max(ru_buffer.ru_maxrss, ru_buffer_children.ru_maxrss); +		} +#  if defined(__linux__) || defined(__FreeBSD__) +		meminfo = stringf(", MEM: %.2f MB peak", +				ru_buffer.ru_maxrss / 1024.0); +#endif  		log("End of script. Logfile hash: %s%sCPU: user %.2fs system %.2fs%s\n", hash.c_str(),  				stats_divider.c_str(), ru_buffer.ru_utime.tv_sec + 1e-6 * ru_buffer.ru_utime.tv_usec,  				ru_buffer.ru_stime.tv_sec + 1e-6 * ru_buffer.ru_stime.tv_usec, meminfo.c_str()); diff --git a/kernel/register.cc b/kernel/register.cc index 37f2e5e1b..5d0fb3c8c 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -114,20 +114,35 @@ void Pass::run_register()  void Pass::init_register()  { +	vector<Pass*> added_passes;  	while (first_queued_pass) { +		added_passes.push_back(first_queued_pass);  		first_queued_pass->run_register();  		first_queued_pass = first_queued_pass->next_queued_pass;  	} +	for (auto added_pass : added_passes) +		added_pass->on_register();  }  void Pass::done_register()  { +	for (auto &it : pass_register) +		it.second->on_shutdown(); +  	frontend_register.clear();  	pass_register.clear();  	backend_register.clear();  	log_assert(first_queued_pass == NULL);  } +void Pass::on_register() +{ +} + +void Pass::on_shutdown() +{ +} +  Pass::~Pass()  {  } diff --git a/kernel/register.h b/kernel/register.h index 85d552f0d..821faff3e 100644 --- a/kernel/register.h +++ b/kernel/register.h @@ -62,6 +62,9 @@ struct Pass  	virtual void run_register();  	static void init_register();  	static void done_register(); + +	virtual void on_register(); +	virtual void on_shutdown();  };  struct ScriptPass : Pass diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index 7c73f94c8..f286d139f 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -46,6 +46,7 @@ IdString RTLIL::ID::Y;  IdString RTLIL::ID::keep;  IdString RTLIL::ID::whitebox;  IdString RTLIL::ID::blackbox; +dict<std::string, std::string> RTLIL::constpad;  RTLIL::Const::Const()  { @@ -1893,10 +1894,6 @@ DEF_METHOD(And,      max(sig_a.size(), sig_b.size()), ID($and))  DEF_METHOD(Or,       max(sig_a.size(), sig_b.size()), ID($or))  DEF_METHOD(Xor,      max(sig_a.size(), sig_b.size()), ID($xor))  DEF_METHOD(Xnor,     max(sig_a.size(), sig_b.size()), ID($xnor)) -DEF_METHOD(Shl,      sig_a.size(), ID($shl)) -DEF_METHOD(Shr,      sig_a.size(), ID($shr)) -DEF_METHOD(Sshl,     sig_a.size(), ID($sshl)) -DEF_METHOD(Sshr,     sig_a.size(), ID($sshr))  DEF_METHOD(Shift,    sig_a.size(), ID($shift))  DEF_METHOD(Shiftx,   sig_a.size(), ID($shiftx))  DEF_METHOD(Lt,       1, ID($lt)) @@ -1916,6 +1913,31 @@ DEF_METHOD(LogicAnd, 1, ID($logic_and))  DEF_METHOD(LogicOr,  1, ID($logic_or))  #undef DEF_METHOD +#define DEF_METHOD(_func, _y_size, _type) \ +	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed, const std::string &src) { \ +		RTLIL::Cell *cell = addCell(name, _type);           \ +		cell->parameters[ID(A_SIGNED)] = is_signed;         \ +		cell->parameters[ID(B_SIGNED)] = false;             \ +		cell->parameters[ID(A_WIDTH)] = sig_a.size();       \ +		cell->parameters[ID(B_WIDTH)] = sig_b.size();       \ +		cell->parameters[ID(Y_WIDTH)] = sig_y.size();       \ +		cell->setPort(ID::A, sig_a);                        \ +		cell->setPort(ID::B, sig_b);                        \ +		cell->setPort(ID::Y, sig_y);                        \ +		cell->set_src_attribute(src);                       \ +		return cell;                                        \ +	} \ +	RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed, const std::string &src) { \ +		RTLIL::SigSpec sig_y = addWire(NEW_ID, _y_size);         \ +		add ## _func(name, sig_a, sig_b, sig_y, is_signed, src); \ +		return sig_y;                                            \ +	} +DEF_METHOD(Shl,      sig_a.size(), ID($shl)) +DEF_METHOD(Shr,      sig_a.size(), ID($shr)) +DEF_METHOD(Sshl,     sig_a.size(), ID($sshl)) +DEF_METHOD(Sshr,     sig_a.size(), ID($sshr)) +#undef DEF_METHOD +  #define DEF_METHOD(_func, _type, _pmux) \  	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, RTLIL::SigSpec sig_y, const std::string &src) { \  		RTLIL::Cell *cell = addCell(name, _type);                 \ diff --git a/kernel/rtlil.h b/kernel/rtlil.h index e5b24cc02..58c5d9674 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -377,6 +377,8 @@ namespace RTLIL  		extern IdString blackbox;  	}; +	extern dict<std::string, std::string> constpad; +  	static inline std::string escape_id(std::string str) {  		if (str.size() > 0 && str[0] != '\\' && str[0] != '$')  			return "\\" + str; @@ -849,6 +851,8 @@ public:  	RTLIL::SigSpec repeat(int num) const; +	void reverse() { inline_unpack(); std::reverse(bits_.begin(), bits_.end()); } +  	bool operator <(const RTLIL::SigSpec &other) const;  	bool operator ==(const RTLIL::SigSpec &other) const;  	inline bool operator !=(const RTLIL::SigSpec &other) const { return !(*this == other); } diff --git a/kernel/yosys.cc b/kernel/yosys.cc index 5018a4888..8190d8902 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -544,6 +544,8 @@ void yosys_shutdown()  	already_shutdown = true;  	log_pop(); +	Pass::done_register(); +  	delete yosys_design;  	yosys_design = NULL; @@ -553,7 +555,6 @@ void yosys_shutdown()  	log_errfile = NULL;  	log_files.clear(); -	Pass::done_register();  	yosys_celltypes.clear();  #ifdef YOSYS_ENABLE_TCL  | 
