Для примера рассмотрим следующий VERILOG вход (test.v
):
module test(input [7:0] val1, val2, output [7:0] temp);
assign temp = 16*val1 + 8*val2;
endmodule
Команда yosys -p 'prep; opt -full; show' test.v
будет производить следующую схему:
И выход написанный на консоль содержит этот :
3.1. Executing OPT_EXPR pass (perform const folding).
Replacing multiply-by-16 cell `$mul$test.v:2$1' in module `\test' with shift-by-4.
Replacing multiply-by-8 cell `$mul$test.v:2$2' in module `\test' with shift-by-3.
Replacing $shl cell `$mul$test.v:2$1' (B=3'100, SHR=-4) in module `test' with fixed wiring: { \val1 [3:0] 4'0000 }
Replacing $shl cell `$mul$test.v:2$2' (B=2'11, SHR=-3) in module `test' with fixed wiring: { \val2 [4:0] 3'000 }
Две строки, которые читаются Replacing multiply-by-* cell
, являются упомянутыми вами преобразованиями. После этого две линии заменяют операции с постоянным сдвигом на проводку, используя {val1[3:0], 4'b0000}
и {val2[4:0], 3'b000}
в качестве входов для сумматора.
Это делается в проходе opt_expr
. См. passes/opt/opt_expr.cc
за его исходный код, чтобы узнать, как это делается.