0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用python實(shí)現(xiàn)網(wǎng)表分模塊統(tǒng)計(jì)面積

sanyue7758 ? 來(lái)源:處芯積律 ? 2023-04-16 09:25 ? 次閱讀

雖然dc也有report_area -hier命令來(lái)報(bào)告各級(jí)模塊的面積,本python方案看似有點(diǎn)造輪子,但還是有一定的便利性。一、不受網(wǎng)表類型的限制,綜合網(wǎng)表、DFT網(wǎng)表、APR都可以。二、可以過(guò)濾面積小于指定值的小模塊,比如工具自動(dòng)插入的ICG模塊。三、還可以根據(jù)面積占比做排序,方便分析面積的瓶頸。

一、讀入網(wǎng)表

下面先讀入網(wǎng)表,并分模塊識(shí)別每個(gè)模塊內(nèi)部的stdcell和子模塊。這部分與《用python實(shí)現(xiàn)分模塊按cell類型統(tǒng)計(jì)cell個(gè)數(shù)并降序排列》的方法相同,所以這里直接導(dǎo)入netlistparser.py。

import netlistparser as nlparser
import sys


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

這樣網(wǎng)表就讀到了內(nèi)部python字典里,結(jié)構(gòu)如下:

{
"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庫(kù)

stdcell的面積信息存儲(chǔ)在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()函數(shù)實(shí)現(xiàn)了用正則讀取lib文件里的cell名字、area、pin、pin方向、function等信息。今天只需要用到cell名字和面積。其它信息是為了后續(xù)擴(kuò)展其它功能做準(zhǔn)備。

get_cell_area()提供了讀取指定cell面積的接口。is_libcell()實(shí)現(xiàn)了判斷是libcell還是一般的設(shè)計(jì)上的子模塊。

write_lib_info()可以將lib庫(kù)的字典寫到j(luò)son文件里,方便調(diào)試。

接下來(lái),用這個(gè)libparser讀入lib庫(kù):

import libparser
import sys


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

三、面積遞歸統(tǒng)計(jì)

我們從top design開(kāi)始,當(dāng)遇到stdcell中的cell則累加,當(dāng)遇到子模塊則遞歸。直到子模塊不再含有其它子模塊(僅由stdcell組成)時(shí),則返回。

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

四、打印面積

打印的同時(shí),可以做一些過(guò)濾或者排序。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84080
  • 網(wǎng)表
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    7609

原文標(biāo)題:用python實(shí)現(xiàn)網(wǎng)表分模塊統(tǒng)計(jì)面積

文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    python模塊安裝方法

    Python模塊是一個(gè)Python文件,以.py結(jié)尾,包括了Python對(duì)象定義和Python語(yǔ)句,能讓
    發(fā)表于 04-04 14:57

    請(qǐng)問(wèn)python可以替代shell嗎?

    的。再說(shuō)下Python的效率問(wèn)題,Python支持多進(jìn)程、多線程以及協(xié)程(比線程更小一級(jí)),程序并發(fā)度是在Shell之上的。Python的核心模塊基本都是
    發(fā)表于 06-07 14:57

    分庫(kù)是什么?怎么實(shí)現(xiàn)

    數(shù)據(jù)庫(kù)分庫(kù)、讀寫分離的原理實(shí)現(xiàn),使用場(chǎng)景
    發(fā)表于 10-25 17:24

    基于面積統(tǒng)計(jì)的氣候評(píng)價(jià)系統(tǒng)魏磊

    基于面積統(tǒng)計(jì)的氣候評(píng)價(jià)系統(tǒng)_魏磊
    發(fā)表于 03-16 08:00 ?0次下載

    如何使用python實(shí)現(xiàn)截圖自動(dòng)存入Excel

    如何使用python實(shí)現(xiàn)截圖自動(dòng)存入Excel
    的頭像 發(fā)表于 02-05 12:13 ?7153次閱讀

    如何利用Python判斷統(tǒng)計(jì)每個(gè)月天數(shù)源

    如何利用Python判斷統(tǒng)計(jì)每個(gè)月天數(shù)源。在日常的學(xué)習(xí)或是工作中會(huì)經(jīng)常遇到需要統(tǒng)計(jì)日期數(shù)據(jù)的情況。特別是統(tǒng)計(jì)涉及到自然周或是自然月的計(jì)算。
    的頭像 發(fā)表于 11-02 09:41 ?2948次閱讀

    Python字符數(shù)統(tǒng)計(jì)函數(shù)程序

    Python字符數(shù)統(tǒng)計(jì)函數(shù)程序免費(fèi)下載。
    發(fā)表于 05-25 14:35 ?19次下載

    python統(tǒng)計(jì)詞頻的三種方法

    python統(tǒng)計(jì)詞頻的三種方法方法。
    發(fā)表于 05-25 14:33 ?2次下載

    多元統(tǒng)計(jì)分析:R與Python實(shí)現(xiàn)

    多元統(tǒng)計(jì)分析:R與Python實(shí)現(xiàn)說(shuō)明。
    發(fā)表于 05-27 11:27 ?10次下載

    Python學(xué)習(xí)科學(xué)編程

    Python學(xué)習(xí)科學(xué)編程,Python經(jīng)典教材。
    發(fā)表于 03-09 15:00 ?0次下載

    使用Python DIY Arduino來(lái)顯示PC統(tǒng)計(jì)數(shù)據(jù)

    電子發(fā)燒友網(wǎng)站提供《使用Python DIY Arduino來(lái)顯示PC統(tǒng)計(jì)數(shù)據(jù).zip》資料免費(fèi)下載
    發(fā)表于 10-18 09:12 ?1次下載
    使用<b class='flag-5'>Python</b> DIY Arduino來(lái)顯示PC<b class='flag-5'>統(tǒng)計(jì)</b>數(shù)據(jù)

    淺析python模塊創(chuàng)建和from及import使用

    python模塊通過(guò)python程序編寫的.py文件即可創(chuàng)建,通過(guò)from及import語(yǔ)句導(dǎo)入模塊來(lái)使用。
    的頭像 發(fā)表于 02-21 14:44 ?730次閱讀

    Python實(shí)現(xiàn)OpenCV的安裝與使用

      本文實(shí)例講述了 Python 實(shí)現(xiàn) OpenCV 的安裝與使用。分享給大家供 大家參考,具體如下:  由于下一步要開(kāi)始研究下深度學(xué)習(xí),而深度學(xué)習(xí)領(lǐng)域很多的算法和應(yīng) 都是
    發(fā)表于 07-20 11:46 ?7次下載

    python如何導(dǎo)入模塊

    Python是一種強(qiáng)大的編程語(yǔ)言,它支持模塊化編程,使得開(kāi)發(fā)者可以將代碼分解為可重用且獨(dú)立的模塊。模塊是一個(gè)包含函數(shù)、類和變量等定義的文件,我們可以使用import語(yǔ)句將這些
    的頭像 發(fā)表于 11-22 14:46 ?798次閱讀

    如何實(shí)現(xiàn)Python復(fù)制文件操作

    Python 中有許多“開(kāi)蓋即食”的模塊(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在這篇文章中,你將會(huì)看到一些 Python
    的頭像 發(fā)表于 07-18 14:53 ?253次閱讀