• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. Changing shapes during abutment.

Stats

  • Locked Locked
  • Replies 0
  • Subscribers 143
  • Views 12961
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Changing shapes during abutment.

ifab
ifab over 15 years ago

 Hi,

I'm trying to understand using abutFunction in Virtuoso VXL but the manuals aren't clear enough for me. I've taken a look at the example codes in the installationdirectory but still cannot figuere out how to use it properly.

I've created a simple pcell which is an L-shaped object with pins at the ends as an example as below:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 procedure(  TrialAbutFunc( instA instB pinA pinB dir conn event @optional group )
 prog(  (      result     )

    ;get affected parameters & values

        CellA = instA
        CellB = instB
    pinAoffset  = pinA~>OffsetStretchParam
    pinBoffset  = pinB~>OffsetStretchParam
    printf("    pinAoffset = %L\n" pinAoffset)
    printf("    pinBoffset = %L\n" pinBoffset)
    printf("\n********************\n")

    case(event
      (1 ; Compute offset
              printf(" # Calculating offset\n")

      )
      (2 ; Adjust pcell parameters
              printf(" # Calculating abutment\n")

        ;stretch!
        ;;;StretchTop = 1.3
        ;;;StretchSide = -1.0
        dbReplaceProp(instA pinAoffset "float" 1.3)
        dbReplaceProp(instB pinBoffset "float" -1.0)
                result = t
      )
      (3 ; Adjust pcell parameters back to default
               printf(" # Calculating un-abutment\n")

        dbReplaceProp(instA pinAoffset "float" 0.0)
        dbReplaceProp(instB pinBoffset "float" 0.0)
        result = t
      )
; ;e.g.     (4 ; To get the spacing offset when pins are on different nets
; ;             if( instA~>w > 3.0 && instB~>w > 3.0    then    result = 3
; ;             else    result = 1 )
; ;          );; end of case 4
      (t ; Anything else return a nil

               printf(" # Unknown event!\n")

        result = nil
      )
    ) ;case

    return(result)
 )

) ;TrialAbutFunc

 

 pcDefinePCell(
  list( ddGetObj("C05L") "AbutTrial" "layout" )
      ( (w 3.5) )
 let(( (cvId  pcCellView) tfId  techInfo   ;tech data
       netT  netS   idT idS                      ;nets & pins
       MAIN TOP SIDE                         ;physical shapes
       (M1    "M1")   (M2    "M2")            ;layers   
     )

     netT = dbCreateNet( cvId "TOP" )
     dbCreateTerm( netT "TOP" "inputOutput" )
     netS = dbCreateNet( cvId "SIDE" )
     dbCreateTerm( netS "SIDE" "inputOutput" )


     MAIN = rodCreateRect( ?layer M1   ?width   w    ?length 7.6 )
     TOP  = rodCreateRect( ?layer M2   ?width   w    ?length 3.5    /*+ StretchTop*/    ) 
     SIDE = rodCreateRect( ?layer M2   ?width w+1.0  ?length 4.8  /*+ StretchSide*/  )

     rodAlign( ?alignObj TOP ?alignHandle "lL" ?refObj MAIN ?refHandle "uL" )
     rodAlign( ?alignObj SIDE ?alignHandle "lL" ?refObj MAIN ?refHandle "lR" )

     idT = TOP ~> dbId
     dbReplaceProp(idT "vxlInstSpacingDir" "list" list("top" "right" "left"))
     dbReplaceProp(idT "vxlInstSpacingRule" "float" 0.8)

     dbReplaceProp(idT "abutClass" "string" cvId~>cellName)
     dbReplaceProp(idT "abutAccessDir" "list" list("top" "right" "left"))
     dbReplaceProp(idT "abutFunction" "string" "TrialAbutFunc")
     dbReplaceProp(idT "OffsetStretchParam" "string" "StretchTop")

     idS = SIDE ~> dbId
     dbReplaceProp(idS "vxlInstSpacingDir" "list" list("top" "bottom" "right"))
     dbReplaceProp(idS "vxlInstSpacingRule" "float" 0.8)

     dbReplaceProp(idS "abutClass" "string" cvId~>cellName)
     dbReplaceProp(idS "abutAccessDir" "list" list("top" "bottom" "right"))
     dbReplaceProp(idS "abutFunction" "string" "TrialAbutFunc")
     dbReplaceProp(idS "OffsetStretchParam" "string" "StretchSide")

     cvId~>lxBlockOverlapCheck=t
 ) ;let
)


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

What I'm trying to do is make the pins "TOP" & "SIDE" overlap, and manipulate the M2 layers so the pins are exactly the same dimensions (TOP pin gets taller, SIDE pin gets narrower).

So far I haven't figured out how to put a dimension property on the pin which can be changed during abutment.

Obviously there's a lot of confusion because I've used "OffsetStretchParam" as a string type in the pcell while in the abutting code I'm using it as a floating number type.

I think my goal would be having the properties "StretchSide" & "StretchTop" on the pins (something like idS~>StretchSide == -0.1) but then again, I can't use it to specify the shape of SIDE before the pin is defined.

Can anybody clarify me on this?

Thanks in advance,

I-FAB

  • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information