mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	iopadmap: Refactor and fix tristate buffer mapping. (#1527)
The previous code for rerouting wires when inserting tristate buffers was overcomplicated and didn't handle all cases correctly (in particular, only cell connections were rewired — internal connections were not).
This commit is contained in:
		
							parent
							
								
									10014e2643
								
							
						
					
					
						commit
						2abe38e73e
					
				
					 2 changed files with 196 additions and 146 deletions
				
			
		
							
								
								
									
										99
									
								
								tests/techmap/iopadmap.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								tests/techmap/iopadmap.ys
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,99 @@
 | 
			
		|||
read_verilog << EOT
 | 
			
		||||
module ibuf ((* iopad_external_pin *) input i, output o); endmodule
 | 
			
		||||
module obuf (input i, (* iopad_external_pin *) output o); endmodule
 | 
			
		||||
module obuft (input i, input oe, (* iopad_external_pin *) output o); endmodule
 | 
			
		||||
module iobuf (input i, input oe, output o, (* iopad_external_pin *) inout io); endmodule
 | 
			
		||||
 | 
			
		||||
module a(input i, output o);
 | 
			
		||||
assign o = i;
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module b(input i, output o);
 | 
			
		||||
assign o = i;
 | 
			
		||||
ibuf b (.i(i), .o(o));
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module c(input i, output o);
 | 
			
		||||
obuf b (.i(i), .o(o));
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module d(input i, oe, output o, o2, o3);
 | 
			
		||||
assign o = oe ? i : 1'bz;
 | 
			
		||||
assign o2 = o;
 | 
			
		||||
assign o3 = ~o;
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
module e(input i, oe, inout io, output o2, o3);
 | 
			
		||||
assign io = oe ? i : 1'bz;
 | 
			
		||||
assign o2 = io;
 | 
			
		||||
assign o3 = ~io;
 | 
			
		||||
endmodule
 | 
			
		||||
EOT
 | 
			
		||||
 | 
			
		||||
opt_clean
 | 
			
		||||
tribuf
 | 
			
		||||
simplemap
 | 
			
		||||
iopadmap -bits -inpad ibuf o:i -outpad obuf i:o -toutpad obuft oe:i:o -tinoutpad iobuf oe:o:i:io
 | 
			
		||||
opt_clean
 | 
			
		||||
 | 
			
		||||
select -assert-count 1 a/t:ibuf
 | 
			
		||||
select -assert-count 1 a/t:obuf
 | 
			
		||||
select -set ib w:i %a %co a/t:ibuf %i
 | 
			
		||||
select -set ob w:o %a %ci a/t:obuf %i
 | 
			
		||||
select -assert-count 1 @ib
 | 
			
		||||
select -assert-count 1 @ob
 | 
			
		||||
select -assert-count 1 @ib %co %co @ob %i
 | 
			
		||||
 | 
			
		||||
select -assert-count 1 b/t:ibuf
 | 
			
		||||
select -assert-count 1 b/t:obuf
 | 
			
		||||
select -set ib w:i %a %co b/t:ibuf %i
 | 
			
		||||
select -set ob w:o %a %ci b/t:obuf %i
 | 
			
		||||
select -assert-count 1 @ib
 | 
			
		||||
select -assert-count 1 @ob
 | 
			
		||||
select -assert-count 1 @ib %co %co @ob %i
 | 
			
		||||
 | 
			
		||||
select -assert-count 1 c/t:ibuf
 | 
			
		||||
select -assert-count 1 c/t:obuf
 | 
			
		||||
select -set ib w:i %a %co c/t:ibuf %i
 | 
			
		||||
select -set ob w:o %a %ci c/t:obuf %i
 | 
			
		||||
select -assert-count 1 @ib
 | 
			
		||||
select -assert-count 1 @ob
 | 
			
		||||
select -assert-count 1 @ib %co %co @ob %i
 | 
			
		||||
 | 
			
		||||
select -assert-count 2 d/t:ibuf
 | 
			
		||||
select -assert-count 2 d/t:obuf
 | 
			
		||||
select -assert-count 1 d/t:obuft
 | 
			
		||||
select -set ib w:i %a %co d/t:ibuf %i
 | 
			
		||||
select -set oeb w:oe %a %co d/t:ibuf %i
 | 
			
		||||
select -set ob w:o %a %ci d/t:obuft %i
 | 
			
		||||
select -set o2b w:o2 %a %ci d/t:obuf %i
 | 
			
		||||
select -set o3b w:o3 %a %ci d/t:obuf %i
 | 
			
		||||
select -assert-count 1 @ib
 | 
			
		||||
select -assert-count 1 @oeb
 | 
			
		||||
select -assert-count 1 @ob
 | 
			
		||||
select -assert-count 1 @o2b
 | 
			
		||||
select -assert-count 1 @o3b
 | 
			
		||||
select -assert-count 1 @ib %co %co @ob %i
 | 
			
		||||
select -assert-count 1 @oeb %co %co @ob %i
 | 
			
		||||
select -assert-count 1 @ib %co %co @o2b %i
 | 
			
		||||
select -assert-count 1 @ib %co %co t:$_NOT_ %i
 | 
			
		||||
select -assert-count 1 @o3b %ci %ci t:$_NOT_ %i
 | 
			
		||||
 | 
			
		||||
select -assert-count 2 e/t:ibuf
 | 
			
		||||
select -assert-count 2 e/t:obuf
 | 
			
		||||
select -assert-count 1 e/t:iobuf
 | 
			
		||||
select -set ib w:i %a %co e/t:ibuf %i
 | 
			
		||||
select -set oeb w:oe %a %co e/t:ibuf %i
 | 
			
		||||
select -set iob w:io %a %ci e/t:iobuf %i
 | 
			
		||||
select -set o2b w:o2 %a %ci e/t:obuf %i
 | 
			
		||||
select -set o3b w:o3 %a %ci e/t:obuf %i
 | 
			
		||||
select -assert-count 1 @ib
 | 
			
		||||
select -assert-count 1 @oeb
 | 
			
		||||
select -assert-count 1 @iob
 | 
			
		||||
select -assert-count 1 @o2b
 | 
			
		||||
select -assert-count 1 @o3b
 | 
			
		||||
select -assert-count 1 @ib %co %co @iob %i
 | 
			
		||||
select -assert-count 1 @oeb %co %co @iob %i
 | 
			
		||||
select -assert-count 1 @iob %co %co @o2b %i
 | 
			
		||||
select -assert-count 1 @iob %co %co t:$_NOT_ %i
 | 
			
		||||
select -assert-count 1 @o3b %ci %ci t:$_NOT_ %i
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue