Tingkat Laporan Logika

author-image

Oleh

Ketika Anda menutup waktu pada desain, sering berguna untuk mengetahui berapa banyak tingkat logika yang berada di jalur yang gagal. Penganalisis Waktu menampilkan jumlah tingkat logika saat Anda melaporkan waktu untuk jalur, tetapi tidak ada laporan bawaan yang mencantumkan jumlah tingkat logika untuk serangkaian jalur. Contoh desain ini menentukan prosedur kustom yang dapat Anda gunakan untuk membuat laporan yang menunjukkan jumlah tingkat logika untuk serangkaian jalur.

Prosedur kustom mendukung argumen yang sama seperti perintah report_timing. Anda harus menggunakan opsi yang sama dengan prosedur kustom yang Anda lakukan dengan perintah report_timing. Prosedur kustom juga mendukung tiga opsi tambahan: -greater_than <value>, -less_than <value>, dan -file <report file>. Anda dapat menggunakan opsi -greater_than dan -less_than untuk membatasi pelaporan ke jalur dengan tingkat logika yang lebih besar atau kurang dari yang ditentukan. Anda dapat menggunakan opsi -file untuk menulis laporan ke berkas.

Prosedur kustom menampilkan jumlah tingkat logika untuk jalur dengan kenduran waktu terburuk. Ini tidak serta merta menampilkan jalur dalam desain dengan jumlah tingkat logika terbesar. Jalur dengan kendur waktu terburuk tidak selalu merupakan jalur dengan jumlah tingkat logika terbesar, meskipun itu sering terjadi.

Operasi Prosedur

Prosedur kustom menggunakan langkah-langkah berikut.

  1. Dapatkan daftar jalur yang memenuhi kriteria pelaporan
  2. Dapatkan jumlah tingkat logika untuk setiap jalur
  3. Tampilkan jumlah tingkat informasi logika dan jalur dalam bagan

Langkah 1: Dapatkan Daftar Jalur

Prosedur kustom menggunakan perintah get_timing_paths, yang mendukung argumen yang sama dengan perintah report_timing. Anda dapat menggunakan opsi apa pun untuk report_timing mengontrol analisis waktu. Misalnya, Anda dapat membatasi laporan jumlah tingkat logika ke jalur yang berakhiran nama register tertentu. Kode Tcl berikut menunjukkan definisi prosedur, dan meneruskan semua argumen ke perintah get_timing_paths.

proc report_levels_of_logic { args } {
    
    # Pass all arguments straight to get_timing_paths
    if { [catch { eval get_timing_paths $args } paths_col] } {
        post_message -type error $paths_col
        return }
}

Langkah 2: Dapatkan Jumlah Tingkat Logika untuk Setiap Jalur

Gunakan loop untuk iterasi pada pengumpulan jalur dalam variabel paths_col dan ekstrak jumlah tingkat logika di setiap jalur. Simpan informasi tentang jalur dalam struktur data matriks Tcl yang akan digunakan untuk mencetak hasil. Informasi yang disimpan adalah jumlah tingkat logika, kelambatan jalur, serta nama sumber dan node tujuan.

foreach_in_collection path_obj $paths_col {

        # Berapa banyak tingkat logika yang ada di jalurnya?
        set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Tambahkan
        
        informasi jalur ke matriks.
        $logic_levels_matrix tambahkan baris [list \
            $levels_of_logic \
            [get_path_info -slack $path_obj] \
            [get_node_info -name [get_path_info -from $path_obj]] \
            [get_node_info -name [get_path_info -to $path_obj]]
    ] }

Langkah 3: Tampilkan Informasi Jalur dalam Bagan

Terakhir, tampilkan semua informasi jalur yang disimpan dalam variabel matriks. Contoh ini menggunakan paket laporan Tcl untuk memformat matriks untuk mencetaknya. Kode berikut menambahkan baris judul ke matriks, menentukan gaya visual laporan, mengatur padding sel, dan menampilkan laporan.

