mirror of https://github.com/YosysHQ/yosys.git
abc9: make re-entrant (#2993)
* Add testcase * Cleanup some state at end of abc9 * Re-assign abc9_box_id from scratch * Suppress delete unless prep_bypass did something
This commit is contained in:
parent
65316ec926
commit
96b6410dcb
|
@ -289,8 +289,10 @@ struct Abc9Pass : public ScriptPass
|
||||||
run("scc -specify -set_attr abc9_scc_id {}");
|
run("scc -specify -set_attr abc9_scc_id {}");
|
||||||
if (help_mode)
|
if (help_mode)
|
||||||
run("abc9_ops -prep_bypass [-prep_dff]", "(option if -dff)");
|
run("abc9_ops -prep_bypass [-prep_dff]", "(option if -dff)");
|
||||||
else
|
else {
|
||||||
|
active_design->scratchpad_unset("abc9_ops.prep_bypass.did_something");
|
||||||
run(stringf("abc9_ops -prep_bypass %s", dff_mode ? "-prep_dff" : ""));
|
run(stringf("abc9_ops -prep_bypass %s", dff_mode ? "-prep_dff" : ""));
|
||||||
|
}
|
||||||
if (dff_mode) {
|
if (dff_mode) {
|
||||||
run("design -copy-to $abc9_map @$abc9_flops", "(only if -dff)");
|
run("design -copy-to $abc9_map @$abc9_flops", "(only if -dff)");
|
||||||
run("select -unset $abc9_flops", " (only if -dff)");
|
run("select -unset $abc9_flops", " (only if -dff)");
|
||||||
|
@ -450,6 +452,9 @@ struct Abc9Pass : public ScriptPass
|
||||||
run("design -delete $abc9_unmap");
|
run("design -delete $abc9_unmap");
|
||||||
if (saved_designs.count("$abc9_holes") || help_mode)
|
if (saved_designs.count("$abc9_holes") || help_mode)
|
||||||
run("design -delete $abc9_holes");
|
run("design -delete $abc9_holes");
|
||||||
|
if (help_mode || active_design->scratchpad_get_bool("abc9_ops.prep_bypass.did_something"))
|
||||||
|
run("delete =*_$abc9_byp");
|
||||||
|
run("setattr -mod -unset abc9_box_id");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} Abc9Pass;
|
} Abc9Pass;
|
||||||
|
|
|
@ -432,6 +432,8 @@ void prep_bypass(RTLIL::Design *design)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unmap_module->fixup_ports();
|
unmap_module->fixup_ports();
|
||||||
|
|
||||||
|
design->scratchpad_set_bool("abc9_ops.prep_bypass.did_something", true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -942,15 +944,8 @@ void prep_box(RTLIL::Design *design)
|
||||||
{
|
{
|
||||||
TimingInfo timing;
|
TimingInfo timing;
|
||||||
|
|
||||||
std::stringstream ss;
|
|
||||||
int abc9_box_id = 1;
|
int abc9_box_id = 1;
|
||||||
for (auto module : design->modules()) {
|
std::stringstream ss;
|
||||||
auto it = module->attributes.find(ID::abc9_box_id);
|
|
||||||
if (it == module->attributes.end())
|
|
||||||
continue;
|
|
||||||
abc9_box_id = std::max(abc9_box_id, it->second.as_int());
|
|
||||||
}
|
|
||||||
|
|
||||||
dict<IdString,std::vector<IdString>> box_ports;
|
dict<IdString,std::vector<IdString>> box_ports;
|
||||||
for (auto module : design->modules()) {
|
for (auto module : design->modules()) {
|
||||||
auto it = module->attributes.find(ID::abc9_box);
|
auto it = module->attributes.find(ID::abc9_box);
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
read_verilog -specify <<EOT
|
||||||
|
(* abc9_box, blackbox*)
|
||||||
|
module box(input clk, d, output reg q, output do);
|
||||||
|
parameter P = 0;
|
||||||
|
always @(posedge clk)
|
||||||
|
q <= d;
|
||||||
|
assign do = d;
|
||||||
|
specify
|
||||||
|
(posedge clk => (q : d)) = 1;
|
||||||
|
(d => do) = 1;
|
||||||
|
endspecify
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module top(input clk, d, output q);
|
||||||
|
box i1(clk, d, q);
|
||||||
|
endmodule
|
||||||
|
EOT
|
||||||
|
hierarchy
|
||||||
|
abc9 -lut 4
|
||||||
|
abc9 -lut 4
|
Loading…
Reference in New Issue