Source code for basil.RL.RegisterLayer
#
# ------------------------------------------------------------
# Copyright (c) All rights reserved
# SiLab, Institute of Physics, University of Bonn
# ------------------------------------------------------------
#
try:
from collections.abc import Callable # noqa
except ImportError:
from collections import Callable # noqa
from basil.dut import Base
[docs]
class RegisterLayer(Base):
def __init__(self, driver, conf):
super(RegisterLayer, self).__init__(conf)
self._drv = driver
def init(self):
super(RegisterLayer, self).init()
def __getattr__(self, name):
if not self.is_initialized: # this test allows attributes to be set in the __init__ method
raise AttributeError("'%s' has no attribute '%s'" % (self.__class__.__name__, name))
else:
attr = getattr(self._drv, name)
# for compatibility with RegisterHardwareLayer:
# prevent wrting to a register twice
if not isinstance(attr, Callable):
return attr
def method(*args, **kargs):
arg = ()
if "arg_names" in self._conf:
for i in range(len(args)):
kargs[self._conf["arg_names"][i]] = args[i]
else:
arg = args
if "arg_add" in self._conf:
for argn in self._conf["arg_add"]:
kargs[argn] = self._conf["arg_add"][argn]
return attr(*arg, **kargs)
return method
def __setattr__(self, name, value):
if not self.is_initialized: # this test allows attributes to be set in the __init__ method
super(RegisterLayer, self).__setattr__(name, value)
else:
try:
setattr(self._drv, name, value)
except Exception:
super(RegisterLayer, self).__setattr__(name, value)