• 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 Design
  3. Multipart Path Dependent Separation and Multiple Master...

Stats

  • Locked Locked
  • Replies 4
  • Subscribers 125
  • Views 10586
  • 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

Multipart Path Dependent Separation and Multiple Master Paths

Kevin Buck
Kevin Buck over 3 years ago

I'm generating some multipart path templates for shielding and I'm trying to figure out how to implement two functionalities that I don't see in the documentation.

1) The separation for an enclosure should be dependent on the width of the master path. For example if the master path width is < x then the separation for two offset subpaths is y and if the master path width is >=x then the separation for two offset subpaths is z. When I look at the template file generated the width gets hard-coded into the template. I know I can use rodCreatePath() to specify a list of points but that doesn't let you interactively draw a MPP on the layout canvas. I've tried getting more information from the log filter to see what function is being called by the tool when drawing on the canvas but it only shows the mouse click locations.

2) Have an option for either (a) multiple master paths, I'm guessing that isn't possible since the master path is used as the reference for offset and enclosure paths. Or (b) an option to specify a variable number of offset paths. There will always be two paths of a fixed width on each side of the MPP. The idea here is that a shielded bus can be created by specifying the number of routes.

  • Cancel
Parents
  • Andrew Beckett
    Andrew Beckett over 3 years ago

    Kevin,

    Neither of these is possible. By the way, you might find this article useful (although it doesn't really help with your problem): Can I create a Multi Part Path in SKILL based on a technology file template? (it's one of mine).

    The only way of doing what you want is either to have some custom SKILL code, or probably best to create a fluid pcell (which is very easy to do with Cadence PCell Designer) which would allow an instance with parameters which can be stretched and reshaped in a similar fashion to a multipart path.

    Regards,

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Kevin Buck
    Kevin Buck over 3 years ago in reply to Andrew Beckett

    OK, I figured this was probably the case. I started writing a SKILL script that:

    • pops up a dialog box to fill the desired parameters and then does some checking for the conditionals I want
    • calls leDefineMPPTemplate() and sets the desired variables
    • calls leHiCreateMPP()
    • calls hiToggleEnterForm()
    • sets some values (this seems to have a problem with setting the desired pin name)
    • calls hiSetCallbackStatus(myForm t)

    There is one issue that is a little weird. It seems to work but the first time I try using the form it doesn't work, it just draws a path on whatever layer was selected before I executed the function.

    Most of it isn't too interesting as it is simply setting up the different parts of the MPP.

    procedure( conduitInit(myForm)
    	let( (shieldedLayer shieldNet conduitWidth)
    		hiSetCallbackStatus(myForm nil)
    		tech = techOpenTechFile("ohc15l_xl" "tech.db" "r")
    		shieldedLayer = myForm~>layer~>value
    		shieldNet = myForm~>shieldNet~>value
    		if( conduitWidth = truncate(atof(myForm~>conduitWidth~>value t) * 100) / 100.0 then
    			if( conduitWidth < 1.36 then
    				conduitWidth = 1.36
    				warn("Conduit width is too small to accomodate a minimum size wire, setting to minimum width (1.36 um)\n")
    			)
    			if( conduitWidth > 40 then
    				conduitWidth = 40
    				warn("Conduit width is greater than design rule maximum, setting to maximum width (40 um)\n")
    			)
    		else
    			conduitWidth = 1.36
    			warn("Invalid argument given for conduit width, setting to minimum width (1.36 um)\n")
    		)
    		case( shieldedLayer
    			("MET2"
    				layerBelow = "MET1"
    				layerAbove = "MET3"
    				lowerVia = "VIA1"
    				upperVia = "VIA2"
    				mppName = "M2_conduit"
    			)
    			("MET3"
    				layerBelow = "MET2"
    				layerAbove = "MET4"
    				lowerVia = "VIA2"
    				upperVia = "VIA3"
    				mppName = "M3_conduit"
    			)
    			("MET4"
    				layerBelow = "MET3"
    				layerAbove = "MET5"
    				lowerVia = "VIA3"
    				upperVia = "VIA4"
    				mppName = "M4_conduit"
    			)
    		)
    		leDefineMPPTemplate(
    			?techId	 tech
    			?name	 mppName
    			?layer	 list(layerBelow "drawing")
    			?width	 conduitWidth
    			?choppable	 t
    			?endType	 "truncate"
    			?beginExt	 0.000000
    			?endExt	 0.000000
    			?justification	 "center"
    			?offset	 0.000000
    			?termIOType	 "input"
    			?pin	 t
    			?pinAccessDir	 list("top" "bottom" "left" "right")
    			?pinLabel	 t
    			?pinLabelHeight	 conduitWidth/4
    			?pinLabelLayer	 layerBelow
    			?pinLabelJust	 "centerCenter"
    			?pinLabelFont	 "stick"
    			?pinLabelDrafting	 t
    			?pinLabelOrient	 "R0"
    			?pinLabelRefHandle	 "start0"
    			?pinLabelOffsetPoint	 list(0.0 0.0)
    			?offsetSubPath	 list(
    			 list(
    				?layer	 list(shieldedLayer "drawing")
    				?width	 0.320000
    				?choppable	 t
    				?sep	 -0.320000
    				?justification	 "left"
    				?beginOffset	 0.000000
    				?endOffset	 0.000000
    				)
    			 list(
    				?layer	 list(shieldedLayer "drawing")
    				?width	 0.320000
    				?choppable	 t
    				?sep	 -0.320000
    				?justification	 "right"
    				?beginOffset	 0.000000
    				?endOffset	 0.000000
    				)
    			 list(
    				?layer	 list(layerAbove "drawing")
    				?width	 conduitWidth
    				?choppable	 t
    				?sep	 0.000000
    				?justification	 "center"
    				?beginOffset	 0.000000
    				?endOffset	 0.000000
    				)
    			)
    			?subRect	 list(
    			list(
    				?layer	 list(lowerVia "drawing")
    				?width	 0.240000
    				?length	 0.240000
    				?choppable	 t
    				?sep	 -0.280000
    				?justification	 "left"
    				?space	 0.410000
    				?beginOffset	 -0.210000
    				?endOffset	 -0.210000
    				?beginSegOffset	 0.000000
    				?endSegOffset	 0.000000
    				?gap	 "distribute"
    				)
    			list(
    				?layer	 list(upperVia "drawing")
    				?width	 0.240000
    				?length	 0.240000
    				?choppable	 t
    				?sep	 -0.280000
    				?justification	 "left"
    				?space	 0.410000
    				?beginOffset	 -0.210000
    				?endOffset	 -0.210000
    				?beginSegOffset	 0.000000
    				?endSegOffset	 0.000000
    				?gap	 "distribute"
    				)
    			list(
    				?layer	 list(lowerVia "drawing")
    				?width	 0.240000
    				?length	 0.240000
    				?choppable	 t
    				?sep	 -0.280000
    				?justification	 "right"
    				?space	 0.410000
    				?beginOffset	 -0.210000
    				?endOffset	 -0.210000
    				?beginSegOffset	 0.000000
    				?endSegOffset	 0.000000
    				?gap	 "distribute"
    				)
    			list(
    				?layer	 list(upperVia "drawing")
    				?width	 0.240000
    				?length	 0.240000
    				?choppable	 t
    				?sep	 -0.280000
    				?justification	 "right"
    				?space	 0.410000
    				?beginOffset	 -0.210000
    				?endOffset	 -0.210000
    				?beginSegOffset	 0.000000
    				?endSegOffset	 0.000000
    				?gap	 "distribute"
    				)
    			)
    		) ; end of leDefineMPPTemplate procedure
    
    		leHiCreateMPP()
    		hiToggleEnterForm()
    		leRodMppForm->pathWidth->value=conduitWidth
    		leRodMppForm->rodMPPTemplate->value=mppName
    		leRodMppForm->rodNetName->value=shieldNet
    		hiSetCallbackStatus(myForm t)
    	)
    )
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • Kevin Buck
    Kevin Buck over 3 years ago in reply to Andrew Beckett

    OK, I figured this was probably the case. I started writing a SKILL script that:

    • pops up a dialog box to fill the desired parameters and then does some checking for the conditionals I want
    • calls leDefineMPPTemplate() and sets the desired variables
    • calls leHiCreateMPP()
    • calls hiToggleEnterForm()
    • sets some values (this seems to have a problem with setting the desired pin name)
    • calls hiSetCallbackStatus(myForm t)

    There is one issue that is a little weird. It seems to work but the first time I try using the form it doesn't work, it just draws a path on whatever layer was selected before I executed the function.

    Most of it isn't too interesting as it is simply setting up the different parts of the MPP.

    procedure( conduitInit(myForm)
    	let( (shieldedLayer shieldNet conduitWidth)
    		hiSetCallbackStatus(myForm nil)
    		tech = techOpenTechFile("ohc15l_xl" "tech.db" "r")
    		shieldedLayer = myForm~>layer~>value
    		shieldNet = myForm~>shieldNet~>value
    		if( conduitWidth = truncate(atof(myForm~>conduitWidth~>value t) * 100) / 100.0 then
    			if( conduitWidth < 1.36 then
    				conduitWidth = 1.36
    				warn("Conduit width is too small to accomodate a minimum size wire, setting to minimum width (1.36 um)\n")
    			)
    			if( conduitWidth > 40 then
    				conduitWidth = 40
    				warn("Conduit width is greater than design rule maximum, setting to maximum width (40 um)\n")
    			)
    		else
    			conduitWidth = 1.36
    			warn("Invalid argument given for conduit width, setting to minimum width (1.36 um)\n")
    		)
    		case( shieldedLayer
    			("MET2"
    				layerBelow = "MET1"
    				layerAbove = "MET3"
    				lowerVia = "VIA1"
    				upperVia = "VIA2"
    				mppName = "M2_conduit"
    			)
    			("MET3"
    				layerBelow = "MET2"
    				layerAbove = "MET4"
    				lowerVia = "VIA2"
    				upperVia = "VIA3"
    				mppName = "M3_conduit"
    			)
    			("MET4"
    				layerBelow = "MET3"
    				layerAbove = "MET5"
    				lowerVia = "VIA3"
    				upperVia = "VIA4"
    				mppName = "M4_conduit"
    			)
    		)
    		leDefineMPPTemplate(
    			?techId	 tech
    			?name	 mppName
    			?layer	 list(layerBelow "drawing")
    			?width	 conduitWidth
    			?choppable	 t
    			?endType	 "truncate"
    			?beginExt	 0.000000
    			?endExt	 0.000000
    			?justification	 "center"
    			?offset	 0.000000
    			?termIOType	 "input"
    			?pin	 t
    			?pinAccessDir	 list("top" "bottom" "left" "right")
    			?pinLabel	 t
    			?pinLabelHeight	 conduitWidth/4
    			?pinLabelLayer	 layerBelow
    			?pinLabelJust	 "centerCenter"
    			?pinLabelFont	 "stick"
    			?pinLabelDrafting	 t
    			?pinLabelOrient	 "R0"
    			?pinLabelRefHandle	 "start0"
    			?pinLabelOffsetPoint	 list(0.0 0.0)
    			?offsetSubPath	 list(
    			 list(
    				?layer	 list(shieldedLayer "drawing")
    				?width	 0.320000
    				?choppable	 t
    				?sep	 -0.320000
    				?justification	 "left"
    				?beginOffset	 0.000000
    				?endOffset	 0.000000
    				)
    			 list(
    				?layer	 list(shieldedLayer "drawing")
    				?width	 0.320000
    				?choppable	 t
    				?sep	 -0.320000
    				?justification	 "right"
    				?beginOffset	 0.000000
    				?endOffset	 0.000000
    				)
    			 list(
    				?layer	 list(layerAbove "drawing")
    				?width	 conduitWidth
    				?choppable	 t
    				?sep	 0.000000
    				?justification	 "center"
    				?beginOffset	 0.000000
    				?endOffset	 0.000000
    				)
    			)
    			?subRect	 list(
    			list(
    				?layer	 list(lowerVia "drawing")
    				?width	 0.240000
    				?length	 0.240000
    				?choppable	 t
    				?sep	 -0.280000
    				?justification	 "left"
    				?space	 0.410000
    				?beginOffset	 -0.210000
    				?endOffset	 -0.210000
    				?beginSegOffset	 0.000000
    				?endSegOffset	 0.000000
    				?gap	 "distribute"
    				)
    			list(
    				?layer	 list(upperVia "drawing")
    				?width	 0.240000
    				?length	 0.240000
    				?choppable	 t
    				?sep	 -0.280000
    				?justification	 "left"
    				?space	 0.410000
    				?beginOffset	 -0.210000
    				?endOffset	 -0.210000
    				?beginSegOffset	 0.000000
    				?endSegOffset	 0.000000
    				?gap	 "distribute"
    				)
    			list(
    				?layer	 list(lowerVia "drawing")
    				?width	 0.240000
    				?length	 0.240000
    				?choppable	 t
    				?sep	 -0.280000
    				?justification	 "right"
    				?space	 0.410000
    				?beginOffset	 -0.210000
    				?endOffset	 -0.210000
    				?beginSegOffset	 0.000000
    				?endSegOffset	 0.000000
    				?gap	 "distribute"
    				)
    			list(
    				?layer	 list(upperVia "drawing")
    				?width	 0.240000
    				?length	 0.240000
    				?choppable	 t
    				?sep	 -0.280000
    				?justification	 "right"
    				?space	 0.410000
    				?beginOffset	 -0.210000
    				?endOffset	 -0.210000
    				?beginSegOffset	 0.000000
    				?endSegOffset	 0.000000
    				?gap	 "distribute"
    				)
    			)
    		) ; end of leDefineMPPTemplate procedure
    
    		leHiCreateMPP()
    		hiToggleEnterForm()
    		leRodMppForm->pathWidth->value=conduitWidth
    		leRodMppForm->rodMPPTemplate->value=mppName
    		leRodMppForm->rodNetName->value=shieldNet
    		hiSetCallbackStatus(myForm t)
    	)
    )
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
  • Andrew Beckett
    Andrew Beckett over 3 years ago in reply to Kevin Buck

    Hi Kevin,

    This is one of the challenges of trying to wrap around some existing UI function, like leHiCreateMPP(). That is a blocking function - so it won't return until it's complete and hence the hiToggleEnterForm and leRodMppForm code won't do anything.

    Instead you might want to do something like this (adding commandStr into your let too of course):

    sprintf(commandStr "hiToggleEnterForm() leRodMppForm->pathWidth->value=%N leRodMppForm->rodMPPTemplate->value=%L leRodMppForm->rodNetName->value=%L" conduitWidth mppName shieldNet)
    hiEnqueueCmd(commandStr)
    leHiCreateMPP()

    Regards,

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Kevin Buck
    Kevin Buck over 3 years ago in reply to Andrew Beckett

    Worked like a charm, thanks.

    • Cancel
    • Vote Up 0 Vote Down
    • 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