有时候我们只关心stdcell library里的逻辑定义:有哪些pin,面积多大,逻辑功能等。我们可以用正则写一个简单的parser。
library里包括了若干个cell的定义,除去时序和功耗信息,大致如下:
cell(A0127T) {
cell_footprint : A017T ;
area : 23.52 ;
pin(A) {
capacitance : 0.006519 ;
direction : input ;
}
pin(Y) {
direction : output ;
function : "(!(((A|B)&C)|D))" ;
}
}
总是以“cell(xxx) {”开头,以“}”结尾。pin的定义与cell定义结构类似,多行内容用大括号括在一起。所以,写正则有一个难点:这些信息分在多行。
解决方法:用标志来标记每一种信息的开头和结束,来限定正则的范围。
def read_library(file_name):
cells = {}
lib_lines = open(file_name, 'r').readlines()
pin_start = 0
for line in lib_lines:
cell_s_m = re.search(r'cell\((\w+)\)\s+{', line)
area_m = re.search(r'\sarea\s+:\s+(\S+)\s+', line)
pin_s_m = re.search(r'\spin\((\w+)\)\s+{', line)
dir_m = re.search(r'\sdirection\s+:\s+(\w+)', line)
func_m = re.search(r'\sfunction\s+:\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 area_m:
area = area_m.group(1)
cell['area'] = area
if pin_s_m:
pin_start = 1
pin = {}
pin_name = pin_s_m.group(1)
pin['pin_name'] = pin_name
if dir_m:
pin_dir = dir_m.group(1)
pin['pin_dir'] = pin_dir
if func_m:
pin_func = func_m.group(1)
pin['pin_func'] = pin_func
if pin_start and end_m:
pin_start = 0
pins.append(pin)
return cells
为了方便后续处理,自定义了stdcell library的数据存储结构:
cells = {
cell1 : {
'cell_name': 'cell1',
'area': 2.1,
'pins': [{
'pin_name': 'Y',
'pin_dir': 'output',
'pin_func': "(!(((A|B)&C)|D))"
},
{
'pin_name': ...
}]
}
cell2: {
...
}
}
测试一下,我们读入stdcell library,并提取出DFF的信息。
import libparser
import json
cells = libparser.read_library("../lib/worst.lib")
print(json.dumps(cells.get("FUDS7T"), indent=4))
输出结果如下:
{
"cell_name": "FUDS7T",
"pins": [
{
"pin_name": "D",
"pin_dir": "input"
},
{
"pin_name": "Q",
"pin_dir": "output",
"pin_func": "IQ"
},
{
"pin_name": "QC",
"pin_dir": "output",
"pin_func": "IQN"
},
{
"pin_name": "R",
"pin_dir": "input"
},
{
"pin_name": "T",
"pin_dir": "input"
}
],
"area": "28"
}
下面的代码可以输出全部cell的信息:
print(json.dumps(cells, indent=4, sort_keys=True))
总结:
设置标志位,在区间里进行正则匹配,可以提高准确性和效率。
分享让工作更轻松