I
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 "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 "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.
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)minSpa)
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)minSpa)
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.