Скрипт TCL для сопоставления и извлечения подстроки, содержащей регулярное выражение - PullRequest
0 голосов
/ 31 октября 2019
module bist 
(

  output wire a,
  output wire b,
  output wire c,
  input wire a,
  input wire ben,
  input wire kite,
  input mb
);

assign a.kk = ak;
assign b.hs =jsj;
assign oo = jj;
assign ltest = ll;

endmodule

Теперь я использую тот же код, но не получаю желаемый результат

set filename_reverse_mapper "mod1.v"

# Read in the data; this is good even for pretty large files
set f_3 [open $filename_reverse_mapper]
set lines_3 [split [read $f_3] "\n"]
close $f_3

set match [lsearch -all -inline $lines_3 "input wire *"]

Но это дает мне нулевой результат, не могли бы вы сказать мне какие-либо проблемы в этом?

1 Ответ

1 голос
/ 31 октября 2019

Ну, во-первых, вы применяете команду regexp к списку, что не совсем рекомендуется. Как сейчас, вы можете обойтись без использования regexp, например так:

set filename_reverse_mapper "sram.sv"

# Read in the data; this is good even for pretty large files
set f_3 [open $filename_reverse_mapper]
set lines_3 [split [read $f_3] "\n"]
close $f_3

set match [lsearch -all -inline $f_3 "input wire *"]
# {input wire a;} {input wire ef;} {input wire gh;}

Оттуда вы можете зациклить и извлечь список ввода:

set input [lmap n $match {string map {";" ""} [lindex [split $n] end]}]
# a ef gh

РЕДАКТИРОВАТЬ:Что касается вашего редактирования, то поиск по регулярному выражению будет более подходящим из-за потенциальных пробелов:

set input [lsearch -all -inline -regexp $lines_3 {^ *input wire .*}]

Хотя вы можете использовать одно регулярное выражение для всего файла:

set filename_reverse_mapper "sram.sv"

# Read in the data; this is good even for pretty large files
set f_3 [open $filename_reverse_mapper]
set lines_3 [read $f_3]
close $f_3

set allMatches [regexp -inline -all -lineanchor {^(?:in|out)put wire ([^;]+);$} $lines_3]
# {input wire a;} a {input wire ef;} ef {input wire gh;} gh {output wire c;} c {output wire d;} d {output wire fin;} fin
set inputs [lmap {m n} $allMatches {if {[string match "input*" $m]} {set n} else continue}]
# a ef gh
set outputs [lmap {m n} $allMatches {if {[string match "output*" $m]} {set n} else continue}]
# c d fin

В приведенном выше регулярном выражении используются ^ и $, которые обычно соответствуют началу и концу строки соответственно, но с -lineanchor соответствует началу и концу строки в строке соответственно. ([^;]+) просто «захватывает» все, что не является точкой с запятой. -inline заставляет regexp возвращать фактические совпадения (в противном случае мы получаем количество совпадений), а -all заставляет его искать все возможные совпадения (а не просто останавливаться на первом совпадении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...