Using abutFunction

Discussion in 'Cadence' started by I-F AB, Aug 19, 2010.

  1. I-F AB

    I-F AB Guest

    Hi,

    Could anyone guide me on modifying pins for abutment?
    I've gone through the VXL documentation and the mos.il tutorial but I
    still can't figure out how to use the abutFunction command.

    Below is the code I have so far:

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

    CellA = instA
    CellB = instB

    pinAoffset = pinA~>OffsetStretchParam
    pinBoffset = pinB~>OffsetStretchParam

    case(event
    (1 ; Compute offset
    ;;;result = getAbutmentOffset(iA iB pA pB pASide connection)
    )
    (2 ; Adjust pcell parameters
    ;;;result = setAbutmentParams(iA iB pA pB pASide connection
    group)

    ;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
    ;;;resetAbutmentParams(group iA iB)
    ;;;result = t
    dbReplaceProp(instA pinAoffset "float" 0.0)
    dbReplaceProp(instB pinBoffset "float" 0.0)

    result = t
    )
    ; (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
    result = nil
    )
    ) ;case

    result
    ) ;let

    )


    pcDefinePCell(
    list( ddGetObj("C05L_LDDNMOS") "AbutTrial_3" "layout" )
    ( (w 3.5) )
    envSetVal("rod" "distributeSingleSubRect" 'boolean t)

    let(( (cvId pcCellView) tfId techInfo ;tech data
    netT pinT netS pinS ;nets & pins
    idT idS ;pin ID
    MAIN TOP SIDE ;physical shapes
    (M1 "M1") (M2 "M2") ;layers
    )

    tfId = techGetTechFile(cvId)
    techInfo = makeTable("TechInfo" nil)
    foreach( LYR list(M1 M2)
    techInfo[LYR] = list(nil)
    techInfo[LYR]->minSpa = techGetSpacingRule(tfId "minSpacing"
    LYR)
    techInfo[LYR]->minWid = techGetSpacingRule(tfId "minWidth" LYR)
    unless( techInfo[LYR]->minSpa techInfo[LYR]->minSpa = 0 )
    unless( techInfo[LYR]->minWid techInfo[LYR]->minWid = 0 )
    )

    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 )
    /
    *abut affects pin*/
    SIDE = rodCreateRect( ?layer M2 ?width w+1.0 ?length 4.8 )
    /
    *abut affects pin*/

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

    pinT = dbCreatePin( netT TOP~>dbId "TOP" )
    pinS = dbCreatePin( netS SIDE~>dbId "SIDE" )

    pinT~>accessDir = list("top" "left" "right")
    pinS~>accessDir = list("top" "bottom" "right")

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;; vxl
    abut ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ; +-----+ +------+
    ; | | | |
    ; |TOP| |TOP|
    ; | | | |
    ; +-----+ +-----+
    ; | | | |
    ; | | | |
    ; | M | | M | stretch
    ; | A +--------+ | A +---+ ---
    ; | I | | +-----+ | I | | ---
    ; | N |SIDE| | | | N | |
    ; | | | |TOP| | |S/T|
    ; | | | | | | | |
    ; +-----+--------+ +-----+ +-----+----+
    ; | | | |
    ; | | | |
    ; | M | | M |
    ; | A +------+ | A +-------+
    ; | I | | | I
    | |
    ; | N |SIDE| | N |SIDE|
    ; | | | |
    | |
    ; | | | |
    | |
    ; +-----+------+ +----+-------+
    ; squeeze -->| |<--

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    idT = TOP ~> dbId
    idS = SIDE ~> dbId

    idT ~> pin ~> name = "TOP"
    dbReplaceProp(idT "vxlInstSpacingDir" "list" list("top" "right"
    "left"))
    dbReplaceProp(idT "vxlInstSpacingRule" "float" techInfo[M2]-
    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 ~> pin ~> name = "SIDE"
    dbReplaceProp(idS "vxlInstSpacingDir" "list" list("top" "bottom"
    "right"))
    dbReplaceProp(idS "vxlInstSpacingRule" "float" techInfo[M2]-
    dbReplaceProp(idS "abutClass" "string" cvId~>cellName)
    dbReplaceProp(idS "abutAccessDir" "list" list("top" "bottom"
    "right"))
    dbReplaceProp(idS "abutFunction" "string" "TrialAbutFunc")
    dbReplaceProp(idS "OffsetStretchParam" "string" "StretchSide")



    ) ;let
    envSetVal("rod" "distributeSingleSubRect" 'boolean nil)
    )

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

    The text diagram here is warped so I'm not sure if it makes much
    sense.
    I'm stuck at how to use a variable/property at the line with /*abut
    affects pin*/
    so that the pin width/length changes with abutment.

    Thanks in advance.
     
    I-F AB, Aug 19, 2010
    #1
  2. I-F AB

    I-F AB Guest

    Oh dear, the diagram has become really warped.

    The shape is basically an L-shaped pcell with pins at the top & bottom
    right.
    I want abutment to merge these pins so that one pin becomes stretched
    & the other squeezed.

    From the TrialAbutFunc() procedure, I've put/modified properties
    during abutment but I don't know how to use them in the pcell.
     
    I-F AB, Aug 19, 2010
    #2
Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.