Verilog/System Verilog 파일에서 모듈 이름 및 인스턴스 이름 추출

Verilog/System Verilog 파일에서 모듈 이름 및 인스턴스 이름 추출

module_name과 instance_name을 추출하려는 Verilog/System Verilog 파일이 있습니다.

다음 한 줄에서 :

module_name #(.ANY_PARAMETER(.ANY_PARAMETER),.ANY_PARAMETER_1(.ANY_PARAMETER_1)) 인스턴스_이름 (.any_connection(any_connection));

출력은 다음과 같아야 합니다.

모듈 이름 인스턴스 이름

어떻게 해야 하나요?

답변1

우리는 균형을 맞추고 중괄호가 중첩된 상황을 처리해야 합니다 recursive regex.

먼저 대괄호 "("로 시작하는 정규식을 만든 $r다음 대괄호가 아닌 콘텐츠(* 때문에 존재하지 않을 수 있음)를 찾은 다음 대괄호가 아닌 콘텐츠에 대해 다시 반복하고 마지막으로 닫는 대괄호의 균형을 맞춥니다.

$ perl -lne '
    $r = qr/\( [^()]* (?:(??{ $r }) [^()]*)* \)/x;
    print $1 =~ y/\t #//dr while /\G([^()]*) $r/xg;
' file.sv

결과:

module_name
instance_name

답변2

주문하다.

awk '{for(i=1;i<=NF;i++){if (($i ~ /module/)||($i ~ /instance/)) print $i}}' filename

산출

module_name
instance_name

답변3

귀하의 파일은 다음 규칙을 따르는 것 같습니다.

  • 각 줄에는 정확히 세 개의 공백이 포함됩니다.
  • 모듈 이름은 첫 번째 공백 앞의 이름입니다.
  • 인스턴스 이름은 두 번째와 세 번째 공백 사이의 이름입니다.

이것이 잘못된 경우 더 나은 설명과 더 나은 예를 제공하도록 질문을 편집하십시오.

sed

사용하다sed 에스ubstitute( s) 명령을 사용하면 줄의 시작 부분부터 첫 번째 공백까지 실행되는 하나의 캡처 그룹과 두 번째 공백에서 세 번째 공백(끝점 제외)까지 실행되는 두 번째 캡처 그룹을 사용하여 전체 줄을 일치시킬 수 있습니다. 그런 다음 캡처된 두 문자열을 출력합니다.

sed 's/^\([^ ]* \)[^ ]* \([^ ]*\) .*/\1\2/'

PS 실제로 3개보다 많은 공백이 있고 인스턴스 이름이 두 번째에서 마지막과 마지막 사이에 있는 경우 대신 다음을 수행합니다.

sed 's/^\([^ ]* \).* \([^ ]*\) .*/\1\2/'

pcregrep

동일한 논리, 다른 도구:

pcregrep -o1 -o2 '^([^ ]* )[^ ]* ([^ ]*) .*'

-o1 -o2.\1\2

동일한 추신이 적용됩니다.

관련 정보