mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/master'
This commit is contained in:
		
						commit
						970f854c2a
					
				
					 3 changed files with 47 additions and 44 deletions
				
			
		|  | @ -1065,43 +1065,46 @@ bool dump_cell_expr(std::ostream &f, std::string indent, RTLIL::Cell *cell) | |||
| 			use_rd_clk = cell->parameters["\\RD_CLK_ENABLE"].extract(i).as_bool(); | ||||
| 			rd_clk_posedge = cell->parameters["\\RD_CLK_POLARITY"].extract(i).as_bool(); | ||||
| 			rd_transparent = cell->parameters["\\RD_TRANSPARENT"].extract(i).as_bool(); | ||||
| 			if (use_rd_clk) | ||||
| 			{ | ||||
| 				std::ostringstream os; | ||||
| 				dump_sigspec(os, sig_rd_clk); | ||||
| 				clk_domain_str = stringf("%sedge %s", rd_clk_posedge ? "pos" : "neg", os.str().c_str()); | ||||
| 				if( clk_to_lof_body.count(clk_domain_str) == 0 ) | ||||
| 					clk_to_lof_body[clk_domain_str] = std::vector<std::string>(); | ||||
| 			} | ||||
| 			if (use_rd_clk && !rd_transparent) | ||||
| 			{ | ||||
| 				// for clocked read ports make something like:
 | ||||
| 				//   reg [..] temp_id;
 | ||||
| 				//   always @(posedge clk)
 | ||||
| 				//      if (rd_en) temp_id <= array_reg[r_addr];
 | ||||
| 				//   assign r_data = temp_id;
 | ||||
| 				std::string temp_id = next_auto_id(); | ||||
| 				lof_reg_declarations.push_back( stringf("reg [%d:0] %s;\n", sig_rd_data.size() - 1, temp_id.c_str()) ); | ||||
| 				{ | ||||
| 					std::ostringstream os; | ||||
| 					if (sig_rd_en != RTLIL::SigBit(true)) | ||||
| 					dump_sigspec(os, sig_rd_clk); | ||||
| 					clk_domain_str = stringf("%sedge %s", rd_clk_posedge ? "pos" : "neg", os.str().c_str()); | ||||
| 					if( clk_to_lof_body.count(clk_domain_str) == 0 ) | ||||
| 						clk_to_lof_body[clk_domain_str] = std::vector<std::string>(); | ||||
| 				} | ||||
| 				if (!rd_transparent) | ||||
| 				{ | ||||
| 					// for clocked read ports make something like:
 | ||||
| 					//   reg [..] temp_id;
 | ||||
| 					//   always @(posedge clk)
 | ||||
| 					//      if (rd_en) temp_id <= array_reg[r_addr];
 | ||||
| 					//   assign r_data = temp_id;
 | ||||
| 					std::string temp_id = next_auto_id(); | ||||
| 					lof_reg_declarations.push_back( stringf("reg [%d:0] %s;\n", sig_rd_data.size() - 1, temp_id.c_str()) ); | ||||
| 					{ | ||||
| 						os << stringf("if ("); | ||||
| 						dump_sigspec(os, sig_rd_en); | ||||
| 						os << stringf(") "); | ||||
| 						std::ostringstream os; | ||||
| 						if (sig_rd_en != RTLIL::SigBit(true)) | ||||
| 						{ | ||||
| 							os << stringf("if ("); | ||||
| 							dump_sigspec(os, sig_rd_en); | ||||
| 							os << stringf(") "); | ||||
| 						} | ||||
| 						os << stringf("%s <= %s[", temp_id.c_str(), mem_id.c_str()); | ||||
| 						dump_sigspec(os, sig_rd_addr); | ||||
| 						os << stringf("];\n"); | ||||
| 						clk_to_lof_body[clk_domain_str].push_back(os.str()); | ||||
| 					} | ||||
| 					{ | ||||
| 						std::ostringstream os; | ||||
| 						dump_sigspec(os, sig_rd_data); | ||||
| 						std::string line = stringf("assign %s = %s;\n", os.str().c_str(), temp_id.c_str()); | ||||
| 						clk_to_lof_body[""].push_back(line); | ||||
| 					} | ||||
| 					os << stringf("%s <= %s[", temp_id.c_str(), mem_id.c_str()); | ||||
| 					dump_sigspec(os, sig_rd_addr); | ||||
| 					os << stringf("];\n"); | ||||
| 					clk_to_lof_body[clk_domain_str].push_back(os.str()); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					std::ostringstream os; | ||||
| 					dump_sigspec(os, sig_rd_data); | ||||
| 					std::string line = stringf("assign %s = %s;\n", os.str().c_str(), temp_id.c_str()); | ||||
| 					clk_to_lof_body[""].push_back(line); | ||||
| 				} | ||||
| 			} else { | ||||
| 				if (rd_transparent) { | ||||
| 					// for rd-transparent read-ports make something like:
 | ||||
| 					//   reg [..] temp_id;
 | ||||
| 					//   always @(posedge clk)
 | ||||
|  | @ -1121,15 +1124,15 @@ bool dump_cell_expr(std::ostream &f, std::string indent, RTLIL::Cell *cell) | |||
| 						std::string line = stringf("assign %s = %s[%s];\n", os.str().c_str(), mem_id.c_str(), temp_id.c_str()); | ||||
| 						clk_to_lof_body[""].push_back(line); | ||||
| 					} | ||||
| 				} else { | ||||
| 					// for non-clocked read-ports make something like:
 | ||||
| 					//   assign r_data = array_reg[r_addr];
 | ||||
| 					std::ostringstream os, os2; | ||||
| 					dump_sigspec(os, sig_rd_data); | ||||
| 					dump_sigspec(os2, sig_rd_addr); | ||||
| 					std::string line = stringf("assign %s = %s[%s];\n", os.str().c_str(), mem_id.c_str(), os2.str().c_str()); | ||||
| 					clk_to_lof_body[""].push_back(line); | ||||
| 				} | ||||
| 			} else { | ||||
| 				// for non-clocked read-ports make something like:
 | ||||
| 				//   assign r_data = array_reg[r_addr];
 | ||||
| 				std::ostringstream os, os2; | ||||
| 				dump_sigspec(os, sig_rd_data); | ||||
| 				dump_sigspec(os2, sig_rd_addr); | ||||
| 				std::string line = stringf("assign %s = %s[%s];\n", os.str().c_str(), mem_id.c_str(), os2.str().c_str()); | ||||
| 				clk_to_lof_body[""].push_back(line); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -942,16 +942,15 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint) | |||
| 
 | ||||
