IC 设计中很多情况都需要多家工具协助来完成设计。不切换设计平台的情况下怎么来集成需要的tool。目前常见的工具厂商都有提供这类集成的脚本与环境配置方案。自己开发的UI如何能与tool进行通信。下面用个实例介绍如何与CC进行通信。
开始前介绍几个专业名称解释:
IPC: (进程间通信)是两个程序之间的数据交换。 交换可以在同一台机器上运行的程序之间完成,也可以在网络上不同机器上运行的程序之间完成。
RPC: (远程过程调用)是一种编程接口,允许一个程序通过IPC 向另一个程序请求服务。 调用程序向另一个程序发送消息和数据,执行请求,并将结果返回给调用者。
Tcl/tk: 是一种免费提供的解释性脚本语言, tk是 Tcl 的免费扩展,提供创建图形用户界面的命令。
Wish: 支持Tk 命令的命令行Tcl 解释器。 图形应用程序可以通过编写Tcl/Tk脚本并通过wish解释器执行来创建。之前的文章P2P功能就是使用wish来启动tcl/tk编写的GUI脚本功能。
Tcl-Dp:是Tcl/Tk 的免费扩展,允许Tcl 解释器之间基于socket的远程过程调用。 Tcl-Dp 网站是http://tcldp.sourceforge.net。
下图是使用synopsys.ai 得到的实现步骤
下图是如何在环境和外部应用程序之间形成IPC 通道的示意视图
下面拿实例来解释如何实现:
1.下面这块主要功能是查找进程文件寻找正在运行的cc,根据文件中的端口和主机信息创建链接。用global变量标识连接状态。
2.这部分是把tcl-dp加载到解释器中,也是最重要的一部分,下面一段就是加载cc安装包下的tcl-dp.
下面这段是一个从GUI抓取对应输入坐标值并发送到CC 用Nwell 这层创建rect的的子程序示意.其他操作功能相似。
Demo 是使用tcl/tk开发的GUI,通过wish 从shell 中启动。通过GUI来下对应的command发送给custom compiler来实现具体对应的操作。来模拟从第三方工具或运行程序中来与cc做交互。
使用Tk 快速开发UI是比较方便的。
下面是主要TK的GUI部分代码:
frame .f1 -relief groove -bd 1
label .f1.l1 -text "Lib: " -width 15 -anchor e
entry .f1.e1 -bg white
label .f1.l2 -text "Cell: " -width 15 -anchor e
entry .f1.e2 -bg white
label .f1.l3 -text "View: " -width 15 -anchor e
entry .f1.e3 -bg white
button .f1.b -text "Open Design" -command openDesign
grid columnconfigure .f1 1 -weight 1
grid rowconfigure .f1 10 -weight
grid .f1.l1 .f1.e1 -sticky EW -padx 3 -pady 3
grid .f1.l2 .f1.e2 -sticky EW -padx 3 -pady 3
grid .f1.l3 .f1.e3 -sticky EW -padx 3 -pady 3
grid x .f1.b -sticky EW -padx 3 -pady 3
# Zoom
frame .f2 -relief groove -bd 2
label .f2.l1 -text "Top Left: " -width 15 -anchor e
entry .f2.e1 -bg white
label .f2.l2 -text "Bottom Right: " -width 15 -anchor e
entry .f2.e2 -bg white
button .f2.b -text "Zoom" -command zoom
grid columnconfigure .f2 1 -weight 1
grid rowconfigure .f2 10 -weight 1
grid .f2.l1 .f2.e1 -sticky EW -padx 3 -pady 3
grid .f2.l2 .f2.e2 -sticky EW -padx 3 -pady 3
grid x .f2.b -sticky EW -padx 3 -pady 3
# Probe a net
frame .f3 -relief groove -bd 2
label .f3.l -text "Net Name:" -width 15 -anchor e
entry .f3.e -bg white
button .f3.b -text "Probe" -command probeNet
grid columnconfigure .f3 1 -weight 1
grid rowconfigure .f3 10 -weight 1
grid .f3.l .f3.e -sticky EW -padx 3 -pady 3
grid x .f3.b -sticky EW -padx 3 -pady 3
# Probe an instance
frame .f4 -relief groove -bd 2
label .f4.l -text "Instance Name:" -width 15 -anchor e
entry .f4.e -bg white
button .f4.b -text "Probe" -command probeInst
grid columnconfigure .f4 1 -weight 1
grid rowconfigure .f4 10 -weight 1
grid .f4.l .f4.e -sticky EW -padx 3 -pady 3
grid x .f4.b -sticky EW -padx 3 -pady 3
# Highlight and clear violations
frame .f5 -relief groove -bd 2
label .f5.l1 -text "Point 1: " -width 15 -anchor e
entry .f5.e1 -bg white
label .f5.l2 -text "Point 2: " -width 15 -anchor e
entry .f5.e2 -bg white
label .f5.l3 -text "Point 3: " -width 15 -anchor e
entry .f5.e3 -bg white
label .f5.l4 -text "Point 4: " -width 15 -anchor e
entry .f5.e4 -bg white
button .f5.b1 -text "Highlight violation" -command highlightViolation
button .f5.b2 -text "Clear violations" -command clearViolations
grid columnconfigure .f5 1 -weight 1
grid rowconfigure .f5 10 -weight 1
grid .f5.l1 .f5.e1 -sticky EW -padx 3 -pady 3
grid .f5.l2 .f5.e2 -sticky EW -padx 3 -pady 3
grid .f5.l3 .f5.e3 -sticky EW -padx 3 -pady 3
grid .f5.l4 .f5.e4 -sticky EW -padx 3 -pady 3
grid x .f5.b1 -sticky EW -padx 3 -pady 3
grid x .f5.b2 -sticky EW -padx 3 -pady 3
# Create Rectangle
frame .f6 -relief groove -bd 2
label .f6.l1 -text "Top Left: " -width 15 -anchor e
entry .f6.e1 -bg white
label .f6.l2 -text "Bottom Right: " -width 15 -anchor e
entry .f6.e2 -bg white
button .f6.b -text "Create Rectangle" -command createRectangle
grid columnconfigure .f6 1 -weight 1
grid rowconfigure .f6 10 -weight 1
grid .f6.l1 .f6.e1 -sticky EW -padx 3 -pady 3
grid .f6.l2 .f6.e2 -sticky EW -padx 3 -pady 3
grid x .f6.b -sticky EW -padx 3 -pady 3
# Color label
label .l -text "Color"
frame .f7
label .f7.l1 -text "Status:"
pack .f7.l1 -side left -ipadx 3 -ipady 3 -padx 3 -pady 3
label .f7.l2 -text "Not connected" -relief sunken -bg pink
pack .f7.l2 -side left -expand yes -fill x -ipadx 3 -ipady 3 -padx 3 -pady 3
button .f7.b -text "Connect" -command walkupToCustomDesigner
pack .f7.b -side left -ipadx 3 -ipady 3 -padx 3 -pady 3
# Arrange the frames in the window
grid columnconfigure . 0 -weight 1
grid columnconfigure . 1 -weight 1
grid rowconfigure . 0 -weight 1
grid rowconfigure . 1 -weight 1
grid rowconfigure . 2 -weight 1
grid rowconfigure . 3 -weight 1
grid .f1 .f2 -sticky NEWS -ipadx 3 -ipady 3 -padx 3 -pady 3
grid .f3 .f4 -sticky NEWS -ipadx 3 -ipady 3 -padx 3 -pady 3
grid .f5 .f6 -sticky NEWS -ipadx 3 -ipady 3 -padx 3 -pady 3
grid .l -sticky NEWS -columnspan 2
grid .f7 -sticky NEWS -columnspan 2
# Set the minsize of the window
update
wm minsize . [winfo width .] [winfo height .]