Perl脚本处理寄存器信息表

Perl脚本处理寄存器信息表

在编写Perl脚本处理寄存器信息表时,对计算各寄存器初始值这一步的思路进行记录。

寄存器信息表表头信息如下:
在这里插入图片描述

default值格式如下,不同寄存器以空行区分:

在这里插入图片描述

针对模块各寄存器中不同bit位字段的default值进制表达不统一,笔者的思路是将对每个字段首先将不同进制统一转化为二进制形式,再拼接各自的比特位lsb数个0,后累加得到最高32位长度的二进制数字,最后转化为16进制形式得到寄存器初始值。

for my $i (0..@reg_name-1){
	if($reg_bit[$i] =~ /(\s*)+(\d+)+(\:)+(\d+)+(\s*)/) {$lsb = $4;}
	elsif($reg_bit[$i] =~ /(\[)+(\d+)+(\])/){$lsb = $2;}
	else {$lsb = $reg_bit[$i];}
# 先对每个字段的default值处理:首先将不同进制统一转化为二进制形式,再拼接各自的比特位lsb数个0
	if($reg_def[$i] =~ /'h/){ @default_s = split(/'h/,$reg_def[$i]);
							  my $sig_b_def0 = sprintf "%b",hex($default_s[1]);
							  $sig_b_def = $sig_b_def0.(0 x $lsb);
							  $sig_def[$i] = $sig_b_def;
#							  print "$reg_addr{$reg_name[$i]}:$sig_def[$i]"."\n";
							  @default_s = ();
	}
	elsif($reg_def[$i] =~ /'b/){@default_s = split(/'b/,$reg_def[$i]);
							$sig_b_def = $default_s[1].(0 x $lsb);
							$sig_def[$i] = $sig_b_def;
#							print "$reg_addr{$reg_name[$i]}:$sig_def[$i]"."\n";
							@default_s =();
	}
	elsif($reg_def[$i] =~ /0x/){
								@default_s = split(/x/,$reg_def[$i]);
							    my $sig_b_def0 = sprintf "%b",hex($default_s[1]);
								$sig_b_def = $sig_b_def0.(0 x $lsb);
								$sig_def[$i] = $sig_b_def;
								print "$reg_addr{$reg_name[$i]}:$sig_def[$i]"."\n";
								@default_s = ();
	}
	elsif($reg_def[$i] =~ /'d/){
								@default_s = split(/'d/,$reg_def[$i]);
							    my $sig_b_def0 = sprintf "%b",$default_s[1];
								$sig_b_def = $sig_b_def0.(0 x $lsb);
								$sig_def[$i] = $sig_b_def;
#								print "$reg_addr{$reg_name[$i]}:$sig_def[$i]"."\n";
								@default_s = ();
	}
	else {$sig_def[$i] = 0;}
}

经过累加计算后得到的最高32位长度的二进制数字:

# 在累加计算中采用“|”运算代替“+”,并两次reverse:
$single_reg_def = reverse(reverse($single_reg_def) | reverse($sig_def[$i]));

在最后一次累加完成后,将得到的最高32位长度的二进制数字先转化为十进制,再转化为16进制,得到最终的寄存器初始值

my $int_single_reg_def = unpack("N",pack("B32",substr("0" x 32 . "$single_reg_def", -32)));
my $dec_single_reg_def = sprintf("%d",$int_single_reg_def);

push @reg_default,"0x".(sprintf("%x",$dec_single_reg_def));

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森奈a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值