我们假设我有一个典型核心的模型,其中包含32位GPR(在下面的示例中用R
表示),而后者又是Bitstring
类型的对象,它提供了实现自定义切片方法的方法。
class core:
def __init__(self):
self.R = [Bitstring(0x0, 32) for reg in range(32)]
...
...
我可能会访问这些寄存器,这些寄存器分为两类:
Cat a) - >单次访问完整或部分注册:
Eg:core.R[10] = 0x1000 OR core.R[11][0:3] = 0x8
Cat b): - >多个语句分配同一寄存器的不同部分:
Eg:core.R[0][0:7] = core.R[10][28:31]
core.R[0][8:15] = 0x10
每当在上述任何一个类别中访问某个寄存器时,我都希望使用以下格式记录打印:
R r<num> <value>
Eg:R r10 0xaabbccdd
其中<num>
是0, 31
范围内的寄存器编号,<value>
是分配给该寄存器的值。
实现这一目标的最佳方法是什么?
答案 0 :(得分:0)
如果您需要这个来快速调试代码,您可以暂时将Bitstring
对象包装在与相关行为挂钩的代理中。代理可能看起来像:
class Proxy(object):
def __init__(self, proxied, outerindex):
self.proxied = proxied
self.outerindex = outerindex
def __getitem__(self, index):
logger.debug("Observing access of %r at %r:%r", (self.proxied, self.outerindex, index))
return self.proxied[index]
# __setitem__ similarly
在施工时,您需要将i
Bitstring
b
包裹在proxy(b, i)
中以访问记录器中的两个索引。这假设您在除Bitstring
之外的其他方法上不使用任何方法(或者您也必须将它们添加到代理中)。间接有一些成本并且有点难看,所以如果你想保留这个功能,你可能最好通过实现访问器方法并只登录core
的子类。