mirror of
https://github.com/YosysHQ/yosys
synced 2026-07-17 12:45:44 +00:00
This commit introduces the negopt pass with pre/post optimization modes for handling negation patterns in arithmetic circuits. Pre-optimization patterns (expose for tree balancing): - manual2sub: (a + ~b) + 1 → a - b - sub2neg: a - b → a + (-b) - negexpand: -(a + b) → (-a) + (-b) [with output width fix] - negneg: -(-a) → a - negmux: -(s ? a : b) → s ? (-a) : (-b) Post-optimization patterns (cleanup/rebuild): - negrebuild: (-a) + (-b) → -(a + b) - muxneg: s ? (-a) : (-b) → -(s ? a : b) - neg2sub: a + (-b) → a - b All patterns use nusers() for fanout checking (standard Yosys style). Comprehensive test coverage with positive/negative cases and formal verification via equiv_opt.
41 lines
842 B
Text
41 lines
842 B
Text
log -header "Simple positive case (negation on port B)"
|
|
log -push
|
|
design -reset
|
|
read_verilog <<EOF
|
|
module top(a, b, y);
|
|
input wire signed [7:0] a;
|
|
input wire signed [7:0] b;
|
|
output wire signed [8:0] y;
|
|
assign y = a + (-b);
|
|
endmodule
|
|
EOF
|
|
proc; opt
|
|
check -assert
|
|
equiv_opt -assert negopt -post
|
|
design -load postopt
|
|
select -assert-count 1 t:$sub
|
|
select -assert-none t:$add
|
|
select -assert-none t:$neg
|
|
design -reset
|
|
log -pop
|
|
|
|
log -header "Positive case (negation on port A)"
|
|
log -push
|
|
design -reset
|
|
read_verilog <<EOF
|
|
module top(a, b, y);
|
|
input wire signed [7:0] a;
|
|
input wire signed [7:0] b;
|
|
output wire signed [8:0] y;
|
|
assign y = (-a) + b;
|
|
endmodule
|
|
EOF
|
|
proc; opt
|
|
check -assert
|
|
equiv_opt -assert negopt -post
|
|
design -load postopt
|
|
select -assert-count 1 t:$sub
|
|
select -assert-none t:$add
|
|
select -assert-none t:$neg
|
|
design -reset
|
|
log -pop
|