使用python将括号内的值转换为二进制形式

问题描述 投票:0回答:1

有一个示例输入文件如下(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.将每个元素的值放入其位分配的形式。

我考虑过使用十六进制到二进制转换函数,如下所示: 将十六进制转换为二进制 但它本身似乎并不能满足我的需要:

python python-3.x hex verilog
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.