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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 413|回复: 1

[求助] 打包自动生成的poly_CONT_M1为一个Group失败

[复制链接]
发表于 2025-3-11 10:57:19 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Yates 于 2025-3-11 11:15 编辑

1.自动生成Poly_CT_M1正常,但是是散的;

2.我想把每个polyid1循环中会生成poly_area、m1_shape和Contact收集起来,创建Group。每个循环中的对象创建一个group,且为独立的Group。
总是不成功,有大神给把把脉嘛

Poly_Cont.txt

5.53 KB, 下载次数: 4 , 下载积分: 资产 -2 信元, 下载支出 2 信元

 楼主| 发表于 2025-3-11 11:05:00 | 显示全部楼层
本帖最后由 Yates 于 2025-3-14 10:49 编辑

procedure(PolyCont()
let((Poly M1 Contact Via_W Via_L M1_W M1_L M1_to_Poly Contact_W Contact_Space Contact_Enclosure_M1
     cv polyid polyid1 lx ly rx ry poly_area techFile constraintGroupId myViaOptions listpoly listm1 m1_shape m1_bBox
     lx_m1 ly_m1 rx_m1 ry_m1 lx_contact ly_contact rx_contact ry_contact eff_width eff_height
     num_x num_y total_width total_height start_x start_y x1 y1 x2 y2 contacts_list group_members group contact_obj)
    ; 基础参数设置
    Poly = list("OLY1" "drawing")
    M1 = list("METAL1" "drawing")
    Contact = list("CONT" "drawing") ; 根据实际工艺层名调整
    Via_W = 0.35
    Via_L = 0.76
    M1_W = 0.32
    M1_L = 0.76
    M1_to_Poly = 0.015
    Contact_W = 0.18    ; Contact尺寸
    Contact_Space = 0.21 ; Contact间距
    Contact_Enclosure_M1 = 0.05 ; Contact到Metal1包边
    ; 主处理流程
    cv = geGetEditCellView()
    foreach(obj geGetSelSet()
        ; 提取并复制多边形
        polyid = foreach(mapcar polyfig dbGetOverlaps(cv obj~>bBox Poly 1 t)
            dbCopyFig(cadr(polyfig) cv dbGetHierPathTransform(polyfig))
        )
        polyid = leMergeShapes(polyid)

        foreach(polyid1 polyid
            ; 获取多边形坐标
            lx = xCoord(car(polyid1~>bBox))
            ly = yCoord(car(polyid1~>bBox))
            rx = xCoord(cadr(polyid1~>bBox))
            ry = yCoord(cadr(polyid1~>bBox))
            dbDeleteObject(polyid1)
            ; 生成Poly和Metal1图形
            if(!dbShapeQuery(cv M1 list(lx:ry rx:ry+Via_W)) then
                ; 横向排列
                if(rx - lx > Via_L then
                    listpoly = list(lx:ry rx:ry+Via_W)
                    listm1 = list(lx + M1_to_Poly:ry + (Via_W - M1_W)/2
                                rx - M1_to_Poly:ry + (Via_W + M1_W)/2)
                else
                    listpoly = list((lx + rx - Via_L)/2:ry
                                  (rx + lx + Via_L)/2:ry + Via_W)
                )
                poly_area = dbCreateRect(cv Poly listpoly)
                m1_shape = dbCreateRect(cv M1 listm1)
            else
                ; 纵向排列
                if(ry - ly > Via_L then
                    listpoly = list(rx:ly rx+Via_W:ry)
                    listm1 = list(rx + (Via_W - M1_W)/2:ly + M1_to_Poly
                                rx + (Via_W + M1_W)/2:ry - M1_to_Poly)
                else
                    listpoly = list(rxly + ry - Via_L)/2
                                  rx + Via_Wry + ly + Via_L)/2)
                    listm1 = list(rx + (Via_W - M1_W)/2ly + ry - M1_L)/2
                                rx + (Via_W + M1_W)/2:(ry + ly + M1_L)/2)
                )
                poly_area = dbCreateRect(cv Poly listpoly)
                m1_shape = dbCreateRect(cv M1 listm1)
            )
            ; 生成Contact层
            contacts_list = nil ; 初始化Contact列表
            when(m1_shape
                ; 计算有效区域
                m1_bBox = m1_shape~>bBox
                lx_m1 = xCoord(car(m1_bBox))
                ly_m1 = yCoord(car(m1_bBox))
                rx_m1 = xCoord(cadr(m1_bBox))
                ry_m1 = yCoord(cadr(m1_bBox))

                lx_contact = lx_m1 + Contact_Enclosure_M1
                ly_contact = ly_m1 + Contact_Enclosure_M1
                rx_contact = rx_m1 - Contact_Enclosure_M1
                ry_contact = ry_m1 - Contact_Enclosure_M1
                ; 检查可生成区域
                when(rx_contact >= lx_contact + Contact_W &&
                     ry_contact >= ly_contact + Contact_W
                    eff_width = rx_contact - lx_contact
                    eff_height = ry_contact - ly_contact
                    ; 计算可放置数量
                    num_x = floor((eff_width - Contact_W)/(Contact_W + Contact_Space)) + 1
                    num_y = floor((eff_height - Contact_W)/(Contact_W + Contact_Space)) + 1
                    when(num_x > 0 && num_y > 0
                        ; 计算起始位置(居中排列)
                        total_width = num_x*Contact_W + (num_x-1)*Contact_Space
                        total_height = num_y*Contact_W + (num_y-1)*Contact_Space
                        start_x = lx_contact + (eff_width - total_width)/2
                        start_y = ly_contact + (eff_height - total_height)/2
                        ; 生成Contact阵列并收集对象
                        for(i 0 num_x-1
                            for(j 0 num_y-1
                                x1 = start_x + i*(Contact_W + Contact_Space)
                                y1 = start_y + j*(Contact_W + Contact_Space)
                                contact_obj = dbCreateRect(cv Contact list(x1:y1 x1+Contact_W:y1+Contact_W))
                                contacts_list = cons(contact_obj contacts_list)
                            )
                        )
                        contacts_list = reverse(contacts_list) ; 保持创建顺序
                    ) ; end when(num>0
                ) ; end when(area valid
            ) ; end when(m1_shape
            ; 创建Group
            group_members = list(poly_area m1_shape)
            when(contacts_list
                group_members = append(group_members contacts_list)
            )
            when(group_members
                group = dbCreateGroup(cv nil group_members)
                printf("Group created with %d members\n" length(group_members))
            )
        ) ; end foreach(polyid1
    ) ; end foreach(obj
)) ; end let and procedure
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2025-3-31 23:38 , Processed in 0.015358 second(s), 8 queries , Gzip On, MemCached On.

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