• 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. Can we draw mutlipath different width and spacing at the...

Stats

  • Locked Locked
  • Replies 13
  • Subscribers 144
  • Views 19607
  • 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

Can we draw mutlipath different width and spacing at the same time?

Manu81
Manu81 over 16 years ago
Can we draw mutlipath different width and spacing at the same time?
  • Cancel
  • skillUser
    skillUser over 16 years ago
    Hi,

    Yes, with a multipart path the "offset sub paths" can certainly have different widths and separation from the master path.  Here is a brief section from the documentation on the rodCreatePath() SKILL function that you use to create a multi-part path:

    rodCreatePath(
            [?name              S_name]
            ?layer              txl_layer
            [?width             n_width]
            [?pts               l_pts]
            [?justification     S_justification]
            [?offset            n_offset]
            [?endType           S_endType]
            [?beginExt          n_beginExt]
            [?endExt            n_endExt]
            [?choppable         g_choppable]
            [?cvId              d_cvId]
            [?fromObj           Rl_fromObj]
            [?size              txf_size]
            [?startHandle       l_startHandle]
            [?endHandle         l_endHandle]
            [?prop              l_prop]
    
            [?offsetSubPath     l_offsetSubpathArgs...]
            ;l_offsetSubpathArgs Offset Subpath Arguments
            list(
                    list(
                            ?layer            txl_layer
                            [?width           n_width]
                            [?sep             n_sep]
                            [?justification   S_justification]
                            [?beginOffset     n_beginOffset]
                            [?endOffset       n_endOffset]
                            [?choppable       g_choppable]
                            [?prop            l_prop]
                            ;Repeat ROD Connectivity Arguments here
                            ) ;End of first offset subpath list
                            ...
                    ) ;End of offset subpath lists
            ;End of l_offsetSubpathArgs
    
    ) ; end rodCreatePath
    => R_rodObj | nil
    

     I have included the arguments for the ?offsetSubPath keyword of rodCreatePath so that you can see how they are specified. It is a list of lists structure, each sublist refers to one offset sub path, but there can be multiple offset subpaths.

    I hope that this answers your question.

    Regards,

    Lawrence.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Manu81
    Manu81 over 16 years ago
    Thanks Lawerence, tere is one sample code given for shielding in Virtuoso® Relative Object Design User Guide. Will refer there too.Regards, Manu
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Manu81
    Manu81 over 16 years ago
    this is what I have written...: ; create a shielded path
    procedure( shielded()
    cv=geGetEditCellView()
    errset(
    (let (cv layer purpose list_draw_layer tech width1 tfId)
    cv= geGetEditCellView()
    layer = car(leGetEntryLayer()) ;displays layer on LSW is taken
    purpose = cadr(leGetEntryLayer()); displays drawing or pin on the selected lsw
    list_draw_layer =list( layer purpose )
    tech = techGetTechFile(geGetWindowCellView()); rule deck file id is stored in tech
    width1 = techGetSpacingRule(tech "minWidth" layer) ; the minimum width is stored in width1

     rodCreatePath(
      ?name "shielded"
      ?layer list( layer purpose )
      ?pts list(2:-15 2:-5 15:-5 15:-5)
      ?width .12
      ?justification "center"
      ?cvId cv
      ?offsetSubPath
      list(list(
         list(
             ?layer list( layer purpose )
             ?justification "left"
             ?sep .16
             ?width .16
             ) ;end of offset sublist1
       list(
             ?layer list( layer purpose )
             ?justification "right"
             ?sep .16
             ?width .16

    ) ;end of offset sublist2
    ) ;end of offset list of lists
    ) ;end of rodCreatePath
    ) ; end of let
    t
    ) ; end of errset
    ) ; end of procedure

    what else needs to be done so that instead of the predefined values of metal layers and the width, spacing can be changed....
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Manu81
    Manu81 over 16 years ago

    Hi Lawerence,

    Request you to please see the code:

    ; create a shielded path
    procedure( shielded()
    cv=geGetEditCellView()
    errset(
    (let (cv layer purpose list_draw_layer tech width1 tfId)
    cv= geGetEditCellView()
    layer = car(leGetEntryLayer()) ;displays layer on LSW is taken
    purpose = cadr(leGetEntryLayer()); displays drawing or pin on the selected lsw
    list_draw_layer =list( layer purpose )
    tech = techGetTechFile(geGetWindowCellView()); rule deck file id is stored in tech
    width1 = techGetSpacingRule(tech "minWidth" layer) ; the minimum width is stored in width1

     rodCreatePath(
      ?name "shielded"
      ?layer list( layer purpose )
      ?pts list(2:-15 2:-5 15:-5 15:-5)
      ?width .12
      ?justification "center"
      ?cvId cv
      ?offsetSubPath
      list(
         list(
             ?layer list( layer purpose )
             ?justification "left"
             ?sep .16
             ?width .16
             ) ;end of offset sublist1
       list(
             ?layer list( layer purpose )
             ?justification "right"
             ?sep .16
             ?width .16

    ) ;end of offset sublist2
    ) ;end of offset list of lists
    ) ;end of rodCreatePath
    ) ; end of let
    t
    ) ; end of errset
    ) ; end of procedure

    I want to take the values from the from the user. Therefore, I have created form and passing the values to the variables. Now, wrt to the above programme, can you please tell me what changes I need to make in order to have user defined width and spacing.

     Regards,

    Manu

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • dmay
    dmay over 16 years ago

    If you add two arguments to your procedure and use them in place of the .16 values in your rodCreatePath, then your form can call this command with the user's width and space.

    procedure( shielded(width space)
    . . .
    ?sep space
    ?width width
    . . .

    I hope this helps.

    Derek

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • rajput
    rajput over 11 years ago

     Hi Lawrence,

             Actually i want as many, master path for coaxial shielding required by user but using the rodCreatePath i am not able to do so.

    secondally my GND lines & Master path should not be of same width.so is there is any way to do this ???

    Regards

    pankaj

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 11 years ago

    You can only have a single master path, but there is nothing to stop you having one of the tracks as the master, and others (and the shield) as being offset sub-paths. Examples above show how to have different width for different offset subpaths.

    So I'm not sure what you can't do...

    Regards,

    Andrew 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • rajput
    rajput over 11 years ago

    Hi Andrew

       Actually i am writing script for coaxial shielding & i am shielding multiple paths at a time. suppose  five metal 2 paths to be coaxiallly shielded.then the gnd line of metal 2 lines should be sideways & for metal1 & metal3 it should be at top & bottom.

    1        i am using rodcreatepath to so. & i am using offsetSubPath for sideways & top & bottom metal layer to do so. But the problem i  am facing is how map top & bottom layer with middle layer as it is relative to  masterpath ..even i triedthe argument justification...

    2.  i have also used encSubPathfor top & bottom layers  & used enclosure argument but it is taking same enclosure all the sides which i dont want .please have a look on attached snapshot....

     

     


          

    • coaxial_multipath.png
    • View
    • Hide
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 11 years ago

    I think this should do what you want (it would have helped if your picture showed what you want, rather than what you're getting, so I had to guess that this was indeed what you want). I've attached two pictures (merged together) showing the original multipart path at the bottom, and then after reshape and stretch. It has Metal1 on the bottom, Metal3 on the top, a strap of via1 and via2 on the gnd at the upper and lower edge, and then 4 tracks in the middle.

    cvId=geGetEditCellView()
    points=list(0:0 40:0)
    mainWidth=1
    mainSpacing=1
    gndWidth=2.0
    gndSpacing=1.5
    nTracks=4
    mainLayer="Metal2"
    bottomLayer="Metal1"
    topLayer="Metal3"
    viaLayer1="Via1"
    viaLayer2="Via2"
    viaWidth=0.5
    viaSpacing=0.5
    
    offsetPaths=nil
    for(i 1 nTracks-1
        offsetPaths=
            cons(
                list(
                    ?layer mainLayer
                    ?width mainWidth
                    ?sep -i*(mainWidth+mainSpacing)
                )
                offsetPaths
            )
    )
    offsetPaths=constar(
        list(
            ?layer mainLayer
            ?width gndWidth
            ?sep mainWidth/2.0+gndSpacing+gndWidth/2.0
        )
        list(
            ?layer mainLayer
            ?width gndWidth
            ?sep -(nTracks-1)*(mainWidth+mainSpacing)-mainWidth/2.0-gndSpacing-gndWidth/2.0
        )
        offsetPaths
    )
    
    subRects=foreach(mapcan viaLayer list(viaLayer1 viaLayer2)
        list(
            list(
                ?layer viaLayer1
                ?width viaWidth
                ?gap 'distribute
                ?space viaSpacing
                ?sep mainWidth/2.0+gndSpacing+gndWidth/2.0
                ?beginOffset -viaSpacing
                ?endOffset -viaSpacing
            )
            list(
                ?layer viaLayer1
                ?width viaWidth
                ?gap 'distribute
                ?space viaSpacing
                ?sep -(nTracks-1)*(mainWidth+mainSpacing)-mainWidth/2.0-gndSpacing-gndWidth/2.0
                ?beginOffset -viaSpacing
                ?endOffset -viaSpacing
            )
        )
    )
    
    topBotWidth=nTracks*(mainWidth+mainSpacing)-mainSpacing+(gndSpacing+gndWidth)*2
    topBotCent=gndWidth+gndSpacing+mainWidth/2.0-topBotWidth/2.0
    
    foreach(topBotLayer list(bottomLayer topLayer)
        offsetPaths=cons(
            list(
                ?layer topBotLayer
                ?width topBotWidth
                ?sep topBotCent
            )
            offsetPaths
        )
    )
    
    rodCreatePath(
        ?cvId  cvId
        ?layer mainLayer
        ?width mainWidth
        ?pts points
        ?offsetSubPath offsetPaths
        ?subRect subRects
    )
    

     

    • MPP.png
    • View
    • Hide
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • rajput
    rajput over 11 years ago

    Hi Andrew,

       Following is the script which i write for coaxial multipath it is working fine in gpdk180. Actually i want to make it technology independent .How can i do that. Actually i am new to skill learning from last 2-3  weeks .Please help me how to approach to make it technology independent..

     

     
    /***********Form Creation*************/
    procedure(openform()


    metal_list = list("Metal1" "Metal2" "Metal3" "Metal4" "Metal5" "Metal6")

    Sig_lines= hiCreateIntField(
    ?name 'Sig_lines
    ?prompt "No of Signal lines"
    ?value 1
    )

    sig_metal_layer= hiCreateCyclicField(            
    ?name  'sig_metal_layer
    ?prompt "Signal Metal layer"
    ?choices  metal_list
    )

    spacing_lines= hiCreateFloatField(
    ?name 'spacing_lines
    ?prompt "Spacing b/w Signal lines"
    ?value 0.6
    )

    width_lines= hiCreateFloatField(
    ?name 'width_lines
    ?prompt "Width of Signal lines"
    ?value 0.8
    )

    spacing_gnd_lines= hiCreateFloatField(
    ?name 'spacing_gnd_lines
    ?prompt "Spacing from GND lines"
    ?value 1.0
    )


    width_gnd_lines= hiCreateFloatField(
    ?name 'width_gnd_lines
    ?prompt "width of GND lines"
    ?value 1.2
    )



    multipath= hiCreateAppForm(
    ?name 'multipath
    ?formTitle "coaxial_multipath"
    ?callback "enterpoints()"
    ?fields list(Sig_lines sig_metal_layer spacing_lines width_lines spacing_gnd_lines  
    width_gnd_lines )
    ?help "multipath" )

     hiDisplayForm(multipath)

    )




    /****************************************/

    procedure(enterpoints()
    enterPath(
       ?prompts list("Enter 1st point:" "Enter next point:")
       ?doneProc "Shield"
    ))
        

    ;; Create a shielded path
    procedure( Shield(win done pts)

      errset(
       (let (cv layer purpose list_draw_layer tech width1 tfId)

          unless( done printf("Finished!") )

          cv = geGetEditCellView()
                   
        
        
         separation = multipath->spacing_gnd_lines->value + 1/2*(multipath->width_gnd_lines->value) +
         1/2*(multipath->width_lines->value)
        
        
        
        
         sig_lines=multipath->Sig_lines->value                                 
        
         temp_list= list()
         i=1
         while(i<=sig_lines-1
        
         sepsiglines= i*(multipath->spacing_lines->value) + (i-1)*(multipath->width_lines->value)
        
        
                               lista=list(
                                      ?layer list(  "Metal2" "drawing" )
                                      ?justification "right"
                                     ?sep sepsiglines
                                      ?width multipath->width_lines->value
                               ) ;end of offset sublist2
        temp_list= append1(temp_list lista)
        i++
         )
        
        if( sig_lines > 1
        then
        delta = sepsiglines + multipath->spacing_gnd_lines->value + multipath->width_lines->value
        )
        if( sig_lines == 1
        then
        delta = separation
        )
        
        
        
          rodCreatePath(


            ?layer        list(  "Metal2" "drawing")
            ?pts         foreach(   mapcar point pts
                             geWindowToEditPoint(hiGetCurrentWindow() point)
                    )
                 ?width         multipath->width_lines->value
                 ?justification     "center"
                 ?cvId         cv
             ?offsetSubPath
                         append(temp_list list(
                               list(
                                      ?layer list( "Metal2" "drawing")
                                      ?justification "left"
                                      ?sep separation
                                      ?width  multipath->width_gnd_lines->value
                               ) ;end of offset sublist1
           
           
                               list(
                                      ?layer list(  "Metal2" "drawing" )
                                      ?justification "right"
                                     ?sep delta
                                      ?width multipath->width_gnd_lines->value
                               ) ;end of offset sublist2
                        
                        
                               list(
                                      ?layer list(  "Metal1" "drawing" )
                                      ?justification "right"
                            ?sep  -((multipath->width_gnd_lines->value)+(multipath->width_lines->value)+(multipath->spacing_gnd_lines->value))
                                      ?width delta +2*(multipath->width_gnd_lines->value)+(multipath->width_lines->value)+(multipath->spacing_gnd_lines->value)
                               ) ;end of offset sublist3    
                        
                               list(
                                      ?layer list(  "Metal3" "drawing" )
                                      ?justification "right"
                            ?sep  -((multipath->width_gnd_lines->value)+(multipath->width_lines->value)+(multipath->spacing_gnd_lines->value))
                                      ?width delta +2*(multipath->width_gnd_lines->value)+(multipath->width_lines->value)+(multipath->spacing_gnd_lines->value)
                               ) ;end of offset sublist4    
                        
                        
                        ) ;end of offset list of lists
                     )
        
        

             
              ?subRect
                         list(

           
                             list(
                            ?layer     list("Via1" "drawing")
                            ?length     nil
                            ?choppable     t
                            ?sep     ((0.5*(multipath->width_gnd_lines->value))+(0.5*(multipath->width_lines->value))+(multipath->spacing_gnd_lines->value))
                            ?justification     "center"
                            ?space     nil
                            ?beginOffset     -0.300000
                            ?endOffset     -0.300000
                            ?gap     "distribute"
                        );end of subRect list1a
                        
                        list(
                            ?layer     list("Via1" "drawing")
                            ?length     nil
                            ?choppable     t
                            ?sep     -(((sig_lines-1)*(multipath->spacing_lines->value))+(multipath->spacing_gnd_lines->value)+
                                                             (0.5*(multipath->width_gnd_lines->value))+((sig_lines-0.5)*(multipath->width_lines->value)))
                            
                            ?justification     "center"
                            ?space     nil
                            ?beginOffset     -0.300000
                            ?endOffset     -0.300000
                            ?gap     "distribute"
                        );end of subRect list1b
                        
                        
                             list(
                            ?layer     list("Via2" "drawing")
                            ?length     nil
                            ?choppable     t
                            ?sep     ((0.5*(multipath->width_gnd_lines->value))+ (0.5*(multipath->width_lines->value))+(multipath->spacing_gnd_lines->value))
                            ?justification     "center"
                            ?space     nil
                            ?beginOffset     -0.300000
                            ?endOffset     -0.300000
                            ?gap     "distribute"
                        );end of subRect list2a
                                 
                                        list(
                            ?layer     list("Via2" "drawing")
                            ?length     nil
                            ?choppable     t
                            ?sep    -(((sig_lines-1)*(multipath->spacing_lines->value))+(multipath->spacing_gnd_lines->value)+
                                                             (0.5*(multipath->width_gnd_lines->value))+((sig_lines-0.5)*(multipath->width_lines->value)))
                            ?justification     "center"
                            ?space     nil
                            ?beginOffset     -0.300000
                            ?endOffset     -0.300000
                            ?gap     "distribute"
                        );end of subRect list2b         

        
                         );end of subrect of lists


        
                  ) ;end of rodCreatePath
       ) ; end of let
     
      ) ; end of errset
    ); end of procedure


    hiSetBindKey("Layout" "Shift<key>2" "openform()")

     

     Regards

    pankaj

     

     

     

    • 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