프로젝트에서 버전 번호를 유지하는 한 가지 방법은 모든 컴파일 중에 파일에서 숫자를 증분하는 것입니다. 이 작업을 수행하려면 스크립트가 파일을 구문 분석하여 번호를 찾고 증분한 다음 새 번호로 파일을 다시 작성해야 합니다. 파일이 짧고 숫자 외에 다른 파일이 거의 없는 경우 스크립트는 실행될 때마다 새 파일을 처음부터 작성하기만 하면 됩니다. 그러나 파일이 긴 디자인 파일인 경우 새 파일을 처음부터 작성하는 대신 버전 번호로 줄을 편집하는 것이 더 실용적일 수 있습니다.
번호 찾기
스크립트는 일반 표현식을 사용하여 파일의 번호를 찾습니다. 숫자가 있는 줄에는 고유한 형식이 있어야 하며, 그렇지 않으면 여러 줄이 일반 표현식과 일치할 수 있습니다. 고유한 형식을 만드는 한 가지 방법은 번호가 있는 줄에 고유한 주석을 포함하는 것입니다. 일반 표현식에는 해당 고유 주석이 포함될 수 있습니다. 다음은 특수 주석이 포함된 버전 번호 줄이 있는 설계 파일의 줄과 일치하는 일반 표현식 Tcl 명령의 예입니다.
디자인 파일 라인
data_out <= 16'h41; 설계 버전 번호
정규식
regexp {^\s+data_out <= \d+'h([[[:xdigit:]]]+); // 디자인 버전 번호$} \ $line 일치 version_number
([[:xdigit:]]]+패턴은 1자리 이상의 1자리 숫자와 일치하며 version_number라는 일치 변수에 저장합니다.
숫자 증분
Tcl에서 16진수 증분할 수 있습니다. Tcl에서 16진수는 선행 0배로 표시됩니다. 버전 번호가 0배로 시작되지 않으면 숫자를 증분하기 전에 숫자를 기본 10으로 변환하는 것이 더 쉬울 수 있습니다. 16진수의 경우, 다음 명령은 10 6진수 문자열을 베이스 10으로 변환하고, 증분하고, 다시 16진수로 변환하는 예를 보여줍니다.
설정 hex_value "AA" 스캔 $hex_value "%x" decimal_value incr decimal_value new_hex_value [포맷 "%X" $decimal_value] # $new_hex_value는 이제 "AB"입니다.
파일 다시 작성
설계 파일이 짧고 버전 번호에 대한 정보만 포함되어 있는 경우 일련의 풋 명령을 사용하여 증분 번호가 있는 새 파일을 작성할 수 있습니다.
설계 파일이 길면 Tcl 스크립트에서 파일 내용을 하드 코딩하는 것이 비실용적이기 때문에 일반적으로 버전 번호의 줄만 변경하는 것이 더 쉽습니다.
다음 절차는 설계 파일을 구문 분석하고 버전 정보로 라인을 업데이트합니다. 일반 표현식과 일치하지 않는 선은 수정되지 않은 새 파일에 기록됩니다. 일반 표현식과 일치하는 줄에는 버전 번호가 증분된 다음 새 파일에 기록됩니다.
proc update_version_number { input_file output_file} { # 입력 파일을 열 수 없는 경우 오류를 반환합니다. {[catch {open $input_file} 입력] } { 반품 -코드 오류 $input } # 출력 파일을 열 수 없는 경우, {[catch {open $output_file w} 출력] } { 반품 -코드 오류 $output } # 입력 파일을 한 번에 한 줄씩 읽으면서 {-1 != [$input 라인 을 가져옵니다] } { 이 일반 표현식은 웹 페이지 상단 부근의 디자인 # 파일 라인과 관련이 있습니다. # 파일에 적합한 대로 변경해야 합니다. {[regexp {^\s+data_out <= \d+'h([[[:xdigit:]]]+); // 디자인 버전 번호$} \ $line 일치 version_number] } { # 10을 기본으로 변환하고 증분합니다. 스캔 $version_번호 "%x" decimal_value 인크 decimal_value 세트 new_version_number [포맷 "%X" $decimal_value] # 이전 regsub h${version_number} $line h${new_version_number} 행에 새 버전 번호 대체 } # 새 파일에 줄 쓰기 $output $line } $input 닫기 $output }</pre>
Tcl 스크립트에서 다음 예와 같이 절차를 호출할 수 있습니다. 이 예는 시스템 명령 프롬프트에서 Tcl 스크립트를 실행하고 스크립트에 대한 인수로 업데이트할 파일 이름을 제공한다고 가정하여 작성되었습니다.
{[catch { update_version_number $file_name $output_file_name } res] } {post_message -type .updated_version_number 경우 file_name [lindex $quartus(args) 0] 세트 output_file_name ${file_name}critical_warning .updated_version_number 설정 "버전 번호를 업데이트할 수 없습니다: $res" } {[catch { 파일 이름 바꾸기 -force $output_file_name $file_name} } } {post_message -type critical_warning \ "버전 번호를 업데이트할 수 없습니다. $res" } }