当前位置: 首页 > news >正文

UVa 192 Synchronous Design

题目分析

在数字集成电路设计中,同步设计是保证芯片正确性的关键。一个电路要满足同步设计,需要满足两个条件:

  1. 无异步节点构成的环:如果电路中存在完全由异步节点(如ANDOR等逻辑门)组成的环,实际电路中可能产生振荡,导致行为不可预测。
  2. 最大延迟不超过时钟周期:任意两个同步节点(触发器)之间的路径延迟必须小于等于给定的时钟周期,否则信号无法在下一个时钟边沿前稳定。

题目给定电路的节点信息(类型和延迟)、连接关系以及时钟周期,要求判断电路是否满足同步设计,并输出相应的结果。

节点类型

类型代码说明
输入i外部输入,延迟为000
输出o外部输出,延迟为000
同步节点s触发器,延迟为000
异步节点a逻辑门,有正延迟

解题思路

第一步:检测异步节点环

要检测一个有向图中是否存在由异步节点构成的环,可以使用拓扑排序。只考虑异步节点:

  • 计算每个异步节点的入度(只统计来自异步节点的边)
  • 重复删除入度为000的异步节点及其出边
  • 如果最后还有异步节点未被删除,说明存在异步节点环

第二步:计算最大路径延迟

如果没有异步环,则计算所有从“输入或同步节点”出发到“同步或输出节点”结束的路径的最大延迟和。

由于图已无环,可以使用DFS\texttt{DFS}DFS回溯搜索:

  • 从每个输入节点或同步节点开始
  • 沿边遍历,累加节点延迟
  • 遇到同步或输出节点时,更新最大延迟

第三步:比较与输出

  • 若存在异步环 →Circuit contains cycle.
  • 否则,若最大延迟>>>时钟周期 →Clock period exceeded.
  • 否则 →Synchronous design. Maximum delay: <ss>.

代码实现

// Synchronous Design// UVa ID: 192// Verdict: Accepted// Submission Date: 2016-03-27// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;// 节点类型常量constintINPUT=0,OUTPUT=1,SYN=2,ASYN=3;conststring typeText="iosa";// 节点结构体structvertex{intindex;// 节点编号intdelay;// 节点延迟(异步节点有效)inttype;// 节点类型};vector<vertex>verties;// 所有节点vector<int>path;// DFS 路径缓存vector<vector<int>>edges;// 邻接表intmaximumDelay;// 最大路径延迟// 拓扑排序检测是否存在异步节点构成的环boolfindCycle(){vector<int>connections;connections.resize(verties.size());fill(connections.begin(),connections.end(),0);// 计算每个异步节点的入度(仅考虑异步节点之间的边)for(inti=0;i<edges.size();i++)for(intj=0;j<edges[i].size();j++)if(verties[edges[i][j]].type==ASYN)connections[edges[i][j]]++;vector<bool>removed;removed.resize(verties.size());fill(removed.begin(),removed.end(),false);boolnodeRemoved=true;intnumberRemovedNodes=0;// 反复删除入度为 0 的异步节点while(nodeRemoved){nodeRemoved=false;for(inti=0;i<removed.size();i++)if(removed[i]==false&&connections[i]==0){nodeRemoved=true;numberRemovedNodes++;removed[i]=true;// 删除该节点的所有出边,更新后继节点的入度for(intj=0;j<edges[i].size();j++)if(verties[edges[i][j]].type==ASYN)connections[edges[i][j]]--;}}// 若还有异步节点未删除,说明存在环returnnumberRemovedNodes!=verties.size();}// DFS 回溯搜索所有路径,计算最大延迟voidforward(intv,intindex){path[index]=v;// 当前路径终点是同步节点或输出节点时,计算路径总延迟if(index>=1&&verties[path[index]].type!=ASYN){inttempMax=0;for(inti=0;i<=index;i++)tempMax+=verties[path[i]].delay;maximumDelay=max(tempMax,maximumDelay);}else{// 否则继续 DFSfor(inti=0;i<edges[v].size();i++)forward(edges[v][i],index+1);}}// 从所有输入节点和同步节点开始搜索最长路径voidfindMaximumDelay(){path.resize(verties.size());maximumDelay=0;for(inti=0;i<verties.size();i++)if(verties[i].type==INPUT||verties[i].type==SYN)forward(i,0);}intmain(){intclock,circuits,delay,nodes,start,end,typeIndex;string type;cin>>circuits;// 读取电路数量while(circuits--){cin>>clock>>nodes;// 时钟周期和节点数verties.clear();edges.clear();edges.resize(nodes);// 读取每个节点信息for(inti=0;i<nodes;i++){cin>>type>>delay;typeIndex=(int)typeText.find(type);// 输入、输出、同步节点的延迟均为 0if(typeIndex==INPUT||typeIndex==OUTPUT||typeIndex==SYN)delay=0;verties.push_back((vertex){i,delay,typeIndex});}// 读取连接关系intm;cin>>m;for(inti=1;i<=m;i++){cin>>start>>end;edges[start].push_back(end);}// 判断异步环if(findCycle())cout<<"Circuit contains cycle."<<endl;else{// 计算最大路径延迟findMaximumDelay();if(maximumDelay>clock)cout<<"Clock period exceeded."<<endl;elsecout<<"Synchronous design. Maximum delay: "<<maximumDelay<<"."<<endl;}}return0;}

总结

本题核心是图的环检测与路径搜索:

  • 环检测:使用拓扑排序,只关注异步节点,判断是否存在异步环。
  • 最大延迟计算:在无环图中,通过DFS\texttt{DFS}DFS枚举所有从输入/同步节点出发的路径,累加延迟并更新最大值。

算法时间复杂度为O(N2)O(N^2)O(N2)(最坏情况),对于题目给定的数据规模足够高效。

http://www.jsqmd.com/news/788919/

相关文章:

  • BetterNCM Installer:3步搞定网易云音乐插件安装,告别手动操作烦恼
  • 百度网盘提取码智能获取工具:3秒破解资源密码的终极指南
  • 用Python和树莓派GPIO玩转DHT11:手把手教你读懂单总线通信时序图
  • AI+与+AI的关键之处
  • 别让自举电路‘举’不起来:深入IR2104数据手册,搞懂H桥高端驱动的门道
  • SAP PS模块实战:如何把固定资产折旧费精准归集到项目WBS上(ACSET配置详解)
  • Source Han Serif CN字体深度应用指南:从技术原理到专业排版实践
  • 微信小程序集成ChatGPT:自部署AI助手实战指南
  • QMC音频解码完全手册:三步解锁加密音乐文件
  • ChatGPT-System-Prompts项目解析:构建高效AI提示词的工程实践
  • 小红书数据采集实战指南:高效Python工具深度解析
  • WebLogic实战:从零搭建企业级应用服务器(安装、Domain配置与核心管理)
  • 视频加速控制器:掌控在线视频播放速度的终极解决方案
  • 如何3分钟永久禁用Windows Defender?开源工具Defender Control终极指南
  • 如何轻松解密微信聊天记录:开源工具的完整指南
  • 2025届必备的五大AI辅助写作平台推荐
  • AI原生超算架构解析:从异构计算到万卡集群的优化实践
  • UVa 193 Graph Coloring
  • 从‘齿轮’到‘机械感’:Blender建模中容易被忽略的细节与渲染技巧(附材质文件)
  • 机械键盘连击终结者:Keyboard Chatter Blocker 的智能拦截方案
  • 2025年八大网盘直链下载助手:告别限速,轻松获取高速下载链接
  • 如何快速为Switch注入自定义系统:TegraRcmGUI终极指南
  • 终极Jable视频下载指南:3分钟掌握Chrome插件+一键保存全流程
  • 从踩坑到填坑:我的MicroBlaze程序固化实战记录(附Arty A7+Vitis详细配置清单)
  • Qovery Engine:基于Rust的云原生部署抽象层,简化多云Kubernetes管理
  • 重庆翡翠回收选哪家?收的顶30年老店,高价秒到账更靠谱! - 奢侈品回收测评
  • AI原生应用开发:多模态交互的核心实现与优化策略
  • GPT-5函数调用五模式:从JSON Schema到Lark语法的工程实践
  • Linux磁盘告急:巧用ncdu定位并清理/dev/sda高占用
  • BiSeNetv2:实时语义分割的巅峰之作——原理、架构与深度解析