# Masukkan baris header
        $logic_levels_matrix insert row 0 \
            [list "Levels of logic" "Slack" "From" "To"]
    
        # Kita perlu gaya yang didefinisikan untuk mencetak tabel hasil
        penangkapan { ::report::rmstyle basicrpt }
        ::report::d efstyle basicrpt {{cap_rows 1}} {
            data set        [split "[string repeat " "   [columns]];"]
            set atas         [split "[string repeat "+ - " [columns]]+"]
            set bawah      [top get]
            topcapsep   set [top get]
            topdata     set [data get]
            top enable
            topcapsep   enable bottom enable
            tcaption    $cap_rows
        } # Buat
        
        laporan, atur kolom untuk memiliki satu spasi padding, dan
        # cetak matriks dengan format
        tangkapan tertentu { r destroy }
        ::report::report r 4 style basicrpt
        untuk { set col 0 } { $col < [r columns]} { incr col } {
            r pad $col " "
        }
        post_message "Tingkat logic\n[r printmatrix $logic_levels_matrix]"

Prosedur Kustom

Kode untuk prosedur kustom yang tercantum di bawah ini mencakup opsi untuk menulis laporan ke file, dan untuk membatasi jalur yang dilaporkan kecuali jumlah tingkat logika lebih besar atau kurang dari nilai yang ditentukan pengguna.

Ini adalah beberapa contoh bagaimana Anda dapat menggunakan prosedur kustom.

  • report_levels_of_logic -setup -greater_than 10 -to [get_registers data*] -npaths 1000
  • report_levels_of_logic -hold -from_clock core_50 -npaths 50 -file levels.txt

Untuk menggunakan prosedur kustom, simpan kode Tcl di bawah ini dalam file yang bernama report_levels_of_logic.tcl. Kemudian gunakan sumber perintah report_levels_of_logic.tcl di prompt Timing Analyzer Tcl. Pengadaan file menentukan prosedur kustom. Anda kemudian dapat menggunakan perintah yang baru ditentukan report_levels_of_logic hingga Anda keluar dari Penganalisis Waktu.

paket memerlukan paket cmdline
memerlukan struct::matrix
package require report

