0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用python实现网表分模块统计面积

sanyue7758 来源:处芯积律 2023-04-16 09:25 次阅读

虽然dc也有report_area -hier命令来报告各级模块的面积,本python方案看似有点造轮子,但还是有一定的便利性。一、不受网表类型的限制,综合网表、DFT网表、APR都可以。二、可以过滤面积小于指定值的小模块,比如工具自动插入的ICG模块。三、还可以根据面积占比做排序,方便分析面积的瓶颈。

一、读入网表

下面先读入网表,并分模块识别每个模块内部的stdcell和子模块。这部分与《用python实现分模块按cell类型统计cell个数并降序排列》的方法相同,所以这里直接导入netlistparser.py。

import netlistparser as nlparser
import sys


vlog_netlist_file = sys.argv[2]
modules=nlparser.read_vlog_netlist(vlog_netlist_file)

这样网表就读到了内部python字典里,结构如下:

{
"moduleA": {
"module_name": "moduleA",
"insts": {
"u_AND2_01":"AND2X1",
"u_AND2_02": "AND2X1",
"u_OR2_01":"OR2X1",
"u_INV_01":"INVX1"
}
},
"moduleB": {
    "module_name": "moduleB",
    "insts": {
        "u_AND2_01": "AND2X1",
        "u_AND2_02": "AND2X1",
        "u_OR2_01": "OR2X1",
        "u_INV_01": "INVX1"        
    }
},
}

二、读入lib库

stdcell的面积信息存储在fab提供的lib文件里,所以我们需要从lib里读到每种cell的面积,方法如下:

# libparser.py
import sys
import re
import json




def read_library(file_name):
    cells = {}
    
    lib_lines = open(file_name, 'r').readlines()


    cell_start = 0    
    pin_start = 0


    total_lines = len(lib_lines)
    print('')
    
    for i in range(total_lines):
        line = lib_lines[i]
        print('33[1F {}%'.format(round(100 * i / total_lines)))
        
cell_s_m=re.search(r'cells*((w+))s+{',line)
area_m=re.search(r'sareas+:s+(S+)s*;',line)
        pin_s_m  = re.search(r'spin((w+))s+{', line)
        dir_m    = re.search(r'sdirections+:s+(w+)', line)
        func_m   = re.search(r'sfunctions+:s+"(.*)"', line)
        end_m    = re.search(r'}', line)


        if cell_s_m:
            cell_start = 1
            cell = {}
            cell_name = cell_s_m.group(1)
            cell['cell_name'] = cell_name
            pins = []
            cell['pins'] = pins
            cells[cell_name] = cell


        if cell_start and area_m:
            area = area_m.group(1)
            cell['area'] = round(float(area), 4)
        
        if cell_start and pin_s_m:
            pin_start = 1
            pin = {}
            pin_name = pin_s_m.group(1)
            pin['pin_name'] = pin_name


        if cell_start and dir_m:
            pin_dir = dir_m.group(1)
            pin['pin_dir'] = pin_dir


        if cell_start and func_m:
            pin_func = func_m.group(1)
            pin['pin_func'] = pin_func


        if cell_start and pin_start and end_m:
            pin_start = 0
            pins.append(pin)
            
    return cells




def get_cell_area(cells, cell_name):
    if cell_name in cells:
        return cells[cell_name]['area']
    else:
        return 0




def is_libcell(cells, cell_name):
    if cell_name in cells:
        return True
    else:
        return False




def write_lib_info(lib_info, file_name):
    f = open(file_name, 'w')
    f.write(json.dumps(lib_info, indent=4))
    f.close()

其中,read_library()函数实现了用正则读取lib文件里的cell名字、area、pin、pin方向、function等信息。今天只需要用到cell名字和面积。其它信息是为了后续扩展其它功能做准备。

get_cell_area()提供了读取指定cell面积的接口。is_libcell()实现了判断是libcell还是一般的设计上的子模块。

write_lib_info()可以将lib库的字典写到json文件里,方便调试。

接下来,用这个libparser读入lib库:

import libparser
import sys


lib_file = sys.argv[1]
lib_info=libparser.read_library(lib_file)

三、面积递归统计

我们从top design开始,当遇到stdcell中的cell则累加,当遇到子模块则递归。直到子模块不再含有其它子模块(仅由stdcell组成)时,则返回。

