yosys深入研究和演示(2) --- 正则表达式

原创 硬件电路设计与研究 2021-07-06 13:04

        yosys综合的开始于frontend,比如read_verilog,其读入原始verilog设计文件,并转化为yosys内部的表述格式(RTLIL),那么它是如何做到转化的?其中涉及大家在编译原理课程中讲述的内容: 词法分析、语法分析、语义分析、中间语言。

        最基础的就是词法分析,词法分析也称为 分词 ,此阶段编译器从左向右扫描源文件,将其字符流分割成一个个的  ( token 、 记号 ,后文中将称为 token )。所谓 token ,就是源文件中不可再进一步分割的一串字符,类似于英语中单词,或汉语中的词。


编译器中的 token 中一般用一个 struct 来表示,比如:

typedef enum {
       T_IF, T_WHILE, T_ADD, T_INTCONSTANT, 

    T_STRINGCONSTANT, T_IDENTIFIER, ...
} TokenType;

typedef struct _Token {
TokenType type;
           union {
                   char *stringval;
                   int *intval;
                   double *doubleval;
           } value ;
} TokenRecord;


        词法分析器每扫描到一个完整的 token 后,立即 在链表中插入新建一个 TokenRecord ,将此 token 的类型记录在新插入的TokenRecord结构的 type 域中,将其字面值记录在 value 域中,然后接着扫描下一个 token 。

        分词扫描一般采用正则表达式匹配扫描法,正则表达式 (Regular Expression ,常简写为 regex 、 regexp 或 RE ),又称 正规表示式 、 正规表示法 、 规则运算式 ,是 计算机科学 的一个概念。

正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的 字符串 。正则表达式一般都采用一些简写的方式,规则较多,这里只列举最常见的规则:

1)特殊字符

以下个字符:* [ ] ^ $ . | ? * + ( ) 被保留作特殊用途,如果想使用这些字符的字面值,需要在前面加反斜杠 “\” 转义。另外,非打印的字符或者有特殊含义的不便书写的符号可以通过在前面加 “\” 转义,如 \n 和 \t 分别表示换行符和制表符。


2)字符集

例如:[abferx] ,用方括号括起来的字符,表示匹配这些字符中的其中一个,相当于 (a|b|f|e|r|x) 。方括号内的特殊字符不需要转义( [ ] - ^ 除外),如 [af({] 表示 匹配 “a”, “f”, “{”, “(” 中的其中一个。方扩号内可以使用 “-“ 来定义一个范围,且可以定义多个范围,如 [0-9] 表示匹配单个数字, [a-zA-Z] 表示匹配单个字母。


3)取反字符集

例如:[^abc] ,在方括号内的第一个字符为 ^ ,表示这是一个取反字符集,表示匹配一个不在方括号内部的字符。


4)*、?和+

* 表示匹配前面的字符、或者由括号括起来的表达式、或者方括号括起来的字符集,匹配0次  或多次;

? 表示匹配前面的字符、或者由括号括起来的表达式、或者方括号括起来的字符集,匹配0次或1次;

+ 表示匹配前面的字符、或者由括号括起来的表达式、或者方括号括起来的字符集,匹配1次或多次。


5)”.” 通配符

. 表示匹配除换行符外的任意字符一次。


6){n}

n 是一个非负整数,表示精确匹配 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o


7){n,}

n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。


8){n,m}

m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将只匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。


9)定位符

定位符能够将正则表达式固定到行首或行尾,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。

正则表达式的限定符有:

^

匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性

,^ 还会与 \n 或 \r 之后的位置匹配。

$

匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性

,$ 还会与 \n 或 \r 之前的位置匹配。

\b匹配一个字边界,即字与空格间的位置。
\B非字边界匹配。

10)选择、反向引用....




举例演示:

[0-9]+

+前面是[0-9],表示是至少匹配[0-9]一次,整个意思就是当输入是整数时匹配成功,表示找到了一个整数


[0-9]+\.[0-9]*

表示找到了一个小数,其分为为三段, [0-9]+ 和\.和[0-9]*

此处.不是代表任意一个字符,就是小数点的意思,故使用了转义\


[1-9][0-9]*

可以匹配1、21、321、6089....,但不匹配0


\”[^\”]*\”

匹配一个字符串


标识符 : [_a-zA-Z][_a-zA-Z0-9]*


runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少匹配出现一次(1次或多次)


runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不匹配出现,也可以匹配出现一次或者多次(0次、或1次、或多次)。

colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以匹配出现一次(0次、或1次)



yosys的实现原理上和编译器非常相似:普通编译器,比如c/c++,是把c/c++语言的程序翻译为机器码,而yosys是把原始输入的行为描述verilog设计,映射翻译为标准库或LUT等资源表述的结构性verilog语言,这种映射变换,首先就是词法分析、语法分析、语义分析、抽象语法树、中间语言,这些和普通编译器都是一样的,不同之处就在于yosys加入了各种逻辑优化、逻辑映射。


更多信息和内容,也可关注即将上线www.scuzy.cn,其中会有惊喜,比如免费使用的、专门针对国产FPGA设计的c/c++/java综合器

硬件电路设计与研究 研究riscv架构处理器、敏捷软件开发、IC设计、模拟电路设计、高速电路设计仿真等
评论
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 120浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 103浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 116浏览
  • TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳定等特点。适用于投影仪的无感自动对焦和梯形校正、AIoT、手势识别、智能面板和智能灯具等多种场景。                 如果用ND06进行手势识别,只需要经过三个步骤: 第一步&
    esad0 2024-12-04 11:20 58浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 102浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 111浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 68浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 119浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 73浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 87浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