cxxrtl: localize wires with multiple comb drivers, too.
authorwhitequark <whitequark@whitequark.org>
Tue, 21 Apr 2020 13:33:42 +0000 (13:33 +0000)
committerwhitequark <whitequark@whitequark.org>
Tue, 21 Apr 2020 13:36:50 +0000 (13:36 +0000)
commit757cbb3c809091bf20a2f3b3a8b621010de01a8d
treebe4758ebbc0aea538b3112431ee07ccb80394826
parentf24fb4ae82c9fb0cdaf9c954dbe6b3569c1ccda0
cxxrtl: localize wires with multiple comb drivers, too.

Before this commit, any wire that was not driven by an output port of
exactly one comb cell would not be localized, even if there were no
feedback arcs through that wire. This would cause the wire to become
buffered and require (often quite a few) extraneous delta cycles
during evaluation. To alleviate this problem, -O5 was running
`splitnets -driver`.

However, this solution was mistaken. Because `splitnets -driver`
followed by `opt_clean -purge` would produce more nets with multiple
drivers, it would have to be iterated to fixpoint. Moreover, even if
this was done, it would not be sufficient because `opt_clean -purge`
does not currently remove wires with the `\init` attribute (and it
is not desirable to remove such wires, since they correspond to
registers and may be useful for debugging).

The proper solution is to consider the condition in which a wire
may be localized. Specifically, if there are no feedback arcs through
this wire, and no part of the wire is driven by an output of a sync
cell, then the wire holds no state and is localizable.

After this commit, the original condition for not localizing a wire
is replaced by a check for any sync cell driving it. This makes it
unnecessary to run `splitnets -driver` in the majority of cases
to get a design with no buffered wires, and -O5 no longer includes
that pass. As a result, Minerva SRAM SoC no longer has any buffered
wires, and runs ~27% faster.

In addition, this commit prepares the flow graph for introduction
of sync outputs of black boxes.

Co-authored-by: Jean-François Nguyen <jf@lambdaconcept.com>
backends/cxxrtl/cxxrtl.cc