Source code for hwt.serializer.serializer_filter
from typing import Optional, Tuple
from hwt.serializer.mode import _serializeExclude_eval
from hwt.synthesizer.unit import Unit
[docs]class SerializerFilter(object):
"""
Base class for filters used to exclude some :class:`hwt.synthesizer.unit.Unit` instances from
target HDL (in order to prevent code duplication, archetype colisions etc.)
This base implementation keeps track about others objects and calls
_serializeDecision on the :class:`hwt.synthesizer.unit.Unit` instance to decide if instance should be excluded.
"""
[docs] def __init__(self):
self.serializedClasses = {} # type: Type[Unit]: Unit
# (unitCls, paramsValues) : unitObj
# where paramsValues are dict name:value
self.serializedConfiguredUnits = {}
[docs] def do_serialize(self, unit: Unit) -> Tuple[bool, Optional[Unit]]:
"""
Decide if this unit should be serialized or not eventually fix name
to fit same already serialized unit
:param obj: object to serialize
:param serializedClasses: dict {unitCls : unitobj}
:param serializedConfiguredUnits: (unitCls, paramsValues) : unitObj
where paramsValues are named tuple name:value
"""
assert isinstance(unit, Unit)
sd = unit._serializeDecision
if sd is None:
# the :class:`hwt.synthesizer.unit.Unit` instance does not have any filter function
return True, None
else:
# use UnitInstance filer function
prevPriv = self.serializedClasses.get(unit.__class__, None)
do_serialize, nextPriv, replacement = sd(unit, prevPriv)
self.serializedClasses[unit.__class__] = nextPriv
return do_serialize, replacement
[docs]class SerializerFilterAll(SerializerFilter):
"""
Ignore any serialization constraints and dump everything
"""
[docs] def do_serialize(self, unit: Unit) -> bool:
return True, None
[docs]class SerializerFilterDoNotExclude(SerializerFilter):
"""
Use all serialization specifications except @serializeExclude
Usefull when it is requred to dump all components for sim etc.
"""
[docs] def do_serialize(self, unit: Unit) -> bool:
orig = unit._serializeDecision
if orig is _serializeExclude_eval:
unit._serializeDecision = None
try:
return super(SerializerFilterDoNotExclude, self).do_serialize(unit)
finally:
unit._serializeDecision = orig