用于处理寄存器映射信息的数据结构
项目描述
r_map
用于处理寄存器映射数据的库。
数据源是抽象的,因此如果用户想要使用
特定数据源,他/她可以:
-
提供适当格式的序列化数据源(可能是
最简单)
-
创建源数据的解析器并动态生成数据
使用提供的数据类的结构
目的
-
轻松利用寄存器映射数据
-
能够从任意位置遍历寄存器映射
-
为数据遍历提供便利
-
提供序列化/反序列化数据的能力
-
提供机制来轻松子类基元素实现
-
提供方法来注册在数据库中访问哪些元素并创建
此数据的子树
特征
键和属性访问
对元素子元素的键和属性访问。访问的关键是
对于子元素碰巧有一个名字的情况特别有用
Python 中的保留关键字。
r_map1.reg.value = 10
r_map1['reg'].value = 10
该元素不打算通过基于键的分配添加到节点
像字典一样。_add为此提供了一个方法:
不支持基于密钥的分配,因为它可能导致
具有别名的子元素会令人困惑并且不太可能是用例。
简单迭代
基 Node 类支持迭代,因此由所有节点提供
子类。
例如:
for reg in reg_map:
for bf_ref in reg:
print(f"bitfield reference: {bf_ref.name} has value: {bf_ref.value}")
寄存器到位域值映射
寄存器的值基于其组件位域的值。事实上,有
是额外的间接层,以支持仅具有
位域的部分视图。因此,多个寄存器可以
可以访问相同的位域。对这个级别的支持是复杂的
进入数据结构并使用类建模:BitFieldRef。
使用带有节点的公共字典序列化完整的寄存器映射树
通过他们的 uuid 引用其他人。
例如:
"1b99635555e647638f8a1ff38a1e3cf1": {
"name": "root",
"type": "Node",
"children": [
"3e2f9ba277e44050b52b5111fd814008"
]
},
"3e2f9ba277e44050b52b5111fd814008": {
"name": "r_map1",
"descr": "An example register map containing r
"local_address": 268435456,
"type": "RegisterMap",
"children": [
"c897cf71021449bdbdc819e7255fcab7",
"569715f765f14ba09313796ee98b6db6"
]
},
"c897cf71021449bdbdc819e7255fcab7": {
"local_address": 0,
"name": "reg1",
"width": 32,
"type": "Register",
"children": [
"8cded8916e014bb3ab621e327f9c0ae8"
]
},
"8cded8916e014bb3ab621e327f9c0ae8": {
"reg_offset": 8,
"field_offset": 7,
"name": "bf1_ref",
"slice_width": 6,
"type": "BitFieldRef",
"children": [
"b138d3d5335442479f25ec4d57859cda"
]
},
"b138d3d5335442479f25ec4d57859cda": {
"access": "RW",
"name": "bf1",
"reset_val": 74565,
"width": 20,
"doc": "Some documentation to describe the bit
"type": "BitField",
"children": [
"ba75ebd0924a46f29f0dd1726fd5fb5f",
"36b5d3a221e6400bba2d76a303dac2c2"
]
},
"ba75ebd0924a46f29f0dd1726fd5fb5f": {
"name": "use_auto_inc",
"value": 20,
"type": "Enumeration"
},
"36b5d3a221e6400bba2d76a303dac2c2": {
"name": "use_auto_dec",
"value": 10,
"type": "Enumeration"
},
"569715f765f14ba09313796ee98b6db6": {
"local_address": 4,
"name": "reg2",
"width": 32,
"type": "Register",
"children": [
"14b8d11fea244200a6d0efee16d740f7",
"37a9c221ab77446aafe9f74ec14c78c6",
"6f695b3dbdd74cb3abaddf82c9594e4b"
]
},
"14b8d11fea244200a6d0efee16d740f7": {
"_alias": true,
"reg_offset": 0,
"field_offset": 0,
"name": "bf4_ref",
"slice_width": 2,
"_ref": "6f695b3dbdd74cb3abaddf82c9594e4b",
"type": "BitFieldRef"
},
"6f695b3dbdd74cb3abaddf82c9594e4b": {
"reg_offset": 5,
"field_offset": 2,
"name": "bf3_ref",
"slice_width": 5,
"type": "BitFieldRef",
"children": [
"28c6a9c6929a4ad2baabc18751ec21d3"
]
},
"28c6a9c6929a4ad2baabc18751ec21d3": {
"access": "R",
"name": "bf2",
"reset_val": 26505,
"width": 20,
"type": "BitField"
},
"37a9c221ab77446aafe9f74ec14c78c6": {
"_alias": true,
"reg_offset": 4,
"field_offset": 3,
"name": "bf2_ref",
"slice_width": 4,
"_ref": "8cded8916e014bb3ab621e327f9c0ae8",
"type": "BitFieldRef"
},
"root": "1b99635555e647638f8a1ff38a1e3cf1"
}
该_ref属性有助于建模一个节点可以是一个实例
其他。这节省了序列化中公共信息的重复
树。该_alias属性表示一个实例可以是
其他。这仅仅意味着新实例的位域将与
源节点。
r_map 类
通用属性
所有树对象都具有以下共同属性:
-
姓名
商品名称
-
描述
项目的简短描述
-
文档
项目的更长描述
请注意,descr 和 doc 属性可能为 None 或空
细绳。
还有其他常见的属性,但作为 r_map 树的用户,它们不是
出于兴趣。
注册地图
用于保存寄存器对象。
RegisterMap 属性
这个类的对象有:
-
地址
寄存器映射的起始地址。这可能不是非常有用,因为
最有趣的地址可能是子寄存器的地址。
-
本地地址
上述地址是通过对local_address求和动态找到的
使用树层次结构中父节点的 local_addresses。除非
您正在使用子类 FixedRegisterMap 其中 local_address ==
地址。
RegisterMap 方法
-
读
此方法可用于读取当前寄存器映射的数据并更新
子寄存器的值。它依赖于一个
_block_read_func函数已添加到它或树层次结构中的某个父级。
-
写
将寄存器映射的子寄存器值写入某个目的地。
请注意,如果相邻子寄存器之间存在间隙,则零是
写到那些地址。
此方法依赖于
_block_write_func已添加的 a。
登记
注册属性
此类的对象具有与 RegisterMap 对象相同的属性,并且在
另外还有一个width属性,表示寄存器的宽度。
这些是 RegisterMap 实例的子级。
寄存器具有以下附加属性:
-
价值
这是寄存器的当前值。它是基于动态计算的
来自所有子 BitFieldRefs 的当前值。可以赋值
也是直接的,并且该值将相应地更新子位域。
-
重置值
这是寄存器的复位值
-
使用权
这表示寄存器的访问级别,基于动态计算
在子 BitFieldRef 的访问级别上。如果不同的孩子有
不同的访问级别,它们将被
'|'.join一起编辑。
注册方法
-
读
此方法可用于读取当前寄存器的数据并更新
寄存器的值。它依赖于
_reg_read_func已添加的功能到它或树层次结构中的某个父级。
-
写
将寄存器的值写入某个目的地。与读取类似的工作
上面的功能,同样依赖于一个
_reg_write_func已经添加。
位域参考
这些对象代表寄存器中位域的贡献。他们
允许寄存器仅提供对位域的一部分的访问。
或者,它们还允许多个寄存器提供对公共的访问
位域或位域跨越多个寄存器。
BitFieldRef 属性
此类的对象是 Register 实例的子对象。他们有
以下附加属性:
-
reg_offset
这是主机寄存器中的偏移量,来自此的贡献
对象的子位域开始于。
-
切片宽度
这是此贡献的子位域的切片宽度
代表。
-
field_offset
这就像 reg_offset ,但它是孩子内的偏移量
此贡献来自的位域。
-
价值
这是子位域的贡献值,上移
reg_offset -
表示
value上述在重置时的情况。 -
男朋友
此属性返回位域引用的子位域。
位域
位域属性
此类的对象代表一个位域。
它们具有以下附加属性:
-
宽度
位域的宽度(以位为单位)
-
重置值
复位时该位域的值。
-
使用权
reset_val 的访问级别。这目前仅用于文档
清酒,但可以想象被用户使用。它将包含一个字符串
例如“RW”或“R”。
-
价值
这是位域的当前值。
位域
位域方法
-
重置
将此位域的值重置为 指定的值
reset_val。 -
注解
查找子注释的名称,其值是否与当前值匹配
值,否则返回十六进制值。
枚举
此类的对象用于表示枚举。他们是
位域对象。它们可以直接分配给 BitField 的值。
枚举属性
枚举对象有一个 value Attribute 来提供它的值。
笔记
-
_nb_attrsclass 属性用于控制每个序列化的内容类实例。