mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Progress in SMV back-end
This commit is contained in:
		
							parent
							
								
									ed128b82d7
								
							
						
					
					
						commit
						b8c5e27006
					
				
					 1 changed files with 46 additions and 3 deletions
				
			
		| 
						 | 
					@ -40,6 +40,15 @@ struct SmvWorker
 | 
				
			||||||
	pool<shared_str> used_names;
 | 
						pool<shared_str> used_names;
 | 
				
			||||||
	vector<shared_str> strbuf;
 | 
						vector<shared_str> strbuf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct assign_rhs_chunk {
 | 
				
			||||||
 | 
							string rhs_expr;
 | 
				
			||||||
 | 
							int offset, width;
 | 
				
			||||||
 | 
							bool operator<(const assign_rhs_chunk &other) const { return offset < other.offset; }
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dict<Wire*, vector<assign_rhs_chunk>> partial_assignments;
 | 
				
			||||||
 | 
						vector<string> assignments;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const char *cid()
 | 
						const char *cid()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		while (true) {
 | 
							while (true) {
 | 
				
			||||||
| 
						 | 
					@ -129,13 +138,28 @@ struct SmvWorker
 | 
				
			||||||
		if (sig.is_wire())
 | 
							if (sig.is_wire())
 | 
				
			||||||
			return rvalue(sig);
 | 
								return rvalue(sig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		log_error("Can not generate lvalue for signal %s. Try running 'splice'.\n", log_signal(sig));
 | 
							const char *temp_id = cid();
 | 
				
			||||||
 | 
							f << stringf("    %s : unsigned word[%d];\n", temp_id, GetSize(sig));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							int offset = 0;
 | 
				
			||||||
 | 
							for (auto &c : sig.chunks())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								log_assert(c.wire != nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								assign_rhs_chunk rhs;
 | 
				
			||||||
 | 
								rhs.rhs_expr = stringf("%s[%d:%d]", temp_id, offset+c.width-1, offset);
 | 
				
			||||||
 | 
								rhs.offset = c.offset;
 | 
				
			||||||
 | 
								rhs.width = c.width;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								partial_assignments[c.wire].push_back(rhs);
 | 
				
			||||||
 | 
								offset += c.width;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return temp_id;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void run()
 | 
						void run()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		vector<string> assignments;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		f << stringf("MODULE %s\n", cid(module->name));
 | 
							f << stringf("MODULE %s\n", cid(module->name));
 | 
				
			||||||
		f << stringf("  VAR\n");
 | 
							f << stringf("  VAR\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -312,6 +336,25 @@ struct SmvWorker
 | 
				
			||||||
					assignments.push_back(stringf("%s.%s := %s;", cid(cell->name), cid(conn.first), rvalue(conn.second)));
 | 
										assignments.push_back(stringf("%s.%s := %s;", cid(cell->name), cid(conn.first), rvalue(conn.second)));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (auto &it : partial_assignments)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								std::sort(it.second.begin(), it.second.end());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								string expr;
 | 
				
			||||||
 | 
								int offset = 0;
 | 
				
			||||||
 | 
								for (auto rhs : it.second) {
 | 
				
			||||||
 | 
									if (!expr.empty())
 | 
				
			||||||
 | 
										expr += " :: ";
 | 
				
			||||||
 | 
									if (offset < rhs.offset)
 | 
				
			||||||
 | 
										expr += stringf(" 0ub%d_0 :: ", rhs.offset - offset);
 | 
				
			||||||
 | 
									expr += rhs.rhs_expr;
 | 
				
			||||||
 | 
									offset = rhs.offset + rhs.width;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (offset < it.first->width)
 | 
				
			||||||
 | 
									expr += stringf(" :: 0ub%d_0", it.first->width - offset);
 | 
				
			||||||
 | 
								assignments.push_back(stringf("%s := %s;", cid(it.first->name), expr.c_str()));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		f << stringf("  ASSIGN\n");
 | 
							f << stringf("  ASSIGN\n");
 | 
				
			||||||
		for (const string &line : assignments)
 | 
							for (const string &line : assignments)
 | 
				
			||||||
			f << stringf("    %s\n", line.c_str());
 | 
								f << stringf("    %s\n", line.c_str());
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue