如何创建可以计算总位数的 TCL 或 perl 脚本,如果不匹配,则脚本应为剩余位数添加 0
How to create TCL or perl script which can count total number of bits and if there is a mismatch then script should add 0 for remaining bits
我想创建一个 TCL 或 perl 脚本来比较位数和总位数,如果不匹配则在开头放置 0:
文件的部分内容:
// DEBUG: TDO : 16'b1
// DEBUG: STEP # : 3
// DEBUG: TDI : 35'b1011101001011110100000100100100
// DEBUG: TDO : 35'b0xx001011101001011110100000100100100
// DEBUG: LOAD_DR ( 35 , 35'b1011101001011110100000100100100 ) ;
// DEBUG: STEP # : 4
// DEBUG: LOAD_NOP ( 2 ) ;
// DEBUG: STEP # : 5
// DEBUG: TDI : 8'b1011101001011110100000100100101
// DEBUG: TDO : 8'b100
// DEBUG: LOAD_DR ( 35 , 35'b1011101001011110100000100100101 ) ;
此处,对于某些 TDO ,位不完整。
例如:
8'b100,这里只有 3 位,但数字是 8,所以无论这种情况在哪里,我都需要在开头放置额外的 0,以便剩余 bits.For 8'b100 输出应该是 8'b00000100 并且此脚本应在不影响文件的任何其他内容的情况下替换原始文件中的此位:
通过脚本进行必要更改后 8'b100 的预期输出的部分内容
// DEBUG: STEP # : 5
// DEBUG: TDI : 8'b1011101001011110100000100100101
// DEBUG: TDO : 8'b00000100
最好使用 TCL 脚本,但 Perl 也可以。
我不会给你代码,因为那不是 Stack Overflow 的真正用途。但我会告诉你程序员如何看待这个任务。
编程就是将一个任务分解成更小的任务。那么我们需要在这里做什么呢?
- 一次读取一行输入(它来自哪里?是一个文件吗?它是否通过管道传输到您的程序中以便您从 STDIN 读取它?)
- 识别您需要调查的线路。你如何识别包含二进制数字的行?
- 对于不需要处理的行,将它们原封不动地写入输出(那是文件吗?)
- 对于您需要处理的行,如何将数据分解为可以调查的标记?
- 如何测量二进制数的长度?
- 二进制数的正确长度是多少?
- 如何将二进制数填充到正确的长度?
思考这些问题的答案。如果任何问题太大而无法回答,那么请考虑将其分解为更小的问题。您可以通过查看任务规范来回答一些问题。其中一些问题您需要阅读编程语言参考书才能找到答案。
尝试一下。当您的代码可以执行某些操作(即使它不能解决问题的每一部分)时,请返回此处并更新您的问题以包含您的代码。解释什么是有效的,什么是你遇到的问题。向我们提出明确的问题。我们会尽力帮助你。
既然你有晋级的机会,我就是这样解决的:
set fh [open filename r]
while {[gets $fh line] != -1} {
if {[regexp {(.* TDO\s+: (\d+)'b)([01]+)\M} $line -> prefix len bits]} {
set line [format "%s%0*s" $prefix $len $bits]
}
puts $line
}
close $fh
参见:
我想创建一个 TCL 或 perl 脚本来比较位数和总位数,如果不匹配则在开头放置 0: 文件的部分内容:
// DEBUG: TDO : 16'b1
// DEBUG: STEP # : 3
// DEBUG: TDI : 35'b1011101001011110100000100100100
// DEBUG: TDO : 35'b0xx001011101001011110100000100100100
// DEBUG: LOAD_DR ( 35 , 35'b1011101001011110100000100100100 ) ;
// DEBUG: STEP # : 4
// DEBUG: LOAD_NOP ( 2 ) ;
// DEBUG: STEP # : 5
// DEBUG: TDI : 8'b1011101001011110100000100100101
// DEBUG: TDO : 8'b100
// DEBUG: LOAD_DR ( 35 , 35'b1011101001011110100000100100101 ) ;
此处,对于某些 TDO ,位不完整。 例如: 8'b100,这里只有 3 位,但数字是 8,所以无论这种情况在哪里,我都需要在开头放置额外的 0,以便剩余 bits.For 8'b100 输出应该是 8'b00000100 并且此脚本应在不影响文件的任何其他内容的情况下替换原始文件中的此位:
通过脚本进行必要更改后 8'b100 的预期输出的部分内容
// DEBUG: STEP # : 5
// DEBUG: TDI : 8'b1011101001011110100000100100101
// DEBUG: TDO : 8'b00000100
最好使用 TCL 脚本,但 Perl 也可以。
我不会给你代码,因为那不是 Stack Overflow 的真正用途。但我会告诉你程序员如何看待这个任务。
编程就是将一个任务分解成更小的任务。那么我们需要在这里做什么呢?
- 一次读取一行输入(它来自哪里?是一个文件吗?它是否通过管道传输到您的程序中以便您从 STDIN 读取它?)
- 识别您需要调查的线路。你如何识别包含二进制数字的行?
- 对于不需要处理的行,将它们原封不动地写入输出(那是文件吗?)
- 对于您需要处理的行,如何将数据分解为可以调查的标记?
- 如何测量二进制数的长度?
- 二进制数的正确长度是多少?
- 如何将二进制数填充到正确的长度?
思考这些问题的答案。如果任何问题太大而无法回答,那么请考虑将其分解为更小的问题。您可以通过查看任务规范来回答一些问题。其中一些问题您需要阅读编程语言参考书才能找到答案。
尝试一下。当您的代码可以执行某些操作(即使它不能解决问题的每一部分)时,请返回此处并更新您的问题以包含您的代码。解释什么是有效的,什么是你遇到的问题。向我们提出明确的问题。我们会尽力帮助你。
既然你有晋级的机会,我就是这样解决的:
set fh [open filename r]
while {[gets $fh line] != -1} {
if {[regexp {(.* TDO\s+: (\d+)'b)([01]+)\M} $line -> prefix len bits]} {
set line [format "%s%0*s" $prefix $len $bits]
}
puts $line
}
close $fh
参见: