ตัวอย่าง Quartus® II Tcl: หมายเลขเวอร์ชั่นที่เพิ่มขึ้นในไฟล์

author-image

โดย

วิธีหนึ่งในการคงหมายเลขเวอร์ชันไว้ในโครงการของคุณคือการเพิ่มขึ้นเป็นตัวเลขในไฟล์หนึ่งๆ ระหว่างการคอมไพล์ทุกครั้ง ในการทํางานนี้ สคริปต์ต้องแยกวิเคราะห์ไฟล์เพื่อค้นหาหมายเลข และเพิ่มหมายเลขเข้าไป แล้วเขียนไฟล์ใหม่ด้วยหมายเลขใหม่ หากไฟล์สั้นและมีหมายเลขเล็กๆ น้อยๆ สคริปต์ก็สามารถเขียนไฟล์ใหม่ตั้งแต่เริ่มต้นทุกครั้งที่ทํางาน อย่างไรก็ตาม หากไฟล์เป็นไฟล์ออกแบบที่ยาว คุณอาจแก้ไขบรรทัดด้วยหมายเลขเวอร์ชันแทนการเขียนไฟล์ใหม่ตั้งแต่เริ่มต้นได้

ค้นหาหมายเลข

สคริปต์ดังกล่าวจะใช้รูปแบบทั่วไปในการค้นหาหมายเลขในไฟล์ เส้นที่มีตัวเลขควรมีรูปแบบเฉพาะ มิเช่นนั้นหลายบรรทัดอาจตรงกับการแสดงออกปกติได้ วิธีหนึ่งที่จะทําให้รูปแบบเฉพาะคือการรวมความคิดเห็นเฉพาะลงในบรรทัดที่มีหมายเลข การแสดงออกทั่วไปอาจรวมถึงความคิดเห็นเฉพาะดังกล่าว ต่อไปนี้เป็นตัวอย่างของบรรทัดในไฟล์การออกแบบที่มีบรรทัดหมายเลขเวอร์ชันที่มีข้อคิดเห็นพิเศษ และคําสั่ง 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"
}

เนื้อหาในหน้านี้เป็นการผสมผสานระหว่างการแปลเนื้อหาต้นฉบับภาษาอังกฤษโดยมนุษย์และคอมพิวเตอร์ เนื้อหานี้จัดทำขึ้นเพื่อความสะดวกของคุณและเพื่อเป็นข้อมูลทั่วไปเท่านั้นและไม่ควรอ้างอิงว่าสมบูรณ์หรือถูกต้อง หากมีความขัดแย้งใด ๆ ระหว่างเวอร์ชันภาษาอังกฤษของหน้านี้กับคำแปล เวอร์ชันภาษาอังกฤษจะมีผลเหนือกว่าและควบคุม ดูเวอร์ชันภาษาอังกฤษของหน้านี้