代码预处理工具ep3的使用

本文

主要介绍一款代码预处理工具:ep3(基于Perl语言开发)。

版本 说明
0.1 初版发布

背景

  • 主机: 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):
1
reg TYPE_2;

定义宏

  • 原代码(也可以将宏定义内容放到某文件,在使用宏前进行include,效果相同,关于include的使用请参考下文):
1
2
3
@macro `A_WIDTH 8

reg [`A_WIDTH-1:0] sig1;
  • 处理后:
1
reg [8-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
  • 处理后:
1
reg TYPE_0;
  • 还可以使用@enum定义宏,一行定义多个,与@define效果相同
1
@enum a,b,c,d

include

  • 原代码:
1
2
//include
@include "inc1.v"
  • 创建inc1.v文件,其内容如下(如果是@define或@macro,换成对应内容即可):
1
2
reg mem1;
reg mem2;
  • 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;
  • 处理后
1
This is BB MM CC;

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语言定义子函数,辅助生成代码:

  • 原代码(定义了@hello函数):
 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 ...
  • 处理后(在“2 Text”后引入@hello):
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。