在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1653|回复: 2

[原创] 批量放置lef中的macro(gds)到一个总topcell (gds)

[复制链接]
发表于 2022-5-25 16:06:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
1,首先要有stdcell的gds,现在好多都是独立的,不在一个topcellname中
2,找到lef文件,用python处理macro,把要放置的cellname先取出来:macro.list。检查下内容,多的删除
import re
import os
import time
fp = open ("stdcell.lef","r")
fpout = open ("macro.list","w")
aline = fp.readline()
pfind = 0
while (aline !="" ):
        if "MACRO" in aline:
                pfind = 0
                macro_line = aline.strip().split()
                macroname =macro_line[1]
                print (macroname)
                fpout.write (macroname + "\n")
                #print(macroname,file=fpout,end="")
        aline = fp.readline()


fpout.close()
fp.close()

3 . 查看目标要写成的target_il.il 的格式,把要变化的内容,用脚本答应出来,先看目标格式中的变化内容 ,标红;头尾为加粗紫色
let((cv)
cv = dbOpenCellViewByType("libname" "topcell " "layout" "maskLayout" "a")
cv_co0 = dbOpenCellViewByType("libname" "cellname0" "layout")
dbCreateInst(cv cv_co0 "std0" list(0.130 -0.570) "R0")
cv_co1 = dbOpenCellViewByType("libname" "cellname1" "layout")
dbCreateInst(cv cv_co1 "std1" list(0.130 -0.570) "R0")
。。。#注释行,这里cv_co0/1+。。。:n和cellname0/1+。。。n 就是在同一个lib和topcell要变化的内容
dbSave(cv)
);let

4. python处理 cv_co0和cellname0的内容
import re
import os
import time
fpin = open ("macro.list","r")
fpout =open ("macro_al.il","w")
aline = fpin.readlines()
linenum = 0
for line in aline:
    str1 = 'cv_co' + str(linenum)+' = dbOpenCellViewByType("topname" "' + str(line.strip()) + '" "layout")'
    #str2 = 'dbCreateInst(cv cv_co' + str(linenum) + ' "std1" list(0.130 -0.570) "R0")'
    str2 = 'dbCreateInst(cv cv_co' + str(linenum) + '  "std' + str(linenum) + '" list(0.130 -0.570) "R0")'
    print (str1)
    print (str2)
    fpout.write (str1 + "\n" + str2 + "\n")
    linenum = linenum + 1

#pfind = 0
#while (aline !="" ):
#       if "MACRO" in aline:
#               pfind = 0
#               macro_line = aline.strip().split()
#               macroname =macro_line[1]
#               print (macroname,file=fpout)
#
#       aline = fp.readline()



fpout.close()
fpin.close()

5  加上 target的头尾行。然后再ciw中导入这个加头尾行的macro_al.il   
6 用virtuoso align加间距横向排列。
这个是半自动加手动,脚本不太熟。但能已经方便很多了

 楼主| 发表于 2025-5-14 15:31:50 | 显示全部楼层
这个更简单一些;>1create a cell which will contain allcells in stdcelllib(bwph169l3p48cpd_base_elvt)
;>2load current il
;>3pto(bwph169l3p48cpd_base_elvt)
procedure(pto(lib)
    let((d_cellview allcells d_master inst)
        d_cellview = geGetEditCellView()
        allcells = ddGetObj(lib)~>cells~>name
        
        foreach(cell allcells
            ; 跳过当前cell避免递归
            unless(cell == d_cellview~>cellName
                ; 打开单元
                d_master = dbOpenCellViewByType(lib cell "layout" nil "r")
               
                ; 在原点创建实例
                inst = dbCreateInst(
                    d_cellview      ; 目标cellview
                    d_master       ; 要实例化的master
                    sprintf(nil "I_%s" cell)  ; 自动命名实例
                    list(0 0)      ; 固定在原点 (0 0)
                    "R0"           ; 不旋转
                )
               
                unless(inst printf("Warning: Failed to create instance of %s\n" cell))
                dbSave(d_cellview)
                printf("Created %s at origin\n" cell)
            )
        )
    )
)




/**************************************************************
* 函数名称: pto
* 功能描述: 将指定库中的所有单元实例化到当前打开的版图中
*           所有实例都放置在原点(0,0)位置
* 输入参数:
*   lib - 字符串,指定要实例化的库名称
**************************************************************/
procedure(pto(lib)
    /**********************************************************
     * 局部变量定义:
     *   d_cellview - 当前编辑的cellview对象
     *   allcells   - 目标库中所有单元的名称列表
     *   d_master   - 要实例化的单元master对象
     *   inst       - 创建的实例对象
     **********************************************************/
    let((d_cellview allcells d_master inst)
        ; 获取当前打开的编辑窗口的cellview对象
        d_cellview = geGetEditCellView()
        
        ; 获取目标库中所有单元的名称列表
        ; ddGetObj获取库对象 -> cells获取所有单元 -> name提取单元名称
        allcells = ddGetObj(lib)~>cells~>name
        
        ; 遍历库中的所有单元
        foreach(cell allcells
            ; 跳过当前正在编辑的单元,避免递归实例化
            unless(cell == d_cellview~>cellName
                ; 以只读方式打开要实例化的单元版图
                ; 参数说明:
                ;   lib - 库名
                ;   cell - 单元名
                ;   "layout" - 视图类型
                ;   nil - 模式(默认)
                ;   "r" - 只读方式打开
                d_master = dbOpenCellViewByType(lib cell "layout" nil "r")
               
                ; 在原点创建实例
                ; 参数说明:
                ;   d_cellview - 目标cellview
                ;   d_master - 要实例化的单元
                ;   sprintf(nil "I_%s" cell) - 实例名称格式(I_前缀+单元名)
                ;   list(0 0) - 放置坐标(原点)
                ;   "R0" - 旋转角度(不旋转)
                inst = dbCreateInst(
                    d_cellview      
                    d_master      
                    sprintf(nil "I_%s" cell)  
                    list(0 0)      
                    "R0"           
                )
               
                ; 检查实例是否创建成功
                unless(inst
                    printf("Warning: Failed to create instance of %s\n" cell)
                )
               
                ; 保存当前cellview
                dbSave(d_cellview)
                printf("Created %s at origin\n" cell) ; 打印创建日志
            )
        )
    )
)
 楼主| 发表于 2025-5-14 16:24:34 | 显示全部楼层
;>3pto("bwph169l3p48cpd_base_elvt") 一定要加引号。参考的这个https://bbs.eetop.cn/thread-895627-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-1 08:56 , Processed in 0.014619 second(s), 7 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表