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

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 603|回复: 12

[求助] 使用AddMosM1 脚本,不希望gate上生成M1

[复制链接]
发表于 2025-9-8 09:37:09 | 显示全部楼层 |阅读模式

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

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

×
借用了大神的 AddMosM1 脚本https://bbs.eetop.cn/thread-878287-1-1.html,非常好用,但是遇到了一个问题,修改了器件的parameter,自动添加了 Gate Connection,然后运行脚本,S,D,gate上面都会生成M1,如果不需要gate上面生成M1,请问怎么修改脚本呢?谢谢!





hiSetBindKey("Layout" "<Key>F6" "AddMosM1()")

procedure(AddMosM1()
      let((cv objs metal1 temp shapes x y ux uy xy row column transform M1_width)
        testEditMode()  
          M1_width = 0.16
          cv = geGetEditCellView()
          objs = geGetSelSet()
        foreach(obj objs
             transform = nil
             if(obj~>objType == "inst" then
                     transform = list(obj~>transform));end if
             if(obj~>objType == "mosaic" then
                     x = xCoord(obj~>xy)
                     y = yCoord(obj~>xy)
                     ux = obj~>uX
                     uy = obj~>uY
                     row = obj~>rows
                     column = obj~>columns
             for(a 0 row-1
               for(b 0 column-1
                case(car(obj~>tileArray)
                    ("R0"    xy = list(x+b*ux : y+a*uy))
                    ("MXR90" xy = list(x+a*ux : y+b*uy))
                    ("R90"   xy = list(x-a*ux : y+b*uy))
                    ("MY"    xy = list(x-b*ux : y+a*uy))
                    ("R0"    xy = list(x+a*ux : y-b*uy))
                    ("MXR90" xy = list(x+b*ux : y-a*uy))
                    ("R0"    xy = list(x-b*ux : y-a*uy))
                    ("MXR90" xy = list(x-a*ux : y-b*uy))
                );end case
             transform = append1(transform list(car(xy) car(obj~>tileArray) 1.0))
               );end for
            );enf for
            );end if
           shapes = obj~>master~>shapes
         foreach(shape shapes
           ;if(car(shape~>lpp) == "M1" && cadr(shape~>lpp) == "drawing"     //add gate M1
           if(car(shape~>lpp) == "M1" && cadr(shape~>lpp) == "drawing"&& shape ~> objType == "rect"
             then
               foreach(trans transform
                  metal1 = dbCopyFig(shape cv trans)
                  temp = leConvertPolygonToPath(metal1)
                  temp~>width = M1_width
               );foreach
           );if
      );foreach
    );foreach
  );let
);proc


procedure(testEditMode()
         if(geGetEditCellView() ~> mode == "r"
         then hiDisplayMenu(hiCreateSimpleMenu(
                'menu "" list("ReadOnly!!!\n" "ReadOnly!!!\n" "ReadOnly!!!\n") list("")))
         break()
          );if
);proc


 楼主| 发表于 2025-9-8 09:54:34 | 显示全部楼层
左边是未生长M1的mos
1234.png
回复 支持 反对

使用道具 举报

发表于 2025-9-8 10:47:48 | 显示全部楼层
如果pdk单元里面的金属是带net信息的,只需要把最后那条if的检测条件改改,除了检测lpp外,还检测net就行了。如果不带net信息,需要通过运算去除与多晶有交叠的金属
回复 支持 反对

使用道具 举报

发表于 2025-9-8 11:07:20 | 显示全部楼层
gate cont 关掉应该可以
回复 支持 反对

使用道具 举报

发表于 2025-9-8 11:27:45 | 显示全部楼层
我有个思路是根据器件方向,排除掉gate方向的M1的rect(定义rect长边为其方向)。一般的管子应该都可以解决,但是skill改动蛮大的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-8 11:42:49 | 显示全部楼层


   
acrofoxAgain 发表于 2025-9-8 10:47
如果pdk单元里面的金属是带net信息的,只需要把最后那条if的检测条件改改,除了检测lpp外,还检测net就行了 ...


如果if检测条件加上 能提取出来“M1”和“OD” 交叠的“M1”的语句,是否也可行?无奈skill语法能力有限,只找到了 dbGetOverlaps() 函数,请大神助我,谢谢!
回复 支持 反对

使用道具 举报

发表于 2025-9-8 12:46:51 | 显示全部楼层


   
Siman2000 发表于 2025-9-8 11:42
如果if检测条件加上 能提取出来“M1”和“OD” 交叠的“M1”的语句,是否也可行?无奈skill语法能力有限 ...


没有直接检测是否交叠的语句,但是可以有运算。Overlap那个是粗略检测,只看bBox。


如果不带net信息,可以这个思路:用程序里这个方法将M1 copy到当前cellView中的y0层,并将结果记录到一个list中,我把它叫M1Shapes。把多晶copy到当前cellView的y1层,并将结果记录到另一个list中,我把它叫PolyShapes,然后用dbLayerOutside得出M1Shapes去掉与PolyShapes有关系的图形,结果保存到M1层,再删除临时数据。
回复 支持 反对

使用道具 举报

发表于 2025-9-8 14:30:00 | 显示全部楼层


   
Siman2000 发表于 2025-9-8 11:42
如果if检测条件加上 能提取出来“M1”和“OD” 交叠的“M1”的语句,是否也可行?无奈skill语法能力有限 ...


可行 使用这个函数 bbox使用od的 再对得到的数据进行筛选 筛选过程可以参考alignviatonet 这个脚本是用来收线头的 直接搜索就行
或者你可以再对所有得到的m1 因为他们都是path 可以根据points来判断方向 删除横向的即可
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-11 16:50:08 | 显示全部楼层


   
acrofoxAgain 发表于 2025-9-8 12:46
没有直接检测是否交叠的语句,但是可以有运算。Overlap那个是粗略检测,只看bBox。



hiSetBindKey("Layout" "<Key>F6" "AddMosM1()")

procedure(AddMosM1()
      let((cv objs metal1 temp shapes x y ux uy xy row column transform M1_width poly1 poly2 metal2 metalx)
        testEditMode()  
          M1_width = 0.2
          cv = geGetEditCellView()
          objs = geGetSelSet()
        foreach(obj objs
             transform = nil
             if(obj~>objType == "inst" then
                     transform = list(obj~>transform));end if
             if(obj~>objType == "mosaic" then
                     x = xCoord(obj~>xy)
                     y = yCoord(obj~>xy)
                     ux = obj~>uX
                     uy = obj~>uY
                     row = obj~>rows
                     column = obj~>columns
             for(a 0 row-1
               for(b 0 column-1
                case(car(obj~>tileArray)
                    ("R0"    xy = list(x+b*ux : y+a*uy))
                    ("MXR90" xy = list(x+a*ux : y+b*uy))
                    ("R90"   xy = list(x-a*ux : y+b*uy))
                    ("MY"    xy = list(x-b*ux : y+a*uy))
                    ("R0"    xy = list(x+a*ux : y-b*uy))
                    ("MXR90" xy = list(x+b*ux : y-a*uy))
                    ("R0"    xy = list(x-b*ux : y-a*uy))
                    ("MXR90" xy = list(x-a*ux : y-b*uy))
                );end case
             transform = append1(transform list(car(xy) car(obj~>tileArray) 1.0))
               );end for
            );enf for
            );end if
              shapes = obj~>master~>shapes
      foreach(shape shapes
              if(car(shape~>lpp) == "M1" && cadr(shape~>lpp) == "drawing" && shape ~> objType == "rect"
               then
                foreach(trans transform
                   metal1 = dbCopyFig(shape cv trans)
                       );foreach
                );if
              if(car(shape~>lpp) == "GT" && cadr(shape~>lpp) == "drawing" && shape ~> objType == "rect"
               then
                foreach(trans transform
                   poly1 = dbCopyFig(shape cv trans)
                       );foreach
                );if
              metal2 = dbLayerOutside(cv "M2" list(metal1) list(poly1))
             );foreach
          dbDeleteObject(metal1)
           dbDeleteObject(poly1)
           temp = leConvertPolygonToPath(metal2)
           temp~>width = M1_width  
    );foreach
  );let
);proc


procedure(testEditMode()
         if(geGetEditCellView() ~> mode == "r"
         then hiDisplayMenu(hiCreateSimpleMenu(
                'menu "" list("ReadOnly!!!\n" "ReadOnly!!!\n" "ReadOnly!!!\n") list("")))
         break()
          );if
);proc


语句dbDeleteObject  删不掉 临时数据,绿色leConvertPolygonToPath(metal2)  报出来错误

*Error* leConvertPolygonToPath: argument #1 should be a database objcet (type template = "d") -nil  


研究了好几天,还是没找到问题所在,麻烦您帮忙看看,怎么修改,谢谢!


回复 支持 反对

使用道具 举报

发表于 2025-9-12 11:15:21 | 显示全部楼层


   
Siman2000 发表于 2025-9-11 16:50
hiSetBindKey("Layout" "F6" "AddMosM1()")

procedure(AddMosM1()


你在foreach循环里面赋值,在跳出循环以后使用,最多只能删除/转换循环最后一次的数据
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

X

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

GMT+8, 2025-9-21 06:52 , Processed in 0.031396 second(s), 4 queries , Gzip On, Redis On.

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