sim._pyrtl: optimize uses of reflexive operators.
authorwhitequark <whitequark@whitequark.org>
Wed, 26 Aug 2020 13:26:38 +0000 (13:26 +0000)
committerwhitequark <whitequark@whitequark.org>
Wed, 26 Aug 2020 13:26:58 +0000 (13:26 +0000)
commit8c6c3643cd1c504d1eff08e8293af032c6330ea9
treea330a477a52c6fb048fd9c2e3d7516f145eaaafe
parent38b75ba4bce2bf20e970f7d6027965a13dd0065c
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