Ví dụ về Quartus® II Tcl: Số phiên bản gia tăng trong tập tin

Một cách để duy trì số phiên bản trong dự án của bạn là tăng một số trong tệp trong mỗi lần biên dịch. Để thực hiện tác vụ này, một lệnh phải phân tích cú pháp tệp để xác định vị trí số, gia tăng nó, sau đó ghi lại tệp bằng số mới. Nếu tệp ngắn và chứa ít nội dung khác bên cạnh số hiệu, tập lệnh có thể viết một tệp mới từ đầu mỗi khi tệp chạy. Tuy nhiên, nếu tệp là tệp thiết kế dài, việc chỉnh sửa dòng có số phiên bản sẽ thiết thực hơn thay vì viết một tệp mới từ đầu.

Xác định vị trí số

Tập lệnh sử dụng một biểu thức thông thường để xác định vị trí số trong tệp. Dòng có số nên có một định dạng duy nhất, nếu không, nhiều đường có thể khớp với biểu thức thông thường. Một cách để tạo một định dạng độc đáo là bao gồm một nhận xét duy nhất trên dòng có số. Biểu thức thông thường có thể bao gồm bình luận độc đáo đó. Dưới đây là một ví dụ về một dòng trong tệp thiết kế có dòng số phiên bản bao gồm một chú thích đặc biệt và lệnh Tcl biểu thức thông thường khớp với nó.

Dòng tệp thiết kế

data_out <= 16'h41; Số phiên bản thiết kế

Biểu thức thông thường

regexp {^\s+data_out <= \d+'h([[:xdigit:]]]+); // Số phiên bản thiết kế$} \ $line khớp với version_number

Mẫu ([:xdigit:]]+) khớp với một số lục phân có ít nhất một chữ số và lưu nó trong một biến đối sánh có tên version_number.

Gia tăng số

Bạn có thể gia tăng số lục phân trong Tcl. Trong Tcl, số lục phân được chỉ báo bằng 0x hàng đầu. Nếu số phiên bản của bạn không bắt đầu bằng 0 lần, việc chuyển đổi số thành số 10 cơ bản dễ dàng hơn trước khi bạn tăng số đó. Đối với một số lục phân, các lệnh sau đây sẽ hiển thị một ví dụ về việc chuyển đổi chuỗi lục phân sang chuỗi lục phân sang cơ sở 10, gia tăng nó và chuyển đổi nó trở lại hexadeciăn.

đặt hex_value quét "AA" $hex_value "%x" decimal_value incr decimal_value đặt new_hex_value decimal_value [định dạng "%X" $decimal_value] # $new_hex_value hiện là "AB"

Ghi lại tập tin

Nếu tệp thiết kế ngắn và chỉ chứa thông tin về số phiên bản, bạn có thể sử dụng một loạt các lệnh puts để viết ra một tệp mới với số gia tăng.

Nếu tệp thiết kế dài, việc thay đổi chỉ dòng với số phiên bản dễ dàng hơn, vì việc mã hóa cứng nội dung tệp trong lệnh Tcl sẽ không thực tế.

Các quy trình sau sẽ được phân tích cú pháp thông qua một tập tin thiết kế và cập nhật dòng với thông tin phiên bản. Các đường không khớp với biểu thức thông thường được viết vào một tệp mới, chưa được điều chỉnh. Dòng khớp với biểu thức thông thường có số phiên bản được gia tăng, sau đó được viết vào tệp mới.

proc update_version_number { input_file output_file} { # Nếu không thể mở tệp đầu vào, hãy trả lại lỗi. nếu { [lần truy cập {mở $input_file} đầu vào] } { lỗi mã trả lại $input } # Nếu không thể mở tệp đầu ra, trả lại lỗi nếu { [mở tệp $output_file w} đầu ra] } { lỗi mã trả lại $output } # Đọc qua một dòng tệp đầu vào tại một thời điểm trong khi {-1 != [được $input line] } { { # Biểu thức thông thường này dành riêng cho dòng tập tin thiết kế ở gần đầu trang web. # Bạn phải thay đổi nó khi phù hợp với tập tin của mình. nếu { [regexp {^\s+data_out <= \d+'h([[:xdigit:]]]);// Số phiên bản thiết kế$} \ $line khớp với version_number] } { { Chuyển đổi số phiên bản hexadeci đầy đủ thành cơ sở mười và gia tăng nó. quét $version_number "%x" decimal_value incr decimal_value đặt new_version_number [định dạng "%X" $decimal_value] # Thay thế số phiên bản mới vào cho một regsub h${version_number} $line dòng h${new_version_number} } # Ghi dòng vào tệp mới đặt $output $line } đóng $input đóng $output }</pre>

Trong kịch bản Tcl, bạn có thể gọi thủ tục như được hiển thị trong ví dụ sau. Ví dụ được viết với giả định rằng bạn chạy lệnh Tcl tại dấu nhắc lệnh hệ thống và cung cấp tên tệp để cập nhật dưới dạng tham số cho lệnh.

đặt file_name [lindex $quartus(args) 0] đặt output_file_name ${file_name}.updated_version_number nếu { [đánh dấu { update_version_number $file_name $output_file_name } res] } { post_message -gõ critical_warning "Không thể cập nhật số phiên bản: $res" } khác { nếu { [nén { tên tệp -force $output_file_name $file_name } res ] } { post_message -type critical_warning \ "Không thể cập nhật số phiên bản: $res" } }

Nội dung gốc bằng tiếng Anh trên trang này vừa do con người vừa do máy dịch. Nội dung này chỉ để cung cấp thông tin chung và giúp quý vị thuận tiện. Quý vị không nên tin đây là thông tin hoàn chỉnh hoặc chính xác. Nếu có bất kỳ mâu thuẫn nào giữa bản tiếng Anh và bản dịch của trang này, thì bản tiếng Anh sẽ chi phối và kiểm soát. Xem phiên bản tiếng Anh của trang này.