DFT mode下hard phy STA Nopath

hard Phy boundary No Path

1. shift mode;

shift cornor出现No Path的;
PHY SI SO在shift mode必须有timing的path; 展示为No constrained path;

check step:

report_timing -though

NO constrained path

set timing_report_unconstrained true

report again

在这里插入图片描述

you will get a potential path;

get the clock of startpiont

在这里插入图片描述

now the no path reason would be two case:

  1. start point & end point is in two difference clock group;
  2. Lib is no include the timing arc of this pin;

check the lib:
在这里插入图片描述

发现在shift mode吧 bypass func的lib也读入了; 通过remove lib 确认最终读如的lib:
在这里插入图片描述

重新读入lib, shift path 出现;

2.dc capture mode

同样发现 hard phy SI SO的出现 no path;

  1. 在DC capture mode 本身是不会经过SI D path; 所以SI Q path不存在本身也是合理的;(结论是否正确)
  2. 存在的Path 为bypass 的pass ,是因为同属一个clock group ,DFT未插lock up latch导致; Path 为 true path, 需要后端修;
    在这里插入图片描述

其他非SI SO pin的no path;

优先查看Lib中在此mode是否存在 timing arc;

附加处理lib的脚本;

import re
def read_pinlist(pinlist_file):"""Read pinlist from a text file, where each line contains one pin_name.Parameters:pinlist_file (str): Path to the pinlist file.Returns:list: A list of pin_names."""try:with open(pinlist_file, 'r') as f:# Read lines, strip whitespace, and skip empty linespinlist = [line.strip() for line in f.readlines() if line.strip()]return pinlistexcept FileNotFoundError:print(f"Error: File {pinlist_file} not found")return []
def parse_lib(lib_content):"""Parse the lib file content and return a dictionary with pin_name as keys and their corresponding timing block modes as values.Parameters:lib_content (str): The text content of the lib file.Returns:dict: A dictionary containing pin_name and its timing block modes."""pin_dict = {}# Regular expression to match pin blockspin_pattern = r'pin\((.*?)\)\s*{([^{}]*)}'pin_matches = re.findall(pin_pattern, lib_content, re.DOTALL)for pin_match in pin_matches:# Extract pin_name and remove leading/trailing spaces and quotespin_name = pin_match[0].strip().strip('"')pin_content = pin_match[1]# Match timing blockstiming_pattern = r'timing\(\)\s*{([^{}]*)}'timing_matches = re.findall(timing_pattern, pin_content, re.DOTALL)modes = []for timing_match in timing_matches:timing_content = timing_match# Match mode fieldmode_pattern = r'mode\(etm_mode\s*,\s*"([^"]*)"\s*\);'mode_match = re.search(mode_pattern, timing_content)if mode_match:mode_name = mode_match.group(1).strip()  # Remove leading/trailing spaces from mode_namemodes.append(mode_name)pin_dict[pin_name] = modesreturn pin_dictdef check_pins(pinlist, pin_dict):"""Check the status of each pin_name in pinlist based on the lib file and print the results.Parameters:pinlist (list): A list of pin_names to check.pin_dict (dict): A dictionary parsed from the lib file containing pin information."""for pin_name in pinlist:if pin_name not in pin_dict:print(f"{pin_name}: NO pin_name")else:modes = pin_dict[pin_name]if not modes:print(f"{pin_name}: NO timing arc")elif "stuckat_cap" not in modes:print(f"{pin_name}: NO stuckat_cap mode")else:print(f"{pin_name}: Exist stuckat_cap mode")def main():# Example lib file path (modify according to actual path)lib_file_path = "lib.txt"try:with open(lib_file_path, "r") as f:lib_content = f.read()except FileNotFoundError:print(f"Error: File {lib_file_path} not found")return# Parse the lib filepin_dict = parse_lib(lib_content)# Example pinlist (modify according to actual needs)pinlist = ["pin1", "pin2", "pin3", "pin4"]# Check and print resultscheck_pins(pinlist, pin_dict)if __name__ == "__main__":main()import redef parse_lib(lib_content):"""Parse the lib file content and return a dictionary with pin_name as keys and their corresponding pin content as values."""pins = {}lines = lib_content.split('\n')current_pin = Nonepin_content = []brace_level = 0collecting = Falsefor line in lines:stripped = line.strip()if not collecting and stripped.startswith('pin('):# Extract pin namepin_start = stripped.find('(') + 1pin_end = stripped.find(')')if pin_end == -1:continue  # Skip if format is incorrectcurrent_pin = stripped[pin_start:pin_end].strip()brace_start = stripped.find('{', pin_end)if brace_start != -1:brace_level = 1collecting = True# Add the first line content (if any)rest = stripped[brace_start+1:].strip()if rest:pin_content.append(rest)elif collecting:# Calculate brace levelbrace_level += line.count('{')brace_level -= line.count('}')if brace_level > 0:pin_content.append(line)else:collecting = Falsepins[current_pin] = '\n'.join(pin_content)current_pin = Nonepin_content = []return pinsdef analyze_pin(pin_content):"""Analyze the content of a single pin and return its status."""# Check if there are timing blockstiming_blocks = []in_timing = Falsecurrent_block = []brace_level = 0for line in pin_content.split('\n'):stripped = line.strip()if not in_timing and stripped.startswith('timing('):in_timing = Truebrace_level = 0current_block = []if in_timing:current_block.append(line)brace_level += line.count('{')brace_level -= line.count('}')if brace_level <= 0:in_timing = Falsetiming_blocks.append('\n'.join(current_block))if not timing_blocks:return "NO timing arc"# Check if any timing block contains stuckat_cap modepattern = re.compile(r'mode\s*\(\s*etm_mode\s*,\s*"\s*stuckat_cap\s*"\s*\)')for block in timing_blocks:if pattern.search(block):return "OK"return "NO stuckat_cp mode"def main(pinlist_file, lib_file):with open(lib_file, 'r') as f:content = f.read()pins = parse_lib(content)pinlist= read_pinlist(pinlist_file);if not pinlist:print("Pinlist is empty or file not exist");returnfor pin_name in pinlist:if pin_name not in pins:print(f"{pin_name}: Not found")continuestatus = analyze_pin(pins[pin_name])print(f"{pin_name}: {status}")# Example usage
if __name__ == "__main__":pinlist_file = "./file_name"# Replace with actual pin listlib_file = "your_lib.lib"           # Replace with actual lib file pathmain(pinlist, lib_file)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工作记录】F12查看接口信息及postman中使用

可参考 详细教程&#xff1a;如何从前端查看调用接口、传参及返回结果&#xff08;附带图片案例&#xff09;_f12查看接口及参数-CSDN博客 1、接口信息 接口基础知识2&#xff1a;http通信的组成_接口请求信息包括-CSDN博客 HTTP类型接口之请求&响应详解 - 三叔测试笔记…

《自然》:陆地蒸散量研究的统计失误被撤回-空间加权平均的计算方法

文章目录 前言一、空间加权平均的计算方法二、代码1.Python 实现2.MATLAB代码 前言 In this article, we calculated global land evapotranspiration for 2003 to 2019 using a mass-balance approach. To do this, we calculated evapotranspiration as the residual of the…

开源软件许可证冲突的原因和解决方法

1、什么是开源许可证以及许可证冲突产生的问题 开源软件许可证是一种法律文件&#xff0c;它规定了软件用户、分发者和修改者使用、复制、修改和分发开源软件的权利和义务。开源许可证是由软件的版权所有者&#xff08;通常是开发者或开发团队&#xff09;发布的&#xff0c;它…

【el-upload】el-upload组件 - list-type=“picture“ 时,文件预览展示优化

目录 问题图el-upload预览组件 PicturePreview效果展示 问题图 el-upload <el-uploadref"upload"multipledragaction"#":auto-upload"false":file-list"fileList"name"files":accept".png,.jpg,.jpeg,.JGP,.JPEG,.…

微前端 qiankun vite vue3

文章目录 简介主应用 qiankun-main vue3 vite子应用 qiankun-app-vue2 webpack5子应用 qiankun-react webpack5子应用 quankun-vue3 vite遇到的问题 简介 主要介绍以qiankun框架为基础&#xff0c;vite 搭建vue3 项目为主应用&#xff0c;wepack vue2 和 webpack react 搭建的…

C#从入门到精通(1)

目录 第一章 C#与VS介绍 第二章 第一个C#程序 &#xff08;1&#xff09;C#程序基本组成 1.命名空间 2.类 3.Main方法 4.注释 5.语句 6.标识符及关键字 &#xff08;2&#xff09;程序编写规范 1.代码编写规则 2.程序命名方法 3.元素命名规范 第三章 变量 &…

东隆科技携手PRIMES成立中国校准实验室,开启激光诊断高精度新时代

3月12日&#xff0c;上海慕尼黑光博会期间&#xff0c;东隆科技正式宣布与德国PRIMES共同成立“中国校准实验室”。这一重要合作标志着东隆科技在本地化服务领域的优势与PRIMES在激光光束诊断领域的顶尖技术深度融合&#xff0c;旨在为中国客户提供更快速、更高精度的服务以及本…

HarmonyOS Next~鸿蒙系统架构设计解析:分层、模块化与智慧分发的技术革新

HarmonyOS Next&#xff5e;鸿蒙系统架构设计解析&#xff1a;分层、模块化与智慧分发的技术革新 ​ ​ 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;作为华为自主研发的分布式操作系统&#xff0c;其架构设计以全场景、多设备协同为核心目标&#xff0c;通过分层架构、模…

Vue Router工作原理探究

摘要&#xff1a; 随着单页应用&#xff08;SPA&#xff09;的广泛流行&#xff0c;路由系统成为前端开发中至关重要的部分。Vue Router作为Vue.js官方的路由管理器&#xff0c;为Vue应用提供了强大的路由功能。本文深入探讨Vue Router的工作原理&#xff0c;包括其核心概念、路…

SysOM 可观测体系建设(一):万字长文解读低开销、高精度性能剖析工具livetrace

可观测性是一种通过分析系统输出结果并推断和衡量系统内部状态的能力。谈及可观测性一般包含几大功能&#xff1a;监控指标、链路追踪、告警日志&#xff0c;及 Continues Profiling 持续剖析能力。对于操作系统可观测&#xff0c;监控指标可以帮助查看各个子系统&#xff08;I…

网络安全设备配置与管理-实验4-防火墙AAA服务配置

实验4-p118防火墙AAA服务配置 从这个实验开始&#xff0c;每一个实验都是长篇大论&#x1f613; 不过有好兄弟会替我出手 注意&#xff1a;1. gns3.exe必须以管理员身份打开&#xff0c;否则ping不通虚拟机。 win10虚拟机无法做本次实验&#xff0c;必须用学校给的虚拟机。首…

路由Vue Router基本用法

路由的作用是根据URL来匹配对应的组件&#xff0c;并且无刷新切换模板的内容。vue.js中&#xff0c;可使用Vue Router来管理路由&#xff0c;让构建单页应用更加简单。 一、效果 二、实现 1.项目中安装Vue Router插件 pnpm install vue-routerlastest 2.main.js import { …

24. 状态模式

原文地址: 状态模式 更多内容请关注&#xff1a;智想天开 1. 状态模式简介 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时改变其行为&#xff0c;使得该对象看起来似乎修改了其类。状态模式通过将状态的行…

【Qt】Qt + Modbus 服务端学习笔记

《Qt Modbus 服务端学习笔记》 1.因为项目的需要&#xff0c;要写一个modbus通信&#xff0c;csdn上感觉有些回答&#xff0c;代码是人工智能生成的&#xff0c;有些细节不对。我这个经过实测&#xff0c;是可以直接用的。 首先要包含Qt 的相关模块 Qt Modbus 模块主要包含以…

CherryStudio + 火山引擎DeepSeek R1 告别服务器繁忙

CherryStudio 火山引擎DeepSeek R1 告别服务器繁忙 一、下载CherryStudio并安装 CherryStudio是功能强大的多模型桌面客户端&#xff0c;支持Windows、macOS和Linux系统。集成了多种主流的大语言模型&#xff08;如OpenAI、DeepSeek、Gemini等&#xff09;以及本地模型运行功…

医院人事科室病区管理系统基于Spring Boot-SSM

目录 摘要 一、研究背景与意义 二、国内外研究现状 三. 系统目标 四、研究目的与内容 五、研究方法与技术路线 5.1 系统技术架构 六. 系统功能 6.1 人事管理 6.2 科室病区管理 6.3 科研管理 七. 系统安全性 八. 系统运行与维护 摘要 随着医疗行业的快速发展和医院…

Unity TextMeshPro中显示建筑特殊符号

示例&#xff1a;显示效果如图 实现步骤 1、下载 SJQY 字体库 2、导入字体&#xff1a;将 SJQY 字体文件&#xff08;如 .ttf 或 .otf 文件&#xff09;导入到 Unity 项目的 Assets 文件夹中。 3、创建 TMP 字体资产 方法一 方法二 选择刚导入的字体文件&#xff0c;在…

工具层handle_excel

该工具类利用openpyxl的load_workbook加载Excel&#xff0c;通过iter_rows按行迭代数据&#xff0c;将表头和用例数据用zipdict组合成字典&#xff0c;通过list.append将字典(单条测试用例)追加到列表中&#xff0c;从而封装Excel数据解析工具。 模块/类方法/属性使用场景描述o…

九、JavaScript作用域、预解析

一、JavaScript作用域 1.JavaScript作用域 ①代码名字&#xff08;变量&#xff09;在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突 ②js的作用域&#xff08;es6&#xff09;之前&#xff1a;全局作用域 局部作用域 ③全局作用域&#xff1a;整…

Rust语言学习

Rust语言学习 通用编程概念所有权所有权引用和借用slice struct(结构体)定义并实例化一个结构体使用结构体方法语法 枚举 enums定义枚举match控制流运算符if let 简单控制流 使用包、Crate和模块管理不断增长的项目&#xff08;模块系统&#xff09;包和crate定义模块来控制作用…