hdl.ir: allow disabling UnusedElaboratable warning in file scope.
authorwhitequark <cz@m-labs.hk>
Sat, 26 Oct 2019 05:34:00 +0000 (05:34 +0000)
committerwhitequark <cz@m-labs.hk>
Sat, 26 Oct 2019 06:17:14 +0000 (06:17 +0000)
commit6caed6ce0504e284b2cfefdb50ffbfd4ff4de53a
tree1e001051d25d571f709828bc1941245ebea9bc4d
parent6e23f6f1cc69084cc95a130d65936fa4dccc5772
hdl.ir: allow disabling UnusedElaboratable warning in file scope.

This warning is usually quite handy, but is problematic in tests:
although it can be suppressed by using Fragment.get on elaboratable,
that is not always possible, in particular when writing tests for
exceptions raised by __init__, e.g.:

    def test_wrong_csr_bus(self):
        with self.assertRaisesRegex(ValueError, r"blah blah"):
            WishboneCSRBridge(csr_bus=object())

In theory, it should be possible to suppress warnings per-module
and even per-line using code such as:

    import re, warnings
    from nmigen.hdl.ir import UnusedElaboratable
    warnings.filterwarnings("ignore", category=UnusedElaboratable,
                            module=re.escape(__name__))

Unfortunately, not only is this code quite convoluted, but it also
does not actually work; we are using warnings.warn_explicit() because
we collect source locations on our own, but it requires the caller
to extract the __warningregistry__ dictionary from module globals,
or warning suppression would not work. Not only is this not feasible
in most diagnostic sites in nMigen, but also I never got it to work
anyway, even when passing all of module, registry, and module_globals
to warn_explicit().

Instead, use a magic comment at the start of a file to do this job,
which might not be elegant but is simple and practical. For now,
only UnusedElaboratable can be suppressed with it, but in future,
other linter parameters may become tweakable this way.
nmigen/_utils.py
nmigen/hdl/ir.py