[英]using flip flop operator to parse a block and regex on a verilog netlist
我正在嘗試修改如下所示的 verilog 網表:
module la_bla ( a b c d);
input a;
output;
inout c d;
uHBMN_1 X20 (.Z(en), .A(gg), .Q(qq), .EN(rr));
nch_mac M20 (.G(en), .D(gg), .B(qq), .S(rr));
pch_mac_svt M20 (.G(en), .D(gg), .B(qq), .S(rr));
endmodule
module la_bla2 ( aw b2 c1 dt);
input aw;
output b2;
inout c1 dt;
HBMN_2 X21 (.Z(en), .A(gg), .Q(qq), .EN(rr));
HBMN_3 X21 (.Z(env), .A(ggg7), .Q(qq), .EN(rr));
HBMN_4 X21 (.Z(en5), .A(gg), .Q(qq8), .EN(rr));
HBMN_5 X21 (.Z(en1), .A(gg), .Q(qq), .EN(rr));
endmodule
.
.
.
.
.
每次我發現一行以名為 :"nch_mac" 或 pct_mac_svt 的設備開頭時,我都想向 ALL 模塊內容添加注釋,但保持模塊語句和終端語句(輸入、輸出 inout)和 endmodule 語句不變。 我嘗試使用 perl 觸發器命令:
首先,我嘗試捕獲以 module 開頭並以 endmodule 結尾的塊。 然后我嘗試用正則表達式捕獲設備名稱。
我的問題是所需的設備名稱可以位於模塊語句中的任何位置 - 那么我如何注釋模塊內部的行呢?
我試過類似的東西:
while<FILE>{
if(/module/i.../endmodule/i){
if($_ =~/nch_mac|pch_mac_svt){ $newline=~ s/$_/\/\/$_/}
但這沒有用。
我想得到:
module la_bla ( a b c d);
input a;
output;
inout c d;
//uHBMN_1 X20 (.Z(en), .A(gg), .Q(qq), .EN(rr));
//nch_mac M20 (.G(en), .D(gg), .B(qq), .S(rr));
//pch_mac_svt M20 (.G(en), .D(gg), .B(qq), .S(rr));
endmodule
module la_bla2 ( aw b2 c1 dt);
input aw;
output b2;
inout c1 dt;
HBMN_2 X21 (.Z(en), .A(gg), .Q(qq), .EN(rr));
HBMN_3 X21 (.Z(env), .A(ggg7), .Q(qq), .EN(rr));
HBMN_4 X21 (.Z(en5), .A(gg), .Q(qq8), .EN(rr));
HBMN_5 X21 (.Z(en1), .A(gg), .Q(qq), .EN(rr));
endmodule
.
.
.
有什么建議嗎?
在決定如何打印它們之前,將這些行存儲在一個數組中:
use warnings;
use strict;
my $flag = 1;
my @lines;
while (<DATA>) {
if (/(input|output|inout|\bmodule)/) {
print;
$flag = 1;
}
elsif (/endmodule/) {
for my $line (@lines) {
$line = "//$line" unless $flag;
print $line
}
print;
@lines = ();
}
else {
push @lines, $_;
if (/nch_mac|pch_mac_svt/) {
$flag = 0;
}
}
}
__DATA__
module la_bla ( a b c d);
input a;
output;
inout c d;
uHBMN_1 X20 (.Z(en), .A(gg), .Q(qq), .EN(rr));
nch_mac M20 (.G(en), .D(gg), .B(qq), .S(rr));
pch_mac_svt M20 (.G(en), .D(gg), .B(qq), .S(rr));
endmodule
module la_bla2 ( aw b2 c1 dt);
input aw;
output b2;
inout c1 dt;
HBMN_2 X21 (.Z(en), .A(gg), .Q(qq), .EN(rr));
HBMN_3 X21 (.Z(env), .A(ggg7), .Q(qq), .EN(rr));
HBMN_4 X21 (.Z(en5), .A(gg), .Q(qq8), .EN(rr));
HBMN_5 X21 (.Z(en1), .A(gg), .Q(qq), .EN(rr));
endmodule
這是我的確切輸出:
module la_bla ( a b c d);
input a;
output;
inout c d;
//
//uHBMN_1 X20 (.Z(en), .A(gg), .Q(qq), .EN(rr));
//nch_mac M20 (.G(en), .D(gg), .B(qq), .S(rr));
//pch_mac_svt M20 (.G(en), .D(gg), .B(qq), .S(rr));
endmodule
module la_bla2 ( aw b2 c1 dt);
input aw;
output b2;
inout c1 dt;
HBMN_2 X21 (.Z(en), .A(gg), .Q(qq), .EN(rr));
HBMN_3 X21 (.Z(env), .A(ggg7), .Q(qq), .EN(rr));
HBMN_4 X21 (.Z(en5), .A(gg), .Q(qq8), .EN(rr));
HBMN_5 X21 (.Z(en1), .A(gg), .Q(qq), .EN(rr));
endmodule
如果您輸入的 Verilog 代碼比這更復雜,請使用適當的解析器,例如Verilog-Perl
這是我寫的完整代碼。 它有效,但可以改進。 例如,以“module”開頭的行可以擴展為幾行(可以是 2 行,可以是 100 行)但它總是以字符“;”結尾。
#!/usr/intel/bin/perl -w
use strict;
use Data::Dumper;
use Getopt::Long;
my $verilog1= "/p/ccd/wa/mlea/roodbridgetc/analog/roodbridgetc_9m1z1u/User_libs/libFlow/meny_lo cal/noam_tc_phy_ana_top/verilog/netlist";
my $verilog2= "/p/ccd/wa/mlea/roodbridgetc/analog/roodbridgetc_9m1z1u/User_libs/libFlow/meny_local/noam_tc_phy_ana_top/verilog/netlist2" ;
open(VERILOGA,"$verilog1") or die "Can't open original verilog file $verilog1 - $!\n";
open(VERILOGAA,">$verilog2") or die "Can't open destination verilog file $verilog2 - $!\n";
my $flag = 1;
my @lines =();
while (<VERILOGA>) {
if ($_ =~ /^input|^output|^inout|^module/) {
print VERILOGAA $_;
$flag = 1;
}
elsif($_ =~ /^\/\/|timescale|^`include|^\s*$/){print VERILOGAA $_ } ## this is for general information lines in verilog netlist
elsif($_ =~ /\s+{?\w+?(\[\d+\])?}?,?\s?\)?;?$/){print VERILOGAA $_ } ## this is for supporting the case that the "module line contain \n char or {} for bus or [*]
elsif($_ =~ /^\s+\)+?;$/){print VERILOGAA $_ }
elsif(/^endmodule/) {
for my $line (@lines) {
$line = "//$line" unless $flag;
print VERILOGAA $line;
}
print VERILOGAA $_;
@lines = ();
}
else{
push @lines, $_;
if(/^nch_mac
|^nch_18_mac
|^nch_svt_mac
|^nch_ulvt_dnw_mac
|^nch_lvt_mac
|^pch_lvt_mac
|^pch_18_mac
|^pch_svt_mac
|^nch_18_mac
|^pch_ulvt_mac
|^nch_ulvt_mac
|^crtmom_wo_rf
|^cfmom_2t_p80
|^nch_gate_sw
|^rhim_m
|^rhim_rf
|^nch_svt_dnw_mac
|^pwdnw
|^nch_lvt_dnw_mac
|^pch_18ud12_mac
|^pch_18ud15_mac
|^nch_ulvt_dnw_mac
/gx){
$flag = 0;
}#if
}#else
}#while
close VERILOGA;
close ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.