mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	kernel: more pass by const ref, more speedups
This commit is contained in:
		
							parent
							
								
									8b12e97153
								
							
						
					
					
						commit
						4555b5b819
					
				
					 7 changed files with 372 additions and 372 deletions
				
			
		| 
						 | 
				
			
			@ -1317,7 +1317,7 @@ void AST::explode_interface_port(AstNode *module_ast, RTLIL::Module * intfmodule
 | 
			
		|||
 | 
			
		||||
// When an interface instance is found in a module, the whole RTLIL for the module will be rederived again
 | 
			
		||||
// from AST. The interface members are copied into the AST module with the prefix of the interface.
 | 
			
		||||
void AstModule::reprocess_module(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Module*> local_interfaces)
 | 
			
		||||
void AstModule::reprocess_module(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Module*> &local_interfaces)
 | 
			
		||||
{
 | 
			
		||||
	loadconfig();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1405,7 +1405,7 @@ void AstModule::reprocess_module(RTLIL::Design *design, dict<RTLIL::IdString, RT
 | 
			
		|||
 | 
			
		||||
// create a new parametric module (when needed) and return the name of the generated module - WITH support for interfaces
 | 
			
		||||
// This method is used to explode the interface when the interface is a port of the module (not instantiated inside)
 | 
			
		||||
RTLIL::IdString AstModule::derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, dict<RTLIL::IdString, RTLIL::Module*> interfaces, dict<RTLIL::IdString, RTLIL::IdString> modports, bool /*mayfail*/)
 | 
			
		||||
RTLIL::IdString AstModule::derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> ¶meters, const dict<RTLIL::IdString, RTLIL::Module*> &interfaces, const dict<RTLIL::IdString, RTLIL::IdString> &modports, bool /*mayfail*/)
 | 
			
		||||
{
 | 
			
		||||
	AstNode *new_ast = NULL;
 | 
			
		||||
	std::string modname = derive_common(design, parameters, &new_ast);
 | 
			
		||||
| 
						 | 
				
			
			@ -1484,7 +1484,7 @@ RTLIL::IdString AstModule::derive(RTLIL::Design *design, dict<RTLIL::IdString, R
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// create a new parametric module (when needed) and return the name of the generated module - without support for interfaces
 | 
			
		||||
RTLIL::IdString AstModule::derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, bool /*mayfail*/)
 | 
			
		||||
RTLIL::IdString AstModule::derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> ¶meters, bool /*mayfail*/)
 | 
			
		||||
{
 | 
			
		||||
	bool quiet = lib || attributes.count(ID(blackbox)) || attributes.count(ID(whitebox));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1504,7 +1504,7 @@ RTLIL::IdString AstModule::derive(RTLIL::Design *design, dict<RTLIL::IdString, R
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// create a new parametric module (when needed) and return the name of the generated module
 | 
			
		||||
std::string AstModule::derive_common(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, AstNode **new_ast_out, bool quiet)
 | 
			
		||||
std::string AstModule::derive_common(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> ¶meters, AstNode **new_ast_out, bool quiet)
 | 
			
		||||
{
 | 
			
		||||
	std::string stripped_name = name.str();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1518,18 +1518,18 @@ std::string AstModule::derive_common(RTLIL::Design *design, dict<RTLIL::IdString
 | 
			
		|||
		if (child->type != AST_PARAMETER)
 | 
			
		||||
			continue;
 | 
			
		||||
		para_counter++;
 | 
			
		||||
		std::string para_id = child->str;
 | 
			
		||||
		if (parameters.count(para_id) > 0) {
 | 
			
		||||
		auto it = parameters.find(child->str);
 | 
			
		||||
		if (it != parameters.end()) {
 | 
			
		||||
			if (!quiet)
 | 
			
		||||
				log("Parameter %s = %s\n", child->str.c_str(), log_signal(RTLIL::SigSpec(parameters[child->str])));
 | 
			
		||||
			para_info += stringf("%s=%s", child->str.c_str(), log_signal(RTLIL::SigSpec(parameters[para_id])));
 | 
			
		||||
				log("Parameter %s = %s\n", child->str.c_str(), log_signal(it->second));
 | 
			
		||||
			para_info += stringf("%s=%s", child->str.c_str(), log_signal(it->second));
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		para_id = stringf("$%d", para_counter);
 | 
			
		||||
		if (parameters.count(para_id) > 0) {
 | 
			
		||||
		it = parameters.find(stringf("$%d", para_counter));
 | 
			
		||||
		if (it != parameters.end()) {
 | 
			
		||||
			if (!quiet)
 | 
			
		||||
				log("Parameter %d (%s) = %s\n", para_counter, child->str.c_str(), log_signal(RTLIL::SigSpec(parameters[para_id])));
 | 
			
		||||
			para_info += stringf("%s=%s", child->str.c_str(), log_signal(RTLIL::SigSpec(parameters[para_id])));
 | 
			
		||||
				log("Parameter %d (%s) = %s\n", para_counter, child->str.c_str(), log_signal(it->second));
 | 
			
		||||
			para_info += stringf("%s=%s", child->str.c_str(), log_signal(it->second));
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1549,46 +1549,52 @@ std::string AstModule::derive_common(RTLIL::Design *design, dict<RTLIL::IdString
 | 
			
		|||
		log_header(design, "Executing AST frontend in derive mode using pre-parsed AST for module `%s'.\n", stripped_name.c_str());
 | 
			
		||||
	loadconfig();
 | 
			
		||||
 | 
			
		||||
	pool<IdString> rewritten;
 | 
			
		||||
	rewritten.reserve(GetSize(parameters));
 | 
			
		||||
 | 
			
		||||
	AstNode *new_ast = ast->clone();
 | 
			
		||||
	para_counter = 0;
 | 
			
		||||
	for (auto child : new_ast->children) {
 | 
			
		||||
		if (child->type != AST_PARAMETER)
 | 
			
		||||
			continue;
 | 
			
		||||
		para_counter++;
 | 
			
		||||
		std::string para_id = child->str;
 | 
			
		||||
		if (parameters.count(para_id) > 0) {
 | 
			
		||||
		auto it = parameters.find(child->str);
 | 
			
		||||
		if (it != parameters.end()) {
 | 
			
		||||
			if (!quiet)
 | 
			
		||||
				log("Parameter %s = %s\n", child->str.c_str(), log_signal(RTLIL::SigSpec(parameters[child->str])));
 | 
			
		||||
				log("Parameter %s = %s\n", child->str.c_str(), log_signal(it->second));
 | 
			
		||||
			goto rewrite_parameter;
 | 
			
		||||
		}
 | 
			
		||||
		para_id = stringf("$%d", para_counter);
 | 
			
		||||
		if (parameters.count(para_id) > 0) {
 | 
			
		||||
		it = parameters.find(stringf("$%d", para_counter));
 | 
			
		||||
		if (it != parameters.end()) {
 | 
			
		||||
			if (!quiet)
 | 
			
		||||
				log("Parameter %d (%s) = %s\n", para_counter, child->str.c_str(), log_signal(RTLIL::SigSpec(parameters[para_id])));
 | 
			
		||||
				log("Parameter %d (%s) = %s\n", para_counter, child->str.c_str(), log_signal(it->second));
 | 
			
		||||
			goto rewrite_parameter;
 | 
			
		||||
		}
 | 
			
		||||
		continue;
 | 
			
		||||
	rewrite_parameter:
 | 
			
		||||
		delete child->children.at(0);
 | 
			
		||||
		if ((parameters[para_id].flags & RTLIL::CONST_FLAG_REAL) != 0) {
 | 
			
		||||
		if ((it->second.flags & RTLIL::CONST_FLAG_REAL) != 0) {
 | 
			
		||||
			child->children[0] = new AstNode(AST_REALVALUE);
 | 
			
		||||
			child->children[0]->realvalue = std::stod(parameters[para_id].decode_string());
 | 
			
		||||
		} else if ((parameters[para_id].flags & RTLIL::CONST_FLAG_STRING) != 0)
 | 
			
		||||
			child->children[0] = AstNode::mkconst_str(parameters[para_id].decode_string());
 | 
			
		||||
			child->children[0]->realvalue = std::stod(it->second.decode_string());
 | 
			
		||||
		} else if ((it->second.flags & RTLIL::CONST_FLAG_STRING) != 0)
 | 
			
		||||
			child->children[0] = AstNode::mkconst_str(it->second.decode_string());
 | 
			
		||||
		else
 | 
			
		||||
			child->children[0] = AstNode::mkconst_bits(parameters[para_id].bits, (parameters[para_id].flags & RTLIL::CONST_FLAG_SIGNED) != 0);
 | 
			
		||||
		parameters.erase(para_id);
 | 
			
		||||
			child->children[0] = AstNode::mkconst_bits(it->second.bits, (it->second.flags & RTLIL::CONST_FLAG_SIGNED) != 0);
 | 
			
		||||
		rewritten.insert(it->first);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (auto param : parameters) {
 | 
			
		||||
		AstNode *defparam = new AstNode(AST_DEFPARAM, new AstNode(AST_IDENTIFIER));
 | 
			
		||||
		defparam->children[0]->str = param.first.str();
 | 
			
		||||
		if ((param.second.flags & RTLIL::CONST_FLAG_STRING) != 0)
 | 
			
		||||
			defparam->children.push_back(AstNode::mkconst_str(param.second.decode_string()));
 | 
			
		||||
		else
 | 
			
		||||
			defparam->children.push_back(AstNode::mkconst_bits(param.second.bits, (param.second.flags & RTLIL::CONST_FLAG_SIGNED) != 0));
 | 
			
		||||
		new_ast->children.push_back(defparam);
 | 
			
		||||
	}
 | 
			
		||||
	if (GetSize(rewritten) < GetSize(parameters))
 | 
			
		||||
		for (const auto ¶m : parameters) {
 | 
			
		||||
			if (rewritten.count(param.first))
 | 
			
		||||
				continue;
 | 
			
		||||
			AstNode *defparam = new AstNode(AST_DEFPARAM, new AstNode(AST_IDENTIFIER));
 | 
			
		||||
			defparam->children[0]->str = param.first.str();
 | 
			
		||||
			if ((param.second.flags & RTLIL::CONST_FLAG_STRING) != 0)
 | 
			
		||||
				defparam->children.push_back(AstNode::mkconst_str(param.second.decode_string()));
 | 
			
		||||
			else
 | 
			
		||||
				defparam->children.push_back(AstNode::mkconst_bits(param.second.bits, (param.second.flags & RTLIL::CONST_FLAG_SIGNED) != 0));
 | 
			
		||||
			new_ast->children.push_back(defparam);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	(*new_ast_out) = new_ast;
 | 
			
		||||
	return modname;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -312,10 +312,10 @@ namespace AST
 | 
			
		|||
		AstNode *ast;
 | 
			
		||||
		bool nolatches, nomeminit, nomem2reg, mem2reg, noblackbox, lib, nowb, noopt, icells, pwires, autowire;
 | 
			
		||||
		~AstModule() YS_OVERRIDE;
 | 
			
		||||
		RTLIL::IdString derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, bool mayfail) YS_OVERRIDE;
 | 
			
		||||
		RTLIL::IdString derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, dict<RTLIL::IdString, RTLIL::Module*> interfaces, dict<RTLIL::IdString, RTLIL::IdString> modports, bool mayfail) YS_OVERRIDE;
 | 
			
		||||
		std::string derive_common(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, AstNode **new_ast_out, bool quiet = false);
 | 
			
		||||
		void reprocess_module(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Module *> local_interfaces) YS_OVERRIDE;
 | 
			
		||||
		RTLIL::IdString derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> ¶meters, bool mayfail) YS_OVERRIDE;
 | 
			
		||||
		RTLIL::IdString derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> ¶meters, const dict<RTLIL::IdString, RTLIL::Module*> &interfaces, const dict<RTLIL::IdString, RTLIL::IdString> &modports, bool mayfail) YS_OVERRIDE;
 | 
			
		||||
		std::string derive_common(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> ¶meters, AstNode **new_ast_out, bool quiet = false);
 | 
			
		||||
		void reprocess_module(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Module *> &local_interfaces) YS_OVERRIDE;
 | 
			
		||||
		RTLIL::Module *clone() const YS_OVERRIDE;
 | 
			
		||||
		void loadconfig() const;
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,7 +157,7 @@ struct RpcServer {
 | 
			
		|||
struct RpcModule : RTLIL::Module {
 | 
			
		||||
	std::shared_ptr<RpcServer> server;
 | 
			
		||||
 | 
			
		||||
	RTLIL::IdString derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, bool /*mayfail*/) YS_OVERRIDE {
 | 
			
		||||
	RTLIL::IdString derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> ¶meters, bool /*mayfail*/) YS_OVERRIDE {
 | 
			
		||||
		std::string stripped_name = name.str();
 | 
			
		||||
		if (stripped_name.compare(0, 9, "$abstract") == 0)
 | 
			
		||||
			stripped_name = stripped_name.substr(9);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -158,7 +158,7 @@ struct ModIndex : public RTLIL::Monitor
 | 
			
		|||
#endif
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void notify_connect(RTLIL::Cell *cell, const RTLIL::IdString &port, const RTLIL::SigSpec &old_sig, RTLIL::SigSpec &sig) YS_OVERRIDE
 | 
			
		||||
	void notify_connect(RTLIL::Cell *cell, const RTLIL::IdString &port, const RTLIL::SigSpec &old_sig, const RTLIL::SigSpec &sig) YS_OVERRIDE
 | 
			
		||||
	{
 | 
			
		||||
		log_assert(module == cell->module);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										336
									
								
								kernel/rtlil.cc
									
										
									
									
									
								
							
							
						
						
									
										336
									
								
								kernel/rtlil.cc
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -151,7 +151,7 @@ std::string RTLIL::Const::as_string() const
 | 
			
		|||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Const RTLIL::Const::from_string(std::string str)
 | 
			
		||||
RTLIL::Const RTLIL::Const::from_string(const std::string &str)
 | 
			
		||||
{
 | 
			
		||||
	Const c;
 | 
			
		||||
	c.bits.reserve(str.size());
 | 
			
		||||
| 
						 | 
				
			
			@ -474,32 +474,33 @@ RTLIL::Module *RTLIL::Design::addModule(RTLIL::IdString name)
 | 
			
		|||
	return module;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTLIL::Design::scratchpad_unset(std::string varname)
 | 
			
		||||
void RTLIL::Design::scratchpad_unset(const std::string &varname)
 | 
			
		||||
{
 | 
			
		||||
	scratchpad.erase(varname);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTLIL::Design::scratchpad_set_int(std::string varname, int value)
 | 
			
		||||
void RTLIL::Design::scratchpad_set_int(const std::string &varname, int value)
 | 
			
		||||
{
 | 
			
		||||
	scratchpad[varname] = stringf("%d", value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTLIL::Design::scratchpad_set_bool(std::string varname, bool value)
 | 
			
		||||
void RTLIL::Design::scratchpad_set_bool(const std::string &varname, bool value)
 | 
			
		||||
{
 | 
			
		||||
	scratchpad[varname] = value ? "true" : "false";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTLIL::Design::scratchpad_set_string(std::string varname, std::string value)
 | 
			
		||||
void RTLIL::Design::scratchpad_set_string(const std::string &varname, const std::string &value)
 | 
			
		||||
{
 | 
			
		||||
	scratchpad[varname] = value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RTLIL::Design::scratchpad_get_int(std::string varname, int default_value) const
 | 
			
		||||
int RTLIL::Design::scratchpad_get_int(const std::string &varname, int default_value) const
 | 
			
		||||
{
 | 
			
		||||
	if (scratchpad.count(varname) == 0)
 | 
			
		||||
	auto it = scratchpad.find(varname);
 | 
			
		||||
	if (it == scratchpad.end())
 | 
			
		||||
		return default_value;
 | 
			
		||||
 | 
			
		||||
	std::string str = scratchpad.at(varname);
 | 
			
		||||
	const std::string &str = it->second;
 | 
			
		||||
 | 
			
		||||
	if (str == "0" || str == "false")
 | 
			
		||||
		return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -512,12 +513,13 @@ int RTLIL::Design::scratchpad_get_int(std::string varname, int default_value) co
 | 
			
		|||
	return *endptr ? default_value : parsed_value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTLIL::Design::scratchpad_get_bool(std::string varname, bool default_value) const
 | 
			
		||||
bool RTLIL::Design::scratchpad_get_bool(const std::string &varname, bool default_value) const
 | 
			
		||||
{
 | 
			
		||||
	if (scratchpad.count(varname) == 0)
 | 
			
		||||
	auto it = scratchpad.find(varname);
 | 
			
		||||
	if (it == scratchpad.end())
 | 
			
		||||
		return default_value;
 | 
			
		||||
 | 
			
		||||
	std::string str = scratchpad.at(varname);
 | 
			
		||||
	const std::string &str = it->second;
 | 
			
		||||
 | 
			
		||||
	if (str == "0" || str == "false")
 | 
			
		||||
		return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -528,11 +530,13 @@ bool RTLIL::Design::scratchpad_get_bool(std::string varname, bool default_value)
 | 
			
		|||
	return default_value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string RTLIL::Design::scratchpad_get_string(std::string varname, std::string default_value) const
 | 
			
		||||
std::string RTLIL::Design::scratchpad_get_string(const std::string &varname, const std::string &default_value) const
 | 
			
		||||
{
 | 
			
		||||
	if (scratchpad.count(varname) == 0)
 | 
			
		||||
	auto it = scratchpad.find(varname);
 | 
			
		||||
	if (it == scratchpad.end())
 | 
			
		||||
		return default_value;
 | 
			
		||||
	return scratchpad.at(varname);
 | 
			
		||||
 | 
			
		||||
	return it->second;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTLIL::Design::remove(RTLIL::Module *module)
 | 
			
		||||
| 
						 | 
				
			
			@ -720,12 +724,12 @@ void RTLIL::Module::makeblackbox()
 | 
			
		|||
	set_bool_attribute(ID::blackbox);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTLIL::Module::reprocess_module(RTLIL::Design *, dict<RTLIL::IdString, RTLIL::Module *>)
 | 
			
		||||
void RTLIL::Module::reprocess_module(RTLIL::Design *, const dict<RTLIL::IdString, RTLIL::Module *> &)
 | 
			
		||||
{
 | 
			
		||||
	log_error("Cannot reprocess_module module `%s' !\n", id2cstr(name));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::IdString RTLIL::Module::derive(RTLIL::Design*, dict<RTLIL::IdString, RTLIL::Const>, bool mayfail)
 | 
			
		||||
RTLIL::IdString RTLIL::Module::derive(RTLIL::Design*, const dict<RTLIL::IdString, RTLIL::Const> &, bool mayfail)
 | 
			
		||||
{
 | 
			
		||||
	if (mayfail)
 | 
			
		||||
		return RTLIL::IdString();
 | 
			
		||||
| 
						 | 
				
			
			@ -733,7 +737,7 @@ RTLIL::IdString RTLIL::Module::derive(RTLIL::Design*, dict<RTLIL::IdString, RTLI
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
RTLIL::IdString RTLIL::Module::derive(RTLIL::Design*, dict<RTLIL::IdString, RTLIL::Const>, dict<RTLIL::IdString, RTLIL::Module*>, dict<RTLIL::IdString, RTLIL::IdString>, bool mayfail)
 | 
			
		||||
RTLIL::IdString RTLIL::Module::derive(RTLIL::Design*, const dict<RTLIL::IdString, RTLIL::Const> &, const dict<RTLIL::IdString, RTLIL::Module*> &, const dict<RTLIL::IdString, RTLIL::IdString> &, bool mayfail)
 | 
			
		||||
{
 | 
			
		||||
	if (mayfail)
 | 
			
		||||
		return RTLIL::IdString();
 | 
			
		||||
| 
						 | 
				
			
			@ -767,16 +771,17 @@ namespace {
 | 
			
		|||
 | 
			
		||||
		int param(RTLIL::IdString name)
 | 
			
		||||
		{
 | 
			
		||||
			if (cell->parameters.count(name) == 0)
 | 
			
		||||
			auto it = cell->parameters.find(name);
 | 
			
		||||
			if (it == cell->parameters.end())
 | 
			
		||||
				error(__LINE__);
 | 
			
		||||
			expected_params.insert(name);
 | 
			
		||||
			return cell->parameters.at(name).as_int();
 | 
			
		||||
			return it->second.as_int();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		int param_bool(RTLIL::IdString name)
 | 
			
		||||
		{
 | 
			
		||||
			int v = param(name);
 | 
			
		||||
			if (cell->parameters.at(name).bits.size() > 32)
 | 
			
		||||
			if (GetSize(cell->parameters.at(name)) > 32)
 | 
			
		||||
				error(__LINE__);
 | 
			
		||||
			if (v != 0 && v != 1)
 | 
			
		||||
				error(__LINE__);
 | 
			
		||||
| 
						 | 
				
			
			@ -794,20 +799,21 @@ namespace {
 | 
			
		|||
		void param_bits(RTLIL::IdString name, int width)
 | 
			
		||||
		{
 | 
			
		||||
			param(name);
 | 
			
		||||
			if (int(cell->parameters.at(name).bits.size()) != width)
 | 
			
		||||
			if (GetSize(cell->parameters.at(name).bits) != width)
 | 
			
		||||
				error(__LINE__);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		void port(RTLIL::IdString name, int width)
 | 
			
		||||
		{
 | 
			
		||||
			if (!cell->hasPort(name))
 | 
			
		||||
			auto it = cell->connections_.find(name);
 | 
			
		||||
			if (it == cell->connections_.end())
 | 
			
		||||
				error(__LINE__);
 | 
			
		||||
			if (cell->getPort(name).size() != width)
 | 
			
		||||
			if (GetSize(it->second) != width)
 | 
			
		||||
				error(__LINE__);
 | 
			
		||||
			expected_ports.insert(name);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		void check_expected(bool check_matched_sign = true)
 | 
			
		||||
		void check_expected(bool check_matched_sign = false)
 | 
			
		||||
		{
 | 
			
		||||
			for (auto ¶ : cell->parameters)
 | 
			
		||||
				if (expected_params.count(para.first) == 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -816,35 +822,15 @@ namespace {
 | 
			
		|||
				if (expected_ports.count(conn.first) == 0)
 | 
			
		||||
					error(__LINE__);
 | 
			
		||||
 | 
			
		||||
			if (expected_params.count(ID(A_SIGNED)) != 0 && expected_params.count(ID(B_SIGNED)) && check_matched_sign) {
 | 
			
		||||
				bool a_is_signed = param(ID(A_SIGNED)) != 0;
 | 
			
		||||
				bool b_is_signed = param(ID(B_SIGNED)) != 0;
 | 
			
		||||
			if (check_matched_sign) {
 | 
			
		||||
				log_assert(expected_params.count(ID(A_SIGNED)) != 0 && expected_params.count(ID(B_SIGNED)) != 0);
 | 
			
		||||
				bool a_is_signed = cell->parameters.at(ID(A_SIGNED)).as_bool();
 | 
			
		||||
				bool b_is_signed = cell->parameters.at(ID(B_SIGNED)).as_bool();
 | 
			
		||||
				if (a_is_signed != b_is_signed)
 | 
			
		||||
					error(__LINE__);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		void check_gate(const char *ports)
 | 
			
		||||
		{
 | 
			
		||||
			if (cell->parameters.size() != 0)
 | 
			
		||||
				error(__LINE__);
 | 
			
		||||
 | 
			
		||||
			for (const char *p = ports; *p; p++) {
 | 
			
		||||
				char portname[3] = { '\\', *p, 0 };
 | 
			
		||||
				if (!cell->hasPort(portname))
 | 
			
		||||
					error(__LINE__);
 | 
			
		||||
				if (cell->getPort(portname).size() != 1)
 | 
			
		||||
					error(__LINE__);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for (auto &conn : cell->connections()) {
 | 
			
		||||
				if (conn.first.size() != 2 || conn.first[0] != '\\')
 | 
			
		||||
					error(__LINE__);
 | 
			
		||||
				if (strchr(ports, conn.first[1]) == NULL)
 | 
			
		||||
					error(__LINE__);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		void check()
 | 
			
		||||
		{
 | 
			
		||||
			if (!cell->type.begins_with("$") || cell->type.begins_with("$__") || cell->type.begins_with("$paramod") || cell->type.begins_with("$fmcombine") ||
 | 
			
		||||
| 
						 | 
				
			
			@ -865,7 +851,7 @@ namespace {
 | 
			
		|||
				port(ID::A, param(ID(A_WIDTH)));
 | 
			
		||||
				port(ID::B, param(ID(B_WIDTH)));
 | 
			
		||||
				port(ID::Y, param(ID(Y_WIDTH)));
 | 
			
		||||
				check_expected();
 | 
			
		||||
				check_expected(true);
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -903,7 +889,7 @@ namespace {
 | 
			
		|||
				port(ID::A, param(ID(A_WIDTH)));
 | 
			
		||||
				port(ID::B, param(ID(B_WIDTH)));
 | 
			
		||||
				port(ID::Y, param(ID(Y_WIDTH)));
 | 
			
		||||
				check_expected();
 | 
			
		||||
				check_expected(true);
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -946,7 +932,7 @@ namespace {
 | 
			
		|||
				port(ID(X), param(ID(Y_WIDTH)));
 | 
			
		||||
				port(ID::Y, param(ID(Y_WIDTH)));
 | 
			
		||||
				port(ID(CO), param(ID(Y_WIDTH)));
 | 
			
		||||
				check_expected();
 | 
			
		||||
				check_expected(true);
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1271,72 +1257,72 @@ namespace {
 | 
			
		|||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_BUF_))    { check_gate("AY"); return; }
 | 
			
		||||
			if (cell->type == ID($_NOT_))    { check_gate("AY"); return; }
 | 
			
		||||
			if (cell->type == ID($_AND_))    { check_gate("ABY"); return; }
 | 
			
		||||
			if (cell->type == ID($_NAND_))   { check_gate("ABY"); return; }
 | 
			
		||||
			if (cell->type == ID($_OR_))     { check_gate("ABY"); return; }
 | 
			
		||||
			if (cell->type == ID($_NOR_))    { check_gate("ABY"); return; }
 | 
			
		||||
			if (cell->type == ID($_XOR_))    { check_gate("ABY"); return; }
 | 
			
		||||
			if (cell->type == ID($_XNOR_))   { check_gate("ABY"); return; }
 | 
			
		||||
			if (cell->type == ID($_ANDNOT_)) { check_gate("ABY"); return; }
 | 
			
		||||
			if (cell->type == ID($_ORNOT_))  { check_gate("ABY"); return; }
 | 
			
		||||
			if (cell->type == ID($_MUX_))    { check_gate("ABSY"); return; }
 | 
			
		||||
			if (cell->type == ID($_NMUX_))   { check_gate("ABSY"); return; }
 | 
			
		||||
			if (cell->type == ID($_AOI3_))   { check_gate("ABCY"); return; }
 | 
			
		||||
			if (cell->type == ID($_OAI3_))   { check_gate("ABCY"); return; }
 | 
			
		||||
			if (cell->type == ID($_AOI4_))   { check_gate("ABCDY"); return; }
 | 
			
		||||
			if (cell->type == ID($_OAI4_))   { check_gate("ABCDY"); return; }
 | 
			
		||||
			if (cell->type == ID($_BUF_))    { port(ID::A,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_NOT_))    { port(ID::A,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_AND_))    { port(ID::A,1); port(ID::B,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_NAND_))   { port(ID::A,1); port(ID::B,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_OR_))     { port(ID::A,1); port(ID::B,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_NOR_))    { port(ID::A,1); port(ID::B,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_XOR_))    { port(ID::A,1); port(ID::B,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_XNOR_))   { port(ID::A,1); port(ID::B,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_ANDNOT_)) { port(ID::A,1); port(ID::B,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_ORNOT_))  { port(ID::A,1); port(ID::B,1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_MUX_))    { port(ID::A,1); port(ID::B,1); port(ID(S),1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_NMUX_))   { port(ID::A,1); port(ID::B,1); port(ID(S),1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_AOI3_))   { port(ID::A,1); port(ID::B,1); port(ID(C),1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_OAI3_))   { port(ID::A,1); port(ID::B,1); port(ID(C),1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_AOI4_))   { port(ID::A,1); port(ID::B,1); port(ID(C),1); port(ID(D),1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_OAI4_))   { port(ID::A,1); port(ID::B,1); port(ID(C),1); port(ID(D),1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_TBUF_))  { check_gate("AYE"); return; }
 | 
			
		||||
			if (cell->type == ID($_TBUF_))  { port(ID::A,1); port(ID::Y,1); port(ID(E),1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_MUX4_))  { check_gate("ABCDSTY"); return; }
 | 
			
		||||
			if (cell->type == ID($_MUX8_))  { check_gate("ABCDEFGHSTUY"); return; }
 | 
			
		||||
			if (cell->type == ID($_MUX16_)) { check_gate("ABCDEFGHIJKLMNOPSTUVY"); return; }
 | 
			
		||||
			if (cell->type == ID($_MUX4_))  { port(ID::A,1); port(ID::B,1); port(ID(C),1); port(ID(D),1); port(ID(S),1); port(ID(T),1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_MUX8_))  { port(ID::A,1); port(ID::B,1); port(ID(C),1); port(ID(D),1); port(ID(E),1); port(ID(F),1); port(ID(G),1); port(ID(H),1); port(ID(S),1); port(ID(T),1); port(ID(U),1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_MUX16_)) { port(ID::A,1); port(ID::B,1); port(ID(C),1); port(ID(D),1); port(ID(E),1); port(ID(F),1); port(ID(G),1); port(ID(H),1); port(ID(I),1); port(ID(J),1); port(ID(K),1); port(ID(L),1); port(ID(M),1); port(ID(N),1); port(ID(O),1); port(ID(P),1); port(ID(S),1); port(ID(T),1); port(ID(U),1); port(ID(V),1); port(ID::Y,1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_SR_NN_)) { check_gate("SRQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_SR_NP_)) { check_gate("SRQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_SR_PN_)) { check_gate("SRQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_SR_PP_)) { check_gate("SRQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_SR_NN_)) { port(ID(S),1); port(ID(R),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_SR_NP_)) { port(ID(S),1); port(ID(R),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_SR_PN_)) { port(ID(S),1); port(ID(R),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_SR_PP_)) { port(ID(S),1); port(ID(R),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_FF_))    { check_gate("DQ");  return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_N_)) { check_gate("DQC"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_P_)) { check_gate("DQC"); return; }
 | 
			
		||||
			if (cell->type == ID($_FF_))    { port(ID(D),1); port(ID(Q),1); check_expected();  return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_N_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_P_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_DFFE_NN_)) { check_gate("DQCE"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFE_NP_)) { check_gate("DQCE"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFE_PN_)) { check_gate("DQCE"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFE_PP_)) { check_gate("DQCE"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFE_NN_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(E),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFE_NP_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(E),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFE_PN_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(E),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFE_PP_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(E),1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_DFF_NN0_)) { check_gate("DQCR"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_NN1_)) { check_gate("DQCR"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_NP0_)) { check_gate("DQCR"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_NP1_)) { check_gate("DQCR"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_PN0_)) { check_gate("DQCR"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_PN1_)) { check_gate("DQCR"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_PP0_)) { check_gate("DQCR"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_PP1_)) { check_gate("DQCR"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_NN0_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(R),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_NN1_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(R),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_NP0_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(R),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_NP1_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(R),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_PN0_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(R),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_PN1_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(R),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_PP0_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(R),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFF_PP1_)) { port(ID(D),1); port(ID(Q),1); port(ID(C),1); port(ID(R),1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_DFFSR_NNN_)) { check_gate("CSRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_NNP_)) { check_gate("CSRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_NPN_)) { check_gate("CSRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_NPP_)) { check_gate("CSRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_PNN_)) { check_gate("CSRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_PNP_)) { check_gate("CSRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_PPN_)) { check_gate("CSRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_PPP_)) { check_gate("CSRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_NNN_)) { port(ID(C),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_NNP_)) { port(ID(C),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_NPN_)) { port(ID(C),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_NPP_)) { port(ID(C),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_PNN_)) { port(ID(C),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_PNP_)) { port(ID(C),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_PPN_)) { port(ID(C),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DFFSR_PPP_)) { port(ID(C),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_DLATCH_N_)) { check_gate("EDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCH_P_)) { check_gate("EDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCH_N_)) { port(ID(E),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCH_P_)) { port(ID(E),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_NNN_)) { check_gate("ESRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_NNP_)) { check_gate("ESRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_NPN_)) { check_gate("ESRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_NPP_)) { check_gate("ESRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_PNN_)) { check_gate("ESRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_PNP_)) { check_gate("ESRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_PPN_)) { check_gate("ESRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_PPP_)) { check_gate("ESRDQ"); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_NNN_)) { port(ID(E),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_NNP_)) { port(ID(E),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_NPN_)) { port(ID(E),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_NPP_)) { port(ID(E),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_PNN_)) { port(ID(E),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_PNP_)) { port(ID(E),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_PPN_)) { port(ID(E),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
			if (cell->type == ID($_DLATCHSR_PPP_)) { port(ID(E),1); port(ID(S),1); port(ID(R),1); port(ID(D),1); port(ID(Q),1); check_expected(); return; }
 | 
			
		||||
 | 
			
		||||
			error(__LINE__);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -1843,7 +1829,7 @@ RTLIL::Cell *RTLIL::Module::addCell(RTLIL::IdString name, const RTLIL::Cell *oth
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
#define DEF_METHOD(_func, _y_size, _type) \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed, const std::string &src) { \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const 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(A_WIDTH)] = sig_a.size();       \
 | 
			
		||||
| 
						 | 
				
			
			@ -1853,7 +1839,7 @@ RTLIL::Cell *RTLIL::Module::addCell(RTLIL::IdString name, const RTLIL::Cell *oth
 | 
			
		|||
		cell->set_src_attribute(src);                       \
 | 
			
		||||
		return cell;                                        \
 | 
			
		||||
	} \
 | 
			
		||||
	RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed, const std::string &src) { \
 | 
			
		||||
	RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed, const std::string &src) { \
 | 
			
		||||
		RTLIL::SigSpec sig_y = addWire(NEW_ID, _y_size);    \
 | 
			
		||||
		add ## _func(name, sig_a, sig_y, is_signed, src);   \
 | 
			
		||||
		return sig_y;                                       \
 | 
			
		||||
| 
						 | 
				
			
			@ -1870,7 +1856,7 @@ DEF_METHOD(LogicNot,   1, ID($logic_not))
 | 
			
		|||
#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* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const 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)] = is_signed;         \
 | 
			
		||||
| 
						 | 
				
			
			@ -1883,7 +1869,7 @@ DEF_METHOD(LogicNot,   1, ID($logic_not))
 | 
			
		|||
		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 RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const 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;                                            \
 | 
			
		||||
| 
						 | 
				
			
			@ -1912,7 +1898,7 @@ 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* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const 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;             \
 | 
			
		||||
| 
						 | 
				
			
			@ -1925,7 +1911,7 @@ DEF_METHOD(LogicOr,  1, ID($logic_or))
 | 
			
		|||
		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 RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const 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;                                            \
 | 
			
		||||
| 
						 | 
				
			
			@ -1937,7 +1923,7 @@ 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* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_s, const RTLIL::SigSpec &sig_y, const std::string &src) { \
 | 
			
		||||
		RTLIL::Cell *cell = addCell(name, _type);                 \
 | 
			
		||||
		cell->parameters[ID(WIDTH)] = sig_a.size();               \
 | 
			
		||||
		if (_pmux) cell->parameters[ID(S_WIDTH)] = sig_s.size();  \
 | 
			
		||||
| 
						 | 
				
			
			@ -1948,7 +1934,7 @@ DEF_METHOD(Sshr,     sig_a.size(), ID($sshr))
 | 
			
		|||
		cell->set_src_attribute(src);                             \
 | 
			
		||||
		return cell;                                              \
 | 
			
		||||
	} \
 | 
			
		||||
	RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, const std::string &src) { \
 | 
			
		||||
	RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_s, const std::string &src) { \
 | 
			
		||||
		RTLIL::SigSpec sig_y = addWire(NEW_ID, sig_a.size());     \
 | 
			
		||||
		add ## _func(name, sig_a, sig_b, sig_s, sig_y, src);      \
 | 
			
		||||
		return sig_y;                                             \
 | 
			
		||||
| 
						 | 
				
			
			@ -1958,20 +1944,20 @@ DEF_METHOD(Pmux,     ID($pmux),       1)
 | 
			
		|||
#undef DEF_METHOD
 | 
			
		||||
 | 
			
		||||
#define DEF_METHOD_2(_func, _type, _P1, _P2) \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, const std::string &src) { \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigBit &sig1, const RTLIL::SigBit &sig2, const std::string &src) { \
 | 
			
		||||
		RTLIL::Cell *cell = addCell(name, _type);         \
 | 
			
		||||
		cell->setPort("\\" #_P1, sig1);                   \
 | 
			
		||||
		cell->setPort("\\" #_P2, sig2);                   \
 | 
			
		||||
		cell->set_src_attribute(src);                     \
 | 
			
		||||
		return cell;                                      \
 | 
			
		||||
	} \
 | 
			
		||||
	RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, const std::string &src) { \
 | 
			
		||||
	RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigBit &sig1, const std::string &src) { \
 | 
			
		||||
		RTLIL::SigBit sig2 = addWire(NEW_ID);             \
 | 
			
		||||
		add ## _func(name, sig1, sig2, src);              \
 | 
			
		||||
		return sig2;                                      \
 | 
			
		||||
	}
 | 
			
		||||
#define DEF_METHOD_3(_func, _type, _P1, _P2, _P3) \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, const std::string &src) { \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigBit &sig1, const RTLIL::SigBit &sig2, const RTLIL::SigBit &sig3, const std::string &src) { \
 | 
			
		||||
		RTLIL::Cell *cell = addCell(name, _type);         \
 | 
			
		||||
		cell->setPort("\\" #_P1, sig1);                   \
 | 
			
		||||
		cell->setPort("\\" #_P2, sig2);                   \
 | 
			
		||||
| 
						 | 
				
			
			@ -1979,13 +1965,13 @@ DEF_METHOD(Pmux,     ID($pmux),       1)
 | 
			
		|||
		cell->set_src_attribute(src);                     \
 | 
			
		||||
		return cell;                                      \
 | 
			
		||||
	} \
 | 
			
		||||
	RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, const std::string &src) { \
 | 
			
		||||
	RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigBit &sig1, const RTLIL::SigBit &sig2, const std::string &src) { \
 | 
			
		||||
		RTLIL::SigBit sig3 = addWire(NEW_ID);             \
 | 
			
		||||
		add ## _func(name, sig1, sig2, sig3, src);        \
 | 
			
		||||
		return sig3;                                      \
 | 
			
		||||
	}
 | 
			
		||||
#define DEF_METHOD_4(_func, _type, _P1, _P2, _P3, _P4) \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4, const std::string &src) { \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigBit &sig1, const RTLIL::SigBit &sig2, const RTLIL::SigBit &sig3, const RTLIL::SigBit &sig4, const std::string &src) { \
 | 
			
		||||
		RTLIL::Cell *cell = addCell(name, _type);         \
 | 
			
		||||
		cell->setPort("\\" #_P1, sig1);                   \
 | 
			
		||||
		cell->setPort("\\" #_P2, sig2);                   \
 | 
			
		||||
| 
						 | 
				
			
			@ -1994,13 +1980,13 @@ DEF_METHOD(Pmux,     ID($pmux),       1)
 | 
			
		|||
		cell->set_src_attribute(src);                     \
 | 
			
		||||
		return cell;                                      \
 | 
			
		||||
	} \
 | 
			
		||||
	RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, const std::string &src) { \
 | 
			
		||||
	RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigBit &sig1, const RTLIL::SigBit &sig2, const RTLIL::SigBit &sig3, const std::string &src) { \
 | 
			
		||||
		RTLIL::SigBit sig4 = addWire(NEW_ID);             \
 | 
			
		||||
		add ## _func(name, sig1, sig2, sig3, sig4, src);  \
 | 
			
		||||
		return sig4;                                      \
 | 
			
		||||
	}
 | 
			
		||||
#define DEF_METHOD_5(_func, _type, _P1, _P2, _P3, _P4, _P5) \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4, RTLIL::SigBit sig5, const std::string &src) { \
 | 
			
		||||
	RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigBit &sig1, const RTLIL::SigBit &sig2, const RTLIL::SigBit &sig3, const RTLIL::SigBit &sig4, const RTLIL::SigBit &sig5, const std::string &src) { \
 | 
			
		||||
		RTLIL::Cell *cell = addCell(name, _type);         \
 | 
			
		||||
		cell->setPort("\\" #_P1, sig1);                   \
 | 
			
		||||
		cell->setPort("\\" #_P2, sig2);                   \
 | 
			
		||||
| 
						 | 
				
			
			@ -2010,7 +1996,7 @@ DEF_METHOD(Pmux,     ID($pmux),       1)
 | 
			
		|||
		cell->set_src_attribute(src);                     \
 | 
			
		||||
		return cell;                                      \
 | 
			
		||||
	} \
 | 
			
		||||
	RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4, const std::string &src) { \
 | 
			
		||||
	RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigBit &sig1, const RTLIL::SigBit &sig2, const RTLIL::SigBit &sig3, const RTLIL::SigBit &sig4, const std::string &src) { \
 | 
			
		||||
		RTLIL::SigBit sig5 = addWire(NEW_ID);                  \
 | 
			
		||||
		add ## _func(name, sig1, sig2, sig3, sig4, sig5, src); \
 | 
			
		||||
		return sig5;                                           \
 | 
			
		||||
| 
						 | 
				
			
			@ -2036,7 +2022,7 @@ DEF_METHOD_5(Oai4Gate,   ID($_OAI4_),   A, B, C, D, Y)
 | 
			
		|||
#undef DEF_METHOD_4
 | 
			
		||||
#undef DEF_METHOD_5
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addPow(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool a_signed, bool b_signed, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addPow(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool a_signed, bool b_signed, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($pow));
 | 
			
		||||
	cell->parameters[ID(A_SIGNED)] = a_signed;
 | 
			
		||||
| 
						 | 
				
			
			@ -2051,7 +2037,7 @@ RTLIL::Cell* RTLIL::Module::addPow(RTLIL::IdString name, RTLIL::SigSpec sig_a, R
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addSlice(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, RTLIL::Const offset, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addSlice(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, RTLIL::Const offset, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($slice));
 | 
			
		||||
	cell->parameters[ID(A_WIDTH)] = sig_a.size();
 | 
			
		||||
| 
						 | 
				
			
			@ -2063,7 +2049,7 @@ RTLIL::Cell* RTLIL::Module::addSlice(RTLIL::IdString name, RTLIL::SigSpec sig_a,
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addConcat(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addConcat(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($concat));
 | 
			
		||||
	cell->parameters[ID(A_WIDTH)] = sig_a.size();
 | 
			
		||||
| 
						 | 
				
			
			@ -2075,7 +2061,7 @@ RTLIL::Cell* RTLIL::Module::addConcat(RTLIL::IdString name, RTLIL::SigSpec sig_a
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addLut(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, RTLIL::Const lut, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addLut(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, RTLIL::Const lut, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($lut));
 | 
			
		||||
	cell->parameters[ID(LUT)] = lut;
 | 
			
		||||
| 
						 | 
				
			
			@ -2086,7 +2072,7 @@ RTLIL::Cell* RTLIL::Module::addLut(RTLIL::IdString name, RTLIL::SigSpec sig_a, R
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addTribuf(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_y, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addTribuf(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_y, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($tribuf));
 | 
			
		||||
	cell->parameters[ID(WIDTH)] = sig_a.size();
 | 
			
		||||
| 
						 | 
				
			
			@ -2097,7 +2083,7 @@ RTLIL::Cell* RTLIL::Module::addTribuf(RTLIL::IdString name, RTLIL::SigSpec sig_a
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addAssert(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addAssert(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($assert));
 | 
			
		||||
	cell->setPort(ID::A, sig_a);
 | 
			
		||||
| 
						 | 
				
			
			@ -2106,7 +2092,7 @@ RTLIL::Cell* RTLIL::Module::addAssert(RTLIL::IdString name, RTLIL::SigSpec sig_a
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addAssume(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addAssume(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($assume));
 | 
			
		||||
	cell->setPort(ID::A, sig_a);
 | 
			
		||||
| 
						 | 
				
			
			@ -2115,7 +2101,7 @@ RTLIL::Cell* RTLIL::Module::addAssume(RTLIL::IdString name, RTLIL::SigSpec sig_a
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addLive(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addLive(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($live));
 | 
			
		||||
	cell->setPort(ID::A, sig_a);
 | 
			
		||||
| 
						 | 
				
			
			@ -2124,7 +2110,7 @@ RTLIL::Cell* RTLIL::Module::addLive(RTLIL::IdString name, RTLIL::SigSpec sig_a,
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addFair(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addFair(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($fair));
 | 
			
		||||
	cell->setPort(ID::A, sig_a);
 | 
			
		||||
| 
						 | 
				
			
			@ -2133,7 +2119,7 @@ RTLIL::Cell* RTLIL::Module::addFair(RTLIL::IdString name, RTLIL::SigSpec sig_a,
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addCover(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addCover(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($cover));
 | 
			
		||||
	cell->setPort(ID::A, sig_a);
 | 
			
		||||
| 
						 | 
				
			
			@ -2142,7 +2128,7 @@ RTLIL::Cell* RTLIL::Module::addCover(RTLIL::IdString name, RTLIL::SigSpec sig_a,
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addEquiv(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addEquiv(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($equiv));
 | 
			
		||||
	cell->setPort(ID::A, sig_a);
 | 
			
		||||
| 
						 | 
				
			
			@ -2152,7 +2138,7 @@ RTLIL::Cell* RTLIL::Module::addEquiv(RTLIL::IdString name, RTLIL::SigSpec sig_a,
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addSr(RTLIL::IdString name, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, RTLIL::SigSpec sig_q, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addSr(RTLIL::IdString name, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr, const RTLIL::SigSpec &sig_q, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($sr));
 | 
			
		||||
	cell->parameters[ID(SET_POLARITY)] = set_polarity;
 | 
			
		||||
| 
						 | 
				
			
			@ -2165,7 +2151,7 @@ RTLIL::Cell* RTLIL::Module::addSr(RTLIL::IdString name, RTLIL::SigSpec sig_set,
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addFf(RTLIL::IdString name, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addFf(RTLIL::IdString name, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($ff));
 | 
			
		||||
	cell->parameters[ID(WIDTH)] = sig_q.size();
 | 
			
		||||
| 
						 | 
				
			
			@ -2175,7 +2161,7 @@ RTLIL::Cell* RTLIL::Module::addFf(RTLIL::IdString name, RTLIL::SigSpec sig_d, RT
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDff(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDff(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($dff));
 | 
			
		||||
	cell->parameters[ID(CLK_POLARITY)] = clk_polarity;
 | 
			
		||||
| 
						 | 
				
			
			@ -2187,7 +2173,7 @@ RTLIL::Cell* RTLIL::Module::addDff(RTLIL::IdString name, RTLIL::SigSpec sig_clk,
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffe(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity, bool en_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffe(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity, bool en_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($dffe));
 | 
			
		||||
	cell->parameters[ID(CLK_POLARITY)] = clk_polarity;
 | 
			
		||||
| 
						 | 
				
			
			@ -2201,8 +2187,8 @@ RTLIL::Cell* RTLIL::Module::addDffe(RTLIL::IdString name, RTLIL::SigSpec sig_clk
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffsr(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
 | 
			
		||||
		RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffsr(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
 | 
			
		||||
		RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($dffsr));
 | 
			
		||||
	cell->parameters[ID(CLK_POLARITY)] = clk_polarity;
 | 
			
		||||
| 
						 | 
				
			
			@ -2218,7 +2204,7 @@ RTLIL::Cell* RTLIL::Module::addDffsr(RTLIL::IdString name, RTLIL::SigSpec sig_cl
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addAdff(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q,
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addAdff(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
 | 
			
		||||
		RTLIL::Const arst_value, bool clk_polarity, bool arst_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($adff));
 | 
			
		||||
| 
						 | 
				
			
			@ -2234,7 +2220,7 @@ RTLIL::Cell* RTLIL::Module::addAdff(RTLIL::IdString name, RTLIL::SigSpec sig_clk
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDlatch(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDlatch(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($dlatch));
 | 
			
		||||
	cell->parameters[ID(EN_POLARITY)] = en_polarity;
 | 
			
		||||
| 
						 | 
				
			
			@ -2246,8 +2232,8 @@ RTLIL::Cell* RTLIL::Module::addDlatch(RTLIL::IdString name, RTLIL::SigSpec sig_e
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDlatchsr(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
 | 
			
		||||
		RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDlatchsr(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
 | 
			
		||||
		RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($dlatchsr));
 | 
			
		||||
	cell->parameters[ID(EN_POLARITY)] = en_polarity;
 | 
			
		||||
| 
						 | 
				
			
			@ -2263,7 +2249,7 @@ RTLIL::Cell* RTLIL::Module::addDlatchsr(RTLIL::IdString name, RTLIL::SigSpec sig
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addFfGate(RTLIL::IdString name, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addFfGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, ID($_FF_));
 | 
			
		||||
	cell->setPort(ID(D), sig_d);
 | 
			
		||||
| 
						 | 
				
			
			@ -2272,7 +2258,7 @@ RTLIL::Cell* RTLIL::Module::addFfGate(RTLIL::IdString name, RTLIL::SigSpec sig_d
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, stringf("$_DFF_%c_", clk_polarity ? 'P' : 'N'));
 | 
			
		||||
	cell->setPort(ID(C), sig_clk);
 | 
			
		||||
| 
						 | 
				
			
			@ -2282,7 +2268,7 @@ RTLIL::Cell* RTLIL::Module::addDffGate(RTLIL::IdString name, RTLIL::SigSpec sig_
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffeGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity, bool en_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffeGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity, bool en_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, stringf("$_DFFE_%c%c_", clk_polarity ? 'P' : 'N', en_polarity ? 'P' : 'N'));
 | 
			
		||||
	cell->setPort(ID(C), sig_clk);
 | 
			
		||||
| 
						 | 
				
			
			@ -2293,8 +2279,8 @@ RTLIL::Cell* RTLIL::Module::addDffeGate(RTLIL::IdString name, RTLIL::SigSpec sig
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffsrGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
 | 
			
		||||
		RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDffsrGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
 | 
			
		||||
		RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, stringf("$_DFFSR_%c%c%c_", clk_polarity ? 'P' : 'N', set_polarity ? 'P' : 'N', clr_polarity ? 'P' : 'N'));
 | 
			
		||||
	cell->setPort(ID(C), sig_clk);
 | 
			
		||||
| 
						 | 
				
			
			@ -2306,7 +2292,7 @@ RTLIL::Cell* RTLIL::Module::addDffsrGate(RTLIL::IdString name, RTLIL::SigSpec si
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addAdffGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q,
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addAdffGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
 | 
			
		||||
		bool arst_value, bool clk_polarity, bool arst_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, stringf("$_DFF_%c%c%c_", clk_polarity ? 'P' : 'N', arst_polarity ? 'P' : 'N', arst_value ? '1' : '0'));
 | 
			
		||||
| 
						 | 
				
			
			@ -2318,7 +2304,7 @@ RTLIL::Cell* RTLIL::Module::addAdffGate(RTLIL::IdString name, RTLIL::SigSpec sig
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDlatchGate(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDlatchGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, stringf("$_DLATCH_%c_", en_polarity ? 'P' : 'N'));
 | 
			
		||||
	cell->setPort(ID(E), sig_en);
 | 
			
		||||
| 
						 | 
				
			
			@ -2328,8 +2314,8 @@ RTLIL::Cell* RTLIL::Module::addDlatchGate(RTLIL::IdString name, RTLIL::SigSpec s
 | 
			
		|||
	return cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDlatchsrGate(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
 | 
			
		||||
		RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
RTLIL::Cell* RTLIL::Module::addDlatchsrGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
 | 
			
		||||
		RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
 | 
			
		||||
{
 | 
			
		||||
	RTLIL::Cell *cell = addCell(name, stringf("$_DLATCHSR_%c%c%c_", en_polarity ? 'P' : 'N', set_polarity ? 'P' : 'N', clr_polarity ? 'P' : 'N'));
 | 
			
		||||
	cell->setPort(ID(E), sig_en);
 | 
			
		||||
| 
						 | 
				
			
			@ -2495,7 +2481,7 @@ void RTLIL::Cell::unsetPort(RTLIL::IdString portname)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTLIL::Cell::setPort(RTLIL::IdString portname, RTLIL::SigSpec signal)
 | 
			
		||||
void RTLIL::Cell::setPort(RTLIL::IdString portname, const RTLIL::SigSpec &signal)
 | 
			
		||||
{
 | 
			
		||||
	auto r = connections_.insert(portname);
 | 
			
		||||
	auto conn_it = r.first;
 | 
			
		||||
| 
						 | 
				
			
			@ -2570,7 +2556,7 @@ void RTLIL::Cell::unsetParam(RTLIL::IdString paramname)
 | 
			
		|||
	parameters.erase(paramname);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RTLIL::Cell::setParam(RTLIL::IdString paramname, RTLIL::Const value)
 | 
			
		||||
void RTLIL::Cell::setParam(RTLIL::IdString paramname, const RTLIL::Const &value)
 | 
			
		||||
{
 | 
			
		||||
	parameters[paramname] = value;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2710,7 +2696,7 @@ RTLIL::SigChunk::SigChunk(RTLIL::State bit, int width)
 | 
			
		|||
	offset = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::SigChunk::SigChunk(RTLIL::SigBit bit)
 | 
			
		||||
RTLIL::SigChunk::SigChunk(const RTLIL::SigBit &bit)
 | 
			
		||||
{
 | 
			
		||||
	wire = bit.wire;
 | 
			
		||||
	offset = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -2721,7 +2707,7 @@ RTLIL::SigChunk::SigChunk(RTLIL::SigBit bit)
 | 
			
		|||
	width = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RTLIL::SigChunk::SigChunk(const RTLIL::SigChunk &sigchunk) : data(sigchunk.data)
 | 
			
		||||
RTLIL::SigChunk::SigChunk(const RTLIL::SigChunk &sigchunk)
 | 
			
		||||
{
 | 
			
		||||
	wire = sigchunk.wire;
 | 
			
		||||
	data = sigchunk.data;
 | 
			
		||||
| 
						 | 
				
			
			@ -3518,7 +3504,7 @@ void RTLIL::SigSpec::check() const
 | 
			
		|||
 | 
			
		||||
		int w = 0;
 | 
			
		||||
		for (size_t i = 0; i < chunks_.size(); i++) {
 | 
			
		||||
			const RTLIL::SigChunk chunk = chunks_[i];
 | 
			
		||||
			const RTLIL::SigChunk &chunk = chunks_[i];
 | 
			
		||||
			if (chunk.wire == NULL) {
 | 
			
		||||
				if (i > 0)
 | 
			
		||||
					log_assert(chunks_[i-1].wire != NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -3757,11 +3743,11 @@ std::string RTLIL::SigSpec::as_string() const
 | 
			
		|||
 | 
			
		||||
	pack();
 | 
			
		||||
	std::string str;
 | 
			
		||||
	str.reserve(size());
 | 
			
		||||
	for (size_t i = chunks_.size(); i > 0; i--) {
 | 
			
		||||
		const RTLIL::SigChunk &chunk = chunks_[i-1];
 | 
			
		||||
		if (chunk.wire != NULL)
 | 
			
		||||
			for (int j = 0; j < chunk.width; j++)
 | 
			
		||||
				str += "?";
 | 
			
		||||
			str.append(chunk.width, '?');
 | 
			
		||||
		else
 | 
			
		||||
			str += RTLIL::Const(chunk.data).as_string();
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -3808,24 +3794,30 @@ RTLIL::SigBit RTLIL::SigSpec::as_bit() const
 | 
			
		|||
		return bits_[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RTLIL::SigSpec::match(std::string pattern) const
 | 
			
		||||
bool RTLIL::SigSpec::match(const char* pattern) const
 | 
			
		||||
{
 | 
			
		||||
	cover("kernel.rtlil.sigspec.match");
 | 
			
		||||
 | 
			
		||||
	pack();
 | 
			
		||||
	std::string str = as_string();
 | 
			
		||||
	log_assert(pattern.size() == str.size());
 | 
			
		||||
	unpack();
 | 
			
		||||
	log_assert(int(strlen(pattern)) == GetSize(bits_));
 | 
			
		||||
 | 
			
		||||
	for (size_t i = 0; i < pattern.size(); i++) {
 | 
			
		||||
		if (pattern[i] == ' ')
 | 
			
		||||
	for (auto it = bits_.rbegin(); it != bits_.rend(); it++, pattern++) {
 | 
			
		||||
		if (*pattern == ' ')
 | 
			
		||||
			continue;
 | 
			
		||||
		if (pattern[i] == '*') {
 | 
			
		||||
			if (str[i] != 'z' && str[i] != 'x')
 | 
			
		||||
		if (*pattern == '*') {
 | 
			
		||||
			if (*it != State::Sz && *it != State::Sx)
 | 
			
		||||
				return false;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		if (pattern[i] != str[i])
 | 
			
		||||
			return false;
 | 
			
		||||
		if (*pattern == '0') {
 | 
			
		||||
			if (*it != State::S0)
 | 
			
		||||
				return false;
 | 
			
		||||
		} else
 | 
			
		||||
		if (*pattern == '1') {
 | 
			
		||||
			if (*it != State::S1)
 | 
			
		||||
				return false;
 | 
			
		||||
		} else
 | 
			
		||||
			log_abort();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -3849,6 +3841,7 @@ pool<RTLIL::SigBit> RTLIL::SigSpec::to_sigbit_pool() const
 | 
			
		|||
 | 
			
		||||
	pack();
 | 
			
		||||
	pool<RTLIL::SigBit> sigbits;
 | 
			
		||||
	sigbits.reserve(size());
 | 
			
		||||
	for (auto &c : chunks_)
 | 
			
		||||
		for (int i = 0; i < c.width; i++)
 | 
			
		||||
			sigbits.insert(RTLIL::SigBit(c, i));
 | 
			
		||||
| 
						 | 
				
			
			@ -3889,6 +3882,7 @@ dict<RTLIL::SigBit, RTLIL::SigBit> RTLIL::SigSpec::to_sigbit_dict(const RTLIL::S
 | 
			
		|||
	log_assert(width_ == other.width_);
 | 
			
		||||
 | 
			
		||||
	dict<RTLIL::SigBit, RTLIL::SigBit> new_map;
 | 
			
		||||
	new_map.reserve(size());
 | 
			
		||||
	for (int i = 0; i < width_; i++)
 | 
			
		||||
		new_map[bits_[i]] = other.bits_[i];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										322
									
								
								kernel/rtlil.h
									
										
									
									
									
								
							
							
						
						
									
										322
									
								
								kernel/rtlil.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -379,13 +379,13 @@ namespace RTLIL
 | 
			
		|||
 | 
			
		||||
	extern dict<std::string, std::string> constpad;
 | 
			
		||||
 | 
			
		||||
	static inline std::string escape_id(std::string str) {
 | 
			
		||||
	static inline std::string escape_id(const std::string &str) {
 | 
			
		||||
		if (str.size() > 0 && str[0] != '\\' && str[0] != '$')
 | 
			
		||||
			return "\\" + str;
 | 
			
		||||
		return str;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static inline std::string unescape_id(std::string str) {
 | 
			
		||||
	static inline std::string unescape_id(const std::string &str) {
 | 
			
		||||
		if (str.size() < 2)
 | 
			
		||||
			return str;
 | 
			
		||||
		if (str[0] != '\\')
 | 
			
		||||
| 
						 | 
				
			
			@ -401,7 +401,7 @@ namespace RTLIL
 | 
			
		|||
		return unescape_id(str.str());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static inline const char *id2cstr(const RTLIL::IdString &str) {
 | 
			
		||||
	static inline const char *id2cstr(RTLIL::IdString str) {
 | 
			
		||||
		return log_id(str);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -606,7 +606,7 @@ struct RTLIL::Const
 | 
			
		|||
	bool as_bool() const;
 | 
			
		||||
	int as_int(bool is_signed = false) const;
 | 
			
		||||
	std::string as_string() const;
 | 
			
		||||
	static Const from_string(std::string str);
 | 
			
		||||
	static Const from_string(const std::string &str);
 | 
			
		||||
 | 
			
		||||
	std::string decode_string() const;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -678,7 +678,7 @@ struct RTLIL::SigChunk
 | 
			
		|||
	SigChunk(const std::string &str);
 | 
			
		||||
	SigChunk(int val, int width = 32);
 | 
			
		||||
	SigChunk(RTLIL::State bit, int width = 1);
 | 
			
		||||
	SigChunk(RTLIL::SigBit bit);
 | 
			
		||||
	SigChunk(const RTLIL::SigBit &bit);
 | 
			
		||||
	SigChunk(const RTLIL::SigChunk &sigchunk);
 | 
			
		||||
	RTLIL::SigChunk &operator =(const RTLIL::SigChunk &other) = default;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -775,11 +775,11 @@ public:
 | 
			
		|||
	SigSpec(const std::string &str);
 | 
			
		||||
	SigSpec(int val, int width = 32);
 | 
			
		||||
	SigSpec(RTLIL::State bit, int width = 1);
 | 
			
		||||
	SigSpec(const RTLIL::SigBit& bit, int width = 1);
 | 
			
		||||
	SigSpec(const std::vector<RTLIL::SigChunk>& chunks);
 | 
			
		||||
	SigSpec(const std::vector<RTLIL::SigBit>& bits);
 | 
			
		||||
	SigSpec(const pool<RTLIL::SigBit>& bits);
 | 
			
		||||
	SigSpec(const std::set<RTLIL::SigBit>& bits);
 | 
			
		||||
	SigSpec(const RTLIL::SigBit &bit, int width = 1);
 | 
			
		||||
	SigSpec(const std::vector<RTLIL::SigChunk> &chunks);
 | 
			
		||||
	SigSpec(const std::vector<RTLIL::SigBit> &bits);
 | 
			
		||||
	SigSpec(const pool<RTLIL::SigBit> &bits);
 | 
			
		||||
	SigSpec(const std::set<RTLIL::SigBit> &bits);
 | 
			
		||||
	SigSpec(bool bit);
 | 
			
		||||
 | 
			
		||||
	SigSpec(RTLIL::SigSpec &&other) {
 | 
			
		||||
| 
						 | 
				
			
			@ -887,7 +887,7 @@ public:
 | 
			
		|||
	RTLIL::SigChunk as_chunk() const;
 | 
			
		||||
	RTLIL::SigBit as_bit() const;
 | 
			
		||||
 | 
			
		||||
	bool match(std::string pattern) const;
 | 
			
		||||
	bool match(const char* pattern) const;
 | 
			
		||||
 | 
			
		||||
	std::set<RTLIL::SigBit> to_sigbit_set() const;
 | 
			
		||||
	pool<RTLIL::SigBit> to_sigbit_pool() const;
 | 
			
		||||
| 
						 | 
				
			
			@ -901,7 +901,7 @@ public:
 | 
			
		|||
 | 
			
		||||
	operator std::vector<RTLIL::SigChunk>() const { return chunks(); }
 | 
			
		||||
	operator std::vector<RTLIL::SigBit>() const { return bits(); }
 | 
			
		||||
	RTLIL::SigBit at(int offset, const RTLIL::SigBit &defval) { return offset < width_ ? (*this)[offset] : defval; }
 | 
			
		||||
	const RTLIL::SigBit &at(int offset, const RTLIL::SigBit &defval) { return offset < width_ ? (*this)[offset] : defval; }
 | 
			
		||||
 | 
			
		||||
	unsigned int hash() const { if (!hash_) updhash(); return hash_; };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -956,7 +956,7 @@ struct RTLIL::Monitor
 | 
			
		|||
	virtual ~Monitor() { }
 | 
			
		||||
	virtual void notify_module_add(RTLIL::Module*) { }
 | 
			
		||||
	virtual void notify_module_del(RTLIL::Module*) { }
 | 
			
		||||
	virtual void notify_connect(RTLIL::Cell*, const RTLIL::IdString&, const RTLIL::SigSpec&, RTLIL::SigSpec&) { }
 | 
			
		||||
	virtual void notify_connect(RTLIL::Cell*, const RTLIL::IdString&, const RTLIL::SigSpec&, const RTLIL::SigSpec&) { }
 | 
			
		||||
	virtual void notify_connect(RTLIL::Module*, const RTLIL::SigSig&) { }
 | 
			
		||||
	virtual void notify_connect(RTLIL::Module*, const std::vector<RTLIL::SigSig>&) { }
 | 
			
		||||
	virtual void notify_blackout(RTLIL::Module*) { }
 | 
			
		||||
| 
						 | 
				
			
			@ -995,15 +995,15 @@ struct RTLIL::Design
 | 
			
		|||
	void remove(RTLIL::Module *module);
 | 
			
		||||
	void rename(RTLIL::Module *module, RTLIL::IdString new_name);
 | 
			
		||||
 | 
			
		||||
	void scratchpad_unset(std::string varname);
 | 
			
		||||
	void scratchpad_unset(const std::string &varname);
 | 
			
		||||
 | 
			
		||||
	void scratchpad_set_int(std::string varname, int value);
 | 
			
		||||
	void scratchpad_set_bool(std::string varname, bool value);
 | 
			
		||||
	void scratchpad_set_string(std::string varname, std::string value);
 | 
			
		||||
	void scratchpad_set_int(const std::string &varname, int value);
 | 
			
		||||
	void scratchpad_set_bool(const std::string &varname, bool value);
 | 
			
		||||
	void scratchpad_set_string(const std::string &varname, const std::string &value);
 | 
			
		||||
 | 
			
		||||
	int scratchpad_get_int(std::string varname, int default_value = 0) const;
 | 
			
		||||
	bool scratchpad_get_bool(std::string varname, bool default_value = false) const;
 | 
			
		||||
	std::string scratchpad_get_string(std::string varname, std::string default_value = std::string()) const;
 | 
			
		||||
	int scratchpad_get_int(const std::string &varname, int default_value = 0) const;
 | 
			
		||||
	bool scratchpad_get_bool(const std::string &varname, bool default_value = false) const;
 | 
			
		||||
	std::string scratchpad_get_string(const std::string &varname, const std::string &default_value = std::string()) const;
 | 
			
		||||
 | 
			
		||||
	void sort();
 | 
			
		||||
	void check();
 | 
			
		||||
| 
						 | 
				
			
			@ -1079,10 +1079,10 @@ public:
 | 
			
		|||
 | 
			
		||||
	Module();
 | 
			
		||||
	virtual ~Module();
 | 
			
		||||
	virtual RTLIL::IdString derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, bool mayfail = false);
 | 
			
		||||
	virtual RTLIL::IdString derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, dict<RTLIL::IdString, RTLIL::Module*> interfaces, dict<RTLIL::IdString, RTLIL::IdString> modports, bool mayfail = false);
 | 
			
		||||
	virtual RTLIL::IdString derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> ¶meters, bool mayfail = false);
 | 
			
		||||
	virtual RTLIL::IdString derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> ¶meters, const dict<RTLIL::IdString, RTLIL::Module*> &interfaces, const dict<RTLIL::IdString, RTLIL::IdString> &modports, bool mayfail = false);
 | 
			
		||||
	virtual size_t count_id(RTLIL::IdString id);
 | 
			
		||||
	virtual void reprocess_module(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Module *> local_interfaces);
 | 
			
		||||
	virtual void reprocess_module(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Module *> &local_interfaces);
 | 
			
		||||
 | 
			
		||||
	virtual void sort();
 | 
			
		||||
	virtual void check();
 | 
			
		||||
| 
						 | 
				
			
			@ -1143,166 +1143,166 @@ public:
 | 
			
		|||
 | 
			
		||||
	// The add* methods create a cell and return the created cell. All signals must exist in advance.
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addNot (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addPos (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNeg (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNot (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addPos (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNeg (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addAnd  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOr   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addXor  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addXnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAnd  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOr   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addXor  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addXnor (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addReduceAnd  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addReduceOr   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addReduceXor  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addReduceXnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addReduceBool (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addReduceAnd  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addReduceOr   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addReduceXor  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addReduceXnor (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addReduceBool (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addShl    (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addShr    (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addSshl   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addSshr   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addShift  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addShiftx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addShl    (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addShr    (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addSshl   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addSshr   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addShift  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addShiftx (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addLt  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLe  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addEq  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNe  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addEqx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNex (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addGe  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addGt  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLt  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLe  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addEq  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNe  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addEqx (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNex (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addGe  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addGt  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addAdd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addSub (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addMul (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDiv (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addMod (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addPow (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool a_signed = false, bool b_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAdd (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addSub (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addMul (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDiv (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addMod (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addPow (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool a_signed = false, bool b_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addLogicNot (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLogicAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLogicOr  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLogicNot (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLogicAnd (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLogicOr  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addMux  (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* addPmux (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* addMux  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_s, const RTLIL::SigSpec &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addPmux (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_s, const RTLIL::SigSpec &sig_y, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addSlice  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, RTLIL::Const offset, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addConcat (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLut    (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, RTLIL::Const lut, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addTribuf (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAssert (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAssume (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLive   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addFair   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addCover  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addEquiv  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addSlice  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, RTLIL::Const offset, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addConcat (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLut    (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_y, RTLIL::Const lut, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addTribuf (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAssert (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAssume (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addLive   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addFair   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addCover  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_en, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addEquiv  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addSr    (RTLIL::IdString name, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, RTLIL::SigSpec sig_q, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addFf    (RTLIL::IdString name, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDff   (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d,   RTLIL::SigSpec sig_q, bool clk_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffe  (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en,  RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool en_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffsr (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
 | 
			
		||||
			RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAdff (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q,
 | 
			
		||||
	RTLIL::Cell* addSr    (RTLIL::IdString name, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr, const RTLIL::SigSpec &sig_q, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addFf    (RTLIL::IdString name, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDff   (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_d,   const RTLIL::SigSpec &sig_q, bool clk_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffe  (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en,  const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool en_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffsr (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
 | 
			
		||||
			RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAdff (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
 | 
			
		||||
			RTLIL::Const arst_value, bool clk_polarity = true, bool arst_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDlatch (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDlatchsr (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
 | 
			
		||||
			RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDlatch (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDlatchsr (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
 | 
			
		||||
			RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addBufGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNotGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAndGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNandGate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOrGate     (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNorGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addXorGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addXnorGate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAndnotGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOrnotGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addMuxGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNmuxGate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAoi3Gate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOai3Gate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAoi4Gate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOai4Gate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addBufGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNotGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAndGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNandGate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOrGate     (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNorGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addXorGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addXnorGate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAndnotGate (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOrnotGate  (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addMuxGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_s, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addNmuxGate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_s, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAoi3Gate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOai3Gate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAoi4Gate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_d, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addOai4Gate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_d, const RTLIL::SigBit &sig_y, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::Cell* addFfGate     (RTLIL::IdString name, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffGate    (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffeGate   (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool en_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffsrGate  (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
 | 
			
		||||
			RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAdffGate   (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q,
 | 
			
		||||
	RTLIL::Cell* addFfGate     (RTLIL::IdString name, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffGate    (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffeGate   (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool en_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDffsrGate  (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
 | 
			
		||||
			RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addAdffGate   (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
 | 
			
		||||
			bool arst_value = false, bool clk_polarity = true, bool arst_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDlatchGate (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDlatchsrGate  (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
 | 
			
		||||
			RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDlatchGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, const std::string &src = "");
 | 
			
		||||
	RTLIL::Cell* addDlatchsrGate  (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
 | 
			
		||||
			RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	// The methods without the add* prefix create a cell and an output signal. They return the newly created output signal.
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigSpec Not (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Pos (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Bu0 (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Neg (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Not (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Pos (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Bu0 (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Neg (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigSpec And  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Or   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Xor  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Xnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec And  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Or   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Xor  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Xnor (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigSpec ReduceAnd  (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec ReduceOr   (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec ReduceXor  (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec ReduceXnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec ReduceBool (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec ReduceAnd  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec ReduceOr   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec ReduceXor  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec ReduceXnor (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec ReduceBool (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigSpec Shl    (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Shr    (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Sshl   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Sshr   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Shift  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Shiftx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Shl    (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Shr    (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Sshl   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Sshr   (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Shift  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Shiftx (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigSpec Lt  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Le  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Eq  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Ne  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Eqx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Nex (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Ge  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Gt  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Lt  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Le  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Eq  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Ne  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Eqx (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Nex (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Ge  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Gt  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigSpec Add (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Sub (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Mul (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Div (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Mod (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Pow (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool a_signed = false, bool b_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Add (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Sub (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Mul (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Div (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Mod (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Pow (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool a_signed = false, bool b_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigSpec LogicNot (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec LogicAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec LogicOr  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec LogicNot (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec LogicAnd (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec LogicOr  (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed = false, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigSpec Mux      (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Pmux     (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Mux      (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_s, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Pmux     (RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_s, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigBit BufGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit NotGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit AndGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit NandGate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit OrGate     (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit NorGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit XorGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit XnorGate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit AndnotGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit OrnotGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit MuxGate    (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit NmuxGate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit Aoi3Gate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit Oai3Gate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit Aoi4Gate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit Oai4Gate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit BufGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit NotGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit AndGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit NandGate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit OrGate     (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit NorGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit XorGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit XnorGate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit AndnotGate (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit OrnotGate  (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit MuxGate    (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_s, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit NmuxGate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_s, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit Aoi3Gate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit Oai3Gate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit Aoi4Gate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_d, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigBit Oai4Gate   (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_d, const std::string &src = "");
 | 
			
		||||
 | 
			
		||||
	RTLIL::SigSpec Anyconst  (RTLIL::IdString name, int width = 1, const std::string &src = "");
 | 
			
		||||
	RTLIL::SigSpec Anyseq    (RTLIL::IdString name, int width = 1, const std::string &src = "");
 | 
			
		||||
| 
						 | 
				
			
			@ -1381,7 +1381,7 @@ public:
 | 
			
		|||
	// access cell ports
 | 
			
		||||
	bool hasPort(RTLIL::IdString portname) const;
 | 
			
		||||
	void unsetPort(RTLIL::IdString portname);
 | 
			
		||||
	void setPort(RTLIL::IdString portname, RTLIL::SigSpec signal);
 | 
			
		||||
	void setPort(RTLIL::IdString portname, const RTLIL::SigSpec &signal);
 | 
			
		||||
	const RTLIL::SigSpec &getPort(RTLIL::IdString portname) const;
 | 
			
		||||
	const dict<RTLIL::IdString, RTLIL::SigSpec> &connections() const;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1393,7 +1393,7 @@ public:
 | 
			
		|||
	// access cell parameters
 | 
			
		||||
	bool hasParam(RTLIL::IdString paramname) const;
 | 
			
		||||
	void unsetParam(RTLIL::IdString paramname);
 | 
			
		||||
	void setParam(RTLIL::IdString paramname, RTLIL::Const value);
 | 
			
		||||
	void setParam(RTLIL::IdString paramname, const RTLIL::Const& value);
 | 
			
		||||
	const RTLIL::Const &getParam(RTLIL::IdString paramname) const;
 | 
			
		||||
 | 
			
		||||
	void sort();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ struct TraceMonitor : public RTLIL::Monitor
 | 
			
		|||
		log("#TRACE# Module delete: %s\n", log_id(module));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void notify_connect(RTLIL::Cell *cell, const RTLIL::IdString &port, const RTLIL::SigSpec &old_sig, RTLIL::SigSpec &sig) YS_OVERRIDE
 | 
			
		||||
	void notify_connect(RTLIL::Cell *cell, const RTLIL::IdString &port, const RTLIL::SigSpec &old_sig, const RTLIL::SigSpec &sig) YS_OVERRIDE
 | 
			
		||||
	{
 | 
			
		||||
		log("#TRACE# Cell connect: %s.%s.%s = %s (was: %s)\n", log_id(cell->module), log_id(cell), log_id(port), log_signal(sig), log_signal(old_sig));
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue