有一个示例输入文件如下(input1.txt)
(供您参考,
4'hF
表示其值是十进制的15,它是二进制4位,其值是1111
,每一位都是二进制。
所以, 4'hF
与 4'b1111
) 相同
{pDHY_es[3:0]} = 4'hF;
{pDHY_asq,1'b0,pDHY_qr,1'b1} = 4'hB;
{pQHY_yd,pRTY_a[2:0]} = 4'h5;
{1'b0,1'b0,pDSY_qr,pDNR_pf} = 4'h3;
{pQHT_yd[1:0],pDRY_pf,pTUCF_xlck} = 4'h9;
我想要做的是将括号内的所有元素(以字母“p”开头)转换为其位分配值。所以在这种情况下,输出将如下(output.txt)
pDHY_es[3:0] = 4'b1111;
pDHY_asq = 1'b1;
pDHY_qr = 1'b1;
pQHT_yd = 1'b0;
pRTY_a[2:0] = 3'b101;
pDSY_qr = 1'b1;
pDNR_pf = 1'b1;
pQHY_yd[1:0] = 2'b10;
pDRY_pf = 1'b0;
pTUCF_xlck = 1'b1;
总而言之,我想做的是
1.提取括号内以字母'p'开头的所有元素。
2.将每个元素的值放入其位分配的形式。
我考虑过使用十六进制到二进制转换函数,如下所示: 将十六进制转换为二进制 但它本身似乎并不能满足我的需要:
用
split()
和 strip()
解析行
inp = """{pDHY_es[3:0]} = 4'hF;
{pDHY_asq,1'b0,pDHY_qr,1'b1} = 4'hB;
{pQHY_yd,pRTY_a[2:0]} = 4'h5;
{1'b0,1'b0,pDSY_qr,pDNR_pf} = 4'h3;
{pQHT_yd[1:0],pDRY_pf,pTUCF_xlck} = 4'h9;"""
def convertBitpattern(s: str):
numBits, bits = s.split("'")
numBits = int(numBits)
return numBits, format(int(bits[1:], 16 if bits[0] == 'h' else 2), f"0{numBits}b")
def getNumbits(field):
numBits = 1
isField = False
if field[0] in '0123456789':
numBits, _ = convertBitpattern(field)
else:
isField = True
parts = field.split('[')
if len(parts) == 2:
numBits = int(parts[1].split(':')[0])+1
return isField, numBits
for line in inp.split('\n'):
fields, bitpattern = list(map(lambda x: x.strip().strip('{};'), line.split('=')))
_, bits = convertBitpattern(bitpattern)
for field in fields.split(','):
isField, numBits = getNumbits(field)
fieldBits, bits = bits[:numBits], bits[numBits:]
if isField:
print(f"{field:15} = {numBits}'b{fieldBits}")
输出
pDHY_es[3:0] = 4'b1111
pDHY_asq = 1'b1
pDHY_qr = 1'b1
pQHY_yd = 1'b0
pRTY_a[2:0] = 3'b101
pDSY_qr = 1'b1
pDNR_pf = 1'b1
pQHT_yd[1:0] = 2'b10
pDRY_pf = 1'b0
pTUCF_xlck = 1'b1