草庐IT

Allegro Skill简介和换层skill(任意线路层)

Fantasy237 2023-12-02 原文

背景

一直想有一个在Allegro中换层的skill,比如输入l 1 2 3,就显示1、2、3这三层。最近学了点基础的Skill语言,简单写了一个,基本能用。
软件:Cadence Allegro 16.6

切层skill代码

; change_layer.il
; 放在.brd同路径下,allegro中执行skill load("change_layer.il")后可以使用
; 切换线路层,例如,
;l 1 2 ; 1/2 两层,
;l 3 4 5 ; 3/4/5 三层
;l ;清空显示
axlCmdRegister( "l" 'showlayers);注册指令"l"

defun(showlayers (@rest args)
	axlVisibleDesign(nil) ;清空显示
	foreach(item args 
		layerNum = evalstring(item)
		showlayer(layerNum)
		);设置每一层的显示
	axlVisibleUpdate(t) 
	)
	
defun(showlayer (layerNum)
	allLayer = axlGetParam("paramLayerGroup:ETCH")->groupMembers
	;axlVisibleDesign(nil)
	layerName = nthelem(layerNum allLayer) ;layerName = nthelem(2 allLayer)
	etchlayer = strcat("ETCH/" layerName)
	axlVisibleLayer(etchlayer t)
	when(axlDBGetLayerType(etchlayer) == "PLANE"
		axlVisibleLayer( "ANTI ETCH/ALL" t )) ;如果是plane,额外显示anti etch/all层	
	axlVisibleLayer(strcat("PIN/" layerName) t)
	axlVisibleLayer(strcat("VIA CLASS/" layerName) t) 
	axlVisibleLayer(strcat("BOUNDARY/" layerName) t) 
	axlVisibleLayer(strcat("DRC ERROR CLASS/" layerName) t)
	axlVisibleLayer(strcat("route keepout/" layerName) t)
	axlVisibleLayer(strcat("via keepout/" layerName) t)
	axlVisibleLayer(strcat("CONSTRAINT REGION/" layerName) t)
	axlVisibleLayer( "CONSTRAINT REGION/ALL" t )
	axlVisibleLayer( "BOARD GEOMETRY/OUTLINE" t )
	axlVisibleLayer( "route keepout/all" t )
	axlVisibleLayer( "route keepin/all" t )
	planlayer = strcat("PLAN/" layerName)
	when(axlLayerGet(planlayer)
		axlVisibleLayer( planlayer t ))
	axlSetActiveLayer(strcat("ETCH/" layerName))
	;axlVisibleUpdate(t)
	)

使用skill

临时使用

放在和.brd设计文件同一个路径下,在下方控制台输入skill load("change_layer.il"),即可使用。

Command > skill load("change_layer.il")
t
Command > l 2 3
Command > l 3 4 5

效果:

自动加载

  1. change_layer.il复制到x:\Cadence\SPB_16.6\share\local\pcb\skill目录下。
  2. 新建一个allegro.ilinit如下:(当然,也可以复制一份目录下的example.ilinit,改名为allegro.ilinit,加载当前目录下的所有.il文件。)
;allegro.ilinit
;x:\Cadence\SPB_16.6\share\local\pcb\skill
load("change_layer.il")
  1. allegro启动时会执行allegro.ilinit,加载change_layer.il

最后

  1. 和直接在右侧visibility一栏鼠标点击切换相比,感觉好像没有更方便?
    1. 可能涉及不同的class时,会显得更加方便,见后文的参考资料中的其他skill。扩展一下当前这个skill,也可以切机械层、丝印层等等。
  2. 也可以保存成view,并使用鼠标切换
    1. 的确是这样,但是键盘操作也有一定好处。比如,把用过的切层指令复制,存在剪贴板助手中,win+V(或者是DittoCopyQ等等),或是绑定成快捷键,后面调用也挺方便。

备忘

  1. 函数名showlayers和参数的括号(@rest args)之间必须加空格,否则会报错,查了好久。
    1. defun(showlayers (@rest args)

E- Error defun: argument #1 should be a symbol (type template = “sgg”) - _Check_Refdes_main()
=>必須將_Check_Refdes_main()** 改為_Check_Refdes_main () , main _與 ()_之間要空格
SKILL编程常见报错及解决办法(持续更新中……) - 编译调试 - Cadence Skill 论坛 - Powered by Discuz! (allegro-skill.com)

  1. 关于经常出现的tnil,简单看,t可以表示true,nil表示false或empty:The true condition is represented by the special atom t or anything other than nil.
  2. axlCmdRegister( "l" 'showlayers)
    1. 有两个shell,启动Allegro时,默认是在Allegro PCB Editor shell system,而skill语句是在SKILL-AXL这个shell中执行的。执行axlCmdRegister,在注册skill函数,则输入l这个指令+对应参数,会传入SKILL-AXL处理。
  3. axlVisibleUpdate 等函数:主要是和显示层有关的函数,见Allegro® User Guide: SKILL Reference
  4. nthelemforeach@rest等:skill语言的基本语法和函数,见SKILL Language User Guide
    1. nthelem(layerNum allLayer):从allLayer这个字符串list中取出第layerNum个字符串,即第layerNum层的层
    2. (@rest args)指示不定数量的参数。实现传入多个层号的效果。

上面这个skill的一些执行步骤记录:

  1. skill,进入SKILL-AXL这个shell;exit,退出。
Command > skill
Skill > allLayer = axlGetParam("paramLayerGroup:ETCH")->groupMembers
("TOP" "02_GND1" "03_SIG1" "04_GND2" "05_SIG2"
    "06_GND3" "07_SIG3" "08_GND4" "09_PWR1" "10_PWR2"
    "11_GND5" "12_SIG4" "13_GND6" "14_SIG5" "15_GND7"
    "BOTTOM"
)
Skill > layerNum=3
3
Skill > layerName = nthelem(layerNum allLayer)
"03_SIG1"
Skill > etchlayer = strcat("ETCH/" layerName)
"ETCH/03_SIG1"
Skill > axlVisibleLayer(etchlayer t)
t
Skill > exit
t
Command > 

参考资料

  1. SKILL Language User Guide: X:\Cadence\SPB_16.6\doc\sklanguser
  2. Allegro® User Guide: SKILL Reference: X:\Cadence\SPB_16.6\doc\algroskill
  3. 基于【skill源码】键盘切层工具clayer – Layouto修改而来,参考这个代码学习了一些基本语法和显示相关的函数,节省了不少时间。另外这个skill里面还有丝印层等指令。
  4. Gtopen (awesomeopensource.com) 另外一些skill,有空可以再看看。
  5. GitHub - hanun2999/cadence-skill另外一些skill2,有空可以再看看。
  6. 自定义skill的存放目录:Allegro PCB Skill Tutorial | Loading from file (referencedesigner.com)
  7. 用来展示的brd文件来源,KC705开发板,(登陆AMD账号后才能下载):Xilinx Kintex-7 FPGA KC705 Evaluation Kit

有关Allegro Skill简介和换层skill(任意线路层)的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  3. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  4. ruby - 从任意哈希初始化 Ruby 类,但仅具有匹配访问器的键 - 2

    有没有一种简单的方法可以列出已在Ruby类中设置的访问器/读取器?classTestattr_reader:one,:twodefinitialize#DosomethingenddefthreeendendTest.new=>[one,two]我真正想做的是允许初始化接受具有任意数量属性的哈希,但只提交已经定义了读者的那些。像这样的东西:definitialize(opts)opts.delete_if{|opt,val|notthe_list_of_readers.include?(opt)}.eachdo|opt,val|eval("@#{opt}=\"#{val}\"")end

  5. ruby - Ruby 的任意精度算术 - 2

    Ruby到底是怎么做到的?Jörg或其他人是否知道幕后发生的事情?不幸的是,我不太了解C,所以bignum.c对我帮助不大。我只是有点好奇有人可以解释(用简单的英语)它使用的任何神奇算法背后的理论。irb(main):001:0>999**99936806348825922326789470084006052186583833823203735320465595962143702560930047223153010387361450517521869134525758989639113039318944796977164583238219236607653663113200177617

  6. ruby:如何在调试时进入任意函数 - 2

    假设我在调试时停在了点上:defget_databyebug=>@cache||=calculate_dataend而@cache有值,所以step函数calculate_data不会被执行。但是我需要在这个确切的运行时点检查calculate_data内部发生了什么。我可以只执行calculate_data并在控制台输出中查看其结果,但是我可以从调试控制台执行函数并同时进入它?(使用byebug或其他一些调试工具)。目标-是在任意时间检查calculate_data逻辑,特别是当get_data调用时@cache已填充。 最佳答案

  7. ruby - 有没有办法将 html 刷新到 Sinatra 中的线路 - 2

    我有一个Sinatra应用程序,它有一个长时间运行的进程(网络抓取工具)。我希望应用程序在爬虫运行时而不是在结束时刷新爬虫进度的结果。我已经考虑过fork请求并使用ajax做一些有趣的事情,但这是一个非常基本的单页应用程序,实际上只需要在它发生时将日志输出到浏览器。有什么建议吗? 最佳答案 更新(2012-03-21)从Sinatra1.3.0开始,您可以使用新的流式API:get'/'dostreamdo|out|out旧答案不幸的是,您没有可以简单地刷新到的流(这不适用于Rack中间件)。从路由block返回的结果可以简单地响应

  8. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

  9. vue 实现内容超出两行显示展开更多功能,可依据需求自定义任意行数! - 2

    平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示展开更多按钮,点击即可显示全部内容,先来看看效果图: 这样做用户体验瞬间得到提升,接下来看看具体细节。0">主要操作在内容这里{{item.username}},……展开更多样式大家可依据自己项目需求进行设计,这里就不贴了,主要说几个关键的。1、在data中定义三个属性isShowMore:false, //控制展开更多的显示与隐藏textHeight:null, //框中内容的高度status:false, //内容状态是否打开2.计算内容是否

  10. ruby - 在 ruby​​ 中查找任意正则表达式的最后(最右边)匹配 - 2

    我正在用ruby​​开发一个文本编辑器,我需要使用用户提供的正则表达式模式来支持“查找”功能。这是一个简单(熟悉的)用例:JoeUseriseditingatextfile,andhaspositionedthecursorsomewhereinthemiddleofthefile.Hewantstosearchbackwardsfromthecurrentcursorlocationforthenearestsubstringmatchinganarbitraryregularexpression.我认为这个问题相当于将用户的模式应用于文件中光标位置之前的整个字符串。当然,我可以从文

随机推荐