| 	// simply return the corresponding RTLIL::SigSpec for an AST_CONSTANT node
 | ||||
| 	case AST_CONSTANT: | ||||
| 	case AST_REALVALUE: | ||||
| 		{ | ||||
| 			if (width_hint < 0) | ||||
| 				detectSignWidth(width_hint, sign_hint); | ||||
| 
 | ||||
| 			is_signed = sign_hint; | ||||
| 			return RTLIL::SigSpec(bitsAsConst()); | ||||
| 		} | ||||
| 
 | ||||
| 	case AST_REALVALUE: | ||||
| 		{ | ||||
| 			if (type == AST_CONSTANT) | ||||
| 				return RTLIL::SigSpec(bitsAsConst()); | ||||
| 
 | ||||
| 			RTLIL::SigSpec sig = realAsConst(width_hint); | ||||
| 			log_file_warning(filename, linenum, "converting real value %e to binary %s.\n", realvalue, log_signal(sig)); | ||||
| 			return sig; | ||||
|  |  | |||
|  | @ -72,7 +72,8 @@ struct FsmOpt | |||
| 
 | ||||
| 			new_transition_table.swap(fsm_data.transition_table); | ||||
| 			new_state_table.swap(fsm_data.state_table); | ||||
| 			fsm_data.reset_state = old_to_new_state.at(fsm_data.reset_state); | ||||
| 			if (fsm_data.reset_state != -1) | ||||
| 				fsm_data.reset_state = old_to_new_state.at(fsm_data.reset_state); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue