在 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"
}
使用 dict
s 可以轻松对所有内容进行分组 - 使用前缀作为键,每个值都是一个名称列表。它将输出格式化为有点棘手的列,但是由于 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
}
在 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"
}
使用 dict
s 可以轻松对所有内容进行分组 - 使用前缀作为键,每个值都是一个名称列表。它将输出格式化为有点棘手的列,但是由于 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
}