mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	write_verilog: handle the $shift cell.
The implementation corresponds to the following Verilog, which is
lifted straight from simlib.v:
    module \\$shift (A, B, Y);
    parameter A_SIGNED = 0;
    parameter B_SIGNED = 0;
    parameter A_WIDTH = 0;
    parameter B_WIDTH = 0;
    parameter Y_WIDTH = 0;
    input [A_WIDTH-1:0] A;
    input [B_WIDTH-1:0] B;
    output [Y_WIDTH-1:0] Y;
    generate
        if (B_SIGNED) begin:BLOCK1
            assign Y = $signed(B) < 0 ? A << -B : A >> B;
        end else begin:BLOCK2
            assign Y = A >> B;
        end
    endgenerate
    endmodule
			
			
This commit is contained in:
		
							parent
							
								
									ddff75b60a
								
							
						
					
					
						commit
						ca866d384e
					
				
					 1 changed files with 29 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -678,6 +678,35 @@ bool dump_cell_expr(std::ostream &f, std::string indent, RTLIL::Cell *cell)
 | 
			
		|||
#undef HANDLE_UNIOP
 | 
			
		||||
#undef HANDLE_BINOP
 | 
			
		||||
 | 
			
		||||
	if (cell->type == "$shift")
 | 
			
		||||
	{
 | 
			
		||||
		f << stringf("%s" "assign ", indent.c_str());
 | 
			
		||||
		dump_sigspec(f, cell->getPort("\\Y"));
 | 
			
		||||
		f << stringf(" = ");
 | 
			
		||||
		if (cell->getParam("\\B_SIGNED").as_bool())
 | 
			
		||||
		{
 | 
			
		||||
			f << stringf("$signed(");
 | 
			
		||||
			dump_sigspec(f, cell->getPort("\\B"));
 | 
			
		||||
			f << stringf(")");
 | 
			
		||||
			f << stringf(" < 0 ? ");
 | 
			
		||||
			dump_sigspec(f, cell->getPort("\\A"));
 | 
			
		||||
			f << stringf(" << - ");
 | 
			
		||||
			dump_sigspec(f, cell->getPort("\\B"));
 | 
			
		||||
			f << stringf(" : ");
 | 
			
		||||
			dump_sigspec(f, cell->getPort("\\A"));
 | 
			
		||||
			f << stringf(" >> ");
 | 
			
		||||
			dump_sigspec(f, cell->getPort("\\B"));
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			dump_sigspec(f, cell->getPort("\\A"));
 | 
			
		||||
			f << stringf(" >> ");
 | 
			
		||||
			dump_sigspec(f, cell->getPort("\\B"));
 | 
			
		||||
		}
 | 
			
		||||
		f << stringf(";\n");
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (cell->type == "$shiftx")
 | 
			
		||||
	{
 | 
			
		||||
		f << stringf("%s" "assign ", indent.c_str());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue