EDA 中的 DRC检测——并查集优化mincut规则检测

目录
  • 背景
  • 步骤分析
  • 代码分析
    • 预处理
    • 并查集合并和统计
    • 并查集实现

背景

随着集成电路工艺的提升,电路导线尺寸越来越小,但是在电路中存在一类导线的线宽相比普通导线会更宽。这类较宽的导线对于上下层连接的通孔数也有更高的要求,甚至对于与这类宽导线连接的细导线,在细导线上连接上下层的通孔数也有更高的要求,这就是芯片制作过程中要求检查的最小通孔数设计规则。

为了实现对于这一规则的快速检测,可以通过使用并查集预处理的方式,提前标记通孔数量,快速判断这一类 drc。

步骤分析

使用并查集处理的步骤包括:

  1. 获取电路设计中的通孔数据,并为每个通孔创建独立的并查集标识符;
  2. 加载至少一条最小通孔数设计规则,在所述设计规则定义有通孔分组条件及最小通孔数量(即规则中要求的不同通孔之间的距离约束和数量约束);
  3. 针对每一条设计规则,基于所述通孔分组条件对所有通孔进行并查集合并,得到与所述设计规则对应的并查集集合,并记录所述并查集集合内的实际通孔数量;
  4. 遍历金属层导线,根据当前设计规则下的宽度要求判断待检测导线的类型;
  5. 根据待检测导线的类型获取与所述待检测导线连接的目标通孔,并查询所述目标通孔针对所述当前设计规则所归属的并查集集合以及该并查集集合内的实际通孔数量;
  6. 比较所述实际通孔数量与所述当前设计规则要求的最小通孔数量,若所述实际通孔数量小于所述最小通孔数量,则为所述目标通孔创建违规标志。

整个过程中主要步骤就是第3步,基于检测规则,将不同通孔用并查集进行合并和记录集合内通孔数量。在需要检查规则时,可以直接查找数量,不用再做其他操作。

同时也需要注意一些细节,比如如果存在多条规则,每个通孔对于每条规则都应该存在一个并查集 id 用于记录不同规则的合并情况;再比如,其实通孔的并查集 id 也可以被简化掉,直接记录规则和对应的集合内通孔数量;甚至并查集处理后完全可以判断出是否可能违反规则,那么使用这些通孔的导线也不需要对于此规则进行是否需要检测规则的判断。

另外,其实并查集处理完全可以放在读入数据后,作为通孔的基本属性处理,基本把检查过程简化为了最基础的数值比较,对内存和时间的开销都很小。

代码分析

预处理

/* by 01022.hk - online tools website : 01022.hk/zh/dnslt.html */
UtilzDisjointSet<UInt> dSet;
// 使用并查集初始化
for (citer1.first(cut_list); !citer1.last(cut); citer1++) {
  for (citer2.first(cut_list); !citer2.last(rd_cut); citer2++) {
    i++;
    dSet.makeSet(i);
    if (cut->box()->equal(rd_cut->box())) {
      cut_idx = i;
    }
  }
}

并查集合并和统计

/* by 01022.hk - online tools website : 01022.hk/zh/dnslt.html */
// 合并通孔
i = 0;
for (citer.first(cut_list); !citer.last(rd_cut); citer++) {
  i++;
  ibox.set(rd_cut->box());
  ibox.oversize(cut_spc, cut_spc);
  j = 0;
  for (citer2.first(cut_list); !citer2.last(rd_cut2); citer2++) {
    j++;
    if (rd_cut2->box()->equal(rd_cut->box())) { continue; }
    if (!ibox.isNonTouch(rd_cut2->box())) { // touch
      int fi = dSet.find(i);
      int fj = dSet.find(j);
      if (fi != fj) dSet.unionFunc(i, j);
    }
  }
}

// count cuts number
int find_cut_id = 0;
if (cut_list->getObjCount()) {
  find_cut_id = dSet.find(cut_idx);
}
cuts_number = 0;
i = 0;
for (citer.first(cut_list); !citer.last(rd_cut); citer++) {
  i++;
  int fi = dSet.find(i);
  if (find_cut_id == fi) cuts_number++;
}

并查集实现

template <typename T>
class UtilzDisjointSet {
 public:
  typedef int Id;
  void makeSet(const T& item) {
    Id id = sets_.getNumElements();
    Set s(id);
    sets_.append(s);
    map_.insert(item, id);
  }
  Id find(const T& item) {
    Id id = map_.getValue(item);
    return find_1(id);
  }
  void unionFunc(const T& a, const T& b) {
    union_1(find(a), find(b));
  }

 private:
  void union_1(Id a, Id b);
  Id find_1(Id id) {
    Set& s = sets_[id];
    if (s.parent_ == id) {
      return id;
    }
    s.parent_ = find_1(s.parent_);
    return s.parent_;
  }

  struct Set {
    int parent_;
    int rank_;
    Set(Id id) {
      parent_ = id;
      rank_ = 0;
    }
  };

  UtilzArray<Set> sets_;
  UtilzMap<T, Id> map_;
};

template <typename T>
void UtilzDisjointSet<T>::union_1(Id x, Id y) {
  Id xId = find_1(x);
  Id yId = find_1(y);
  if (xId == yId) {
    return; // 已合并
  }

  Set& xSet = sets_[xId];
  Set& ySet = sets_[yId];
  if (xSet.rank_ < ySet.rank_) {
    xSet.parent_ = yId;
  } else if (xSet.rank_ > ySet.rank_) {
    ySet.parent_ = xId;
  } else { // 秩相等,加一
    ySet.parent_ = xId;
    xSet.rank_++;
  }
}
内容概要:本文围绕新一代传感器产品在汽车电子电气架构中的关键作用展开分析,重点探讨了智能汽车向高阶智能化演进背景下,传统传感器无法满足感知需求的问题。文章系统阐述了自动驾驶、智能座舱、电动化与网联化三大趋势对传感器技术提出的更高要求,并深入剖析了激光雷达、4D毫米波雷达和3D-ToF摄像头三类核心新型传感器的技术原理、性能优势与现存短板。激光雷达凭借高精度三维点云成为高阶智驾的“眼睛”,4D毫米波雷达通过增加高度维度提升环境感知能力,3D-ToF摄像头则在智能座舱中实现人体姿态识别与交互功能。文章还指出传感器正从单一数据采集向智能决策升级,强调车规级可靠性、多模态融合与成本控制是未来发展方向。; 适合人群:从事汽车电子、智能驾驶、传感器研发等相关领域的工程师和技术管理人员,具备一定专业背景的研发人员;; 使用场景及目标:①理解新一代传感器在智能汽车系统中的定位与技术差异;②掌握激光雷达、4D毫米波雷达、3D-ToF摄像头的核心参数、应用场景及选型依据;③为智能驾驶感知层设计、多传感器融合方案提供理论支持与技术参考; 阅读建议:建议结合实际项目需求对比各类传感器性能指标,关注其在复杂工况下的鲁棒性表现,并重视传感器与整车系统的集成适配问题,同时跟踪芯片化、固态化等技术演进趋势。
内容概要:本文系统阐述了汽车电子软件测试的整体框架,重点围绕软件及系统集成测试、软件与系统(需求)测试、验收测试、测试报告编写以及整体测试状态汇总五大核心环节展开。详细说明了软件集成测试与系统集成测试在组件聚合、软硬协同、接口验证等方面的实施策略与技术差异,明确了软件测试偏重逻辑正确性(白盒)、系统测试关注端到端行为表现(黑盒)的定位区分,并强调验收测试正从工程交付关口转变为用户价值验证的核心环节。同时,文章指出测试报告需建立需求与用例间的可追溯链,整体测试状态汇总则是呈现软件质量全景的“仪表盘”,对于多域协同的复杂汽车系统至关重要。; 适合人群:从事汽车电子、嵌入式系统开发与测试的工程师,尤其是工作1-3年、希望深入理解软件测试体系与流程的中初级技术人员;也适用于项目管理人员和技术负责人; 使用场景及目标:①理解汽车软件测试各阶段的边界、职责与协作关系;②掌握集成测试中软/硬件接口验证的方法论;③构建从技术测试到用户价值验证的全局视角,提升测试策略设计能力; 阅读建议:此资源以工程实践为基础,结合ASPICE等标准演进,不仅讲解测试技术细节,更强调测试管理与用户思维的融合,建议结合实际项目流程对照学习,并关注各测试层级之间的衔接与追溯机制。
华为鸿蒙操作系统(HarmonyOS)的示例项目 HarmonyOSSampleCloud-main 为开发者提供了一个实践性强的学习资源。该项目包含了构建轻量级应用所需的完整代码、资源及相关说明文档,旨在帮助开发者深入理解鸿蒙平台上的应用开发流程。以下是对鸿蒙轻应用开发关键要素的系统性阐述。 1. **鸿蒙操作系统(HarmonyOS)**:作为华为自主研发的分布式操作系统,鸿蒙旨在为智能手机、平板电脑、可穿戴设备及智能家居等多种终端提供统一的操作平台。其设计强调跨设备协同、分布式架构以及高效的系统资源管理。 2. **轻应用(Lightweight Application)**:在鸿蒙生态中,轻应用是一种无需安装即可快速使用的应用形态,类似于主流平台中的“即用即走”应用,但具备更广泛的硬件适配能力。这类应用可深度集成至系统层,为用户提供连贯的交互体验。 3. **开发环境**:华为官方推出的集成开发环境 DevEco Studio 为鸿蒙应用开发提供了全面支持。该工具集成了代码编写、调试、模拟运行及性能分析等功能,并支持使用 Java 或 JavaScript 进行开发。 4. **开发框架**:鸿蒙轻应用主要依托 JavaScript 框架(如 JSFusion)构建用户界面与业务逻辑。此外,Alink 框架专注于实现设备间的服务发现与流转,强化跨设备协同能力。 5. **模块化构建**:采用组件化的开发模式,允许将应用功能分解为独立且可复用的模块,从而提升代码的可维护性与扩展性。 6. **系统接口与服务**:鸿蒙平台提供了丰富的开放接口,涵盖系统功能调用、数据存取、网络通信等多个方面,便于开发者高效利用平台能力。 7. **构建与封装**:通过 DevEco Studio,开发者可将源代码编译打包为 HAP(HarmonyOS Ability Package)格式的文件,该文件包含了应用运行所需的全部代码与资源。 8. **测试与优化**:开发环境内置了模拟器与真机调试工具,支持故障排查与性能调优。同时提供专业的性能分析工具,帮助开发者提升应用运行效率。 9. **发布与分发**:开发完成的应用可提交至华为应用市场(AppGallery)进行审核,通过后即可面向用户分发,方便用户在官方渠道获取和使用。 10. **动态更新**:鸿蒙轻应用支持热更新机制,允许在不重新安装应用的情况下完成版本迭代,从而减少用户操作负担,提升体验流畅度。 借助 HarmonyOSSampleCloud-main 示例项目,开发者能够系统学习项目配置、代码编写、接口调用、事件响应及界面布局等核心开发技能。该项目既适合入门者建立开发基础,也可作为有经验开发者熟悉鸿蒙技术体系的参考资源。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值