hdl.ast: remove quadratic time complexity in Statement.cast().
authorAnton Blanchard <anton@ozlabs.org>
Mon, 27 Sep 2021 01:00:56 +0000 (11:00 +1000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 31 Dec 2021 15:31:40 +0000 (15:31 +0000)
Using `sum(lst, [])` to flatten a list of lists has quadratic time
complexity. Use `chain.from_iterable()` instead. While not strictly
necessary to improve performance, convert to `map()`.

A test case writing out verilog for a 512k entry FIFO is 120x faster
with this applied.

nmigen/hdl/ast.py

index 1ccc4462774c5d5ce1e9de89ae4e1926728c2e75..685924ac2f9481e12cb2d9424db4e619ec71d14a 100644 (file)
@@ -4,6 +4,7 @@ import functools
 from collections import OrderedDict
 from collections.abc import Iterable, MutableMapping, MutableSet, MutableSequence
 from enum import Enum
+from itertools import chain
 
 from .. import tracer
 from .._utils import *
@@ -1404,7 +1405,7 @@ class Statement:
     @staticmethod
     def cast(obj):
         if isinstance(obj, Iterable):
-            return _StatementList(sum((Statement.cast(e) for e in obj), []))
+            return _StatementList(list(chain.from_iterable(map(Statement.cast, obj))))
         else:
             if isinstance(obj, Statement):
                 return _StatementList([obj])