mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Add yosys-smtbmc VCD writer support for memories with async writes
This commit is contained in:
		
							parent
							
								
									6132e6e72a
								
							
						
					
					
						commit
						9419de3e37
					
				
					 3 changed files with 11 additions and 7 deletions
				
			
		|  | @ -554,8 +554,6 @@ struct Smt2Worker | ||||||
| 			int rd_ports = cell->getParam("\\RD_PORTS").as_int(); | 			int rd_ports = cell->getParam("\\RD_PORTS").as_int(); | ||||||
| 			int wr_ports = cell->getParam("\\WR_PORTS").as_int(); | 			int wr_ports = cell->getParam("\\WR_PORTS").as_int(); | ||||||
| 
 | 
 | ||||||
| 			decls.push_back(stringf("; yosys-smt2-memory %s %d %d %d %d\n", get_id(cell), abits, width, rd_ports, wr_ports)); |  | ||||||
| 
 |  | ||||||
| 			bool async_read = false; | 			bool async_read = false; | ||||||
| 			if (!cell->getParam("\\WR_CLK_ENABLE").is_fully_ones()) { | 			if (!cell->getParam("\\WR_CLK_ENABLE").is_fully_ones()) { | ||||||
| 				if (!cell->getParam("\\WR_CLK_ENABLE").is_fully_zero()) | 				if (!cell->getParam("\\WR_CLK_ENABLE").is_fully_zero()) | ||||||
|  | @ -563,6 +561,8 @@ struct Smt2Worker | ||||||
| 				async_read = true; | 				async_read = true; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			decls.push_back(stringf("; yosys-smt2-memory %s %d %d %d %d %s\n", get_id(cell), abits, width, rd_ports, wr_ports, async_read ? "async" : "sync")); | ||||||
|  | 
 | ||||||
| 			string memstate; | 			string memstate; | ||||||
| 			if (async_read) { | 			if (async_read) { | ||||||
| 				memstate = stringf("%s#%d#final", get_id(module), arrayid); | 				memstate = stringf("%s#%d#final", get_id(module), arrayid); | ||||||
|  |  | ||||||
|  | @ -594,7 +594,7 @@ def write_vcd_trace(steps_start, steps_stop, index): | ||||||
| 
 | 
 | ||||||
|         mem_trace_data = dict() |         mem_trace_data = dict() | ||||||
|         for mempath in sorted(smt.hiermems(topmod)): |         for mempath in sorted(smt.hiermems(topmod)): | ||||||
|             abits, width, rports, wports = smt.mem_info(topmod, mempath) |             abits, width, rports, wports, asyncwr = smt.mem_info(topmod, mempath) | ||||||
| 
 | 
 | ||||||
|             expr_id = list() |             expr_id = list() | ||||||
|             expr_list = list() |             expr_list = list() | ||||||
|  | @ -666,7 +666,8 @@ def write_vcd_trace(steps_start, steps_stop, index): | ||||||
|                                     else: |                                     else: | ||||||
|                                         buf[k] = tdata[i][k] |                                         buf[k] = tdata[i][k] | ||||||
| 
 | 
 | ||||||
|                     tdata.append(data[:]) |                     if not asyncwr: | ||||||
|  |                         tdata.append(data[:]) | ||||||
| 
 | 
 | ||||||
|                     for j_data in wdata[i]: |                     for j_data in wdata[i]: | ||||||
|                         if j_data["A"] != addr: |                         if j_data["A"] != addr: | ||||||
|  | @ -679,6 +680,9 @@ def write_vcd_trace(steps_start, steps_stop, index): | ||||||
|                             if M[k] == "1": |                             if M[k] == "1": | ||||||
|                                 data[k] = D[k] |                                 data[k] = D[k] | ||||||
| 
 | 
 | ||||||
|  |                     if asyncwr: | ||||||
|  |                         tdata.append(data[:]) | ||||||
|  | 
 | ||||||
|                 assert len(tdata) == len(rdata) |                 assert len(tdata) == len(rdata) | ||||||
| 
 | 
 | ||||||
|                 netpath = mempath[:] |                 netpath = mempath[:] | ||||||
|  | @ -785,7 +789,7 @@ def write_vlogtb_trace(steps_start, steps_stop, index): | ||||||
| 
 | 
 | ||||||
|         mems = sorted(smt.hiermems(vlogtb_topmod)) |         mems = sorted(smt.hiermems(vlogtb_topmod)) | ||||||
|         for mempath in mems: |         for mempath in mems: | ||||||
|             abits, width, rports, wports = smt.mem_info(vlogtb_topmod, mempath) |             abits, width, rports, wports, asyncwr = smt.mem_info(vlogtb_topmod, mempath) | ||||||
| 
 | 
 | ||||||
|             addr_expr_list = list() |             addr_expr_list = list() | ||||||
|             data_expr_list = list() |             data_expr_list = list() | ||||||
|  | @ -888,7 +892,7 @@ def write_constr_trace(steps_start, steps_stop, index): | ||||||
| 
 | 
 | ||||||
|         mems = sorted(smt.hiermems(constr_topmod)) |         mems = sorted(smt.hiermems(constr_topmod)) | ||||||
|         for mempath in mems: |         for mempath in mems: | ||||||
|             abits, width, rports, wports = smt.mem_info(constr_topmod, mempath) |             abits, width, rports, wports, asyncwr = smt.mem_info(constr_topmod, mempath) | ||||||
| 
 | 
 | ||||||
|             addr_expr_list = list() |             addr_expr_list = list() | ||||||
|             data_expr_list = list() |             data_expr_list = list() | ||||||
|  |  | ||||||
|  | @ -387,7 +387,7 @@ class SmtIo: | ||||||
|             self.modinfo[self.curmod].wsize[fields[2]] = int(fields[3]) |             self.modinfo[self.curmod].wsize[fields[2]] = int(fields[3]) | ||||||
| 
 | 
 | ||||||
|         if fields[1] == "yosys-smt2-memory": |         if fields[1] == "yosys-smt2-memory": | ||||||
|             self.modinfo[self.curmod].memories[fields[2]] = (int(fields[3]), int(fields[4]), int(fields[5]), int(fields[6])) |             self.modinfo[self.curmod].memories[fields[2]] = (int(fields[3]), int(fields[4]), int(fields[5]), int(fields[6]), fields[7] == "async") | ||||||
| 
 | 
 | ||||||
|         if fields[1] == "yosys-smt2-wire": |         if fields[1] == "yosys-smt2-wire": | ||||||
|             self.modinfo[self.curmod].wires.add(fields[2]) |             self.modinfo[self.curmod].wires.add(fields[2]) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue