hdl.ast: hash-cons ValueKey.
This speeds up elaboration by ~10%.
This commit is contained in:
parent
4ee82c9584
commit
9d2cbbabb8
|
@ -1256,32 +1256,33 @@ class _MappedKeySet(MutableSet, _MappedKeyCollection):
|
||||||
class ValueKey:
|
class ValueKey:
|
||||||
def __init__(self, value):
|
def __init__(self, value):
|
||||||
self.value = Value.wrap(value)
|
self.value = Value.wrap(value)
|
||||||
|
|
||||||
def __hash__(self):
|
|
||||||
if isinstance(self.value, Const):
|
if isinstance(self.value, Const):
|
||||||
return hash(self.value.value)
|
self._hash = hash(self.value.value)
|
||||||
elif isinstance(self.value, (Signal, AnyValue)):
|
elif isinstance(self.value, (Signal, AnyValue)):
|
||||||
return hash(self.value.duid)
|
self._hash = hash(self.value.duid)
|
||||||
elif isinstance(self.value, (ClockSignal, ResetSignal)):
|
elif isinstance(self.value, (ClockSignal, ResetSignal)):
|
||||||
return hash(self.value.domain)
|
self._hash = hash(self.value.domain)
|
||||||
elif isinstance(self.value, Operator):
|
elif isinstance(self.value, Operator):
|
||||||
return hash((self.value.op, tuple(ValueKey(o) for o in self.value.operands)))
|
self._hash = hash((self.value.op, tuple(ValueKey(o) for o in self.value.operands)))
|
||||||
elif isinstance(self.value, Slice):
|
elif isinstance(self.value, Slice):
|
||||||
return hash((ValueKey(self.value.value), self.value.start, self.value.end))
|
self._hash = hash((ValueKey(self.value.value), self.value.start, self.value.end))
|
||||||
elif isinstance(self.value, Part):
|
elif isinstance(self.value, Part):
|
||||||
return hash((ValueKey(self.value.value), ValueKey(self.value.offset),
|
self._hash = hash((ValueKey(self.value.value), ValueKey(self.value.offset),
|
||||||
self.value.width, self.value.stride))
|
self.value.width, self.value.stride))
|
||||||
elif isinstance(self.value, Cat):
|
elif isinstance(self.value, Cat):
|
||||||
return hash(tuple(ValueKey(o) for o in self.value.parts))
|
self._hash = hash(tuple(ValueKey(o) for o in self.value.parts))
|
||||||
elif isinstance(self.value, ArrayProxy):
|
elif isinstance(self.value, ArrayProxy):
|
||||||
return hash((ValueKey(self.value.index),
|
self._hash = hash((ValueKey(self.value.index),
|
||||||
tuple(ValueKey(e) for e in self.value._iter_as_values())))
|
tuple(ValueKey(e) for e in self.value._iter_as_values())))
|
||||||
elif isinstance(self.value, Sample):
|
elif isinstance(self.value, Sample):
|
||||||
return hash((ValueKey(self.value.value), self.value.clocks, self.value.domain))
|
self._hash = hash((ValueKey(self.value.value), self.value.clocks, self.value.domain))
|
||||||
else: # :nocov:
|
else: # :nocov:
|
||||||
raise TypeError("Object '{!r}' cannot be used as a key in value collections"
|
raise TypeError("Object '{!r}' cannot be used as a key in value collections"
|
||||||
.format(self.value))
|
.format(self.value))
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return self._hash
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
if type(other) is not ValueKey:
|
if type(other) is not ValueKey:
|
||||||
return False
|
return False
|
||||||
|
@ -1358,6 +1359,7 @@ class ValueSet(_MappedKeySet):
|
||||||
|
|
||||||
class SignalKey:
|
class SignalKey:
|
||||||
def __init__(self, signal):
|
def __init__(self, signal):
|
||||||
|
self.signal = signal
|
||||||
if type(signal) is Signal:
|
if type(signal) is Signal:
|
||||||
self._intern = (0, signal.duid)
|
self._intern = (0, signal.duid)
|
||||||
elif type(signal) is ClockSignal:
|
elif type(signal) is ClockSignal:
|
||||||
|
@ -1366,7 +1368,6 @@ class SignalKey:
|
||||||
self._intern = (2, signal.domain)
|
self._intern = (2, signal.domain)
|
||||||
else:
|
else:
|
||||||
raise TypeError("Object '{!r}' is not an nMigen signal".format(signal))
|
raise TypeError("Object '{!r}' is not an nMigen signal".format(signal))
|
||||||
self.signal = signal
|
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash(self._intern)
|
return hash(self._intern)
|
||||||
|
|
Loading…
Reference in a new issue