mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Merge remote-tracking branch 'origin' into xc7srl
This commit is contained in:
		
						commit
						13ad19482f
					
				
					 15 changed files with 192 additions and 103 deletions
				
			
		
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -111,7 +111,7 @@ OBJS = kernel/version_$(GIT_REV).o | ||||||
| # is just a symlink to your actual ABC working directory, as 'make mrproper'
 | # is just a symlink to your actual ABC working directory, as 'make mrproper'
 | ||||||
| # will remove the 'abc' directory and you do not want to accidentally
 | # will remove the 'abc' directory and you do not want to accidentally
 | ||||||
| # delete your work on ABC..
 | # delete your work on ABC..
 | ||||||
| ABCREV = 2ddc57d | ABCREV = 3709744 | ||||||
| ABCPULL = 1 | ABCPULL = 1 | ||||||
| ABCURL ?= https://github.com/berkeley-abc/abc | ABCURL ?= https://github.com/berkeley-abc/abc | ||||||
| ABCMKARGS = CC="$(CXX)" CXX="$(CXX)" ABC_USE_LIBSTDCXX=1 | ABCMKARGS = CC="$(CXX)" CXX="$(CXX)" ABC_USE_LIBSTDCXX=1 | ||||||
|  |  | ||||||
|  | @ -312,10 +312,10 @@ Verilog Attributes and non-standard features | ||||||
|   passes to identify input and output ports of cells. The Verilog backend |   passes to identify input and output ports of cells. The Verilog backend | ||||||
|   also does not output blackbox modules on default. |   also does not output blackbox modules on default. | ||||||
| 
 | 
 | ||||||
| - The ``dynports'' attribute is used by the Verilog front-end to mark modules | - The ``dynports`` attribute is used by the Verilog front-end to mark modules | ||||||
|   that have ports with a width that depends on a parameter. |   that have ports with a width that depends on a parameter. | ||||||
| 
 | 
 | ||||||
| - The ``hdlname'' attribute is used by some passes to document the original | - The ``hdlname`` attribute is used by some passes to document the original | ||||||
|   (HDL) name of a module when renaming a module. |   (HDL) name of a module when renaming a module. | ||||||
| 
 | 
 | ||||||
