找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 3|回复: 0
打印 上一主题 下一主题

[硬件] 论坛推荐:怎样写出好的脚本-流程的开发与建立

[复制链接]

551

主题

1470

帖子

3万

积分

EDA365管理团队

Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

积分
39487
跳转到指定楼层
1#
发表于 2019-9-27 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
我不是专业的程序员,我也没有太固定的coding style,只是最近在写一个utility,有些许感想,加上在之前网上收集了一些参考资料,遂想整理出来,以享需要之同志。
* z4 F  ~  I* \1 D, n8 m0 F2 |7 r  K, t这个系列暂时还没想好写多少,目前有以下几个议题,在此基础上展开来写:# F4 m" a" H9 r6 ~. |' ~1 t* Z# j
    ( y0 }% m; c' }7 n3 y% }' E" N  o
  • 脚本流程的开发与建立(本文)
    , r2 f8 [% t, E% ]: O' E
  • 降低维护成本需要的好习惯( a4 }7 f, ]8 ?6 K& x7 @! w1 G
  • 权衡流程自动化与深入学习之间的矛盾( ^- ]+ O1 ]7 r+ l4 t) u

5 C9 C* d# B1 `" ]& a* i8 G* K, Q# ^今天开始将第一个议题:流程的开发与建立
7 D! ?$ H2 S- f3 Q( I$ |
flow chart
: N5 ], c9 D# k5 x9 e

% P) k5 k6 G; h- M+ T7 V2 y( u
+ n+ G; b. S: T5 N我是做IC的,大规模集成电路,在我们行业里,一切按流程办事早已成为一种共识,主要是因为集成电路的生产工艺要求很高,生产成本巨大,技术门槛相对较高(专业化),开发周期相对较长(相对传统制造业)。
5 c% Q4 L# Q  b/ F3 [
$ b  R# g* |" k8 o4 b1 p, i
3 F7 k; E- t; W$ REDA工具都有一套行之有效地参考flow,每家公司都会开发一些flow和工具,来提高员工的工作效率,标准化开发手段。那么怎样的flow才是一个好的flow呢?大家的意见都是不同的,我只是管中窥豹地讲下我认为的好flow是怎么样子的。8 \! n) V* n: c7 j
请看图(原创,如需引用请表明出处):) @# z; |% M/ O, {
+ V  F6 [4 D7 Q4 \+ p

5 [. f# l- t* c
    ' M/ n/ C; q1 m' ^. z/ b1 \9 e
  • flow是最外层与用户交互的部分,接受用户的输入,给予用户输出结果
    0 H$ i, X9 z' C  R" C- ]) D3 x
  • flow与核心的工具没有关系,flow行驶的是管理和后勤之类的事情,而真正生产线上是生产汽车还是生产iphone,这对于flow来说没有差别
    & U6 X# n) f! K/ k4 m) U
  • flow中应该要包含项目管理和时间控制等等子模块,这些子模块本身可能也是一个比较复杂的过程5 [" Z! m5 k$ i0 z. E# d
  • 确定执行具体功能脚本的机制,尽可能降低维护成本
    * S4 V) j4 N8 ~% ~& c9 N! S

$ G/ ^2 E$ C; ?) z7 `4 s5 v2 F对于Tcl来做flow controller,以下两种方式的调用子功能的方法做个比较:, H* g6 k8 F  h
— proc 实现子功能* V( U. `) w; d; _+ O9 J) n$ e) _
    ; s: f' G3 B3 c" L% D8 W7 R5 t' k
  • 作用域不明确,需要不断切换,EDA工具的所有配置都是在global domain里的,proc封装之后经常会发生作用域不明确,给开发带来额外的负担
    4 D  E+ O. _3 U9 j, A
  • 方便管理,责任明确
    & [5 D/ v: n' L8 I( I
  • 更新维护方便
    " s2 B, I  a5 ]
  • 复用性强8 A% W+ q' [  L

) }; Q5 a6 v3 w1 f5 Z8 O# T* |— eval 运行子功能模块
6 ?3 Y/ [3 h: M
    + Q- ?, A1 u% u' e1 b, C) T
  • 运行排错滞后,不能在source的时候就发现一些code上的基本错误; M' b- R6 K! r2 J1 c3 l, Z
  • 所有功能模块都是在global域内执行的,功能模块中使用到的变量的作用域被扩大
    - s% p: z5 Z; b3 Z1 @
  • 开发调试上的便利
    + o/ Y, S% Z) a& e
  • 可复用4 J8 D( f) [. \# D& o/ R( h6 V& q4 {
  • 使用wrapper的方式运行具体脚本,便于流程的建立
    4 n% N( D- K7 R8 ?; E
6 ]; }* B& B/ {1 T% I2 X; {1 w
由于eval的第三条,我采用的是eval来运行具体的功能模块,相当于给具体的脚本加了一层wrapper,可以做到flow与具体功能脚本隔绝开来,能更好地对flow之外的过程进行详细的控制。9 G# l: f! K8 D* }5 r3 U
对于方便管理和责任明确,维护方便等优点,我自建了一套debug系统,自己建立数据联系,将脚本管理,维护方式,错误报告等统一起来。* w8 Z; p; V1 Q' \1 m3 L" X$ t
而复用这个问题上,eval的确没有proc来得强,也不可能做到封装,而灵活性本来就是eval的优点,这个要有所取舍了。/ o: @" {2 _6 Y
我编写的这个flower cotrolloer有如下特性:$ }8 Z# ^3 v' M: W/ v

    7 I  A5 U& w% m1 X1 q
  • 读取excel做为配置文件,实则是转换为ASICII文件后做为flow cotroller的配置文件;
    7 H4 Y$ x. I8 C! y# u+ k
  • 每个子功能模块需要的信息都定义在配置文件中,包括维护者,各种特性,有flow cotroller读取并存储在变量里;1 m/ ^8 ~6 u: {& S1 L' l
  • 有自己的message system,定义多种message的级别;
    ! T+ O2 |, I3 @( w# L
  • 输入信息的总体check,有不合理的return并给出解决办法;0 D$ @, y0 ^- S+ q7 g
  • 每个子功能模块有tag机制,方便扩展后续功能;9 f8 n7 x6 O+ Z( b, m
  • 子模块出错,自动发送mail给维护者,抄送当前用户并记录出错时的error message和所有相关变量的值4 @5 @4 R9 z4 u: e/ ^1 K
  • 监控子模块的运行时间runtime9 Q# x4 [: h6 u! J6 s
  • flow run结束有mail提醒,mail中有概要的运行结果信息
    , x! b, }/ C0 g" Q1 A# Z
  • 最终结果以网页的形式发布: K3 }9 p1 s1 ]9 j0 m$ S! j& W
  • 使用list来代替bool输入5 X1 `6 v& Z3 T
  • 适用于ICC/EDI并可以支持其他工具1 q& I4 v+ S/ A( l# t0 r1 G
  • 预留了prerun和postrun的接口
    9 @* {7 G/ d" D- v
  • 各种模式切换的接口+ Q' R( x; H* ~# N* Q

1 y. ^' @) ~& c, u这些事主要功能,还有很多贴心的小地方在用户的不断测试中在完善。# l( h  O5 [# B, N! `
分享一个Tcl运行cmd set的wrapper :整套cmd set包含exeCmdSet, msgCmdSet, cfgCmdSet三个命令和一个全局数组变量varCmdSet。9 }* W5 m  x$ f; G/ Y4 t( D2 e5 @0 H

    2 N9 z/ Z2 D- E; f' w/ }. _
  • 可接受数据输入5 P  `0 w9 h/ M: I
  • 计算runtime
    + J( Q) Z/ E- g, R& y/ g
  • mute消息8 e3 t+ a, f2 r7 F6 @  V4 q
  • 自定义array
    , W! v# `+ }8 t: x
