|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
我不是专业的程序员,我也没有太固定的coding style,只是最近在写一个utility,有些许感想,加上在之前网上收集了一些参考资料,遂想整理出来,以享需要之同志。& J6 @: f9 h- U1 |6 q
这个系列暂时还没想好写多少,目前有以下几个议题,在此基础上展开来写:
" C/ a! b" G! ?# }, C: z% O I" M+ k+ K7 u5 @
- 脚本流程的开发与建立(本文). Y4 h$ x/ ^! k
- 降低维护成本需要的好习惯
& {* l0 ^+ E. y! ^' F - 权衡流程自动化与深入学习之间的矛盾' T% g& l1 P* |% D; K2 [
# U2 T$ H3 |# }; ~4 s a# X; z, K
今天开始将第一个议题:流程的开发与建立 " P0 q, C7 c3 A
flow chart 7 ]7 D( k+ K0 a
# J( b( Q; }0 X* A& M" V5 Q
# Q4 Q$ g" z' }! }2 S
我是做IC的,大规模集成电路,在我们行业里,一切按流程办事早已成为一种共识,主要是因为集成电路的生产工艺要求很高,生产成本巨大,技术门槛相对较高(专业化),开发周期相对较长(相对传统制造业)。
/ d% q& y* {* D9 c2 r! [
# Z5 \; h+ K* t, v2 `' s1 J8 y) S: x2 X4 ]/ n, E' f
EDA工具都有一套行之有效地参考flow,每家公司都会开发一些flow和工具,来提高员工的工作效率,标准化开发手段。那么怎样的flow才是一个好的flow呢?大家的意见都是不同的,我只是管中窥豹地讲下我认为的好flow是怎么样子的。' X2 ^. m: z ~6 @2 i) J; {
请看图(原创,如需引用请表明出处):8 [( c1 G1 v- i l; N* z' x
; F: c3 ?9 Y; b) D; a8 b
' X0 P+ N/ N, x3 F
. o. e% Z3 @2 h: d# \- flow是最外层与用户交互的部分,接受用户的输入,给予用户输出结果
8 N& B' H8 O1 _5 Z - flow与核心的工具没有关系,flow行驶的是管理和后勤之类的事情,而真正生产线上是生产汽车还是生产iphone,这对于flow来说没有差别3 P8 V' E8 I8 s5 Y8 `
- flow中应该要包含项目管理和时间控制等等子模块,这些子模块本身可能也是一个比较复杂的过程
# {% Y8 Q! h$ L# n0 J, S - 确定执行具体功能脚本的机制,尽可能降低维护成本
0 A! Q/ `) C% V/ b* X) o
4 Y) v3 z9 G; W! _6 }对于Tcl来做flow controller,以下两种方式的调用子功能的方法做个比较:1 b/ f6 e" u5 e
— proc 实现子功能/ |, W; p; v& ^2 `4 {' o4 Z
6 R9 f8 Y- m0 ]% x: l" l3 i+ O
- 作用域不明确,需要不断切换,EDA工具的所有配置都是在global domain里的,proc封装之后经常会发生作用域不明确,给开发带来额外的负担
! s2 x& f% H: j4 S P - 方便管理,责任明确
9 g0 X7 F! e2 ?# n# l - 更新维护方便6 j+ l, m6 D: B j% K" s9 ?
- 复用性强' H1 C6 l) f" G# ]% G, u
1 H" S# s: h' Y- M
— eval 运行子功能模块( Z: s$ X' { Y2 Q
8 y; n K( _& W e6 q. {5 v. v- i- 运行排错滞后,不能在source的时候就发现一些code上的基本错误& e1 _# l4 t8 f% X
- 所有功能模块都是在global域内执行的,功能模块中使用到的变量的作用域被扩大( I( [; f! i1 T$ u9 |
- 开发调试上的便利
+ \) T: I2 U3 }( j& E3 ~3 p - 可复用
8 K& ?, q i$ Y$ ` t! o - 使用wrapper的方式运行具体脚本,便于流程的建立9 `7 O+ j* x; G# J
* ^$ A, y: N+ |5 V/ p' a由于eval的第三条,我采用的是eval来运行具体的功能模块,相当于给具体的脚本加了一层wrapper,可以做到flow与具体功能脚本隔绝开来,能更好地对flow之外的过程进行详细的控制。9 e2 h$ S, b3 {: z
对于方便管理和责任明确,维护方便等优点,我自建了一套debug系统,自己建立数据联系,将脚本管理,维护方式,错误报告等统一起来。3 z% T# n. v* v* ?/ K9 ]6 @" g
而复用这个问题上,eval的确没有proc来得强,也不可能做到封装,而灵活性本来就是eval的优点,这个要有所取舍了。
# ~2 [) Y( D, i; r, L7 q% |8 ^我编写的这个flower cotrolloer有如下特性:
4 z- [! C3 o4 _$ [7 m. W/ P
2 g2 s! D. R6 m5 E- 读取excel做为配置文件,实则是转换为ASICII文件后做为flow cotroller的配置文件;6 l) p. p9 S( @) M' ^
- 每个子功能模块需要的信息都定义在配置文件中,包括维护者,各种特性,有flow cotroller读取并存储在变量里;1 Y$ f9 m' J, \# U: ]: e
- 有自己的message system,定义多种message的级别;2 t( `. |/ _+ ?7 F. _
- 输入信息的总体check,有不合理的return并给出解决办法;# X# B) Z) x( X5 S' d8 W0 ^5 j8 L
- 每个子功能模块有tag机制,方便扩展后续功能;1 d* L; ` h$ d2 E
- 子模块出错,自动发送mail给维护者,抄送当前用户并记录出错时的error message和所有相关变量的值$ L7 c6 t9 X5 C( v9 v
- 监控子模块的运行时间runtime3 ]/ W X7 m1 k2 ^0 v( V) p
- flow run结束有mail提醒,mail中有概要的运行结果信息
! |- X' X2 q+ r( a1 e* Z5 V0 k - 最终结果以网页的形式发布
" l2 Z+ w& [2 E: X - 使用list来代替bool输入" c, p- m% ^8 I: t, F% A$ ~% \
- 适用于ICC/EDI并可以支持其他工具
$ e1 `' O! I! @% g' I) J - 预留了prerun和postrun的接口7 S* ?+ ^7 ^& |0 z# @* |* w( A
- 各种模式切换的接口
& L# G2 ^- z, [
. A9 X6 h! h2 G4 }% c# x这些事主要功能,还有很多贴心的小地方在用户的不断测试中在完善。3 _6 B" [/ f7 r7 V( i
分享一个Tcl运行cmd set的wrapper :整套cmd set包含exeCmdSet, msgCmdSet, cfgCmdSet三个命令和一个全局数组变量varCmdSet。1 F: h5 M5 l) r; S0 F- r' B! j
1 q0 B; |& P+ h4 o0 _- 可接受数据输入
* Z: M! ~- {( n, }" g0 z. ^ { - 计算runtime4 ?8 M( n5 I. @& |" K
- mute消息/ K/ N5 V5 [$ P3 y7 M0 k& M5 N
- 自定义array
' o P% Q9 H$ b/ |5 D8 {% n ?Download execmdset.proc0 A% Q9 K+ q# ?* R/ {
9 F- m' G0 G3 Q- e4 {! G. N- proc exeCmdSet {args} {3 I. r9 u$ h! d+ L. V1 S
$ K" O ~3 H7 v1 s - 7 j. `8 B7 D% C. q
6 \% s7 }+ k4 X1 v* a- p - global varCmdSet ;
* G: ]% t( ?; ~- {: K2 @9 D7 ?; X' W
- my_parse_proc_arguments -args $args alist ;" z# j4 x- N- Q7 ~3 t" |. E
4 E3 e( B. y5 A' c& w
- ...! u- Y. M6 G3 Z
- ?2 Y4 b5 r! ?; C6 b
- }0 H" h$ {* O: L; I0 w
! u: Y- n9 T# i% l( M
- my_define_proc_arguments exeCmdSet -info "Evaluate tasks defined in -array, default is strCmdSet" \) {, s+ i1 [, h, l) C: b3 `
3 P; z- `" R0 Q+ s
- -define_args {
m! L, s3 Z' n. M1 h
& J$ H3 c& b1 g5 y) I- ]5 [ - {task "Name of tasks" tasks list required}3 A7 f) V0 S9 P
( m6 C& c9 L: ]$ X - {-nomsg "Boolean to control the stdout msg" "" boolean optional}4 W6 E; q- U8 m( @$ }
5 M8 N- e: @% i
- {-array "Array to exec" array string optional}& _) t H' I- R6 ~; L; K5 l. ]
, F. F) ~* L- Z0 }; a - {-runtime "Calculate the runtime" "" boolean optional}0 u# k$ Z: s9 s. Y6 ]2 S
! t" p/ t; F+ _- |9 T9 Z' b* f - {-data "Data store in varCmdSet" data list optional}
/ c* p+ i% i! d& y8 X$ C0 T
5 W2 K. j) g+ z" l+ o- G1 `' ] - }
, X. z; J. D9 i W/ u$ o) y 复制代码 |
|