mirror of https://github.com/YosysHQ/yosys.git
opt_balance_tree test cases
This commit is contained in:
parent
51a951d614
commit
39be4f29bd
|
|
@ -202,10 +202,10 @@ struct OptBalanceTreeWorker {
|
|||
cell->fixup_parameters();
|
||||
}
|
||||
|
||||
void process_chain(vector<Cell*> &chain) {
|
||||
bool process_chain(vector<Cell*> &chain) {
|
||||
// If chain size is less than 3, no balancing needed
|
||||
if (GetSize(chain) < 3)
|
||||
return;
|
||||
return false;
|
||||
|
||||
// Get mid, midnext (at index mid+1) and end of chain
|
||||
Cell *mid_cell = chain[GetSize(chain) / 2];
|
||||
|
|
@ -262,6 +262,8 @@ struct OptBalanceTreeWorker {
|
|||
|
||||
// Width reduce mid cell
|
||||
wreduce(mid_cell);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void cleanup() {
|
||||
|
|
@ -291,7 +293,24 @@ struct OptBalanceTreeWorker {
|
|||
// For each chain, if len >= 3, convert to tree via "rotation" and recurse on subtrees
|
||||
for (auto c : chain_start_cells) {
|
||||
vector<Cell*> chain = create_chain(c);
|
||||
process_chain(chain);
|
||||
bool processed = process_chain(chain);
|
||||
|
||||
if (processed) {
|
||||
// Rename cells and wires for formal check to pass as cells signals have changed functionalities post rotation
|
||||
for (Cell *cell : chain) {
|
||||
module->rename(cell, NEW_ID2_SUFFIX("rot_cell"));
|
||||
}
|
||||
for (Cell *cell : chain) {
|
||||
SigSpec y_sig = sigmap(cell->getPort(ID::Y));
|
||||
if (y_sig.is_wire()) {
|
||||
Wire *wire = y_sig.as_wire();
|
||||
if (wire && !wire->port_input && !wire->port_output) {
|
||||
module->rename(y_sig.as_wire(), NEW_ID2_SUFFIX("rot_wire"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cell_count[cell_type] += GetSize(chain);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,27 +14,31 @@ endmodule
|
|||
EOF
|
||||
check -assert
|
||||
|
||||
autoname
|
||||
write_json pre.json
|
||||
exec -- netlistsvg pre.json -o pre.svg
|
||||
|
||||
# Check equivalence after opt_balance_tree
|
||||
equiv_opt -assert opt_balance_tree
|
||||
|
||||
design -load postopt
|
||||
# opt_balance_tree
|
||||
|
||||
autoname
|
||||
write_json post.json
|
||||
exec -- netlistsvg post.json -o post.svg
|
||||
# Checks if inputs to and gates has been rewired
|
||||
select -set a_wires i:a %co
|
||||
select -set driven_by_a @a_wires %co
|
||||
select -set and_a_cell t:$and @driven_by_a %i
|
||||
|
||||
# Checks if y is still wired up to the correct gate
|
||||
# select -set y_wires o:y %ci
|
||||
# select -set y_driver @y_wires %ci
|
||||
# select -set and_y_cell t:$and @y_driver %i
|
||||
# select @and_y_cell -assert-count 1
|
||||
# select -set inputs @and_y_cell %ci
|
||||
# select -assert-count 1 @inputs i:c %i
|
||||
select -set b_wires i:b %co
|
||||
select -set driven_by_b @b_wires %co
|
||||
select -set and_b_cell t:$and @driven_by_b %i
|
||||
|
||||
select -assert-none @and_a_cell @and_b_cell %d
|
||||
|
||||
select -set c_wires i:c %co
|
||||
select -set driven_by_c @c_wires %co
|
||||
select -set and_c_cell t:$and @driven_by_c %i
|
||||
|
||||
select -set d_wires i:d %co
|
||||
select -set driven_by_d @d_wires %co
|
||||
select -set and_d_cell t:$and @driven_by_d %i
|
||||
|
||||
select -assert-none @and_c_cell @and_d_cell %d
|
||||
|
||||
design -reset
|
||||
log -pop
|
||||
|
|
@ -188,5 +192,78 @@ equiv_opt -assert opt_balance_tree
|
|||
design -load postopt
|
||||
select -assert-count 3 t:$and
|
||||
|
||||
design -reset
|
||||
log -pop
|
||||
|
||||
log -header "Interesting tree situation"
|
||||
log -push
|
||||
design -reset
|
||||
read_verilog <<EOF
|
||||
module top (
|
||||
input wire a, b, c, d,
|
||||
input wire e, f, g, h,
|
||||
output wire x,
|
||||
);
|
||||
wire i, j;
|
||||
|
||||
assign i = a & b & c & d;
|
||||
assign j = e & f & g & h & i;
|
||||
|
||||
assign x = i & j;
|
||||
endmodule
|
||||
EOF
|
||||
check -assert
|
||||
|
||||
# Check equivalence after opt_balance_tree
|
||||
equiv_opt -assert opt_balance_tree
|
||||
|
||||
design -load postopt
|
||||
|
||||
# Checks if inputs to and gates has been rewired
|
||||
|
||||
# a and b
|
||||
select -set a_wires i:a %co
|
||||
select -set driven_by_a @a_wires %co
|
||||
select -set and_a_cell t:$and @driven_by_a %i
|
||||
|
||||
select -set b_wires i:b %co
|
||||
select -set driven_by_b @b_wires %co
|
||||
select -set and_b_cell t:$and @driven_by_b %i
|
||||
|
||||
select -assert-none @and_a_cell @and_b_cell %d
|
||||
|
||||
# c and d
|
||||
select -set c_wires i:c %co
|
||||
select -set driven_by_c @c_wires %co
|
||||
select -set and_c_cell t:$and @driven_by_c %i
|
||||
|
||||
select -set d_wires i:d %co
|
||||
select -set driven_by_d @d_wires %co
|
||||
select -set and_d_cell t:$and @driven_by_d %i
|
||||
|
||||
select -assert-none @and_c_cell @and_d_cell %d
|
||||
|
||||
# e and f
|
||||
select -set e_wires i:e %co
|
||||
select -set driven_by_e @e_wires %co
|
||||
select -set and_e_cell t:$and @driven_by_e %i
|
||||
|
||||
select -set f_wires i:f %co
|
||||
select -set driven_by_f @f_wires %co
|
||||
select -set and_f_cell t:$and @driven_by_f %i
|
||||
|
||||
select -assert-none @and_e_cell @and_f_cell %d
|
||||
|
||||
# g and h
|
||||
select -set g_wires i:g %co
|
||||
select -set driven_by_g @g_wires %co
|
||||
select -set and_g_cell t:$and @driven_by_g %i
|
||||
|
||||
select -set h_wires i:h %co
|
||||
select -set driven_by_h @h_wires %co
|
||||
select -set and_h_cell t:$and @driven_by_h %i
|
||||
|
||||
select -assert-none @and_g_cell @and_h_cell %d
|
||||
|
||||
design -reset
|
||||
log -pop
|
||||
Loading…
Reference in New Issue