python systemrdl 使用实例

         今天来看一个具体实例,上一篇传送门:python SystemRDL 包介绍_Bug_Killer_Master的博客-CSDN博客

         通常来说,我们验证过程用到的情况大多都是需要提取reg field的路径以及reset 值等信息,所以比较常见的一种方法就是先把rdl compile+elaborate 成Node信息,然后输出成json文件,因为Python 在其标准库中有一个优秀的 JSON 序列化程序。这意味着我们需要做的就是将寄存器模型中的信息提取为原始数据类型,这些数据类型可以很好地转换为JSON。当然我们需要的所有信息都可以放到json文件中以便我们进一步使用。

          下面就是转成json的例子,首先假设我们的json文件里面各个层级的信息如下:

 1. convert_field

def convert_field(rdlc: RDLCompiler, obj: node.FieldNode) -> dict:json_obj = dict()json_obj['type'] = 'field'json_obj['inst_name'] = obj.inst_namejson_obj['lsb'] = obj.lsbjson_obj['msb'] = obj.msbjson_obj['reset'] = obj.get_property('reset')json_obj['sw_access'] = obj.get_property('sw').namereturn json_obj

    FieldNode的所有property参考链接:SystemRDL Property Reference — SystemRDL Compiler documentation (systemrdl-compiler.readthedocs.io)

   2. convert_reg

def convert_reg(rdlc: RDLCompiler, obj: node.RegNode) -> dict:if obj.is_array:# Use the RDL Compiler message system to print an error# fatal() raises RDLCompileErrorrdlc.msg.fatal("JSON export does not support arrays",obj.inst.inst_src_ref)# Convert information about the registerjson_obj = dict()json_obj['type'] = 'reg'json_obj['inst_name'] = obj.inst_namejson_obj['addr_offset'] = obj.address_offset# Iterate over all the fields in this reg and convert themjson_obj['children'] = []for field in obj.fields():json_field = convert_field(rdlc, field)json_obj['children'].append(json_field)return json_obj

RegNode的所有property参考链接:

3.covert_addrmap_or_regfile

def convert_addrmap_or_regfile(rdlc: RDLCompiler, obj: Union[node.AddrmapNode, node.RegfileNode]) -> dict:if obj.is_array:rdlc.msg.fatal("JSON export does not support arrays",obj.inst.inst_src_ref)json_obj = dict()if isinstance(obj, node.AddrmapNode):json_obj['type'] = 'addrmap'elif isinstance(obj, node.RegfileNode):json_obj['type'] = 'regfile'else:raise RuntimeErrorjson_obj['inst_name'] = obj.inst_namejson_obj['addr_offset'] = obj.address_offsetjson_obj['children'] = []for child in obj.children():if isinstance(child, (node.AddrmapNode, node.RegfileNode)):json_child = convert_addrmap_or_regfile(rdlc, child)elif isinstance(child, node.RegNode):json_child = convert_reg(rdlc, child)json_obj['children'].append(json_child)return json_obj

4.json dump

def convert_to_json(rdlc: RDLCompiler, obj: node.RootNode, path: str):# Convert entire register model to primitive datatypes (a dict/list tree)json_obj = convert_addrmap_or_regfile(rdlc, obj.top)# Write to a JSON filewith open(path, "w", encoding='utf-8') as f:json.dump(json_obj, f, indent=4)

5.top_function

import sys# Compile and elaborate files provided from the command line
input_files = sys.argv[1:]
rdlc = RDLCompiler()
try:for input_file in input_files:rdlc.compile_file(input_file)root = rdlc.elaborate()
except RDLCompileError:sys.exit(1)
# Dump the register model to a JSON file
convert_to_json(rdlc, root, "out.json")

input rdl:

addrmap tiny {reg {field {sw=rw;hw=r;} f1[8] = 123;field {sw=r;hw=w;} f2[8];}r1;
};

output json:

{"type": "addrmap","inst_name": "tiny","addr_offset": 0,"children": [{"type": "reg","inst_name": "r1","addr_offset": 0,"children": [{"type": "field","inst_name": "f1","lsb": 0,"msb": 7,"reset": 123,"sw_access": "rw"},{"type": "field","inst_name": "f2","lsb": 8,"msb": 15,"reset": null,"sw_access": "r"}]}]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/53400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络文件拆分—视频流加载、断点续传

视频流加载 视频流加载的原理是通过网络传输和播放器解码来实现的。 首先,视频文件会被分成一系列小的数据包,通常是以流的形式传输,这些数据包通过网络传输到用户设备。在传输过程中,可以采用各种协议,如HTTP、RTSP…

简析SCTP开发指南

目录 前言一、SCTP基本概念二、SCTP开发步骤1. **环境配置**:2. **建立Socket**:3. **绑定和监听**:4. **接收和发送数据**:5. **关闭连接**: 三、 C语言实现SCTP3.1SCTP客户端代码:3.2 SCTP服务器端代码&a…

识别图片中的文字

前言 PearOCR 是一款免费无限制网页版文字识别工具。 优点如下: 免费:完全免费,没有任何次数、大小限制,可以无限使用; 安全:全部数据本地运算,所有图片均不会被上传; 智能&#xf…

SQL注入之HTTP头部注入

文章目录 cookie注入练习获取数据库名称获取版本号 base64注入练习获取数据库名称获取版本号 user-agent注入练习获取数据库名称获取版本号 cookie注入练习 向服务器传参三大基本方法:GPC GET方法,参数在URL中 POST,参数在body中 COOKIE,参数…

OpenSIPS 通话中 UPDATE 请求导致没有声音问题

文章目录 1. 问题现象2. 抓包排查3. 问题分析及解决方案 1. 问题现象 在 SIP 应用的开发中,通话一端听不到声音是比较常见的问题。一般来说,没有声音意味着 RTP 传输存在障碍,追根究底就是网络不通或者端口未开放等原因。但在实践中&#xf…

Kotlin Flow 转换以及上下游处理

本片文章主要介绍Flow上下游处理,上游一个Flow使用map,上游两个Flow使用zip,上游三个Flow及以上使用combine 1、下面代码展示了upStreamFlow作为上游,downStreamFlow作为下游,通过对upStreamFlow使用map操作符函数将…

13.Oracle中nvl()与nvl2()函数详解

Oracle中nvl()与nvl2()函数详解: 函数nvl(expression1,expression2)根据参数1是否为null返回参数1或参数2的值; 函数nvl2(expression1,expression2,expression3)根据参数1是否为null返回参数2或参数3的值 1.nvl:根据参数1是否为null返回参数…

数据结构——图

文章目录 图的基本概念顶点边度无向图和有向图无权图和带权图 图的存储邻接矩阵存储邻接表存储 图的搜索广度优先搜索深度优先搜索 图是一种较为复杂的非线性结构。 为啥说其较为复杂呢? 根据前面的内容,我们知道: 线性数据结构的元素满足唯…

nodejs

文章目录 一、nodejs1.1、npm配置命令别名 一、nodejs 1.1、npm配置命令别名 我们可以使用“node index.js”的方式运行代码 也可以利用npm配置别名的方式运行代码 在package.json中配置别名,利用“npm run 别名”也可以运行 start是特殊的,可以“npm r…

ssm+Vue.js在线购物系统源码和论文

ssmVue.js在线购物系统源码和论文049 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势…

GPT---1234

GPT:《Improving Language Understanding by Generative Pre-Training》 下载地址:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdfhttps://cdn.openai.com/research-covers/language-unsupervised/language_understa…

保姆级使用vmware安装Ubuntu-server版

保姆级VMware安装Ubuntu20服务器版 文章目录 保姆级VMware安装Ubuntu20服务器版前期准备一、安装vmware二、下载Ubuntu镜像 VMware安装Ubuntu201. 启动Workstation Pro或者Workstation Player,进入软件后新建一个虚拟机2. 进入引导界面选择默认的即可3. 点击下一步即可4. 选择操…

Selenium超级详细的教程

Selenium是一个用于自动化测试的工具,它可以模拟用户在浏览器中的各种操作。除了用于测试,Selenium还可以用于爬虫,特别是在处理动态加载页面时非常有用。本文将为您提供一个超级详细的Selenium教程,以帮助您快速入门并了解其各种…

如何使用 Gson 将对象转换为 JSON 字符串

在现代的软件开发中,经常需要将 Java 对象转换为 JSON 字符串,以实现数据的序列化和传输。Gson 是一个流行的 Java 库,它提供了方便的方法来将对象转换为 JSON 字符串。本文将介绍使用 Gson 库的步骤,将一个对象转换为 JSON 字符串…

VR全景加盟会遇到哪些问题?全景平台会提供什么?

想创业,你是否也遇到这些问题呢?我是外行怎么办?没有团队怎么办?项目回本周期快吗?项目靠谱吗?加盟平台可信吗?等等这类疑问。近几年,VR产业发展迅速,尤其是VR全景项目在…

C++中内存的分配

一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。 2、堆区(heap) — 一般由程序员分配释放, 若程序…

Cypress 做 e2e 测试,如何在获得某个 checkbox 后先判断它是否被 check 然后再更改它的状态?

比如如果这个 checkbox 已经被 check 了,就不做操作,否则将它 check。 我们假设这个 checkbox 的 data-testid 属性是 VendorCodeCheckbox-0-test-id。Cypress 的代码如下: cy.getByTestId(VendorCodeCheckbox-0-test-id).shadow().find([r…

vue base64图片转file流 下载到本地 或者上传

<img :src"data:image/png;base64,form.img" style"max-width:280px;max-height: 280px;margin: auto;" />// base64 转file const base64ToFile()>{let byImg atob(form.img); // 解码base64let n byImg.lengthlet a new Uint8Array(n);while…