| - The ``keep`` attribute on cells and wires is used to mark objects that should | - The ``keep`` attribute on cells and wires is used to mark objects that should | ||||||
|  |  | ||||||
|  | @ -340,7 +340,7 @@ struct BtorWorker | ||||||
| 			if (cell->type == "$lt") btor_op = "lt"; | 			if (cell->type == "$lt") btor_op = "lt"; | ||||||
| 			if (cell->type == "$le") btor_op = "lte"; | 			if (cell->type == "$le") btor_op = "lte"; | ||||||
| 			if (cell->type.in("$eq", "$eqx")) btor_op = "eq"; | 			if (cell->type.in("$eq", "$eqx")) btor_op = "eq"; | ||||||
| 			if (cell->type.in("$ne", "$nex")) btor_op = "ne"; | 			if (cell->type.in("$ne", "$nex")) btor_op = "neq"; | ||||||
| 			if (cell->type == "$ge") btor_op = "gte"; | 			if (cell->type == "$ge") btor_op = "gte"; | ||||||
| 			if (cell->type == "$gt") btor_op = "gt"; | 			if (cell->type == "$gt") btor_op = "gt"; | ||||||
| 			log_assert(!btor_op.empty()); | 			log_assert(!btor_op.empty()); | ||||||
|  |  | ||||||
|  | @ -237,15 +237,34 @@ struct ShowWorker | ||||||
| 			int idx = single_idx_count++; | 			int idx = single_idx_count++; | ||||||
| 			for (int rep, i = int(sig.chunks().size())-1; i >= 0; i -= rep) { | 			for (int rep, i = int(sig.chunks().size())-1; i >= 0; i -= rep) { | ||||||
| 				const RTLIL::SigChunk &c = sig.chunks().at(i); | 				const RTLIL::SigChunk &c = sig.chunks().at(i); | ||||||
| 				net = gen_signode_simple(c, false); | 				if (!driver && c.wire == nullptr) { | ||||||
| 				log_assert(!net.empty()); | 					RTLIL::State s1 = c.data.front(); | ||||||
|  | 					for (auto s2 : c.data) | ||||||
|  | 						if (s1 != s2) | ||||||
|  | 							goto not_const_stream; | ||||||
|  | 					net.clear(); | ||||||
|  | 				} else { | ||||||
|  | 			not_const_stream: | ||||||
|  | 					net = gen_signode_simple(c, false); | ||||||
|  | 					log_assert(!net.empty()); | ||||||
|  | 				} | ||||||
| 				for (rep = 1; i-rep >= 0 && c == sig.chunks().at(i-rep); rep++) {} | 				for (rep = 1; i-rep >= 0 && c == sig.chunks().at(i-rep); rep++) {} | ||||||
| 				std::string repinfo = rep > 1 ? stringf("%dx ", rep) : ""; | 				std::string repinfo = rep > 1 ? stringf("%dx ", rep) : ""; | ||||||
| 				if (driver) { | 				if (driver) { | ||||||
|  | 					log_assert(!net.empty()); | ||||||
| 					label_string += stringf("<s%d> %d:%d - %s%d:%d |", i, pos, pos-c.width+1, repinfo.c_str(), c.offset+c.width-1, c.offset); | 					label_string += stringf("<s%d> %d:%d - %s%d:%d |", i, pos, pos-c.width+1, repinfo.c_str(), c.offset+c.width-1, c.offset); | ||||||
| 					net_conn_map[net].in.insert(stringf("x%d:s%d", idx, i)); | 					net_conn_map[net].in.insert(stringf("x%d:s%d", idx, i)); | ||||||
| 					net_conn_map[net].bits = rep*c.width; | 					net_conn_map[net].bits = rep*c.width; | ||||||
| 					net_conn_map[net].color = nextColor(c, net_conn_map[net].color); | 					net_conn_map[net].color = nextColor(c, net_conn_map[net].color); | ||||||
|  | 				} else | ||||||
|  | 				if (net.empty()) { | ||||||
|  | 					log_assert(rep == 1); | ||||||
|  | 					label_string += stringf("%c -> %d:%d |", | ||||||
|  | 							c.data.front() == State::S0 ? '0' : | ||||||
|  | 							c.data.front() == State::S1 ? '1' : | ||||||
|  | 							c.data.front() == State::Sx ? 'X' : | ||||||
|  | 							c.data.front() == State::Sz ? 'Z' : '?', | ||||||
|  | 							pos, pos-rep*c.width+1); | ||||||
| 				} else { | 				} else { | ||||||
| 					label_string += stringf("<s%d> %s%d:%d - %d:%d |", i, repinfo.c_str(), c.offset+c.width-1, c.offset, pos, pos-rep*c.width+1); | 					label_string += stringf("<s%d> %s%d:%d - %d:%d |", i, repinfo.c_str(), c.offset+c.width-1, c.offset, pos, pos-rep*c.width+1); | ||||||
| 					net_conn_map[net].out.insert(stringf("x%d:s%d", idx, i)); | 					net_conn_map[net].out.insert(stringf("x%d:s%d", idx, i)); | ||||||
|  |  | ||||||
|  | @ -744,7 +744,8 @@ grow_read_ports:; | ||||||
| 			if (clken) { | 			if (clken) { | ||||||
| 				clock_domains[pi.clocks] = clkdom; | 				clock_domains[pi.clocks] = clkdom; | ||||||
| 				clock_polarities[pi.clkpol] = clkdom.second; | 				clock_polarities[pi.clkpol] = clkdom.second; | ||||||
| 				read_transp[pi.transp] = transp; | 				if (!pi.make_transp) | ||||||
|  | 					read_transp[pi.transp] = transp; | ||||||
| 				pi.sig_clock = clkdom.first; | 				pi.sig_clock = clkdom.first; | ||||||
| 				pi.sig_en = rd_en[cell_port_i]; | 				pi.sig_en = rd_en[cell_port_i]; | ||||||
| 				pi.effective_clkpol = clkdom.second; | 				pi.effective_clkpol = clkdom.second; | ||||||
|  |  | ||||||
|  | @ -83,8 +83,8 @@ They are declared like state variables, just using the `udata` statement: | ||||||
|     udata <int> min_data_width max_data_width |     udata <int> min_data_width max_data_width | ||||||
|     udata <IdString> data_port_name |     udata <IdString> data_port_name | ||||||
| 
 | 
 | ||||||
| They are atomatically initialzed to the default constructed value of their type | They are automatically initialized to the default constructed value of their type | ||||||
| when ther pattern matcher object is constructed. | when the pattern matcher object is constructed. | ||||||
| 
 | 
 | ||||||
| Embedded C++ code | Embedded C++ code | ||||||
| ----------------- | ----------------- | ||||||
|  | @ -158,7 +158,7 @@ Finally, `filter <expression>` narrows down the remaining list of cells. For | ||||||
| performance reasons `filter` statements should only be used for things that | performance reasons `filter` statements should only be used for things that | ||||||
| can't be done using `select` and `index`. | can't be done using `select` and `index`. | ||||||
| 
 | 
 | ||||||
| The `optional` statement marks optional matches. I.e. the matcher will also | The `optional` statement marks optional matches. That is, the matcher will also | ||||||
| explore the case where `mul` is set to `nullptr`. Without the `optional` | explore the case where `mul` is set to `nullptr`. Without the `optional` | ||||||
| statement a match may only be assigned nullptr when one of the `if` expressions | statement a match may only be assigned nullptr when one of the `if` expressions | ||||||
| evaluates to `false`. | evaluates to `false`. | ||||||
|  |  | ||||||
|  | @ -108,6 +108,7 @@ struct SigSnippets | ||||||
| 
 | 
 | ||||||
| struct SnippetSwCache | struct SnippetSwCache | ||||||
| { | { | ||||||
|  | 	dict<RTLIL::SwitchRule*, pool<RTLIL::SigBit>, hash_ptr_ops> full_case_bits_cache; | ||||||
| 	dict<RTLIL::SwitchRule*, pool<int>, hash_ptr_ops> cache; | 	dict<RTLIL::SwitchRule*, pool<int>, hash_ptr_ops> cache; | ||||||
| 	const SigSnippets *snippets; | 	const SigSnippets *snippets; | ||||||
| 	int current_snippet; | 	int current_snippet; | ||||||
|  | @ -268,6 +269,49 @@ void append_pmux(RTLIL::Module *mod, const RTLIL::SigSpec &signal, const std::ve | ||||||
| 	last_mux_cell->parameters["\\S_WIDTH"] = last_mux_cell->getPort("\\S").size(); | 	last_mux_cell->parameters["\\S_WIDTH"] = last_mux_cell->getPort("\\S").size(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const pool<SigBit> &get_full_case_bits(SnippetSwCache &swcache, RTLIL::SwitchRule *sw) | ||||||
|  | { | ||||||
|  | 	if (!swcache.full_case_bits_cache.count(sw)) | ||||||
|  | 	{ | ||||||
|  | 		pool<SigBit> bits; | ||||||
|  | 
 | ||||||
|  | 		if (sw->get_bool_attribute("\\full_case")) | ||||||
|  | 		{ | ||||||
|  | 			bool first_case = true; | ||||||
|  | 
 | ||||||
|  | 			for (auto cs : sw->cases) | ||||||
|  | 			{ | ||||||
|  | 				pool<SigBit> case_bits; | ||||||
|  | 
 | ||||||
|  | 				for (auto it : cs->actions) { | ||||||
|  | 					for (auto bit : it.first) | ||||||
|  | 						case_bits.insert(bit); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				for (auto it : cs->switches) { | ||||||
|  | 					for (auto bit : get_full_case_bits(swcache, it)) | ||||||
|  | 						case_bits.insert(bit); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				if (first_case) { | ||||||
|  | 					first_case = false; | ||||||
|  | 					bits = case_bits; | ||||||
|  | 				} else { | ||||||
|  | 					pool<SigBit> new_bits; | ||||||
|  | 					for (auto bit : bits) | ||||||
|  | 						if (case_bits.count(bit)) | ||||||
|  | 							new_bits.insert(bit); | ||||||
|  | 					bits.swap(new_bits); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		bits.swap(swcache.full_case_bits_cache[sw]); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return swcache.full_case_bits_cache.at(sw); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| RTLIL::SigSpec signal_to_mux_tree(RTLIL::Module *mod, SnippetSwCache &swcache, dict<RTLIL::SwitchRule*, bool, hash_ptr_ops> &swpara, | RTLIL::SigSpec signal_to_mux_tree(RTLIL::Module *mod, SnippetSwCache &swcache, dict<RTLIL::SwitchRule*, bool, hash_ptr_ops> &swpara, | ||||||
| 		RTLIL::CaseRule *cs, const RTLIL::SigSpec &sig, const RTLIL::SigSpec &defval, bool ifxmode) | 		RTLIL::CaseRule *cs, const RTLIL::SigSpec &sig, const RTLIL::SigSpec &defval, bool ifxmode) | ||||||
| { | { | ||||||
|  | @ -337,10 +381,15 @@ RTLIL::SigSpec signal_to_mux_tree(RTLIL::Module *mod, SnippetSwCache &swcache, d | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		// mask default bits that are irrelevant because the output is driven by a full case
 | ||||||
|  | 		const pool<SigBit> &full_case_bits = get_full_case_bits(swcache, sw); | ||||||
|  | 		for (int i = 0; i < GetSize(sig); i++) | ||||||
|  | 			if (full_case_bits.count(sig[i])) | ||||||
|  | 				result[i] = State::Sx; | ||||||
|  | 
 | ||||||
| 		// evaluate in reverse order to give the first entry the top priority
 | 		// evaluate in reverse order to give the first entry the top priority
 | ||||||
| 		RTLIL::SigSpec initial_val = result; | 		RTLIL::SigSpec initial_val = result; | ||||||
| 		RTLIL::Cell *last_mux_cell = NULL; | 		RTLIL::Cell *last_mux_cell = NULL; | ||||||
| 		bool shiftx = initial_val.is_fully_undef(); |  | ||||||
| 		for (size_t i = 0; i < sw->cases.size(); i++) { | 		for (size_t i = 0; i < sw->cases.size(); i++) { | ||||||
| 			int case_idx = sw->cases.size() - i - 1; | 			int case_idx = sw->cases.size() - i - 1; | ||||||
| 			RTLIL::CaseRule *cs2 = sw->cases[case_idx]; | 			RTLIL::CaseRule *cs2 = sw->cases[case_idx]; | ||||||
|  | @ -349,20 +398,7 @@ RTLIL::SigSpec signal_to_mux_tree(RTLIL::Module *mod, SnippetSwCache &swcache, d | ||||||
| 				append_pmux(mod, sw->signal, cs2->compare, value, last_mux_cell, sw, ifxmode); | 				append_pmux(mod, sw->signal, cs2->compare, value, last_mux_cell, sw, ifxmode); | ||||||
| 			else | 			else | ||||||
| 				result = gen_mux(mod, sw->signal, cs2->compare, value, result, last_mux_cell, sw, ifxmode); | 				result = gen_mux(mod, sw->signal, cs2->compare, value, result, last_mux_cell, sw, ifxmode); | ||||||
| 
 |  | ||||||
| 			// Ignore output values which are entirely don't care
 |  | ||||||
| 			if (shiftx && !value.is_fully_undef()) { |  | ||||||
| 				// Keep checking if case condition is the same as the current case index
 |  | ||||||
| 				if (cs2->compare.size() == 1 && cs2->compare.front().is_fully_const()) |  | ||||||
| 					shiftx = (cs2->compare.front().as_int() == case_idx); |  | ||||||
| 				else |  | ||||||
| 					shiftx = false; |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		// Mark this pmux as being $shiftx compatible
 |  | ||||||
| 		if (shiftx && last_mux_cell && last_mux_cell->type == "$pmux") |  | ||||||
| 			last_mux_cell->set_bool_attribute("\\shiftx_compatible"); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return result; | 	return result; | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ | ||||||
| USING_YOSYS_NAMESPACE | USING_YOSYS_NAMESPACE | ||||||
| PRIVATE_NAMESPACE_BEGIN | PRIVATE_NAMESPACE_BEGIN | ||||||
| 
 | 
 | ||||||
| void proc_rmdead(RTLIL::SwitchRule *sw, int &counter) | void proc_rmdead(RTLIL::SwitchRule *sw, int &counter, int &full_case_counter) | ||||||
| { | { | ||||||
| 	BitPatternPool pool(sw->signal); | 	BitPatternPool pool(sw->signal); | ||||||
| 
 | 
 | ||||||
|  | @ -56,11 +56,16 @@ void proc_rmdead(RTLIL::SwitchRule *sw, int &counter) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		for (auto switch_it : sw->cases[i]->switches) | 		for (auto switch_it : sw->cases[i]->switches) | ||||||
| 			proc_rmdead(switch_it, counter); | 			proc_rmdead(switch_it, counter, full_case_counter); | ||||||
| 
 | 
 | ||||||
| 		if (is_default) | 		if (is_default) | ||||||
| 			pool.take_all(); | 			pool.take_all(); | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	if (pool.empty() && !sw->get_bool_attribute("\\full_case")) { | ||||||
|  | 		sw->set_bool_attribute("\\full_case"); | ||||||
|  | 		full_case_counter++; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct ProcRmdeadPass : public Pass { | struct ProcRmdeadPass : public Pass { | ||||||
|  | @ -87,12 +92,15 @@ struct ProcRmdeadPass : public Pass { | ||||||
| 			for (auto &proc_it : mod->processes) { | 			for (auto &proc_it : mod->processes) { | ||||||
| 				if (!design->selected(mod, proc_it.second)) | 				if (!design->selected(mod, proc_it.second)) | ||||||
| 					continue; | 					continue; | ||||||
| 				int counter = 0; | 				int counter = 0, full_case_counter = 0; | ||||||
| 				for (auto switch_it : proc_it.second->root_case.switches) | 				for (auto switch_it : proc_it.second->root_case.switches) | ||||||
| 					proc_rmdead(switch_it, counter); | 					proc_rmdead(switch_it, counter, full_case_counter); | ||||||
| 				if (counter > 0) | 				if (counter > 0) | ||||||
| 					log("Removed %d dead cases from process %s in module %s.\n", counter, | 					log("Removed %d dead cases from process %s in module %s.\n", counter, | ||||||
| 							proc_it.first.c_str(), log_id(mod)); | 							log_id(proc_it.first), log_id(mod)); | ||||||
|  | 				if (full_case_counter > 0) | ||||||
|  | 					log("Marked %d switch rules as full_case in process %s in module %s.\n", | ||||||
|  | 							full_case_counter, log_id(proc_it.first), log_id(mod)); | ||||||
| 				total_counter += counter; | 				total_counter += counter; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -29,17 +29,17 @@ | ||||||
| // Kahn, Arthur B. (1962), "Topological sorting of large networks", Communications of the ACM 5 (11): 558-562, doi:10.1145/368996.369025
 | // Kahn, Arthur B. (1962), "Topological sorting of large networks", Communications of the ACM 5 (11): 558-562, doi:10.1145/368996.369025
 | ||||||
| // http://en.wikipedia.org/wiki/Topological_sorting
 | // http://en.wikipedia.org/wiki/Topological_sorting
 | ||||||
| 
 | 
 | ||||||
| #define ABC_COMMAND_LIB "strash; ifraig; scorr; dc2; dretime; strash; &get -n; &dch -f; &nf {D}; &put" | #define ABC_COMMAND_LIB "strash; ifraig; scorr; dc2; dretime; retime {D}; strash; &get -n; &dch -f; &nf {D}; &put" | ||||||
| #define ABC_COMMAND_CTR "strash; ifraig; scorr; dc2; dretime; strash; &get -n; &dch -f; &nf {D}; &put; buffer; upsize {D}; dnsize {D}; stime -p" | #define ABC_COMMAND_CTR "strash; ifraig; scorr; dc2; dretime; retime {D}; strash; &get -n; &dch -f; &nf {D}; &put; buffer; upsize {D}; dnsize {D}; stime -p" | ||||||
| #define ABC_COMMAND_LUT "strash; ifraig; scorr; dc2; dretime; strash; dch -f; if; mfs2" | #define ABC_COMMAND_LUT "strash; ifraig; scorr; dc2; dretime; retime {D}; strash; dch -f; if; mfs2" | ||||||
| #define ABC_COMMAND_SOP "strash; ifraig; scorr; dc2; dretime; strash; dch -f; cover {I} {P}" | #define ABC_COMMAND_SOP "strash; ifraig; scorr; dc2; dretime; retime {D}; strash; dch -f; cover {I} {P}" | ||||||
| #define ABC_COMMAND_DFL "strash; ifraig; scorr; dc2; dretime; strash; &get -n; &dch -f; &nf {D}; &put" | #define ABC_COMMAND_DFL "strash; ifraig; scorr; dc2; dretime; retime {D}; strash; &get -n; &dch -f; &nf {D}; &put" | ||||||
| 
 | 
 | ||||||
| #define ABC_FAST_COMMAND_LIB "strash; dretime; map {D}" | #define ABC_FAST_COMMAND_LIB "strash; dretime; retime {D}; map {D}" | ||||||
| #define ABC_FAST_COMMAND_CTR "strash; dretime; map {D}; buffer; upsize {D}; dnsize {D}; stime -p" | #define ABC_FAST_COMMAND_CTR "strash; dretime; retime {D}; map {D}; buffer; upsize {D}; dnsize {D}; stime -p" | ||||||
| #define ABC_FAST_COMMAND_LUT "strash; dretime; if" | #define ABC_FAST_COMMAND_LUT "strash; dretime; retime {D}; if" | ||||||
| #define ABC_FAST_COMMAND_SOP "strash; dretime; cover -I {I} -P {P}" | #define ABC_FAST_COMMAND_SOP "strash; dretime; retime {D}; cover -I {I} -P {P}" | ||||||
| #define ABC_FAST_COMMAND_DFL "strash; dretime; map" | #define ABC_FAST_COMMAND_DFL "strash; dretime; retime {D}; map" | ||||||
| 
 | 
 | ||||||
| #include "kernel/register.h" | #include "kernel/register.h" | ||||||
| #include "kernel/sigtools.h" | #include "kernel/sigtools.h" | ||||||
|  | @ -331,19 +331,23 @@ std::string remap_name(RTLIL::IdString abc_name, RTLIL::Wire **orig_wire = nullp | ||||||
| { | { | ||||||
| 	std::string abc_sname = abc_name.substr(1); | 	std::string abc_sname = abc_name.substr(1); | ||||||
| 	if (abc_sname.substr(0, 5) == "ys__n") { | 	if (abc_sname.substr(0, 5) == "ys__n") { | ||||||
| 		int sid = std::stoi(abc_sname.substr(5)); |  | ||||||
| 		bool inv = abc_sname.back() == 'v'; | 		bool inv = abc_sname.back() == 'v'; | ||||||
| 		for (auto sig : signal_list) { | 		if (inv) abc_sname.pop_back(); | ||||||
| 			if (sig.id == sid && sig.bit.wire != nullptr) { | 		abc_sname.erase(0, 5); | ||||||
| 				std::stringstream sstr; | 		if (abc_sname.find_last_not_of("012345689") == std::string::npos) { | ||||||
| 				sstr << "$abc$" << map_autoidx << "$" << sig.bit.wire->name.substr(1); | 			int sid = std::stoi(abc_sname); | ||||||
| 				if (sig.bit.wire->width != 1) | 			for (auto sig : signal_list) { | ||||||
| 					sstr << "[" << sig.bit.offset << "]"; | 				if (sig.id == sid && sig.bit.wire != nullptr) { | ||||||
| 				if (inv) | 					std::stringstream sstr; | ||||||
| 					sstr << "_inv"; | 					sstr << "$abc$" << map_autoidx << "$" << sig.bit.wire->name.substr(1); | ||||||
| 				if (orig_wire != nullptr) | 					if (sig.bit.wire->width != 1) | ||||||
| 					*orig_wire = sig.bit.wire; | 						sstr << "[" << sig.bit.offset << "]"; | ||||||
| 				return sstr.str(); | 					if (inv) | ||||||
|  | 						sstr << "_inv"; | ||||||
|  | 					if (orig_wire != nullptr) | ||||||
|  | 						*orig_wire = sig.bit.wire; | ||||||
|  | 					return sstr.str(); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -731,10 +735,6 @@ void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std::strin | ||||||
| 	else | 	else | ||||||
| 		abc_script += fast_mode ? ABC_FAST_COMMAND_DFL : ABC_COMMAND_DFL; | 		abc_script += fast_mode ? ABC_FAST_COMMAND_DFL : ABC_COMMAND_DFL; | ||||||
| 
 | 
 | ||||||
| 	if (script_file.empty() && !delay_target.empty()) |  | ||||||
| 		for (size_t pos = abc_script.find("dretime;"); pos != std::string::npos; pos = abc_script.find("dretime;", pos+1)) |  | ||||||
| 			abc_script = abc_script.substr(0, pos) + "dretime; retime -o {D};" + abc_script.substr(pos+8); |  | ||||||
| 
 |  | ||||||
| 	for (size_t pos = abc_script.find("{D}"); pos != std::string::npos; pos = abc_script.find("{D}", pos)) | 	for (size_t pos = abc_script.find("{D}"); pos != std::string::npos; pos = abc_script.find("{D}", pos)) | ||||||
| 		abc_script = abc_script.substr(0, pos) + delay_target + abc_script.substr(pos+3); | 		abc_script = abc_script.substr(0, pos) + delay_target + abc_script.substr(pos+3); | ||||||
| 
 | 
 | ||||||
|  | @ -1674,8 +1674,6 @@ struct AbcPass : public Pass { | ||||||
| 			} | 			} | ||||||
| 			if (arg == "-dff") { | 			if (arg == "-dff") { | ||||||
| 				dff_mode = true; | 				dff_mode = true; | ||||||
| 				if (delay_target.empty()) |  | ||||||
| 					delay_target = "-D 1"; |  | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 			if (arg == "-clk" && argidx+1 < args.size()) { | 			if (arg == "-clk" && argidx+1 < args.size()) { | ||||||
|  |  | ||||||
|  | @ -71,9 +71,9 @@ struct PmuxtreePass : public Pass { | ||||||
| 	{ | 	{ | ||||||
| 		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | 		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
 | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 		log("    pmuxtree [options] [selection]\n"); | 		log("    pmuxtree [selection]\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 		log("This pass transforms $pmux cells to a trees of $mux cells.\n"); | 		log("This pass transforms $pmux cells to trees of $mux cells.\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 	} | 	} | ||||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE | 	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE | ||||||
|  |  | ||||||
|  | @ -85,7 +85,7 @@ module cyclonev_lcell_comb | ||||||
|       begin |       begin | ||||||
|          upper_lut_value = lut4(mask[31:16], dataa, datab, datac, datad); |          upper_lut_value = lut4(mask[31:16], dataa, datab, datac, datad); | ||||||
|          lower_lut_value = lut4(mask[15:0], dataa, datab, datac, datad); |          lower_lut_value = lut4(mask[15:0], dataa, datab, datac, datad); | ||||||
|          lut5            = (datae) ? upper_mask_value : lower_mask_value; |          lut5            = (datae) ? upper_lut_value : lower_lut_value; | ||||||
|       end |       end | ||||||
|    endfunction // lut5 |    endfunction // lut5 | ||||||
| 
 | 
 | ||||||
|  | @ -95,15 +95,16 @@ module cyclonev_lcell_comb | ||||||
|       input        dataa, datab, datac, datad, datae, dataf; |       input        dataa, datab, datac, datad, datae, dataf; | ||||||
|       reg          upper_lut_value; |       reg          upper_lut_value; | ||||||
|       reg          lower_lut_value; |       reg          lower_lut_value; | ||||||
|  |       reg          out_0, out_1, out_2, out_3; | ||||||
|       begin |       begin | ||||||
|          upper_lut_value = lut5(mask[63:32], dataa, datab, datac, datad, datae); |          upper_lut_value = lut5(mask[63:32], dataa, datab, datac, datad, datae); | ||||||
|          lower_lut_value = lut5(mask[31:0], dataa, datab, datac, datad, datae); |          lower_lut_value = lut5(mask[31:0], dataa, datab, datac, datad, datae); | ||||||
|          lut6            = (dataf) ?  upper_mask_value : lower_mask_value; |          lut6            = (dataf) ?  upper_lut_value : lower_lut_value; | ||||||
|       end |       end | ||||||
|    endfunction // lut6 |    endfunction // lut6 | ||||||
| 
 | 
 | ||||||
|    assign {mask_a, mask_b, mask_c, mask_d} = {lut_mask[15:0], lut_mask[31:16], lut_mask[47:32], lut_mask[63:48]}; |    assign {mask_a, mask_b, mask_c, mask_d} = {lut_mask[15:0], lut_mask[31:16], lut_mask[47:32], lut_mask[63:48]}; | ||||||
| 
 | `ifdef ADVANCED_ALM | ||||||
|    always @(*) begin |    always @(*) begin | ||||||
|       if(extended_lut == "on") |       if(extended_lut == "on") | ||||||
|         shared_lut_alm = datag; |         shared_lut_alm = datag; | ||||||
|  | @ -115,6 +116,11 @@ module cyclonev_lcell_comb | ||||||
|       out_2 = lut4(mask_c, dataa, datab, datac, datad); |       out_2 = lut4(mask_c, dataa, datab, datac, datad); | ||||||
|       out_3 = lut4(mask_d, dataa, datab, shared_lut_alm, datad); |       out_3 = lut4(mask_d, dataa, datab, shared_lut_alm, datad); | ||||||
|    end |    end | ||||||
|  | `else | ||||||
|  |    `ifdef DEBUG | ||||||
|  |        initial $display("Advanced ALM lut combine is not implemented yet"); | ||||||
|  |    `endif | ||||||
|  | `endif | ||||||
| endmodule // cyclonev_lcell_comb | endmodule // cyclonev_lcell_comb | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -30,10 +30,15 @@ module GND(output G); | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
| module IBUF(output O, input I); | module IBUF(output O, input I); | ||||||
|  |   parameter IOSTANDARD = "default"; | ||||||
|  |   parameter IBUF_LOW_PWR = 0; | ||||||
|   assign O = I; |   assign O = I; | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
| module OBUF(output O, input I); | module OBUF(output O, input I); | ||||||
|  |   parameter IOSTANDARD = "default"; | ||||||
|  |   parameter DRIVE = 12; | ||||||
|  |   parameter SLEW = "SLOW"; | ||||||
|   assign O = I; |   assign O = I; | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
|  | @ -41,6 +46,42 @@ module BUFG(output O, input I); | ||||||
|   assign O = I; |   assign O = I; | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
|  | module BUFGCTRL( | ||||||
|  |     output O, | ||||||
|  |     input I0, input I1, | ||||||
|  |     input S0, input S1, | ||||||
|  |     input CE0, input CE1, | ||||||
|  |     input IGNORE0, input IGNORE1); | ||||||
|  | 
 | ||||||
|  | parameter [0:0] INIT_OUT = 1'b0; | ||||||
|  | parameter PRESELECT_I0 = "FALSE"; | ||||||
|  | parameter PRESELECT_I1 = "FALSE"; | ||||||
|  | parameter [0:0] IS_CE0_INVERTED = 1'b0; | ||||||
|  | parameter [0:0] IS_CE1_INVERTED = 1'b0; | ||||||
|  | parameter [0:0] IS_S0_INVERTED = 1'b0; | ||||||
|  | parameter [0:0] IS_S1_INVERTED = 1'b0; | ||||||
|  | parameter [0:0] IS_IGNORE0_INVERTED = 1'b0; | ||||||
|  | parameter [0:0] IS_IGNORE1_INVERTED = 1'b0; | ||||||
|  | 
 | ||||||
|  | wire I0_internal = ((CE0 ^ IS_CE0_INVERTED) ? I0 : INIT_OUT); | ||||||
|  | wire I1_internal = ((CE1 ^ IS_CE1_INVERTED) ? I1 : INIT_OUT); | ||||||
|  | wire S0_true = (S0 ^ IS_S0_INVERTED); | ||||||
|  | wire S1_true = (S1 ^ IS_S1_INVERTED); | ||||||
|  | 
 | ||||||
|  | assign O = S0_true ? I0_internal : (S1_true ? I1_internal : INIT_OUT); | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | 
 | ||||||
|  | module BUFHCE(output O, input I, input CE); | ||||||
|  | 
 | ||||||
|  | parameter [0:0] INIT_OUT = 1'b0; | ||||||
|  | parameter CE_TYPE = "SYNC"; | ||||||
|  | parameter [0:0] IS_CE_INVERTED = 1'b0; | ||||||
|  | 
 | ||||||
|  | assign O = ((CE ^ IS_CE_INVERTED) ? I : INIT_OUT); | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | 
 | ||||||
| // module OBUFT(output O, input I, T); | // module OBUFT(output O, input I, T); | ||||||
| //   assign O = T ? 1'bz : I; | //   assign O = T ? 1'bz : I; | ||||||
| // endmodule | // endmodule | ||||||
|  | @ -98,6 +139,22 @@ module LUT6(output O, input I0, I1, I2, I3, I4, I5); | ||||||
|   assign O = I0 ? s1[1] : s1[0]; |   assign O = I0 ? s1[1] : s1[0]; | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
|  | module LUT6_2(output O6, output O5, input I0, I1, I2, I3, I4, I5); | ||||||
|  |   parameter [63:0] INIT = 0; | ||||||
|  |   wire [31: 0] s5 = I5 ? INIT[63:32] : INIT[31: 0]; | ||||||
|  |   wire [15: 0] s4 = I4 ?   s5[31:16] :   s5[15: 0]; | ||||||
|  |   wire [ 7: 0] s3 = I3 ?   s4[15: 8] :   s4[ 7: 0]; | ||||||
|  |   wire [ 3: 0] s2 = I2 ?   s3[ 7: 4] :   s3[ 3: 0]; | ||||||
|  |   wire [ 1: 0] s1 = I1 ?   s2[ 3: 2] :   s2[ 1: 0]; | ||||||
|  |   assign O6 = I0 ? s1[1] : s1[0]; | ||||||
|  | 
 | ||||||
|  |   wire [15: 0] s5_4 = I4 ? INIT[31:16] : INIT[15: 0]; | ||||||
|  |   wire [ 7: 0] s5_3 = I3 ? s5_4[15: 8] : s5_4[ 7: 0]; | ||||||
|  |   wire [ 3: 0] s5_2 = I2 ? s5_3[ 7: 4] : s5_3[ 3: 0]; | ||||||
|  |   wire [ 1: 0] s5_1 = I1 ? s5_2[ 3: 2] : s5_2[ 1: 0]; | ||||||
|  |   assign O5 = I0 ? s5_1[1] : s5_1[0]; | ||||||
|  | endmodule | ||||||
|  | 
 | ||||||
| module MUXCY(output O, input CI, DI, S); | module MUXCY(output O, input CI, DI, S); | ||||||
|   assign O = S ? CI : DI; |   assign O = S ? CI : DI; | ||||||
| endmodule | endmodule | ||||||
|  |  | ||||||
|  | @ -28,12 +28,12 @@ function xtract_cell_decl() | ||||||
| 	# xtract_cell_decl BUFG | 	# xtract_cell_decl BUFG | ||||||
| 	xtract_cell_decl BUFGCE | 	xtract_cell_decl BUFGCE | ||||||
| 	xtract_cell_decl BUFGCE_1 | 	xtract_cell_decl BUFGCE_1 | ||||||
| 	xtract_cell_decl BUFGCTRL | 	#xtract_cell_decl BUFGCTRL | ||||||
| 	xtract_cell_decl BUFGMUX | 	xtract_cell_decl BUFGMUX | ||||||
| 	xtract_cell_decl BUFGMUX_1 | 	xtract_cell_decl BUFGMUX_1 | ||||||
| 	xtract_cell_decl BUFGMUX_CTRL | 	xtract_cell_decl BUFGMUX_CTRL | ||||||
| 	xtract_cell_decl BUFH | 	xtract_cell_decl BUFH | ||||||
| 	xtract_cell_decl BUFHCE | 	#xtract_cell_decl BUFHCE | ||||||
| 	xtract_cell_decl BUFIO | 	xtract_cell_decl BUFIO | ||||||
| 	xtract_cell_decl BUFMR | 	xtract_cell_decl BUFMR | ||||||
| 	xtract_cell_decl BUFMRCE | 	xtract_cell_decl BUFMRCE | ||||||
|  | @ -92,7 +92,7 @@ function xtract_cell_decl() | ||||||
| 	# xtract_cell_decl LUT4 | 	# xtract_cell_decl LUT4 | ||||||
| 	# xtract_cell_decl LUT5 | 	# xtract_cell_decl LUT5 | ||||||
| 	# xtract_cell_decl LUT6 | 	# xtract_cell_decl LUT6 | ||||||
| 	xtract_cell_decl LUT6_2 | 	#xtract_cell_decl LUT6_2 | ||||||
| 	xtract_cell_decl MMCME2_ADV | 	xtract_cell_decl MMCME2_ADV | ||||||
| 	xtract_cell_decl MMCME2_BASE | 	xtract_cell_decl MMCME2_BASE | ||||||
| 	# xtract_cell_decl MUXF7 | 	# xtract_cell_decl MUXF7 | ||||||
|  |  | ||||||
|  | @ -30,29 +30,6 @@ module BUFGCE_1 (...); | ||||||
|     input CE, I; |     input CE, I; | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
| module BUFGCTRL (...); |  | ||||||
|     output O; |  | ||||||
|     input CE0; |  | ||||||
|     input CE1; |  | ||||||
|     input I0; |  | ||||||
|     input I1; |  | ||||||
|     input IGNORE0; |  | ||||||
|     input IGNORE1; |  | ||||||
|     input S0; |  | ||||||
|     input S1; |  | ||||||
|     parameter integer INIT_OUT = 0; |  | ||||||
|     parameter PRESELECT_I0 = "FALSE"; |  | ||||||
|     parameter PRESELECT_I1 = "FALSE"; |  | ||||||
|     parameter [0:0] IS_CE0_INVERTED = 1'b0; |  | ||||||
|     parameter [0:0] IS_CE1_INVERTED = 1'b0; |  | ||||||
|     parameter [0:0] IS_I0_INVERTED = 1'b0; |  | ||||||
|     parameter [0:0] IS_I1_INVERTED = 1'b0; |  | ||||||
|     parameter [0:0] IS_IGNORE0_INVERTED = 1'b0; |  | ||||||
|     parameter [0:0] IS_IGNORE1_INVERTED = 1'b0; |  | ||||||
|     parameter [0:0] IS_S0_INVERTED = 1'b0; |  | ||||||
|     parameter [0:0] IS_S1_INVERTED = 1'b0; |  | ||||||
| endmodule |  | ||||||
| 
 |  | ||||||
| module BUFGMUX (...); | module BUFGMUX (...); | ||||||
|     parameter CLK_SEL_TYPE = "SYNC"; |     parameter CLK_SEL_TYPE = "SYNC"; | ||||||
|     output O; |     output O; | ||||||
|  | @ -77,15 +54,6 @@ module BUFH (...); | ||||||
|     input I; |     input I; | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
| module BUFHCE (...); |  | ||||||
|     parameter CE_TYPE = "SYNC"; |  | ||||||
|     parameter integer INIT_OUT = 0; |  | ||||||
|     parameter [0:0] IS_CE_INVERTED = 1'b0; |  | ||||||
|     output O; |  | ||||||
|     input CE; |  | ||||||
|     input I; |  | ||||||
| endmodule |  | ||||||
| 
 |  | ||||||
| module BUFIO (...); | module BUFIO (...); | ||||||
|     output O; |     output O; | ||||||
|     input I; |     input I; | ||||||
|  | @ -2420,12 +2388,6 @@ module LDPE (...); | ||||||
|     input D, G, GE, PRE; |     input D, G, GE, PRE; | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
| module LUT6_2 (...); |  | ||||||
|     parameter [63:0] INIT = 64'h0000000000000000; |  | ||||||
|     input I0, I1, I2, I3, I4, I5; |  | ||||||
|     output O5, O6; |  | ||||||
| endmodule |  | ||||||
| 
 |  | ||||||
| module MMCME2_ADV (...); | module MMCME2_ADV (...); | ||||||
|     parameter BANDWIDTH = "OPTIMIZED"; |     parameter BANDWIDTH = "OPTIMIZED"; | ||||||
|     parameter real CLKFBOUT_MULT_F = 5.000; |     parameter real CLKFBOUT_MULT_F = 5.000; | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								tests/aiger/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								tests/aiger/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | ||||||
|  | *.log | ||||||
|  | *.out | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue