import re
import csv
def robust_spectre_parser(input_file, output_csv):
"""
改进的Spectre模型文件解析器,支持所有运算符
"""
params = {}
with open(input_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
line = line.strip()
# 移除注释
if '//' in line:
line = line.split('//')[0].strip()
if not line:
continue
# 处理模型声明行 - 修正后的版本
if line.startswith('model') and 'bsim4' in line.lower():
# 使用正则表达式提取模型声明中的参数
model_decl_match = re.match(r'model\s+\w+\s+bsim4\s+(.*)', line, re.IGNORECASE)
if model_decl_match:
# 匹配model nch bsim4 type=n test=y ,选取group(1) type=n test=y,并strip()去掉首尾空白字符
param_string = model_decl_match.group(1).strip()
# 使用更智能的参数解析方法
# 调用正则表达式
model_params = parse_model_parameters(param_string)
params.update(model_params)
# 处理参数行
elif line.startswith('+'):
line = line[1:].strip()
# 使用正则表达式分割多个参数
param_items = re.split(r'\s+(?=\w+\s*=)', line)
for item in param_items:
if '=' in item:
key, value = item.split('=', 1)
key = key.strip()
value = value.strip()
# 清理表达式中的所有运算符空格
value = clean_expression(value)
params[key] = value
# 写入CSV
with open(output_csv, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Parameter', 'Value'])
for key, value in sorted(params.items()):
writer.writerow([key, value])
print(f"成功提取 {len(params)} 个参数到 {output_csv}")
return params
def parse_model_parameters(param_string):
"""
专门解析模型声明行中的参数
正确处理带空格的表达式
"""
params = {}
# 使用正则表达式提取所有 key=value 对
# 这个正则表达式可以正确处理值中包含空格的情况
# 该表达式分为三部分
# 第一部分为(\w+) 匹配变量名
# 第二部分为\s*=\s* 匹配等号
# 第三部分为([^=]+?)(?=\s+\w+\s*=|$) 通过非贪婪模式([^=]+?)加上正向断言(?=\s+\w+\s*=|$)匹配下一个(变量名 =)或者字符串结束($)
pattern = r'(\w+)\s*=\s*([^=]+?)(?=\s+\w+\s*=|$)'
matches = re.findall(pattern, param_string)
for key, value in matches:
key = key.strip()
value = value.strip()
value = clean_expression(value)
params[key] = value
return params
def clean_expression(expression):
"""
清理表达式中的所有运算符周围的空格
"""
# 清理所有运算符周围的空格
expression = re.sub(r'\s*([+\-*/])\s*', r'\1', expression)
# 清理括号周围的空格
expression = re.sub(r'\s*\(\s*', '(', expression)
expression = re.sub(r'\s*\)\s*', ')', expression)
# 清理逗号周围的空格
expression = re.sub(r'\s*,\s*', ',', expression)
# 将多个连续空格替换为单个空格(用于非运算符部分)
expression = re.sub(r'\s+', ' ', expression)
return expression.strip()
# 使用
robust_spectre_parser('model_new.txt', 'model_card.csv')