Source code for hwt.serializer.mode
"""
Serializer mode specifies if hdl objects derived from parent unit
should be serialized to target HDL or not
use serialize* methods to specify serialization mode for unit class
.. code-block:: python
@serializeExclude
class MyHwModule(HwModule):
# ...
pass
"""
from collections import namedtuple
from typing import Type
from hwt.doc_markers import internal
[docs]
@internal
def freeze_dict(data):
keys = sorted(data.keys())
if keys:
frozen_type = namedtuple(''.join(keys), keys)
else:
return tuple()
return frozen_type(**data)
[docs]
@internal
def hwParamsToValTuple(module: "HwModule"):
# [TODO] check sub params
d = {}
for p in module._hwParams:
v = p.get_value()
d[p._name] = v
return freeze_dict(d)
[docs]
def serializeExclude(cls: Type["HwModule"]):
"""
Never serialize HDL objects from this class
"""
cls._serializeDecision = staticmethod(_serializeExclude_eval)
return cls
[docs]
def serializeOnce(cls: Type["HwModule"]):
"""
Serialize HDL objects only once per class
"""
cls._serializeDecision = staticmethod(_serializeOnce_eval)
return cls
[docs]
def serializeParamsUniq(cls: Type["HwModule"]):
"""
Decide to serialize only when parameters are unique
"""
cls._serializeDecision = staticmethod(_serializeParamsUniq_eval)
return cls
[docs]
@internal
def _serializeExclude_eval(parentModule: "HwModule", priv):
"""
Always decide not to serialize obj
:param priv: private data for this function first unit of this class
:return: tuple (do serialize this object, next priv, replacement unit)
"""
# do not use this :class:`hwt.hwModule.HwModule` instance and do not use any replacement
# (useful when the :class:`hwt.hwModule.HwModule` instance is a placeholder for something
# which already exists in hdl word)
if priv is None:
priv = parentModule
return False, priv, None
else:
return False, priv, priv
[docs]
@internal
def _serializeOnce_eval(parentModule: "HwModule", priv):
"""
Decide to serialize only first obj of it's class
:param priv: private data for this function
(first object with class == obj.__class__)
:return: tuple (do serialize this object, next priv, replacement unit)
where priv is private data for this function
(first object with class == obj.__class__)
"""
if priv is None:
priv = parentModule
serialize = True
replacement = None
# use this :class:`hwt.hwModule.HwModule` instance and store it for later use
else:
# use existing :class:`hwt.hwModule.HwModule` instance
serialize = False
replacement = priv
return serialize, priv, replacement
[docs]
@internal
def _serializeParamsUniq_eval(parentModule: "HwModule", priv):
"""
Decide to serialize only objs with unique parameters and class
:param priv: private data for this function
({frozen_params: obj})
:return: tuple (do serialize this object, next priv, replacement unit)
"""
params = hwParamsToValTuple(parentModule)
if priv is None:
priv = {}
try:
prevModule = priv[params]
except KeyError:
priv[params] = parentModule
# serialize new
return True, priv, None
# use previous :class:`hwt.hwModule.HwModule` instance with same config
return False, priv, prevModule