diff options
Diffstat (limited to 'passes')
| -rw-r--r-- | passes/fsm/fsm_detect.cc | 16 | ||||
| -rw-r--r-- | passes/techmap/flowmap.cc | 5 | 
2 files changed, 13 insertions, 8 deletions
diff --git a/passes/fsm/fsm_detect.cc b/passes/fsm/fsm_detect.cc index 5ae991b28..fb3896669 100644 --- a/passes/fsm/fsm_detect.cc +++ b/passes/fsm/fsm_detect.cc @@ -158,22 +158,25 @@ static void detect_fsm(RTLIL::Wire *wire)  		std::set<sig2driver_entry_t> cellport_list;  		sig2user.find(sig_q, cellport_list); +		auto sig_q_bits = sig_q.to_sigbit_pool(); +  		for (auto &cellport : cellport_list)  		{  			RTLIL::Cell *cell = cellport.first;  			bool set_output = false, clr_output = false; -			if (cell->type == "$ne") +			if (cell->type.in("$ne", "$reduce_or", "$reduce_bool"))  				set_output = true; -			if (cell->type == "$eq") +			if (cell->type.in("$eq", "$logic_not", "$reduce_and"))  				clr_output = true; -			if (!set_output && !clr_output) { -				clr_output = true; +			if (set_output || clr_output) {  				for (auto &port_it : cell->connections()) -					if (port_it.first != "\\A" || port_it.first != "\\Y") -						clr_output = false; +					if (cell->input(port_it.first)) +						for (auto bit : assign_map(port_it.second)) +							if (bit.wire != nullptr && !sig_q_bits.count(bit)) +								goto next_cellport;  			}  			if (set_output || clr_output) { @@ -184,6 +187,7 @@ static void detect_fsm(RTLIL::Wire *wire)  						ce.set(sig, val);  					}  			} +		next_cellport:;  		}  		SigSpec sig_y = sig_d, sig_undef; diff --git a/passes/techmap/flowmap.cc b/passes/techmap/flowmap.cc index 5807178dd..a2ad87f7d 100644 --- a/passes/techmap/flowmap.cc +++ b/passes/techmap/flowmap.cc @@ -394,7 +394,7 @@ struct FlowGraph  	pair<pool<RTLIL::SigBit>, pool<RTLIL::SigBit>> edge_cut()  	{ -		pool<RTLIL::SigBit> x, xi; +		pool<RTLIL::SigBit> x = {source}, xi; // X and X̅ in the paper  		NodePrime source_prime = {source, true};  		pool<NodePrime> visited; @@ -437,6 +437,7 @@ struct FlowGraph  		for (auto collapsed_node : collapsed[sink])  			xi.insert(collapsed_node); +		log_assert(x[source] && !xi[source]);  		log_assert(!x[sink] && xi[sink]);  		return {x, xi};  	} @@ -1050,7 +1051,7 @@ struct FlowmapWorker  				auto cut_inputs = cut_lut_at_gate(lut, lut_gate);  				pool<RTLIL::SigBit> gate_inputs = cut_inputs.first, other_inputs = cut_inputs.second; -				if (gate_inputs.empty() && (int)other_inputs.size() == order) +				if (gate_inputs.empty() && (int)other_inputs.size() >= order)  				{  					if (debug_relax)  						log("      Breaking would result in a (k+1)-LUT.\n");  | 
