我碍事的个人空间 https://blog.eetop.cn/?1770333 [收藏] [复制] [分享] [RSS]

日志

Python脚本读取model.scs文件

已有 133 次阅读| 2025-9-11 17:49 |系统分类:芯片设计| Python

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')



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 2

    关注
  • 0

    粉丝
  • 1

    好友
  • 0

    获赞
  • 0

    评论
  • 9

    访问数
关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-9-13 11:17 , Processed in 0.016146 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部