本文
主要介绍一款代码预处理工具:ep3(基于Perl语言开发)。
背景
- 主机: Thinkpad S2
- 系统: Deepin GNU/Linux 15.11
- 内核: Debian 6.3.0-18+deb9u1
- Perl: v5.24.1
参考
什么是ep3?
ep3是一款基于Perl语言开发的脚本工具,主要对代码中一些重复代码,通过脚本处理自动生成,以节省编码工作。
下载与安装
下载
安装
- 下载可执行程序的话,将其放到/usr/local/bin/目录(也可以是其他PATH变量下目录)下即可使用,无需安装。
- 下载安装包的话(详情可见readme),安装到/usr/local/bin/(需要root权限):
1
2
3
4
5
|
su
perl Makefile.PL
make
make test
make install
|
- 下载安装包的话(详情可见readme),安装到~/tool/bin/:
1
2
3
4
|
perl Makefile.PL PREFIX=~/tools/usr
make
make test
make install
|
使用命令
1
|
ep3 [option] source_file >result_file
|
option选项:
1
2
3
4
5
6
7
8
9
|
Usage: /usr/local/bin/ep3
[-include dir]
[-define key [value]]
[-delimeter string]
[-module modulename]
[-[no]comments]
[-[no]protect]
[-[no]depend]
file1 [file2 .. filen]
|
- -include: 指明include路径
- -define: 定义参数, 如 -define TYPE=1(参数赋值等号左右无空格)
- -nocomments: 去除文件中的注释
- -noprotect: 注释保护,默认是不对注释内容进行处理的,如果设为-noprotect,会处理注释内容
- -delimeter string: 默认是@,可以指定其他字符
- 其他参数:待学习,暂不清楚
使用场景
删除注释
使用命令 ep3 -nocomments filename.v >filename.v ,即可删除代码中所有注释内容。
循环
1
2
3
|
@for i =2 to 5
reg mem@i;
@endfor
|
- ep3 filename.v >filename.v 处理后
1
2
3
4
|
reg mem2;
reg mem3;
reg mem4;
reg mem5;
|
传递参数和条件判断
注意:ep3传递参数和带参数值的条件判断(@if和@elif和 @else 和@endif关键字),只能使用命令行传参使用。
1
2
3
4
5
6
7
8
9
|
@if TYPE == 0
reg TYPE_0;
@elif TYPE == 1
reg TYPE_1;
@elif TYPE == 2
reg TYPE_2;
@else
reg TYPE_3;
@endif
|
- ep3 -define TYPE=2 filename.v >filename.v 处理后(注意,TYPE=2,等号左右无空格;如果多个参数,每一个参数前都要有-define):
定义宏
- 原代码(也可以将宏定义内容放到某文件,在使用宏前进行include,效果相同,关于include的使用请参考下文):
1
2
3
|
@macro `A_WIDTH 8
reg [`A_WIDTH-1:0] sig1;
|
def判断
关键字:@ifdef和@ifndef和@else和@endif。
- 原代码(也可以将define定义内容放到某文件,在def判断前进行include,效果相同,关于include的使用请参考下文):
1
2
3
4
5
6
7
|
@define TYPE0_ON
@ifdef TYPE0_ON
reg TYPE_0;
@else
reg TYPE_1;
@endif
|
- 还可以使用@enum定义宏,一行定义多个,与@define效果相同
include
1
2
|
//include
@include "inc1.v"
|
- 创建inc1.v文件,其内容如下(如果是@define或@macro,换成对应内容即可):
- ep3关于include的查找默认是当前目录,使用 ep3 filename.v >filename.v 命令即可 ,如果非同一目录,可以在命令行指定目录 ep3 -include ./include/ filename.v >filename.v ,也可以在@include语句中指明文件目录,处理后如下:
1
2
3
|
//include
reg mem1;
reg mem2;
|
replace
replace以空格为分隔符,第一个参数作为被替换对象,其余作为替换内容。
1
2
3
|
@replace AA BB MM CC
This is AA;
|
perl_begin和perl_end
ep3支持在代码中使用perl语言生成代码,关键字是@perl_begin和@perl_end。
1
2
3
4
5
|
@perl_begin
for($i=0;$i<3;$i++) {
print "reg mem${i};\n";
}
@perl_end
|
1
2
3
|
reg mem0;
reg mem1;
reg mem2;
|
也可以使用perl语言定义子函数,辅助生成代码:
1
2
3
4
5
6
7
8
9
10
|
1 Text to be printed ...
@perl_begin
sub hello {
my $self = shift;
print "Hello there\n";
}
@perl_end
2 Text to be printed ...
@hello
3 Text to be printed ...
|
1
2
3
4
|
1 Text to be printed ...
2 Text to be printed ...
Hello there
3 Text to be printed ...
|
更多无耻要求
以上是常用场景,基本满足日常需求了,如有更多无耻要求,请查看相关资料,并且有解决方案的话,欢迎分享。
文章原创,可能存在部分错误,欢迎指正,联系邮箱 cao_arvin@163.com。