proc report_levels_of_logic { args } {

    set options {
        {"less_than.arg" "" "Limit to paths with less than this number" }
        { "greater_than.arg" "" "Limit to paths with greater than this number" }
        { "file.arg" "" "Output file name"
        
    } } } array set
    opts [:cmdline::getKnownOptions args $options]

    # Pastikan bahwa prosedur dipanggil dengan beberapa argumen
    jika { [string equal "" $opts(less_than)] && [string equal "" $opts(greater_than)] } {
        post_message -type warning "Anda harus menentukan nilai numerik\
            untuk return -less_than atau -greater_than"
        } # Pastikan bahwa prosedur disebut dengan nilai argumen
    
    numerik
    jika { ![ string adalah double $opts(less_than)] } {
        post_message -type warning "Anda harus menentukan nilai numerik\
            untuk -less_than"
        return } jika {
    ![ string adalah double $opts(greater_than)] } {
        post_message -type warning "Anda harus menentukan nilai numerik\
            untuk return -greater_than"
        } # Membuat
    
    matriks untuk menyimpan informasi tentang jalur gagal
    yang diatur logic_levels_matrix [::struct::matrix]
    $logic_levels_matrix add columns 4

    # Pass all unknown arguments straight to get_timing_paths
    if { [catch { eval get_timing_paths $args } paths_col] } {
        post_message -type error $paths_col
        return
    }
    
    # Tembus daftar jalur waktu, dapatkan informasi
    # tentang tingkat logika
    foreach_in_collection path_obj $paths_col {
    
        # Asumsikan jalur akan dilaporkan, kecuali jumlah tingkat
        logika # berada di luar batas yang ditentukan.
        set include_path 1
        
        # Berapa banyak tingkat logika yang ada di jalurnya?
        set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Jika
        
        kami menentukan batas yang lebih rendah, kami tidak melaporkan jalur jika
        tingkat # logika lebih besar atau sama dengan batas bawah
        jika {! [string sama dengan "" $opts(less_than)] } {
            if { $levels_of_logic >= $opts(less_than) } { set include_path
                0 } }
            # Jika kami menentukan batas
        
        atas, kami tidak melaporkan jalur jika tingkat
        # logika kurang dari atau sama dengan batas atas
        jika { ! [string sama dengan "" $opts(greater_than)] } {
            if { $levels_of_logic <= $opts(greater_than) } { set include_path
                0
            } }
        # Jika jalur memiliki
        
        tingkat logika yang masuk dalam batas kita,
        # laporkan di atasnya
        jika { $include_path } {
        
            $logic_levels_matrix add row [list \
                $levels_of_logic \
                [get_path_info -slack $path_obj] \
                [get_node_info -name [get_path_info -from $path_obj]] \
                [get_node_info -name [get_path_info -to $path_obj]] ]
        } }
    }
    # Selesai melewati semua jalur dari get_timing_paths
    
    # Jika ada baris dalam matriks, jalur cocok dengan kriteria.
    # Kita harus mencetak tabel dengan informasi tersebut.
    jika { 0 == [$logic_levels_matrix rows] } {
    
        # Tidak ada jalur yang memenuhi kriteria # Cetak pesan singkat post_message
        "Tidak ada jalur yang memenuhi kriteria untuk melaporkan tingkat logika"
        
        # Jika ada kesalahan saat membuka file, cetak pesan yang mengatakan
        # itu. Jika tidak, katakanlah tidak ada jalur yang memenuhi kriteria
        jika {! [string sama dengan "" $opts(berkas)] } {
            if { [catch { open $opts(file) w } fh] } {
                post_message -type error "Tidak dapat membuka file: $fh"
            } else { menempatkan $fh
                "Tidak ada jalur yang memenuhi kriteria untuk melaporkan tingkat logika"
                penangkapan { close $fh
            } } } } else { # Masukkan ke
        baris header
        $logic_levels_matrix insert row 0 \
            [list "Levels of logic" "Slack" "From" "To"]
    
        # Kita perlu gaya yang didefinisikan untuk mencetak tabel hasil
        penangkapan { :: report::rmstyle basicrpt }
        ::report::d efstyle basicrpt {{cap_rows 1}} {
            data        set [split "[string repeat " "   [columns]];"]
            set atas         [split "[string repeat "+ - " [columns]]+"]
            set bawah      [top get]
            topcapsep   set [top get]
            topdata     set [data get]
            top enable
            topcapsep   enable bottom enable
            tcaption    $cap_rows
        } # Buat
        
        laporan, atur kolom untuk memiliki satu spasi padding, dan
        # cetak matriks dengan format
        tangkapan tertentu { r destroy }
        ::report::report r 4 style basicrpt
        untuk { set col 0 } { $col < [r columns]} { incr col } {
            r pad $col " "
        }
        post_message "Tingkat logika\n[r printmatrix $logic_levels_matrix]"
        
        # Simpan laporan ke file jika nama file ditentukan jika {
        ! [string sama dengan "" $opts(berkas)] } {
            if { [catch { open $opts(file) w } fh] } {
                post_message -type error "Tidak bisa membuka file: $fh"
            } else { menempatkan $fh
                "Tingkat logika"
                r printmatrix2channel $logic_levels_matrix $fh
                penangkapan { close $fh }
            } } }
}

Isi halaman ini adalah kombinasi terjemahan manusia dan komputer dari konten berbahasa Inggris. Konten ini diberikan hanya untuk kenyamanan Anda serta sebagai informasi umum dan tidak bisa dianggap sebagai lengkap atau akurat. Jika terdapat kontradiksi antara versi bahasa Inggris halaman ini dan terjemahannya, versi bahasa Inggris akan didahulukan. Lihat versi bahasa Inggris halaman ini.