UVM class 类的继承派生关系

简介: UVM class 类的继承派生关系

为了搞清楚uvm中各个类的继承关系,随手用python写了个脚本到uvm-1.2文件夹中去抓,代码如下,可能有bug。

#! /usr/bin/python
import re, sys, commands
tmp = commands.getoutput("grep -rh -A 5 \"class \" " + sys.argv[1] + " --include=\"*.sv*\"").split('\n')
for line in tmp:
    if '//' in line or '--' in line or len(line) < 2 or 'endclass' in line:
        tmp.remove(line)
tmp2 = []
for i in range(len(tmp)):
    if 'class ' in tmp[i]:
        new_line = tmp[i]
        if ';' in tmp[i]:
            tmp2.append(tmp[i])    
        else:
          for j in range(10):
               if (i+1) < len(tmp):
                    i = i+1
               new_line += tmp[i]
               if ';' in tmp[i]:
                    tmp2.append(new_line)
                    break
tmp3 = []
for line in tmp2:
  if 'extends' in line:
      res = re.match('\s*(virtual\s)*class\s+(\S+).*extends\s+(\S+).*', line)
      if res:
          tmp3.append(res.group(2) + ' extends ' + res.group(3))
    else:
      res = re.match('\s*(virtual\s)*class\s+(\S+).*', line)
      if res:
          tmp3.append(res.group(2))
tmp4 = {}.fromkeys(tmp3).keys()
for i in range(len(tmp4)):
  tmp4[i] = re.sub('#\S+', '', tmp4[i])
  tmp4[i] = re.sub(';', '', tmp4[i])
tmp5 = []
for i in range(len(tmp4)):
    if 'extends' not in tmp4[i]:
      hier = tmp4[i]
    else:
      res = re.match('(.*) extends (.*)', tmp4[i])
        son = res.group(1)
      father = res.group(2)
      hier = father + '.' + son
        while True:
          if father is not '':
              son = father
          else:
              break
          for j in range(len(tmp4)):
              res = re.match(son + ' extends ' + '(.*)', tmp4[j])
              if res:
                  hier = res.group(1) + '.' + hier
                  father = res.group(1)
                  break
              else:
                  father = ''
    tmp5.append(hier)
tmp6 = sorted(set(tmp5))
fp = open('uvm_family.csv', 'w')
for line in tmp6:
  fp.write(line + '\n')
    print line
fp.close()



  如果只更关心uvm_void的派生类,再筛选一下:

fp = open('uvm_void_family.csv', 'w')
for line in tmp6:
    if 'uvm_void' in line:
        fp.write(line + '\n')
fp.close()



处理结果大致如下:


20201125115835552.png



有兴趣再处理一下的话,就是这样啦 ↓


20201125120008316.png


又或者是这样(用vimdot画的图,感兴趣看下DOT语言介绍) ↓


20201127142633492.png


目录
相关文章
|
C++
28.【C++ 继承与派生 (详解)】(二)
28.【C++ 继承与派生 (详解)】
62 0
|
程序员 C++
28.【C++ 继承与派生 (详解)】(一)
28.【C++ 继承与派生 (详解)】
79 0
类与ES6类之间的继承
类与ES6类之间的继承
|
6月前
|
安全 Java 编译器
C++:继承与派生
C++:继承与派生
|
6月前
|
C++
【C++】——继承和派生
【C++】——继承和派生
|
6月前
|
程序员 C++
48继承与派生
48继承与派生
40 0
2.【类的组合(在一个类中定义一个类)】
2.【类的组合(在一个类中定义一个类)】
47 0
C++中的继承和派生
C++ 中的继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。 继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。 在C++中,派生(Derive)和继承是一个概念,只是站的角度不同。继承是儿子接收父亲的产业,派生是父亲把产业传承给儿子。 被继承的类称为父类或基类,继承的类称为子类或派生类。“子类”和“父类”通常放在一起称呼,“基类”和“派生类”通常放在一起称呼。 派生类除了拥有基类的成员,还可以定义自己的新成员,以增强类的功能。
CPP2022-25-继承与派生(中)
CPP2022-25-继承与派生(中)
77 0