วิธีหนึ่งในการคงหมายเลขเวอร์ชันไว้ในโครงการของคุณคือการเพิ่มขึ้นเป็นตัวเลขในไฟล์หนึ่งๆ ระหว่างการคอมไพล์ทุกครั้ง ในการทํางานนี้ สคริปต์ต้องแยกวิเคราะห์ไฟล์เพื่อค้นหาหมายเลข และเพิ่มหมายเลขเข้าไป แล้วเขียนไฟล์ใหม่ด้วยหมายเลขใหม่ หากไฟล์สั้นและมีหมายเลขเล็กๆ น้อยๆ สคริปต์ก็สามารถเขียนไฟล์ใหม่ตั้งแต่เริ่มต้นทุกครั้งที่ทํางาน อย่างไรก็ตาม หากไฟล์เป็นไฟล์ออกแบบที่ยาว คุณอาจแก้ไขบรรทัดด้วยหมายเลขเวอร์ชันแทนการเขียนไฟล์ใหม่ตั้งแต่เริ่มต้นได้
ค้นหาหมายเลข
สคริปต์ดังกล่าวจะใช้รูปแบบทั่วไปในการค้นหาหมายเลขในไฟล์ เส้นที่มีตัวเลขควรมีรูปแบบเฉพาะ มิเช่นนั้นหลายบรรทัดอาจตรงกับการแสดงออกปกติได้ วิธีหนึ่งที่จะทําให้รูปแบบเฉพาะคือการรวมความคิดเห็นเฉพาะลงในบรรทัดที่มีหมายเลข การแสดงออกทั่วไปอาจรวมถึงความคิดเห็นเฉพาะดังกล่าว ต่อไปนี้เป็นตัวอย่างของบรรทัดในไฟล์การออกแบบที่มีบรรทัดหมายเลขเวอร์ชันที่มีข้อคิดเห็นพิเศษ และคําสั่ง Tcl ของ expression ทั่วไปที่ตรงกับไฟล์นั้น
บรรทัดไฟล์ออกแบบ
data_out <= 16'h41; หมายเลขเวอร์ชันการออกแบบ
การแสดงออกปกติ
regexp {^\s+data_out <= \d+'h([[:xdigit:]]+), // หมายเลขเวอร์ชันการออกแบบ$} \ $line match version_number
รูปแบบ( [[:xdigit:]]+) จะจับคู่ตัวเลขฐานสิบหกที่มีตัวเลขอย่างน้อยหนึ่งหลักและบันทึกไว้เป็นตัวแปรการจับคู่ที่มีชื่อว่า version_number
หมายเลขที่เพิ่มขึ้น
คุณสามารถเพิ่มหมายเลขเลขฐานสิบหกใน Tcl ใน Tcl ตัวเลขเลขฐานสิบหกจะถูกระบุด้วยเลข 0x ชั้นนํา หากหมายเลขเวอร์ชันของคุณไม่ได้เริ่มต้นด้วย 0x อาจเป็นการง่ายกว่าที่จะแปลงหมายเลขเป็นเลขฐาน 10 ก่อนที่คุณจะเพิ่มหมายเลข สําหรับตัวเลขฐานสิบหก คําสั่งต่อไปนี้แสดงตัวอย่างการแปลงสตริงเลขฐานสิบหกเป็นค่าฐาน 10 โดยจะเพิ่มขึ้นและแปลงกลับเป็นเลขฐานสิบหก
ตั้งค่า hex_value decimal_valueการสแกน "AA" $hex_value "%x" decimal_value ตั้งค่า new_hex_value decimal_value incr [format "%X" $decimal_value] # $new_hex_value คือ "AB" แล้ว
เขียนไฟล์ใหม่
หากไฟล์ออกแบบสั้นและมีข้อมูลเกี่ยวกับหมายเลขเวอร์ชันเท่านั้น คุณสามารถใช้ชุดคําสั่ง puts เพื่อเขียนไฟล์ใหม่ด้วยหมายเลขที่เพิ่มขึ้น
หากไฟล์ออกแบบมีความยาว มักจะเปลี่ยนเฉพาะบรรทัดด้วยหมายเลขเวอร์ชันได้ง่ายกว่า เนื่องจากการเข้ารหัสอย่างหนักเนื้อหาของไฟล์ในสคริปต์ Tcl จะไม่สามารถทําได้
ขั้นตอนต่อไปนี้จะแยกวิเคราะห์ไฟล์การออกแบบและอัปเดตบรรทัดด้วยข้อมูลเวอร์ชัน บรรทัดที่ไม่ตรงกับการแสดงออกปกติจะถูกเขียนไปยังไฟล์ใหม่ซึ่งไม่ได้แก้ไข บรรทัดที่ตรงกับการแสดงออกปกติจะมีหมายเลขเวอร์ชันเพิ่มขึ้น จากนั้นจะถูกเขียนไปยังไฟล์ใหม่
proc update_version_number { input_file output_file} { # หากไม่สามารถเปิดไฟล์อินพุตได้ ให้ส่งคืนข้อผิดพลาด หาก { [ได้ {open $input_file} input] } { ข้อผิดพลาด return-code $input } # หากไม่สามารถเปิดไฟล์เอาต์พุตได้ ส่งคืนข้อผิดพลาด หาก { [open $output_file w} output] } { ข้อผิดพลาดในการส่งคืน -code $output } # อ่านไฟล์อินพุตทีละบรรทัด ในขณะที่ {-1 != [gets $input line] } { # การแสดงออกปกตินี้มีความเฉพาะเจาะจงสําหรับบรรทัด ไฟล์ design # ใกล้กับด้านบนของหน้าเว็บ # คุณต้องเปลี่ยนตามความเหมาะสมกับไฟล์ ของคุณ หาก { [regexp {^\s+data_out <= \d+'h([[:xdigit:]]]+); // หมายเลขเวอร์ชันการออกแบบ$} \ $line match version_number] } { # แปลงหมายเลขเวอร์ชันเลขฐานหกเป็นค่าฐานสิบและเพิ่มขึ้น สแกน $version_number "%x" decimal_valueชุดdecimal_value incr new_version_number [format "%X" $decimal_value] # แทนที่หมายเลขเวอร์ชันใหม่สําหรับ regsub เดิม h$version_number} $line บรรทัด h${new_version_number $output $line} ปิด$output$input }</ก่อน>
ในสคริปต์ Tcl คุณสามารถเรียกขั้นตอนต่างๆ ตามที่แสดงในตัวอย่างต่อไปนี้ ตัวอย่างถูกเขียนขึ้นโดยสมมติว่าคุณเรียกใช้สคริปต์ Tcl ที่พรอมท์คําสั่งของระบบ และระบุชื่อไฟล์เพื่ออัปเดตเป็นส่วนช่วยสําหรับสคริปต์
ตั้งค่าfile_name [lindex $quartus(args) 0] ตั้งค่าoutput_file_name ${file_name}.updated_version_number หาก { { update_version_number $file_name $output_file_name } } { post_message -พิมพ์ critical_warning "ไม่สามารถอัปเดตหมายเลขเวอร์ชัน: $res" } อื่น { หาก { { การแทนที่ { การเปลี่ยนชื่อไฟล์ -force $output_file_name $file_name } res ] } { post_message -type critical_warning \ "ไม่สามารถอัปเดตหมายเลขเวอร์ชัน: $res" }