sim._pyrtl: optimize uses of reflexive operators.
authorwhitequark <whitequark@whitequark.org>
Wed, 26 Aug 2020 13:26:38 +0000 (13:26 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 31 Dec 2021 15:06:20 +0000 (15:06 +0000)
commitd978dd18bd710c9a3d21e595e590fe084480ecb8
tree8ac67ebae764f680a9a5c65d2c31cdf32cf6ed4a
parent613ada26adc96813d507164ac6c83e33030c9311
sim._pyrtl: optimize uses of reflexive operators.

When a literal is used on the left-hand side of a numeric operator,
Python is able to constant-fold some expressions:

    >>> dis.dis(lambda x: 0 + 0 + x)
      1           0 LOAD_CONST               1 (0)
                  2 LOAD_FAST                0 (x)
                  4 BINARY_ADD
                  6 RETURN_VALUE

If a literal is used on the right-hand side such that the left-hand
side is variable, this doesn't happen:

    >>> dis.dis(lambda x: x + 0 + 0)
      1           0 LOAD_FAST                0 (x)
                  2 LOAD_CONST               1 (0)
                  4 BINARY_ADD
                  6 LOAD_CONST               1 (0)
                  8 BINARY_ADD
                 10 RETURN_VALUE

PyRTL generates fairly redundant code due to the pervasive masking,
and because of that, transforming expressions into the former form,
where possible, improves runtime by about 10% on Minerva SRAM SoC.
nmigen/sim/_pyrtl.py