?Download execmdset.proc
! F" a3 i7 c* T1 U8 V

    ' k8 j" ^7 J  R4 j1 U
  • proc exeCmdSet {args} {  t. S2 U7 t6 f% _! D

    1 o. U5 n2 s$ I! C0 T
  • 4 {+ t/ @2 S: e; I5 h
    % A! T# n5 d9 [" D- p2 `' B( H. y# N
  • global varCmdSet ;1 K7 T8 T6 t2 r7 ]3 k
    $ |$ w' j8 Y- ?% f
  • my_parse_proc_arguments -args $args alist ;
    . g% C( i% ]2 c! {9 z# \1 F$ F
  • ...$ Z8 Z# p6 R& ]+ J5 u; h

    # i' B, B. C( j+ i
  • }0 s3 o4 W5 B, }* P5 N7 d( o& q$ }, o1 n

    % a* M9 y5 T. q" ?+ }3 ^
  • my_define_proc_arguments exeCmdSet -info "Evaluate tasks defined in -array, default is strCmdSet" \
    8 V, d& ^7 E- d7 a6 |
    . e- Q, J5 j; I  e
  • -define_args {
    . v) I$ J& U& v: e, n
    + M0 n5 q/ P: R4 @) {7 e) \9 G, [6 \
  • {task     "Name of tasks" tasks list required}
    / d% T4 D3 K- q0 e( f$ N$ l7 l$ u8 o2 m
  • {-nomsg   "Boolean to control the stdout msg" "" boolean optional}
    % A6 K7 m  |5 X; h2 U5 V: o$ J$ L+ R5 p
  • {-array   "Array to exec" array string optional}
    / P* f% R* Z# C8 a4 o, x& ]# c9 X
    " H2 H% d7 u" b+ s/ ~9 w. x# ~2 M
  • {-runtime "Calculate the runtime" "" boolean optional}" N5 @) Q2 ^6 h, `  J; \

    0 j# q6 E: w8 i% P$ x5 T, X
  • {-data    "Data store in varCmdSet" data list optional}. M, Y) _# j0 w" W- T
    ; U0 l/ @: X  }" c' |* `
  • }/ i, c& j! f. P8 p- K7 L
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-4-9 17:34 , Processed in 0.059846 second(s), 32 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表