abby118的个人空间 https://blog.eetop.cn/?1555282 [收藏] [复制] [分享] [RSS]

日志

pcell_mos

已有 73 次阅读| 2025-8-14 09:25 |个人分类:学习skill|系统分类:芯片设计

备份

LIBRARY = "layout_lib"   ;libname

CELL = "mos_w_0d2_S28"      ;cellname


pcDefinePCell(

 list(ddGetObj(LIBRARY) CELL "layout")

     (

       (fingers   string "1")

       (fingers_dummypoly_left    string "2")

       (fingers_dummypoly_right    string "2")

       (l    string "0.03u")

       ;(w    string "0.2u")

       (core boolean t);core or TG

       (nmos boolean t);nmos or pmos

       ;(gt_top_ct boolean t)

       ;(gt_bottom_ct boolean t)       

     )

 let(()

     tf = techGetTechFile(ddGetObj("techlib")) ; techlib

     GT = techGetLayerNum(tf "GT") ; layer number from techlib

     AA = techGetLayerNum(tf "AA")

     CT = techGetLayerNum(tf "CT")

     M1 = techGetLayerNum(tf "M1")

     GTDMP = techGetLayerNum(tf "GTDMP")

     SN = techGetLayerNum(tf "SN")

     SP = techGetLayerNum(tf "SP")

     TG = techGetLayerNum(tf "TG")


      

     nf = evalstring(fingers)

     nfl = evalstring(fingers_dummypoly_left)

     nfr = evalstring(fingers_dummypoly_right)


     l = evalstring(l)*1000000

     ;w = evalstring(w)*1000000



 if(core then l = max(l 0.03) else l = max(l 0.25))

 if(core then 

        if( l > 0.09 then 

          gts = 0.12 

         else gts = 0.1) 

             else gts = 0.18)

 if(core then 

         if(l > 0.05 then 

         gtml = 0.05 else gtml = l ) 

        else if(l > 0.27 

             then gtml = 0.27 

        else gtml = l ))

  if( l == 0.03 then gtex = 0.095 else gtex = 0.08 )



   w = 0.2

   gtp = gts + l

   gtw = w + 2*gtex


    if(nfl >1 then nfll = nfl-1

   else nfll =0)

     if(nfr >1 then nfrr = nfr-1

         else nfrr=0)

      if(nfl == 0 then 

         diffoffset = gts

         else diffoffset =0)

   impl =  gtp*nf+gts+(nfl+nfr)*gtml+(nfll+nfrr)*gts

      

  ;create SN OR SP

 if(nmos then 

   rodCreateRect(

                 ?name sprintf(nil "SN")

                 ?layer SN

                 ?bBox list(-diffoffset:0.0  (impl-diffoffset):gtw)

                 )

   else 

   rodCreateRect(

                 ?name sprintf(nil "SP")

                 ?layer SP

                 ?bBox list(-diffoffset:0.0  (impl-diffoffset):gtw)

                 )

  )

 unless(core  

        rodCreateRect(

                 ?name sprintf(nil "TG")

                 ?layer TG

                 ?bBox list(0.0:0.0  impl:gtw)

                 )) 



 ; create GTDMP

 for(i 0 nfl-1

     rodCreateRect(

                   ?name sprintf(nil "polyl_%d" i)

                   ?layer GTDMP

                   ?bBox list(0.0:0.0 gtml:gtw)

                   )

          )

when(nfl >1

     for(i 1 nfl-1

         rodAlign(

                 ?alignObj rodGetObj(sprintf(nil "polyl_%d" i))

                   ?alignHandle "centerLeft"

                   ?refObj rodGetObj(sprintf(nil "polyl_%d" i-1))

                   ?refHandle "centerRight"

                   ?xSep gts

                  )

      ))


for(i 0 nfr-1

     rodCreateRect(

                   ?name sprintf(nil "polyr_%d" i)

                   ?layer GTDMP

                   ?bBox list((nf*gtp+nfl*(gtml+gts)):0.0 (nf*gtp+nfl*(gtml+gts)+gtml):gtw)

                   )

          )

when(nfr >1

     for(i 1 nfr-1

         rodAlign(

                 ?alignObj rodGetObj(sprintf(nil "polyr_%d" i))

                   ?alignHandle "centerLeft"

                   ?refObj rodGetObj(sprintf(nil "polyr_%d" i-1))

                   ?refHandle "centerRight"

                   ?xSep gts

                  )

      ))


;create AA

  rodCreateRect(

                ?name sprintf(nil "DIFF" )

                ?layer AA

                ?bBox list((nfl*(gtml+gts)+0.025-gts):gtex (nf*gtp+nfl*(gtml+gts)-0.025):gtex+w)

                )



   ; create GT

 for(i 0 nf-1

      rodCreateRect(

                    ?name sprintf(nil "GT_%d" i)

                    ?layer GT

                    ?bBox list((nfl*gtml+nfl*gts):0.0 (nfl*gtml+nfl*gts+l):gtw)

                   )

      );for

 when(nf > 1

      for(i 1 nf-1

          rodAlign(

                   ?alignObj rodGetObj(sprintf(nil "GT_%d" i))

                   ?alignHandle "centerLeft"

                   ?refObj rodGetObj(sprintf(nil "GT_%d" i-1))

                   ?refHandle "centerRight"

                   ?xSep gts

                   )

            );for

            );when


;create M1 & CT

    for(i 1 nf-1

         rodCreateRect(

                      ?name sprintf(nil "M1_%d" i)

                      ?layer M1

                      ?bBox list((nfl*gtml+nfl*gts-0.5*gts+gtp-0.025):gtex (nfl*gtml+nfl*gts-0.5*gts+gtp+0.025):gtex+w)

                      ?subRectArray

                        list( list(

                            ?layer CT

                            ?width 0.04

                            ?length 0.04

                            ?gap   "minimum"

                            ?lowerLeftOffsetX 0.005

                            ?lowerLeftOffsetY 0.025

                            ?spaceY  0.07

                            ))

                      ))

         when(nf > 1

            for(i 2 nf-1

                rodAlign(                    

                        ?alignObj rodGetObj(sprintf(nil "M1_%d" i))

                        ?alignHandle "centerLeft"

                        ?refObj rodGetObj(sprintf(nil "M1_%d" i-1))

                        ?refHandle "centerRight"

                        ?xSep (gtp-0.05)

                        )))

      rodCreateRect(

                    ?name sprintf(nil "M1_L")

                    ?layer M1

                    ?bBox list((nfl*gtml+nfl*gts-0.5*gts-0.025):gtex (nfl*gtml+nfl*gts-0.5*gts+0.025):gtex+w)

                      ?subRectArray

                        list( list(

                            ?layer CT

                            ?width 0.04

                            ?length 0.04

                            ?gap   "minimum"

                            ?lowerLeftOffsetX 0.005

                            ?lowerLeftOffsetY 0.08

                            ?spaceY  0.07

                            )))

       rodCreateRect(

                    ?name sprintf(nil "M1_R")

                    ?layer M1

                    ?bBox list((impl-nfr*gtml-nfrr*gts-0.5*gts-0.025-diffoffset):gtex (impl-nfr*gtml-nfrr*gts-0.5*gts+0.025-diffoffset):gtex+w)

                      ?subRectArray

                        list( list(

                            ?layer CT

                            ?width 0.04

                            ?length 0.04

                            ?gap   "minimum"

                            ?lowerLeftOffsetX 0.005

                            ?lowerLeftOffsetY 0.08

                            ?spaceY  0.07

                            )))

    );let

 );poc



点赞

全部作者的其他最新日志

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 2

    周排名
  • 0

    月排名
  • 0

    总排名
  • 1

    关注
  • 1

    粉丝
  • 5

    好友
  • 5

    获赞
  • 5

    评论
  • 304

    访问数
关闭

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


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

GMT+8, 2025-8-21 06:41 , Processed in 0.012575 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部