area_info = {}
def report_area(modules, lib_info, module_name):
    global area_info
    area = 0
    
    insts = modules[module_name]['insts']
    for inst in insts:
        cell_inst = inst
        cell_type = insts[inst]
        if cell_type in area_info:
            area = area + area_info[cell_type]
        elif libparser.is_libcell(lib_info, cell_type):
            area = area + libparser.get_cell_area(lib_info, cell_type)
        else:
#递归
report_area(modules,lib_info,cell_type)
            area = area + area_info[cell_type]
    
area_info[module_name]=area

四、打印面积

打印的同时,可以做一些过滤或者排序。

for module in area_info:
        if not re.search(r'CLOCK_GATE', module):
            print(module, round(area_info[module], 4))

效果如下:

c691f868-dbad-11ed-bfe3-dac502259ad0.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476
  • 网表
    +关注

    关注

    0

    文章

    13

    浏览量

    7524

原文标题:用python实现网表分模块统计面积

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview通过口/GBIP采集5071C仪SNP数据并保存数据怎么实现

    Labview通过口/GBIP采集5071C仪SNP数据并保存数据怎么实现?1. 通过
    发表于 05-18 12:55

    python模块安装方法

    Python模块是一个Python文件,以.py结尾,包括了Python对象定义和Python语句,能让
    发表于 04-04 14:57

    5种Python实现方式详解

    编写的扩展,完全不支持使用SWIG、SIP等工具编写的扩展。就连NumPy,也要在编译器的层面上从头实现。即使实现了,也只能在Python层面中使用,无法供其他第三方模块在非
    发表于 05-22 15:52

    请问python可以替代shell吗?

    的。再说下Python的效率问题,Python支持多进程、多线程以及协程(比线程更小一级),程序并发度是在Shell之上的。Python的核心模块基本都是
    发表于 06-07 14:57

    分库是什么?怎么实现

    数据库分库、读写分离的原理实现,使用场景
    发表于 10-25 17:24

    如何修改CAD设备统计区域表格?

    在使用CAD制图软件绘制电气图纸的过程中,在进行强电平面设计时经常会需要生成设备,那么如何对CAD设备统计区域进行表格操作呢?下面就让小编来给大家介绍一下国产CAD制图软件——浩辰CAD电气软件
    发表于 03-12 16:21

    生成CAD设备后如何获取统计数据?

    上一节CAD制图教程中给大家介绍了设备生成功能的相关使用技巧,各位小伙伴应该也了解了设备生成功能主要的作用就是对当前图选中的区域的设备进行统计,生成设备。那么如何获取设备
    发表于 04-26 17:11

    实现Python与STM32通信 精选资料分享

    断断续续学了几周Stm32后,突然想实现上位机和下位机的通信,恰好自己学过一点python,便想通过python实现通信. 在网上看见python
    发表于 08-16 07:28

    基于面积统计的气候评价系统魏磊

    基于面积统计的气候评价系统_魏磊
    发表于 03-16 08:00 0次下载

    python3中利用serial模块实现单片机与python上位机的通信(串口调试助手)

    (1-X,2-T),若 python 上位机接受到的字符为‘ 1 ’,则 print 出OK,如果字符是‘ 0 ’则 print 出 NG 。 2.实际效果:提供一个简易的ui让用户方便输入实现3.准备
    发表于 11-23 19:45 1646次阅读

    Python字符数统计函数程序

    Python字符数统计函数程序免费下载。
    发表于 05-25 14:35 18次下载

    python统计词频的三种方法

    python统计词频的三种方法方法。
    发表于 05-25 14:33 2次下载

    多元统计分析:R与Python实现

    多元统计分析:R与Python实现说明。
    发表于 05-27 11:27 7次下载

    Python-模块与包

    模块Python 程序架构的一个核心概念
    的头像 发表于 02-16 14:55 550次阅读
    <b class='flag-5'>Python</b>-<b class='flag-5'>模块</b>与包

    python如何导入模块

    Python是一种强大的编程语言,它支持模块化编程,使得开发者可以将代码分解为可重用且独立的模块模块是一个包含函数、类和变量等定义的文件,我们可以使用import语句将这些
    的头像 发表于 11-22 14:46 537次阅读