• 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. Import some particular shape in to Cadence layout L

Stats

  • Locked Locked
  • Replies 23
  • Subscribers 128
  • Views 21755
  • 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

Import some particular shape in to Cadence layout L

engine2011
engine2011 over 13 years ago

 Hi everyone,

 I want to use standard technology to fabricate a device which is basically a circle shape realized with the toppest level metal layer. Because the process resolution is 0.01um, the smooth brim of circle is not acceptable and will introduce some class a DRC errors. 

 Now I am making the brim of circle replaced by 90 degree polygon to solve these errors. The problem is, if I want to make it a good approximation to a circle, the polygon will be very complex. I can use Matlab to generate this shape without much effort, however, it will be very complex to draw it manually in Cadence. Does cadence have some function to import the shape data from Matlab?

 Thanks!

EF

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

    Hi EF & Liu,

    I did two things here - I corrected the previous abGriddedCircle implementation (I'd made a mistake and the direction of one of the halves was wrong - so you had a slightly strange polygon with a line through the middle), and added abGriddedDonut - which gives you the ability to create donuts directly too.

    /*****************************************************************
    *                                                                *
    *           abGriddedCircle(cellView lpp radius grid)            *
    *                                                                *
    * Draw a circle as a polygon, with all the points on a specified *
    *               grid, with all angles 90 degrees.                *
    *                                                                *
    *****************************************************************/

    procedure(abGriddedCircle(cellView lpp radius grid)
        let((point numSteps radSq pointList halfPointList y)
            radSq=radius**2
            numSteps=round(radius/grid)
            for(step -numSteps numSteps
                y=round(sqrt(radSq-(step*grid)**2)/grid)*grid
                point=step*grid:y
                when(halfPointList
                    halfPointList=cons(xCoord(car(halfPointList)):y halfPointList)
                )
                halfPointList=cons(point halfPointList)
            )
            ;----------------------------------------------------------------
            ; Build the complete point list from two halves, one flipped
            ;----------------------------------------------------------------
            pointList=lconc(pointList
                foreach(mapcar xy reverse(halfPointList) xCoord(xy):-yCoord(xy))
            )
            pointList=lconc(pointList halfPointList)
            dbCreatePolygon(cellView lpp car(pointList))
        )
    )

    /***************************************************************
    *                                                              *
    *        abGriddedDonut(cellView lpp outer inner grid)         *
    *                                                              *
    *  Draw a donut as a polygon, with all points on a specified   *
    *              grid, with all angles 90 degrees.               *
    *                                                              *
    ***************************************************************/

    procedure(abGriddedDonut(cellView lpp outer inner grid)
        let((point numSteps radSq pointList halfPointList y)
            foreach((direction radius) '(1 -1) list(outer inner)
                radSq=radius**2
                numSteps=round(radius/grid)
                halfPointList=nil
                for(step -numSteps numSteps
                    y=direction*round(sqrt(radSq-(step*grid)**2)/grid)*grid
                    point=step*grid:y
                    when(halfPointList
                        halfPointList=cons(xCoord(car(halfPointList)):y halfPointList)
                    )
                    halfPointList=cons(point halfPointList)
                )
                ;------------------------------------------------------------
                ; Build the complete point list from two halves, one flipped
                ;------------------------------------------------------------
                pointList=lconc(pointList
                    foreach(mapcar xy reverse(halfPointList) xCoord(xy):-yCoord(xy))
                )
                pointList=lconc(pointList halfPointList)
            )
            dbCreatePolygon(cellView lpp car(pointList))
        )
    )

    Enjoy!

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • Andrew Beckett
    Andrew Beckett over 13 years ago

    Hi EF & Liu,

    I did two things here - I corrected the previous abGriddedCircle implementation (I'd made a mistake and the direction of one of the halves was wrong - so you had a slightly strange polygon with a line through the middle), and added abGriddedDonut - which gives you the ability to create donuts directly too.

    /*****************************************************************
    *                                                                *
    *           abGriddedCircle(cellView lpp radius grid)            *
    *                                                                *
    * Draw a circle as a polygon, with all the points on a specified *
    *               grid, with all angles 90 degrees.                *
    *                                                                *
    *****************************************************************/

    procedure(abGriddedCircle(cellView lpp radius grid)
        let((point numSteps radSq pointList halfPointList y)
            radSq=radius**2
            numSteps=round(radius/grid)
            for(step -numSteps numSteps
                y=round(sqrt(radSq-(step*grid)**2)/grid)*grid
                point=step*grid:y
                when(halfPointList
                    halfPointList=cons(xCoord(car(halfPointList)):y halfPointList)
                )
                halfPointList=cons(point halfPointList)
            )
            ;----------------------------------------------------------------
            ; Build the complete point list from two halves, one flipped
            ;----------------------------------------------------------------
            pointList=lconc(pointList
                foreach(mapcar xy reverse(halfPointList) xCoord(xy):-yCoord(xy))
            )
            pointList=lconc(pointList halfPointList)
            dbCreatePolygon(cellView lpp car(pointList))
        )
    )

    /***************************************************************
    *                                                              *
    *        abGriddedDonut(cellView lpp outer inner grid)         *
    *                                                              *
    *  Draw a donut as a polygon, with all points on a specified   *
    *              grid, with all angles 90 degrees.               *
    *                                                              *
    ***************************************************************/

    procedure(abGriddedDonut(cellView lpp outer inner grid)
        let((point numSteps radSq pointList halfPointList y)
            foreach((direction radius) '(1 -1) list(outer inner)
                radSq=radius**2
                numSteps=round(radius/grid)
                halfPointList=nil
                for(step -numSteps numSteps
                    y=direction*round(sqrt(radSq-(step*grid)**2)/grid)*grid
                    point=step*grid:y
                    when(halfPointList
                        halfPointList=cons(xCoord(car(halfPointList)):y halfPointList)
                    )
                    halfPointList=cons(point halfPointList)
                )
                ;------------------------------------------------------------
                ; Build the complete point list from two halves, one flipped
                ;------------------------------------------------------------
                pointList=lconc(pointList
                    foreach(mapcar xy reverse(halfPointList) xCoord(xy):-yCoord(xy))
                )
                pointList=lconc(pointList halfPointList)
            )
            dbCreatePolygon(cellView lpp car(pointList))
        )
    )

    Enjoy!

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
No Data

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