在 tcl 中,我如何对信号进行分组并将它们放在一个特定的类别中

In tcl how can I group signals and put them in a particular category

在 tcl 中,我如何对信号进行分组并将它们放在特定的类别中 我有几个信号

    ahb_hdata
    apb_pdata_out
    axi_reps_n
    apb_req_n
    ahb_reset_n
    apb_pwrite
    ahb_haddr
    axi_ready_in
    axi_trans
    

我想以此格式对信号进行分组

ahb:         apb:             axi:
 ahb_hdata      apb_pdata_out   axi_trans
 ahb_reset_n    apb_pwrite      axi_reps_n
 ahb_haddr      apb_req_n       axi_ready_in

到目前为止,我能够搜索子字符串是否存在, 但是这里我有很多子串要搜索,必须对它们进行分组,我没有如何对它们进行分组并将它们放在特定类别下

set string "ahb_hdata, apb_pdata_out, axi_reps_n, apb_req_n, ahb_reset_n, apb_pwrite, 
ahb_haddr, axi_ready_in, axi_trans "

set substring "ahb"
  if {[string first $substring $string] != -1} {
puts "$substring"
}

使用 dicts 可以轻松对所有内容进行分组 - 使用前缀作为键,每个值都是一个名称列表。它将输出格式化为有点棘手的列,但是由于 lindex 的索引超出范围只是 returns 一个空字符串,仍然相当干净 - 计算公共前缀列表的最大长度,并且迭代到那个,依次提取每个列表的第 N 个值:

#!/usr/bin/env tclsh                                                                                                                                                                                                                              

proc group_signals {signals} {
    set sigs [dict create]
    set lengths [dict create]

    foreach sig $signals {
        if {[regexp {^[^_]+} $sig prefix]} {
            dict lappend sigs $prefix $sig
            dict incr lengths $prefix
        }
    }

    # Header                                                                                                                                                                                                                                     
    puts "[join [dict keys $sigs] ":\t"]:"

    set maxlen [::tcl::mathfunc::max {*}[dict values $lengths]]
    for {set n 0} {$n < $maxlen} {incr n} {
        set line {}
        dict for {_ list} $sigs {
            lappend line [lindex $list $n]
        }
        puts [join $line \t]
    }
}

group_signals {
    ahb_hdata
    apb_pdata_out
    axi_reps_n
    apb_req_n
    ahb_reset_n
    apb_pwrite
    ahb_haddr
    axi_ready_in
    axi_trans
}